cgserver 12.0.8 → 12.2.0

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 (176) hide show
  1. package/README.md +9 -0
  2. package/dist/lib/Framework/AI/AiObject.js +10 -10
  3. package/dist/lib/Framework/AI/Astar.js +133 -133
  4. package/dist/lib/Framework/AI/BehaviorAI.js +340 -307
  5. package/dist/lib/Framework/AI/Entity.js +33 -33
  6. package/dist/lib/Framework/AI/Point.js +68 -68
  7. package/dist/lib/Framework/AI/TriggerMgr.js +201 -201
  8. package/dist/lib/Framework/Config/Config.js +74 -41
  9. package/dist/lib/Framework/Config/DbConfig.js +14 -14
  10. package/dist/lib/Framework/Config/FrameworkConfig.js +139 -173
  11. package/dist/lib/Framework/Config/IServerConfig.js +31 -31
  12. package/dist/lib/Framework/Config/_error_.js +35 -35
  13. package/dist/lib/Framework/Core/ByteTool.js +85 -85
  14. package/dist/lib/Framework/Core/Core.js +724 -688
  15. package/dist/lib/Framework/Core/Timer.js +116 -116
  16. package/dist/lib/Framework/Database/Decorator/AutoIncrement.js +10 -11
  17. package/dist/lib/Framework/Database/Decorator/DBCache.js +98 -65
  18. package/dist/lib/Framework/Database/Decorator/NotNull.js +10 -11
  19. package/dist/lib/Framework/Database/Decorator/PrimaryKey.js +10 -11
  20. package/dist/lib/Framework/Database/Decorator/Property.js +61 -61
  21. package/dist/lib/Framework/Database/Decorator/Table.js +14 -15
  22. package/dist/lib/Framework/Database/Decorator/Type.js +19 -20
  23. package/dist/lib/Framework/Database/MSSql/MSSqlManager.js +86 -53
  24. package/dist/lib/Framework/Database/Mongo/MongoBaseService.js +141 -141
  25. package/dist/lib/Framework/Database/Mongo/MongoManager.js +595 -547
  26. package/dist/lib/Framework/Database/Mongo/MongoServiceManager.js +52 -52
  27. package/dist/lib/Framework/Database/Mysql/MysqlBaseService.js +280 -280
  28. package/dist/lib/Framework/Database/Mysql/MysqlManager.js +138 -105
  29. package/dist/lib/Framework/Database/Redis/RedisManager.js +94 -61
  30. package/dist/lib/Framework/Decorator/AdminValidate.js +18 -19
  31. package/dist/lib/Framework/Decorator/AuthorityValidate.js +22 -22
  32. package/dist/lib/Framework/Decorator/CreatorValidate.js +18 -19
  33. package/dist/lib/Framework/Decorator/JsonAdminValidate.js +14 -15
  34. package/dist/lib/Framework/Decorator/JsonAuthorityValidate.js +20 -20
  35. package/dist/lib/Framework/Decorator/JsonCreatorValidate.js +18 -19
  36. package/dist/lib/Framework/Decorator/SyncCall.js +41 -42
  37. package/dist/lib/Framework/Decorator/SyncCallServer.js +77 -77
  38. package/dist/lib/Framework/Logic/CacheTool.js +106 -73
  39. package/dist/lib/Framework/Logic/EventTool.js +31 -28
  40. package/dist/lib/Framework/Logic/HttpTool.js +138 -105
  41. package/dist/lib/Framework/Logic/Log.js +121 -88
  42. package/dist/lib/Framework/Logic/SyncQueueTool.js +44 -44
  43. package/dist/lib/Framework/Server/ProtoFilter/GoogleProtoFilter.js +90 -57
  44. package/dist/lib/Framework/Server/ProtoFilter/IProtoFilter.js +9 -9
  45. package/dist/lib/Framework/Server/ProtoFilter/JsonProtoFilter.js +29 -29
  46. package/dist/lib/Framework/Server/ProtoFilter/ProtoFactory.js +35 -35
  47. package/dist/lib/Framework/Server/RpcWebSocketServer/CgMq.js +180 -180
  48. package/dist/lib/Framework/Server/RpcWebSocketServer/IRpc.js +38 -38
  49. package/dist/lib/Framework/Server/RpcWebSocketServer/IRpcClientWebSocket.js +253 -253
  50. package/dist/lib/Framework/Server/RpcWebSocketServer/IRpcServerWebSocket.js +94 -94
  51. package/dist/lib/Framework/Server/SocketServer/IClientSocket.js +44 -44
  52. package/dist/lib/Framework/Server/SocketServer/IServerSocket.js +114 -81
  53. package/dist/lib/Framework/Server/SocketServer/ISocket.js +255 -222
  54. package/dist/lib/Framework/Server/SocketServer/ISocketServer.js +177 -144
  55. package/dist/lib/Framework/Server/SocketServer/PacketParser.js +40 -40
  56. package/dist/lib/Framework/Server/WebServer/Controller/BaseController.js +119 -119
  57. package/dist/lib/Framework/Server/WebServer/Controller/MongoBaseUserController.js +171 -171
  58. package/dist/lib/Framework/Server/WebServer/Controller/MysqlBaseUserController.js +169 -169
  59. package/dist/lib/Framework/Server/WebServer/Engine/ControllerManager.js +115 -115
  60. package/dist/lib/Framework/Server/WebServer/Engine/Engine.js +254 -218
  61. package/dist/lib/Framework/Server/WebServer/Engine/RazorJs.js +543 -543
  62. package/dist/lib/Framework/Server/WebServer/Engine/Request.js +226 -226
  63. package/dist/lib/Framework/Server/WebServer/Engine/Response.js +120 -87
  64. package/dist/lib/Framework/Server/WebServer/IWebServer.js +55 -55
  65. package/dist/lib/Framework/Server/WebSocketServer/IClientWebSocket.js +44 -44
  66. package/dist/lib/Framework/Server/WebSocketServer/IServerWebSocket.js +128 -95
  67. package/dist/lib/Framework/Server/WebSocketServer/IWebSocket.js +248 -215
  68. package/dist/lib/Framework/Server/WebSocketServer/IWebSocketServer.js +250 -217
  69. package/dist/lib/Framework/Service/MongoAccountService.js +339 -339
  70. package/dist/lib/Framework/Service/MongoCacheService.js +50 -50
  71. package/dist/lib/Framework/Service/MongoUserService.js +129 -96
  72. package/dist/lib/Framework/Service/MysqlAccountService.js +411 -411
  73. package/dist/lib/Framework/Service/MysqlUserService.js +204 -171
  74. package/dist/lib/Framework/Service/ini.js +36 -36
  75. package/dist/lib/Framework/ThirdParty/AlipayTool.js +117 -205
  76. package/dist/lib/Framework/ThirdParty/Alisms.js +61 -50
  77. package/dist/lib/Framework/ThirdParty/AppleTool.js +271 -235
  78. package/dist/lib/Framework/ThirdParty/CgRankTool.js +215 -215
  79. package/dist/lib/Framework/ThirdParty/EmailTool.js +71 -38
  80. package/dist/lib/Framework/ThirdParty/QQTool.js +162 -129
  81. package/dist/lib/Framework/ThirdParty/QiniuTool.js +62 -29
  82. package/dist/lib/Framework/ThirdParty/Rpc.js +79 -79
  83. package/dist/lib/Framework/ThirdParty/WechatTool.js +167 -134
  84. package/dist/lib/Framework/cgserver.js +215 -212
  85. package/dist/lib/Framework/global.js +74 -74
  86. package/dist/lib/Framework/index.js +38 -5
  87. package/dist/lib/Framework/index_export_.js +180 -177
  88. package/dist/lib/test/test.js +21 -21
  89. package/dist/types/Framework/AI/AiObject.d.ts +5 -5
  90. package/dist/types/Framework/AI/Astar.d.ts +38 -38
  91. package/dist/types/Framework/AI/BehaviorAI.d.ts +24 -24
  92. package/dist/types/Framework/AI/Entity.d.ts +12 -12
  93. package/dist/types/Framework/AI/Point.d.ts +17 -17
  94. package/dist/types/Framework/AI/TriggerMgr.d.ts +51 -51
  95. package/dist/types/Framework/Config/Config.d.ts +9 -9
  96. package/dist/types/Framework/Config/DbConfig.d.ts +11 -11
  97. package/dist/types/Framework/Config/FrameworkConfig.d.ts +146 -178
  98. package/dist/types/Framework/Config/IServerConfig.d.ts +9 -9
  99. package/dist/types/Framework/Config/_error_.d.ts +99 -99
  100. package/dist/types/Framework/Core/ByteTool.d.ts +21 -21
  101. package/dist/types/Framework/Core/Core.d.ts +119 -120
  102. package/dist/types/Framework/Core/Timer.d.ts +16 -16
  103. package/dist/types/Framework/Database/Decorator/AutoIncrement.d.ts +1 -1
  104. package/dist/types/Framework/Database/Decorator/DBCache.d.ts +22 -22
  105. package/dist/types/Framework/Database/Decorator/NotNull.d.ts +1 -1
  106. package/dist/types/Framework/Database/Decorator/PrimaryKey.d.ts +1 -1
  107. package/dist/types/Framework/Database/Decorator/Property.d.ts +57 -57
  108. package/dist/types/Framework/Database/Decorator/Table.d.ts +1 -1
  109. package/dist/types/Framework/Database/Decorator/Type.d.ts +1 -1
  110. package/dist/types/Framework/Database/MSSql/MSSqlManager.d.ts +26 -26
  111. package/dist/types/Framework/Database/Mongo/MongoBaseService.d.ts +116 -116
  112. package/dist/types/Framework/Database/Mongo/MongoManager.d.ts +207 -204
  113. package/dist/types/Framework/Database/Mongo/MongoServiceManager.d.ts +13 -13
  114. package/dist/types/Framework/Database/Mysql/MysqlBaseService.d.ts +34 -34
  115. package/dist/types/Framework/Database/Mysql/MysqlManager.d.ts +30 -30
  116. package/dist/types/Framework/Database/Redis/RedisManager.d.ts +24 -24
  117. package/dist/types/Framework/Decorator/AdminValidate.d.ts +1 -1
  118. package/dist/types/Framework/Decorator/AuthorityValidate.d.ts +2 -2
  119. package/dist/types/Framework/Decorator/CreatorValidate.d.ts +1 -1
  120. package/dist/types/Framework/Decorator/JsonAdminValidate.d.ts +1 -1
  121. package/dist/types/Framework/Decorator/JsonAuthorityValidate.d.ts +2 -2
  122. package/dist/types/Framework/Decorator/JsonCreatorValidate.d.ts +1 -1
  123. package/dist/types/Framework/Decorator/SyncCall.d.ts +12 -12
  124. package/dist/types/Framework/Decorator/SyncCallServer.d.ts +14 -14
  125. package/dist/types/Framework/Logic/CacheTool.d.ts +27 -27
  126. package/dist/types/Framework/Logic/EventTool.d.ts +11 -12
  127. package/dist/types/Framework/Logic/HttpTool.d.ts +19 -19
  128. package/dist/types/Framework/Logic/Log.d.ts +18 -18
  129. package/dist/types/Framework/Logic/SyncQueueTool.d.ts +21 -21
  130. package/dist/types/Framework/Server/ProtoFilter/GoogleProtoFilter.d.ts +9 -9
  131. package/dist/types/Framework/Server/ProtoFilter/IProtoFilter.d.ts +10 -10
  132. package/dist/types/Framework/Server/ProtoFilter/JsonProtoFilter.d.ts +6 -6
  133. package/dist/types/Framework/Server/ProtoFilter/ProtoFactory.d.ts +12 -12
  134. package/dist/types/Framework/Server/RpcWebSocketServer/CgMq.d.ts +59 -59
  135. package/dist/types/Framework/Server/RpcWebSocketServer/IRpc.d.ts +33 -33
  136. package/dist/types/Framework/Server/RpcWebSocketServer/IRpcClientWebSocket.d.ts +34 -34
  137. package/dist/types/Framework/Server/RpcWebSocketServer/IRpcServerWebSocket.d.ts +23 -23
  138. package/dist/types/Framework/Server/SocketServer/IClientSocket.d.ts +16 -18
  139. package/dist/types/Framework/Server/SocketServer/IServerSocket.d.ts +27 -29
  140. package/dist/types/Framework/Server/SocketServer/ISocket.d.ts +78 -81
  141. package/dist/types/Framework/Server/SocketServer/ISocketServer.d.ts +44 -45
  142. package/dist/types/Framework/Server/SocketServer/PacketParser.d.ts +8 -10
  143. package/dist/types/Framework/Server/WebServer/Controller/BaseController.d.ts +34 -34
  144. package/dist/types/Framework/Server/WebServer/Controller/MongoBaseUserController.d.ts +28 -28
  145. package/dist/types/Framework/Server/WebServer/Controller/MysqlBaseUserController.d.ts +27 -27
  146. package/dist/types/Framework/Server/WebServer/Engine/ControllerManager.d.ts +37 -37
  147. package/dist/types/Framework/Server/WebServer/Engine/Engine.d.ts +42 -44
  148. package/dist/types/Framework/Server/WebServer/Engine/RazorJs.d.ts +21 -21
  149. package/dist/types/Framework/Server/WebServer/Engine/Request.d.ts +47 -50
  150. package/dist/types/Framework/Server/WebServer/Engine/Response.d.ts +26 -26
  151. package/dist/types/Framework/Server/WebServer/IWebServer.d.ts +22 -22
  152. package/dist/types/Framework/Server/WebSocketServer/IClientWebSocket.d.ts +17 -17
  153. package/dist/types/Framework/Server/WebSocketServer/IServerWebSocket.d.ts +37 -38
  154. package/dist/types/Framework/Server/WebSocketServer/IWebSocket.d.ts +76 -76
  155. package/dist/types/Framework/Server/WebSocketServer/IWebSocketServer.d.ts +49 -49
  156. package/dist/types/Framework/Service/MongoAccountService.d.ts +62 -62
  157. package/dist/types/Framework/Service/MongoCacheService.d.ts +19 -19
  158. package/dist/types/Framework/Service/MongoUserService.d.ts +31 -31
  159. package/dist/types/Framework/Service/MysqlAccountService.d.ts +67 -67
  160. package/dist/types/Framework/Service/MysqlUserService.d.ts +33 -33
  161. package/dist/types/Framework/Service/ini.d.ts +29 -29
  162. package/dist/types/Framework/ThirdParty/AlipayTool.d.ts +76 -108
  163. package/dist/types/Framework/ThirdParty/Alisms.d.ts +23 -13
  164. package/dist/types/Framework/ThirdParty/AppleTool.d.ts +131 -131
  165. package/dist/types/Framework/ThirdParty/CgRankTool.d.ts +107 -107
  166. package/dist/types/Framework/ThirdParty/EmailTool.d.ts +4 -4
  167. package/dist/types/Framework/ThirdParty/QQTool.d.ts +41 -41
  168. package/dist/types/Framework/ThirdParty/QiniuTool.d.ts +5 -5
  169. package/dist/types/Framework/ThirdParty/Rpc.d.ts +28 -28
  170. package/dist/types/Framework/ThirdParty/WechatTool.d.ts +30 -30
  171. package/dist/types/Framework/cgserver.d.ts +63 -63
  172. package/dist/types/Framework/global.d.ts +45 -45
  173. package/dist/types/Framework/index.d.ts +2 -2
  174. package/dist/types/Framework/index_export_.d.ts +81 -79
  175. package/dist/types/test/test.d.ts +1 -1
  176. package/package.json +8 -4
