egg 3.26.0 → 4.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/README.md +1 -1
- package/README.zh-CN.md +6 -5
- package/dist/commonjs/agent.d.ts +4 -0
- package/dist/commonjs/agent.js +10 -0
- package/dist/commonjs/app/middleware/body_parser.d.ts +2 -0
- package/dist/commonjs/app/middleware/body_parser.js +8 -0
- package/dist/commonjs/app/middleware/meta.d.ts +11 -0
- package/dist/commonjs/app/middleware/meta.js +22 -0
- package/dist/commonjs/app/middleware/notfound.d.ts +8 -0
- package/dist/commonjs/app/middleware/notfound.js +31 -0
- package/dist/commonjs/app/middleware/override_method.d.ts +2 -0
- package/dist/commonjs/app/middleware/override_method.js +8 -0
- package/dist/commonjs/app/middleware/site_file.d.ts +7 -0
- package/dist/commonjs/app/middleware/site_file.js +40 -0
- package/dist/commonjs/config/config.default.d.ts +9 -0
- package/dist/commonjs/config/config.default.js +378 -0
- package/dist/commonjs/config/config.local.d.ts +8 -0
- package/dist/commonjs/config/config.local.js +12 -0
- package/dist/commonjs/config/config.unittest.d.ts +7 -0
- package/dist/commonjs/config/config.unittest.js +11 -0
- package/dist/commonjs/config/plugin.d.ts +122 -0
- package/dist/commonjs/config/plugin.js +125 -0
- package/dist/commonjs/index.d.ts +61 -0
- package/dist/commonjs/index.js +89 -0
- package/dist/commonjs/lib/agent.d.ts +19 -0
- package/dist/commonjs/lib/agent.js +58 -0
- package/dist/commonjs/lib/application.d.ts +66 -0
- package/dist/commonjs/lib/application.js +281 -0
- package/dist/commonjs/lib/core/base_context_class.d.ts +14 -0
- package/dist/commonjs/lib/core/base_context_class.js +22 -0
- package/dist/commonjs/lib/core/base_context_logger.d.ts +36 -0
- package/dist/commonjs/lib/core/base_context_logger.js +64 -0
- package/dist/commonjs/lib/core/base_hook_class.d.ts +11 -0
- package/dist/commonjs/lib/core/base_hook_class.js +30 -0
- package/dist/commonjs/lib/core/context_httpclient.d.ts +16 -0
- package/dist/commonjs/lib/core/context_httpclient.js +30 -0
- package/dist/commonjs/lib/core/httpclient.d.ts +14 -0
- package/dist/commonjs/lib/core/httpclient.js +40 -0
- package/dist/commonjs/lib/core/logger.d.ts +3 -0
- package/dist/commonjs/lib/core/logger.js +40 -0
- package/dist/commonjs/lib/core/messenger/IMessenger.d.ts +50 -0
- package/dist/commonjs/lib/core/messenger/IMessenger.js +3 -0
- package/dist/commonjs/lib/core/messenger/index.d.ts +7 -0
- package/dist/commonjs/lib/core/messenger/index.js +14 -0
- package/dist/commonjs/lib/core/messenger/ipc.d.ts +57 -0
- package/dist/commonjs/lib/core/messenger/ipc.js +126 -0
- package/dist/commonjs/lib/core/messenger/local.d.ts +61 -0
- package/dist/commonjs/lib/core/messenger/local.js +134 -0
- package/dist/commonjs/lib/core/singleton.d.ts +23 -0
- package/dist/commonjs/lib/core/singleton.js +120 -0
- package/dist/commonjs/lib/core/utils.d.ts +2 -0
- package/dist/commonjs/lib/core/utils.js +77 -0
- package/dist/commonjs/lib/egg.d.ts +267 -0
- package/dist/commonjs/lib/egg.js +595 -0
- package/dist/commonjs/lib/loader/AgentWorkerLoader.d.ts +12 -0
- package/dist/commonjs/lib/loader/AgentWorkerLoader.js +24 -0
- package/dist/commonjs/lib/loader/AppWorkerLoader.d.ts +17 -0
- package/dist/commonjs/lib/loader/AppWorkerLoader.js +43 -0
- package/dist/commonjs/lib/loader/EggApplicationLoader.d.ts +4 -0
- package/dist/commonjs/lib/loader/EggApplicationLoader.js +8 -0
- package/dist/commonjs/lib/loader/index.d.ts +3 -0
- package/dist/commonjs/lib/loader/index.js +22 -0
- package/dist/commonjs/lib/start.d.ts +15 -0
- package/dist/commonjs/lib/start.js +49 -0
- package/dist/commonjs/lib/type.d.ts +295 -0
- package/dist/commonjs/lib/type.js +3 -0
- package/dist/commonjs/package.json +3 -0
- package/dist/esm/agent.d.ts +4 -0
- package/dist/esm/agent.js +7 -0
- package/dist/esm/app/middleware/body_parser.d.ts +2 -0
- package/dist/esm/app/middleware/body_parser.js +3 -0
- package/dist/esm/app/middleware/meta.d.ts +11 -0
- package/dist/esm/app/middleware/meta.js +20 -0
- package/dist/esm/app/middleware/notfound.d.ts +8 -0
- package/dist/esm/app/middleware/notfound.js +29 -0
- package/dist/esm/app/middleware/override_method.d.ts +2 -0
- package/dist/esm/app/middleware/override_method.js +3 -0
- package/dist/esm/app/middleware/site_file.d.ts +7 -0
- package/dist/esm/app/middleware/site_file.js +35 -0
- package/dist/esm/config/config.default.d.ts +9 -0
- package/dist/esm/config/config.default.js +373 -0
- package/dist/esm/config/config.local.d.ts +8 -0
- package/dist/esm/config/config.local.js +10 -0
- package/dist/esm/config/config.unittest.d.ts +7 -0
- package/dist/esm/config/config.unittest.js +9 -0
- package/dist/esm/config/favicon.png +0 -0
- package/dist/esm/config/plugin.d.ts +122 -0
- package/dist/esm/config/plugin.js +123 -0
- package/dist/esm/index.d.ts +61 -0
- package/dist/esm/index.js +65 -0
- package/dist/esm/lib/agent.d.ts +19 -0
- package/dist/esm/lib/agent.js +54 -0
- package/dist/esm/lib/application.d.ts +66 -0
- package/dist/esm/lib/application.js +274 -0
- package/dist/esm/lib/core/base_context_class.d.ts +14 -0
- package/dist/esm/lib/core/base_context_class.js +18 -0
- package/dist/esm/lib/core/base_context_logger.d.ts +36 -0
- package/dist/esm/lib/core/base_context_logger.js +60 -0
- package/dist/esm/lib/core/base_hook_class.d.ts +11 -0
- package/dist/esm/lib/core/base_hook_class.js +23 -0
- package/dist/esm/lib/core/context_httpclient.d.ts +16 -0
- package/dist/esm/lib/core/context_httpclient.js +26 -0
- package/dist/esm/lib/core/httpclient.d.ts +14 -0
- package/dist/esm/lib/core/httpclient.js +33 -0
- package/dist/esm/lib/core/logger.d.ts +3 -0
- package/dist/esm/lib/core/logger.js +37 -0
- package/dist/esm/lib/core/messenger/IMessenger.d.ts +50 -0
- package/dist/esm/lib/core/messenger/IMessenger.js +2 -0
- package/dist/esm/lib/core/messenger/index.d.ts +7 -0
- package/dist/esm/lib/core/messenger/index.js +11 -0
- package/dist/esm/lib/core/messenger/ipc.d.ts +57 -0
- package/dist/esm/lib/core/messenger/ipc.js +119 -0
- package/dist/esm/lib/core/messenger/local.d.ts +61 -0
- package/dist/esm/lib/core/messenger/local.js +127 -0
- package/dist/esm/lib/core/singleton.d.ts +23 -0
- package/dist/esm/lib/core/singleton.js +113 -0
- package/dist/esm/lib/core/utils.d.ts +2 -0
- package/dist/esm/lib/core/utils.js +70 -0
- package/dist/esm/lib/egg.d.ts +267 -0
- package/dist/esm/lib/egg.js +565 -0
- package/dist/esm/lib/loader/AgentWorkerLoader.d.ts +12 -0
- package/dist/esm/lib/loader/AgentWorkerLoader.js +20 -0
- package/dist/esm/lib/loader/AppWorkerLoader.d.ts +17 -0
- package/dist/esm/lib/loader/AppWorkerLoader.js +39 -0
- package/dist/esm/lib/loader/EggApplicationLoader.d.ts +4 -0
- package/dist/esm/lib/loader/EggApplicationLoader.js +4 -0
- package/dist/esm/lib/loader/index.d.ts +3 -0
- package/dist/esm/lib/loader/index.js +4 -0
- package/dist/esm/lib/start.d.ts +15 -0
- package/dist/esm/lib/start.js +43 -0
- package/dist/esm/lib/type.d.ts +295 -0
- package/dist/esm/lib/type.js +2 -0
- package/dist/esm/package.json +3 -0
- package/dist/package.json +4 -0
- package/package.json +83 -70
- package/src/agent.ts +7 -0
- package/src/app/middleware/body_parser.ts +3 -0
- package/{app/middleware/meta.js → src/app/middleware/meta.ts} +12 -4
- package/{app/middleware/notfound.js → src/app/middleware/notfound.ts} +9 -3
- package/src/app/middleware/override_method.ts +3 -0
- package/src/app/middleware/site_file.ts +49 -0
- package/{config/config.default.js → src/config/config.default.ts} +21 -42
- package/src/config/config.local.ts +11 -0
- package/src/config/config.unittest.ts +10 -0
- package/src/config/favicon.png +0 -0
- package/{config/plugin.js → src/config/plugin.ts} +1 -3
- package/src/index.ts +78 -0
- package/src/lib/agent.ts +66 -0
- package/{lib/application.js → src/lib/application.ts} +79 -120
- package/src/lib/core/base_context_class.ts +21 -0
- package/src/lib/core/base_context_logger.ts +67 -0
- package/src/lib/core/base_hook_class.ts +30 -0
- package/src/lib/core/context_httpclient.ts +33 -0
- package/src/lib/core/httpclient.ts +52 -0
- package/src/lib/core/logger.ts +42 -0
- package/src/lib/core/messenger/IMessenger.ts +58 -0
- package/src/lib/core/messenger/index.ts +15 -0
- package/{lib/core/messenger/ipc.js → src/lib/core/messenger/ipc.ts} +25 -29
- package/{lib/core/messenger/local.js → src/lib/core/messenger/local.ts} +27 -21
- package/{lib/core/singleton.js → src/lib/core/singleton.ts} +56 -33
- package/src/lib/core/utils.ts +77 -0
- package/{lib/egg.js → src/lib/egg.ts} +252 -218
- package/src/lib/loader/AgentWorkerLoader.ts +21 -0
- package/src/lib/loader/AppWorkerLoader.ts +42 -0
- package/src/lib/loader/EggApplicationLoader.ts +5 -0
- package/src/lib/loader/index.ts +3 -0
- package/src/lib/start.ts +56 -0
- package/src/lib/type.ts +329 -0
- package/agent.js +0 -11
- package/app/middleware/body_parser.js +0 -3
- package/app/middleware/override_method.js +0 -3
- package/app/middleware/site_file.js +0 -31
- package/config/config.local.js +0 -7
- package/config/config.unittest.js +0 -8
- package/index.d.ts +0 -1285
- package/index.js +0 -68
- package/lib/agent.js +0 -95
- package/lib/core/base_context_class.js +0 -20
- package/lib/core/base_context_logger.js +0 -64
- package/lib/core/base_hook_class.js +0 -31
- package/lib/core/context_httpclient.js +0 -26
- package/lib/core/dnscache_httpclient.js +0 -93
- package/lib/core/httpclient.js +0 -108
- package/lib/core/httpclient_next.js +0 -45
- package/lib/core/logger.js +0 -35
- package/lib/core/messenger/index.js +0 -14
- package/lib/core/utils.js +0 -73
- package/lib/loader/agent_worker_loader.js +0 -27
- package/lib/loader/app_worker_loader.js +0 -48
- package/lib/loader/index.js +0 -5
- package/lib/start.js +0 -39
- /package/{config → dist/commonjs/config}/favicon.png +0 -0
- /package/{app → src/app}/extend/context.js +0 -0
- /package/{app → src/app}/extend/helper.js +0 -0
- /package/{app → src/app}/extend/request.js +0 -0
- /package/{app → src/app}/extend/response.js +0 -0
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { EventEmitter } from 'node:events';
|
|
2
|
+
export interface IMessenger extends EventEmitter {
|
|
3
|
+
/**
|
|
4
|
+
* Send message to all agent and app
|
|
5
|
+
* @param {String} action - message key
|
|
6
|
+
* @param {Object} data - message value
|
|
7
|
+
* @return {Messenger} this
|
|
8
|
+
*/
|
|
9
|
+
broadcast(action: string, data?: unknown): IMessenger;
|
|
10
|
+
/**
|
|
11
|
+
* send message to the specified process
|
|
12
|
+
* @param {String} pid - the process id of the receiver
|
|
13
|
+
* @param {String} action - message key
|
|
14
|
+
* @param {Object} data - message value
|
|
15
|
+
* @return {Messenger} this
|
|
16
|
+
*/
|
|
17
|
+
sendTo(pid: string, action: string, data?: unknown): IMessenger;
|
|
18
|
+
/**
|
|
19
|
+
* send message to one app worker by random
|
|
20
|
+
* - if it's running in agent, it will send to one of app workers
|
|
21
|
+
* - if it's running in app, it will send to agent
|
|
22
|
+
* @param {String} action - message key
|
|
23
|
+
* @param {Object} data - message value
|
|
24
|
+
* @return {Messenger} this
|
|
25
|
+
*/
|
|
26
|
+
sendRandom(action: string, data?: unknown): IMessenger;
|
|
27
|
+
/**
|
|
28
|
+
* send message to app
|
|
29
|
+
* @param {String} action - message key
|
|
30
|
+
* @param {Object} data - message value
|
|
31
|
+
* @return {Messenger} this
|
|
32
|
+
*/
|
|
33
|
+
sendToApp(action: string, data?: unknown): IMessenger;
|
|
34
|
+
/**
|
|
35
|
+
* send message to agent
|
|
36
|
+
* @param {String} action - message key
|
|
37
|
+
* @param {Object} data - message value
|
|
38
|
+
* @return {Messenger} this
|
|
39
|
+
*/
|
|
40
|
+
sendToAgent(action: string, data?: unknown): IMessenger;
|
|
41
|
+
/**
|
|
42
|
+
* @param {String} action - message key
|
|
43
|
+
* @param {Object} data - message value
|
|
44
|
+
* @param {String} to - let master know how to send message
|
|
45
|
+
* @return {Messenger} this
|
|
46
|
+
*/
|
|
47
|
+
send(action: string, data: unknown | undefined, to: string): IMessenger;
|
|
48
|
+
close(): void;
|
|
49
|
+
onMessage(message: any): void;
|
|
50
|
+
}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSU1lc3Nlbmdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29yZS9tZXNzZW5nZXIvSU1lc3Nlbmdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIn0=
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.create = create;
|
|
4
|
+
const local_js_1 = require("./local.js");
|
|
5
|
+
const ipc_js_1 = require("./ipc.js");
|
|
6
|
+
/**
|
|
7
|
+
* @class Messenger
|
|
8
|
+
*/
|
|
9
|
+
function create(egg) {
|
|
10
|
+
return egg.options.mode === 'single'
|
|
11
|
+
? new local_js_1.Messenger(egg)
|
|
12
|
+
: new ipc_js_1.Messenger();
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvcmUvbWVzc2VuZ2VyL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBVUEsd0JBSUM7QUFkRCx5Q0FBeUQ7QUFDekQscUNBQXFEO0FBTXJEOztHQUVHO0FBQ0gsU0FBZ0IsTUFBTSxDQUFDLEdBQXVCO0lBQzVDLE9BQU8sR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEtBQUssUUFBUTtRQUNsQyxDQUFDLENBQUMsSUFBSSxvQkFBYyxDQUFDLEdBQUcsQ0FBQztRQUN6QixDQUFDLENBQUMsSUFBSSxrQkFBWSxFQUFFLENBQUM7QUFDekIsQ0FBQyJ9
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { EventEmitter } from 'node:events';
|
|
2
|
+
import type { IMessenger } from './IMessenger.js';
|
|
3
|
+
/**
|
|
4
|
+
* Communication between app worker and agent worker by IPC channel
|
|
5
|
+
*/
|
|
6
|
+
export declare class Messenger extends EventEmitter implements IMessenger {
|
|
7
|
+
readonly pid: string;
|
|
8
|
+
opids: string[];
|
|
9
|
+
constructor();
|
|
10
|
+
/**
|
|
11
|
+
* Send message to all agent and app
|
|
12
|
+
* @param {String} action - message key
|
|
13
|
+
* @param {Object} data - message value
|
|
14
|
+
* @return {Messenger} this
|
|
15
|
+
*/
|
|
16
|
+
broadcast(action: string, data?: unknown): Messenger;
|
|
17
|
+
/**
|
|
18
|
+
* send message to the specified process
|
|
19
|
+
* @param {String} pid - the process id of the receiver
|
|
20
|
+
* @param {String} action - message key
|
|
21
|
+
* @param {Object} data - message value
|
|
22
|
+
* @return {Messenger} this
|
|
23
|
+
*/
|
|
24
|
+
sendTo(pid: string, action: string, data?: unknown): Messenger;
|
|
25
|
+
/**
|
|
26
|
+
* send message to one app worker by random
|
|
27
|
+
* - if it's running in agent, it will send to one of app workers
|
|
28
|
+
* - if it's running in app, it will send to agent
|
|
29
|
+
* @param {String} action - message key
|
|
30
|
+
* @param {Object} data - message value
|
|
31
|
+
* @return {Messenger} this
|
|
32
|
+
*/
|
|
33
|
+
sendRandom(action: string, data?: unknown): Messenger;
|
|
34
|
+
/**
|
|
35
|
+
* send message to app
|
|
36
|
+
* @param {String} action - message key
|
|
37
|
+
* @param {Object} data - message value
|
|
38
|
+
* @return {Messenger} this
|
|
39
|
+
*/
|
|
40
|
+
sendToApp(action: string, data?: unknown): Messenger;
|
|
41
|
+
/**
|
|
42
|
+
* send message to agent
|
|
43
|
+
* @param {String} action - message key
|
|
44
|
+
* @param {Object} data - message value
|
|
45
|
+
* @return {Messenger} this
|
|
46
|
+
*/
|
|
47
|
+
sendToAgent(action: string, data?: unknown): Messenger;
|
|
48
|
+
/**
|
|
49
|
+
* @param {String} action - message key
|
|
50
|
+
* @param {Object} data - message value
|
|
51
|
+
* @param {String} to - let master know how to send message
|
|
52
|
+
* @return {Messenger} this
|
|
53
|
+
*/
|
|
54
|
+
send(action: string, data: unknown | undefined, to: string): Messenger;
|
|
55
|
+
onMessage(message: any): void;
|
|
56
|
+
close(): void;
|
|
57
|
+
}
|
|
@@ -0,0 +1,126 @@
|
|
|
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.Messenger = void 0;
|
|
7
|
+
const node_events_1 = require("node:events");
|
|
8
|
+
const node_util_1 = require("node:util");
|
|
9
|
+
const node_worker_threads_1 = __importDefault(require("node:worker_threads"));
|
|
10
|
+
const sendmessage_1 = __importDefault(require("sendmessage"));
|
|
11
|
+
const debug = (0, node_util_1.debuglog)('egg:lib:core:messenger:ipc');
|
|
12
|
+
/**
|
|
13
|
+
* Communication between app worker and agent worker by IPC channel
|
|
14
|
+
*/
|
|
15
|
+
class Messenger extends node_events_1.EventEmitter {
|
|
16
|
+
pid;
|
|
17
|
+
opids = [];
|
|
18
|
+
constructor() {
|
|
19
|
+
super();
|
|
20
|
+
this.pid = String(process.pid);
|
|
21
|
+
// pids of agent or app managed by master
|
|
22
|
+
// - retrieve app worker pids when it's an agent worker
|
|
23
|
+
// - retrieve agent worker pids when it's an app worker
|
|
24
|
+
this.on('egg-pids', pids => {
|
|
25
|
+
this.opids = pids;
|
|
26
|
+
});
|
|
27
|
+
this.onMessage = this.onMessage.bind(this);
|
|
28
|
+
process.on('message', this.onMessage);
|
|
29
|
+
if (!node_worker_threads_1.default.isMainThread) {
|
|
30
|
+
node_worker_threads_1.default.parentPort.on('message', this.onMessage);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Send message to all agent and app
|
|
35
|
+
* @param {String} action - message key
|
|
36
|
+
* @param {Object} data - message value
|
|
37
|
+
* @return {Messenger} this
|
|
38
|
+
*/
|
|
39
|
+
broadcast(action, data) {
|
|
40
|
+
debug('[%s] broadcast %s with %j', this.pid, action, data);
|
|
41
|
+
this.send(action, data, 'app');
|
|
42
|
+
this.send(action, data, 'agent');
|
|
43
|
+
return this;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* send message to the specified process
|
|
47
|
+
* @param {String} pid - the process id of the receiver
|
|
48
|
+
* @param {String} action - message key
|
|
49
|
+
* @param {Object} data - message value
|
|
50
|
+
* @return {Messenger} this
|
|
51
|
+
*/
|
|
52
|
+
sendTo(pid, action, data) {
|
|
53
|
+
debug('[%s] send %s with %j to %s', this.pid, action, data, pid);
|
|
54
|
+
(0, sendmessage_1.default)(process, {
|
|
55
|
+
action,
|
|
56
|
+
data,
|
|
57
|
+
receiverPid: String(pid),
|
|
58
|
+
});
|
|
59
|
+
return this;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* send message to one app worker by random
|
|
63
|
+
* - if it's running in agent, it will send to one of app workers
|
|
64
|
+
* - if it's running in app, it will send to agent
|
|
65
|
+
* @param {String} action - message key
|
|
66
|
+
* @param {Object} data - message value
|
|
67
|
+
* @return {Messenger} this
|
|
68
|
+
*/
|
|
69
|
+
sendRandom(action, data) {
|
|
70
|
+
/* istanbul ignore if */
|
|
71
|
+
if (this.opids.length === 0)
|
|
72
|
+
return this;
|
|
73
|
+
const index = Math.floor(Math.random() * this.opids.length);
|
|
74
|
+
const pid = this.opids[index];
|
|
75
|
+
this.sendTo(String(pid), action, data);
|
|
76
|
+
return this;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* send message to app
|
|
80
|
+
* @param {String} action - message key
|
|
81
|
+
* @param {Object} data - message value
|
|
82
|
+
* @return {Messenger} this
|
|
83
|
+
*/
|
|
84
|
+
sendToApp(action, data) {
|
|
85
|
+
debug('[%s] send %s with %j to all app', this.pid, action, data);
|
|
86
|
+
this.send(action, data, 'app');
|
|
87
|
+
return this;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* send message to agent
|
|
91
|
+
* @param {String} action - message key
|
|
92
|
+
* @param {Object} data - message value
|
|
93
|
+
* @return {Messenger} this
|
|
94
|
+
*/
|
|
95
|
+
sendToAgent(action, data) {
|
|
96
|
+
debug('[%s] send %s with %j to all agent', this.pid, action, data);
|
|
97
|
+
this.send(action, data, 'agent');
|
|
98
|
+
return this;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* @param {String} action - message key
|
|
102
|
+
* @param {Object} data - message value
|
|
103
|
+
* @param {String} to - let master know how to send message
|
|
104
|
+
* @return {Messenger} this
|
|
105
|
+
*/
|
|
106
|
+
send(action, data, to) {
|
|
107
|
+
(0, sendmessage_1.default)(process, {
|
|
108
|
+
action,
|
|
109
|
+
data,
|
|
110
|
+
to,
|
|
111
|
+
});
|
|
112
|
+
return this;
|
|
113
|
+
}
|
|
114
|
+
onMessage(message) {
|
|
115
|
+
if (typeof message?.action === 'string') {
|
|
116
|
+
debug('[%s] got message %s with %j, receiverPid: %s', this.pid, message.action, message.data, message.receiverPid);
|
|
117
|
+
this.emit(message.action, message.data);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
close() {
|
|
121
|
+
process.removeListener('message', this.onMessage);
|
|
122
|
+
this.removeAllListeners();
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
exports.Messenger = Messenger;
|
|
126
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXBjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb3JlL21lc3Nlbmdlci9pcGMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQ0EsNkNBQTJDO0FBQzNDLHlDQUFxQztBQUNyQyw4RUFBZ0Q7QUFDaEQsOERBQXNDO0FBR3RDLE1BQU0sS0FBSyxHQUFHLElBQUEsb0JBQVEsRUFBQyw0QkFBNEIsQ0FBQyxDQUFDO0FBRXJEOztHQUVHO0FBQ0gsTUFBYSxTQUFVLFNBQVEsMEJBQVk7SUFDaEMsR0FBRyxDQUFTO0lBQ3JCLEtBQUssR0FBYSxFQUFFLENBQUM7SUFFckI7UUFDRSxLQUFLLEVBQUUsQ0FBQztRQUNSLElBQUksQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMvQix5Q0FBeUM7UUFDekMsdURBQXVEO1FBQ3ZELHVEQUF1RDtRQUN2RCxJQUFJLENBQUMsRUFBRSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsRUFBRTtZQUN6QixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztRQUNwQixDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDM0MsT0FBTyxDQUFDLEVBQUUsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3RDLElBQUksQ0FBQyw2QkFBYSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ2hDLDZCQUFhLENBQUMsVUFBVyxDQUFDLEVBQUUsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzFELENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxTQUFTLENBQUMsTUFBYyxFQUFFLElBQWM7UUFDdEMsS0FBSyxDQUFDLDJCQUEyQixFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzNELElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztRQUMvQixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDakMsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsTUFBTSxDQUFDLEdBQVcsRUFBRSxNQUFjLEVBQUUsSUFBYztRQUNoRCxLQUFLLENBQUMsNEJBQTRCLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ2pFLElBQUEscUJBQVcsRUFBQyxPQUFPLEVBQUU7WUFDbkIsTUFBTTtZQUNOLElBQUk7WUFDSixXQUFXLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQztTQUN6QixDQUFDLENBQUM7UUFDSCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsVUFBVSxDQUFDLE1BQWMsRUFBRSxJQUFjO1FBQ3ZDLHdCQUF3QjtRQUN4QixJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUM7WUFBRSxPQUFPLElBQUksQ0FBQztRQUN6QyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzVELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDOUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3ZDLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsU0FBUyxDQUFDLE1BQWMsRUFBRSxJQUFjO1FBQ3RDLEtBQUssQ0FBQyxpQ0FBaUMsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNqRSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDL0IsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxXQUFXLENBQUMsTUFBYyxFQUFFLElBQWM7UUFDeEMsS0FBSyxDQUFDLG1DQUFtQyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ25FLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNqQyxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILElBQUksQ0FBQyxNQUFjLEVBQUUsSUFBeUIsRUFBRSxFQUFVO1FBQ3hELElBQUEscUJBQVcsRUFBQyxPQUFPLEVBQUU7WUFDbkIsTUFBTTtZQUNOLElBQUk7WUFDSixFQUFFO1NBQ0gsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsU0FBUyxDQUFDLE9BQVk7UUFDcEIsSUFBSSxPQUFPLE9BQU8sRUFBRSxNQUFNLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDeEMsS0FBSyxDQUFDLDhDQUE4QyxFQUNsRCxJQUFJLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDL0QsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMxQyxDQUFDO0lBQ0gsQ0FBQztJQUVELEtBQUs7UUFDSCxPQUFPLENBQUMsY0FBYyxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDbEQsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7SUFDNUIsQ0FBQztDQU9GO0FBNUhELDhCQTRIQyJ9
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import EventEmitter from 'node:events';
|
|
2
|
+
import type { IMessenger } from './IMessenger.js';
|
|
3
|
+
import type { EggApplicationCore } from '../../egg.js';
|
|
4
|
+
/**
|
|
5
|
+
* Communication between app worker and agent worker with EventEmitter
|
|
6
|
+
*/
|
|
7
|
+
export declare class Messenger extends EventEmitter implements IMessenger {
|
|
8
|
+
readonly pid: string;
|
|
9
|
+
readonly egg: EggApplicationCore;
|
|
10
|
+
constructor(egg: EggApplicationCore);
|
|
11
|
+
/**
|
|
12
|
+
* Send message to all agent and app
|
|
13
|
+
* @param {String} action - message key
|
|
14
|
+
* @param {Object} data - message value
|
|
15
|
+
* @return {Messenger} this
|
|
16
|
+
*/
|
|
17
|
+
broadcast(action: string, data?: unknown): Messenger;
|
|
18
|
+
/**
|
|
19
|
+
* send message to the specified process
|
|
20
|
+
* Notice: in single process mode, it only can send to self process,
|
|
21
|
+
* and it will send to both agent and app's messengers.
|
|
22
|
+
* @param {String} pid - the process id of the receiver
|
|
23
|
+
* @param {String} action - message key
|
|
24
|
+
* @param {Object} data - message value
|
|
25
|
+
* @return {Messenger} this
|
|
26
|
+
*/
|
|
27
|
+
sendTo(pid: string, action: string, data?: unknown): Messenger;
|
|
28
|
+
/**
|
|
29
|
+
* send message to one worker by random
|
|
30
|
+
* Notice: in single process mode, we only start one agent worker and one app worker
|
|
31
|
+
* - if it's running in agent, it will send to one of app workers
|
|
32
|
+
* - if it's running in app, it will send to agent
|
|
33
|
+
* @param {String} action - message key
|
|
34
|
+
* @param {Object} data - message value
|
|
35
|
+
* @return {Messenger} this
|
|
36
|
+
*/
|
|
37
|
+
sendRandom(action: string, data?: unknown): Messenger;
|
|
38
|
+
/**
|
|
39
|
+
* send message to app
|
|
40
|
+
* @param {String} action - message key
|
|
41
|
+
* @param {Object} data - message value
|
|
42
|
+
* @return {Messenger} this
|
|
43
|
+
*/
|
|
44
|
+
sendToApp(action: string, data?: unknown): Messenger;
|
|
45
|
+
/**
|
|
46
|
+
* send message to agent
|
|
47
|
+
* @param {String} action - message key
|
|
48
|
+
* @param {Object} data - message value
|
|
49
|
+
* @return {Messenger} this
|
|
50
|
+
*/
|
|
51
|
+
sendToAgent(action: string, data?: unknown): Messenger;
|
|
52
|
+
/**
|
|
53
|
+
* @param {String} action - message key
|
|
54
|
+
* @param {Object} data - message value
|
|
55
|
+
* @param {String} to - let master know how to send message
|
|
56
|
+
* @return {Messenger} this
|
|
57
|
+
*/
|
|
58
|
+
send(action: string, data: unknown | undefined, to: string): Messenger;
|
|
59
|
+
onMessage(message: any): void;
|
|
60
|
+
close(): void;
|
|
61
|
+
}
|
|
@@ -0,0 +1,134 @@
|
|
|
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.Messenger = void 0;
|
|
7
|
+
const node_util_1 = require("node:util");
|
|
8
|
+
const node_events_1 = __importDefault(require("node:events"));
|
|
9
|
+
const debug = (0, node_util_1.debuglog)('egg:lib:core:messenger:local');
|
|
10
|
+
/**
|
|
11
|
+
* Communication between app worker and agent worker with EventEmitter
|
|
12
|
+
*/
|
|
13
|
+
class Messenger extends node_events_1.default {
|
|
14
|
+
pid;
|
|
15
|
+
egg;
|
|
16
|
+
constructor(egg) {
|
|
17
|
+
super();
|
|
18
|
+
this.egg = egg;
|
|
19
|
+
this.pid = String(process.pid);
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Send message to all agent and app
|
|
23
|
+
* @param {String} action - message key
|
|
24
|
+
* @param {Object} data - message value
|
|
25
|
+
* @return {Messenger} this
|
|
26
|
+
*/
|
|
27
|
+
broadcast(action, data) {
|
|
28
|
+
debug('[%s] broadcast %s with %j', this.pid, action, data);
|
|
29
|
+
this.send(action, data, 'both');
|
|
30
|
+
return this;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* send message to the specified process
|
|
34
|
+
* Notice: in single process mode, it only can send to self process,
|
|
35
|
+
* and it will send to both agent and app's messengers.
|
|
36
|
+
* @param {String} pid - the process id of the receiver
|
|
37
|
+
* @param {String} action - message key
|
|
38
|
+
* @param {Object} data - message value
|
|
39
|
+
* @return {Messenger} this
|
|
40
|
+
*/
|
|
41
|
+
sendTo(pid, action, data) {
|
|
42
|
+
debug('[%s] send %s with %j to %s', this.pid, action, data, pid);
|
|
43
|
+
if (String(pid) !== this.pid) {
|
|
44
|
+
return this;
|
|
45
|
+
}
|
|
46
|
+
this.send(action, data, 'both');
|
|
47
|
+
return this;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* send message to one worker by random
|
|
51
|
+
* Notice: in single process mode, we only start one agent worker and one app worker
|
|
52
|
+
* - if it's running in agent, it will send to one of app workers
|
|
53
|
+
* - if it's running in app, it will send to agent
|
|
54
|
+
* @param {String} action - message key
|
|
55
|
+
* @param {Object} data - message value
|
|
56
|
+
* @return {Messenger} this
|
|
57
|
+
*/
|
|
58
|
+
sendRandom(action, data) {
|
|
59
|
+
debug('[%s] send %s with %j to opposite', this.pid, action, data);
|
|
60
|
+
this.send(action, data, 'opposite');
|
|
61
|
+
return this;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* send message to app
|
|
65
|
+
* @param {String} action - message key
|
|
66
|
+
* @param {Object} data - message value
|
|
67
|
+
* @return {Messenger} this
|
|
68
|
+
*/
|
|
69
|
+
sendToApp(action, data) {
|
|
70
|
+
debug('[%s] send %s with %j to all app', this.pid, action, data);
|
|
71
|
+
this.send(action, data, 'application');
|
|
72
|
+
return this;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* send message to agent
|
|
76
|
+
* @param {String} action - message key
|
|
77
|
+
* @param {Object} data - message value
|
|
78
|
+
* @return {Messenger} this
|
|
79
|
+
*/
|
|
80
|
+
sendToAgent(action, data) {
|
|
81
|
+
debug('[%s] send %s with %j to all agent', this.pid, action, data);
|
|
82
|
+
this.send(action, data, 'agent');
|
|
83
|
+
return this;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* @param {String} action - message key
|
|
87
|
+
* @param {Object} data - message value
|
|
88
|
+
* @param {String} to - let master know how to send message
|
|
89
|
+
* @return {Messenger} this
|
|
90
|
+
*/
|
|
91
|
+
send(action, data, to) {
|
|
92
|
+
// use nextTick to keep it async as IPC messenger
|
|
93
|
+
process.nextTick(() => {
|
|
94
|
+
const { egg } = this;
|
|
95
|
+
let application;
|
|
96
|
+
let agent;
|
|
97
|
+
let opposite;
|
|
98
|
+
if (egg.type === 'application') {
|
|
99
|
+
application = egg;
|
|
100
|
+
agent = egg.agent;
|
|
101
|
+
opposite = agent;
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
agent = egg;
|
|
105
|
+
application = egg.application;
|
|
106
|
+
opposite = application;
|
|
107
|
+
}
|
|
108
|
+
if (!to) {
|
|
109
|
+
to = egg.type === 'application' ? 'agent' : 'application';
|
|
110
|
+
}
|
|
111
|
+
if (application && application.messenger && (to === 'application' || to === 'both')) {
|
|
112
|
+
application.messenger.onMessage({ action, data });
|
|
113
|
+
}
|
|
114
|
+
if (agent && agent.messenger && (to === 'agent' || to === 'both')) {
|
|
115
|
+
agent.messenger.onMessage({ action, data });
|
|
116
|
+
}
|
|
117
|
+
if (opposite && opposite.messenger && to === 'opposite') {
|
|
118
|
+
opposite.messenger.onMessage({ action, data });
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
return this;
|
|
122
|
+
}
|
|
123
|
+
onMessage(message) {
|
|
124
|
+
if (typeof message?.action === 'string') {
|
|
125
|
+
debug('[%s] got message %s with %j', this.pid, message.action, message.data);
|
|
126
|
+
this.emit(message.action, message.data);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
close() {
|
|
130
|
+
this.removeAllListeners();
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
exports.Messenger = Messenger;
|
|
134
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvcmUvbWVzc2VuZ2VyL2xvY2FsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLHlDQUFxQztBQUNyQyw4REFBdUM7QUFJdkMsTUFBTSxLQUFLLEdBQUcsSUFBQSxvQkFBUSxFQUFDLDhCQUE4QixDQUFDLENBQUM7QUFFdkQ7O0dBRUc7QUFDSCxNQUFhLFNBQVUsU0FBUSxxQkFBWTtJQUNoQyxHQUFHLENBQVM7SUFDWixHQUFHLENBQXFCO0lBRWpDLFlBQVksR0FBdUI7UUFDakMsS0FBSyxFQUFFLENBQUM7UUFDUixJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztRQUNmLElBQUksQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxTQUFTLENBQUMsTUFBYyxFQUFFLElBQWM7UUFDdEMsS0FBSyxDQUFDLDJCQUEyQixFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzNELElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNoQyxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNILE1BQU0sQ0FBQyxHQUFXLEVBQUUsTUFBYyxFQUFFLElBQWM7UUFDaEQsS0FBSyxDQUFDLDRCQUE0QixFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNqRSxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDN0IsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFN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
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { EggApplicationCore } from '../egg.js';
|
|
2
|
+
export type SingletonCreateMethod = (config: Record<string, any>, app: EggApplicationCore, clientName: string) => unknown | Promise<unknown>;
|
|
3
|
+
export interface SingletonOptions {
|
|
4
|
+
name: string;
|
|
5
|
+
app: EggApplicationCore;
|
|
6
|
+
create: SingletonCreateMethod;
|
|
7
|
+
}
|
|
8
|
+
export declare class Singleton {
|
|
9
|
+
#private;
|
|
10
|
+
readonly clients: Map<string, any>;
|
|
11
|
+
readonly app: EggApplicationCore;
|
|
12
|
+
readonly create: SingletonCreateMethod;
|
|
13
|
+
readonly name: string;
|
|
14
|
+
readonly options: Record<string, any>;
|
|
15
|
+
constructor(options: SingletonOptions);
|
|
16
|
+
init(): void | Promise<void>;
|
|
17
|
+
initSync(): void;
|
|
18
|
+
initAsync(): Promise<void>;
|
|
19
|
+
get(id: string): any;
|
|
20
|
+
getSingletonInstance(id: string): any;
|
|
21
|
+
createInstance(config: Record<string, any>, clientName: string): unknown;
|
|
22
|
+
createInstanceAsync(config: Record<string, any>, clientName: string): Promise<unknown>;
|
|
23
|
+
}
|
|
@@ -0,0 +1,120 @@
|
|
|
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.Singleton = void 0;
|
|
7
|
+
const node_assert_1 = __importDefault(require("node:assert"));
|
|
8
|
+
const is_type_of_1 = require("is-type-of");
|
|
9
|
+
class Singleton {
|
|
10
|
+
clients = new Map();
|
|
11
|
+
app;
|
|
12
|
+
create;
|
|
13
|
+
name;
|
|
14
|
+
options;
|
|
15
|
+
constructor(options) {
|
|
16
|
+
(0, node_assert_1.default)(options.name, '[egg:singleton] Singleton#constructor options.name is required');
|
|
17
|
+
(0, node_assert_1.default)(options.app, '[egg:singleton] Singleton#constructor options.app is required');
|
|
18
|
+
(0, node_assert_1.default)(options.create, '[egg:singleton] Singleton#constructor options.create is required');
|
|
19
|
+
(0, node_assert_1.default)(!(options.name in options.app), `[egg:singleton] ${options.name} is already exists in app`);
|
|
20
|
+
this.app = options.app;
|
|
21
|
+
this.name = options.name;
|
|
22
|
+
this.create = options.create;
|
|
23
|
+
this.options = options.app.config[this.name] ?? {};
|
|
24
|
+
}
|
|
25
|
+
init() {
|
|
26
|
+
return (0, is_type_of_1.isAsyncFunction)(this.create) ? this.initAsync() : this.initSync();
|
|
27
|
+
}
|
|
28
|
+
initSync() {
|
|
29
|
+
const options = this.options;
|
|
30
|
+
(0, node_assert_1.default)(!(options.client && options.clients), `[egg:singleton] ${this.name} can not set options.client and options.clients both`);
|
|
31
|
+
// alias app[name] as client, but still support createInstance method
|
|
32
|
+
if (options.client) {
|
|
33
|
+
const client = this.createInstance(options.client, options.name);
|
|
34
|
+
this.#setClientToApp(client);
|
|
35
|
+
this.#extendDynamicMethods(client);
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
// multi client, use app[name].getInstance(id)
|
|
39
|
+
if (options.clients) {
|
|
40
|
+
Object.keys(options.clients).forEach(id => {
|
|
41
|
+
const client = this.createInstance(options.clients[id], id);
|
|
42
|
+
this.clients.set(id, client);
|
|
43
|
+
});
|
|
44
|
+
this.#setClientToApp(this);
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
// no config.clients and config.client
|
|
48
|
+
this.#setClientToApp(this);
|
|
49
|
+
}
|
|
50
|
+
async initAsync() {
|
|
51
|
+
const options = this.options;
|
|
52
|
+
(0, node_assert_1.default)(!(options.client && options.clients), `[egg:singleton] ${this.name} can not set options.client and options.clients both`);
|
|
53
|
+
// alias app[name] as client, but still support createInstance method
|
|
54
|
+
if (options.client) {
|
|
55
|
+
const client = await this.createInstanceAsync(options.client, options.name);
|
|
56
|
+
this.#setClientToApp(client);
|
|
57
|
+
this.#extendDynamicMethods(client);
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
// multi client, use app[name].getInstance(id)
|
|
61
|
+
if (options.clients) {
|
|
62
|
+
await Promise.all(Object.keys(options.clients).map((id) => {
|
|
63
|
+
return this.createInstanceAsync(options.clients[id], id)
|
|
64
|
+
.then(client => this.clients.set(id, client));
|
|
65
|
+
}));
|
|
66
|
+
this.#setClientToApp(this);
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
// no config.clients and config.client
|
|
70
|
+
this.#setClientToApp(this);
|
|
71
|
+
}
|
|
72
|
+
#setClientToApp(client) {
|
|
73
|
+
Reflect.set(this.app, this.name, client);
|
|
74
|
+
}
|
|
75
|
+
get(id) {
|
|
76
|
+
return this.clients.get(id);
|
|
77
|
+
}
|
|
78
|
+
// alias to `get(id)`
|
|
79
|
+
getSingletonInstance(id) {
|
|
80
|
+
return this.clients.get(id);
|
|
81
|
+
}
|
|
82
|
+
createInstance(config, clientName) {
|
|
83
|
+
// async creator only support createInstanceAsync
|
|
84
|
+
(0, node_assert_1.default)(!(0, is_type_of_1.isAsyncFunction)(this.create), `egg:singleton ${this.name} only support create asynchronous, please use createInstanceAsync`);
|
|
85
|
+
// options.default will be merge in to options.clients[id]
|
|
86
|
+
config = {
|
|
87
|
+
...this.options.default,
|
|
88
|
+
...config,
|
|
89
|
+
};
|
|
90
|
+
return this.create(config, this.app, clientName);
|
|
91
|
+
}
|
|
92
|
+
async createInstanceAsync(config, clientName) {
|
|
93
|
+
// options.default will be merge in to options.clients[id]
|
|
94
|
+
config = {
|
|
95
|
+
...this.options.default,
|
|
96
|
+
...config,
|
|
97
|
+
};
|
|
98
|
+
return await this.create(config, this.app, clientName);
|
|
99
|
+
}
|
|
100
|
+
#extendDynamicMethods(client) {
|
|
101
|
+
(0, node_assert_1.default)(!client.createInstance, 'singleton instance should not have createInstance method');
|
|
102
|
+
(0, node_assert_1.default)(!client.createInstanceAsync, 'singleton instance should not have createInstanceAsync method');
|
|
103
|
+
try {
|
|
104
|
+
let extendable = client;
|
|
105
|
+
// Object.preventExtensions() or Object.freeze()
|
|
106
|
+
if (!Object.isExtensible(client) || Object.isFrozen(client)) {
|
|
107
|
+
// eslint-disable-next-line no-proto
|
|
108
|
+
extendable = client.__proto__ || client;
|
|
109
|
+
}
|
|
110
|
+
extendable.createInstance = this.createInstance.bind(this);
|
|
111
|
+
extendable.createInstanceAsync = this.createInstanceAsync.bind(this);
|
|
112
|
+
}
|
|
113
|
+
catch (err) {
|
|
114
|
+
this.app.coreLogger.warn('[egg:singleton] %s dynamic create is disabled because of client is un-extendable', this.name);
|
|
115
|
+
this.app.coreLogger.warn(err);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
exports.Singleton = Singleton;
|
|
120
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2luZ2xldG9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9jb3JlL3NpbmdsZXRvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSw4REFBaUM7QUFDakMsMkNBQTZDO0FBWTdDLE1BQWEsU0FBUztJQUNYLE9BQU8sR0FBRyxJQUFJLEdBQUcsRUFBZSxDQUFDO0lBQ2pDLEdBQUcsQ0FBcUI7SUFDeEIsTUFBTSxDQUF3QjtJQUM5QixJQUFJLENBQVM7SUFDYixPQUFPLENBQXNCO0lBRXRDLFlBQVksT0FBeUI7UUFDbkMsSUFBQSxxQkFBTSxFQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsZ0VBQWdFLENBQUMsQ0FBQztRQUN2RixJQUFBLHFCQUFNLEVBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSwrREFBK0QsQ0FBQyxDQUFDO1FBQ3JGLElBQUEscUJBQU0sRUFBQyxPQUFPLENBQUMsTUFBTSxFQUFFLGtFQUFrRSxDQUFDLENBQUM7UUFDM0YsSUFBQSxxQkFBTSxFQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxtQkFBbUIsT0FBTyxDQUFDLElBQUksMkJBQTJCLENBQUMsQ0FBQztRQUNuRyxJQUFJLENBQUMsR0FBRyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUM7UUFDdkIsSUFBSSxDQUFDLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQztRQUM3QixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDckQsQ0FBQztJQUVELElBQUk7UUFDRixPQUFPLElBQUEsNEJBQWUsRUFBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUks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
|