@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,437 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ConnectorComponent = void 0;
|
|
4
|
+
const melo_logger_1 = require("@bigtyphoon/melo-logger");
|
|
5
|
+
const taskManager = require("../common/manager/taskManager");
|
|
6
|
+
const melo_1 = require("../melo");
|
|
7
|
+
let rsa = require('node-bignumber');
|
|
8
|
+
const events_1 = require("../util/events");
|
|
9
|
+
const utils = require("../util/utils");
|
|
10
|
+
const sioconnector_1 = require("../connectors/sioconnector");
|
|
11
|
+
const path = require("path");
|
|
12
|
+
let logger = (0, melo_logger_1.getLogger)('melo', path.basename(__filename));
|
|
13
|
+
/**
|
|
14
|
+
* Connector component. Receive client requests and attach session with socket.
|
|
15
|
+
*
|
|
16
|
+
* @param {Object} app current application context
|
|
17
|
+
* @param {Object} opts attach parameters
|
|
18
|
+
* opts.connector {Object} provides low level network and protocol details implementation between server and clients.
|
|
19
|
+
*/
|
|
20
|
+
class ConnectorComponent {
|
|
21
|
+
constructor(app, opts) {
|
|
22
|
+
this.keys = {};
|
|
23
|
+
this.blacklist = [];
|
|
24
|
+
this.name = '__connector__';
|
|
25
|
+
opts = opts || {};
|
|
26
|
+
this.app = app;
|
|
27
|
+
this.connector = getConnector(app, opts);
|
|
28
|
+
this.encode = opts.encode;
|
|
29
|
+
this.decode = opts.decode;
|
|
30
|
+
this.useCrypto = opts.useCrypto;
|
|
31
|
+
this.useHostFilter = opts.useHostFilter;
|
|
32
|
+
this.useAsyncCoder = opts.useAsyncCoder;
|
|
33
|
+
this.blacklistFun = opts.blacklistFun;
|
|
34
|
+
this.forwardMsg = opts.forwardMsg;
|
|
35
|
+
if (opts.useDict) {
|
|
36
|
+
app.load(melo_1.melo.components.dictionary, app.get('dictionaryConfig'));
|
|
37
|
+
}
|
|
38
|
+
if (opts.useProtobuf) {
|
|
39
|
+
app.load(melo_1.melo.components.protobuf, app.get('protobufConfig'));
|
|
40
|
+
}
|
|
41
|
+
// component dependencies
|
|
42
|
+
this.server = null;
|
|
43
|
+
this.session = null;
|
|
44
|
+
}
|
|
45
|
+
start(cb) {
|
|
46
|
+
this.server = this.app.components.__server__;
|
|
47
|
+
this.session = this.app.components.__session__;
|
|
48
|
+
this.connection = this.app.components.__connection__;
|
|
49
|
+
// check component dependencies
|
|
50
|
+
if (!this.server) {
|
|
51
|
+
process.nextTick(function () {
|
|
52
|
+
utils.invokeCallback(cb, new Error('fail to start connector component for no server component loaded'));
|
|
53
|
+
});
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
if (!this.session) {
|
|
57
|
+
process.nextTick(function () {
|
|
58
|
+
utils.invokeCallback(cb, new Error('fail to start connector component for no session component loaded'));
|
|
59
|
+
});
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
process.nextTick(cb);
|
|
63
|
+
}
|
|
64
|
+
afterStart(cb) {
|
|
65
|
+
this.connector.start(cb);
|
|
66
|
+
this.connector.on('connection', this.hostFilter.bind(this, this.bindEvents.bind(this)));
|
|
67
|
+
}
|
|
68
|
+
stop(force, cb) {
|
|
69
|
+
if (this.connector) {
|
|
70
|
+
this.connector.stop(force, cb);
|
|
71
|
+
this.connector = null;
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
process.nextTick(cb);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
send(reqId, route, msg, recvs, opts, cb) {
|
|
79
|
+
logger.debug('[%s] send message reqId: %s, route: %s, msg: %j, receivers: %j, opts: %j', this.app.serverId, reqId, route, msg, recvs, opts);
|
|
80
|
+
// if (this.useAsyncCoder) {
|
|
81
|
+
// return this.sendAsync(reqId, route, msg, recvs, opts, cb);
|
|
82
|
+
// }
|
|
83
|
+
let emsg = msg;
|
|
84
|
+
if (this.encode) {
|
|
85
|
+
// use costumized encode
|
|
86
|
+
emsg = this.encode.call(this, reqId, route, msg);
|
|
87
|
+
}
|
|
88
|
+
else if (this.connector.encode) {
|
|
89
|
+
// use connector default encode
|
|
90
|
+
emsg = this.connector.encode(reqId, route, msg);
|
|
91
|
+
}
|
|
92
|
+
this.doSend(reqId, route, emsg, recvs, opts, cb);
|
|
93
|
+
}
|
|
94
|
+
sendAsync(reqId, route, msg, recvs, opts, cb) {
|
|
95
|
+
let emsg = msg;
|
|
96
|
+
let self = this;
|
|
97
|
+
/*
|
|
98
|
+
if (this.encode)
|
|
99
|
+
{
|
|
100
|
+
// use costumized encode
|
|
101
|
+
this.encode(reqId, route, msg, function (err, encodeMsg)
|
|
102
|
+
{
|
|
103
|
+
if (err)
|
|
104
|
+
{
|
|
105
|
+
return cb(err);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
emsg = encodeMsg;
|
|
109
|
+
self.doSend(reqId, route, emsg, recvs, opts, cb);
|
|
110
|
+
});
|
|
111
|
+
} else if (this.connector.encode)
|
|
112
|
+
{
|
|
113
|
+
// use connector default encode
|
|
114
|
+
this.connector.encode(reqId, route, msg, function (err, encodeMsg)
|
|
115
|
+
{
|
|
116
|
+
if (err)
|
|
117
|
+
{
|
|
118
|
+
return cb(err);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
emsg = encodeMsg;
|
|
122
|
+
self.doSend(reqId, route, emsg, recvs, opts, cb);
|
|
123
|
+
});
|
|
124
|
+
}*/
|
|
125
|
+
throw new Error('not implement sendAsync');
|
|
126
|
+
}
|
|
127
|
+
doSend(reqId, route, emsg, recvs, opts, cb) {
|
|
128
|
+
if (!emsg) {
|
|
129
|
+
process.nextTick(function () {
|
|
130
|
+
return cb && cb(new Error('fail to send message for encode result is empty.'));
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
this.app.components.__pushScheduler__.schedule(reqId, route, emsg, recvs, opts, cb);
|
|
134
|
+
}
|
|
135
|
+
setPubKey(id, key) {
|
|
136
|
+
let pubKey = new rsa.Key();
|
|
137
|
+
pubKey.n = new rsa.BigInteger(key.rsa_n, 16);
|
|
138
|
+
pubKey.e = key.rsa_e;
|
|
139
|
+
this.keys[id] = pubKey;
|
|
140
|
+
}
|
|
141
|
+
getPubKey(id) {
|
|
142
|
+
return this.keys[id];
|
|
143
|
+
}
|
|
144
|
+
hostFilter(cb, socket) {
|
|
145
|
+
if (!this.useHostFilter) {
|
|
146
|
+
return cb(socket);
|
|
147
|
+
}
|
|
148
|
+
let ip = socket.remoteAddress.ip;
|
|
149
|
+
let check = function (list) {
|
|
150
|
+
for (let address in list) {
|
|
151
|
+
let exp = new RegExp(list[address]);
|
|
152
|
+
if (exp.test(ip)) {
|
|
153
|
+
socket.disconnect();
|
|
154
|
+
return true;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
return false;
|
|
158
|
+
};
|
|
159
|
+
// dynamical check
|
|
160
|
+
if (this.blacklist.length !== 0 && !!check(this.blacklist)) {
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
// static check
|
|
164
|
+
if (!!this.blacklistFun && typeof this.blacklistFun === 'function') {
|
|
165
|
+
let self = this;
|
|
166
|
+
self.blacklistFun((err, list) => {
|
|
167
|
+
if (!!err) {
|
|
168
|
+
logger.error('connector blacklist error: %j', err.stack);
|
|
169
|
+
utils.invokeCallback(cb, socket);
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
if (!Array.isArray(list)) {
|
|
173
|
+
logger.error('connector blacklist is not array: %j', list);
|
|
174
|
+
utils.invokeCallback(cb, socket);
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
if (!!check(list)) {
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
else {
|
|
181
|
+
utils.invokeCallback(cb, socket);
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
else {
|
|
187
|
+
utils.invokeCallback(cb, socket);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
bindEvents(socket) {
|
|
191
|
+
let curServer = this.app.getCurServer();
|
|
192
|
+
let maxConnections = curServer['max-connections'];
|
|
193
|
+
if (this.connection && maxConnections) {
|
|
194
|
+
this.connection.increaseConnectionCount();
|
|
195
|
+
let statisticInfo = this.connection.getStatisticsInfo();
|
|
196
|
+
if (statisticInfo.totalConnCount > maxConnections) {
|
|
197
|
+
logger.warn('the server %s has reached the max connections %s', curServer.id, maxConnections);
|
|
198
|
+
socket.disconnect();
|
|
199
|
+
return;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
// create session for connection
|
|
203
|
+
let session = this.getSession(socket);
|
|
204
|
+
let closed = false;
|
|
205
|
+
socket.on('disconnect', () => {
|
|
206
|
+
if (closed) {
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
closed = true;
|
|
210
|
+
if (this.connection) {
|
|
211
|
+
this.connection.decreaseConnectionCount(session.uid);
|
|
212
|
+
}
|
|
213
|
+
});
|
|
214
|
+
socket.on('error', () => {
|
|
215
|
+
if (closed) {
|
|
216
|
+
return;
|
|
217
|
+
}
|
|
218
|
+
closed = true;
|
|
219
|
+
if (this.connection) {
|
|
220
|
+
this.connection.decreaseConnectionCount(session.uid);
|
|
221
|
+
}
|
|
222
|
+
});
|
|
223
|
+
// new message
|
|
224
|
+
socket.on('message', (msg) => {
|
|
225
|
+
let dmsg = msg;
|
|
226
|
+
// if (this.useAsyncCoder) {
|
|
227
|
+
// return this.handleMessageAsync(msg, session, socket);
|
|
228
|
+
// }
|
|
229
|
+
if (this.decode) {
|
|
230
|
+
dmsg = this.decode(msg);
|
|
231
|
+
}
|
|
232
|
+
else if (this.connector.decode) {
|
|
233
|
+
dmsg = this.connector.decode(msg);
|
|
234
|
+
// Perhaps protobuf decoder error can be captured here.
|
|
235
|
+
// if (dmsg && dmsg.body === null) {
|
|
236
|
+
// // protobuf decode error
|
|
237
|
+
// logger.error('fail to decode the msg body received from client. msg:', dmsg);
|
|
238
|
+
// return;
|
|
239
|
+
// }
|
|
240
|
+
}
|
|
241
|
+
if (!dmsg) {
|
|
242
|
+
// discard invalid message
|
|
243
|
+
return;
|
|
244
|
+
}
|
|
245
|
+
// use rsa crypto
|
|
246
|
+
if (this.useCrypto) {
|
|
247
|
+
let verified = this.verifyMessage(session, dmsg);
|
|
248
|
+
if (!verified) {
|
|
249
|
+
logger.error('fail to verify the data received from client.');
|
|
250
|
+
return;
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
this.handleMessage(session, dmsg);
|
|
254
|
+
}); // on message end
|
|
255
|
+
}
|
|
256
|
+
handleMessageAsync(msg, session, socket) {
|
|
257
|
+
/*
|
|
258
|
+
if (this.decode)
|
|
259
|
+
{
|
|
260
|
+
this.decode(msg, session, function (err, dmsg)
|
|
261
|
+
{
|
|
262
|
+
if (err)
|
|
263
|
+
{
|
|
264
|
+
logger.error('fail to decode message from client %s .', err.stack);
|
|
265
|
+
return;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
doHandleMessage(this, dmsg, session);
|
|
269
|
+
});
|
|
270
|
+
} else if (this.connector.decode)
|
|
271
|
+
{
|
|
272
|
+
this.connector.decode(msg, socket, function (err, dmsg)
|
|
273
|
+
{
|
|
274
|
+
if (err)
|
|
275
|
+
{
|
|
276
|
+
logger.error('fail to decode message from client %s .', err.stack);
|
|
277
|
+
return;
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
doHandleMessage(this, dmsg, session);
|
|
281
|
+
});
|
|
282
|
+
}*/
|
|
283
|
+
throw new Error('not implement handleMessageAsync');
|
|
284
|
+
}
|
|
285
|
+
doHandleMessage(dmsg, session) {
|
|
286
|
+
if (!dmsg) {
|
|
287
|
+
// discard invalid message
|
|
288
|
+
return;
|
|
289
|
+
}
|
|
290
|
+
// use rsa crypto
|
|
291
|
+
if (this.useCrypto) {
|
|
292
|
+
let verified = this.verifyMessage(session, dmsg);
|
|
293
|
+
if (!verified) {
|
|
294
|
+
logger.error('fail to verify the data received from client.');
|
|
295
|
+
return;
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
this.handleMessage(session, dmsg);
|
|
299
|
+
}
|
|
300
|
+
/**
|
|
301
|
+
* get session for current connection
|
|
302
|
+
*/
|
|
303
|
+
getSession(socket) {
|
|
304
|
+
let app = this.app, sid = socket.id;
|
|
305
|
+
let session = this.session.get(sid);
|
|
306
|
+
if (session) {
|
|
307
|
+
return session;
|
|
308
|
+
}
|
|
309
|
+
session = this.session.create(sid, app.getServerId(), socket);
|
|
310
|
+
logger.debug('[%s] getSession session is created with session id: %s', app.getServerId(), sid);
|
|
311
|
+
// bind events for session
|
|
312
|
+
socket.on('disconnect', session.closed.bind(session));
|
|
313
|
+
socket.on('error', session.closed.bind(session));
|
|
314
|
+
session.on('closed', this.onSessionClose.bind(this, app));
|
|
315
|
+
session.on('bind', (uid) => {
|
|
316
|
+
logger.debug('session on [%s] bind with uid: %s', this.app.serverId, uid);
|
|
317
|
+
// update connection statistics if necessary
|
|
318
|
+
if (this.connection) {
|
|
319
|
+
this.connection.addLoginedUser(uid, {
|
|
320
|
+
loginTime: Date.now(),
|
|
321
|
+
uid: uid,
|
|
322
|
+
address: socket.remoteAddress.ip + ':' + socket.remoteAddress.port
|
|
323
|
+
});
|
|
324
|
+
}
|
|
325
|
+
this.app.event.emit(events_1.default.BIND_SESSION, session);
|
|
326
|
+
});
|
|
327
|
+
session.on('unbind', (uid) => {
|
|
328
|
+
if (this.connection) {
|
|
329
|
+
this.connection.removeLoginedUser(uid);
|
|
330
|
+
}
|
|
331
|
+
this.app.event.emit(events_1.default.UNBIND_SESSION, session);
|
|
332
|
+
});
|
|
333
|
+
return session;
|
|
334
|
+
}
|
|
335
|
+
onSessionClose(app, session, reason) {
|
|
336
|
+
taskManager.closeQueue(session.id, true);
|
|
337
|
+
app.event.emit(events_1.default.CLOSE_SESSION, session);
|
|
338
|
+
}
|
|
339
|
+
handleMessage(session, msg) {
|
|
340
|
+
// logger.debug('[%s] handleMessage session id: %s, msg: %j', this.app.serverId, session.id, msg);
|
|
341
|
+
let type = this.checkServerType(msg.route);
|
|
342
|
+
if (!type) {
|
|
343
|
+
logger.error('invalid route string. route : %j', msg.route);
|
|
344
|
+
return;
|
|
345
|
+
}
|
|
346
|
+
// only stop forwarding message when forwardMsg === false;
|
|
347
|
+
if (this.forwardMsg === false && type !== this.app.getServerType()) {
|
|
348
|
+
logger.warn('illegal route. forwardMsg=false route=', msg.route, 'sessionid=', session.id);
|
|
349
|
+
// kick client requests for illegal route request.
|
|
350
|
+
this.session.kickBySessionId(session.id);
|
|
351
|
+
return;
|
|
352
|
+
}
|
|
353
|
+
this.server.globalHandle(msg, session.toFrontendSession(), (err, resp) => {
|
|
354
|
+
if (resp && !msg.id) {
|
|
355
|
+
logger.warn('try to response to a notify: %j', msg.route);
|
|
356
|
+
return;
|
|
357
|
+
}
|
|
358
|
+
if (!msg.id && !resp)
|
|
359
|
+
return;
|
|
360
|
+
if (!resp)
|
|
361
|
+
resp = {};
|
|
362
|
+
if (!!err && !resp.code) {
|
|
363
|
+
resp.code = 500;
|
|
364
|
+
}
|
|
365
|
+
let opts = {
|
|
366
|
+
type: 'response'
|
|
367
|
+
};
|
|
368
|
+
this.send(msg.id, msg.route, resp, [session.id], opts, function () {
|
|
369
|
+
});
|
|
370
|
+
});
|
|
371
|
+
}
|
|
372
|
+
/**
|
|
373
|
+
* Get server type form request message.
|
|
374
|
+
*/
|
|
375
|
+
checkServerType(route) {
|
|
376
|
+
if (!route) {
|
|
377
|
+
return null;
|
|
378
|
+
}
|
|
379
|
+
let idx = route.indexOf('.');
|
|
380
|
+
if (idx < 0) {
|
|
381
|
+
return null;
|
|
382
|
+
}
|
|
383
|
+
return route.substring(0, idx);
|
|
384
|
+
}
|
|
385
|
+
verifyMessage(session, msg) {
|
|
386
|
+
let sig = msg.body.__crypto__;
|
|
387
|
+
if (!sig) {
|
|
388
|
+
logger.error('receive data from client has no signature [%s]', this.app.serverId);
|
|
389
|
+
return false;
|
|
390
|
+
}
|
|
391
|
+
let pubKey;
|
|
392
|
+
if (!session) {
|
|
393
|
+
logger.error('could not find session.');
|
|
394
|
+
return false;
|
|
395
|
+
}
|
|
396
|
+
if (!session.get('pubKey')) {
|
|
397
|
+
pubKey = this.getPubKey(session.id);
|
|
398
|
+
if (!!pubKey) {
|
|
399
|
+
delete this.keys[session.id];
|
|
400
|
+
session.set('pubKey', pubKey);
|
|
401
|
+
}
|
|
402
|
+
else {
|
|
403
|
+
logger.error('could not get public key, session id is %s', session.id);
|
|
404
|
+
return false;
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
else {
|
|
408
|
+
pubKey = session.get('pubKey');
|
|
409
|
+
}
|
|
410
|
+
if (!pubKey.n || !pubKey.e) {
|
|
411
|
+
logger.error('could not verify message without public key [%s]', this.app.serverId);
|
|
412
|
+
return false;
|
|
413
|
+
}
|
|
414
|
+
delete msg.body.__crypto__;
|
|
415
|
+
let message = JSON.stringify(msg.body);
|
|
416
|
+
if (utils.hasChineseChar(message))
|
|
417
|
+
message = utils.unicodeToUtf8(message);
|
|
418
|
+
return pubKey.verifyString(message, sig);
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
exports.ConnectorComponent = ConnectorComponent;
|
|
422
|
+
let getConnector = function (app, opts) {
|
|
423
|
+
let connector = opts.connector;
|
|
424
|
+
if (!connector) {
|
|
425
|
+
return getDefaultConnector(app, opts);
|
|
426
|
+
}
|
|
427
|
+
if (typeof connector !== 'function') {
|
|
428
|
+
return connector;
|
|
429
|
+
}
|
|
430
|
+
let curServer = app.getCurServer();
|
|
431
|
+
return new connector(curServer.clientPort, curServer.host, opts);
|
|
432
|
+
};
|
|
433
|
+
let getDefaultConnector = function (app, opts) {
|
|
434
|
+
let curServer = app.getCurServer();
|
|
435
|
+
return new sioconnector_1.SIOConnector(curServer.clientPort, curServer.host, opts);
|
|
436
|
+
};
|
|
437
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29ubmVjdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL2NvbXBvbmVudHMvY29ubmVjdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHlEQUFrRDtBQUNsRCw2REFBNkQ7QUFDN0Qsa0NBQTZCO0FBRTdCLElBQUksR0FBRyxHQUFHLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0FBQ3BDLDJDQUFpRDtBQUNqRCx1Q0FBdUM7QUFLdkMsNkRBQTZFO0FBVTdFLDZCQUE2QjtBQUU3QixJQUFJLE1BQU0sR0FBRyxJQUFBLHVCQUFTLEVBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztBQXNCMUQ7Ozs7OztHQU1HO0FBRUgsTUFBYSxrQkFBa0I7SUFpQjNCLFlBQVksR0FBZ0IsRUFBRSxJQUFnQztRQUw5RCxTQUFJLEdBQTZCLEVBQUUsQ0FBQztRQUNwQyxjQUFTLEdBQWEsRUFBRSxDQUFDO1FBNkJ6QixTQUFJLEdBQUcsZUFBZSxDQUFDO1FBeEJuQixJQUFJLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUNsQixJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztRQUNmLElBQUksQ0FBQyxTQUFTLEdBQUcsWUFBWSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN6QyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDMUIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQzFCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUNoQyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7UUFDeEMsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO1FBQ3hDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztRQUN0QyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7UUFFbEMsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ2QsR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQztTQUNyRTtRQUVELElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUNsQixHQUFHLENBQUMsSUFBSSxDQUFDLFdBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO1NBQ2pFO1FBRUQseUJBQXlCO1FBQ3pCLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ25CLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO0lBQ3hCLENBQUM7SUFJRCxLQUFLLENBQUMsRUFBYztRQUNoQixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQztRQUM3QyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQztRQUMvQyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQztRQUVyRCwrQkFBK0I7UUFDL0IsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDZCxPQUFPLENBQUMsUUFBUSxDQUFDO2dCQUNiLEtBQUssQ0FBQyxjQUFjLENBQUMsRUFBRSxFQUFFLElBQUksS0FBSyxDQUFDLGtFQUFrRSxDQUFDLENBQUMsQ0FBQztZQUM1RyxDQUFDLENBQUMsQ0FBQztZQUNILE9BQU87U0FDVjtRQUVELElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ2YsT0FBTyxDQUFDLFFBQVEsQ0FBQztnQkFDYixLQUFLLENBQUMsY0FBYyxDQUFDLEVBQUUsRUFBRSxJQUFJLEtBQUssQ0FBQyxtRUFBbUUsQ0FBQyxDQUFDLENBQUM7WUFDN0csQ0FBQyxDQUFDLENBQUM7WUFDSCxPQUFPO1NBQ1Y7UUFFRCxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFFRCxVQUFVLENBQUMsRUFBYztRQUNyQixJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN6QixJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM1RixDQUFDO0lBRUQsSUFBSSxDQUFDLEtBQWMsRUFBRSxFQUFjO1FBQy9CLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNoQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDL0IsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7WUFDdEIsT0FBTztTQUNWO2FBQU07WUFDSCxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQ3hCO0lBQ0wsQ0FBQztJQUVELElBQUksQ0FBQyxLQUFhLEVBQUUsS0FBYSxFQUFFLEdBQVEsRUFBRSxLQUFZLEVBQUUsSUFBcUIsRUFBRSxFQUFzQztRQUNwSCxNQUFNLENBQUMsS0FBSyxDQUFDLDBFQUEwRSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztRQUM1SSw0QkFBNEI7UUFDNUIsaUVBQWlFO1FBQ2pFLElBQUk7UUFFSixJQUFJLElBQUksR0FBRyxHQUFHLENBQUM7UUFDZixJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDYix3QkFBd0I7WUFDeEIsSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1NBQ3BEO2FBQU0sSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRTtZQUM5QiwrQkFBK0I7WUFDL0IsSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7U0FDbkQ7UUFFRCxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUVELFNBQVMsQ0FBQyxLQUFhLEVBQUUsS0FBYSxFQUFFLEdBQVEsRUFBRSxLQUFZLEVBQUUsSUFBcUIsRUFBRSxFQUFzQztRQUN6SCxJQUFJLElBQUksR0FBRyxHQUFHLENBQUM7UUFDZixJQUFJLElBQUksR0FBRyxJQUFJLENBQUM7UUFFaEI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztXQTJCRztRQUNILE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBRUQsTUFBTSxDQUFDLEtBQWEsRUFBRSxLQUFhLEVBQUUsSUFBUyxFQUFFLEtBQVksRUFBRSxJQUFxQixFQUFFLEVBQXlCO1FBQzFHLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDUCxPQUFPLENBQUMsUUFBUSxDQUFDO2dCQUNiLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxJQUFJLEtBQUssQ0FBQyxrREFBa0QsQ0FBQyxDQUFDLENBQUM7WUFDbkYsQ0FBQyxDQUFDLENBQUM7U0FDTjtRQUVELElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksRUFDN0QsS0FBSyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztJQUN6QixDQUFDO0lBRUQsU0FBUyxDQUFDLEVBQVUsRUFBRSxHQUFxQztRQUN2RCxJQUFJLE1BQU0sR0FBRyxJQUFJLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUMzQixNQUFNLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzdDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQztRQUNyQixJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQztJQUMzQixDQUFDO0lBRUQsU0FBUyxDQUFDLEVBQVU7UUFDaEIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFHRCxVQUFVLENBQUMsRUFBZ0MsRUFBRSxNQUFlO1FBQ3hELElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQ3JCLE9BQU8sRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQ3JCO1FBRUQsSUFBSSxFQUFFLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUM7UUFDakMsSUFBSSxLQUFLLEdBQUcsVUFBVSxJQUFjO1lBQ2hDLEtBQUssSUFBSSxPQUFPLElBQUksSUFBSSxFQUFFO2dCQUN0QixJQUFJLEdBQUcsR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztnQkFDcEMsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFO29CQUNkLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQztvQkFDcEIsT0FBTyxJQUFJLENBQUM7aUJBQ2Y7YUFDSjtZQUNELE9BQU8sS0FBSyxDQUFDO1FBQ2pCLENBQUMsQ0FBQztRQUNGLGtCQUFrQjtRQUNsQixJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRTtZQUN4RCxPQUFPO1NBQ1Y7UUFDRCxlQUFlO1FBQ2YsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksSUFBSSxPQUFPLElBQUksQ0FBQyxZQUFZLEtBQUssVUFBVSxFQUFFO1lBQ2hFLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQztZQUNoQixJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFO2dCQUM1QixJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUU7b0JBQ1AsTUFBTSxDQUFDLEtBQUssQ0FBQywrQkFBK0IsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQ3pELEtBQUssQ0FBQyxjQUFjLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDO29CQUNqQyxPQUFPO2lCQUNWO2dCQUNELElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO29CQUN0QixNQUFNLENBQUMsS0FBSyxDQUFDLHNDQUFzQyxFQUFFLElBQUksQ0FBQyxDQUFDO29CQUMzRCxLQUFLLENBQUMsY0FBYyxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQztvQkFDakMsT0FBTztpQkFDVjtnQkFDRCxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUU7b0JBQ2YsT0FBTztpQkFDVjtxQkFBTTtvQkFDSCxLQUFLLENBQUMsY0FBYyxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQztvQkFDakMsT0FBTztpQkFDVjtZQUNMLENBQUMsQ0FBQyxDQUFDO1NBQ047YUFBTTtZQUNILEtBQUssQ0FBQyxjQUFjLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1NBQ3BDO0lBQ0wsQ0FBQztJQUVELFVBQVUsQ0FBQyxNQUFlO1FBQ3RCLElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDeEMsSUFBSSxjQUFjLEdBQUcsU0FBUyxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDbEQsSUFBSSxJQUFJLENBQUMsVUFBVSxJQUFJLGNBQWMsRUFBRTtZQUNuQyxJQUFJLENBQUMsVUFBVSxDQUFDLHVCQUF1QixFQUFFLENBQUM7WUFDMUMsSUFBSSxhQUFhLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQ3hELElBQUksYUFBYSxDQUFDLGNBQWMsR0FBRyxjQUFjLEVBQUU7Z0JBQy9DLE1BQU0sQ0FBQyxJQUFJLENBQUMsa0RBQWtELEVBQUUsU0FBUyxDQUFDLEVBQUUsRUFBRSxjQUFjLENBQUMsQ0FBQztnQkFDOUYsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUNwQixPQUFPO2FBQ1Y7U0FDSjtRQUVELGdDQUFnQztRQUNoQyxJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3RDLElBQUksTUFBTSxHQUFHLEtBQUssQ0FBQztRQUVuQixNQUFNLENBQUMsRUFBRSxDQUFDLFlBQVksRUFBRSxHQUFHLEVBQUU7WUFDekIsSUFBSSxNQUFNLEVBQUU7Z0JBQ1IsT0FBTzthQUNWO1lBQ0QsTUFBTSxHQUFHLElBQUksQ0FBQztZQUNkLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtnQkFDakIsSUFBSSxDQUFDLFVBQVUsQ0FBQyx1QkFBdUIsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDeEQ7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILE1BQU0sQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRTtZQUNwQixJQUFJLE1BQU0sRUFBRTtnQkFDUixPQUFPO2FBQ1Y7WUFDRCxNQUFNLEdBQUcsSUFBSSxDQUFDO1lBQ2QsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO2dCQUNqQixJQUFJLENBQUMsVUFBVSxDQUFDLHVCQUF1QixDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUN4RDtRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsY0FBYztRQUNkLE1BQU0sQ0FBQyxFQUFFLENBQUMsU0FBUyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUU7WUFDekIsSUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDO1lBQ2YsNEJBQTRCO1lBQzVCLDREQUE0RDtZQUM1RCxJQUFJO1lBRUosSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFO2dCQUNiLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQzNCO2lCQUFNLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUU7Z0JBQzlCLElBQUksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDbEMsdURBQXVEO2dCQUN2RCxvQ0FBb0M7Z0JBQ3BDLCtCQUErQjtnQkFDL0Isb0ZBQW9GO2dCQUNwRixjQUFjO2dCQUNkLElBQUk7YUFDUDtZQUNELElBQUksQ0FBQyxJQUFJLEVBQUU7Z0JBQ1AsMEJBQTBCO2dCQUMxQixPQUFPO2FBQ1Y7WUFFRCxpQkFBaUI7WUFDakIsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO2dCQUNoQixJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDakQsSUFBSSxDQUFDLFFBQVEsRUFBRTtvQkFDWCxNQUFNLENBQUMsS0FBSyxDQUFDLCtDQUErQyxDQUFDLENBQUM7b0JBQzlELE9BQU87aUJBQ1Y7YUFDSjtZQUVELElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3RDLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCO0lBQ3pCLENBQUM7SUFFRCxrQkFBa0IsQ0FBQyxHQUFRLEVBQUUsT0FBZ0IsRUFBRSxNQUFlO1FBQzFEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O1dBeUJHO1FBQ0gsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFFRCxlQUFlLENBQUMsSUFBUyxFQUFFLE9BQWdCO1FBQ3ZDLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDUCwwQkFBMEI7WUFDMUIsT0FBTztTQUNWO1FBRUQsaUJBQWlCO1FBQ2pCLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNoQixJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNqRCxJQUFJLENBQUMsUUFBUSxFQUFFO2dCQUNYLE1BQU0sQ0FBQyxLQUFLLENBQUMsK0NBQStDLENBQUMsQ0FBQztnQkFDOUQsT0FBTzthQUNWO1NBQ0o7UUFFRCxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxVQUFVLENBQUMsTUFBZTtRQUN0QixJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUNkLEdBQUcsR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQ3BCLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3BDLElBQUksT0FBTyxFQUFFO1lBQ1QsT0FBTyxPQUFPLENBQUM7U0FDbEI7UUFFRCxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxXQUFXLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUM5RCxNQUFNLENBQUMsS0FBSyxDQUFDLHdEQUF3RCxFQUFFLEdBQUcsQ0FBQyxXQUFXLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUUvRiwwQkFBMEI7UUFDMUIsTUFBTSxDQUFDLEVBQUUsQ0FBQyxZQUFZLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUN0RCxNQUFNLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQ2pELE9BQU8sQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzFELE9BQU8sQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUU7WUFDdkIsTUFBTSxDQUFDLEtBQUssQ0FBQyxtQ0FBbUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUMxRSw0Q0FBNEM7WUFDNUMsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO2dCQUNqQixJQUFJLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxHQUFHLEVBQUU7b0JBQ2hDLFNBQVMsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFO29CQUNyQixHQUFHLEVBQUUsR0FBRztvQkFDUixPQUFPLEVBQUUsTUFBTSxDQUFDLGFBQWEsQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUMsSUFBSTtpQkFDckUsQ0FBQyxDQUFDO2FBQ047WUFDRCxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsZ0JBQU0sQ0FBQyxZQUFZLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDdEQsQ0FBQyxDQUFDLENBQUM7UUFFSCxPQUFPLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQ3pCLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtnQkFDakIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUMxQztZQUNELElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxnQkFBTSxDQUFDLGNBQWMsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUN4RCxDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sT0FBTyxDQUFDO0lBQ25CLENBQUM7SUFFRCxjQUFjLENBQUMsR0FBZ0IsRUFBRSxPQUFnQixFQUFFLE1BQWM7UUFDN0QsV0FBVyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3pDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGdCQUFNLENBQUMsYUFBYSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRCxhQUFhLENBQUMsT0FBZ0IsRUFBRSxHQUFRO1FBQ3BDLGtHQUFrRztRQUNsRyxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMzQyxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ1AsTUFBTSxDQUFDLEtBQUssQ0FBQyxrQ0FBa0MsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDNUQsT0FBTztTQUNWO1FBQ0QsMERBQTBEO1FBQzFELElBQUksSUFBSSxDQUFDLFVBQVUsS0FBSyxLQUFLLElBQUksSUFBSSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLEVBQUU7WUFDaEUsTUFBTSxDQUFDLElBQUksQ0FBQyx3Q0FBd0MsRUFBRSxHQUFHLENBQUMsS0FBSyxFQUFFLFlBQVksRUFBRSxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDM0Ysa0RBQWtEO1lBQ2xELElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN6QyxPQUFPO1NBQ1Y7UUFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLGlCQUFpQixFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUU7WUFDckUsSUFBSSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFO2dCQUNqQixNQUFNLENBQUMsSUFBSSxDQUFDLGlDQUFpQyxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDMUQsT0FBTzthQUNWO1lBQ0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJO2dCQUFFLE9BQU87WUFDN0IsSUFBSSxDQUFDLElBQUk7Z0JBQUUsSUFBSSxHQUFHLEVBQUUsQ0FBQztZQUNyQixJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFO2dCQUNyQixJQUFJLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQzthQUNuQjtZQUNELElBQUksSUFBSSxHQUFvQjtnQkFDeEIsSUFBSSxFQUFFLFVBQVU7YUFDbkIsQ0FBQztZQUVGLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQ2pEO1lBQ0EsQ0FBQyxDQUFDLENBQUM7UUFDWCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRDs7T0FFRztJQUNILGVBQWUsQ0FBQyxLQUFhO1FBQ3pCLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDUixPQUFPLElBQUksQ0FBQztTQUNmO1FBQ0QsSUFBSSxHQUFHLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM3QixJQUFJLEdBQUcsR0FBRyxDQUFDLEVBQUU7WUFDVCxPQUFPLElBQUksQ0FBQztTQUNmO1FBQ0QsT0FBTyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQsYUFBYSxDQUFDLE9BQWdCLEVBQUUsR0FBUTtRQUNwQyxJQUFJLEdBQUcsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUM5QixJQUFJLENBQUMsR0FBRyxFQUFFO1lBQ04sTUFBTSxDQUFDLEtBQUssQ0FBQyxnREFBZ0QsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ2xGLE9BQU8sS0FBSyxDQUFDO1NBQ2hCO1FBRUQsSUFBSSxNQUFNLENBQUM7UUFFWCxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ1YsTUFBTSxDQUFDLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1lBQ3hDLE9BQU8sS0FBSyxDQUFDO1NBQ2hCO1FBRUQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUU7WUFDeEIsTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3BDLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRTtnQkFDVixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUM3QixPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQzthQUNqQztpQkFBTTtnQkFDSCxNQUFNLENBQUMsS0FBSyxDQUFDLDRDQUE0QyxFQUFFLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDdkUsT0FBTyxLQUFLLENBQUM7YUFDaEI7U0FDSjthQUFNO1lBQ0gsTUFBTSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDbEM7UUFFRCxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUU7WUFDeEIsTUFBTSxDQUFDLEtBQUssQ0FBQyxrREFBa0QsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3BGLE9BQU8sS0FBSyxDQUFDO1NBQ2hCO1FBRUQsT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUUzQixJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN2QyxJQUFJLEtBQUssQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDO1lBQzdCLE9BQU8sR0FBRyxLQUFLLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRTNDLE9BQU8sTUFBTSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDN0MsQ0FBQztDQUVKO0FBNWNELGdEQTRjQztBQUVELElBQUksWUFBWSxHQUFHLFVBQVUsR0FBZ0IsRUFBRSxJQUFTO0lBQ3BELElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDL0IsSUFBSSxDQUFDLFNBQVMsRUFBRTtRQUNaLE9BQU8sbUJBQW1CLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO0tBQ3pDO0lBRUQsSUFBSSxPQUFPLFNBQVMsS0FBSyxVQUFVLEVBQUU7UUFDakMsT0FBTyxTQUFTLENBQUM7S0FDcEI7SUFFRCxJQUFJLFNBQVMsR0FBRyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDbkMsT0FBTyxJQUFJLFNBQVMsQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFLFNBQVMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDckUsQ0FBQyxDQUFDO0FBRUYsSUFBSSxtQkFBbUIsR0FBRyxVQUFVLEdBQWdCLEVBQUUsSUFBeUI7SUFDM0UsSUFBSSxTQUFTLEdBQUcsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ25DLE9BQU8sSUFBSSwyQkFBWSxDQUFDLFNBQVMsQ0FBQyxVQUFVLEVBQUUsU0FBUyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztBQUN4RSxDQUFDLENBQUMifQ==
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DictionaryComponent = void 0;
|
|
4
|
+
const path = require("path");
|
|
5
|
+
const Loader = require("@bigtyphoon/melo-loader");
|
|
6
|
+
const melo_loader_1 = require("@bigtyphoon/melo-loader");
|
|
7
|
+
const pathUtil = require("../util/pathUtil");
|
|
8
|
+
const crypto = require("crypto");
|
|
9
|
+
const melo_rpc_1 = require("@bigtyphoon/melo-rpc");
|
|
10
|
+
function canResolve(path) {
|
|
11
|
+
try {
|
|
12
|
+
require.resolve(path);
|
|
13
|
+
}
|
|
14
|
+
catch (err) {
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
return true;
|
|
18
|
+
}
|
|
19
|
+
class DictionaryComponent {
|
|
20
|
+
constructor(app, opts) {
|
|
21
|
+
this.dict = {};
|
|
22
|
+
this.abbrs = {};
|
|
23
|
+
this.version = '';
|
|
24
|
+
this.name = '__dictionary__';
|
|
25
|
+
this.app = app;
|
|
26
|
+
// Set user dictionary
|
|
27
|
+
let p = path.join(app.getBase(), '/config/dictionary');
|
|
28
|
+
if (!!opts && !!opts.dict) {
|
|
29
|
+
p = opts.dict;
|
|
30
|
+
}
|
|
31
|
+
if (!!opts) {
|
|
32
|
+
this.ignoreAutoRouter = !!opts.ignoreAutoRouter;
|
|
33
|
+
}
|
|
34
|
+
if (canResolve(p)) {
|
|
35
|
+
this.userDicPath = p;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
start(cb) {
|
|
39
|
+
let servers = this.app.get('servers');
|
|
40
|
+
let routes = [];
|
|
41
|
+
if (!this.ignoreAutoRouter) {
|
|
42
|
+
// Load all the handler files
|
|
43
|
+
for (let serverType in servers) {
|
|
44
|
+
let p = pathUtil.getHandlerPath(this.app.getBase(), serverType);
|
|
45
|
+
if (!p) {
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
let handlers = Loader.load(p, this.app, false, false, melo_loader_1.LoaderPathType.PINUS_HANDLER);
|
|
49
|
+
for (let name in handlers) {
|
|
50
|
+
let handler = handlers[name];
|
|
51
|
+
let proto = (0, melo_rpc_1.listEs6ClassMethods)(handler);
|
|
52
|
+
for (let key of proto) {
|
|
53
|
+
routes.push(serverType + '.' + name + '.' + key);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
// Sort the route to make sure all the routers abbr are the same in all the servers
|
|
59
|
+
routes.sort();
|
|
60
|
+
console.warn('after start all server, use route dictionary :\n', routes.join('\n'));
|
|
61
|
+
let abbr;
|
|
62
|
+
let i;
|
|
63
|
+
for (i = 0; i < routes.length; i++) {
|
|
64
|
+
abbr = i + 1;
|
|
65
|
+
this.abbrs[abbr] = routes[i];
|
|
66
|
+
this.dict[routes[i]] = abbr;
|
|
67
|
+
}
|
|
68
|
+
// Load user dictionary
|
|
69
|
+
if (!!this.userDicPath) {
|
|
70
|
+
let userDic = require(this.userDicPath);
|
|
71
|
+
abbr = routes.length + 1;
|
|
72
|
+
for (i = 0; i < userDic.length; i++) {
|
|
73
|
+
let route = userDic[i];
|
|
74
|
+
this.abbrs[abbr] = route;
|
|
75
|
+
this.dict[route] = abbr;
|
|
76
|
+
abbr++;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
this.version = crypto.createHash('md5').update(JSON.stringify(this.dict)).digest('base64');
|
|
80
|
+
process.nextTick(cb);
|
|
81
|
+
}
|
|
82
|
+
getDict() {
|
|
83
|
+
return this.dict;
|
|
84
|
+
}
|
|
85
|
+
getAbbrs() {
|
|
86
|
+
return this.abbrs;
|
|
87
|
+
}
|
|
88
|
+
getVersion() {
|
|
89
|
+
return this.version;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
exports.DictionaryComponent = DictionaryComponent;
|
|
93
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGljdGlvbmFyeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9jb21wb25lbnRzL2RpY3Rpb25hcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkJBQTZCO0FBQzdCLGtEQUFrRDtBQUNsRCx5REFBeUQ7QUFDekQsNkNBQTZDO0FBQzdDLGlDQUFpQztBQUdqQyxtREFBMkQ7QUFXM0QsU0FBUyxVQUFVLENBQUMsSUFBWTtJQUM1QixJQUFJO1FBQ0EsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUN6QjtJQUFDLE9BQU8sR0FBRyxFQUFFO1FBQ1YsT0FBTyxLQUFLLENBQUM7S0FDaEI7SUFDRCxPQUFPLElBQUksQ0FBQztBQUNoQixDQUFDO0FBRUQsTUFBYSxtQkFBbUI7SUFTNUIsWUFBWSxHQUFnQixFQUFFLElBQWdDO1FBUDlELFNBQUksR0FBOEIsRUFBRSxDQUFDO1FBQ3JDLFVBQUssR0FBOEIsRUFBRSxDQUFDO1FBRXRDLFlBQU8sR0FBRyxFQUFFLENBQUM7UUFDYixTQUFJLEdBQUcsZ0JBQWdCLENBQUM7UUFJcEIsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7UUFFZixzQkFBc0I7UUFDdEIsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLEVBQUUsb0JBQW9CLENBQUMsQ0FBQztRQUN2RCxJQUFJLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDdkIsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7U0FDakI7UUFDRCxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUU7WUFDUixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztTQUNuRDtRQUNELElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ2YsSUFBSSxDQUFDLFdB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
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MasterComponent = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Component for master.
|
|
6
|
+
*/
|
|
7
|
+
const master_1 = require("../master/master");
|
|
8
|
+
/**
|
|
9
|
+
* Master component class
|
|
10
|
+
*
|
|
11
|
+
* @param {Object} app current application context
|
|
12
|
+
*/
|
|
13
|
+
class MasterComponent {
|
|
14
|
+
constructor(app, opts) {
|
|
15
|
+
this.name = '__master__';
|
|
16
|
+
this.master = new master_1.MasterServer(app, opts);
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Component lifecycle function
|
|
20
|
+
*
|
|
21
|
+
* @param {Function} cb
|
|
22
|
+
* @return {Void}
|
|
23
|
+
*/
|
|
24
|
+
start(cb) {
|
|
25
|
+
this.master.start(cb);
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Component lifecycle function
|
|
29
|
+
*
|
|
30
|
+
* @param {Boolean} force whether stop the component immediately
|
|
31
|
+
* @param {Function} cb
|
|
32
|
+
* @return {Void}
|
|
33
|
+
*/
|
|
34
|
+
stop(force, cb) {
|
|
35
|
+
this.master.stop(cb);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
exports.MasterComponent = MasterComponent;
|
|
39
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFzdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL2NvbXBvbmVudHMvbWFzdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBOztHQUVHO0FBQ0gsNkNBQXFFO0FBSXJFOzs7O0VBSUU7QUFDRixNQUFhLGVBQWU7SUFHeEIsWUFBWSxHQUFnQixFQUFFLElBQXlCO1FBRnZELFNBQUksR0FBRyxZQUFZLENBQUM7UUFHaEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLHFCQUFZLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILEtBQUssQ0FBQyxFQUF5QjtRQUMzQixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsSUFBSSxDQUFDLEtBQWMsRUFBRSxFQUF5QjtRQUMxQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUN6QixDQUFDO0NBRUo7QUE1QkQsMENBNEJDIn0=
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MonitorComponent = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Component for monitor.
|
|
6
|
+
* Load and start monitor client.
|
|
7
|
+
*/
|
|
8
|
+
const monitor_1 = require("../monitor/monitor");
|
|
9
|
+
class MonitorComponent {
|
|
10
|
+
constructor(app, opts) {
|
|
11
|
+
this.name = '__monitor__';
|
|
12
|
+
this.monitor = new monitor_1.Monitor(app, opts);
|
|
13
|
+
}
|
|
14
|
+
start(cb) {
|
|
15
|
+
this.monitor.start(cb);
|
|
16
|
+
}
|
|
17
|
+
stop(force, cb) {
|
|
18
|
+
this.monitor.stop(cb);
|
|
19
|
+
}
|
|
20
|
+
reconnect(masterInfo) {
|
|
21
|
+
this.monitor.reconnect(masterInfo);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
exports.MonitorComponent = MonitorComponent;
|
|
25
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9uaXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9jb21wb25lbnRzL21vbml0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUE7OztHQUdHO0FBQ0gsZ0RBQTZEO0FBTzdELE1BQWEsZ0JBQWdCO0lBRXpCLFlBQVksR0FBZ0IsRUFBRSxJQUFzQjtRQUlwRCxTQUFJLEdBQUcsYUFBYSxDQUFDO1FBSGpCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxpQkFBTyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBR0QsS0FBSyxDQUFDLEVBQWM7UUFDaEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDM0IsQ0FBQztJQUVELElBQUksQ0FBQyxLQUFjLEVBQUUsRUFBYztRQUMvQixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBRUQsU0FBUyxDQUFDLFVBQXNCO1FBQzVCLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7Q0FDSjtBQWxCRCw0Q0FrQkMifQ==
|