UNPKG

stormflow

Version:

StormFlow is a versatile Node.js data management library designed for efficient data management.

3 lines (2 loc) 4.34 kB
var D=Object.create;var $=Object.defineProperty;var I=Object.getOwnPropertyDescriptor;var b=Object.getOwnPropertyNames;var _=Object.getPrototypeOf,R=Object.prototype.hasOwnProperty;var J=(t,e)=>{for(var o in e)$(t,o,{get:e[o],enumerable:!0})},P=(t,e,o,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of b(e))!R.call(t,r)&&r!==o&&$(t,r,{get:()=>e[r],enumerable:!(s=I(e,r))||s.enumerable});return t};var h=(t,e,o)=>(o=t!=null?D(_(t)):{},P(e||!t||!t.__esModule?$(o,"default",{value:t,enumerable:!0}):o,t)),W=t=>P($({},"__esModule",{value:!0}),t);var B={};J(B,{default:()=>L});module.exports=W(B);var m=h(require("fs/promises"),1),S=h(require("path"),1);var p=t=>{if(typeof t!="object"||t===null)return t;if(Array.isArray(t)){let e=new Array(t.length);for(let o=0;o<t.length;o++)e[o]=p(t[o]);return e}else{let e={},o=Object.keys(t);for(let s=0;s<o.length;s++)e[o[s]]=p(t[o[s]]);return e}};var u=t=>t==null?t===null?"null":"undefined":Array.isArray(t)?"array":t instanceof Date?"date":typeof t;var K=(t={})=>{if(u(t)!=="object")throw new Error("defaultConfig must be an object");let e=p(t),o=p(t),s=r=>{let l=Object.keys(e);if(u(r)!=="object")throw new Error('Invalid type of options. Expected type is "object"');Object.keys(r).forEach(i=>{if(!l.includes(i)){let a=l.join('", "');throw new Error(`Invalid "${i}" key in options.\r Allowed keys: "${a}"`)}let n=u(e[i]);if(u(r[i])!==n)throw new Error(`Invalid type of "${i}" key in options. Expected type is ${n}`)})};return{getDefaultConfig(){return p(e)},resetConfig(){o=p(e)},getConfig(){return p(o)},setConfig(r){s(r),Object.assign(o,e,r)},get(r){return o[r]},set(r,l){o[r]=l}}},k=K;var w=h(require("fs/promises"),1),x=h(require("path"),1),E=require("util"),O=h(require("zlib"),1);var v=(0,E.promisify)(O.default.gzip),M=(0,E.promisify)(O.default.gunzip),j=async t=>{await w.default.mkdir(t,{recursive:!0})},C=async(t,e=!1)=>{try{await w.default.unlink(t),e&&console.log(`Deleted file: ${t}`)}catch(o){if(o.code==="ENOENT")return;e&&console.error(`Failed to delete file: ${t}:`,o)}},A=async(t=[])=>{if(u(t)!=="array")return;let e=[];for(let{fileName:o,fileContent:s}of t){let r=o.replace(/\.sfc$/,""),l=await M(s),i=JSON.parse(l.toString("utf8"));e.push({collectionName:r,collectionData:i})}return e},T=async(t,e)=>{if(!e)return{collectionName:t};let o=`${t}.sfc`,s=JSON.stringify(e),r=await v(s);return{collectionName:t,fileName:o,fileContent:r}};var z=async(t,e=!1)=>{await j(t);let o=await w.default.readdir(t);for(let s of o)if(s.endsWith(".json")){let r=x.default.join(t,s),l=x.default.join(t,s.replace(/\.json$/,".sfc"));try{e&&console.log("[FileStorage]",`Converting ${r} to sfc`);let i=await w.default.readFile(r,"utf8"),n=await v(i);await w.default.writeFile(l,n),e&&console.log("[FileStorage]",`Converted and saved as ${l}`),await C(r,e)}catch(i){console.error(`[FileStorage] Error converting ${r} to gzip:`,i)}}};var G=(t={})=>{let e=k({dataFolder:"./data",throttle:100,verbose:!1,...t}),o={},s={},r=async()=>{let{verbose:n,dataFolder:c}=e.getConfig();await j(c),await z(c,n);let f=(await m.default.readdir(c)).filter(g=>g.endsWith(".sfc"));f.length>0&&console.log("[FileStorage]","Restoring data from files:");let F=await Promise.all(f.map(async g=>{console.log("[FileStorage]",` \u2192 ${g}`);let y=S.default.join(c,g),d=await m.default.readFile(y);return{fileName:g,fileContent:d}}));return await A(F)},l=async(n,c)=>{try{let{verbose:a,dataFolder:f}=e.getConfig();await j(f),a&&console.log("[FileStorage]",`Compress data before writing: ${n}`);let{fileName:F,fileContent:g}=await T(n,c),y=S.default.join(f,`${F}.tmp`),d=S.default.join(f,F);if(c.length===0){a&&console.log("[FileStorage]",`Removing empty file: ${d}`),await C(d,a);return}a&&console.log("[FileStorage]",`Writing data to temp file: ${y}`),await m.default.writeFile(y,g),a&&console.log("[FileStorage]",`Move data to final file: ${d}`),await m.default.rename(y,d),await C(y,a)}catch(a){console.error(`Failed to write ${n}:`,a)}},i=(n,c)=>{let{throttle:a}=e.getConfig();s[n]=c,o[n]||(o[n]=!0,setTimeout(async()=>{let f=s[n];delete s[n],await l(n,f),o[n]=!1,s[n]&&i(n,s[n])},a))};return{init:async()=>({collections:await r()}),insert:async({collectionName:n,collectionData:c})=>i(n,c),update:async({collectionName:n,collectionData:c})=>i(n,c),delete:async({collectionName:n,collectionData:c})=>i(n,c)}},L=G;