@eggjs/cluster 3.0.0-beta.0

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 (96) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +92 -0
  3. package/dist/commonjs/agent_worker.d.ts +1 -0
  4. package/dist/commonjs/agent_worker.js +65 -0
  5. package/dist/commonjs/app_worker.d.ts +1 -0
  6. package/dist/commonjs/app_worker.js +151 -0
  7. package/dist/commonjs/dirname.d.ts +1 -0
  8. package/dist/commonjs/dirname.js +17 -0
  9. package/dist/commonjs/error/ClusterAgentWorkerError.d.ts +10 -0
  10. package/dist/commonjs/error/ClusterAgentWorkerError.js +23 -0
  11. package/dist/commonjs/error/ClusterWorkerExceptionError.d.ts +7 -0
  12. package/dist/commonjs/error/ClusterWorkerExceptionError.js +18 -0
  13. package/dist/commonjs/error/index.d.ts +2 -0
  14. package/dist/commonjs/error/index.js +19 -0
  15. package/dist/commonjs/index.d.ts +17 -0
  16. package/dist/commonjs/index.js +37 -0
  17. package/dist/commonjs/master.d.ts +90 -0
  18. package/dist/commonjs/master.js +544 -0
  19. package/dist/commonjs/package.json +3 -0
  20. package/dist/commonjs/utils/messenger.d.ts +87 -0
  21. package/dist/commonjs/utils/messenger.js +183 -0
  22. package/dist/commonjs/utils/mode/base/agent.d.ts +38 -0
  23. package/dist/commonjs/utils/mode/base/agent.js +68 -0
  24. package/dist/commonjs/utils/mode/base/app.d.ts +48 -0
  25. package/dist/commonjs/utils/mode/base/app.js +81 -0
  26. package/dist/commonjs/utils/mode/impl/process/agent.d.ts +18 -0
  27. package/dist/commonjs/utils/mode/impl/process/agent.js +107 -0
  28. package/dist/commonjs/utils/mode/impl/process/app.d.ts +20 -0
  29. package/dist/commonjs/utils/mode/impl/process/app.js +134 -0
  30. package/dist/commonjs/utils/mode/impl/worker_threads/agent.d.ts +18 -0
  31. package/dist/commonjs/utils/mode/impl/worker_threads/agent.js +90 -0
  32. package/dist/commonjs/utils/mode/impl/worker_threads/app.d.ts +25 -0
  33. package/dist/commonjs/utils/mode/impl/worker_threads/app.js +156 -0
  34. package/dist/commonjs/utils/options.d.ts +80 -0
  35. package/dist/commonjs/utils/options.js +81 -0
  36. package/dist/commonjs/utils/terminate.d.ts +6 -0
  37. package/dist/commonjs/utils/terminate.js +89 -0
  38. package/dist/commonjs/utils/worker_manager.d.ts +25 -0
  39. package/dist/commonjs/utils/worker_manager.js +76 -0
  40. package/dist/esm/agent_worker.d.ts +1 -0
  41. package/dist/esm/agent_worker.js +63 -0
  42. package/dist/esm/app_worker.d.ts +1 -0
  43. package/dist/esm/app_worker.js +146 -0
  44. package/dist/esm/dirname.d.ts +1 -0
  45. package/dist/esm/dirname.js +11 -0
  46. package/dist/esm/error/ClusterAgentWorkerError.d.ts +10 -0
  47. package/dist/esm/error/ClusterAgentWorkerError.js +19 -0
  48. package/dist/esm/error/ClusterWorkerExceptionError.d.ts +7 -0
  49. package/dist/esm/error/ClusterWorkerExceptionError.js +14 -0
  50. package/dist/esm/error/index.d.ts +2 -0
  51. package/dist/esm/error/index.js +3 -0
  52. package/dist/esm/index.d.ts +17 -0
  53. package/dist/esm/index.js +19 -0
  54. package/dist/esm/master.d.ts +90 -0
  55. package/dist/esm/master.js +537 -0
  56. package/dist/esm/package.json +3 -0
  57. package/dist/esm/utils/messenger.d.ts +87 -0
  58. package/dist/esm/utils/messenger.js +176 -0
  59. package/dist/esm/utils/mode/base/agent.d.ts +38 -0
  60. package/dist/esm/utils/mode/base/agent.js +60 -0
  61. package/dist/esm/utils/mode/base/app.d.ts +48 -0
  62. package/dist/esm/utils/mode/base/app.js +73 -0
  63. package/dist/esm/utils/mode/impl/process/agent.d.ts +18 -0
  64. package/dist/esm/utils/mode/impl/process/agent.js +102 -0
  65. package/dist/esm/utils/mode/impl/process/app.d.ts +20 -0
  66. package/dist/esm/utils/mode/impl/process/app.js +126 -0
  67. package/dist/esm/utils/mode/impl/worker_threads/agent.d.ts +18 -0
  68. package/dist/esm/utils/mode/impl/worker_threads/agent.js +82 -0
  69. package/dist/esm/utils/mode/impl/worker_threads/app.d.ts +25 -0
  70. package/dist/esm/utils/mode/impl/worker_threads/app.js +151 -0
  71. package/dist/esm/utils/options.d.ts +80 -0
  72. package/dist/esm/utils/options.js +75 -0
  73. package/dist/esm/utils/terminate.d.ts +6 -0
  74. package/dist/esm/utils/terminate.js +86 -0
  75. package/dist/esm/utils/worker_manager.d.ts +25 -0
  76. package/dist/esm/utils/worker_manager.js +72 -0
  77. package/dist/package.json +4 -0
  78. package/package.json +94 -0
  79. package/src/agent_worker.ts +75 -0
  80. package/src/app_worker.ts +170 -0
  81. package/src/dirname.ts +11 -0
  82. package/src/error/ClusterAgentWorkerError.ts +19 -0
  83. package/src/error/ClusterWorkerExceptionError.ts +17 -0
  84. package/src/error/index.ts +2 -0
  85. package/src/index.ts +26 -0
  86. package/src/master.ts +641 -0
  87. package/src/utils/messenger.ts +199 -0
  88. package/src/utils/mode/base/agent.ts +90 -0
  89. package/src/utils/mode/base/app.ts +115 -0
  90. package/src/utils/mode/impl/process/agent.ts +118 -0
  91. package/src/utils/mode/impl/process/app.ts +146 -0
  92. package/src/utils/mode/impl/worker_threads/agent.ts +98 -0
  93. package/src/utils/mode/impl/worker_threads/app.ts +180 -0
  94. package/src/utils/options.ts +169 -0
  95. package/src/utils/terminate.ts +97 -0
  96. package/src/utils/worker_manager.ts +87 -0
