@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.
Files changed (296) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +55 -0
  3. package/bin/commadtest.ts +10 -0
  4. package/bin/commands/add.ts +43 -0
  5. package/bin/commands/init.ts +292 -0
  6. package/bin/commands/kill.ts +21 -0
  7. package/bin/commands/list.ts +60 -0
  8. package/bin/commands/masterha.ts +40 -0
  9. package/bin/commands/restart.ts +48 -0
  10. package/bin/commands/start.ts +65 -0
  11. package/bin/commands/stop.ts +26 -0
  12. package/bin/melo.ts +30 -0
  13. package/bin/utils/constants.ts +27 -0
  14. package/bin/utils/utils.ts +130 -0
  15. package/dist/bin/commadtest.js +9 -0
  16. package/dist/bin/commands/add.js +40 -0
  17. package/dist/bin/commands/init.js +279 -0
  18. package/dist/bin/commands/kill.js +21 -0
  19. package/dist/bin/commands/list.js +65 -0
  20. package/dist/bin/commands/masterha.js +36 -0
  21. package/dist/bin/commands/restart.js +45 -0
  22. package/dist/bin/commands/start.js +58 -0
  23. package/dist/bin/commands/stop.js +20 -0
  24. package/dist/bin/melo.js +26 -0
  25. package/dist/bin/utils/constants.js +28 -0
  26. package/dist/bin/utils/utils.js +134 -0
  27. package/dist/lib/application.js +888 -0
  28. package/dist/lib/common/manager/appManager.js +112 -0
  29. package/dist/lib/common/manager/taskManager.js +39 -0
  30. package/dist/lib/common/remote/backend/msgRemote.js +63 -0
  31. package/dist/lib/common/remote/frontend/channelRemote.js +78 -0
  32. package/dist/lib/common/remote/frontend/sessionRemote.js +76 -0
  33. package/dist/lib/common/service/backendSessionService.js +337 -0
  34. package/dist/lib/common/service/channelService.js +514 -0
  35. package/dist/lib/common/service/connectionService.js +95 -0
  36. package/dist/lib/common/service/filterService.js +112 -0
  37. package/dist/lib/common/service/handlerService.js +187 -0
  38. package/dist/lib/common/service/sessionService.js +610 -0
  39. package/dist/lib/components/backendSession.js +14 -0
  40. package/dist/lib/components/channel.js +13 -0
  41. package/dist/lib/components/connection.js +12 -0
  42. package/dist/lib/components/connector.js +437 -0
  43. package/dist/lib/components/dictionary.js +93 -0
  44. package/dist/lib/components/master.js +39 -0
  45. package/dist/lib/components/monitor.js +25 -0
  46. package/dist/lib/components/protobuf.js +156 -0
  47. package/dist/lib/components/proxy.js +236 -0
  48. package/dist/lib/components/pushScheduler.js +62 -0
  49. package/dist/lib/components/remote.js +127 -0
  50. package/dist/lib/components/server.js +63 -0
  51. package/dist/lib/components/session.js +20 -0
  52. package/dist/lib/connectors/commands/handshake.js +119 -0
  53. package/dist/lib/connectors/commands/heartbeat.js +67 -0
  54. package/dist/lib/connectors/commands/kick.js +15 -0
  55. package/dist/lib/connectors/common/coder.js +90 -0
  56. package/dist/lib/connectors/common/handler.js +57 -0
  57. package/dist/lib/connectors/hybrid/IHybridSocket.js +3 -0
  58. package/dist/lib/connectors/hybrid/switcher.js +100 -0
  59. package/dist/lib/connectors/hybrid/tcpprocessor.js +40 -0
  60. package/dist/lib/connectors/hybrid/tcpsocket.js +171 -0
  61. package/dist/lib/connectors/hybrid/wsprocessor.js +49 -0
  62. package/dist/lib/connectors/hybridconnector.js +89 -0
  63. package/dist/lib/connectors/hybridsocket.js +139 -0
  64. package/dist/lib/connectors/mqtt/generate.js +113 -0
  65. package/dist/lib/connectors/mqtt/mqttadaptor.js +81 -0
  66. package/dist/lib/connectors/mqtt/protocol.js +48 -0
  67. package/dist/lib/connectors/mqttconnector.js +107 -0
  68. package/dist/lib/connectors/mqttsocket.js +59 -0
  69. package/dist/lib/connectors/sioconnector.js +135 -0
  70. package/dist/lib/connectors/siosocket.js +69 -0
  71. package/dist/lib/connectors/udpconnector.js +76 -0
  72. package/dist/lib/connectors/udpsocket.js +93 -0
  73. package/dist/lib/filters/handler/serial.js +44 -0
  74. package/dist/lib/filters/handler/time.js +32 -0
  75. package/dist/lib/filters/handler/timeout.js +45 -0
  76. package/dist/lib/filters/handler/toobusy.js +36 -0
  77. package/dist/lib/filters/rpc/rpcLog.js +43 -0
  78. package/dist/lib/filters/rpc/toobusy.js +41 -0
  79. package/dist/lib/index.js +81 -0
  80. package/dist/lib/interfaces/IComponent.js +3 -0
  81. package/dist/lib/interfaces/IConnector.js +3 -0
  82. package/dist/lib/interfaces/IHandlerFilter.js +3 -0
  83. package/dist/lib/interfaces/ILifeCycle.js +3 -0
  84. package/dist/lib/interfaces/IPlugin.js +3 -0
  85. package/dist/lib/interfaces/IPushScheduler.js +3 -0
  86. package/dist/lib/interfaces/ISocket.js +3 -0
  87. package/dist/lib/interfaces/IStore.js +3 -0
  88. package/dist/lib/interfaces/define.js +3 -0
  89. package/dist/lib/master/master.js +129 -0
  90. package/dist/lib/master/starter.js +236 -0
  91. package/dist/lib/master/watchdog.js +120 -0
  92. package/dist/lib/melo.js +125 -0
  93. package/dist/lib/modules/console.js +436 -0
  94. package/dist/lib/modules/masterwatcher.js +98 -0
  95. package/dist/lib/modules/monitorwatcher.js +124 -0
  96. package/dist/lib/modules/onlineUser.js +69 -0
  97. package/dist/lib/modules/restartNotifyModule.js +107 -0
  98. package/dist/lib/modules/watchServer.js +737 -0
  99. package/dist/lib/monitor/monitor.js +80 -0
  100. package/dist/lib/pushSchedulers/buffer.js +96 -0
  101. package/dist/lib/pushSchedulers/direct.js +58 -0
  102. package/dist/lib/pushSchedulers/multi.js +80 -0
  103. package/dist/lib/server/server.js +500 -0
  104. package/dist/lib/util/appUtil.js +306 -0
  105. package/dist/lib/util/constants.js +117 -0
  106. package/dist/lib/util/countDownLatch.js +51 -0
  107. package/dist/lib/util/events.js +20 -0
  108. package/dist/lib/util/handlerHelper.js +8 -0
  109. package/dist/lib/util/log.js +14 -0
  110. package/dist/lib/util/moduleUtil.js +101 -0
  111. package/dist/lib/util/pathUtil.js +134 -0
  112. package/dist/lib/util/remoterHelper.js +8 -0
  113. package/dist/lib/util/utils.js +358 -0
  114. package/dist/test/application.js +522 -0
  115. package/dist/test/config/log4js.json +28 -0
  116. package/dist/test/config/master.json +9 -0
  117. package/dist/test/config/servers.json +6 -0
  118. package/dist/test/filters/handler/serial.js +41 -0
  119. package/dist/test/filters/handler/time.js +41 -0
  120. package/dist/test/filters/handler/timeout.js +41 -0
  121. package/dist/test/filters/handler/toobusy.js +57 -0
  122. package/dist/test/filters/rpc/rpcLog.js +22 -0
  123. package/dist/test/filters/rpc/toobusy.js +39 -0
  124. package/dist/test/manager/mockChannelManager.js +77 -0
  125. package/dist/test/manager/taskManager.js +68 -0
  126. package/dist/test/mock-base/app/servers/other-file +0 -0
  127. package/dist/test/mock-plugin/components/mockPlugin.js +10 -0
  128. package/dist/test/mock-plugin/events/mockEvent.js +12 -0
  129. package/dist/test/modules/console.js +242 -0
  130. package/dist/test/pomelo.js +19 -0
  131. package/dist/test/remote/channelRemote.js +159 -0
  132. package/dist/test/service/channel.js +134 -0
  133. package/dist/test/service/channelService.js +216 -0
  134. package/dist/test/service/connectionService.js +114 -0
  135. package/dist/test/service/filterService.js +144 -0
  136. package/dist/test/service/handlerService.js +65 -0
  137. package/dist/test/service/sessionService.js +387 -0
  138. package/dist/test/util/countDownLatch.js +70 -0
  139. package/dist/test/util/pathUtil.js +108 -0
  140. package/dist/test/util/utils.js +140 -0
  141. package/lib/application.ts +1240 -0
  142. package/lib/common/manager/appManager.ts +118 -0
  143. package/lib/common/manager/taskManager.ts +50 -0
  144. package/lib/common/remote/backend/msgRemote.ts +134 -0
  145. package/lib/common/remote/frontend/channelRemote.ts +91 -0
  146. package/lib/common/remote/frontend/sessionRemote.ts +91 -0
  147. package/lib/common/service/backendSessionService.ts +388 -0
  148. package/lib/common/service/channelService.ts +609 -0
  149. package/lib/common/service/connectionService.ts +112 -0
  150. package/lib/common/service/filterService.ts +118 -0
  151. package/lib/common/service/handlerService.ts +224 -0
  152. package/lib/common/service/sessionService.ts +731 -0
  153. package/lib/components/backendSession.ts +14 -0
  154. package/lib/components/channel.ts +11 -0
  155. package/lib/components/connection.ts +13 -0
  156. package/lib/components/connector.ts +533 -0
  157. package/lib/components/dictionary.ts +121 -0
  158. package/lib/components/master.ts +41 -0
  159. package/lib/components/monitor.ts +30 -0
  160. package/lib/components/protobuf.ts +208 -0
  161. package/lib/components/proxy.ts +282 -0
  162. package/lib/components/pushScheduler.ts +70 -0
  163. package/lib/components/remote.ts +166 -0
  164. package/lib/components/server.ts +71 -0
  165. package/lib/components/session.ts +22 -0
  166. package/lib/connectors/commands/handshake.ts +155 -0
  167. package/lib/connectors/commands/heartbeat.ts +83 -0
  168. package/lib/connectors/commands/kick.ts +11 -0
  169. package/lib/connectors/common/coder.ts +93 -0
  170. package/lib/connectors/common/handler.ts +62 -0
  171. package/lib/connectors/hybrid/IHybridSocket.ts +9 -0
  172. package/lib/connectors/hybrid/switcher.ts +142 -0
  173. package/lib/connectors/hybrid/tcpprocessor.ts +43 -0
  174. package/lib/connectors/hybrid/tcpsocket.ts +223 -0
  175. package/lib/connectors/hybrid/wsprocessor.ts +57 -0
  176. package/lib/connectors/hybridconnector.ts +134 -0
  177. package/lib/connectors/hybridsocket.ts +168 -0
  178. package/lib/connectors/mqtt/generate.ts +103 -0
  179. package/lib/connectors/mqtt/mqttadaptor.ts +114 -0
  180. package/lib/connectors/mqtt/protocol.ts +49 -0
  181. package/lib/connectors/mqttconnector.ts +134 -0
  182. package/lib/connectors/mqttsocket.ts +79 -0
  183. package/lib/connectors/sioconnector.ts +161 -0
  184. package/lib/connectors/siosocket.ts +85 -0
  185. package/lib/connectors/udpconnector.ts +113 -0
  186. package/lib/connectors/udpsocket.ts +110 -0
  187. package/lib/filters/handler/serial.ts +46 -0
  188. package/lib/filters/handler/time.ts +35 -0
  189. package/lib/filters/handler/timeout.ts +50 -0
  190. package/lib/filters/handler/toobusy.ts +37 -0
  191. package/lib/filters/rpc/rpcLog.ts +42 -0
  192. package/lib/filters/rpc/toobusy.ts +41 -0
  193. package/lib/index.ts +74 -0
  194. package/lib/interfaces/IComponent.ts +47 -0
  195. package/lib/interfaces/IConnector.ts +20 -0
  196. package/lib/interfaces/IHandlerFilter.ts +15 -0
  197. package/lib/interfaces/ILifeCycle.ts +16 -0
  198. package/lib/interfaces/IPlugin.ts +65 -0
  199. package/lib/interfaces/IPushScheduler.ts +52 -0
  200. package/lib/interfaces/ISocket.ts +26 -0
  201. package/lib/interfaces/IStore.ts +10 -0
  202. package/lib/interfaces/define.ts +15 -0
  203. package/lib/master/master.ts +148 -0
  204. package/lib/master/starter.ts +234 -0
  205. package/lib/master/watchdog.ts +135 -0
  206. package/lib/melo.ts +152 -0
  207. package/lib/modules/console.ts +465 -0
  208. package/lib/modules/masterwatcher.ts +120 -0
  209. package/lib/modules/monitorwatcher.ts +151 -0
  210. package/lib/modules/onlineUser.ts +78 -0
  211. package/lib/modules/restartNotifyModule.ts +128 -0
  212. package/lib/modules/watchServer.ts +766 -0
  213. package/lib/monitor/monitor.ts +99 -0
  214. package/lib/pushSchedulers/buffer.ts +117 -0
  215. package/lib/pushSchedulers/direct.ts +65 -0
  216. package/lib/pushSchedulers/multi.ts +94 -0
  217. package/lib/server/server.ts +554 -0
  218. package/lib/util/appUtil.ts +313 -0
  219. package/lib/util/constants.ts +154 -0
  220. package/lib/util/countDownLatch.ts +72 -0
  221. package/lib/util/events.ts +15 -0
  222. package/lib/util/handlerHelper.ts +5 -0
  223. package/lib/util/log.ts +11 -0
  224. package/lib/util/moduleUtil.ts +110 -0
  225. package/lib/util/pathUtil.ts +132 -0
  226. package/lib/util/remoterHelper.ts +68 -0
  227. package/lib/util/utils.ts +365 -0
  228. package/package.json +93 -0
  229. package/template/game-server/.vscode/launch.json +27 -0
  230. package/template/game-server/app/servers/connector/handler/entryHandler.ts +50 -0
  231. package/template/game-server/app/servers/connector/remote/authRemoter.ts +36 -0
  232. package/template/game-server/app.ts +30 -0
  233. package/template/game-server/app.ts.mqtt +32 -0
  234. package/template/game-server/app.ts.sio +36 -0
  235. package/template/game-server/app.ts.sio.wss +34 -0
  236. package/template/game-server/app.ts.udp +31 -0
  237. package/template/game-server/app.ts.wss +40 -0
  238. package/template/game-server/config/adminServer.json +5 -0
  239. package/template/game-server/config/adminUser.json +22 -0
  240. package/template/game-server/config/clientProtos.json +1 -0
  241. package/template/game-server/config/dictionary.json +1 -0
  242. package/template/game-server/config/log4js.json +150 -0
  243. package/template/game-server/config/master.json +8 -0
  244. package/template/game-server/config/serverProtos.json +1 -0
  245. package/template/game-server/config/servers.json +12 -0
  246. package/template/game-server/copy.js +5 -0
  247. package/template/game-server/package.json +28 -0
  248. package/template/game-server/preload.ts +40 -0
  249. package/template/game-server/tsconfig.json +36 -0
  250. package/template/npm-install.bat +4 -0
  251. package/template/npm-install.sh +5 -0
  252. package/template/readme.md +31 -0
  253. package/template/shared/server.crt +15 -0
  254. package/template/shared/server.key +15 -0
  255. package/template/web-server/app.js +25 -0
  256. package/template/web-server/app.js.https +36 -0
  257. package/template/web-server/bin/component.bat +1 -0
  258. package/template/web-server/bin/component.sh +1 -0
  259. package/template/web-server/package.json +10 -0
  260. package/template/web-server/public/css/base.css +76 -0
  261. package/template/web-server/public/image/logo.png +0 -0
  262. package/template/web-server/public/image/sp.png +0 -0
  263. package/template/web-server/public/index.html +57 -0
  264. package/template/web-server/public/index.html.sio +58 -0
  265. package/template/web-server/public/js/lib/build/build.js +1730 -0
  266. package/template/web-server/public/js/lib/build/build.js.wss +1721 -0
  267. package/template/web-server/public/js/lib/component.json +6 -0
  268. package/template/web-server/public/js/lib/local/boot/component.json +11 -0
  269. package/template/web-server/public/js/lib/local/boot/index.js +11 -0
  270. package/template/web-server/public/js/lib/meloclient.js +456 -0
  271. package/template/web-server/public/js/lib/meloclient.js.wss +456 -0
  272. package/template/web-server/public/js/lib/socket.io.js +3 -0
  273. package/test/application.ts +607 -0
  274. package/test/filters/handler/serial.ts +47 -0
  275. package/test/filters/handler/time.ts +47 -0
  276. package/test/filters/handler/timeout.ts +46 -0
  277. package/test/filters/handler/toobusy.ts +59 -0
  278. package/test/filters/rpc/rpcLog.ts +20 -0
  279. package/test/filters/rpc/toobusy.ts +40 -0
  280. package/test/manager/mockChannelManager.ts +92 -0
  281. package/test/manager/taskManager.ts +78 -0
  282. package/test/mock-base/app/servers/other-file +0 -0
  283. package/test/mock-plugin/components/mockPlugin.ts +8 -0
  284. package/test/mock-plugin/events/mockEvent.ts +12 -0
  285. package/test/modules/console.ts +264 -0
  286. package/test/pomelo.ts +18 -0
  287. package/test/remote/channelRemote.ts +176 -0
  288. package/test/service/channel.ts +161 -0
  289. package/test/service/channelService.ts +243 -0
  290. package/test/service/connectionService.ts +142 -0
  291. package/test/service/filterService.ts +165 -0
  292. package/test/service/handlerService.ts +77 -0
  293. package/test/service/sessionService.ts +464 -0
  294. package/test/util/countDownLatch.ts +81 -0
  295. package/test/util/pathUtil.ts +122 -0
  296. package/test/util/utils.ts +165 -0
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Filter for rpc log.
3
+ * Reject rpc request when toobusy
4
+ */
5
+ import {getLogger} from '@bigtyphoon/melo-logger';
6
+ import {IRpcFilter} from '@bigtyphoon/melo-rpc';
7
+
8
+ let rpcLogger = getLogger('rpc-log', __filename);
9
+ let toobusy: any = null;
10
+
11
+ let DEFAULT_MAXLAG = 70;
12
+
13
+
14
+ export class RpcToobusyFilter implements IRpcFilter {
15
+ constructor(maxLag = DEFAULT_MAXLAG) {
16
+ try {
17
+ toobusy = require('toobusy');
18
+ } catch (e) {
19
+ }
20
+ if (!!toobusy) {
21
+ toobusy.maxLag(maxLag);
22
+ }
23
+ }
24
+
25
+ name = 'toobusy';
26
+
27
+ /**
28
+ * Before filter for rpc
29
+ */
30
+ before(serverId: string, msg: any, opts: any, next: (target?: Error | string, message?: any, options?: any) => void) {
31
+ opts = opts || {};
32
+ if (!!toobusy && toobusy()) {
33
+ rpcLogger.warn('Server too busy for rpc request, serverId:' + serverId + ' msg: ' + msg);
34
+ let err = new Error('Backend server ' + serverId + ' is too busy now!');
35
+ (err as any).code = 500;
36
+ next(err);
37
+ } else {
38
+ next();
39
+ }
40
+ }
41
+ }
package/lib/index.ts ADDED
@@ -0,0 +1,74 @@
1
+ export * from './melo';
2
+
3
+ export * from './application';
4
+ export * from './common/service/backendSessionService';
5
+ export * from './common/service/channelService';
6
+ export * from './common/service/connectionService';
7
+ export * from './common/service/filterService';
8
+ export * from './common/service/handlerService';
9
+ export * from './common/service/sessionService';
10
+
11
+ export * from './connectors/hybridconnector';
12
+ export * from './connectors/udpconnector';
13
+ export * from './connectors/mqttconnector';
14
+ export * from './connectors/sioconnector';
15
+
16
+
17
+ export * from './pushSchedulers/direct';
18
+ export * from './pushSchedulers/buffer';
19
+
20
+ export * from './components/connection';
21
+ export * from './components/connector';
22
+ export * from './components/dictionary';
23
+ export * from './components/master';
24
+ export * from './components/monitor';
25
+ export * from './components/protobuf';
26
+ export * from './components/proxy';
27
+ export * from './components/pushScheduler';
28
+ export * from './components/remote';
29
+ export * from './components/server';
30
+ export * from './components/session';
31
+ export * from './components/backendSession';
32
+ export * from './components/channel';
33
+
34
+
35
+ export {RestartNotifyModule} from './modules/restartNotifyModule';
36
+
37
+ export * from './server/server';
38
+ export * from './monitor/monitor';
39
+ export * from './pushSchedulers/direct';
40
+ export * from './pushSchedulers/buffer';
41
+ export * from './pushSchedulers/multi';
42
+
43
+ export * from './filters/rpc/toobusy';
44
+ export * from './filters/rpc/rpcLog';
45
+ export * from './filters/handler/toobusy';
46
+ export * from './filters/handler/time';
47
+ export * from './filters/handler/serial';
48
+ export * from './filters/handler/timeout';
49
+
50
+ export {default as events} from './util/events';
51
+ export * from './util/constants';
52
+ export * from './util/utils';
53
+ export * from './util/pathUtil';
54
+ export * from './util/remoterHelper';
55
+ export * from './util/handlerHelper';
56
+
57
+
58
+ export * from './interfaces/define';
59
+ export * from './interfaces/IComponent';
60
+ export * from './interfaces/IConnector';
61
+ export * from './interfaces/IHandlerFilter';
62
+ export * from './interfaces/ILifeCycle';
63
+ export * from './interfaces/IPlugin';
64
+ export * from './interfaces/IPushScheduler';
65
+ export * from './interfaces/ISocket';
66
+ export * from './interfaces/IStore';
67
+
68
+ export * from '@bigtyphoon/melo-admin';
69
+ export * from '@bigtyphoon/melo-loader';
70
+ export * from '@bigtyphoon/melo-logger';
71
+ export * from '@bigtyphoon/melo-protobuf';
72
+ export * from '@bigtyphoon/melo-protocol';
73
+ export * from '@bigtyphoon/melo-rpc';
74
+ export * from '@bigtyphoon/melo-scheduler';
@@ -0,0 +1,47 @@
1
+
2
+
3
+ export interface IComponent {
4
+ name: string;
5
+ /**
6
+ * Component lifecycle callback
7
+ *
8
+ * @param {Function} cb
9
+ * @return {Void}
10
+ */
11
+ beforeStart?: (cb: () => void) => void;
12
+
13
+ /**
14
+ * Component lifecycle callback
15
+ *
16
+ * @param {Function} cb
17
+ * @return {Void}
18
+ */
19
+ start ?: (cb: () => void) => void;
20
+
21
+ /**
22
+ * Component lifecycle callback
23
+ *
24
+ * @param {Function} cb
25
+ * @return {Void}
26
+ */
27
+ afterStart?: (cb: () => void) => void;
28
+
29
+ /**
30
+ * Component lifecycle callback
31
+ * 所有进程启动好以后的通知。单个进程重启是不会有这个通知的。
32
+ * 如果单独重启了master。 master内会有一个计数器。 其它进程重启到这个次数,就会发送这个通知(也就是说有可能重复通知afterStartAll)。
33
+ * 可以通过注册使用 RestartNotifyModule admin模块,来实现重启单个逻辑进程时通知这个事件(这个模块可以避免重复通知)。
34
+ *
35
+ * @return {Void}
36
+ */
37
+ afterStartAll ?: () => void;
38
+
39
+ /**
40
+ * Component lifecycle function
41
+ *
42
+ * @param {Boolean} force whether stop the component immediately
43
+ * @param {Function} cb
44
+ * @return {Void}
45
+ */
46
+ stop?: (force: boolean, cb: () => void) => void;
47
+ }
@@ -0,0 +1,20 @@
1
+ import { ISocket } from './ISocket';
2
+
3
+ export type IEncoder = (reqId: number, route: string, msg: any) =>
4
+ {
5
+ id: number,
6
+ body: any
7
+ } | any;
8
+
9
+ export type IDecoder = (msg: any) => { id: number, route: string, body: any };
10
+
11
+ export interface IConnector {
12
+ start(cb: () => void): void;
13
+ stop(force: boolean, cb: () => void): void;
14
+ encode ?: IEncoder;
15
+
16
+ decode ?: IDecoder;
17
+
18
+ on(evt: 'connection' , listener: (cb: (socket: ISocket) => boolean, socket: ISocket) => void): void;
19
+
20
+ }
@@ -0,0 +1,15 @@
1
+ import { RouteRecord } from '../util/constants';
2
+ import { HandlerCallback } from '../common/service/handlerService';
3
+ import { FrontendOrBackendSession } from '../server/server';
4
+
5
+
6
+ export type BeforeHandlerFilterFunction = (routeRecord: RouteRecord , msg: any, session: FrontendOrBackendSession, cb: HandlerCallback) => void;
7
+ export type AfterHandlerFilterFunction = (err: Error, routeRecord: RouteRecord , msg: any, session: FrontendOrBackendSession, resp: any, cb: HandlerCallback) => void;
8
+
9
+ export interface IHandlerFilter {
10
+ before ?: BeforeHandlerFilterFunction;
11
+ after ?: AfterHandlerFilterFunction;
12
+ }
13
+
14
+ export type BeforeHandlerFilter = BeforeHandlerFilterFunction | IHandlerFilter;
15
+ export type AfterHandlerFilter = AfterHandlerFilterFunction | IHandlerFilter;
@@ -0,0 +1,16 @@
1
+ import { Application } from '../application';
2
+ import { IComponent } from './IComponent';
3
+
4
+ /**
5
+ * 服务器生命周期
6
+ */
7
+ export interface ILifeCycle {
8
+ beforeStartup ?: (app: Application , cb: () => void) => void;
9
+ afterStartup ?: (app: Application , cb: () => void) => void;
10
+ // 所有进程启动好以后的通知。单个进程重启是不会有这个通知的。
11
+ // 如果单独重启了master。 master内会有一个计数器。 其它进程重启到这个次数,就会发送这个通知(也就是说有可能重复通知afterStartAll)。
12
+ // 可以通过注册使用 RestartNotifyModule admin模块,来实现重启单个逻辑进程时通知这个事件(这个模块可以避免重复通知)。
13
+ afterStartAll ?: (app: Application) => void;
14
+
15
+ beforeShutdown ?: (app: Application , shutDown: () => void , cancelShutDownTimer: () => void) => void;
16
+ }
@@ -0,0 +1,65 @@
1
+
2
+ import {default as AppEvents} from '../util/events';
3
+ import { ServerInfo } from '../util/constants';
4
+ import { ObjectType } from './define';
5
+ import { ILifeCycle } from './ILifeCycle';
6
+ import { IComponent } from './IComponent';
7
+ import { Cron } from '../server/server';
8
+ import { Session } from '../index';
9
+ import { Application } from '../application';
10
+
11
+ export interface ComponentContructor {
12
+ new(app: Application, opts ?: any): IComponent;
13
+ }
14
+
15
+ export interface IApplicationEvent {
16
+ add_servers ?: (servers: ServerInfo[]) => void;
17
+ remove_servers ?: (servers: ServerInfo[]) => void;
18
+ replace_servers ?: (servers: ServerInfo[]) => void;
19
+ bind_session ?: (session: Session) => void;
20
+ unbind_session ?: (session: Session) => void;
21
+ close_session ?: (session: Session) => void;
22
+ add_crons ?: (crons: Cron[]) => void;
23
+ remove_crons ?: (crons: Cron[]) => void;
24
+ start_server ?: (serverId: string) => void;
25
+ start_all ?: () => void;
26
+ }
27
+
28
+ export interface ApplicationEventContructor {
29
+ new(opts ?: any): IApplicationEvent;
30
+ }
31
+
32
+ /**
33
+ * 一个melo插件
34
+ */
35
+ export interface IPlugin extends ILifeCycle {
36
+ /**
37
+ * 插件的名称
38
+ */
39
+ name: string;
40
+
41
+ /**
42
+ * 启动插件时需要自动加载的组件
43
+ */
44
+ components ?: ComponentContructor[];
45
+
46
+ /**
47
+ * 启动插件时需要侦听的应用程序事件
48
+ */
49
+ events ?: ApplicationEventContructor[];
50
+
51
+ /**
52
+ * 插件暴漏的handler所在的路径
53
+ */
54
+ handlerPath ?: string;
55
+
56
+ /**
57
+ * 插件暴漏的remoters所在的路径
58
+ */
59
+ remoterPath?: string;
60
+
61
+ /**
62
+ * 插件暴漏的crons所在的路径
63
+ */
64
+ cronPath ?: string;
65
+ }
@@ -0,0 +1,52 @@
1
+ import { SID } from '../util/constants';
2
+ import { Application } from '../application';
3
+
4
+
5
+ export interface BroadcastOptions {
6
+ binded: boolean ;
7
+ filterParam: any;
8
+ }
9
+ export interface ScheduleOptions {
10
+ type ?: 'broadcast' | 'response';
11
+ userOptions ?: BroadcastOptions;
12
+ }
13
+
14
+ export type IPushSelector = (reqId: number, route: string, msg: any, recvs: number[], opts: any) => number;
15
+
16
+ export type IPushSchedulerOrCtor = { new(app: Application, opts?: any): IPushScheduler } | IPushScheduler;
17
+
18
+ export interface SinglePushScheduler {
19
+ scheduler ?: IPushSchedulerOrCtor;
20
+ }
21
+
22
+ export interface MultiPushSchedulerOptions {
23
+ scheduler ?: {id: number , scheduler: IPushSchedulerOrCtor , options: IPushSchedulerOptions}[];
24
+ selector ?: IPushSelector;
25
+ }
26
+
27
+ export type IPushSchedulerOptions = SinglePushScheduler | MultiPushSchedulerOptions;
28
+
29
+ export interface IPushScheduler {
30
+
31
+ /**
32
+ * Component lifecycle callback
33
+ *
34
+ * @param {Function} cb
35
+ * @return {Void}
36
+ */
37
+ start(): Promise<void>;
38
+
39
+ /**
40
+ * Component lifecycle function
41
+ *
42
+ * @param {Boolean} force whether stop the component immediately
43
+ * @param {Function} cb
44
+ * @return {Void}
45
+ */
46
+ stop(): Promise<void>;
47
+
48
+ /**
49
+ * 调度发生时调用
50
+ */
51
+ schedule(reqId: number, route: string, msg: any, recvs: SID[], opts: ScheduleOptions, cb: (err?: Error) => void): void;
52
+ }
@@ -0,0 +1,26 @@
1
+
2
+ export interface ISocket {
3
+ once(evt: 'disconnect', listener: () => void): void;
4
+ once(evt: 'error', listener: () => void): void;
5
+ on(evt: 'disconnect', listener: (reason: string) => void): void;
6
+ on(evt: 'error', listener: (reason: string) => void): void;
7
+ on(evt: 'message', listener: (msg: any) => void): void;
8
+ send(msg: any): void;
9
+ sendRaw(msg: any): void;
10
+ disconnect(): void;
11
+ sendBatch(msgs: any[]): void;
12
+
13
+ emit(evt: 'heartbeat'): void;
14
+ emit(evt: 'message' , pkg: any): void;
15
+ emit(evt: 'closing' , reason: string): void;
16
+ emit(evt: 'handshake' , pkg: any): void;
17
+
18
+ state: number;
19
+
20
+ id ?: number;
21
+
22
+ handshakeResponse ?: (response: any) => void;
23
+ sendForce ?: (response: any) => void;
24
+
25
+ remoteAddress ?: {ip: string , port ?: number};
26
+ }
@@ -0,0 +1,10 @@
1
+
2
+ /**
3
+ * 存储虚接口
4
+ */
5
+ export interface IStore {
6
+ add(key: string, value: string, done: (err?: Error) => void): void;
7
+ remove(key: string, value: string, done: (err?: Error) => void): void;
8
+ load(key: string, done: (err?: Error , list ?: Array<string>) => void): void;
9
+ removeAll(key: string, done: (err?: Error) => void): void;
10
+ }
@@ -0,0 +1,15 @@
1
+ /**
2
+ * master server info
3
+ */
4
+ export interface MasterInfo {
5
+ id: string;
6
+ host: string;
7
+ port: number;
8
+ }
9
+
10
+ /**
11
+ * Represents some Type of the Object.
12
+ */
13
+ export type ObjectType<T> = {
14
+ new (): T;
15
+ };
@@ -0,0 +1,148 @@
1
+ import * as starter from './starter';
2
+ import { getLogger } from '@bigtyphoon/melo-logger';
3
+ import * as path from 'path';
4
+
5
+ let logger = getLogger('melo', path.basename(__filename));
6
+ let crashLogger = getLogger('crash-log', path.basename(__filename));
7
+ let adminLogger = getLogger('admin-log', path.basename(__filename));
8
+ import * as admin from '@bigtyphoon/melo-admin';
9
+ import * as util from 'util';
10
+ import * as utils from '../util/utils';
11
+ import * as moduleUtil from '../util/moduleUtil';
12
+ import * as Constants from '../util/constants';
13
+ import { Application } from '../application';
14
+ import { ConsoleService, ConsoleServiceOpts } from '@bigtyphoon/melo-admin';
15
+ import { IModule } from '../index';
16
+
17
+
18
+ export type MasterServerOptions =
19
+ {
20
+ port?: number;
21
+ env?: string;
22
+ closeWatcher?: boolean;
23
+ } & Partial<ConsoleServiceOpts>;
24
+
25
+ export class MasterServer {
26
+ app: Application;
27
+ masterInfo: any;
28
+ registered = {};
29
+ modules: IModule[] = [];
30
+ closeWatcher: boolean;
31
+ masterConsole: ConsoleService;
32
+
33
+ constructor(app: Application, opts?: MasterServerOptions) {
34
+ this.app = app;
35
+ this.masterInfo = app.getMaster();
36
+ opts = opts || {};
37
+
38
+ opts.port = this.masterInfo.port;
39
+ opts.env = this.app.get(Constants.RESERVED.ENV);
40
+ this.closeWatcher = opts.closeWatcher || false;
41
+ this.masterConsole = admin.createMasterConsole(opts);
42
+ }
43
+
44
+
45
+ start(cb: (err?: Error) => void) {
46
+ moduleUtil.registerDefaultModules(true, this.app, this.closeWatcher);
47
+ moduleUtil.loadModules(this, this.masterConsole);
48
+
49
+ let self = this;
50
+ // start master console
51
+ this.masterConsole.start(function (err) {
52
+ if (err) {
53
+ process.exit(0);
54
+ }
55
+ moduleUtil.startModules(self.modules, function (err: Error) {
56
+ if (err) {
57
+ utils.invokeCallback(cb, err);
58
+ return;
59
+ }
60
+
61
+ if (self.app.get(Constants.RESERVED.MODE) !== Constants.RESERVED.STAND_ALONE) {
62
+ starter.runServers(self.app);
63
+ }
64
+ utils.invokeCallback(cb);
65
+ });
66
+ });
67
+
68
+ this.masterConsole.on('error', function (err) {
69
+ if (!!err) {
70
+ logger.error('masterConsole encounters with error: ' + err.stack);
71
+ return;
72
+ }
73
+ });
74
+
75
+ this.masterConsole.on('reconnect', function (info) {
76
+ self.app.addServers([info]);
77
+ });
78
+
79
+ // monitor servers disconnect event
80
+ this.masterConsole.on('disconnect', function (id, type, info, reason) {
81
+ crashLogger.info(util.format('[%s],[%s],[%s],[%s]', type, id, Date.now(), reason || 'disconnect'));
82
+ let count = 0;
83
+ let time = 0;
84
+ let pingTimer: NodeJS.Timeout = null;
85
+ let server = self.app.getServerById(id);
86
+ let stopFlags = self.app.get(Constants.RESERVED.STOP_SERVERS) || [];
87
+ let autoRestart: any = server && server[Constants.RESERVED.AUTO_RESTART] || '';
88
+ let restartForce: any = server && server[Constants.RESERVED.RESTART_FORCE] || '';
89
+ if ((autoRestart.toString() === 'true' || restartForce.toString() === 'true') && stopFlags.indexOf(id) < 0) {
90
+ let handle = function () {
91
+ clearTimeout(pingTimer);
92
+ utils.checkPort(self.app, server, function (status) {
93
+ if (status === 'error') {
94
+ utils.invokeCallback(cb, new Error('Check port command executed with error.'));
95
+ return;
96
+ } else if (status === 'busy') {
97
+ if (!!server[Constants.RESERVED.RESTART_FORCE]) {
98
+ starter.kill(self.app, [info.pid], [server]);
99
+ } else {
100
+ utils.invokeCallback(cb, new Error('Port occupied already, check your server to add.'));
101
+ return;
102
+ }
103
+ }
104
+ setTimeout(function () {
105
+ starter.run(self.app, server, null);
106
+ }, Constants.TIME.TIME_WAIT_STOP);
107
+ });
108
+ };
109
+ let setTimer = function (time: number) {
110
+ pingTimer = setTimeout(function () {
111
+ utils.ping(server.host, function (flag) {
112
+ if (flag) {
113
+ handle();
114
+ } else {
115
+ count++;
116
+ if (count > 3) {
117
+ time = Constants.TIME.TIME_WAIT_MAX_PING;
118
+ } else {
119
+ time = Constants.TIME.TIME_WAIT_PING * count;
120
+ }
121
+ setTimer(time);
122
+ }
123
+ });
124
+ }, time);
125
+ };
126
+ setTimer(time);
127
+ }
128
+ });
129
+
130
+ // monitor servers register event
131
+ this.masterConsole.on('register', function (record) {
132
+ starter.bindCpu(self.app, record.id, record.pid, record.host);
133
+ });
134
+
135
+ this.masterConsole.on('admin-log', function (log, error) {
136
+ if (error) {
137
+ adminLogger.error(JSON.stringify(log));
138
+ } else {
139
+ adminLogger.info(JSON.stringify(log));
140
+ }
141
+ });
142
+ }
143
+
144
+ stop(cb: () => void) {
145
+ this.masterConsole.stop();
146
+ process.nextTick(cb);
147
+ }
148
+ }