web-background
Version:
Running background in browser Worker
2 lines (1 loc) • 1.96 kB
JavaScript
class e extends Worker{postMessage(e){super.postMessage(e)}addEventListener(e,t){super.addEventListener(e,t)}}class t extends e{constructor(e,t){super(e,t)}request(e){return new Promise((t=>{const n=({data:e})=>{t(e),this.removeEventListener("message",n)};this.postMessage(e),this.addEventListener("message",n)}))}}function n(e,t){return function(e,t){const n=e.toString();let r="(function() {\n";const o=Object.entries(t),s=o.filter((([,e])=>"function"!=typeof e)),c=o.filter((([,e])=>"function"==typeof e));s.forEach((([e,t])=>{try{r+=` const ${e} = ${JSON.stringify(t)};\n`}catch(t){r+=` const ${e} = undefined;\n`}})),c.forEach((([e,t])=>{"function"==typeof t&&(r+=` const ${e} = ${t.toString()};\n`)})),o.length>0&&(r+="\n");return r+=` return ${n};\n`,r+="})()",r}(e,t||{})}"function"==typeof SuppressedError&&SuppressedError;class r{static fromModule(e,t){var{module:r,context:o}=t,s=function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(r=Object.getOwnPropertySymbols(e);o<r.length;o++)t.indexOf(r[o])<0&&Object.prototype.propertyIsEnumerable.call(e,r[o])&&(n[r[o]]=e[r[o]])}return n}(t,["module","context"]);const c=`\n self.addEventListener('message', async event => {\n const func = ${n(r,o)};\n const result = await func(${r.length>1?"...event.data":"event.data"});\n self.postMessage(result);\n });\n `.trim(),i=new Blob([c]),u=URL.createObjectURL(i),a=new e(u,s),l=a.terminate;return a.terminate=()=>{l.call(a),URL.revokeObjectURL(u)},a}}const o=new FinalizationRegistry((e=>e.terminate()));function s(e,n){let s=null;return function c(...i){if("undefined"==typeof window)throw new Error("[web-background] You must use background in browser");return null==s&&(s=r.fromModule(t,{module:e,context:n}),o.register(c,s)),s.request.call(s,i.length>1?i:i[0])}}export{s as background};