@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,92 +1,96 @@
1
- import type { Master } from '../master.ts';
2
- import type { WorkerManager } from './worker_manager.ts';
3
- export type MessageCharacter = 'agent' | 'app' | 'master' | 'parent';
4
- export interface MessageBody {
5
- action: string;
6
- data?: unknown;
7
- to?: MessageCharacter;
8
- from?: MessageCharacter;
9
- /**
10
- * @deprecated Keep compatible, please use receiverWorkerId instead
11
- */
12
- receiverPid?: string;
13
- receiverWorkerId?: string;
14
- senderWorkerId?: string;
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;
15
17
  }
16
18
  /**
17
- * master messenger, provide communication between parent, master, agent and app.
18
- *
19
- * ┌────────┐
20
- * │ parent │
21
- * /└────────┘\
22
- * / | \
23
- * / ┌────────┐ \
24
- * / │ master │ \
25
- * / └────────┘ \
26
- * / / \ \
27
- * ┌───────┐ ┌───────┐
28
- * │ agent │ ------- │ app │
29
- * └───────┘ └───────┘
30
- *
31
- *
32
- * in app worker
33
- *
34
- * ```js
35
- * process.send({
36
- * action: 'xxx',
37
- * data: '',
38
- * to: 'agent/master/parent', // default to agent
39
- * });
40
- * ```
41
- *
42
- * in agent worker
43
- *
44
- * ```js
45
- * process.send({
46
- * action: 'xxx',
47
- * data: '',
48
- * to: 'app/master/parent', // default to app
49
- * });
50
- * ```
51
- *
52
- * in parent
53
- *
54
- * ```js
55
- * process.send({
56
- * action: 'xxx',
57
- * data: '',
58
- * to: 'app/agent/master', // default to master
59
- * });
60
- * ```
61
- */
62
- export declare class Messenger {
63
- #private;
64
- constructor(master: Master, workerManager: WorkerManager);
65
- /**
66
- * send message
67
- * @param {Object} data message body
68
- * - {String} from from who
69
- * - {String} to to who
70
- */
71
- send(data: MessageBody): void;
72
- /**
73
- * send message to master self
74
- * @param {Object} data message body
75
- */
76
- sendToMaster(data: MessageBody): void;
77
- /**
78
- * send message to parent process
79
- * @param {Object} data message body
80
- */
81
- sendToParent(data: MessageBody): void;
82
- /**
83
- * send message to app worker
84
- * @param {Object} data message body
85
- */
86
- sendToAppWorker(data: MessageBody): void;
87
- /**
88
- * send message to agent worker
89
- * @param {Object} data message body
90
- */
91
- sendToAgentWorker(data: MessageBody): void;
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;
92
94
  }
