Repository navigation
Expand file tree
/
Copy pathcomposition.js
More file actions
2 lines (2 loc) · 2.26 KB
/
Copy pathcomposition.js
File metadata and controls
2 lines (2 loc) · 2.26 KB
1
2
function M(s){return Object.freeze({type:s,kind:"command"})}function j(s){return Object.freeze({type:s,kind:"event"})}var b=null;function O(s,o){let f=Math.random().toString(36).slice(2),p=new Map(o.events.map(r=>[r.type,r])),i=(o.channelFactory??(r=>new BroadcastChannel(r)))(o.channel),v=o.maxHops??8,u=!1,h=o.events.map(r=>s.on(r,c=>{if(u)return;let l=b??[];l.includes(f)||l.length>=v||i.postMessage({source:f,type:r.type,payload:c,hops:[...l,f]})}));return i.onmessage=r=>{let c=r.data;if(!c||c.source===f||!c.type)return;let l=c.hops??[];if(l.includes(f))return;let y=p.get(c.type);if(!y||o.validate&&!o.validate(c.payload))return;let e=b;u=!0,b=l;try{s.emit(y,c.payload)}finally{u=!1,b=e}},()=>{for(let r of h)r();i.onmessage=null,i.close()}}function k(s){let o=new Map,f=new Map,p=new Map,w=new Map,i=new Set,v=Object.values(s).map(e=>e.subscribe(()=>{for(let t of i)t()})),u=!1;function h(e){let t=f.get(e.type);if(t&&t!==e)throw new Error(`A different command is already registered for "${e.type}"`);return f.set(e.type,e),e}function r(e){let t=w.get(e.type);if(t&&t!==e)throw new Error(`A different event is already registered for "${e.type}"`);return w.set(e.type,e),e}function c(e,t){if(u)throw new Error("Store hub has been disposed");let n=o.get(h(e));if(!n)throw new Error(`No handler registered for "${e.type}"`);return n(t)}function l(e,t){if(u)throw new Error("Store hub has been disposed");let n=p.get(r(e));if(n)for(let d of[...n])d(t)}function y(e,t){if(u)throw new Error("Store hub has been disposed");let n=[],d={store:a=>s[a],call:c,emit:(a,E)=>{r(a),n.push([a,E])}},m=Object.values(s);function S(a){return a===m.length?t(d):m[a].transaction(()=>S(a+1))}let g=S(0);for(let[a,E]of n)l(a,E);return g}return{getSnapshot:()=>{let e={};for(let[t,n]of Object.entries(s))e[t]=n.getSnapshot();return e},subscribe(e){return i.add(e),()=>i.delete(e)},provide(e,t){let n=h(e);if(o.has(n))throw new Error(`Command "${e.type}" already has a handler`);return o.set(n,t),()=>o.delete(n)},on(e,t){let n=r(e),d=p.get(n);return d||p.set(n,d=new Set),d.add(t),()=>d.delete(t)},call:c,emit:l,atomic:y,store:e=>s[e],dispose(){if(!u){u=!0;for(let e of v)e();i.clear(),o.clear(),p.clear()}}}}export{O as broadcastHubEvents,M as command,k as createStoreHub,j as event};
//# sourceMappingURL=composition.js.map