melo-sample-websocket-chat-game-server 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 (35) hide show
  1. package/.vscode/launch.json +45 -0
  2. package/LICENSE +21 -0
  3. package/app/servers/chat/handler/chatHandler.ts +45 -0
  4. package/app/servers/chat/lifecycle.ts +27 -0
  5. package/app/servers/chat/remote/chatRemote.ts +105 -0
  6. package/app/servers/connector/handler/entryHandler.ts +63 -0
  7. package/app/servers/connector/lifecycle.ts +27 -0
  8. package/app/servers/gate/handler/gateHandler.ts +41 -0
  9. package/app/util/dispatcher.ts +7 -0
  10. package/app/util/routeUtil.ts +16 -0
  11. package/app.ts +70 -0
  12. package/ci-test.js +44 -0
  13. package/dist/app/servers/chat/handler/chatHandler.js +45 -0
  14. package/dist/app/servers/chat/lifecycle.js +24 -0
  15. package/dist/app/servers/chat/remote/chatRemote.js +92 -0
  16. package/dist/app/servers/connector/handler/entryHandler.js +59 -0
  17. package/dist/app/servers/connector/lifecycle.js +24 -0
  18. package/dist/app/servers/gate/handler/gateHandler.js +44 -0
  19. package/dist/app/util/dispatcher.js +10 -0
  20. package/dist/app/util/routeUtil.js +15 -0
  21. package/dist/app.js +60 -0
  22. package/dist/config/adminServer.json +11 -0
  23. package/dist/config/adminUser.json +17 -0
  24. package/dist/config/clientProtos.json +6 -0
  25. package/dist/config/dictionary.json +3 -0
  26. package/dist/config/log4js.json +150 -0
  27. package/dist/config/master.json +14 -0
  28. package/dist/config/serverProtos.json +9 -0
  29. package/dist/config/servers.json +28 -0
  30. package/dist/preload.js +41 -0
  31. package/dist/robot/robot.js +84 -0
  32. package/package.json +34 -0
  33. package/preload.ts +40 -0
  34. package/robot/robot.ts +97 -0
  35. package/tsconfig.json +34 -0
