UNPKG

worker-tls

Version:

worker-tls 提供了 动态Worker 功能 和 其它一些 Worker 场景下有用的工具集;让开发者可以像调用对象方法一样动态地调用Worker中的方法,也可以随时地往 Worker 中动态地添加函数 等等。

13 lines (12 loc) 12 kB
"use strict";var Z=Object.defineProperty;var H=(o,t,e)=>t in o?Z(o,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):o[t]=e;var b=(o,t,e)=>H(o,typeof t!="symbol"?t+"":t,e);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const E=require("type-tls"),W=require("./dynamicWorkerAPI-BHOvCLiB.cjs"),w=`(function(){"use strict";function n(){const r=globalThis.currentWorkerType;if(r)return r;let e=globalThis.SharedWorkerGlobalScope;return typeof e=="function"&&globalThis instanceof e?globalThis.currentWorkerType="SharedWorker":(e=globalThis.DedicatedWorkerGlobalScope,typeof e=="function"&&globalThis instanceof e?globalThis.currentWorkerType="DedicatedWorker":(e=globalThis.Window,typeof e=="function"&&globalThis instanceof e?globalThis.currentWorkerType="Window":globalThis.currentWorkerType="unknown"))}function t(r){switch(n()){case"SharedWorker":{globalThis.addEventListener("connect",function(e){for(const o of e.ports)o.addEventListener("message",r),o.start()});break}default:globalThis.addEventListener("message",r)}}globalThis.listenMessage||(globalThis.listenMessage=t)})(); `,L='(function(){"use strict";function b(t){var e=t;return t!=null&&(e=t.constructor,e==null&&(e=typeof t)),e}var u=(t=>(t.equal="equal",t.intersect="intersect",t.intersectEqual="intersectEqual",t))(u||{});(t=>{function e(r){let s;switch(r){case"equal":s=(o,n)=>o===n;case"intersect":s=(o,n)=>o&n;default:s=(o,n)=>(o&n)===o}return s}t.getEqualFun=e})(u||(u={}));function d(){const t=globalThis.currentWorkerType;if(t)return t;let e=globalThis.SharedWorkerGlobalScope;return typeof e=="function"&&globalThis instanceof e?globalThis.currentWorkerType="SharedWorker":(e=globalThis.DedicatedWorkerGlobalScope,typeof e=="function"&&globalThis instanceof e?globalThis.currentWorkerType="DedicatedWorker":(e=globalThis.Window,typeof e=="function"&&globalThis instanceof e?globalThis.currentWorkerType="Window":globalThis.currentWorkerType="unknown"))}function h(t,e,r){const s=/(^\\s*(async\\s+)?function\\s*(\\s|\\*)\\s*)[A-Za-z_$]+[\\w$]*(\\s*\\()/,o=/^[A-Za-z_$]+[\\w$]*$/,n=s.test(t),a=e&&o.test(e);if(n&&a&&(t=t.replace(s,`$1${e}$4`)),!n&&a)var i=`var ${e} = ${t} ; return ${e}`;else i=`return (${t})`;return new Function(i)()}function f(t){const{name:e,args:r,this:s}=t,o=s??globalThis,n=globalThis[e];return typeof n=="function"?n.apply(o,r):r||s?{error:"函数不存在",state:"结束"}:{data:n,state:"结束"}}function g(t){const e=b(t);if(e==="object"||e===Object){const{transfer:r,targetOrigin:s}=t;return"data"in t||"error"in t||Array.isArray(r)||typeof s=="string"}return!1}function c(t,e){const{data:r,...s}=g(t)?t:{data:t},o={...e,...s};if(r instanceof ReadableStream){const n=new WritableStream({write:function(a,i){return c(a,{...o,state:"进行中"})},close:function(a){l(void 0,{state:"结束",...o})},abort:function(a){l(void 0,{state:"结束",...o,error:a})}});return r.pipeTo(n)}return r instanceof Promise?r.then(function(n){c(n,{state:"结束",...o})},function(n){l(void 0,{...o,error:n,state:"结束"})}):l(r,{state:"结束",...o})}function l(t,e){const{port:r,...s}=e,{transfer:o,targetOrigin:n,...a}=g(t)?{...s,...t}:{...s,data:t};a.state==null&&(a.state="结束");const i={transfer:o,targetOrigin:n};return(r??globalThis).postMessage(a,i)}function T(t){const e=t.data,r=t.currentTarget;if(e){const s=f(e);c(s,{execId:e.id,port:r})}}function p(t,e){const r=h(t,e);return e=e??r.name,globalThis[e]=r,!0}function y(t){return delete globalThis[t]}Object.assign(globalThis,{execCMD:f,messageListener:T,setCMD:p,removeCMD:y,sendMessage:c}),d(),listenMessage(T)})();\n',T="event";function j(o,t){t=t??o.name;const e=o.toString();return`globalThis['${t}'] = ${e};`}function q(o,t){const e=typeof o=="string"?o:o.toString();t=t??[];const n=t.map(function(r){return E.isObject(r)?JSON.stringify(r):r}),s=n.length>0?`,${n.join(",")}`:"";return`(${e}).call(this${s});`}function F(o,t){return o.name?j(o):q(o,t)}function B(o){return`globalThis.listenMessage(${typeof o=="string"?o:o.toString()});`}function J(o){const e=o.map(function(s){return`${s}.call(this,${T});`}).join(` `),n=`function(${T}){${e}}`;return B(n)}function V(o){const e=o.map(function(s){return q(s,[T])}).join(` `),n=`function(${T}){${e}}`;return B(n)}function D(o,t){const e=new Blob(o,{type:"text/javascript",...t});return URL.createObjectURL(e)}function U(o,t){const e=o.map(n=>typeof n=="function"?` ${F(n,t)} `:n);return D(e)}function v(o){return o.name||o.fun?[o]:Object.entries(o).map(function([t,e]){return{name:t,fun:e}})}function P(o,t){const{code:e,named:n,iife:s,message:r}=o,i=[],c=[],a=s||[],f=[],l=[],m=Array.isArray(e)?e:e?[e]:[];for(const u of m){const g=E.getExactTypeOf(u);if(g===Object||g==="object"){const x=v(u);i.push(...x)}else c.push(u)}const y=Array.isArray(n)?n:n?[n]:[];for(const u of y)if(typeof u=="function")i.push({fun:u});else{const g=v(u);i.push(...g)}const p=Array.isArray(r)?r:r?[r]:[];for(const u of p)switch(typeof u){case"string":{l.push(u);break}case"function":{f.push(u);break}default:{const{name:g,fun:x}=u;x?f.push(x):g&&l.push(g)}}const h=i.map(function({name:u,fun:g}){return`${j(g,u)} `}),d=c.map(function(u){return typeof u=="function"?`${F(u)} `:u}),M=a.map(function(u){return`${q(u)} `}),S=[],K=V(f);S.push(`${K} `);const Q=J(l);return S.push(`${Q} `),[...t?[]:[`${w} `],...h,...d,...M,...S]}function X(o,t){const e=P(o,t);return D(e)}function $(o,t){const e=o?P(o,!1):[];return t||e.unshift(w,L),D(e)}function A(o){return o&&Array.isArray(o.args)&&Array.isArray(o.transfer)}const k=class k{constructor(t){b(this,"id",++k.instanceCount);b(this,"execCount",0);if(t)for(const e of Object.keys(t))this.setCMDToSelf(e)}get port(){return this.getPort(this.worker)}get workerAndPort(){const t=this.worker;return[t,this.getPort(t)]}getPort(t){return t.port||t}execStarted(t,e){++t.executingCount}execEnded(t){--t.executingCount}getExecId(t){return t=t??"匿名",`${t}_${this.execCount}`}getExecRecord(t){return{id:this.getExecId(t.name),...t}}listenResponse(t,e){const n=new AbortController,s=n.signal;let r=null;const i=this.getPort(e);return new Promise((c,a)=>{i.addEventListener("message",l=>{const m=l.data,{execId:y,state:p,error:h,data:d}=m;if(t!==y)return;if(r){if(p===W.MessageState.End){n.abort(),h&&r.error(h),d!==void 0&&r.enqueue(d),r.close(),this.execEnded(e);return}if(h){r.error(h);return}r.enqueue(d);return}if(h){a(h),n.abort();return}if(p===W.MessageState.End){n.abort(),c(d),this.execEnded(e);return}const M=new ReadableStream({start:S=>{r=S,h&&r.error(h),r.enqueue(d)}});c(M)},{signal:s});const f=l=>{if(n.abort(),r){r.error(l),r.close(),this.execEnded(e);return}a(l)};e.addEventListener("error",f,{signal:s}),i.addEventListener("messageerror",f,{signal:s})}).catch(c=>{throw this.execEnded(e),c})}execCMD(t,e){++this.execCount;const n=this.getExecRecord(t),[s,r]=this.workerAndPort;this.execStarted(s,n);const i=this.listenResponse(n.id,s);r.postMessage(n,e);const c=t.name;return c in this?i:i.then(a=>(this.setCMDToSelf(c),a))}setCMDToSelf(t,e){const n=(...r)=>{const i=r[0];let c;return r.length===1&&A(i)&&(c=i.transfer,r=i.args),this.execCMD({name:t,args:r.length>0?r:void 0},c)};return Reflect.defineProperty(this,t,{configurable:!0,enumerable:!0,...e?{get:n}:{value:n,writable:!0}})}};b(k,"instanceCount",0);let C=k;function I(o){const{url:t,name:e}=o;return new Worker(t,{name:e})}class _ extends C{constructor(e,n){super(e==null?void 0:e.named);b(this,"worker");const{id:s}=this;let r=(typeof n=="string"?n:n==null?void 0:n.name)||`DynamicWorker/${s}`,i=e;if(!W.isWorkerInst(e)){const c=typeof e=="string",{getWorker:a,noDep:f}=n||{},l=c?e:$(e,f);i=(a||I)({url:l,name:r,clientId:s,id:s}),c||URL.revokeObjectURL(l)}i.executingCount=0,i.name=r,i.id=i.clientId=s,this.worker=i}get executingCount(){return this.worker.executingCount}setCMD(e,n,s){const r=n||e.name;if(!r)return Promise.reject("没有函数的名字");const i=typeof e=="function"?e.toString():e;return this.execCMD({name:"setCMD",args:[i,r]}).then(c=>(c&&this.setCMDToSelf(r,s),c))}removeCMD(e){return this.execCMD({name:"removeCMD",args:[e]}).then(n=>(n&&Reflect.deleteProperty(this,e),n))}}class G{constructor(t,e){b(this,"_queue",[]);this.comparer=t,e&&(this.queue=e)}get queue(){return this._queue}set queue(t){this._queue=t,this.sort()}get first(){return this.queue[0]}get last(){return this.queue.at(-1)}add(t){const{queue:e}=this;let n=e.indexOf(t);return n===-1&&(n=e.push(t)-1),this.sortItemForIndex(n)}addItems(t){for(const e of t)this.add(e)}delete(t){const{queue:e}=this,n=e.indexOf(t);return n===-1&&e.splice(n,1),n}deleteItems(t){const{queue:e}=this;for(const n of t){const s=e.indexOf(n);s===-1&&e.splice(s,1)}}sort(){this.queue.sort(this.comparer)}sortItem(t){const e=this.queue.indexOf(t);return e===-1?e:this.sortItemForIndex(e)}forwardSort(t){const e=this.queue.indexOf(t);return e<1?e:this.forwardSortForIndex(e)}backwardSort(t){const e=this.queue.indexOf(t);return e===-1?e:this.backwardSortForIndex(e)}sortItemForIndex(t){const{queue:e,comparer:n}=this,s=e[t],r=t-1;if(r>=0&&n(e[r],s)>0)return this.forwardSort(s);const i=t+1,c=e.length;return i<c&&n(s,e[i])>0?this.backwardSort(s):t}forwardSortForIndex(t){const{queue:e,comparer:n}=this,s=e[t];for(;t>0;){const r=t-1,i=e[r];if(n(i,s)>0)e[r]=s,e[t]=i,t=r;else break}return t}backwardSortForIndex(t){const{queue:e,comparer:n}=this,s=e[t],r=e.length-1;for(;t<r;){const i=t+1,c=e[i];if(n(s,c)>0)e[i]=s,e[t]=c,t=i;else break}return t}}function N(o,t){return o.executingCount-t.executingCount}class z extends C{constructor(e,n,s){const r=typeof n=="string";super(n==null?void 0:n.named);b(this,"queue",new G(N));const i=r?n:$(n),{getWorker:c,name:a}=s||{},f=this.id,l=a||`DynamicWorkerPool/${f}`,m=c||I,y=[];for(let p=1;p<=e;p++){const h=`${l}/${p}`,d=m({url:i,name:h,clientId:f,id:p});d.executingCount=0,d.name=h,d.clientId=f,d.id=p,y.push(d)}r||URL.revokeObjectURL(i),this.queue.queue=y}get worker(){return this.queue.first}get executingCount(){return this.queue.queue.reduce((e,n)=>e+n.executingCount,0)}execStarted(e,n){super.execStarted(e,n),this.queue.backwardSort(e)}execEnded(e){super.execEnded(e),this.queue.forwardSort(e)}execCMDOnWorker(e,n,s){++this.execCount;const r=this.getExecRecord(n),i=this.getPort(e);this.execStarted(e,r),i.postMessage(r,s);const c=this.listenResponse(r.id,e),a=n.name;return a in this?c:c.then(f=>(this.setCMDToSelf(a),f))}allExecCMD(e,n){const s=[],r=[...this.queue.queue];for(const a of r){++this.execCount;const f=this.getExecRecord(e),l=this.getPort(a);this.execStarted(a,f),l.postMessage(f,n);const m=this.listenResponse(f.id,a);s.push(m)}const i=Promise.all(s),c=e.name;return c in this?i:i.then(a=>(this.setCMDToSelf(c),a))}setCMD(e,n,s){const r=n||e.name;if(!r)return Promise.reject("没有函数的名字");const i=typeof e=="function"?e.toString():e;return this.allExecCMD({name:"setCMD",args:[i,r]}).then(c=>(c&&this.setCMDToSelf(r,s),c))}removeCMD(e){return this.allExecCMD({name:"removeCMD",args:[e]}).then(n=>(n&&Reflect.deleteProperty(this,e),n))}}function R(o){return new Proxy(o,{get:function(t,e,n){const s=t[e];return typeof s=="function"?s.bind(t):s||function(...r){const i=r[0];let c;return r.length===1&&A(i)&&(c=i.transfer,r=i.args),t.execCMD({name:e,args:r.length>0?r:void 0},c)}},set:function(t,e,n,s){return t.setCMD(n,e,typeof n!="function")},deleteProperty:function(t,e){return t.removeCMD(e)},has:function(t,e){return e in t},ownKeys:function(t){return Reflect.ownKeys(t)}})}function Y(o,t){const e=new _(o,t);return R(e)}function O(o,t,e){const n=new z(o,t,e);return R(n)}exports.DynamicWorker=_;exports.DynamicWorkerPool=z;exports.SortQueue=G;exports.WorkerClient=C;exports.createBlobParts=P;exports.createDynamicWorker=Y;exports.createDynamicWorkerPool=O;exports.createDynamicWorkerURL=$;exports.createObjectURLByCodes=U;exports.createObjectURLByContents=D;exports.createWorkerClientProxy=R;exports.createWorkerURL=X;exports.dynamicWorkerCodeString=L;exports.getWorker_Default=I;exports.isCallOptions=A;exports.listenMessages_Dep=w;exports.workerPriorityComparator=N;