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,84 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Robot = void 0;
4
+ const melo_robot_plugin_1 = require("@bigtyphoon/melo-robot-plugin");
5
+ class Robot {
6
+ constructor(actor) {
7
+ this.actor = actor;
8
+ this.openid = String(Math.round(Math.random() * 1000));
9
+ this.meloClient = new melo_robot_plugin_1.MeloWSClient();
10
+ }
11
+ connectGate() {
12
+ let host = '127.0.0.1';
13
+ let port = '3014';
14
+ this.meloClient.on(melo_robot_plugin_1.MeloWSClientEvent.EVENT_IO_ERROR, (event) => {
15
+ // 错误处理
16
+ console.error('error', event);
17
+ });
18
+ this.meloClient.on(melo_robot_plugin_1.MeloWSClientEvent.EVENT_CLOSE, function (event) {
19
+ // 关闭处理
20
+ console.error('close', event);
21
+ });
22
+ this.meloClient.on(melo_robot_plugin_1.MeloWSClientEvent.EVENT_HEART_BEAT_TIMEOUT, function (event) {
23
+ // 心跳timeout
24
+ console.error('heart beat timeout', event);
25
+ });
26
+ this.meloClient.on(melo_robot_plugin_1.MeloWSClientEvent.EVENT_KICK, function (event) {
27
+ // 踢出
28
+ console.error('kick', event);
29
+ });
30
+ // this.actor.emit("incr" , "gateConnReq");
31
+ this.actor.emit('start', 'gateConn', this.actor.id);
32
+ this.meloClient.init({
33
+ host: host,
34
+ port: port
35
+ }, () => {
36
+ this.actor.emit('end', 'gateConn', this.actor.id);
37
+ // 连接成功执行函数
38
+ console.log('gate连接成功');
39
+ this.gateQuery();
40
+ });
41
+ }
42
+ gateQuery() {
43
+ // this.actor.emit("incr" , "gateQueryReq");
44
+ this.actor.emit('start', 'gateQuery', this.actor.id);
45
+ this.meloClient.request('gate.gateHandler.queryEntry', { uid: this.openid }, (result) => {
46
+ // 消息回调
47
+ // console.log("gate返回",JSON.stringify(result));
48
+ this.actor.emit('end', 'gateQuery', this.actor.id);
49
+ this.meloClient.disconnect();
50
+ this.connectToConnector(result);
51
+ });
52
+ }
53
+ connectToConnector(result) {
54
+ // this.actor.emit("incr" , "loginConnReq");
55
+ this.actor.emit('start', 'loginConn', this.actor.id);
56
+ this.meloClient.init({
57
+ host: result.host,
58
+ port: result.port
59
+ }, () => {
60
+ this.actor.emit('end', 'loginConn', this.actor.id);
61
+ // 连接成功执行函数
62
+ console.log('connector连接成功');
63
+ this.loginQuery({ rid: this.actor.id.toString(), username: this.actor.id.toString() });
64
+ });
65
+ }
66
+ loginQuery(result) {
67
+ // this.actor.emit("incr" , "loginQueryReq");
68
+ this.actor.emit('start', 'loginQuery', this.actor.id);
69
+ this.meloClient.request('connector.entryHandler.enter', result, (ret) => {
70
+ // 消息回调
71
+ this.actor.emit('end', 'loginQuery', this.actor.id);
72
+ console.log('connector返回', JSON.stringify(result));
73
+ setTimeout(() => this.loginQuery(result), Math.random() * 5000 + 1000);
74
+ });
75
+ }
76
+ }
77
+ exports.Robot = Robot;
78
+ function default_1(actor) {
79
+ let client = new Robot(actor);
80
+ client.connectGate();
81
+ return client;
82
+ }
83
+ exports.default = default_1;
84
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm9ib3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9yb2JvdC9yb2JvdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFFQSxxRUFBK0U7QUFHL0UsTUFBYSxLQUFLO0lBQ2QsWUFBb0IsS0FBWTtRQUFaLFVBQUssR0FBTCxLQUFLLENBQU87UUFJaEMsV0FBTSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBRWxELGVBQVUsR0FBRyxJQUFJLGdDQUFZLEVBQUUsQ0FBQztJQUpoQyxDQUFDO0lBTU0sV0FBVztRQUVkLElBQUksSUFBSSxHQUFHLFdBQVcsQ0FBQztRQUN2QixJQUFJLElBQUksR0FBRyxNQUFNLENBQUM7UUFDbEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMscUNBQWlCLENBQUMsY0FBYyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDM0QsT0FBTztZQUNQLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ2xDLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMscUNBQWlCLENBQUMsV0FBVyxFQUFFLFVBQVMsS0FBSztZQUM1RCxPQUFPO1lBQ1AsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDbEMsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxxQ0FBaUIsQ0FBQyx3QkFBd0IsRUFBRSxVQUFTLEtBQUs7WUFDekUsWUFBWTtZQUNaLE9BQU8sQ0FBQyxLQUFLLENBQUMsb0JBQW9CLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDL0MsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxxQ0FBaUIsQ0FBQyxVQUFV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
package/package.json ADDED
@@ -0,0 +1,34 @@
1
+ {
2
+ "name": "melo-sample-websocket-chat-game-server",
3
+ "version": "1.7.6",
4
+ "private": false,
5
+ "main": "./dist/app",
6
+ "scripts": {
7
+ "build": "node_modules/.bin/tsc",
8
+ "start": "yarn run build && cd dist && node app",
9
+ "test": "yarn run build",
10
+ "cov": "nyc mocha",
11
+ "ci": "yarn run test",
12
+ "gen-api-ref": "node ../../../node_modules/typedoc/bin/typedoc --mode file --hideGenerator --excludeExternals --ignoreCompilerErrors --out ../../../run/site/public/api-reference/melo-loader lib/"
13
+ },
14
+ "engines": {
15
+ "node": ">=12.9.0"
16
+ },
17
+ "dependencies": {
18
+ "@bigtyphoon/melo": "^1.7.6",
19
+ "@bigtyphoon/melo-robot": "^1.7.6",
20
+ "@bigtyphoon/melo-robot-plugin": "^1.7.6",
21
+ "@types/bluebird": "^3.5.19",
22
+ "@types/crc": "^3.4.0",
23
+ "@types/node": "^16.3.3",
24
+ "bluebird": "^3.5.1",
25
+ "crc": "^4.3.2",
26
+ "reflect-metadata": "^0.2.2",
27
+ "source-map-support": "^0.5.0"
28
+ },
29
+ "devDependencies": {
30
+ "tslint": "^6.1.3",
31
+ "typescript": "^4.3.5"
32
+ },
33
+ "gitHead": "7dfd3ca78ed6b051e34da595269efb623cd58d1b"
34
+ }
package/preload.ts ADDED
@@ -0,0 +1,40 @@
1
+ import {Promise} from 'bluebird';
2
+ // 支持注解
3
+ import 'reflect-metadata';
4
+ import { melo } from '@bigtyphoon/melo';
5
+
6
+ /**
7
+ * 替换全局Promise
8
+ * 自动解析sourcemap
9
+ * 捕获全局错误
10
+ */
11
+ export function preload() {
12
+ // 使用bluebird输出完整的promise调用链
13
+ ((global as any).Promise as any) = (Promise as any);
14
+ // 开启长堆栈
15
+ Promise.config({
16
+ // Enable warnings
17
+ warnings: true,
18
+ // Enable long stack traces
19
+ longStackTraces: true,
20
+ // Enable cancellation
21
+ cancellation: true,
22
+ // Enable monitoring
23
+ monitoring: true
24
+ });
25
+
26
+ // 自动解析ts的sourcemap
27
+ require('source-map-support').install({
28
+ handleUncaughtExceptions: false
29
+ });
30
+
31
+ // 捕获普通异常
32
+ process.on('uncaughtException', function (err) {
33
+ console.error(melo.app ? melo.app.getServerId() : "unknownServerId", 'uncaughtException Caught exception: ', err);
34
+ });
35
+
36
+ // 捕获async异常
37
+ process.on('unhandledRejection', (reason: any, p) => {
38
+ console.error(melo.app ? melo.app.getServerId() : "unknownServerId", 'Caught Unhandled Rejection at:', p, 'reason:', reason);
39
+ });
40
+ }
package/robot/robot.ts ADDED
@@ -0,0 +1,97 @@
1
+
2
+ import { Actor } from '@bigtyphoon/melo-robot';
3
+ import { MeloWSClient, MeloWSClientEvent} from '@bigtyphoon/melo-robot-plugin';
4
+
5
+
6
+ export class Robot {
7
+ constructor(private actor: Actor) {
8
+
9
+ }
10
+
11
+ openid = String(Math.round(Math.random() * 1000));
12
+
13
+ meloClient = new MeloWSClient();
14
+
15
+ public connectGate(): void {
16
+
17
+ let host = '127.0.0.1';
18
+ let port = '3014';
19
+ this.meloClient.on(MeloWSClientEvent.EVENT_IO_ERROR, (event) => {
20
+ // 错误处理
21
+ console.error('error', event);
22
+ });
23
+ this.meloClient.on(MeloWSClientEvent.EVENT_CLOSE, function(event) {
24
+ // 关闭处理
25
+ console.error('close', event);
26
+ });
27
+ this.meloClient.on(MeloWSClientEvent.EVENT_HEART_BEAT_TIMEOUT, function(event) {
28
+ // 心跳timeout
29
+ console.error('heart beat timeout', event);
30
+ });
31
+ this.meloClient.on(MeloWSClientEvent.EVENT_KICK, function(event) {
32
+ // 踢出
33
+ console.error('kick', event);
34
+ });
35
+
36
+ // this.actor.emit("incr" , "gateConnReq");
37
+ this.actor.emit('start' , 'gateConn' , this.actor.id);
38
+ this.meloClient.init({
39
+ host: host,
40
+ port: port
41
+ }, () => {
42
+ this.actor.emit('end' , 'gateConn' , this.actor.id);
43
+ // 连接成功执行函数
44
+ console.log('gate连接成功');
45
+
46
+
47
+ this.gateQuery();
48
+ });
49
+ }
50
+ gateQuery() {
51
+ // this.actor.emit("incr" , "gateQueryReq");
52
+ this.actor.emit('start' , 'gateQuery' , this.actor.id);
53
+ this.meloClient.request('gate.gateHandler.queryEntry', {uid: this.openid} , (result: {code: number , host: string , port: number}) => {
54
+ // 消息回调
55
+ // console.log("gate返回",JSON.stringify(result));
56
+ this.actor.emit('end' , 'gateQuery' , this.actor.id);
57
+ this.meloClient.disconnect();
58
+ this.connectToConnector(result);
59
+ });
60
+ }
61
+
62
+ connectToConnector(result: {host: string , port: number}) {
63
+ // this.actor.emit("incr" , "loginConnReq");
64
+ this.actor.emit('start' , 'loginConn' , this.actor.id);
65
+ this.meloClient.init({
66
+ host: result.host,
67
+ port: result.port
68
+ }, () => {
69
+ this.actor.emit('end' , 'loginConn' , this.actor.id);
70
+ // 连接成功执行函数
71
+ console.log('connector连接成功');
72
+
73
+ this.loginQuery({rid: this.actor.id.toString() , username : this.actor.id.toString()});
74
+ });
75
+ }
76
+
77
+ loginQuery(result: {rid: string, username: string}) {
78
+
79
+ // this.actor.emit("incr" , "loginQueryReq");
80
+ this.actor.emit('start' , 'loginQuery' , this.actor.id);
81
+ this.meloClient.request('connector.entryHandler.enter', result , (ret: any) => {
82
+ // 消息回调
83
+ this.actor.emit('end' , 'loginQuery' , this.actor.id);
84
+ console.log('connector返回', JSON.stringify(result));
85
+
86
+
87
+ setTimeout(() =>
88
+ this.loginQuery(result) , Math.random() * 5000 + 1000);
89
+ });
90
+ }
91
+ }
92
+
93
+ export default function(actor: Actor) {
94
+ let client = new Robot(actor);
95
+ client.connectGate();
96
+ return client;
97
+ }
package/tsconfig.json ADDED
@@ -0,0 +1,34 @@
1
+ {
2
+ "compilerOptions": {
3
+ "skipLibCheck": true,
4
+ // types option has been previously configured
5
+ "types": [
6
+ // add node as an option
7
+ "node"
8
+ ],
9
+ "module": "commonjs", //指定生成哪个模块系统代码
10
+ "target": "es2017",
11
+ "lib": [
12
+ "es2015",
13
+ "es2016",
14
+ "esnext.asynciterable",
15
+ "DOM"
16
+ ],
17
+ "noImplicitAny": true, //在表达式和声明上有隐含的'any'类型时报错。
18
+ "noImplicitThis": true,
19
+ "inlineSourceMap": true, //用于debug
20
+ "newLine": "lf", // 统一跨平台下编译文件的换行符
21
+
22
+ "rootDirs": ["."], //仅用来控制输出的目录结构--outDir。
23
+ "outDir": "./dist", //重定向输出目录。
24
+ "experimentalDecorators": true,
25
+ "emitDecoratorMetadata": true,
26
+ "moduleResolution": "node"
27
+ },
28
+ "include": [
29
+ "./**/*.ts"
30
+ ],
31
+ "exclude": [
32
+ "./dist/**/*.*"
33
+ ]
34
+ }