bullmq 3.12.1 → 3.13.1
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/scripts.js +3 -1
- package/dist/cjs/classes/scripts.js.map +1 -1
- package/dist/cjs/classes/worker.js +11 -5
- package/dist/cjs/classes/worker.js.map +1 -1
- package/dist/cjs/commands/{reprocessJob-4.lua → reprocessJob-6.lua} +9 -1
- package/dist/cjs/scripts/index.js +1 -1
- package/dist/cjs/scripts/{reprocessJob-4.js → reprocessJob-6.js} +18 -3
- package/dist/cjs/scripts/reprocessJob-6.js.map +1 -0
- 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/scripts.js +3 -1
- package/dist/esm/classes/scripts.js.map +1 -1
- package/dist/esm/classes/worker.js +11 -5
- package/dist/esm/classes/worker.js.map +1 -1
- package/dist/esm/commands/{reprocessJob-4.lua → reprocessJob-6.lua} +9 -1
- package/dist/esm/interfaces/worker-options.d.ts +8 -0
- package/dist/esm/scripts/index.d.ts +1 -1
- package/dist/esm/scripts/index.js +1 -1
- package/dist/esm/scripts/{reprocessJob-4.js → reprocessJob-6.js} +18 -3
- package/dist/esm/scripts/reprocessJob-6.js.map +1 -0
- package/dist/esm/tsconfig.tsbuildinfo +1 -1
- package/dist/esm/types/job-options.d.ts +4 -0
- 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/cjs/scripts/reprocessJob-4.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/esm/scripts/reprocessJob-4.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
- /package/dist/esm/scripts/{reprocessJob-4.d.ts → reprocessJob-6.d.ts} +0 -0
package/dist/cjs/utils.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":";;;AAAA,qCAAyC;AACzC,6DAA6D;AAC7D,aAAa;AACb,+CAAkE;AAClE,iCAAiC;
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"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"}
|
@@ -1,22 +1,23 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
1
|
+
import { Child } from './child';
|
2
|
+
interface ChildPoolOpts {
|
3
|
+
mainFile?: string;
|
4
|
+
useWorkerThreads?: boolean;
|
5
5
|
}
|
6
6
|
export declare class ChildPool {
|
7
|
-
private masterFile;
|
8
7
|
retained: {
|
9
|
-
[key: number]:
|
8
|
+
[key: number]: Child;
|
10
9
|
};
|
11
10
|
free: {
|
12
|
-
[key: string]:
|
11
|
+
[key: string]: Child[];
|
13
12
|
};
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
13
|
+
private opts;
|
14
|
+
constructor({ mainFile, useWorkerThreads, }: ChildPoolOpts);
|
15
|
+
retain(processFile: string): Promise<Child>;
|
16
|
+
release(child: Child): void;
|
17
|
+
remove(child: Child): void;
|
18
|
+
kill(child: Child, signal?: 'SIGTERM' | 'SIGKILL'): Promise<void>;
|
19
19
|
clean(): Promise<void>;
|
20
|
-
getFree(id: string):
|
21
|
-
getAllFree():
|
20
|
+
getFree(id: string): Child[];
|
21
|
+
getAllFree(): Child[];
|
22
22
|
}
|
23
|
+
export {};
|
@@ -1,108 +1,30 @@
|
|
1
|
-
import { fork } from 'child_process';
|
2
1
|
import * as path from 'path';
|
3
|
-
import {
|
4
|
-
import { killAsync } from './process-utils';
|
5
|
-
import { ParentCommand, ChildCommand } from '../interfaces';
|
6
|
-
import { parentSend } from '../utils';
|
2
|
+
import { Child } from './child';
|
7
3
|
const CHILD_KILL_TIMEOUT = 30000;
|
8
|
-
const getFreePort = async () => {
|
9
|
-
return new Promise(resolve => {
|
10
|
-
const server = createServer();
|
11
|
-
server.listen(0, () => {
|
12
|
-
const { port } = server.address();
|
13
|
-
server.close(() => resolve(port));
|
14
|
-
});
|
15
|
-
});
|
16
|
-
};
|
17
|
-
const convertExecArgv = async (execArgv) => {
|
18
|
-
const standard = [];
|
19
|
-
const convertedArgs = [];
|
20
|
-
for (let i = 0; i < execArgv.length; i++) {
|
21
|
-
const arg = execArgv[i];
|
22
|
-
if (arg.indexOf('--inspect') === -1) {
|
23
|
-
standard.push(arg);
|
24
|
-
}
|
25
|
-
else {
|
26
|
-
const argName = arg.split('=')[0];
|
27
|
-
const port = await getFreePort();
|
28
|
-
convertedArgs.push(`${argName}=${port}`);
|
29
|
-
}
|
30
|
-
}
|
31
|
-
return standard.concat(convertedArgs);
|
32
|
-
};
|
33
|
-
/**
|
34
|
-
* @see https://nodejs.org/api/process.html#process_exit_codes
|
35
|
-
*/
|
36
|
-
const exitCodesErrors = {
|
37
|
-
1: 'Uncaught Fatal Exception',
|
38
|
-
2: 'Unused',
|
39
|
-
3: 'Internal JavaScript Parse Error',
|
40
|
-
4: 'Internal JavaScript Evaluation Failure',
|
41
|
-
5: 'Fatal Error',
|
42
|
-
6: 'Non-function Internal Exception Handler',
|
43
|
-
7: 'Internal Exception Handler Run-Time Failure',
|
44
|
-
8: 'Unused',
|
45
|
-
9: 'Invalid Argument',
|
46
|
-
10: 'Internal JavaScript Run-Time Failure',
|
47
|
-
12: 'Invalid Debug Argument',
|
48
|
-
13: 'Unfinished Top-Level Await',
|
49
|
-
};
|
50
|
-
async function initChild(child, processFile) {
|
51
|
-
const onComplete = new Promise((resolve, reject) => {
|
52
|
-
const onMessageHandler = (msg) => {
|
53
|
-
if (msg.cmd === ParentCommand.InitCompleted) {
|
54
|
-
resolve();
|
55
|
-
}
|
56
|
-
else if (msg.cmd === ParentCommand.InitFailed) {
|
57
|
-
const err = new Error();
|
58
|
-
err.stack = msg.err.stack;
|
59
|
-
err.message = msg.err.message;
|
60
|
-
reject(err);
|
61
|
-
}
|
62
|
-
child.off('message', onMessageHandler);
|
63
|
-
child.off('close', onCloseHandler);
|
64
|
-
};
|
65
|
-
const onCloseHandler = (code, signal) => {
|
66
|
-
if (code > 128) {
|
67
|
-
code -= 128;
|
68
|
-
}
|
69
|
-
const msg = exitCodesErrors[code] || `Unknown exit code ${code}`;
|
70
|
-
reject(new Error(`Error initializing child: ${msg} and signal ${signal}`));
|
71
|
-
child.off('message', onMessageHandler);
|
72
|
-
child.off('close', onCloseHandler);
|
73
|
-
};
|
74
|
-
child.on('message', onMessageHandler);
|
75
|
-
child.on('close', onCloseHandler);
|
76
|
-
});
|
77
|
-
await parentSend(child, { cmd: ChildCommand.Init, value: processFile });
|
78
|
-
await onComplete;
|
79
|
-
}
|
80
4
|
export class ChildPool {
|
81
|
-
constructor(
|
82
|
-
this.masterFile = masterFile;
|
5
|
+
constructor({ mainFile = path.join(process.cwd(), 'dist/cjs/classes/main.js'), useWorkerThreads, }) {
|
83
6
|
this.retained = {};
|
84
7
|
this.free = {};
|
8
|
+
this.opts = { mainFile, useWorkerThreads };
|
85
9
|
}
|
86
10
|
async retain(processFile) {
|
87
|
-
|
88
|
-
let child = _this.getFree(processFile).pop();
|
11
|
+
let child = this.getFree(processFile).pop();
|
89
12
|
if (child) {
|
90
|
-
|
13
|
+
this.retained[child.pid] = child;
|
91
14
|
return child;
|
92
15
|
}
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
child.on('exit', _this.remove.bind(_this, child));
|
98
|
-
child.stdout.pipe(process.stdout);
|
99
|
-
child.stderr.pipe(process.stderr);
|
16
|
+
child = new Child(this.opts.mainFile, processFile, {
|
17
|
+
useWorkerThreads: this.opts.useWorkerThreads,
|
18
|
+
});
|
19
|
+
child.on('exit', this.remove.bind(this, child));
|
100
20
|
try {
|
101
|
-
await
|
21
|
+
await child.init();
|
22
|
+
this.retained[child.pid] = child;
|
102
23
|
return child;
|
103
24
|
}
|
104
25
|
catch (err) {
|
105
|
-
|
26
|
+
console.error(err);
|
27
|
+
this.release(child);
|
106
28
|
throw err;
|
107
29
|
}
|
108
30
|
}
|
@@ -120,7 +42,7 @@ export class ChildPool {
|
|
120
42
|
}
|
121
43
|
async kill(child, signal = 'SIGKILL') {
|
122
44
|
this.remove(child);
|
123
|
-
|
45
|
+
return child.kill(signal, CHILD_KILL_TIMEOUT);
|
124
46
|
}
|
125
47
|
async clean() {
|
126
48
|
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,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"}
|