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

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 (33) hide show
  1. package/dist/agent-griHEaCW.js +246 -0
  2. package/dist/agent_worker.js +2 -2
  3. package/dist/app-5Was1vub.js +315 -0
  4. package/dist/app_worker.js +2 -2
  5. package/dist/index.d.ts +440 -5
  6. package/dist/index.js +692 -4
  7. package/dist/{utils/terminate.js → terminate-w3g0oQgq.js} +10 -1
  8. package/package.json +5 -5
  9. package/dist/dirname.js +0 -11
  10. package/dist/error/ClusterAgentWorkerError.d.ts +0 -13
  11. package/dist/error/ClusterAgentWorkerError.js +0 -22
  12. package/dist/error/ClusterWorkerExceptionError.d.ts +0 -10
  13. package/dist/error/ClusterWorkerExceptionError.js +0 -17
  14. package/dist/master.d.ts +0 -96
  15. package/dist/master.js +0 -426
  16. package/dist/utils/messenger.d.ts +0 -96
  17. package/dist/utils/messenger.js +0 -144
  18. package/dist/utils/mode/base/agent.d.ts +0 -45
  19. package/dist/utils/mode/base/agent.js +0 -63
  20. package/dist/utils/mode/base/app.d.ts +0 -56
  21. package/dist/utils/mode/base/app.js +0 -77
  22. package/dist/utils/mode/impl/process/agent.d.ts +0 -22
  23. package/dist/utils/mode/impl/process/agent.js +0 -93
  24. package/dist/utils/mode/impl/process/app.d.ts +0 -12
  25. package/dist/utils/mode/impl/process/app.js +0 -117
  26. package/dist/utils/mode/impl/worker_threads/agent.d.ts +0 -22
  27. package/dist/utils/mode/impl/worker_threads/agent.js +0 -79
  28. package/dist/utils/mode/impl/worker_threads/app.d.ts +0 -13
  29. package/dist/utils/mode/impl/worker_threads/app.js +0 -128
  30. package/dist/utils/options.d.ts +0 -83
  31. package/dist/utils/options.js +0 -56
  32. package/dist/utils/worker_manager.d.ts +0 -32
  33. package/dist/utils/worker_manager.js +0 -68