@@ -0,0 +1,176 @@
1
+ import { debuglog } from 'node:util';
2
+ import workerThreads from 'node:worker_threads';
3
+ const debug = debuglog('@eggjs/cluster/messenger');
4
+ /**
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 receiverPid is to who
78
+ if (data.receiverPid) {
79
+ if (data.receiverPid === String(process.pid)) {
80
+ data.to = 'master';
81
+ }
82
+ else if (data.receiverPid === String(this.#workerManager.getAgent().workerId)) {
83
+ data.to = 'agent';
84
+ }
85
+ else {
86
+ data.to = 'app';
87
+ }
88
+ }
89
+ // default from -> to rules
90
+ if (!data.to) {
91
+ if (data.from === 'agent') {
92
+ data.to = 'app';
93
+ }
94
+ if (data.from === 'app') {
95
+ data.to = 'agent';
96
+ }
97
+ if (data.from === 'parent') {
98
+ data.to = 'master';
99
+ }
100
+ }
101
+ // app -> master
102
+ // agent -> master
103
+ if (data.to === 'master') {
104
+ debug('%s -> master, data: %j', data.from, data);
105
+ // app/agent to master
106
+ this.sendToMaster(data);
107
+ return;
108
+ }
109
+ // master -> parent
110
+ // app -> parent
111
+ // agent -> parent
112
+ if (data.to === 'parent') {
113
+ debug('%s -> parent, data: %j', data.from, data);
114
+ this.sendToParent(data);
115
+ return;
116
+ }
117
+ // parent -> master -> app
118
+ // agent -> master -> app
119
+ if (data.to === 'app') {
120
+ debug('%s -> %s, data: %j', data.from, data.to, data);
121
+ this.sendToAppWorker(data);
122
+ return;
123
+ }
124
+ // parent -> master -> agent
125
+ // app -> master -> agent,可能不指定 to
126
+ if (data.to === 'agent') {
127
+ debug('%s -> %s, data: %j', data.from, data.to, data);
128
+ this.sendToAgentWorker(data);
129
+ return;
130
+ }
131
+ }
132
+ /**
133
+ * send message to master self
134
+ * @param {Object} data message body
135
+ */
136
+ sendToMaster(data) {
137
+ this.#master.emit(data.action, data.data);
138
+ }
139
+ /**
140
+ * send message to parent process
141
+ * @param {Object} data message body
142
+ */
143
+ sendToParent(data) {
144
+ if (!this.#hasParent) {
145
+ return;
146
+ }
147
+ process.send(data);
148
+ }
149
+ /**
150
+ * send message to app worker
151
+ * @param {Object} data message body
152
+ */
153
+ sendToAppWorker(data) {
154
+ for (const worker of this.#workerManager.listWorkers()) {
155
+ if (worker.state === 'disconnected') {
156
+ continue;
157
+ }
158
+ // check receiverPid
159
+ if (data.receiverPid && data.receiverPid !== String(worker.workerId)) {
160
+ continue;
161
+ }
162
+ worker.send(data);
163
+ }
164
+ }
165
+ /**
166
+ * send message to agent worker
167
+ * @param {Object} data message body
168
+ */
169
+ sendToAgentWorker(data) {
170
+ const agent = this.#workerManager.getAgent();
171
+ if (agent) {
172
+ agent.send(data);
173
+ }
174
+ }
175
+ }
176
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2VuZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3V0aWxzL21lc3Nlbmdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3JDLE9BQU8sYUFBYSxNQUFNLHFCQUFxQixDQUFDO0FBSWhELE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO0FBWW5EOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E2Q0c7QUFDSCxNQUFNLE9BQU8sU0FBUztJQUNwQixPQUFPLENBQVM7SUFDaEIsY0FBYyxDQUFnQjtJQUM5QixVQUFVLENBQVU7SUFFcEIsWUFBWSxNQUFjLEVBQUUsYUFBNEI7UUFDdEQsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7UUFDdEIsSUFBSSxDQUFDLGNBQWMsR0FBRyxhQUFhLENBQUM7UUFDcEMsSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUMsYUFBYSxDQUFDLFVBQVUsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztRQUMvRCxPQUFPLENBQUMsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDLEdBQWdCLEVBQUUsRUFBRTtZQUN6QyxHQUFHLENBQUMsSUFBSSxHQUFHLFFBQVEsQ0FBQztZQUNwQixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2pCLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsR0FBRyxFQUFFO1lBQzlCLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO1FBQzFCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsSUFBSSxDQUFDLElBQWlCO1FBQ3BCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDZixJ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
@@ -0,0 +1,38 @@
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.js';
6
+ import type { MessageBody, Messenger } from '../../messenger.js';
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;
20
+ }
21
+ 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>;
37
+ }
38
+ export {};
@@ -0,0 +1,60 @@
1
+ import path from 'node:path';
2
+ import { EventEmitter } from 'node:events';
3
+ import { getSrcDirname } from '../../../dirname.js';
4
+ export class BaseAgentWorker {
5
+ instance;
6
+ #instanceId;
7
+ #instanceStatus;
8
+ constructor(instance) {
9
+ this.instance = instance;
10
+ }
11
+ get id() {
12
+ return this.#instanceId;
13
+ }
14
+ set id(id) {
15
+ this.#instanceId = id;
16
+ }
17
+ get status() {
18
+ return this.#instanceStatus;
19
+ }
20
+ set status(status) {
21
+ this.#instanceStatus = status;
22
+ }
23
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
24
+ static send(_message) {
25
+ throw new Error('BaseAgentWorker should implement send.');
26
+ }
27
+ static kill() {
28
+ throw new Error('BaseAgentWorker should implement kill.');
29
+ }
30
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
31
+ static gracefulExit(_options) {
32
+ throw new Error('BaseAgentWorker should implement gracefulExit.');
33
+ }
34
+ }
35
+ export class BaseAgentUtils extends EventEmitter {
36
+ options;
37
+ messenger;
38
+ log;
39
+ logger;
40
+ // public attrs
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
+ // this.instance = null;
49
+ }
50
+ getAgentWorkerFile() {
51
+ return path.join(getSrcDirname(), 'agent_worker.js');
52
+ }
53
+ fork() {
54
+ throw new Error('BaseAgent should implement fork.');
55
+ }
56
+ clean() {
57
+ throw new Error('BaseAgent should implement clean.');
58
+ }
59
+ }
60
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdlbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvdXRpbHMvbW9kZS9iYXNlL2FnZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sSUFBSSxNQUFNLFdBQVcsQ0FBQztBQUM3QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBTTNDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUVwRCxNQUFNLE9BQWdCLGVBQWU7SUFDbkMsUUFBUSxDQUFJO0lBQ1osV0FBVyxDQUFTO0lBQ3BCLGVBQWUsQ0FBUztJQUV4QixZQUFZLFFBQVc7UUFDckIsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7SUFDM0IsQ0FBQztJQUlELElBQUksRUFBRTtRQUNKLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUMxQixDQUFDO0lBRUQsSUFBSSxFQUFFLENBQUMsRUFBRTtRQUNQLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO0lBQ3hCLENBQUM7SUFFRCxJQUFJLE1BQU07UUFDUixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUM7SUFDOUIsQ0FBQztJQUVELElBQUksTUFBTSxDQUFDLE1BQU07UUFDZixJQUFJLENBQUMsZUFBZSxHQUFHLE1BQU0sQ0FBQztJQUNoQyxDQUFDO0lBSUQsNkRBQTZEO0lBQzdELE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBcUI7UUFDL0IsTUFBTSxJQUFJLEtBQUssQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFDO0lBQzVELENBQUM7SUFFRCxNQUFNLENBQUMsSUFBSTtRQUNULE1BQU0sSUFBSSxLQUFLLENBQUMsd0NBQXdDLENBQUMsQ0FBQztJQUM1RCxDQUFDO0lBRUQsNkRBQTZEO0lBQzdELE1BQU0sQ0FBQyxZQUFZLENBQUMsUUFBYTtRQUMvQixNQUFNLElBQUksS0FBSyxDQUFDLGdEQUFnRCxDQUFDLENBQUM7SUFDcEUsQ0FBQztDQUNGO0FBSUQsTUFBTSxPQUFnQixjQUFlLFNBQVEsWUFBWTtJQUM3QyxPQUFPLENBQWdCO0lBQ3ZCLFNBQVMsQ0FBWTtJQUNyQixHQUFHLENBQVM7SUFDWixNQUFNLENBQVM7SUFDekIsZUFBZTtJQUNmLFNBQVMsR0FBRyxDQUFDLENBQUM7SUFFZCxZQUFZLE9BQXNCLEVBQUUsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFJM0Q7UUFDQyxLQUFLLEVBQUUsQ0FBQztRQUNSLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBQ2YsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7UUFDM0Isd0JBQXdCO0lBQzFCLENBQUM7SUFFRCxrQkFBa0I7UUFDaEIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxFQUFFLGlCQUFpQixDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVELElBQUk7UUFDRixNQUFNLElBQUksS0FBSyxDQUFDLGtDQUFrQyxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUVELEtBQUs7UUFDSCxNQUFNLElBQUksS0FBSyxDQUFDLG1DQUFtQyxDQUFDLENBQUM7SUFDdkQsQ0FBQztDQUdGIn0=
@@ -0,0 +1,48 @@
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.js';
6
+ import type { MasterOptions } from '../../../master.js';
7
+ export declare abstract class BaseAppWorker<T = ThreadWorker | ClusterProcessWorker> {
8
+ #private;
9
+ instance: T;
10
+ constructor(instance: T);
11
+ abstract get workerId(): number;
12
+ abstract get id(): number;
13
+ get state(): string;
14
+ set state(state: string);
15
+ abstract get exitedAfterDisconnect(): boolean;
16
+ abstract get exitCode(): number;
17
+ get disableRefork(): boolean;
18
+ set disableRefork(disableRefork: boolean);
19
+ get isDevReload(): boolean;
20
+ set isDevReload(status: boolean);
21
+ abstract send(data: MessageBody): void;
22
+ clean(): void;
23
+ static on(..._args: any[]): void;
24
+ static send(_message: MessageBody): void;
25
+ static kill(): void;
26
+ static gracefulExit(_options: any): void;
27
+ }
28
+ type LogFun = (msg: any, ...args: any[]) => 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>;
47
+ }
48
+ export {};
@@ -0,0 +1,73 @@
1
+ import path from 'node:path';
2
+ import { EventEmitter } from 'node:events';
3
+ import { getSrcDirname } from '../../../dirname.js';
4
+ export class BaseAppWorker {
5
+ instance;
6
+ #isDevReload;
7
+ #state;
8
+ constructor(instance) {
9
+ this.instance = instance;
10
+ }
11
+ get state() {
12
+ return this.#state;
13
+ }
14
+ set state(state) {
15
+ this.#state = state;
16
+ }
17
+ get disableRefork() {
18
+ return Reflect.get(this.instance, 'disableRefork');
19
+ }
20
+ set disableRefork(disableRefork) {
21
+ Reflect.set(this.instance, 'disableRefork', disableRefork);
22
+ }
23
+ get isDevReload() {
24
+ return this.#isDevReload;
25
+ }
26
+ set isDevReload(status) {
27
+ this.#isDevReload = status;
28
+ }
29
+ clean() {
30
+ throw new Error('BaseAppWorker should implement clean.');
31
+ }
32
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
33
+ static on(..._args) {
34
+ throw new Error('BaseAppWorker should implement on.');
35
+ }
36
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
37
+ static send(_message) {
38
+ throw new Error('BaseAgentWorker should implement send.');
39
+ }
40
+ static kill() {
41
+ throw new Error('BaseAppWorker should implement kill.');
42
+ }
43
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
44
+ static gracefulExit(_options) {
45
+ throw new Error('BaseAgentWorker should implement gracefulExit.');
46
+ }
47
+ }
48
+ export class BaseAppUtils extends EventEmitter {
49
+ options;
50
+ messenger;
51
+ log;
52
+ logger;
53
+ isProduction;
54
+ // public attrs
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
+ return path.join(getSrcDirname(), 'app_worker.js');
68
+ }
69
+ fork() {
70
+ throw new Error('BaseApp should implement fork.');
71
+ }
72
+ }
73
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL3V0aWxzL21vZGUvYmFzZS9hcHAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxJQUFJLE1BQU0sV0FBVyxDQUFDO0FBQzdCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFNM0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRXBELE1BQU0sT0FBZ0IsYUFBYTtJQUNqQyxRQUFRLENBQUk7SUFDWixZQUFZLENBQVU7SUFDdEIsTUFBTSxDQUFTO0lBRWYsWUFBWSxRQUFXO1FBQ3JCLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO0lBQzNCLENBQUM7SUFNRCxJQUFJLEtBQUs7UUFDUCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDckIsQ0FBQztJQUVELElBQUksS0FBSyxDQUFDLEtBQUs7UUFDYixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztJQUN0QixDQUFDO0lBTUQsSUFBSSxhQUFhO1FBQ2YsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFTLEVBQUUsZUFBZSxDQUFZLENBQUM7SUFDakUsQ0FBQztJQUVELElBQUksYUFBYSxDQUFDLGFBQXNCO1FBQ3RDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVMsRUFBRSxlQUFlLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUVELElBQUksV0FBVztRQUNiLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQztJQUMzQixDQUFDO0lBRUQsSUFBSSxXQUFXLENBQUMsTUFBTTtRQUNwQixJQUFJLENBQUMsWUFBWSxHQUFHLE1BQU0sQ0FBQztJQUM3QixDQUFDO0lBSUQsS0FBSztRQUNILE1BQU0sSUFBSSxLQUFLLENBQUMsdUNBQXVDLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBRUQsNkRBQTZEO0lBQzdELE1BQU0sQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFZO1FBQ3ZCLE1BQU0sSUFBSSxLQUFLLENBQUMsb0NBQW9DLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBRUQsNkRBQTZEO0lBQzdELE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBcUI7UUFDL0IsTUFBTSxJQUFJLEtBQUssQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFDO0lBQzVELENBQUM7SUFFRCxNQUFNLENBQUMsSUFBSTtRQUNULE1BQU0sSUFBSSxLQUFLLENBQUMsc0NBQXNDLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBRUQsNkRBQTZEO0lBQzdELE1BQU0sQ0FBQyxZQUFZLENBQUMsUUFBYTtRQUMvQixNQUFNLElBQUksS0FBSyxDQUFDLGdEQUFnRCxDQUFDLENBQUM7SUFDcEUsQ0FBQztDQUNGO0FBSUQsTUFBTSxPQUFnQixZQUFhLFNBQVEsWUFBWTtJQUNyRCxPQUFPLENBQWdCO0lBQ2IsU0FBUyxDQUFZO0lBQ3JCLEdBQUcsQ0FBUztJQUNaLE1BQU0sQ0FBUztJQUNmLFlBQVksQ0FBVTtJQUNoQyxlQUFlO0lBQ2YsU0FBUyxHQUFHLENBQUMsQ0FBQztJQUNkLGlCQUFpQixHQUFHLENBQUMsQ0FBQztJQUN0QixrQkFBa0IsR0FBRyxLQUFLLENBQUM7SUFFM0IsWUFBWSxPQUFzQixFQUFFLEVBQ2xDLEdBQUcsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFlBQVksR0FNckM7UUFDQyxLQUFLLEVBQUUsQ0FBQztRQUNSLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBQ2YsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7UUFDM0IsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7SUFDbkMsQ0FBQztJQUVELGdCQUFnQjtRQUNkLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsRUFBRSxlQUFlLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBRUQsSUFBSTtRQUNGLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztJQUNwRCxDQUFDO0NBR0YifQ==
@@ -0,0 +1,18 @@
1
+ import { type ChildProcess } from 'node:child_process';
2
+ import { type Options as gracefulExitOptions } from 'graceful-process';
3
+ import { BaseAgentWorker, BaseAgentUtils } from '../../base/agent.js';
4
+ import type { MessageBody } from '../../../messenger.js';
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;
11
+ }
12
+ export declare class AgentProcessUtils extends BaseAgentUtils {
13
+ #private;
14
+ instance: AgentProcessWorker;
15
+ fork(): this;
16
+ clean(): void;
17
+ kill(timeout: number): Promise<void>;
18
+ }
@@ -0,0 +1,102 @@
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';
5
+ import { terminate } from '../../../terminate.js';
6
+ import { ClusterAgentWorkerError } from '../../../../error/ClusterAgentWorkerError.js';
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
+ process.send(message);
16
+ }
17
+ static kill() {
18
+ process.exitCode = 1;
19
+ process.kill(process.pid);
20
+ }
21
+ static gracefulExit(options) {
22
+ gracefulExit(options);
23
+ }
24
+ }
25
+ export class AgentProcessUtils extends BaseAgentUtils {
26
+ #agentProcess;
27
+ #id = 0;
28
+ instance;
29
+ fork() {
30
+ this.startTime = Date.now();
31
+ const args = [JSON.stringify(this.options)];
32
+ const forkOptions = {};
33
+ if (process.platform === 'win32') {
34
+ forkOptions.windowsHide = true;
35
+ }
36
+ // add debug execArgv
37
+ const debugPort = process.env.EGG_AGENT_DEBUG_PORT ?? 5800;
38
+ if (this.options.isDebug) {
39
+ forkOptions.execArgv = process.execArgv.concat([`--inspect-port=${debugPort}`]);
40
+ }
41
+ const agentProcess = this.#agentProcess = fork(this.getAgentWorkerFile(), args, forkOptions);
42
+ const agentWorker = this.instance = new AgentProcessWorker(agentProcess);
43
+ agentWorker.status = 'starting';
44
+ agentWorker.id = ++this.#id;
45
+ this.emit('agent_forked', agentWorker);
46
+ this.log('[master] agent_worker#%s:%s start with clusterPort:%s', agentWorker.id, agentWorker.workerId, this.options.clusterPort);
47
+ // send debug message
48
+ if (this.options.isDebug) {
49
+ this.messenger.send({
50
+ to: 'parent',
51
+ from: 'agent',
52
+ action: 'debug',
53
+ data: {
54
+ debugPort,
55
+ // keep compatibility, should use workerId instead
56
+ pid: agentWorker.workerId,
57
+ workerId: agentWorker.workerId,
58
+ },
59
+ });
60
+ }
61
+ // forwarding agent' message to messenger
62
+ agentProcess.on('message', (msg) => {
63
+ if (typeof msg === 'string') {
64
+ msg = {
65
+ action: msg,
66
+ data: msg,
67
+ };
68
+ }
69
+ msg.from = 'agent';
70
+ this.messenger.send(msg);
71
+ });
72
+ // logger error event
73
+ agentProcess.on('error', err => {
74
+ err.name = 'AgentWorkerError';
75
+ this.logger.error(new ClusterAgentWorkerError(agentWorker.id, agentWorker.workerId, agentWorker.status, err));
76
+ });
77
+ // agent exit message
78
+ agentProcess.once('exit', (code, signal) => {
79
+ this.messenger.send({
80
+ action: 'agent-exit',
81
+ data: {
82
+ code,
83
+ signal,
84
+ },
85
+ to: 'master',
86
+ from: 'agent',
87
+ });
88
+ });
89
+ return this;
90
+ }
91
+ clean() {
92
+ this.#agentProcess.removeAllListeners();
93
+ }
94
+ async kill(timeout) {
95
+ if (this.#agentProcess) {
96
+ this.log('[master] kill agent worker with signal SIGTERM');
97
+ this.clean();
98
+ await terminate(this.#agentProcess, timeout);
99
+ }
100
+ }
101
+ }
102
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdlbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvdXRpbHMvbW9kZS9pbXBsL3Byb2Nlc3MvYWdlbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLElBQUksRUFBdUMsTUFBTSxvQkFBb0IsQ0FBQztBQUMvRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzFDLE9BQU8sRUFBRSxRQUFRLElBQUksWUFBWSxFQUF1QyxNQUFNLGtCQUFrQixDQUFDO0FBQ2pHLE9BQU8sRUFBRSxlQUFlLEVBQUUsY0FBYyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRWxELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDhDQUE4QyxDQUFDO0FBRXZGLE1BQU0sT0FBTyxrQkFBbUIsU0FBUSxlQUE2QjtJQUNuRSxJQUFJLFFBQVE7UUFDVixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBSSxDQUFDO0lBQzVCLENBQUM7SUFFRCxJQUFJLENBQUMsT0FBb0I7UUFDdkIsV0FBVyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVELE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBb0I7UUFDOUIsT0FBTyxDQUFDLElBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN6QixDQUFDO0lBRUQsTUFBTSxDQUFDLElBQUk7UUFDVCxPQUFPLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQztRQUNyQixPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBRUQsTUFBTSxDQUFDLFlBQVksQ0FBQyxPQUE0QjtRQUM5QyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDeEIsQ0FBQztDQUNGO0FBRUQsTUFBTSxPQUFPLGlCQUFr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
@@ -0,0 +1,20 @@
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 on(event: string, listener: (...args: any[]) => void): void;
13
+ static send(message: MessageBody): void;
14
+ static kill(): void;
15
+ static gracefulExit(options: gracefulExitOptions): void;
16
+ }
17
+ export declare class AppProcessUtils extends BaseAppUtils {
18
+ fork(): this;
19
+ kill(timeout: number): Promise<void>;
20
+ }