@cimo/websocket 1.0.16 → 1.1.16
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.
- package/README.md +20 -12
- package/dist/Main.d.ts +2 -1
- package/dist/Main.js +6 -2
- package/dist/Main.js.map +1 -1
- package/dist/client/Service.d.ts +16 -0
- package/dist/client/Service.js +70 -0
- package/dist/client/Service.js.map +1 -0
- package/dist/server/Interface.d.ts +1 -1
- package/dist/server/Interface.js +2 -2
- package/dist/server/Interface.js.map +1 -1
- package/dist/server/Service.d.ts +21 -0
- package/dist/server/Service.js +179 -0
- package/dist/server/Service.js.map +1 -0
- package/package.json +1 -1
- package/dist/client/Message.d.ts +0 -5
- package/dist/client/Message.js +0 -65
- package/dist/client/Message.js.map +0 -1
- package/dist/server/Message.d.ts +0 -6
- package/dist/server/Message.js +0 -175
- package/dist/server/Message.js.map +0 -1
package/README.md
CHANGED
|
@@ -19,17 +19,18 @@ Websocket API (server/client). Light, fast and secure.
|
|
|
19
19
|
```
|
|
20
20
|
...
|
|
21
21
|
|
|
22
|
-
import {
|
|
22
|
+
import { CwsServer } from "@cimo/websocket";
|
|
23
23
|
|
|
24
24
|
// Source
|
|
25
25
|
import * as ControllerTest from "../controller/Test";
|
|
26
26
|
|
|
27
27
|
...
|
|
28
28
|
|
|
29
|
-
|
|
29
|
+
const cwsServer = new CwsServer();
|
|
30
|
+
cwsServer.create(server);
|
|
30
31
|
|
|
31
|
-
|
|
32
|
-
ControllerTest.websocket(socket, data);
|
|
32
|
+
cwsServer.receiveOutput("test", (socket, data) => {
|
|
33
|
+
ControllerTest.websocket(cwsServer, socket, data);
|
|
33
34
|
});
|
|
34
35
|
|
|
35
36
|
...
|
|
@@ -40,16 +41,22 @@ CwsServerMessage.receiveOutput("test", (socket, data) => {
|
|
|
40
41
|
```
|
|
41
42
|
...
|
|
42
43
|
|
|
43
|
-
import {
|
|
44
|
+
import { CwsServer, CwsServerInterface } from "@cimo/websocket";
|
|
44
45
|
|
|
45
46
|
...
|
|
46
47
|
|
|
47
|
-
|
|
48
|
+
let cwsServer: CwsServer;
|
|
49
|
+
|
|
50
|
+
...
|
|
51
|
+
|
|
52
|
+
export const websocket = (cwsServerValue: CwsServer, socket: CwsServerInterface.Isocket, data: CwsServerInterface.Imessage) => {
|
|
53
|
+
cwsServer = cwsServerValue;
|
|
54
|
+
|
|
48
55
|
const tag = data.tag;
|
|
49
56
|
const message = data.message;
|
|
50
57
|
|
|
51
58
|
if (tag === "cws_test_o") {
|
|
52
|
-
|
|
59
|
+
cwsServer.sendInput(socket, "test", message);
|
|
53
60
|
}
|
|
54
61
|
};
|
|
55
62
|
|
|
@@ -63,24 +70,25 @@ export const websocket = (socket: CwsServerInterface.Isocket, data: CwsServerInt
|
|
|
63
70
|
```
|
|
64
71
|
...
|
|
65
72
|
|
|
66
|
-
import
|
|
73
|
+
import CwsClient from "@cimo/websocket/dist/client/Service";
|
|
67
74
|
|
|
68
75
|
...
|
|
69
76
|
|
|
70
|
-
CwsClient
|
|
77
|
+
const cwsClient = CwsClient();
|
|
78
|
+
cwsClient.connection(window.location.host);
|
|
71
79
|
|
|
72
|
-
|
|
80
|
+
cwsClient.receiveMessage("broadcast", (data) => {
|
|
73
81
|
// Global event
|
|
74
82
|
});
|
|
75
83
|
|
|
76
|
-
|
|
84
|
+
cwsClient.receiveMessage("test", (data) => {
|
|
77
85
|
// Test event
|
|
78
86
|
});
|
|
79
87
|
|
|
80
88
|
...
|
|
81
89
|
|
|
82
90
|
elementButton.addEventListener("click", (event) => {
|
|
83
|
-
|
|
91
|
+
cwsClient.sendMessage("test", { value: 1 });
|
|
84
92
|
});
|
|
85
93
|
|
|
86
94
|
...
|
package/dist/Main.d.ts
CHANGED
package/dist/Main.js
CHANGED
|
@@ -22,8 +22,12 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
|
22
22
|
__setModuleDefault(result, mod);
|
|
23
23
|
return result;
|
|
24
24
|
};
|
|
25
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
26
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
|
+
};
|
|
25
28
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
-
exports.
|
|
29
|
+
exports.CwsServer = exports.CwsServerInterface = void 0;
|
|
30
|
+
const Service_1 = __importDefault(require("./server/Service"));
|
|
31
|
+
exports.CwsServer = Service_1.default;
|
|
27
32
|
exports.CwsServerInterface = __importStar(require("./server/Interface"));
|
|
28
|
-
exports.CwsServerMessage = __importStar(require("./server/Message"));
|
|
29
33
|
//# sourceMappingURL=Main.js.map
|
package/dist/Main.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Main.js","sourceRoot":"","sources":["../src/Main.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Main.js","sourceRoot":"","sources":["../src/Main.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,+DAAyC;AAGhC,oBAHF,iBAAS,CAGE;AADlB,yEAAyD"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import * as Interface from "./Interface";
|
|
2
|
+
export default class CwsClient {
|
|
3
|
+
private serverAddress;
|
|
4
|
+
private websocket;
|
|
5
|
+
private timeoutReconnect;
|
|
6
|
+
private receiveMessageHandleList;
|
|
7
|
+
constructor();
|
|
8
|
+
connection: (address?: string) => void;
|
|
9
|
+
sendMessage: (tagValue: string, messageValue: string | Record<string, unknown>) => void;
|
|
10
|
+
receiveMessage: (tag: string, callback: Interface.IcallbackReceiveMessage) => void;
|
|
11
|
+
receiveMessageOff: (tag: string) => void;
|
|
12
|
+
checkConnection: () => boolean;
|
|
13
|
+
private eventOpen;
|
|
14
|
+
private receiveMessageHandle;
|
|
15
|
+
private eventClose;
|
|
16
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
class CwsClient {
|
|
4
|
+
constructor() {
|
|
5
|
+
this.connection = (address) => {
|
|
6
|
+
this.serverAddress = address ? address : this.serverAddress;
|
|
7
|
+
this.websocket = new WebSocket(`wss://${this.serverAddress}`);
|
|
8
|
+
this.websocket.addEventListener("open", this.eventOpen);
|
|
9
|
+
this.websocket.addEventListener("message", this.receiveMessageHandle);
|
|
10
|
+
this.websocket.addEventListener("close", this.eventClose);
|
|
11
|
+
};
|
|
12
|
+
this.sendMessage = (tagValue, messageValue) => {
|
|
13
|
+
const check = this.checkConnection();
|
|
14
|
+
if (this.websocket && check) {
|
|
15
|
+
const dataStructure = {
|
|
16
|
+
date: new Date().toISOString(),
|
|
17
|
+
tag: `cws_${tagValue}_o`,
|
|
18
|
+
message: messageValue
|
|
19
|
+
};
|
|
20
|
+
this.websocket.send(JSON.stringify(dataStructure));
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
this.receiveMessage = (tag, callback) => {
|
|
24
|
+
this.receiveMessageHandleList.set(`cws_${tag}_i`, (data) => {
|
|
25
|
+
callback(data);
|
|
26
|
+
});
|
|
27
|
+
};
|
|
28
|
+
this.receiveMessageOff = (tag) => {
|
|
29
|
+
if (this.receiveMessageHandleList.has(`cws_${tag}_i`)) {
|
|
30
|
+
this.receiveMessageHandleList.delete(`cws_${tag}_i`);
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
this.checkConnection = () => {
|
|
34
|
+
if (this.websocket && this.websocket.readyState === WebSocket.OPEN) {
|
|
35
|
+
return true;
|
|
36
|
+
}
|
|
37
|
+
console.log("@cimo/websocket - Service.ts - checkConnection():", "Server not ready.");
|
|
38
|
+
return false;
|
|
39
|
+
};
|
|
40
|
+
this.eventOpen = () => {
|
|
41
|
+
console.log("@cimo/websocket - Service.ts - eventOpen():", "Connected.");
|
|
42
|
+
clearTimeout(this.timeoutReconnect);
|
|
43
|
+
};
|
|
44
|
+
this.receiveMessageHandle = (event) => {
|
|
45
|
+
const data = JSON.parse(event.data);
|
|
46
|
+
for (const [tag, callback] of this.receiveMessageHandleList) {
|
|
47
|
+
if (tag === data.tag) {
|
|
48
|
+
callback(data);
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
this.eventClose = () => {
|
|
54
|
+
if (this.websocket) {
|
|
55
|
+
console.log("@cimo/websocket - Service.ts - eventClose():", "Disconnected. Try to reconnect...");
|
|
56
|
+
this.websocket.removeEventListener("open", this.eventOpen);
|
|
57
|
+
this.websocket.removeEventListener("message", this.receiveMessageHandle);
|
|
58
|
+
this.websocket.removeEventListener("close", this.eventClose);
|
|
59
|
+
this.websocket = null;
|
|
60
|
+
this.timeoutReconnect = setTimeout(this.connection, 1000);
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
this.serverAddress = "";
|
|
64
|
+
this.websocket = null;
|
|
65
|
+
this.timeoutReconnect = undefined;
|
|
66
|
+
this.receiveMessageHandleList = new Map();
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
exports.default = CwsClient;
|
|
70
|
+
//# sourceMappingURL=Service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Service.js","sourceRoot":"","sources":["../../src/client/Service.ts"],"names":[],"mappings":"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"}
|
package/dist/server/Interface.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.IhttpsServer = exports.Isocket = void 0;
|
|
4
4
|
const net_1 = require("net");
|
|
5
5
|
Object.defineProperty(exports, "Isocket", { enumerable: true, get: function () { return net_1.Socket; } });
|
|
6
6
|
const https_1 = require("https");
|
|
7
|
-
Object.defineProperty(exports, "
|
|
7
|
+
Object.defineProperty(exports, "IhttpsServer", { enumerable: true, get: function () { return https_1.Server; } });
|
|
8
8
|
//# sourceMappingURL=Interface.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Interface.js","sourceRoot":"","sources":["../../src/server/Interface.ts"],"names":[],"mappings":";;;AAAA,6BAA6B;AAGV,wFAHV,YAAM,OAGW;AAF1B,iCAA+B;AAGZ,
|
|
1
|
+
{"version":3,"file":"Interface.js","sourceRoot":"","sources":["../../src/server/Interface.ts"],"names":[],"mappings":";;;AAAA,6BAA6B;AAGV,wFAHV,YAAM,OAGW;AAF1B,iCAA+B;AAGZ,6FAHV,cAAM,OAGgB"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import * as Interface from "./Interface";
|
|
2
|
+
export default class CwsServer {
|
|
3
|
+
private WEBSOCKET_MAGIC_STRING_KEY;
|
|
4
|
+
private SEVEN_BITS_INTEGER_MARKER;
|
|
5
|
+
private SIXTEEN_BITS_INTEGER_MARKER;
|
|
6
|
+
private THIRTYTWO_BITS_INTEGER_MARKER;
|
|
7
|
+
private MASK_KEY_BYTES_LENGTH;
|
|
8
|
+
private socketList;
|
|
9
|
+
private receiveOutputHandleList;
|
|
10
|
+
constructor();
|
|
11
|
+
create: (server: Interface.IhttpsServer) => void;
|
|
12
|
+
receiveOutput: (tag: string, callback: Interface.IcallbackReceiveOutput) => void;
|
|
13
|
+
receiveOutputOff: (tag: string) => void;
|
|
14
|
+
sendInput: (socket: Interface.Isocket | null, tagValue: string, messageValue: string | Record<string, unknown>) => void;
|
|
15
|
+
sendInputBroadcast: (socket: Interface.Isocket | null, tag: string, message: string | Record<string, unknown>) => void;
|
|
16
|
+
private onServerUpgrade;
|
|
17
|
+
private onSocketData;
|
|
18
|
+
private onSocketEnd;
|
|
19
|
+
private receiveOutputHandle;
|
|
20
|
+
private prepareMessage;
|
|
21
|
+
}
|
|
@@ -0,0 +1,179 @@
|
|
|
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 (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
const Crypto = __importStar(require("crypto"));
|
|
27
|
+
class CwsServer {
|
|
28
|
+
WEBSOCKET_MAGIC_STRING_KEY;
|
|
29
|
+
SEVEN_BITS_INTEGER_MARKER;
|
|
30
|
+
SIXTEEN_BITS_INTEGER_MARKER;
|
|
31
|
+
THIRTYTWO_BITS_INTEGER_MARKER;
|
|
32
|
+
MASK_KEY_BYTES_LENGTH;
|
|
33
|
+
socketList;
|
|
34
|
+
receiveOutputHandleList;
|
|
35
|
+
constructor() {
|
|
36
|
+
this.WEBSOCKET_MAGIC_STRING_KEY = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
|
|
37
|
+
this.SEVEN_BITS_INTEGER_MARKER = 125;
|
|
38
|
+
this.SIXTEEN_BITS_INTEGER_MARKER = 126;
|
|
39
|
+
this.THIRTYTWO_BITS_INTEGER_MARKER = 127;
|
|
40
|
+
this.MASK_KEY_BYTES_LENGTH = 4;
|
|
41
|
+
this.socketList = [];
|
|
42
|
+
this.receiveOutputHandleList = new Map();
|
|
43
|
+
}
|
|
44
|
+
create = (server) => {
|
|
45
|
+
server.on("upgrade", this.onServerUpgrade);
|
|
46
|
+
};
|
|
47
|
+
receiveOutput = (tag, callback) => {
|
|
48
|
+
this.receiveOutputHandleList.set(`cws_${tag}_o`, (socket, data) => {
|
|
49
|
+
callback(socket, data);
|
|
50
|
+
});
|
|
51
|
+
};
|
|
52
|
+
receiveOutputOff = (tag) => {
|
|
53
|
+
if (this.receiveOutputHandleList.has(`cws_${tag}_o`)) {
|
|
54
|
+
this.receiveOutputHandleList.delete(`cws_${tag}_o`);
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
sendInput = (socket, tagValue, messageValue) => {
|
|
58
|
+
if (socket && tagValue) {
|
|
59
|
+
const dataStructure = {
|
|
60
|
+
date: new Date().toISOString(),
|
|
61
|
+
tag: `cws_${tagValue}_i`,
|
|
62
|
+
message: messageValue
|
|
63
|
+
};
|
|
64
|
+
const result = this.prepareMessage(JSON.stringify(dataStructure));
|
|
65
|
+
socket.write(result);
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
sendInputBroadcast = (socket, tag, message) => {
|
|
69
|
+
for (const client of this.socketList) {
|
|
70
|
+
if (client && !client.destroyed && client !== socket) {
|
|
71
|
+
this.sendInput(client, tag, message);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
onServerUpgrade = (request, socket) => {
|
|
76
|
+
if (request.headers["upgrade"] !== "websocket") {
|
|
77
|
+
socket.end("HTTP/1.1 400 Bad Request");
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
const { "sec-websocket-key": webClientSocketKey } = request.headers;
|
|
81
|
+
const socketKey = webClientSocketKey;
|
|
82
|
+
const acceptKey = Crypto.createHash("sha1").update(socketKey.concat(this.WEBSOCKET_MAGIC_STRING_KEY)).digest("base64");
|
|
83
|
+
const header = ["HTTP/1.1 101 Switching Protocols", "Upgrade: websocket", "Connection: Upgrade", `Sec-WebSocket-Accept: ${acceptKey}`, ""]
|
|
84
|
+
.map((line) => line.concat("\r\n"))
|
|
85
|
+
.join("");
|
|
86
|
+
socket.write(header, (error) => {
|
|
87
|
+
if (error) {
|
|
88
|
+
throw new Error(`@cimo/websocket - Message.ts - onServerUpgrade - Error: ${error.toString()}`);
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
this.socketList.push(socket);
|
|
92
|
+
socket.on("data", (buffer) => {
|
|
93
|
+
this.onSocketData(socket, buffer);
|
|
94
|
+
});
|
|
95
|
+
socket.on("end", () => {
|
|
96
|
+
this.onSocketEnd(socket);
|
|
97
|
+
});
|
|
98
|
+
this.sendInputBroadcast(socket, "broadcast", `Client ${socket.remoteAddress || ""} connected.`);
|
|
99
|
+
};
|
|
100
|
+
onSocketData = (socket, buffer) => {
|
|
101
|
+
let data = {};
|
|
102
|
+
let payloadLength = buffer[1] & 0x7f;
|
|
103
|
+
let payloadOffset = 2;
|
|
104
|
+
const opcode = buffer[0] & 0x0f;
|
|
105
|
+
const isMasked = (buffer[1] & 0x80) !== 0;
|
|
106
|
+
if (payloadLength === this.SIXTEEN_BITS_INTEGER_MARKER) {
|
|
107
|
+
payloadLength = buffer.readUInt16BE(2);
|
|
108
|
+
payloadOffset = 4;
|
|
109
|
+
}
|
|
110
|
+
else if (payloadLength === this.THIRTYTWO_BITS_INTEGER_MARKER) {
|
|
111
|
+
payloadLength = buffer.readUInt32BE(2);
|
|
112
|
+
payloadOffset = 10;
|
|
113
|
+
}
|
|
114
|
+
if (isMasked) {
|
|
115
|
+
const maskingKey = buffer.slice(payloadOffset, payloadOffset + this.MASK_KEY_BYTES_LENGTH);
|
|
116
|
+
payloadOffset += this.MASK_KEY_BYTES_LENGTH;
|
|
117
|
+
for (let i = 0; i < payloadLength; i++) {
|
|
118
|
+
buffer[payloadOffset + i] ^= maskingKey[i % this.MASK_KEY_BYTES_LENGTH];
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
const payloadData = buffer.slice(payloadOffset, payloadOffset + payloadLength);
|
|
122
|
+
if (opcode === 0x01) {
|
|
123
|
+
const payloadOutput = payloadData.toString("utf-8");
|
|
124
|
+
if (/^[\],:{}\s]*$/.test(payloadOutput
|
|
125
|
+
.replace(/\\["\\/bfnrtu]/g, "@")
|
|
126
|
+
.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\\-]?\d+)?/g, "]")
|
|
127
|
+
.replace(/(?:^|:|,)(?:\s*\[)+/g, ""))) {
|
|
128
|
+
data = JSON.parse(payloadOutput);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
this.receiveOutputHandle(socket, data);
|
|
132
|
+
};
|
|
133
|
+
onSocketEnd = (socket) => {
|
|
134
|
+
this.sendInputBroadcast(socket, "broadcast", `Client ${socket.remoteAddress || ""} disconnected.`);
|
|
135
|
+
const index = this.socketList.indexOf(socket);
|
|
136
|
+
if (index > -1) {
|
|
137
|
+
this.socketList.splice(index, 1);
|
|
138
|
+
}
|
|
139
|
+
socket.destroy();
|
|
140
|
+
};
|
|
141
|
+
receiveOutputHandle = (socket, data) => {
|
|
142
|
+
for (const [tag, callback] of this.receiveOutputHandleList) {
|
|
143
|
+
if (tag === data.tag) {
|
|
144
|
+
callback(socket, data);
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
};
|
|
149
|
+
prepareMessage = (data) => {
|
|
150
|
+
const message = Buffer.from(data);
|
|
151
|
+
const messageSize = message.length;
|
|
152
|
+
let dataBuffer;
|
|
153
|
+
const firstByte = 0x80 | 0x01;
|
|
154
|
+
if (messageSize <= this.SEVEN_BITS_INTEGER_MARKER) {
|
|
155
|
+
const bytes = [firstByte];
|
|
156
|
+
dataBuffer = Buffer.from(bytes.concat(messageSize));
|
|
157
|
+
}
|
|
158
|
+
else if (messageSize <= 2 ** 16) {
|
|
159
|
+
const target = Buffer.allocUnsafe(4);
|
|
160
|
+
target[0] = firstByte;
|
|
161
|
+
target[1] = this.SIXTEEN_BITS_INTEGER_MARKER | 0x0;
|
|
162
|
+
target.writeUint16BE(messageSize, 2);
|
|
163
|
+
dataBuffer = target;
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
throw new Error("@cimo/websocket - Message.ts - prepareMessage - Error: Message too long.");
|
|
167
|
+
}
|
|
168
|
+
const totalLength = dataBuffer.byteLength + messageSize;
|
|
169
|
+
const result = Buffer.allocUnsafe(totalLength);
|
|
170
|
+
let offset = 0;
|
|
171
|
+
for (const buffer of [dataBuffer, message]) {
|
|
172
|
+
result.set(buffer, offset);
|
|
173
|
+
offset += buffer.length;
|
|
174
|
+
}
|
|
175
|
+
return result;
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
exports.default = CwsServer;
|
|
179
|
+
//# sourceMappingURL=Service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Service.js","sourceRoot":"","sources":["../../src/server/Service.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/dist/client/Message.d.ts
DELETED
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
import * as Interface from "./Interface";
|
|
2
|
-
export declare const sendMessage: (tagValue: string, messageValue: string | Record<string, unknown>) => void;
|
|
3
|
-
export declare const receiveMessage: (tag: string, callback: Interface.IcallbackReceiveMessage) => void;
|
|
4
|
-
export declare const receiveMessageOff: (tag: string) => void;
|
|
5
|
-
export declare const connection: (address?: string) => void;
|
package/dist/client/Message.js
DELETED
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.connection = exports.receiveMessageOff = exports.receiveMessage = exports.sendMessage = void 0;
|
|
4
|
-
let websocket = null;
|
|
5
|
-
let timeoutReconnect;
|
|
6
|
-
let serverAddress = "";
|
|
7
|
-
const messageHandleList = new Map();
|
|
8
|
-
const sendMessage = (tagValue, messageValue) => {
|
|
9
|
-
if (websocket) {
|
|
10
|
-
const dataStructure = {
|
|
11
|
-
date: new Date().toISOString(),
|
|
12
|
-
tag: `cws_${tagValue}_o`,
|
|
13
|
-
message: messageValue
|
|
14
|
-
};
|
|
15
|
-
websocket.send(JSON.stringify(dataStructure));
|
|
16
|
-
}
|
|
17
|
-
};
|
|
18
|
-
exports.sendMessage = sendMessage;
|
|
19
|
-
const receiveMessage = (tag, callback) => {
|
|
20
|
-
messageHandleList.set(`cws_${tag}_i`, (data) => {
|
|
21
|
-
callback(data);
|
|
22
|
-
});
|
|
23
|
-
};
|
|
24
|
-
exports.receiveMessage = receiveMessage;
|
|
25
|
-
const receiveMessageOff = (tag) => {
|
|
26
|
-
if (messageHandleList.has(`cws_${tag}_i`)) {
|
|
27
|
-
messageHandleList.delete(`cws_${tag}_i`);
|
|
28
|
-
}
|
|
29
|
-
};
|
|
30
|
-
exports.receiveMessageOff = receiveMessageOff;
|
|
31
|
-
const connection = (address) => {
|
|
32
|
-
serverAddress = address ? address : serverAddress;
|
|
33
|
-
websocket = new WebSocket(`wss://${serverAddress}`);
|
|
34
|
-
websocket.addEventListener("open", eventOpen);
|
|
35
|
-
websocket.addEventListener("message", eventMessage);
|
|
36
|
-
websocket.addEventListener("close", eventClose);
|
|
37
|
-
};
|
|
38
|
-
exports.connection = connection;
|
|
39
|
-
const messageHandle = (event) => {
|
|
40
|
-
const data = JSON.parse(event.data);
|
|
41
|
-
for (const [tag, eventHandler] of messageHandleList) {
|
|
42
|
-
if (data.tag === tag) {
|
|
43
|
-
eventHandler(data);
|
|
44
|
-
return;
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
};
|
|
48
|
-
const eventOpen = () => {
|
|
49
|
-
console.log("@cimo/websocket - Message.ts - eventOpen():", "Connected.");
|
|
50
|
-
clearTimeout(timeoutReconnect);
|
|
51
|
-
};
|
|
52
|
-
const eventMessage = (event) => {
|
|
53
|
-
messageHandle(event);
|
|
54
|
-
};
|
|
55
|
-
const eventClose = () => {
|
|
56
|
-
if (websocket) {
|
|
57
|
-
console.log("@cimo/websocket - Message.ts - eventClose():", "Try to reconnect...");
|
|
58
|
-
websocket.removeEventListener("open", eventOpen);
|
|
59
|
-
websocket.removeEventListener("message", eventMessage);
|
|
60
|
-
websocket.removeEventListener("close", eventClose);
|
|
61
|
-
websocket = null;
|
|
62
|
-
timeoutReconnect = setTimeout(exports.connection, 1000);
|
|
63
|
-
}
|
|
64
|
-
};
|
|
65
|
-
//# sourceMappingURL=Message.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Message.js","sourceRoot":"","sources":["../../src/client/Message.ts"],"names":[],"mappings":"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"}
|
package/dist/server/Message.d.ts
DELETED
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import * as Interface from "./Interface";
|
|
2
|
-
export declare const receiveOutput: (tag: string, callback: Interface.IcallbackReceiveOutput) => void;
|
|
3
|
-
export declare const receiveOutputOff: (tag: string) => void;
|
|
4
|
-
export declare const sendInput: (socket: Interface.Isocket, tagValue: string, messageValue: string | Record<string, unknown>) => void;
|
|
5
|
-
export declare const sendInputBroadcast: (socket: Interface.Isocket, tag: string, message: string | Record<string, unknown>, excludeSender?: boolean) => void;
|
|
6
|
-
export declare const create: (server: Interface.HttpsServer) => void;
|
package/dist/server/Message.js
DELETED
|
@@ -1,175 +0,0 @@
|
|
|
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 (mod) {
|
|
19
|
-
if (mod && mod.__esModule) return mod;
|
|
20
|
-
var result = {};
|
|
21
|
-
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
-
__setModuleDefault(result, mod);
|
|
23
|
-
return result;
|
|
24
|
-
};
|
|
25
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
-
exports.create = exports.sendInputBroadcast = exports.sendInput = exports.receiveOutputOff = exports.receiveOutput = void 0;
|
|
27
|
-
const Crypto = __importStar(require("crypto"));
|
|
28
|
-
const WEBSOCKET_MAGIC_STRING_KEY = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
|
|
29
|
-
const SEVEN_BITS_INTEGER_MARKER = 125;
|
|
30
|
-
const SIXTEEN_BITS_INTEGER_MARKER = 126;
|
|
31
|
-
const THIRTYTWO_BITS_INTEGER_MARKER = 127;
|
|
32
|
-
const MASK_KEY_BYTES_LENGTH = 4;
|
|
33
|
-
const socketList = [];
|
|
34
|
-
const messageHandleList = new Map();
|
|
35
|
-
const receiveOutput = (tag, callback) => {
|
|
36
|
-
messageHandleList.set(`cws_${tag}_o`, (socket, data) => {
|
|
37
|
-
callback(socket, data);
|
|
38
|
-
});
|
|
39
|
-
};
|
|
40
|
-
exports.receiveOutput = receiveOutput;
|
|
41
|
-
const receiveOutputOff = (tag) => {
|
|
42
|
-
if (messageHandleList.has(`cws_${tag}_o`)) {
|
|
43
|
-
messageHandleList.delete(`cws_${tag}_o`);
|
|
44
|
-
}
|
|
45
|
-
};
|
|
46
|
-
exports.receiveOutputOff = receiveOutputOff;
|
|
47
|
-
const sendInput = (socket, tagValue, messageValue) => {
|
|
48
|
-
if (tagValue) {
|
|
49
|
-
const dataStructure = {
|
|
50
|
-
date: new Date().toISOString(),
|
|
51
|
-
tag: `cws_${tagValue}_i`,
|
|
52
|
-
message: messageValue
|
|
53
|
-
};
|
|
54
|
-
const result = prepareMessage(JSON.stringify(dataStructure));
|
|
55
|
-
socket.write(result);
|
|
56
|
-
}
|
|
57
|
-
};
|
|
58
|
-
exports.sendInput = sendInput;
|
|
59
|
-
const sendInputBroadcast = (socket, tag, message, excludeSender = true) => {
|
|
60
|
-
for (const client of socketList) {
|
|
61
|
-
if (client && !client.destroyed) {
|
|
62
|
-
if ((excludeSender && client !== socket) || !excludeSender) {
|
|
63
|
-
(0, exports.sendInput)(client, tag, message);
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
};
|
|
68
|
-
exports.sendInputBroadcast = sendInputBroadcast;
|
|
69
|
-
const create = (server) => {
|
|
70
|
-
server.on("upgrade", onServerUpgrade);
|
|
71
|
-
};
|
|
72
|
-
exports.create = create;
|
|
73
|
-
const prepareMessage = (data) => {
|
|
74
|
-
const message = Buffer.from(data);
|
|
75
|
-
const messageSize = message.length;
|
|
76
|
-
let dataBuffer;
|
|
77
|
-
const firstByte = 0x80 | 0x01;
|
|
78
|
-
if (messageSize <= SEVEN_BITS_INTEGER_MARKER) {
|
|
79
|
-
const bytes = [firstByte];
|
|
80
|
-
dataBuffer = Buffer.from(bytes.concat(messageSize));
|
|
81
|
-
}
|
|
82
|
-
else if (messageSize <= 2 ** 16) {
|
|
83
|
-
const target = Buffer.allocUnsafe(4);
|
|
84
|
-
target[0] = firstByte;
|
|
85
|
-
target[1] = SIXTEEN_BITS_INTEGER_MARKER | 0x0;
|
|
86
|
-
target.writeUint16BE(messageSize, 2);
|
|
87
|
-
dataBuffer = target;
|
|
88
|
-
}
|
|
89
|
-
else {
|
|
90
|
-
throw new Error("@cimo/websocket - Message.ts - prepareMessage - Error: Message too long.");
|
|
91
|
-
}
|
|
92
|
-
const totalLength = dataBuffer.byteLength + messageSize;
|
|
93
|
-
const result = Buffer.allocUnsafe(totalLength);
|
|
94
|
-
let offset = 0;
|
|
95
|
-
for (const buffer of [dataBuffer, message]) {
|
|
96
|
-
result.set(buffer, offset);
|
|
97
|
-
offset += buffer.length;
|
|
98
|
-
}
|
|
99
|
-
return result;
|
|
100
|
-
};
|
|
101
|
-
const messageHandle = (socket, data) => {
|
|
102
|
-
for (const [tag, eventHandler] of messageHandleList) {
|
|
103
|
-
if (data.tag === tag) {
|
|
104
|
-
eventHandler(socket, data);
|
|
105
|
-
return;
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
};
|
|
109
|
-
const onSocketEnd = (socket) => {
|
|
110
|
-
(0, exports.sendInputBroadcast)(socket, "broadcast", `Client ${socket.remoteAddress || ""} disconnected.`);
|
|
111
|
-
const index = socketList.indexOf(socket);
|
|
112
|
-
if (index > -1) {
|
|
113
|
-
socketList.splice(index, 1);
|
|
114
|
-
}
|
|
115
|
-
socket.destroy();
|
|
116
|
-
};
|
|
117
|
-
const onSocketData = (socket, buffer) => {
|
|
118
|
-
let data = {};
|
|
119
|
-
let payloadLength = buffer[1] & 0x7f;
|
|
120
|
-
let payloadOffset = 2;
|
|
121
|
-
const opcode = buffer[0] & 0x0f;
|
|
122
|
-
const isMasked = (buffer[1] & 0x80) !== 0;
|
|
123
|
-
if (payloadLength === SIXTEEN_BITS_INTEGER_MARKER) {
|
|
124
|
-
payloadLength = buffer.readUInt16BE(2);
|
|
125
|
-
payloadOffset = 4;
|
|
126
|
-
}
|
|
127
|
-
else if (payloadLength === THIRTYTWO_BITS_INTEGER_MARKER) {
|
|
128
|
-
payloadLength = buffer.readUInt32BE(2);
|
|
129
|
-
payloadOffset = 10;
|
|
130
|
-
}
|
|
131
|
-
if (isMasked) {
|
|
132
|
-
const maskingKey = buffer.slice(payloadOffset, payloadOffset + MASK_KEY_BYTES_LENGTH);
|
|
133
|
-
payloadOffset += MASK_KEY_BYTES_LENGTH;
|
|
134
|
-
for (let i = 0; i < payloadLength; i++) {
|
|
135
|
-
buffer[payloadOffset + i] ^= maskingKey[i % MASK_KEY_BYTES_LENGTH];
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
const payloadData = buffer.slice(payloadOffset, payloadOffset + payloadLength);
|
|
139
|
-
if (opcode === 0x01) {
|
|
140
|
-
const payloadOutput = payloadData.toString("utf-8");
|
|
141
|
-
if (/^[\],:{}\s]*$/.test(payloadOutput
|
|
142
|
-
.replace(/\\["\\/bfnrtu]/g, "@")
|
|
143
|
-
.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\\-]?\d+)?/g, "]")
|
|
144
|
-
.replace(/(?:^|:|,)(?:\s*\[)+/g, ""))) {
|
|
145
|
-
data = JSON.parse(payloadOutput);
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
messageHandle(socket, data);
|
|
149
|
-
};
|
|
150
|
-
const onServerUpgrade = (request, socket) => {
|
|
151
|
-
if (request.headers["upgrade"] !== "websocket") {
|
|
152
|
-
socket.end("HTTP/1.1 400 Bad Request");
|
|
153
|
-
return;
|
|
154
|
-
}
|
|
155
|
-
const { "sec-websocket-key": webClientSocketKey } = request.headers;
|
|
156
|
-
const socketKey = webClientSocketKey;
|
|
157
|
-
const acceptKey = Crypto.createHash("sha1").update(socketKey.concat(WEBSOCKET_MAGIC_STRING_KEY)).digest("base64");
|
|
158
|
-
const header = ["HTTP/1.1 101 Switching Protocols", "Upgrade: websocket", "Connection: Upgrade", `Sec-WebSocket-Accept: ${acceptKey}`, ""]
|
|
159
|
-
.map((line) => line.concat("\r\n"))
|
|
160
|
-
.join("");
|
|
161
|
-
socket.write(header, (error) => {
|
|
162
|
-
if (error) {
|
|
163
|
-
throw new Error(`@cimo/websocket - Message.ts - onServerUpgrade - Error: ${error.toString()}`);
|
|
164
|
-
}
|
|
165
|
-
});
|
|
166
|
-
socketList.push(socket);
|
|
167
|
-
socket.on("data", (buffer) => {
|
|
168
|
-
onSocketData(socket, buffer);
|
|
169
|
-
});
|
|
170
|
-
socket.on("end", () => {
|
|
171
|
-
onSocketEnd(socket);
|
|
172
|
-
});
|
|
173
|
-
(0, exports.sendInputBroadcast)(socket, "broadcast", `Client ${socket.remoteAddress || ""} connected.`);
|
|
174
|
-
};
|
|
175
|
-
//# sourceMappingURL=Message.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Message.js","sourceRoot":"","sources":["../../src/server/Message.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,+CAAiC;AAKjC,MAAM,0BAA0B,GAAG,sCAAsC,CAAC;AAC1E,MAAM,yBAAyB,GAAG,GAAG,CAAC;AACtC,MAAM,2BAA2B,GAAG,GAAG,CAAC;AACxC,MAAM,6BAA6B,GAAG,GAAG,CAAC;AAC1C,MAAM,qBAAqB,GAAG,CAAC,CAAC;AAEhC,MAAM,UAAU,GAAwB,EAAE,CAAC;AAC3C,MAAM,iBAAiB,GAA+E,IAAI,GAAG,EAAE,CAAC;AAEzG,MAAM,aAAa,GAAG,CAAC,GAAW,EAAE,QAA0C,EAAE,EAAE;IACrF,iBAAiB,CAAC,GAAG,CAAC,OAAO,GAAG,IAAI,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE;QACnD,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC;AACP,CAAC,CAAC;AAJW,QAAA,aAAa,iBAIxB;AAEK,MAAM,gBAAgB,GAAG,CAAC,GAAW,EAAE,EAAE;IAC5C,IAAI,iBAAiB,CAAC,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC,EAAE;QACvC,iBAAiB,CAAC,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;KAC5C;AACL,CAAC,CAAC;AAJW,QAAA,gBAAgB,oBAI3B;AAEK,MAAM,SAAS,GAAG,CAAC,MAAyB,EAAE,QAAgB,EAAE,YAA8C,EAAE,EAAE;IACrH,IAAI,QAAQ,EAAE;QACV,MAAM,aAAa,GAAG;YAClB,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YAC9B,GAAG,EAAE,OAAO,QAAQ,IAAI;YACxB,OAAO,EAAE,YAAY;SACxB,CAAC;QAEF,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC;QAE7D,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;KACxB;AACL,CAAC,CAAC;AAZW,QAAA,SAAS,aAYpB;AAEK,MAAM,kBAAkB,GAAG,CAAC,MAAyB,EAAE,GAAW,EAAE,OAAyC,EAAE,aAAa,GAAG,IAAI,EAAE,EAAE;IAC1I,KAAK,MAAM,MAAM,IAAI,UAAU,EAAE;QAC7B,IAAI,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE;YAC7B,IAAI,CAAC,aAAa,IAAI,MAAM,KAAK,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE;gBACxD,IAAA,iBAAS,EAAC,MAAM,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;aACnC;SACJ;KACJ;AACL,CAAC,CAAC;AARW,QAAA,kBAAkB,sBAQ7B;AAEK,MAAM,MAAM,GAAG,CAAC,MAA6B,EAAE,EAAE;IACpD,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;AAC1C,CAAC,CAAC;AAFW,QAAA,MAAM,UAEjB;AAEF,MAAM,cAAc,GAAG,CAAC,IAAY,EAAE,EAAE;IACpC,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC;IAEnC,IAAI,UAAkB,CAAC;IAEvB,MAAM,SAAS,GAAG,IAAI,GAAG,IAAI,CAAC;IAE9B,IAAI,WAAW,IAAI,yBAAyB,EAAE;QAC1C,MAAM,KAAK,GAAG,CAAC,SAAS,CAAC,CAAC;QAE1B,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC;KACvD;SAAM,IAAI,WAAW,IAAI,CAAC,IAAI,EAAE,EAAE;QAC/B,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;QAErC,MAAM,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;QACtB,MAAM,CAAC,CAAC,CAAC,GAAG,2BAA2B,GAAG,GAAG,CAAC;QAE9C,MAAM,CAAC,aAAa,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QAErC,UAAU,GAAG,MAAM,CAAC;KACvB;SAAM;QACH,MAAM,IAAI,KAAK,CAAC,0EAA0E,CAAC,CAAC;KAC/F;IAED,MAAM,WAAW,GAAG,UAAU,CAAC,UAAU,GAAG,WAAW,CAAC;IAExD,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;IAC/C,IAAI,MAAM,GAAG,CAAC,CAAC;IAEf,KAAK,MAAM,MAAM,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,EAAE;QACxC,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC3B,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC;KAC3B;IAED,OAAO,MAAM,CAAC;AAClB,CAAC,CAAC;AAEF,MAAM,aAAa,GAAG,CAAC,MAAyB,EAAE,IAAwB,EAAE,EAAE;IAC1E,KAAK,MAAM,CAAC,GAAG,EAAE,YAAY,CAAC,IAAI,iBAAiB,EAAE;QACjD,IAAI,IAAI,CAAC,GAAG,KAAK,GAAG,EAAE;YAClB,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YAE3B,OAAO;SACV;KACJ;AACL,CAAC,CAAC;AAEF,MAAM,WAAW,GAAG,CAAC,MAAyB,EAAE,EAAE;IAC9C,IAAA,0BAAkB,EAAC,MAAM,EAAE,WAAW,EAAE,UAAU,MAAM,CAAC,aAAa,IAAI,EAAE,gBAAgB,CAAC,CAAC;IAE9F,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAEzC,IAAI,KAAK,GAAG,CAAC,CAAC,EAAE;QACZ,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;KAC/B;IAED,MAAM,CAAC,OAAO,EAAE,CAAC;AACrB,CAAC,CAAC;AAEF,MAAM,YAAY,GAAG,CAAC,MAAyB,EAAE,MAAc,EAAE,EAAE;IAC/D,IAAI,IAAI,GAAG,EAAwB,CAAC;IAEpC,IAAI,aAAa,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IACrC,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAChC,MAAM,QAAQ,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;IAE1C,IAAI,aAAa,KAAK,2BAA2B,EAAE;QAC/C,aAAa,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACvC,aAAa,GAAG,CAAC,CAAC;KACrB;SAAM,IAAI,aAAa,KAAK,6BAA6B,EAAE;QACxD,aAAa,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACvC,aAAa,GAAG,EAAE,CAAC;KACtB;IAED,IAAI,QAAQ,EAAE;QACV,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,aAAa,EAAE,aAAa,GAAG,qBAAqB,CAAC,CAAC;QACtF,aAAa,IAAI,qBAAqB,CAAC;QAEvC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,EAAE,CAAC,EAAE,EAAE;YACpC,MAAM,CAAC,aAAa,GAAG,CAAC,CAAC,IAAI,UAAU,CAAC,CAAC,GAAG,qBAAqB,CAAC,CAAC;SACtE;KACJ;IAED,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,aAAa,EAAE,aAAa,GAAG,aAAa,CAAC,CAAC;IAE/E,IAAI,MAAM,KAAK,IAAI,EAAE;QACjB,MAAM,aAAa,GAAG,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAEpD,IACI,eAAe,CAAC,IAAI,CAChB,aAAa;aACR,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC;aAC/B,OAAO,CAAC,mEAAmE,EAAE,GAAG,CAAC;aACjF,OAAO,CAAC,sBAAsB,EAAE,EAAE,CAAC,CAC3C,EACH;YACE,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAuB,CAAC;SAC1D;KACJ;IAED,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AAChC,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,CAAC,OAA6C,EAAE,MAAyB,EAAE,EAAE;IACjG,IAAI,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,WAAW,EAAE;QAC5C,MAAM,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;QAEvC,OAAO;KACV;IAED,MAAM,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC;IAEpE,MAAM,SAAS,GAAG,kBAA4B,CAAC;IAC/C,MAAM,SAAS,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,0BAA0B,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAElH,MAAM,MAAM,GAAG,CAAC,kCAAkC,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,yBAAyB,SAAS,EAAE,EAAE,EAAE,CAAC;SACrI,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;SAClC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEd,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;QAC3B,IAAI,KAAK,EAAE;YACP,MAAM,IAAI,KAAK,CAAC,2DAA2D,KAAK,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;SAClG;IACL,CAAC,CAAC,CAAC;IAEH,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAExB,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE;QACzB,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;QAClB,WAAW,CAAC,MAAM,CAAC,CAAC;IACxB,CAAC,CAAC,CAAC;IAEH,IAAA,0BAAkB,EAAC,MAAM,EAAE,WAAW,EAAE,UAAU,MAAM,CAAC,aAAa,IAAI,EAAE,aAAa,CAAC,CAAC;AAC/F,CAAC,CAAC"}
|