Socket
Socket
Sign inDemoInstall

tinypool

Package Overview
Dependencies
Maintainers
1
Versions
32
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

tinypool - npm Package Compare versions

Comparing version 0.0.4 to 0.0.5

2

dist/esm/index.js

@@ -1,1 +0,1 @@

import{a as t,b as m,c as I,d as E,e as W,f as b,g as y,h as T,i as U,j as z,k as C,l as ve,m as Q,n as F,o as j}from"./chunk-NT6U4PRB.js";import{Worker as oe,MessageChannel as ae,receiveMessageOnPort as ue}from"worker_threads";import{once as le}from"events";import{EventEmitter as ne}from"events";import{AsyncResource as ie}from"async_hooks";var M=Symbol("kEventEmitter"),S=Symbol("kAsyncResource"),Ee,B=class extends ie{constructor(e,s,r){super(s,r);t(this,Ee);this[M]=e}get eventEmitter(){return this[M]}};Ee=M;var Re,_=class extends ne{constructor(e){let s;typeof e=="string"?(s=e,e=void 0):s=e?.name||new.target.name;super(e);t(this,Re);this[S]=new B(this,s,e)}emit(e,...s){return this.asyncResource.runInAsyncScope(super.emit,this,e,...s)}emitDestroy(){this.asyncResource.emitDestroy()}asyncId(){return this.asyncResource.asyncId()}triggerAsyncId(){return this.asyncResource.triggerAsyncId()}get asyncResource(){return this[S]}static get EventEmitterAsyncResource(){return _}},D=_;Re=S;var N=D;import{AsyncResource as me}from"async_hooks";import{cpus as he}from"os";import{fileURLToPath as q,URL as ce}from"url";import{dirname as de,join as fe,resolve as ke}from"path";import{inspect as V,types as pe}from"util";import R from"assert";import{performance as v}from"perf_hooks";import{readFileSync as ge}from"fs";var J=he().length;function be(i,e){"addEventListener"in i?i.addEventListener("abort",e,{once:!0}):i.once("abort",e)}var P=class extends Error{constructor(){super("The task has been aborted")}get name(){return"AbortError"}},O=class{constructor(){t(this,"tasks",[])}get size(){return this.tasks.length}shift(){return this.tasks.shift()}push(e){this.tasks.push(e)}remove(e){let s=this.tasks.indexOf(e);R.notStrictEqual(s,-1),this.tasks.splice(s,1)}},$={filename:null,name:"default",minThreads:Math.max(J/2,1),maxThreads:J*1.5,idleTimeout:0,maxQueue:1/0,concurrentTasksPerWorker:1,useAtomics:!0,taskQueue:new O,trackUnmanagedFds:!0},ye={transferList:void 0,filename:null,signal:null,name:null},k,Y=class{constructor(e){I(this,k,void 0);E(this,k,e)}get[b](){return m(this,k)}get[y](){return m(this,k)}};k=new WeakMap;var p,G=class{constructor(e){I(this,p,void 0);E(this,p,e)}get[b](){return m(this,p).buffer}get[y](){return m(this,p)}};p=new WeakMap;var Te=0;function H(i){return i.startsWith("file:")?q(new ce(i)):i}var K=class extends me{constructor(e,s,r,o,d,n,a){super("Tinypool.Task",{requireManualDestroy:!0,triggerAsyncId:a});t(this,"callback");t(this,"task");t(this,"transferList");t(this,"filename");t(this,"name");t(this,"taskId");t(this,"abortSignal");t(this,"abortListener",null);t(this,"workerInfo",null);t(this,"created");t(this,"started");this.callback=d,this.task=e,this.transferList=s,z(e)&&(this.transferList==null&&(this.transferList=[]),this.transferList=this.transferList.concat(e[b]),this.task=e[y]),this.filename=r,this.name=o,this.taskId=Te++,this.abortSignal=n,this.created=v.now(),this.started=0}releaseTask(){let e=this.task;return this.task=null,e}done(e,s){this.runInAsyncScope(this.callback,null,e,s),this.emitDestroy(),this.abortSignal&&this.abortListener&&("removeEventListener"in this.abortSignal&&this.abortListener?this.abortSignal.removeEventListener("abort",this.abortListener):this.abortSignal.off("abort",this.abortListener))}get[T](){return T in this.task?this.task[T]:null}},X=class{constructor(){t(this,"onreadyListeners",[])}markAsReady(){let e=this.onreadyListeners;R(e!==null),this.onreadyListeners=null;for(let s of e)s()}isReady(){return this.onreadyListeners===null}onReady(e){if(this.onreadyListeners===null){e();return}this.onreadyListeners.push(e)}},Z=class{constructor(e){t(this,"pendingItems",new Set);t(this,"readyItems",new Set);t(this,"maximumUsage");t(this,"onAvailableListeners");this.maximumUsage=e,this.onAvailableListeners=[]}add(e){this.pendingItems.add(e),e.onReady(()=>{this.pendingItems.has(e)&&(this.pendingItems.delete(e),this.readyItems.add(e),this.maybeAvailable(e))})}delete(e){this.pendingItems.delete(e),this.readyItems.delete(e)}findAvailable(){let e=this.maximumUsage,s=null;for(let r of this.readyItems){let o=r.currentUsage();if(o===0)return r;o<e&&(s=r,e=o)}return s}*[Symbol.iterator](){yield*this.pendingItems,yield*this.readyItems}get size(){return this.pendingItems.size+this.readyItems.size}maybeAvailable(e){if(e.currentUsage()<this.maximumUsage)for(let s of this.onAvailableListeners)s(e)}onAvailable(e){this.onAvailableListeners.push(e)}},w={ThreadTermination:()=>new Error("Terminating worker thread"),FilenameNotProvided:()=>new Error("filename must be provided to run() or in options object"),TaskQueueAtLimit:()=>new Error("Task queue is at limit"),NoTaskQueueAvailable:()=>new Error("No task queue available and all Workers are busy")},ee=class extends X{constructor(e,s,r){super();t(this,"worker");t(this,"taskInfos");t(this,"idleTimeout",null);t(this,"port");t(this,"sharedBuffer");t(this,"lastSeenResponseCount",0);t(this,"onMessage");this.worker=e,this.port=s,this.port.on("message",o=>this._handleResponse(o)),this.onMessage=r,this.taskInfos=new Map,this.sharedBuffer=new Int32Array(new SharedArrayBuffer(j*Int32Array.BYTES_PER_ELEMENT))}destroy(){this.worker.terminate(),this.port.close(),this.clearIdleTimeout();for(let e of this.taskInfos.values())e.done(w.ThreadTermination());this.taskInfos.clear()}clearIdleTimeout(){this.idleTimeout!==null&&(clearTimeout(this.idleTimeout),this.idleTimeout=null)}ref(){return this.port.ref(),this}unref(){return this.port.unref(),this}_handleResponse(e){this.onMessage(e),this.taskInfos.size===0&&this.unref()}postTask(e){R(!this.taskInfos.has(e.taskId));let s={task:e.releaseTask(),taskId:e.taskId,filename:e.filename,name:e.name};try{this.port.postMessage(s,e.transferList)}catch(r){e.done(r);return}e.workerInfo=this,this.taskInfos.set(e.taskId,e),this.ref(),this.clearIdleTimeout(),Atomics.add(this.sharedBuffer,Q,1),Atomics.notify(this.sharedBuffer,Q,1)}processPendingMessages(){let e=Atomics.load(this.sharedBuffer,F);if(e!==this.lastSeenResponseCount){this.lastSeenResponseCount=e;let s;for(;(s=ue(this.port))!==void 0;)this._handleResponse(s.message)}}isRunningAbortableTask(){if(this.taskInfos.size!==1)return!1;let[[,e]]=this.taskInfos;return e.abortSignal!==null}currentUsage(){return this.isRunningAbortableTask()?1/0:this.taskInfos.size}},se=class{constructor(e,s){t(this,"publicInterface");t(this,"workers");t(this,"options");t(this,"taskQueue");t(this,"skipQueue",[]);t(this,"completed",0);t(this,"start",v.now());t(this,"inProcessPendingMessages",!1);t(this,"startingUp",!1);t(this,"workerFailsDuringBootstrap",!1);this.publicInterface=e,this.taskQueue=s.taskQueue||new O;let r=s.filename?H(s.filename):null;this.options={...$,...s,filename:r,maxQueue:0},s.maxThreads!==void 0&&this.options.minThreads>=s.maxThreads&&(this.options.minThreads=s.maxThreads),s.minThreads!==void 0&&this.options.maxThreads<=s.minThreads&&(this.options.maxThreads=s.minThreads),s.maxQueue==="auto"?this.options.maxQueue=this.options.maxThreads**2:this.options.maxQueue=s.maxQueue??$.maxQueue,this.workers=new Z(this.options.concurrentTasksPerWorker),this.workers.onAvailable(o=>this._onWorkerAvailable(o)),this.startingUp=!0,this._ensureMinimumWorkers(),this.startingUp=!1}_ensureMinimumWorkers(){for(;this.workers.size<this.options.minThreads;)this._addNewWorker()}_addNewWorker(){let e=this,s=de(q(import.meta.url)),r=new oe(ke(s,"./worker.js"),{env:this.options.env,argv:this.options.argv,execArgv:this.options.execArgv,resourceLimits:this.options.resourceLimits,workerData:this.options.workerData,trackUnmanagedFds:this.options.trackUnmanagedFds}),{port1:o,port2:d}=new ae,n=new ee(r,o,A);this.startingUp&&n.markAsReady();let a={filename:this.options.filename,name:this.options.name,port:d,sharedBuffer:n.sharedBuffer,useAtomics:this.options.useAtomics};r.postMessage(a,[d]);function A(u){let{taskId:c,result:l}=u,g=n.taskInfos.get(c);if(n.taskInfos.delete(c),e.workers.maybeAvailable(n),g===void 0){let x=new Error(`Unexpected message from Worker: ${V(u)}`);e.publicInterface.emit("error",x)}else g.done(u.error,l);e._processPendingMessages()}r.on("message",u=>{if(u.ready===!0){n.currentUsage()===0&&n.unref(),n.isReady()||n.markAsReady();return}r.emit("error",new Error(`Unexpected message on Worker: ${V(u)}`))}),r.on("error",u=>{r.ref=()=>{};let c=[...n.taskInfos.values()];if(n.taskInfos.clear(),this._removeWorker(n),n.isReady()&&!this.workerFailsDuringBootstrap?this._ensureMinimumWorkers():this.workerFailsDuringBootstrap=!0,c.length>0)for(let l of c)l.done(u,null);else this.publicInterface.emit("error",u)}),r.unref(),o.on("close",()=>{r.ref()}),this.workers.add(n)}_processPendingMessages(){if(!(this.inProcessPendingMessages||!this.options.useAtomics)){this.inProcessPendingMessages=!0;try{for(let e of this.workers)e.processPendingMessages()}finally{this.inProcessPendingMessages=!1}}}_removeWorker(e){e.destroy(),this.workers.delete(e)}_onWorkerAvailable(e){for(;(this.taskQueue.size>0||this.skipQueue.length>0)&&e.currentUsage()<this.options.concurrentTasksPerWorker;){let s=this.skipQueue.shift()||this.taskQueue.shift();if(s.abortSignal&&e.taskInfos.size>0){this.skipQueue.push(s);break}let r=v.now();s.started=r,e.postTask(s),this._maybeDrain();return}e.taskInfos.size===0&&this.workers.size>this.options.minThreads&&(e.idleTimeout=setTimeout(()=>{R.strictEqual(e.taskInfos.size,0),this.workers.size>this.options.minThreads&&this._removeWorker(e)},this.options.idleTimeout).unref())}runTask(e,s){let{filename:r,name:o}=s,{transferList:d=[],signal:n=null}=s;if(r==null&&(r=this.options.filename),o==null&&(o=this.options.name),typeof r!="string")return Promise.reject(w.FilenameNotProvided());r=H(r);let a=this.workers.findAvailable(),A,u,c=new Promise((f,L)=>{A=f,u=L}),l=new K(e,d,r,o,(f,L)=>{this.completed++,a&&this.options.isolateWorkers&&this._removeWorker(a),f!==null?u(f):A(L)},n,this.publicInterface.asyncResource.asyncId());if(n!==null){if(n.aborted)return Promise.reject(new P);l.abortListener=()=>{u(new P),l.workerInfo!==null?(this._removeWorker(l.workerInfo),this._ensureMinimumWorkers()):this.taskQueue.remove(l)},be(n,l.abortListener)}if(this.taskQueue.size>0){let f=this.options.maxQueue+this.pendingCapacity();return this.taskQueue.size>=f?this.options.maxQueue===0?Promise.reject(w.NoTaskQueueAvailable()):Promise.reject(w.TaskQueueAtLimit()):(this.workers.size<this.options.maxThreads&&this._addNewWorker(),this.taskQueue.push(l),c)}a!==null&&a.currentUsage()>0&&n&&(a=null);let g=!1;if((a===null||a.currentUsage()>0)&&this.workers.size<this.options.maxThreads&&(this._addNewWorker(),g=!0),a===null)return this.options.maxQueue<=0&&!g?Promise.reject(w.NoTaskQueueAvailable()):(this.taskQueue.push(l),c);let x=v.now();return l.started=x,a.postTask(l),this._maybeDrain(),c}pendingCapacity(){return this.workers.pendingItems.size*this.options.concurrentTasksPerWorker}_maybeDrain(){this.taskQueue.size===0&&this.skipQueue.length===0&&this.publicInterface.emit("drain")}async destroy(){for(;this.skipQueue.length>0;)this.skipQueue.shift().done(new Error("Terminating worker thread"));for(;this.taskQueue.size>0;)this.taskQueue.shift().done(new Error("Terminating worker thread"));let e=[];for(;this.workers.size>0;){let[s]=this.workers;e.push(le(s.worker,"exit")),this._removeWorker(s)}await Promise.all(e)}},h,te=class extends N{constructor(e={}){super({...e,name:"Tinypool"});I(this,h,void 0);if(e.minThreads!==void 0&&e.maxThreads!==void 0&&e.minThreads>e.maxThreads)throw new RangeError("options.minThreads and options.maxThreads must not conflict");E(this,h,new se(this,e))}run(e,s=ye){let{transferList:r,filename:o,name:d,signal:n}=s;return m(this,h).runTask(e,{transferList:r,filename:o,name:d,signal:n})}destroy(){return m(this,h).destroy()}get options(){return m(this,h).options}get threads(){let e=[];for(let s of m(this,h).workers)e.push(s.worker);return e}get queueSize(){let e=m(this,h);return Math.max(e.taskQueue.size-e.pendingCapacity(),0)}get completed(){return m(this,h).completed}get duration(){return v.now()-m(this,h).start}static get isWorkerThread(){return process.__tinypool_state__?.isWorkerThread||!1}static get workerData(){return process.__tinypool_state__?.workerData||void 0}static get version(){let{version:e}=JSON.parse(ge(fe(W,"../package.json"),"utf-8"));return e}static move(e){return e!=null&&typeof e=="object"&&typeof e!="function"&&(U(e)||(pe.isArrayBufferView(e)?e=new G(e):e=new Y(e)),C(e)),e}static get transferableSymbol(){return b}static get valueSymbol(){return y}static get queueOptionsSymbol(){return T}};h=new WeakMap;var $e=te;export{te as Tinypool,$e as default,z as isMovable,ve as isTaskQueue,U as isTransferable,j as kFieldCount,T as kQueueOptions,Q as kRequestCountField,F as kResponseCountField,b as kTransferable,y as kValue,C as markMovable};
import{a as t,b as l,c as A,d as E,e as W,f as y,g as T,h as v,i as U,j as z,k as C,l as ve,m as Q,n as F,o as j}from"./chunk-NT6U4PRB.js";import{Worker as oe,MessageChannel as ae,receiveMessageOnPort as ue}from"worker_threads";import{once as le}from"events";import{EventEmitter as ne}from"events";import{AsyncResource as ie}from"async_hooks";var M=Symbol("kEventEmitter"),S=Symbol("kAsyncResource"),Ee,B=class extends ie{constructor(e,s,r){super(s,r);t(this,Ee);this[M]=e}get eventEmitter(){return this[M]}};Ee=M;var Re,_=class extends ne{constructor(e){let s;typeof e=="string"?(s=e,e=void 0):s=e?.name||new.target.name;super(e);t(this,Re);this[S]=new B(this,s,e)}emit(e,...s){return this.asyncResource.runInAsyncScope(super.emit,this,e,...s)}emitDestroy(){this.asyncResource.emitDestroy()}asyncId(){return this.asyncResource.asyncId()}triggerAsyncId(){return this.asyncResource.triggerAsyncId()}get asyncResource(){return this[S]}static get EventEmitterAsyncResource(){return _}},D=_;Re=S;var N=D;import{AsyncResource as me}from"async_hooks";import{cpus as he}from"os";import{fileURLToPath as q,URL as ce}from"url";import{dirname as fe,join as de,resolve as ke}from"path";import{inspect as V,types as pe}from"util";import R from"assert";import{performance as w}from"perf_hooks";import{readFileSync as ge}from"fs";var J=he().length;function be(o,e){"addEventListener"in o?o.addEventListener("abort",e,{once:!0}):o.once("abort",e)}var P=class extends Error{constructor(){super("The task has been aborted")}get name(){return"AbortError"}},O=class{constructor(){t(this,"tasks",[])}get size(){return this.tasks.length}shift(){return this.tasks.shift()}push(e){this.tasks.push(e)}remove(e){let s=this.tasks.indexOf(e);R.notStrictEqual(s,-1),this.tasks.splice(s,1)}},$={filename:null,name:"default",minThreads:Math.max(J/2,1),maxThreads:J*1.5,idleTimeout:0,maxQueue:1/0,concurrentTasksPerWorker:1,useAtomics:!0,taskQueue:new O,trackUnmanagedFds:!0},ye={transferList:void 0,filename:null,signal:null,name:null},k,Y=class{constructor(e){A(this,k,void 0);E(this,k,e)}get[y](){return l(this,k)}get[T](){return l(this,k)}};k=new WeakMap;var p,G=class{constructor(e){A(this,p,void 0);E(this,p,e)}get[y](){return l(this,p).buffer}get[T](){return l(this,p)}};p=new WeakMap;var Te=0;function H(o){return o.startsWith("file:")?q(new ce(o)):o}var K=class extends me{constructor(e,s,r,a,c,n,f){super("Tinypool.Task",{requireManualDestroy:!0,triggerAsyncId:f});t(this,"callback");t(this,"task");t(this,"transferList");t(this,"filename");t(this,"name");t(this,"taskId");t(this,"abortSignal");t(this,"abortListener",null);t(this,"workerInfo",null);t(this,"created");t(this,"started");this.callback=c,this.task=e,this.transferList=s,z(e)&&(this.transferList==null&&(this.transferList=[]),this.transferList=this.transferList.concat(e[y]),this.task=e[T]),this.filename=r,this.name=a,this.taskId=Te++,this.abortSignal=n,this.created=w.now(),this.started=0}releaseTask(){let e=this.task;return this.task=null,e}done(e,s){this.emitDestroy(),this.runInAsyncScope(this.callback,null,e,s),this.abortSignal&&this.abortListener&&("removeEventListener"in this.abortSignal&&this.abortListener?this.abortSignal.removeEventListener("abort",this.abortListener):this.abortSignal.off("abort",this.abortListener))}get[v](){return v in this.task?this.task[v]:null}},X=class{constructor(){t(this,"onreadyListeners",[])}markAsReady(){let e=this.onreadyListeners;R(e!==null),this.onreadyListeners=null;for(let s of e)s()}isReady(){return this.onreadyListeners===null}onReady(e){if(this.onreadyListeners===null){e();return}this.onreadyListeners.push(e)}},Z=class{constructor(e){t(this,"pendingItems",new Set);t(this,"readyItems",new Set);t(this,"maximumUsage");t(this,"onAvailableListeners");this.maximumUsage=e,this.onAvailableListeners=[]}add(e){this.pendingItems.add(e),e.onReady(()=>{this.pendingItems.has(e)&&(this.pendingItems.delete(e),this.readyItems.add(e),this.maybeAvailable(e))})}delete(e){this.pendingItems.delete(e),this.readyItems.delete(e)}findAvailable(){let e=this.maximumUsage,s=null;for(let r of this.readyItems){let a=r.currentUsage();if(a===0)return r;a<e&&(s=r,e=a)}return s}*[Symbol.iterator](){yield*this.pendingItems,yield*this.readyItems}get size(){return this.pendingItems.size+this.readyItems.size}maybeAvailable(e){if(e.currentUsage()<this.maximumUsage)for(let s of this.onAvailableListeners)s(e)}onAvailable(e){this.onAvailableListeners.push(e)}},I={ThreadTermination:()=>new Error("Terminating worker thread"),FilenameNotProvided:()=>new Error("filename must be provided to run() or in options object"),TaskQueueAtLimit:()=>new Error("Task queue is at limit"),NoTaskQueueAvailable:()=>new Error("No task queue available and all Workers are busy")},ee=class extends X{constructor(e,s,r){super();t(this,"worker");t(this,"taskInfos");t(this,"idleTimeout",null);t(this,"port");t(this,"sharedBuffer");t(this,"lastSeenResponseCount",0);t(this,"onMessage");this.worker=e,this.port=s,this.port.on("message",a=>this._handleResponse(a)),this.onMessage=r,this.taskInfos=new Map,this.sharedBuffer=new Int32Array(new SharedArrayBuffer(j*Int32Array.BYTES_PER_ELEMENT))}destroy(){this.worker.terminate(),this.port.close(),this.clearIdleTimeout();for(let e of this.taskInfos.values())e.done(I.ThreadTermination());this.taskInfos.clear()}clearIdleTimeout(){this.idleTimeout!==null&&(clearTimeout(this.idleTimeout),this.idleTimeout=null)}ref(){return this.port.ref(),this}unref(){return this.port.unref(),this}_handleResponse(e){this.onMessage(e),this.taskInfos.size===0&&this.unref()}postTask(e){R(!this.taskInfos.has(e.taskId));let s={task:e.releaseTask(),taskId:e.taskId,filename:e.filename,name:e.name};try{this.port.postMessage(s,e.transferList)}catch(r){e.done(r);return}e.workerInfo=this,this.taskInfos.set(e.taskId,e),this.ref(),this.clearIdleTimeout(),Atomics.add(this.sharedBuffer,Q,1),Atomics.notify(this.sharedBuffer,Q,1)}processPendingMessages(){let e=Atomics.load(this.sharedBuffer,F);if(e!==this.lastSeenResponseCount){this.lastSeenResponseCount=e;let s;for(;(s=ue(this.port))!==void 0;)this._handleResponse(s.message)}}isRunningAbortableTask(){if(this.taskInfos.size!==1)return!1;let[[,e]]=this.taskInfos;return e.abortSignal!==null}currentUsage(){return this.isRunningAbortableTask()?1/0:this.taskInfos.size}},se=class{constructor(e,s){t(this,"publicInterface");t(this,"workers");t(this,"options");t(this,"taskQueue");t(this,"skipQueue",[]);t(this,"completed",0);t(this,"start",w.now());t(this,"inProcessPendingMessages",!1);t(this,"startingUp",!1);t(this,"workerFailsDuringBootstrap",!1);this.publicInterface=e,this.taskQueue=s.taskQueue||new O;let r=s.filename?H(s.filename):null;this.options={...$,...s,filename:r,maxQueue:0},s.maxThreads!==void 0&&this.options.minThreads>=s.maxThreads&&(this.options.minThreads=s.maxThreads),s.minThreads!==void 0&&this.options.maxThreads<=s.minThreads&&(this.options.maxThreads=s.minThreads),s.maxQueue==="auto"?this.options.maxQueue=this.options.maxThreads**2:this.options.maxQueue=s.maxQueue??$.maxQueue,this.workers=new Z(this.options.concurrentTasksPerWorker),this.workers.onAvailable(a=>this._onWorkerAvailable(a)),this.startingUp=!0,this._ensureMinimumWorkers(),this.startingUp=!1}_ensureMinimumWorkers(){for(;this.workers.size<this.options.minThreads;)this._addNewWorker()}_addNewWorker(){let e=this,s=fe(q(import.meta.url)),r=new oe(ke(s,"./worker.js"),{env:this.options.env,argv:this.options.argv,execArgv:this.options.execArgv,resourceLimits:this.options.resourceLimits,workerData:this.options.workerData,trackUnmanagedFds:this.options.trackUnmanagedFds}),{port1:a,port2:c}=new ae,n=new ee(r,a,g);this.startingUp&&n.markAsReady();let f={filename:this.options.filename,name:this.options.name,port:c,sharedBuffer:n.sharedBuffer,useAtomics:this.options.useAtomics};r.postMessage(f,[c]);function g(u){let{taskId:i,result:m}=u,b=n.taskInfos.get(i);if(n.taskInfos.delete(i),e.workers.maybeAvailable(n),b===void 0){let x=new Error(`Unexpected message from Worker: ${V(u)}`);e.publicInterface.emit("error",x)}else b.done(u.error,m);e._processPendingMessages()}r.on("message",u=>{if(u.ready===!0){n.currentUsage()===0&&n.unref(),n.isReady()||n.markAsReady();return}r.emit("error",new Error(`Unexpected message on Worker: ${V(u)}`))}),r.on("error",u=>{r.ref=()=>{};let i=[...n.taskInfos.values()];if(n.taskInfos.clear(),this._removeWorker(n),n.isReady()&&!this.workerFailsDuringBootstrap?this._ensureMinimumWorkers():this.workerFailsDuringBootstrap=!0,i.length>0)for(let m of i)m.done(u,null);else this.publicInterface.emit("error",u)}),r.unref(),a.on("close",()=>{r.ref()}),this.workers.add(n)}_processPendingMessages(){if(!(this.inProcessPendingMessages||!this.options.useAtomics)){this.inProcessPendingMessages=!0;try{for(let e of this.workers)e.processPendingMessages()}finally{this.inProcessPendingMessages=!1}}}_removeWorker(e){e.destroy(),this.workers.delete(e)}_onWorkerAvailable(e){for(;(this.taskQueue.size>0||this.skipQueue.length>0)&&e.currentUsage()<this.options.concurrentTasksPerWorker;){let s=this.skipQueue.shift()||this.taskQueue.shift();if(s.abortSignal&&e.taskInfos.size>0){this.skipQueue.push(s);break}let r=w.now();s.started=r,e.postTask(s),this._maybeDrain();return}e.taskInfos.size===0&&this.workers.size>this.options.minThreads&&(e.idleTimeout=setTimeout(()=>{R.strictEqual(e.taskInfos.size,0),this.workers.size>this.options.minThreads&&this._removeWorker(e)},this.options.idleTimeout).unref())}runTask(e,s){let{filename:r,name:a}=s,{transferList:c=[],signal:n=null}=s;if(r==null&&(r=this.options.filename),a==null&&(a=this.options.name),typeof r!="string")return Promise.reject(I.FilenameNotProvided());r=H(r);let f,g,u=new Promise((d,L)=>{f=d,g=L}),i=new K(e,c,r,a,(d,L)=>{this.completed++,d!==null?g(d):f(L),this.options.isolateWorkers&&i.workerInfo&&(i.workerInfo.taskInfos.delete(i.taskId),i.workerInfo.taskInfos.size||(this._removeWorker(i.workerInfo),this._ensureMinimumWorkers()))},n,this.publicInterface.asyncResource.asyncId());if(n!==null){if(n.aborted)return Promise.reject(new P);i.abortListener=()=>{g(new P),i.workerInfo!==null?(this._removeWorker(i.workerInfo),this._ensureMinimumWorkers()):this.taskQueue.remove(i)},be(n,i.abortListener)}if(this.taskQueue.size>0){let d=this.options.maxQueue+this.pendingCapacity();return this.taskQueue.size>=d?this.options.maxQueue===0?Promise.reject(I.NoTaskQueueAvailable()):Promise.reject(I.TaskQueueAtLimit()):(this.workers.size<this.options.maxThreads&&this._addNewWorker(),this.taskQueue.push(i),u)}let m=this.workers.findAvailable();m!==null&&m.currentUsage()>0&&n&&(m=null);let b=!1;if((m===null||m.currentUsage()>0)&&this.workers.size<this.options.maxThreads&&(this._addNewWorker(),b=!0),m===null)return this.options.maxQueue<=0&&!b?Promise.reject(I.NoTaskQueueAvailable()):(this.taskQueue.push(i),u);let x=w.now();return i.started=x,m.postTask(i),this._maybeDrain(),u}pendingCapacity(){return this.workers.pendingItems.size*this.options.concurrentTasksPerWorker}_maybeDrain(){this.taskQueue.size===0&&this.skipQueue.length===0&&this.publicInterface.emit("drain")}async destroy(){for(;this.skipQueue.length>0;)this.skipQueue.shift().done(new Error("Terminating worker thread"));for(;this.taskQueue.size>0;)this.taskQueue.shift().done(new Error("Terminating worker thread"));let e=[];for(;this.workers.size>0;){let[s]=this.workers;e.push(le(s.worker,"exit")),this._removeWorker(s)}await Promise.all(e)}},h,te=class extends N{constructor(e={}){super({...e,name:"Tinypool"});A(this,h,void 0);if(e.minThreads!==void 0&&e.maxThreads!==void 0&&e.minThreads>e.maxThreads)throw new RangeError("options.minThreads and options.maxThreads must not conflict");E(this,h,new se(this,e))}run(e,s=ye){let{transferList:r,filename:a,name:c,signal:n}=s;return l(this,h).runTask(e,{transferList:r,filename:a,name:c,signal:n})}destroy(){return l(this,h).destroy()}get options(){return l(this,h).options}get threads(){let e=[];for(let s of l(this,h).workers)e.push(s.worker);return e}get queueSize(){let e=l(this,h);return Math.max(e.taskQueue.size-e.pendingCapacity(),0)}get completed(){return l(this,h).completed}get duration(){return w.now()-l(this,h).start}static get isWorkerThread(){return process.__tinypool_state__?.isWorkerThread||!1}static get workerData(){return process.__tinypool_state__?.workerData||void 0}static get version(){let{version:e}=JSON.parse(ge(de(W,"../package.json"),"utf-8"));return e}static move(e){return e!=null&&typeof e=="object"&&typeof e!="function"&&(U(e)||(pe.isArrayBufferView(e)?e=new G(e):e=new Y(e)),C(e)),e}static get transferableSymbol(){return y}static get valueSymbol(){return T}static get queueOptionsSymbol(){return v}};h=new WeakMap;var $e=te;export{te as Tinypool,$e as default,z as isMovable,ve as isTaskQueue,U as isTransferable,j as kFieldCount,v as kQueueOptions,Q as kRequestCountField,F as kResponseCountField,y as kTransferable,T as kValue,C as markMovable};
{
"name": "tinypool",
"version": "0.0.4",
"version": "0.0.5",
"description": "A minimal and tiny Node.js Worker Thread Pool implementation, a fork of piscina, but with fewer features",

@@ -5,0 +5,0 @@ "type": "module",

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc