@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,183 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.Messenger = void 0;
7
+ const node_util_1 = require("node:util");
8
+ const node_worker_threads_1 = __importDefault(require("node:worker_threads"));
9
+ const debug = (0, node_util_1.debuglog)('@eggjs/cluster/messenger');
10
+ /**
11
+ * master messenger, provide communication between parent, master, agent and app.
12
+ *
13
+ * ┌────────┐
14
+ * │ parent │
15
+ * /└────────┘\
16
+ * / | \
17
+ * / ┌────────┐ \
18
+ * / │ master │ \
19
+ * / └────────┘ \
20
+ * / / \ \
21
+ * ┌───────┐ ┌───────┐
22
+ * │ agent │ ------- │ app │
23
+ * └───────┘ └───────┘
24
+ *
25
+ *
26
+ * in app worker
27
+ *
28
+ * ```js
29
+ * process.send({
30
+ * action: 'xxx',
31
+ * data: '',
32
+ * to: 'agent/master/parent', // default to agent
33
+ * });
34
+ * ```
35
+ *
36
+ * in agent worker
37
+ *
38
+ * ```js
39
+ * process.send({
40
+ * action: 'xxx',
41
+ * data: '',
42
+ * to: 'app/master/parent', // default to app
43
+ * });
44
+ * ```
45
+ *
46
+ * in parent
47
+ *
48
+ * ```js
49
+ * process.send({
50
+ * action: 'xxx',
51
+ * data: '',
52
+ * to: 'app/agent/master', // default to master
53
+ * });
54
+ * ```
55
+ */
56
+ class Messenger {
57
+ #master;
58
+ #workerManager;
59
+ #hasParent;
60
+ constructor(master, workerManager) {
61
+ this.#master = master;
62
+ this.#workerManager = workerManager;
63
+ this.#hasParent = !!node_worker_threads_1.default.parentPort || !!process.send;
64
+ process.on('message', (msg) => {
65
+ msg.from = 'parent';
66
+ this.send(msg);
67
+ });
68
+ process.once('disconnect', () => {
69
+ this.#hasParent = false;
70
+ });
71
+ }
72
+ /**
73
+ * send message
74
+ * @param {Object} data message body
75
+ * - {String} from from who
76
+ * - {String} to to who
77
+ */
78
+ send(data) {
79
+ if (!data.from) {
80
+ data.from = 'master';
81
+ }
82
+ // https://github.com/eggjs/egg/blob/b6861f1c7548f05a281386050dfeaeb30f236558/lib/core/messenger/ipc.js#L56
83
+ // recognize receiverPid is to who
84
+ if (data.receiverPid) {
85
+ if (data.receiverPid === String(process.pid)) {
86
+ data.to = 'master';
87
+ }
88
+ else if (data.receiverPid === String(this.#workerManager.getAgent().workerId)) {
89
+ data.to = 'agent';
90
+ }
91
+ else {
92
+ data.to = 'app';
93
+ }
94
+ }
95
+ // default from -> to rules
96
+ if (!data.to) {
97
+ if (data.from === 'agent') {
98
+ data.to = 'app';
99
+ }
100
+ if (data.from === 'app') {
101
+ data.to = 'agent';
102
+ }
103
+ if (data.from === 'parent') {
104
+ data.to = 'master';
105
+ }
106
+ }
107
+ // app -> master
108
+ // agent -> master
109
+ if (data.to === 'master') {
110
+ debug('%s -> master, data: %j', data.from, data);
111
+ // app/agent to master
112
+ this.sendToMaster(data);
113
+ return;
114
+ }
115
+ // master -> parent
116
+ // app -> parent
117
+ // agent -> parent
118
+ if (data.to === 'parent') {
119
+ debug('%s -> parent, data: %j', data.from, data);
120
+ this.sendToParent(data);
121
+ return;
122
+ }
123
+ // parent -> master -> app
124
+ // agent -> master -> app
125
+ if (data.to === 'app') {
126
+ debug('%s -> %s, data: %j', data.from, data.to, data);
127
+ this.sendToAppWorker(data);
128
+ return;
129
+ }
130
+ // parent -> master -> agent
131
+ // app -> master -> agent,可能不指定 to
132
+ if (data.to === 'agent') {
133
+ debug('%s -> %s, data: %j', data.from, data.to, data);
134
+ this.sendToAgentWorker(data);
135
+ return;
136
+ }
137
+ }
138
+ /**
139
+ * send message to master self
140
+ * @param {Object} data message body
141
+ */
142
+ sendToMaster(data) {
143
+ this.#master.emit(data.action, data.data);
144
+ }
145
+ /**
146
+ * send message to parent process
147
+ * @param {Object} data message body
148
+ */
149
+ sendToParent(data) {
150
+ if (!this.#hasParent) {
151
+ return;
152
+ }
153
+ process.send(data);
154
+ }
155
+ /**
156
+ * send message to app worker
157
+ * @param {Object} data message body
158
+ */
159
+ sendToAppWorker(data) {
160
+ for (const worker of this.#workerManager.listWorkers()) {
161
+ if (worker.state === 'disconnected') {
162
+ continue;
163
+ }
164
+ // check receiverPid
165
+ if (data.receiverPid && data.receiverPid !== String(worker.workerId)) {
166
+ continue;
167
+ }
168
+ worker.send(data);
169
+ }
170
+ }
171
+ /**
172
+ * send message to agent worker
173
+ * @param {Object} data message body
174
+ */
175
+ sendToAgentWorker(data) {
176
+ const agent = this.#workerManager.getAgent();
177
+ if (agent) {
178
+ agent.send(data);
179
+ }
180
+ }
181
+ }
182
+ exports.Messenger = Messenger;
183
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2VuZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3V0aWxzL21lc3Nlbmdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSx5Q0FBcUM7QUFDckMsOEVBQWdEO0FBSWhELE1BQU0sS0FBSyxHQUFHLElBQUEsb0JBQVEsRUFBQywwQkFBMEIsQ0FBQyxDQUFDO0FBWW5EOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E2Q0c7QUFDSCxNQUFhLFNBQVM7SUFDcEIsT0FBTyxDQUFTO0lBQ2hCLGNBQWMsQ0FBZ0I7SUFDOUIsVUFBVSxDQUFVO0lBRXBCLFlBQVksTUFBYyxFQUFFLGFBQTRCO1FBQ3RELElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxjQUFjLEdBQUcsYUFBYSxDQUFDO1FBQ3BDLElBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDLDZCQUFhLENBQUMsVUFBVSxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO1FBQy9ELE9BQU8sQ0FBQyxFQUFFLENBQUMsU0FBUyxFQUFFLENBQUMsR0FBZ0IsRUFBRSxFQUFFO1lBQ3pDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDO1lBQ3BCLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDakIsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxHQUFHLEVBQUU7WUFDOUIsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7UUFDMUIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxJQUFJLENBQUMsSUFBaUI7UUFDcEIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNmLElBQUksQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDO1FBQ3ZCLENBQUM7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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,68 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.BaseAgentUtils = exports.BaseAgentWorker = void 0;
7
+ const node_path_1 = __importDefault(require("node:path"));
8
+ const node_events_1 = require("node:events");
9
+ const dirname_js_1 = require("../../../dirname.js");
10
+ class BaseAgentWorker {
11
+ instance;
12
+ #instanceId;
13
+ #instanceStatus;
14
+ constructor(instance) {
15
+ this.instance = instance;
16
+ }
17
+ get id() {
18
+ return this.#instanceId;
19
+ }
20
+ set id(id) {
21
+ this.#instanceId = id;
22
+ }
23
+ get status() {
24
+ return this.#instanceStatus;
25
+ }
26
+ set status(status) {
27
+ this.#instanceStatus = status;
28
+ }
29
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
30
+ static send(_message) {
31
+ throw new Error('BaseAgentWorker should implement send.');
32
+ }
33
+ static kill() {
34
+ throw new Error('BaseAgentWorker should implement kill.');
35
+ }
36
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
37
+ static gracefulExit(_options) {
38
+ throw new Error('BaseAgentWorker should implement gracefulExit.');
39
+ }
40
+ }
41
+ exports.BaseAgentWorker = BaseAgentWorker;
42
+ class BaseAgentUtils extends node_events_1.EventEmitter {
43
+ options;
44
+ messenger;
45
+ log;
46
+ logger;
47
+ // public attrs
48
+ startTime = 0;
49
+ constructor(options, { log, logger, messenger }) {
50
+ super();
51
+ this.options = options;
52
+ this.log = log;
53
+ this.logger = logger;
54
+ this.messenger = messenger;
55
+ // this.instance = null;
56
+ }
57
+ getAgentWorkerFile() {
58
+ return node_path_1.default.join((0, dirname_js_1.getSrcDirname)(), 'agent_worker.js');
59
+ }
60
+ fork() {
61
+ throw new Error('BaseAgent should implement fork.');
62
+ }
63
+ clean() {
64
+ throw new Error('BaseAgent should implement clean.');
65
+ }
66
+ }
67
+ exports.BaseAgentUtils = BaseAgentUtils;
68
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdlbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvdXRpbHMvbW9kZS9iYXNlL2FnZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLDBEQUE2QjtBQUM3Qiw2Q0FBMkM7QUFNM0Msb0RBQW9EO0FBRXBELE1BQXNCLGVBQWU7SUFDbkMsUUFBUSxDQUFJO0lBQ1osV0FBVyxDQUFTO0lBQ3BCLGVBQWUsQ0FBUztJQUV4QixZQUFZLFFBQVc7UUFDckIsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7SUFDM0IsQ0FBQztJQUlELElBQUksRUFBRTtRQUNKLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUMxQixDQUFDO0lBRUQsSUFBSSxFQUFFLENBQUMsRUFBRTtRQUNQLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO0lBQ3hCLENBQUM7SUFFRCxJQUFJLE1BQU07UUFDUixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUM7SUFDOUIsQ0FBQztJQUVELElBQUksTUFBTSxDQUFDLE1BQU07UUFDZixJQUFJLENBQUMsZUFBZSxHQUFHLE1BQU0sQ0FBQztJQUNoQyxDQUFDO0lBSUQsNkRBQTZEO0lBQzdELE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBcUI7UUFDL0IsTUFBTSxJQUFJLEtBQUssQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFDO0lBQzVELENBQUM7SUFFRCxNQUFNLENBQUMsSUFBSTtRQUNULE1BQU0sSUFBSSxLQUFLLENBQUMsd0NBQXdDLENBQUMsQ0FBQztJQUM1RCxDQUFDO0lBRUQsNkRBQTZEO0lBQzdELE1BQU0sQ0FBQyxZQUFZLENBQUMsUUFBYTtRQUMvQixNQUFNLElBQUksS0FBSyxDQUFDLGdEQUFnRCxDQUFDLENBQUM7SUFDcEUsQ0FBQztDQUNGO0FBMUNELDBDQTBDQztBQUlELE1BQXNCLGNBQWUsU0FBUSwwQkFBWTtJQUM3QyxPQUFPLENBQWdCO0lBQ3ZCLFNBQVMsQ0FBWTtJQUNyQixHQUFHLENBQVM7SUFDWixNQUFNLENBQVM7SUFDekIsZUFBZTtJQUNmLFNBQVMsR0FBRyxDQUFDLENBQUM7SUFFZCxZQUFZLE9BQXNCLEVBQUUsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFJM0Q7UUFDQyxLQUFLLEVBQUUsQ0FBQztRQUNSLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBQ2YsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7UUFDM0Isd0JBQXdCO0lBQzFCLENBQUM7SUFFRCxrQkFBa0I7UUFDaEIsT0FBTyxtQkFBSSxDQUFDLElBQUksQ0FBQyxJQUFBLDBCQUFhLEdBQUUsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFRCxJQUFJO1FBQ0YsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFRCxLQUFLO1FBQ0gsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7Q0FHRjtBQWxDRCx3Q0FrQ0MifQ==
@@ -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,81 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.BaseAppUtils = exports.BaseAppWorker = void 0;
7
+ const node_path_1 = __importDefault(require("node:path"));
8
+ const node_events_1 = require("node:events");
9
+ const dirname_js_1 = require("../../../dirname.js");
10
+ class BaseAppWorker {
11
+ instance;
12
+ #isDevReload;
13
+ #state;
14
+ constructor(instance) {
15
+ this.instance = instance;
16
+ }
17
+ get state() {
18
+ return this.#state;
19
+ }
20
+ set state(state) {
21
+ this.#state = state;
22
+ }
23
+ get disableRefork() {
24
+ return Reflect.get(this.instance, 'disableRefork');
25
+ }
26
+ set disableRefork(disableRefork) {
27
+ Reflect.set(this.instance, 'disableRefork', disableRefork);
28
+ }
29
+ get isDevReload() {
30
+ return this.#isDevReload;
31
+ }
32
+ set isDevReload(status) {
33
+ this.#isDevReload = status;
34
+ }
35
+ clean() {
36
+ throw new Error('BaseAppWorker should implement clean.');
37
+ }
38
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
39
+ static on(..._args) {
40
+ throw new Error('BaseAppWorker should implement on.');
41
+ }
42
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
43
+ static send(_message) {
44
+ throw new Error('BaseAgentWorker should implement send.');
45
+ }
46
+ static kill() {
47
+ throw new Error('BaseAppWorker should implement kill.');
48
+ }
49
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
50
+ static gracefulExit(_options) {
51
+ throw new Error('BaseAgentWorker should implement gracefulExit.');
52
+ }
53
+ }
54
+ exports.BaseAppWorker = BaseAppWorker;
55
+ class BaseAppUtils extends node_events_1.EventEmitter {
56
+ options;
57
+ messenger;
58
+ log;
59
+ logger;
60
+ isProduction;
61
+ // public attrs
62
+ startTime = 0;
63
+ startSuccessCount = 0;
64
+ isAllWorkerStarted = false;
65
+ constructor(options, { log, logger, messenger, isProduction, }) {
66
+ super();
67
+ this.options = options;
68
+ this.log = log;
69
+ this.logger = logger;
70
+ this.messenger = messenger;
71
+ this.isProduction = isProduction;
72
+ }
73
+ getAppWorkerFile() {
74
+ return node_path_1.default.join((0, dirname_js_1.getSrcDirname)(), 'app_worker.js');
75
+ }
76
+ fork() {
77
+ throw new Error('BaseApp should implement fork.');
78
+ }
79
+ }
80
+ exports.BaseAppUtils = BaseAppUtils;
81
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL3V0aWxzL21vZGUvYmFzZS9hcHAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsMERBQTZCO0FBQzdCLDZDQUEyQztBQU0zQyxvREFBb0Q7QUFFcEQsTUFBc0IsYUFBYTtJQUNqQyxRQUFRLENBQUk7SUFDWixZQUFZLENBQVU7SUFDdEIsTUFBTSxDQUFTO0lBRWYsWUFBWSxRQUFXO1FBQ3JCLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO0lBQzNCLENBQUM7SUFNRCxJQUFJLEtBQUs7UUFDUCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDckIsQ0FBQztJQUVELElBQUksS0FBSyxDQUFDLEtBQUs7UUFDYixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztJQUN0QixDQUFDO0lBTUQsSUFBSSxhQUFhO1FBQ2YsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFTLEVBQUUsZUFBZSxDQUFZLENBQUM7SUFDakUsQ0FBQztJQUVELElBQUksYUFBYSxDQUFDLGFBQXNCO1FBQ3RDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVMsRUFBRSxlQUFlLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUVELElBQUksV0FBVztRQUNiLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQztJQUMzQixDQUFDO0lBRUQsSUFBSSxXQUFXLENBQUMsTUFBTTtRQUNwQixJQUFJLENBQUMsWUFBWSxHQUFHLE1BQU0sQ0FBQztJQUM3QixDQUFDO0lBSUQsS0FBSztRQUNILE1BQU0sSUFBSSxLQUFLLENBQUMsdUNBQXVDLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBRUQsNkRBQTZEO0lBQzdELE1BQU0sQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFZO1FBQ3ZCLE1BQU0sSUFBSSxLQUFLLENBQUMsb0NBQW9DLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBRUQsNkRBQTZEO0lBQzdELE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBcUI7UUFDL0IsTUFBTSxJQUFJLEtBQUssQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFDO0lBQzVELENBQUM7SUFFRCxNQUFNLENBQUMsSUFBSTtRQUNULE1BQU0sSUFBSSxLQUFLLENBQUMsc0NBQXNDLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBRUQsNkRBQTZEO0lBQzdELE1BQU0sQ0FBQyxZQUFZLENBQUMsUUFBYTtRQUMvQixNQUFNLElBQUksS0FBSyxDQUFDLGdEQUFnRCxDQUFDLENBQUM7SUFDcEUsQ0FBQztDQUNGO0FBakVELHNDQWlFQztBQUlELE1BQXNCLFlBQWEsU0FBUSwwQkFBWTtJQUNyRCxPQUFPLENBQWdCO0lBQ2IsU0FBUyxDQUFZO0lBQ3JCLEdBQUcsQ0FBUztJQUNaLE1BQU0sQ0FBUztJQUNmLFlBQVksQ0FBVTtJQUNoQyxlQUFlO0lBQ2YsU0FBUyxHQUFHLENBQUMsQ0FBQztJQUNkLGlCQUFpQixHQUFHLENBQUMsQ0FBQztJQUN0QixrQkFBa0IsR0FBRyxLQUFLLENBQUM7SUFFM0IsWUFBWSxPQUFzQixFQUFFLEVBQ2xDLEdBQUcsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFlBQVksR0FNckM7UUFDQyxLQUFLLEVBQUUsQ0FBQztRQUNSLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBQ2YsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7UUFDM0IsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7SUFDbkMsQ0FBQztJQUVELGdCQUFnQjtRQUNkLE9BQU8sbUJBQUksQ0FBQyxJQUFJLENBQUMsSUFBQSwwQkFBYSxHQUFFLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUVELElBQUk7UUFDRixNQUFNLElBQUksS0FBSyxDQUFDLGdDQUFnQyxDQUFDLENBQUM7SUFDcEQsQ0FBQztDQUdGO0FBcENELG9DQW9DQyJ9
@@ -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,107 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AgentProcessUtils = exports.AgentProcessWorker = void 0;
4
+ const node_child_process_1 = require("node:child_process");
5
+ const sendmessage_1 = require("sendmessage");
6
+ const graceful_process_1 = require("graceful-process");
7
+ const agent_js_1 = require("../../base/agent.js");
8
+ const terminate_js_1 = require("../../../terminate.js");
9
+ const ClusterAgentWorkerError_js_1 = require("../../../../error/ClusterAgentWorkerError.js");
10
+ class AgentProcessWorker extends agent_js_1.BaseAgentWorker {
11
+ get workerId() {
12
+ return this.instance.pid;
13
+ }
14
+ send(message) {
15
+ (0, sendmessage_1.sendmessage)(this.instance, message);
16
+ }
17
+ static send(message) {
18
+ process.send(message);
19
+ }
20
+ static kill() {
21
+ process.exitCode = 1;
22
+ process.kill(process.pid);
23
+ }
24
+ static gracefulExit(options) {
25
+ (0, graceful_process_1.graceful)(options);
26
+ }
27
+ }
28
+ exports.AgentProcessWorker = AgentProcessWorker;
29
+ class AgentProcessUtils extends agent_js_1.BaseAgentUtils {
30
+ #agentProcess;
31
+ #id = 0;
32
+ instance;
33
+ fork() {
34
+ this.startTime = Date.now();
35
+ const args = [JSON.stringify(this.options)];
36
+ const forkOptions = {};
37
+ if (process.platform === 'win32') {
38
+ forkOptions.windowsHide = true;
39
+ }
40
+ // add debug execArgv
41
+ const debugPort = process.env.EGG_AGENT_DEBUG_PORT ?? 5800;
42
+ if (this.options.isDebug) {
43
+ forkOptions.execArgv = process.execArgv.concat([`--inspect-port=${debugPort}`]);
44
+ }
45
+ const agentProcess = this.#agentProcess = (0, node_child_process_1.fork)(this.getAgentWorkerFile(), args, forkOptions);
46
+ const agentWorker = this.instance = new AgentProcessWorker(agentProcess);
47
+ agentWorker.status = 'starting';
48
+ agentWorker.id = ++this.#id;
49
+ this.emit('agent_forked', agentWorker);
50
+ this.log('[master] agent_worker#%s:%s start with clusterPort:%s', agentWorker.id, agentWorker.workerId, this.options.clusterPort);
51
+ // send debug message
52
+ if (this.options.isDebug) {
53
+ this.messenger.send({
54
+ to: 'parent',
55
+ from: 'agent',
56
+ action: 'debug',
57
+ data: {
58
+ debugPort,
59
+ // keep compatibility, should use workerId instead
60
+ pid: agentWorker.workerId,
61
+ workerId: agentWorker.workerId,
62
+ },
63
+ });
64
+ }
65
+ // forwarding agent' message to messenger
66
+ agentProcess.on('message', (msg) => {
67
+ if (typeof msg === 'string') {
68
+ msg = {
69
+ action: msg,
70
+ data: msg,
71
+ };
72
+ }
73
+ msg.from = 'agent';
74
+ this.messenger.send(msg);
75
+ });
76
+ // logger error event
77
+ agentProcess.on('error', err => {
78
+ err.name = 'AgentWorkerError';
79
+ this.logger.error(new ClusterAgentWorkerError_js_1.ClusterAgentWorkerError(agentWorker.id, agentWorker.workerId, agentWorker.status, err));
80
+ });
81
+ // agent exit message
82
+ agentProcess.once('exit', (code, signal) => {
83
+ this.messenger.send({
84
+ action: 'agent-exit',
85
+ data: {
86
+ code,
87
+ signal,
88
+ },
89
+ to: 'master',
90
+ from: 'agent',
91
+ });
92
+ });
93
+ return this;
94
+ }
95
+ clean() {
96
+ this.#agentProcess.removeAllListeners();
97
+ }
98
+ async kill(timeout) {
99
+ if (this.#agentProcess) {
100
+ this.log('[master] kill agent worker with signal SIGTERM');
101
+ this.clean();
102
+ await (0, terminate_js_1.terminate)(this.#agentProcess, timeout);
103
+ }
104
+ }
105
+ }
106
+ exports.AgentProcessUtils = AgentProcessUtils;
107
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdlbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvdXRpbHMvbW9kZS9pbXBsL3Byb2Nlc3MvYWdlbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsMkRBQStFO0FBQy9FLDZDQUEwQztBQUMxQyx1REFBaUc7QUFDakcsa0RBQXNFO0FBQ3RFLHdEQUFrRDtBQUVsRCw2RkFBdUY7QUFFdkYsTUFBYSxrQkFBbUIsU0FBUSwwQkFBNkI7SUFDbkUsSUFBSSxRQUFRO1FBQ1YsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUksQ0FBQztJQUM1QixDQUFDO0lBRUQsSUFBSSxDQUFDLE9BQW9CO1FBQ3ZCLElBQUEseUJBQVcsRUFBQyxJQUFJLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRCxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQW9CO1FBQzlCLE9BQU8sQ0FBQyxJQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDekIsQ0FBQztJQUVELE1BQU0sQ0FBQyxJQUFJO1FBQ1QsT0FBTyxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUM7UUFDckIsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUVELE1BQU0sQ0FBQyxZQUFZLENBQUMsT0FBNEI7UUFDOUMsSUFBQSwyQkFBWSxFQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3hCLENBQUM7Q0FDRjtBQXJCRCxnREFxQkM7QUFFRCxNQUFhLGlCQUFrQixTQUFRLHlCQUFjO0lBQ25ELGFBQWEsQ0FBZTtJQUM1QixHQUFHLEdBQUcsQ0FBQyxDQUFDO0lBQ1IsUUFBUSxDQUFxQjtJQUU3QixJQUFJO1FBQ0YsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFFNUIsTUFBTSxJQUFJLEdBQUcsQ0FBRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUks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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
+ }