@@ -0,0 +1,92 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ChatRemote = void 0;
4
+ function default_1(app) {
5
+ return new ChatRemote(app);
6
+ }
7
+ exports.default = default_1;
8
+ // 如果有多个remote文件。需要在各自的remote文件内定义rpc的话。可以这样定义,解决定义被覆盖的问题。
9
+ /**
10
+ // UserRpc的命名空间自动合并
11
+ declare global {
12
+ interface RemoterChat {
13
+ chatRemote: RemoterClass<FrontendSession, ChatRemote>;
14
+ }
15
+
16
+ interface UserRpc {
17
+ chat: RemoterChat;
18
+ }
19
+ }
20
+
21
+ */
22
+ class ChatRemote {
23
+ constructor(app) {
24
+ this.app = app;
25
+ this.app = app;
26
+ this.channelService = app.get('channelService');
27
+ }
28
+ /**
29
+ * Add user into chat channel.
30
+ *
31
+ * @param {String} uid unique id for user
32
+ * @param {String} sid server id
33
+ * @param {String} name channel name
34
+ * @param {boolean} flag channel parameter
35
+ *
36
+ */
37
+ async add(uid, sid, name, flag) {
38
+ let channel = this.channelService.getChannel(name, flag);
39
+ let username = uid.split('*')[0];
40
+ let param = {
41
+ user: username
42
+ };
43
+ console.log('send on add', param);
44
+ channel.pushMessage('onAdd', param);
45
+ if (!!channel) {
46
+ channel.add(uid, sid);
47
+ }
48
+ return this.get(name, flag);
49
+ }
50
+ /**
51
+ * Get user from chat channel.
52
+ *
53
+ * @param {Object} opts parameters for request
54
+ * @param {String} name channel name
55
+ * @param {boolean} flag channel parameter
56
+ * @return {Array} users uids in channel
57
+ *
58
+ */
59
+ get(name, flag) {
60
+ let users = [];
61
+ let channel = this.channelService.getChannel(name, flag);
62
+ if (!!channel) {
63
+ users = channel.getMembers();
64
+ }
65
+ for (let i = 0; i < users.length; i++) {
66
+ users[i] = users[i].split('*')[0];
67
+ }
68
+ return users;
69
+ }
70
+ /**
71
+ * Kick user out chat channel.
72
+ *
73
+ * @param {String} uid unique id for user
74
+ * @param {String} sid server id
75
+ * @param {String} name channel name
76
+ *
77
+ */
78
+ async kick(uid, sid, name) {
79
+ let channel = this.channelService.getChannel(name, false);
80
+ // leave channel
81
+ if (!!channel) {
82
+ channel.leave(uid, sid);
83
+ }
84
+ let username = uid.split('*')[0];
85
+ let param = {
86
+ user: username
87
+ };
88
+ channel.pushMessage('onLeave', param);
89
+ }
90
+ }
91
+ exports.ChatRemote = ChatRemote;
92
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdFJlbW90ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2FwcC9zZXJ2ZXJzL2NoYXQvcmVtb3RlL2NoYXRSZW1vdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRUEsbUJBQXlCLEdBQWdCO0lBQ3JDLE9BQU8sSUFBSSxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDL0IsQ0FBQztBQUZELDRCQUVDO0FBV0QsMERBQTBEO0FBQzFEOzs7Ozs7Ozs7Ozs7R0FZRztBQUNILE1BQWEsVUFBVTtJQUVuQixZQUFvQixHQUFnQjtRQUFoQixRQUFHLEdBQUgsR0FBRyxDQUFhO1FBQ2hDLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBQ2YsSUFBSSxDQUFDLGNBQWMsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUlEOzs7Ozs7OztPQVFHO0lBQ0ksS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFXLEVBQUUsR0FBVyxFQUFFLElBQVksRUFBRSxJQUFhO1FBQ2xFLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN6RCxJQUFJLFFBQVEsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pDLElBQUksS0FBSyxHQUFHO1lBQ1IsSUFBSSxFQUFFLFFBQVE7U0FDakIsQ0FBQztRQUNGLE9BQU8sQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ2xDLE9BQU8sQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRXBDLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRTtZQUNYLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1NBQ3pCO1FBRUQsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSyxHQUFHLENBQUMsSUFBWSxFQUFFLElBQWE7UUFDbkMsSUFBSSxLQUFLLEdBQWEsRUFBRSxDQUFDO1FBQ3pCLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN6RCxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUU7WUFDWCxLQUFLLEdBQUcsT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFDO1NBQ2hDO1FBQ0QsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDbkMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDckM7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNJLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBVyxFQUFFLEdBQVcsRUFBRSxJQUFZO1FBQ3BELElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztRQUMxRCxnQkFBZ0I7UUFDaEIsSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFO1lBQ1gsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7U0FDM0I7UUFDRCxJQUFJLFFBQVEsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pDLElBQUksS0FBSyxHQUFHO1lBQ1IsSUFBSSxFQUFFLFFBQVE7U0FDakIsQ0FBQztRQUNGLE9BQU8sQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzFDLENBQUM7Q0FDSjtBQTNFRCxnQ0EyRUMifQ==
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EntryHandler = void 0;
4
+ function default_1(app) {
5
+ return new EntryHandler(app);
6
+ }
7
+ exports.default = default_1;
8
+ class EntryHandler {
9
+ constructor(app) {
10
+ this.app = app;
11
+ }
12
+ /**
13
+ * New client entry chat server.
14
+ *
15
+ * @param {Object} msg request message
16
+ * @param {Object} session current session object
17
+ */
18
+ async enter(msg, session) {
19
+ let self = this;
20
+ let rid = msg.rid;
21
+ let uid = msg.username + '*' + rid;
22
+ let sessionService = self.app.get('sessionService');
23
+ // duplicate log in
24
+ if (!!sessionService.getByUid(uid)) {
25
+ return {
26
+ code: 500,
27
+ error: true
28
+ };
29
+ }
30
+ await session.abind(uid);
31
+ session.set('rid', rid);
32
+ session.push('rid', function (err) {
33
+ if (err) {
34
+ console.error('set rid for session service failed! error is : %j', err.stack);
35
+ }
36
+ });
37
+ session.on('closed', this.onUserLeave.bind(this));
38
+ // put user into channel
39
+ let users = await self.app.rpc.chat.chatRemote.add.route(session)(uid, self.app.get('serverId'), rid, true);
40
+ return {
41
+ users: users
42
+ };
43
+ }
44
+ /**
45
+ * User log out handler
46
+ *
47
+ * @param {Object} app current application
48
+ * @param {Object} session current session object
49
+ *
50
+ */
51
+ onUserLeave(session) {
52
+ if (!session || !session.uid) {
53
+ return;
54
+ }
55
+ this.app.rpc.chat.chatRemote.kick.route(session, true)(session.uid, this.app.get('serverId'), session.get('rid'));
56
+ }
57
+ }
58
+ exports.EntryHandler = EntryHandler;
59
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50cnlIYW5kbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vYXBwL3NlcnZlcnMvY29ubmVjdG9yL2hhbmRsZXIvZW50cnlIYW5kbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUdBLG1CQUF5QixHQUFnQjtJQUNyQyxPQUFPLElBQUksWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2pDLENBQUM7QUFGRCw0QkFFQztBQUVELE1BQWEsWUFBWTtJQUNyQixZQUFvQixHQUFnQjtRQUFoQixRQUFHLEdBQUgsR0FBRyxDQUFhO0lBQ3BDLENBQUM7SUFHRDs7Ozs7T0FLRztJQUNILEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBc0MsRUFBRSxPQUF3QjtRQUN4RSxJQUFJLElBQUksR0FBRyxJQUFJLENBQUM7UUFDaEIsSUFBSSxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQztRQUNsQixJQUFJLEdBQUcsR0FBRyxHQUFHLENBQUMsUUFBUSxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7UUFDbkMsSUFBSSxjQUFjLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUVwRCxtQkFBbUI7UUFDbkIsSUFBSSxDQUFDLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUNoQyxPQUFPO2dCQUNILElBQUksRUFBRSxHQUFHO2dCQUNULEtBQUssRUFBRSxJQUFJO2FBQ2QsQ0FBQztTQUNMO1FBRUQsTUFBTSxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3pCLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3hCLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLFVBQVUsR0FBRztZQUM3QixJQUFJLEdBQUcsRUFBRTtnQkFDTCxPQUFPLENBQUMsS0FBSyxDQUFDLG1EQUFtRCxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUNqRjtRQUNMLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUVsRCx3QkFBd0I7UUFDeEIsSUFBSSxLQUFLLEdBQUcsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUU1RyxPQUFPO1lBQ0gsS0FBSyxFQUFFLEtBQUs7U0FDZixDQUFDO0lBQ04sQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILFdBQVcsQ0FBQyxPQUF3QjtRQUNoQyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRTtZQUMxQixPQUFPO1NBQ1Y7UUFDRCxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ3RILENBQUM7Q0FDSjtBQXZERCxvQ0F1REMifQ==
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ function default_1() {
4
+ return new Lifecycle();
5
+ }
6
+ exports.default = default_1;
7
+ class Lifecycle {
8
+ beforeStartup(app, cb) {
9
+ console.log(app.getServerId(), '!!!before startup');
10
+ cb();
11
+ }
12
+ afterStartup(app, cb) {
13
+ console.log(app.getServerId(), '!!afterStartup');
14
+ cb();
15
+ }
16
+ afterStartAll(app) {
17
+ console.log(app.getServerId(), '!!after start all');
18
+ }
19
+ beforeShutdown(app, shutDown, cancelShutDownTimer) {
20
+ console.log(app.getServerId(), '!!beforeShutdown');
21
+ shutDown();
22
+ }
23
+ }
24
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlmZWN5Y2xlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vYXBwL3NlcnZlcnMvY29ubmVjdG9yL2xpZmVjeWNsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUVBO0lBQ0ksT0FBTyxJQUFJLFNBQVMsRUFBRSxDQUFDO0FBQzNCLENBQUM7QUFGRCw0QkFFQztBQUdELE1BQU0sU0FBUztJQUNYLGFBQWEsQ0FBQyxHQUFnQixFQUFFLEVBQWM7UUFDMUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztRQUNwRCxFQUFFLEVBQUUsQ0FBQztJQUNULENBQUM7SUFFRCxZQUFZLENBQUMsR0FBZ0IsRUFBRSxFQUFjO1FBQ3pDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxFQUFFLGdCQUFnQixDQUFDLENBQUM7UUFDakQsRUFBRSxFQUFFLENBQUM7SUFDVCxDQUFDO0lBRUQsYUFBYSxDQUFDLEdBQWdCO1FBQzFCLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxFQUFFLG1CQUFtQixDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUVELGNBQWMsQ0FBQyxHQUFnQixFQUFFLFFBQW9CLEVBQUUsbUJBQStCO1FBQ2xGLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxFQUFFLGtCQUFrQixDQUFDLENBQUM7UUFDbkQsUUFBUSxFQUFFLENBQUM7SUFDZixDQUFDO0NBQ0oifQ==
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GateHandler = void 0;
4
+ const dispatcher_1 = require("../../../util/dispatcher");
5
+ function default_1(app) {
6
+ return new GateHandler(app);
7
+ }
8
+ exports.default = default_1;
9
+ class GateHandler {
10
+ constructor(app) {
11
+ this.app = app;
12
+ }
13
+ /**
14
+ * Gate handler that dispatch user to connectors.
15
+ *
16
+ * @param {Object} msg message from client
17
+ * @param {Object} session
18
+ *
19
+ */
20
+ async queryEntry(msg, session) {
21
+ let uid = msg.uid;
22
+ if (!uid) {
23
+ return {
24
+ code: 500
25
+ };
26
+ }
27
+ // get all connectors
28
+ let connectors = this.app.getServersByType('connector');
29
+ if (!connectors || connectors.length === 0) {
30
+ return {
31
+ code: 500
32
+ };
33
+ }
34
+ // select connector
35
+ let res = (0, dispatcher_1.dispatch)(uid, connectors);
36
+ return {
37
+ code: 200,
38
+ host: res.host,
39
+ port: res.clientPort
40
+ };
41
+ }
42
+ }
43
+ exports.GateHandler = GateHandler;
44
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2F0ZUhhbmRsZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9hcHAvc2VydmVycy9nYXRlL2hhbmRsZXIvZ2F0ZUhhbmRsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEseURBQW9EO0FBR3BELG1CQUF5QixHQUFnQjtJQUNyQyxPQUFPLElBQUksV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2hDLENBQUM7QUFGRCw0QkFFQztBQUVELE1BQWEsV0FBVztJQUNwQixZQUFvQixHQUFnQjtRQUFoQixRQUFHLEdBQUgsR0FBRyxDQUFhO0lBQ3BDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxLQUFLLENBQUMsVUFBVSxDQUFDLEdBQWtCLEVBQUUsT0FBdUI7UUFDeEQsSUFBSSxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQztRQUNsQixJQUFJLENBQUMsR0FBRyxFQUFFO1lBQ04sT0FBTztnQkFDSCxJQUFJLEVBQUUsR0FBRzthQUNaLENBQUM7U0FDTDtRQUNELHFCQUFxQjtRQUNyQixJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3hELElBQUksQ0FBQyxVQUFVLElBQUksVUFBVSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDeEMsT0FBTztnQkFDSCxJQUFJLEVBQUUsR0FBRzthQUNaLENBQUM7U0FDTDtRQUNELG1CQUFtQjtRQUNuQixJQUFJLEdBQUcsR0FBRyxJQUFBLHFCQUFRLEVBQUMsR0FBRyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ3BDLE9BQU87WUFDSCxJQUFJLEVBQUUsR0FBRztZQUNULElBQUksRUFBRSxHQUFHLENBQUMsSUFBSTtZQUNkLElBQUksRUFBRSxHQUFHLENBQUMsVUFBVTtTQUN2QixDQUFDO0lBQ04sQ0FBQztDQUNKO0FBakNELGtDQWlDQyJ9
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.dispatch = void 0;
4
+ const crc = require("crc");
5
+ function dispatch(uid, connectors) {
6
+ let index = Math.abs(crc.crc32(uid)) % connectors.length;
7
+ return connectors[index];
8
+ }
9
+ exports.dispatch = dispatch;
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlzcGF0Y2hlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2FwcC91dGlsL2Rpc3BhdGNoZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsMkJBQTJCO0FBRzNCLFNBQWdCLFFBQVEsQ0FBQyxHQUFXLEVBQUcsVUFBd0I7SUFDM0QsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQztJQUN6RCxPQUFPLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUM3QixDQUFDO0FBSEQsNEJBR0MifQ==
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.chat = void 0;
4
+ const dispatcher_1 = require("./dispatcher");
5
+ function chat(session, msg, app, cb) {
6
+ let chatServers = app.getServersByType('chat');
7
+ if (!chatServers || chatServers.length === 0) {
8
+ cb(new Error('can not find chat servers.'));
9
+ return;
10
+ }
11
+ let res = (0, dispatcher_1.dispatch)(session.get('rid'), chatServers);
12
+ cb(null, res.id);
13
+ }
14
+ exports.chat = chat;
15
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGVVdGlsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vYXBwL3V0aWwvcm91dGVVdGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLDZDQUF1QztBQUd2QyxTQUFnQixJQUFJLENBQUMsT0FBZ0IsRUFBRSxHQUFRLEVBQUUsR0FBZ0IsRUFBRSxFQUE2QztJQUM1RyxJQUFJLFdBQVcsR0FBRyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFL0MsSUFBRyxDQUFDLFdBQVcsSUFBSSxXQUFXLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtRQUN6QyxFQUFFLENBQUMsSUFBSSxLQUFLLENBQUMsNEJBQTRCLENBQUMsQ0FBQyxDQUFDO1FBQzVDLE9BQU87S0FDVjtJQUVELElBQUksR0FBRyxHQUFHLElBQUEscUJBQVEsRUFBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBRXBELEVBQUUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3JCLENBQUM7QUFYRCxvQkFXQyJ9
package/dist/app.js ADDED
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const melo_1 = require("@bigtyphoon/melo");
4
+ const routeUtil = require("./app/util/routeUtil");
5
+ const preload_1 = require("./preload");
6
+ const melo_robot_plugin_1 = require("@bigtyphoon/melo-robot-plugin");
7
+ /**
8
+ * 替换全局Promise
9
+ * 自动解析sourcemap
10
+ * 捕获全局错误
11
+ */
12
+ (0, preload_1.preload)();
13
+ /**
14
+ * Init app for client.
15
+ */
16
+ let app = melo_1.melo.createApp();
17
+ app.set('name', 'chatofpomelo-websocket');
18
+ // app configuration
19
+ app.configure('production|development', 'connector', function () {
20
+ app.set('connectorConfig', {
21
+ connector: melo_1.melo.connectors.hybridconnector,
22
+ heartbeat: 3,
23
+ useDict: true,
24
+ useProtobuf: true
25
+ });
26
+ app.set('serverConfig', {
27
+ reloadHandlers: true,
28
+ });
29
+ });
30
+ app.configure('production|development', 'gate', function () {
31
+ app.set('connectorConfig', {
32
+ connector: melo_1.melo.connectors.hybridconnector,
33
+ useProtobuf: true
34
+ });
35
+ });
36
+ // app configure
37
+ app.configure('production|development', function () {
38
+ // route configures
39
+ app.route('chat', routeUtil.chat);
40
+ // filter configures
41
+ app.filter(new melo_1.melo.filters.timeout());
42
+ // 热更新 handler配置
43
+ // app.set('serverConfig',{
44
+ // reloadHandlers:true,
45
+ // });
46
+ // 热更新 remote 配置
47
+ // app.set('remoteConfig', {
48
+ // reloadRemotes: true
49
+ // });
50
+ });
51
+ app.configure('development', function () {
52
+ // enable the system monitor modules
53
+ app.enable('systemMonitor');
54
+ });
55
+ if (app.isMaster()) {
56
+ app.use((0, melo_robot_plugin_1.createRobotPlugin)({ scriptFile: __dirname + '/robot/robot.js' }));
57
+ }
58
+ // start app
59
+ app.start();
60
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vYXBwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsMkNBQXdDO0FBQ3hDLGtEQUFtRDtBQUNuRCx1Q0FBb0M7QUFDcEMscUVBQWtFO0FBRWxFOzs7O0dBSUc7QUFDSCxJQUFBLGlCQUFPLEdBQUUsQ0FBQztBQUVWOztHQUVHO0FBQ0gsSUFBSSxHQUFHLEdBQUcsV0FBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO0FBQzNCLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLHdCQUF3QixDQUFDLENBQUM7QUFFMUMsb0JBQW9CO0FBQ3BCLEdBQUcsQ0FBQyxTQUFTLENBQUMsd0JBQXdCLEVBQUUsV0FBVyxFQUFFO0lBQ2pELEdBQUcsQ0FBQyxHQUFHLENBQUMsaUJBQWlCLEVBQ3JCO1FBQ0ksU0FBUyxFQUFFLFdBQUksQ0FBQyxVQUFVLENBQUMsZUFBZTtRQUMxQyxTQUFTLEVBQUUsQ0FBQztRQUNaLE9BQU8sRUFBRSxJQUFJO1FBQ2IsV0FBVyxFQUFFLElBQUk7S0FDcEIsQ0FBQyxDQUFDO0lBRVAsR0FBRyxDQUFDLEdBQUcsQ0FBQyxjQUFjLEVBQUU7UUFDcEIsY0FBYyxFQUFFLElBQUk7S0FDdkIsQ0FBQyxDQUFBO0FBQ04sQ0FBQyxDQUFDLENBQUM7QUFFSCxHQUFHLENBQUMsU0FBUyxDQUFDLHdCQUF3QixFQUFFLE1BQU0sRUFBRTtJQUM1QyxHQUFHLENBQUMsR0FBRyxDQUFDLGlCQUFpQixFQUNyQjtRQUNJLFNBQVMsRUFBRSxXQUFJLENBQUMsVUFBVSxDQUFDLGVBQWU7UUFDMUMsV0FBVyxFQUFFLElBQUk7S0FDcEIsQ0FBQyxDQUFDO0FBQ1gsQ0FBQyxDQUFDLENBQUM7QUFFSCxnQkFBZ0I7QUFDaEIsR0FBRyxDQUFDLFNBQVMsQ0FBQyx3QkFBd0IsRUFBRTtJQUNwQyxtQkFBbUI7SUFDbkIsR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBRWxDLG9CQUFvQjtJQUNwQixHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksV0FBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBRXZDLGdCQUFnQjtJQUNoQiwyQkFBMkI7SUFDM0IsMkJBQTJCO0lBQzNCLE1BQU07SUFDTixnQkFBZ0I7SUFDaEIsNEJBQTRCO0lBQzVCLDBCQUEwQjtJQUMxQixNQUFNO0FBQ1YsQ0FBQyxDQUFDLENBQUM7QUFFSCxHQUFHLENBQUMsU0FBUyxDQUFDLGFBQWEsRUFBRTtJQUN6QixvQ0FBb0M7SUFDcEMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQztBQUNoQyxDQUFDLENBQUMsQ0FBQztBQUVILElBQUksR0FBRyxDQUFDLFFBQVEsRUFBRSxFQUFFO0lBQ2hCLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBQSxxQ0FBaUIsRUFBQyxFQUFFLFVBQVUsRUFBRSxTQUFTLEdBQUcsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDLENBQUM7Q0FDN0U7QUFFRCxZQUFZO0FBQ1osR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDIn0=
@@ -0,0 +1,11 @@
1
+ [{
2
+ "type": "connector",
3
+ "token": "agarxhqb98rpajloaxn34ga8xrunpagkjwlaw3ruxnpaagl29w4rxn"
4
+ }, {
5
+ "type": "chat",
6
+ "token": "agarxhqb98rpajloaxn34ga8xrunpagkjwlaw3ruxnpaagl29w4rxn"
7
+ },{
8
+ "type": "gate",
9
+ "token": "agarxhqb98rpajloaxn34ga8xrunpagkjwlaw3ruxnpaagl29w4rxn"
10
+ }
11
+ ]
@@ -0,0 +1,17 @@
1
+ [{
2
+ "id": "user-1",
3
+ "username": "admin",
4
+ "password": "admin",
5
+ "level": 1
6
+ }, {
7
+ "id": "user-2",
8
+ "username": "monitor",
9
+ "password": "monitor",
10
+ "level": 2
11
+ },{
12
+ "id": "user-3",
13
+ "username": "test",
14
+ "password": "test",
15
+ "level": 2
16
+ }
17
+ ]
@@ -0,0 +1,6 @@
1
+ {
2
+ "chat.chatHandler.send": {
3
+ "required string content": 1,
4
+ "required string target": 2
5
+ }
6
+ }
@@ -0,0 +1,3 @@
1
+ [
2
+ "onChat"
3
+ ]
@@ -0,0 +1,150 @@
1
+ {
2
+ "appenders": {
3
+ "console": {
4
+ "type": "console"
5
+ },
6
+ "con-log": {
7
+ "type": "file",
8
+ "filename": "${opts:base}/logs/con-log-${opts:serverId}.log",
9
+ "pattern": "connector",
10
+ "maxLogSize": 1048576,
11
+ "layout": {
12
+ "type": "basic"
13
+ },
14
+ "backups": 5
15
+ },
16
+ "rpc-log": {
17
+ "type": "file",
18
+ "filename": "${opts:base}/logs/rpc-log-${opts:serverId}.log",
19
+ "maxLogSize": 1048576,
20
+ "layout": {
21
+ "type": "basic"
22
+ },
23
+ "backups": 5
24
+ },
25
+ "forward-log": {
26
+ "type": "file",
27
+ "filename": "${opts:base}/logs/forward-log-${opts:serverId}.log",
28
+ "maxLogSize": 1048576,
29
+ "layout": {
30
+ "type": "basic"
31
+ },
32
+ "backups": 5
33
+ },
34
+ "rpc-debug": {
35
+ "type": "file",
36
+ "filename": "${opts:base}/logs/rpc-debug-${opts:serverId}.log",
37
+ "maxLogSize": 1048576,
38
+ "layout": {
39
+ "type": "basic"
40
+ },
41
+ "backups": 5
42
+ },
43
+ "crash-log": {
44
+ "type": "file",
45
+ "filename": "${opts:base}/logs/crash.log",
46
+ "maxLogSize": 1048576,
47
+ "layout": {
48
+ "type": "basic"
49
+ },
50
+ "backups": 5
51
+ },
52
+ "admin-log": {
53
+ "type": "file",
54
+ "filename": "${opts:base}/logs/admin.log",
55
+ "maxLogSize": 1048576,
56
+ "layout": {
57
+ "type": "basic"
58
+ },
59
+ "backups": 5
60
+ },
61
+ "pinus": {
62
+ "type": "file",
63
+ "filename": "${opts:base}/logs/pinus-${opts:serverId}.log",
64
+ "maxLogSize": 1048576,
65
+ "layout": {
66
+ "type": "basic"
67
+ },
68
+ "backups": 5
69
+ },
70
+ "pinus-admin": {
71
+ "type": "file",
72
+ "filename": "${opts:base}/logs/pinus-admin.log",
73
+ "maxLogSize": 1048576,
74
+ "layout": {
75
+ "type": "basic"
76
+ },
77
+ "backups": 5
78
+ },
79
+ "pinus-rpc": {
80
+ "type": "file",
81
+ "filename": "${opts:base}/logs/pinus-rpc-${opts:serverId}.log",
82
+ "maxLogSize": 1048576,
83
+ "layout": {
84
+ "type": "basic"
85
+ },
86
+ "backups": 5
87
+ }
88
+ },
89
+ "categories": {
90
+ "default": {
91
+ "appenders": [
92
+ "console",
93
+ "pinus"
94
+ ],
95
+ "level": "debug"
96
+ },
97
+ "con-log": {
98
+ "appenders": [
99
+ "con-log"
100
+ ],
101
+ "level": "debug"
102
+ },
103
+ "rpc-log": {
104
+ "appenders": [
105
+ "rpc-log"
106
+ ],
107
+ "level": "debug"
108
+ },
109
+ "forward-log": {
110
+ "appenders": [
111
+ "forward-log"
112
+ ],
113
+ "level": "debug"
114
+ },
115
+ "rpc-debug": {
116
+ "appenders": [
117
+ "rpc-debug"
118
+ ],
119
+ "level": "debug"
120
+ },
121
+ "crash-log": {
122
+ "appenders": [
123
+ "crash-log"
124
+ ],
125
+ "level": "debug"
126
+ },
127
+ "admin-log": {
128
+ "appenders": [
129
+ "admin-log"
130
+ ],
131
+ "level": "debug"
132
+ },
133
+ "pinus-admin": {
134
+ "appenders": [
135
+ "pinus-admin"
136
+ ],
137
+ "level": "debug"
138
+ },
139
+ "pinus-rpc": {
140
+ "appenders": [
141
+ "pinus-rpc"
142
+ ],
143
+ "level": "debug"
144
+ }
145
+ },
146
+ "prefix": "${opts:serverId} ",
147
+ "replaceConsole": true,
148
+ "lineDebug": false,
149
+ "errorStack": true
150
+ }
@@ -0,0 +1,14 @@
1
+ {
2
+ "development":{
3
+ "id":"master-server-1",
4
+ "host":"127.0.0.1",
5
+ "port":3005
6
+ },
7
+
8
+ "production":{
9
+ "id":"master-server-1",
10
+ "host":"127.0.0.1",
11
+ "port":3005
12
+ }
13
+
14
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "onChat": {
3
+ "required string msg": 1,
4
+ "required string from": 2,
5
+ "required string target": 3
6
+ },
7
+ "chat.chatHandler.send": {
8
+ }
9
+ }
@@ -0,0 +1,28 @@
1
+ {
2
+ "development":{
3
+ "connector":[
4
+ {"id":"connector-server-1", "host":"127.0.0.1", "port":4050, "clientPort": 3050, "frontend": true, "args": "--inspect=10001"}
5
+ ],
6
+ "chat":[
7
+ {"id":"chat-server-1", "host":"127.0.0.1", "port":6050, "args": "--inspect=10002"}
8
+ ],
9
+ "gate":[
10
+ {"id": "gate-server-1", "host": "127.0.0.1", "clientPort": 3014, "frontend": true, "args": "--inspect=10003"}
11
+ ]
12
+ },
13
+ "production":{
14
+ "connector":[
15
+ {"id":"connector-server-1", "host":"127.0.0.1", "port":4050, "clientPort": 3050, "frontend": true},
16
+ {"id":"connector-server-2", "host":"127.0.0.1", "port":4051, "clientPort": 3051, "frontend": true},
17
+ {"id":"connector-server-3", "host":"127.0.0.1", "port":4052, "clientPort": 3052, "frontend": true}
18
+ ],
19
+ "chat":[
20
+ {"id":"chat-server-1", "host":"127.0.0.1", "port":6050},
21
+ {"id":"chat-server-2", "host":"127.0.0.1", "port":6051},
22
+ {"id":"chat-server-3", "host":"127.0.0.1", "port":6052}
23
+ ],
24
+ "gate":[
25
+ {"id": "gate-server-1", "host": "127.0.0.1", "clientPort": 3014, "frontend": true}
26
+ ]
27
+ }
28
+ }
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.preload = void 0;
4
+ const bluebird_1 = require("bluebird");
5
+ // 支持注解
6
+ require("reflect-metadata");
7
+ const melo_1 = require("@bigtyphoon/melo");
8
+ /**
9
+ * 替换全局Promise
10
+ * 自动解析sourcemap
11
+ * 捕获全局错误
12
+ */
13
+ function preload() {
14
+ // 使用bluebird输出完整的promise调用链
15
+ global.Promise = bluebird_1.Promise;
16
+ // 开启长堆栈
17
+ bluebird_1.Promise.config({
18
+ // Enable warnings
19
+ warnings: true,
20
+ // Enable long stack traces
21
+ longStackTraces: true,
22
+ // Enable cancellation
23
+ cancellation: true,
24
+ // Enable monitoring
25
+ monitoring: true
26
+ });
27
+ // 自动解析ts的sourcemap
28
+ require('source-map-support').install({
29
+ handleUncaughtExceptions: false
30
+ });
31
+ // 捕获普通异常
32
+ process.on('uncaughtException', function (err) {
33
+ console.error(melo_1.melo.app ? melo_1.melo.app.getServerId() : "unknownServerId", 'uncaughtException Caught exception: ', err);
34
+ });
35
+ // 捕获async异常
36
+ process.on('unhandledRejection', (reason, p) => {
37
+ console.error(melo_1.melo.app ? melo_1.melo.app.getServerId() : "unknownServerId", 'Caught Unhandled Rejection at:', p, 'reason:', reason);
38
+ });
39
+ }
40
+ exports.preload = preload;
41
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJlbG9hZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3ByZWxvYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsdUNBQWlDO0FBQ2pDLE9BQU87QUFDUCw0QkFBMEI7QUFDMUIsMkNBQXdDO0FBRXhDOzs7O0dBSUc7QUFDSCxTQUFnQixPQUFPO0lBQ25CLDRCQUE0QjtJQUMxQixNQUFjLENBQUMsT0FBZSxHQUFJLGtCQUFlLENBQUM7SUFDcEQsUUFBUTtJQUNSLGtCQUFPLENBQUMsTUFBTSxDQUFDO1FBQ1gsa0JBQWtCO1FBQ2xCLFFBQVEsRUFBRSxJQUFJO1FBQ2QsMkJBQTJCO1FBQzNCLGVBQWUsRUFBRSxJQUFJO1FBQ3JCLHNCQUFzQjtRQUN0QixZQUFZLEVBQUUsSUFBSTtRQUNsQixvQkFBb0I7UUFDcEIsVUFBVSxFQUFFLElBQUk7S0FDbkIsQ0FBQyxDQUFDO0lBRUgsbUJBQW1CO0lBQ25CLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLE9BQU8sQ0FBQztRQUNsQyx3QkFBd0IsRUFBRSxLQUFLO0tBQ2xDLENBQUMsQ0FBQztJQUVILFNBQVM7SUFDVCxPQUFPLENBQUMsRUFBRSxDQUFDLG1CQUFtQixFQUFFLFVBQVUsR0FBRztRQUN6QyxPQUFPLENBQUMsS0FBSyxDQUFDLFdBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFdBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixFQUFFLHNDQUFzQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3RILENBQUMsQ0FBQyxDQUFDO0lBRUgsWUFBWTtJQUNaLE9BQU8sQ0FBQyxFQUFFLENBQUMsb0JBQW9CLEVBQUUsQ0FBQyxNQUFXLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDaEQsT0FBTyxDQUFDLEtBQUssQ0FBQyxXQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxXQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsRUFBRSxnQ0FBZ0MsRUFBRSxDQUFDLEVBQUUsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ2pJLENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQztBQTdCRCwwQkE2QkMifQ==