UNPKG

genosdb

Version:

GenosDB (GDB): distributed graph database in real-time, peer-to-peer, scalable storage - efficient querying of complex relationships.

2 lines (1 loc) 2.59 kB
async function Z(k,P){console.info("\uD83D\uDEE1\uFE0F [SM-ACLs] Starting ACL module...");try{const x=await X(k,P);if(x)try{Object.defineProperty(k.sm,"acls",{value:x,writable:!0,enumerable:!1,configurable:!0}),console.info("\uD83D\uDEE1\uFE0F [SM-ACLs] Module initialized and attached to gdb.sm.acls.")}catch(D){throw console.error("\u274C [SM-ACLs] Failed to attach: gdb.sm not extensible.",D.message),new Error("\u274C [SM-ACLs] Cannot attach ACL module to gdb.sm. Ensure gdb.sm is extensible.")}else console.warn("\u26A0\uFE0F [SM-ACLs] Module not activated (options missing).")}catch(x){throw console.error("\u274C [SM-ACLs] Failed to start ACL module.",x),x}}var X=async(k,P)=>{if(!P)return null;const x="owner",D="collaborators",J=()=>{const f=k.sm.getActiveEthAddress();if(!f)throw new Error("\u274C [SM-ACLs] Active user session required.");return f},Q=(f)=>new Error(`\u274C [SM-ACLs] Only the owner can ${f}.`),T=async(f,h)=>{const $=[];for(let j of f){const{signer:z,type:F,id:G}=j;if(!z||!G){$.push(j);continue}const K=h.get(G),{[x]:H,[D]:V={}}=K?.value||{};if(F==="put"){if(!K||z===H||V[z]==="write")$.push(j);else console.warn(`\u26A0\uFE0F [SM-ACLs] DENIED (put): ${z} \u2192 ${G}`);continue}if(F==="remove"){if(!K||H===void 0||z===H)$.push(j);else console.warn(`\u26A0\uFE0F [SM-ACLs] DENIED (remove): ${z} \u2192 ${G}`);continue}$.push(j)}return $};return k.use(T),{async set(f,h){const $=J(),{result:j}=await k.get(h);if(j){const{[x]:z,[D]:F={}}=j.value;if($!==z&&F[$]!=="write")throw new Error(`\uD83D\uDEE1\uFE0F [SM-ACLs] Write denied for node ${h}.`);const{[x]:G,[D]:K,...H}=f;return k.put({...j.value,...H},h)}return k.put({...f,[x]:$,[D]:{}},h)},async grant(f,h,$){const j=J();if(!["read","write"].includes($))throw new Error("\uD83D\uDEE1\uFE0F [SM-ACLs] Permission must be 'read' or 'write'.");const{result:z}=await k.get(f);if(!z)throw new Error(`\u274C [SM-ACLs] Node ${f} not found.`);if(z.value[x]!==j)throw Q("grant permissions");const F={...z.value[D]??{},[h]:$};await k.put({...z.value,[D]:F},f)},async revoke(f,h){const $=J(),{result:j}=await k.get(f);if(!j)throw new Error(`\u274C [SM-ACLs] Node ${f} not found.`);if(j.value[x]!==$)throw Q("revoke permissions");const{[h]:z,...F}=j.value[D]??{};await k.put({...j.value,[D]:F},f)},async delete(f){const h=J(),{result:$}=await k.get(f);if(!$)return;if($.value[x]!==h)throw Q("delete this node");await k.remove(f)},async getPermissions(f){const{result:h}=await k.get(f);if(!h||h.value[x]===void 0)return null;return{owner:h.value[x],collaborators:h.value[D]??{}}}}};export{Z as start,X as createAclModule};