@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,63 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ServerComponent = void 0;
4
+ /**
5
+ * Component for server starup.
6
+ */
7
+ const server_1 = require("../server/server");
8
+ /**
9
+ * Server component class
10
+ *
11
+ * @param {Object} app current application context
12
+ */
13
+ class ServerComponent {
14
+ constructor(app, opts) {
15
+ this.name = '__server__';
16
+ this.server = (0, server_1.create)(app, opts);
17
+ }
18
+ /**
19
+ * Component lifecycle callback
20
+ *
21
+ * @param {Function} cb
22
+ * @return {Void}
23
+ */
24
+ start(cb) {
25
+ this.server.start();
26
+ process.nextTick(cb);
27
+ }
28
+ /**
29
+ * Component lifecycle callback
30
+ *
31
+ * @param {Function} cb
32
+ * @return {Void}
33
+ */
34
+ afterStart(cb) {
35
+ this.server.afterStart();
36
+ process.nextTick(cb);
37
+ }
38
+ /**
39
+ * Component lifecycle function
40
+ *
41
+ * @param {Boolean} force whether stop the component immediately
42
+ * @param {Function} cb
43
+ * @return {Void}
44
+ */
45
+ stop(force, cb) {
46
+ this.server.stop();
47
+ process.nextTick(cb);
48
+ }
49
+ /**
50
+ * Proxy server handle
51
+ */
52
+ handle(msg, session, cb) {
53
+ this.server.handle(msg, session, cb);
54
+ }
55
+ /**
56
+ * Proxy server global handle
57
+ */
58
+ globalHandle(msg, session, cb) {
59
+ this.server.globalHandle(msg, session, cb);
60
+ }
61
+ }
62
+ exports.ServerComponent = ServerComponent;
63
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL2NvbXBvbmVudHMvc2VydmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBOztHQUVHO0FBQ0gsNkNBQTRHO0FBTzVHOzs7O0dBSUc7QUFDSCxNQUFhLGVBQWU7SUFFeEIsWUFBWSxHQUFnQixFQUFFLElBQW1CO1FBR2pELFNBQUksR0FBRyxZQUFZLENBQUM7UUFGaEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFBLGVBQVksRUFBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUdEOzs7OztPQUtHO0lBQ0gsS0FBSyxDQUFDLEVBQWM7UUFDaEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNwQixPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILFVBQVUsQ0FBQyxFQUFjO1FBQ3JCLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDekIsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUN6QixDQUFDO0lBR0Q7Ozs7OztPQU1HO0lBQ0gsSUFBSSxDQUFDLEtBQWMsRUFBRSxFQUFjO1FBQy9CLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDbkIsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUN6QixDQUFDO0lBRUQ7O09BRUc7SUFDSCxNQUFNLENBQUMsR0FBUSxFQUFFLE9BQWlDLEVBQUUsRUFBbUI7UUFDbkUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxZQUFZLENBQUMsR0FBUSxFQUFFLE9BQWlDLEVBQUUsRUFBbUI7UUFDekUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQztJQUMvQyxDQUFDO0NBQ0o7QUF2REQsMENBdURDIn0=
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SessionComponent = void 0;
4
+ const sessionService_1 = require("../common/service/sessionService");
5
+ /**
6
+ * Session component. Manage sessions.
7
+ *
8
+ * @param {Object} app current application context
9
+ * @param {Object} opts attach parameters
10
+ */
11
+ class SessionComponent extends sessionService_1.SessionService {
12
+ constructor(app, opts) {
13
+ super(opts);
14
+ this.name = '__session__';
15
+ this.app = app;
16
+ app.set('sessionService', this, true);
17
+ }
18
+ }
19
+ exports.SessionComponent = SessionComponent;
20
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Vzc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9jb21wb25lbnRzL3Nlc3Npb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEscUVBQXlGO0FBS3pGOzs7OztHQUtHO0FBQ0gsTUFBYSxnQkFBaUIsU0FBUSwrQkFBYztJQUVoRCxZQUFZLEdBQWdCLEVBQUUsSUFBNkI7UUFDdkQsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBS2hCLFNBQUksR0FBRyxhQUFhLENBQUM7UUFKakIsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7UUFDZixHQUFHLENBQUMsR0FBRyxDQUFDLGdCQUFnQixFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztJQUMxQyxDQUFDO0NBSUo7QUFWRCw0Q0FVQyJ9
@@ -0,0 +1,119 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.HandshakeCommand = void 0;
4
+ const melo_1 = require("../../melo");
5
+ const melo_protocol_1 = require("@bigtyphoon/melo-protocol");
6
+ let CODE_OK = 200;
7
+ let CODE_USE_ERROR = 500;
8
+ let CODE_OLD_CLIENT = 501;
9
+ /**
10
+ * Process the handshake request.
11
+ *
12
+ * @param {Object} opts option parameters
13
+ * opts.handshake(msg, cb(err, resp)) handshake callback. msg is the handshake message from client.
14
+ * opts.hearbeat heartbeat interval (level?)
15
+ * opts.version required client level
16
+ */
17
+ class HandshakeCommand {
18
+ constructor(opts) {
19
+ opts = opts || {};
20
+ this.userHandshake = opts.handshake;
21
+ if (opts.heartbeat) {
22
+ this.heartbeatSec = opts.heartbeat;
23
+ this.heartbeat = opts.heartbeat * 1000;
24
+ }
25
+ this.checkClient = opts.checkClient;
26
+ this.useDict = opts.useDict;
27
+ this.useProtobuf = opts.useProtobuf;
28
+ this.useCrypto = opts.useCrypto;
29
+ }
30
+ handle(socket, msg) {
31
+ if (!msg.sys) {
32
+ processError(socket, CODE_USE_ERROR);
33
+ return;
34
+ }
35
+ if (typeof this.checkClient === 'function') {
36
+ if (!msg || !msg.sys || !this.checkClient(msg.sys.type, msg.sys.version)) {
37
+ processError(socket, CODE_OLD_CLIENT);
38
+ return;
39
+ }
40
+ }
41
+ let opts = {
42
+ heartbeat: setupHeartbeat(this)
43
+ };
44
+ if (this.useDict) {
45
+ let dictVersion = melo_1.melo.app.components.__dictionary__.getVersion();
46
+ if (!msg.sys.dictVersion || msg.sys.dictVersion !== dictVersion) {
47
+ // may be deprecated in future
48
+ opts.dict = melo_1.melo.app.components.__dictionary__.getDict();
49
+ // 用不到这个。
50
+ // opts.routeToCode = melo.app.components.__dictionary__.getDict();
51
+ // opts.codeToRoute = melo.app.components.__dictionary__.getAbbrs();
52
+ opts.dictVersion = dictVersion;
53
+ }
54
+ opts.useDict = true;
55
+ }
56
+ if (this.useProtobuf) {
57
+ let protoVersion = melo_1.melo.app.components.__protobuf__.getVersion();
58
+ if (!msg.sys.protoVersion || msg.sys.protoVersion !== protoVersion) {
59
+ opts.protos = melo_1.melo.app.components.__protobuf__.getProtos();
60
+ }
61
+ opts.useProto = true;
62
+ }
63
+ if (!!melo_1.melo.app.components.__decodeIO__protobuf__) {
64
+ if (!!this.useProtobuf) {
65
+ throw new Error('protobuf can not be both used in the same project.');
66
+ }
67
+ let component = melo_1.melo.app.components.__decodeIO__protobuf__;
68
+ let version = component.getVersion();
69
+ if (!msg.sys.protoVersion || msg.sys.protoVersion < version) {
70
+ opts.protos = component.getProtos();
71
+ }
72
+ opts.useProto = true;
73
+ }
74
+ if (this.useCrypto) {
75
+ melo_1.melo.app.components.__connector__.setPubKey(socket.id, msg.sys.rsa);
76
+ }
77
+ if (typeof this.userHandshake === 'function') {
78
+ this.userHandshake(msg, function (err, resp) {
79
+ if (err) {
80
+ process.nextTick(function () {
81
+ processError(socket, CODE_USE_ERROR);
82
+ });
83
+ return;
84
+ }
85
+ process.nextTick(function () {
86
+ response(socket, opts, resp);
87
+ });
88
+ }, socket);
89
+ return;
90
+ }
91
+ process.nextTick(function () {
92
+ response(socket, opts);
93
+ });
94
+ }
95
+ }
96
+ exports.HandshakeCommand = HandshakeCommand;
97
+ let setupHeartbeat = function (self) {
98
+ return self.heartbeatSec;
99
+ };
100
+ let response = function (socket, sys, resp) {
101
+ let res = {
102
+ code: CODE_OK,
103
+ sys: sys
104
+ };
105
+ if (resp) {
106
+ res.user = resp;
107
+ }
108
+ socket.handshakeResponse(melo_protocol_1.Package.encode(melo_protocol_1.Package.TYPE_HANDSHAKE, Buffer.from(JSON.stringify(res))));
109
+ };
110
+ let processError = function (socket, code) {
111
+ let res = {
112
+ code: code
113
+ };
114
+ socket.sendForce(melo_protocol_1.Package.encode(melo_protocol_1.Package.TYPE_HANDSHAKE, Buffer.from(JSON.stringify(res))));
115
+ process.nextTick(function () {
116
+ socket.disconnect();
117
+ });
118
+ };
119
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFuZHNoYWtlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vbGliL2Nvbm5lY3RvcnMvY29tbWFuZHMvaGFuZHNoYWtlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHFDQUFrQztBQUNsQyw2REFBb0Q7QUFHcEQsSUFBSSxPQUFPLEdBQUcsR0FBRyxDQUFDO0FBQ2xCLElBQUksY0FBYyxHQUFHLEdBQUcsQ0FBQztBQUN6QixJQUFJLGVBQWUsR0FBRyxHQUFHLENBQUM7QUFjMUI7Ozs7Ozs7R0FPRztBQUNILE1BQWEsZ0JBQWdCO0lBU3pCLFlBQVksSUFBNkI7UUFDckMsSUFBSSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7UUFDbEIsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBRXBDLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNoQixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7WUFDbkMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztTQUMxQztRQUVELElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztRQUVwQyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDNUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUNwQyxDQUFDO0lBRUQsTUFBTSxDQUFDLE1BQWUsRUFBRSxHQUFRO1FBQzVCLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFO1lBQ1YsWUFBWSxDQUFDLE1BQU0sRUFBRSxjQUFjLENBQUMsQ0FBQztZQUNyQyxPQUFPO1NBQ1Y7UUFFRCxJQUFJLE9BQU8sSUFBSSxDQUFDLFdBQVcsS0FBSyxVQUFVLEVBQUU7WUFDeEMsSUFB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
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.HeartbeatCommand = void 0;
4
+ const melo_protocol_1 = require("@bigtyphoon/melo-protocol");
5
+ const melo_logger_1 = require("@bigtyphoon/melo-logger");
6
+ const path = require("path");
7
+ let logger = (0, melo_logger_1.getLogger)('melo', path.basename(__filename));
8
+ /**
9
+ * Process heartbeat request.
10
+ *
11
+ * @param {Object} opts option request
12
+ * opts.heartbeat heartbeat interval
13
+ */
14
+ class HeartbeatCommand {
15
+ constructor(opts) {
16
+ this.timeouts = {};
17
+ this.clients = {};
18
+ opts = opts || {};
19
+ this.disconnectOnTimeout = opts.disconnectOnTimeout;
20
+ if (opts.heartbeat) {
21
+ this.heartbeat = opts.heartbeat * 1000; // heartbeat interval
22
+ this.timeout = opts.timeout * 1000 || this.heartbeat * 2; // max heartbeat message timeout
23
+ this.disconnectOnTimeout = true;
24
+ }
25
+ }
26
+ handle(socket) {
27
+ if (!this.heartbeat) {
28
+ // no heartbeat setting
29
+ return;
30
+ }
31
+ let self = this;
32
+ if (!this.clients[socket.id]) {
33
+ // clear timers when socket disconnect or error
34
+ this.clients[socket.id] = 1;
35
+ socket.once('disconnect', this.clearTimers.bind(this, socket.id));
36
+ socket.once('error', this.clearTimers.bind(this, socket.id));
37
+ }
38
+ // clear timeout timer
39
+ if (self.disconnectOnTimeout) {
40
+ this.clear(socket.id);
41
+ }
42
+ socket.sendRaw(melo_protocol_1.Package.encode(melo_protocol_1.Package.TYPE_HEARTBEAT));
43
+ if (self.disconnectOnTimeout) {
44
+ self.timeouts[socket.id] = setTimeout(function () {
45
+ logger.info('client %j heartbeat timeout.', socket.id);
46
+ socket.disconnect();
47
+ }, self.timeout);
48
+ }
49
+ }
50
+ clear(id) {
51
+ let tid = this.timeouts[id];
52
+ if (tid) {
53
+ clearTimeout(tid);
54
+ delete this.timeouts[id];
55
+ }
56
+ }
57
+ clearTimers(id) {
58
+ delete this.clients[id];
59
+ let tid = this.timeouts[id];
60
+ if (tid) {
61
+ clearTimeout(tid);
62
+ delete this.timeouts[id];
63
+ }
64
+ }
65
+ }
66
+ exports.HeartbeatCommand = HeartbeatCommand;
67
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVhcnRiZWF0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vbGliL2Nvbm5lY3RvcnMvY29tbWFuZHMvaGVhcnRiZWF0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZEQUFvRDtBQUNwRCx5REFBb0Q7QUFFcEQsNkJBQTZCO0FBQzdCLElBQUksTUFBTSxHQUFHLElBQUEsdUJBQVMsRUFBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO0FBUzFEOzs7OztHQUtHO0FBQ0gsTUFBYSxnQkFBZ0I7SUFNekIsWUFBWSxJQUE4QjtRQUYxQyxhQUFRLEdBQTJDLEVBQUUsQ0FBQztRQUN0RCxZQUFPLEdBQW1DLEVBQUUsQ0FBQztRQUV6QyxJQUFJLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUNsQixJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDO1FBRXBELElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNoQixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLENBQUMscUJBQXFCO1lBQzdELElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLElBQUksSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBTSxnQ0FBZ0M7WUFDL0YsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQztTQUNuQztJQUVMLENBQUM7SUFFRCxNQUFNLENBQUMsTUFBZTtRQUNsQixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNqQix1QkFBdUI7WUFDdkIsT0FBTztTQUNWO1FBRUQsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBRWhCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsRUFBRTtZQUMxQiwrQ0FBK0M7WUFDL0MsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzVCLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNsRSxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7U0FDaEU7UUFFRCxzQkFBc0I7UUFDdEIsSUFBSSxJQUFJLENBQUMsbUJBQW1CLEVBQUU7WUFDMUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7U0FDekI7UUFFRCxNQUFNLENBQUMsT0FBTyxDQUFDLHVCQUFPLENBQUMsTUFBTSxDQUFDLHVCQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQztRQUV2RCxJQUFJLElBQUksQ0FBQyxtQkFBbUIsRUFBRTtZQUMxQixJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsR0FBRyxVQUFVLENBQUM7Z0JBQ2xDLE1BQU0sQ0FBQyxJQUFJLENBQUMsOEJBQThCLEVBQUUsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUN2RCxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDeEIsQ0FBQyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUNwQjtJQUNMLENBQUM7SUFFRCxLQUFLLENBQUMsRUFBVTtRQUNaLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDNUIsSUFBSSxHQUFHLEVBQUU7WUFDTCxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDbEIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQzVCO0lBQ0wsQ0FBQztJQUNELFdBQVcsQ0FBQyxFQUFVO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN4QixJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzVCLElBQUksR0FBRyxFQUFFO1lBQ0wsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2xCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUM1QjtJQUNMLENBQUM7Q0FDSjtBQS9ERCw0Q0ErREMifQ==
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.handle = void 0;
4
+ const melo_protocol_1 = require("@bigtyphoon/melo-protocol");
5
+ function handle(socket, reason) {
6
+ // websocket close code 1000 would emit when client close the connection
7
+ if (typeof reason === 'string') {
8
+ let res = {
9
+ reason: reason
10
+ };
11
+ socket.sendRaw(melo_protocol_1.Package.encode(melo_protocol_1.Package.TYPE_KICK, Buffer.from(JSON.stringify(res))));
12
+ }
13
+ }
14
+ exports.handle = handle;
15
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2ljay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9jb25uZWN0b3JzL2NvbW1hbmRzL2tpY2sudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkRBQW9EO0FBRXBELFNBQWdCLE1BQU0sQ0FBQyxNQUFlLEVBQUUsTUFBYztJQUNsRCx3RUFBd0U7SUFDeEUsSUFBSSxPQUFPLE1BQU0sS0FBSyxRQUFRLEVBQUU7UUFDNUIsSUFBSSxHQUFHLEdBQUc7WUFDTixNQUFNLEVBQUUsTUFBTTtTQUNqQixDQUFDO1FBQ0YsTUFBTSxDQUFDLE9BQU8sQ0FBQyx1QkFBTyxDQUFDLE1BQU0sQ0FBQyx1QkFBTyxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDdkY7QUFDTCxDQUFDO0FBUkQsd0JBUUMifQ==
@@ -0,0 +1,90 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.decode = exports.encode = void 0;
4
+ const melo_protocol_1 = require("@bigtyphoon/melo-protocol");
5
+ const Constants = require("../../util/constants");
6
+ const melo_logger_1 = require("@bigtyphoon/melo-logger");
7
+ const path = require("path");
8
+ let logger = (0, melo_logger_1.getLogger)('melo', path.basename(__filename));
9
+ let encode = function (reqId, route, msg) {
10
+ if (!!reqId) {
11
+ return composeResponse(this, reqId, route, msg);
12
+ }
13
+ else {
14
+ return composePush(this, route, msg);
15
+ }
16
+ };
17
+ exports.encode = encode;
18
+ let decode = function (msg) {
19
+ msg = melo_protocol_1.Message.decode(msg.body);
20
+ let route = msg.route;
21
+ // decode use dictionary
22
+ if (!!msg.compressRoute) {
23
+ if (!!this.connector.useDict) {
24
+ let abbrs = this.dictionary.getAbbrs();
25
+ if (!abbrs[route]) {
26
+ logger.error('dictionary error! no abbrs for route : %s', route);
27
+ return null;
28
+ }
29
+ route = msg.route = abbrs[route];
30
+ }
31
+ else {
32
+ logger.error('fail to uncompress route code for msg: %j, server not enable dictionary.', msg);
33
+ return null;
34
+ }
35
+ }
36
+ // decode use protobuf
37
+ if (!!this.protobuf && !!this.protobuf.getProtos().client[route]) {
38
+ msg.body = this.protobuf.decode(route, msg.body);
39
+ }
40
+ else if (!!this.decodeIO_protobuf && !!this.decodeIO_protobuf.check(Constants.RESERVED.CLIENT, route)) {
41
+ msg.body = this.decodeIO_protobuf.decode(route, msg.body);
42
+ }
43
+ else {
44
+ try {
45
+ msg.body = JSON.parse(msg.body.toString('utf8'));
46
+ }
47
+ catch (ex) {
48
+ msg.body = {};
49
+ }
50
+ }
51
+ return msg;
52
+ };
53
+ exports.decode = decode;
54
+ let composeResponse = function (server, msgId, route, msgBody) {
55
+ if (!msgId || !route || !msgBody) {
56
+ return null;
57
+ }
58
+ msgBody = encodeBody(server, route, msgBody);
59
+ return melo_protocol_1.Message.encode(msgId, melo_protocol_1.Message.TYPE_RESPONSE, false, null, msgBody);
60
+ };
61
+ let composePush = function (server, route, msgBody) {
62
+ if (!route || !msgBody) {
63
+ return null;
64
+ }
65
+ msgBody = encodeBody(server, route, msgBody);
66
+ // encode use dictionary
67
+ let compressRoute = false;
68
+ if (!!server.dictionary) {
69
+ let dict = server.dictionary.getDict();
70
+ if (!!server.connector.useDict && !!dict[route]) {
71
+ route = dict[route];
72
+ compressRoute = true;
73
+ }
74
+ }
75
+ return melo_protocol_1.Message.encode(0, melo_protocol_1.Message.TYPE_PUSH, compressRoute, route, msgBody);
76
+ };
77
+ let encodeBody = function (server, route, msgBody) {
78
+ // encode use protobuf
79
+ if (!!server.protobuf && !!server.protobuf.getProtos().server[route]) {
80
+ msgBody = server.protobuf.encode(route, msgBody);
81
+ }
82
+ else if (!!server.decodeIO_protobuf && !!server.decodeIO_protobuf.check(Constants.RESERVED.SERVER, route)) {
83
+ msgBody = server.decodeIO_protobuf.encode(route, msgBody);
84
+ }
85
+ else {
86
+ msgBody = Buffer.from(JSON.stringify(msgBody), 'utf8');
87
+ }
88
+ return msgBody;
89
+ };
90
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29kZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWIvY29ubmVjdG9ycy9jb21tb24vY29kZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkRBQW9EO0FBQ3BELGtEQUFtRDtBQUNuRCx5REFBb0Q7QUFFcEQsNkJBQTZCO0FBQzdCLElBQUksTUFBTSxHQUFHLElBQUEsdUJBQVMsRUFBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO0FBRzFELElBQUksTUFBTSxHQUFHLFVBQThCLEtBQWEsRUFBRSxLQUFhLEVBQUUsR0FBUTtJQUM3RSxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUU7UUFDVCxPQUFPLGVBQWUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztLQUNuRDtTQUFNO1FBQ0gsT0FBTyxXQUFXLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztLQUN4QztBQUNMLENBQUMsQ0FBQztBQTRFRSx3QkFBTTtBQTFFVixJQUFJLE1BQU0sR0FBRyxVQUF1QixHQUFRO0lBQ3hDLEdBQUcsR0FBRyx1QkFBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDL0IsSUFBSSxLQUFLLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQztJQUV0Qix3QkFBd0I7SUFDeEIsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRTtRQUNyQixJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRTtZQUMxQixJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQ2YsTUFBTSxDQUFDLEtBQUssQ0FBQywyQ0FBMkMsRUFBRSxLQUFLLENBQUMs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
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const melo_protocol_1 = require("@bigtyphoon/melo-protocol");
4
+ const melo_logger_1 = require("@bigtyphoon/melo-logger");
5
+ const path = require("path");
6
+ let logger = (0, melo_logger_1.getLogger)('melo', path.basename(__filename));
7
+ let handlers = {};
8
+ let ST_INITED = 0;
9
+ let ST_WAIT_ACK = 1;
10
+ let ST_WORKING = 2;
11
+ let ST_CLOSED = 3;
12
+ let handleHandshake = function (socket, pkg) {
13
+ if (socket.state !== ST_INITED) {
14
+ return;
15
+ }
16
+ try {
17
+ socket.emit('handshake', JSON.parse(melo_protocol_1.Protocol.strdecode(pkg.body)));
18
+ }
19
+ catch (ex) {
20
+ socket.emit('handshake', {});
21
+ }
22
+ };
23
+ let handleHandshakeAck = function (socket, pkg) {
24
+ if (socket.state !== ST_WAIT_ACK) {
25
+ return;
26
+ }
27
+ socket.state = ST_WORKING;
28
+ socket.emit('heartbeat');
29
+ };
30
+ let handleHeartbeat = function (socket, pkg) {
31
+ if (socket.state !== ST_WORKING) {
32
+ return;
33
+ }
34
+ socket.emit('heartbeat');
35
+ };
36
+ let handleData = function (socket, pkg) {
37
+ if (socket.state !== ST_WORKING) {
38
+ return;
39
+ }
40
+ socket.emit('message', pkg);
41
+ };
42
+ handlers[melo_protocol_1.Package.TYPE_HANDSHAKE] = handleHandshake;
43
+ handlers[melo_protocol_1.Package.TYPE_HANDSHAKE_ACK] = handleHandshakeAck;
44
+ handlers[melo_protocol_1.Package.TYPE_HEARTBEAT] = handleHeartbeat;
45
+ handlers[melo_protocol_1.Package.TYPE_DATA] = handleData;
46
+ function default_1(socket, pkg) {
47
+ let handler = handlers[pkg.type];
48
+ if (!!handler) {
49
+ handler(socket, pkg);
50
+ }
51
+ else {
52
+ logger.error('could not find handle invalid data package.');
53
+ socket.disconnect();
54
+ }
55
+ }
56
+ exports.default = default_1;
57
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFuZGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9jb25uZWN0b3JzL2NvbW1vbi9oYW5kbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsNkRBQStEO0FBQy9ELHlEQUFvRDtBQUVwRCw2QkFBNkI7QUFDN0IsSUFBSSxNQUFNLEdBQUcsSUFBQSx1QkFBUyxFQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7QUFHMUQsSUFBSSxRQUFRLEdBQWtFLEVBQUUsQ0FBQztBQUVqRixJQUFJLFNBQVMsR0FBRyxDQUFDLENBQUM7QUFDbEIsSUFBSSxXQUFXLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLElBQUksVUFBVSxHQUFHLENBQUMsQ0FBQztBQUNuQixJQUFJLFNBQVMsR0FBRyxDQUFDLENBQUM7QUFFbEIsSUFBSSxlQUFlLEdBQUcsVUFBVSxNQUFlLEVBQUcsR0FBUTtJQUN0RCxJQUFJLE1BQU0sQ0FBQyxLQUFLLEtBQUssU0FBUyxFQUFFO1FBQzVCLE9BQU87S0FDVjtJQUNELElBQUk7UUFDQSxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLHdCQUFRLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDdEU7SUFBQyxPQUFPLEVBQUUsRUFBRTtRQUNULE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0tBQ2hDO0FBQ0wsQ0FBQyxDQUFDO0FBRUYsSUFBSSxrQkFBa0IsR0FBRyxVQUFVLE1BQWUsRUFBRyxHQUFRO0lBQ3pELElBQUksTUFBTSxDQUFDLEtBQUssS0FBSyxXQUFXLEVBQUU7UUFDOUIsT0FBTztLQUNWO0lBQ0QsTUFBTSxDQUFDLEtBQUssR0FBRyxVQUFVLENBQUM7SUFDMUIsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUM3QixDQUFDLENBQUM7QUFFRixJQUFJLGVBQWUsR0FBRyxVQUFVLE1BQWUsRUFBRyxHQUFRO0lBQ3RELElBQUksTUFBTSxDQUFDLEtBQUssS0FBSyxVQUFVLEVBQUU7UUFDN0IsT0FBTztLQUNWO0lBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUM3QixDQUFDLENBQUM7QUFFRixJQUFJLFVBQVUsR0FBRyxVQUFVLE1BQWUsRUFBRyxHQUFRO0lBQ2pELElBQUksTUFBTSxDQUFDLEtBQUssS0FBSyxVQUFVLEVBQUU7UUFDN0IsT0FBTztLQUNWO0lBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDaEMsQ0FBQyxDQUFDO0FBRUYsUUFBUSxDQUFDLHVCQUFPLENBQUMsY0FBYyxDQUFDLEdBQUcsZUFBZSxDQUFDO0FBQ25ELFFBQVEsQ0FBQyx1QkFBTyxDQUFDLGtCQUFrQixDQUFDLEdBQUcsa0JBQWtCLENBQUM7QUFDMUQsUUFBUSxDQUFDLHVCQUFPLENBQUMsY0FBYyxDQUFDLEdBQUcsZUFBZSxDQUFDO0FBQ25ELFFBQVEsQ0FBQyx1QkFBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLFVBQVUsQ0FBQztBQUV6QyxtQkFBeUIsTUFBZSxFQUFFLEdBQVE7SUFDOUMsSUFBSSxPQUFPLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNqQyxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUU7UUFDWCxPQUFPLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0tBQ3hCO1NBQU07UUFDSCxNQUFNLENBQUMsS0FBSyxDQUFDLDZDQUE2QyxDQUFDLENBQUM7UUFDNUQsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDO0tBQ3ZCO0FBQ0wsQ0FBQztBQVJELDRCQVFDIn0=
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSUh5YnJpZFNvY2tldC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9jb25uZWN0b3JzL2h5YnJpZC9JSHlicmlkU29ja2V0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIifQ==
@@ -0,0 +1,100 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.HybridSwitcher = void 0;
4
+ const events_1 = require("events");
5
+ const wsprocessor_1 = require("./wsprocessor");
6
+ const tcpprocessor_1 = require("./tcpprocessor");
7
+ const melo_logger_1 = require("@bigtyphoon/melo-logger");
8
+ const path = require("path");
9
+ let logger = (0, melo_logger_1.getLogger)('melo', path.basename(__filename));
10
+ let HTTP_METHODS = [
11
+ 'GET', 'POST', 'DELETE', 'PUT', 'HEAD'
12
+ ];
13
+ // max length of 'DELETE'
14
+ let MAX_HTTP_METHODS_LEN = 6;
15
+ let ST_STARTED = 1;
16
+ let ST_CLOSED = 2;
17
+ let DEFAULT_TIMEOUT = 90;
18
+ /**
19
+ * Switcher for tcp and websocket protocol
20
+ *
21
+ * @param {Object} server tcp server instance from node.js net module
22
+ */
23
+ class HybridSwitcher extends events_1.EventEmitter {
24
+ constructor(server, opts) {
25
+ super();
26
+ this.server = server;
27
+ this.wsprocessor = new wsprocessor_1.WSProcessor();
28
+ this.tcpprocessor = new tcpprocessor_1.TCPProcessor(opts.closeMethod);
29
+ this.id = 1;
30
+ this.timeout = (opts.timeout || DEFAULT_TIMEOUT) * 1000;
31
+ this.setNoDelay = opts.setNoDelay;
32
+ if (!opts.ssl) {
33
+ this.server.on('connection', this.newSocket.bind(this));
34
+ }
35
+ else {
36
+ this.server.on('secureConnection', this.newSocket.bind(this));
37
+ this.server.on('clientError', function (e, tlsSo) {
38
+ logger.warn('an ssl error occured before handshake established: ', e);
39
+ tlsSo.destroy();
40
+ });
41
+ }
42
+ this.wsprocessor.on('connection', this.emit.bind(this, 'connection'));
43
+ this.tcpprocessor.on('connection', this.emit.bind(this, 'connection'));
44
+ this.state = ST_STARTED;
45
+ }
46
+ newSocket(socket) {
47
+ if (this.state !== ST_STARTED) {
48
+ return;
49
+ }
50
+ socket.on('error', (err) => {
51
+ logger.debug('connection error:%s, the remote ip is %s && port is %s', err.message, socket.remoteAddress, socket.remotePort);
52
+ socket.destroy();
53
+ });
54
+ socket.on('close', () => {
55
+ socket.destroy();
56
+ });
57
+ socket.setTimeout(this.timeout, function () {
58
+ logger.warn('connection is timeout without communication, the remote ip is %s && port is %s', socket.remoteAddress, socket.remotePort);
59
+ socket.destroy();
60
+ });
61
+ let self = this;
62
+ socket.once('data', (data) => {
63
+ // FIXME: handle incomplete HTTP method
64
+ if (isHttp(data)) {
65
+ this.processHttp(self.wsprocessor, socket, data);
66
+ }
67
+ else {
68
+ if (!!self.setNoDelay) {
69
+ socket.setNoDelay(true);
70
+ }
71
+ this.processTcp(self.tcpprocessor, socket, data);
72
+ }
73
+ });
74
+ }
75
+ close() {
76
+ if (this.state !== ST_STARTED) {
77
+ return;
78
+ }
79
+ this.state = ST_CLOSED;
80
+ this.wsprocessor.close();
81
+ this.tcpprocessor.close();
82
+ }
83
+ processHttp(processor, socket, data) {
84
+ processor.add(socket, data);
85
+ }
86
+ processTcp(processor, socket, data) {
87
+ processor.add(socket, data);
88
+ }
89
+ }
90
+ exports.HybridSwitcher = HybridSwitcher;
91
+ let isHttp = function (data) {
92
+ let head = data.toString('utf8', 0, MAX_HTTP_METHODS_LEN - 1);
93
+ for (let i = 0, l = HTTP_METHODS.length; i < l; i++) {
94
+ if (head.indexOf(HTTP_METHODS[i]) === 0) {
95
+ return true;
96
+ }
97
+ }
98
+ return false;
99
+ };
100
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3dpdGNoZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWIvY29ubmVjdG9ycy9oeWJyaWQvc3dpdGNoZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbUNBQXNDO0FBRXRDLCtDQUE0QztBQUM1QyxpREFBOEM7QUFDOUMseURBQW9EO0FBT3BELDZCQUE2QjtBQUM3QixJQUFJLE1BQU0sR0FBRyxJQUFBLHVCQUFTLEVBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztBQUcxRCxJQUFJLFlBQVksR0FBRztJQUNmLEtBQUssRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxNQUFNO0NBQ3pDLENBQUM7QUFDRix5QkFBeUI7QUFDekIsSUFBSSxvQkFBb0IsR0FBRyxDQUFDLENBQUM7QUFFN0IsSUFBSSxVQUFVLEdBQUcsQ0FBQyxDQUFDO0FBQ25CLElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQztBQUVsQixJQUFJLGVBQWUsR0FBRyxFQUFFLENBQUM7QUFjekI7Ozs7R0FJRztBQUNILE1BQWEsY0FBZSxTQUFRLHFCQUFZO0lBVTVDLFlBQVksTUFBa0IsRUFBRSxJQUEyQjtRQUN2RCxLQUFLLEVBQUUsQ0FBQztRQUNSLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSx5QkFBVyxFQUFFLENBQUM7UUFDckMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLDJCQUFZLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3ZELElBQUksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ1osSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksZUFBZSxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBQ3hELElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FB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
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TCPProcessor = void 0;
4
+ const events_1 = require("events");
5
+ const utils = require("../../util/utils");
6
+ const tcpsocket_1 = require("./tcpsocket");
7
+ let ST_STARTED = 1;
8
+ let ST_CLOSED = 2;
9
+ // private protocol, no need exports
10
+ let HEAD_SIZE = 4;
11
+ /**
12
+ * websocket protocol processor
13
+ */
14
+ class TCPProcessor extends events_1.EventEmitter {
15
+ constructor(closeMethod) {
16
+ super();
17
+ this.closeMethod = closeMethod;
18
+ this.state = ST_STARTED;
19
+ }
20
+ add(socket, data) {
21
+ if (this.state !== ST_STARTED) {
22
+ return;
23
+ }
24
+ let tcpsocket = new tcpsocket_1.TcpSocket(socket, {
25
+ headSize: HEAD_SIZE,
26
+ headHandler: utils.headHandler,
27
+ closeMethod: this.closeMethod
28
+ });
29
+ this.emit('connection', tcpsocket);
30
+ socket.emit('data', data);
31
+ }
32
+ close() {
33
+ if (this.state !== ST_STARTED) {
34
+ return;
35
+ }
36
+ this.state = ST_CLOSED;
37
+ }
38
+ }
39
+ exports.TCPProcessor = TCPProcessor;
40
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGNwcHJvY2Vzc29yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vbGliL2Nvbm5lY3RvcnMvaHlicmlkL3RjcHByb2Nlc3Nvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxtQ0FBc0M7QUFHdEMsMENBQTBDO0FBQzFDLDJDQUF3QztBQUV4QyxJQUFJLFVBQVUsR0FBRyxDQUFDLENBQUM7QUFDbkIsSUFBSSxTQUFTLEdBQUcsQ0FBQyxDQUFDO0FBRWxCLG9DQUFvQztBQUNwQyxJQUFJLFNBQVMsR0FBRyxDQUFDLENBQUM7QUFFbEI7O0dBRUc7QUFDSCxNQUFhLFlBQWEsU0FBUSxxQkFBWTtJQUcxQyxZQUFZLFdBQW1CO1FBQzNCLEtBQUssRUFBRSxDQUFDO1FBQ1IsSUFBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUM7UUFDL0IsSUFBSSxDQUFDLEtBQUssR0FBRyxVQUFVLENBQUM7SUFDNUIsQ0FBQztJQUNELEdBQUcsQ0FBQyxNQUFrQixFQUFFLElBQVk7UUFDaEMsSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLFVBQVUsRUFBRTtZQUMzQixPQUFPO1NBQ1Y7UUFDRCxJQUFJLFNBQVMsR0FBRyxJQUFJLHFCQUFTLENBQUMsTUFBTSxFQUFFO1lBQ2xDLFFBQVEsRUFBRSxTQUFTO1lBQ25CLFdBQVcsRUFBRSxLQUFLLENBQUMsV0FBVztZQUM5QixXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVc7U0FDaEMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDbkMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVELEtBQUs7UUFDRCxJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssVUFBVSxFQUFFO1lBQzNCLE9BQU87U0FDVjtRQUNELElBQUksQ0FBQyxLQUFLLEdBQUcsU0FBUyxDQUFDO0lBQzNCLENBQUM7Q0FDSjtBQTNCRCxvQ0EyQkMifQ==