@cimo/websocket 1.0.16 → 1.1.17

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 CHANGED
@@ -19,17 +19,18 @@ Websocket API (server/client). Light, fast and secure.
19
19
  ```
20
20
  ...
21
21
 
22
- import { CwsServerMessage } from "@cimo/websocket";
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
- CwsServerMessage.create(server);
29
+ const cwsServer = new CwsServer();
30
+ cwsServer.create(server);
30
31
 
31
- CwsServerMessage.receiveOutput("test", (socket, data) => {
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 { CwsServerInterface, CwsServerMessage } from "@cimo/websocket";
44
+ import { CwsServer, CwsServerInterface } from "@cimo/websocket";
44
45
 
45
46
  ...
46
47
 
47
- export const websocket = (socket: CwsServerInterface.Isocket, data: CwsServerInterface.Imessage) => {
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
- CwsServerMessage.sendInput(socket, "test", message);
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 * as CwsClient from "@cimo/websocket/dist/client/Message";
73
+ import CwsClient from "@cimo/websocket/dist/client/Service";
67
74
 
68
75
  ...
69
76
 
70
- CwsClient.connection(window.location.host);
77
+ const cwsClient = CwsClient();
78
+ cwsClient.connection(window.location.host);
71
79
 
72
- CwsClient.receiveMessage("broadcast", (data) => {
80
+ cwsClient.receiveMessage("broadcast", (data) => {
73
81
  // Global event
74
82
  });
75
83
 
76
- CwsClient.receiveMessage("test", (data) => {
84
+ cwsClient.receiveMessage("test", (data) => {
77
85
  // Test event
78
86
  });
79
87
 
80
88
  ...
81
89
 
82
90
  elementButton.addEventListener("click", (event) => {
83
- CwsClient.sendMessage("test", { value: 1 });
91
+ cwsClient.sendMessage("test", { value: 1 });
84
92
  });
85
93
 
86
94
  ...
package/dist/Main.d.ts CHANGED
@@ -1,2 +1,3 @@
1
+ import CwsServer from "./server/Service";
1
2
  export * as CwsServerInterface from "./server/Interface";
2
- export * as CwsServerMessage from "./server/Message";
3
+ export { CwsServer };
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.CwsServerMessage = exports.CwsServerInterface = void 0;
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":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,yEAAyD;AACzD,qEAAqD"}
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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"}
@@ -2,7 +2,7 @@
2
2
  import { Socket } from "net";
3
3
  import { Server } from "https";
4
4
  export { Socket as Isocket };
5
- export { Server as HttpsServer };
5
+ export { Server as IhttpsServer };
6
6
  export interface Imessage {
7
7
  date: string;
8
8
  tag: string;
@@ -1,8 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.HttpsServer = exports.Isocket = void 0;
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, "HttpsServer", { enumerable: true, get: function () { return https_1.Server; } });
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,4FAHV,cAAM,OAGe"}
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cimo/websocket",
3
- "version": "1.0.16",
3
+ "version": "1.1.17",
4
4
  "description": "Websocket API (server/client). Light, fast and secure.",
5
5
  "author": "cimo",
6
6
  "license": "MIT",
@@ -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;
@@ -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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"}
@@ -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;
@@ -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":"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"}