UNPKG

@cheprasov/worker-thread

Version:

The WorkerThread wraps a Web Worker with a Promise, also the class creates a worker script on the fly (without having to create separate worker files). You can 'inline' your worker function in the same js file as main logic.

1 lines 13.7 kB
!function(e){var t={};function r(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,r),o.l=!0,o.exports}r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)r.d(n,o,function(t){return e[t]}.bind(null,o));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=0)}([function(e,t,r){"use strict";function n(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}r.r(t);var o=new Map,a=function(){function e(){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e)}var t,r,a;return t=e,a=[{key:"createJavaScriptObjectUrl",value:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];if(t&&o.has(e))return o.get(e);var r=new Blob([e],{type:"text/javascript"}),n=URL.createObjectURL(r);return t&&o.set(e,n),n}}],(r=null)&&n(t.prototype,r),a&&n(t,a),e}();function i(e){return(i="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)}function c(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function u(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function s(e,t){return!t||"object"!==i(t)&&"function"!=typeof t?l(e):t}function l(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function f(e){var t="function"==typeof Map?new Map:void 0;return(f=function(e){if(null===e||(r=e,-1===Function.toString.call(r).indexOf("[native code]")))return e;var r;if("function"!=typeof e)throw new TypeError("Super expression must either be null or a function");if(void 0!==t){if(t.has(e))return t.get(e);t.set(e,n)}function n(){return p(e,arguments,h(this).constructor)}return n.prototype=Object.create(e.prototype,{constructor:{value:n,enumerable:!1,writable:!0,configurable:!0}}),v(n,e)})(e)}function p(e,t,r){return(p=d()?Reflect.construct:function(e,t,r){var n=[null];n.push.apply(n,t);var o=new(Function.bind.apply(e,n));return r&&v(o,r.prototype),o}).apply(null,arguments)}function d(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],(function(){}))),!0}catch(e){return!1}}function v(e,t){return(v=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}function h(e){return(h=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function m(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var y=function(e){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&v(e,t)}(i,e);var t,r,n,o,a=(t=i,function(){var e,r=h(t);if(d()){var n=h(this).constructor;e=Reflect.construct(r,arguments,n)}else e=r.apply(this,arguments);return s(this,e)});function i(e){var t,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null;return c(this,i),m(l(t=a.call(this,r)),"type",void 0),m(l(t),"data",void 0),t.type=e,t.data=n,t}return r=i,(n=[{key:"getType",value:function(){return this.type}},{key:"getData",value:function(){return this.data}}])&&u(r.prototype,n),o&&u(r,o),i}(f(Error));function b(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function g(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function w(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var k=function(){function e(t){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};b(this,e),w(this,"worker",void 0),w(this,"promiseCompletionsMap",void 0),w(this,"options",void 0),this.options=r,this.promiseCompletionsMap=new Map,this.worker=new Worker(e.createWorkerBlobFile(t,r),{name:r.name,type:r.type,credentials:r.credentials}),this.worker.onmessage=this._onMessage.bind(this),this.worker.onmessageerror=this._onMessageError.bind(this),this.worker.onerror=this._onError.bind(this)}var t,r,n;return t=e,n=[{key:"isSupported",value:function(){try{return!!(URL&&URL.createObjectURL&&Blob&&Worker)}catch(e){return!1}}},{key:"createWorkerBlobFile",value:function(e,t){var r=t.importScripts?"importScripts('".concat(t.importScripts.join("', '"),"');"):"",n="function"==typeof e?Function.toString.call(e):e;return a.createJavaScriptObjectUrl("'use strict';\n \n ".concat(r,"\n \n var threadFunc = ").concat(n,";\n\n var workerCommandExec = function(data) {\n var result = threadFunc.apply(threadFunc, data.args);\n self.postMessage({\n status: '").concat("ok","',\n promiseId: data.promiseId,\n result: result\n });\n };\n\n var workerCommandClose = function(data) {\n self.postMessage({\n status: '").concat("ok","',\n promiseId: data.promiseId,\n result: true\n });\n self.close();\n };\n\n var workerSendError = function(data, error) {\n self.postMessage({\n status: '").concat("error","',\n promiseId: data.promiseId,\n error: {\n type: error.name || 'Error',\n message: error.message,\n }\n });\n };\n\n self.onmessage = function(event) {\n try {\n switch (event.data.command) {\n case '").concat("exec","':\n workerCommandExec(event.data);\n break;\n case '").concat("close","':\n workerCommandClose(event.data);\n break;\n default:\n workerSendError(event.data, {\n name: '").concat("WorkerCommand","',\n message: 'Wrong command \"' + event.data.command + '\"' \n });\n }\n } catch (error) {\n workerSendError(event.data, error);\n }\n };\n\n // see: https://developer.mozilla.org/en-US/docs/Web/API/DedicatedWorkerGlobalScope/onmessageerror\n self.onmessageerror = function(event) {\n var error = {\n name: '").concat("WorkerOnMessageError","',\n message: 'The onmessageerror event handler of the DedicatedWorkerGlobalScope interface is '\n + 'an EventListener, called whenever an MessageEvent of type messageerror is fired on '\n + 'the worker—that is, when it receives a message that cannot be deserialized.'\n };\n workerSendError(event.data, error);\n };\n "))}}],(r=[{key:"_getNewPromiseId",value:function(){var e,t=Date.now(),r=0;do{e="".concat(t,"-").concat(r),r+=1}while(this.promiseCompletionsMap.has(e));return e}},{key:"_createError",value:function(e){return new y(e.type,e.message)}},{key:"_onMessage",value:function(e){var t=e.data.promiseId,r=this.promiseCompletionsMap.get(t);if(r){switch(e.data.status){case"ok":r.resolve(e.data.result);break;case"error":r.reject(this._createError(e.data.error));break;default:r.reject(new y("WrongMessageStatus","Incorrect message status: ".concat(e.data.status),e.data))}this.promiseCompletionsMap.delete(t)}}},{key:"_onMessageError",value:function(e){var t=e.data.promiseId,r=this.promiseCompletionsMap.get(t);r&&r.reject(new y("OnMessageError","The onmessageerror event handler of the Worker interface is an EventListener, called whenever anMessageEvent of type messageerror is fired on the Worker instance — that is, when it receives a message that cannot be deserialized.",e)),this.promiseCompletionsMap.delete(t)}},{key:"_onError",value:function(e){var t=this;this.promiseCompletionsMap.forEach((function(r,n){r.reject(e),t.promiseCompletionsMap.delete(n)})),this.options.onError&&this.options.onError(e)}},{key:"_postMessage",value:function(e){var t=this;return new Promise((function(r,n){e.promiseId||(e.promiseId=t._getNewPromiseId()),t.promiseCompletionsMap.set(e.promiseId,{resolve:r,reject:n});try{t.worker.postMessage(e)}catch(e){n(e)}}))}},{key:"exec",value:function(){for(var e=arguments.length,t=new Array(e),r=0;r<e;r++)t[r]=arguments[r];var n={command:"exec",args:t};return this._postMessage(n)}},{key:"close",value:function(){var e={command:"close"};return this._postMessage(e)}},{key:"terminate",value:function(){this.worker.terminate()}}])&&g(t.prototype,r),n&&g(t,n),e}();function M(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}var j=function(){function e(t){var r,n,o;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),o=void 0,(n="threadFunc")in(r=this)?Object.defineProperty(r,n,{value:o,enumerable:!0,configurable:!0,writable:!0}):r[n]=o,this.threadFunc=t}var t,r,n;return t=e,n=[{key:"isSupported",value:function(){try{return setTimeout&&"function"==typeof setTimeout||!1}catch(e){return!1}}}],(r=[{key:"exec",value:function(){for(var e=this,t=arguments.length,r=new Array(t),n=0;n<t;n++)r[n]=arguments[n];return new Promise((function(t,n){setTimeout((function(){try{t(e.threadFunc.apply(e,r))}catch(e){n(e)}}),0)}))}},{key:"close",value:function(){return this.threadFunc=function(){},Promise.resolve(!0)}},{key:"terminate",value:function(){this.threadFunc=function(){}}}])&&M(t.prototype,r),n&&M(t,n),e}();function O(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}var S=function(){function e(){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e)}var t,r,n;return t=e,n=[{key:"isSupported",value:function(){return!0}}],(r=[{key:"exec",value:function(){return Promise.resolve()}},{key:"close",value:function(){return Promise.resolve(!0)}},{key:"terminate",value:function(){}}])&&O(t.prototype,r),n&&O(t,n),e}();function E(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}var T=function(){function e(){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e)}var t,r,n;return t=e,n=[{key:"createThread",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return k.isSupported()?this.createWorkerThread(e,t):j.isSupported()?this.createTimeoutThread(e,t):this.createNoopThread(e,t)}},{key:"createWorkerThread",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return new k(e,t)}},{key:"createTimeoutThread",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return new j(e,t)}},{key:"createNoopThread",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return new S(e,t)}}],(r=null)&&E(t.prototype,r),n&&E(t,n),e}();T.createThread((function(e,t){return e+t})).exec(2,3).then((function(e){console.log("a + b =",e)})),T.createThread((function(){for(var e=arguments.length,t=new Array(e),r=0;r<e;r++)t[r]=arguments[r];return t.reduce((function(e,t){return e+t}),0)})).exec(1,2,3,4,5).then((function(e){console.log("a1 + ... + aN =",e)}));var P=T.createThread((function(e){return e})),_={foo:"bar",num:42};P.exec(_).then((function(e){e.foo="upd",console.log("Copy",e,"Orig",_)})),T.createThread((function(e,t,r){switch(e){case"sum":return t+r;case"max":return Math.max(t,r);default:return null}})).exec("sum",1,2).then((function(e){console.log("Cmd: sum, a + b =",e)}));var x=T.createThread((function(e){if(!e)throw new Error("Some message");return 42===e?self:1/e})),C=function(e){console.log("".concat(e.type,": ").concat(e.message))};x.exec(0).then().catch(C),x.exec(42).then().catch(C)}]);