UNPKG

p3x-redis-ui-server

Version:

🏍️ P3X Redis UI server — Socket.IO backend for the dual Angular + React frontend with AI queries, 54 languages, and auto data decompression

2 lines (1 loc) 2.78 kB
import*as e from"../../shared.mjs";const t=500;export default async r=>{const{socket:s,payload:o}=r;try{e.ensureReadonlyConnection({socket:s});const a=s.p3xrs.ioredis,{keys:l,conflictMode:n}=o;if(!Array.isArray(l)||0===l.length)return void s.emit(r.responseEvent,{status:"error",error:"No keys to import"});let i=new Set;if("skip"===n)for(let e=0;e<l.length;e+=t){const r=l.slice(e,e+t),s=a.pipeline();for(const e of r)s.exists(e.key);const o=await s.exec();for(let e=0;e<r.length;e++)o[e][0]||1===o[e][1]&&i.add(r[e].key)}let f=0,c=0,p=0;for(let e=0;e<l.length;e+=t){const r=l.slice(e,e+t),s=[];for(const e of r)"skip"===n&&i.has(e.key)?c++:s.push(e);if(0===s.length)continue;const o=[],y=[];for(const e of s)"stream"===e.type||"json"===e.type?y.push(e):o.push(e);if(o.length>0){if("overwrite"===n){const e=a.pipeline();for(const t of o)e.del(t.key);await e.exec()}const e=a.pipeline(),t=[];for(const r of o)try{switch(r.type){case"string":e.set(r.key,Buffer.from(r.value,"base64")),t.push(r);break;case"list":Array.isArray(r.value)&&r.value.length>0?(e.rpush(r.key,...r.value.map(e=>Buffer.from(e,"base64"))),t.push(r)):f++;break;case"set":Array.isArray(r.value)&&r.value.length>0?(e.sadd(r.key,...r.value.map(e=>Buffer.from(e,"base64"))),t.push(r)):f++;break;case"zset":if(Array.isArray(r.value)&&r.value.length>0){const s=[];for(const e of r.value)s.push(e.score,Buffer.from(e.member,"base64"));e.zadd(r.key,...s),t.push(r)}else f++;break;case"hash":if(r.value&&"object"==typeof r.value){const s=[];for(const[e,t]of Object.entries(r.value))s.push(e,Buffer.from(t,"base64"));s.length>0?(e.hset(r.key,...s),t.push(r)):f++}break;default:p++}}catch(e){console.error(`key-import: failed to prepare key "${r.key}":`,e.message),p++}if(t.length>0){const r=await e.exec(),s=[];for(let e=0;e<r.length;e++)r[e][0]?(console.error(`key-import: write failed for key "${t[e].key}":`,r[e][0].message),p++):(f++,t[e].pttl&&t[e].pttl>0&&s.push(t[e]));if(s.length>0){const e=a.pipeline();for(const t of s)e.pexpire(t.key,t.pttl);await e.exec()}}}for(const e of y)try{if("overwrite"===n&&await a.del(e.key),"stream"===e.type){if(Array.isArray(e.value)&&e.value.length>0){const t=a.pipeline();for(const r of e.value){const{id:s,...o}=r,a=[];for(const[e,t]of Object.entries(o))a.push(e,t);a.length>0&&t.xadd(e.key,"*",...a)}await t.exec()}}else"json"===e.type&&null!==e.value&&void 0!==e.value&&await a.call("JSON.SET",e.key,"$","string"==typeof e.value?e.value:JSON.stringify(e.value));e.pttl&&e.pttl>0&&await a.pexpire(e.key,e.pttl),f++}catch(t){console.error(`key-import: failed to import key "${e.key}" (type=${e.type}):`,t.message),p++}}s.emit(r.responseEvent,{status:"ok",data:{created:f,skipped:c,errors:p}})}catch(e){console.error(e),s.emit(r.responseEvent,{status:"error",error:e.message})}};