@eggjs/cluster 3.0.0-beta.4 → 3.0.1
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/dist/commonjs/agent_worker.js +9 -5
- package/dist/commonjs/app_worker.js +19 -5
- package/dist/commonjs/master.js +4 -2
- package/dist/commonjs/utils/options.js +4 -2
- package/dist/esm/agent_worker.js +9 -5
- package/dist/esm/app_worker.js +19 -5
- package/dist/esm/master.js +4 -2
- package/dist/esm/utils/options.js +4 -2
- package/dist/package.json +1 -1
- package/package.json +8 -8
- package/src/agent_worker.ts +9 -4
- package/src/app_worker.ts +21 -5
- package/src/master.ts +4 -1
- package/src/utils/options.ts +3 -1
- package/dist/commonjs/package-lock.json +0 -5618
- package/dist/esm/package-lock.json +0 -5618
- package/src/package-lock.json +0 -5618
|
@@ -19,7 +19,9 @@ export async function parseOptions(options) {
|
|
|
19
19
|
// compatible customEgg only when call startCluster directly without framework
|
|
20
20
|
framework: options.framework ?? options.customEgg,
|
|
21
21
|
});
|
|
22
|
-
const egg = await importModule(options.framework
|
|
22
|
+
const egg = await importModule(options.framework, {
|
|
23
|
+
paths: [options.baseDir],
|
|
24
|
+
});
|
|
23
25
|
assert(egg.Application, `should define Application in ${options.framework}`);
|
|
24
26
|
assert(egg.Agent, `should define Agent in ${options.framework}`);
|
|
25
27
|
if (options.https === true) {
|
|
@@ -72,4 +74,4 @@ export async function parseOptions(options) {
|
|
|
72
74
|
}
|
|
73
75
|
return options;
|
|
74
76
|
}
|
|
75
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
77
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3B0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy9vcHRpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUN6QixPQUFPLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDekIsT0FBTyxJQUFJLE1BQU0sV0FBVyxDQUFDO0FBQzdCLE9BQU8sTUFBTSxNQUFNLGFBQWEsQ0FBQztBQUVqQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsWUFBWSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBb0Y5RCxNQUFNLENBQUMsS0FBSyxVQUFVLFlBQVksQ0FBQyxPQUF3QjtJQUN6RCxPQUFPLEdBQUc7UUFDUixPQUFPLEVBQUUsT0FBTyxDQUFDLEdBQUcsRUFBRTtRQUN0QixJQUFJLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTO1FBQ3ZDLFNBQVMsRUFBRSxTQUFTO1FBQ3BCLGFBQWE7UUFDYixHQUFHLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjO1FBQy9CLEdBQUcsT0FBTztLQUNYLENBQUM7SUFFRixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFRLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFDNUQsTUFBTSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEVBQUUsR0FBRyxPQUFPLGVBQWUsQ0FBQyxDQUFDO0lBRTFELE9BQU8sQ0FBQyxTQUFTLEdBQUcsZ0JBQWdCLENBQUM7UUFDbkMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxPQUFRO1FBQ3pCLDhFQUE4RTtRQUM5RSxTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVMsSUFBSSxPQUFPLENBQUMsU0FBUztLQUNsRCxDQUFDLENBQUM7SUFFSCxNQUFNLEdBQUcsR0FBRyxNQUFNLFlBQVksQ0FBQyxPQUFPLENBQUMs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
|
package/dist/package.json
CHANGED
package/package.json
CHANGED
|
@@ -1,18 +1,17 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@eggjs/cluster",
|
|
3
|
-
"version": "3.0.
|
|
3
|
+
"version": "3.0.1",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"access": "public"
|
|
6
6
|
},
|
|
7
7
|
"description": "cluster manager for egg",
|
|
8
|
-
"main": "./dist/commonjs/index.js",
|
|
9
8
|
"scripts": {
|
|
10
9
|
"lint": "eslint --cache src test --ext .ts",
|
|
11
10
|
"pretest": "npm run lint -- --fix && npm run prepublishOnly",
|
|
12
11
|
"test": "egg-bin test",
|
|
13
12
|
"preci": "npm run lint && npm run prepublishOnly",
|
|
14
|
-
"ci": "egg-bin
|
|
15
|
-
"prepublishOnly": "tshy && tshy-after"
|
|
13
|
+
"ci": "egg-bin test",
|
|
14
|
+
"prepublishOnly": "tshy && tshy-after && attw --pack"
|
|
16
15
|
},
|
|
17
16
|
"files": [
|
|
18
17
|
"dist",
|
|
@@ -34,7 +33,7 @@
|
|
|
34
33
|
},
|
|
35
34
|
"homepage": "https://github.com/eggjs/cluster#readme",
|
|
36
35
|
"dependencies": {
|
|
37
|
-
"@eggjs/utils": "^4.
|
|
36
|
+
"@eggjs/utils": "^4.2.1",
|
|
38
37
|
"@fengmk2/ps-tree": "^2.0.1",
|
|
39
38
|
"cfork": "^2.0.0",
|
|
40
39
|
"cluster-reload": "^2.0.0",
|
|
@@ -48,18 +47,18 @@
|
|
|
48
47
|
},
|
|
49
48
|
"devDependencies": {
|
|
50
49
|
"@arethetypeswrong/cli": "^0.17.1",
|
|
50
|
+
"@eggjs/bin": "^7.0.0",
|
|
51
|
+
"@eggjs/mock": "beta",
|
|
52
|
+
"@eggjs/supertest": "^8.1.1",
|
|
51
53
|
"@eggjs/tsconfig": "1",
|
|
52
54
|
"@types/mocha": "10",
|
|
53
55
|
"@types/node": "22",
|
|
54
56
|
"address": "^2.0.3",
|
|
55
57
|
"coffee": "^5.5.1",
|
|
56
58
|
"egg": "beta",
|
|
57
|
-
"egg-bin": "6",
|
|
58
59
|
"egg-errors": "^2.2.0",
|
|
59
|
-
"egg-mock": "beta",
|
|
60
60
|
"eslint": "8",
|
|
61
61
|
"eslint-config-egg": "14",
|
|
62
|
-
"supertest": "^7.0.0",
|
|
63
62
|
"ts-node": "^10.9.1",
|
|
64
63
|
"tshy": "3",
|
|
65
64
|
"tshy-after": "1",
|
|
@@ -90,5 +89,6 @@
|
|
|
90
89
|
"./package.json": "./package.json"
|
|
91
90
|
},
|
|
92
91
|
"types": "./dist/commonjs/index.d.ts",
|
|
92
|
+
"main": "./dist/commonjs/index.js",
|
|
93
93
|
"module": "./dist/esm/index.js"
|
|
94
94
|
}
|
package/src/agent_worker.ts
CHANGED
|
@@ -18,14 +18,17 @@ async function main() {
|
|
|
18
18
|
// $ node agent_worker.js options
|
|
19
19
|
const options = JSON.parse(process.argv[2]) as {
|
|
20
20
|
framework: string;
|
|
21
|
+
baseDir: string;
|
|
21
22
|
require?: string[];
|
|
22
23
|
startMode?: 'process' | 'worker_threads';
|
|
23
24
|
};
|
|
24
25
|
if (options.require) {
|
|
25
26
|
// inject
|
|
26
|
-
options.require
|
|
27
|
-
|
|
28
|
-
|
|
27
|
+
for (const mod of options.require) {
|
|
28
|
+
await importModule(mod, {
|
|
29
|
+
paths: [ options.baseDir ],
|
|
30
|
+
});
|
|
31
|
+
}
|
|
29
32
|
}
|
|
30
33
|
|
|
31
34
|
let AgentWorker: typeof BaseAgentWorker;
|
|
@@ -36,7 +39,9 @@ async function main() {
|
|
|
36
39
|
}
|
|
37
40
|
|
|
38
41
|
const consoleLogger = new ConsoleLogger({ level: process.env.EGG_AGENT_WORKER_LOGGER_LEVEL });
|
|
39
|
-
const { Agent } = await importModule(options.framework
|
|
42
|
+
const { Agent } = await importModule(options.framework, {
|
|
43
|
+
paths: [ options.baseDir ],
|
|
44
|
+
});
|
|
40
45
|
debug('new Agent with options %j', options);
|
|
41
46
|
let agent: any;
|
|
42
47
|
try {
|
package/src/app_worker.ts
CHANGED
|
@@ -15,9 +15,10 @@ async function main() {
|
|
|
15
15
|
// $ node app_worker.js options-json-string
|
|
16
16
|
const options = JSON.parse(process.argv[2]) as {
|
|
17
17
|
framework: string;
|
|
18
|
+
baseDir: string;
|
|
18
19
|
require?: string[];
|
|
19
20
|
startMode?: 'process' | 'worker_threads';
|
|
20
|
-
port
|
|
21
|
+
port: number;
|
|
21
22
|
debugPort?: number;
|
|
22
23
|
https?: object;
|
|
23
24
|
sticky?: boolean;
|
|
@@ -26,7 +27,9 @@ async function main() {
|
|
|
26
27
|
if (options.require) {
|
|
27
28
|
// inject
|
|
28
29
|
for (const mod of options.require) {
|
|
29
|
-
await importModule(mod
|
|
30
|
+
await importModule(mod, {
|
|
31
|
+
paths: [ options.baseDir ],
|
|
32
|
+
});
|
|
30
33
|
}
|
|
31
34
|
}
|
|
32
35
|
|
|
@@ -40,7 +43,9 @@ async function main() {
|
|
|
40
43
|
const consoleLogger = new ConsoleLogger({
|
|
41
44
|
level: process.env.EGG_APP_WORKER_LOGGER_LEVEL,
|
|
42
45
|
});
|
|
43
|
-
const { Application } = await importModule(options.framework
|
|
46
|
+
const { Application } = await importModule(options.framework, {
|
|
47
|
+
paths: [ options.baseDir ],
|
|
48
|
+
});
|
|
44
49
|
debug('[app_worker:%s] new Application with options %j', process.pid, options);
|
|
45
50
|
let app: any;
|
|
46
51
|
try {
|
|
@@ -79,9 +84,11 @@ async function main() {
|
|
|
79
84
|
...clusterConfig.https,
|
|
80
85
|
...options.https,
|
|
81
86
|
};
|
|
82
|
-
const port = options.port = options.port
|
|
87
|
+
const port = app.options.port = options.port || listenConfig.port;
|
|
83
88
|
const debugPort = options.debugPort;
|
|
84
89
|
const protocol = (httpsOptions.key && httpsOptions.cert) ? 'https' : 'http';
|
|
90
|
+
debug('[app_worker:%s] listenConfig: %j, real port: %o, protocol: %o, debugPort: %o',
|
|
91
|
+
process.pid, listenConfig, port, protocol, debugPort);
|
|
85
92
|
|
|
86
93
|
AppWorker.send({
|
|
87
94
|
to: 'master',
|
|
@@ -122,6 +129,7 @@ async function main() {
|
|
|
122
129
|
app.emit('server', server);
|
|
123
130
|
|
|
124
131
|
if (options.sticky && options.stickyWorkerPort) {
|
|
132
|
+
// only allow connection from localhost
|
|
125
133
|
server.listen(options.stickyWorkerPort, '127.0.0.1');
|
|
126
134
|
// Listen to messages was sent from the master. Ignore everything else.
|
|
127
135
|
AppWorker.on('message', (message: string, connection: Socket) => {
|
|
@@ -157,7 +165,15 @@ async function main() {
|
|
|
157
165
|
}
|
|
158
166
|
|
|
159
167
|
server.once('listening', () => {
|
|
160
|
-
|
|
168
|
+
let address: any = server.address() || { port };
|
|
169
|
+
if (typeof address === 'string') {
|
|
170
|
+
// https://nodejs.org/api/cluster.html#cluster_event_listening_1
|
|
171
|
+
// Unix domain socket
|
|
172
|
+
address = {
|
|
173
|
+
address,
|
|
174
|
+
addressType: -1,
|
|
175
|
+
};
|
|
176
|
+
}
|
|
161
177
|
debug('[app_worker:%s] listening at %j', process.pid, address);
|
|
162
178
|
AppWorker.send({
|
|
163
179
|
to: 'master',
|
package/src/master.ts
CHANGED
|
@@ -4,6 +4,7 @@ import util from 'node:util';
|
|
|
4
4
|
import path from 'node:path';
|
|
5
5
|
import fs from 'node:fs';
|
|
6
6
|
import net from 'node:net';
|
|
7
|
+
import { debuglog } from 'node:util';
|
|
7
8
|
import { ReadyEventEmitter } from 'get-ready';
|
|
8
9
|
import { detectPort } from 'detect-port';
|
|
9
10
|
import { reload } from 'cluster-reload';
|
|
@@ -23,6 +24,8 @@ import {
|
|
|
23
24
|
import { AppThreadWorker, AppThreadUtils as WorkerThreadsAppWorker } from './utils/mode/impl/worker_threads/app.js';
|
|
24
25
|
import { ClusterWorkerExceptionError } from './error/ClusterWorkerExceptionError.js';
|
|
25
26
|
|
|
27
|
+
const debug = debuglog('@eggjs/cluster/master');
|
|
28
|
+
|
|
26
29
|
export interface MasterOptions extends ParsedClusterOptions {
|
|
27
30
|
clusterPort?: number;
|
|
28
31
|
stickyWorkerPort?: number;
|
|
@@ -455,7 +458,7 @@ export class Master extends ReadyEventEmitter {
|
|
|
455
458
|
address: ListeningAddress;
|
|
456
459
|
}) {
|
|
457
460
|
const worker = this.workerManager.getWorker(data.workerId)!;
|
|
458
|
-
|
|
461
|
+
debug('got app_worker#%s:%s app-start event, data: %j', worker.id, worker.workerId, data);
|
|
459
462
|
|
|
460
463
|
const address = data.address;
|
|
461
464
|
// worker should listen stickyWorkerPort when sticky mode
|
package/src/utils/options.ts
CHANGED
|
@@ -106,7 +106,9 @@ export async function parseOptions(options?: ClusterOptions) {
|
|
|
106
106
|
framework: options.framework ?? options.customEgg,
|
|
107
107
|
});
|
|
108
108
|
|
|
109
|
-
const egg = await importModule(options.framework
|
|
109
|
+
const egg = await importModule(options.framework, {
|
|
110
|
+
paths: [ options.baseDir! ],
|
|
111
|
+
});
|
|
110
112
|
assert(egg.Application, `should define Application in ${options.framework}`);
|
|
111
113
|
assert(egg.Agent, `should define Agent in ${options.framework}`);
|
|
112
114
|
|