@eggjs/cluster 4.0.0-beta.19 → 4.0.0-beta.21
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/agent_worker.d.ts +1 -1
- package/dist/agent_worker.js +63 -50
- package/dist/app_worker.d.ts +1 -1
- package/dist/app_worker.js +165 -127
- package/dist/dirname.d.ts +1 -0
- package/dist/dirname.js +10 -10
- package/dist/error/ClusterAgentWorkerError.d.ts +9 -12
- package/dist/error/ClusterAgentWorkerError.js +19 -22
- package/dist/error/ClusterWorkerExceptionError.d.ts +6 -9
- package/dist/error/ClusterWorkerExceptionError.js +14 -17
- package/dist/error/index.d.ts +2 -0
- package/dist/error/index.js +3 -0
- package/dist/index.d.ts +5 -10
- package/dist/index.js +16 -20
- package/dist/master.d.ts +86 -92
- package/dist/master.js +543 -416
- package/dist/utils/messenger.d.ts +44 -48
- package/dist/utils/messenger.js +178 -143
- package/dist/utils/mode/base/agent.d.ts +35 -42
- package/dist/utils/mode/base/agent.js +64 -62
- package/dist/utils/mode/base/app.d.ts +45 -53
- package/dist/utils/mode/base/app.js +79 -76
- package/dist/utils/mode/impl/process/agent.d.ts +16 -20
- package/dist/utils/mode/impl/process/agent.js +101 -91
- package/dist/utils/mode/impl/process/app.d.ts +20 -11
- package/dist/utils/mode/impl/process/app.js +118 -116
- package/dist/utils/mode/impl/worker_threads/agent.d.ts +16 -20
- package/dist/utils/mode/impl/worker_threads/agent.js +82 -77
- package/dist/utils/mode/impl/worker_threads/app.d.ts +25 -12
- package/dist/utils/mode/impl/worker_threads/app.js +137 -128
- package/dist/utils/options.d.ts +76 -79
- package/dist/utils/options.js +80 -55
- package/dist/utils/terminate.d.ts +6 -0
- package/dist/utils/terminate.js +70 -51
- package/dist/utils/worker_manager.d.ts +24 -31
- package/dist/utils/worker_manager.js +74 -68
- package/package.json +6 -6
|
@@ -1,128 +1,137 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { Worker
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
};
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
};
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
1
|
+
import { setTimeout as sleep } from 'node:timers/promises';
|
|
2
|
+
import { Worker as ThreadWorker, threadId, parentPort } from 'node:worker_threads';
|
|
3
|
+
import { BaseAppWorker, BaseAppUtils } from "../../base/app.js";
|
|
4
|
+
export class AppThreadWorker extends BaseAppWorker {
|
|
5
|
+
#state = 'none';
|
|
6
|
+
#id;
|
|
7
|
+
constructor(instance, id) {
|
|
8
|
+
super(instance);
|
|
9
|
+
this.#id = id;
|
|
10
|
+
}
|
|
11
|
+
get id() {
|
|
12
|
+
return this.#id;
|
|
13
|
+
}
|
|
14
|
+
get workerId() {
|
|
15
|
+
return this.instance.threadId;
|
|
16
|
+
}
|
|
17
|
+
get state() {
|
|
18
|
+
return this.#state;
|
|
19
|
+
}
|
|
20
|
+
set state(val) {
|
|
21
|
+
this.#state = val;
|
|
22
|
+
}
|
|
23
|
+
get exitedAfterDisconnect() {
|
|
24
|
+
return true;
|
|
25
|
+
}
|
|
26
|
+
get exitCode() {
|
|
27
|
+
return 0;
|
|
28
|
+
// return this.instance.exitCode;
|
|
29
|
+
}
|
|
30
|
+
send(message) {
|
|
31
|
+
this.instance.postMessage(message);
|
|
32
|
+
}
|
|
33
|
+
clean() {
|
|
34
|
+
this.instance.removeAllListeners();
|
|
35
|
+
}
|
|
36
|
+
// static methods use on src/app_worker.ts
|
|
37
|
+
static get workerId() {
|
|
38
|
+
return threadId;
|
|
39
|
+
}
|
|
40
|
+
static on(event, listener) {
|
|
41
|
+
parentPort.on(event, listener);
|
|
42
|
+
}
|
|
43
|
+
static send(message) {
|
|
44
|
+
message.senderWorkerId = String(threadId);
|
|
45
|
+
parentPort.postMessage(message);
|
|
46
|
+
}
|
|
47
|
+
static kill() {
|
|
48
|
+
process.exit(1);
|
|
49
|
+
}
|
|
50
|
+
static gracefulExit(options) {
|
|
51
|
+
process.on('exit', async (code) => {
|
|
52
|
+
if (typeof options.beforeExit === 'function') {
|
|
53
|
+
await options.beforeExit();
|
|
54
|
+
}
|
|
55
|
+
process.exit(code);
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
export class AppThreadUtils extends BaseAppUtils {
|
|
60
|
+
#workers = [];
|
|
61
|
+
#forkSingle(appPath, options, id) {
|
|
62
|
+
// start app worker
|
|
63
|
+
const worker = new ThreadWorker(appPath, options);
|
|
64
|
+
this.#workers.push(worker);
|
|
65
|
+
// wrap app worker
|
|
66
|
+
const appWorker = new AppThreadWorker(worker, id);
|
|
67
|
+
this.emit('worker_forked', appWorker);
|
|
68
|
+
appWorker.disableRefork = true;
|
|
69
|
+
worker.on('message', (msg) => {
|
|
70
|
+
if (typeof msg === 'string') {
|
|
71
|
+
msg = {
|
|
72
|
+
action: msg,
|
|
73
|
+
data: msg,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
msg.from = 'app';
|
|
77
|
+
this.messenger.send(msg);
|
|
78
|
+
});
|
|
79
|
+
this.log('[master] app_worker#%s (tid:%s) start', appWorker.id, appWorker.workerId);
|
|
80
|
+
// send debug message, due to `brk` scene, send here instead of app_worker.js
|
|
81
|
+
let debugPort = process.debugPort;
|
|
82
|
+
if (this.options.isDebug) {
|
|
83
|
+
debugPort++;
|
|
84
|
+
this.messenger.send({
|
|
85
|
+
to: 'parent',
|
|
86
|
+
from: 'app',
|
|
87
|
+
action: 'debug',
|
|
88
|
+
data: {
|
|
89
|
+
debugPort,
|
|
90
|
+
pid: appWorker.workerId,
|
|
91
|
+
workerId: appWorker.workerId,
|
|
92
|
+
},
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
// handle worker exit
|
|
96
|
+
worker.on('exit', async (code) => {
|
|
97
|
+
appWorker.state = 'dead';
|
|
98
|
+
this.messenger.send({
|
|
99
|
+
action: 'app-exit',
|
|
100
|
+
data: {
|
|
101
|
+
workerId: appWorker.workerId,
|
|
102
|
+
code,
|
|
103
|
+
},
|
|
104
|
+
to: 'master',
|
|
105
|
+
from: 'app',
|
|
106
|
+
});
|
|
107
|
+
// refork app worker
|
|
108
|
+
await sleep(1000);
|
|
109
|
+
this.#forkSingle(appPath, options, id);
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
fork() {
|
|
113
|
+
this.startTime = Date.now();
|
|
114
|
+
this.startSuccessCount = 0;
|
|
115
|
+
const ports = this.options.ports ?? [];
|
|
116
|
+
if (!ports.length) {
|
|
117
|
+
ports.push(this.options.port);
|
|
118
|
+
}
|
|
119
|
+
this.options.workers = ports.length;
|
|
120
|
+
let i = 0;
|
|
121
|
+
do {
|
|
122
|
+
const options = Object.assign({}, this.options, { port: ports[i] });
|
|
123
|
+
const argv = [JSON.stringify(options)];
|
|
124
|
+
this.#forkSingle(this.getAppWorkerFile(), { argv }, ++i);
|
|
125
|
+
} while (i < ports.length);
|
|
126
|
+
return this;
|
|
127
|
+
}
|
|
128
|
+
async kill() {
|
|
129
|
+
for (const worker of this.#workers) {
|
|
130
|
+
const id = Reflect.get(worker, 'id');
|
|
131
|
+
this.log(`[master] kill app worker#${id} (worker_threads) by worker.terminate()`);
|
|
132
|
+
worker.removeAllListeners();
|
|
133
|
+
worker.terminate();
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL3V0aWxzL21vZGUvaW1wbC93b3JrZXJfdGhyZWFkcy9hcHAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsSUFBSSxLQUFLLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUMzRCxPQUFPLEVBQUUsTUFBTSxJQUFJLFlBQVksRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFzQixNQUFNLHFCQUFxQixDQUFDO0FBSXZHLE9BQU8sRUFBRSxhQUFhLEVBQUUsWUFBWSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFHaEUsTUFBTSxPQUFPLGVBQWdCLFNBQVEsYUFBMkI7SUFDOUQsTUFBTSxHQUFHLE1BQU0sQ0FBQztJQUNoQixHQUFHLENBQVM7SUFFWixZQUFZLFFBQXNCLEVBQUUsRUFBVTtRQUM1QyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDaEIsSUFBSSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUM7SUFDaEIsQ0FBQztJQUVELElBQUksRUFBRTtRQUNKLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQztJQUNsQixDQUFDO0lBRUQsSUFBSSxRQUFRO1FBQ1YsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQztJQUNoQyxDQUFDO0lBRUQsSUFBSSxLQUFLO1FBQ1AsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3JCLENBQUM7SUFFRCxJQUFJLEtBQUssQ0FBQyxHQUFHO1FBQ1gsSUFBSSxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUM7SUFDcEIsQ0FBQztJQUVELElBQUkscUJBQXFCO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELElBQUksUUFBUTtRQUNWLE9BQU8sQ0FBQyxDQUFDO1FBQ1QsaUNBQWlDO0lBQ25DLENBQUM7SUFFRCxJQUFJLENBQUMsT0FBb0I7UUFDdkIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxX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
|
package/dist/utils/options.d.ts
CHANGED
|
@@ -1,83 +1,80 @@
|
|
|
1
|
-
import { SecureContextOptions } from
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
ca?: SecureContextOptions['ca'];
|
|
8
|
-
passphrase?: SecureContextOptions['passphrase'];
|
|
1
|
+
import { type SecureContextOptions } from 'node:tls';
|
|
2
|
+
export interface ClusterHTTPSSecureOptions {
|
|
3
|
+
key: SecureContextOptions['key'];
|
|
4
|
+
cert: SecureContextOptions['cert'];
|
|
5
|
+
ca?: SecureContextOptions['ca'];
|
|
6
|
+
passphrase?: SecureContextOptions['passphrase'];
|
|
9
7
|
}
|
|
10
|
-
type ClusterStartMode = 'process' | 'worker_threads';
|
|
8
|
+
export type ClusterStartMode = 'process' | 'worker_threads';
|
|
11
9
|
/** Cluster start options */
|
|
12
|
-
interface ClusterOptions {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
10
|
+
export interface ClusterOptions {
|
|
11
|
+
/**
|
|
12
|
+
* specify framework that can be absolute path or npm package
|
|
13
|
+
*/
|
|
14
|
+
framework?: string;
|
|
15
|
+
/**
|
|
16
|
+
* @deprecated please use framework instead
|
|
17
|
+
*/
|
|
18
|
+
customEgg?: string;
|
|
19
|
+
/** directory of application, default to `process.cwd()` */
|
|
20
|
+
baseDir?: string;
|
|
21
|
+
/**
|
|
22
|
+
* numbers of app workers, default to `os.cpus().length`
|
|
23
|
+
*/
|
|
24
|
+
workers?: number | string;
|
|
25
|
+
/**
|
|
26
|
+
* listening port, default to `7001`(http) or `8443`(https)
|
|
27
|
+
*/
|
|
28
|
+
port?: number | string | null;
|
|
29
|
+
/**
|
|
30
|
+
* listening a debug port on http protocol
|
|
31
|
+
*/
|
|
32
|
+
debugPort?: number;
|
|
33
|
+
/**
|
|
34
|
+
* https options, { key, cert, ca }, full path
|
|
35
|
+
*/
|
|
36
|
+
https?: ClusterHTTPSSecureOptions | boolean;
|
|
37
|
+
/**
|
|
38
|
+
* @deprecated please use `options.https.key` instead
|
|
39
|
+
*/
|
|
40
|
+
key?: ClusterHTTPSSecureOptions['key'];
|
|
41
|
+
/**
|
|
42
|
+
* @deprecated please use `options.https.cert` instead
|
|
43
|
+
*/
|
|
44
|
+
cert?: ClusterHTTPSSecureOptions['cert'];
|
|
45
|
+
/**
|
|
46
|
+
* will inject into worker/agent process
|
|
47
|
+
*/
|
|
48
|
+
require?: string | string[];
|
|
49
|
+
/**
|
|
50
|
+
* will save master pid to this file
|
|
51
|
+
*/
|
|
52
|
+
pidFile?: string;
|
|
53
|
+
/**
|
|
54
|
+
* custom env, default is `process.env.EGG_SERVER_ENV`
|
|
55
|
+
*/
|
|
56
|
+
env?: string;
|
|
57
|
+
/**
|
|
58
|
+
* default is `'process'`, use `'worker_threads'` to start the app & agent worker by worker_threads
|
|
59
|
+
*/
|
|
60
|
+
startMode?: ClusterStartMode;
|
|
61
|
+
/**
|
|
62
|
+
* startup port of each app worker, such as: `[7001, 7002, 7003]`, only effects when the startMode is `'worker_threads'`
|
|
63
|
+
*/
|
|
64
|
+
ports?: number[];
|
|
65
|
+
/**
|
|
66
|
+
* sticky mode server
|
|
67
|
+
*/
|
|
68
|
+
sticky?: boolean;
|
|
69
|
+
/** customized plugins, for unittest */
|
|
70
|
+
plugins?: object;
|
|
71
|
+
isDebug?: boolean;
|
|
74
72
|
}
|
|
75
|
-
interface ParsedClusterOptions extends ClusterOptions {
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
73
|
+
export interface ParsedClusterOptions extends ClusterOptions {
|
|
74
|
+
port?: number;
|
|
75
|
+
baseDir: string;
|
|
76
|
+
workers: number;
|
|
77
|
+
framework: string;
|
|
78
|
+
startMode: ClusterStartMode;
|
|
81
79
|
}
|
|
82
|
-
|
|
83
|
-
export { ClusterHTTPSSecureOptions, ClusterOptions, ClusterStartMode, ParsedClusterOptions };
|
|
80
|
+
export declare function parseOptions(options?: ClusterOptions): Promise<ParsedClusterOptions>;
|
package/dist/utils/options.js
CHANGED
|
@@ -1,56 +1,81 @@
|
|
|
1
|
-
import os from
|
|
2
|
-
import
|
|
3
|
-
import path from
|
|
4
|
-
import
|
|
5
|
-
import
|
|
6
|
-
import {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
1
|
+
import os from 'node:os';
|
|
2
|
+
import fs from 'node:fs';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import assert from 'node:assert';
|
|
5
|
+
import { debuglog } from 'node:util';
|
|
6
|
+
import {} from 'node:tls';
|
|
7
|
+
import { getFrameworkPath, importModule } from '@eggjs/utils';
|
|
8
|
+
const debug = debuglog('egg/cluster/utils/options');
|
|
9
|
+
export async function parseOptions(options) {
|
|
10
|
+
options = {
|
|
11
|
+
baseDir: process.cwd(),
|
|
12
|
+
port: options?.https ? 8443 : undefined,
|
|
13
|
+
startMode: 'process',
|
|
14
|
+
// ports: [],
|
|
15
|
+
env: process.env.EGG_SERVER_ENV,
|
|
16
|
+
...options,
|
|
17
|
+
};
|
|
18
|
+
const pkgPath = path.join(options.baseDir, 'package.json');
|
|
19
|
+
assert(fs.existsSync(pkgPath), `${pkgPath} should exist`);
|
|
20
|
+
options.framework = getFrameworkPath({
|
|
21
|
+
baseDir: options.baseDir,
|
|
22
|
+
// compatible customEgg only when call startCluster directly without framework
|
|
23
|
+
framework: options.framework ?? options.customEgg,
|
|
24
|
+
});
|
|
25
|
+
debug('[parseOptions] %o', options);
|
|
26
|
+
const egg = await importModule(options.framework, {
|
|
27
|
+
paths: [options.baseDir],
|
|
28
|
+
});
|
|
29
|
+
assert(egg.Application, `should define Application in ${options.framework}`);
|
|
30
|
+
assert(egg.Agent, `should define Agent in ${options.framework}`);
|
|
31
|
+
if (options.https === true) {
|
|
32
|
+
// Keep compatible options.key, options.cert
|
|
33
|
+
console.warn('[@eggjs/cluster:deprecated] [master] Please use `https: { key, cert, ca }` instead of `https: true`');
|
|
34
|
+
options.https = {
|
|
35
|
+
key: options.key,
|
|
36
|
+
cert: options.cert,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
// https
|
|
40
|
+
if (options.https) {
|
|
41
|
+
assert(options.https.key, 'options.https.key should exists');
|
|
42
|
+
if (typeof options.https.key === 'string') {
|
|
43
|
+
assert(fs.existsSync(options.https.key), 'options.https.key file should exists');
|
|
44
|
+
}
|
|
45
|
+
assert(options.https.cert, 'options.https.cert should exists');
|
|
46
|
+
if (typeof options.https.cert === 'string') {
|
|
47
|
+
assert(fs.existsSync(options.https.cert), 'options.https.cert file should exists');
|
|
48
|
+
}
|
|
49
|
+
if (typeof options.https.ca === 'string') {
|
|
50
|
+
assert(fs.existsSync(options.https.ca), 'options.https.ca file should exists');
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
if (options.port && typeof options.port === 'string') {
|
|
54
|
+
options.port = parseInt(options.port);
|
|
55
|
+
}
|
|
56
|
+
if (options.port === null) {
|
|
57
|
+
options.port = undefined;
|
|
58
|
+
}
|
|
59
|
+
if (options.workers && typeof options.workers === 'string') {
|
|
60
|
+
options.workers = parseInt(options.workers);
|
|
61
|
+
}
|
|
62
|
+
if (!options.workers) {
|
|
63
|
+
options.workers = os.cpus().length;
|
|
64
|
+
}
|
|
65
|
+
if (options.require) {
|
|
66
|
+
if (typeof options.require === 'string') {
|
|
67
|
+
options.require = [options.require];
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
// don't print deprecated message in production env.
|
|
71
|
+
// it will print to stderr.
|
|
72
|
+
if (process.env.NODE_ENV === 'production') {
|
|
73
|
+
process.env.NO_DEPRECATION = '*';
|
|
74
|
+
}
|
|
75
|
+
const isDebug = process.execArgv.some(argv => argv.includes('--debug') || argv.includes('--inspect'));
|
|
76
|
+
if (isDebug) {
|
|
77
|
+
options.isDebug = isDebug;
|
|
78
|
+
}
|
|
79
|
+
return options;
|
|
53
80
|
}
|
|
54
|
-
|
|
55
|
-
//#endregion
|
|
56
|
-
export { parseOptions };
|
|
81
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3B0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9vcHRpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUN6QixPQUFPLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDekIsT0FBTyxJQUFJLE1BQU0sV0FBVyxDQUFDO0FBQzdCLE9BQU8sTUFBTSxNQUFNLGFBQWEsQ0FBQztBQUNqQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3JDLE9BQU8sRUFBNkIsTUFBTSxVQUFVLENBQUM7QUFFckQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLFlBQVksRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUU5RCxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsMkJBQTJCLENBQUMsQ0FBQztBQW9GcEQsTUFBTSxDQUFDLEtBQUssVUFBVSxZQUFZLENBQUMsT0FBd0I7SUFDekQsT0FBTyxHQUFHO1FBQ1IsT0FBTyxFQUFFLE9BQU8sQ0FBQyxHQUFHLEVBQUU7UUFDdEIsSUFBSSxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUztRQUN2QyxTQUFTLEVBQUUsU0FBUztRQUNwQixhQUFhO1FBQ2IsR0FBRyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYztRQUMvQixHQUFHLE9BQU87S0FDWCxDQUFDO0lBRUYsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBUSxFQUFFLGNBQWMsQ0FBQyxDQUFDO0lBQzVELE1BQU0sQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEdBQUcsT0FBTyxlQUFlLENBQUMsQ0FBQztJQUUxRCxPQUFPLENBQUMsU0FBUyxHQUFHLGdCQUFnQixDQUFDO1FBQ25DLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBUTtRQUN6Qiw4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
|