cgserver 11.2.8 → 12.0.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 (61) hide show
  1. package/README.md +2 -0
  2. package/dist/lib/Framework/Server/ProtoFilter/GoogleProtoFilter.js +57 -0
  3. package/dist/lib/Framework/Server/ProtoFilter/IProtoFilter.js +9 -0
  4. package/dist/lib/Framework/Server/ProtoFilter/JsonProtoFilter.js +29 -0
  5. package/dist/lib/Framework/Server/ProtoFilter/ProtoFactory.js +35 -0
  6. package/dist/lib/Framework/Server/SocketServer/IClientSocket.js +44 -0
  7. package/dist/lib/Framework/Server/SocketServer/IServerSocket.js +95 -0
  8. package/dist/lib/Framework/Server/SocketServer/ISocket.js +222 -0
  9. package/dist/lib/Framework/Server/SocketServer/ISocketServer.js +144 -0
  10. package/dist/lib/Framework/Server/SocketServer/PacketParser.js +40 -0
  11. package/dist/lib/Framework/Server/WebServer/Controller/BaseController.js +119 -0
  12. package/dist/lib/Framework/Server/WebServer/Controller/MongoBaseUserController.js +171 -0
  13. package/dist/lib/Framework/Server/WebServer/Controller/MysqlBaseUserController.js +169 -0
  14. package/dist/lib/Framework/Server/WebServer/Engine/ControllerManager.js +115 -0
  15. package/dist/lib/Framework/Server/WebServer/Engine/Engine.js +218 -0
  16. package/dist/lib/Framework/Server/WebServer/Engine/RazorJs.js +543 -0
  17. package/dist/lib/Framework/Server/WebServer/Engine/Request.js +226 -0
  18. package/dist/lib/Framework/Server/WebServer/Engine/Response.js +87 -0
  19. package/dist/lib/Framework/Server/WebServer/IWebServer.js +55 -0
  20. package/dist/lib/Framework/Server/WebSocketServer/IClientWebSocket.js +44 -0
  21. package/dist/lib/Framework/Server/WebSocketServer/IRpc.js +36 -0
  22. package/dist/lib/Framework/Server/WebSocketServer/IRpcClientWebSocket.js +140 -0
  23. package/dist/lib/Framework/Server/WebSocketServer/IRpcServerWebSocket.js +82 -0
  24. package/dist/lib/Framework/Server/WebSocketServer/IServerWebSocket.js +95 -0
  25. package/dist/lib/Framework/Server/WebSocketServer/IWebSocket.js +215 -0
  26. package/dist/lib/Framework/Server/WebSocketServer/IWebSocketServer.js +214 -0
  27. package/dist/lib/Framework/ThirdParty/CgMq.js +27 -1
  28. package/dist/lib/Framework/cgserver.js +21 -8
  29. package/dist/lib/Framework/global.js +2 -2
  30. package/dist/lib/Framework/index_export_.js +31 -20
  31. package/dist/types/Framework/Server/ProtoFilter/GoogleProtoFilter.d.ts +9 -0
  32. package/dist/types/Framework/Server/ProtoFilter/IProtoFilter.d.ts +10 -0
  33. package/dist/types/Framework/Server/ProtoFilter/JsonProtoFilter.d.ts +6 -0
  34. package/dist/types/Framework/Server/ProtoFilter/ProtoFactory.d.ts +12 -0
  35. package/dist/types/Framework/Server/SocketServer/IClientSocket.d.ts +17 -0
  36. package/dist/types/Framework/Server/SocketServer/IServerSocket.d.ts +38 -0
  37. package/dist/types/Framework/Server/SocketServer/ISocket.d.ts +80 -0
  38. package/dist/types/Framework/Server/SocketServer/ISocketServer.d.ts +45 -0
  39. package/dist/types/Framework/Server/SocketServer/PacketParser.d.ts +9 -0
  40. package/dist/types/Framework/Server/WebServer/Controller/BaseController.d.ts +34 -0
  41. package/dist/types/Framework/Server/WebServer/Controller/MongoBaseUserController.d.ts +28 -0
  42. package/dist/types/Framework/Server/WebServer/Controller/MysqlBaseUserController.d.ts +27 -0
  43. package/dist/types/Framework/Server/WebServer/Engine/ControllerManager.d.ts +37 -0
  44. package/dist/types/Framework/Server/WebServer/Engine/Engine.d.ts +44 -0
  45. package/dist/types/Framework/Server/WebServer/Engine/RazorJs.d.ts +21 -0
  46. package/dist/types/Framework/Server/WebServer/Engine/Request.d.ts +50 -0
  47. package/dist/types/Framework/Server/WebServer/Engine/Response.d.ts +26 -0
  48. package/dist/types/Framework/Server/WebServer/IWebServer.d.ts +22 -0
  49. package/dist/types/Framework/Server/WebSocketServer/IClientWebSocket.d.ts +17 -0
  50. package/dist/types/Framework/Server/WebSocketServer/IRpc.d.ts +32 -0
  51. package/dist/types/Framework/Server/WebSocketServer/IRpcClientWebSocket.d.ts +29 -0
  52. package/dist/types/Framework/Server/WebSocketServer/IRpcServerWebSocket.d.ts +23 -0
  53. package/dist/types/Framework/Server/WebSocketServer/IServerWebSocket.d.ts +38 -0
  54. package/dist/types/Framework/Server/WebSocketServer/IWebSocket.d.ts +76 -0
  55. package/dist/types/Framework/Server/WebSocketServer/IWebSocketServer.d.ts +46 -0
  56. package/dist/types/Framework/ThirdParty/CgMq.d.ts +11 -2
  57. package/dist/types/Framework/ThirdParty/Rpc.d.ts +1 -1
  58. package/dist/types/Framework/cgserver.d.ts +7 -3
  59. package/dist/types/Framework/global.d.ts +2 -2
  60. package/dist/types/Framework/index_export_.d.ts +24 -19
  61. package/package.json +2 -1
