@eggjs/cluster 4.0.0-beta.34 → 4.0.0-beta.36

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.
Files changed (35) hide show
  1. package/dist/agent_worker.d.ts +1 -1
  2. package/dist/agent_worker.js +50 -65
  3. package/dist/app_worker.d.ts +1 -1
  4. package/dist/app_worker.js +127 -165
  5. package/dist/error/ClusterAgentWorkerError.d.ts +12 -9
  6. package/dist/error/ClusterAgentWorkerError.js +22 -19
  7. package/dist/error/ClusterWorkerExceptionError.d.ts +9 -6
  8. package/dist/error/ClusterWorkerExceptionError.js +17 -14
  9. package/dist/index.d.ts +20 -15
  10. package/dist/index.js +20 -16
  11. package/dist/master.d.ts +89 -86
  12. package/dist/master.js +425 -556
  13. package/dist/utils/messenger.d.ts +93 -89
  14. package/dist/utils/messenger.js +143 -178
  15. package/dist/utils/mode/base/agent.d.ts +42 -35
  16. package/dist/utils/mode/base/agent.js +63 -65
  17. package/dist/utils/mode/base/app.d.ts +53 -45
  18. package/dist/utils/mode/base/app.js +77 -80
  19. package/dist/utils/mode/impl/process/agent.d.ts +20 -16
  20. package/dist/utils/mode/impl/process/agent.js +95 -105
  21. package/dist/utils/mode/impl/process/app.d.ts +23 -19
  22. package/dist/utils/mode/impl/process/app.js +116 -118
  23. package/dist/utils/mode/impl/worker_threads/agent.d.ts +20 -16
  24. package/dist/utils/mode/impl/worker_threads/agent.js +78 -85
  25. package/dist/utils/mode/impl/worker_threads/app.d.ts +28 -24
  26. package/dist/utils/mode/impl/worker_threads/app.js +128 -137
  27. package/dist/utils/options.d.ts +79 -76
  28. package/dist/utils/options.js +55 -80
  29. package/dist/utils/terminate.js +50 -70
  30. package/dist/utils/worker_manager.d.ts +28 -24
  31. package/dist/utils/worker_manager.js +68 -74
  32. package/package.json +33 -34
  33. package/dist/error/index.d.ts +0 -2
  34. package/dist/error/index.js +0 -3
  35. package/dist/utils/terminate.d.ts +0 -6
@@ -1,106 +1,96 @@
1
- import { debuglog } from 'node:util';
2
- import { fork } from 'node:child_process';
3
- import { sendmessage } from 'sendmessage';
4
- import { graceful as gracefulExit } from 'graceful-process';
5
- import { BaseAgentWorker, BaseAgentUtils } from "../../base/agent.js";
6
- import { terminate } from "../../../terminate.js";
7
1
  import { ClusterAgentWorkerError } from "../../../../error/ClusterAgentWorkerError.js";
