@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 { getLogger } from '@bigtyphoon/melo-logger'; import { RouteRecord } from '../../util/constants';
|
|
2
|
+
import { HandlerCallback } from './handlerService';
|
|
3
|
+
import { BeforeHandlerFilter, AfterHandlerFilter } from '../../interfaces/IHandlerFilter';
|
|
4
|
+
import { FrontendOrBackendSession } from '../../server/server';
|
|
5
|
+
import * as path from 'path';
|
|
6
|
+
let logger = getLogger('melo', path.basename(__filename));
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Filter service.
|
|
10
|
+
* Register and fire before and after filters.
|
|
11
|
+
*/
|
|
12
|
+
export class FilterService {
|
|
13
|
+
|
|
14
|
+
befores: BeforeHandlerFilter[] = []; // before filters
|
|
15
|
+
afters: AfterHandlerFilter[] = []; // after filters
|
|
16
|
+
|
|
17
|
+
name = 'filter';
|
|
18
|
+
|
|
19
|
+
removeBefore(filter: BeforeHandlerFilter) {
|
|
20
|
+
let index = this.befores.findIndex(v => v === filter);
|
|
21
|
+
if (index >= 0) {
|
|
22
|
+
this.befores.splice(index);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
removeAfter(filter: AfterHandlerFilter) {
|
|
27
|
+
let index = this.afters.findIndex(v => v === filter);
|
|
28
|
+
if (index >= 0) {
|
|
29
|
+
this.afters.splice(index);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Add before filter into the filter chain.
|
|
35
|
+
*
|
|
36
|
+
* @param filter {Object|Function} filter instance or filter function.
|
|
37
|
+
*/
|
|
38
|
+
before(filter: BeforeHandlerFilter) {
|
|
39
|
+
this.befores.push(filter);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Add after filter into the filter chain.
|
|
44
|
+
*
|
|
45
|
+
* @param filter {Object|Function} filter instance or filter function.
|
|
46
|
+
*/
|
|
47
|
+
after(filter: AfterHandlerFilter) {
|
|
48
|
+
this.afters.unshift(filter);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* TODO: other insert method for filter? such as unshift
|
|
53
|
+
*/
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Do the before filter.
|
|
57
|
+
* Fail over if any filter pass err parameter to the next function.
|
|
58
|
+
*
|
|
59
|
+
* @param msg {Object} clienet request msg
|
|
60
|
+
* @param session {Object} a session object for current request
|
|
61
|
+
* @param cb {Function} cb(err) callback function to invoke next chain node
|
|
62
|
+
*/
|
|
63
|
+
beforeFilter(routeRecord: RouteRecord , msg: any, session: FrontendOrBackendSession, cb: HandlerCallback) {
|
|
64
|
+
let index = 0, self = this;
|
|
65
|
+
let next = function (err?: any, resp?: any) {
|
|
66
|
+
if (err || index >= self.befores.length) {
|
|
67
|
+
cb(err, resp);
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
let handler = self.befores[index++];
|
|
72
|
+
if (typeof handler === 'function') {
|
|
73
|
+
handler(routeRecord , msg, session, next);
|
|
74
|
+
} else if (typeof handler.before === 'function') {
|
|
75
|
+
handler.before(routeRecord , msg, session, next);
|
|
76
|
+
} else {
|
|
77
|
+
logger.error('meet invalid before filter, handler or handler.before should be function.');
|
|
78
|
+
next(new Error('invalid before filter.'));
|
|
79
|
+
}
|
|
80
|
+
}; // end of next
|
|
81
|
+
|
|
82
|
+
next();
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Do after filter chain.
|
|
87
|
+
* Give server a chance to do clean up jobs after request responsed.
|
|
88
|
+
* After filter can not change the request flow before.
|
|
89
|
+
* After filter should call the next callback to let the request pass to next after filter.
|
|
90
|
+
*
|
|
91
|
+
* @param err {Object} error object
|
|
92
|
+
* @param session {Object} session object for current request
|
|
93
|
+
* @param {Object} resp response object send to client
|
|
94
|
+
* @param cb {Function} cb(err) callback function to invoke next chain node
|
|
95
|
+
*/
|
|
96
|
+
afterFilter(err: Error, routeRecord: RouteRecord , msg: any, session: FrontendOrBackendSession, resp: any, cb: HandlerCallback) {
|
|
97
|
+
let index = 0, self = this;
|
|
98
|
+
function next(err: Error) {
|
|
99
|
+
// if done
|
|
100
|
+
if (index >= self.afters.length) {
|
|
101
|
+
cb(err);
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
let handler = self.afters[index++];
|
|
106
|
+
if (typeof handler === 'function') {
|
|
107
|
+
handler(err, routeRecord , msg, session, resp, next);
|
|
108
|
+
} else if (typeof handler.after === 'function') {
|
|
109
|
+
handler.after(err, routeRecord , msg, session, resp, next);
|
|
110
|
+
} else {
|
|
111
|
+
logger.error('meet invalid after filter, handler or handler.after should be function.');
|
|
112
|
+
next(new Error('invalid after filter.'));
|
|
113
|
+
}
|
|
114
|
+
} // end of next
|
|
115
|
+
|
|
116
|
+
next(err);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
import * as fs from 'fs';
|
|
2
|
+
import * as utils from '../../util/utils';
|
|
3
|
+
import * as Loader from '@bigtyphoon/melo-loader';
|
|
4
|
+
import * as pathUtil from '../../util/pathUtil';
|
|
5
|
+
import { getLogger } from '@bigtyphoon/melo-logger';
|
|
6
|
+
import { Application } from '../../application';
|
|
7
|
+
import { Session, FrontendSession } from './sessionService';
|
|
8
|
+
import { RouteRecord, ServerInfo } from '../../util/constants';
|
|
9
|
+
import { BackendSession } from './backendSessionService';
|
|
10
|
+
import * as path from 'path';
|
|
11
|
+
import { LoaderPathType } from '@bigtyphoon/melo-loader';
|
|
12
|
+
|
|
13
|
+
let logger = getLogger('melo', path.basename(__filename));
|
|
14
|
+
let forwardLogger = getLogger('forward-log', path.basename(__filename));
|
|
15
|
+
|
|
16
|
+
export interface HandlerServiceOptions {
|
|
17
|
+
reloadHandlers?: boolean;
|
|
18
|
+
enableForwardLog?: boolean;
|
|
19
|
+
handlersPaths?: string[];
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export type HandlerCallback = (err: Error, response ?: any) => void;
|
|
23
|
+
export type HandlerMethod = (msg: any, session: FrontendSession | BackendSession) => Promise<any>;
|
|
24
|
+
export type Handler = { [method: string]: HandlerMethod };
|
|
25
|
+
export type Handlers = { [handler: string]: Handler };
|
|
26
|
+
export type HandlerMap = { [serverType: string]: Handlers };
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Handler service.
|
|
30
|
+
* Dispatch request to the relactive handler.
|
|
31
|
+
*
|
|
32
|
+
* @param {Object} app current application context
|
|
33
|
+
*/
|
|
34
|
+
export class HandlerService {
|
|
35
|
+
app: Application;
|
|
36
|
+
handlerMap: HandlerMap = {};
|
|
37
|
+
handlerPaths: { [serverType: string]: Set<string> } = {};
|
|
38
|
+
enableForwardLog: boolean;
|
|
39
|
+
|
|
40
|
+
constructor(app: Application, opts: HandlerServiceOptions) {
|
|
41
|
+
this.app = app;
|
|
42
|
+
if (!!opts.reloadHandlers) {
|
|
43
|
+
watchHandlers(app, this.handlerMap);
|
|
44
|
+
}
|
|
45
|
+
this.enableForwardLog = opts.enableForwardLog || false;
|
|
46
|
+
|
|
47
|
+
// 添加默认路径到ServerInfo中
|
|
48
|
+
let info = app.getCurrentServer();
|
|
49
|
+
let handlerPath = info.serverType ? pathUtil.getHandlerPath(app.getBase(), info.serverType) : undefined;
|
|
50
|
+
info.handlerPaths = [];
|
|
51
|
+
if (handlerPath) {
|
|
52
|
+
info.handlerPaths.push(handlerPath);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// 添加插件中的handler到ServerInfo中
|
|
56
|
+
for (let plugin of app.usedPlugins) {
|
|
57
|
+
if (plugin.handlerPath) {
|
|
58
|
+
info.handlerPaths.push(plugin.handlerPath);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// 添加一台服务器
|
|
63
|
+
this.addServer(info);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
name = 'handler';
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Handler the request.
|
|
71
|
+
*/
|
|
72
|
+
handle(routeRecord: RouteRecord, msg: any, session: FrontendSession | BackendSession, cb: HandlerCallback) {
|
|
73
|
+
// the request should be processed by current server
|
|
74
|
+
let handler = this.getHandler(routeRecord);
|
|
75
|
+
if (!handler) {
|
|
76
|
+
logger.error('[handleManager]: fail to find handler for %j', routeRecord.route);
|
|
77
|
+
utils.invokeCallback(cb, new Error('fail to find handler for ' + routeRecord.route));
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
let start = Date.now();
|
|
81
|
+
let self = this;
|
|
82
|
+
|
|
83
|
+
let callback = function (err?: any, resp?: any, opts?: any) {
|
|
84
|
+
if (self.enableForwardLog) {
|
|
85
|
+
let log = {
|
|
86
|
+
route: routeRecord.route,
|
|
87
|
+
args: msg,
|
|
88
|
+
time: utils.format(new Date(start)),
|
|
89
|
+
timeUsed: Date.now() - start
|
|
90
|
+
};
|
|
91
|
+
forwardLogger.info(JSON.stringify(log));
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// resp = getResp(arguments);
|
|
95
|
+
utils.invokeCallback(cb, err, resp, opts);
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
let method = routeRecord.method;
|
|
99
|
+
|
|
100
|
+
if (!Array.isArray(msg)) {
|
|
101
|
+
handler[method](msg, session).then((resp) => {
|
|
102
|
+
callback(null, resp);
|
|
103
|
+
}, (reason) => {
|
|
104
|
+
callback(reason);
|
|
105
|
+
});
|
|
106
|
+
} else {
|
|
107
|
+
msg.push(session);
|
|
108
|
+
handler[method].apply(handler, msg).then((resp: any) => {
|
|
109
|
+
callback(null, resp);
|
|
110
|
+
}, (reason: any) => {
|
|
111
|
+
|
|
112
|
+
callback(reason);
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* Get handler instance by routeRecord.
|
|
120
|
+
*
|
|
121
|
+
* @param {Object} handlers handler map
|
|
122
|
+
* @param {Object} routeRecord route record parsed from route string
|
|
123
|
+
* @return {Object} handler instance if any matchs or null for match fail
|
|
124
|
+
*/
|
|
125
|
+
getHandler(routeRecord: RouteRecord) {
|
|
126
|
+
let serverType = routeRecord.serverType;
|
|
127
|
+
if (!this.handlerMap[serverType]) {
|
|
128
|
+
this.loadHandlers(serverType);
|
|
129
|
+
}
|
|
130
|
+
let handlers = this.handlerMap[serverType] || {};
|
|
131
|
+
let handler = handlers[routeRecord.handler];
|
|
132
|
+
if (!handler) {
|
|
133
|
+
logger.warn('could not find handler for routeRecord: %j', routeRecord);
|
|
134
|
+
return null;
|
|
135
|
+
}
|
|
136
|
+
if (typeof handler[routeRecord.method] !== 'function') {
|
|
137
|
+
logger.warn('could not find the method %s in handler: %s', routeRecord.method, routeRecord.handler);
|
|
138
|
+
return null;
|
|
139
|
+
}
|
|
140
|
+
return handler;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
private parseHandler(serverType: string, handlerPath: string) {
|
|
144
|
+
let modules = Loader.load(handlerPath, this.app, false, true, LoaderPathType.PINUS_HANDLER) as Handlers;
|
|
145
|
+
for (let name in modules) {
|
|
146
|
+
let targetHandlers = this.handlerMap[serverType];
|
|
147
|
+
if (!targetHandlers) {
|
|
148
|
+
targetHandlers = {};
|
|
149
|
+
this.handlerMap[serverType] = targetHandlers;
|
|
150
|
+
}
|
|
151
|
+
targetHandlers[name] = modules[name];
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
private addServer(serverInfo: ServerInfo) {
|
|
156
|
+
let targetPaths = this.handlerPaths[serverInfo.serverType];
|
|
157
|
+
if (!targetPaths) {
|
|
158
|
+
targetPaths = new Set<string>();
|
|
159
|
+
this.handlerPaths[serverInfo.serverType] = targetPaths;
|
|
160
|
+
}
|
|
161
|
+
for (let path of serverInfo.handlerPaths) {
|
|
162
|
+
targetPaths.add(path);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* Load handlers from current application
|
|
168
|
+
*/
|
|
169
|
+
private loadHandlers(serverType: string) {
|
|
170
|
+
let paths = this.handlerPaths[serverType];
|
|
171
|
+
for (let path of paths) {
|
|
172
|
+
this.parseHandler(serverType, path);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
export function manualReloadHandlers(app: Application) {
|
|
178
|
+
if (!app.components.__server__) {
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
let p = pathUtil.getHandlerPath(app.getBase(), app.serverType);
|
|
182
|
+
if (!p) {
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
const handlerMap: HandlerMap = app.components.__server__.server.handlerService.handlerMap;
|
|
186
|
+
handlerMap[app.serverType] = Loader.load(p, app, true, true, LoaderPathType.PINUS_HANDLER);
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
let watchHandlers = function (app: Application, handlerMap: HandlerMap) {
|
|
190
|
+
let p = pathUtil.getHandlerPath(app.getBase(), app.serverType);
|
|
191
|
+
if (!!p) {
|
|
192
|
+
fs.watch(p, function (event, name) {
|
|
193
|
+
if (event === 'change') {
|
|
194
|
+
handlerMap[app.serverType] = Loader.load(p, app, true, true, LoaderPathType.PINUS_HANDLER);
|
|
195
|
+
}
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
};
|
|
199
|
+
|
|
200
|
+
let getResp = function (args: any) {
|
|
201
|
+
let len = args.length;
|
|
202
|
+
if (len === 1) {
|
|
203
|
+
return [];
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
if (len === 2) {
|
|
207
|
+
return [args[1]];
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
if (len === 3) {
|
|
211
|
+
return [args[1], args[2]];
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
if (len === 4) {
|
|
215
|
+
return [args[1], args[2], args[3]];
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
let r = new Array(len);
|
|
219
|
+
for (let i = 1; i < len; i++) {
|
|
220
|
+
r[i] = args[i];
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
return r;
|
|
224
|
+
};
|