@cimo/websocket 1.0.12 → 1.0.14
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 -14
- package/dist/client/Interface.d.ts +1 -4
- package/dist/client/Message.d.ts +3 -3
- package/dist/client/Message.js +26 -19
- package/dist/client/Message.js.map +1 -1
- package/dist/server/Interface.d.ts +7 -5
- package/dist/server/Interface.js +5 -0
- package/dist/server/Interface.js.map +1 -1
- package/dist/server/Message.d.ts +5 -7
- package/dist/server/Message.js +53 -65
- package/dist/server/Message.js.map +1 -1
- package/package.json +3 -3
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Websocket
|
|
2
2
|
|
|
3
|
-
Websocket API (server
|
|
3
|
+
Websocket API (server/client). Light, fast and secure.
|
|
4
4
|
|
|
5
5
|
## Publish
|
|
6
6
|
|
|
@@ -22,29 +22,35 @@ Websocket API (server and client) fast and secure.
|
|
|
22
22
|
import { CwsServerMessage } from "@cimo/websocket";
|
|
23
23
|
|
|
24
24
|
// Source
|
|
25
|
-
import * as
|
|
25
|
+
import * as ControllerTest from "../controller/Test";
|
|
26
26
|
|
|
27
27
|
...
|
|
28
28
|
|
|
29
29
|
CwsServerMessage.create(server);
|
|
30
|
-
|
|
31
|
-
|
|
30
|
+
|
|
31
|
+
CwsServerMessage.receiveOutput("test", (socket, data) => {
|
|
32
|
+
ControllerTest.websocket(socket, data);
|
|
32
33
|
});
|
|
33
34
|
|
|
34
35
|
...
|
|
35
36
|
```
|
|
36
37
|
|
|
37
|
-
-
|
|
38
|
+
- ControllerTest.ts
|
|
38
39
|
|
|
39
40
|
```
|
|
40
41
|
...
|
|
41
42
|
|
|
42
|
-
import { CwsServerInterface } from "@cimo/websocket";
|
|
43
|
+
import { CwsServerInterface, CwsServerMessage } from "@cimo/websocket";
|
|
43
44
|
|
|
44
45
|
...
|
|
45
46
|
|
|
46
|
-
export const websocket = (data: CwsServerInterface.Imessage) => {
|
|
47
|
-
|
|
47
|
+
export const websocket = (socket: CwsServerInterface.Isocket, data: CwsServerInterface.Imessage) => {
|
|
48
|
+
const tag = data.tag;
|
|
49
|
+
const message = data.message;
|
|
50
|
+
|
|
51
|
+
if (tag === "cws_test_o") {
|
|
52
|
+
CwsServerMessage.sendInput(socket, "test", message);
|
|
53
|
+
}
|
|
48
54
|
};
|
|
49
55
|
|
|
50
56
|
...
|
|
@@ -61,20 +67,20 @@ import * as CwsClient from "@cimo/websocket/dist/client/Message";
|
|
|
61
67
|
|
|
62
68
|
...
|
|
63
69
|
|
|
64
|
-
CwsClient.connection(
|
|
70
|
+
CwsClient.connection(window.location.host);
|
|
65
71
|
|
|
66
|
-
CwsClient.
|
|
67
|
-
//
|
|
72
|
+
CwsClient.receiveMessage("broadcast", (data) => {
|
|
73
|
+
// Global event
|
|
68
74
|
});
|
|
69
75
|
|
|
70
|
-
CwsClient.
|
|
71
|
-
//
|
|
76
|
+
CwsClient.receiveMessage("test", (data) => {
|
|
77
|
+
// Test event
|
|
72
78
|
});
|
|
73
79
|
|
|
74
80
|
...
|
|
75
81
|
|
|
76
82
|
elementButton.addEventListener("click", (event) => {
|
|
77
|
-
CwsClient.sendMessage("
|
|
83
|
+
CwsClient.sendMessage("test", { value: 1 });
|
|
78
84
|
});
|
|
79
85
|
|
|
80
86
|
...
|
|
@@ -1,11 +1,8 @@
|
|
|
1
|
-
export interface IcircularReplacer {
|
|
2
|
-
(key: string, value: string): string | null;
|
|
3
|
-
}
|
|
4
1
|
export interface Imessage {
|
|
5
2
|
date: string;
|
|
6
3
|
tag: string;
|
|
7
4
|
message: string;
|
|
8
5
|
}
|
|
9
|
-
export interface
|
|
6
|
+
export interface IcallbackReceiveMessage {
|
|
10
7
|
(data: Imessage): void;
|
|
11
8
|
}
|
package/dist/client/Message.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as Interface from "./Interface";
|
|
2
|
-
export declare const sendMessage: (tagValue: string, messageValue: Record<string, unknown>
|
|
3
|
-
export declare const
|
|
4
|
-
export declare const
|
|
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
5
|
export declare const connection: (address?: string) => void;
|
package/dist/client/Message.js
CHANGED
|
@@ -1,31 +1,33 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.connection = exports.
|
|
4
|
-
let websocket;
|
|
3
|
+
exports.connection = exports.receiveMessageOff = exports.receiveMessage = exports.sendMessage = void 0;
|
|
4
|
+
let websocket = null;
|
|
5
5
|
let timeoutReconnect;
|
|
6
|
-
let serverAddress;
|
|
6
|
+
let serverAddress = "";
|
|
7
7
|
const messageHandleList = new Map();
|
|
8
8
|
const sendMessage = (tagValue, messageValue) => {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
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
|
+
}
|
|
15
17
|
};
|
|
16
18
|
exports.sendMessage = sendMessage;
|
|
17
|
-
const
|
|
18
|
-
messageHandleList.set(`cws_${tag}_i`, (
|
|
19
|
-
callback(
|
|
19
|
+
const receiveMessage = (tag, callback) => {
|
|
20
|
+
messageHandleList.set(`cws_${tag}_i`, (data) => {
|
|
21
|
+
callback(data);
|
|
20
22
|
});
|
|
21
23
|
};
|
|
22
|
-
exports.
|
|
23
|
-
const
|
|
24
|
+
exports.receiveMessage = receiveMessage;
|
|
25
|
+
const receiveMessageOff = (tag) => {
|
|
24
26
|
if (messageHandleList.has(`cws_${tag}_i`)) {
|
|
25
27
|
messageHandleList.delete(`cws_${tag}_i`);
|
|
26
28
|
}
|
|
27
29
|
};
|
|
28
|
-
exports.
|
|
30
|
+
exports.receiveMessageOff = receiveMessageOff;
|
|
29
31
|
const connection = (address) => {
|
|
30
32
|
serverAddress = address ? address : serverAddress;
|
|
31
33
|
websocket = new WebSocket(`wss://${serverAddress}`);
|
|
@@ -44,15 +46,20 @@ const messageHandle = (event) => {
|
|
|
44
46
|
}
|
|
45
47
|
};
|
|
46
48
|
const eventOpen = () => {
|
|
49
|
+
console.log("@cimo/websocket - Message.ts - eventOpen():", "Connected.");
|
|
47
50
|
clearTimeout(timeoutReconnect);
|
|
48
51
|
};
|
|
49
52
|
const eventMessage = (event) => {
|
|
50
53
|
messageHandle(event);
|
|
51
54
|
};
|
|
52
55
|
const eventClose = () => {
|
|
53
|
-
websocket
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
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
|
+
}
|
|
57
64
|
};
|
|
58
65
|
//# sourceMappingURL=Message.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Message.js","sourceRoot":"","sources":["../../src/client/Message.ts"],"names":[],"mappings":";;;AAGA,IAAI,
|
|
1
|
+
{"version":3,"file":"Message.js","sourceRoot":"","sources":["../../src/client/Message.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +1,13 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
}
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { Socket } from "net";
|
|
3
|
+
import { Server } from "https";
|
|
4
|
+
export { Socket as Isocket };
|
|
5
|
+
export { Server as HttpsServer };
|
|
4
6
|
export interface Imessage {
|
|
5
7
|
date: string;
|
|
6
8
|
tag: string;
|
|
7
9
|
message: string;
|
|
8
10
|
}
|
|
9
|
-
export interface
|
|
10
|
-
(data: Imessage): void;
|
|
11
|
+
export interface IcallbackReceiveOutput {
|
|
12
|
+
(socket: Socket, data: Imessage): void;
|
|
11
13
|
}
|
package/dist/server/Interface.js
CHANGED
|
@@ -1,3 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.HttpsServer = exports.Isocket = void 0;
|
|
4
|
+
const net_1 = require("net");
|
|
5
|
+
Object.defineProperty(exports, "Isocket", { enumerable: true, get: function () { return net_1.Socket; } });
|
|
6
|
+
const https_1 = require("https");
|
|
7
|
+
Object.defineProperty(exports, "HttpsServer", { enumerable: true, get: function () { return https_1.Server; } });
|
|
3
8
|
//# sourceMappingURL=Interface.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Interface.js","sourceRoot":"","sources":["../../src/server/Interface.ts"],"names":[],"mappings":""}
|
|
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"}
|
package/dist/server/Message.d.ts
CHANGED
|
@@ -1,8 +1,6 @@
|
|
|
1
|
-
import * as Net from "net";
|
|
2
|
-
import * as Https from "https";
|
|
3
1
|
import * as Interface from "./Interface";
|
|
4
|
-
export declare const
|
|
5
|
-
export declare const
|
|
6
|
-
export declare const sendInput: (socket:
|
|
7
|
-
export declare const sendInputBroadcast: (socket:
|
|
8
|
-
export declare const create: (server:
|
|
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
CHANGED
|
@@ -23,38 +23,32 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
|
23
23
|
return result;
|
|
24
24
|
};
|
|
25
25
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
-
exports.create = exports.sendInputBroadcast = exports.sendInput = exports.
|
|
26
|
+
exports.create = exports.sendInputBroadcast = exports.sendInput = exports.receiveOutputOff = exports.receiveOutput = void 0;
|
|
27
27
|
const Crypto = __importStar(require("crypto"));
|
|
28
28
|
const WEBSOCKET_MAGIC_STRING_KEY = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
|
|
29
29
|
const SEVEN_BITS_INTEGER_MARKER = 125;
|
|
30
30
|
const SIXTEEN_BITS_INTEGER_MARKER = 126;
|
|
31
|
-
const
|
|
31
|
+
const THIRTYTWO_BITS_INTEGER_MARKER = 127;
|
|
32
32
|
const MASK_KEY_BYTES_LENGTH = 4;
|
|
33
|
-
const OPCODE_TEXT = 0x01;
|
|
34
|
-
const FIRST_BIT = 128;
|
|
35
33
|
const socketList = [];
|
|
36
34
|
const messageHandleList = new Map();
|
|
37
|
-
const
|
|
38
|
-
messageHandleList.set(`cws_${tag}_o`, (
|
|
39
|
-
callback(
|
|
35
|
+
const receiveOutput = (tag, callback) => {
|
|
36
|
+
messageHandleList.set(`cws_${tag}_o`, (socket, data) => {
|
|
37
|
+
callback(socket, data);
|
|
40
38
|
});
|
|
41
39
|
};
|
|
42
|
-
exports.
|
|
43
|
-
const
|
|
40
|
+
exports.receiveOutput = receiveOutput;
|
|
41
|
+
const receiveOutputOff = (tag) => {
|
|
44
42
|
if (messageHandleList.has(`cws_${tag}_o`)) {
|
|
45
43
|
messageHandleList.delete(`cws_${tag}_o`);
|
|
46
44
|
}
|
|
47
45
|
};
|
|
48
|
-
exports.
|
|
46
|
+
exports.receiveOutputOff = receiveOutputOff;
|
|
49
47
|
const sendInput = (socket, tagValue, messageValue) => {
|
|
50
48
|
if (tagValue) {
|
|
51
|
-
const tagValueSplit = tagValue.split("_");
|
|
52
|
-
tagValueSplit.shift();
|
|
53
|
-
tagValueSplit.pop();
|
|
54
|
-
const tagValueJoin = tagValueSplit.join("_");
|
|
55
49
|
const dataStructure = {
|
|
56
50
|
date: new Date().toISOString(),
|
|
57
|
-
tag: `cws_${
|
|
51
|
+
tag: `cws_${tagValue}_i`,
|
|
58
52
|
message: messageValue
|
|
59
53
|
};
|
|
60
54
|
const result = prepareMessage(JSON.stringify(dataStructure));
|
|
@@ -66,7 +60,7 @@ const sendInputBroadcast = (socket, tag, message, excludeSender = true) => {
|
|
|
66
60
|
for (const client of socketList) {
|
|
67
61
|
if (client && !client.destroyed) {
|
|
68
62
|
if ((excludeSender && client !== socket) || !excludeSender) {
|
|
69
|
-
(0, exports.sendInput)(client,
|
|
63
|
+
(0, exports.sendInput)(client, tag, message);
|
|
70
64
|
}
|
|
71
65
|
}
|
|
72
66
|
}
|
|
@@ -76,26 +70,17 @@ const create = (server) => {
|
|
|
76
70
|
server.on("upgrade", onServerUpgrade);
|
|
77
71
|
};
|
|
78
72
|
exports.create = create;
|
|
79
|
-
const messageHandle = (data) => {
|
|
80
|
-
for (const [tag, eventHandler] of messageHandleList) {
|
|
81
|
-
if (data.tag === tag) {
|
|
82
|
-
eventHandler(data);
|
|
83
|
-
return;
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
};
|
|
87
73
|
const prepareMessage = (data) => {
|
|
88
74
|
const message = Buffer.from(data);
|
|
89
75
|
const messageSize = message.length;
|
|
90
76
|
let dataBuffer;
|
|
91
|
-
const firstByte = 0x80 |
|
|
77
|
+
const firstByte = 0x80 | 0x01;
|
|
92
78
|
if (messageSize <= SEVEN_BITS_INTEGER_MARKER) {
|
|
93
79
|
const bytes = [firstByte];
|
|
94
80
|
dataBuffer = Buffer.from(bytes.concat(messageSize));
|
|
95
81
|
}
|
|
96
|
-
else if (messageSize <=
|
|
97
|
-
const
|
|
98
|
-
const target = Buffer.allocUnsafe(offsetFourBytes);
|
|
82
|
+
else if (messageSize <= 2 ** 16) {
|
|
83
|
+
const target = Buffer.allocUnsafe(4);
|
|
99
84
|
target[0] = firstByte;
|
|
100
85
|
target[1] = SIXTEEN_BITS_INTEGER_MARKER | 0x0;
|
|
101
86
|
target.writeUint16BE(messageSize, 2);
|
|
@@ -113,54 +98,58 @@ const prepareMessage = (data) => {
|
|
|
113
98
|
}
|
|
114
99
|
return result;
|
|
115
100
|
};
|
|
116
|
-
const
|
|
117
|
-
const
|
|
118
|
-
|
|
119
|
-
|
|
101
|
+
const messageHandle = (socket, data) => {
|
|
102
|
+
for (const [tag, eventHandler] of messageHandleList) {
|
|
103
|
+
if (data.tag === tag) {
|
|
104
|
+
eventHandler(socket, data);
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
120
107
|
}
|
|
121
|
-
return finalBuffer;
|
|
122
108
|
};
|
|
123
109
|
const onSocketEnd = (socket) => {
|
|
124
110
|
(0, exports.sendInputBroadcast)(socket, "broadcast", `Client ${socket.remoteAddress || ""} disconnected.`);
|
|
125
111
|
const index = socketList.indexOf(socket);
|
|
126
|
-
if (index
|
|
112
|
+
if (index > -1) {
|
|
127
113
|
socketList.splice(index, 1);
|
|
128
114
|
}
|
|
129
115
|
socket.destroy();
|
|
130
116
|
};
|
|
131
|
-
const
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
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];
|
|
147
136
|
}
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
if (/^[\],:{}\s]*$/.test(
|
|
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
|
|
153
142
|
.replace(/\\["\\/bfnrtu]/g, "@")
|
|
154
143
|
.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\\-]?\d+)?/g, "]")
|
|
155
144
|
.replace(/(?:^|:|,)(?:\s*\[)+/g, ""))) {
|
|
156
|
-
data = JSON.parse(
|
|
145
|
+
data = JSON.parse(payloadOutput);
|
|
157
146
|
}
|
|
158
|
-
messageHandle(data);
|
|
159
147
|
}
|
|
148
|
+
messageHandle(socket, data);
|
|
160
149
|
};
|
|
161
150
|
const onServerUpgrade = (request, socket) => {
|
|
162
151
|
if (request.headers["upgrade"] !== "websocket") {
|
|
163
|
-
socket.
|
|
152
|
+
socket.end("HTTP/1.1 400 Bad Request");
|
|
164
153
|
return;
|
|
165
154
|
}
|
|
166
155
|
const { "sec-websocket-key": webClientSocketKey } = request.headers;
|
|
@@ -175,13 +164,12 @@ const onServerUpgrade = (request, socket) => {
|
|
|
175
164
|
}
|
|
176
165
|
});
|
|
177
166
|
socketList.push(socket);
|
|
178
|
-
socket.on("
|
|
179
|
-
|
|
167
|
+
socket.on("data", (buffer) => {
|
|
168
|
+
onSocketData(socket, buffer);
|
|
169
|
+
});
|
|
170
|
+
socket.on("end", () => {
|
|
171
|
+
onSocketEnd(socket);
|
|
172
|
+
});
|
|
180
173
|
(0, exports.sendInputBroadcast)(socket, "broadcast", `Client ${socket.remoteAddress || ""} connected.`);
|
|
181
174
|
};
|
|
182
|
-
for (const event of ["uncaughtException", "unhandledRejection"]) {
|
|
183
|
-
process.on(event, (error) => {
|
|
184
|
-
console.log("@cimo/websocket - Helper.ts - keepProcess()", `Event: ${event} - Error: ${error.stack?.toString() || error.toString()}`);
|
|
185
|
-
});
|
|
186
|
-
}
|
|
187
175
|
//# sourceMappingURL=Message.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Message.js","sourceRoot":"","sources":["../../src/server/Message.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,+CAAiC;
|
|
1
|
+
{"version":3,"file":"Message.js","sourceRoot":"","sources":["../../src/server/Message.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cimo/websocket",
|
|
3
|
-
"version": "1.0.
|
|
4
|
-
"description": "Websocket API (server
|
|
3
|
+
"version": "1.0.14",
|
|
4
|
+
"description": "Websocket API (server/client). Light, fast and secure.",
|
|
5
5
|
"author": "cimo",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"repository": {
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
"scripts": {
|
|
12
12
|
"preinstall": "([ ! -f package-lock.json ] && npm install --package-lock-only --ignore-scripts --no-audit); npx npm-force-resolutions",
|
|
13
13
|
"check": "eslint . --fix",
|
|
14
|
-
"remove_dist": "node -e \"const fs = require('fs');try
|
|
14
|
+
"remove_dist": "node -e \"const fs = require('fs'); try{ fs.rmdirSync('./dist/', { recursive: true }) } catch{}; process.exit(0);\"",
|
|
15
15
|
"build": "npm run check && npm run remove_dist && tsc --build tsconfig.build_server.json && tsc --build tsconfig.build_client.json",
|
|
16
16
|
"pack": "npm run build && npm pack"
|
|
17
17
|
},
|