aboutsummaryrefslogtreecommitdiff
path: root/node_modules/tiny-worker/lib/index.js
blob: 1cce88cfef9784e4fab795569e0adae26de4e7ac (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
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;