bullmq 3.12.1 → 3.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/classes/child-pool.js +14 -92
- package/dist/cjs/classes/child-pool.js.map +1 -1
- package/dist/cjs/classes/child-processor.js +14 -11
- package/dist/cjs/classes/child-processor.js.map +1 -1
- package/dist/cjs/classes/child.js +216 -0
- package/dist/cjs/classes/child.js.map +1 -0
- package/dist/cjs/classes/index.js +2 -2
- package/dist/cjs/classes/index.js.map +1 -1
- package/dist/cjs/classes/main-base.js +45 -0
- package/dist/cjs/classes/main-base.js.map +1 -0
- package/dist/cjs/classes/main-worker.js +10 -0
- package/dist/cjs/classes/main-worker.js.map +1 -0
- package/dist/cjs/classes/main.js +10 -0
- package/dist/cjs/classes/main.js.map +1 -0
- package/dist/cjs/classes/sandbox.js +3 -4
- package/dist/cjs/classes/sandbox.js.map +1 -1
- package/dist/cjs/classes/worker.js +11 -5
- package/dist/cjs/classes/worker.js.map +1 -1
- package/dist/cjs/tsconfig-cjs.tsbuildinfo +1 -1
- package/dist/cjs/utils.js +4 -3
- package/dist/cjs/utils.js.map +1 -1
- package/dist/esm/classes/child-pool.d.ts +15 -14
- package/dist/esm/classes/child-pool.js +14 -92
- package/dist/esm/classes/child-pool.js.map +1 -1
- package/dist/esm/classes/child-processor.d.ts +3 -1
- package/dist/esm/classes/child-processor.js +15 -12
- package/dist/esm/classes/child-processor.js.map +1 -1
- package/dist/esm/classes/child.d.ts +36 -0
- package/dist/esm/classes/child.js +212 -0
- package/dist/esm/classes/child.js.map +1 -0
- package/dist/esm/classes/index.d.ts +0 -1
- package/dist/esm/classes/index.js +2 -2
- package/dist/esm/classes/index.js.map +1 -1
- package/dist/esm/classes/main-base.d.ts +4 -0
- package/dist/esm/classes/main-base.js +43 -0
- package/dist/esm/classes/main-base.js.map +1 -0
- package/dist/esm/classes/main-worker.d.ts +1 -0
- package/dist/esm/classes/main-worker.js +8 -0
- package/dist/esm/classes/main-worker.js.map +1 -0
- package/dist/esm/classes/main.d.ts +1 -0
- package/dist/esm/classes/main.js +8 -0
- package/dist/esm/classes/main.js.map +1 -0
- package/dist/esm/classes/sandbox.js +3 -4
- package/dist/esm/classes/sandbox.js.map +1 -1
- package/dist/esm/classes/worker.js +11 -5
- package/dist/esm/classes/worker.js.map +1 -1
- package/dist/esm/interfaces/worker-options.d.ts +8 -0
- package/dist/esm/tsconfig.tsbuildinfo +1 -1
- package/dist/esm/utils.d.ts +2 -3
- package/dist/esm/utils.js +3 -1
- package/dist/esm/utils.js.map +1 -1
- package/package.json +3 -3
- package/dist/cjs/classes/master.js +0 -39
- package/dist/cjs/classes/master.js.map +0 -1
- package/dist/cjs/classes/process-utils.js +0 -34
- package/dist/cjs/classes/process-utils.js.map +0 -1
- package/dist/esm/classes/master.js +0 -37
- package/dist/esm/classes/master.js.map +0 -1
- package/dist/esm/classes/process-utils.d.ts +0 -7
- package/dist/esm/classes/process-utils.js +0 -31
- package/dist/esm/classes/process-utils.js.map +0 -1
- /package/dist/cjs/classes/{master.d.ts → main-worker.d.ts} +0 -0
- /package/dist/{esm/classes/master.d.ts → cjs/classes/main.d.ts} +0 -0
@@ -1,111 +1,33 @@
|
|
1
1
|
"use strict";
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
3
|
exports.ChildPool = void 0;
|
4
|
-
const child_process_1 = require("child_process");
|
5
4
|
const path = require("path");
|
6
|
-
const
|
7
|
-
const process_utils_1 = require("./process-utils");
|
8
|
-
const interfaces_1 = require("../interfaces");
|
9
|
-
const utils_1 = require("../utils");
|
5
|
+
const child_1 = require("./child");
|
10
6
|
const CHILD_KILL_TIMEOUT = 30000;
|
11
|
-
const getFreePort = async () => {
|
12
|
-
return new Promise(resolve => {
|
13
|
-
const server = (0, net_1.createServer)();
|
14
|
-
server.listen(0, () => {
|
15
|
-
const { port } = server.address();
|
16
|
-
server.close(() => resolve(port));
|
17
|
-
});
|
18
|
-
});
|
19
|
-
};
|
20
|
-
const convertExecArgv = async (execArgv) => {
|
21
|
-
const standard = [];
|
22
|
-
const convertedArgs = [];
|
23
|
-
for (let i = 0; i < execArgv.length; i++) {
|
24
|
-
const arg = execArgv[i];
|
25
|
-
if (arg.indexOf('--inspect') === -1) {
|
26
|
-
standard.push(arg);
|
27
|
-
}
|
28
|
-
else {
|
29
|
-
const argName = arg.split('=')[0];
|
30
|
-
const port = await getFreePort();
|
31
|
-
convertedArgs.push(`${argName}=${port}`);
|
32
|
-
}
|
33
|
-
}
|
34
|
-
return standard.concat(convertedArgs);
|
35
|
-
};
|
36
|
-
/**
|
37
|
-
* @see https://nodejs.org/api/process.html#process_exit_codes
|
38
|
-
*/
|
39
|
-
const exitCodesErrors = {
|
40
|
-
1: 'Uncaught Fatal Exception',
|
41
|
-
2: 'Unused',
|
42
|
-
3: 'Internal JavaScript Parse Error',
|
43
|
-
4: 'Internal JavaScript Evaluation Failure',
|
44
|
-
5: 'Fatal Error',
|
45
|
-
6: 'Non-function Internal Exception Handler',
|
46
|
-
7: 'Internal Exception Handler Run-Time Failure',
|
47
|
-
8: 'Unused',
|
48
|
-
9: 'Invalid Argument',
|
49
|
-
10: 'Internal JavaScript Run-Time Failure',
|
50
|
-
12: 'Invalid Debug Argument',
|
51
|
-
13: 'Unfinished Top-Level Await',
|
52
|
-
};
|
53
|
-
async function initChild(child, processFile) {
|
54
|
-
const onComplete = new Promise((resolve, reject) => {
|
55
|
-
const onMessageHandler = (msg) => {
|
56
|
-
if (msg.cmd === interfaces_1.ParentCommand.InitCompleted) {
|
57
|
-
resolve();
|
58
|
-
}
|
59
|
-
else if (msg.cmd === interfaces_1.ParentCommand.InitFailed) {
|
60
|
-
const err = new Error();
|
61
|
-
err.stack = msg.err.stack;
|
62
|
-
err.message = msg.err.message;
|
63
|
-
reject(err);
|
64
|
-
}
|
65
|
-
child.off('message', onMessageHandler);
|
66
|
-
child.off('close', onCloseHandler);
|
67
|
-
};
|
68
|
-
const onCloseHandler = (code, signal) => {
|
69
|
-
if (code > 128) {
|
70
|
-
code -= 128;
|
71
|
-
}
|
72
|
-
const msg = exitCodesErrors[code] || `Unknown exit code ${code}`;
|
73
|
-
reject(new Error(`Error initializing child: ${msg} and signal ${signal}`));
|
74
|
-
child.off('message', onMessageHandler);
|
75
|
-
child.off('close', onCloseHandler);
|
76
|
-
};
|
77
|
-
child.on('message', onMessageHandler);
|
78
|
-
child.on('close', onCloseHandler);
|
79
|
-
});
|
80
|
-
await (0, utils_1.parentSend)(child, { cmd: interfaces_1.ChildCommand.Init, value: processFile });
|
81
|
-
await onComplete;
|
82
|
-
}
|
83
7
|
class ChildPool {
|
84
|
-
constructor(
|
85
|
-
this.masterFile = masterFile;
|
8
|
+
constructor({ mainFile = path.join(process.cwd(), 'dist/cjs/classes/main.js'), useWorkerThreads, }) {
|
86
9
|
this.retained = {};
|
87
10
|
this.free = {};
|
11
|
+
this.opts = { mainFile, useWorkerThreads };
|
88
12
|
}
|
89
13
|
async retain(processFile) {
|
90
|
-
|
91
|
-
let child = _this.getFree(processFile).pop();
|
14
|
+
let child = this.getFree(processFile).pop();
|
92
15
|
if (child) {
|
93
|
-
|
16
|
+
this.retained[child.pid] = child;
|
94
17
|
return child;
|
95
18
|
}
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
child.on('exit', _this.remove.bind(_this, child));
|
101
|
-
child.stdout.pipe(process.stdout);
|
102
|
-
child.stderr.pipe(process.stderr);
|
19
|
+
child = new child_1.Child(this.opts.mainFile, processFile, {
|
20
|
+
useWorkerThreads: this.opts.useWorkerThreads,
|
21
|
+
});
|
22
|
+
child.on('exit', this.remove.bind(this, child));
|
103
23
|
try {
|
104
|
-
await
|
24
|
+
await child.init();
|
25
|
+
this.retained[child.pid] = child;
|
105
26
|
return child;
|
106
27
|
}
|
107
28
|
catch (err) {
|
108
|
-
|
29
|
+
console.error(err);
|
30
|
+
this.release(child);
|
109
31
|
throw err;
|
110
32
|
}
|
111
33
|
}
|
@@ -123,7 +45,7 @@ class ChildPool {
|
|
123
45
|
}
|
124
46
|
async kill(child, signal = 'SIGKILL') {
|
125
47
|
this.remove(child);
|
126
|
-
|
48
|
+
return child.kill(signal, CHILD_KILL_TIMEOUT);
|
127
49
|
}
|
128
50
|
async clean() {
|
129
51
|
const children = Object.values(this.retained).concat(this.getAllFree());
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"child-pool.js","sourceRoot":"","sources":["../../../src/classes/child-pool.ts"],"names":[],"mappings":";;;AAAA,
|
1
|
+
{"version":3,"file":"child-pool.js","sourceRoot":"","sources":["../../../src/classes/child-pool.ts"],"names":[],"mappings":"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"}
|
@@ -15,10 +15,13 @@ var ChildStatus;
|
|
15
15
|
* ChildProcessor
|
16
16
|
*
|
17
17
|
* This class acts as the interface between a child process and it parent process
|
18
|
-
* so that jobs can be processed in different processes
|
18
|
+
* so that jobs can be processed in different processes.
|
19
19
|
*
|
20
20
|
*/
|
21
21
|
class ChildProcessor {
|
22
|
+
constructor(send) {
|
23
|
+
this.send = send;
|
24
|
+
}
|
22
25
|
async init(processorFile) {
|
23
26
|
let processor;
|
24
27
|
try {
|
@@ -33,7 +36,7 @@ class ChildProcessor {
|
|
33
36
|
}
|
34
37
|
catch (err) {
|
35
38
|
this.status = ChildStatus.Errored;
|
36
|
-
return
|
39
|
+
return this.send({
|
37
40
|
cmd: interfaces_1.ParentCommand.InitFailed,
|
38
41
|
err: (0, utils_1.errorToJSON)(err),
|
39
42
|
});
|
@@ -54,13 +57,13 @@ class ChildProcessor {
|
|
54
57
|
}
|
55
58
|
this.processor = processor;
|
56
59
|
this.status = ChildStatus.Idle;
|
57
|
-
await
|
60
|
+
await this.send({
|
58
61
|
cmd: interfaces_1.ParentCommand.InitCompleted,
|
59
62
|
});
|
60
63
|
}
|
61
64
|
async start(jobJson) {
|
62
65
|
if (this.status !== ChildStatus.Idle) {
|
63
|
-
return
|
66
|
+
return this.send({
|
64
67
|
cmd: interfaces_1.ParentCommand.Error,
|
65
68
|
err: (0, utils_1.errorToJSON)(new Error('cannot start a not idling child process')),
|
66
69
|
});
|
@@ -68,15 +71,15 @@ class ChildProcessor {
|
|
68
71
|
this.status = ChildStatus.Started;
|
69
72
|
this.currentJobPromise = (async () => {
|
70
73
|
try {
|
71
|
-
const job = wrapJob(jobJson);
|
74
|
+
const job = wrapJob(jobJson, this.send);
|
72
75
|
const result = (await this.processor(job)) || {};
|
73
|
-
await
|
76
|
+
await this.send({
|
74
77
|
cmd: interfaces_1.ParentCommand.Completed,
|
75
78
|
value: result,
|
76
79
|
});
|
77
80
|
}
|
78
81
|
catch (err) {
|
79
|
-
await
|
82
|
+
await this.send({
|
80
83
|
cmd: interfaces_1.ParentCommand.Failed,
|
81
84
|
value: (0, utils_1.errorToJSON)(!err.message ? new Error(err) : err),
|
82
85
|
});
|
@@ -108,14 +111,14 @@ exports.ChildProcessor = ChildProcessor;
|
|
108
111
|
* the functions on the original job object are not in tact.
|
109
112
|
* The wrapped job adds back some of those original functions.
|
110
113
|
*/
|
111
|
-
function wrapJob(job) {
|
114
|
+
function wrapJob(job, send) {
|
112
115
|
let progressValue = job.progress;
|
113
116
|
const updateProgress = async (progress) => {
|
114
117
|
// Locally store reference to new progress value
|
115
118
|
// so that we can return it from this process synchronously.
|
116
119
|
progressValue = progress;
|
117
120
|
// Send message to update job progress.
|
118
|
-
await (
|
121
|
+
await send({
|
119
122
|
cmd: interfaces_1.ParentCommand.Progress,
|
120
123
|
value: progress,
|
121
124
|
});
|
@@ -129,7 +132,7 @@ function wrapJob(job) {
|
|
129
132
|
* Emulate the real job `log` function.
|
130
133
|
*/
|
131
134
|
log: async (row) => {
|
132
|
-
(
|
135
|
+
send({
|
133
136
|
cmd: interfaces_1.ParentCommand.Log,
|
134
137
|
value: row,
|
135
138
|
});
|
@@ -138,7 +141,7 @@ function wrapJob(job) {
|
|
138
141
|
* Emulate the real job `update` function.
|
139
142
|
*/
|
140
143
|
update: async (data) => {
|
141
|
-
(
|
144
|
+
send({
|
142
145
|
cmd: interfaces_1.ParentCommand.Update,
|
143
146
|
value: data,
|
144
147
|
});
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"child-processor.js","sourceRoot":"","sources":["../../../src/classes/child-processor.ts"],"names":[],"mappings":";;;AAAA,+BAAiC;AACjC,8CAAqE;AACrE,
|
1
|
+
{"version":3,"file":"child-processor.js","sourceRoot":"","sources":["../../../src/classes/child-processor.ts"],"names":[],"mappings":"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"}
|
@@ -0,0 +1,216 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.Child = void 0;
|
4
|
+
const child_process_1 = require("child_process");
|
5
|
+
const worker_threads_1 = require("worker_threads");
|
6
|
+
const net_1 = require("net");
|
7
|
+
const __1 = require("../");
|
8
|
+
const EventEmitter = require("events");
|
9
|
+
/**
|
10
|
+
* @see https://nodejs.org/api/process.html#process_exit_codes
|
11
|
+
*/
|
12
|
+
const exitCodesErrors = {
|
13
|
+
1: 'Uncaught Fatal Exception',
|
14
|
+
2: 'Unused',
|
15
|
+
3: 'Internal JavaScript Parse Error',
|
16
|
+
4: 'Internal JavaScript Evaluation Failure',
|
17
|
+
5: 'Fatal Error',
|
18
|
+
6: 'Non-function Internal Exception Handler',
|
19
|
+
7: 'Internal Exception Handler Run-Time Failure',
|
20
|
+
8: 'Unused',
|
21
|
+
9: 'Invalid Argument',
|
22
|
+
10: 'Internal JavaScript Run-Time Failure',
|
23
|
+
12: 'Invalid Debug Argument',
|
24
|
+
13: 'Unfinished Top-Level Await',
|
25
|
+
};
|
26
|
+
/**
|
27
|
+
* Child class
|
28
|
+
*
|
29
|
+
* This class is used to create a child process or worker thread, and allows using
|
30
|
+
* isolated processes or threads for processing jobs.
|
31
|
+
*
|
32
|
+
*/
|
33
|
+
class Child extends EventEmitter {
|
34
|
+
constructor(mainFile, processFile, opts = {
|
35
|
+
useWorkerThreads: false,
|
36
|
+
}) {
|
37
|
+
super();
|
38
|
+
this.mainFile = mainFile;
|
39
|
+
this.processFile = processFile;
|
40
|
+
this.opts = opts;
|
41
|
+
this._exitCode = null;
|
42
|
+
this._signalCode = null;
|
43
|
+
this._killed = false;
|
44
|
+
}
|
45
|
+
get pid() {
|
46
|
+
if (this.childProcess) {
|
47
|
+
return this.childProcess.pid;
|
48
|
+
}
|
49
|
+
else if (this.worker) {
|
50
|
+
return this.worker.threadId;
|
51
|
+
}
|
52
|
+
else {
|
53
|
+
throw new Error('No child process or worker thread');
|
54
|
+
}
|
55
|
+
}
|
56
|
+
get exitCode() {
|
57
|
+
return this._exitCode;
|
58
|
+
}
|
59
|
+
get signalCode() {
|
60
|
+
return this._signalCode;
|
61
|
+
}
|
62
|
+
get killed() {
|
63
|
+
if (this.childProcess) {
|
64
|
+
return this.childProcess.killed;
|
65
|
+
}
|
66
|
+
return this._killed;
|
67
|
+
}
|
68
|
+
async init() {
|
69
|
+
const execArgv = await convertExecArgv(process.execArgv);
|
70
|
+
let parent;
|
71
|
+
if (this.opts.useWorkerThreads) {
|
72
|
+
this.worker = parent = new worker_threads_1.Worker(this.mainFile, {
|
73
|
+
execArgv,
|
74
|
+
stdin: true,
|
75
|
+
stdout: true,
|
76
|
+
stderr: true,
|
77
|
+
});
|
78
|
+
}
|
79
|
+
else {
|
80
|
+
this.childProcess = parent = (0, child_process_1.fork)(this.mainFile, [], {
|
81
|
+
execArgv,
|
82
|
+
stdio: 'pipe',
|
83
|
+
});
|
84
|
+
}
|
85
|
+
parent.on('exit', (exitCode, signalCode) => {
|
86
|
+
this._exitCode = exitCode;
|
87
|
+
// Coerce to null if undefined for backwards compatibility
|
88
|
+
signalCode = typeof signalCode === 'undefined' ? null : signalCode;
|
89
|
+
this._signalCode = signalCode;
|
90
|
+
this._killed = true;
|
91
|
+
this.emit('exit', exitCode, signalCode);
|
92
|
+
// Clean all listeners, we do not expect any more events after "exit"
|
93
|
+
parent.removeAllListeners();
|
94
|
+
this.removeAllListeners();
|
95
|
+
});
|
96
|
+
parent.on('error', (...args) => this.emit('error', ...args));
|
97
|
+
parent.on('message', (...args) => this.emit('message', ...args));
|
98
|
+
parent.on('close', (...args) => this.emit('close', ...args));
|
99
|
+
parent.stdout.pipe(process.stdout);
|
100
|
+
parent.stderr.pipe(process.stderr);
|
101
|
+
await this.initChild();
|
102
|
+
}
|
103
|
+
async send(msg) {
|
104
|
+
return new Promise((resolve, reject) => {
|
105
|
+
if (this.childProcess) {
|
106
|
+
this.childProcess.send(msg, (err) => {
|
107
|
+
if (err) {
|
108
|
+
reject(err);
|
109
|
+
}
|
110
|
+
else {
|
111
|
+
resolve();
|
112
|
+
}
|
113
|
+
});
|
114
|
+
}
|
115
|
+
else if (this.worker) {
|
116
|
+
resolve(this.worker.postMessage(msg));
|
117
|
+
}
|
118
|
+
else {
|
119
|
+
resolve();
|
120
|
+
}
|
121
|
+
});
|
122
|
+
}
|
123
|
+
killProcess(signal = 'SIGKILL') {
|
124
|
+
if (this.childProcess) {
|
125
|
+
this.childProcess.kill(signal);
|
126
|
+
}
|
127
|
+
else if (this.worker) {
|
128
|
+
this.worker.terminate();
|
129
|
+
}
|
130
|
+
}
|
131
|
+
async kill(signal = 'SIGKILL', timeoutMs) {
|
132
|
+
if (this.hasProcessExited()) {
|
133
|
+
return;
|
134
|
+
}
|
135
|
+
const onExit = onExitOnce(this.childProcess || this.worker);
|
136
|
+
this.killProcess(signal);
|
137
|
+
if (timeoutMs !== undefined && (timeoutMs === 0 || isFinite(timeoutMs))) {
|
138
|
+
const timeoutHandle = setTimeout(() => {
|
139
|
+
if (!this.hasProcessExited()) {
|
140
|
+
this.killProcess('SIGKILL');
|
141
|
+
}
|
142
|
+
}, timeoutMs);
|
143
|
+
await onExit;
|
144
|
+
clearTimeout(timeoutHandle);
|
145
|
+
}
|
146
|
+
await onExit;
|
147
|
+
}
|
148
|
+
async initChild() {
|
149
|
+
const onComplete = new Promise((resolve, reject) => {
|
150
|
+
const onMessageHandler = (msg) => {
|
151
|
+
if (msg.cmd === __1.ParentCommand.InitCompleted) {
|
152
|
+
resolve();
|
153
|
+
}
|
154
|
+
else if (msg.cmd === __1.ParentCommand.InitFailed) {
|
155
|
+
const err = new Error();
|
156
|
+
err.stack = msg.err.stack;
|
157
|
+
err.message = msg.err.message;
|
158
|
+
reject(err);
|
159
|
+
}
|
160
|
+
this.off('message', onMessageHandler);
|
161
|
+
this.off('close', onCloseHandler);
|
162
|
+
};
|
163
|
+
const onCloseHandler = (code, signal) => {
|
164
|
+
if (code > 128) {
|
165
|
+
code -= 128;
|
166
|
+
}
|
167
|
+
const msg = exitCodesErrors[code] || `Unknown exit code ${code}`;
|
168
|
+
reject(new Error(`Error initializing child: ${msg} and signal ${signal}`));
|
169
|
+
this.off('message', onMessageHandler);
|
170
|
+
this.off('close', onCloseHandler);
|
171
|
+
};
|
172
|
+
this.on('message', onMessageHandler);
|
173
|
+
this.on('close', onCloseHandler);
|
174
|
+
});
|
175
|
+
await this.send({
|
176
|
+
cmd: __1.ChildCommand.Init,
|
177
|
+
value: this.processFile,
|
178
|
+
});
|
179
|
+
await onComplete;
|
180
|
+
}
|
181
|
+
hasProcessExited() {
|
182
|
+
return !!(this.exitCode !== null || this.signalCode);
|
183
|
+
}
|
184
|
+
}
|
185
|
+
exports.Child = Child;
|
186
|
+
function onExitOnce(child) {
|
187
|
+
return new Promise(resolve => {
|
188
|
+
child.once('exit', () => resolve());
|
189
|
+
});
|
190
|
+
}
|
191
|
+
const getFreePort = async () => {
|
192
|
+
return new Promise(resolve => {
|
193
|
+
const server = (0, net_1.createServer)();
|
194
|
+
server.listen(0, () => {
|
195
|
+
const { port } = server.address();
|
196
|
+
server.close(() => resolve(port));
|
197
|
+
});
|
198
|
+
});
|
199
|
+
};
|
200
|
+
const convertExecArgv = async (execArgv) => {
|
201
|
+
const standard = [];
|
202
|
+
const convertedArgs = [];
|
203
|
+
for (let i = 0; i < execArgv.length; i++) {
|
204
|
+
const arg = execArgv[i];
|
205
|
+
if (arg.indexOf('--inspect') === -1) {
|
206
|
+
standard.push(arg);
|
207
|
+
}
|
208
|
+
else {
|
209
|
+
const argName = arg.split('=')[0];
|
210
|
+
const port = await getFreePort();
|
211
|
+
convertedArgs.push(`${argName}=${port}`);
|
212
|
+
}
|
213
|
+
}
|
214
|
+
return standard.concat(convertedArgs);
|
215
|
+
};
|
216
|
+
//# sourceMappingURL=child.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"child.js","sourceRoot":"","sources":["../../../src/classes/child.ts"],"names":[],"mappings":"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"}
|
@@ -8,8 +8,8 @@ tslib_1.__exportStar(require("./child-processor"), exports);
|
|
8
8
|
tslib_1.__exportStar(require("./delayed-error"), exports);
|
9
9
|
tslib_1.__exportStar(require("./flow-producer"), exports);
|
10
10
|
tslib_1.__exportStar(require("./job"), exports);
|
11
|
-
// export * from './
|
12
|
-
|
11
|
+
// export * from './main'; this file must not be exported
|
12
|
+
// export * from './main-worker'; this file must not be exported
|
13
13
|
tslib_1.__exportStar(require("./queue-base"), exports);
|
14
14
|
tslib_1.__exportStar(require("./queue-events"), exports);
|
15
15
|
tslib_1.__exportStar(require("./queue-getters"), exports);
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/classes/index.ts"],"names":[],"mappings":";;;AAAA,6DAAmC;AACnC,qDAA2B;AAC3B,uDAA6B;AAC7B,4DAAkC;AAClC,0DAAgC;AAChC,0DAAgC;AAChC,gDAAsB;AACtB,
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/classes/index.ts"],"names":[],"mappings":";;;AAAA,6DAAmC;AACnC,qDAA2B;AAC3B,uDAA6B;AAC7B,4DAAkC;AAClC,0DAAgC;AAChC,0DAAgC;AAChC,gDAAsB;AACtB,yDAAyD;AACzD,gEAAgE;AAChE,uDAA6B;AAC7B,yDAA+B;AAC/B,0DAAgC;AAChC,uDAA6B;AAC7B,kDAAwB;AACxB,6DAAmC;AACnC,mDAAyB;AACzB,oDAA0B;AAC1B,oDAA0B;AAC1B,gEAAsC;AACtC,mEAAyC;AACzC,mDAAyB"}
|
@@ -0,0 +1,45 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
/**
|
4
|
+
* Wrapper for sandboxing.
|
5
|
+
*
|
6
|
+
*/
|
7
|
+
const lodash_1 = require("lodash");
|
8
|
+
const child_processor_1 = require("./child-processor");
|
9
|
+
const interfaces_1 = require("../interfaces");
|
10
|
+
const utils_1 = require("../utils");
|
11
|
+
exports.default = (send, receiver) => {
|
12
|
+
const childProcessor = new child_processor_1.ChildProcessor(send);
|
13
|
+
receiver === null || receiver === void 0 ? void 0 : receiver.on('message', async (msg) => {
|
14
|
+
try {
|
15
|
+
switch (msg.cmd) {
|
16
|
+
case interfaces_1.ChildCommand.Init:
|
17
|
+
await childProcessor.init(msg.value);
|
18
|
+
break;
|
19
|
+
case interfaces_1.ChildCommand.Start:
|
20
|
+
await childProcessor.start(msg.job);
|
21
|
+
break;
|
22
|
+
case interfaces_1.ChildCommand.Stop:
|
23
|
+
break;
|
24
|
+
}
|
25
|
+
}
|
26
|
+
catch (err) {
|
27
|
+
console.error('Error handling child message');
|
28
|
+
}
|
29
|
+
});
|
30
|
+
process.on('SIGTERM', () => childProcessor.waitForCurrentJobAndExit());
|
31
|
+
process.on('SIGINT', () => childProcessor.waitForCurrentJobAndExit());
|
32
|
+
process.on('uncaughtException', async (err) => {
|
33
|
+
if (!err.message) {
|
34
|
+
err = new Error((0, lodash_1.toString)(err));
|
35
|
+
}
|
36
|
+
await send({
|
37
|
+
cmd: interfaces_1.ParentCommand.Failed,
|
38
|
+
value: (0, utils_1.errorToJSON)(err),
|
39
|
+
});
|
40
|
+
// An uncaughException leaves this process in a potentially undetermined state so
|
41
|
+
// we must exit
|
42
|
+
process.exit(-1);
|
43
|
+
});
|
44
|
+
};
|
45
|
+
//# sourceMappingURL=main-base.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"main-base.js","sourceRoot":"","sources":["../../../src/classes/main-base.ts"],"names":[],"mappings":";;AAAA;;;GAGG;AACH,mCAAkC;AAClC,uDAAmD;AACnD,8CAA4D;AAC5D,oCAAuC;AAEvC,kBAAe,CACb,IAAiC,EACjC,QAAkE,EAClE,EAAE;IACF,MAAM,cAAc,GAAG,IAAI,gCAAc,CAAC,IAAI,CAAC,CAAC;IAEhD,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,EAAE,CAAC,SAAS,EAAE,KAAK,EAAC,GAAG,EAAC,EAAE;QAClC,IAAI;YACF,QAAQ,GAAG,CAAC,GAAmB,EAAE;gBAC/B,KAAK,yBAAY,CAAC,IAAI;oBACpB,MAAM,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;oBACrC,MAAM;gBACR,KAAK,yBAAY,CAAC,KAAK;oBACrB,MAAM,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;oBACpC,MAAM;gBACR,KAAK,yBAAY,CAAC,IAAI;oBACpB,MAAM;aACT;SACF;QAAC,OAAO,GAAG,EAAE;YACZ,OAAO,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;SAC/C;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,wBAAwB,EAAE,CAAC,CAAC;IACvE,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,wBAAwB,EAAE,CAAC,CAAC;IAEtE,OAAO,CAAC,EAAE,CAAC,mBAAmB,EAAE,KAAK,EAAE,GAAU,EAAE,EAAE;QACnD,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE;YAChB,GAAG,GAAG,IAAI,KAAK,CAAC,IAAA,iBAAQ,EAAC,GAAG,CAAC,CAAC,CAAC;SAChC;QACD,MAAM,IAAI,CAAC;YACT,GAAG,EAAE,0BAAa,CAAC,MAAM;YACzB,KAAK,EAAE,IAAA,mBAAW,EAAC,GAAG,CAAC;SACxB,CAAC,CAAC;QAEH,iFAAiF;QACjF,eAAe;QACf,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACnB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC"}
|
@@ -0,0 +1,10 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
/**
|
4
|
+
* Worker Thread wrapper for sandboxing
|
5
|
+
*
|
6
|
+
*/
|
7
|
+
const worker_threads_1 = require("worker_threads");
|
8
|
+
const main_base_1 = require("./main-base");
|
9
|
+
(0, main_base_1.default)(async (msg) => worker_threads_1.parentPort.postMessage(msg), worker_threads_1.parentPort);
|
10
|
+
//# sourceMappingURL=main-worker.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"main-worker.js","sourceRoot":"","sources":["../../../src/classes/main-worker.ts"],"names":[],"mappings":";;AAAA;;;GAGG;AACH,mDAA4C;AAC5C,2CAAmC;AAEnC,IAAA,mBAAQ,EAAC,KAAK,EAAE,GAAQ,EAAE,EAAE,CAAC,2BAAU,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,2BAAU,CAAC,CAAC"}
|
@@ -0,0 +1,10 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
/**
|
4
|
+
* Child process wrapper for sandboxing.
|
5
|
+
*
|
6
|
+
*/
|
7
|
+
const utils_1 = require("../utils");
|
8
|
+
const main_base_1 = require("./main-base");
|
9
|
+
(0, main_base_1.default)((msg) => (0, utils_1.childSend)(process, msg), process);
|
10
|
+
//# sourceMappingURL=main.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../../../src/classes/main.ts"],"names":[],"mappings":";;AAAA;;;GAGG;AACH,oCAAqC;AACrC,2CAAmC;AAEnC,IAAA,mBAAQ,EAAC,CAAC,GAAQ,EAAE,EAAE,CAAC,IAAA,iBAAS,EAAC,OAAO,EAAE,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC"}
|
@@ -1,13 +1,12 @@
|
|
1
1
|
"use strict";
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
3
|
const interfaces_1 = require("../interfaces");
|
4
|
-
const utils_1 = require("../utils");
|
5
4
|
const sandbox = (processFile, childPool) => {
|
6
5
|
return async function process(job) {
|
7
6
|
const child = await childPool.retain(processFile);
|
8
7
|
let msgHandler;
|
9
8
|
let exitHandler;
|
10
|
-
await
|
9
|
+
await child.send({
|
11
10
|
cmd: interfaces_1.ChildCommand.Start,
|
12
11
|
job: job.asJSONSandbox(),
|
13
12
|
});
|
@@ -46,8 +45,8 @@ const sandbox = (processFile, childPool) => {
|
|
46
45
|
return done;
|
47
46
|
}
|
48
47
|
finally {
|
49
|
-
child.
|
50
|
-
child.
|
48
|
+
child.off('message', msgHandler);
|
49
|
+
child.off('exit', exitHandler);
|
51
50
|
if (child.exitCode !== null || /SIG.*/.test(`${child.signalCode}`)) {
|
52
51
|
childPool.remove(child);
|
53
52
|
}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"sandbox.js","sourceRoot":"","sources":["../../../src/classes/sandbox.ts"],"names":[],"mappings":";;AAAA,8CAA0E;
|
1
|
+
{"version":3,"file":"sandbox.js","sourceRoot":"","sources":["../../../src/classes/sandbox.ts"],"names":[],"mappings":";;AAAA,8CAA0E;AAI1E,MAAM,OAAO,GAAG,CACd,WAAgB,EAChB,SAAoB,EACpB,EAAE;IACF,OAAO,KAAK,UAAU,OAAO,CAAC,GAAiB;QAC7C,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QAClD,IAAI,UAAe,CAAC;QACpB,IAAI,WAAgB,CAAC;QAErB,MAAM,KAAK,CAAC,IAAI,CAAC;YACf,GAAG,EAAE,yBAAY,CAAC,KAAK;YACvB,GAAG,EAAE,GAAG,CAAC,aAAa,EAAE;SACzB,CAAC,CAAC;QAEH,MAAM,IAAI,GAAe,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACvD,UAAU,GAAG,KAAK,EAAE,GAAiB,EAAE,EAAE;gBACvC,QAAQ,GAAG,CAAC,GAAG,EAAE;oBACf,KAAK,0BAAa,CAAC,SAAS;wBAC1B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;wBACnB,MAAM;oBACR,KAAK,0BAAa,CAAC,MAAM,CAAC;oBAC1B,KAAK,0BAAa,CAAC,KAAK,CAAC,CAAC;wBACxB,MAAM,GAAG,GAAG,IAAI,KAAK,EAAE,CAAC;wBACxB,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;wBAC9B,MAAM,CAAC,GAAG,CAAC,CAAC;wBACZ,MAAM;qBACP;oBACD,KAAK,0BAAa,CAAC,QAAQ;wBACzB,MAAM,GAAG,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;wBACpC,MAAM;oBACR,KAAK,0BAAa,CAAC,GAAG;wBACpB,MAAM,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;wBACzB,MAAM;oBACR,KAAK,0BAAa,CAAC,MAAM;wBACvB,MAAM,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;wBAC5B,MAAM;iBACT;YACH,CAAC,CAAC;YAEF,WAAW,GAAG,CAAC,QAAa,EAAE,MAAW,EAAE,EAAE;gBAC3C,MAAM,CACJ,IAAI,KAAK,CAAC,wBAAwB,GAAG,QAAQ,GAAG,WAAW,GAAG,MAAM,CAAC,CACtE,CAAC;YACJ,CAAC,CAAC;YAEF,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;YAChC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;QAEH,IAAI;YACF,MAAM,IAAI,CAAC;YACX,OAAO,IAAI,CAAC;SACb;gBAAS;YACR,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;YACjC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;YAE/B,IAAI,KAAK,CAAC,QAAQ,KAAK,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,UAAU,EAAE,CAAC,EAAE;gBAClE,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;aACzB;iBAAM;gBACL,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;aAC1B;SACF;IACH,CAAC,CAAC;AACJ,CAAC,CAAC;AAEF,kBAAe,OAAO,CAAC"}
|