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