aboutsummaryrefslogtreecommitdiff
path: root/node_modules/tiny-worker
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/tiny-worker')
-rw-r--r--node_modules/tiny-worker/.npmignore9
-rw-r--r--node_modules/tiny-worker/LICENSE28
-rw-r--r--node_modules/tiny-worker/README.md115
-rw-r--r--node_modules/tiny-worker/lib/index.js137
-rw-r--r--node_modules/tiny-worker/lib/noop.js5
-rw-r--r--node_modules/tiny-worker/lib/worker.js83
-rw-r--r--node_modules/tiny-worker/package.json35
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.
+
+[![build status](https://secure.travis-ci.org/avoidwork/tiny-worker.svg)](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": {}
+}