{"_id":"promise-worker-transferable","_rev":"5-08b33c47289fd8ef5e02ebefe8e563b0","name":"promise-worker-transferable","description":"Communicate with a Web Worker using Promises, allowing transferList","dist-tags":{"latest":"1.0.4"},"versions":{"1.0.2":{"name":"promise-worker-transferable","version":"1.0.2","description":"Communicate with a Web Worker using Promises, allowing transferList","main":"index.js","scripts":{"prepublish":"npm run build","build":"rimraf dist && mkdirp dist && browserify -s PromiseWorker -p bundle-collapser/plugin . > dist/promise-worker.js && browserify -s registerPromiseWorker -p bundle-collapser/plugin register.js > dist/promise-worker.register.js && uglifyjs -mc < dist/promise-worker.js > dist/promise-worker.min.js && uglifyjs -mc < dist/promise-worker.register.js > dist/promise-worker.register.min.js","build-test":"node bin/build-worker-bundles.js","test":"npm run build-test && mocha test/test.js","test-local":"npm run build-test && zuul --local 9000 --no-coverage test/test.js","test-phantom":"npm run build-test && zuul --phantom --no-coverage test/test.js","test-browser":"npm run build-test && zuul --no-coverage ./test/test.js","lint":"jshint -c .jshintrc *.js","istanbul-combine":"istanbul-combine -d coverage -r json coverage/coverage.json coverage/coverage-worker.json && mv coverage/coverage-final.json coverage/coverage.json && rimraf coverage/coverage-worker.json","istanbul-check":"istanbul check-coverage --lines 100 --function 100 --statements 100 --branches 100","test-for-coverage":"istanbul cover ./node_modules/.bin/_mocha ./test/test.js","istanbul-report":"istanbul report lcov","coverage":"COVERAGE=1 run-scripts build-test test-for-coverage istanbul-combine istanbul-report istanbul-check","report-coverage":"npm run coverage && istanbul-coveralls"},"repository":{"type":"git","url":"git+https://github.com/terikon/promise-worker-transferable.git"},"keywords":["web worker","promise","webworker","worker"],"author":{"name":"Roman Viskin","email":"npm@terikon.com"},"license":"Apache-2.0","bugs":{"url":"https://github.com/terikon/promise-worker-transferable/issues"},"homepage":"https://github.com/terikon/promise-worker-transferable#readme","devDependencies":{"assert":"^1.3.0","browserify":"^13.0.1","bundle-collapser":"^1.2.1","denodeify":"^1.2.1","glob-promise":"^1.0.6","istanbul":"^0.4.2","istanbul-combine":"^0.3.0","istanbul-coveralls":"^1.0.3","istanbulify":"^0.1.0","jshint":"2.8.0","mkdirp":"^0.5.1","mocha":"^2.4.5","phantomjs-prebuilt":"^2.1.5","pseudo-worker":"^1.1.0","rimraf":"^2.5.3","run-scripts":"^0.4.0","stream-to-promise":"^1.1.0","uglify-js":"^2.7.0","zuul":"^3.10.1","zuul-localtunnel":"github:nolanlawson/zuul-localtunnel#https","text-encoding":"^0.6.1"},"dependencies":{"is-promise":"^2.1.0","lie":"^3.0.2"},"files":["index.js","register.js","dist"],"gitHead":"cf84e1b10e0bf4e7a960f3ee3e1c9ec430873b15","_id":"promise-worker-transferable@1.0.2","_shasum":"826aa9011a9cfd2ee2a7c9f13841a323f3e0944b","_from":".","_npmVersion":"3.10.8","_nodeVersion":"6.5.0","_npmUser":{"name":"terikon","email":"npm@terikon.com"},"dist":{"shasum":"826aa9011a9cfd2ee2a7c9f13841a323f3e0944b","tarball":"https://registry.npmjs.org/promise-worker-transferable/-/promise-worker-transferable-1.0.2.tgz","integrity":"sha512-oFTEOxC0h1+rnVTgbj61TFbt7tpRZbCdGCNoowcvfotrJeyuLLnUFMiF2v2IbgO6rP0tFzR+3Q7yFgn8iX69uA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIE2r3kT7QCmxE5wsc4ndCUxAAbgYe7jeto3Mnn0w9edTAiAEXcFgcFzk3/VoSlvLZDoWMGzgy9oM7D1YMwAakrECew=="}]},"maintainers":[{"name":"terikon","email":"npm@terikon.com"}],"_npmOperationalInternal":{"host":"packages-12-west.internal.npmjs.com","tmp":"tmp/promise-worker-transferable-1.0.2.tgz_1474555668059_0.740076407790184"}},"1.0.3":{"name":"promise-worker-transferable","version":"1.0.3","description":"Communicate with a Web Worker using Promises, allowing transferList","main":"index.js","scripts":{"prepublish":"npm run build","build":"rimraf dist && mkdirp dist && browserify -s PromiseWorker -p bundle-collapser/plugin . > dist/promise-worker.js && browserify -s registerPromiseWorker -p bundle-collapser/plugin register.js > dist/promise-worker.register.js && uglifyjs -mc < dist/promise-worker.js > dist/promise-worker.min.js && uglifyjs -mc < dist/promise-worker.register.js > dist/promise-worker.register.min.js","build-test":"node bin/build-worker-bundles.js","test":"npm run build-test && mocha test/test.js","test-local":"npm run build-test && zuul --local 9000 --no-coverage test/test.js","test-phantom":"npm run build-test && zuul --phantom --no-coverage test/test.js","test-browser":"npm run build-test && zuul --no-coverage ./test/test.js","lint":"jshint -c .jshintrc *.js","istanbul-combine":"istanbul-combine -d coverage -r json coverage/coverage.json coverage/coverage-worker.json && mv coverage/coverage-final.json coverage/coverage.json && rimraf coverage/coverage-worker.json","istanbul-check":"istanbul check-coverage --lines 100 --function 100 --statements 100 --branches 100","test-for-coverage":"istanbul cover ./node_modules/.bin/_mocha ./test/test.js","istanbul-report":"istanbul report lcov","coverage":"COVERAGE=1 run-scripts build-test test-for-coverage istanbul-combine istanbul-report istanbul-check","report-coverage":"npm run coverage && istanbul-coveralls"},"repository":{"type":"git","url":"git+https://github.com/terikon/promise-worker-transferable.git"},"keywords":["web worker","promise","webworker","worker"],"author":{"name":"Roman Viskin","email":"npm@terikon.com"},"license":"Apache-2.0","bugs":{"url":"https://github.com/terikon/promise-worker-transferable/issues"},"homepage":"https://github.com/terikon/promise-worker-transferable#readme","devDependencies":{"assert":"^1.3.0","browserify":"^13.0.1","bundle-collapser":"^1.2.1","denodeify":"^1.2.1","glob-promise":"^1.0.6","istanbul":"^0.4.2","istanbul-combine":"^0.3.0","istanbul-coveralls":"^1.0.3","istanbulify":"^0.1.0","jshint":"2.8.0","mkdirp":"^0.5.1","mocha":"^2.4.5","phantomjs-prebuilt":"^2.1.5","pseudo-worker":"^1.1.0","rimraf":"^2.5.3","run-scripts":"^0.4.0","stream-to-promise":"^1.1.0","uglify-js":"^2.7.0","zuul":"^3.10.1","zuul-localtunnel":"github:nolanlawson/zuul-localtunnel#https","text-encoding":"^0.6.1"},"dependencies":{"is-promise":"^2.1.0","lie":"^3.0.2"},"files":["index.js","register.js","dist"],"gitHead":"445553478fe5a0aa04cc9d18ab894908a79fd89b","_id":"promise-worker-transferable@1.0.3","_shasum":"442d8e6f8e8629cc110e682c2a80e30fe1b8d76f","_from":".","_npmVersion":"3.10.8","_nodeVersion":"6.5.0","_npmUser":{"name":"terikon","email":"npm@terikon.com"},"dist":{"shasum":"442d8e6f8e8629cc110e682c2a80e30fe1b8d76f","tarball":"https://registry.npmjs.org/promise-worker-transferable/-/promise-worker-transferable-1.0.3.tgz","integrity":"sha512-HXuGuEgiTHFe3tCCNAUyg4JPBBwwoKI/PMRn4A/TuPHoSs5cfWMNlLOyj+x5v0qGO5inu+jMFl8z8/+geShPGQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAeMuwrz/a6daTXeYfIgMIuP+3GB1rns2iGH4kRu/N0sAiEAp7m50Cna/Qe5ROusS9xmDarKF2xyQu1+9zrlq+OL5bI="}]},"maintainers":[{"name":"terikon","email":"npm@terikon.com"}],"_npmOperationalInternal":{"host":"packages-12-west.internal.npmjs.com","tmp":"tmp/promise-worker-transferable-1.0.3.tgz_1474642156654_0.04971996136009693"}},"1.0.4":{"name":"promise-worker-transferable","version":"1.0.4","description":"Communicate with a Web Worker using Promises, allowing transferList","main":"index.js","scripts":{"prepublish":"npm run build","build":"rimraf dist && mkdirp dist && browserify -s PromiseWorker -p bundle-collapser/plugin . > dist/promise-worker.js && browserify -s registerPromiseWorker -p bundle-collapser/plugin register.js > dist/promise-worker.register.js && uglifyjs -mc < dist/promise-worker.js > dist/promise-worker.min.js && uglifyjs -mc < dist/promise-worker.register.js > dist/promise-worker.register.min.js","build-test":"node bin/build-worker-bundles.js","test":"npm run build-test && mocha test/test.js","test-local":"npm run build-test && zuul --local 9000 --no-coverage test/test.js","test-phantom":"npm run build-test && zuul --phantom --no-coverage test/test.js","test-browser":"npm run build-test && zuul --no-coverage ./test/test.js","lint":"jshint -c .jshintrc *.js","istanbul-combine":"istanbul-combine -d coverage -r json coverage/coverage.json coverage/coverage-worker.json && mv coverage/coverage-final.json coverage/coverage.json && rimraf coverage/coverage-worker.json","istanbul-check":"istanbul check-coverage --lines 100 --function 100 --statements 100 --branches 100","test-for-coverage":"istanbul cover ./node_modules/.bin/_mocha ./test/test.js","istanbul-report":"istanbul report lcov","coverage":"COVERAGE=1 run-scripts build-test test-for-coverage istanbul-combine istanbul-report istanbul-check","report-coverage":"npm run coverage && istanbul-coveralls"},"repository":{"type":"git","url":"git+https://github.com/terikon/promise-worker-transferable.git"},"keywords":["web worker","promise","webworker","worker"],"author":{"name":"Roman Viskin","email":"npm@terikon.com"},"license":"Apache-2.0","bugs":{"url":"https://github.com/terikon/promise-worker-transferable/issues"},"homepage":"https://github.com/terikon/promise-worker-transferable#readme","devDependencies":{"assert":"^1.3.0","browserify":"^13.0.1","bundle-collapser":"^1.2.1","denodeify":"^1.2.1","glob-promise":"^1.0.6","istanbul":"^0.4.2","istanbul-combine":"^0.3.0","istanbul-coveralls":"^1.0.3","istanbulify":"^0.1.0","jshint":"2.8.0","mkdirp":"^0.5.1","mocha":"^2.4.5","phantomjs-prebuilt":"^2.1.5","pseudo-worker":"^1.1.0","rimraf":"^2.5.3","run-scripts":"^0.4.0","stream-to-promise":"^1.1.0","uglify-js":"^2.7.0","zuul":"^3.10.1","zuul-localtunnel":"github:nolanlawson/zuul-localtunnel#https","text-encoding":"^0.6.1"},"dependencies":{"is-promise":"^2.1.0","lie":"^3.0.2"},"files":["index.js","register.js","dist"],"gitHead":"3c67a311144a0be5d2ec7d613446907b41c8db19","_id":"promise-worker-transferable@1.0.4","_shasum":"2c72861ba053e5ae42b487b4a83b1ed3ae3786e8","_from":".","_npmVersion":"3.10.8","_nodeVersion":"6.5.0","_npmUser":{"name":"terikon","email":"npm@terikon.com"},"dist":{"shasum":"2c72861ba053e5ae42b487b4a83b1ed3ae3786e8","tarball":"https://registry.npmjs.org/promise-worker-transferable/-/promise-worker-transferable-1.0.4.tgz","integrity":"sha512-bN+0ehEnrXfxV2ZQvU2PetO0n4gqBD4ulq3MI1WOPLgr7/Mg9yRQkX5+0v1vagr74ZTsl7XtzlaYDo2EuCeYJw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDSohpISzm7JfgGKWpIMSS6IBgelTNdeiKBKcAsqfqICgIhAOdcYFFtHLxxBTtqEJIkxhk4K3jAKuspVvgeEegr1RI1"}]},"maintainers":[{"name":"terikon","email":"npm@terikon.com"}],"_npmOperationalInternal":{"host":"packages-16-east.internal.npmjs.com","tmp":"tmp/promise-worker-transferable-1.0.4.tgz_1474642750202_0.563856263877824"}}},"readme":"promise-worker-transferable [![Build Status](https://travis-ci.org/terikon/promise-worker-transferable.svg?branch=master)](https://travis-ci.org/terikon/promise-worker-transferable)\r\n====\r\n\r\nModified version of [promise-worker](https://github.com/nolanlawson/promise-worker) library that supports object transferring. Possibly works slower than original for not transferable messages.\r\n\r\nAs mentioned [here](https://github.com/nolanlawson/promise-worker/issues/13), promise-worker library will not get support for blobs and transferables. So here promise-worker-transferable goes.\r\n\r\n**Goals:**\r\n\r\n * Tiny footprint (~2.5kB min+gz)\r\n * Assumes you have a separate `worker.js` file (easier to debug, better browser support)\r\n * Removed from promise-worker and no longer true: `JSON.stringify`s messages [for performance](http://nolanlawson.com/2016/02/29/high-performance-web-worker-messages/)\r\n * Instead, it's now possbile to transfer blobs, as well as attach transferList array to transfer objects, which works much faster for larger objects. \r\n\r\n**Live examples:**\r\n\r\n* [Web Workers](https://bl.ocks.org/nolanlawson/05e74a8408a099635c9a38f839b5ae9f)\r\n* [Service Workers](https://bl.ocks.org/nolanlawson/91a7f5809f2e17a2e6a753a3cb8d2eec)\r\n\r\nUsage\r\n---\r\n\r\nInstall:\r\n\r\n    npm install promise-worker-transferable\r\n\r\nInside your main bundle:\r\n\r\n```js\r\n// main.js\r\nvar PromiseWorker = require('promise-worker-transferable');\r\nvar worker = new Worker('worker.js');\r\nvar promiseWorker = new PromiseWorker(worker);\r\n\r\npromiseWorker.postMessage('ping').then(function (response) {\r\n  // handle response\r\n}).catch(function (error) {\r\n  // handle error\r\n});\r\n\r\n// With transferList\r\npromiseWorker.postMessage(pingImageData, [pingImageData.data.buffer]) // pongImageData transferred from main to worker\r\n.then(function (response) {\r\n  // handle response\r\n}).catch(function (error) {\r\n  // handle error\r\n});\r\n```\r\n\r\nInside your `worker.js` bundle:\r\n\r\n```js\r\n// worker.js\r\nvar registerPromiseWorker = require('promise-worker-transferable/register');\r\n\r\nregisterPromiseWorker(function (message) {\r\n  return 'pong';\r\n});\r\n\r\n// With transferList\r\nregisterPromiseWorker(function (message, withTransferList) {\r\n  return withTransferList(pongImageData, [pongImageData.data.buffer]); // pongImageData transferred from worker to main \r\n});\r\n```\r\n\r\nNote that you `require()` two separate APIs, so the library is split\r\nbetween the `worker.js` and main file. This keeps the total bundle size smaller.\r\n\r\n\r\n### Message format\r\n\r\nThe message you send can be any object, array, string, number, etc.:\r\n\r\n```js\r\n// main.js\r\npromiseWorker.postMessage({\r\n  hello: 'world',\r\n  answer: 42,\r\n  \"this is fun\": true\r\n}).then(/* ... */);\r\n```\r\n\r\n```js\r\n// worker.js\r\nregisterPromiseWorker(function (message) {\r\n  console.log(message); // { hello: 'world', answer: 42, 'this is fun': true }\r\n});\r\n```\r\n\r\n### Promises\r\n\r\nInside of the worker, the registered handler can return either a Promise or a normal value:\r\n\r\n```js\r\n// worker.js\r\nregisterPromiseWorker(function () {\r\n  return Promise.resolve().then(function () {\r\n    return 'much async, very promise';\r\n  });\r\n});\r\n```\r\n\r\n```js\r\n// main.js\r\npromiseWorker.postMessage(null).then(function (message) {\r\n  console.log(message): // 'much async, very promise'\r\n});\r\n```\r\n\r\nPromise can return withTransferList as well:\r\n\r\n```js\r\n// worker.js\r\nregisterPromiseWorker(function (_, withTransferList) {\r\n  return Promise.resolve().then(function () {\r\n    return withTransferList(pongImageData, [pongImageData.data.buffer]); // pongImageData transferred to webworker\r\n  });\r\n});\r\n```\r\n\r\n```js\r\n// main.js\r\npromiseWorker.postMessage(null).then(function (message) {\r\n  // message contains pongImageData\r\n});\r\n```\r\n\r\n### Error handling\r\n\r\nAny thrown errors or asynchronous rejections from the worker will\r\nbe propagated to the main thread as a rejected Promise. For instance:\r\n\r\n```js\r\n// worker.js\r\nregisterPromiseWorker(function (message) {\r\n  throw new Error('naughty!');\r\n});\r\n```\r\n\r\n```js\r\n// main.js\r\npromiseWorker.postMessage('whoops').catch(function (err) {\r\n  console.log(err.message); // 'naughty!'\r\n});\r\n```\r\n\r\nNote that stacktraces cannot be sent from the worker to the main thread, so you\r\nwill have to debug those errors yourself. This library does however, print\r\nmessages to `console.error()`, so you should see them there.\r\n\r\n### Multi-type messages\r\n\r\nIf you need to send messages of multiple types to the worker, just add\r\nsome type information to the message you send:\r\n\r\n```js\r\n// main.js\r\npromiseWorker.postMessage({\r\n  type: 'en'\r\n}).then(/* ... */);\r\n\r\npromiseWorker.postMessage({\r\n  type: 'fr'\r\n}).then(/* ... */);\r\n```\r\n\r\n```js\r\n// worker.js\r\nregisterPromiseWorker(function (message) {\r\n  if (message.type === 'en') {\r\n    return 'Hello!';\r\n  } else if (message.type === 'fr') {\r\n    return 'Bonjour!';\r\n  }\r\n});\r\n```\r\n\r\n### Service Workers\r\n\r\nCommunicating with a Service Worker is the same as with a Web Worker.\r\nHowever, you have to wait for the Service Worker to install and start controlling the page. Here's an example:\r\n\r\n```js\r\nnavigator.serviceWorker.register('sw.js', {\r\n  scope: './'\r\n}).then(function () {\r\n  if (navigator.serviceWorker.controller) {\r\n    // already active and controlling this page\r\n    return navigator.serviceWorker;\r\n  }\r\n  // wait for a new service worker to control this page\r\n  return new Promise(function (resolve) {\r\n    function onControllerChange() {\r\n      navigator.serviceWorker.removeEventListener('controllerchange', onControllerChange);\r\n      resolve(navigator.serviceWorker);\r\n    }\r\n    navigator.serviceWorker.addEventListener('controllerchange', onControllerChange);\r\n  });\r\n}).then(function (worker) { // the worker is ready\r\n  var promiseWorker = new PromiseWorker(worker);\r\n  return promiseWorker.postMessage('hello worker!');\r\n}).catch(console.log.bind(console));\r\n```\r\n\r\nThen inside your Service Worker:\r\n\r\n```js\r\nvar registerPromiseWorker = require('../register');\r\n\r\nregisterPromiseWorker(function (msg) {\r\n  return 'hello main thread!';\r\n});\r\n\r\nself.addEventListener('activate', function(event) {\r\n  event.waitUntil(self.clients.claim()); // activate right now\r\n});\r\n```\r\n\r\nBrowser support\r\n----\r\n\r\n* Chrome\r\n* Firefox\r\n* Safari 8+\r\n* IE 10+\r\n* Edge\r\n* iOS 8+\r\n* Android 4.4+\r\n\r\nIf a browser [doesn't support Web Workers](http://caniuse.com/webworker) but you still want to use this library,\r\nthen you can use [pseudo-worker](https://github.com/nolanlawson/pseudo-worker).\r\n\r\nFor Service Worker support, Chrome 40 and 41 are known to be buggy (see [#9](https://github.com/nolanlawson/promise-worker/pull/9)), but 42+ are supported.\r\n\r\nThis library is not designed to run in Node.js.\r\n\r\nAPI\r\n---\r\n\r\n### Main bundle\r\n\r\n#### `new PromiseWorker(worker)`\r\n\r\nCreate a new `PromiseWorker`, using the given worker.\r\n\r\n* `worker` - the `Worker` or [PseudoWorker](https://github.com/nolanlawson/pseudo-worker) to use.\r\n\r\n#### `PromiseWorker.postMessage(message, optionalTransferList)`\r\n\r\nSend a message to the worker and return a Promise.\r\n\r\n* `message` - object - required\r\n  * The message to send.\r\n* `optionalTransferList` - array of objects to transfer, just as in usual Worker.postMessage.\r\n* returns a Promise\r\n\r\n### Worker bundle\r\n\r\nRegister a message handler inside of the worker. Your handler consumes a message\r\nand returns a Promise or value.\r\n\r\n#### `registerPromiseWorker(function)`\r\n\r\n* `function`\r\n  * Takes a message and withTransferList function, returns a Promise or a value.\r\n  Value can be wrapped with withTransferList. withTransferList gets value and transferList. \r\n\r\n\r\nTesting the library\r\n---\r\n\r\nFirst:\r\n\r\n    npm install\r\n\r\nThen to test in Node (using an XHR/PseudoWorker shim):\r\n\r\n    npm test\r\n\r\nOr to test manually in your browser of choice:\r\n\r\n    npm run test-local\r\n\r\nOr to test in a browser using SauceLabs:\r\n\r\n    npm run test-browser\r\n\r\nOr to test in PhantomJS:\r\n\r\n    npm run test-phantom\r\n\r\nOr to test with coverage reports:\r\n\r\n    npm run coverage\r\n","maintainers":[{"name":"terikon","email":"npm@terikon.com"}],"time":{"modified":"2022-06-24T19:17:56.308Z","created":"2016-09-22T14:47:49.920Z","1.0.2":"2016-09-22T14:47:49.920Z","1.0.3":"2016-09-23T14:49:18.512Z","1.0.4":"2016-09-23T14:59:11.285Z"},"homepage":"https://github.com/terikon/promise-worker-transferable#readme","keywords":["web worker","promise","webworker","worker"],"repository":{"type":"git","url":"git+https://github.com/terikon/promise-worker-transferable.git"},"author":{"name":"Roman Viskin","email":"npm@terikon.com"},"bugs":{"url":"https://github.com/terikon/promise-worker-transferable/issues"},"license":"Apache-2.0","readmeFilename":"README.md"}