@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,118 @@
|
|
|
1
|
+
import * as async from 'async';
|
|
2
|
+
import * as utils from '../../util/utils';
|
|
3
|
+
import { getLogger } from '@bigtyphoon/melo-logger';
|
|
4
|
+
let logger = getLogger('melo', __filename);
|
|
5
|
+
let transactionLogger = getLogger('transaction-log', __filename);
|
|
6
|
+
let transactionErrorLogger = getLogger('transaction-error-log', __filename);
|
|
7
|
+
|
|
8
|
+
export type TransactionCondictionFunction = (cb: (err ?: Error) => void) => void;
|
|
9
|
+
export type TransactionHandlerFunction = (cb: (err ?: Error) => void) => void;
|
|
10
|
+
|
|
11
|
+
export function transaction(name: string, conditions: { [key: string]: TransactionCondictionFunction }, handlers: { [key: string]: TransactionHandlerFunction }, retry?: number) {
|
|
12
|
+
if (!retry) {
|
|
13
|
+
retry = 1;
|
|
14
|
+
}
|
|
15
|
+
if (typeof name !== 'string') {
|
|
16
|
+
logger.error('transaction name is error format, name: %s.', name);
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
if (typeof conditions !== 'object' || typeof handlers !== 'object') {
|
|
20
|
+
logger.error('transaction conditions parameter is error format, conditions: %j, handlers: %j.', conditions, handlers);
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
let cmethods: TransactionCondictionFunction[] = [];
|
|
25
|
+
let dmethods: TransactionHandlerFunction[] = [];
|
|
26
|
+
let cnames: string[] = [];
|
|
27
|
+
let dnames: string[] = [];
|
|
28
|
+
for (let key in conditions) {
|
|
29
|
+
if (typeof key !== 'string' || typeof conditions[key] !== 'function') {
|
|
30
|
+
logger.error('transaction conditions parameter is error format, condition name: %s, condition function: %j.', key, conditions[key]);
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
cnames.push(key);
|
|
34
|
+
cmethods.push(conditions[key]);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
let i = 0;
|
|
38
|
+
// execute conditions
|
|
39
|
+
async.forEachSeries(cmethods, function (method, cb) {
|
|
40
|
+
method(cb);
|
|
41
|
+
transactionLogger.info('[%s]:[%s] condition is executed.', name, cnames[i]);
|
|
42
|
+
i++;
|
|
43
|
+
}, function (err: Error) {
|
|
44
|
+
if (err) {
|
|
45
|
+
process.nextTick(function () {
|
|
46
|
+
transactionLogger.error('[%s]:[%s] condition is executed with err: %j.', name, cnames[--i], err.stack);
|
|
47
|
+
let log = {
|
|
48
|
+
name: name,
|
|
49
|
+
method: cnames[i],
|
|
50
|
+
time: Date.now(),
|
|
51
|
+
type: 'condition',
|
|
52
|
+
description: err.stack
|
|
53
|
+
};
|
|
54
|
+
transactionErrorLogger.error(JSON.stringify(log));
|
|
55
|
+
});
|
|
56
|
+
return;
|
|
57
|
+
} else {
|
|
58
|
+
// execute handlers
|
|
59
|
+
process.nextTick(function () {
|
|
60
|
+
for (let key in handlers) {
|
|
61
|
+
if (typeof key !== 'string' || typeof handlers[key] !== 'function') {
|
|
62
|
+
logger.error('transcation handlers parameter is error format, handler name: %s, handler function: %j.', key, handlers[key]);
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
dnames.push(key);
|
|
66
|
+
dmethods.push(handlers[key]);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
let flag = true;
|
|
70
|
+
let times = retry;
|
|
71
|
+
|
|
72
|
+
// do retry if failed util retry times
|
|
73
|
+
async.whilst(
|
|
74
|
+
function () {
|
|
75
|
+
return retry > 0 && flag;
|
|
76
|
+
},
|
|
77
|
+
function (callback) {
|
|
78
|
+
let j = 0;
|
|
79
|
+
retry--;
|
|
80
|
+
async.forEachSeries(dmethods, function (method, cb) {
|
|
81
|
+
method(cb);
|
|
82
|
+
transactionLogger.info('[%s]:[%s] handler is executed.', name, dnames[j]);
|
|
83
|
+
j++;
|
|
84
|
+
}, function (err: Error) {
|
|
85
|
+
if (err) {
|
|
86
|
+
process.nextTick(function () {
|
|
87
|
+
transactionLogger.error('[%s]:[%s]:[%s] handler is executed with err: %j.', name, dnames[--j], times - retry, err.stack);
|
|
88
|
+
let log = {
|
|
89
|
+
name: name,
|
|
90
|
+
method: dnames[j],
|
|
91
|
+
retry: times - retry,
|
|
92
|
+
time: Date.now(),
|
|
93
|
+
type: 'handler',
|
|
94
|
+
description: err.stack
|
|
95
|
+
};
|
|
96
|
+
transactionErrorLogger.error(JSON.stringify(log));
|
|
97
|
+
utils.invokeCallback(callback);
|
|
98
|
+
});
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
flag = false;
|
|
102
|
+
utils.invokeCallback(callback);
|
|
103
|
+
process.nextTick(function () {
|
|
104
|
+
transactionLogger.info('[%s] all conditions and handlers are executed successfully.', name);
|
|
105
|
+
});
|
|
106
|
+
});
|
|
107
|
+
},
|
|
108
|
+
function (err) {
|
|
109
|
+
if (err) {
|
|
110
|
+
logger.error('transaction process is executed with error: %j', err);
|
|
111
|
+
}
|
|
112
|
+
// callback will not pass error
|
|
113
|
+
}
|
|
114
|
+
);
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
let sequeue = require('seq-queue');
|
|
2
|
+
|
|
3
|
+
export interface QueueTask {
|
|
4
|
+
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
export interface Queue {
|
|
8
|
+
push(fn: (task: QueueTask) => void, ontimeout: () => void, timeoutMs: number): void;
|
|
9
|
+
|
|
10
|
+
close(force: boolean): void;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
let queues: { [key: number]: Queue } = {};
|
|
15
|
+
|
|
16
|
+
export let timeout = 3000;
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Add tasks into task group. Create the task group if it dose not exist.
|
|
20
|
+
*
|
|
21
|
+
* @param {String} key task key
|
|
22
|
+
* @param {Function} fn task callback
|
|
23
|
+
* @param {Function} ontimeout task timeout callback
|
|
24
|
+
* @param {Number} timeout timeout for task
|
|
25
|
+
*/
|
|
26
|
+
export function addTask(key: number, fn: (task: QueueTask) => void, ontimeout: () => void, timeoutMs: number) {
|
|
27
|
+
let queue = queues[key];
|
|
28
|
+
if (!queue) {
|
|
29
|
+
queue = sequeue.createQueue(timeout);
|
|
30
|
+
queues[key] = queue;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
return queue.push(fn, ontimeout, timeoutMs);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Destroy task group
|
|
38
|
+
*
|
|
39
|
+
* @param {String} key task key
|
|
40
|
+
* @param {Boolean} force whether close task group directly
|
|
41
|
+
*/
|
|
42
|
+
export function closeQueue(key: number, force: boolean) {
|
|
43
|
+
if (!queues[key]) {
|
|
44
|
+
// ignore illeagle key
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
queues[key].close(force);
|
|
49
|
+
queues[key] = undefined;
|
|
50
|
+
}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import * as utils from '../../../util/utils';
|
|
2
|
+
import { getLogger } from '@bigtyphoon/melo-logger';
|
|
3
|
+
import { Application } from '../../../application';
|
|
4
|
+
import { BackendSession } from '../../service/backendSessionService';
|
|
5
|
+
import * as path from 'path';
|
|
6
|
+
import { ISession } from '../../service/sessionService';
|
|
7
|
+
|
|
8
|
+
let logger = getLogger('forward-log', path.basename(__filename));
|
|
9
|
+
/**
|
|
10
|
+
* Remote service for backend servers.
|
|
11
|
+
* Receive and handle request message forwarded from frontend server.
|
|
12
|
+
*/
|
|
13
|
+
export default function (app: Application) {
|
|
14
|
+
return new MsgRemote(app);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export class MsgRemote {
|
|
18
|
+
app: Application;
|
|
19
|
+
|
|
20
|
+
constructor(app: Application) {
|
|
21
|
+
this.app = app;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Forward message from frontend server to other server's handlers
|
|
26
|
+
*
|
|
27
|
+
* @param msg {Object} request message
|
|
28
|
+
* @param session {Object} session object for current request
|
|
29
|
+
* @param cb {Function} callback function
|
|
30
|
+
*/
|
|
31
|
+
forwardMessage(msg: any, session: ISession) {
|
|
32
|
+
return new Promise<any>((resolve, reject) => {
|
|
33
|
+
let server = this.app.components.__server__;
|
|
34
|
+
let sessionService = this.app.components.__backendSession__;
|
|
35
|
+
|
|
36
|
+
if (!server) {
|
|
37
|
+
logger.error('server component not enable on %s', this.app.serverId);
|
|
38
|
+
reject(new Error('server component not enable'));
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
if (!sessionService) {
|
|
43
|
+
logger.error('backend session component not enable on %s', this.app.serverId);
|
|
44
|
+
reject(new Error('backend sesssion component not enable'));
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// generate backend session for current request
|
|
49
|
+
let backendSession = sessionService.create(session);
|
|
50
|
+
|
|
51
|
+
// handle the request
|
|
52
|
+
|
|
53
|
+
logger.debug('session:[%s,%s,%s], handle message: %j', session.id, session.uid, session.frontendId, msg);
|
|
54
|
+
|
|
55
|
+
server.handle(msg, backendSession, function (err, resp) {
|
|
56
|
+
logger.debug('session:[%s,%s,%s], handle message result,err:%j,msg:%j,resp:%j', session.id, session.uid, session.frontendId, err, msg, resp);
|
|
57
|
+
// 如果有给response 那就不给connector错误。给response.
|
|
58
|
+
// 因为promise,所以与pomelo有点不一致,pomelo把err与resp一起传回connector了
|
|
59
|
+
if (err) {
|
|
60
|
+
if (resp) {
|
|
61
|
+
logger.error('session:[%s,%s,%s], handle message %j, error:%j', session.id, session.uid, session.frontendId, msg, err);
|
|
62
|
+
return resolve(resp);
|
|
63
|
+
}
|
|
64
|
+
reject(err);
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
resolve(resp);
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/*
|
|
74
|
+
forwardMessage2(route : string , body : any, aesPassword : string, compressGzip : boolean, session :BackendSession)
|
|
75
|
+
{
|
|
76
|
+
return new Promise<any>((resolve, reject) =>
|
|
77
|
+
{
|
|
78
|
+
let server = this.app.components.__server__;
|
|
79
|
+
let sessionService = this.app.components.__backendSession__;
|
|
80
|
+
|
|
81
|
+
if (!server)
|
|
82
|
+
{
|
|
83
|
+
logger.error('server component not enable on %s', this.app.serverId);
|
|
84
|
+
reject(new Error('server component not enable'));
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
if (!sessionService)
|
|
89
|
+
{
|
|
90
|
+
logger.error('backend session component not enable on %s', this.app.serverId);
|
|
91
|
+
reject(new Error('backend sesssion component not enable'));
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// generate backend session for current request
|
|
96
|
+
let backendSession = sessionService.create(session);
|
|
97
|
+
|
|
98
|
+
// handle the request
|
|
99
|
+
|
|
100
|
+
// logger.debug('backend server [%s] handle message: %j', this.app.serverId, msg);
|
|
101
|
+
|
|
102
|
+
let dmsg = {
|
|
103
|
+
route: route,
|
|
104
|
+
body: body,
|
|
105
|
+
compressGzip: compressGzip
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
let socket = {
|
|
109
|
+
aesPassword: aesPassword
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
let connector = this.app.components.__connector__.connector;
|
|
113
|
+
connector.runDecode(dmsg, socket, function (err : Error, msg : any)
|
|
114
|
+
{
|
|
115
|
+
if (err)
|
|
116
|
+
{
|
|
117
|
+
return reject(err);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
server.handle(msg, backendSession, function (err : Error, resp : any)
|
|
121
|
+
{
|
|
122
|
+
if (err)
|
|
123
|
+
{
|
|
124
|
+
reject(err);
|
|
125
|
+
}
|
|
126
|
+
else
|
|
127
|
+
{
|
|
128
|
+
resolve(resp);
|
|
129
|
+
}
|
|
130
|
+
});
|
|
131
|
+
});
|
|
132
|
+
});
|
|
133
|
+
}*/
|
|
134
|
+
}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Remote channel service for frontend server.
|
|
3
|
+
* Receive push request from backend servers and push it to clients.
|
|
4
|
+
*/
|
|
5
|
+
import * as utils from '../../../util/utils';
|
|
6
|
+
import {getLogger} from '@bigtyphoon/melo-logger';
|
|
7
|
+
import {Application} from '../../../application';
|
|
8
|
+
import {UID, SID} from '../../../util/constants';
|
|
9
|
+
import {ScheduleOptions} from '../../../interfaces/IPushScheduler';
|
|
10
|
+
import {Session} from '../../service/sessionService';
|
|
11
|
+
import * as path from 'path';
|
|
12
|
+
|
|
13
|
+
let logger = getLogger('melo', path.basename(__filename));
|
|
14
|
+
|
|
15
|
+
export default function (app: Application) {
|
|
16
|
+
return new ChannelRemote(app);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export class ChannelRemote {
|
|
20
|
+
app: Application;
|
|
21
|
+
|
|
22
|
+
constructor(app: Application) {
|
|
23
|
+
this.app = app;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Push message to client by uids.
|
|
28
|
+
*
|
|
29
|
+
* @param {String} route route string of message
|
|
30
|
+
* @param {Object} msg message
|
|
31
|
+
* @param {Array} uids user ids that would receive the message
|
|
32
|
+
* @param {Object} opts push options
|
|
33
|
+
* @param {Function} cb callback function
|
|
34
|
+
*/
|
|
35
|
+
pushMessage(route: string, msg: any, uids: UID[], opts: ScheduleOptions) {
|
|
36
|
+
return new Promise<any>((resolve, reject) => {
|
|
37
|
+
if (!msg) {
|
|
38
|
+
logger.error('Can not send empty message! route : %j, compressed msg : %j',
|
|
39
|
+
route, msg);
|
|
40
|
+
return reject(new Error('can not send empty message.'));
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
let connector = this.app.components.__connector__;
|
|
44
|
+
|
|
45
|
+
let sessionService = this.app.get('sessionService');
|
|
46
|
+
let fails: UID[] = [], sids: SID[] = [], sessions: Session[], j: number, k: number;
|
|
47
|
+
for (let i = 0, l = uids.length; i < l; i++) {
|
|
48
|
+
sessions = sessionService.getByUid(uids[i]);
|
|
49
|
+
if (!sessions) {
|
|
50
|
+
fails.push(uids[i]);
|
|
51
|
+
} else {
|
|
52
|
+
for (j = 0, k = sessions.length; j < k; j++) {
|
|
53
|
+
sids.push(sessions[j].id);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
logger.debug('[%s] pushMessage uids: %j, msg: %j, sids: %j', this.app.serverId, uids, msg, sids);
|
|
58
|
+
connector.send(null, route, msg, sids, opts, function (err) {
|
|
59
|
+
if (err) {
|
|
60
|
+
return reject(err);
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
return resolve(fails);
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Broadcast to all the client connectd with current frontend server.
|
|
71
|
+
*
|
|
72
|
+
* @param {String} route route string
|
|
73
|
+
* @param {Object} msg message
|
|
74
|
+
* @param {Boolean} opts broadcast options.
|
|
75
|
+
* @param {Function} cb callback function
|
|
76
|
+
*/
|
|
77
|
+
broadcast(route: string, msg: any, opts: ScheduleOptions) {
|
|
78
|
+
return new Promise<any>((resolve, reject) => {
|
|
79
|
+
let connector = this.app.components.__connector__;
|
|
80
|
+
|
|
81
|
+
connector.send(null, route, msg, null, opts, function (err, resp) {
|
|
82
|
+
if (err) {
|
|
83
|
+
return reject(err);
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
return resolve(resp);
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Remote session service for frontend server.
|
|
3
|
+
* Set session info for backend servers.
|
|
4
|
+
*/
|
|
5
|
+
import * as utils from '../../../util/utils';
|
|
6
|
+
import {Application} from '../../../application';
|
|
7
|
+
import {SID, UID} from '../../../util/constants';
|
|
8
|
+
|
|
9
|
+
export default function (app: Application) {
|
|
10
|
+
return new SessionRemote(app);
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
export class SessionRemote {
|
|
15
|
+
app: Application;
|
|
16
|
+
|
|
17
|
+
constructor(app: Application) {
|
|
18
|
+
this.app = app;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
bind(sid: SID, uid: UID) {
|
|
22
|
+
return this.app.sessionService.abind(sid, uid);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
unbind(sid: SID, uid: UID) {
|
|
26
|
+
return this.app.sessionService.aunbind(sid, uid);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
push(sid: SID, key: string, value: any) {
|
|
30
|
+
return this.app.sessionService.aimport(sid, key, value);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
pushAll(sid: SID, settings: { [key: string]: any }) {
|
|
34
|
+
return this.app.sessionService.aimportAll(sid, settings);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Get session informations with session id.
|
|
39
|
+
*
|
|
40
|
+
* @param {String} sid session id binded with the session
|
|
41
|
+
* @param {Function} cb(err, sinfo) callback funtion, sinfo would be null if the session not exist.
|
|
42
|
+
*/
|
|
43
|
+
getBackendSessionBySid(sid: SID) {
|
|
44
|
+
let session = this.app.sessionService.get(sid);
|
|
45
|
+
if (!session) {
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
return session.toFrontendSession().export();
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Get all the session informations with the specified user id.
|
|
53
|
+
*
|
|
54
|
+
* @param {String} uid user id binded with the session
|
|
55
|
+
* @param {Function} cb(err, sinfo) callback funtion, sinfo would be null if the session does not exist.
|
|
56
|
+
*/
|
|
57
|
+
getBackendSessionsByUid(uid: UID) {
|
|
58
|
+
let sessions = this.app.sessionService.getByUid(uid);
|
|
59
|
+
if (!sessions) {
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
let res = [];
|
|
64
|
+
for (let i = 0, l = sessions.length; i < l; i++) {
|
|
65
|
+
res.push(sessions[i].toFrontendSession().export());
|
|
66
|
+
}
|
|
67
|
+
return res;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Kick a session by session id.
|
|
72
|
+
*
|
|
73
|
+
* @param {Number} sid session id
|
|
74
|
+
* @param {String} reason kick reason
|
|
75
|
+
* @param {Function} cb callback function
|
|
76
|
+
*/
|
|
77
|
+
kickBySid(sid: SID, reason: string) {
|
|
78
|
+
return this.app.sessionService.akickBySessionId(sid, reason);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Kick sessions by user id.
|
|
83
|
+
*
|
|
84
|
+
* @param {Number|String} uid user id
|
|
85
|
+
* @param {String} reason kick reason
|
|
86
|
+
* @param {Function} cb callback function
|
|
87
|
+
*/
|
|
88
|
+
kickByUid(uid: UID, reason: string) {
|
|
89
|
+
return this.app.sessionService.akick(uid, reason);
|
|
90
|
+
}
|
|
91
|
+
}
|