@eggjs/cluster 3.0.1 → 3.1.0-beta.11
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/README.md +17 -21
- package/dist/agent_worker.d.ts +1 -0
- package/dist/agent_worker.js +55 -0
- package/dist/app_worker.d.ts +1 -0
- package/dist/app_worker.js +131 -0
- package/dist/dirname.js +11 -0
- package/dist/error/ClusterAgentWorkerError.d.ts +13 -0
- package/dist/error/ClusterAgentWorkerError.js +22 -0
- package/dist/error/ClusterWorkerExceptionError.d.ts +10 -0
- package/dist/error/ClusterWorkerExceptionError.js +17 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.js +24 -0
- package/dist/master.d.ts +96 -0
- package/dist/master.js +426 -0
- package/dist/utils/messenger.d.ts +96 -0
- package/dist/utils/messenger.js +144 -0
- package/dist/utils/mode/base/agent.d.ts +45 -0
- package/dist/utils/mode/base/agent.js +63 -0
- package/dist/utils/mode/base/app.d.ts +56 -0
- package/dist/utils/mode/base/app.js +77 -0
- package/dist/utils/mode/impl/process/agent.d.ts +22 -0
- package/dist/utils/mode/impl/process/agent.js +93 -0
- package/dist/utils/mode/impl/process/app.d.ts +12 -0
- package/dist/utils/mode/impl/process/app.js +117 -0
- package/dist/utils/mode/impl/worker_threads/agent.d.ts +22 -0
- package/dist/utils/mode/impl/worker_threads/agent.js +79 -0
- package/dist/utils/mode/impl/worker_threads/app.d.ts +13 -0
- package/dist/utils/mode/impl/worker_threads/app.js +128 -0
- package/dist/utils/options.d.ts +83 -0
- package/dist/utils/options.js +56 -0
- package/dist/utils/terminate.js +62 -0
- package/dist/utils/worker_manager.d.ts +32 -0
- package/dist/utils/worker_manager.js +68 -0
- package/package.json +41 -63
- package/dist/commonjs/agent_worker.d.ts +0 -1
- package/dist/commonjs/agent_worker.js +0 -69
- package/dist/commonjs/app_worker.d.ts +0 -1
- package/dist/commonjs/app_worker.js +0 -173
- package/dist/commonjs/dirname.d.ts +0 -1
- package/dist/commonjs/dirname.js +0 -17
- package/dist/commonjs/error/ClusterAgentWorkerError.d.ts +0 -10
- package/dist/commonjs/error/ClusterAgentWorkerError.js +0 -23
- package/dist/commonjs/error/ClusterWorkerExceptionError.d.ts +0 -7
- package/dist/commonjs/error/ClusterWorkerExceptionError.js +0 -18
- package/dist/commonjs/error/index.d.ts +0 -2
- package/dist/commonjs/error/index.js +0 -19
- package/dist/commonjs/index.d.ts +0 -17
- package/dist/commonjs/index.js +0 -37
- package/dist/commonjs/master.d.ts +0 -90
- package/dist/commonjs/master.js +0 -560
- package/dist/commonjs/package.json +0 -3
- package/dist/commonjs/utils/messenger.d.ts +0 -92
- package/dist/commonjs/utils/messenger.js +0 -186
- package/dist/commonjs/utils/mode/base/agent.d.ts +0 -38
- package/dist/commonjs/utils/mode/base/agent.js +0 -68
- package/dist/commonjs/utils/mode/base/app.d.ts +0 -48
- package/dist/commonjs/utils/mode/base/app.js +0 -83
- package/dist/commonjs/utils/mode/impl/process/agent.d.ts +0 -18
- package/dist/commonjs/utils/mode/impl/process/agent.js +0 -108
- package/dist/commonjs/utils/mode/impl/process/app.d.ts +0 -21
- package/dist/commonjs/utils/mode/impl/process/app.js +0 -127
- package/dist/commonjs/utils/mode/impl/worker_threads/agent.d.ts +0 -18
- package/dist/commonjs/utils/mode/impl/worker_threads/agent.js +0 -91
- package/dist/commonjs/utils/mode/impl/worker_threads/app.d.ts +0 -26
- package/dist/commonjs/utils/mode/impl/worker_threads/app.js +0 -142
- package/dist/commonjs/utils/options.d.ts +0 -80
- package/dist/commonjs/utils/options.js +0 -83
- package/dist/commonjs/utils/terminate.d.ts +0 -6
- package/dist/commonjs/utils/terminate.js +0 -89
- package/dist/commonjs/utils/worker_manager.d.ts +0 -25
- package/dist/commonjs/utils/worker_manager.js +0 -76
- package/dist/esm/agent_worker.d.ts +0 -1
- package/dist/esm/agent_worker.js +0 -67
- package/dist/esm/app_worker.d.ts +0 -1
- package/dist/esm/app_worker.js +0 -168
- package/dist/esm/dirname.d.ts +0 -1
- package/dist/esm/dirname.js +0 -11
- package/dist/esm/error/ClusterAgentWorkerError.d.ts +0 -10
- package/dist/esm/error/ClusterAgentWorkerError.js +0 -19
- package/dist/esm/error/ClusterWorkerExceptionError.d.ts +0 -7
- package/dist/esm/error/ClusterWorkerExceptionError.js +0 -14
- package/dist/esm/error/index.d.ts +0 -2
- package/dist/esm/error/index.js +0 -3
- package/dist/esm/index.d.ts +0 -17
- package/dist/esm/index.js +0 -19
- package/dist/esm/master.d.ts +0 -90
- package/dist/esm/master.js +0 -553
- package/dist/esm/package.json +0 -3
- package/dist/esm/utils/messenger.d.ts +0 -92
- package/dist/esm/utils/messenger.js +0 -179
- package/dist/esm/utils/mode/base/agent.d.ts +0 -38
- package/dist/esm/utils/mode/base/agent.js +0 -60
- package/dist/esm/utils/mode/base/app.d.ts +0 -48
- package/dist/esm/utils/mode/base/app.js +0 -75
- package/dist/esm/utils/mode/impl/process/agent.d.ts +0 -18
- package/dist/esm/utils/mode/impl/process/agent.js +0 -103
- package/dist/esm/utils/mode/impl/process/app.d.ts +0 -21
- package/dist/esm/utils/mode/impl/process/app.js +0 -119
- package/dist/esm/utils/mode/impl/worker_threads/agent.d.ts +0 -18
- package/dist/esm/utils/mode/impl/worker_threads/agent.js +0 -83
- package/dist/esm/utils/mode/impl/worker_threads/app.d.ts +0 -26
- package/dist/esm/utils/mode/impl/worker_threads/app.js +0 -137
- package/dist/esm/utils/options.d.ts +0 -80
- package/dist/esm/utils/options.js +0 -77
- package/dist/esm/utils/terminate.d.ts +0 -6
- package/dist/esm/utils/terminate.js +0 -86
- package/dist/esm/utils/worker_manager.d.ts +0 -25
- package/dist/esm/utils/worker_manager.js +0 -72
- package/dist/package.json +0 -4
- package/src/agent_worker.ts +0 -80
- package/src/app_worker.ts +0 -196
- package/src/dirname.ts +0 -11
- package/src/error/ClusterAgentWorkerError.ts +0 -19
- package/src/error/ClusterWorkerExceptionError.ts +0 -17
- package/src/error/index.ts +0 -2
- package/src/index.ts +0 -26
- package/src/master.ts +0 -658
- package/src/utils/messenger.ts +0 -207
- package/src/utils/mode/base/agent.ts +0 -90
- package/src/utils/mode/base/app.ts +0 -119
- package/src/utils/mode/impl/process/agent.ts +0 -119
- package/src/utils/mode/impl/process/app.ts +0 -140
- package/src/utils/mode/impl/worker_threads/agent.ts +0 -99
- package/src/utils/mode/impl/worker_threads/app.ts +0 -164
- package/src/utils/options.ts +0 -171
- package/src/utils/terminate.ts +0 -97
- package/src/utils/worker_manager.ts +0 -87
|
@@ -1,119 +0,0 @@
|
|
|
1
|
-
import cluster from 'node:cluster';
|
|
2
|
-
import { cfork } from 'cfork';
|
|
3
|
-
import { sendmessage } from 'sendmessage';
|
|
4
|
-
import { graceful as gracefulExit } from 'graceful-process';
|
|
5
|
-
import { BaseAppWorker, BaseAppUtils } from '../../base/app.js';
|
|
6
|
-
import { terminate } from '../../../terminate.js';
|
|
7
|
-
export class AppProcessWorker extends BaseAppWorker {
|
|
8
|
-
get id() {
|
|
9
|
-
return this.instance.id;
|
|
10
|
-
}
|
|
11
|
-
get workerId() {
|
|
12
|
-
return this.instance.process.pid;
|
|
13
|
-
}
|
|
14
|
-
get exitedAfterDisconnect() {
|
|
15
|
-
return this.instance.exitedAfterDisconnect;
|
|
16
|
-
}
|
|
17
|
-
get exitCode() {
|
|
18
|
-
return this.instance.process.exitCode;
|
|
19
|
-
}
|
|
20
|
-
send(message) {
|
|
21
|
-
sendmessage(this.instance, message);
|
|
22
|
-
}
|
|
23
|
-
clean() {
|
|
24
|
-
this.instance.removeAllListeners();
|
|
25
|
-
}
|
|
26
|
-
// static methods use on src/app_worker.ts
|
|
27
|
-
static get workerId() {
|
|
28
|
-
return process.pid;
|
|
29
|
-
}
|
|
30
|
-
static on(event, listener) {
|
|
31
|
-
process.on(event, listener);
|
|
32
|
-
}
|
|
33
|
-
static send(message) {
|
|
34
|
-
message.senderWorkerId = String(process.pid);
|
|
35
|
-
process.send(message);
|
|
36
|
-
}
|
|
37
|
-
static kill() {
|
|
38
|
-
process.exitCode = 1;
|
|
39
|
-
process.kill(process.pid);
|
|
40
|
-
}
|
|
41
|
-
static gracefulExit(options) {
|
|
42
|
-
gracefulExit(options);
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
export class AppProcessUtils extends BaseAppUtils {
|
|
46
|
-
fork() {
|
|
47
|
-
this.startTime = Date.now();
|
|
48
|
-
this.startSuccessCount = 0;
|
|
49
|
-
const args = [JSON.stringify(this.options)];
|
|
50
|
-
this.log('[master] start appWorker with args %j (process)', args);
|
|
51
|
-
cfork({
|
|
52
|
-
exec: this.getAppWorkerFile(),
|
|
53
|
-
args,
|
|
54
|
-
silent: false,
|
|
55
|
-
count: this.options.workers,
|
|
56
|
-
// don't refork in local env
|
|
57
|
-
refork: this.isProduction,
|
|
58
|
-
windowsHide: process.platform === 'win32',
|
|
59
|
-
});
|
|
60
|
-
let debugPort = process.debugPort;
|
|
61
|
-
cluster.on('fork', worker => {
|
|
62
|
-
const appWorker = new AppProcessWorker(worker);
|
|
63
|
-
this.emit('worker_forked', appWorker);
|
|
64
|
-
appWorker.disableRefork = true;
|
|
65
|
-
worker.on('message', msg => {
|
|
66
|
-
if (typeof msg === 'string') {
|
|
67
|
-
msg = {
|
|
68
|
-
action: msg,
|
|
69
|
-
data: msg,
|
|
70
|
-
};
|
|
71
|
-
}
|
|
72
|
-
msg.from = 'app';
|
|
73
|
-
this.messenger.send(msg);
|
|
74
|
-
});
|
|
75
|
-
this.log('[master] app_worker#%s:%s start, state: %s, current workers: %j', appWorker.id, appWorker.workerId, appWorker.state, Object.keys(cluster.workers));
|
|
76
|
-
// send debug message, due to `brk` scene, send here instead of app_worker.js
|
|
77
|
-
if (this.options.isDebug) {
|
|
78
|
-
debugPort++;
|
|
79
|
-
this.messenger.send({
|
|
80
|
-
to: 'parent',
|
|
81
|
-
from: 'app',
|
|
82
|
-
action: 'debug',
|
|
83
|
-
data: {
|
|
84
|
-
debugPort,
|
|
85
|
-
// keep compatibility, should use workerId instead
|
|
86
|
-
pid: appWorker.workerId,
|
|
87
|
-
workerId: appWorker.workerId,
|
|
88
|
-
},
|
|
89
|
-
});
|
|
90
|
-
}
|
|
91
|
-
});
|
|
92
|
-
cluster.on('disconnect', worker => {
|
|
93
|
-
const appWorker = new AppProcessWorker(worker);
|
|
94
|
-
this.log('[master] app_worker#%s:%s disconnect, suicide: %s, state: %s, current workers: %j', appWorker.id, appWorker.workerId, appWorker.exitedAfterDisconnect, appWorker.state, Object.keys(cluster.workers));
|
|
95
|
-
});
|
|
96
|
-
cluster.on('exit', (worker, code, signal) => {
|
|
97
|
-
const appWorker = new AppProcessWorker(worker);
|
|
98
|
-
this.messenger.send({
|
|
99
|
-
action: 'app-exit',
|
|
100
|
-
data: {
|
|
101
|
-
workerId: appWorker.workerId,
|
|
102
|
-
code,
|
|
103
|
-
signal,
|
|
104
|
-
},
|
|
105
|
-
to: 'master',
|
|
106
|
-
from: 'app',
|
|
107
|
-
});
|
|
108
|
-
});
|
|
109
|
-
return this;
|
|
110
|
-
}
|
|
111
|
-
async kill(timeout) {
|
|
112
|
-
await Promise.all(Object.keys(cluster.workers).map(id => {
|
|
113
|
-
const worker = cluster.workers[id];
|
|
114
|
-
Reflect.set(worker, 'disableRefork', true);
|
|
115
|
-
return terminate(worker.process, timeout);
|
|
116
|
-
}));
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL3V0aWxzL21vZGUvaW1wbC9wcm9jZXNzL2FwcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLE9BQWdELE1BQU0sY0FBYyxDQUFDO0FBQzVFLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDOUIsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUMxQyxPQUFPLEVBQUUsUUFBUSxJQUFJLFlBQVksRUFBdUMsTUFBTSxrQkFBa0IsQ0FBQztBQUNqRyxPQUFPLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUdsRCxNQUFNLE9BQU8sZ0JBQWlCLFNBQVEsYUFBbUM7SUFDdkUsSUFBSSxFQUFFO1FBQ0osT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRUQsSUFBSSxRQUFRO1FBQ1YsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFJLENBQUM7SUFDcEMsQ0FBQztJQUVELElBQUkscUJBQXFCO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxxQkFBcUIsQ0FBQztJQUM3QyxDQUFDO0lBRUQsSUFBSSxRQUFRO1FBQ1YsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxRQUFTLENBQUM7SUFDekMsQ0FBQztJQUVELElBQUksQ0FBQyxPQUFvQjtRQUN2QixXQUFXLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQsS0FBSztRQUNILElBQUksQ0FBQyxRQUFRLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztJQUNyQyxDQUFDO0lBRUQsMENBQTBDO0lBRTFDLE1BQU0sS0FBSyxRQUFR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
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import { type Worker } from 'node:worker_threads';
|
|
2
|
-
import { type Options as gracefulExitOptions } from 'graceful-process';
|
|
3
|
-
import { BaseAgentUtils, BaseAgentWorker } from '../../base/agent.js';
|
|
4
|
-
import type { MessageBody } from '../../../messenger.js';
|
|
5
|
-
export declare class AgentThreadWorker extends BaseAgentWorker<Worker> {
|
|
6
|
-
get workerId(): number;
|
|
7
|
-
send(message: MessageBody): void;
|
|
8
|
-
static send(message: MessageBody): void;
|
|
9
|
-
static kill(): void;
|
|
10
|
-
static gracefulExit(options: gracefulExitOptions): void;
|
|
11
|
-
}
|
|
12
|
-
export declare class AgentThreadUtils extends BaseAgentUtils {
|
|
13
|
-
#private;
|
|
14
|
-
instance: AgentThreadWorker;
|
|
15
|
-
fork(): void;
|
|
16
|
-
clean(): void;
|
|
17
|
-
kill(): Promise<void>;
|
|
18
|
-
}
|
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
import workerThreads from 'node:worker_threads';
|
|
2
|
-
import { BaseAgentUtils, BaseAgentWorker } from '../../base/agent.js';
|
|
3
|
-
import { ClusterAgentWorkerError } from '../../../../error/ClusterAgentWorkerError.js';
|
|
4
|
-
export class AgentThreadWorker extends BaseAgentWorker {
|
|
5
|
-
get workerId() {
|
|
6
|
-
return this.instance.threadId;
|
|
7
|
-
}
|
|
8
|
-
send(message) {
|
|
9
|
-
this.instance.postMessage(message);
|
|
10
|
-
}
|
|
11
|
-
static send(message) {
|
|
12
|
-
message.senderWorkerId = String(workerThreads.threadId);
|
|
13
|
-
workerThreads.parentPort.postMessage(message);
|
|
14
|
-
}
|
|
15
|
-
static kill() {
|
|
16
|
-
// in worker_threads, process.exit
|
|
17
|
-
// does not stop the whole program, just the single thread
|
|
18
|
-
process.exit(1);
|
|
19
|
-
}
|
|
20
|
-
static gracefulExit(options) {
|
|
21
|
-
const { beforeExit } = options;
|
|
22
|
-
process.on('exit', async (code) => {
|
|
23
|
-
if (typeof beforeExit === 'function') {
|
|
24
|
-
await beforeExit();
|
|
25
|
-
}
|
|
26
|
-
process.exit(code);
|
|
27
|
-
});
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
export class AgentThreadUtils extends BaseAgentUtils {
|
|
31
|
-
#worker;
|
|
32
|
-
#id = 0;
|
|
33
|
-
instance;
|
|
34
|
-
fork() {
|
|
35
|
-
this.startTime = Date.now();
|
|
36
|
-
// start agent worker
|
|
37
|
-
const argv = [JSON.stringify(this.options)];
|
|
38
|
-
const agentPath = this.getAgentWorkerFile();
|
|
39
|
-
const worker = this.#worker = new workerThreads.Worker(agentPath, { argv });
|
|
40
|
-
// wrap agent worker
|
|
41
|
-
const agentWorker = this.instance = new AgentThreadWorker(worker);
|
|
42
|
-
this.emit('agent_forked', agentWorker);
|
|
43
|
-
agentWorker.status = 'starting';
|
|
44
|
-
agentWorker.id = ++this.#id;
|
|
45
|
-
this.log('[master] agent_worker#%s:%s start with worker_threads', agentWorker.id, agentWorker.workerId);
|
|
46
|
-
worker.on('message', msg => {
|
|
47
|
-
if (typeof msg === 'string') {
|
|
48
|
-
msg = {
|
|
49
|
-
action: msg,
|
|
50
|
-
data: msg,
|
|
51
|
-
};
|
|
52
|
-
}
|
|
53
|
-
msg.from = 'agent';
|
|
54
|
-
this.messenger.send(msg);
|
|
55
|
-
});
|
|
56
|
-
worker.on('error', err => {
|
|
57
|
-
this.logger.error(new ClusterAgentWorkerError(agentWorker.id, agentWorker.workerId, agentWorker.status, err));
|
|
58
|
-
});
|
|
59
|
-
// agent exit message
|
|
60
|
-
worker.once('exit', (code, signal) => {
|
|
61
|
-
this.messenger.send({
|
|
62
|
-
action: 'agent-exit',
|
|
63
|
-
data: {
|
|
64
|
-
code,
|
|
65
|
-
signal,
|
|
66
|
-
},
|
|
67
|
-
to: 'master',
|
|
68
|
-
from: 'agent',
|
|
69
|
-
});
|
|
70
|
-
});
|
|
71
|
-
}
|
|
72
|
-
clean() {
|
|
73
|
-
this.#worker.removeAllListeners();
|
|
74
|
-
}
|
|
75
|
-
async kill() {
|
|
76
|
-
if (this.#worker) {
|
|
77
|
-
this.log(`[master] kill agent worker#${this.#id} (worker_threads) by worker.terminate()`);
|
|
78
|
-
this.clean();
|
|
79
|
-
await this.#worker.terminate();
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdlbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvdXRpbHMvbW9kZS9pbXBsL3dvcmtlcl90aHJlYWRzL2FnZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sYUFBOEIsTUFBTSxxQkFBcUIsQ0FBQztBQUVqRSxPQUFPLEVBQUUsY0FBYyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRXRFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDhDQUE4QyxDQUFDO0FBRXZGLE1BQU0sT0FBTyxpQkFBa0IsU0FBUSxlQUF1QjtJQUM1RCxJQUFJLFFBQVE7UUFDVixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDO0lBQ2hDLENBQUM7SUFFRCxJQUFJLENBQUMsT0FBb0I7UUFDdkIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVELE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBb0I7UUFDOUIsT0FBTyxDQUFDLGNBQWMsR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3hELGFBQWEsQ0FBQyxVQUFXLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFFRCxNQUFNLENBQUMsSUFBSTtRQUNULGtDQUFrQztRQUNsQywwREFBMEQ7UUFDMUQsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNsQixDQUFDO0lBRUQsTUFBTSxDQUFDLFlBQVksQ0FBQyxPQUE0QjtRQUM5QyxNQUFNLEVBQUUsVUFBVSxFQUFFLEdBQUcsT0FBTyxDQUFDO1FBQy9CLE9BQU8sQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBQyxJQUFJLEVBQUMsRUFBRTtZQUM5QixJQUFJLE9BQU8sVUFBVSxLQUFLLFVBQVUsRUFBRSxDQUFDO2dCQUNyQyxNQUFNLFVB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
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import { Worker as ThreadWorker } from 'node:worker_threads';
|
|
2
|
-
import type { Options as gracefulExitOptions } from 'graceful-process';
|
|
3
|
-
import { BaseAppWorker, BaseAppUtils } from '../../base/app.js';
|
|
4
|
-
import type { MessageBody } from '../../../messenger.js';
|
|
5
|
-
export declare class AppThreadWorker extends BaseAppWorker<ThreadWorker> {
|
|
6
|
-
#private;
|
|
7
|
-
constructor(instance: ThreadWorker, id: number);
|
|
8
|
-
get id(): number;
|
|
9
|
-
get workerId(): number;
|
|
10
|
-
get state(): string;
|
|
11
|
-
set state(val: string);
|
|
12
|
-
get exitedAfterDisconnect(): boolean;
|
|
13
|
-
get exitCode(): number;
|
|
14
|
-
send(message: MessageBody): void;
|
|
15
|
-
clean(): void;
|
|
16
|
-
static get workerId(): number;
|
|
17
|
-
static on(event: string, listener: (...args: any[]) => void): void;
|
|
18
|
-
static send(message: MessageBody): void;
|
|
19
|
-
static kill(): void;
|
|
20
|
-
static gracefulExit(options: gracefulExitOptions): void;
|
|
21
|
-
}
|
|
22
|
-
export declare class AppThreadUtils extends BaseAppUtils {
|
|
23
|
-
#private;
|
|
24
|
-
fork(): this;
|
|
25
|
-
kill(): Promise<void>;
|
|
26
|
-
}
|
|
@@ -1,137 +0,0 @@
|
|
|
1
|
-
import { setTimeout as sleep } from 'node:timers/promises';
|
|
2
|
-
import { Worker as ThreadWorker, threadId, parentPort } from 'node:worker_threads';
|
|
3
|
-
import { BaseAppWorker, BaseAppUtils } from '../../base/app.js';
|
|
4
|
-
export class AppThreadWorker extends BaseAppWorker {
|
|
5
|
-
#state = 'none';
|
|
6
|
-
#id;
|
|
7
|
-
constructor(instance, id) {
|
|
8
|
-
super(instance);
|
|
9
|
-
this.#id = id;
|
|
10
|
-
}
|
|
11
|
-
get id() {
|
|
12
|
-
return this.#id;
|
|
13
|
-
}
|
|
14
|
-
get workerId() {
|
|
15
|
-
return this.instance.threadId;
|
|
16
|
-
}
|
|
17
|
-
get state() {
|
|
18
|
-
return this.#state;
|
|
19
|
-
}
|
|
20
|
-
set state(val) {
|
|
21
|
-
this.#state = val;
|
|
22
|
-
}
|
|
23
|
-
get exitedAfterDisconnect() {
|
|
24
|
-
return true;
|
|
25
|
-
}
|
|
26
|
-
get exitCode() {
|
|
27
|
-
return 0;
|
|
28
|
-
// return this.instance.exitCode;
|
|
29
|
-
}
|
|
30
|
-
send(message) {
|
|
31
|
-
this.instance.postMessage(message);
|
|
32
|
-
}
|
|
33
|
-
clean() {
|
|
34
|
-
this.instance.removeAllListeners();
|
|
35
|
-
}
|
|
36
|
-
// static methods use on src/app_worker.ts
|
|
37
|
-
static get workerId() {
|
|
38
|
-
return threadId;
|
|
39
|
-
}
|
|
40
|
-
static on(event, listener) {
|
|
41
|
-
parentPort.on(event, listener);
|
|
42
|
-
}
|
|
43
|
-
static send(message) {
|
|
44
|
-
message.senderWorkerId = String(threadId);
|
|
45
|
-
parentPort.postMessage(message);
|
|
46
|
-
}
|
|
47
|
-
static kill() {
|
|
48
|
-
process.exit(1);
|
|
49
|
-
}
|
|
50
|
-
static gracefulExit(options) {
|
|
51
|
-
process.on('exit', async (code) => {
|
|
52
|
-
if (typeof options.beforeExit === 'function') {
|
|
53
|
-
await options.beforeExit();
|
|
54
|
-
}
|
|
55
|
-
process.exit(code);
|
|
56
|
-
});
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
export class AppThreadUtils extends BaseAppUtils {
|
|
60
|
-
#workers = [];
|
|
61
|
-
#forkSingle(appPath, options, id) {
|
|
62
|
-
// start app worker
|
|
63
|
-
const worker = new ThreadWorker(appPath, options);
|
|
64
|
-
this.#workers.push(worker);
|
|
65
|
-
// wrap app worker
|
|
66
|
-
const appWorker = new AppThreadWorker(worker, id);
|
|
67
|
-
this.emit('worker_forked', appWorker);
|
|
68
|
-
appWorker.disableRefork = true;
|
|
69
|
-
worker.on('message', (msg) => {
|
|
70
|
-
if (typeof msg === 'string') {
|
|
71
|
-
msg = {
|
|
72
|
-
action: msg,
|
|
73
|
-
data: msg,
|
|
74
|
-
};
|
|
75
|
-
}
|
|
76
|
-
msg.from = 'app';
|
|
77
|
-
this.messenger.send(msg);
|
|
78
|
-
});
|
|
79
|
-
this.log('[master] app_worker#%s (tid:%s) start', appWorker.id, appWorker.workerId);
|
|
80
|
-
// send debug message, due to `brk` scene, send here instead of app_worker.js
|
|
81
|
-
let debugPort = process.debugPort;
|
|
82
|
-
if (this.options.isDebug) {
|
|
83
|
-
debugPort++;
|
|
84
|
-
this.messenger.send({
|
|
85
|
-
to: 'parent',
|
|
86
|
-
from: 'app',
|
|
87
|
-
action: 'debug',
|
|
88
|
-
data: {
|
|
89
|
-
debugPort,
|
|
90
|
-
pid: appWorker.workerId,
|
|
91
|
-
workerId: appWorker.workerId,
|
|
92
|
-
},
|
|
93
|
-
});
|
|
94
|
-
}
|
|
95
|
-
// handle worker exit
|
|
96
|
-
worker.on('exit', async (code) => {
|
|
97
|
-
appWorker.state = 'dead';
|
|
98
|
-
this.messenger.send({
|
|
99
|
-
action: 'app-exit',
|
|
100
|
-
data: {
|
|
101
|
-
workerId: appWorker.workerId,
|
|
102
|
-
code,
|
|
103
|
-
},
|
|
104
|
-
to: 'master',
|
|
105
|
-
from: 'app',
|
|
106
|
-
});
|
|
107
|
-
// refork app worker
|
|
108
|
-
await sleep(1000);
|
|
109
|
-
this.#forkSingle(appPath, options, id);
|
|
110
|
-
});
|
|
111
|
-
}
|
|
112
|
-
fork() {
|
|
113
|
-
this.startTime = Date.now();
|
|
114
|
-
this.startSuccessCount = 0;
|
|
115
|
-
const ports = this.options.ports ?? [];
|
|
116
|
-
if (!ports.length) {
|
|
117
|
-
ports.push(this.options.port);
|
|
118
|
-
}
|
|
119
|
-
this.options.workers = ports.length;
|
|
120
|
-
let i = 0;
|
|
121
|
-
do {
|
|
122
|
-
const options = Object.assign({}, this.options, { port: ports[i] });
|
|
123
|
-
const argv = [JSON.stringify(options)];
|
|
124
|
-
this.#forkSingle(this.getAppWorkerFile(), { argv }, ++i);
|
|
125
|
-
} while (i < ports.length);
|
|
126
|
-
return this;
|
|
127
|
-
}
|
|
128
|
-
async kill() {
|
|
129
|
-
for (const worker of this.#workers) {
|
|
130
|
-
const id = Reflect.get(worker, 'id');
|
|
131
|
-
this.log(`[master] kill app worker#${id} (worker_threads) by worker.terminate()`);
|
|
132
|
-
worker.removeAllListeners();
|
|
133
|
-
worker.terminate();
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL3V0aWxzL21vZGUvaW1wbC93b3JrZXJfdGhyZWFkcy9hcHAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsSUFBSSxLQUFLLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUMzRCxPQUFPLEVBQUUsTUFBTSxJQUFJLFlBQVksRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFzQixNQUFNLHFCQUFxQixDQUFDO0FBRXZHLE9BQU8sRUFBRSxhQUFhLEVBQUUsWUFBWSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFHaEUsTUFBTSxPQUFPLGVBQWdCLFNBQVEsYUFBMkI7SUFDOUQsTUFBTSxHQUFHLE1BQU0sQ0FBQztJQUNoQixHQUFHLENBQVM7SUFFWixZQUFZLFFBQXNCLEVBQUUsRUFBVTtRQUM1QyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDaEIsSUFBSSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUM7SUFDaEIsQ0FBQztJQUVELElBQUksRUFBRTtRQUNKLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQztJQUNsQixDQUFDO0lBRUQsSUFBSSxRQUFRO1FBQ1YsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQztJQUNoQyxDQUFDO0lBRUQsSUFBSSxLQUFLO1FBQ1AsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3JCLENBQUM7SUFFRCxJQUFJLEtBQUssQ0FBQyxHQUFHO1FBQ1gsSUFBSSxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUM7SUFDcEIsQ0FBQztJQUVELElBQUkscUJBQXFCO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELElBQUksUUFBUTtRQUNWLE9BQU8sQ0FBQyxDQUFDO1FBQ1QsaUNBQWlDO0lBQ25DLENBQUM7SUFFRCxJQUFJLENBQUMsT0FBb0I7UUFDdkIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVELEtBQUs7UUFDSCxJQUFJLENBQUMsUUFBUSxDQUFDLGtCQUFrQixFQUFFLENBQUM7SUFDckMsQ0FBQztJQUVELDBDQUEwQztJQUUxQyxNQUFNLEtBQUssUUFBUTtRQUNqQixPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBRUQsTUFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFhLEVBQUUsUUFBa0M7UUFDekQsVUFBVyxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVELE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBb0I7UUFDOUIsT0FBTyxDQUFDLGNBQWMsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDMUMsVUFBVyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQsTUFBTSxDQUFDLElBQUk7UUFDVCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xCLENBQUM7SUFFRCxNQUFNLENBQUMsWUFBWSxDQUFDLE9BQTRCO1FBQzlDLE9BQU8sQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBQyxJQUFJLEVBQUMsRUFBRTtZQUM5QixJQUFJLE9BQU8sT0FBTyxDQUFDLFVBQVUsS0FBSyxVQUFVLEVBQUUsQ0FBQztnQkFDN0MsTUFBTSxPQUFPLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDN0IsQ0FBQztZQUNELE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDckIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0Y7QUFFRCxNQUFNLE9BQU8sY0FBZSxTQUFRLFlBQVk7SUFDOUMsUUFBUSxHQUFtQixFQUFFLENBQUM7SUFFOUIsV0FBVyxDQUFDLE9BQWUsRUFBRSxPQUFzQixFQUFFLEVBQVU7UUFDN0QsbUJBQW1CO1FBQ25CLE1BQU0sTUFBTSxHQUFHLElBQUksWUFBWSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNsRCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUUzQixrQkFBa0I7UUFDbEIsTUFBTSxTQUFTLEdBQUcsSUFBSSxlQUFlLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2xELElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ3RDLFNBQVMsQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO1FBQy9CLE1BQU0sQ0FBQyxFQUFFLENBQUMsU0FBUyxFQUFFLENBQUMsR0FBZ0IsRUFBRSxFQUFFO1lBQ3hDLElBQUksT0FBTyxHQUFHLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQzVCLEdBQUcsR0FBRztvQkFDSixNQUFNLEVBQUUsR0FBRztvQkFDWCxJQUFJLEVBQUUsR0FBRztpQkFDVixDQUFDO1lBQ0osQ0FBQztZQUNELEdBQUcsQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDO1lBQ2pCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzNCLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLEdBQUcsQ0FBQyx1Q0FBdUMsRUFBRSxTQUFTLENBQUMsRUFBRSxFQUFFLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUVwRiw2RUFBNkU7UUFDN0UsSUFBSSxTQUFTLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQztRQUNsQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDekIsU0FBUyxFQUFFLENBQUM7WUFDWixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQztnQkFDbEIsRUFBRSxFQUFFLFFBQVE7Z0JBQ1osSUFBSSxFQUFFLEtBQUs7Z0JBQ1gsTUFBTSxFQUFFLE9BQU87Z0JBQ2YsSUFBSSxFQUFFO29CQUNKLFNBQVM7b0JBQ1QsR0FBRyxFQUFFLFNBQVMsQ0FBQyxRQUFRO29CQUN2QixRQUFRLEVBQUUsU0FBUyxDQUFDLFFBQVE7aUJBQzdCO2FBQ0YsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUVELHFCQUFxQjtRQUNyQixNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUMsSUFBSSxFQUFDLEVBQUU7WUFDN0IsU0FBUyxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUM7WUFDekIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUM7Z0JBQ2xCLE1BQU0sRUFBRSxVQUFVO2dCQUNsQixJQUFJLEVBQUU7b0JBQ0osUUFBUSxFQUFFLFNBQVMsQ0FBQyxRQUFRO29CQUM1QixJQUFJO2lCQUNMO2dCQUNELEVBQUUsRUFBRSxRQUFRO2dCQUNaLElBQUksRUFBRSxLQUFLO2FBQ1osQ0FBQyxDQUFDO1lBRUgsb0JBQW9CO1lBQ3BCLE1BQU0sS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2xCLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQztRQUN6QyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxJQUFJO1FBQ0YsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDNUIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLENBQUMsQ0FBQztRQUUzQixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUM7UUFDdkMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNsQixLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSyxDQUFDLENBQUM7UUFDakMsQ0FBQztRQUNELElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7UUFDcEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ1YsR0FBRyxDQUFDO1lBQ0YsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3BFLE1BQU0sSUFBSSxHQUFHLENBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBRSxDQUFDO1lBQ3pDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzNELENBQUMsUUFBUSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRTtRQUUzQixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxLQUFLLENBQUMsSUFBSTtRQUNSLEtBQUssTUFBTSxNQUFNLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ25DLE1BQU0sRUFBRSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3JDLElBQUksQ0FBQyxHQUFHLENBQUMsNEJBQTRCLEVBQUUseUNBQXlDLENBQUMsQ0FBQztZQUNsRixNQUFNLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUM1QixNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDckIsQ0FBQztJQUNILENBQUM7Q0FDRiJ9
|
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
import { SecureContextOptions } from 'node:tls';
|
|
2
|
-
export interface ClusterHTTPSSecureOptions {
|
|
3
|
-
key: SecureContextOptions['key'];
|
|
4
|
-
cert: SecureContextOptions['cert'];
|
|
5
|
-
ca?: SecureContextOptions['ca'];
|
|
6
|
-
passphrase?: SecureContextOptions['passphrase'];
|
|
7
|
-
}
|
|
8
|
-
export type ClusterStartMode = 'process' | 'worker_threads';
|
|
9
|
-
/** Cluster start options */
|
|
10
|
-
export interface ClusterOptions {
|
|
11
|
-
/**
|
|
12
|
-
* specify framework that can be absolute path or npm package
|
|
13
|
-
*/
|
|
14
|
-
framework?: string;
|
|
15
|
-
/**
|
|
16
|
-
* @deprecated please use framework instead
|
|
17
|
-
*/
|
|
18
|
-
customEgg?: string;
|
|
19
|
-
/** directory of application, default to `process.cwd()` */
|
|
20
|
-
baseDir?: string;
|
|
21
|
-
/**
|
|
22
|
-
* numbers of app workers, default to `os.cpus().length`
|
|
23
|
-
*/
|
|
24
|
-
workers?: number | string;
|
|
25
|
-
/**
|
|
26
|
-
* listening port, default to `7001`(http) or `8443`(https)
|
|
27
|
-
*/
|
|
28
|
-
port?: number | string | null;
|
|
29
|
-
/**
|
|
30
|
-
* listening a debug port on http protocol
|
|
31
|
-
*/
|
|
32
|
-
debugPort?: number;
|
|
33
|
-
/**
|
|
34
|
-
* https options, { key, cert, ca }, full path
|
|
35
|
-
*/
|
|
36
|
-
https?: ClusterHTTPSSecureOptions | boolean;
|
|
37
|
-
/**
|
|
38
|
-
* @deprecated please use `options.https.key` instead
|
|
39
|
-
*/
|
|
40
|
-
key?: ClusterHTTPSSecureOptions['key'];
|
|
41
|
-
/**
|
|
42
|
-
* @deprecated please use `options.https.cert` instead
|
|
43
|
-
*/
|
|
44
|
-
cert?: ClusterHTTPSSecureOptions['cert'];
|
|
45
|
-
/**
|
|
46
|
-
* will inject into worker/agent process
|
|
47
|
-
*/
|
|
48
|
-
require?: string | string[];
|
|
49
|
-
/**
|
|
50
|
-
* will save master pid to this file
|
|
51
|
-
*/
|
|
52
|
-
pidFile?: string;
|
|
53
|
-
/**
|
|
54
|
-
* custom env, default is `process.env.EGG_SERVER_ENV`
|
|
55
|
-
*/
|
|
56
|
-
env?: string;
|
|
57
|
-
/**
|
|
58
|
-
* default is `'process'`, use `'worker_threads'` to start the app & agent worker by worker_threads
|
|
59
|
-
*/
|
|
60
|
-
startMode?: ClusterStartMode;
|
|
61
|
-
/**
|
|
62
|
-
* startup port of each app worker, such as: `[7001, 7002, 7003]`, only effects when the startMode is `'worker_threads'`
|
|
63
|
-
*/
|
|
64
|
-
ports?: number[];
|
|
65
|
-
/**
|
|
66
|
-
* sticky mode server
|
|
67
|
-
*/
|
|
68
|
-
sticky?: boolean;
|
|
69
|
-
/** customized plugins, for unittest */
|
|
70
|
-
plugins?: object;
|
|
71
|
-
isDebug?: boolean;
|
|
72
|
-
}
|
|
73
|
-
export interface ParsedClusterOptions extends ClusterOptions {
|
|
74
|
-
port?: number;
|
|
75
|
-
baseDir: string;
|
|
76
|
-
workers: number;
|
|
77
|
-
framework: string;
|
|
78
|
-
startMode: ClusterStartMode;
|
|
79
|
-
}
|
|
80
|
-
export declare function parseOptions(options?: ClusterOptions): Promise<ParsedClusterOptions>;
|
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
import os from 'node:os';
|
|
2
|
-
import fs from 'node:fs';
|
|
3
|
-
import path from 'node:path';
|
|
4
|
-
import assert from 'node:assert';
|
|
5
|
-
import { getFrameworkPath, importModule } from '@eggjs/utils';
|
|
6
|
-
export async function parseOptions(options) {
|
|
7
|
-
options = {
|
|
8
|
-
baseDir: process.cwd(),
|
|
9
|
-
port: options?.https ? 8443 : undefined,
|
|
10
|
-
startMode: 'process',
|
|
11
|
-
// ports: [],
|
|
12
|
-
env: process.env.EGG_SERVER_ENV,
|
|
13
|
-
...options,
|
|
14
|
-
};
|
|
15
|
-
const pkgPath = path.join(options.baseDir, 'package.json');
|
|
16
|
-
assert(fs.existsSync(pkgPath), `${pkgPath} should exist`);
|
|
17
|
-
options.framework = getFrameworkPath({
|
|
18
|
-
baseDir: options.baseDir,
|
|
19
|
-
// compatible customEgg only when call startCluster directly without framework
|
|
20
|
-
framework: options.framework ?? options.customEgg,
|
|
21
|
-
});
|
|
22
|
-
const egg = await importModule(options.framework, {
|
|
23
|
-
paths: [options.baseDir],
|
|
24
|
-
});
|
|
25
|
-
assert(egg.Application, `should define Application in ${options.framework}`);
|
|
26
|
-
assert(egg.Agent, `should define Agent in ${options.framework}`);
|
|
27
|
-
if (options.https === true) {
|
|
28
|
-
// Keep compatible options.key, options.cert
|
|
29
|
-
console.warn('[@eggjs/cluster:deprecated] [master] Please use `https: { key, cert, ca }` instead of `https: true`');
|
|
30
|
-
options.https = {
|
|
31
|
-
key: options.key,
|
|
32
|
-
cert: options.cert,
|
|
33
|
-
};
|
|
34
|
-
}
|
|
35
|
-
// https
|
|
36
|
-
if (options.https) {
|
|
37
|
-
assert(options.https.key, 'options.https.key should exists');
|
|
38
|
-
if (typeof options.https.key === 'string') {
|
|
39
|
-
assert(fs.existsSync(options.https.key), 'options.https.key file should exists');
|
|
40
|
-
}
|
|
41
|
-
assert(options.https.cert, 'options.https.cert should exists');
|
|
42
|
-
if (typeof options.https.cert === 'string') {
|
|
43
|
-
assert(fs.existsSync(options.https.cert), 'options.https.cert file should exists');
|
|
44
|
-
}
|
|
45
|
-
if (typeof options.https.ca === 'string') {
|
|
46
|
-
assert(fs.existsSync(options.https.ca), 'options.https.ca file should exists');
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
if (options.port && typeof options.port === 'string') {
|
|
50
|
-
options.port = parseInt(options.port);
|
|
51
|
-
}
|
|
52
|
-
if (options.port === null) {
|
|
53
|
-
options.port = undefined;
|
|
54
|
-
}
|
|
55
|
-
if (options.workers && typeof options.workers === 'string') {
|
|
56
|
-
options.workers = parseInt(options.workers);
|
|
57
|
-
}
|
|
58
|
-
if (!options.workers) {
|
|
59
|
-
options.workers = os.cpus().length;
|
|
60
|
-
}
|
|
61
|
-
if (options.require) {
|
|
62
|
-
if (typeof options.require === 'string') {
|
|
63
|
-
options.require = [options.require];
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
// don't print deprecated message in production env.
|
|
67
|
-
// it will print to stderr.
|
|
68
|
-
if (process.env.NODE_ENV === 'production') {
|
|
69
|
-
process.env.NO_DEPRECATION = '*';
|
|
70
|
-
}
|
|
71
|
-
const isDebug = process.execArgv.some(argv => argv.includes('--debug') || argv.includes('--inspect'));
|
|
72
|
-
if (isDebug) {
|
|
73
|
-
options.isDebug = isDebug;
|
|
74
|
-
}
|
|
75
|
-
return options;
|
|
76
|
-
}
|
|
77
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3B0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy9vcHRpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUN6QixPQUFPLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDekIsT0FBTyxJQUFJLE1BQU0sV0FBVyxDQUFDO0FBQzdCLE9BQU8sTUFBTSxNQUFNLGFBQWEsQ0FBQztBQUVqQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsWUFBWSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBb0Y5RCxNQUFNLENBQUMsS0FBSyxVQUFVLFlBQVksQ0FBQyxPQUF3QjtJQUN6RCxPQUFPLEdBQUc7UUFDUixPQUFPLEVBQUUsT0FBTyxDQUFDLEdBQUcsRUFBRTtRQUN0QixJQUFJLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTO1FBQ3ZDLFNBQVMsRUFBRSxTQUFTO1FBQ3BCLGFBQWE7UUFDYixHQUFHLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjO1FBQy9CLEdBQUcsT0FBTztLQUNYLENBQUM7SUFFRixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFRLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFDNUQsTUFBTSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEVBQUUsR0FBRyxPQUFPLGVBQWUsQ0FBQyxDQUFDO0lBRTFELE9BQU8sQ0FBQyxTQUFTLEdBQUcsZ0JBQWdCLENBQUM7UUFDbkMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxPQUFRO1FBQ3pCLDhFQUE4RTtRQUM5RSxTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVMsSUFBSSxPQUFPLENBQUMsU0FBUztLQUNsRCxDQUFDLENBQUM7SUFFSCxNQUFNLEdBQUcsR0FBRyxNQUFNLFlBQVksQ0FBQyxPQUFPLENBQUMs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
|
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
import { debuglog } from 'node:util';
|
|
2
|
-
import { setTimeout as sleep } from 'node:timers/promises';
|
|
3
|
-
import { once } from 'node:events';
|
|
4
|
-
import { pstree } from '@fengmk2/ps-tree';
|
|
5
|
-
const debug = debuglog('@eggjs/cluster/utils/terminate');
|
|
6
|
-
export async function terminate(subProcess, timeout) {
|
|
7
|
-
const pid = subProcess.process?.pid ?? subProcess.pid;
|
|
8
|
-
const childPids = await getChildPids(pid);
|
|
9
|
-
await Promise.all([
|
|
10
|
-
killProcess(subProcess, timeout),
|
|
11
|
-
killChildren(childPids, timeout),
|
|
12
|
-
]);
|
|
13
|
-
}
|
|
14
|
-
// kill process, if SIGTERM not work, try SIGKILL
|
|
15
|
-
async function killProcess(subProcess, timeout) {
|
|
16
|
-
// https://github.com/nodejs/node/pull/34312
|
|
17
|
-
(subProcess.process ?? subProcess).kill('SIGTERM');
|
|
18
|
-
await Promise.race([
|
|
19
|
-
once(subProcess, 'exit'),
|
|
20
|
-
sleep(timeout),
|
|
21
|
-
]);
|
|
22
|
-
if (subProcess.killed) {
|
|
23
|
-
return;
|
|
24
|
-
}
|
|
25
|
-
// SIGKILL: http://man7.org/linux/man-pages/man7/signal.7.html
|
|
26
|
-
// worker: https://github.com/nodejs/node/blob/master/lib/internal/cluster/worker.js#L22
|
|
27
|
-
// subProcess.kill is wrapped to subProcess.destroy, it will wait to disconnected.
|
|
28
|
-
(subProcess.process ?? subProcess).kill('SIGKILL');
|
|
29
|
-
}
|
|
30
|
-
// kill all children processes, if SIGTERM not work, try SIGKILL
|
|
31
|
-
async function killChildren(childrenPids, timeout) {
|
|
32
|
-
if (childrenPids.length === 0) {
|
|
33
|
-
return;
|
|
34
|
-
}
|
|
35
|
-
kill(childrenPids, 'SIGTERM');
|
|
36
|
-
const start = Date.now();
|
|
37
|
-
// if timeout is 1000, it will check twice.
|
|
38
|
-
const checkInterval = 400;
|
|
39
|
-
let unterminated = [];
|
|
40
|
-
while (Date.now() - start < timeout - checkInterval) {
|
|
41
|
-
await sleep(checkInterval);
|
|
42
|
-
unterminated = getUnterminatedProcesses(childrenPids);
|
|
43
|
-
if (unterminated.length === 0) {
|
|
44
|
-
return;
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
kill(unterminated, 'SIGKILL');
|
|
48
|
-
}
|
|
49
|
-
async function getChildPids(pid) {
|
|
50
|
-
let childrenPids = [];
|
|
51
|
-
try {
|
|
52
|
-
const children = await pstree(pid);
|
|
53
|
-
childrenPids = children.map(c => parseInt(c.PID));
|
|
54
|
-
}
|
|
55
|
-
catch (err) {
|
|
56
|
-
// if get children error, just ignore it
|
|
57
|
-
debug('pstree %s error: %s, ignore it', pid, err);
|
|
58
|
-
}
|
|
59
|
-
return childrenPids;
|
|
60
|
-
}
|
|
61
|
-
function kill(pids, signal) {
|
|
62
|
-
for (const pid of pids) {
|
|
63
|
-
try {
|
|
64
|
-
process.kill(pid, signal);
|
|
65
|
-
}
|
|
66
|
-
catch (err) {
|
|
67
|
-
// ignore
|
|
68
|
-
debug('kill %s error: %s, signal: %s, ignore it', pid, err, signal);
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
function getUnterminatedProcesses(pids) {
|
|
73
|
-
return pids.filter(pid => {
|
|
74
|
-
try {
|
|
75
|
-
// success means it's still alive
|
|
76
|
-
process.kill(pid, 0);
|
|
77
|
-
return true;
|
|
78
|
-
}
|
|
79
|
-
catch (err) {
|
|
80
|
-
// error means it's dead
|
|
81
|
-
debug('kill %s error: %s, it still alive', pid, err);
|
|
82
|
-
return false;
|
|
83
|
-
}
|
|
84
|
-
});
|
|
85
|
-
}
|
|
86
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVybWluYXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3V0aWxzL3Rlcm1pbmF0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3JDLE9BQU8sRUFBRSxVQUFVLElBQUksS0FBSyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDM0QsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUVuQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFMUMsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLGdDQUFnQyxDQUFDLENBQUM7QUFNekQsTUFBTSxDQUFDLEtBQUssVUFBVSxTQUFTLENBQUMsVUFBc0IsRUFBRSxPQUFlO0lBQ3JFLE1BQU0sR0FBRyxHQUFHLFVBQVUsQ0FBQyxPQUFPLEVBQUUsR0FBRyxJQUFJLFVBQVUsQ0FBQyxHQUFHLENBQUM7SUFDdEQsTUFBTSxTQUFTLEdBQUcsTUFBTSxZQUFZLENBQUMsR0FBSSxDQUFDLENBQUM7SUFDM0MsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDO1FBQ2hCLFdBQVcsQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDO1FBQ2hDLFlBQVksQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDO0tBQ2pDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRCxpREFBaUQ7QUFDakQsS0FBSyxVQUFVLFdBQVcsQ0FBQyxVQUFzQixFQUFFLE9BQWU7SUFDaEUsNENBQTRDO0lBQzVDLENBQUMsVUFBVSxDQUFDLE9BQU8sSUFBSSxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDbkQsTUFBTSxPQUFPLENBQUMsSUFBSSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDO1FBQ3hCLEtBQUssQ0FBQyxPQUFPLENBQUM7S0FDZixDQUFDLENBQUM7SUFDSCxJ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
|