@eggjs/cluster 3.0.0 → 3.1.0-beta.10
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/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 +39 -63
- package/dist/commonjs/agent_worker.d.ts +0 -1
- package/dist/commonjs/agent_worker.js +0 -65
- package/dist/commonjs/app_worker.d.ts +0 -1
- package/dist/commonjs/app_worker.js +0 -169
- 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 -81
- 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 -63
- package/dist/esm/app_worker.d.ts +0 -1
- package/dist/esm/app_worker.js +0 -164
- 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 -75
- 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 -75
- package/src/app_worker.ts +0 -191
- 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 -169
- package/src/utils/terminate.ts +0 -97
- package/src/utils/worker_manager.ts +0 -87
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import { type Worker as ClusterProcessWorker } from 'node:cluster';
|
|
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 AppProcessWorker extends BaseAppWorker<ClusterProcessWorker> {
|
|
6
|
-
get id(): number;
|
|
7
|
-
get workerId(): number;
|
|
8
|
-
get exitedAfterDisconnect(): boolean;
|
|
9
|
-
get exitCode(): number;
|
|
10
|
-
send(message: MessageBody): void;
|
|
11
|
-
clean(): void;
|
|
12
|
-
static get workerId(): number;
|
|
13
|
-
static on(event: string, listener: (...args: any[]) => void): void;
|
|
14
|
-
static send(message: MessageBody): void;
|
|
15
|
-
static kill(): void;
|
|
16
|
-
static gracefulExit(options: gracefulExitOptions): void;
|
|
17
|
-
}
|
|
18
|
-
export declare class AppProcessUtils extends BaseAppUtils {
|
|
19
|
-
fork(): this;
|
|
20
|
-
kill(timeout: number): Promise<void>;
|
|
21
|
-
}
|
|
@@ -1,127 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.AppProcessUtils = exports.AppProcessWorker = void 0;
|
|
7
|
-
const node_cluster_1 = __importDefault(require("node:cluster"));
|
|
8
|
-
const cfork_1 = require("cfork");
|
|
9
|
-
const sendmessage_1 = require("sendmessage");
|
|
10
|
-
const graceful_process_1 = require("graceful-process");
|
|
11
|
-
const app_js_1 = require("../../base/app.js");
|
|
12
|
-
const terminate_js_1 = require("../../../terminate.js");
|
|
13
|
-
class AppProcessWorker extends app_js_1.BaseAppWorker {
|
|
14
|
-
get id() {
|
|
15
|
-
return this.instance.id;
|
|
16
|
-
}
|
|
17
|
-
get workerId() {
|
|
18
|
-
return this.instance.process.pid;
|
|
19
|
-
}
|
|
20
|
-
get exitedAfterDisconnect() {
|
|
21
|
-
return this.instance.exitedAfterDisconnect;
|
|
22
|
-
}
|
|
23
|
-
get exitCode() {
|
|
24
|
-
return this.instance.process.exitCode;
|
|
25
|
-
}
|
|
26
|
-
send(message) {
|
|
27
|
-
(0, sendmessage_1.sendmessage)(this.instance, message);
|
|
28
|
-
}
|
|
29
|
-
clean() {
|
|
30
|
-
this.instance.removeAllListeners();
|
|
31
|
-
}
|
|
32
|
-
// static methods use on src/app_worker.ts
|
|
33
|
-
static get workerId() {
|
|
34
|
-
return process.pid;
|
|
35
|
-
}
|
|
36
|
-
static on(event, listener) {
|
|
37
|
-
process.on(event, listener);
|
|
38
|
-
}
|
|
39
|
-
static send(message) {
|
|
40
|
-
message.senderWorkerId = String(process.pid);
|
|
41
|
-
process.send(message);
|
|
42
|
-
}
|
|
43
|
-
static kill() {
|
|
44
|
-
process.exitCode = 1;
|
|
45
|
-
process.kill(process.pid);
|
|
46
|
-
}
|
|
47
|
-
static gracefulExit(options) {
|
|
48
|
-
(0, graceful_process_1.graceful)(options);
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
exports.AppProcessWorker = AppProcessWorker;
|
|
52
|
-
class AppProcessUtils extends app_js_1.BaseAppUtils {
|
|
53
|
-
fork() {
|
|
54
|
-
this.startTime = Date.now();
|
|
55
|
-
this.startSuccessCount = 0;
|
|
56
|
-
const args = [JSON.stringify(this.options)];
|
|
57
|
-
this.log('[master] start appWorker with args %j (process)', args);
|
|
58
|
-
(0, cfork_1.cfork)({
|
|
59
|
-
exec: this.getAppWorkerFile(),
|
|
60
|
-
args,
|
|
61
|
-
silent: false,
|
|
62
|
-
count: this.options.workers,
|
|
63
|
-
// don't refork in local env
|
|
64
|
-
refork: this.isProduction,
|
|
65
|
-
windowsHide: process.platform === 'win32',
|
|
66
|
-
});
|
|
67
|
-
let debugPort = process.debugPort;
|
|
68
|
-
node_cluster_1.default.on('fork', worker => {
|
|
69
|
-
const appWorker = new AppProcessWorker(worker);
|
|
70
|
-
this.emit('worker_forked', appWorker);
|
|
71
|
-
appWorker.disableRefork = true;
|
|
72
|
-
worker.on('message', msg => {
|
|
73
|
-
if (typeof msg === 'string') {
|
|
74
|
-
msg = {
|
|
75
|
-
action: msg,
|
|
76
|
-
data: msg,
|
|
77
|
-
};
|
|
78
|
-
}
|
|
79
|
-
msg.from = 'app';
|
|
80
|
-
this.messenger.send(msg);
|
|
81
|
-
});
|
|
82
|
-
this.log('[master] app_worker#%s:%s start, state: %s, current workers: %j', appWorker.id, appWorker.workerId, appWorker.state, Object.keys(node_cluster_1.default.workers));
|
|
83
|
-
// send debug message, due to `brk` scene, send here instead of app_worker.js
|
|
84
|
-
if (this.options.isDebug) {
|
|
85
|
-
debugPort++;
|
|
86
|
-
this.messenger.send({
|
|
87
|
-
to: 'parent',
|
|
88
|
-
from: 'app',
|
|
89
|
-
action: 'debug',
|
|
90
|
-
data: {
|
|
91
|
-
debugPort,
|
|
92
|
-
// keep compatibility, should use workerId instead
|
|
93
|
-
pid: appWorker.workerId,
|
|
94
|
-
workerId: appWorker.workerId,
|
|
95
|
-
},
|
|
96
|
-
});
|
|
97
|
-
}
|
|
98
|
-
});
|
|
99
|
-
node_cluster_1.default.on('disconnect', worker => {
|
|
100
|
-
const appWorker = new AppProcessWorker(worker);
|
|
101
|
-
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(node_cluster_1.default.workers));
|
|
102
|
-
});
|
|
103
|
-
node_cluster_1.default.on('exit', (worker, code, signal) => {
|
|
104
|
-
const appWorker = new AppProcessWorker(worker);
|
|
105
|
-
this.messenger.send({
|
|
106
|
-
action: 'app-exit',
|
|
107
|
-
data: {
|
|
108
|
-
workerId: appWorker.workerId,
|
|
109
|
-
code,
|
|
110
|
-
signal,
|
|
111
|
-
},
|
|
112
|
-
to: 'master',
|
|
113
|
-
from: 'app',
|
|
114
|
-
});
|
|
115
|
-
});
|
|
116
|
-
return this;
|
|
117
|
-
}
|
|
118
|
-
async kill(timeout) {
|
|
119
|
-
await Promise.all(Object.keys(node_cluster_1.default.workers).map(id => {
|
|
120
|
-
const worker = node_cluster_1.default.workers[id];
|
|
121
|
-
Reflect.set(worker, 'disableRefork', true);
|
|
122
|
-
return (0, terminate_js_1.terminate)(worker.process, timeout);
|
|
123
|
-
}));
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
exports.AppProcessUtils = AppProcessUtils;
|
|
127
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL3V0aWxzL21vZGUvaW1wbC9wcm9jZXNzL2FwcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxnRUFBNEU7QUFDNUUsaUNBQThCO0FBQzlCLDZDQUEwQztBQUMxQyx1REFBaUc7QUFDakcsOENBQWdFO0FBQ2hFLHdEQUFrRDtBQUdsRCxNQUFhLGdCQUFpQixTQUFRLHNCQUFtQztJQUN2RSxJQUFJLEVBQUU7UUFDSixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFRCxJQUFJLFFBQVE7UUFDVixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUksQ0FBQztJQUNwQyxDQUFDO0lBRUQsSUFBSSxxQkFBcUI7UUFDdkIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLHFCQUFxQixDQUFDO0lBQzdDLENBQUM7SUFFRCxJQUFJLFFBQVE7UUFDVixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFFBQVMsQ0FBQztJQUN6QyxDQUFDO0lBRUQsSUFBSSxDQUFDLE9BQW9CO1FBQ3ZCLElBQUEseUJBQVcsRUFBQyxJQUFJLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRCxLQUFLO1FBQ0gsSUFBSSxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0lBQ3JDLENBQUM7SUFFRCwwQ0FBMEM7SUFFMUMsTUFBTSxLQUFLLFFBQVE7UUFDakIsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDO0lBQ3JCLENBQUM7SUFFRCxNQUFNLENBQUMsRUFBRSxDQUFDLEtBQWEsRUFBRSxRQUFrQztRQUN6RCxPQUFPLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBRUQsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFvQjtR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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,91 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.AgentThreadUtils = exports.AgentThreadWorker = void 0;
|
|
7
|
-
const node_worker_threads_1 = __importDefault(require("node:worker_threads"));
|
|
8
|
-
const agent_js_1 = require("../../base/agent.js");
|
|
9
|
-
const ClusterAgentWorkerError_js_1 = require("../../../../error/ClusterAgentWorkerError.js");
|
|
10
|
-
class AgentThreadWorker extends agent_js_1.BaseAgentWorker {
|
|
11
|
-
get workerId() {
|
|
12
|
-
return this.instance.threadId;
|
|
13
|
-
}
|
|
14
|
-
send(message) {
|
|
15
|
-
this.instance.postMessage(message);
|
|
16
|
-
}
|
|
17
|
-
static send(message) {
|
|
18
|
-
message.senderWorkerId = String(node_worker_threads_1.default.threadId);
|
|
19
|
-
node_worker_threads_1.default.parentPort.postMessage(message);
|
|
20
|
-
}
|
|
21
|
-
static kill() {
|
|
22
|
-
// in worker_threads, process.exit
|
|
23
|
-
// does not stop the whole program, just the single thread
|
|
24
|
-
process.exit(1);
|
|
25
|
-
}
|
|
26
|
-
static gracefulExit(options) {
|
|
27
|
-
const { beforeExit } = options;
|
|
28
|
-
process.on('exit', async (code) => {
|
|
29
|
-
if (typeof beforeExit === 'function') {
|
|
30
|
-
await beforeExit();
|
|
31
|
-
}
|
|
32
|
-
process.exit(code);
|
|
33
|
-
});
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
exports.AgentThreadWorker = AgentThreadWorker;
|
|
37
|
-
class AgentThreadUtils extends agent_js_1.BaseAgentUtils {
|
|
38
|
-
#worker;
|
|
39
|
-
#id = 0;
|
|
40
|
-
instance;
|
|
41
|
-
fork() {
|
|
42
|
-
this.startTime = Date.now();
|
|
43
|
-
// start agent worker
|
|
44
|
-
const argv = [JSON.stringify(this.options)];
|
|
45
|
-
const agentPath = this.getAgentWorkerFile();
|
|
46
|
-
const worker = this.#worker = new node_worker_threads_1.default.Worker(agentPath, { argv });
|
|
47
|
-
// wrap agent worker
|
|
48
|
-
const agentWorker = this.instance = new AgentThreadWorker(worker);
|
|
49
|
-
this.emit('agent_forked', agentWorker);
|
|
50
|
-
agentWorker.status = 'starting';
|
|
51
|
-
agentWorker.id = ++this.#id;
|
|
52
|
-
this.log('[master] agent_worker#%s:%s start with worker_threads', agentWorker.id, agentWorker.workerId);
|
|
53
|
-
worker.on('message', msg => {
|
|
54
|
-
if (typeof msg === 'string') {
|
|
55
|
-
msg = {
|
|
56
|
-
action: msg,
|
|
57
|
-
data: msg,
|
|
58
|
-
};
|
|
59
|
-
}
|
|
60
|
-
msg.from = 'agent';
|
|
61
|
-
this.messenger.send(msg);
|
|
62
|
-
});
|
|
63
|
-
worker.on('error', err => {
|
|
64
|
-
this.logger.error(new ClusterAgentWorkerError_js_1.ClusterAgentWorkerError(agentWorker.id, agentWorker.workerId, agentWorker.status, err));
|
|
65
|
-
});
|
|
66
|
-
// agent exit message
|
|
67
|
-
worker.once('exit', (code, signal) => {
|
|
68
|
-
this.messenger.send({
|
|
69
|
-
action: 'agent-exit',
|
|
70
|
-
data: {
|
|
71
|
-
code,
|
|
72
|
-
signal,
|
|
73
|
-
},
|
|
74
|
-
to: 'master',
|
|
75
|
-
from: 'agent',
|
|
76
|
-
});
|
|
77
|
-
});
|
|
78
|
-
}
|
|
79
|
-
clean() {
|
|
80
|
-
this.#worker.removeAllListeners();
|
|
81
|
-
}
|
|
82
|
-
async kill() {
|
|
83
|
-
if (this.#worker) {
|
|
84
|
-
this.log(`[master] kill agent worker#${this.#id} (worker_threads) by worker.terminate()`);
|
|
85
|
-
this.clean();
|
|
86
|
-
await this.#worker.terminate();
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
exports.AgentThreadUtils = AgentThreadUtils;
|
|
91
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdlbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvdXRpbHMvbW9kZS9pbXBsL3dvcmtlcl90aHJlYWRzL2FnZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLDhFQUFpRTtBQUVqRSxrREFBc0U7QUFFdEUsNkZBQXVGO0FBRXZGLE1BQWEsaUJBQWtCLFNBQVEsMEJBQXVCO0lBQzVELElBQUksUUFBUTtRQUNWLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUM7SUFDaEMsQ0FBQztJQUVELElBQUksQ0FBQyxPQUFvQjtRQUN2QixJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRUQsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFvQjtRQUM5QixPQUFPLENBQUMsY0FBYyxHQUFHLE1BQU0sQ0FBQyw2QkFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3hELDZCQUFhLENBQUMsVUFBVyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRUQsTUFBTSxDQUFDLElBQUk7UUFDVCxrQ0FBa0M7UUFDbEMsMERBQTBEO1FBQzFELE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEIsQ0FBQztJQUVELE1BQU0sQ0FBQyxZQUFZLENBQUMsT0FBNEI7UUFDOUMsTUFBTSxFQUFFLFVBQVUsRUFBRSxHQUFHLE9BQU8sQ0FBQztRQUMvQixPQUFPLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUMsSUFBSSxFQUFDLEVBQUU7WUFDOUIsSUFBSSxPQUFPLFVBQVUsS0FBSyxVQUFVLEVBQUUsQ0FBQztnQkFDckMsTUFBTSxVQUFVLEVBQUUsQ0FBQztZQUNyQixDQUFDO1lBQ0QsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQTdCRCw4Q0E2QkM7QUFFRCxNQUFhLGdCQUFpQixTQUFRLHlCQUFjO0lBQ2xELE9BQU8sQ0FBUztJQUNoQixHQUFHLEdBQUcsQ0FBQyxDQUFDO0lBQ1IsUUFBUSxDQUFvQjtJQUU1QixJQUFJO1FBQ0YsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFFNUIscUJBQXFCO1FBQ3JCLE1BQU0sSUFBSSxHQUFHLENBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUUsQ0FBQztRQUM5QyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUM1QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksNkJBQWEsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUU1RSxvQkFBb0I7UUFDcEIsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2xFLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQ3ZDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsVUFBVSxDQUFDO1FBQ2hDLFdBQVcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDO1FBQzVCLElBQUksQ0FBQyxHQUFHLENBQUMsdURBQXVELEVBQzlELFdBQVcsQ0FBQyxFQUFFLEVBQUUsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRXhDLE1BQU0sQ0FBQyxFQUFFLENBQUMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxFQUFFO1lBQ3pCLElBQUksT0FBTyxHQUFHLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQzVCLEdBQUcsR0FBRztvQkFDSixNQUFNLEVBQUUsR0FBRztvQkFDWCxJQUFJLEVBQUUsR0FBRztpQkFDVixDQUFDO1lBQ0osQ0FBQztZQUNELEdBQUcsQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDO1lBQ25CLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzNCLENBQUMsQ0FBQyxDQUFDO1FBRUgsTUFBTSxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLEVBQUU7WUFDdkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxvREFBdUIsQ0FBQyxXQUFXLENBQUMsRUFBRSxFQUFFLFdBQVcsQ0FBQyxRQUFRLEVBQUUsV0FBVyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ2hILENBQUMsQ0FBQyxDQUFDO1FBRUgscUJBQXFCO1FBQ3JCLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBWSxFQUFFLE1BQWMsRUFBRSxFQUFFO1lBQ25ELElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDO2dCQUNsQixNQUFNLEVBQUUsWUFBWTtnQkFDcEIsSUFBSSxFQUFFO29CQUNKLElBQUk7b0JBQ0osTUFBTTtpQkFDUDtnQkFDRCxFQUFFLEVBQUUsUUFBUTtnQkFDWixJQUFJLEVBQUUsT0FBTzthQUNkLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELEtBQUs7UUFDSCxJQUFJLENBQUMsT0FBTyxDQUFDLGtCQUFrQixFQUFFLENBQUM7SUFDcEMsQ0FBQztJQUVELEtBQUssQ0FBQyxJQUFJO1FBQ1IsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDakIsSUFBSSxDQUFDLEdBQUcsQ0FBQyw4QkFBOEIsSUFBSSxDQUFDLEdBQUcseUNBQXlDLENBQUMsQ0FBQztZQUMxRixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDYixNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDakMsQ0FBQztJQUNILENBQUM7Q0FDRjtBQTdERCw0Q0E2REMifQ==
|
|
@@ -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,142 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.AppThreadUtils = exports.AppThreadWorker = void 0;
|
|
4
|
-
const promises_1 = require("node:timers/promises");
|
|
5
|
-
const node_worker_threads_1 = require("node:worker_threads");
|
|
6
|
-
const app_js_1 = require("../../base/app.js");
|
|
7
|
-
class AppThreadWorker extends app_js_1.BaseAppWorker {
|
|
8
|
-
#state = 'none';
|
|
9
|
-
#id;
|
|
10
|
-
constructor(instance, id) {
|
|
11
|
-
super(instance);
|
|
12
|
-
this.#id = id;
|
|
13
|
-
}
|
|
14
|
-
get id() {
|
|
15
|
-
return this.#id;
|
|
16
|
-
}
|
|
17
|
-
get workerId() {
|
|
18
|
-
return this.instance.threadId;
|
|
19
|
-
}
|
|
20
|
-
get state() {
|
|
21
|
-
return this.#state;
|
|
22
|
-
}
|
|
23
|
-
set state(val) {
|
|
24
|
-
this.#state = val;
|
|
25
|
-
}
|
|
26
|
-
get exitedAfterDisconnect() {
|
|
27
|
-
return true;
|
|
28
|
-
}
|
|
29
|
-
get exitCode() {
|
|
30
|
-
return 0;
|
|
31
|
-
// return this.instance.exitCode;
|
|
32
|
-
}
|
|
33
|
-
send(message) {
|
|
34
|
-
this.instance.postMessage(message);
|
|
35
|
-
}
|
|
36
|
-
clean() {
|
|
37
|
-
this.instance.removeAllListeners();
|
|
38
|
-
}
|
|
39
|
-
// static methods use on src/app_worker.ts
|
|
40
|
-
static get workerId() {
|
|
41
|
-
return node_worker_threads_1.threadId;
|
|
42
|
-
}
|
|
43
|
-
static on(event, listener) {
|
|
44
|
-
node_worker_threads_1.parentPort.on(event, listener);
|
|
45
|
-
}
|
|
46
|
-
static send(message) {
|
|
47
|
-
message.senderWorkerId = String(node_worker_threads_1.threadId);
|
|
48
|
-
node_worker_threads_1.parentPort.postMessage(message);
|
|
49
|
-
}
|
|
50
|
-
static kill() {
|
|
51
|
-
process.exit(1);
|
|
52
|
-
}
|
|
53
|
-
static gracefulExit(options) {
|
|
54
|
-
process.on('exit', async (code) => {
|
|
55
|
-
if (typeof options.beforeExit === 'function') {
|
|
56
|
-
await options.beforeExit();
|
|
57
|
-
}
|
|
58
|
-
process.exit(code);
|
|
59
|
-
});
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
exports.AppThreadWorker = AppThreadWorker;
|
|
63
|
-
class AppThreadUtils extends app_js_1.BaseAppUtils {
|
|
64
|
-
#workers = [];
|
|
65
|
-
#forkSingle(appPath, options, id) {
|
|
66
|
-
// start app worker
|
|
67
|
-
const worker = new node_worker_threads_1.Worker(appPath, options);
|
|
68
|
-
this.#workers.push(worker);
|
|
69
|
-
// wrap app worker
|
|
70
|
-
const appWorker = new AppThreadWorker(worker, id);
|
|
71
|
-
this.emit('worker_forked', appWorker);
|
|
72
|
-
appWorker.disableRefork = true;
|
|
73
|
-
worker.on('message', (msg) => {
|
|
74
|
-
if (typeof msg === 'string') {
|
|
75
|
-
msg = {
|
|
76
|
-
action: msg,
|
|
77
|
-
data: msg,
|
|
78
|
-
};
|
|
79
|
-
}
|
|
80
|
-
msg.from = 'app';
|
|
81
|
-
this.messenger.send(msg);
|
|
82
|
-
});
|
|
83
|
-
this.log('[master] app_worker#%s (tid:%s) start', appWorker.id, appWorker.workerId);
|
|
84
|
-
// send debug message, due to `brk` scene, send here instead of app_worker.js
|
|
85
|
-
let debugPort = process.debugPort;
|
|
86
|
-
if (this.options.isDebug) {
|
|
87
|
-
debugPort++;
|
|
88
|
-
this.messenger.send({
|
|
89
|
-
to: 'parent',
|
|
90
|
-
from: 'app',
|
|
91
|
-
action: 'debug',
|
|
92
|
-
data: {
|
|
93
|
-
debugPort,
|
|
94
|
-
pid: appWorker.workerId,
|
|
95
|
-
workerId: appWorker.workerId,
|
|
96
|
-
},
|
|
97
|
-
});
|
|
98
|
-
}
|
|
99
|
-
// handle worker exit
|
|
100
|
-
worker.on('exit', async (code) => {
|
|
101
|
-
appWorker.state = 'dead';
|
|
102
|
-
this.messenger.send({
|
|
103
|
-
action: 'app-exit',
|
|
104
|
-
data: {
|
|
105
|
-
workerId: appWorker.workerId,
|
|
106
|
-
code,
|
|
107
|
-
},
|
|
108
|
-
to: 'master',
|
|
109
|
-
from: 'app',
|
|
110
|
-
});
|
|
111
|
-
// refork app worker
|
|
112
|
-
await (0, promises_1.setTimeout)(1000);
|
|
113
|
-
this.#forkSingle(appPath, options, id);
|
|
114
|
-
});
|
|
115
|
-
}
|
|
116
|
-
fork() {
|
|
117
|
-
this.startTime = Date.now();
|
|
118
|
-
this.startSuccessCount = 0;
|
|
119
|
-
const ports = this.options.ports ?? [];
|
|
120
|
-
if (!ports.length) {
|
|
121
|
-
ports.push(this.options.port);
|
|
122
|
-
}
|
|
123
|
-
this.options.workers = ports.length;
|
|
124
|
-
let i = 0;
|
|
125
|
-
do {
|
|
126
|
-
const options = Object.assign({}, this.options, { port: ports[i] });
|
|
127
|
-
const argv = [JSON.stringify(options)];
|
|
128
|
-
this.#forkSingle(this.getAppWorkerFile(), { argv }, ++i);
|
|
129
|
-
} while (i < ports.length);
|
|
130
|
-
return this;
|
|
131
|
-
}
|
|
132
|
-
async kill() {
|
|
133
|
-
for (const worker of this.#workers) {
|
|
134
|
-
const id = Reflect.get(worker, 'id');
|
|
135
|
-
this.log(`[master] kill app worker#${id} (worker_threads) by worker.terminate()`);
|
|
136
|
-
worker.removeAllListeners();
|
|
137
|
-
worker.terminate();
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
exports.AppThreadUtils = AppThreadUtils;
|
|
142
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL3V0aWxzL21vZGUvaW1wbC93b3JrZXJfdGhyZWFkcy9hcHAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbURBQTJEO0FBQzNELDZEQUF1RztBQUV2Ryw4Q0FBZ0U7QUFHaEUsTUFBYSxlQUFnQixTQUFRLHNCQUEyQjtJQUM5RCxNQUFNLEdBQUcsTUFBTSxDQUFDO0lBQ2hCLEdBQUcsQ0FBUztJQUVaLFlBQVksUUFBc0IsRUFBRSxFQUFVO1FBQzVDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNoQixJQUFJLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQztJQUNoQixDQUFDO0lBRUQsSUFBSSxFQUFFO1FBQ0osT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDO0lBQ2xCLENBQUM7SUFFRCxJQUFJLFFBQVE7UUFDVixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDO0lBQ2hDLENBQUM7SUFFRCxJQUFJLEtBQUs7UUFDUCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDckIsQ0FBQztJQUVELElBQUksS0FBSyxDQUFDLEdBQUc7UUFDWCxJQUFJLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQztJQUNwQixDQUFDO0lBRUQsSUFBSSxxQkFBcUI7UUFDdkIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsSUFBSSxRQUFRO1FBQ1YsT0FBTyxDQUFDLENBQUM7UUFDVCxpQ0FBaUM7SUFDbkMsQ0FBQztJQUVELElBQUksQ0FBQyxPQUFvQjtRQUN2QixJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRUQsS0FBSztRQUNILElBQUksQ0FBQyxRQUFRLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztJQUNyQyxDQUFDO0lBRUQsMENBQTBDO0lBRTFDLE1BQU0sS0FBSyxRQUFRO1FBQ2pCLE9B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
|
|
@@ -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,81 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.parseOptions = parseOptions;
|
|
7
|
-
const node_os_1 = __importDefault(require("node:os"));
|
|
8
|
-
const node_fs_1 = __importDefault(require("node:fs"));
|
|
9
|
-
const node_path_1 = __importDefault(require("node:path"));
|
|
10
|
-
const node_assert_1 = __importDefault(require("node:assert"));
|
|
11
|
-
const utils_1 = require("@eggjs/utils");
|
|
12
|
-
async function parseOptions(options) {
|
|
13
|
-
options = {
|
|
14
|
-
baseDir: process.cwd(),
|
|
15
|
-
port: options?.https ? 8443 : undefined,
|
|
16
|
-
startMode: 'process',
|
|
17
|
-
// ports: [],
|
|
18
|
-
env: process.env.EGG_SERVER_ENV,
|
|
19
|
-
...options,
|
|
20
|
-
};
|
|
21
|
-
const pkgPath = node_path_1.default.join(options.baseDir, 'package.json');
|
|
22
|
-
(0, node_assert_1.default)(node_fs_1.default.existsSync(pkgPath), `${pkgPath} should exist`);
|
|
23
|
-
options.framework = (0, utils_1.getFrameworkPath)({
|
|
24
|
-
baseDir: options.baseDir,
|
|
25
|
-
// compatible customEgg only when call startCluster directly without framework
|
|
26
|
-
framework: options.framework ?? options.customEgg,
|
|
27
|
-
});
|
|
28
|
-
const egg = await (0, utils_1.importModule)(options.framework);
|
|
29
|
-
(0, node_assert_1.default)(egg.Application, `should define Application in ${options.framework}`);
|
|
30
|
-
(0, node_assert_1.default)(egg.Agent, `should define Agent in ${options.framework}`);
|
|
31
|
-
if (options.https === true) {
|
|
32
|
-
// Keep compatible options.key, options.cert
|
|
33
|
-
console.warn('[@eggjs/cluster:deprecated] [master] Please use `https: { key, cert, ca }` instead of `https: true`');
|
|
34
|
-
options.https = {
|
|
35
|
-
key: options.key,
|
|
36
|
-
cert: options.cert,
|
|
37
|
-
};
|
|
38
|
-
}
|
|
39
|
-
// https
|
|
40
|
-
if (options.https) {
|
|
41
|
-
(0, node_assert_1.default)(options.https.key, 'options.https.key should exists');
|
|
42
|
-
if (typeof options.https.key === 'string') {
|
|
43
|
-
(0, node_assert_1.default)(node_fs_1.default.existsSync(options.https.key), 'options.https.key file should exists');
|
|
44
|
-
}
|
|
45
|
-
(0, node_assert_1.default)(options.https.cert, 'options.https.cert should exists');
|
|
46
|
-
if (typeof options.https.cert === 'string') {
|
|
47
|
-
(0, node_assert_1.default)(node_fs_1.default.existsSync(options.https.cert), 'options.https.cert file should exists');
|
|
48
|
-
}
|
|
49
|
-
if (typeof options.https.ca === 'string') {
|
|
50
|
-
(0, node_assert_1.default)(node_fs_1.default.existsSync(options.https.ca), 'options.https.ca file should exists');
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
if (options.port && typeof options.port === 'string') {
|
|
54
|
-
options.port = parseInt(options.port);
|
|
55
|
-
}
|
|
56
|
-
if (options.port === null) {
|
|
57
|
-
options.port = undefined;
|
|
58
|
-
}
|
|
59
|
-
if (options.workers && typeof options.workers === 'string') {
|
|
60
|
-
options.workers = parseInt(options.workers);
|
|
61
|
-
}
|
|
62
|
-
if (!options.workers) {
|
|
63
|
-
options.workers = node_os_1.default.cpus().length;
|
|
64
|
-
}
|
|
65
|
-
if (options.require) {
|
|
66
|
-
if (typeof options.require === 'string') {
|
|
67
|
-
options.require = [options.require];
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
// don't print deprecated message in production env.
|
|
71
|
-
// it will print to stderr.
|
|
72
|
-
if (process.env.NODE_ENV === 'production') {
|
|
73
|
-
process.env.NO_DEPRECATION = '*';
|
|
74
|
-
}
|
|
75
|
-
const isDebug = process.execArgv.some(argv => argv.includes('--debug') || argv.includes('--inspect'));
|
|
76
|
-
if (isDebug) {
|
|
77
|
-
options.isDebug = isDebug;
|
|
78
|
-
}
|
|
79
|
-
return options;
|
|
80
|
-
}
|
|
81
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3B0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy9vcHRpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBeUZBLG9DQStFQztBQXhLRCxzREFBeUI7QUFDekIsc0RBQXlCO0FBQ3pCLDBEQUE2QjtBQUM3Qiw4REFBaUM7QUFFakMsd0NBQThEO0FBb0Z2RCxLQUFLLFVBQVUsWUFBWSxDQUFDLE9BQXdCO0lBQ3pELE9BQU8sR0FBRztRQUNSLE9BQU8sRUFBRSxPQUFPLENBQUMsR0FBRyxFQUFFO1FBQ3RCLElBQUksRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVM7UUFDdkMsU0FBUyxFQUFFLFNBQVM7UUFDcEIsYUFBYTtRQUNiLEdBQUcsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWM7UUFDL0IsR0FBRyxPQUFPO0tBQ1gsQ0FBQztJQUVGLE1BQU0sT0FBTyxHQUFHLG1CQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFRLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFDNUQsSUFBQSxxQkFBTSxFQUFDLGlCQUFFLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEdBQUcsT0FBTyxlQUFlLENBQUMsQ0FBQztJQUUxRCxPQUFPLENBQUMsU0FBUyxHQUFHLElBQUEsd0JBQWdCLEVBQUM7UUFDbkMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxPQUFRO1FBQ3pCLDhFQUE4RTtRQUM5RSxTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVMsSUFBSSxPQUFPLENBQUMsU0FBUztLQUNsRCxDQUFDLENBQUM7SUFFSCxNQUFNLEdBQUcsR0FBRyxNQUFNLElBQUEsb0JBQVksRUFBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDbEQsSUFBQSxxQkFBTSxFQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsZ0NBQWdDLE9BQU8sQ0FBQyxTQUFTLEVBQUUs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
|