8
- const debug = debuglog('egg/cluster/agent');
9
- export class AgentProcessWorker extends BaseAgentWorker {
10
- get workerId() {
11
- return this.instance.pid;
12
- }
13
- send(message) {
14
- sendmessage(this.instance, message);
15
- }
16
- static send(message) {
17
- message.senderWorkerId = String(process.pid);
18
- process.send(message);
19
- }
20
- static kill() {
21
- process.exitCode = 1;
22
- process.kill(process.pid);
23
- }
24
- static gracefulExit(options) {
25
- gracefulExit(options);
26
- }
27
- }
28
- export class AgentProcessUtils extends BaseAgentUtils {
29
- #agentProcess;
30
- #id = 0;
31
- instance;
32
- fork() {
33
- this.startTime = Date.now();
34
- const args = [JSON.stringify(this.options)];
35
- const forkOptions = {};
36
- if (process.platform === 'win32') {
37
- forkOptions.windowsHide = true;
38
- }
39
- // add debug execArgv
40
- const debugPort = process.env.EGG_AGENT_DEBUG_PORT ?? 5800;
41
- if (this.options.isDebug) {
42
- forkOptions.execArgv = process.execArgv.concat([`--inspect-port=${debugPort}`]);
43
- }
44
- debug('forkOptions: %j, args: %s', forkOptions, args);
45
- const agentProcess = (this.#agentProcess = fork(this.getAgentWorkerFile(), args, forkOptions));
46
- const agentWorker = (this.instance = new AgentProcessWorker(agentProcess));
47
- agentWorker.status = 'starting';
48
- agentWorker.id = ++this.#id;
49
- this.emit('agent_forked', agentWorker);
50
- this.log('[master] agent_worker#%s:%s start with clusterPort:%s', agentWorker.id, agentWorker.workerId, this.options.clusterPort);
51
- // send debug message
52
- if (this.options.isDebug) {
53
- this.messenger.send({
54
- to: 'parent',
55
- from: 'agent',
56
- action: 'debug',
57
- data: {
58
- debugPort,
59
- // keep compatibility, should use workerId instead
60
- pid: agentWorker.workerId,
61
- workerId: agentWorker.workerId,
62
- },
63
- });
64
- }
65
- // forwarding agent' message to messenger
66
- agentProcess.on('message', (msg) => {
67
- if (typeof msg === 'string') {
68
- msg = {
69
- action: msg,
70
- data: msg,
71
- };
72
- }
73
- msg.from = 'agent';
74
- this.messenger.send(msg);
75
- });
76
- // logger error event
77
- agentProcess.on('error', (err) => {
78
- err.name = 'AgentWorkerError';
79
- this.logger.error(new ClusterAgentWorkerError(agentWorker.id, agentWorker.workerId, agentWorker.status, err));
80
- });
81
- // agent exit message
82
- agentProcess.once('exit', (code, signal) => {
83
- this.messenger.send({
84
- action: 'agent-exit',
85
- data: {
86
- code,
87
- signal,
88
- },
89
- to: 'master',
90
- from: 'agent',
91
- });
92
- });
93
- return this;
94
- }
95
- clean() {
96
- this.#agentProcess.removeAllListeners();
97
- }
98
- async kill(timeout) {
99
- if (this.#agentProcess) {
100
- this.log('[master] kill agent worker with signal SIGTERM');
101
- this.clean();
102
- await terminate(this.#agentProcess, timeout);
103
- }
104
- }
105
- }
106
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdlbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvdXRpbHMvbW9kZS9pbXBsL3Byb2Nlc3MvYWdlbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNyQyxPQUFPLEVBQUUsSUFBSSxFQUF1QyxNQUFNLG9CQUFvQixDQUFDO0FBRS9FLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDMUMsT0FBTyxFQUFFLFFBQVEsSUFBSSxZQUFZLEVBQXVDLE1BQU0sa0JBQWtCLENBQUM7QUFFakcsT0FBTyxFQUFFLGVBQWUsRUFBRSxjQUFjLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFbEQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sOENBQThDLENBQUM7QUFFdkYsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLG1CQUFtQixDQUFDLENBQUM7QUFFNUMsTUFBTSxPQUFPLGtCQUFtQixTQUFRLGVBQTZCO0lBQ25FLElBQUksUUFBUTtRQUNWLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFJLENBQUM7SUFDNUIsQ0FBQztJQUVELElBQUksQ0FBQyxPQUFvQjtRQUN2QixXQUFXLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFvQjtRQUM5QixPQUFPLENBQUMsY0FBYyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDN0MsT0FBTyxDQUFDLElBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN6QixDQUFDO0lBRUQsTUFBTSxDQUFDLElBQUk7UUFDVCxPQUFPLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQztRQUNyQixPQUFPLENB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
2
+ import { terminate } from "../../../terminate.js";
3
+ import { BaseAgentUtils, BaseAgentWorker } from "../../base/agent.js";
4
+ import { debuglog } from "node:util";
5
+ import { fork } from "node:child_process";
6
+ import { graceful } from "graceful-process";
7
+ import { sendmessage } from "sendmessage";
8
+
9
+ //#region src/utils/mode/impl/process/agent.ts
10
+ const debug = debuglog("egg/cluster/agent");
11
+ var AgentProcessWorker = class extends BaseAgentWorker {
12
+ get workerId() {
13
+ return this.instance.pid;
14
+ }
15
+ send(message) {
16
+ sendmessage(this.instance, message);
17
+ }
18
+ static send(message) {
19
+ message.senderWorkerId = String(process.pid);
20
+ process.send(message);
21
+ }
22
+ static kill() {
23
+ process.exitCode = 1;
24
+ process.kill(process.pid);
25
+ }
26
+ static gracefulExit(options) {
27
+ graceful(options);
28
+ }
29
+ };
30
+ var AgentProcessUtils = class extends BaseAgentUtils {
31
+ #agentProcess;
32
+ #id = 0;
33
+ instance;
34
+ fork() {
35
+ this.startTime = Date.now();
36
+ const args = [JSON.stringify(this.options)];
37
+ const forkOptions = {};
38
+ if (process.platform === "win32") forkOptions.windowsHide = true;
39
+ const debugPort = process.env.EGG_AGENT_DEBUG_PORT ?? 5800;
40
+ if (this.options.isDebug) forkOptions.execArgv = process.execArgv.concat([`--inspect-port=${debugPort}`]);
41
+ debug("forkOptions: %j, args: %s", forkOptions, args);
42
+ const agentProcess = this.#agentProcess = fork(this.getAgentWorkerFile(), args, forkOptions);
43
+ const agentWorker = this.instance = new AgentProcessWorker(agentProcess);
44
+ agentWorker.status = "starting";
45
+ agentWorker.id = ++this.#id;
46
+ this.emit("agent_forked", agentWorker);
47
+ this.log("[master] agent_worker#%s:%s start with clusterPort:%s", agentWorker.id, agentWorker.workerId, this.options.clusterPort);
48
+ if (this.options.isDebug) this.messenger.send({
49
+ to: "parent",
50
+ from: "agent",
51
+ action: "debug",
52
+ data: {
53
+ debugPort,
54
+ pid: agentWorker.workerId,
55
+ workerId: agentWorker.workerId
56
+ }
57
+ });
58
+ agentProcess.on("message", (msg) => {
59
+ if (typeof msg === "string") msg = {
60
+ action: msg,
61
+ data: msg
62
+ };
63
+ msg.from = "agent";
64
+ this.messenger.send(msg);
65
+ });
66
+ agentProcess.on("error", (err) => {
67
+ err.name = "AgentWorkerError";
68
+ this.logger.error(new ClusterAgentWorkerError(agentWorker.id, agentWorker.workerId, agentWorker.status, err));
69
+ });
70
+ agentProcess.once("exit", (code, signal) => {
71
+ this.messenger.send({
72
+ action: "agent-exit",
73
+ data: {
74
+ code,
75
+ signal
76
+ },
77
+ to: "master",
78
+ from: "agent"
79
+ });
80
+ });
81
+ return this;
82
+ }
83
+ clean() {
84
+ this.#agentProcess.removeAllListeners();
85
+ }
86
+ async kill(timeout) {
87
+ if (this.#agentProcess) {
88
+ this.log("[master] kill agent worker with signal SIGTERM");
89
+ this.clean();
90
+ await terminate(this.#agentProcess, timeout);
91
+ }
92
+ }
93
+ };
94
+
95
+ //#endregion
96
+ export { AgentProcessUtils, AgentProcessWorker };
@@ -1,21 +1,25 @@
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.ts';
4
- import type { MessageBody } from '../../../messenger.ts';
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;
1
+ import { BaseAppUtils, BaseAppWorker } from "../../base/app.js";
2
+ import { MessageBody } from "../../../messenger.js";
3
+ import { Options } from "graceful-process";
4
+ import { Worker } from "node:cluster";
5
+
6
+ //#region src/utils/mode/impl/process/app.d.ts
7
+ declare class AppProcessWorker extends BaseAppWorker<Worker> {
8
+ get id(): number;
9
+ get workerId(): number;
10
+ get exitedAfterDisconnect(): boolean;
11
+ get exitCode(): number;
12
+ send(message: MessageBody): void;
13
+ clean(): void;
14
+ static get workerId(): number;
15
+ static on(event: string, listener: (...args: any[]) => void): void;
16
+ static send(message: MessageBody): void;
17
+ static kill(): void;
18
+ static gracefulExit(options: Options): void;
17
19
  }
18
- export declare class AppProcessUtils extends BaseAppUtils {
19
- fork(): this;
20
- kill(timeout: number): Promise<void>;
20
+ declare class AppProcessUtils extends BaseAppUtils {
21
+ fork(): this;
22
+ kill(timeout: number): Promise<void>;
21
23
  }
24
+ //#endregion
25
+ export { AppProcessUtils, AppProcessWorker };
@@ -1,119 +1,117 @@
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
1
  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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL3V0aWxzL21vZGUvaW1wbC9wcm9jZXNzL2FwcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLE9BQU8sRUFBRSxFQUF1QyxNQUFNLGNBQWMsQ0FBQztBQUU1RSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQzlCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDMUMsT0FBTyxFQUFFLFFBQVEsSUFBSSxZQUFZLEVBQXVDLE1BQU0sa0JBQWtCLENBQUM7QUFFakcsT0FBTyxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFHbEQsTUFBTSxPQUFPLGdCQUFpQixTQUFRLGFBQW1DO0lBQ3ZFLElBQUksRUFBRTtRQUNKLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVELElBQUksUUFBUTtRQUNWLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBSSxDQUFDO0lBQ3BDLENBQUM7SUFFRCxJQUFJLHFCQUFxQjtRQUN2QixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMscUJBQXFCLENBQUM7SUFDN0MsQ0FBQztJQUVELElBQUksUUFBUTtRQUNWLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsUUFBUyxDQUFDO0lBQ3pDLENBQUM7SUFFRCxJQUFJLENBQUMsT0FBb0I7UUFDdkIsV0FBVyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVELEtBQUs7UUFDSCxJQUFJLENBQUMsUUFBUSxDQUFDLGtCQUFrQixFQUFFLENBQUM7SUFDckMsQ0FBQztJQUVELDBDQUEwQztJQUUxQyxNQUFNLEtB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
2
+ import { BaseAppUtils, BaseAppWorker } from "../../base/app.js";
3
+ import { graceful } from "graceful-process";
4
+ import { sendmessage } from "sendmessage";
5
+ import cluster from "node:cluster";
6
+ import { cfork } from "cfork";
7
+
8
+ //#region src/utils/mode/impl/process/app.ts
9
+ var AppProcessWorker = class extends BaseAppWorker {
10
+ get id() {
11
+ return this.instance.id;
12
+ }
13
+ get workerId() {
14
+ return this.instance.process.pid;
15
+ }
16
+ get exitedAfterDisconnect() {
17
+ return this.instance.exitedAfterDisconnect;
18
+ }
19
+ get exitCode() {
20
+ return this.instance.process.exitCode;
21
+ }
22
+ send(message) {
23
+ sendmessage(this.instance, message);
24
+ }
25
+ clean() {
26
+ this.instance.removeAllListeners();
27
+ }
28
+ static get workerId() {
29
+ return process.pid;
30
+ }
31
+ static on(event, listener) {
32
+ process.on(event, listener);
33
+ }
34
+ static send(message) {
35
+ message.senderWorkerId = String(process.pid);
36
+ process.send(message);
37
+ }
38
+ static kill() {
39
+ process.exitCode = 1;
40
+ process.kill(process.pid);
41
+ }
42
+ static gracefulExit(options) {
43
+ graceful(options);
44
+ }
45
+ };
46
+ var AppProcessUtils = class extends BaseAppUtils {
47
+ fork() {
48
+ this.startTime = Date.now();
49
+ this.startSuccessCount = 0;
50
+ const args = [JSON.stringify(this.options)];
51
+ this.log("[master] start appWorker with args %j (process)", args);
52
+ cfork({
53
+ exec: this.getAppWorkerFile(),
54
+ args,
55
+ silent: false,
56
+ count: this.options.workers,
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") msg = {
67
+ action: msg,
68
+ data: msg
69
+ };
70
+ msg.from = "app";
71
+ this.messenger.send(msg);
72
+ });
73
+ this.log("[master] app_worker#%s:%s start, state: %s, current workers: %j", appWorker.id, appWorker.workerId, appWorker.state, Object.keys(cluster.workers));
74
+ if (this.options.isDebug) {
75
+ debugPort++;
76
+ this.messenger.send({
77
+ to: "parent",
78
+ from: "app",
79
+ action: "debug",
80
+ data: {
81
+ debugPort,
82
+ pid: appWorker.workerId,
83
+ workerId: appWorker.workerId
84
+ }
85
+ });
86
+ }
87
+ });
88
+ cluster.on("disconnect", (worker) => {
89
+ const appWorker = new AppProcessWorker(worker);
90
+ 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));
91
+ });
92
+ cluster.on("exit", (worker, code, signal) => {
93
+ const appWorker = new AppProcessWorker(worker);
94
+ this.messenger.send({
95
+ action: "app-exit",
96
+ data: {
97
+ workerId: appWorker.workerId,
98
+ code,
99
+ signal
100
+ },
101
+ to: "master",
102
+ from: "app"
103
+ });
104
+ });
105
+ return this;
106
+ }
107
+ async kill(timeout) {
108
+ await Promise.all(Object.keys(cluster.workers).map((id) => {
109
+ const worker = cluster.workers[id];
110
+ Reflect.set(worker, "disableRefork", true);
111
+ return terminate(worker.process, timeout);
112
+ }));
113
+ }
114
+ };
115
+
116
+ //#endregion
117
+ export { AppProcessUtils, AppProcessWorker };
@@ -1,18 +1,22 @@
1
- import { type Worker } from 'node:worker_threads';
2
- import { type Options as gracefulExitOptions } from 'graceful-process';
3
- import { BaseAgentUtils, BaseAgentWorker } from '../../base/agent.ts';
4
- import type { MessageBody } from '../../../messenger.ts';
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;
1
+ import { BaseAgentUtils, BaseAgentWorker } from "../../base/agent.js";
2
+ import { MessageBody } from "../../../messenger.js";
3
+ import { Worker } from "node:worker_threads";
4
+ import { Options } from "graceful-process";
5
+
6
+ //#region src/utils/mode/impl/worker_threads/agent.d.ts
7
+ declare class AgentThreadWorker extends BaseAgentWorker<Worker> {
8
+ get workerId(): number;
9
+ send(message: MessageBody): void;
10
+ static send(message: MessageBody): void;
11
+ static kill(): void;
12
+ static gracefulExit(options: Options): void;
11
13
  }
12
- export declare class AgentThreadUtils extends BaseAgentUtils {
13
- #private;
14
- instance: AgentThreadWorker;
15
- fork(): void;
16
- clean(): void;
17
- kill(): Promise<void>;
14
+ declare class AgentThreadUtils extends BaseAgentUtils {
15
+ #private;
16
+ instance: AgentThreadWorker;
17
+ fork(): void;
18
+ clean(): void;
19
+ kill(): Promise<void>;
18
20
  }
21
+ //#endregion
22
+ export { AgentThreadUtils };