UNPKG

@webreflection/coincident

Version:

An Atomics based Proxy to simplify, and synchronize, Worker related tasks

2 lines (1 loc) 4.06 kB
var e={ref:0,array:1,object:2,number:3,string:4,true:5,false:6,null:7,buffer:8,view:9,symbol:10,date:11,bigint:12,undefined:13,map:14,set:15,regexp:16,error:17};const{assign:t,create:r}=Object;let s="coincident-",n=!0;try{new SharedArrayBuffer(4,{maxByteLength:8}),s+=crypto.randomUUID()}catch(e){n=!1,s+=Math.random().toString(36).substring(2)}const a=2*Int32Array.BYTES_PER_ELEMENT,o={byteOffset:a,useUTF16:!0,circular:!0},c=new Map,i=(e,t,r)=>{const s="then"!==t;return s&&(e[t]=r),s},u=()=>Promise.withResolvers(),{getPrototypeOf:l}=Object,f=e=>{const t=typeof e;switch(t){case"function":case"undefined":return"";case"object":return null===e?"null":"object";default:return t}},{isArray:p}=Array,{isView:b}=ArrayBuffer,{stringify:g}=JSON,h=(t,r,s)=>{const n=r.get(s);return"number"==typeof n?(t.push(e.ref,n),!0):(r.set(s,t.length),!1)},y=(t,r,s,n=f(s))=>{switch(n){case"null":t.push(e.null);break;case"object":if(h(t,r,s))break;switch(!0){case p(s):{const n=s.length;t.push(e.array,n);for(let e=0;e<n;e++)y(t,r,s[e]);break}case b(s):{const{BYTES_PER_ELEMENT:n,buffer:a,byteOffset:o,length:c}=s;if(t.push(e.view,(e=>{for(;!(e.name in globalThis);)e=l(e);return e.name})(s.constructor),o,c!==(a.byteLength-o)/n?c:0),h(t,r,a))break;s=a}case s instanceof ArrayBuffer:{const r=s.byteLength,n=s.resizable?s.maxByteLength:0;if(t.push(e.buffer,r,n),r){const e=new Uint8Array(s,0,r);for(let r=0;r<e.length;r+=65535)t.push.apply(t,e.subarray(r,r+65535))}break}case s instanceof Date:t.push(e.date,+s);break;case s instanceof Map:{const n=t.push(e.map,0);let a=0;for(const[e,n]of s){const s=f(e),o=f(n);s&&o&&(y(t,r,e,s),y(t,r,n,o),a++)}t[n-1]=a;break}case s instanceof Set:{const n=t.push(e.set,0);let a=0;for(const e of s){const s=f(e);s&&(y(t,r,e,s),a++)}t[n-1]=a;break}case s instanceof RegExp:t.push(e.regexp,s.source,s.flags);break;case s instanceof Error:t.push(e.error,s.name,s.message,s.stack,s.cause);break;default:{if("toJSON"in s){const n=s.toJSON();if(n===s){t.push(e.object,0);break}if(h(t,r,s=n))break}const n=t.push(e.object,0);let a=0;for(const e in s){const n=s[e],o=f(n);o&&(y(t,r,e,"string"),y(t,r,n,o),a++)}t[n-1]=a;break}}break;case"boolean":t.push(s?e.true:e.false);break;case"string":if(h(t,r,s))break;t.push(e.string,s);break;case"bigint":t.push(e[n],s.toString());break;case"symbol":{const r=(e=>{const t=String(e).slice(7,-1);return t.startsWith("Symbol.")||Symbol.keyFor(e)?t:""})(s);if(r){t.push(e[n],r);break}}case"":t.push(e.undefined);break;default:t.push(e[n],s)}},m=(e=>({byteOffset:t=0}={})=>(r,s)=>{const n=e(r),a=n.length,o=2*a+t;s.byteLength<o&&s.grow(o);const c=new Uint16Array(s,t,a);for(let e=0;e<a;e++)c[e]=n.charCodeAt(e);return a})((e=>{const t=[];return y(t,new Map,e),g(t)})),d="InstallTrigger"in globalThis?s:"",{notify:k}=Atomics,w=e=>e;var E=e=>{const s=e?.transform,a=(e?.encoder||m)(o);class l extends globalThis.Worker{constructor(e,o){const{port1:l,port2:f}=new MessageChannel,[p,b]=((e,t=0)=>[r=>{const s=u();do{r=e(t++)}while(c.has(r));return c.set(r,s),[r,s]},(e,t,r)=>{const s=c.get(e);c.delete(e),r?s.reject(r):s.resolve(t)}])(w),g=new Map,h=r(null);let y="";super(e,t({type:"module"},o)).proxy=new Proxy(h,{get:(e,t)=>{if("then"===t)return;let r=g.get(t);return r||g.set(t,r=(...e)=>{const[r,n]=p();return l.postMessage([r,t,s?e.map(s):e]),(({promise:e},t)=>{if(y){const r=setTimeout(console.warn,3e3,`💀🔒 - is proxy.${y}() awaiting proxy.${t}() ?`);e=e.then((e=>(clearTimeout(r),e)),(e=>(clearTimeout(r),Promise.reject(e))))}return e})(n,t)}),r},set:i}),super.postMessage(d,[f]),n&&d&&super.addEventListener("message",(e=>{const{data:t}=e;t?.ID===d&&((e=>{e.stopImmediatePropagation(),e.preventDefault()})(e),l.onmessage(t))})),l.onmessage=async({data:e})=>{const t=e[0],r=typeof t;if("number"===r)b.apply(null,e);else if(y=e[1],await(async(e,t,r)=>{try{const s=await t[e[1]].apply(null,e[2]);e[1]=r?r(s):s,e[2]=null}catch(t){e[2]=t}})(e,h,s),y="","string"===r)l.postMessage(e);else{const r=e[2]||e[1];t[1]=void 0===r?0:a(r,t.buffer),t[0]=1,k(t,0)}}}}return{Worker:l,native:n}};export{E as default};