@@ -1,96 +0,0 @@
1
- import { WorkerManager } from "./worker_manager.js";
2
- import { Master } from "../master.js";
3
-
4
- //#region src/utils/messenger.d.ts
5
- type MessageCharacter = 'agent' | 'app' | 'master' | 'parent';
6
- interface MessageBody {
7
- action: string;
8
- data?: unknown;
9
- to?: MessageCharacter;
10
- from?: MessageCharacter;
11
- /**
12
- * @deprecated Keep compatible, please use receiverWorkerId instead
13
- */
14
- receiverPid?: string;
15
- receiverWorkerId?: string;
16
- senderWorkerId?: string;
17
- }
18
- /**
19
- * master messenger, provide communication between parent, master, agent and app.
20
- *
21
- * ┌────────┐
22
- * │ parent │
23
- * /└────────┘\
24
- * / | \
25
- * / ┌────────┐ \
26
- * / │ master │ \
27
- * / └────────┘ \
28
- * / / \ \
29
- * ┌───────┐ ┌───────┐
30
- * │ agent │ ------- │ app │
31
- * └───────┘ └───────┘
32
- *
33
- *
34
- * in app worker
35
- *
36
- * ```js
37
- * process.send({
38
- * action: 'xxx',
39
- * data: '',
40
- * to: 'agent/master/parent', // default to agent
41
- * });
42
- * ```
43
- *
44
- * in agent worker
45
- *
46
- * ```js
47
- * process.send({
48
- * action: 'xxx',
49
- * data: '',
50
- * to: 'app/master/parent', // default to app
51
- * });
52
- * ```
53
- *
54
- * in parent
55
- *
56
- * ```js
57
- * process.send({
58
- * action: 'xxx',
59
- * data: '',
60
- * to: 'app/agent/master', // default to master
61
- * });
62
- * ```
63
- */
64
- declare class Messenger {
65
- #private;
66
- constructor(master: Master, workerManager: WorkerManager);
67
- /**
68
- * send message
69
- * @param {Object} data message body
70
- * - {String} from from who
71
- * - {String} to to who
72
- */
73
- send(data: MessageBody): void;
74
- /**
75
- * send message to master self
76
- * @param {Object} data message body
77
- */
78
- sendToMaster(data: MessageBody): void;
79
- /**
80
- * send message to parent process
81
- * @param {Object} data message body
82
- */
83
- sendToParent(data: MessageBody): void;
84
- /**
85
- * send message to app worker
86
- * @param {Object} data message body
87
- */
88
- sendToAppWorker(data: MessageBody): void;
89
- /**
90
- * send message to agent worker
91
- * @param {Object} data message body
92
- */
93
- sendToAgentWorker(data: MessageBody): void;
94
- }
95
- //#endregion
96
- export { MessageBody, Messenger };
@@ -1,144 +0,0 @@
1
- import { debuglog } from "node:util";
2
- import workerThreads from "node:worker_threads";
3
-
4
- //#region src/utils/messenger.ts
5
- const debug = debuglog("egg/cluster/messenger");
6
- /**
7
- * master messenger, provide communication between parent, master, agent and app.
8
- *
9
- * ┌────────┐
10
- * │ parent │
11
- * /└────────┘\
12
- * / | \
13
- * / ┌────────┐ \
14
- * / │ master │ \
15
- * / └────────┘ \
16
- * / / \ \
17
- * ┌───────┐ ┌───────┐
18
- * │ agent │ ------- │ app │
19
- * └───────┘ └───────┘
20
- *
21
- *
22
- * in app worker
23
- *
24
- * ```js
25
- * process.send({
26
- * action: 'xxx',
27
- * data: '',
28
- * to: 'agent/master/parent', // default to agent
29
- * });
30
- * ```
31
- *
32
- * in agent worker
33
- *
34
- * ```js
35
- * process.send({
36
- * action: 'xxx',
37
- * data: '',
38
- * to: 'app/master/parent', // default to app
39
- * });
40
- * ```
41
- *
42
- * in parent
43
- *
44
- * ```js
45
- * process.send({
46
- * action: 'xxx',
47
- * data: '',
48
- * to: 'app/agent/master', // default to master
49
- * });
50
- * ```
51
- */
52
- var Messenger = class {
53
- #master;
54
- #workerManager;
55
- #hasParent;
56
- constructor(master, workerManager) {
57
- this.#master = master;
58
- this.#workerManager = workerManager;
59
- this.#hasParent = !!workerThreads.parentPort || !!process.send;
60
- process.on("message", (msg) => {
61
- msg.from = "parent";
62
- this.send(msg);
63
- });
64
- process.once("disconnect", () => {
65
- this.#hasParent = false;
66
- });
67
- }
68
- /**
69
- * send message
70
- * @param {Object} data message body
71
- * - {String} from from who
72
- * - {String} to to who
73
- */
74
- send(data) {
75
- if (!data.from) data.from = "master";
76
- const receiverWorkerId = data.receiverWorkerId ?? data.receiverPid;
77
- if (receiverWorkerId) if (receiverWorkerId === String(process.pid)) data.to = "master";
78
- else if (receiverWorkerId === String(this.#workerManager.getAgent().workerId)) data.to = "agent";
79
- else data.to = "app";
80
- if (!data.to) {
81
- if (data.from === "agent") data.to = "app";
82
- if (data.from === "app") data.to = "agent";
83
- if (data.from === "parent") data.to = "master";
84
- }
85
- if (data.to === "master") {
86
- debug("%s -> master, data: %j", data.from, data);
87
- this.sendToMaster(data);
88
- return;
89
- }
90
- if (data.to === "parent") {
91
- debug("%s -> parent, data: %j", data.from, data);
92
- this.sendToParent(data);
93
- return;
94
- }
95
- if (data.to === "app") {
96
- debug("%s -> %s, data: %j", data.from, data.to, data);
97
- this.sendToAppWorker(data);
98
- return;
99
- }
100
- if (data.to === "agent") {
101
- debug("%s -> %s, data: %j", data.from, data.to, data);
102
- this.sendToAgentWorker(data);
103
- return;
104
- }
105
- }
106
- /**
107
- * send message to master self
108
- * @param {Object} data message body
109
- */
110
- sendToMaster(data) {
111
- this.#master.emit(data.action, data.data);
112
- }
113
- /**
114
- * send message to parent process
115
- * @param {Object} data message body
116
- */
117
- sendToParent(data) {
118
- if (!this.#hasParent) return;
119
- process.send(data);
120
- }
121
- /**
122
- * send message to app worker
123
- * @param {Object} data message body
124
- */
125
- sendToAppWorker(data) {
126
- for (const worker of this.#workerManager.listWorkers()) {
127
- if (worker.state === "disconnected") continue;
128
- const receiverWorkerId = data.receiverWorkerId ?? data.receiverPid;
129
- if (receiverWorkerId && receiverWorkerId !== String(worker.workerId)) continue;
130
- worker.send(data);
131
- }
132
- }
133
- /**
134
- * send message to agent worker
135
- * @param {Object} data message body
136
- */
137
- sendToAgentWorker(data) {
138
- const agent = this.#workerManager.getAgent();
139
- if (agent) agent.send(data);
140
- }
141
- };
142
-
143
- //#endregion
144
- export { Messenger };
@@ -1,45 +0,0 @@
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 { ChildProcess } from "node:child_process";
7
-
8
- //#region src/utils/mode/base/agent.d.ts
9
- declare abstract class BaseAgentWorker<T = ChildProcess | Worker> {
10
- #private;
11
- instance: T;
12
- constructor(instance: T);
13
- abstract get workerId(): number;
14
- get id(): number;
15
- set id(id: number);
16
- get status(): string;
17
- set status(status: string);
18
- abstract send(message: MessageBody): void;
19
- static send(_message: MessageBody): void;
20
- static kill(): void;
21
- static gracefulExit(_options: any): void;
22
- }
23
- type LogFun = (msg: any, ...args: any[]) => void;
24
- declare abstract class BaseAgentUtils extends EventEmitter {
25
- protected options: MasterOptions;
26
- protected messenger: Messenger;
27
- protected log: LogFun;
28
- protected logger: Logger;
29
- startTime: number;
30
- constructor(options: MasterOptions, {
31
- log,
32
- logger,
33
- messenger
34
- }: {
35
- log: LogFun;
36
- logger: Logger;
37
- messenger: Messenger;
38
- });
39
- getAgentWorkerFile(): string;
40
- fork(): void;
41
- clean(): void;
42
- abstract kill(timeout: number): Promise<void>;
43
- }
44
- //#endregion
45
- export { BaseAgentUtils, BaseAgentWorker };
@@ -1,63 +0,0 @@
1
- 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/agent.ts
7
- var BaseAgentWorker = class {
8
- instance;
9
- #instanceId;
10
- #instanceStatus;
11
- constructor(instance) {
12
- this.instance = instance;
13
- }
14
- get id() {
15
- return this.#instanceId;
16
- }
17
- set id(id) {
18
- this.#instanceId = id;
19
- }
20
- get status() {
21
- return this.#instanceStatus;
22
- }
23
- set status(status) {
24
- this.#instanceStatus = status;
25
- }
26
- static send(_message) {
27
- throw new Error("BaseAgentWorker should implement send.");
28
- }
29
- static kill() {
30
- throw new Error("BaseAgentWorker should implement kill.");
31
- }
32
- static gracefulExit(_options) {
33
- throw new Error("BaseAgentWorker should implement gracefulExit.");
34
- }
35
- };
36
- var BaseAgentUtils = class extends EventEmitter {
37
- options;
38
- messenger;
39
- log;
40
- logger;
41
- startTime = 0;
42
- constructor(options, { log, logger, messenger }) {
43
- super();
44
- this.options = options;
45
- this.log = log;
46
- this.logger = logger;
47
- this.messenger = messenger;
48
- }
49
- getAgentWorkerFile() {
50
- let agentWorkerFile = path.join(getSrcDirname(), "agent_worker.js");
51
- if (!existsSync(agentWorkerFile)) agentWorkerFile = path.join(getSrcDirname(), "agent_worker.ts");
52
- return agentWorkerFile;
53
- }
54
- fork() {
55
- throw new Error("BaseAgent should implement fork.");
56
- }
57
- clean() {
58
- throw new Error("BaseAgent should implement clean.");
59
- }
60
- };
61
-
62
- //#endregion
63
- export { BaseAgentUtils, BaseAgentWorker };
@@ -1,56 +0,0 @@
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;
29
- }
30
- 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>;
54
- }
55
- //#endregion
56
- export { BaseAppUtils, BaseAppWorker };
@@ -1,77 +0,0 @@
1
- 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 };
@@ -1,22 +0,0 @@
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;
13
- }
14
- declare class AgentProcessUtils extends BaseAgentUtils {
15
- #private;
16
- instance: AgentProcessWorker;
17
- fork(): this;
18
- clean(): void;
19
- kill(timeout: number): Promise<void>;
20
- }
21
- //#endregion
22
- export { AgentProcessUtils };
@@ -1,93 +0,0 @@
1
- import { BaseAgentUtils, BaseAgentWorker } from "../../base/agent.js";
2
- import { terminate } from "../../../terminate.js";
3
- 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 };
@@ -1,12 +0,0 @@
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>;
10
- }
11
- //#endregion
12
- export { AppProcessUtils };