@freik/node-utils
Version:
My personal set of utilities for NodeJS
2 lines (1 loc) • 3.32 kB
JavaScript
var z=Object.create;var y=Object.defineProperty;var C=Object.getOwnPropertyDescriptor;var H=Object.getOwnPropertyNames;var B=Object.getPrototypeOf,D=Object.prototype.hasOwnProperty;var G=(s,n)=>{for(var o in n)y(s,o,{get:n[o],enumerable:!0})},L=(s,n,o,d)=>{if(n&&typeof n=="object"||typeof n=="function")for(let a of H(n))!D.call(s,a)&&a!==o&&y(s,a,{get:()=>n[a],enumerable:!(d=C(n,a))||d.enumerable});return s};var h=(s,n,o)=>(o=s!=null?z(B(s)):{},L(n||!s||!s.__esModule?y(o,"default",{value:s,enumerable:!0}):o,s)),J=s=>L(y({},"__esModule",{value:!0}),s);var Q={};G(Q,{MakePersistence:()=>K});module.exports=J(Q);var p=h(require("fs")),f=require("fs"),$=h(require("./PathUtil.js")),E=require("@freik/logger"),M=h(require("@freik/seqnum")),w=require("@freik/sync"),b=require("@freik/typechk");const{log:c,err:g}=(0,E.MakeLog)("node-utils:persist");function K(s){const n=new Map,o=new Map,d=(0,M.default)(),a=new Map;function F(t){const e=a.get(t);if(e!==void 0)return e;{const r=(0,w.MakeReaderWriter)(0);return a.set(t,r),r}}function m(){return $.xplat(s)}function u(t){return $.join(m(),`${t}.json`)}c(`User data location: ${u("test")}`);function N(t){let e=n.get(t);if(e)return e;try{if(e=p.readFileSync(u(t),"utf8"),e)return n.set(t,e),e}catch(r){if(r instanceof Error&&(0,b.hasStrField)(r,"code")&&r.code==="ENOENT")return;g("Error occurred during readFile"),g(r)}}async function W(t){const e=n.get(t);if(e)return c("returning cached data for "+t),e;const r=F(t);await r.read();try{const i=await f.promises.readFile(u(t),"utf8");return n.set(t,i),i}catch(i){if(i instanceof Error&&(0,b.hasStrField)(i,"code")&&i.code==="ENOENT")return;g("Error occurred during readFileAsync"),g(i)}finally{r.leaveRead()}}function k(t,e){n.set(t,e);try{p.mkdirSync(m(),{recursive:!0})}catch{}p.writeFileSync(u(t),e,"utf8")}const v=new Map;async function S(t,e){try{await f.promises.mkdir(m(),{recursive:!0})}catch{}const r=F(t);await r.write(),n.set(t,e);try{v.has(t)||v.set(t,(0,w.OnlyOneWaiting)(async()=>{const l=n.get(t);l!==void 0&&await f.promises.writeFile(u(t),l,"utf8")},500));const i=v.get(t);if(!i)throw Error("Horrific synchronization bug in persist.writeFileAsync");await i()}finally{r.leaveWrite()}}function R(t){try{p.unlinkSync(u(t)),n.delete(t)}catch(e){g("Error occurred during deleteFile"),g(e)}}async function U(t){const e=F(t);await e.write();try{n.delete(t),await f.promises.unlink(u(t))}catch(r){g("Error occurred during deleteFileAsync"),g(r)}finally{e.leaveWrite()}}function A(t,e){const r=o.get(t);if(r)for(const[,i]of r)c(`Updating ${t} to ${e}`),i(e)}function x(t,e){const r=d();let i=o.get(t);return i||(i=new Map,o.set(t,i)),i.set(r,e),`${r}-${t}`}function O(t){const e=t.indexOf("-"),r=t.substr(0,e),i=t.substr(e+1),l=o.get(i);return l?l.delete(r):!1}function I(t){return c("Reading "+t),N(t)}async function P(t){return c("Async Reading "+t),await W(t)}function V(t,e){I(t)===e?c(`No change to ${t} - not re-writing`):(c(`Writing ${t}:`),c(e),k(t,e),A(t,e))}async function j(t,e){await P(t)===e?c(`No change to ${t} - not re-writing`):(c(`Async Writing ${t}:`),c(e),await S(t,e),A(t,e))}function T(t){c(`deleting ${t}`),R(t)}async function q(t){c(`deleting ${t}`),await U(t)}return{getLocation:m,getItem:I,getItemAsync:P,setItem:V,setItemAsync:j,deleteItem:T,deleteItemAsync:q,subscribe:x,unsubscribe:O}}