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 +1 @@
|
|
1
|
-
{"version":3,"file":"child-pool.js","sourceRoot":"","sources":["../../../src/classes/child-pool.ts"],"names":[],"mappings":"AAAA,OAAO,
|
1
|
+
{"version":3,"file":"child-pool.js","sourceRoot":"","sources":["../../../src/classes/child-pool.ts"],"names":[],"mappings":"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"}
|
@@ -9,13 +9,15 @@ declare enum ChildStatus {
|
|
9
9
|
* ChildProcessor
|
10
10
|
*
|
11
11
|
* This class acts as the interface between a child process and it parent process
|
12
|
-
* so that jobs can be processed in different processes
|
12
|
+
* so that jobs can be processed in different processes.
|
13
13
|
*
|
14
14
|
*/
|
15
15
|
export declare class ChildProcessor {
|
16
|
+
private send;
|
16
17
|
status?: ChildStatus;
|
17
18
|
processor: any;
|
18
19
|
currentJobPromise: Promise<unknown> | undefined;
|
20
|
+
constructor(send: (msg: any) => Promise<void>);
|
19
21
|
init(processorFile: string): Promise<void>;
|
20
22
|
start(jobJson: JobJson): Promise<void>;
|
21
23
|
stop(): Promise<void>;
|
@@ -1,6 +1,6 @@
|
|
1
1
|
import { promisify } from 'util';
|
2
2
|
import { ParentCommand } from '../interfaces';
|
3
|
-
import {
|
3
|
+
import { errorToJSON } from '../utils';
|
4
4
|
var ChildStatus;
|
5
5
|
(function (ChildStatus) {
|
6
6
|
ChildStatus[ChildStatus["Idle"] = 0] = "Idle";
|
@@ -12,10 +12,13 @@ var ChildStatus;
|
|
12
12
|
* ChildProcessor
|
13
13
|
*
|
14
14
|
* This class acts as the interface between a child process and it parent process
|
15
|
-
* so that jobs can be processed in different processes
|
15
|
+
* so that jobs can be processed in different processes.
|
16
16
|
*
|
17
17
|
*/
|
18
18
|
export class ChildProcessor {
|
19
|
+
constructor(send) {
|
20
|
+
this.send = send;
|
21
|
+
}
|
19
22
|
async init(processorFile) {
|
20
23
|
let processor;
|
21
24
|
try {
|
@@ -30,7 +33,7 @@ export class ChildProcessor {
|
|
30
33
|
}
|
31
34
|
catch (err) {
|
32
35
|
this.status = ChildStatus.Errored;
|
33
|
-
return
|
36
|
+
return this.send({
|
34
37
|
cmd: ParentCommand.InitFailed,
|
35
38
|
err: errorToJSON(err),
|
36
39
|
});
|
@@ -51,13 +54,13 @@ export class ChildProcessor {
|
|
51
54
|
}
|
52
55
|
this.processor = processor;
|
53
56
|
this.status = ChildStatus.Idle;
|
54
|
-
await
|
57
|
+
await this.send({
|
55
58
|
cmd: ParentCommand.InitCompleted,
|
56
59
|
});
|
57
60
|
}
|
58
61
|
async start(jobJson) {
|
59
62
|
if (this.status !== ChildStatus.Idle) {
|
60
|
-
return
|
63
|
+
return this.send({
|
61
64
|
cmd: ParentCommand.Error,
|
62
65
|
err: errorToJSON(new Error('cannot start a not idling child process')),
|
63
66
|
});
|
@@ -65,15 +68,15 @@ export class ChildProcessor {
|
|
65
68
|
this.status = ChildStatus.Started;
|
66
69
|
this.currentJobPromise = (async () => {
|
67
70
|
try {
|
68
|
-
const job = wrapJob(jobJson);
|
71
|
+
const job = wrapJob(jobJson, this.send);
|
69
72
|
const result = (await this.processor(job)) || {};
|
70
|
-
await
|
73
|
+
await this.send({
|
71
74
|
cmd: ParentCommand.Completed,
|
72
75
|
value: result,
|
73
76
|
});
|
74
77
|
}
|
75
78
|
catch (err) {
|
76
|
-
await
|
79
|
+
await this.send({
|
77
80
|
cmd: ParentCommand.Failed,
|
78
81
|
value: errorToJSON(!err.message ? new Error(err) : err),
|
79
82
|
});
|
@@ -104,14 +107,14 @@ export class ChildProcessor {
|
|
104
107
|
* the functions on the original job object are not in tact.
|
105
108
|
* The wrapped job adds back some of those original functions.
|
106
109
|
*/
|
107
|
-
function wrapJob(job) {
|
110
|
+
function wrapJob(job, send) {
|
108
111
|
let progressValue = job.progress;
|
109
112
|
const updateProgress = async (progress) => {
|
110
113
|
// Locally store reference to new progress value
|
111
114
|
// so that we can return it from this process synchronously.
|
112
115
|
progressValue = progress;
|
113
116
|
// Send message to update job progress.
|
114
|
-
await
|
117
|
+
await send({
|
115
118
|
cmd: ParentCommand.Progress,
|
116
119
|
value: progress,
|
117
120
|
});
|
@@ -125,7 +128,7 @@ function wrapJob(job) {
|
|
125
128
|
* Emulate the real job `log` function.
|
126
129
|
*/
|
127
130
|
log: async (row) => {
|
128
|
-
|
131
|
+
send({
|
129
132
|
cmd: ParentCommand.Log,
|
130
133
|
value: row,
|
131
134
|
});
|
@@ -134,7 +137,7 @@ function wrapJob(job) {
|
|
134
137
|
* Emulate the real job `update` function.
|
135
138
|
*/
|
136
139
|
update: async (data) => {
|
137
|
-
|
140
|
+
send({
|
138
141
|
cmd: ParentCommand.Update,
|
139
142
|
value: data,
|
140
143
|
});
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"child-processor.js","sourceRoot":"","sources":["../../../src/classes/child-processor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AACjC,OAAO,EAAW,aAAa,EAAgB,MAAM,eAAe,CAAC;AACrE,OAAO,EAAE,
|
1
|
+
{"version":3,"file":"child-processor.js","sourceRoot":"","sources":["../../../src/classes/child-processor.ts"],"names":[],"mappings":"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"}
|
@@ -0,0 +1,36 @@
|
|
1
|
+
/// <reference types="node" />
|
2
|
+
/// <reference types="node" />
|
3
|
+
/// <reference types="node" />
|
4
|
+
import { ChildProcess } from 'child_process';
|
5
|
+
import { Worker } from 'worker_threads';
|
6
|
+
import * as EventEmitter from 'events';
|
7
|
+
/**
|
8
|
+
* Child class
|
9
|
+
*
|
10
|
+
* This class is used to create a child process or worker thread, and allows using
|
11
|
+
* isolated processes or threads for processing jobs.
|
12
|
+
*
|
13
|
+
*/
|
14
|
+
export declare class Child extends EventEmitter {
|
15
|
+
private mainFile;
|
16
|
+
processFile: string;
|
17
|
+
private opts;
|
18
|
+
childProcess: ChildProcess;
|
19
|
+
worker: Worker;
|
20
|
+
private _exitCode;
|
21
|
+
private _signalCode;
|
22
|
+
private _killed;
|
23
|
+
constructor(mainFile: string, processFile: string, opts?: {
|
24
|
+
useWorkerThreads: boolean;
|
25
|
+
});
|
26
|
+
get pid(): number;
|
27
|
+
get exitCode(): number;
|
28
|
+
get signalCode(): number;
|
29
|
+
get killed(): boolean;
|
30
|
+
init(): Promise<void>;
|
31
|
+
send(msg: any): Promise<void>;
|
32
|
+
private killProcess;
|
33
|
+
kill(signal?: 'SIGTERM' | 'SIGKILL', timeoutMs?: number): Promise<void>;
|
34
|
+
private initChild;
|
35
|
+
hasProcessExited(): boolean;
|
36
|
+
}
|
@@ -0,0 +1,212 @@
|
|
1
|
+
import { fork } from 'child_process';
|
2
|
+
import { Worker } from 'worker_threads';
|
3
|
+
import { createServer } from 'net';
|
4
|
+
import { ChildCommand, ParentCommand } from '../';
|
5
|
+
import * as EventEmitter from 'events';
|
6
|
+
/**
|
7
|
+
* @see https://nodejs.org/api/process.html#process_exit_codes
|
8
|
+
*/
|
9
|
+
const exitCodesErrors = {
|
10
|
+
1: 'Uncaught Fatal Exception',
|
11
|
+
2: 'Unused',
|
12
|
+
3: 'Internal JavaScript Parse Error',
|
13
|
+
4: 'Internal JavaScript Evaluation Failure',
|
14
|
+
5: 'Fatal Error',
|
15
|
+
6: 'Non-function Internal Exception Handler',
|
16
|
+
7: 'Internal Exception Handler Run-Time Failure',
|
17
|
+
8: 'Unused',
|
18
|
+
9: 'Invalid Argument',
|
19
|
+
10: 'Internal JavaScript Run-Time Failure',
|
20
|
+
12: 'Invalid Debug Argument',
|
21
|
+
13: 'Unfinished Top-Level Await',
|
22
|
+
};
|
23
|
+
/**
|
24
|
+
* Child class
|
25
|
+
*
|
26
|
+
* This class is used to create a child process or worker thread, and allows using
|
27
|
+
* isolated processes or threads for processing jobs.
|
28
|
+
*
|
29
|
+
*/
|
30
|
+
export class Child extends EventEmitter {
|
31
|
+
constructor(mainFile, processFile, opts = {
|
32
|
+
useWorkerThreads: false,
|
33
|
+
}) {
|
34
|
+
super();
|
35
|
+
this.mainFile = mainFile;
|
36
|
+
this.processFile = processFile;
|
37
|
+
this.opts = opts;
|
38
|
+
this._exitCode = null;
|
39
|
+
this._signalCode = null;
|
40
|
+
this._killed = false;
|
41
|
+
}
|
42
|
+
get pid() {
|
43
|
+
if (this.childProcess) {
|
44
|
+
return this.childProcess.pid;
|
45
|
+
}
|
46
|
+
else if (this.worker) {
|
47
|
+
return this.worker.threadId;
|
48
|
+
}
|
49
|
+
else {
|
50
|
+
throw new Error('No child process or worker thread');
|
51
|
+
}
|
52
|
+
}
|
53
|
+
get exitCode() {
|
54
|
+
return this._exitCode;
|
55
|
+
}
|
56
|
+
get signalCode() {
|
57
|
+
return this._signalCode;
|
58
|
+
}
|
59
|
+
get killed() {
|
60
|
+
if (this.childProcess) {
|
61
|
+
return this.childProcess.killed;
|
62
|
+
}
|
63
|
+
return this._killed;
|
64
|
+
}
|
65
|
+
async init() {
|
66
|
+
const execArgv = await convertExecArgv(process.execArgv);
|
67
|
+
let parent;
|
68
|
+
if (this.opts.useWorkerThreads) {
|
69
|
+
this.worker = parent = new Worker(this.mainFile, {
|
70
|
+
execArgv,
|
71
|
+
stdin: true,
|
72
|
+
stdout: true,
|
73
|
+
stderr: true,
|
74
|
+
});
|
75
|
+
}
|
76
|
+
else {
|
77
|
+
this.childProcess = parent = fork(this.mainFile, [], {
|
78
|
+
execArgv,
|
79
|
+
stdio: 'pipe',
|
80
|
+
});
|
81
|
+
}
|
82
|
+
parent.on('exit', (exitCode, signalCode) => {
|
83
|
+
this._exitCode = exitCode;
|
84
|
+
// Coerce to null if undefined for backwards compatibility
|
85
|
+
signalCode = typeof signalCode === 'undefined' ? null : signalCode;
|
86
|
+
this._signalCode = signalCode;
|
87
|
+
this._killed = true;
|
88
|
+
this.emit('exit', exitCode, signalCode);
|
89
|
+
// Clean all listeners, we do not expect any more events after "exit"
|
90
|
+
parent.removeAllListeners();
|
91
|
+
this.removeAllListeners();
|
92
|
+
});
|
93
|
+
parent.on('error', (...args) => this.emit('error', ...args));
|
94
|
+
parent.on('message', (...args) => this.emit('message', ...args));
|
95
|
+
parent.on('close', (...args) => this.emit('close', ...args));
|
96
|
+
parent.stdout.pipe(process.stdout);
|
97
|
+
parent.stderr.pipe(process.stderr);
|
98
|
+
await this.initChild();
|
99
|
+
}
|
100
|
+
async send(msg) {
|
101
|
+
return new Promise((resolve, reject) => {
|
102
|
+
if (this.childProcess) {
|
103
|
+
this.childProcess.send(msg, (err) => {
|
104
|
+
if (err) {
|
105
|
+
reject(err);
|
106
|
+
}
|
107
|
+
else {
|
108
|
+
resolve();
|
109
|
+
}
|
110
|
+
});
|
111
|
+
}
|
112
|
+
else if (this.worker) {
|
113
|
+
resolve(this.worker.postMessage(msg));
|
114
|
+
}
|
115
|
+
else {
|
116
|
+
resolve();
|
117
|
+
}
|
118
|
+
});
|
119
|
+
}
|
120
|
+
killProcess(signal = 'SIGKILL') {
|
121
|
+
if (this.childProcess) {
|
122
|
+
this.childProcess.kill(signal);
|
123
|
+
}
|
124
|
+
else if (this.worker) {
|
125
|
+
this.worker.terminate();
|
126
|
+
}
|
127
|
+
}
|
128
|
+
async kill(signal = 'SIGKILL', timeoutMs) {
|
129
|
+
if (this.hasProcessExited()) {
|
130
|
+
return;
|
131
|
+
}
|
132
|
+
const onExit = onExitOnce(this.childProcess || this.worker);
|
133
|
+
this.killProcess(signal);
|
134
|
+
if (timeoutMs !== undefined && (timeoutMs === 0 || isFinite(timeoutMs))) {
|
135
|
+
const timeoutHandle = setTimeout(() => {
|
136
|
+
if (!this.hasProcessExited()) {
|
137
|
+
this.killProcess('SIGKILL');
|
138
|
+
}
|
139
|
+
}, timeoutMs);
|
140
|
+
await onExit;
|
141
|
+
clearTimeout(timeoutHandle);
|
142
|
+
}
|
143
|
+
await onExit;
|
144
|
+
}
|
145
|
+
async initChild() {
|
146
|
+
const onComplete = new Promise((resolve, reject) => {
|
147
|
+
const onMessageHandler = (msg) => {
|
148
|
+
if (msg.cmd === ParentCommand.InitCompleted) {
|
149
|
+
resolve();
|
150
|
+
}
|
151
|
+
else if (msg.cmd === ParentCommand.InitFailed) {
|
152
|
+
const err = new Error();
|
153
|
+
err.stack = msg.err.stack;
|
154
|
+
err.message = msg.err.message;
|
155
|
+
reject(err);
|
156
|
+
}
|
157
|
+
this.off('message', onMessageHandler);
|
158
|
+
this.off('close', onCloseHandler);
|
159
|
+
};
|
160
|
+
const onCloseHandler = (code, signal) => {
|
161
|
+
if (code > 128) {
|
162
|
+
code -= 128;
|
163
|
+
}
|
164
|
+
const msg = exitCodesErrors[code] || `Unknown exit code ${code}`;
|
165
|
+
reject(new Error(`Error initializing child: ${msg} and signal ${signal}`));
|
166
|
+
this.off('message', onMessageHandler);
|
167
|
+
this.off('close', onCloseHandler);
|
168
|
+
};
|
169
|
+
this.on('message', onMessageHandler);
|
170
|
+
this.on('close', onCloseHandler);
|
171
|
+
});
|
172
|
+
await this.send({
|
173
|
+
cmd: ChildCommand.Init,
|
174
|
+
value: this.processFile,
|
175
|
+
});
|
176
|
+
await onComplete;
|
177
|
+
}
|
178
|
+
hasProcessExited() {
|
179
|
+
return !!(this.exitCode !== null || this.signalCode);
|
180
|
+
}
|
181
|
+
}
|
182
|
+
function onExitOnce(child) {
|
183
|
+
return new Promise(resolve => {
|
184
|
+
child.once('exit', () => resolve());
|
185
|
+
});
|
186
|
+
}
|
187
|
+
const getFreePort = async () => {
|
188
|
+
return new Promise(resolve => {
|
189
|
+
const server = createServer();
|
190
|
+
server.listen(0, () => {
|
191
|
+
const { port } = server.address();
|
192
|
+
server.close(() => resolve(port));
|
193
|
+
});
|
194
|
+
});
|
195
|
+
};
|
196
|
+
const convertExecArgv = async (execArgv) => {
|
197
|
+
const standard = [];
|
198
|
+
const convertedArgs = [];
|
199
|
+
for (let i = 0; i < execArgv.length; i++) {
|
200
|
+
const arg = execArgv[i];
|
201
|
+
if (arg.indexOf('--inspect') === -1) {
|
202
|
+
standard.push(arg);
|
203
|
+
}
|
204
|
+
else {
|
205
|
+
const argName = arg.split('=')[0];
|
206
|
+
const port = await getFreePort();
|
207
|
+
convertedArgs.push(`${argName}=${port}`);
|
208
|
+
}
|
209
|
+
}
|
210
|
+
return standard.concat(convertedArgs);
|
211
|
+
};
|
212
|
+
//# 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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"}
|
@@ -5,8 +5,8 @@ export * from './child-processor';
|
|
5
5
|
export * from './delayed-error';
|
6
6
|
export * from './flow-producer';
|
7
7
|
export * from './job';
|
8
|
-
// export * from './
|
9
|
-
export * from './
|
8
|
+
// export * from './main'; this file must not be exported
|
9
|
+
// export * from './main-worker'; this file must not be exported
|
10
10
|
export * from './queue-base';
|
11
11
|
export * from './queue-events';
|
12
12
|
export * from './queue-getters';
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/classes/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,OAAO,CAAC;AACtB,
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/classes/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,OAAO,CAAC;AACtB,yDAAyD;AACzD,gEAAgE;AAChE,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,SAAS,CAAC;AACxB,cAAc,oBAAoB,CAAC;AACnC,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,UAAU,CAAC"}
|
@@ -0,0 +1,43 @@
|
|
1
|
+
/**
|
2
|
+
* Wrapper for sandboxing.
|
3
|
+
*
|
4
|
+
*/
|
5
|
+
import { toString } from 'lodash';
|
6
|
+
import { ChildProcessor } from './child-processor';
|
7
|
+
import { ParentCommand, ChildCommand } from '../interfaces';
|
8
|
+
import { errorToJSON } from '../utils';
|
9
|
+
export default (send, receiver) => {
|
10
|
+
const childProcessor = new ChildProcessor(send);
|
11
|
+
receiver === null || receiver === void 0 ? void 0 : receiver.on('message', async (msg) => {
|
12
|
+
try {
|
13
|
+
switch (msg.cmd) {
|
14
|
+
case ChildCommand.Init:
|
15
|
+
await childProcessor.init(msg.value);
|
16
|
+
break;
|
17
|
+
case ChildCommand.Start:
|
18
|
+
await childProcessor.start(msg.job);
|
19
|
+
break;
|
20
|
+
case ChildCommand.Stop:
|
21
|
+
break;
|
22
|
+
}
|
23
|
+
}
|
24
|
+
catch (err) {
|
25
|
+
console.error('Error handling child message');
|
26
|
+
}
|
27
|
+
});
|
28
|
+
process.on('SIGTERM', () => childProcessor.waitForCurrentJobAndExit());
|
29
|
+
process.on('SIGINT', () => childProcessor.waitForCurrentJobAndExit());
|
30
|
+
process.on('uncaughtException', async (err) => {
|
31
|
+
if (!err.message) {
|
32
|
+
err = new Error(toString(err));
|
33
|
+
}
|
34
|
+
await send({
|
35
|
+
cmd: ParentCommand.Failed,
|
36
|
+
value: errorToJSON(err),
|
37
|
+
});
|
38
|
+
// An uncaughException leaves this process in a potentially undetermined state so
|
39
|
+
// we must exit
|
40
|
+
process.exit(-1);
|
41
|
+
});
|
42
|
+
};
|
43
|
+
//# 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,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAClC,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAEvC,eAAe,CACb,IAAiC,EACjC,QAAkE,EAClE,EAAE;IACF,MAAM,cAAc,GAAG,IAAI,cAAc,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,YAAY,CAAC,IAAI;oBACpB,MAAM,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;oBACrC,MAAM;gBACR,KAAK,YAAY,CAAC,KAAK;oBACrB,MAAM,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;oBACpC,MAAM;gBACR,KAAK,YAAY,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,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;SAChC;QACD,MAAM,IAAI,CAAC;YACT,GAAG,EAAE,aAAa,CAAC,MAAM;YACzB,KAAK,EAAE,WAAW,CAAC,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 @@
|
|
1
|
+
export {};
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"main-worker.js","sourceRoot":"","sources":["../../../src/classes/main-worker.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,QAAQ,MAAM,aAAa,CAAC;AAEnC,QAAQ,CAAC,KAAK,EAAE,GAAQ,EAAE,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,UAAU,CAAC,CAAC"}
|
@@ -0,0 +1 @@
|
|
1
|
+
export {};
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../../../src/classes/main.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,QAAQ,MAAM,aAAa,CAAC;AAEnC,QAAQ,CAAC,CAAC,GAAQ,EAAE,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC"}
|
@@ -1,11 +1,10 @@
|
|
1
1
|
import { ChildCommand, ParentCommand } from '../interfaces';
|
2
|
-
import { parentSend } from '../utils';
|
3
2
|
const sandbox = (processFile, childPool) => {
|
4
3
|
return async function process(job) {
|
5
4
|
const child = await childPool.retain(processFile);
|
6
5
|
let msgHandler;
|
7
6
|
let exitHandler;
|
8
|
-
await
|
7
|
+
await child.send({
|
9
8
|
cmd: ChildCommand.Start,
|
10
9
|
job: job.asJSONSandbox(),
|
11
10
|
});
|
@@ -44,8 +43,8 @@ const sandbox = (processFile, childPool) => {
|
|
44
43
|
return done;
|
45
44
|
}
|
46
45
|
finally {
|
47
|
-
child.
|
48
|
-
child.
|
46
|
+
child.off('message', msgHandler);
|
47
|
+
child.off('exit', exitHandler);
|
49
48
|
if (child.exitCode !== null || /SIG.*/.test(`${child.signalCode}`)) {
|
50
49
|
childPool.remove(child);
|
51
50
|
}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"sandbox.js","sourceRoot":"","sources":["../../../src/classes/sandbox.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAgB,aAAa,EAAE,MAAM,eAAe,CAAC;
|
1
|
+
{"version":3,"file":"sandbox.js","sourceRoot":"","sources":["../../../src/classes/sandbox.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAgB,aAAa,EAAE,MAAM,eAAe,CAAC;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,YAAY,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,aAAa,CAAC,SAAS;wBAC1B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;wBACnB,MAAM;oBACR,KAAK,aAAa,CAAC,MAAM,CAAC;oBAC1B,KAAK,aAAa,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,aAAa,CAAC,QAAQ;wBACzB,MAAM,GAAG,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;wBACpC,MAAM;oBACR,KAAK,aAAa,CAAC,GAAG;wBACpB,MAAM,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;wBACzB,MAAM;oBACR,KAAK,aAAa,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,eAAe,OAAO,CAAC"}
|
@@ -53,15 +53,21 @@ export class Worker extends QueueBase {
|
|
53
53
|
if (!fs.existsSync(processorFile)) {
|
54
54
|
throw new Error(`File ${processorFile} does not exist`);
|
55
55
|
}
|
56
|
-
|
56
|
+
const mainFile = this.opts.useWorkerThreads
|
57
|
+
? 'main-worker.js'
|
58
|
+
: 'main.js';
|
59
|
+
let mainFilePath = path.join(__dirname, `${mainFile}`);
|
57
60
|
try {
|
58
|
-
fs.statSync(
|
61
|
+
fs.statSync(mainFilePath); // would throw if file not exists
|
59
62
|
}
|
60
63
|
catch (_) {
|
61
|
-
|
62
|
-
fs.statSync(
|
64
|
+
mainFilePath = path.join(process.cwd(), `dist/cjs/classes/${mainFile}`);
|
65
|
+
fs.statSync(mainFilePath);
|
63
66
|
}
|
64
|
-
this.childPool = new ChildPool(
|
67
|
+
this.childPool = new ChildPool({
|
68
|
+
mainFile: mainFilePath,
|
69
|
+
useWorkerThreads: this.opts.useWorkerThreads,
|
70
|
+
});
|
65
71
|
this.processFn = sandbox(processor, this.childPool).bind(this);
|
66
72
|
}
|
67
73
|
if (this.opts.autorun) {
|