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) 4.21 kB
import{tryDecompress as e}from"../../../decompress.mjs";export default async s=>{const{socket:r,payload:t}=s;try{let i=r.p3xrs.ioredis;const o=t.key;let a=await i.type(o);"ReJSON-RL"===a&&(a="json"),"TSDB-TYPE"===a&&(a="timeseries"),"MBbloom--"===a&&(a="bloom"),"MBbloomCF"===a&&(a="cuckoo"),"TopK-TYPE"===a&&(a="topk"),"CMSk-TYPE"===a&&(a="cms"),"TDIS-TYPE"===a&&(a="tdigest");const l=i.pipeline();switch(a){case"string":l.getBuffer(o);break;case"list":l.lrangeBuffer(o,0,-1);break;case"hash":l.hgetallBuffer(o);break;case"set":l.smembersBuffer(o);break;case"zset":l.zrangeBuffer(o,0,-1,"WITHSCORES");break;case"stream":l.xrangeBuffer(o,"-","+");break;case"json":l.call("JSON.GET",o,"$");break;case"timeseries":l.call("TS.INFO",o);break;case"bloom":l.call("BF.INFO",o);break;case"cuckoo":l.call("CF.INFO",o);break;case"topk":l.call("TOPK.INFO",o);break;case"cms":l.call("CMS.INFO",o);break;case"tdigest":l.call("TDIGEST.INFO",o);break;case"vectorset":l.call("VINFO",o);break;default:l.type(o)}switch(l.ttl(o),["string","stream","hash","list","set","zset"].includes(a)&&l.object("encoding",o),a){case"stream":l.xlen(o);break;case"hash":l.hlen(o);break;case"list":l.llen(o);break;case"set":l.scard(o);break;case"zset":l.zcard(o)}const c=await l.exec();let n=c[0][1];const f=c[1][1];let m,d,g=2;const p=["bloom","cuckoo","topk","cms","tdigest"],h=["stream","hash","list","set","zset"];if("timeseries"===a){m="timeseries";const e={};if(Array.isArray(n))for(let s=0;s<n.length;s+=2){const r=n[s];let t=n[s+1];if("labels"===r&&Array.isArray(t)){const e={};for(const s of t)Array.isArray(s)&&2===s.length&&(e[s[0]]=s[1]);t=e}"rules"===r&&Array.isArray(t)&&(t=t.map(e=>Array.isArray(e)?{destKey:e[0],bucketDuration:e[1],aggregationType:e[2]}:e)),e[r]=t}n=Buffer.from(JSON.stringify(e)),d=e.totalSamples||0}else if(p.includes(a)||"vectorset"===a){m=a;const e={};if(Array.isArray(n))for(let s=0;s<n.length;s+=2)e[n[s]]=n[s+1];n=Buffer.from(JSON.stringify(e)),d=e["Number of items inserted"]||e.count||e.k||e["Merged nodes"]||0}else"json"===a?(m="json","string"==typeof n&&(n=Buffer.from(n))):"string"===a?(m=c[g][1],g++):h.includes(a)?(m=c[g][1],g++,d=c[g][1]):(m=a,n=Buffer.from(JSON.stringify({type:n||a})),d=0);let y=null;if("string"===a&&Buffer.isBuffer(n)){const s=await e(n);s&&(y={algorithm:s.algorithm,originalSize:n.length,decompressedSize:s.decompressed.length,ratio:+(100*(1-n.length/s.decompressed.length)).toFixed(1)},n=s.decompressed)}else if("list"===a&&Array.isArray(n)){for(let s=0;s<n.length;s++)if(Buffer.isBuffer(n[s])){const r=await e(n[s]);r&&(y||(y={algorithm:r.algorithm,items:0,originalSize:0,decompressedSize:0}),y.items++,y.originalSize+=n[s].length,y.decompressedSize+=r.decompressed.length,n[s]=r.decompressed)}y&&(y.ratio=+(100*(1-y.originalSize/y.decompressedSize)).toFixed(1))}else if("hash"===a&&n&&"object"==typeof n&&!Array.isArray(n)){for(const s of Object.keys(n))if(Buffer.isBuffer(n[s])){const r=await e(n[s]);r&&(y||(y={algorithm:r.algorithm,items:0,originalSize:0,decompressedSize:0}),y.items++,y.originalSize+=n[s].length,y.decompressedSize+=r.decompressed.length,n[s]=r.decompressed)}y&&(y.ratio=+(100*(1-y.originalSize/y.decompressedSize)).toFixed(1))}else if("set"!==a&&"zset"!==a||!Array.isArray(n)){if("stream"===a&&Array.isArray(n)){for(const s of n){if(!Array.isArray(s)||!Array.isArray(s[1]))continue;const r=s[1];for(let s=0;s<r.length;s++)if(Buffer.isBuffer(r[s])){const t=await e(r[s]);t&&(y||(y={algorithm:t.algorithm,items:0,originalSize:0,decompressedSize:0}),y.items++,y.originalSize+=r[s].length,y.decompressedSize+=t.decompressed.length,r[s]=t.decompressed)}}y&&(y.ratio=+(100*(1-y.originalSize/y.decompressedSize)).toFixed(1))}}else{for(let s=0;s<n.length;s++)if(Buffer.isBuffer(n[s])){const r=await e(n[s]);r&&(y||(y={algorithm:r.algorithm,items:0,originalSize:0,decompressedSize:0}),y.items++,y.originalSize+=n[s].length,y.decompressedSize+=r.decompressed.length,n[s]=r.decompressed)}y&&(y.ratio=+(100*(1-y.originalSize/y.decompressedSize)).toFixed(1))}const S={length:d,key:o,status:"ok",type:a,valueBuffer:n,ttl:f,encoding:m,compression:y};r.emit(s.responseEvent,S)}catch(e){console.error(e),r.emit(s.responseEvent,{status:"error",error:e.message})}};