95
+ //#endregion
96
+ export { MessageBody, Messenger };
@@ -1,179 +1,144 @@
1
- import { debuglog } from 'node:util';
2
- import workerThreads from 'node:worker_threads';
3
- const debug = debuglog('egg/cluster/messenger');
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");
4
6
  /**
5
- * master messenger, provide communication between parent, master, agent and app.
6
- *
7
- * ┌────────┐
8
- * │ parent │
9
- * /└────────┘\
10
- * / | \
11
- * / ┌────────┐ \
12
- * / │ master │ \
13
- * / └────────┘ \
14
- * / / \ \
15
- * ┌───────┐ ┌───────┐
16
- * │ agent │ ------- │ app │
17
- * └───────┘ └───────┘
18
- *
19
- *
20
- * in app worker
21
- *
22
- * ```js
23
- * process.send({
24
- * action: 'xxx',
25
- * data: '',
26
- * to: 'agent/master/parent', // default to agent
27
- * });
28
- * ```
29
- *
30
- * in agent worker
31
- *
32
- * ```js
33
- * process.send({
34
- * action: 'xxx',
35
- * data: '',
36
- * to: 'app/master/parent', // default to app
37
- * });
38
- * ```
39
- *
40
- * in parent
41
- *
42
- * ```js
43
- * process.send({
44
- * action: 'xxx',
45
- * data: '',
46
- * to: 'app/agent/master', // default to master
47
- * });
48
- * ```
49
- */
50
- export class Messenger {
51
- #master;
52
- #workerManager;
53
- #hasParent;
54
- constructor(master, workerManager) {
55
- this.#master = master;
56
- this.#workerManager = workerManager;
57
- this.#hasParent = !!workerThreads.parentPort || !!process.send;
58
- process.on('message', (msg) => {
59
- msg.from = 'parent';
60
- this.send(msg);
61
- });
62
- process.once('disconnect', () => {
63
- this.#hasParent = false;
64
- });
65
- }
66
- /**
67
- * send message
68
- * @param {Object} data message body
69
- * - {String} from from who
70
- * - {String} to to who
71
- */
72
- send(data) {
73
- if (!data.from) {
74
- data.from = 'master';
75
- }
76
- // https://github.com/eggjs/egg/blob/b6861f1c7548f05a281386050dfeaeb30f236558/lib/core/messenger/ipc.js#L56
77
- // recognize receiverWorkerId is to who
78
- const receiverWorkerId = data.receiverWorkerId ?? data.receiverPid;
79
- if (receiverWorkerId) {
80
- if (receiverWorkerId === String(process.pid)) {
81
- data.to = 'master';
82
- }
83
- else if (receiverWorkerId === String(this.#workerManager.getAgent().workerId)) {
84
- data.to = 'agent';
85
- }
86
- else {
87
- data.to = 'app';
88
- }
89
- }
90
- // default from -> to rules
91
- if (!data.to) {
92
- if (data.from === 'agent') {
93
- data.to = 'app';
94
- }
95
- if (data.from === 'app') {
96
- data.to = 'agent';
97
- }
98
- if (data.from === 'parent') {
99
- data.to = 'master';
100
- }
101
- }
102
- // app -> master
103
- // agent -> master
104
- if (data.to === 'master') {
105
- debug('%s -> master, data: %j', data.from, data);
106
- // app/agent to master
107
- this.sendToMaster(data);
108
- return;
109
- }
110
- // master -> parent
111
- // app -> parent
112
- // agent -> parent
113
- if (data.to === 'parent') {
114
- debug('%s -> parent, data: %j', data.from, data);
115
- this.sendToParent(data);
116
- return;
117
- }
118
- // parent -> master -> app
119
- // agent -> master -> app
120
- if (data.to === 'app') {
121
- debug('%s -> %s, data: %j', data.from, data.to, data);
122
- this.sendToAppWorker(data);
123
- return;
124
- }
125
- // parent -> master -> agent
126
- // app -> master -> agent,可能不指定 to
127
- if (data.to === 'agent') {
128
- debug('%s -> %s, data: %j', data.from, data.to, data);
129
- this.sendToAgentWorker(data);
130
- return;
131
- }
132
- }
133
- /**
134
- * send message to master self
135
- * @param {Object} data message body
136
- */
137
- sendToMaster(data) {
138
- // e.g: master.on('app-start', data => {})
139
- this.#master.emit(data.action, data.data);
140
- }
141
- /**
142
- * send message to parent process
143
- * @param {Object} data message body
144
- */
145
- sendToParent(data) {
146
- if (!this.#hasParent) {
147
- return;
148
- }
149
- process.send(data);
150
- }
151
- /**
152
- * send message to app worker
153
- * @param {Object} data message body
154
- */
155
- sendToAppWorker(data) {
156
- for (const worker of this.#workerManager.listWorkers()) {
157
- if (worker.state === 'disconnected') {
158
- continue;
159
- }
160
- // check receiverWorkerId
161
- const receiverWorkerId = data.receiverWorkerId ?? data.receiverPid;
162
- if (receiverWorkerId && receiverWorkerId !== String(worker.workerId)) {
163
- continue;
164
- }
165
- worker.send(data);
166
- }
167
- }
168
- /**
169
- * send message to agent worker
170
- * @param {Object} data message body
171
- */
172
- sendToAgentWorker(data) {
173
- const agent = this.#workerManager.getAgent();
174
- if (agent) {
175
- agent.send(data);
176
- }
177
- }
178
- }
179
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2VuZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL21lc3Nlbmdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3JDLE9BQU8sYUFBYSxNQUFNLHFCQUFxQixDQUFDO0FBS2hELE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO0FBaUJoRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNkNHO0FBQ0gsTUFBTSxPQUFPLFNBQVM7SUFDcEIsT0FBTyxDQUFTO0lBQ2hCLGNBQWMsQ0FBZ0I7SUFDOUIsVUFBVSxDQUFVO0lBRXBCLFlBQVksTUFBYyxFQUFFLGFBQTRCO1FBQ3RELElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxjQUFjLEdBQUcsYUFBYSxDQUFDO1FBQ3BDLElBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxVQUFVLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7UUFDL0QsT0FBTyxDQUFDLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxHQUFnQixFQUFFLEVBQUU7WUFDekMsR0FBRyxDQUFDLElBQUksR0FBRyxRQUFRLENBQUM7WUFDcEIsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNqQixDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLEdBQUcsRUFBRTtZQUM5QixJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztRQUMxQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILElBQUksQ0FBQyxJQUFpQjtRQUNwQixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2YsSUFB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
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,38 +1,45 @@
1
- import { EventEmitter } from 'node:events';
2
- import type { ChildProcess } from 'node:child_process';
3
- import type { Worker } from 'node:worker_threads';
4
- import type { Logger } from 'egg-logger';
5
- import type { MasterOptions } from '../../../master.ts';
6
- import type { MessageBody, Messenger } from '../../messenger.ts';
7
- export declare abstract class BaseAgentWorker<T = ChildProcess | Worker> {
8
- #private;
9
- instance: T;
10
- constructor(instance: T);
11
- abstract get workerId(): number;
12
- get id(): number;
13
- set id(id: number);
14
- get status(): string;
15
- set status(status: string);
16
- abstract send(message: MessageBody): void;
17
- static send(_message: MessageBody): void;
18
- static kill(): void;
19
- static gracefulExit(_options: any): void;
1
+ import { MessageBody, Messenger } from "../../messenger.js";
2
+ import { MasterOptions } from "../../../master.js";
3
+ import { Logger } from "egg-logger";
4
+ import { Worker } from "node:worker_threads";
5
+ import { ChildProcess } from "node:child_process";
6
+ import { EventEmitter } from "node:events";
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;
20
22
  }
21
23
  type LogFun = (msg: any, ...args: any[]) => void;
22
- export declare abstract class BaseAgentUtils extends EventEmitter {
23
- protected options: MasterOptions;
24
- protected messenger: Messenger;
25
- protected log: LogFun;
26
- protected logger: Logger;
27
- startTime: number;
28
- constructor(options: MasterOptions, { log, logger, messenger, }: {
29
- log: LogFun;
30
- logger: Logger;
31
- messenger: Messenger;
32
- });
33
- getAgentWorkerFile(): string;
34
- fork(): void;
35
- clean(): void;
36
- abstract kill(timeout: number): Promise<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>;
37
43
  }
38
- export {};
44
+ //#endregion
45
+ export { BaseAgentUtils, BaseAgentWorker };