sonic-ws 1.0.0-alpha.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.
- package/.gitattributes +2 -0
- package/README.md +2 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +9 -0
- package/dist/ws/KeyHolder.d.ts +9 -0
- package/dist/ws/KeyHolder.js +27 -0
- package/dist/ws/SonicWS.d.ts +16 -0
- package/dist/ws/SonicWS.js +92 -0
- package/dist/ws/SonicWSClient.d.ts +12 -0
- package/dist/ws/SonicWSClient.js +49 -0
- package/dist/ws/SonicWSServer.d.ts +13 -0
- package/dist/ws/SonicWSServer.js +59 -0
- package/dist/ws/client/SonicWS.d.ts +16 -0
- package/dist/ws/client/SonicWS.js +92 -0
- package/dist/ws/server/SonicWSConnection.d.ts +12 -0
- package/dist/ws/server/SonicWSConnection.js +49 -0
- package/dist/ws/server/SonicWSServer.d.ts +13 -0
- package/dist/ws/server/SonicWSServer.js +59 -0
- package/package.json +27 -0
- package/src/index.ts +3 -0
- package/src/ws/KeyHolder.ts +26 -0
- package/src/ws/client/SonicWS.ts +80 -0
- package/src/ws/server/SonicWSConnection.ts +59 -0
- package/src/ws/server/SonicWSServer.ts +33 -0
- package/tsconfig.json +16 -0
package/.gitattributes
ADDED
package/README.md
ADDED
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SonicWSServer = exports.SonicWSConnection = exports.SonicWS = void 0;
|
|
4
|
+
var SonicWS_1 = require("./ws/client/SonicWS");
|
|
5
|
+
Object.defineProperty(exports, "SonicWS", { enumerable: true, get: function () { return SonicWS_1.SonicWS; } });
|
|
6
|
+
var SonicWSConnection_1 = require("./ws/server/SonicWSConnection");
|
|
7
|
+
Object.defineProperty(exports, "SonicWSConnection", { enumerable: true, get: function () { return SonicWSConnection_1.SonicWSConnection; } });
|
|
8
|
+
var SonicWSServer_1 = require("./ws/server/SonicWSServer");
|
|
9
|
+
Object.defineProperty(exports, "SonicWSServer", { enumerable: true, get: function () { return SonicWSServer_1.SonicWSServer; } });
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.KeyHolder = void 0;
|
|
4
|
+
var KeyHolder = /** @class */ (function () {
|
|
5
|
+
function KeyHolder() {
|
|
6
|
+
this.key = 1;
|
|
7
|
+
this.keys = {};
|
|
8
|
+
}
|
|
9
|
+
KeyHolder.prototype.createKey = function (tag) {
|
|
10
|
+
this.key++;
|
|
11
|
+
this.keys[tag] = this.key;
|
|
12
|
+
};
|
|
13
|
+
KeyHolder.prototype.createKeys = function (tags) {
|
|
14
|
+
for (var _i = 0, tags_1 = tags; _i < tags_1.length; _i++) {
|
|
15
|
+
var tag = tags_1[_i];
|
|
16
|
+
this.createKey(tag);
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
KeyHolder.prototype.get = function (key) {
|
|
20
|
+
return this.keys[key];
|
|
21
|
+
};
|
|
22
|
+
KeyHolder.prototype.getChar = function (key) {
|
|
23
|
+
return String.fromCodePoint(this.get(key));
|
|
24
|
+
};
|
|
25
|
+
return KeyHolder;
|
|
26
|
+
}());
|
|
27
|
+
exports.KeyHolder = KeyHolder;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import * as WS from 'ws';
|
|
2
|
+
import { KeyHolder } from './KeyHolder';
|
|
3
|
+
export declare class SonicWS {
|
|
4
|
+
private ws;
|
|
5
|
+
private listeners;
|
|
6
|
+
clientKeys: KeyHolder;
|
|
7
|
+
serverKeys: KeyHolder;
|
|
8
|
+
constructor(url: string, options?: WS.ClientOptions);
|
|
9
|
+
raw_onmessage(listener: (data: string) => void): void;
|
|
10
|
+
raw_onclose(listener: (event: CloseEvent) => void): void;
|
|
11
|
+
send(key: string, value: string): void;
|
|
12
|
+
on_ready(listener: () => void): void;
|
|
13
|
+
on(key: string, listener: (value: string) => void): void;
|
|
14
|
+
createClientKeys(...keys: string[]): void;
|
|
15
|
+
createServerKeys(...keys: string[]): void;
|
|
16
|
+
}
|
|
@@ -0,0 +1,92 @@
|
|
|
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.SonicWS = void 0;
|
|
27
|
+
var WS = __importStar(require("ws"));
|
|
28
|
+
var KeyHolder_1 = require("./KeyHolder");
|
|
29
|
+
var SonicWS = /** @class */ (function () {
|
|
30
|
+
function SonicWS(url, options) {
|
|
31
|
+
var _this = this;
|
|
32
|
+
this.ws = new WS.WebSocket(url, options);
|
|
33
|
+
this.listeners = {
|
|
34
|
+
message: [],
|
|
35
|
+
close: [],
|
|
36
|
+
event: {},
|
|
37
|
+
};
|
|
38
|
+
this.clientKeys = new KeyHolder_1.KeyHolder();
|
|
39
|
+
this.serverKeys = new KeyHolder_1.KeyHolder();
|
|
40
|
+
this.ws.on('message', function (data) {
|
|
41
|
+
var _a;
|
|
42
|
+
data = data.toString();
|
|
43
|
+
_this.listeners.message.forEach(function (listener) { return listener(data); });
|
|
44
|
+
if (data.length < 1)
|
|
45
|
+
return;
|
|
46
|
+
var key = data.substring(0, 1);
|
|
47
|
+
var value = data.substring(1);
|
|
48
|
+
(_a = _this.listeners.event[key.codePointAt(0)]) === null || _a === void 0 ? void 0 : _a.forEach(function (l) { return l(value); });
|
|
49
|
+
});
|
|
50
|
+
this.ws.on('close', function (event) {
|
|
51
|
+
_this.listeners.close.forEach(function (listener) { return listener(event); });
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
SonicWS.prototype.raw_onmessage = function (listener) {
|
|
55
|
+
this.listeners.message.push(listener);
|
|
56
|
+
};
|
|
57
|
+
SonicWS.prototype.raw_onclose = function (listener) {
|
|
58
|
+
this.listeners.close.push(listener);
|
|
59
|
+
};
|
|
60
|
+
SonicWS.prototype.send = function (key, value) {
|
|
61
|
+
var code = this.clientKeys.getChar(key);
|
|
62
|
+
if (code == null)
|
|
63
|
+
throw new Error("Key \"".concat(key, "\" has not been created!"));
|
|
64
|
+
this.ws.send(code + value);
|
|
65
|
+
};
|
|
66
|
+
SonicWS.prototype.on_ready = function (listener) {
|
|
67
|
+
this.ws.on('open', listener);
|
|
68
|
+
};
|
|
69
|
+
SonicWS.prototype.on = function (key, listener) {
|
|
70
|
+
this.listeners.event[this.serverKeys.get(key)].push(listener);
|
|
71
|
+
};
|
|
72
|
+
SonicWS.prototype.createClientKeys = function () {
|
|
73
|
+
var keys = [];
|
|
74
|
+
for (var _i = 0; _i < arguments.length; _i++) {
|
|
75
|
+
keys[_i] = arguments[_i];
|
|
76
|
+
}
|
|
77
|
+
this.clientKeys.createKeys(keys);
|
|
78
|
+
};
|
|
79
|
+
SonicWS.prototype.createServerKeys = function () {
|
|
80
|
+
var keys = [];
|
|
81
|
+
for (var _i = 0; _i < arguments.length; _i++) {
|
|
82
|
+
keys[_i] = arguments[_i];
|
|
83
|
+
}
|
|
84
|
+
this.serverKeys.createKeys(keys);
|
|
85
|
+
for (var _a = 0, keys_1 = keys; _a < keys_1.length; _a++) {
|
|
86
|
+
var key = keys_1[_a];
|
|
87
|
+
this.listeners.event[this.serverKeys.get(key)] = [];
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
return SonicWS;
|
|
91
|
+
}());
|
|
92
|
+
exports.SonicWS = SonicWS;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import * as WS from 'ws';
|
|
2
|
+
import { SonicWSServer } from './SonicWSServer';
|
|
3
|
+
export declare class SonicWSClient {
|
|
4
|
+
private socket;
|
|
5
|
+
private host;
|
|
6
|
+
private listeners;
|
|
7
|
+
constructor(socket: WS.WebSocket, host: SonicWSServer);
|
|
8
|
+
raw_send(data: string): void;
|
|
9
|
+
/** Listens for when the client sends a message. This will use the server's key system */
|
|
10
|
+
on(key: string, listener: (value: string) => void): void;
|
|
11
|
+
send(key: string, value: string): void;
|
|
12
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SonicWSClient = void 0;
|
|
4
|
+
var SonicWSClient = /** @class */ (function () {
|
|
5
|
+
function SonicWSClient(socket, host) {
|
|
6
|
+
var _this = this;
|
|
7
|
+
this.socket = socket;
|
|
8
|
+
this.host = host;
|
|
9
|
+
this.listeners = {};
|
|
10
|
+
for (var _i = 0, _a = Object.values(host.clientKeys.keys); _i < _a.length; _i++) {
|
|
11
|
+
var key = _a[_i];
|
|
12
|
+
this.listeners[String.fromCodePoint(key)] = [];
|
|
13
|
+
}
|
|
14
|
+
this.socket.on('message', function (data) {
|
|
15
|
+
var message = data.toString();
|
|
16
|
+
if (message.length < 1) {
|
|
17
|
+
_this.socket.close();
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
var key = message.substring(0, 1);
|
|
21
|
+
var value = message.substring(1);
|
|
22
|
+
if (!_this.listeners[key]) {
|
|
23
|
+
_this.socket.close();
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
_this.listeners[key].forEach(function (listener) { return listener(value); });
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
SonicWSClient.prototype.raw_send = function (data) {
|
|
30
|
+
this.socket.send(data);
|
|
31
|
+
};
|
|
32
|
+
/** Listens for when the client sends a message. This will use the server's key system */
|
|
33
|
+
SonicWSClient.prototype.on = function (key, listener) {
|
|
34
|
+
var code = this.host.clientKeys.getChar(key);
|
|
35
|
+
if (code == null)
|
|
36
|
+
throw new Error("Key \"".concat(key, "\" has not been created!"));
|
|
37
|
+
if (!this.listeners[code])
|
|
38
|
+
this.listeners[code] = [];
|
|
39
|
+
this.listeners[code].push(listener);
|
|
40
|
+
};
|
|
41
|
+
SonicWSClient.prototype.send = function (key, value) {
|
|
42
|
+
var code = this.host.serverKeys.getChar(key);
|
|
43
|
+
if (code == null)
|
|
44
|
+
throw new Error("Key \"".concat(key, "\" has not been created!"));
|
|
45
|
+
this.socket.send(code + value);
|
|
46
|
+
};
|
|
47
|
+
return SonicWSClient;
|
|
48
|
+
}());
|
|
49
|
+
exports.SonicWSClient = SonicWSClient;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import * as WS from 'ws';
|
|
2
|
+
import { SonicWSClient } from './SonicWSClient';
|
|
3
|
+
import { KeyHolder } from './KeyHolder';
|
|
4
|
+
export declare class SonicWSServer {
|
|
5
|
+
private ws;
|
|
6
|
+
clientKeys: KeyHolder;
|
|
7
|
+
serverKeys: KeyHolder;
|
|
8
|
+
constructor(options: WS.ServerOptions);
|
|
9
|
+
createClientKeys(...keys: string[]): void;
|
|
10
|
+
createServerKeys(...keys: string[]): void;
|
|
11
|
+
on_connect(runner: (client: SonicWSClient) => void): void;
|
|
12
|
+
on_ready(runner: () => void): void;
|
|
13
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
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.SonicWSServer = void 0;
|
|
27
|
+
var WS = __importStar(require("ws"));
|
|
28
|
+
var SonicWSClient_1 = require("./SonicWSClient");
|
|
29
|
+
var KeyHolder_1 = require("./KeyHolder");
|
|
30
|
+
var SonicWSServer = /** @class */ (function () {
|
|
31
|
+
function SonicWSServer(options) {
|
|
32
|
+
this.ws = new WS.WebSocketServer(options);
|
|
33
|
+
this.clientKeys = new KeyHolder_1.KeyHolder();
|
|
34
|
+
this.serverKeys = new KeyHolder_1.KeyHolder();
|
|
35
|
+
}
|
|
36
|
+
SonicWSServer.prototype.createClientKeys = function () {
|
|
37
|
+
var keys = [];
|
|
38
|
+
for (var _i = 0; _i < arguments.length; _i++) {
|
|
39
|
+
keys[_i] = arguments[_i];
|
|
40
|
+
}
|
|
41
|
+
this.clientKeys.createKeys(keys);
|
|
42
|
+
};
|
|
43
|
+
SonicWSServer.prototype.createServerKeys = function () {
|
|
44
|
+
var keys = [];
|
|
45
|
+
for (var _i = 0; _i < arguments.length; _i++) {
|
|
46
|
+
keys[_i] = arguments[_i];
|
|
47
|
+
}
|
|
48
|
+
this.serverKeys.createKeys(keys);
|
|
49
|
+
};
|
|
50
|
+
SonicWSServer.prototype.on_connect = function (runner) {
|
|
51
|
+
var _this = this;
|
|
52
|
+
this.ws.on('connection', function (socket) { return runner(new SonicWSClient_1.SonicWSClient(socket, _this)); });
|
|
53
|
+
};
|
|
54
|
+
SonicWSServer.prototype.on_ready = function (runner) {
|
|
55
|
+
this.ws.on('listening', runner);
|
|
56
|
+
};
|
|
57
|
+
return SonicWSServer;
|
|
58
|
+
}());
|
|
59
|
+
exports.SonicWSServer = SonicWSServer;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import * as WS from 'ws';
|
|
2
|
+
import { KeyHolder } from '../KeyHolder';
|
|
3
|
+
export declare class SonicWS {
|
|
4
|
+
private ws;
|
|
5
|
+
private listeners;
|
|
6
|
+
clientKeys: KeyHolder;
|
|
7
|
+
serverKeys: KeyHolder;
|
|
8
|
+
constructor(url: string, options?: WS.ClientOptions);
|
|
9
|
+
raw_onmessage(listener: (data: string) => void): void;
|
|
10
|
+
raw_onclose(listener: (event: CloseEvent) => void): void;
|
|
11
|
+
send(key: string, value: string): void;
|
|
12
|
+
on_ready(listener: () => void): void;
|
|
13
|
+
on(key: string, listener: (value: string) => void): void;
|
|
14
|
+
createClientKeys(...keys: string[]): void;
|
|
15
|
+
createServerKeys(...keys: string[]): void;
|
|
16
|
+
}
|
|
@@ -0,0 +1,92 @@
|
|
|
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.SonicWS = void 0;
|
|
27
|
+
var WS = __importStar(require("ws"));
|
|
28
|
+
var KeyHolder_1 = require("../KeyHolder");
|
|
29
|
+
var SonicWS = /** @class */ (function () {
|
|
30
|
+
function SonicWS(url, options) {
|
|
31
|
+
var _this = this;
|
|
32
|
+
this.ws = new WS.WebSocket(url, options);
|
|
33
|
+
this.listeners = {
|
|
34
|
+
message: [],
|
|
35
|
+
close: [],
|
|
36
|
+
event: {},
|
|
37
|
+
};
|
|
38
|
+
this.clientKeys = new KeyHolder_1.KeyHolder();
|
|
39
|
+
this.serverKeys = new KeyHolder_1.KeyHolder();
|
|
40
|
+
this.ws.on('message', function (data) {
|
|
41
|
+
var _a;
|
|
42
|
+
data = data.toString();
|
|
43
|
+
_this.listeners.message.forEach(function (listener) { return listener(data); });
|
|
44
|
+
if (data.length < 1)
|
|
45
|
+
return;
|
|
46
|
+
var key = data.substring(0, 1);
|
|
47
|
+
var value = data.substring(1);
|
|
48
|
+
(_a = _this.listeners.event[key.codePointAt(0)]) === null || _a === void 0 ? void 0 : _a.forEach(function (l) { return l(value); });
|
|
49
|
+
});
|
|
50
|
+
this.ws.on('close', function (event) {
|
|
51
|
+
_this.listeners.close.forEach(function (listener) { return listener(event); });
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
SonicWS.prototype.raw_onmessage = function (listener) {
|
|
55
|
+
this.listeners.message.push(listener);
|
|
56
|
+
};
|
|
57
|
+
SonicWS.prototype.raw_onclose = function (listener) {
|
|
58
|
+
this.listeners.close.push(listener);
|
|
59
|
+
};
|
|
60
|
+
SonicWS.prototype.send = function (key, value) {
|
|
61
|
+
var code = this.clientKeys.getChar(key);
|
|
62
|
+
if (code == null)
|
|
63
|
+
throw new Error("Key \"".concat(key, "\" has not been created!"));
|
|
64
|
+
this.ws.send(code + value);
|
|
65
|
+
};
|
|
66
|
+
SonicWS.prototype.on_ready = function (listener) {
|
|
67
|
+
this.ws.on('open', listener);
|
|
68
|
+
};
|
|
69
|
+
SonicWS.prototype.on = function (key, listener) {
|
|
70
|
+
this.listeners.event[this.serverKeys.get(key)].push(listener);
|
|
71
|
+
};
|
|
72
|
+
SonicWS.prototype.createClientKeys = function () {
|
|
73
|
+
var keys = [];
|
|
74
|
+
for (var _i = 0; _i < arguments.length; _i++) {
|
|
75
|
+
keys[_i] = arguments[_i];
|
|
76
|
+
}
|
|
77
|
+
this.clientKeys.createKeys(keys);
|
|
78
|
+
};
|
|
79
|
+
SonicWS.prototype.createServerKeys = function () {
|
|
80
|
+
var keys = [];
|
|
81
|
+
for (var _i = 0; _i < arguments.length; _i++) {
|
|
82
|
+
keys[_i] = arguments[_i];
|
|
83
|
+
}
|
|
84
|
+
this.serverKeys.createKeys(keys);
|
|
85
|
+
for (var _a = 0, keys_1 = keys; _a < keys_1.length; _a++) {
|
|
86
|
+
var key = keys_1[_a];
|
|
87
|
+
this.listeners.event[this.serverKeys.get(key)] = [];
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
return SonicWS;
|
|
91
|
+
}());
|
|
92
|
+
exports.SonicWS = SonicWS;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import * as WS from 'ws';
|
|
2
|
+
import { SonicWSServer } from './SonicWSServer';
|
|
3
|
+
export declare class SonicWSConnection {
|
|
4
|
+
private socket;
|
|
5
|
+
private host;
|
|
6
|
+
private listeners;
|
|
7
|
+
constructor(socket: WS.WebSocket, host: SonicWSServer);
|
|
8
|
+
raw_send(data: string): void;
|
|
9
|
+
/** Listens for when the client sends a message. This will use the server's key system */
|
|
10
|
+
on(key: string, listener: (value: string) => void): void;
|
|
11
|
+
send(key: string, value: string): void;
|
|
12
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SonicWSConnection = void 0;
|
|
4
|
+
var SonicWSConnection = /** @class */ (function () {
|
|
5
|
+
function SonicWSConnection(socket, host) {
|
|
6
|
+
var _this = this;
|
|
7
|
+
this.socket = socket;
|
|
8
|
+
this.host = host;
|
|
9
|
+
this.listeners = {};
|
|
10
|
+
for (var _i = 0, _a = Object.values(host.clientKeys.keys); _i < _a.length; _i++) {
|
|
11
|
+
var key = _a[_i];
|
|
12
|
+
this.listeners[String.fromCodePoint(key)] = [];
|
|
13
|
+
}
|
|
14
|
+
this.socket.on('message', function (data) {
|
|
15
|
+
var message = data.toString();
|
|
16
|
+
if (message.length < 1) {
|
|
17
|
+
_this.socket.close();
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
var key = message.substring(0, 1);
|
|
21
|
+
var value = message.substring(1);
|
|
22
|
+
if (!_this.listeners[key]) {
|
|
23
|
+
_this.socket.close();
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
_this.listeners[key].forEach(function (listener) { return listener(value); });
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
SonicWSConnection.prototype.raw_send = function (data) {
|
|
30
|
+
this.socket.send(data);
|
|
31
|
+
};
|
|
32
|
+
/** Listens for when the client sends a message. This will use the server's key system */
|
|
33
|
+
SonicWSConnection.prototype.on = function (key, listener) {
|
|
34
|
+
var code = this.host.clientKeys.getChar(key);
|
|
35
|
+
if (code == null)
|
|
36
|
+
throw new Error("Key \"".concat(key, "\" has not been created!"));
|
|
37
|
+
if (!this.listeners[code])
|
|
38
|
+
this.listeners[code] = [];
|
|
39
|
+
this.listeners[code].push(listener);
|
|
40
|
+
};
|
|
41
|
+
SonicWSConnection.prototype.send = function (key, value) {
|
|
42
|
+
var code = this.host.serverKeys.getChar(key);
|
|
43
|
+
if (code == null)
|
|
44
|
+
throw new Error("Key \"".concat(key, "\" has not been created!"));
|
|
45
|
+
this.socket.send(code + value);
|
|
46
|
+
};
|
|
47
|
+
return SonicWSConnection;
|
|
48
|
+
}());
|
|
49
|
+
exports.SonicWSConnection = SonicWSConnection;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import * as WS from 'ws';
|
|
2
|
+
import { SonicWSConnection } from './SonicWSConnection';
|
|
3
|
+
import { KeyHolder } from '../KeyHolder';
|
|
4
|
+
export declare class SonicWSServer {
|
|
5
|
+
private ws;
|
|
6
|
+
clientKeys: KeyHolder;
|
|
7
|
+
serverKeys: KeyHolder;
|
|
8
|
+
constructor(options: WS.ServerOptions);
|
|
9
|
+
createClientKeys(...keys: string[]): void;
|
|
10
|
+
createServerKeys(...keys: string[]): void;
|
|
11
|
+
on_connect(runner: (client: SonicWSConnection) => void): void;
|
|
12
|
+
on_ready(runner: () => void): void;
|
|
13
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
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.SonicWSServer = void 0;
|
|
27
|
+
var WS = __importStar(require("ws"));
|
|
28
|
+
var SonicWSConnection_1 = require("./SonicWSConnection");
|
|
29
|
+
var KeyHolder_1 = require("../KeyHolder");
|
|
30
|
+
var SonicWSServer = /** @class */ (function () {
|
|
31
|
+
function SonicWSServer(options) {
|
|
32
|
+
this.ws = new WS.WebSocketServer(options);
|
|
33
|
+
this.clientKeys = new KeyHolder_1.KeyHolder();
|
|
34
|
+
this.serverKeys = new KeyHolder_1.KeyHolder();
|
|
35
|
+
}
|
|
36
|
+
SonicWSServer.prototype.createClientKeys = function () {
|
|
37
|
+
var keys = [];
|
|
38
|
+
for (var _i = 0; _i < arguments.length; _i++) {
|
|
39
|
+
keys[_i] = arguments[_i];
|
|
40
|
+
}
|
|
41
|
+
this.clientKeys.createKeys(keys);
|
|
42
|
+
};
|
|
43
|
+
SonicWSServer.prototype.createServerKeys = function () {
|
|
44
|
+
var keys = [];
|
|
45
|
+
for (var _i = 0; _i < arguments.length; _i++) {
|
|
46
|
+
keys[_i] = arguments[_i];
|
|
47
|
+
}
|
|
48
|
+
this.serverKeys.createKeys(keys);
|
|
49
|
+
};
|
|
50
|
+
SonicWSServer.prototype.on_connect = function (runner) {
|
|
51
|
+
var _this = this;
|
|
52
|
+
this.ws.on('connection', function (socket) { return runner(new SonicWSConnection_1.SonicWSConnection(socket, _this)); });
|
|
53
|
+
};
|
|
54
|
+
SonicWSServer.prototype.on_ready = function (runner) {
|
|
55
|
+
this.ws.on('listening', runner);
|
|
56
|
+
};
|
|
57
|
+
return SonicWSServer;
|
|
58
|
+
}());
|
|
59
|
+
exports.SonicWSServer = SonicWSServer;
|
package/package.json
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "sonic-ws",
|
|
3
|
+
"version": "1.0.0-alpha.0",
|
|
4
|
+
"description": "A bandwidth efficient websocket library",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"types": "dist/index.d.ts",
|
|
7
|
+
"scripts": {
|
|
8
|
+
"build": "tsc -d",
|
|
9
|
+
"test": "npm run build && node test"
|
|
10
|
+
},
|
|
11
|
+
"repository": {
|
|
12
|
+
"type": "git",
|
|
13
|
+
"url": "git+https://github.com/cutelittlelily/sonic-ws.git"
|
|
14
|
+
},
|
|
15
|
+
"bugs": {
|
|
16
|
+
"url": "https://github.com/cutelittlelily/sonic-ws/issues"
|
|
17
|
+
},
|
|
18
|
+
"homepage": "https://github.com/cutelittlelily/sonic-ws#readme",
|
|
19
|
+
"author": "lily",
|
|
20
|
+
"license": "ISC",
|
|
21
|
+
"dependencies": {
|
|
22
|
+
"ws": "^8.18.2"
|
|
23
|
+
},
|
|
24
|
+
"devDependencies": {
|
|
25
|
+
"@types/ws": "^8.18.1"
|
|
26
|
+
}
|
|
27
|
+
}
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export class KeyHolder {
|
|
2
|
+
|
|
3
|
+
private key: number;
|
|
4
|
+
public keys: Record<string, number>;
|
|
5
|
+
|
|
6
|
+
constructor() {
|
|
7
|
+
this.key = 1;
|
|
8
|
+
this.keys = {};
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
public createKey(tag: string): void {
|
|
12
|
+
this.key++;
|
|
13
|
+
this.keys[tag] = this.key;
|
|
14
|
+
}
|
|
15
|
+
public createKeys(tags: string[]): void {
|
|
16
|
+
for (const tag of tags) this.createKey(tag);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
public get(key: string): number {
|
|
20
|
+
return this.keys[key];
|
|
21
|
+
}
|
|
22
|
+
public getChar(key: string): string {
|
|
23
|
+
return String.fromCodePoint(this.get(key));
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import * as WS from 'ws';
|
|
2
|
+
import { KeyHolder } from '../KeyHolder';
|
|
3
|
+
|
|
4
|
+
export class SonicWS {
|
|
5
|
+
private ws: WS.WebSocket;
|
|
6
|
+
|
|
7
|
+
private listeners: {
|
|
8
|
+
message: Array<(data: string) => void>,
|
|
9
|
+
close: Array<(event: CloseEvent) => void>
|
|
10
|
+
event: {[key: string]: Array<(key: string) => void>}
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
public clientKeys: KeyHolder;
|
|
14
|
+
public serverKeys: KeyHolder;
|
|
15
|
+
|
|
16
|
+
constructor(url: string, options?: WS.ClientOptions) {
|
|
17
|
+
this.ws = new WS.WebSocket(url, options);
|
|
18
|
+
|
|
19
|
+
this.listeners = {
|
|
20
|
+
message: [],
|
|
21
|
+
close: [],
|
|
22
|
+
event: {},
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
this.clientKeys = new KeyHolder();
|
|
26
|
+
this.serverKeys = new KeyHolder();
|
|
27
|
+
|
|
28
|
+
this.ws.on('message', (data: string) => {
|
|
29
|
+
data = data.toString();
|
|
30
|
+
|
|
31
|
+
this.listeners.message.forEach(listener => listener(data));
|
|
32
|
+
|
|
33
|
+
if(data.length < 1) return;
|
|
34
|
+
|
|
35
|
+
const key = data.substring(0, 1);
|
|
36
|
+
const value = data.substring(1);
|
|
37
|
+
|
|
38
|
+
this.listeners.event[key.codePointAt(0)!]?.forEach(l => l(value));
|
|
39
|
+
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
this.ws.on('close', (event: CloseEvent) => {
|
|
43
|
+
this.listeners.close.forEach(listener => listener(event));
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
public raw_onmessage(listener: (data: string) => void): void {
|
|
48
|
+
this.listeners.message.push(listener);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
public raw_onclose(listener: (event: CloseEvent) => void): void {
|
|
52
|
+
this.listeners.close.push(listener);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
public send(key: string, value: string): void {
|
|
56
|
+
const code = this.clientKeys.getChar(key);
|
|
57
|
+
if (code == null) throw new Error(`Key "${key}" has not been created!`);
|
|
58
|
+
|
|
59
|
+
this.ws.send(code + value);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
public on_ready(listener: () => void): void {
|
|
63
|
+
this.ws.on('open', listener);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
public on(key: string, listener: (value: string) => void) {
|
|
67
|
+
this.listeners.event[this.serverKeys.get(key)].push(listener);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
public createClientKeys(...keys: string[]) {
|
|
71
|
+
this.clientKeys.createKeys(keys);
|
|
72
|
+
}
|
|
73
|
+
public createServerKeys(...keys: string[]) {
|
|
74
|
+
this.serverKeys.createKeys(keys);
|
|
75
|
+
for(const key of keys) {
|
|
76
|
+
this.listeners.event[this.serverKeys.get(key)] = [];
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import * as WS from 'ws';
|
|
2
|
+
import { SonicWSServer } from './SonicWSServer';
|
|
3
|
+
|
|
4
|
+
export class SonicWSConnection {
|
|
5
|
+
private socket: WS.WebSocket;
|
|
6
|
+
private host: SonicWSServer;
|
|
7
|
+
private listeners: Record<string, Array<(value: string) => void>>;
|
|
8
|
+
|
|
9
|
+
constructor(socket: WS.WebSocket, host: SonicWSServer) {
|
|
10
|
+
this.socket = socket;
|
|
11
|
+
this.host = host;
|
|
12
|
+
|
|
13
|
+
this.listeners = {};
|
|
14
|
+
for (const key of Object.values(host.clientKeys.keys)) {
|
|
15
|
+
this.listeners[String.fromCodePoint(key)] = [];
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
this.socket.on('message', (data: WS.RawData) => {
|
|
19
|
+
const message = data.toString();
|
|
20
|
+
|
|
21
|
+
if (message.length < 1) {
|
|
22
|
+
this.socket.close();
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
const key = message.substring(0, 1);
|
|
27
|
+
const value = message.substring(1);
|
|
28
|
+
|
|
29
|
+
if(!this.listeners[key]) {
|
|
30
|
+
this.socket.close();
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
this.listeners[key].forEach(listener => listener(value));
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
public raw_send(data: string): void {
|
|
39
|
+
this.socket.send(data);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/** Listens for when the client sends a message. This will use the server's key system */
|
|
43
|
+
public on(key: string, listener: (value: string) => void): void {
|
|
44
|
+
const code = this.host.clientKeys.getChar(key);
|
|
45
|
+
if (code == null) throw new Error(`Key "${key}" has not been created!`);
|
|
46
|
+
|
|
47
|
+
if (!this.listeners[code]) this.listeners[code] = [];
|
|
48
|
+
|
|
49
|
+
this.listeners[code].push(listener);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
public send(key: string, value: string) {
|
|
53
|
+
const code = this.host.serverKeys.getChar(key);
|
|
54
|
+
if(code == null) throw new Error(`Key "${key}" has not been created!`);
|
|
55
|
+
|
|
56
|
+
this.socket.send(code + value);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import * as WS from 'ws';
|
|
2
|
+
import { SonicWSConnection } from './SonicWSConnection';
|
|
3
|
+
import { KeyHolder } from '../KeyHolder';
|
|
4
|
+
|
|
5
|
+
export class SonicWSServer {
|
|
6
|
+
private ws: WS.WebSocketServer;
|
|
7
|
+
|
|
8
|
+
public clientKeys: KeyHolder;
|
|
9
|
+
public serverKeys: KeyHolder;
|
|
10
|
+
|
|
11
|
+
constructor(options: WS.ServerOptions) {
|
|
12
|
+
this.ws = new WS.WebSocketServer(options);
|
|
13
|
+
|
|
14
|
+
this.clientKeys = new KeyHolder();
|
|
15
|
+
this.serverKeys = new KeyHolder();
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
public createClientKeys(...keys: string[]) {
|
|
19
|
+
this.clientKeys.createKeys(keys);
|
|
20
|
+
}
|
|
21
|
+
public createServerKeys(...keys: string[]) {
|
|
22
|
+
this.serverKeys.createKeys(keys);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
public on_connect(runner: (client: SonicWSConnection) => void): void {
|
|
26
|
+
this.ws.on('connection', (socket) => runner(new SonicWSConnection(socket, this)));
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
public on_ready(runner: () => void): void {
|
|
30
|
+
this.ws.on('listening', runner);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
}
|
package/tsconfig.json
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "es5",
|
|
4
|
+
"module": "commonjs",
|
|
5
|
+
"strict": true,
|
|
6
|
+
"esModuleInterop": true,
|
|
7
|
+
"skipLibCheck": true,
|
|
8
|
+
"forceConsistentCasingInFileNames": true,
|
|
9
|
+
"outDir": "./dist/",
|
|
10
|
+
"declaration": true,
|
|
11
|
+
"rootDir": "./src/",
|
|
12
|
+
"lib":["es2015","dom"],
|
|
13
|
+
},
|
|
14
|
+
"include": ["./src/**/*"],
|
|
15
|
+
"exclude": ["node_modules"]
|
|
16
|
+
}
|