diff options
Diffstat (limited to 'node_modules/tiny-worker')
-rw-r--r-- | node_modules/tiny-worker/.npmignore | 9 | ||||
-rw-r--r-- | node_modules/tiny-worker/LICENSE | 28 | ||||
-rw-r--r-- | node_modules/tiny-worker/README.md | 115 | ||||
-rw-r--r-- | node_modules/tiny-worker/lib/index.js | 137 | ||||
-rw-r--r-- | node_modules/tiny-worker/lib/noop.js | 5 | ||||
-rw-r--r-- | node_modules/tiny-worker/lib/worker.js | 83 | ||||
-rw-r--r-- | node_modules/tiny-worker/package.json | 35 |
7 files changed, 412 insertions, 0 deletions
diff --git a/node_modules/tiny-worker/.npmignore b/node_modules/tiny-worker/.npmignore new file mode 100644 index 000000000..b422e464d --- /dev/null +++ b/node_modules/tiny-worker/.npmignore @@ -0,0 +1,9 @@ +/.idea/ +/node_modules/ +/src/ +/test/ +.eslintrc +.git +.gitignore +.travis.yml +Gruntfile.js diff --git a/node_modules/tiny-worker/LICENSE b/node_modules/tiny-worker/LICENSE new file mode 100644 index 000000000..f45e28374 --- /dev/null +++ b/node_modules/tiny-worker/LICENSE @@ -0,0 +1,28 @@ +Copyright (c) 2017, Jason Mulligan +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the name of tiny-worker nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + diff --git a/node_modules/tiny-worker/README.md b/node_modules/tiny-worker/README.md new file mode 100644 index 000000000..b73787334 --- /dev/null +++ b/node_modules/tiny-worker/README.md @@ -0,0 +1,115 @@ +# tiny-worker +Tiny WebWorker for Server + +`require()` is available for flexible inline Worker scripts. Optional parameters `args` Array & `options` Object; see `child_process.fork()` documentation. + +[](http://travis-ci.org/avoidwork/tiny-worker) + +## Example +#### Creating a Worker from a file +The worker script: +```javascript +onmessage = function (ev) { + postMessage(ev.data); +}; +``` + +The core script: +```javascript +var Worker = require("tiny-worker"); +var worker = new Worker("repeat.js"); + +worker.onmessage = function (ev) { + console.log(ev.data); + worker.terminate(); +}; + +worker.postMessage("Hello World!"); +``` + +#### Creating a Worker from a Function +```javascript +var Worker = require("tiny-worker"); +var worker = new Worker(function () { + self.onmessage = function (ev) { + postMessage(ev.data); + }; +}); + +worker.onmessage = function (ev) { + console.log(ev.data); + worker.terminate(); +}; + +worker.postMessage("Hello World!"); +``` + +# Debugging +To be able to debug a child process, it must have a differnt debug port than the parent. +Tiny worker does this by adding a random port within a range to the parents debug port. +The default Range is `[1, 300]`, it can be changed with the `setRange(min, max)` method. +To disable any automatic port redirection set `options.noDebugRedirection = true`. + +### automatic redirection +```javascript +//parent is started with '--debug=1234' +var Worker = require("tiny-worker"); +Worker.setRange(2, 20); + +var worker = new Worker(function () { + postMessage(process.debugPort); +}); + +worker.onmessage = function (ev) { + console.log(ev.data); //prints any number between 1236 and 1254 + worker.terminate(); +} +``` + +### manual redirection +```javascript +//parent is started with '--debug=1234' +var Worker = require("tiny-worker"); + +var worker = new Worker(function () { + postMessage(process.debugPort); +}, [], {noDebugRedirection: true, execArgv: ["--debug=1235"]}); + +worker.onmessage = function (ev) { + console.log(ev.data); //prints 1235 + worker.terminate(); +} +``` + +## Properties +#### onmessage +Message handler, accepts an `Event` + +#### onerror +Error handler, accepts an `Event` + +## API +#### addEventListener(event, fn) +Adds an event listener + +#### postMessage() +Broadcasts a message to the `Worker` + +#### terminate() +Terminates the `Worker` + +#### static setRange(min, max) +Sets range for debug ports, only affects current process. +Returns true if successful. + +## FAQ +1. I have an orphaned child process that lives on past the parent process' lifespan + * Most likely a `SIGTERM` or `SIGINT` is not reaching the child process +2. How do I insure all process are terminated? + * In your core script register a listener for `SIGTERM` or `SIGINT` via `process.on()` which terminates (all) worker process(es) and then gracefully shutdowns via `process.exit(0);` +3. Why `SIGTERM` or `SIGINT`? + * Unix/BSD will work with `SIGTERM`, but if you also need to support Windows use `SIGINT` + +## License +Copyright (c) 2017 Jason Mulligan +Licensed under the BSD-3 license diff --git a/node_modules/tiny-worker/lib/index.js b/node_modules/tiny-worker/lib/index.js new file mode 100644 index 000000000..1cce88cfe --- /dev/null +++ b/node_modules/tiny-worker/lib/index.js @@ -0,0 +1,137 @@ +"use strict"; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +var path = require("path"), + fork = require("child_process").fork, + worker = path.join(__dirname, "worker.js"), + events = /^(error|message)$/, + defaultPorts = { inspect: 9229, debug: 5858 }; +var range = { min: 1, max: 300 }; + +var Worker = function () { + function Worker(arg) { + var _this = this; + + var args = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : []; + var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : { cwd: process.cwd() }; + + _classCallCheck(this, Worker); + + var isfn = typeof arg === "function", + input = isfn ? arg.toString() : arg; + + if (!options.cwd) { + options.cwd = process.cwd(); + } + + //get all debug related parameters + var debugVars = process.execArgv.filter(function (execArg) { + return (/(debug|inspect)/.test(execArg) + ); + }); + if (debugVars.length > 0 && !options.noDebugRedirection) { + if (!options.execArgv) { + //if no execArgs are given copy all arguments + debugVars = Array.from(process.execArgv); + options.execArgv = []; + } + + var inspectIndex = debugVars.findIndex(function (debugArg) { + //get index of inspect parameter + return (/^--inspect(-brk)?(=\d+)?$/.test(debugArg) + ); + }); + + var debugIndex = debugVars.findIndex(function (debugArg) { + //get index of debug parameter + return (/^--debug(-brk)?(=\d+)?$/.test(debugArg) + ); + }); + + var portIndex = inspectIndex >= 0 ? inspectIndex : debugIndex; //get index of port, inspect has higher priority + + if (portIndex >= 0) { + var match = /^--(debug|inspect)(?:-brk)?(?:=(\d+))?$/.exec(debugVars[portIndex]); //get port + var port = defaultPorts[match[1]]; + if (match[2]) { + port = parseInt(match[2]); + } + debugVars[portIndex] = "--" + match[1] + "=" + (port + range.min + Math.floor(Math.random() * (range.max - range.min))); //new parameter + + if (debugIndex >= 0 && debugIndex !== portIndex) { + //remove "-brk" from debug if there + match = /^(--debug)(?:-brk)?(.*)/.exec(debugVars[debugIndex]); + debugVars[debugIndex] = match[1] + (match[2] ? match[2] : ""); + } + } + options.execArgv = options.execArgv.concat(debugVars); + } + + delete options.noDebugRedirection; + + this.child = fork(worker, args, options); + this.onerror = undefined; + this.onmessage = undefined; + + this.child.on("error", function (e) { + if (_this.onerror) { + _this.onerror.call(_this, e); + } + }); + + this.child.on("message", function (msg) { + var message = JSON.parse(msg); + var error = void 0; + + if (!message.error && _this.onmessage) { + _this.onmessage.call(_this, message); + } + + if (message.error && _this.onerror) { + error = new Error(message.error); + error.stack = message.stack; + + _this.onerror.call(_this, error); + } + }); + + this.child.send({ input: input, isfn: isfn, cwd: options.cwd }); + } + + _createClass(Worker, [{ + key: "addEventListener", + value: function addEventListener(event, fn) { + if (events.test(event)) { + this["on" + event] = fn; + } + } + }, { + key: "postMessage", + value: function postMessage(msg) { + this.child.send(JSON.stringify({ data: msg }, null, 0)); + } + }, { + key: "terminate", + value: function terminate() { + this.child.kill("SIGINT"); + } + }], [{ + key: "setRange", + value: function setRange(min, max) { + if (min >= max) { + return false; + } + range.min = min; + range.max = max; + + return true; + } + }]); + + return Worker; +}(); + +module.exports = Worker; diff --git a/node_modules/tiny-worker/lib/noop.js b/node_modules/tiny-worker/lib/noop.js new file mode 100644 index 000000000..312fce83b --- /dev/null +++ b/node_modules/tiny-worker/lib/noop.js @@ -0,0 +1,5 @@ +"use strict"; + +module.exports = function () { + return void 0; +}; diff --git a/node_modules/tiny-worker/lib/worker.js b/node_modules/tiny-worker/lib/worker.js new file mode 100644 index 000000000..c8e5d6885 --- /dev/null +++ b/node_modules/tiny-worker/lib/worker.js @@ -0,0 +1,83 @@ +"use strict"; + +var fs = require("fs"), + path = require("path"), + vm = require("vm"), + noop = require(path.join(__dirname, "noop.js")), + events = /^(error|message)$/; + +function trim(arg) { + return arg.replace(/^(\s+|\t+|\n+)|(\s+|\t+|\n+)$/g, ""); +} + +function explode(arg) { + return trim(arg).split(new RegExp("\\s*,\\s*")); +} + +function toFunction(arg) { + var args = trim(arg.replace(/^.*\(/, "").replace(/[\t|\r|\n|\"|\']+/g, "").replace(/\).*/, "")), + body = trim(arg.replace(/^.*\{/, "").replace(/\}$/, "")); + + return Function.apply(Function, explode(args).concat([body])); +} + +// Bootstraps the Worker +process.once("message", function (obj) { + var exp = obj.isfn ? toFunction(obj.input) : fs.readFileSync(obj.input, "utf8"); + + global.self = { + close: function close() { + process.exit(0); + }, + postMessage: function postMessage(msg) { + process.send(JSON.stringify({ data: msg }, null, 0)); + }, + onmessage: void 0, + onerror: function onerror(err) { + process.send(JSON.stringify({ error: err.message, stack: err.stack }, null, 0)); + }, + addEventListener: function addEventListener(event, fn) { + if (events.test(event)) { + global["on" + event] = global.self["on" + event] = fn; + } + } + }; + + global.__dirname = obj.cwd; + global.__filename = __filename; + global.require = require; + + global.importScripts = function () { + for (var _len = arguments.length, files = Array(_len), _key = 0; _key < _len; _key++) { + files[_key] = arguments[_key]; + } + + if (files.length > 0) { + vm.createScript(files.map(function (file) { + return fs.readFileSync(file, "utf8"); + }).join("\n")).runInThisContext(); + } + }; + + Object.keys(global.self).forEach(function (key) { + global[key] = global.self[key]; + }); + + process.on("message", function (msg) { + try { + (global.onmessage || global.self.onmessage || noop)(JSON.parse(msg)); + } catch (err) { + (global.onerror || global.self.onerror || noop)(err); + } + }); + + process.on("error", function (err) { + (global.onerror || global.self.onerror || noop)(err); + }); + + if (typeof exp === "function") { + exp(); + } else { + vm.createScript(exp).runInThisContext(); + } +}); diff --git a/node_modules/tiny-worker/package.json b/node_modules/tiny-worker/package.json new file mode 100644 index 000000000..1176ef946 --- /dev/null +++ b/node_modules/tiny-worker/package.json @@ -0,0 +1,35 @@ +{ + "name": "tiny-worker", + "version": "2.1.1", + "description": "Tiny WebWorker for Server", + "main": "lib/index.js", + "scripts": { + "test": "grunt test" + }, + "repository": { + "type": "git", + "url": "https://github.com/avoidwork/tiny-worker.git" + }, + "keywords": [ + "web", + "worker", + "ps", + "webworker" + ], + "author": "Jason Mulligan <jason.mulligan@avoidwork.com>", + "license": "BSD-3-Clause", + "bugs": { + "url": "https://github.com/avoidwork/tiny-worker/issues" + }, + "homepage": "https://github.com/avoidwork/tiny-worker", + "devDependencies": { + "babel-preset-es2015": "~6.22.0", + "grunt": "~1.0.1", + "grunt-babel": "~6.0.0", + "grunt-cli": "~1.2.0", + "grunt-contrib-nodeunit": "~1.0.0", + "grunt-contrib-watch": "~1.0.0", + "grunt-eslint": "~19.0.0" + }, + "dependencies": {} +} |