@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,610 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.FrontendSession = exports.Session = exports.SessionService = void 0;
|
|
4
|
+
const events_1 = require("events");
|
|
5
|
+
const melo_logger_1 = require("@bigtyphoon/melo-logger");
|
|
6
|
+
const utils = require("../../util/utils");
|
|
7
|
+
const path = require("path");
|
|
8
|
+
let logger = (0, melo_logger_1.getLogger)('melo', path.basename(__filename));
|
|
9
|
+
let FRONTEND_SESSION_FIELDS = ['id', 'frontendId', 'uid', '__sessionService__'];
|
|
10
|
+
let EXPORTED_SESSION_FIELDS = ['id', 'frontendId', 'uid', 'settings'];
|
|
11
|
+
let ST_INITED = 0;
|
|
12
|
+
let ST_CLOSED = 1;
|
|
13
|
+
/**
|
|
14
|
+
* Session service maintains the internal session for each client connection.
|
|
15
|
+
*
|
|
16
|
+
* Session service is created by session component and is only
|
|
17
|
+
* <b>available</b> in frontend servers. You can access the service by
|
|
18
|
+
* `app.get('sessionService')` or `app.sessionService` in frontend servers.
|
|
19
|
+
*
|
|
20
|
+
* @param {Object} opts constructor parameters
|
|
21
|
+
* @class
|
|
22
|
+
* @constructor
|
|
23
|
+
*/
|
|
24
|
+
class SessionService {
|
|
25
|
+
constructor(opts) {
|
|
26
|
+
this.akick = utils.promisify(this.kick.bind(this));
|
|
27
|
+
this.akickBySessionId = utils.promisify(this.kickBySessionId.bind(this));
|
|
28
|
+
this.abind = utils.promisify(this.bind.bind(this));
|
|
29
|
+
this.aunbind = utils.promisify(this.unbind.bind(this));
|
|
30
|
+
this.aimport = utils.promisify(this.import.bind(this));
|
|
31
|
+
this.aimportAll = utils.promisify(this.importAll.bind(this));
|
|
32
|
+
opts = opts || {};
|
|
33
|
+
this.singleSession = opts.singleSession;
|
|
34
|
+
this.sessions = {}; // sid -> session
|
|
35
|
+
this.uidMap = {}; // uid -> sessions
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Create and return internal session.
|
|
39
|
+
*
|
|
40
|
+
* @param {Integer} sid uniqe id for the internal session
|
|
41
|
+
* @param {String} frontendId frontend server in which the internal session is created
|
|
42
|
+
* @param {Object} socket the underlying socket would be held by the internal session
|
|
43
|
+
*
|
|
44
|
+
* @return {Session}
|
|
45
|
+
*
|
|
46
|
+
* @memberOf SessionService
|
|
47
|
+
* @api private
|
|
48
|
+
*/
|
|
49
|
+
create(sid, frontendId, socket) {
|
|
50
|
+
let session = new Session(sid, frontendId, socket, this);
|
|
51
|
+
this.sessions[session.id] = session;
|
|
52
|
+
return session;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Bind the session with a user id.
|
|
56
|
+
*
|
|
57
|
+
* @memberOf SessionService
|
|
58
|
+
* @api private
|
|
59
|
+
*/
|
|
60
|
+
bind(sid, uid, cb) {
|
|
61
|
+
let session = this.sessions[sid];
|
|
62
|
+
if (!session) {
|
|
63
|
+
process.nextTick(function () {
|
|
64
|
+
cb(new Error('session does not exist, sid: ' + sid));
|
|
65
|
+
});
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
if (session.uid) {
|
|
69
|
+
if (session.uid === uid) {
|
|
70
|
+
// already bound with the same uid
|
|
71
|
+
cb(null);
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
// already bound with other uid
|
|
75
|
+
process.nextTick(function () {
|
|
76
|
+
cb(new Error('session has already bound with ' + session.uid));
|
|
77
|
+
});
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
let sessions = this.uidMap[uid];
|
|
81
|
+
if (!!this.singleSession && !!sessions) {
|
|
82
|
+
process.nextTick(function () {
|
|
83
|
+
cb(new Error('singleSession is enabled, and session has already bound with uid: ' + uid));
|
|
84
|
+
});
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
if (!sessions) {
|
|
88
|
+
sessions = this.uidMap[uid] = [];
|
|
89
|
+
}
|
|
90
|
+
for (let i = 0, l = sessions.length; i < l; i++) {
|
|
91
|
+
// session has binded with the uid
|
|
92
|
+
if (sessions[i].id === session.id) {
|
|
93
|
+
process.nextTick(cb);
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
sessions.push(session);
|
|
98
|
+
session.bind(uid);
|
|
99
|
+
if (cb) {
|
|
100
|
+
process.nextTick(cb);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Unbind a session with the user id.
|
|
105
|
+
*
|
|
106
|
+
* @memberOf SessionService
|
|
107
|
+
* @api private
|
|
108
|
+
*/
|
|
109
|
+
unbind(sid, uid, cb) {
|
|
110
|
+
let session = this.sessions[sid];
|
|
111
|
+
if (!session) {
|
|
112
|
+
process.nextTick(function () {
|
|
113
|
+
cb(new Error('session does not exist, sid: ' + sid));
|
|
114
|
+
});
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
if (!session.uid || session.uid !== uid) {
|
|
118
|
+
process.nextTick(function () {
|
|
119
|
+
cb(new Error('session has not bind with ' + session.uid));
|
|
120
|
+
});
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
let sessions = this.uidMap[uid], sess;
|
|
124
|
+
if (sessions) {
|
|
125
|
+
for (let i = 0, l = sessions.length; i < l; i++) {
|
|
126
|
+
sess = sessions[i];
|
|
127
|
+
if (sess.id === sid) {
|
|
128
|
+
sessions.splice(i, 1);
|
|
129
|
+
break;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
if (sessions.length === 0) {
|
|
133
|
+
delete this.uidMap[uid];
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
session.unbind(uid);
|
|
137
|
+
if (cb) {
|
|
138
|
+
process.nextTick(cb);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Get session by id.
|
|
143
|
+
*
|
|
144
|
+
* @param {Number} id The session id
|
|
145
|
+
* @return {Session}
|
|
146
|
+
*
|
|
147
|
+
* @memberOf SessionService
|
|
148
|
+
* @api private
|
|
149
|
+
*/
|
|
150
|
+
get(sid) {
|
|
151
|
+
return this.sessions[sid];
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Get sessions by userId.
|
|
155
|
+
*
|
|
156
|
+
* @param {Number} uid User id associated with the session
|
|
157
|
+
* @return {Array} list of session binded with the uid
|
|
158
|
+
*
|
|
159
|
+
* @memberOf SessionService
|
|
160
|
+
* @api private
|
|
161
|
+
*/
|
|
162
|
+
getByUid(uid) {
|
|
163
|
+
return this.uidMap[uid];
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Remove session by key.
|
|
167
|
+
*
|
|
168
|
+
* @param {Number} sid The session id
|
|
169
|
+
*
|
|
170
|
+
* @memberOf SessionService
|
|
171
|
+
* @api private
|
|
172
|
+
*/
|
|
173
|
+
remove(sid) {
|
|
174
|
+
let session = this.sessions[sid];
|
|
175
|
+
if (session) {
|
|
176
|
+
let uid = session.uid;
|
|
177
|
+
delete this.sessions[session.id];
|
|
178
|
+
let sessions = this.uidMap[uid];
|
|
179
|
+
if (!sessions) {
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
for (let i = 0, l = sessions.length; i < l; i++) {
|
|
183
|
+
if (sessions[i].id === sid) {
|
|
184
|
+
sessions.splice(i, 1);
|
|
185
|
+
if (sessions.length === 0) {
|
|
186
|
+
delete this.uidMap[uid];
|
|
187
|
+
}
|
|
188
|
+
break;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Import the key/value into session.
|
|
195
|
+
*
|
|
196
|
+
* @api private
|
|
197
|
+
*/
|
|
198
|
+
import(sid, key, value, cb) {
|
|
199
|
+
let session = this.sessions[sid];
|
|
200
|
+
if (!session) {
|
|
201
|
+
utils.invokeCallback(cb, new Error('session does not exist, sid: ' + sid));
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
session.set(key, value);
|
|
205
|
+
utils.invokeCallback(cb);
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Import new value for the existed session.
|
|
209
|
+
*
|
|
210
|
+
* @memberOf SessionService
|
|
211
|
+
* @api private
|
|
212
|
+
*/
|
|
213
|
+
importAll(sid, settings, cb) {
|
|
214
|
+
let session = this.sessions[sid];
|
|
215
|
+
if (!session) {
|
|
216
|
+
utils.invokeCallback(cb, new Error('session does not exist, sid: ' + sid));
|
|
217
|
+
return;
|
|
218
|
+
}
|
|
219
|
+
for (let f in settings) {
|
|
220
|
+
session.set(f, settings[f]);
|
|
221
|
+
}
|
|
222
|
+
utils.invokeCallback(cb);
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Kick all the session offline under the user id.
|
|
226
|
+
*
|
|
227
|
+
* @param {Number} uid user id asscociated with the session
|
|
228
|
+
* @param {Function} cb callback function
|
|
229
|
+
*
|
|
230
|
+
* @memberOf SessionService
|
|
231
|
+
*/
|
|
232
|
+
kick(uid, reason, cb) {
|
|
233
|
+
// compatible for old kick(uid, cb);
|
|
234
|
+
if (typeof reason === 'function') {
|
|
235
|
+
cb = reason;
|
|
236
|
+
reason = 'kick';
|
|
237
|
+
}
|
|
238
|
+
let sessions = this.getByUid(uid);
|
|
239
|
+
if (sessions) {
|
|
240
|
+
// notify client
|
|
241
|
+
let sids = [];
|
|
242
|
+
let self = this;
|
|
243
|
+
sessions.forEach(function (session) {
|
|
244
|
+
sids.push(session.id);
|
|
245
|
+
});
|
|
246
|
+
sids.forEach(function (sid) {
|
|
247
|
+
self.sessions[sid].closed(reason);
|
|
248
|
+
});
|
|
249
|
+
process.nextTick(function () {
|
|
250
|
+
utils.invokeCallback(cb);
|
|
251
|
+
});
|
|
252
|
+
}
|
|
253
|
+
else {
|
|
254
|
+
process.nextTick(function () {
|
|
255
|
+
utils.invokeCallback(cb);
|
|
256
|
+
});
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Kick a user offline by session id.
|
|
261
|
+
*
|
|
262
|
+
* @param {Number} sid session id
|
|
263
|
+
* @param {Function} cb callback function
|
|
264
|
+
*
|
|
265
|
+
* @memberOf SessionService
|
|
266
|
+
*/
|
|
267
|
+
kickBySessionId(sid, reason, cb) {
|
|
268
|
+
if (typeof reason === 'function') {
|
|
269
|
+
cb = reason;
|
|
270
|
+
reason = 'kick';
|
|
271
|
+
}
|
|
272
|
+
let session = this.get(sid);
|
|
273
|
+
if (session) {
|
|
274
|
+
// notify client
|
|
275
|
+
session.closed(reason);
|
|
276
|
+
process.nextTick(function () {
|
|
277
|
+
utils.invokeCallback(cb);
|
|
278
|
+
});
|
|
279
|
+
}
|
|
280
|
+
else {
|
|
281
|
+
process.nextTick(function () {
|
|
282
|
+
utils.invokeCallback(cb);
|
|
283
|
+
});
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Get client remote address by session id.
|
|
288
|
+
*
|
|
289
|
+
* @param {Number} sid session id
|
|
290
|
+
* @return {Object} remote address of client
|
|
291
|
+
*
|
|
292
|
+
* @memberOf SessionService
|
|
293
|
+
*/
|
|
294
|
+
getClientAddressBySessionId(sid) {
|
|
295
|
+
let session = this.get(sid);
|
|
296
|
+
if (session) {
|
|
297
|
+
let socket = session.__socket__;
|
|
298
|
+
return socket.remoteAddress;
|
|
299
|
+
}
|
|
300
|
+
else {
|
|
301
|
+
return null;
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* Send message to the client by session id.
|
|
306
|
+
*
|
|
307
|
+
* @param {String} sid session id
|
|
308
|
+
* @param {Object} msg message to send
|
|
309
|
+
*
|
|
310
|
+
* @memberOf SessionService
|
|
311
|
+
* @api private
|
|
312
|
+
*/
|
|
313
|
+
sendMessage(sid, msg) {
|
|
314
|
+
let session = this.sessions[sid];
|
|
315
|
+
if (!session) {
|
|
316
|
+
logger.debug('Fail to send message for non-existing session, sid: ' + sid + ' msg: ' + msg);
|
|
317
|
+
return false;
|
|
318
|
+
}
|
|
319
|
+
return send(this, session, msg);
|
|
320
|
+
}
|
|
321
|
+
/**
|
|
322
|
+
* Send message to the client by user id.
|
|
323
|
+
*
|
|
324
|
+
* @param {String} uid userId
|
|
325
|
+
* @param {Object} msg message to send
|
|
326
|
+
*
|
|
327
|
+
* @memberOf SessionService
|
|
328
|
+
* @api private
|
|
329
|
+
*/
|
|
330
|
+
sendMessageByUid(uid, msg) {
|
|
331
|
+
let sessions = this.uidMap[uid];
|
|
332
|
+
if (!sessions) {
|
|
333
|
+
logger.debug('fail to send message by uid for non-existing session. uid: %j', uid);
|
|
334
|
+
return false;
|
|
335
|
+
}
|
|
336
|
+
for (let i = 0, l = sessions.length; i < l; i++) {
|
|
337
|
+
send(this, sessions[i], msg);
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
/**
|
|
341
|
+
* Iterate all the session in the session service.
|
|
342
|
+
*
|
|
343
|
+
* @param {Function} cb callback function to fetch session
|
|
344
|
+
* @api private
|
|
345
|
+
*/
|
|
346
|
+
forEachSession(cb) {
|
|
347
|
+
for (let sid in this.sessions) {
|
|
348
|
+
cb(this.sessions[sid]);
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
/**
|
|
352
|
+
* Iterate all the binded session in the session service.
|
|
353
|
+
*
|
|
354
|
+
* @param {Function} cb callback function to fetch session
|
|
355
|
+
* @api private
|
|
356
|
+
*/
|
|
357
|
+
forEachBindedSession(cb) {
|
|
358
|
+
let i, l, sessions;
|
|
359
|
+
for (let uid in this.uidMap) {
|
|
360
|
+
sessions = this.uidMap[uid];
|
|
361
|
+
for (i = 0, l = sessions.length; i < l; i++) {
|
|
362
|
+
cb(sessions[i]);
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
/**
|
|
367
|
+
* Get sessions' quantity in specified server.
|
|
368
|
+
*
|
|
369
|
+
*/
|
|
370
|
+
getSessionsCount() {
|
|
371
|
+
return Object.keys(this.sessions).length;
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
exports.SessionService = SessionService;
|
|
375
|
+
/**
|
|
376
|
+
* Send message to the client that associated with the session.
|
|
377
|
+
*
|
|
378
|
+
* @api private
|
|
379
|
+
*/
|
|
380
|
+
let send = function (service, session, msg) {
|
|
381
|
+
session.send(msg);
|
|
382
|
+
return true;
|
|
383
|
+
};
|
|
384
|
+
/**
|
|
385
|
+
* Session maintains the relationship between client connection and user information.
|
|
386
|
+
* There is a session associated with each client connection. And it should bind to a
|
|
387
|
+
* user id after the client passes the identification.
|
|
388
|
+
*
|
|
389
|
+
* Session is created in frontend server and should not be accessed in handler.
|
|
390
|
+
* There is a proxy class called BackendSession in backend servers and FrontendSession
|
|
391
|
+
* in frontend servers.
|
|
392
|
+
*/
|
|
393
|
+
class Session extends events_1.EventEmitter {
|
|
394
|
+
constructor(sid, frontendId, socket, service) {
|
|
395
|
+
super();
|
|
396
|
+
this.id = sid; // r
|
|
397
|
+
this.frontendId = frontendId; // r
|
|
398
|
+
this.uid = null; // r
|
|
399
|
+
this.settings = {};
|
|
400
|
+
// private
|
|
401
|
+
this.__socket__ = socket;
|
|
402
|
+
this.__sessionService__ = service;
|
|
403
|
+
this.__state__ = ST_INITED;
|
|
404
|
+
}
|
|
405
|
+
/*
|
|
406
|
+
* Export current session as frontend session.
|
|
407
|
+
*/
|
|
408
|
+
toFrontendSession() {
|
|
409
|
+
return new FrontendSession(this);
|
|
410
|
+
}
|
|
411
|
+
/**
|
|
412
|
+
* Bind the session with the the uid.
|
|
413
|
+
*
|
|
414
|
+
* @param {Number} uid User id
|
|
415
|
+
* @api public
|
|
416
|
+
*/
|
|
417
|
+
bind(uid) {
|
|
418
|
+
this.uid = uid;
|
|
419
|
+
this.emit('bind', uid);
|
|
420
|
+
}
|
|
421
|
+
/**
|
|
422
|
+
* Unbind the session with the the uid.
|
|
423
|
+
*
|
|
424
|
+
* @param {Number} uid User id
|
|
425
|
+
* @api private
|
|
426
|
+
*/
|
|
427
|
+
unbind(uid) {
|
|
428
|
+
this.uid = null;
|
|
429
|
+
this.emit('unbind', uid);
|
|
430
|
+
}
|
|
431
|
+
set(keyOrValues, value) {
|
|
432
|
+
if (utils.isObject(keyOrValues)) {
|
|
433
|
+
let values = keyOrValues;
|
|
434
|
+
for (let i in values) {
|
|
435
|
+
this.settings[i] = values[i];
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
else {
|
|
439
|
+
this.settings[keyOrValues] = value;
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
/**
|
|
443
|
+
* Remove value from the session.
|
|
444
|
+
*
|
|
445
|
+
* @param {String} key session key
|
|
446
|
+
* @api public
|
|
447
|
+
*/
|
|
448
|
+
remove(key) {
|
|
449
|
+
delete this.settings[key];
|
|
450
|
+
}
|
|
451
|
+
/**
|
|
452
|
+
* Get value from the session.
|
|
453
|
+
*
|
|
454
|
+
* @param {String} key session key
|
|
455
|
+
* @return {Object} value associated with session key
|
|
456
|
+
* @api public
|
|
457
|
+
*/
|
|
458
|
+
get(key) {
|
|
459
|
+
return this.settings[key];
|
|
460
|
+
}
|
|
461
|
+
/**
|
|
462
|
+
* Send message to the session.
|
|
463
|
+
*
|
|
464
|
+
* @param {Object} msg final message sent to client
|
|
465
|
+
*/
|
|
466
|
+
send(msg) {
|
|
467
|
+
this.__socket__.send(msg);
|
|
468
|
+
}
|
|
469
|
+
/**
|
|
470
|
+
* Send message to the session in batch.
|
|
471
|
+
*
|
|
472
|
+
* @param {Array} msgs list of message
|
|
473
|
+
*/
|
|
474
|
+
sendBatch(msgs) {
|
|
475
|
+
this.__socket__.sendBatch(msgs);
|
|
476
|
+
}
|
|
477
|
+
/**
|
|
478
|
+
* Closed callback for the session which would disconnect client in next tick.
|
|
479
|
+
*
|
|
480
|
+
* @api public
|
|
481
|
+
*/
|
|
482
|
+
closed(reason) {
|
|
483
|
+
if (this.__state__ === ST_CLOSED) {
|
|
484
|
+
return;
|
|
485
|
+
}
|
|
486
|
+
logger.debug('session on [%s] is closed with session id: %s,uid:%s,reason:%j', this.frontendId, this.id, this.uid, reason);
|
|
487
|
+
this.__state__ = ST_CLOSED;
|
|
488
|
+
this.__sessionService__.remove(this.id);
|
|
489
|
+
this.emit('closed', this.toFrontendSession(), reason);
|
|
490
|
+
this.__socket__.emit('closing', reason);
|
|
491
|
+
let self = this;
|
|
492
|
+
// give a chance to send disconnect message to client
|
|
493
|
+
process.nextTick(function () {
|
|
494
|
+
self.__socket__.disconnect();
|
|
495
|
+
});
|
|
496
|
+
}
|
|
497
|
+
/**
|
|
498
|
+
* 是否在线
|
|
499
|
+
*/
|
|
500
|
+
get isOnline() {
|
|
501
|
+
return this.__state__ !== ST_CLOSED;
|
|
502
|
+
}
|
|
503
|
+
/**
|
|
504
|
+
* 获取客户端的地址
|
|
505
|
+
*/
|
|
506
|
+
get remoteAddress() {
|
|
507
|
+
return this.__socket__.remoteAddress;
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
exports.Session = Session;
|
|
511
|
+
/**
|
|
512
|
+
* Frontend session for frontend server.
|
|
513
|
+
*/
|
|
514
|
+
class FrontendSession extends events_1.EventEmitter {
|
|
515
|
+
constructor(session) {
|
|
516
|
+
super();
|
|
517
|
+
clone(session, this, FRONTEND_SESSION_FIELDS);
|
|
518
|
+
// deep copy for settings
|
|
519
|
+
this.settings = dclone(session.settings);
|
|
520
|
+
this.__session__ = session;
|
|
521
|
+
}
|
|
522
|
+
bind(uid, cb) {
|
|
523
|
+
let self = this;
|
|
524
|
+
this.__sessionService__.bind(this.id, uid, function (err) {
|
|
525
|
+
if (!err) {
|
|
526
|
+
self.uid = uid;
|
|
527
|
+
}
|
|
528
|
+
utils.invokeCallback(cb, err);
|
|
529
|
+
});
|
|
530
|
+
}
|
|
531
|
+
unbind(uid, cb) {
|
|
532
|
+
let self = this;
|
|
533
|
+
this.__sessionService__.unbind(this.id, uid, function (err) {
|
|
534
|
+
if (!err) {
|
|
535
|
+
self.uid = null;
|
|
536
|
+
}
|
|
537
|
+
utils.invokeCallback(cb, err);
|
|
538
|
+
});
|
|
539
|
+
}
|
|
540
|
+
set(key, value) {
|
|
541
|
+
this.settings[key] = value;
|
|
542
|
+
}
|
|
543
|
+
get(key) {
|
|
544
|
+
return this.settings[key];
|
|
545
|
+
}
|
|
546
|
+
push(key, cb) {
|
|
547
|
+
this.__sessionService__.import(this.id, key, this.get(key), cb);
|
|
548
|
+
}
|
|
549
|
+
pushAll(cb) {
|
|
550
|
+
this.__sessionService__.importAll(this.id, this.settings, cb);
|
|
551
|
+
}
|
|
552
|
+
on(event, listener) {
|
|
553
|
+
this.__session__.on(event, listener);
|
|
554
|
+
return super.on(event, listener);
|
|
555
|
+
}
|
|
556
|
+
abind(uid) {
|
|
557
|
+
return new Promise((resolve, reject) => this.bind(uid, (err, ret) => err ? reject(err) : resolve(ret)));
|
|
558
|
+
}
|
|
559
|
+
aunbind(uid) {
|
|
560
|
+
return new Promise((resolve, reject) => this.unbind(uid, (err, ret) => err ? reject(err) : resolve(ret)));
|
|
561
|
+
}
|
|
562
|
+
apush(key) {
|
|
563
|
+
return new Promise((resolve, reject) => this.push(key, (err, ret) => err ? reject(err) : resolve(ret)));
|
|
564
|
+
}
|
|
565
|
+
apushAll() {
|
|
566
|
+
return new Promise((resolve, reject) => this.pushAll((err, ret) => err ? reject(err) : resolve(ret)));
|
|
567
|
+
}
|
|
568
|
+
// abind = utils.promisify(this.bind.bind(this));
|
|
569
|
+
// aunbind = utils.promisify(this.unbind.bind(this));
|
|
570
|
+
// apush = utils.promisify(this.push.bind(this));
|
|
571
|
+
// apushAll = utils.promisify(this.pushAll.bind(this));
|
|
572
|
+
/**
|
|
573
|
+
* Export the key/values for serialization.
|
|
574
|
+
*
|
|
575
|
+
* @api private
|
|
576
|
+
*/
|
|
577
|
+
export() {
|
|
578
|
+
let res = {};
|
|
579
|
+
clone(this, res, EXPORTED_SESSION_FIELDS);
|
|
580
|
+
return res;
|
|
581
|
+
}
|
|
582
|
+
/**
|
|
583
|
+
* 是否在线
|
|
584
|
+
*/
|
|
585
|
+
get isOnline() {
|
|
586
|
+
return this.__session__.isOnline;
|
|
587
|
+
}
|
|
588
|
+
/**
|
|
589
|
+
* 获取客户端的地址
|
|
590
|
+
*/
|
|
591
|
+
get remoteAddress() {
|
|
592
|
+
return this.__session__.remoteAddress;
|
|
593
|
+
}
|
|
594
|
+
}
|
|
595
|
+
exports.FrontendSession = FrontendSession;
|
|
596
|
+
let clone = function (src, dest, includes) {
|
|
597
|
+
let f;
|
|
598
|
+
for (let i = 0, l = includes.length; i < l; i++) {
|
|
599
|
+
f = includes[i];
|
|
600
|
+
dest[f] = src[f];
|
|
601
|
+
}
|
|
602
|
+
};
|
|
603
|
+
let dclone = function (src) {
|
|
604
|
+
let res = {};
|
|
605
|
+
for (let f in src) {
|
|
606
|
+
res[f] = src[f];
|
|
607
|
+
}
|
|
608
|
+
return res;
|
|
609
|
+
};
|
|
610
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Vzc2lvblNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWIvY29tbW9uL3NlcnZpY2Uvc2Vzc2lvblNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbUNBQW9DO0FBRXBDLHlEQUFrRDtBQUNsRCwwQ0FBMEM7QUFHMUMsNkJBQTZCO0FBRTdCLElBQUksTUFBTSxHQUFHLElBQUEsdUJBQVMsRUFBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO0FBRTFELElBQUksdUJBQXVCLEdBQUcsQ0FBQyxJQUFJLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO0FBQ2hGLElBQUksdUJBQXVCLEdBQUcsQ0FBQyxJQUFJLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxVQUFVLENBQUMsQ0FBQztBQUV0RSxJQUFJLFNBQVMsR0FBRyxDQUFDLENBQUM7QUFDbEIsSUFBSSxTQUFTLEdBQUcsQ0FBQyxDQUFDO0FBTWxCOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFhLGNBQWM7SUFLdkIsWUFBWSxJQUE2QjtRQWlZekMsVUFBSyxHQUFrRCxLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDN0YscUJBQWdCLEdBQWtELEtBQUssQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNuSCxVQUFLLEdBQTBDLEtBQUssQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNyRixZQUFPLEdBQTBDLEtBQUssQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUN6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
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BackendSessionComponent = void 0;
|
|
4
|
+
const backendSessionService_1 = require("../common/service/backendSessionService");
|
|
5
|
+
class BackendSessionComponent extends backendSessionService_1.BackendSessionService {
|
|
6
|
+
constructor(app) {
|
|
7
|
+
super(app);
|
|
8
|
+
this.name = '__backendSession__';
|
|
9
|
+
// export backend session service to the application context.
|
|
10
|
+
app.set('backendSessionService', this, true);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
exports.BackendSessionComponent = BackendSessionComponent;
|
|
14
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFja2VuZFNlc3Npb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvY29tcG9uZW50cy9iYWNrZW5kU2Vzc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxtRkFBZ0Y7QUFLaEYsTUFBYSx1QkFBd0IsU0FBUSw2Q0FBcUI7SUFDaEUsWUFBWSxHQUFnQjtRQUMxQixLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFLYixTQUFJLEdBQUcsb0JBQW9CLENBQUM7UUFKMUIsNkRBQTZEO1FBQzdELEdBQUcsQ0FBQyxHQUFHLENBQUMsdUJBQXVCLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQy9DLENBQUM7Q0FHRjtBQVJELDBEQVFDIn0=
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ChannelComponent = void 0;
|
|
4
|
+
const channelService_1 = require("../common/service/channelService");
|
|
5
|
+
class ChannelComponent extends channelService_1.ChannelService {
|
|
6
|
+
constructor(app, opts) {
|
|
7
|
+
super(app, opts);
|
|
8
|
+
this.name = '__channel__';
|
|
9
|
+
app.set('channelService', this, true);
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
exports.ChannelComponent = ChannelComponent;
|
|
13
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhbm5lbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9jb21wb25lbnRzL2NoYW5uZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEscUVBQXlGO0FBSXpGLE1BQWEsZ0JBQWlCLFNBQVEsK0JBQWM7SUFDbEQsWUFBWSxHQUFnQixFQUFFLElBQTJCO1FBQ3ZELEtBQUssQ0FBQyxHQUFHLEVBQUcsSUFBSSxDQUFDLENBQUM7UUFHcEIsU0FBSSxHQUFHLGFBQWEsQ0FBQztRQUZuQixHQUFHLENBQUMsR0FBRyxDQUFDLGdCQUFnQixFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN4QyxDQUFDO0NBRUY7QUFORCw0Q0FNQyJ9
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ConnectionComponent = void 0;
|
|
4
|
+
const connectionService_1 = require("../common/service/connectionService");
|
|
5
|
+
class ConnectionComponent extends connectionService_1.ConnectionService {
|
|
6
|
+
constructor(app) {
|
|
7
|
+
super(app);
|
|
8
|
+
this.name = '__connection__';
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
exports.ConnectionComponent = ConnectionComponent;
|
|
12
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29ubmVjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9jb21wb25lbnRzL2Nvbm5lY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsMkVBQXdFO0FBTXhFLE1BQWEsbUJBQW9CLFNBQVEscUNBQWlCO0lBR3RELFlBQVksR0FBZ0I7UUFDeEIsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBSGYsU0FBSSxHQUFHLGdCQUFnQixDQUFDO0lBSXhCLENBQUM7Q0FDSjtBQU5ELGtEQU1DIn0=
|