@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
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2017 Alibaba Group Holding Limited and other contributors.
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,92 @@
1
+ # egg-cluster
2
+
3
+ [![NPM version][npm-image]][npm-url]
4
+ [![CI](https://github.com/eggjs/egg-cluster/actions/workflows/nodejs.yml/badge.svg)](https://github.com/eggjs/egg-cluster/actions/workflows/nodejs.yml)
5
+ [![Test coverage][codecov-image]][codecov-url]
6
+ [![Known Vulnerabilities][snyk-image]][snyk-url]
7
+ [![npm download][download-image]][download-url]
8
+ [![Node.js Version](https://img.shields.io/node/v/@eggjs/cluster.svg?style=flat)](https://nodejs.org/en/download/)
9
+
10
+ [npm-image]: https://img.shields.io/npm/v/@eggjs/cluster.svg?style=flat-square
11
+ [npm-url]: https://npmjs.org/package/@eggjs/cluster
12
+ [codecov-image]: https://codecov.io/github/eggjs/egg-cluster/coverage.svg?branch=master
13
+ [codecov-url]: https://codecov.io/github/eggjs/egg-cluster?branch=master
14
+ [snyk-image]: https://snyk.io/test/npm/@eggjs/cluster/badge.svg?style=flat-square
15
+ [snyk-url]: https://snyk.io/test/npm/@eggjs/cluster
16
+ [download-image]: https://img.shields.io/npm/dm/@eggjs/cluster.svg?style=flat-square
17
+ [download-url]: https://npmjs.org/package/@eggjs/cluster
18
+
19
+ Cluster Manager for EggJS
20
+
21
+ ## Install
22
+
23
+ ```bash
24
+ npm i @eggjs/cluster
25
+ ```
26
+
27
+ ## Usage
28
+
29
+ CommonJS
30
+
31
+ ```js
32
+ const { startCluster } = require('@eggjs/cluster');
33
+
34
+ startCluster({
35
+ baseDir: '/path/to/app',
36
+ framework: '/path/to/framework',
37
+ });
38
+ ```
39
+
40
+ You can specify a callback that will be invoked when application has started.
41
+ However, master process will exit when catch an error.
42
+
43
+ ```js
44
+ startCluster(options).then(() => {
45
+ console.log('started');
46
+ });
47
+ ```
48
+
49
+ ESM and TypeScript
50
+
51
+ ```ts
52
+ import { startCluster } from '@eggjs/cluster';
53
+
54
+ startCluster({
55
+ baseDir: '/path/to/app',
56
+ framework: '/path/to/framework',
57
+ });
58
+ ```
59
+
60
+ ## Options
61
+
62
+ | Param | Type | Description |
63
+ | ------------ | --------- | ---------------------------------------- |
64
+ | baseDir | `String` | directory of application |
65
+ | framework | `String` | specify framework that can be absolute path or npm package |
66
+ | plugins | `Object` | plugins for unittest |
67
+ | workers | `Number` | numbers of app workers |
68
+ | sticky | `Boolean` | sticky mode server |
69
+ | port | `Number` | port |
70
+ | debugPort | `Number` | the debug port only listen on http protocol |
71
+ | https | `Object` | start a https server, note: `key` / `cert` / `ca` should be full path to file |
72
+ | require | `Array\|String` | will inject into worker/agent process |
73
+ | pidFile | `String` | will save master pid to this file |
74
+ | startMode | `String` | default is 'process', use 'worker_threads' to start the app & agent worker by worker_threads |
75
+ | ports | `Array` | startup port of each app worker, such as: [7001, 7002, 7003], only effects when the startMode is 'worker_threads' |
76
+ | env | `String` | custom env, default is process.env.EGG_SERVER_ENV |
77
+
78
+ ## Env
79
+
80
+ `EGG_APP_CLOSE_TIMEOUT`: app worker boot timeout value
81
+
82
+ `EGG_AGENT_CLOSE_TIMEOUT`: agent worker boot timeout value
83
+
84
+ ## License
85
+
86
+ [MIT](LICENSE)
87
+
88
+ ## Contributors
89
+
90
+ [![Contributors](https://contrib.rocks/image?repo=eggjs/egg-cluster)](https://github.com/eggjs/egg-cluster/graphs/contributors)
91
+
92
+ Made with [contributors-img](https://contrib.rocks).
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const node_util_1 = require("node:util");
4
+ const egg_logger_1 = require("egg-logger");
5
+ const utils_1 = require("@eggjs/utils");
6
+ const agent_js_1 = require("./utils/mode/impl/worker_threads/agent.js");
7
+ const agent_js_2 = require("./utils/mode/impl/process/agent.js");
8
+ const debug = (0, node_util_1.debuglog)('@eggjs/cluster/agent_worker');
9
+ /**
10
+ * agent worker is child_process forked by master.
11
+ *
12
+ * agent worker only exit in two cases:
13
+ * - receive signal SIGTERM, exit code 0 (exit gracefully)
14
+ * - receive disconnect event, exit code 110 (maybe master exit in accident)
15
+ */
16
+ async function main() {
17
+ // $ node agent_worker.js options
18
+ const options = JSON.parse(process.argv[2]);
19
+ if (options.require) {
20
+ // inject
21
+ options.require.forEach(mod => {
22
+ require(mod);
23
+ });
24
+ }
25
+ let AgentWorker;
26
+ if (options.startMode === 'worker_threads') {
27
+ AgentWorker = agent_js_1.AgentThreadWorker;
28
+ }
29
+ else {
30
+ AgentWorker = agent_js_2.AgentProcessWorker;
31
+ }
32
+ const consoleLogger = new egg_logger_1.EggConsoleLogger({ level: process.env.EGG_AGENT_WORKER_LOGGER_LEVEL });
33
+ const { Agent } = await (0, utils_1.importModule)(options.framework);
34
+ debug('new Agent with options %j', options);
35
+ let agent;
36
+ try {
37
+ agent = new Agent(options);
38
+ }
39
+ catch (err) {
40
+ consoleLogger.error(err);
41
+ throw err;
42
+ }
43
+ function startErrorHandler(err) {
44
+ consoleLogger.error(err);
45
+ consoleLogger.error('[agent_worker] start error, exiting with code:1');
46
+ AgentWorker.kill();
47
+ }
48
+ agent.ready((err) => {
49
+ // don't send started message to master when start error
50
+ if (err) {
51
+ return;
52
+ }
53
+ agent.removeListener('error', startErrorHandler);
54
+ AgentWorker.send({ action: 'agent-start', to: 'master' });
55
+ });
56
+ // exit if agent start error
57
+ agent.once('error', startErrorHandler);
58
+ AgentWorker.gracefulExit({
59
+ logger: consoleLogger,
60
+ label: 'agent_worker',
61
+ beforeExit: () => agent.close(),
62
+ });
63
+ }
64
+ main();
65
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdlbnRfd29ya2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FnZW50X3dvcmtlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHlDQUFxQztBQUNyQywyQ0FBK0Q7QUFDL0Qsd0NBQTRDO0FBRTVDLHdFQUE4RTtBQUM5RSxpRUFBd0U7QUFFeEUsTUFBTSxLQUFLLEdBQUcsSUFBQSxvQkFBUSxFQUFDLDZCQUE2QixDQUFDLENBQUM7QUFFdEQ7Ozs7OztHQU1HO0FBQ0gsS0FBSyxVQUFVLElBQUk7SUFDakIsaUNBQWlDO0lBQ2pDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FJekMsQ0FBQztJQUNGLElBQUksT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3BCLFNBQVM7UUFDVCxPQUFPLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUM1QixPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDZixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxJQUFJLFdBQW1DLENBQUM7SUFDeEMsSUFBSSxPQUFPLENBQUMsU0FBUyxLQUFLLGdCQUFnQixFQUFFLENBQUM7UUFDM0MsV0FBVyxHQUFHLDRCQUF3QixDQUFDO0lBQ3pDLENBQUM7U0FBTSxDQUFDO1FBQ04sV0FBVyxHQUFHLDZCQUF5QixDQUFDO0lBQzFDLENBQUM7SUFFRCxNQUFNLGFBQWEsR0FBRyxJQUFJLDZCQUFhLENBQUMsRUFBRSxLQUFLLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyw2QkFBNkIsRUFBRSxDQUFDLENBQUM7SUFDOUYsTUFBTSxFQUFFLEtBQUssRUFBRSxHQUFHLE1BQU0sSUFBQSxvQkFBWSxFQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUN4RCxLQUFLLENBQUMsMkJBQTJCLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDNUMsSUFBSSxLQUFVLENBQUM7SUFDZixJQUFJLENBQUM7UUFDSCxLQUFLLEdBQUcsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDYixhQUFhLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3pCLE1BQU0sR0FBRyxDQUFDO0lBQ1osQ0FBQztJQUVELFNBQVMsaUJBQWlCLENBQUMsR0FBVTtRQUNuQyxhQUFhLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3pCLGFBQWEsQ0FBQyxLQUFLLENBQUMsaURBQWlELENBQUMsQ0FBQztRQUN2RSxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDckIsQ0FBQztJQUVELEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFXLEVBQUUsRUFBRTtRQUMxQix3REFBd0Q7UUFDeEQsSUFBSSxHQUFHLEVBQUUsQ0FBQztZQUNSLE9BQU87UUFDVCxDQUFDO1FBRUQsS0FBSyxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztRQUNqRCxXQUFXLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUM1RCxDQUFDLENBQUMsQ0FBQztJQUVILDRCQUE0QjtJQUM1QixLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO0lBRXZDLFdBQVcsQ0FBQyxZQUFZLENBQUM7UUFDdkIsTUFBTSxFQUFFLGFBQWE7UUFDckIsS0FBSyxFQUFFLGNBQWM7UUFDckIsVUFBVSxFQUFFLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUU7S0FDaEMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVELElBQUksRUFBRSxDQUFDIn0=
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,151 @@
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
+ const node_fs_1 = __importDefault(require("node:fs"));
7
+ const node_http_1 = require("node:http");
8
+ const node_https_1 = require("node:https");
9
+ const node_util_1 = require("node:util");
10
+ const egg_logger_1 = require("egg-logger");
11
+ const utils_1 = require("@eggjs/utils");
12
+ const app_js_1 = require("./utils/mode/impl/worker_threads/app.js");
13
+ const app_js_2 = require("./utils/mode/impl/process/app.js");
14
+ const debug = (0, node_util_1.debuglog)('@eggjs/cluster/app_worker');
15
+ async function main() {
16
+ // $ node app_worker.js options-json-string
17
+ const options = JSON.parse(process.argv[2]);
18
+ if (options.require) {
19
+ // inject
20
+ for (const mod of options.require) {
21
+ await (0, utils_1.importModule)(mod);
22
+ }
23
+ }
24
+ let AppWorker;
25
+ if (options.startMode === 'worker_threads') {
26
+ AppWorker = app_js_1.AppThreadWorker;
27
+ }
28
+ else {
29
+ AppWorker = app_js_2.AppProcessWorker;
30
+ }
31
+ const consoleLogger = new egg_logger_1.EggConsoleLogger({
32
+ level: process.env.EGG_APP_WORKER_LOGGER_LEVEL,
33
+ });
34
+ const { Application } = await (0, utils_1.importModule)(options.framework);
35
+ debug('new Application with options %j', options);
36
+ let app;
37
+ try {
38
+ app = new Application(options);
39
+ }
40
+ catch (err) {
41
+ consoleLogger.error(err);
42
+ throw err;
43
+ }
44
+ app.ready(startServer);
45
+ function exitProcess() {
46
+ // Use SIGTERM kill process, ensure trigger the gracefulExit
47
+ AppWorker.kill();
48
+ }
49
+ // exit if worker start timeout
50
+ app.once('startTimeout', startTimeoutHandler);
51
+ function startTimeoutHandler() {
52
+ consoleLogger.error('[app_worker] start timeout, exiting with code:1');
53
+ exitProcess();
54
+ }
55
+ function startServer(err) {
56
+ if (err) {
57
+ consoleLogger.error(err);
58
+ consoleLogger.error('[app_worker] start error, exiting with code:1');
59
+ exitProcess();
60
+ return;
61
+ }
62
+ const clusterConfig = app.config.cluster ?? {};
63
+ const listenConfig = clusterConfig.listen ?? {};
64
+ const httpsOptions = {
65
+ ...clusterConfig.https,
66
+ ...options.https,
67
+ };
68
+ const port = options.port = options.port ?? listenConfig.port;
69
+ const debugPort = options.debugPort;
70
+ const protocol = (httpsOptions.key && httpsOptions.cert) ? 'https' : 'http';
71
+ AppWorker.send({
72
+ to: 'master',
73
+ action: 'realport',
74
+ data: {
75
+ port,
76
+ protocol,
77
+ },
78
+ });
79
+ app.removeListener('startTimeout', startTimeoutHandler);
80
+ let server;
81
+ let debugPortServer;
82
+ // https config
83
+ if (protocol === 'https') {
84
+ httpsOptions.key = node_fs_1.default.readFileSync(httpsOptions.key);
85
+ httpsOptions.cert = node_fs_1.default.readFileSync(httpsOptions.cert);
86
+ httpsOptions.ca = httpsOptions.ca && node_fs_1.default.readFileSync(httpsOptions.ca);
87
+ server = (0, node_https_1.createServer)(httpsOptions, app.callback());
88
+ if (debugPort) {
89
+ debugPortServer = (0, node_http_1.createServer)(app.callback());
90
+ }
91
+ }
92
+ else {
93
+ server = (0, node_http_1.createServer)(app.callback());
94
+ if (debugPort) {
95
+ debugPortServer = server;
96
+ }
97
+ }
98
+ server.once('error', (err) => {
99
+ consoleLogger.error('[app_worker] server got error: %s, code: %s', err.message, err.code);
100
+ exitProcess();
101
+ });
102
+ // emit `server` event in app
103
+ app.emit('server', server);
104
+ if (options.sticky && options.stickyWorkerPort) {
105
+ server.listen(options.stickyWorkerPort, '127.0.0.1');
106
+ // Listen to messages was sent from the master. Ignore everything else.
107
+ AppWorker.on('message', (message, connection) => {
108
+ if (message !== 'sticky-session:connection') {
109
+ return;
110
+ }
111
+ // Emulate a connection event on the server by emitting the
112
+ // event with the connection the master sent us.
113
+ server.emit('connection', connection);
114
+ connection.resume();
115
+ });
116
+ }
117
+ else {
118
+ if (listenConfig.path) {
119
+ server.listen(listenConfig.path);
120
+ }
121
+ else {
122
+ if (typeof port !== 'number') {
123
+ consoleLogger.error('[app_worker] port should be number, but got %s(%s)', port, typeof port);
124
+ exitProcess();
125
+ return;
126
+ }
127
+ const args = [port];
128
+ if (listenConfig.hostname)
129
+ args.push(listenConfig.hostname);
130
+ debug('listen options %s', args);
131
+ server.listen(...args);
132
+ }
133
+ if (debugPortServer) {
134
+ debug('listen on debug port: %s', debugPort);
135
+ debugPortServer.listen(debugPort);
136
+ }
137
+ }
138
+ AppWorker.send({
139
+ to: 'master',
140
+ action: 'listening',
141
+ data: server.address() || { port },
142
+ });
143
+ }
144
+ AppWorker.gracefulExit({
145
+ logger: consoleLogger,
146
+ label: 'app_worker',
147
+ beforeExit: () => app.close(),
148
+ });
149
+ }
150
+ main();
151
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwX3dvcmtlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcHBfd29ya2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsc0RBQXlCO0FBQ3pCLHlDQUEwRTtBQUMxRSwyQ0FBK0Q7QUFFL0QseUNBQXFDO0FBQ3JDLDJDQUErRDtBQUMvRCx3Q0FBNEM7QUFFNUMsb0VBQTBFO0FBQzFFLDZEQUFvRTtBQUVwRSxNQUFNLEtBQUssR0FBRyxJQUFBLG9CQUFRLEVBQUMsMkJBQTJCLENBQUMsQ0FBQztBQUVwRCxLQUFLLFVBQVUsSUFBSTtJQUNqQiwyQ0FBMkM7SUFDM0MsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQVN6QyxDQUFDO0lBQ0YsSUFBSSxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDcEIsU0FBUztRQUNULEtBQUssTUFBTSxHQUFHLElBQUksT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2xDLE1BQU0sSUFBQSxvQkFBWSxFQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzFCLENBQUM7SUFDSCxDQUFDO0lBRUQsSUFBSSxTQUErQixDQUFDO0lBQ3BDLElBQUksT0FBTyxDQUFDLFNBQVMsS0FBSyxnQkFBZ0IsRUFBRSxDQUFDO1FBQzNDLFNBQVMsR0FBRyx3QkFBc0IsQ0FBQztJQUNyQyxDQUFDO1NBQU0sQ0FBQztRQUNOLFNBQVMsR0FBRyx5QkFBdUIsQ0FBQztJQUN0QyxDQUFDO0lBRUQsTUFBTSxhQUFhLEdBQUcsSUFBSSw2QkFBYSxDQUFDO1FBQ3RDLEtBQUssRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLDJCQUEyQjtLQUMvQyxDQUFDLENBQUM7SUFDSCxNQUFNLEVBQUUsV0FBVyxFQUFFLEdBQUcsTUFBTSxJQUFBLG9CQUFZLEVBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzlELEtBQUssQ0FBQyxpQ0FBaUMs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
@@ -0,0 +1 @@
1
+ export declare function getSrcDirname(): string;
@@ -0,0 +1,17 @@
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.getSrcDirname = getSrcDirname;
7
+ const node_url_1 = require("node:url");
8
+ const node_path_1 = __importDefault(require("node:path"));
9
+ function getSrcDirname() {
10
+ if (typeof __dirname !== 'undefined') {
11
+ return __dirname;
12
+ }
13
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
14
+ // @ts-ignore
15
+ return node_path_1.default.dirname((0, node_url_1.fileURLToPath)('import_meta_url_placeholder_by_tshy_after'));
16
+ }
17
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlybmFtZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kaXJuYW1lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBR0Esc0NBT0M7QUFWRCx1Q0FBeUM7QUFDekMsMERBQTZCO0FBRTdCLFNBQWdCLGFBQWE7SUFDM0IsSUFBSSxPQUFPLFNBQVMsS0FBSyxXQUFXLEVBQUUsQ0FBQztRQUNyQyxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBQ0QsNkRBQTZEO0lBQzdELGFBQWE7SUFDYixPQUFPLG1CQUFJLENBQUMsT0FBTyxDQUFDLElBQUEsd0JBQWEsRUFBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDdEQsQ0FBQyJ9
@@ -0,0 +1,10 @@
1
+ export declare class ClusterAgentWorkerError extends Error {
2
+ id: number;
3
+ /**
4
+ * pid in process mode
5
+ * tid in worker_threads mode
6
+ */
7
+ workerId: number;
8
+ status: string;
9
+ constructor(id: number, workerId: number, status: string, error: Error);
10
+ }
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ClusterAgentWorkerError = void 0;
4
+ class ClusterAgentWorkerError extends Error {
5
+ id;
6
+ /**
7
+ * pid in process mode
8
+ * tid in worker_threads mode
9
+ */
10
+ workerId;
11
+ status;
12
+ constructor(id, workerId, status, error) {
13
+ const message = `Got agent worker error: ${error.message}`;
14
+ super(message, { cause: error });
15
+ this.name = this.constructor.name;
16
+ this.id = id;
17
+ this.workerId = workerId;
18
+ this.status = status;
19
+ Error.captureStackTrace(this, this.constructor);
20
+ }
21
+ }
22
+ exports.ClusterAgentWorkerError = ClusterAgentWorkerError;
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2x1c3RlckFnZW50V29ya2VyRXJyb3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZXJyb3IvQ2x1c3RlckFnZW50V29ya2VyRXJyb3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsTUFBYSx1QkFBd0IsU0FBUSxLQUFLO0lBQ2hELEVBQUUsQ0FBUztJQUNYOzs7T0FHRztJQUNILFFBQVEsQ0FBUztJQUNqQixNQUFNLENBQVM7SUFFZixZQUFZLEVBQVUsRUFBRSxRQUFnQixFQUFFLE1BQWMsRUFBRSxLQUFZO1FBQ3BFLE1BQU0sT0FBTyxHQUFHLDJCQUEyQixLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDM0QsS0FBSyxDQUFDLE9BQU8sRUFBRSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ2pDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUM7UUFDbEMsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7UUFDYixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUN6QixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQixLQUFLLENBQUMsaUJBQWlCLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNsRCxDQUFDO0NBQ0Y7QUFsQkQsMERBa0JDIn0=
@@ -0,0 +1,7 @@
1
+ export declare class ClusterWorkerExceptionError extends Error {
2
+ count: {
3
+ agent: number;
4
+ worker: number;
5
+ };
6
+ constructor(agent: number, worker: number);
7
+ }
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ClusterWorkerExceptionError = void 0;
4
+ class ClusterWorkerExceptionError extends Error {
5
+ count;
6
+ constructor(agent, worker) {
7
+ const message = `[master] ${agent} agent and ${worker} worker(s) alive, exit to avoid unknown state`;
8
+ super(message);
9
+ this.name = this.constructor.name;
10
+ this.count = {
11
+ agent,
12
+ worker,
13
+ };
14
+ Error.captureStackTrace(this, this.constructor);
15
+ }
16
+ }
17
+ exports.ClusterWorkerExceptionError = ClusterWorkerExceptionError;
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2x1c3RlcldvcmtlckV4Y2VwdGlvbkVycm9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2Vycm9yL0NsdXN0ZXJXb3JrZXJFeGNlcHRpb25FcnJvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxNQUFhLDJCQUE0QixTQUFRLEtBQUs7SUFDcEQsS0FBSyxDQUdIO0lBRUYsWUFBWSxLQUFhLEVBQUUsTUFBYztRQUN2QyxNQUFNLE9BQU8sR0FBRyxZQUFZLEtBQUssY0FBYyxNQUFNLCtDQUErQyxDQUFDO1FBQ3JHLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNmLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUM7UUFDbEMsSUFBSSxDQUFDLEtBQUssR0FBRztZQUNYLEtBQUs7WUFDTCxNQUFNO1NBQ1AsQ0FBQztRQUNGLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ2xELENBQUM7Q0FDRjtBQWhCRCxrRUFnQkMifQ==
@@ -0,0 +1,2 @@
1
+ export * from './ClusterAgentWorkerError.js';
2
+ export * from './ClusterWorkerExceptionError.js';
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./ClusterAgentWorkerError.js"), exports);
18
+ __exportStar(require("./ClusterWorkerExceptionError.js"), exports);
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZXJyb3IvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLCtEQUE2QztBQUM3QyxtRUFBaUQifQ==
@@ -0,0 +1,17 @@
1
+ import { Master, MasterOptions } from './master.js';
2
+ import { ClusterOptions, ClusterHTTPSSecureOptions, ClusterStartMode } from './utils/options.js';
3
+ /**
4
+ * cluster start flow:
5
+ *
6
+ * [startCluster] -> master -> agent_worker -> new [Agent] -> agentWorkerLoader
7
+ * `-> app_worker -> new [Application] -> appWorkerLoader
8
+ *
9
+ */
10
+ /**
11
+ * start egg app
12
+ * @function Egg#startCluster
13
+ * @param {Object} options {@link Master}
14
+ */
15
+ export declare function startCluster(options: ClusterOptions): Promise<void>;
16
+ export { Master, MasterOptions, ClusterOptions, ClusterHTTPSSecureOptions, ClusterStartMode, };
17
+ export * from './error/index.js';
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.Master = void 0;
18
+ exports.startCluster = startCluster;
19
+ const master_js_1 = require("./master.js");
20
+ Object.defineProperty(exports, "Master", { enumerable: true, get: function () { return master_js_1.Master; } });
21
+ /**
22
+ * cluster start flow:
23
+ *
24
+ * [startCluster] -> master -> agent_worker -> new [Agent] -> agentWorkerLoader
25
+ * `-> app_worker -> new [Application] -> appWorkerLoader
26
+ *
27
+ */
28
+ /**
29
+ * start egg app
30
+ * @function Egg#startCluster
31
+ * @param {Object} options {@link Master}
32
+ */
33
+ async function startCluster(options) {
34
+ await new master_js_1.Master(options).ready();
35
+ }
36
+ __exportStar(require("./error/index.js"), exports);
37
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFnQkEsb0NBRUM7QUFsQkQsMkNBQW9EO0FBcUJsRCx1RkFyQk8sa0JBQU0sT0FxQlA7QUFsQlI7Ozs7OztHQU1HO0FBRUg7Ozs7R0FJRztBQUNJLEtBQUssVUFBVSxZQUFZLENBQUMsT0FBdUI7SUFDeEQsTUFBTSxJQUFJLGtCQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7QUFDcEMsQ0FBQztBQU9ELG1EQUFpQyJ9
@@ -0,0 +1,90 @@
1
+ import { ReadyEventEmitter } from 'get-ready';
2
+ import { EggConsoleLogger as ConsoleLogger } from 'egg-logger';
3
+ import { ClusterOptions, ParsedClusterOptions } from './utils/options.js';
4
+ import { WorkerManager } from './utils/worker_manager.js';
5
+ import { Messenger } from './utils/messenger.js';
6
+ import { AgentProcessUtils as ProcessAgentWorker } from './utils/mode/impl/process/agent.js';
7
+ import { AppProcessUtils as ProcessAppWorker } from './utils/mode/impl/process/app.js';
8
+ import { AgentThreadUtils as WorkerThreadsAgentWorker } from './utils/mode/impl/worker_threads/agent.js';
9
+ import { AppThreadUtils as WorkerThreadsAppWorker } from './utils/mode/impl/worker_threads/app.js';
10
+ export interface MasterOptions extends ParsedClusterOptions {
11
+ clusterPort?: number;
12
+ stickyWorkerPort?: number;
13
+ }
14
+ export declare class Master extends ReadyEventEmitter {
15
+ #private;
16
+ options: MasterOptions;
17
+ isStarted: boolean;
18
+ workerManager: WorkerManager;
19
+ messenger: Messenger;
20
+ isProduction: boolean;
21
+ agentWorkerIndex: number;
22
+ closed: boolean;
23
+ logger: ConsoleLogger;
24
+ agentWorker: ProcessAgentWorker | WorkerThreadsAgentWorker;
25
+ appWorker: ProcessAppWorker | WorkerThreadsAppWorker;
26
+ constructor(options?: ClusterOptions);
27
+ startByProcess(): void;
28
+ startByWorkerThreads(): void;
29
+ detectPorts(): Promise<void>;
30
+ log(msg: string, ...args: any[]): void;
31
+ startMasterSocketServer(cb: (err?: Error) => void): void;
32
+ stickyWorker(ip: string): import("./utils/mode/base/app.js").BaseAppWorker<import("worker_threads").Worker | import("cluster").Worker>;
33
+ forkAgentWorker(): void;
34
+ forkAppWorkers(): void;
35
+ /**
36
+ * close agent worker, App Worker will closed by cluster
37
+ *
38
+ * https://www.exratione.com/2013/05/die-child-process-die/
39
+ * make sure Agent Worker exit before master exit
40
+ *
41
+ * @param {number} timeout - kill agent timeout
42
+ * @return {Promise} -
43
+ */
44
+ killAgentWorker(timeout: number): Promise<void>;
45
+ killAppWorkers(timeout: number): Promise<void>;
46
+ /**
47
+ * Agent Worker exit handler
48
+ * Will exit during startup, and refork during running.
49
+ */
50
+ onAgentExit(data: {
51
+ /** exit code */
52
+ code: number;
53
+ /** received signal */
54
+ signal: string;
55
+ }): void;
56
+ onAgentStart(): void;
57
+ /**
58
+ * App Worker exit handler
59
+ */
60
+ onAppExit(data: {
61
+ workerId: number;
62
+ code: number;
63
+ signal: string;
64
+ }): void;
65
+ /**
66
+ * after app worker
67
+ */
68
+ onAppStart(data: {
69
+ workerId: number;
70
+ address: ListeningAddress;
71
+ }): void;
72
+ /**
73
+ * master exit handler
74
+ */
75
+ onExit(code: number): void;
76
+ onSignal(signal: string): void;
77
+ /**
78
+ * reload workers, for develop purpose
79
+ */
80
+ onReload(): void;
81
+ close(): Promise<void>;
82
+ _doClose(): Promise<void>;
83
+ }
84
+ interface ListeningAddress {
85
+ port: number;
86
+ protocol: string;
87
+ address?: string;
88
+ addressType?: number;
89
+ }
90
+ export {};