UNPKG

workerpool

Version:

Offload tasks to a pool of workers on node.js and in the browser

4 lines (3 loc) 32.6 kB
/*! For license information please see workerpool.min.js.LICENSE.txt */ !function(e,r){"object"==typeof exports&&"undefined"!=typeof module?r(exports):"function"==typeof define&&define.amd?define(["exports"],r):r((e="undefined"!=typeof globalThis?globalThis:e||self).workerpool={})}(this,function(e){"use strict";var r={},t={exports:{}};!function(e){var r=function(e){return void 0!==e&&null!=e.versions&&null!=e.versions.node&&e+""=="[object process]"};e.exports.isNode=r,e.exports.platform="undefined"!=typeof process&&r(process)?"node":"browser";var t="node"===e.exports.platform&&require("worker_threads");e.exports.isMainThread="node"===e.exports.platform?(!t||t.isMainThread)&&!process.connected:"undefined"!=typeof Window,e.exports.cpus="browser"===e.exports.platform?self.navigator.hardwareConcurrency:require("os").cpus().length}(t);var n=t.exports;function o(e,r){(null==r||r>e.length)&&(r=e.length);for(var t=0,n=Array(r);t<r;t++)n[t]=e[t];return n}function i(e,r,t){return r=a(r),function(e,r){if(r&&("object"==typeof r||"function"==typeof r))return r;if(void 0!==r)throw new TypeError("Derived constructors may only return object or undefined");return function(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(e)}(e,c()?Reflect.construct(r,t||[],a(e).constructor):r.apply(e,t))}function s(e,r){var t="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!t){if(Array.isArray(e)||(t=function(e,r){if(e){if("string"==typeof e)return o(e,r);var t={}.toString.call(e).slice(8,-1);return"Object"===t&&e.constructor&&(t=e.constructor.name),"Map"===t||"Set"===t?Array.from(e):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?o(e,r):void 0}}(e))||r){t&&(e=t);var n=0,i=function(){};return{s:i,n:function(){return n>=e.length?{done:!0}:{done:!1,value:e[n++]}},e:function(e){throw e},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var s,u=!0,a=!1;return{s:function(){t=t.call(e)},n:function(){var e=t.next();return u=e.done,e},e:function(e){a=!0,s=e},f:function(){try{u||null==t.return||t.return()}finally{if(a)throw s}}}}function u(e,r,t){return(r=function(e){var r=function(e,r){if("object"!=typeof e||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,r);if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===r?String:Number)(e)}(e,"string");return"symbol"==typeof r?r:r+""}(r))in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function a(e){return a=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},a(e)}function c(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch(e){}return(c=function(){return!!e})()}function f(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);r&&(n=n.filter(function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable})),t.push.apply(t,n)}return t}function p(e,r){return p=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,r){return e.__proto__=r,e},p(e,r)}function l(e){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},l(e)}function d(e){var r="function"==typeof Map?new Map:void 0;return d=function(e){if(null===e||!function(e){try{return-1!==Function.toString.call(e).indexOf("[native code]")}catch(r){return"function"==typeof e}}(e))return e;if("function"!=typeof e)throw new TypeError("Super expression must either be null or a function");if(void 0!==r){if(r.has(e))return r.get(e);r.set(e,t)}function t(){return function(e,r,t){if(c())return Reflect.construct.apply(null,arguments);var n=[null];n.push.apply(n,r);var o=new(e.bind.apply(e,n));return t&&p(o,t.prototype),o}(e,arguments,a(this).constructor)}return t.prototype=Object.create(e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),p(t,e)},d(e)}var h,m={exports:{}},w={};function k(){if(h)return w;function e(o,i){var s=this;if(!(this instanceof e))throw new SyntaxError("Constructor must be called with the new operator");if("function"!=typeof o)throw new SyntaxError("Function parameter handler(resolve, reject) missing");var u=[],a=[];this.resolved=!1,this.rejected=!1,this.pending=!0,this[Symbol.toStringTag]="Promise";var c=function(e,r){u.push(e),a.push(r)};this.then=function(t,n){return new e(function(e,o){var i=t?r(t,e,o):e,s=n?r(n,e,o):o;c(i,s)},s)};var f=function(e){return s.resolved=!0,s.rejected=!1,s.pending=!1,u.forEach(function(r){r(e)}),c=function(r,t){r(e)},f=p=function(){},s},p=function(e){return s.resolved=!1,s.rejected=!0,s.pending=!1,a.forEach(function(r){r(e)}),c=function(r,t){t(e)},f=p=function(){},s};this.cancel=function(){return i?i.cancel():p(new t),s},this.timeout=function(e){if(i)i.timeout(e);else{var r=setTimeout(function(){p(new n("Promise timed out after "+e+" ms"))},e);s.always(function(){clearTimeout(r)})}return s},o(function(e){f(e)},function(e){p(e)})}function r(e,r,t){return function(n){try{var o=e(n);o&&"function"==typeof o.then&&"function"==typeof o.catch?o.then(r,t):r(o)}catch(e){t(e)}}}function t(e){this.message=e||"promise cancelled",this.stack=(new Error).stack}function n(e){this.message=e||"timeout exceeded",this.stack=(new Error).stack}return h=1,e.prototype.catch=function(e){return this.then(null,e)},e.prototype.always=function(e){return this.then(e,e)},e.prototype.finally=function(r){var t=this,n=function(){return new e(function(e){return e()}).then(r).then(function(){return t})};return this.then(n,n)},e.all=function(r){return new e(function(e,t){var n=r.length,o=[];n?r.forEach(function(r,i){r.then(function(r){o[i]=r,0==--n&&e(o)},function(e){n=0,t(e)})}):e(o)})},e.defer=function(){var r={};return r.promise=new e(function(e,t){r.resolve=e,r.reject=t}),r},t.prototype=new Error,t.prototype.constructor=Error,t.prototype.name="CancellationError",e.CancellationError=t,n.prototype=new Error,n.prototype.constructor=Error,n.prototype.name="TimeoutError",e.TimeoutError=n,w.Promise=e,w}var y,v,g={};g.validateOptions=function(e,r,t){if(e){var n=e?Object.keys(e):[],o=n.find(function(e){return!r.includes(e)});if(o)throw new Error('Object "'+t+'" contains an unknown option "'+o+'"');var i=r.find(function(e){return Object.prototype[e]&&!n.includes(e)});if(i)throw new Error('Object "'+t+'" contains an inherited option "'+i+'" which is not defined in the object itself but in its prototype. Only plain objects are allowed. Please remove the option from the prototype or override it with a value "undefined".');return e}},g.workerOptsNames=["credentials","name","type"],g.forkOptsNames=["cwd","detached","env","execPath","execArgv","gid","serialization","signal","killSignal","silent","stdio","uid","windowsVerbatimArguments","timeout"],g.workerThreadOptsNames=["argv","env","eval","execArgv","stdin","stdout","stderr","workerData","trackUnmanagedFds","transferList","resourceLimits","name"];var b=k().Promise,O=n,T=g.validateOptions,x=g.forkOptsNames,E=g.workerThreadOptsNames,j=g.workerOptsNames,W="__workerpool-terminate__",_="__workerpool-cleanup__";function S(){var e=A();if(!e)throw new Error("WorkerPool: workerType = 'thread' is not supported, Node >= 11.7.0 required");return e}function P(){if("function"!=typeof Worker&&("object"!==("undefined"==typeof Worker?"undefined":l(Worker))||"function"!=typeof Worker.prototype.constructor))throw new Error("WorkerPool: Web Workers not supported")}function A(){try{return require("worker_threads")}catch(e){if("object"===l(e)&&null!==e&&"MODULE_NOT_FOUND"===e.code)return null;throw e}}function L(e,r,t){T(r,j,"workerOpts");var n=new t(e,r);return n.isBrowserWorker=!0,n.on=function(e,r){this.addEventListener(e,function(e){r(e.data)})},n.send=function(e,r){this.postMessage(e,r)},n}function N(e,r,t){var n,o;T(null==t?void 0:t.workerThreadOpts,E,"workerThreadOpts");var i=new r.Worker(e,function(e){for(var r=1;r<arguments.length;r++){var t=null!=arguments[r]?arguments[r]:{};r%2?f(Object(t),!0).forEach(function(r){u(e,r,t[r])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):f(Object(t)).forEach(function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(t,r))})}return e}({stdout:null!==(n=null==t?void 0:t.emitStdStreams)&&void 0!==n&&n,stderr:null!==(o=null==t?void 0:t.emitStdStreams)&&void 0!==o&&o},null==t?void 0:t.workerThreadOpts));return i.isWorkerThread=!0,i.send=function(e,r){this.postMessage(e,r)},i.kill=function(){return this.terminate(),!0},i.disconnect=function(){this.terminate()},null!=t&&t.emitStdStreams&&(i.stdout.on("data",function(e){return i.emit("stdout",e)}),i.stderr.on("data",function(e){return i.emit("stderr",e)})),i}function M(e,r,t){T(r.forkOpts,x,"forkOpts");var n=t.fork(e,r.forkArgs,r.forkOpts),o=n.send;return n.send=function(e){return o.call(n,e)},r.emitStdStreams&&(n.stdout.on("data",function(e){return n.emit("stdout",e)}),n.stderr.on("data",function(e){return n.emit("stderr",e)})),n.isChildProcess=!0,n}function Q(e){e=e||{};var r=process.execArgv.join(" "),t=-1!==r.indexOf("--inspect"),n=-1!==r.indexOf("--debug-brk"),o=[];return t&&(o.push("--inspect="+e.debugPort),n&&o.push("--debug-brk")),process.execArgv.forEach(function(e){e.indexOf("--max-old-space-size")>-1&&o.push(e)}),Object.assign({},e,{forkArgs:e.forkArgs,forkOpts:Object.assign({},e.forkOpts,{execArgv:(e.forkOpts&&e.forkOpts.execArgv||[]).concat(o),stdio:e.emitStdStreams?"pipe":void 0})})}function U(e){for(var r=new Error(""),t=Object.keys(e),n=0;n<t.length;n++)r[t[n]]=e[t[n]];return r}function F(e,r){Object.values(e.processing).forEach(function(e){var t;return null==e||null===(t=e.options)||void 0===t?void 0:t.on(r)}),Object.values(e.tracking).forEach(function(e){var t;return null==e||null===(t=e.options)||void 0===t?void 0:t.on(r)})}function z(e,r){var t=this,n=r||{};function o(e){for(var r in t.terminated=!0,t.processing)void 0!==t.processing[r]&&t.processing[r].resolver.reject(e);t.processing=Object.create(null)}this.script=e||function(){if("browser"===O.platform){if("undefined"==typeof Blob)throw new Error("Blob not supported by the browser");if(!window.URL||"function"!=typeof window.URL.createObjectURL)throw new Error("URL.createObjectURL not supported by the browser");var e=new Blob([v?y:(v=1,y='!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?module.exports=n():"function"==typeof define&&define.amd?define(n):(e="undefined"!=typeof globalThis?globalThis:e||self).worker=n()}(this,function(){"use strict";function e(n){return e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},e(n)}function n(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var t={};var r=function(e,n){this.message=e,this.transfer=n},o={};function i(e,n){var t=this;if(!(this instanceof i))throw new SyntaxError("Constructor must be called with the new operator");if("function"!=typeof e)throw new SyntaxError("Function parameter handler(resolve, reject) missing");var r=[],o=[];this.resolved=!1,this.rejected=!1,this.pending=!0,this[Symbol.toStringTag]="Promise";var a=function(e,n){r.push(e),o.push(n)};this.then=function(e,n){return new i(function(t,r){var o=e?s(e,t,r):t,i=n?s(n,t,r):r;a(o,i)},t)};var f=function(e){return t.resolved=!0,t.rejected=!1,t.pending=!1,r.forEach(function(n){n(e)}),a=function(n,t){n(e)},f=d=function(){},t},d=function(e){return t.resolved=!1,t.rejected=!0,t.pending=!1,o.forEach(function(n){n(e)}),a=function(n,t){t(e)},f=d=function(){},t};this.cancel=function(){return n?n.cancel():d(new u),t},this.timeout=function(e){if(n)n.timeout(e);else{var r=setTimeout(function(){d(new c("Promise timed out after "+e+" ms"))},e);t.always(function(){clearTimeout(r)})}return t},e(function(e){f(e)},function(e){d(e)})}function s(e,n,t){return function(r){try{var o=e(r);o&&"function"==typeof o.then&&"function"==typeof o.catch?o.then(n,t):n(o)}catch(e){t(e)}}}function u(e){this.message=e||"promise cancelled",this.stack=(new Error).stack}function c(e){this.message=e||"timeout exceeded",this.stack=(new Error).stack}return i.prototype.catch=function(e){return this.then(null,e)},i.prototype.always=function(e){return this.then(e,e)},i.prototype.finally=function(e){var n=this,t=function(){return new i(function(e){return e()}).then(e).then(function(){return n})};return this.then(t,t)},i.all=function(e){return new i(function(n,t){var r=e.length,o=[];r?e.forEach(function(e,i){e.then(function(e){o[i]=e,0==--r&&n(o)},function(e){r=0,t(e)})}):n(o)})},i.defer=function(){var e={};return e.promise=new i(function(n,t){e.resolve=n,e.reject=t}),e},u.prototype=new Error,u.prototype.constructor=Error,u.prototype.name="CancellationError",i.CancellationError=u,c.prototype=new Error,c.prototype.constructor=Error,c.prototype.name="TimeoutError",i.TimeoutError=c,o.Promise=i,function(n){var t=r,i=o.Promise,s="__workerpool-cleanup__",u={exit:function(){}},c={addAbortListener:function(e){u.abortListeners.push(e)},emit:u.emit};if("undefined"!=typeof self&&"function"==typeof postMessage&&"function"==typeof addEventListener)u.on=function(e,n){addEventListener(e,function(e){n(e.data)})},u.send=function(e,n){n?postMessage(e,n):postMessage(e)};else{if("undefined"==typeof process)throw new Error("Script must be executed as a worker");var a;try{a=require("worker_threads")}catch(n){if("object"!==e(n)||null===n||"MODULE_NOT_FOUND"!==n.code)throw n}if(a&&null!==a.parentPort){var f=a.parentPort;u.send=f.postMessage.bind(f),u.on=f.on.bind(f),u.exit=process.exit.bind(process)}else u.on=process.on.bind(process),u.send=function(e){process.send(e)},u.on("disconnect",function(){process.exit(1)}),u.exit=process.exit.bind(process)}function d(e){return e&&e.toJSON?JSON.parse(JSON.stringify(e)):JSON.parse(JSON.stringify(e,Object.getOwnPropertyNames(e)))}function l(e){return e&&"function"==typeof e.then&&"function"==typeof e.catch}u.methods={},u.methods.run=function(e,n){var t=new Function("return ("+e+").apply(this, arguments);");return t.worker=c,t.apply(t,n)},u.methods.methods=function(){return Object.keys(u.methods)},u.terminationHandler=void 0,u.abortListenerTimeout=1e3,u.abortListeners=[],u.terminateAndExit=function(e){var n=function(){u.exit(e)};if(!u.terminationHandler)return n();var t=u.terminationHandler(e);return l(t)?(t.then(n,n),t):(n(),new i(function(e,n){n(new Error("Worker terminating"))}))},u.cleanup=function(e){if(!u.abortListeners.length)return u.send({id:e,method:s,error:d(new Error("Worker terminating"))}),new i(function(e){e()});var n,t=u.abortListeners.map(function(e){return e()}),r=new i(function(e,t){n=setTimeout(function(){t(new Error("Timeout occurred waiting for abort handler, killing worker"))},u.abortListenerTimeout)}),o=i.all(t).then(function(){clearTimeout(n),u.abortListeners.length&&(u.abortListeners=[])},function(){clearTimeout(n),u.exit()});return new i(function(e,n){o.then(e,n),r.then(e,n)}).then(function(){u.send({id:e,method:s,error:null})},function(n){u.send({id:e,method:s,error:n?d(n):null})})};var p=null;u.on("message",function(e){if("__workerpool-terminate__"===e)return u.terminateAndExit(0);if(e.method===s)return u.cleanup(e.id);try{var n=u.methods[e.method];if(!n)throw new Error(\'Unknown method "\'+e.method+\'"\');p=e.id;var r=n.apply(n,e.params);l(r)?r.then(function(n){n instanceof t?u.send({id:e.id,result:n.message,error:null},n.transfer):u.send({id:e.id,result:n,error:null}),p=null}).catch(function(n){u.send({id:e.id,result:null,error:d(n)}),p=null}):(r instanceof t?u.send({id:e.id,result:r.message,error:null},r.transfer):u.send({id:e.id,result:r,error:null}),p=null)}catch(n){u.send({id:e.id,result:null,error:d(n)})}}),u.register=function(e,n){if(e)for(var t in e)e.hasOwnProperty(t)&&(u.methods[t]=e[t],u.methods[t].worker=c);n&&(u.terminationHandler=n.onTerminate,u.abortListenerTimeout=n.abortListenerTimeout||1e3),u.send("ready")},u.emit=function(e){if(p){if(e instanceof t)return void u.send({id:p,isEvent:!0,payload:e.message},e.transfer);u.send({id:p,isEvent:!0,payload:e})}},n.add=u.register,n.emit=u.emit}(t),n(t)});\n//# sourceMappingURL=worker.min.js.map\n')],{type:"text/javascript"});return window.URL.createObjectURL(e)}return __dirname+"/worker.js"}(),this.worker=function(e,r){if("web"===r.workerType)return P(),L(e,r.workerOpts,Worker);if("thread"===r.workerType)return N(e,t=S(),r);if("process"!==r.workerType&&r.workerType){if("browser"===O.platform)return P(),L(e,r.workerOpts,Worker);var t=A();return t?N(e,t,r):M(e,Q(r),require("child_process"))}return M(e,Q(r),require("child_process"))}(this.script,n),this.debugPort=n.debugPort,this.forkOpts=n.forkOpts,this.forkArgs=n.forkArgs,this.workerOpts=n.workerOpts,this.workerThreadOpts=n.workerThreadOpts,this.workerTerminateTimeout=n.workerTerminateTimeout,e||(this.worker.ready=!0),this.requestQueue=[],this.worker.on("stdout",function(e){F(t,{stdout:e.toString()})}),this.worker.on("stderr",function(e){F(t,{stderr:e.toString()})}),this.worker.on("message",function(e){if(!t.terminated)if("string"==typeof e&&"ready"===e)t.worker.ready=!0,function(){var e,r=s(t.requestQueue.splice(0));try{for(r.s();!(e=r.n()).done;){var n=e.value;t.worker.send(n.message,n.transfer)}}catch(e){r.e(e)}finally{r.f()}}();else{var r,n=e.id;if(void 0!==(r=t.processing[n]))e.isEvent?r.options&&"function"==typeof r.options.on&&r.options.on(e.payload):(delete t.processing[n],!0===t.terminating&&t.terminate(),e.error?r.resolver.reject(U(e.error)):r.resolver.resolve(e.result));else void 0!==(r=t.tracking[n])&&e.isEvent&&r.options&&"function"==typeof r.options.on&&r.options.on(e.payload);if(e.method===_){var o=t.tracking[e.id];void 0!==o&&(e.error?(clearTimeout(o.timeoutId),o.resolver.reject(U(e.error))):(t.tracking&&clearTimeout(o.timeoutId),o.resolver.reject(new q(o.error)))),delete t.tracking[n]}}});var i=this.worker;this.worker.on("error",function(e){var r=e&&e.message?e.message:String(e||"Unknown worker error");o(new C("Workerpool Worker error: "+r,e))}),this.worker.on("exit",function(e,r){var n="Workerpool Worker terminated Unexpectedly\n";n+=" exitCode: `"+e+"`\n",n+=" signalCode: `"+r+"`\n",n+=" workerpool.script: `"+t.script+"`\n",n+=" spawnArgs: `"+i.spawnargs+"`\n",n+=" spawnfile: `"+i.spawnfile+"`\n",n+=" stdout: `"+i.stdout+"`\n",n+=" stderr: `"+i.stderr+"`\n",o(new C(n))}),this.processing=Object.create(null),this.tracking=Object.create(null),this.terminating=!1,this.terminated=!1,this.cleaning=!1,this.terminationHandler=null,this.lastId=0}function q(e){this.error=e,this.stack=(new Error).stack}z.prototype.methods=function(){return this.exec("methods")},z.prototype.exec=function(e,r,t,n){t||(t=b.defer());var o=++this.lastId;this.processing[o]={id:o,resolver:t,options:n};var i={message:{id:o,method:e,params:r},transfer:n&&n.transfer};this.terminated?t.reject(new C("Worker is terminated")):this.worker.ready?this.worker.send(i.message,i.transfer):this.requestQueue.push(i);var s=this;return t.promise.catch(function(e){if(e instanceof b.CancellationError||e instanceof b.TimeoutError)return s.tracking[o]={id:o,resolver:b.defer(),options:n,error:e},delete s.processing[o],s.tracking[o].resolver.promise=s.tracking[o].resolver.promise.catch(function(e){if(delete s.tracking[o],e instanceof q)throw e.error;var r=s.terminateAndNotify(!0).then(function(){throw e},function(e){throw e});return r}),s.worker.send({id:o,method:_}),s.tracking[o].timeoutId=setTimeout(function(){s.tracking[o].resolver.reject(e)},s.workerTerminateTimeout),s.tracking[o].resolver.promise;throw e})},z.prototype.busy=function(){return this.cleaning||Object.keys(this.processing).length>0||Object.keys(this.tracking).length>0},z.prototype.terminate=function(e,r){var t=this;if(e){for(var n in this.processing)void 0!==this.processing[n]&&this.processing[n].resolver.reject(new Error("Worker terminated"));this.processing=Object.create(null)}for(var o=0,i=Object.values(t.tracking);o<i.length;o++){var s=i[o];clearTimeout(s.timeoutId),s.resolver.reject(new Error("Worker Terminating"))}if(t.tracking=Object.create(null),"function"==typeof r&&(this.terminationHandler=r),this.busy())this.terminating=!0;else{var u=function(e){if(t.terminated=!0,t.cleaning=!1,null!=t.worker&&t.worker.removeAllListeners&&t.worker.removeAllListeners("message"),t.worker=null,t.terminating=!1,t.terminationHandler)t.terminationHandler(e,t);else if(e)throw e};if(this.worker){if("function"==typeof this.worker.kill){if(this.worker.killed)return void u(new Error("worker already killed!"));var a=setTimeout(function(){t.worker&&t.worker.kill()},this.workerTerminateTimeout);return this.worker.once("exit",function(){clearTimeout(a),t.worker&&(t.worker.killed=!0),u()}),this.worker.ready?this.worker.send(W):this.requestQueue.push({message:W}),void(this.cleaning=!0)}if("function"!=typeof this.worker.terminate)throw new Error("Failed to terminate worker");this.worker.terminate(),this.worker.killed=!0}u()}},z.prototype.terminateAndNotify=function(e,r){var t=b.defer();return r&&t.promise.timeout(r),this.terminate(e,function(e,r){e?t.reject(e):t.resolve(r)}),t.promise};var C=function(e){function r(e,t){var n;return function(e,r){if(!(e instanceof r))throw new TypeError("Cannot call a class as a function")}(this,r),(n=i(this,r,[e||"worker terminated"])).cause=t,n}return function(e,r){if("function"!=typeof r&&null!==r)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(r&&r.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),r&&p(e,r)}(r,e),t=r,Object.defineProperty(t,"prototype",{writable:!1}),t;var t}(d(Error));m.exports=z,m.exports._tryRequireWorkerThreads=A,m.exports._setupProcessWorker=M,m.exports._setupBrowserWorker=L,m.exports._setupWorkerThreadWorker=N,m.exports.ensureWorkerThreads=S,m.exports.TerminateError=C;var H,I,R,D,J,B,V=m.exports;function $(){if(B)return J;B=1;var e=k().Promise,r=V,t=n,o=function(){if(I)return H;function e(){this.tasks=[]}function r(){this.tasks=[]}return I=1,e.prototype.push=function(e){this.tasks.push(e)},e.prototype.pop=function(){return this.tasks.shift()},e.prototype.size=function(){return this.tasks.length},e.prototype.contains=function(e){return this.tasks.includes(e)},e.prototype.clear=function(){this.tasks.length=0},r.prototype.push=function(e){this.tasks.push(e)},r.prototype.pop=function(){return this.tasks.pop()},r.prototype.size=function(){return this.tasks.length},r.prototype.contains=function(e){return this.tasks.includes(e)},r.prototype.clear=function(){this.tasks.length=0},H={FIFOQueue:e,LIFOQueue:r}}(),i=o.FIFOQueue,s=o.LIFOQueue,u=new(function(){if(D)return R;function e(){this.ports=Object.create(null),this.length=0}return D=1,R=e,e.prototype.nextAvailableStartingAt=function(e){for(;!0===this.ports[e];)e++;if(e>=65535)throw new Error("WorkerPool debug port limit reached: "+e+">= 65535");return this.ports[e]=!0,this.length++,e},e.prototype.releasePort=function(e){delete this.ports[e],this.length--},R}());function a(e,n){"string"==typeof e?this.script=e||null:(this.script=null,n=e),this.workers=[],this.taskQueue=this._createQueue(n&&n.queueStrategy||"fifo"),n=n||{},this.forkArgs=Object.freeze(n.forkArgs||[]),this.forkOpts=Object.freeze(n.forkOpts||{}),this.workerOpts=Object.freeze(n.workerOpts||{}),this.workerThreadOpts=Object.freeze(n.workerThreadOpts||{}),this.debugPortStart=n.debugPortStart||43210,this.nodeWorker=n.nodeWorker,this.workerType=n.workerType||n.nodeWorker||"auto",this.maxQueueSize=n.maxQueueSize||1/0,this.workerTerminateTimeout=n.workerTerminateTimeout||1e3,this.onCreateWorker=n.onCreateWorker||function(){return null},this.onTerminateWorker=n.onTerminateWorker||function(){return null},this.emitStdStreams=n.emitStdStreams||!1,n&&"maxWorkers"in n?(!function(e){if(!c(e)||!f(e)||e<1)throw new TypeError("Option maxWorkers must be an integer number >= 1")}(n.maxWorkers),this.maxWorkers=n.maxWorkers):this.maxWorkers=Math.max((t.cpus||4)-1,1),n&&"minWorkers"in n&&("max"===n.minWorkers?this.minWorkers=this.maxWorkers:(!function(e){if(!c(e)||!f(e)||e<0)throw new TypeError("Option minWorkers must be an integer number >= 0")}(n.minWorkers),this.minWorkers=n.minWorkers,this.maxWorkers=Math.max(this.minWorkers,this.maxWorkers)),this._ensureMinWorkers()),this._boundNext=this._next.bind(this),"thread"===this.workerType&&r.ensureWorkerThreads()}function c(e){return"number"==typeof e}function f(e){return Math.round(e)==e}return a.prototype.exec=function(r,t,n){if(t&&!Array.isArray(t))throw new TypeError('Array expected as argument "params"');if("string"==typeof r){var o=e.defer();if(this.taskQueue.size()>=this.maxQueueSize)throw new Error("Max queue size of "+this.maxQueueSize+" reached");var i={method:r,params:t,resolver:o,timeout:null,options:n};this.taskQueue.push(i);var s=o.promise.timeout,u=this.taskQueue;return o.promise.timeout=function(e){return u.contains(i)?(i.timeout=e,o.promise):s.call(o.promise,e)},this._next(),o.promise}if("function"==typeof r)return this.exec("run",[String(r),t],n);throw new TypeError('Function or string expected as argument "method"')},a.prototype.proxy=function(){if(arguments.length>0)throw new Error("No arguments expected");var e=this;return this.exec("methods").then(function(r){var t={};return r.forEach(function(r){t[r]=function(){return e.exec(r,Array.prototype.slice.call(arguments))}}),t})},a.prototype._next=function(){if(this.taskQueue.size()>0){var e=this._getWorker();if(e){var r=this,t=this.taskQueue.pop();if(t.resolver.promise.pending){var n=e.exec(t.method,t.params,t.resolver,t.options).then(r._boundNext).catch(function(){if(e.terminated)return r._removeWorker(e)}).then(function(){r._next()});"number"==typeof t.timeout&&n.timeout(t.timeout)}else r._next()}}},a.prototype._getWorker=function(){for(var e=this.workers,r=0;r<e.length;r++){var t=e[r];if(!1===t.busy())return t}return e.length<this.maxWorkers?(t=this._createWorkerHandler(),e.push(t),t):null},a.prototype._removeWorker=function(r){var t=this;return u.releasePort(r.debugPort),this._removeWorkerFromList(r),this._ensureMinWorkers(),new e(function(e,n){r.terminate(!1,function(o){t.onTerminateWorker({forkArgs:r.forkArgs,forkOpts:r.forkOpts,workerThreadOpts:r.workerThreadOpts,script:r.script}),o?n(o):e(r)})})},a.prototype._removeWorkerFromList=function(e){var r=this.workers.indexOf(e);-1!==r&&this.workers.splice(r,1)},a.prototype.terminate=function(r,t){for(var n=this,o=this.taskQueue;o.size()>0;){var i=o.pop();if(!i)break;i.resolver.reject(new Error("Pool terminated"))}o.clear();var s=function(e){u.releasePort(e.debugPort),this._removeWorkerFromList(e)}.bind(this),a=[];return this.workers.slice().forEach(function(e){var o=e.terminateAndNotify(r,t).then(s).always(function(){n.onTerminateWorker({forkArgs:e.forkArgs,forkOpts:e.forkOpts,workerThreadOpts:e.workerThreadOpts,script:e.script})});a.push(o)}),e.all(a)},a.prototype.stats=function(){var e=this.workers.length,r=this.workers.filter(function(e){return e.busy()}).length;return{totalWorkers:e,busyWorkers:r,idleWorkers:e-r,pendingTasks:this.taskQueue.size(),activeTasks:r}},a.prototype._ensureMinWorkers=function(){if(this.minWorkers)for(var e=this.workers.length;e<this.minWorkers;e++)this.workers.push(this._createWorkerHandler())},a.prototype._createWorkerHandler=function(){var e=this.onCreateWorker({forkArgs:this.forkArgs,forkOpts:this.forkOpts,workerOpts:this.workerOpts,workerThreadOpts:this.workerThreadOpts,script:this.script})||{};return new r(e.script||this.script,{forkArgs:e.forkArgs||this.forkArgs,forkOpts:e.forkOpts||this.forkOpts,workerOpts:e.workerOpts||this.workerOpts,workerThreadOpts:e.workerThreadOpts||this.workerThreadOpts,debugPort:u.nextAvailableStartingAt(this.debugPortStart),workerType:this.workerType,workerTerminateTimeout:this.workerTerminateTimeout,emitStdStreams:this.emitStdStreams})},a.prototype._createQueue=function(e){if("string"==typeof e)switch(e){case"fifo":return new i;case"lifo":return new s;default:throw new Error("Unknown queue strategy: "+e)}if(!e)throw new Error("Queue strategy cannot be null or undefined");for(var r=["push","pop","size","contains","clear"],t=0;t<r.length;t++){var n=r[t];if("function"!=typeof e[n])throw new Error("Queue strategy must implement method: "+n)}return e},J=a}var G,K,X,Y={};function Z(){if(K)return G;return K=1,G=function(e,r){this.message=e,this.transfer=r}}function ee(){return X||(X=1,function(e){var r=Z(),t=k().Promise,n="__workerpool-cleanup__",o={exit:function(){}},i={addAbortListener:function(e){o.abortListeners.push(e)},emit:o.emit};if("undefined"!=typeof self&&"function"==typeof postMessage&&"function"==typeof addEventListener)o.on=function(e,r){addEventListener(e,function(e){r(e.data)})},o.send=function(e,r){r?postMessage(e,r):postMessage(e)};else{if("undefined"==typeof process)throw new Error("Script must be executed as a worker");var s;try{s=require("worker_threads")}catch(e){if("object"!==l(e)||null===e||"MODULE_NOT_FOUND"!==e.code)throw e}if(s&&null!==s.parentPort){var u=s.parentPort;o.send=u.postMessage.bind(u),o.on=u.on.bind(u),o.exit=process.exit.bind(process)}else o.on=process.on.bind(process),o.send=function(e){process.send(e)},o.on("disconnect",function(){process.exit(1)}),o.exit=process.exit.bind(process)}function a(e){return e&&e.toJSON?JSON.parse(JSON.stringify(e)):JSON.parse(JSON.stringify(e,Object.getOwnPropertyNames(e)))}function c(e){return e&&"function"==typeof e.then&&"function"==typeof e.catch}o.methods={},o.methods.run=function(e,r){var t=new Function("return ("+e+").apply(this, arguments);");return t.worker=i,t.apply(t,r)},o.methods.methods=function(){return Object.keys(o.methods)},o.terminationHandler=void 0,o.abortListenerTimeout=1e3,o.abortListeners=[],o.terminateAndExit=function(e){var r=function(){o.exit(e)};if(!o.terminationHandler)return r();var n=o.terminationHandler(e);return c(n)?(n.then(r,r),n):(r(),new t(function(e,r){r(new Error("Worker terminating"))}))},o.cleanup=function(e){if(!o.abortListeners.length)return o.send({id:e,method:n,error:a(new Error("Worker terminating"))}),new t(function(e){e()});var r,i=o.abortListeners.map(function(e){return e()}),s=new t(function(e,t){r=setTimeout(function(){t(new Error("Timeout occurred waiting for abort handler, killing worker"))},o.abortListenerTimeout)}),u=t.all(i).then(function(){clearTimeout(r),o.abortListeners.length&&(o.abortListeners=[])},function(){clearTimeout(r),o.exit()});return new t(function(e,r){u.then(e,r),s.then(e,r)}).then(function(){o.send({id:e,method:n,error:null})},function(r){o.send({id:e,method:n,error:r?a(r):null})})};var f=null;o.on("message",function(e){if("__workerpool-terminate__"===e)return o.terminateAndExit(0);if(e.method===n)return o.cleanup(e.id);try{var t=o.methods[e.method];if(!t)throw new Error('Unknown method "'+e.method+'"');f=e.id;var i=t.apply(t,e.params);c(i)?i.then(function(t){t instanceof r?o.send({id:e.id,result:t.message,error:null},t.transfer):o.send({id:e.id,result:t,error:null}),f=null}).catch(function(r){o.send({id:e.id,result:null,error:a(r)}),f=null}):(i instanceof r?o.send({id:e.id,result:i.message,error:null},i.transfer):o.send({id:e.id,result:i,error:null}),f=null)}catch(r){o.send({id:e.id,result:null,error:a(r)})}}),o.register=function(e,r){if(e)for(var t in e)e.hasOwnProperty(t)&&(o.methods[t]=e[t],o.methods[t].worker=i);r&&(o.terminationHandler=r.onTerminate,o.abortListenerTimeout=r.abortListenerTimeout||1e3),o.send("ready")},o.emit=function(e){if(f){if(e instanceof r)return void o.send({id:f,isEvent:!0,payload:e.message},e.transfer);o.send({id:f,isEvent:!0,payload:e})}},e.add=o.register,e.emit=o.emit}(Y)),Y}var re=n.platform,te=n.isMainThread,ne=n.cpus,oe=V.TerminateError;var ie=r.pool=function(e,r){return new($())(e,r)};var se=r.worker=function(e,r){ee().add(e,r)};var ue=r.workerEmit=function(e){ee().emit(e)},ae=k().Promise,ce=r.Promise=ae,fe=r.Transfer=Z(),pe=r.platform=re,le=r.isMainThread=te,de=r.cpus=ne,he=r.TerminateError=oe;e.Promise=ce,e.TerminateError=he,e.Transfer=fe,e.cpus=de,e.default=r,e.isMainThread=le,e.platform=pe,e.pool=ie,e.worker=se,e.workerEmit=ue,Object.defineProperty(e,"__esModule",{value:!0})}); //# sourceMappingURL=workerpool.min.js.map