@eggjs/cluster 4.0.0-beta.19 → 4.0.0-beta.21

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 (37) hide show
  1. package/dist/agent_worker.d.ts +1 -1
  2. package/dist/agent_worker.js +63 -50
  3. package/dist/app_worker.d.ts +1 -1
  4. package/dist/app_worker.js +165 -127
  5. package/dist/dirname.d.ts +1 -0
  6. package/dist/dirname.js +10 -10
  7. package/dist/error/ClusterAgentWorkerError.d.ts +9 -12
  8. package/dist/error/ClusterAgentWorkerError.js +19 -22
  9. package/dist/error/ClusterWorkerExceptionError.d.ts +6 -9
  10. package/dist/error/ClusterWorkerExceptionError.js +14 -17
  11. package/dist/error/index.d.ts +2 -0
  12. package/dist/error/index.js +3 -0
  13. package/dist/index.d.ts +5 -10
  14. package/dist/index.js +16 -20
  15. package/dist/master.d.ts +86 -92
  16. package/dist/master.js +543 -416
  17. package/dist/utils/messenger.d.ts +44 -48
  18. package/dist/utils/messenger.js +178 -143
  19. package/dist/utils/mode/base/agent.d.ts +35 -42
  20. package/dist/utils/mode/base/agent.js +64 -62
  21. package/dist/utils/mode/base/app.d.ts +45 -53
  22. package/dist/utils/mode/base/app.js +79 -76
  23. package/dist/utils/mode/impl/process/agent.d.ts +16 -20
  24. package/dist/utils/mode/impl/process/agent.js +101 -91
  25. package/dist/utils/mode/impl/process/app.d.ts +20 -11
  26. package/dist/utils/mode/impl/process/app.js +118 -116
  27. package/dist/utils/mode/impl/worker_threads/agent.d.ts +16 -20
  28. package/dist/utils/mode/impl/worker_threads/agent.js +82 -77
  29. package/dist/utils/mode/impl/worker_threads/app.d.ts +25 -12
  30. package/dist/utils/mode/impl/worker_threads/app.js +137 -128
  31. package/dist/utils/options.d.ts +76 -79
  32. package/dist/utils/options.js +80 -55
  33. package/dist/utils/terminate.d.ts +6 -0
  34. package/dist/utils/terminate.js +70 -51
  35. package/dist/utils/worker_manager.d.ts +24 -31
  36. package/dist/utils/worker_manager.js +74 -68
  37. package/package.json +6 -6
