@bigtyphoon/melo 1.7.6
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 +22 -0
- package/README.md +55 -0
- package/bin/commadtest.ts +10 -0
- package/bin/commands/add.ts +43 -0
- package/bin/commands/init.ts +292 -0
- package/bin/commands/kill.ts +21 -0
- package/bin/commands/list.ts +60 -0
- package/bin/commands/masterha.ts +40 -0
- package/bin/commands/restart.ts +48 -0
- package/bin/commands/start.ts +65 -0
- package/bin/commands/stop.ts +26 -0
- package/bin/melo.ts +30 -0
- package/bin/utils/constants.ts +27 -0
- package/bin/utils/utils.ts +130 -0
- package/dist/bin/commadtest.js +9 -0
- package/dist/bin/commands/add.js +40 -0
- package/dist/bin/commands/init.js +279 -0
- package/dist/bin/commands/kill.js +21 -0
- package/dist/bin/commands/list.js +65 -0
- package/dist/bin/commands/masterha.js +36 -0
- package/dist/bin/commands/restart.js +45 -0
- package/dist/bin/commands/start.js +58 -0
- package/dist/bin/commands/stop.js +20 -0
- package/dist/bin/melo.js +26 -0
- package/dist/bin/utils/constants.js +28 -0
- package/dist/bin/utils/utils.js +134 -0
- package/dist/lib/application.js +888 -0
- package/dist/lib/common/manager/appManager.js +112 -0
- package/dist/lib/common/manager/taskManager.js +39 -0
- package/dist/lib/common/remote/backend/msgRemote.js +63 -0
- package/dist/lib/common/remote/frontend/channelRemote.js +78 -0
- package/dist/lib/common/remote/frontend/sessionRemote.js +76 -0
- package/dist/lib/common/service/backendSessionService.js +337 -0
- package/dist/lib/common/service/channelService.js +514 -0
- package/dist/lib/common/service/connectionService.js +95 -0
- package/dist/lib/common/service/filterService.js +112 -0
- package/dist/lib/common/service/handlerService.js +187 -0
- package/dist/lib/common/service/sessionService.js +610 -0
- package/dist/lib/components/backendSession.js +14 -0
- package/dist/lib/components/channel.js +13 -0
- package/dist/lib/components/connection.js +12 -0
- package/dist/lib/components/connector.js +437 -0
- package/dist/lib/components/dictionary.js +93 -0
- package/dist/lib/components/master.js +39 -0
- package/dist/lib/components/monitor.js +25 -0
- package/dist/lib/components/protobuf.js +156 -0
- package/dist/lib/components/proxy.js +236 -0
- package/dist/lib/components/pushScheduler.js +62 -0
- package/dist/lib/components/remote.js +127 -0
- package/dist/lib/components/server.js +63 -0
- package/dist/lib/components/session.js +20 -0
- package/dist/lib/connectors/commands/handshake.js +119 -0
- package/dist/lib/connectors/commands/heartbeat.js +67 -0
- package/dist/lib/connectors/commands/kick.js +15 -0
- package/dist/lib/connectors/common/coder.js +90 -0
- package/dist/lib/connectors/common/handler.js +57 -0
- package/dist/lib/connectors/hybrid/IHybridSocket.js +3 -0
- package/dist/lib/connectors/hybrid/switcher.js +100 -0
- package/dist/lib/connectors/hybrid/tcpprocessor.js +40 -0
- package/dist/lib/connectors/hybrid/tcpsocket.js +171 -0
- package/dist/lib/connectors/hybrid/wsprocessor.js +49 -0
- package/dist/lib/connectors/hybridconnector.js +89 -0
- package/dist/lib/connectors/hybridsocket.js +139 -0
- package/dist/lib/connectors/mqtt/generate.js +113 -0
- package/dist/lib/connectors/mqtt/mqttadaptor.js +81 -0
- package/dist/lib/connectors/mqtt/protocol.js +48 -0
- package/dist/lib/connectors/mqttconnector.js +107 -0
- package/dist/lib/connectors/mqttsocket.js +59 -0
- package/dist/lib/connectors/sioconnector.js +135 -0
- package/dist/lib/connectors/siosocket.js +69 -0
- package/dist/lib/connectors/udpconnector.js +76 -0
- package/dist/lib/connectors/udpsocket.js +93 -0
- package/dist/lib/filters/handler/serial.js +44 -0
- package/dist/lib/filters/handler/time.js +32 -0
- package/dist/lib/filters/handler/timeout.js +45 -0
- package/dist/lib/filters/handler/toobusy.js +36 -0
- package/dist/lib/filters/rpc/rpcLog.js +43 -0
- package/dist/lib/filters/rpc/toobusy.js +41 -0
- package/dist/lib/index.js +81 -0
- package/dist/lib/interfaces/IComponent.js +3 -0
- package/dist/lib/interfaces/IConnector.js +3 -0
- package/dist/lib/interfaces/IHandlerFilter.js +3 -0
- package/dist/lib/interfaces/ILifeCycle.js +3 -0
- package/dist/lib/interfaces/IPlugin.js +3 -0
- package/dist/lib/interfaces/IPushScheduler.js +3 -0
- package/dist/lib/interfaces/ISocket.js +3 -0
- package/dist/lib/interfaces/IStore.js +3 -0
- package/dist/lib/interfaces/define.js +3 -0
- package/dist/lib/master/master.js +129 -0
- package/dist/lib/master/starter.js +236 -0
- package/dist/lib/master/watchdog.js +120 -0
- package/dist/lib/melo.js +125 -0
- package/dist/lib/modules/console.js +436 -0
- package/dist/lib/modules/masterwatcher.js +98 -0
- package/dist/lib/modules/monitorwatcher.js +124 -0
- package/dist/lib/modules/onlineUser.js +69 -0
- package/dist/lib/modules/restartNotifyModule.js +107 -0
- package/dist/lib/modules/watchServer.js +737 -0
- package/dist/lib/monitor/monitor.js +80 -0
- package/dist/lib/pushSchedulers/buffer.js +96 -0
- package/dist/lib/pushSchedulers/direct.js +58 -0
- package/dist/lib/pushSchedulers/multi.js +80 -0
- package/dist/lib/server/server.js +500 -0
- package/dist/lib/util/appUtil.js +306 -0
- package/dist/lib/util/constants.js +117 -0
- package/dist/lib/util/countDownLatch.js +51 -0
- package/dist/lib/util/events.js +20 -0
- package/dist/lib/util/handlerHelper.js +8 -0
- package/dist/lib/util/log.js +14 -0
- package/dist/lib/util/moduleUtil.js +101 -0
- package/dist/lib/util/pathUtil.js +134 -0
- package/dist/lib/util/remoterHelper.js +8 -0
- package/dist/lib/util/utils.js +358 -0
- package/dist/test/application.js +522 -0
- package/dist/test/config/log4js.json +28 -0
- package/dist/test/config/master.json +9 -0
- package/dist/test/config/servers.json +6 -0
- package/dist/test/filters/handler/serial.js +41 -0
- package/dist/test/filters/handler/time.js +41 -0
- package/dist/test/filters/handler/timeout.js +41 -0
- package/dist/test/filters/handler/toobusy.js +57 -0
- package/dist/test/filters/rpc/rpcLog.js +22 -0
- package/dist/test/filters/rpc/toobusy.js +39 -0
- package/dist/test/manager/mockChannelManager.js +77 -0
- package/dist/test/manager/taskManager.js +68 -0
- package/dist/test/mock-base/app/servers/other-file +0 -0
- package/dist/test/mock-plugin/components/mockPlugin.js +10 -0
- package/dist/test/mock-plugin/events/mockEvent.js +12 -0
- package/dist/test/modules/console.js +242 -0
- package/dist/test/pomelo.js +19 -0
- package/dist/test/remote/channelRemote.js +159 -0
- package/dist/test/service/channel.js +134 -0
- package/dist/test/service/channelService.js +216 -0
- package/dist/test/service/connectionService.js +114 -0
- package/dist/test/service/filterService.js +144 -0
- package/dist/test/service/handlerService.js +65 -0
- package/dist/test/service/sessionService.js +387 -0
- package/dist/test/util/countDownLatch.js +70 -0
- package/dist/test/util/pathUtil.js +108 -0
- package/dist/test/util/utils.js +140 -0
- package/lib/application.ts +1240 -0
- package/lib/common/manager/appManager.ts +118 -0
- package/lib/common/manager/taskManager.ts +50 -0
- package/lib/common/remote/backend/msgRemote.ts +134 -0
- package/lib/common/remote/frontend/channelRemote.ts +91 -0
- package/lib/common/remote/frontend/sessionRemote.ts +91 -0
- package/lib/common/service/backendSessionService.ts +388 -0
- package/lib/common/service/channelService.ts +609 -0
- package/lib/common/service/connectionService.ts +112 -0
- package/lib/common/service/filterService.ts +118 -0
- package/lib/common/service/handlerService.ts +224 -0
- package/lib/common/service/sessionService.ts +731 -0
- package/lib/components/backendSession.ts +14 -0
- package/lib/components/channel.ts +11 -0
- package/lib/components/connection.ts +13 -0
- package/lib/components/connector.ts +533 -0
- package/lib/components/dictionary.ts +121 -0
- package/lib/components/master.ts +41 -0
- package/lib/components/monitor.ts +30 -0
- package/lib/components/protobuf.ts +208 -0
- package/lib/components/proxy.ts +282 -0
- package/lib/components/pushScheduler.ts +70 -0
- package/lib/components/remote.ts +166 -0
- package/lib/components/server.ts +71 -0
- package/lib/components/session.ts +22 -0
- package/lib/connectors/commands/handshake.ts +155 -0
- package/lib/connectors/commands/heartbeat.ts +83 -0
- package/lib/connectors/commands/kick.ts +11 -0
- package/lib/connectors/common/coder.ts +93 -0
- package/lib/connectors/common/handler.ts +62 -0
- package/lib/connectors/hybrid/IHybridSocket.ts +9 -0
- package/lib/connectors/hybrid/switcher.ts +142 -0
- package/lib/connectors/hybrid/tcpprocessor.ts +43 -0
- package/lib/connectors/hybrid/tcpsocket.ts +223 -0
- package/lib/connectors/hybrid/wsprocessor.ts +57 -0
- package/lib/connectors/hybridconnector.ts +134 -0
- package/lib/connectors/hybridsocket.ts +168 -0
- package/lib/connectors/mqtt/generate.ts +103 -0
- package/lib/connectors/mqtt/mqttadaptor.ts +114 -0
- package/lib/connectors/mqtt/protocol.ts +49 -0
- package/lib/connectors/mqttconnector.ts +134 -0
- package/lib/connectors/mqttsocket.ts +79 -0
- package/lib/connectors/sioconnector.ts +161 -0
- package/lib/connectors/siosocket.ts +85 -0
- package/lib/connectors/udpconnector.ts +113 -0
- package/lib/connectors/udpsocket.ts +110 -0
- package/lib/filters/handler/serial.ts +46 -0
- package/lib/filters/handler/time.ts +35 -0
- package/lib/filters/handler/timeout.ts +50 -0
- package/lib/filters/handler/toobusy.ts +37 -0
- package/lib/filters/rpc/rpcLog.ts +42 -0
- package/lib/filters/rpc/toobusy.ts +41 -0
- package/lib/index.ts +74 -0
- package/lib/interfaces/IComponent.ts +47 -0
- package/lib/interfaces/IConnector.ts +20 -0
- package/lib/interfaces/IHandlerFilter.ts +15 -0
- package/lib/interfaces/ILifeCycle.ts +16 -0
- package/lib/interfaces/IPlugin.ts +65 -0
- package/lib/interfaces/IPushScheduler.ts +52 -0
- package/lib/interfaces/ISocket.ts +26 -0
- package/lib/interfaces/IStore.ts +10 -0
- package/lib/interfaces/define.ts +15 -0
- package/lib/master/master.ts +148 -0
- package/lib/master/starter.ts +234 -0
- package/lib/master/watchdog.ts +135 -0
- package/lib/melo.ts +152 -0
- package/lib/modules/console.ts +465 -0
- package/lib/modules/masterwatcher.ts +120 -0
- package/lib/modules/monitorwatcher.ts +151 -0
- package/lib/modules/onlineUser.ts +78 -0
- package/lib/modules/restartNotifyModule.ts +128 -0
- package/lib/modules/watchServer.ts +766 -0
- package/lib/monitor/monitor.ts +99 -0
- package/lib/pushSchedulers/buffer.ts +117 -0
- package/lib/pushSchedulers/direct.ts +65 -0
- package/lib/pushSchedulers/multi.ts +94 -0
- package/lib/server/server.ts +554 -0
- package/lib/util/appUtil.ts +313 -0
- package/lib/util/constants.ts +154 -0
- package/lib/util/countDownLatch.ts +72 -0
- package/lib/util/events.ts +15 -0
- package/lib/util/handlerHelper.ts +5 -0
- package/lib/util/log.ts +11 -0
- package/lib/util/moduleUtil.ts +110 -0
- package/lib/util/pathUtil.ts +132 -0
- package/lib/util/remoterHelper.ts +68 -0
- package/lib/util/utils.ts +365 -0
- package/package.json +93 -0
- package/template/game-server/.vscode/launch.json +27 -0
- package/template/game-server/app/servers/connector/handler/entryHandler.ts +50 -0
- package/template/game-server/app/servers/connector/remote/authRemoter.ts +36 -0
- package/template/game-server/app.ts +30 -0
- package/template/game-server/app.ts.mqtt +32 -0
- package/template/game-server/app.ts.sio +36 -0
- package/template/game-server/app.ts.sio.wss +34 -0
- package/template/game-server/app.ts.udp +31 -0
- package/template/game-server/app.ts.wss +40 -0
- package/template/game-server/config/adminServer.json +5 -0
- package/template/game-server/config/adminUser.json +22 -0
- package/template/game-server/config/clientProtos.json +1 -0
- package/template/game-server/config/dictionary.json +1 -0
- package/template/game-server/config/log4js.json +150 -0
- package/template/game-server/config/master.json +8 -0
- package/template/game-server/config/serverProtos.json +1 -0
- package/template/game-server/config/servers.json +12 -0
- package/template/game-server/copy.js +5 -0
- package/template/game-server/package.json +28 -0
- package/template/game-server/preload.ts +40 -0
- package/template/game-server/tsconfig.json +36 -0
- package/template/npm-install.bat +4 -0
- package/template/npm-install.sh +5 -0
- package/template/readme.md +31 -0
- package/template/shared/server.crt +15 -0
- package/template/shared/server.key +15 -0
- package/template/web-server/app.js +25 -0
- package/template/web-server/app.js.https +36 -0
- package/template/web-server/bin/component.bat +1 -0
- package/template/web-server/bin/component.sh +1 -0
- package/template/web-server/package.json +10 -0
- package/template/web-server/public/css/base.css +76 -0
- package/template/web-server/public/image/logo.png +0 -0
- package/template/web-server/public/image/sp.png +0 -0
- package/template/web-server/public/index.html +57 -0
- package/template/web-server/public/index.html.sio +58 -0
- package/template/web-server/public/js/lib/build/build.js +1730 -0
- package/template/web-server/public/js/lib/build/build.js.wss +1721 -0
- package/template/web-server/public/js/lib/component.json +6 -0
- package/template/web-server/public/js/lib/local/boot/component.json +11 -0
- package/template/web-server/public/js/lib/local/boot/index.js +11 -0
- package/template/web-server/public/js/lib/meloclient.js +456 -0
- package/template/web-server/public/js/lib/meloclient.js.wss +456 -0
- package/template/web-server/public/js/lib/socket.io.js +3 -0
- package/test/application.ts +607 -0
- package/test/filters/handler/serial.ts +47 -0
- package/test/filters/handler/time.ts +47 -0
- package/test/filters/handler/timeout.ts +46 -0
- package/test/filters/handler/toobusy.ts +59 -0
- package/test/filters/rpc/rpcLog.ts +20 -0
- package/test/filters/rpc/toobusy.ts +40 -0
- package/test/manager/mockChannelManager.ts +92 -0
- package/test/manager/taskManager.ts +78 -0
- package/test/mock-base/app/servers/other-file +0 -0
- package/test/mock-plugin/components/mockPlugin.ts +8 -0
- package/test/mock-plugin/events/mockEvent.ts +12 -0
- package/test/modules/console.ts +264 -0
- package/test/pomelo.ts +18 -0
- package/test/remote/channelRemote.ts +176 -0
- package/test/service/channel.ts +161 -0
- package/test/service/channelService.ts +243 -0
- package/test/service/connectionService.ts +142 -0
- package/test/service/filterService.ts +165 -0
- package/test/service/handlerService.ts +77 -0
- package/test/service/sessionService.ts +464 -0
- package/test/util/countDownLatch.ts +81 -0
- package/test/util/pathUtil.ts +122 -0
- package/test/util/utils.ts +165 -0
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ProtobufComponent = void 0;
|
|
4
|
+
const fs = require("fs");
|
|
5
|
+
const path = require("path");
|
|
6
|
+
const melo_protobuf_1 = require("@bigtyphoon/melo-protobuf");
|
|
7
|
+
const Constants = require("../util/constants");
|
|
8
|
+
const crypto = require("crypto");
|
|
9
|
+
const melo_logger_1 = require("@bigtyphoon/melo-logger");
|
|
10
|
+
const events_1 = require("../util/events");
|
|
11
|
+
let logger = (0, melo_logger_1.getLogger)('melo', path.basename(__filename));
|
|
12
|
+
class ProtobufComponent {
|
|
13
|
+
_canRequire(path) {
|
|
14
|
+
try {
|
|
15
|
+
require.resolve(path);
|
|
16
|
+
}
|
|
17
|
+
catch (err) {
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
return true;
|
|
21
|
+
}
|
|
22
|
+
constructor(app, opts) {
|
|
23
|
+
this.watchers = {};
|
|
24
|
+
this.serverProtos = {};
|
|
25
|
+
this.clientProtos = {};
|
|
26
|
+
this.version = '';
|
|
27
|
+
this.name = '__protobuf__';
|
|
28
|
+
this.app = app;
|
|
29
|
+
opts = opts || {};
|
|
30
|
+
logger.debug('ProtobufComponent options:', opts);
|
|
31
|
+
let env = app.get(Constants.RESERVED.ENV);
|
|
32
|
+
let originServerPath = path.join(app.getBase(), Constants.FILEPATH.SERVER_PROTOS);
|
|
33
|
+
let presentServerPath = path.join(Constants.FILEPATH.CONFIG_DIR, env, path.basename(Constants.FILEPATH.SERVER_PROTOS));
|
|
34
|
+
let originClientPath = path.join(app.getBase(), Constants.FILEPATH.CLIENT_PROTOS);
|
|
35
|
+
let presentClientPath = path.join(Constants.FILEPATH.CONFIG_DIR, env, path.basename(Constants.FILEPATH.CLIENT_PROTOS));
|
|
36
|
+
this.serverProtosPath = opts.serverProtos || (this._canRequire(originServerPath) ? Constants.FILEPATH.SERVER_PROTOS : presentServerPath);
|
|
37
|
+
this.clientProtosPath = opts.clientProtos || (this._canRequire(originClientPath) ? Constants.FILEPATH.CLIENT_PROTOS : presentClientPath);
|
|
38
|
+
this.setProtos(Constants.RESERVED.SERVER, path.join(app.getBase(), this.serverProtosPath));
|
|
39
|
+
this.setProtos(Constants.RESERVED.CLIENT, path.join(app.getBase(), this.clientProtosPath));
|
|
40
|
+
this.protobuf = new melo_protobuf_1.Protobuf({
|
|
41
|
+
encoderProtos: this.serverProtos,
|
|
42
|
+
decoderProtos: this.clientProtos,
|
|
43
|
+
encoderCacheSize: opts.encoderCacheSize,
|
|
44
|
+
decodeCheckMsg: opts.decodeCheckMsg,
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
encode(key, msg) {
|
|
48
|
+
return this.protobuf.encode(key, msg);
|
|
49
|
+
}
|
|
50
|
+
encode2Bytes(key, msg) {
|
|
51
|
+
return this.protobuf.encode2Bytes(key, msg);
|
|
52
|
+
}
|
|
53
|
+
decode(key, msg) {
|
|
54
|
+
return this.protobuf.decode(key, msg);
|
|
55
|
+
}
|
|
56
|
+
getProtos() {
|
|
57
|
+
return {
|
|
58
|
+
server: this.serverProtos,
|
|
59
|
+
client: this.clientProtos,
|
|
60
|
+
version: this.version
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
getVersion() {
|
|
64
|
+
return this.version;
|
|
65
|
+
}
|
|
66
|
+
// 手动重新加载协议文件。
|
|
67
|
+
manualReloadProtos() {
|
|
68
|
+
let truePath = path.join(this.app.getBase(), this.serverProtosPath);
|
|
69
|
+
truePath = require.resolve(truePath);
|
|
70
|
+
this.onUpdate(Constants.RESERVED.SERVER, truePath, 'change');
|
|
71
|
+
truePath = path.join(this.app.getBase(), this.clientProtosPath);
|
|
72
|
+
truePath = require.resolve(truePath);
|
|
73
|
+
this.onUpdate(Constants.RESERVED.CLIENT, truePath, 'change');
|
|
74
|
+
}
|
|
75
|
+
setProtos(type, path) {
|
|
76
|
+
if (!this._canRequire(path)) {
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
if (type === Constants.RESERVED.SERVER) {
|
|
80
|
+
this.serverProtos = melo_protobuf_1.Protobuf.parse(require(path));
|
|
81
|
+
}
|
|
82
|
+
if (type === Constants.RESERVED.CLIENT) {
|
|
83
|
+
this.clientProtos = melo_protobuf_1.Protobuf.parse(require(path));
|
|
84
|
+
}
|
|
85
|
+
let protoStr = JSON.stringify(this.clientProtos) + JSON.stringify(this.serverProtos);
|
|
86
|
+
this.version = crypto.createHash('md5').update(protoStr).digest('base64');
|
|
87
|
+
// Watch file
|
|
88
|
+
const truePath = require.resolve(path);
|
|
89
|
+
let watcher = fs.watch(truePath, this.onUpdate.bind(this, type, truePath));
|
|
90
|
+
if (this.watchers[type]) {
|
|
91
|
+
this.watchers[type].close();
|
|
92
|
+
}
|
|
93
|
+
this.watchers[type] = watcher;
|
|
94
|
+
}
|
|
95
|
+
clearRequireCache(path) {
|
|
96
|
+
const moduleObj = require.cache[path];
|
|
97
|
+
if (!moduleObj) {
|
|
98
|
+
logger.warn('can not find module of truepath', path);
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
if (moduleObj.parent) {
|
|
102
|
+
// console.log('has parent ',moduleObj.parent);
|
|
103
|
+
moduleObj.parent.children.splice(moduleObj.parent.children.indexOf(moduleObj), 1);
|
|
104
|
+
}
|
|
105
|
+
delete require.cache[path];
|
|
106
|
+
}
|
|
107
|
+
onUpdate(type, path, event, filename, errTry) {
|
|
108
|
+
if (event !== 'change') {
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
let self = this;
|
|
112
|
+
this.clearRequireCache(path);
|
|
113
|
+
try {
|
|
114
|
+
let protos = melo_protobuf_1.Protobuf.parse(require(path));
|
|
115
|
+
// 预防 git checkout这样的操作导致获得的数据为空的情况
|
|
116
|
+
if (!protos || !Object.keys(protos).length) {
|
|
117
|
+
// retry.
|
|
118
|
+
throw new Error('protos error');
|
|
119
|
+
}
|
|
120
|
+
if (type === Constants.RESERVED.SERVER) {
|
|
121
|
+
this.protobuf.setEncoderProtos(protos);
|
|
122
|
+
self.serverProtos = protos;
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
this.protobuf.setDecoderProtos(protos);
|
|
126
|
+
self.clientProtos = protos;
|
|
127
|
+
}
|
|
128
|
+
let protoStr = JSON.stringify(self.clientProtos) + JSON.stringify(self.serverProtos);
|
|
129
|
+
self.version = crypto.createHash('md5').update(protoStr).digest('base64');
|
|
130
|
+
logger.info('change proto file , type : %j, path : %j, version : %j', type, path, self.version);
|
|
131
|
+
// 抛出 proto 变化事件。
|
|
132
|
+
self.app.event.emit(events_1.default.PROTO_CHANGED, type);
|
|
133
|
+
}
|
|
134
|
+
catch (e) {
|
|
135
|
+
logger.error('change proto file error! path : %j', path, filename, errTry, e);
|
|
136
|
+
if (!errTry) {
|
|
137
|
+
logger.warn('setTimeout,try update proto');
|
|
138
|
+
setTimeout(() => {
|
|
139
|
+
logger.warn('try update proto again');
|
|
140
|
+
this.onUpdate(type, path, event, filename, true);
|
|
141
|
+
}, 3000);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
this.watchers[type].close();
|
|
145
|
+
this.watchers[type] = fs.watch(path, this.onUpdate.bind(this, type, path));
|
|
146
|
+
}
|
|
147
|
+
stop(force, cb) {
|
|
148
|
+
for (let type in this.watchers) {
|
|
149
|
+
this.watchers[type].close();
|
|
150
|
+
}
|
|
151
|
+
this.watchers = {};
|
|
152
|
+
process.nextTick(cb);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
exports.ProtobufComponent = ProtobufComponent;
|
|
156
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdG9idWYuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvY29tcG9uZW50cy9wcm90b2J1Zi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx5QkFBeUI7QUFDekIsNkJBQTZCO0FBQzdCLDZEQUFxRDtBQUNyRCwrQ0FBK0M7QUFDL0MsaUNBQWlDO0FBQ2pDLHlEQUFvRDtBQUdwRCwyQ0FBdUM7QUFFdkMsSUFBSSxNQUFNLEdBQUcsSUFBQSx1QkFBUyxFQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7QUEwQjFELE1BQWEsaUJBQWlCO0lBaUIxQixXQUFXLENBQUMsSUFBWTtRQUNwQixJQUFJO1lBQ0EsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUN6QjtRQUFDLE9BQU8sR0FBRyxFQUFFO1lBQ1YsT0FBTyxLQUFLLENBQUM7U0FDaEI7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQsWUFBWSxHQUFnQixFQUFFLElBQWdDO1FBdkI5RCxhQUFRLEdBQW9DLEVBQUUsQ0FBQztRQUMvQyxpQkFBWSxHQUVSLEVBQUUsQ0FBQztRQUNQLGlCQUFZLEdBRVIsRUFBRSxDQUFDO1FBQ1AsWUFBTyxHQUFHLEVBQUUsQ0FBQztRQUtiLFNBQUksR0FBRyxjQUFjLENBQUM7UUFZbEIsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7UUFDZixJQUFJLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUNsQixNQUFNLENBQUMsS0FBSyxDQUFDLDRCQUE0QixFQUFFLElBQUksQ0FBQyxDQUFBO1FBQ2hELElBQUksR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMxQyxJQUFJLGdCQUFnQixHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxF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
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.manualReloadProxies = exports.ProxyComponent = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Component for proxy.
|
|
6
|
+
* Generate proxies for rpc client.
|
|
7
|
+
*/
|
|
8
|
+
const crc = require("crc");
|
|
9
|
+
const utils = require("../util/utils");
|
|
10
|
+
const events_1 = require("../util/events");
|
|
11
|
+
const melo_rpc_1 = require("@bigtyphoon/melo-rpc");
|
|
12
|
+
const Constants = require("../util/constants");
|
|
13
|
+
const melo_logger_1 = require("@bigtyphoon/melo-logger");
|
|
14
|
+
const path = require("path");
|
|
15
|
+
let logger = (0, melo_logger_1.getLogger)('melo', path.basename(__filename));
|
|
16
|
+
/**
|
|
17
|
+
* Proxy component class
|
|
18
|
+
*
|
|
19
|
+
* @param {Object} app current application context
|
|
20
|
+
* @param {Object} opts construct parameters
|
|
21
|
+
*/
|
|
22
|
+
class ProxyComponent {
|
|
23
|
+
constructor(app, opts) {
|
|
24
|
+
var _a, _b;
|
|
25
|
+
this.name = '__proxy__';
|
|
26
|
+
opts = opts || {};
|
|
27
|
+
// proxy default config
|
|
28
|
+
// cacheMsg is deprecated, just for compatibility here.
|
|
29
|
+
opts.bufferMsg = opts.bufferMsg || opts.cacheMsg || false;
|
|
30
|
+
opts.interval = opts.interval || 30;
|
|
31
|
+
opts.router = genRouteFun();
|
|
32
|
+
opts.context = (_a = opts.context) !== null && _a !== void 0 ? _a : app;
|
|
33
|
+
opts.routeContext = (_b = opts.routeContext) !== null && _b !== void 0 ? _b : app;
|
|
34
|
+
if (app.enabled('rpcDebugLog')) {
|
|
35
|
+
opts.rpcDebugLog = true;
|
|
36
|
+
opts.rpcLogger = (0, melo_logger_1.getLogger)('rpc-debug', path.basename(__filename));
|
|
37
|
+
}
|
|
38
|
+
this.app = app;
|
|
39
|
+
this.opts = opts;
|
|
40
|
+
this.client = genRpcClient(this.app, opts);
|
|
41
|
+
this.app.event.on(events_1.default.ADD_SERVERS, this.addServers.bind(this));
|
|
42
|
+
this.app.event.on(events_1.default.REMOVE_SERVERS, this.removeServers.bind(this));
|
|
43
|
+
this.app.event.on(events_1.default.REPLACE_SERVERS, this.replaceServers.bind(this));
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Proxy component lifecycle function
|
|
47
|
+
*
|
|
48
|
+
* @param {Function} cb
|
|
49
|
+
* @return {Void}
|
|
50
|
+
*/
|
|
51
|
+
start(cb) {
|
|
52
|
+
if (this.opts.enableRpcLog) {
|
|
53
|
+
logger.warn('enableRpcLog is deprecated in 0.8.0, please use app.rpcFilter(melo.rpcFilters.rpcLog())');
|
|
54
|
+
}
|
|
55
|
+
let rpcBefores = this.app.get(Constants.KEYWORDS.RPC_BEFORE_FILTER);
|
|
56
|
+
let rpcAfters = this.app.get(Constants.KEYWORDS.RPC_AFTER_FILTER);
|
|
57
|
+
let rpcErrorHandler = this.app.get(Constants.RESERVED.RPC_ERROR_HANDLER);
|
|
58
|
+
if (!!rpcBefores) {
|
|
59
|
+
this.client.before(rpcBefores);
|
|
60
|
+
}
|
|
61
|
+
if (!!rpcAfters) {
|
|
62
|
+
this.client.after(rpcAfters);
|
|
63
|
+
}
|
|
64
|
+
if (!!rpcErrorHandler) {
|
|
65
|
+
this.client.setErrorHandler(rpcErrorHandler);
|
|
66
|
+
}
|
|
67
|
+
process.nextTick(cb);
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Component lifecycle callback
|
|
71
|
+
*
|
|
72
|
+
* @param {Function} cb
|
|
73
|
+
* @return {Void}
|
|
74
|
+
*/
|
|
75
|
+
afterStart(cb) {
|
|
76
|
+
let self = this;
|
|
77
|
+
Object.defineProperty(this.app, 'rpc', {
|
|
78
|
+
get: function () {
|
|
79
|
+
return self.client.proxies.user;
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
Object.defineProperty(this.app, 'sysrpc', {
|
|
83
|
+
get: function () {
|
|
84
|
+
return self.client.proxies.sys;
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
this.app.rpcInvoke = this.client.rpcInvoke.bind(this.client);
|
|
88
|
+
this.client.start(cb);
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Add remote server to the rpc client.
|
|
92
|
+
*
|
|
93
|
+
* @param {Array} servers server info list, {id, serverType, host, port}
|
|
94
|
+
*/
|
|
95
|
+
addServers(servers) {
|
|
96
|
+
if (!servers || !servers.length) {
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
genProxies(this.client, this.app, servers);
|
|
100
|
+
this.client.addServers(servers);
|
|
101
|
+
}
|
|
102
|
+
manualReloadProxies() {
|
|
103
|
+
let servers = [];
|
|
104
|
+
for (let k in this.client._station.servers) {
|
|
105
|
+
servers.push(this.client._station.servers[k]);
|
|
106
|
+
}
|
|
107
|
+
logger.warn('manualReloadProxies servers:', servers);
|
|
108
|
+
genProxies(this.client, this.app, servers);
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Remove remote server from the rpc client.
|
|
112
|
+
*
|
|
113
|
+
* @param {Array} ids server id list
|
|
114
|
+
*/
|
|
115
|
+
removeServers(ids) {
|
|
116
|
+
this.client.removeServers(ids);
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Replace remote servers from the rpc client.
|
|
120
|
+
*
|
|
121
|
+
* @param {Array} ids server id list
|
|
122
|
+
*/
|
|
123
|
+
replaceServers(servers) {
|
|
124
|
+
if (!servers || !servers.length) {
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
// update proxies
|
|
128
|
+
this.client.proxies = {};
|
|
129
|
+
genProxies(this.client, this.app, servers);
|
|
130
|
+
this.client.replaceServers(servers);
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Proxy for rpc client rpcInvoke.
|
|
134
|
+
*
|
|
135
|
+
* @param {String} serverId remote server id
|
|
136
|
+
* @param {Object} msg rpc message: {serverType: serverType, service: serviceName, method: methodName, args: arguments}
|
|
137
|
+
* @param {Function} cb callback function
|
|
138
|
+
*/
|
|
139
|
+
rpcInvoke(serverId, msg, cb) {
|
|
140
|
+
this.client.rpcInvoke(serverId, msg, cb);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
exports.ProxyComponent = ProxyComponent;
|
|
144
|
+
function manualReloadProxies(app) {
|
|
145
|
+
if (!app.components.__proxy__) {
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
if (app.components.__proxy__.manualReloadProxies) {
|
|
149
|
+
app.components.__proxy__.manualReloadProxies();
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
logger.warn('manualReloadProxies not method');
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
exports.manualReloadProxies = manualReloadProxies;
|
|
156
|
+
/**
|
|
157
|
+
* Generate rpc client
|
|
158
|
+
*
|
|
159
|
+
* @param {Object} app current application context
|
|
160
|
+
* @param {Object} opts contructor parameters for rpc client
|
|
161
|
+
* @return {Object} rpc client
|
|
162
|
+
*/
|
|
163
|
+
let genRpcClient = function (app, opts) {
|
|
164
|
+
var _a, _b;
|
|
165
|
+
opts.context = (_a = opts.context) !== null && _a !== void 0 ? _a : app;
|
|
166
|
+
opts.routeContext = (_b = opts.routeContext) !== null && _b !== void 0 ? _b : app;
|
|
167
|
+
if (!!opts.rpcClient) {
|
|
168
|
+
return opts.rpcClient.create(opts);
|
|
169
|
+
}
|
|
170
|
+
else {
|
|
171
|
+
return (0, melo_rpc_1.createClient)(opts);
|
|
172
|
+
}
|
|
173
|
+
};
|
|
174
|
+
/**
|
|
175
|
+
* Generate proxy for the server infos.
|
|
176
|
+
*
|
|
177
|
+
* @param {Object} client rpc client instance
|
|
178
|
+
* @param {Object} app application context
|
|
179
|
+
* @param {Array} sinfos server info list
|
|
180
|
+
*/
|
|
181
|
+
let genProxies = function (client, app, sinfos) {
|
|
182
|
+
let item;
|
|
183
|
+
for (let i = 0, l = sinfos.length; i < l; i++) {
|
|
184
|
+
item = sinfos[i];
|
|
185
|
+
client.addProxies(getProxyRecords(app, item));
|
|
186
|
+
}
|
|
187
|
+
};
|
|
188
|
+
/**
|
|
189
|
+
* Check a server whether has generated proxy before
|
|
190
|
+
*
|
|
191
|
+
* @param {Object} client rpc client instance
|
|
192
|
+
* @param {Object} sinfo server info
|
|
193
|
+
* @return {Boolean} true or false
|
|
194
|
+
*/
|
|
195
|
+
let hasProxy = function (client, sinfo) {
|
|
196
|
+
let proxy = client.proxies;
|
|
197
|
+
return !!proxy.sys && !!proxy.sys[sinfo.serverType];
|
|
198
|
+
};
|
|
199
|
+
/**
|
|
200
|
+
* Get proxy path for rpc client.
|
|
201
|
+
* Iterate all the remote service path and create remote path record.
|
|
202
|
+
*
|
|
203
|
+
* @param {Object} app current application context
|
|
204
|
+
* @param {Object} sinfo server info, format: {id, serverType, host, port}
|
|
205
|
+
* @return {Array} remote path record array
|
|
206
|
+
*/
|
|
207
|
+
let getProxyRecords = function (app, sinfo) {
|
|
208
|
+
return sinfo.remoterPaths;
|
|
209
|
+
};
|
|
210
|
+
let genRouteFun = function () {
|
|
211
|
+
return function (session, msg, app, cb) {
|
|
212
|
+
let routes = app.get(Constants.KEYWORDS.ROUTE);
|
|
213
|
+
if (!routes) {
|
|
214
|
+
defaultRoute(session, msg, app, cb);
|
|
215
|
+
return;
|
|
216
|
+
}
|
|
217
|
+
let type = msg.serverType, route = routes[type] || routes['default'];
|
|
218
|
+
if (route) {
|
|
219
|
+
route(session, msg, app, cb);
|
|
220
|
+
}
|
|
221
|
+
else {
|
|
222
|
+
defaultRoute(session, msg, app, cb);
|
|
223
|
+
}
|
|
224
|
+
};
|
|
225
|
+
};
|
|
226
|
+
let defaultRoute = function (session, msg, app, cb) {
|
|
227
|
+
let list = app.getServersByType(msg.serverType);
|
|
228
|
+
if (!list || !list.length) {
|
|
229
|
+
cb(new Error('can not find server info for type:' + msg.serverType));
|
|
230
|
+
return;
|
|
231
|
+
}
|
|
232
|
+
let uid = session ? (session.uid || '') : '';
|
|
233
|
+
let index = Math.abs(crc.crc32(uid.toString())) % list.length;
|
|
234
|
+
utils.invokeCallback(cb, null, list[index].id);
|
|
235
|
+
};
|
|
236
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJveHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvY29tcG9uZW50cy9wcm94eS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQTs7O0dBR0c7QUFDSCwyQkFBMkI7QUFDM0IsdUNBQXVDO0FBQ3ZDLDJDQUFtRDtBQUNuRCxtREFBK0Q7QUFFL0QsK0NBQStDO0FBQy9DLHlEQUFvRDtBQU1wRCw2QkFBNkI7QUFFN0IsSUFBSSxNQUFNLEdBQUcsSUFBQSx1QkFBUyxFQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7QUFhMUQ7Ozs7O0dBS0c7QUFDSCxNQUFhLGNBQWM7SUFLdkIsWUFBWSxHQUFnQixFQUFFLElBQTJCOztRQXNCekQsU0FBSSxHQUFHLFdBQVcsQ0FBQztRQXJCZixJQUFJLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUNsQix1QkFBdUI7UUFDdkIsdURBQXVEO1FBQ3ZELElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLEtBQUssQ0FBQztRQUMxRCxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLElBQUksRUFBRSxDQUFDO1FBQ3BDLElBQUksQ0FBQyxNQUFNLEdBQUcsV0FBVyxFQUFFLENBQUM7UUFDNUIsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFBLElBQUksQ0FBQyxPQUFPLG1DQUFJLEdBQUcsQ0FBQztRQUNuQyxJQUFJLENBQUMsWUFBWSxHQUFHLE1BQUEsSUFBSSxDQUFDLFlBQVksbUNBQUksR0FBRyxDQUFDO1FBQzdDLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsRUFBRTtZQUM1QixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztZQUN4QixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUEsdUJBQVMsRUFBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLFFB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
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Scheduler component to schedule message sending.
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.PushSchedulerComponent = void 0;
|
|
7
|
+
const direct_1 = require("../pushSchedulers/direct");
|
|
8
|
+
const melo_logger_1 = require("@bigtyphoon/melo-logger");
|
|
9
|
+
const multi_1 = require("../pushSchedulers/multi");
|
|
10
|
+
const path = require("path");
|
|
11
|
+
let logger = (0, melo_logger_1.getLogger)('melo', path.basename(__filename));
|
|
12
|
+
class PushSchedulerComponent {
|
|
13
|
+
constructor(app, opts) {
|
|
14
|
+
this.app = app;
|
|
15
|
+
this.name = '__pushScheduler__';
|
|
16
|
+
opts = opts || {};
|
|
17
|
+
this.scheduler = getScheduler(this, app, opts);
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Component lifecycle callback
|
|
21
|
+
*
|
|
22
|
+
* @param {Function} cb
|
|
23
|
+
* @return {Void}
|
|
24
|
+
*/
|
|
25
|
+
afterStart(cb) {
|
|
26
|
+
this.scheduler.start().then(cb);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Component lifecycle callback
|
|
30
|
+
*
|
|
31
|
+
* @param {Function} cb
|
|
32
|
+
* @return {Void}
|
|
33
|
+
*/
|
|
34
|
+
stop(force, cb) {
|
|
35
|
+
this.scheduler.stop().then(cb);
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Schedule how the message to send.
|
|
39
|
+
*
|
|
40
|
+
* @param {Number} reqId request id
|
|
41
|
+
* @param {String} route route string of the message
|
|
42
|
+
* @param {Object} msg message content after encoded
|
|
43
|
+
* @param {Array} recvs array of receiver's session id
|
|
44
|
+
* @param {Object} opts options
|
|
45
|
+
* @param {Function} cb
|
|
46
|
+
*/
|
|
47
|
+
schedule(reqId, route, msg, recvs, opts, cb) {
|
|
48
|
+
this.scheduler.schedule(reqId, route, msg, recvs, opts, cb);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
exports.PushSchedulerComponent = PushSchedulerComponent;
|
|
52
|
+
let getScheduler = function (pushSchedulerComp, app, opts) {
|
|
53
|
+
let scheduler = opts.scheduler || direct_1.DirectPushScheduler;
|
|
54
|
+
if (typeof scheduler === 'function') {
|
|
55
|
+
return new scheduler(app, opts);
|
|
56
|
+
}
|
|
57
|
+
if (Array.isArray(scheduler)) {
|
|
58
|
+
return new multi_1.MultiPushScheduler(app, opts);
|
|
59
|
+
}
|
|
60
|
+
return scheduler;
|
|
61
|
+
};
|
|
62
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVzaFNjaGVkdWxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9jb21wb25lbnRzL3B1c2hTY2hlZHVsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOztHQUVHOzs7QUFFSCxxREFBaUY7QUFDakYseURBQW9EO0FBSXBELG1EQUE2RDtBQUU3RCw2QkFBNkI7QUFDN0IsSUFBSSxNQUFNLEdBQUcsSUFBQSx1QkFBUyxFQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7QUFHMUQsTUFBYSxzQkFBc0I7SUFFL0IsWUFBb0IsR0FBZ0IsRUFBRSxJQUE2QjtRQUEvQyxRQUFHLEdBQUgsR0FBRyxDQUFhO1FBS3BDLFNBQUksR0FBRyxtQkFBbUIsQ0FBQztRQUp2QixJQUFJLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUNsQixJQUFJLENBQUMsU0FBUyxHQUFHLFlBQVksQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFJRDs7Ozs7T0FLRztJQUNILFVBQVUsQ0FBQyxFQUFjO1FBQ3JCLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILElBQUksQ0FBQyxLQUFjLEVBQUUsRUFBYztRQUMvQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0gsUUFBUSxDQUFDLEtBQWEsRUFBRSxLQUFhLEVBQUUsR0FBUSxFQUFFLEtBQVksRUFBRSxJQUFxQixFQUFFLEVBQXlCO1FBQzNHLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDaEUsQ0FBQztDQUNKO0FBMUNELHdEQTBDQztBQUNELElBQUksWUFBWSxHQUFHLFVBQVUsaUJBQXlDLEVBQUUsR0FBZ0IsRUFBRSxJQUEyQjtJQUNqSCxJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxJQUFJLDRCQUFnQixDQUFDO0lBQ25ELElBQUksT0FBTyxTQUFTLEtBQUssVUFBVSxFQUFFO1FBQ2pDLE9BQU8sSUFBSSxTQUFTLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO0tBQ25DO0lBRUQsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFO1FBQzFCLE9BQU8sSUFBSSwwQkFBa0IsQ0FBQyxHQUFHLEVBQUcsSUFBaUMsQ0FBQyxDQUFDO0tBQzFFO0lBRUQsT0FBTyxTQUEyQixDQUFDO0FBQ3ZDLENBQUMsQ0FBQyJ9
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.manualReloadRemoters = exports.RemoteComponent = void 0;
|
|
4
|
+
const pathUtil = require("../util/pathUtil");
|
|
5
|
+
const melo_rpc_1 = require("@bigtyphoon/melo-rpc");
|
|
6
|
+
const melo_logger_1 = require("@bigtyphoon/melo-logger");
|
|
7
|
+
const path = require("path");
|
|
8
|
+
/**
|
|
9
|
+
* Remote component class
|
|
10
|
+
*
|
|
11
|
+
* @param {Object} app current application context
|
|
12
|
+
* @param {Object} opts construct parameters
|
|
13
|
+
*/
|
|
14
|
+
class RemoteComponent {
|
|
15
|
+
constructor(app, opts) {
|
|
16
|
+
this.app = app;
|
|
17
|
+
this.name = '__remote__';
|
|
18
|
+
opts = opts || {};
|
|
19
|
+
this.opts = opts;
|
|
20
|
+
// cacheMsg is deprecated, just for compatibility here.
|
|
21
|
+
opts.bufferMsg = opts.bufferMsg || opts.cacheMsg || false;
|
|
22
|
+
opts.interval = opts.interval || 30;
|
|
23
|
+
if (app.enabled('rpcDebugLog')) {
|
|
24
|
+
opts.rpcDebugLog = true;
|
|
25
|
+
opts.rpcLogger = (0, melo_logger_1.getLogger)('rpc-debug', path.basename(__filename));
|
|
26
|
+
}
|
|
27
|
+
opts.relativePath = opts.relativePath || false;
|
|
28
|
+
opts.paths = this.getRemotePaths(opts.relativePath);
|
|
29
|
+
opts.context = this.app;
|
|
30
|
+
let remoters = {};
|
|
31
|
+
opts.services = {};
|
|
32
|
+
opts.services['user'] = remoters;
|
|
33
|
+
let info = this.app.getCurrentServer();
|
|
34
|
+
// 添加插件中的remoter到ServerInfo中
|
|
35
|
+
for (let plugin of this.app.usedPlugins) {
|
|
36
|
+
if (plugin.remoterPath) {
|
|
37
|
+
opts.paths.push({
|
|
38
|
+
namespace: 'user',
|
|
39
|
+
serverType: info.serverType,
|
|
40
|
+
path: plugin.remoterPath
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
// 添加路径到ServerInfo中
|
|
45
|
+
info.remoterPaths = opts.paths;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Remote component lifecycle function
|
|
49
|
+
*
|
|
50
|
+
* @param {Function} cb
|
|
51
|
+
* @return {Void}
|
|
52
|
+
*/
|
|
53
|
+
start(cb) {
|
|
54
|
+
this.opts.port = this.app.getCurServer().port;
|
|
55
|
+
this.remote = this.genRemote(this.opts);
|
|
56
|
+
this.remote.start();
|
|
57
|
+
process.nextTick(cb);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Remote component lifecycle function
|
|
61
|
+
*
|
|
62
|
+
* @param {Boolean} force whether stop the component immediately
|
|
63
|
+
* @param {Function} cb
|
|
64
|
+
* @return {Void}
|
|
65
|
+
*/
|
|
66
|
+
stop(force, cb) {
|
|
67
|
+
this.remote.stop(force);
|
|
68
|
+
process.nextTick(cb);
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Get remote paths from application
|
|
72
|
+
*
|
|
73
|
+
* @param {Boolean} relativePath convert path to relative path
|
|
74
|
+
* @return {Array} paths
|
|
75
|
+
*
|
|
76
|
+
*/
|
|
77
|
+
getRemotePaths(relativePath) {
|
|
78
|
+
let paths = [];
|
|
79
|
+
let role;
|
|
80
|
+
// master server should not come here
|
|
81
|
+
if (this.app.isFrontend()) {
|
|
82
|
+
role = 'frontend';
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
role = 'backend';
|
|
86
|
+
}
|
|
87
|
+
let sysPath = pathUtil.getSysRemotePath(role), serverType = this.app.getServerType();
|
|
88
|
+
if (sysPath !== null) {
|
|
89
|
+
paths.push(pathUtil.remotePathRecord('sys', serverType, sysPath, relativePath));
|
|
90
|
+
}
|
|
91
|
+
let userPath = pathUtil.getUserRemotePath(this.app.getBase(), serverType);
|
|
92
|
+
if (userPath !== null) {
|
|
93
|
+
paths.push(pathUtil.remotePathRecord('user', serverType, userPath, relativePath));
|
|
94
|
+
}
|
|
95
|
+
return paths;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Generate remote server instance
|
|
99
|
+
*
|
|
100
|
+
* @param {Object} app current application context
|
|
101
|
+
* @param {Object} opts contructor parameters for rpc Server
|
|
102
|
+
* @return {Object} remote server instance
|
|
103
|
+
*/
|
|
104
|
+
genRemote(opts) {
|
|
105
|
+
if (!!opts.rpcServer) {
|
|
106
|
+
return opts.rpcServer.create(opts);
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
return (0, melo_rpc_1.createServer)(opts);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
exports.RemoteComponent = RemoteComponent;
|
|
114
|
+
function manualReloadRemoters(app) {
|
|
115
|
+
if (!app.components.__remote__) {
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
const remote = app.components.__remote__.remote;
|
|
119
|
+
if (remote['manualReloadRemoters']) {
|
|
120
|
+
remote['manualReloadRemoters']();
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
console.warn('manualReloadRemoters no method');
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
exports.manualReloadRemoters = manualReloadRemoters;
|
|
127
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVtb3RlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL2NvbXBvbmVudHMvcmVtb3RlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUtBLDZDQUE2QztBQUM3QyxtREFBaUg7QUFHakgseURBQTREO0FBRTVELDZCQUE2QjtBQXFCN0I7Ozs7O0dBS0c7QUFDSCxNQUFhLGVBQWU7SUFHeEIsWUFBb0IsR0FBZ0IsRUFBRSxJQUE2QjtRQUEvQyxRQUFHLEdBQUgsR0FBRyxDQUFhO1FBdUNwQyxTQUFJLEdBQUcsWUFBWSxDQUFDO1FBdENoQixJQUFJLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUNsQixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUVqQix1REFBdUQ7UUFDdkQsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksS0FBSyxDQUFDO1FBQzFELElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsSUFBSSxFQUFFLENBQUM7UUFDcEMsSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxFQUFFO1lBQzVCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBQSx1QkFBUyxFQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7U0FDdEU7UUFFRCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLElBQUksS0FBSyxDQUFDO1FBQy9DLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDcEQsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDO1FBRXhCLElBQUksUUFBUSxHQUFhLEVBQUUsQ0FBQztRQUM1QixJQUFJLENB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
|