sabayon
Version:
SharedArrayBuffer always on
2 lines (1 loc) • 3.01 kB
JavaScript
const{ArrayBuffer:e,Atomics:t,Promise:s}=globalThis,{isArray:a}=Array,{create:r,getPrototypeOf:o,values:n}=Object,c=o(Int32Array),i=r(t),l=()=>s.withResolvers();let p=0;const g=new Map,f=(e,t)=>class extends e{constructor(e,...s){super(e,...s),e instanceof t&&g.set(this,[p++,0,l()])}},u=new WeakSet,d=e=>(u.add(e),e),h=(e,t)=>{const{data:s}=e,r=a(s)&&(s.at(0)===t||0===s.at(1)&&!t);return r&&(e.stopImmediatePropagation(),e.preventDefault()),r},y=e=>null!==e&&"object"==typeof e&&!u.has(e),v=new WeakMap,w=(t,s,a)=>{if(g.has(t))s.set(t,g.get(t)[0]);else if(!(t instanceof c||t instanceof e))for(const e of n(t))y(e)&&!a.has(e)&&(a.add(e),w(e,s,a))};let m=0;const A=(...e)=>({value:new s((async t=>{const s="/__sabayon_wait_async.js";if(!m){const e=fetch(s,{method:"HEAD"}).then((e=>e.ok),(()=>!1));m=await e?1:-1}const a=new Worker(m<0?"data:application/javascript,onmessage%3De%3D%3EpostMessage(!Atomics.wait(...e.data))":s);a.onmessage=()=>{a.terminate(),t("ok")},a.postMessage(e)}))}),k=(e,t,s)=>{for(const[s,a]of t)v.set(s,[a,e.currentTarget]);(({currentTarget:e,type:t,origin:s,lastEventId:a,source:r,ports:o},n)=>{e.dispatchEvent(new MessageEvent(t,{data:n,origin:s,lastEventId:a,source:r,ports:o}))})(e,s)};let{BigInt64Array:M,Int32Array:I,SharedArrayBuffer:W,Worker:b}=globalThis,E=e=>e,j=!1;const x=e=>({...e,type:"module"});try{new W(4),b=class extends b{constructor(e,t){super(e,x(t))}},i.waitAsync||(i.waitAsync=A)}catch(t){const s=crypto.randomUUID(),a=new Map,r=(e,t,s,...a)=>{e.addEventListener(t,s,...a)},o=({serviceWorker:e},t,o)=>{let n,c=!0;r(e,"message",(e=>{if(h(e,s)){const[t,r,o]=e.data,c=[r,o].join(","),i=e=>{a.delete(c),n.postMessage([s,r,o,e])},p=a.get(c);if(p)i(p);else{const{promise:e,resolve:t}=l();a.set(c,t),e.then(i)}}})),e.getRegistration(t).then((s=>s??e.register(t))).then((function t(s){c=c&&!!e.controller,n=s.installing||s.waiting||s.active,"activated"===n.state?c?o():location.reload():r(n,"statechange",(()=>t(s)),{once:!0})}))};E=d,j=!0,i.notify=(e,t)=>{const[r,o]=(e=>v.get(e))(e),n=[r,t].join(","),c=a.get(n);return c?c(e):a.set(n,e),o.postMessage([s,1,e,r,t]),0},i.waitAsync=(e,...t)=>{const[s,a]=((e,t)=>{const s=g.get(e),[a,r,{promise:o}]=s;return s[1]=t,[a,o]})(e,...t);return{value:a}},W=class extends e{},M=f(M,W),I=f(I,W);let n=null;b=class extends b{constructor(e,t){let a=t?.serviceWorker||"";if(a){if(a=new URL(a,location.href).href,t={...t,serviceWorker:a},!n){const{promise:e,resolve:t}=l();o(navigator,a,t),n=e}n.then((()=>super.postMessage([s,3])))}super(e,x(t)),super.postMessage([s,0,t]),r(this,"message",(e=>{if(h(e,s)){const[t,s,...a]=e.data;switch(s){case 1:((e,t,s)=>{for(const[a,[r,o,{resolve:n}]]of g)if(t===r&&s===o){a.set(e),g.delete(a),n("ok");break}})(...a);break;case 2:k(e,...a)}}}))}postMessage(e,...t){return super.postMessage(((e,t)=>{const s=new Map;return y(t)&&w(t,s,new Set),s.size?[e,2,s,t]:t})(s,e),...t)}}}export{i as Atomics,M as BigInt64Array,I as Int32Array,W as SharedArrayBuffer,b as Worker,E as ignore,j as polyfill};