@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.
- package/LICENSE +21 -0
- package/README.md +92 -0
- package/dist/commonjs/agent_worker.d.ts +1 -0
- package/dist/commonjs/agent_worker.js +65 -0
- package/dist/commonjs/app_worker.d.ts +1 -0
- package/dist/commonjs/app_worker.js +151 -0
- package/dist/commonjs/dirname.d.ts +1 -0
- package/dist/commonjs/dirname.js +17 -0
- package/dist/commonjs/error/ClusterAgentWorkerError.d.ts +10 -0
- package/dist/commonjs/error/ClusterAgentWorkerError.js +23 -0
- package/dist/commonjs/error/ClusterWorkerExceptionError.d.ts +7 -0
- package/dist/commonjs/error/ClusterWorkerExceptionError.js +18 -0
- package/dist/commonjs/error/index.d.ts +2 -0
- package/dist/commonjs/error/index.js +19 -0
- package/dist/commonjs/index.d.ts +17 -0
- package/dist/commonjs/index.js +37 -0
- package/dist/commonjs/master.d.ts +90 -0
- package/dist/commonjs/master.js +544 -0
- package/dist/commonjs/package.json +3 -0
- package/dist/commonjs/utils/messenger.d.ts +87 -0
- package/dist/commonjs/utils/messenger.js +183 -0
- package/dist/commonjs/utils/mode/base/agent.d.ts +38 -0
- package/dist/commonjs/utils/mode/base/agent.js +68 -0
- package/dist/commonjs/utils/mode/base/app.d.ts +48 -0
- package/dist/commonjs/utils/mode/base/app.js +81 -0
- package/dist/commonjs/utils/mode/impl/process/agent.d.ts +18 -0
- package/dist/commonjs/utils/mode/impl/process/agent.js +107 -0
- package/dist/commonjs/utils/mode/impl/process/app.d.ts +20 -0
- package/dist/commonjs/utils/mode/impl/process/app.js +134 -0
- package/dist/commonjs/utils/mode/impl/worker_threads/agent.d.ts +18 -0
- package/dist/commonjs/utils/mode/impl/worker_threads/agent.js +90 -0
- package/dist/commonjs/utils/mode/impl/worker_threads/app.d.ts +25 -0
- package/dist/commonjs/utils/mode/impl/worker_threads/app.js +156 -0
- package/dist/commonjs/utils/options.d.ts +80 -0
- package/dist/commonjs/utils/options.js +81 -0
- package/dist/commonjs/utils/terminate.d.ts +6 -0
- package/dist/commonjs/utils/terminate.js +89 -0
- package/dist/commonjs/utils/worker_manager.d.ts +25 -0
- package/dist/commonjs/utils/worker_manager.js +76 -0
- package/dist/esm/agent_worker.d.ts +1 -0
- package/dist/esm/agent_worker.js +63 -0
- package/dist/esm/app_worker.d.ts +1 -0
- package/dist/esm/app_worker.js +146 -0
- package/dist/esm/dirname.d.ts +1 -0
- package/dist/esm/dirname.js +11 -0
- package/dist/esm/error/ClusterAgentWorkerError.d.ts +10 -0
- package/dist/esm/error/ClusterAgentWorkerError.js +19 -0
- package/dist/esm/error/ClusterWorkerExceptionError.d.ts +7 -0
- package/dist/esm/error/ClusterWorkerExceptionError.js +14 -0
- package/dist/esm/error/index.d.ts +2 -0
- package/dist/esm/error/index.js +3 -0
- package/dist/esm/index.d.ts +17 -0
- package/dist/esm/index.js +19 -0
- package/dist/esm/master.d.ts +90 -0
- package/dist/esm/master.js +537 -0
- package/dist/esm/package.json +3 -0
- package/dist/esm/utils/messenger.d.ts +87 -0
- package/dist/esm/utils/messenger.js +176 -0
- package/dist/esm/utils/mode/base/agent.d.ts +38 -0
- package/dist/esm/utils/mode/base/agent.js +60 -0
- package/dist/esm/utils/mode/base/app.d.ts +48 -0
- package/dist/esm/utils/mode/base/app.js +73 -0
- package/dist/esm/utils/mode/impl/process/agent.d.ts +18 -0
- package/dist/esm/utils/mode/impl/process/agent.js +102 -0
- package/dist/esm/utils/mode/impl/process/app.d.ts +20 -0
- package/dist/esm/utils/mode/impl/process/app.js +126 -0
- package/dist/esm/utils/mode/impl/worker_threads/agent.d.ts +18 -0
- package/dist/esm/utils/mode/impl/worker_threads/agent.js +82 -0
- package/dist/esm/utils/mode/impl/worker_threads/app.d.ts +25 -0
- package/dist/esm/utils/mode/impl/worker_threads/app.js +151 -0
- package/dist/esm/utils/options.d.ts +80 -0
- package/dist/esm/utils/options.js +75 -0
- package/dist/esm/utils/terminate.d.ts +6 -0
- package/dist/esm/utils/terminate.js +86 -0
- package/dist/esm/utils/worker_manager.d.ts +25 -0
- package/dist/esm/utils/worker_manager.js +72 -0
- package/dist/package.json +4 -0
- package/package.json +94 -0
- package/src/agent_worker.ts +75 -0
- package/src/app_worker.ts +170 -0
- package/src/dirname.ts +11 -0
- package/src/error/ClusterAgentWorkerError.ts +19 -0
- package/src/error/ClusterWorkerExceptionError.ts +17 -0
- package/src/error/index.ts +2 -0
- package/src/index.ts +26 -0
- package/src/master.ts +641 -0
- package/src/utils/messenger.ts +199 -0
- package/src/utils/mode/base/agent.ts +90 -0
- package/src/utils/mode/base/app.ts +115 -0
- package/src/utils/mode/impl/process/agent.ts +118 -0
- package/src/utils/mode/impl/process/app.ts +146 -0
- package/src/utils/mode/impl/worker_threads/agent.ts +98 -0
- package/src/utils/mode/impl/worker_threads/app.ts +180 -0
- package/src/utils/options.ts +169 -0
- package/src/utils/terminate.ts +97 -0
- 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
|
+
[](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
|
+
[](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
|
+
[](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,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,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,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 {};
|