@@ -1,217 +1,250 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.IWebSocketServer = void 0;
4
- const ws = require("websocket");
5
- const fs = require("fs");
6
- const http = require("http");
7
- const https = require("https");
8
- const Config_1 = require("../../Config/Config");
9
- const cgserver_1 = require("../../cgserver");
10
- const Log_1 = require("../../Logic/Log");
11
- const EventTool_1 = require("../../Logic/EventTool");
12
- class IWebSocketServer {
13
- _cfg = null;
14
- //方便提示
15
- get cfg() {
16
- return this._cfg;
17
- }
18
- //服务器已被关闭
19
- _is_runging = false;
20
- get isrunging() {
21
- return this._is_runging;
22
- }
23
- get name() {
24
- return this._cfg.serverName;
25
- }
26
- //监听websocket
27
- _listening_websocket = null;
28
- get listeningWebSocket() {
29
- return this._listening_websocket;
30
- }
31
- //来自于用户的链接
32
- _ws_clients = {};
33
- get wsClients() {
34
- return this._ws_clients;
35
- }
36
- get listenPort() {
37
- return this._cfg.port;
38
- }
39
- /**
40
- * websocket can accepted protocol
41
- */
42
- _accepted_protocol = null;
43
- //服务器管理相关
44
- /*
45
- item=servername:class
46
- */
47
- _name_vs_class = {};
48
- registerWebSocketHandleClass(name, cls) {
49
- if (!name || name == "") {
50
- throw "registerWebSocketHandleClass name must be not null or empty!";
51
- }
52
- this._name_vs_class[name] = cls;
53
- }
54
- constructor(cfg) {
55
- this._cfg = cfg;
56
- }
57
- removeServerWebSocketBySocketId(socketId) {
58
- this._ws_clients[socketId] = null;
59
- delete this._ws_clients[socketId];
60
- }
61
- async run() {
62
- cgserver_1.gCgServer.addWebSocketServer(this);
63
- if (this._cfg.db) {
64
- await cgserver_1.gCgServer.initDb(this._cfg.db);
65
- }
66
- this.initWebSocket();
67
- }
68
- pause() {
69
- if (!this._is_runging) {
70
- Log_1.gLog.error("websocketserver has paused:" + this._cfg.port);
71
- return;
72
- }
73
- this._is_runging = false;
74
- this._listening_websocket.closeAllConnections();
75
- Log_1.gLog.info("websocketserver paused:" + this._cfg.port);
76
- }
77
- resume() {
78
- if (this._is_runging) {
79
- Log_1.gLog.error("websocketserver is running:" + this._cfg.port);
80
- return;
81
- }
82
- this._is_runging = true;
83
- Log_1.gLog.error("websocketserver resumed:" + this._cfg.port);
84
- }
85
- /*
86
- 把所有的客户端链接保存起来
87
- 方便统计,广播等
88
- */
89
- addClient(ws_client) {
90
- this._ws_clients[ws_client.socketId] = ws_client;
91
- }
92
- isOriginAllowed(origin) {
93
- if (!this._is_runging) {
94
- return false;
95
- }
96
- return true;
97
- }
98
- initWebSocket(wss) {
99
- let server = null;
100
- if (wss) {
101
- let options = {
102
- key: fs.readFileSync(Config_1.Config.rootDataDir + "ssl/ssl2.key"),
103
- cert: fs.readFileSync(Config_1.Config.rootDataDir + "ssl/ssl2.crt"),
104
- //passphrase:'1234'//如果秘钥文件有密码的话,用这个属性设置密码
105
- };
106
- server = https.createServer(options, (request, response) => {
107
- Log_1.gLog.info((new Date()) + 'wss Received request for ' + request.url);
108
- response.writeHead(200);
109
- response.end();
110
- });
111
- }
112
- else {
113
- server = http.createServer((request, response) => {
114
- Log_1.gLog.info((new Date()) + 'ws Received request for ' + request.url);
115
- response.writeHead(200);
116
- response.end();
117
- });
118
- }
119
- server.listen(this._cfg.port, this.onListenning.bind(this));
120
- this._listening_websocket = new ws.server({
121
- httpServer: server,
122
- // You should not use autoAcceptConnections for production
123
- // applications, as it defeats all standard cross-origin protection
124
- // facilities built into the protocol and the browser. You should
125
- // *always* verify the connection's origin and decide whether or not
126
- // to accept it.
127
- autoAcceptConnections: false
128
- });
129
- this._listening_websocket.on('request', this.onRequest.bind(this));
130
- this._listening_websocket.on('close', this.onClose.bind(this));
131
- }
132
- onClose(connection, reason, desc) {
133
- }
134
- onListenning() {
135
- this._is_runging = true;
136
- EventTool_1.gEventTool.emit("socket_server_init_done");
137
- let info = (new Date()) + " Server " + this.name + " is listening on port " + this._cfg.port;
138
- Log_1.gLog.info(info);
139
- }
140
- onRequest(req) {
141
- if (!this._is_runging) {
142
- req.reject();
143
- Log_1.gLog.error(' Connection from origin ' + req.origin + ' rejected.');
144
- return;
145
- }
146
- let protocol = null;
147
- if (req.requestedProtocols.length > 0) {
148
- protocol = req.requestedProtocols[0];
149
- }
150
- let allowed = this.isOriginAllowed(req.origin);
151
- if (!allowed) {
152
- req.reject();
153
- Log_1.gLog.error(' Connection from origin ' + req.origin + ' rejected.');
154
- return;
155
- }
156
- try {
157
- let conn = req.accept(this._accepted_protocol, req.origin);
158
- if (!conn) {
159
- Log_1.gLog.error(' protocol reject');
160
- return;
161
- }
162
- Log_1.gLog.info((new Date()) + ' Connection accepted.');
163
- let server_name = this._getServerNameByCookies(req.cookies);
164
- this.createWebSocketObjectByProtocol(server_name, conn, req);
165
- }
166
- catch (e) {
167
- Log_1.gLog.error(e);
168
- }
169
- }
170
- createWebSocketObjectByProtocol(server_name, _ws, req) {
171
- server_name = server_name || "default";
172
- let cls = this._name_vs_class[server_name];
173
- if (!cls) {
174
- Log_1.gLog.error("(createWebSocketObjectByProtocol in server(" + this.name + "))no this websocket handle class=" + server_name);
175
- return null;
176
- }
177
- let ws_server = (new cls(this));
178
- this.addClient(ws_server);
179
- ws_server.onConnect(_ws, req);
180
- return ws_server;
181
- }
182
- _getServerNameByCookies(cookies) {
183
- let server_name = "";
184
- if (!cookies) {
185
- return server_name;
186
- }
187
- for (let index in cookies) {
188
- let cookie = cookies[index];
189
- if (cookie.name == "server") {
190
- server_name = cookie.value;
191
- break;
192
- }
193
- }
194
- return server_name;
195
- }
196
- /**
197
- * 广播消息
198
- * @param msg
199
- */
200
- broadCast(msg) {
201
- for (var key in this._ws_clients) {
202
- let ws = this._ws_clients[key];
203
- ws.send(msg);
204
- }
205
- }
206
- /**
207
- * 获取任意客户端连接
208
- * @returns
209
- */
210
- getAnyWebSocket() {
211
- for (var key in this._ws_clients) {
212
- return this._ws_clients[key];
213
- }
214
- return null;
215
- }
216
- }
217
- exports.IWebSocketServer = IWebSocketServer;
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.IWebSocketServer = void 0;
37
+ const ws = __importStar(require("websocket"));
38
+ const fs = __importStar(require("fs"));
39
+ const http = __importStar(require("http"));
40
+ const https = __importStar(require("https"));
41
+ const Config_1 = require("../../Config/Config");
42
+ const cgserver_1 = require("../../cgserver");
43
+ const Log_1 = require("../../Logic/Log");
44
+ const EventTool_1 = require("../../Logic/EventTool");
45
+ class IWebSocketServer {
46
+ _cfg = null;
47
+ //方便提示
48
+ get cfg() {
49
+ return this._cfg;
50
+ }
51
+ //服务器已被关闭
52
+ _is_runging = false;
53
+ get isrunging() {
54
+ return this._is_runging;
55
+ }
56
+ get name() {
57
+ return this._cfg.serverName;
58
+ }
59
+ //监听websocket
60
+ _listening_websocket = null;
61
+ get listeningWebSocket() {
62
+ return this._listening_websocket;
63
+ }
64
+ //来自于用户的链接
65
+ _ws_clients = {};
66
+ get wsClients() {
67
+ return this._ws_clients;
68
+ }
69
+ get listenPort() {
70
+ return this._cfg.port;
71
+ }
72
+ /**
73
+ * websocket can accepted protocol
74
+ */
75
+ _accepted_protocol = null;
76
+ //服务器管理相关
77
+ /*
78
+ item=servername:class
79
+ */
80
+ _name_vs_class = {};
81
+ registerWebSocketHandleClass(name, cls) {
82
+ if (!name || name == "") {
83
+ throw "registerWebSocketHandleClass name must be not null or empty!";
84
+ }
85
+ this._name_vs_class[name] = cls;
86
+ }
87
+ constructor(cfg) {
88
+ this._cfg = cfg;
89
+ }
90
+ removeServerWebSocketBySocketId(socketId) {
91
+ this._ws_clients[socketId] = null;
92
+ delete this._ws_clients[socketId];
93
+ }
94
+ async run() {
95
+ cgserver_1.gCgServer.addWebSocketServer(this);
96
+ if (this._cfg.db) {
97
+ await cgserver_1.gCgServer.initDb(this._cfg.db);
98
+ }
99
+ this.initWebSocket();
100
+ }
101
+ pause() {
102
+ if (!this._is_runging) {
103
+ Log_1.gLog.error("websocketserver has paused:" + this._cfg.port);
104
+ return;
105
+ }
106
+ this._is_runging = false;
107
+ this._listening_websocket.closeAllConnections();
108
+ Log_1.gLog.info("websocketserver paused:" + this._cfg.port);
109
+ }
110
+ resume() {
111
+ if (this._is_runging) {
112
+ Log_1.gLog.error("websocketserver is running:" + this._cfg.port);
113
+ return;
114
+ }
115
+ this._is_runging = true;
116
+ Log_1.gLog.error("websocketserver resumed:" + this._cfg.port);
117
+ }
118
+ /*
119
+ 把所有的客户端链接保存起来
120
+ 方便统计,广播等
121
+ */
122
+ addClient(ws_client) {
123
+ this._ws_clients[ws_client.socketId] = ws_client;
124
+ }
125
+ isOriginAllowed(origin) {
126
+ if (!this._is_runging) {
127
+ return false;
128
+ }
129
+ return true;
130
+ }
131
+ initWebSocket(wss) {
132
+ let server = null;
133
+ if (wss) {
134
+ let options = {
135
+ key: fs.readFileSync(Config_1.Config.rootDataDir + "ssl/ssl2.key"),
136
+ cert: fs.readFileSync(Config_1.Config.rootDataDir + "ssl/ssl2.crt"),
137
+ //passphrase:'1234'//如果秘钥文件有密码的话,用这个属性设置密码
138
+ };
139
+ server = https.createServer(options, (request, response) => {
140
+ Log_1.gLog.info((new Date()) + 'wss Received request for ' + request.url);
141
+ response.writeHead(200);
142
+ response.end();
143
+ });
144
+ }
145
+ else {
146
+ server = http.createServer((request, response) => {
147
+ Log_1.gLog.info((new Date()) + 'ws Received request for ' + request.url);
148
+ response.writeHead(200);
149
+ response.end();
150
+ });
151
+ }
152
+ server.listen(this._cfg.port, this.onListenning.bind(this));
153
+ this._listening_websocket = new ws.server({
154
+ httpServer: server,
155
+ // You should not use autoAcceptConnections for production
156
+ // applications, as it defeats all standard cross-origin protection
157
+ // facilities built into the protocol and the browser. You should
158
+ // *always* verify the connection's origin and decide whether or not
159
+ // to accept it.
160
+ autoAcceptConnections: false
161
+ });
162
+ this._listening_websocket.on('request', this.onRequest.bind(this));
163
+ this._listening_websocket.on('close', this.onClose.bind(this));
164
+ }
165
+ onClose(connection, reason, desc) {
166
+ }
167
+ onListenning() {
168
+ this._is_runging = true;
169
+ EventTool_1.gEventTool.emit("socket_server_init_done");
170
+ let info = (new Date()) + " Server " + this.name + " is listening on port " + this._cfg.port;
171
+ Log_1.gLog.info(info);
172
+ }
173
+ onRequest(req) {
174
+ if (!this._is_runging) {
175
+ req.reject();
176
+ Log_1.gLog.error(' Connection from origin ' + req.origin + ' rejected.');
177
+ return;
178
+ }
179
+ let protocol = null;
180
+ if (req.requestedProtocols.length > 0) {
181
+ protocol = req.requestedProtocols[0];
182
+ }
183
+ let allowed = this.isOriginAllowed(req.origin);
184
+ if (!allowed) {
185
+ req.reject();
186
+ Log_1.gLog.error(' Connection from origin ' + req.origin + ' rejected.');
187
+ return;
188
+ }
189
+ try {
190
+ let conn = req.accept(this._accepted_protocol, req.origin);
191
+ if (!conn) {
192
+ Log_1.gLog.error(' protocol reject');
193
+ return;
194
+ }
195
+ Log_1.gLog.info((new Date()) + ' Connection accepted.');
196
+ let server_name = this._getServerNameByCookies(req.cookies);
197
+ this.createWebSocketObjectByProtocol(server_name, conn, req);
198
+ }
199
+ catch (e) {
200
+ Log_1.gLog.error(e);
201
+ }
202
+ }
203
+ createWebSocketObjectByProtocol(server_name, _ws, req) {
204
+ server_name = server_name || "default";
205
+ let cls = this._name_vs_class[server_name];
206
+ if (!cls) {
207
+ Log_1.gLog.error("(createWebSocketObjectByProtocol in server(" + this.name + "))no this websocket handle class=" + server_name);
208
+ return null;
209
+ }
210
+ let ws_server = (new cls(this));
211
+ this.addClient(ws_server);
212
+ ws_server.onConnect(_ws, req);
213
+ return ws_server;
214
+ }
215
+ _getServerNameByCookies(cookies) {
216
+ let server_name = "";
217
+ if (!cookies) {
218
+ return server_name;
219
+ }
220
+ for (let index in cookies) {
221
+ let cookie = cookies[index];
222
+ if (cookie.name == "server") {
223
+ server_name = cookie.value;
224
+ break;
225
+ }
226
+ }
227
+ return server_name;
228
+ }
229
+ /**
230
+ * 广播消息
231
+ * @param msg
232
+ */
233
+ broadCast(msg) {
234
+ for (var key in this._ws_clients) {
235
+ let ws = this._ws_clients[key];
236
+ ws.send(msg);
237
+ }
238
+ }
239
+ /**
240
+ * 获取任意客户端连接
241
+ * @returns
242
+ */
243
+ getAnyWebSocket() {
244
+ for (var key in this._ws_clients) {
245
+ return this._ws_clients[key];
246
+ }
247
+ return null;
248
+ }
249
+ }
250
+ exports.IWebSocketServer = IWebSocketServer;