package/README.md CHANGED
@@ -1,3 +1,5 @@
1
+ 12.0.0
2
+ 1、增加socketserver
1
3
  11.2.5
2
4
  1、Engine 增加app接口
3
5
  11.2.2
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GoogleProtoFilter = void 0;
4
+ const Log_1 = require("../../Logic/Log");
5
+ const protobufjs = require("protobufjs");
6
+ class GoogleProtoFilter {
7
+ _root = new protobufjs.Root();
8
+ _inited = false;
9
+ init(path) {
10
+ if (this._inited) {
11
+ return;
12
+ }
13
+ this._inited = true;
14
+ try {
15
+ this._root.loadSync(path, { keepCase: true });
16
+ }
17
+ catch (e) {
18
+ Log_1.gLog.error(e);
19
+ return false;
20
+ }
21
+ return true;
22
+ }
23
+ encode(data, root) {
24
+ let msg = { cmd: data.cmd };
25
+ msg[msg.cmd] = data;
26
+ msg[msg.cmd].cmd = undefined;
27
+ msg["errcode"] = data.errcode;
28
+ msg["tip"] = data.tip;
29
+ data.errcode = undefined;
30
+ delete data.errcode;
31
+ delete msg[msg.cmd].cmd;
32
+ let body = this._root.lookupType(root);
33
+ var errMsg = body.verify(msg);
34
+ if (errMsg)
35
+ throw Error(errMsg);
36
+ var msgBody = body.create(msg);
37
+ var bufferBody = body.encode(msgBody).finish();
38
+ return bufferBody;
39
+ }
40
+ decode(data, root) {
41
+ let body = this._root.lookupType(root);
42
+ if (!body) {
43
+ Log_1.gLog.info("proto body not in proto(!" + root + ")");
44
+ return null;
45
+ }
46
+ let msgBody = body.decode(data);
47
+ if (!msgBody) {
48
+ Log_1.gLog.info("proto body decode wrong!");
49
+ return null;
50
+ }
51
+ let objBody = body.toObject(msgBody);
52
+ let obj = objBody[objBody.cmd];
53
+ obj.cmd = objBody.cmd;
54
+ return obj;
55
+ }
56
+ }
57
+ exports.GoogleProtoFilter = GoogleProtoFilter;
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EProtoType = void 0;
4
+ var EProtoType;
5
+ (function (EProtoType) {
6
+ EProtoType[EProtoType["Json"] = 1] = "Json";
7
+ EProtoType[EProtoType["GoogleProtoBuffer"] = 2] = "GoogleProtoBuffer";
8
+ EProtoType[EProtoType["Custom"] = 3] = "Custom";
9
+ })(EProtoType = exports.EProtoType || (exports.EProtoType = {}));
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.JsonProtoFilter = void 0;
4
+ const Core_1 = require("../../Core/Core");
5
+ const Log_1 = require("../../Logic/Log");
6
+ class JsonProtoFilter {
7
+ init(path) {
8
+ return true;
9
+ }
10
+ encode(data) {
11
+ if (!Core_1.core.isString(data)) {
12
+ data = JSON.stringify(data);
13
+ }
14
+ return data;
15
+ }
16
+ decode(data) {
17
+ try {
18
+ if (Core_1.core.isString(data)) {
19
+ data = JSON.parse(data);
20
+ }
21
+ }
22
+ catch (e) {
23
+ Log_1.gLog.error("decode json data Failed-----data=" + data);
24
+ return;
25
+ }
26
+ return data;
27
+ }
28
+ }
29
+ exports.JsonProtoFilter = JsonProtoFilter;
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.gProtoFactory = exports.ProtoFactory = void 0;
4
+ const GoogleProtoFilter_1 = require("./GoogleProtoFilter");
5
+ const JsonProtoFilter_1 = require("./JsonProtoFilter");
6
+ const IProtoFilter_1 = require("./IProtoFilter");
7
+ class ProtoFactory {
8
+ _filters = new Map();
9
+ _type_filter_classes = new Map();
10
+ constructor() {
11
+ this.registerFilter(IProtoFilter_1.EProtoType.Json, JsonProtoFilter_1.JsonProtoFilter);
12
+ this.registerFilter(IProtoFilter_1.EProtoType.GoogleProtoBuffer, GoogleProtoFilter_1.GoogleProtoFilter);
13
+ }
14
+ registerFilter(type, proto_filter_class) {
15
+ this._type_filter_classes[type] = proto_filter_class;
16
+ }
17
+ createFilter(type) {
18
+ let filter = this._filters.get(type);
19
+ if (filter) {
20
+ return filter;
21
+ }
22
+ let proto_class = this._type_filter_classes[type];
23
+ if (proto_class) {
24
+ filter = new proto_class();
25
+ }
26
+ else {
27
+ //默认
28
+ filter = new JsonProtoFilter_1.JsonProtoFilter();
29
+ }
30
+ this._filters.set(type, filter);
31
+ return filter;
32
+ }
33
+ }
34
+ exports.ProtoFactory = ProtoFactory;
35
+ exports.gProtoFactory = new ProtoFactory();
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.IClientSocket = void 0;
4
+ const Log_1 = require("../../Logic/Log");
5
+ const ISocket_1 = require("./ISocket");
6
+ const IProtoFilter_1 = require("../ProtoFilter/IProtoFilter");
7
+ /**
8
+ * 服务器接收到的客户端的连接
9
+ * 客户端的session对象
10
+ */
11
+ class IClientSocket extends ISocket_1.ISocket {
12
+ _server = null;
13
+ get server() {
14
+ return this._server;
15
+ }
16
+ constructor(server, protoType = IProtoFilter_1.EProtoType.Json, protoPath = "") {
17
+ super(protoType, protoPath);
18
+ this._server = server;
19
+ this._tipKey = this._server.name;
20
+ }
21
+ onClose(reasonCode, description) {
22
+ super.onClose(reasonCode, description);
23
+ this._server.removeServerSocketBySocketId(this._socket_id);
24
+ }
25
+ broadCast(data) {
26
+ if (!data) {
27
+ Log_1.gLog.info("Send Message warning:null data!");
28
+ return;
29
+ }
30
+ Log_1.gLog.info("broadCast:----------------------------------");
31
+ Log_1.gLog.info(data);
32
+ let msg = this._protoFilter.encode(data);
33
+ this._server.broadCast(msg);
34
+ }
35
+ _onDecode(message, ...params) {
36
+ let msg = super._onDecode(message, "msgReq");
37
+ return msg;
38
+ }
39
+ _onEncode(data, ...params) {
40
+ let msg = super._onEncode(data, "msgRes");
41
+ return msg;
42
+ }
43
+ }
44
+ exports.IClientSocket = IClientSocket;
@@ -0,0 +1,95 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.IServerSocket = void 0;
4
+ const ISocket_1 = require("./ISocket");
5
+ const ws = require("websocket");
6
+ const IProtoFilter_1 = require("../ProtoFilter/IProtoFilter");
7
+ const Log_1 = require("../../Logic/Log");
8
+ /**
9
+ * 连接到服务器的websocket
10
+ * 默认自动重连
11
+ */
12
+ class IServerSocket extends ISocket_1.ISocket {
13
+ _host = "";
14
+ /**
15
+ * 连接的服务器地址
16
+ */
17
+ get host() {
18
+ return this._host;
19
+ }
20
+ _port = -1;
21
+ /**
22
+ * 连接的服务器端口
23
+ */
24
+ get port() {
25
+ return this._port;
26
+ }
27
+ _requestedProtocols = null;
28
+ get requestedProtocols() {
29
+ return this._requestedProtocols;
30
+ }
31
+ _origin = null;
32
+ get origin() {
33
+ return this._origin;
34
+ }
35
+ _headers = null;
36
+ get headers() {
37
+ return this._headers;
38
+ }
39
+ _extraRequestOptions = null;
40
+ get extraRequestOptions() {
41
+ return this._extraRequestOptions;
42
+ }
43
+ _need_close = false;
44
+ constructor(protoType = IProtoFilter_1.EProtoType.Json, protoPath = "") {
45
+ super(protoType, protoPath);
46
+ }
47
+ connect(domain, port, requestedProtocols = null, origin = null, headers = null, extraRequestOptions = null) {
48
+ this._host = domain || this._host;
49
+ this._port = port || this._port;
50
+ this._requestedProtocols = requestedProtocols || this._requestedProtocols;
51
+ this._origin = origin || this._origin;
52
+ this._headers = headers || this._headers;
53
+ this._extraRequestOptions = extraRequestOptions || this._extraRequestOptions;
54
+ this._connect();
55
+ }
56
+ _connect() {
57
+ let url = "ws://" + this._host + ":" + this._port + "/";
58
+ Log_1.gLog.info("Trying to connect to server : " + url);
59
+ let _ws = new ws.client();
60
+ _ws.on("connect", this.onConnect.bind(this));
61
+ _ws.on("connectFailed", this.onClose.bind(this));
62
+ _ws.connect(url, this._requestedProtocols, this._origin, this._headers, this._extraRequestOptions);
63
+ }
64
+ onOpen(e) {
65
+ super.onOpen(e);
66
+ Log_1.gLog.info(this._socket_id + ":success to connect to " + this._host + ":" + this._port);
67
+ }
68
+ onClose(reasonCode, description) {
69
+ super.onClose(reasonCode, description);
70
+ if (!this._need_close) {
71
+ setTimeout(() => {
72
+ if (!this._need_close) {
73
+ this._connect();
74
+ }
75
+ }, 1000);
76
+ return true;
77
+ }
78
+ else {
79
+ return false;
80
+ }
81
+ }
82
+ close() {
83
+ this._need_close = true;
84
+ super.close();
85
+ }
86
+ _onDecode(message, ...params) {
87
+ let msg = super._onDecode(message, "msgRes");
88
+ return msg;
89
+ }
90
+ _onEncode(data, ...params) {
91
+ let msg = super._onEncode(data, "msgReq");
92
+ return msg;
93
+ }
94
+ }
95
+ exports.IServerSocket = IServerSocket;
@@ -0,0 +1,222 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ISocket = exports.BaseMsg = void 0;
4
+ const IProtoFilter_1 = require("../ProtoFilter/IProtoFilter");
5
+ const Core_1 = require("../../Core/Core");
6
+ const _ = require("underscore");
7
+ const ProtoFactory_1 = require("../ProtoFilter/ProtoFactory");
8
+ const SyncQueueTool_1 = require("../../Logic/SyncQueueTool");
9
+ const Log_1 = require("../../Logic/Log");
10
+ const PacketParser_1 = require("./PacketParser");
11
+ class BaseMsg {
12
+ cmd;
13
+ errcode;
14
+ servertime = Date.now();
15
+ constructor(cmd, errcode) {
16
+ this.cmd = cmd;
17
+ this.errcode = errcode;
18
+ }
19
+ }
20
+ exports.BaseMsg = BaseMsg;
21
+ class ISocket {
22
+ /**
23
+ * 是否同步消息
24
+ * 默认为true
25
+ */
26
+ _is_sync_msg = true;
27
+ get isSynMsg() {
28
+ return this._is_sync_msg;
29
+ }
30
+ _debug_msg = false;
31
+ get debug_msg() {
32
+ return this._debug_msg;
33
+ }
34
+ set debug_msg(value) {
35
+ this._debug_msg = value;
36
+ }
37
+ _socket_id = 0;
38
+ get socketId() {
39
+ return this._socket_id;
40
+ }
41
+ _tipKey = "";
42
+ get tipKey() {
43
+ return this._tipKey;
44
+ }
45
+ _socket = null;
46
+ get socket() {
47
+ return this._socket;
48
+ }
49
+ _protoType = IProtoFilter_1.EProtoType.Json;
50
+ _protoFilter = null;
51
+ _protoPath = "";
52
+ _ip = null;
53
+ get remoteHost() {
54
+ if (!this._ip && this._socket) {
55
+ this._ip = this._socket.remoteAddress;
56
+ this._ip = this._ip.substring(this._ip.lastIndexOf(":") + 1);
57
+ }
58
+ return this._ip;
59
+ }
60
+ get connected() {
61
+ if (this._socket
62
+ && this._socket.readyState == "open") {
63
+ return true;
64
+ }
65
+ return false;
66
+ }
67
+ _nodebugmsgs = {
68
+ "heartbeat": true,
69
+ "ping": true
70
+ };
71
+ _packetParser;
72
+ constructor(protoType = IProtoFilter_1.EProtoType.Json, protoPath = "") {
73
+ this._socket_id = parseInt(_.uniqueId());
74
+ this._protoType = protoType;
75
+ this._protoPath = protoPath;
76
+ this._packetParser = new PacketParser_1.PacketParser();
77
+ }
78
+ getNewMsg(cmd, errcode) {
79
+ let msg = new BaseMsg(cmd, errcode);
80
+ return msg;
81
+ }
82
+ receive_heartbeat(jsonData) {
83
+ this.send_heartbeat();
84
+ }
85
+ send_heartbeat() {
86
+ let msg = this.getNewMsg("heartbeat");
87
+ this.send(msg);
88
+ }
89
+ onConnect(_socket) {
90
+ this._socket = _socket;
91
+ if (!this._protoFilter) {
92
+ this._protoFilter = ProtoFactory_1.gProtoFactory.createFilter(this._protoType);
93
+ this._protoFilter.init(this._protoPath);
94
+ }
95
+ this._socket.on("data", this._onData.bind(this));
96
+ this._socket.on("error", this.onError.bind(this));
97
+ this._socket.on("close", this.onClose.bind(this));
98
+ this.onOpen();
99
+ }
100
+ _onData(message) {
101
+ try {
102
+ this._packetParser.push(message);
103
+ let packet = this._packetParser.parse();
104
+ while (packet) {
105
+ this._onMessage(packet);
106
+ packet = this._packetParser.parse();
107
+ }
108
+ }
109
+ catch (e) {
110
+ Log_1.gLog.error(this.tipKey + ' Received Message Handle Error: ' + e);
111
+ }
112
+ }
113
+ onMessage(message) {
114
+ try {
115
+ let msg = this._onDecode(message);
116
+ if (this._is_sync_msg) {
117
+ SyncQueueTool_1.gSyncQueueTool.add(this._socket_id + "", this._onMessage, this, msg);
118
+ }
119
+ else {
120
+ this._onMessage(msg);
121
+ }
122
+ }
123
+ catch (e) {
124
+ Log_1.gLog.error(this.tipKey + ' Received Message Handle Error: ' + e);
125
+ }
126
+ }
127
+ _onDecode(message, ...params) {
128
+ return this._protoFilter.decode(message, ...params);
129
+ }
130
+ _onEncode(data, ...params) {
131
+ let msg = this._protoFilter.encode(data, ...params);
132
+ return msg;
133
+ }
134
+ /**
135
+ * 过滤消息,每个消息处理之前调用
136
+ * @param msg
137
+ * @returns
138
+ */
139
+ filterMsg(msg) {
140
+ if (!msg) {
141
+ Log_1.gLog.error({ tipKey: this.tipKey, action: "receive", error: "no cmd", msg });
142
+ return false;
143
+ }
144
+ if (this._debug_msg && !this._nodebugmsgs[msg.cmd]) {
145
+ Log_1.gLog.info({ tipKey: this.tipKey, action: "receive", msg });
146
+ }
147
+ if (!msg.cmd) {
148
+ Log_1.gLog.error({ tipKey: this.tipKey, action: "receive", error: "no cmd", msg });
149
+ return false;
150
+ }
151
+ return true;
152
+ }
153
+ async _onMessage(data) {
154
+ let time = Date.now();
155
+ let jsonData = data;
156
+ let func = this["receive_" + jsonData.cmd];
157
+ let ret = this.filterMsg(jsonData);
158
+ if (!ret) {
159
+ return;
160
+ }
161
+ else if (!func) {
162
+ let otherfunc = this["receive_other_all"];
163
+ if (otherfunc) {
164
+ await Core_1.core.safeCall(otherfunc, this, jsonData);
165
+ }
166
+ else {
167
+ Log_1.gLog.error(this.tipKey + ' Received Message warning: no cmd handle,cmd=' + jsonData.cmd);
168
+ }
169
+ }
170
+ else {
171
+ await Core_1.core.safeCall(func, this, jsonData);
172
+ }
173
+ if (this._debug_msg && !this._nodebugmsgs[jsonData.cmd]) {
174
+ Log_1.gLog.info("[" + (Date.now() - time) + "ms] " + jsonData.cmd);
175
+ }
176
+ }
177
+ onOpen(e) {
178
+ }
179
+ onError(e) {
180
+ }
181
+ onClose(reasonCode, description) {
182
+ Log_1.gLog.info(this.tipKey + " " + this._socket_id + ":onClose resonCode=" + reasonCode + " des=" + description);
183
+ }
184
+ filterSendMsg(msg) {
185
+ if (!this.connected) {
186
+ return false;
187
+ }
188
+ if (!msg) {
189
+ Log_1.gLog.error(this.tipKey + " Send Message warning:null data!");
190
+ return false;
191
+ }
192
+ if (this._debug_msg && !this._nodebugmsgs[msg.cmd]) {
193
+ Log_1.gLog.info({ tipKey: this.tipKey, action: "send", msg });
194
+ }
195
+ return true;
196
+ }
197
+ send(msg) {
198
+ let ret = this.filterSendMsg(msg);
199
+ if (!ret) {
200
+ return;
201
+ }
202
+ let data = this._onEncode(msg);
203
+ this._socket.write(this._packetParser.pack(data));
204
+ }
205
+ /**
206
+ * Close the connection. A close frame will be sent to the remote peer indicating
207
+ * that we wish to close the connection, and we will then wait for up to
208
+ * `config.closeTimeout` milliseconds for an acknowledgment from the remote peer
209
+ * before terminating the underlying socket connection.
210
+ */
211
+ close(reasonCode, description) {
212
+ this._socket.end();
213
+ }
214
+ /**
215
+ * Send a close frame to the remote peer and immediately close the socket without
216
+ * waiting for a response. This should generally be used only in error conditions.
217
+ */
218
+ drop(reasonCode, description, skipCloseFrame) {
219
+ this._socket.destroy();
220
+ }
221
+ }
222
+ exports.ISocket = ISocket;
@@ -0,0 +1,144 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ISocketServer = void 0;
4
+ const cgserver_1 = require("../../cgserver");
5
+ const Log_1 = require("../../Logic/Log");
6
+ const EventTool_1 = require("../../Logic/EventTool");
7
+ const net = require("net");
8
+ class ISocketServer {
9
+ _cfg = null;
10
+ //方便提示
11
+ get cfg() {
12
+ return this._cfg;
13
+ }
14
+ //服务器已被关闭
15
+ _is_runging = false;
16
+ get isrunging() {
17
+ return this._is_runging;
18
+ }
19
+ get name() {
20
+ return this._cfg.serverName;
21
+ }
22
+ //监听websocket
23
+ _listening_socket = null;
24
+ get listeningSocket() {
25
+ return this._listening_socket;
26
+ }
27
+ //来自于用户的链接
28
+ _ws_clients = {};
29
+ get listenPort() {
30
+ return this._cfg.port;
31
+ }
32
+ /**
33
+ * websocket can accepted protocol
34
+ */
35
+ _accepted_protocol = null;
36
+ //服务器管理相关
37
+ /*
38
+ item=servername:class
39
+ */
40
+ _cls = null;
41
+ registerSocketHandleClass(cls) {
42
+ this._cls = cls;
43
+ }
44
+ constructor(cfg) {
45
+ this._cfg = cfg;
46
+ }
47
+ removeServerSocketBySocketId(socketId) {
48
+ this._ws_clients[socketId] = null;
49
+ delete this._ws_clients[socketId];
50
+ }
51
+ async run() {
52
+ cgserver_1.gCgServer.addSocketServer(this);
53
+ if (this._cfg.db) {
54
+ await cgserver_1.gCgServer.initDb(this._cfg.db);
55
+ }
56
+ this.initSocket();
57
+ }
58
+ pause() {
59
+ if (!this._is_runging) {
60
+ Log_1.gLog.error("socketserver has paused:" + this._cfg.port);
61
+ return;
62
+ }
63
+ this._is_runging = false;
64
+ for (let key in this._ws_clients) {
65
+ this._ws_clients[key].close();
66
+ }
67
+ Log_1.gLog.info("socketserver paused:" + this._cfg.port);
68
+ }
69
+ resume() {
70
+ if (this._is_runging) {
71
+ Log_1.gLog.error("socketserver is running:" + this._cfg.port);
72
+ return;
73
+ }
74
+ this._is_runging = true;
75
+ Log_1.gLog.error("socketserver resumed:" + this._cfg.port);
76
+ }
77
+ /*
78
+ 把所有的客户端链接保存起来
79
+ 方便统计,广播等
80
+ */
81
+ addClient(ws_client) {
82
+ this._ws_clients[ws_client.socketId] = ws_client;
83
+ }
84
+ initSocket(wss) {
85
+ let server = net.createServer();
86
+ server.listen(this._cfg.port, this.onListenning.bind(this));
87
+ server.on("connection", this.onConnection.bind(this));
88
+ this._listening_socket.on('close', this.onClose.bind(this));
89
+ }
90
+ onClose() {
91
+ }
92
+ onListenning() {
93
+ this._is_runging = true;
94
+ EventTool_1.gEventTool.emit("socket_server_init_done");
95
+ let info = (new Date()) + " Server " + this.name + " is listening on port " + this._cfg.port;
96
+ Log_1.gLog.info(info);
97
+ }
98
+ onConnection(socket) {
99
+ if (!this._is_runging) {
100
+ socket.end();
101
+ Log_1.gLog.error(' Connection rejected.');
102
+ return;
103
+ }
104
+ try {
105
+ Log_1.gLog.info((new Date()) + ' Connection accepted.');
106
+ this.createSocketObjectByProtocol(socket);
107
+ }
108
+ catch (e) {
109
+ Log_1.gLog.error(' protocol reject');
110
+ }
111
+ }
112
+ createSocketObjectByProtocol(socket) {
113
+ let cls = this._cls;
114
+ if (!cls) {
115
+ Log_1.gLog.error("(createSocketObjectByProtocol in server(" + this.name + "))no this socket handle class");
116
+ return null;
117
+ }
118
+ let s_client = (new cls(this));
119
+ this.addClient(s_client);
120
+ s_client.onConnect(socket);
121
+ return s_client;
122
+ }
123
+ /**
124
+ * 广播消息
125
+ * @param msg
126
+ */
127
+ broadCast(msg) {
128
+ for (var key in this._ws_clients) {
129
+ let ws = this._ws_clients[key];
130
+ ws.send(msg);
131
+ }
132
+ }
133
+ /**
134
+ * 获取任意客户端连接
135
+ * @returns
136
+ */
137
+ getAnyWebSocket() {
138
+ for (var key in this._ws_clients) {
139
+ return this._ws_clients[key];
140
+ }
141
+ return null;
142
+ }
143
+ }
144
+ exports.ISocketServer = ISocketServer;
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PacketParser = void 0;
4
+ class PacketParser {
5
+ buffer;
6
+ offset;
7
+ constructor() {
8
+ this.buffer = Buffer.alloc(0);
9
+ this.offset = 0;
10
+ }
11
+ push(chunk) {
12
+ const newBuffer = Buffer.alloc(this.buffer.length + chunk.length);
13
+ this.buffer.copy(newBuffer, 0);
14
+ chunk.copy(newBuffer, this.buffer.length);
15
+ this.buffer = newBuffer;
16
+ }
17
+ parse() {
18
+ if (this.buffer.length < 4)
19
+ return null;
20
+ // Read packet length (first 4 bytes)
21
+ const length = this.buffer.readUInt32BE(0);
22
+ if (this.buffer.length < length + 4)
23
+ return null;
24
+ // Extract packet
25
+ const packet = this.buffer.slice(4, length + 4);
26
+ // Remove parsed data from buffer
27
+ this.buffer = this.buffer.slice(length + 4);
28
+ return packet;
29
+ }
30
+ pack(data) {
31
+ const length = data.length;
32
+ const packet = Buffer.alloc(length + 4);
33
+ // Write length header
34
+ packet.writeUInt32BE(length, 0);
35
+ // Write data
36
+ data.copy(packet, 4);
37
+ return packet;
38
+ }
39
+ }
40
+ exports.PacketParser = PacketParser;