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