@@ -1,56 +1,48 @@
1
- import { MessageBody, Messenger } from "../../messenger.js";
2
- import { MasterOptions } from "../../../master.js";
3
- import { Logger } from "egg-logger";
4
- import { EventEmitter } from "node:events";
5
- import { Worker } from "node:worker_threads";
6
- import { Worker as Worker$1 } from "node:cluster";
7
-
8
- //#region src/utils/mode/base/app.d.ts
9
- declare abstract class BaseAppWorker<T = Worker | Worker$1> {
10
- instance: T;
11
- constructor(instance: T);
12
- abstract get workerId(): number;
13
- abstract get id(): number;
14
- get state(): string;
15
- set state(state: string);
16
- abstract get exitedAfterDisconnect(): boolean;
17
- abstract get exitCode(): number;
18
- get disableRefork(): boolean;
19
- set disableRefork(disableRefork: boolean);
20
- get isDevReload(): boolean;
21
- set isDevReload(isDevReload: boolean);
22
- abstract send(data: MessageBody): void;
23
- clean(): void;
24
- static get workerId(): number;
25
- static on(..._args: any[]): void;
26
- static send(_message: MessageBody): void;
27
- static kill(): void;
28
- static gracefulExit(_options: any): void;
1
+ import { EventEmitter } from 'node:events';
2
+ import type { Worker as ClusterProcessWorker } from 'node:cluster';
3
+ import type { Worker as ThreadWorker } from 'node:worker_threads';
4
+ import type { Logger } from 'egg-logger';
5
+ import type { MessageBody, Messenger } from '../../messenger.ts';
6
+ import type { MasterOptions } from '../../../master.ts';
7
+ export declare abstract class BaseAppWorker<T = ThreadWorker | ClusterProcessWorker> {
8
+ instance: T;
9
+ constructor(instance: T);
10
+ abstract get workerId(): number;
11
+ abstract get id(): number;
12
+ get state(): string;
13
+ set state(state: string);
14
+ abstract get exitedAfterDisconnect(): boolean;
15
+ abstract get exitCode(): number;
16
+ get disableRefork(): boolean;
17
+ set disableRefork(disableRefork: boolean);
18
+ get isDevReload(): boolean;
19
+ set isDevReload(isDevReload: boolean);
20
+ abstract send(data: MessageBody): void;
21
+ clean(): void;
22
+ static get workerId(): number;
23
+ static on(..._args: any[]): void;
24
+ static send(_message: MessageBody): void;
25
+ static kill(): void;
26
+ static gracefulExit(_options: any): void;
29
27
  }
30
28
  type LogFun = (msg: any, ...args: any[]) => void;
31
- declare abstract class BaseAppUtils extends EventEmitter {
32
- options: MasterOptions;
33
- protected messenger: Messenger;
34
- protected log: LogFun;
35
- protected logger: Logger;
36
- protected isProduction: boolean;
37
- startTime: number;
38
- startSuccessCount: number;
39
- isAllWorkerStarted: boolean;
40
- constructor(options: MasterOptions, {
41
- log,
42
- logger,
43
- messenger,
44
- isProduction
45
- }: {
46
- log: LogFun;
47
- logger: Logger;
48
- messenger: Messenger;
49
- isProduction: boolean;
50
- });
51
- getAppWorkerFile(): string;
52
- fork(): void;
53
- abstract kill(timeout: number): Promise<void>;
29
+ export declare abstract class BaseAppUtils extends EventEmitter {
30
+ options: MasterOptions;
31
+ protected messenger: Messenger;
32
+ protected log: LogFun;
33
+ protected logger: Logger;
34
+ protected isProduction: boolean;
35
+ startTime: number;
36
+ startSuccessCount: number;
37
+ isAllWorkerStarted: boolean;
38
+ constructor(options: MasterOptions, { log, logger, messenger, isProduction, }: {
39
+ log: LogFun;
40
+ logger: Logger;
41
+ messenger: Messenger;
42
+ isProduction: boolean;
43
+ });
44
+ getAppWorkerFile(): string;
45
+ fork(): void;
46
+ abstract kill(timeout: number): Promise<void>;
54
47
  }
55
- //#endregion
56
- export { BaseAppUtils, BaseAppWorker };
48
+ export {};
@@ -1,77 +1,80 @@
1
+ import path from 'node:path';
2
+ import { existsSync } from 'node:fs';
3
+ import { EventEmitter } from 'node:events';
1
4
  import { getSrcDirname } from "../../../dirname.js";
2
- import path from "node:path";
3
- import { existsSync } from "node:fs";
4
- import { EventEmitter } from "node:events";
5
-
6
- //#region src/utils/mode/base/app.ts
7
- var BaseAppWorker = class {
8
- instance;
9
- constructor(instance) {
10
- this.instance = instance;
11
- }
12
- get state() {
13
- return Reflect.get(this.instance, "state");
14
- }
15
- set state(state) {
16
- Reflect.set(this.instance, "state", state);
17
- }
18
- get disableRefork() {
19
- return Reflect.get(this.instance, "disableRefork");
20
- }
21
- set disableRefork(disableRefork) {
22
- Reflect.set(this.instance, "disableRefork", disableRefork);
23
- }
24
- get isDevReload() {
25
- return Reflect.get(this.instance, "isDevReload");
26
- }
27
- set isDevReload(isDevReload) {
28
- Reflect.set(this.instance, "isDevReload", isDevReload);
29
- }
30
- clean() {
31
- throw new Error("BaseAppWorker should implement clean.");
32
- }
33
- static get workerId() {
34
- throw new Error("BaseAppWorker should implement workerId.");
35
- }
36
- static on(..._args) {
37
- throw new Error("BaseAppWorker should implement on.");
38
- }
39
- static send(_message) {
40
- throw new Error("BaseAgentWorker should implement send.");
41
- }
42
- static kill() {
43
- throw new Error("BaseAppWorker should implement kill.");
44
- }
45
- static gracefulExit(_options) {
46
- throw new Error("BaseAgentWorker should implement gracefulExit.");
47
- }
48
- };
49
- var BaseAppUtils = class extends EventEmitter {
50
- options;
51
- messenger;
52
- log;
53
- logger;
54
- isProduction;
55
- startTime = 0;
56
- startSuccessCount = 0;
57
- isAllWorkerStarted = false;
58
- constructor(options, { log, logger, messenger, isProduction }) {
59
- super();
60
- this.options = options;
61
- this.log = log;
62
- this.logger = logger;
63
- this.messenger = messenger;
64
- this.isProduction = isProduction;
65
- }
66
- getAppWorkerFile() {
67
- let appWorkerFile = path.join(getSrcDirname(), "app_worker.js");
68
- if (!existsSync(appWorkerFile)) appWorkerFile = path.join(getSrcDirname(), "app_worker.ts");
69
- return appWorkerFile;
70
- }
71
- fork() {
72
- throw new Error("BaseApp should implement fork.");
73
- }
74
- };
75
-
76
- //#endregion
77
- export { BaseAppUtils, BaseAppWorker };
5
+ export class BaseAppWorker {
6
+ instance;
7
+ constructor(instance) {
8
+ this.instance = instance;
9
+ }
10
+ get state() {
11
+ return Reflect.get(this.instance, 'state');
12
+ }
13
+ set state(state) {
14
+ Reflect.set(this.instance, 'state', state);
15
+ }
16
+ get disableRefork() {
17
+ return Reflect.get(this.instance, 'disableRefork');
18
+ }
19
+ set disableRefork(disableRefork) {
20
+ Reflect.set(this.instance, 'disableRefork', disableRefork);
21
+ }
22
+ get isDevReload() {
23
+ return Reflect.get(this.instance, 'isDevReload');
24
+ }
25
+ set isDevReload(isDevReload) {
26
+ Reflect.set(this.instance, 'isDevReload', isDevReload);
27
+ }
28
+ clean() {
29
+ throw new Error('BaseAppWorker should implement clean.');
30
+ }
31
+ // static methods use on src/app_worker.ts
32
+ static get workerId() {
33
+ throw new Error('BaseAppWorker should implement workerId.');
34
+ }
35
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
36
+ static on(..._args) {
37
+ throw new Error('BaseAppWorker should implement on.');
38
+ }
39
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
40
+ static send(_message) {
41
+ throw new Error('BaseAgentWorker should implement send.');
42
+ }
43
+ static kill() {
44
+ throw new Error('BaseAppWorker should implement kill.');
45
+ }
46
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
47
+ static gracefulExit(_options) {
48
+ throw new Error('BaseAgentWorker should implement gracefulExit.');
49
+ }
50
+ }
51
+ export class BaseAppUtils extends EventEmitter {
52
+ options;
53
+ messenger;
54
+ log;
55
+ logger;
56
+ isProduction;
57
+ // public attrs
58
+ startTime = 0;
59
+ startSuccessCount = 0;
60
+ isAllWorkerStarted = false;
61
+ constructor(options, { log, logger, messenger, isProduction, }) {
62
+ super();
63
+ this.options = options;
64
+ this.log = log;
65
+ this.logger = logger;
66
+ this.messenger = messenger;
67
+ this.isProduction = isProduction;
68
+ }
69
+ getAppWorkerFile() {
70
+ let appWorkerFile = path.join(getSrcDirname(), 'app_worker.js');
71
+ if (!existsSync(appWorkerFile)) {
72
+ appWorkerFile = path.join(getSrcDirname(), 'app_worker.ts');
73
+ }
74
+ return appWorkerFile;
75
+ }
76
+ fork() {
77
+ throw new Error('BaseApp should implement fork.');
78
+ }
79
+ }
80
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3V0aWxzL21vZGUvYmFzZS9hcHAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxJQUFJLE1BQU0sV0FBVyxDQUFDO0FBQzdCLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDckMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGFBQWEsQ0FBQztBQVEzQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFcEQsTUFBTSxPQUFnQixhQUFhO0lBQ2pDLFFBQVEsQ0FBSTtJQUVaLFlBQVksUUFBVztRQUNyQixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztJQUMzQixDQUFDO0lBTUQsSUFBSSxLQUFLO1FBQ1AsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFTLEVBQUUsT0FBTyxDQUFXLENBQUM7SUFDeEQsQ0FBQztJQUVELElBQUksS0FBSyxDQUFDLEtBQWE7UUFDckIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUyxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBTUQsSUFBSSxhQUFhO1FBQ2YsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFTLEVBQUUsZUFBZSxDQUFZLENBQUM7SUFDakUsQ0FBQztJQUVELElBQUksYUFBYSxDQUFDLGFBQXNCO1FBQ3RDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVMsRUFBRSxlQUFlLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUVELElBQUksV0FBVztRQUNiLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUyxFQUFFLGFBQWEsQ0FBWSxDQUFDO0lBQy9ELENBQUM7SUFFRCxJQUFJLFdBQVcsQ0FBQyxXQUFvQjtRQUNsQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFTLEVBQUUsYUFBYSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQzFELENBQUM7SUFJRCxLQUFLO1FBQ0gsTUFBTSxJQUFJLEtBQUssQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFFRCwwQ0FBMEM7SUFFMUMsTUFBTSxLQUFLLFFBQVE7UUFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFFRCw2REFBNkQ7SUFDN0QsTUFBTSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQVk7UUFDdkIsTUFBTSxJQUFJLEtBQUssQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFFRCw2REFBNkQ7SUFDN0QsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFxQjtRQUMvQixNQUFNLElBQUksS0FBSyxDQUFDLHdDQUF3QyxDQUFDLENBQUM7SUFDNUQsQ0FBQztJQUVELE1BQU0sQ0FBQyxJQUFJO1FBQ1QsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO0lBQzFELENBQUM7SUFFRCw2REFBNkQ7SUFDN0QsTUFBTSxDQUFDLFlBQVksQ0FBQyxRQUFhO1FBQy9CLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0RBQWdELENBQUMsQ0FBQztJQUNwRSxDQUFDO0NBQ0Y7QUFJRCxNQUFNLE9BQWdCLFlBQWEsU0FBUSxZQUFZO0lBQ3JELE9BQU8sQ0FBZ0I7SUFDYixTQUFTLENBQVk7SUFDckIsR0FBRyxDQUFTO0lBQ1osTUFBTSxDQUFTO0lBQ2YsWUFBWSxDQUFVO0lBQ2hDLGVBQWU7SUFDZixTQUFTLEdBQUcsQ0FBQyxDQUFDO0lBQ2QsaUJBQWlCLEdBQUcsQ0FBQyxDQUFDO0lBQ3RCLGtCQUFrQixHQUFHLEtBQUssQ0FBQztJQUUzQixZQUNFLE9BQXNCLEVBQ3RCLEVBQ0UsR0FBRyxFQUNILE1BQU0sRUFDTixTQUFTLEVBQ1QsWUFBWSxHQU1iO1FBRUQsS0FBSyxFQUFFLENBQUM7UUFDUixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztRQUNmLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1FBQzNCLElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO0lBQ25DLENBQUM7SUFFRCxnQkFBZ0I7UUFDZCxJQUFJLGFBQWEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxFQUFFLGVBQWUsQ0FBQyxDQUFDO1FBQ2hFLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQztZQUMvQixhQUFhLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsRUFBRSxlQUFlLENBQUMsQ0FBQztRQUM5RCxDQUFDO1FBQ0QsT0FBTyxhQUFhLENBQUM7SUFDdkIsQ0FBQztJQUVELElBQUk7UUFDRixNQUFNLElBQUksS0FBSyxDQUFDLGdDQUFnQyxDQUFDLENBQUM7SUFDcEQsQ0FBQztDQUdGIn0=
@@ -1,22 +1,18 @@
1
- import { BaseAgentUtils, BaseAgentWorker } from "../../base/agent.js";
2
- import { MessageBody } from "../../../messenger.js";
3
- import { ChildProcess } from "node:child_process";
4
- import { Options } from "graceful-process";
5
-
6
- //#region src/utils/mode/impl/process/agent.d.ts
7
- declare class AgentProcessWorker extends BaseAgentWorker<ChildProcess> {
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;
1
+ import { type ChildProcess } from 'node:child_process';
2
+ import { type Options as gracefulExitOptions } from 'graceful-process';
3
+ import { BaseAgentWorker, BaseAgentUtils } from '../../base/agent.ts';
4
+ import type { MessageBody } from '../../../messenger.ts';
5
+ export declare class AgentProcessWorker extends BaseAgentWorker<ChildProcess> {
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;
13
11
  }
14
- declare class AgentProcessUtils extends BaseAgentUtils {
15
- #private;
16
- instance: AgentProcessWorker;
17
- fork(): this;
18
- clean(): void;
19
- kill(timeout: number): Promise<void>;
12
+ export declare class AgentProcessUtils extends BaseAgentUtils {
13
+ #private;
14
+ instance: AgentProcessWorker;
15
+ fork(): this;
16
+ clean(): void;
17
+ kill(timeout: number): Promise<void>;
20
18
  }
21
- //#endregion
22
- export { AgentProcessUtils };
@@ -1,93 +1,103 @@
1
- import { BaseAgentUtils, BaseAgentWorker } from "../../base/agent.js";
1
+ import { fork } from 'node:child_process';
2
+ import { sendmessage } from 'sendmessage';
3
+ import { graceful as gracefulExit } from 'graceful-process';
4
+ import { BaseAgentWorker, BaseAgentUtils } from "../../base/agent.js";
2
5
  import { terminate } from "../../../terminate.js";
3
6
  import { ClusterAgentWorkerError } from "../../../../error/ClusterAgentWorkerError.js";
4
- import { fork } from "node:child_process";
5
- import { sendmessage } from "sendmessage";
6
- import { graceful } from "graceful-process";
7
-
8
- //#region src/utils/mode/impl/process/agent.ts
9
- var AgentProcessWorker = class 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
- graceful(options);
26
- }
27
- };
28
- var AgentProcessUtils = class 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") forkOptions.windowsHide = true;
37
- const debugPort = process.env.EGG_AGENT_DEBUG_PORT ?? 5800;
38
- if (this.options.isDebug) forkOptions.execArgv = process.execArgv.concat([`--inspect-port=${debugPort}`]);
39
- const agentProcess = this.#agentProcess = fork(this.getAgentWorkerFile(), args, forkOptions);
40
- const agentWorker = this.instance = new AgentProcessWorker(agentProcess);
41
- agentWorker.status = "starting";
42
- agentWorker.id = ++this.#id;
43
- this.emit("agent_forked", agentWorker);
44
- this.log("[master] agent_worker#%s:%s start with clusterPort:%s", agentWorker.id, agentWorker.workerId, this.options.clusterPort);
45
- if (this.options.isDebug) this.messenger.send({
46
- to: "parent",
47
- from: "agent",
48
- action: "debug",
49
- data: {
50
- debugPort,
51
- pid: agentWorker.workerId,
52
- workerId: agentWorker.workerId
53
- }
54
- });
55
- agentProcess.on("message", (msg) => {
56
- if (typeof msg === "string") msg = {
57
- action: msg,
58
- data: msg
59
- };
60
- msg.from = "agent";
61
- this.messenger.send(msg);
62
- });
63
- agentProcess.on("error", (err) => {
64
- err.name = "AgentWorkerError";
65
- this.logger.error(new ClusterAgentWorkerError(agentWorker.id, agentWorker.workerId, agentWorker.status, err));
66
- });
67
- agentProcess.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
- return this;
79
- }
80
- clean() {
81
- this.#agentProcess.removeAllListeners();
82
- }
83
- async kill(timeout) {
84
- if (this.#agentProcess) {
85
- this.log("[master] kill agent worker with signal SIGTERM");
86
- this.clean();
87
- await terminate(this.#agentProcess, timeout);
88
- }
89
- }
90
- };
91
-
92
- //#endregion
93
- export { AgentProcessUtils, AgentProcessWorker };
7
+ export class AgentProcessWorker extends BaseAgentWorker {
8
+ get workerId() {
9
+ return this.instance.pid;
10
+ }
11
+ send(message) {
12
+ sendmessage(this.instance, message);
13
+ }
14
+ static send(message) {
15
+ message.senderWorkerId = String(process.pid);
16
+ process.send(message);
17
+ }
18
+ static kill() {
19
+ process.exitCode = 1;
20
+ process.kill(process.pid);
21
+ }
22
+ static gracefulExit(options) {
23
+ gracefulExit(options);
24
+ }
25
+ }
26
+ export class AgentProcessUtils extends BaseAgentUtils {
27
+ #agentProcess;
28
+ #id = 0;
29
+ instance;
30
+ fork() {
31
+ this.startTime = Date.now();
32
+ const args = [JSON.stringify(this.options)];
33
+ const forkOptions = {};
34
+ if (process.platform === 'win32') {
35
+ forkOptions.windowsHide = true;
36
+ }
37
+ // add debug execArgv
38
+ const debugPort = process.env.EGG_AGENT_DEBUG_PORT ?? 5800;
39
+ if (this.options.isDebug) {
40
+ forkOptions.execArgv = process.execArgv.concat([`--inspect-port=${debugPort}`]);
41
+ }
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
+ // send debug message
49
+ if (this.options.isDebug) {
50
+ this.messenger.send({
51
+ to: 'parent',
52
+ from: 'agent',
53
+ action: 'debug',
54
+ data: {
55
+ debugPort,
56
+ // keep compatibility, should use workerId instead
57
+ pid: agentWorker.workerId,
58
+ workerId: agentWorker.workerId,
59
+ },
60
+ });
61
+ }
62
+ // forwarding agent' message to messenger
63
+ agentProcess.on('message', (msg) => {
64
+ if (typeof msg === 'string') {
65
+ msg = {
66
+ action: msg,
67
+ data: msg,
68
+ };
69
+ }
70
+ msg.from = 'agent';
71
+ this.messenger.send(msg);
72
+ });
73
+ // logger error event
74
+ agentProcess.on('error', err => {
75
+ err.name = 'AgentWorkerError';
76
+ this.logger.error(new ClusterAgentWorkerError(agentWorker.id, agentWorker.workerId, agentWorker.status, err));
77
+ });
78
+ // agent exit message
79
+ agentProcess.once('exit', (code, signal) => {
80
+ this.messenger.send({
81
+ action: 'agent-exit',
82
+ data: {
83
+ code,
84
+ signal,
85
+ },
86
+ to: 'master',
87
+ from: 'agent',
88
+ });
89
+ });
90
+ return this;
91
+ }
92
+ clean() {
93
+ this.#agentProcess.removeAllListeners();
94
+ }
95
+ async kill(timeout) {
96
+ if (this.#agentProcess) {
97
+ this.log('[master] kill agent worker with signal SIGTERM');
98
+ this.clean();
99
+ await terminate(this.#agentProcess, timeout);
100
+ }
101
+ }
102
+ }
103
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdlbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvdXRpbHMvbW9kZS9pbXBsL3Byb2Nlc3MvYWdlbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLElBQUksRUFBdUMsTUFBTSxvQkFBb0IsQ0FBQztBQUUvRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzFDLE9BQU8sRUFBRSxRQUFRLElBQUksWUFBWSxFQUF1QyxNQUFNLGtCQUFrQixDQUFDO0FBRWpHLE9BQU8sRUFBRSxlQUFlLEVBQUUsY0FBYyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRWxELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDhDQUE4QyxDQUFDO0FBRXZGLE1BQU0sT0FBTyxrQkFBbUIsU0FBUSxlQUE2QjtJQUNuRSxJQUFJLFFBQVE7UUFDVixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBSSxDQUFDO0lBQzVCLENBQUM7SUFFRCxJQUFJLENBQUMsT0FBb0I7UUFDdkIsV0FBVyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVELE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBb0I7UUFDOUIsT0FBTyxDQUFDLGNBQWMsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzdDLE9BQU8sQ0FBQyxJQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDekIsQ0FBQztJQUVELE1BQU0sQ0FBQyxJQUFJO1FBQ1QsT0FBTyxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUM7UUFDckIsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUVELE1BQU0sQ0FBQyxZQUFZLENBQUMsT0FBNEI7UUFDOUMsWUFB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
@@ -1,12 +1,21 @@
1
- import { BaseAppUtils } from "../../base/app.js";
2
- import { Options } from "graceful-process";
3
- import { Worker } from "node:cluster";
4
-
5
- //#region src/utils/mode/impl/process/app.d.ts
6
-
7
- declare class AppProcessUtils extends BaseAppUtils {
8
- fork(): this;
9
- kill(timeout: number): Promise<void>;
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;
17
+ }
18
+ export declare class AppProcessUtils extends BaseAppUtils {
19
+ fork(): this;
20
+ kill(timeout: number): Promise<void>;
10
21
  }
11
- //#endregion
12
- export { AppProcessUtils };