@eggjs/cluster 4.0.0-beta.18 → 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 +7 -7
  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
package/dist/index.d.ts CHANGED
@@ -1,10 +1,445 @@
1
- import { ClusterHTTPSSecureOptions, ClusterOptions, ClusterStartMode } from "./utils/options.js";
2
- import { Master, MasterOptions } from "./master.js";
3
- import { ClusterAgentWorkerError } from "./error/ClusterAgentWorkerError.js";
4
- import { ClusterWorkerExceptionError } from "./error/ClusterWorkerExceptionError.js";
1
+ import { ReadyEventEmitter } from "get-ready";
2
+ import { EggConsoleLogger, Logger } from "egg-logger";
3
+ import { SecureContextOptions } from "node:tls";
4
+ import { EventEmitter } from "node:events";
5
+ import { Worker } from "node:worker_threads";
6
+ import { ChildProcess } from "node:child_process";
7
+ import { Options } from "graceful-process";
8
+ import { Worker as Worker$1 } from "node:cluster";
9
+ import * as worker_threads0 from "worker_threads";
10
+ import * as cluster0 from "cluster";
11
+ import * as child_process0 from "child_process";
5
12
 
13
+ //#region src/utils/mode/base/agent.d.ts
14
+ declare abstract class BaseAgentWorker<T = ChildProcess | Worker> {
15
+ #private;
16
+ instance: T;
17
+ constructor(instance: T);
18
+ abstract get workerId(): number;
19
+ get id(): number;
20
+ set id(id: number);
21
+ get status(): string;
22
+ set status(status: string);
23
+ abstract send(message: MessageBody): void;
24
+ static send(_message: MessageBody): void;
25
+ static kill(): void;
26
+ static gracefulExit(_options: any): void;
27
+ }
28
+ type LogFun$1 = (msg: any, ...args: any[]) => void;
29
+ declare abstract class BaseAgentUtils extends EventEmitter {
30
+ protected options: MasterOptions;
31
+ protected messenger: Messenger;
32
+ protected log: LogFun$1;
33
+ protected logger: Logger;
34
+ startTime: number;
35
+ constructor(options: MasterOptions, {
36
+ log,
37
+ logger,
38
+ messenger
39
+ }: {
40
+ log: LogFun$1;
41
+ logger: Logger;
42
+ messenger: Messenger;
43
+ });
44
+ getAgentWorkerFile(): string;
45
+ fork(): void;
46
+ clean(): void;
47
+ abstract kill(timeout: number): Promise<void>;
48
+ }
49
+ //#endregion
50
+ //#region src/utils/worker_manager.d.ts
51
+ declare class WorkerManager extends EventEmitter {
52
+ agent: BaseAgentWorker | null;
53
+ workers: Map<number, BaseAppWorker<worker_threads0.Worker | cluster0.Worker>>;
54
+ exception: number;
55
+ timer: NodeJS.Timeout;
56
+ constructor();
57
+ getWorkers(): number[];
58
+ setAgent(agent: BaseAgentWorker): void;
59
+ getAgent(): BaseAgentWorker<worker_threads0.Worker | child_process0.ChildProcess> | null;
60
+ deleteAgent(): void;
61
+ setWorker(worker: BaseAppWorker): void;
62
+ getWorker(workerId: number): BaseAppWorker<worker_threads0.Worker | cluster0.Worker> | undefined;
63
+ deleteWorker(workerId: number): void;
64
+ listWorkerIds(): number[];
65
+ listWorkers(): BaseAppWorker<worker_threads0.Worker | cluster0.Worker>[];
66
+ getListeningWorkerIds(): number[];
67
+ count(): {
68
+ agent: number;
69
+ worker: number;
70
+ };
71
+ startCheck(): void;
72
+ }
73
+ //#endregion
74
+ //#region src/utils/messenger.d.ts
75
+ type MessageCharacter = 'agent' | 'app' | 'master' | 'parent';
76
+ interface MessageBody {
77
+ action: string;
78
+ data?: unknown;
79
+ to?: MessageCharacter;
80
+ from?: MessageCharacter;
81
+ /**
82
+ * @deprecated Keep compatible, please use receiverWorkerId instead
83
+ */
84
+ receiverPid?: string;
85
+ receiverWorkerId?: string;
86
+ senderWorkerId?: string;
87
+ }
88
+ /**
89
+ * master messenger, provide communication between parent, master, agent and app.
90
+ *
91
+ * ┌────────┐
92
+ * │ parent │
93
+ * /└────────┘\
94
+ * / | \
95
+ * / ┌────────┐ \
96
+ * / │ master │ \
97
+ * / └────────┘ \
98
+ * / / \ \
99
+ * ┌───────┐ ┌───────┐
100
+ * │ agent │ ------- │ app │
101
+ * └───────┘ └───────┘
102
+ *
103
+ *
104
+ * in app worker
105
+ *
106
+ * ```js
107
+ * process.send({
108
+ * action: 'xxx',
109
+ * data: '',
110
+ * to: 'agent/master/parent', // default to agent
111
+ * });
112
+ * ```
113
+ *
114
+ * in agent worker
115
+ *
116
+ * ```js
117
+ * process.send({
118
+ * action: 'xxx',
119
+ * data: '',
120
+ * to: 'app/master/parent', // default to app
121
+ * });
122
+ * ```
123
+ *
124
+ * in parent
125
+ *
126
+ * ```js
127
+ * process.send({
128
+ * action: 'xxx',
129
+ * data: '',
130
+ * to: 'app/agent/master', // default to master
131
+ * });
132
+ * ```
133
+ */
134
+ declare class Messenger {
135
+ #private;
136
+ constructor(master: Master, workerManager: WorkerManager);
137
+ /**
138
+ * send message
139
+ * @param {Object} data message body
140
+ * - {String} from from who
141
+ * - {String} to to who
142
+ */
143
+ send(data: MessageBody): void;
144
+ /**
145
+ * send message to master self
146
+ * @param {Object} data message body
147
+ */
148
+ sendToMaster(data: MessageBody): void;
149
+ /**
150
+ * send message to parent process
151
+ * @param {Object} data message body
152
+ */
153
+ sendToParent(data: MessageBody): void;
154
+ /**
155
+ * send message to app worker
156
+ * @param {Object} data message body
157
+ */
158
+ sendToAppWorker(data: MessageBody): void;
159
+ /**
160
+ * send message to agent worker
161
+ * @param {Object} data message body
162
+ */
163
+ sendToAgentWorker(data: MessageBody): void;
164
+ }
165
+ //#endregion
166
+ //#region src/utils/mode/base/app.d.ts
167
+ declare abstract class BaseAppWorker<T = Worker | Worker$1> {
168
+ instance: T;
169
+ constructor(instance: T);
170
+ abstract get workerId(): number;
171
+ abstract get id(): number;
172
+ get state(): string;
173
+ set state(state: string);
174
+ abstract get exitedAfterDisconnect(): boolean;
175
+ abstract get exitCode(): number;
176
+ get disableRefork(): boolean;
177
+ set disableRefork(disableRefork: boolean);
178
+ get isDevReload(): boolean;
179
+ set isDevReload(isDevReload: boolean);
180
+ abstract send(data: MessageBody): void;
181
+ clean(): void;
182
+ static get workerId(): number;
183
+ static on(..._args: any[]): void;
184
+ static send(_message: MessageBody): void;
185
+ static kill(): void;
186
+ static gracefulExit(_options: any): void;
187
+ }
188
+ type LogFun = (msg: any, ...args: any[]) => void;
189
+ declare abstract class BaseAppUtils extends EventEmitter {
190
+ options: MasterOptions;
191
+ protected messenger: Messenger;
192
+ protected log: LogFun;
193
+ protected logger: Logger;
194
+ protected isProduction: boolean;
195
+ startTime: number;
196
+ startSuccessCount: number;
197
+ isAllWorkerStarted: boolean;
198
+ constructor(options: MasterOptions, {
199
+ log,
200
+ logger,
201
+ messenger,
202
+ isProduction
203
+ }: {
204
+ log: LogFun;
205
+ logger: Logger;
206
+ messenger: Messenger;
207
+ isProduction: boolean;
208
+ });
209
+ getAppWorkerFile(): string;
210
+ fork(): void;
211
+ abstract kill(timeout: number): Promise<void>;
212
+ }
213
+ //#endregion
214
+ //#region src/utils/options.d.ts
215
+ interface ClusterHTTPSSecureOptions {
216
+ key: SecureContextOptions['key'];
217
+ cert: SecureContextOptions['cert'];
218
+ ca?: SecureContextOptions['ca'];
219
+ passphrase?: SecureContextOptions['passphrase'];
220
+ }
221
+ type ClusterStartMode = 'process' | 'worker_threads';
222
+ /** Cluster start options */
223
+ interface ClusterOptions {
224
+ /**
225
+ * specify framework that can be absolute path or npm package
226
+ */
227
+ framework?: string;
228
+ /**
229
+ * @deprecated please use framework instead
230
+ */
231
+ customEgg?: string;
232
+ /** directory of application, default to `process.cwd()` */
233
+ baseDir?: string;
234
+ /**
235
+ * numbers of app workers, default to `os.cpus().length`
236
+ */
237
+ workers?: number | string;
238
+ /**
239
+ * listening port, default to `7001`(http) or `8443`(https)
240
+ */
241
+ port?: number | string | null;
242
+ /**
243
+ * listening a debug port on http protocol
244
+ */
245
+ debugPort?: number;
246
+ /**
247
+ * https options, { key, cert, ca }, full path
248
+ */
249
+ https?: ClusterHTTPSSecureOptions | boolean;
250
+ /**
251
+ * @deprecated please use `options.https.key` instead
252
+ */
253
+ key?: ClusterHTTPSSecureOptions['key'];
254
+ /**
255
+ * @deprecated please use `options.https.cert` instead
256
+ */
257
+ cert?: ClusterHTTPSSecureOptions['cert'];
258
+ /**
259
+ * will inject into worker/agent process
260
+ */
261
+ require?: string | string[];
262
+ /**
263
+ * will save master pid to this file
264
+ */
265
+ pidFile?: string;
266
+ /**
267
+ * custom env, default is `process.env.EGG_SERVER_ENV`
268
+ */
269
+ env?: string;
270
+ /**
271
+ * default is `'process'`, use `'worker_threads'` to start the app & agent worker by worker_threads
272
+ */
273
+ startMode?: ClusterStartMode;
274
+ /**
275
+ * startup port of each app worker, such as: `[7001, 7002, 7003]`, only effects when the startMode is `'worker_threads'`
276
+ */
277
+ ports?: number[];
278
+ /**
279
+ * sticky mode server
280
+ */
281
+ sticky?: boolean;
282
+ /** customized plugins, for unittest */
283
+ plugins?: object;
284
+ isDebug?: boolean;
285
+ }
286
+ interface ParsedClusterOptions extends ClusterOptions {
287
+ port?: number;
288
+ baseDir: string;
289
+ workers: number;
290
+ framework: string;
291
+ startMode: ClusterStartMode;
292
+ }
293
+ //#endregion
294
+ //#region src/utils/mode/impl/process/agent.d.ts
295
+ declare class AgentProcessWorker extends BaseAgentWorker<ChildProcess> {
296
+ get workerId(): number;
297
+ send(message: MessageBody): void;
298
+ static send(message: MessageBody): void;
299
+ static kill(): void;
300
+ static gracefulExit(options: Options): void;
301
+ }
302
+ declare class AgentProcessUtils extends BaseAgentUtils {
303
+ #private;
304
+ instance: AgentProcessWorker;
305
+ fork(): this;
306
+ clean(): void;
307
+ kill(timeout: number): Promise<void>;
308
+ }
309
+ //#endregion
310
+ //#region src/utils/mode/impl/process/app.d.ts
311
+ declare class AppProcessUtils extends BaseAppUtils {
312
+ fork(): this;
313
+ kill(timeout: number): Promise<void>;
314
+ }
315
+ //#endregion
316
+ //#region src/utils/mode/impl/worker_threads/agent.d.ts
317
+ declare class AgentThreadWorker extends BaseAgentWorker<Worker> {
318
+ get workerId(): number;
319
+ send(message: MessageBody): void;
320
+ static send(message: MessageBody): void;
321
+ static kill(): void;
322
+ static gracefulExit(options: Options): void;
323
+ }
324
+ declare class AgentThreadUtils extends BaseAgentUtils {
325
+ #private;
326
+ instance: AgentThreadWorker;
327
+ fork(): void;
328
+ clean(): void;
329
+ kill(): Promise<void>;
330
+ }
331
+ //#endregion
332
+ //#region src/utils/mode/impl/worker_threads/app.d.ts
333
+ declare class AppThreadUtils extends BaseAppUtils {
334
+ #private;
335
+ fork(): this;
336
+ kill(): Promise<void>;
337
+ }
338
+ //#endregion
339
+ //#region src/master.d.ts
340
+ interface MasterOptions extends ParsedClusterOptions {
341
+ clusterPort?: number;
342
+ stickyWorkerPort?: number;
343
+ }
344
+ declare class Master extends ReadyEventEmitter {
345
+ #private;
346
+ options: MasterOptions;
347
+ isStarted: boolean;
348
+ workerManager: WorkerManager;
349
+ messenger: Messenger;
350
+ isProduction: boolean;
351
+ agentWorkerIndex: number;
352
+ closed: boolean;
353
+ logger: EggConsoleLogger;
354
+ agentWorker: AgentProcessUtils | AgentThreadUtils;
355
+ appWorker: AppProcessUtils | AppThreadUtils;
356
+ constructor(options?: ClusterOptions);
357
+ startByProcess(): void;
358
+ startByWorkerThreads(): void;
359
+ detectPorts(): Promise<void>;
360
+ log(msg: string, ...args: any[]): void;
361
+ startMasterSocketServer(cb: (err?: Error) => void): void;
362
+ stickyWorker(ip: string): BaseAppWorker<worker_threads0.Worker | cluster0.Worker>;
363
+ forkAgentWorker(): void;
364
+ forkAppWorkers(): void;
365
+ /**
366
+ * close agent worker, App Worker will closed by cluster
367
+ *
368
+ * https://www.exratione.com/2013/05/die-child-process-die/
369
+ * make sure Agent Worker exit before master exit
370
+ *
371
+ * @param {number} timeout - kill agent timeout
372
+ * @return {Promise} -
373
+ */
374
+ killAgentWorker(timeout: number): Promise<void>;
375
+ killAppWorkers(timeout: number): Promise<void>;
376
+ /**
377
+ * Agent Worker exit handler
378
+ * Will exit during startup, and refork during running.
379
+ */
380
+ onAgentExit(data: {
381
+ /** exit code */
382
+ code: number;
383
+ /** received signal */
384
+ signal: string;
385
+ }): void;
386
+ onAgentStart(): void;
387
+ /**
388
+ * App Worker exit handler
389
+ */
390
+ onAppExit(data: {
391
+ workerId: number;
392
+ code: number;
393
+ signal: string;
394
+ }): void;
395
+ /**
396
+ * after app worker
397
+ */
398
+ onAppStart(data: {
399
+ workerId: number;
400
+ address: ListeningAddress;
401
+ }): void;
402
+ /**
403
+ * master exit handler
404
+ */
405
+ onExit(code: number): void;
406
+ onSignal(signal: string): void;
407
+ /**
408
+ * reload workers, for develop purpose
409
+ */
410
+ onReload(): void;
411
+ close(): Promise<void>;
412
+ _doClose(): Promise<void>;
413
+ }
414
+ interface ListeningAddress {
415
+ port: number;
416
+ protocol: string;
417
+ address?: string;
418
+ addressType?: number;
419
+ }
420
+ //#endregion
421
+ //#region src/error/ClusterAgentWorkerError.d.ts
422
+ declare class ClusterAgentWorkerError extends Error {
423
+ id: number;
424
+ /**
425
+ * pid in process mode
426
+ * tid in worker_threads mode
427
+ */
428
+ workerId: number;
429
+ status: string;
430
+ constructor(id: number, workerId: number, status: string, error: Error);
431
+ }
432
+ //#endregion
433
+ //#region src/error/ClusterWorkerExceptionError.d.ts
434
+ declare class ClusterWorkerExceptionError extends Error {
435
+ count: {
436
+ agent: number;
437
+ worker: number;
438
+ };
439
+ constructor(agent: number, worker: number);
440
+ }
441
+ //#endregion
6
442
  //#region src/index.d.ts
7
-
8
443
  /**
9
444
  * cluster start flow:
10
445
  *