@4players/odin-common 1.5.1 → 1.6.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/CHANGELOG.md CHANGED
@@ -1,5 +1,9 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.6.0
4
+
5
+ - Removed unused WebSocket and RPC functionality
6
+
3
7
  ## 1.5.0
4
8
 
5
9
  - Added `generateUUID`
package/lib/cjs/index.js CHANGED
@@ -29,12 +29,10 @@ __exportStar(require("./utility/iterable"), exports);
29
29
  __exportStar(require("./utility/environment"), exports);
30
30
  __exportStar(require("./utility/json"), exports);
31
31
  __exportStar(require("./utility/result"), exports);
32
- __exportStar(require("./utility/rpc"), exports);
33
32
  __exportStar(require("./utility/selector"), exports);
34
33
  __exportStar(require("./utility/sleep"), exports);
35
34
  __exportStar(require("./utility/strand"), exports);
36
35
  __exportStar(require("./utility/url"), exports);
37
36
  __exportStar(require("./utility/uuid"), exports);
38
37
  __exportStar(require("./utility/validation"), exports);
39
- __exportStar(require("./utility/websocket"), exports);
40
38
  __exportStar(require("./plugin/api"), exports);
package/lib/esm/index.js CHANGED
@@ -13,12 +13,10 @@ export * from './utility/iterable';
13
13
  export * from './utility/environment';
14
14
  export * from './utility/json';
15
15
  export * from './utility/result';
16
- export * from './utility/rpc';
17
16
  export * from './utility/selector';
18
17
  export * from './utility/sleep';
19
18
  export * from './utility/strand';
20
19
  export * from './utility/url';
21
20
  export * from './utility/uuid';
22
21
  export * from './utility/validation';
23
- export * from './utility/websocket';
24
22
  export * from './plugin/api';
package/lib/index.d.ts CHANGED
@@ -13,12 +13,10 @@ export * from './utility/iterable';
13
13
  export * from './utility/environment';
14
14
  export * from './utility/json';
15
15
  export * from './utility/result';
16
- export * from './utility/rpc';
17
16
  export * from './utility/selector';
18
17
  export * from './utility/sleep';
19
18
  export * from './utility/strand';
20
19
  export * from './utility/url';
21
20
  export * from './utility/uuid';
22
21
  export * from './utility/validation';
23
- export * from './utility/websocket';
24
22
  export * from './plugin/api';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@4players/odin-common",
3
- "version": "1.5.1",
3
+ "version": "1.6.0",
4
4
  "description": "A collection of commonly used type definitions and utility functions across ODIN web projects",
5
5
  "author": "Josho Bleicker <josho.bleicker@4players.io> (https://www.4players.io)",
6
6
  "homepage": "https://www.4players.io",
@@ -27,13 +27,11 @@
27
27
  "dependencies": {
28
28
  "@msgpack/msgpack": "~3.0.0-beta2",
29
29
  "uuid": "~9.0.0",
30
- "ws": "~8.16.0",
31
30
  "zod": "~3.22.0"
32
31
  },
33
32
  "devDependencies": {
34
33
  "@types/node": "~20.11.0",
35
34
  "@types/uuid": "~9.0.0",
36
- "@types/ws": "~8.5.0",
37
35
  "@typescript-eslint/eslint-plugin": "~7.1.0",
38
36
  "@typescript-eslint/parser": "~7.1.0",
39
37
  "eslint": "~8.57.0",
@@ -1,225 +0,0 @@
1
- "use strict";
2
- /* eslint-disable no-dupe-class-members */
3
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
4
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
5
- return new (P || (P = Promise))(function (resolve, reject) {
6
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
7
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
8
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
9
- step((generator = generator.apply(thisArg, _arguments || [])).next());
10
- });
11
- };
12
- Object.defineProperty(exports, "__esModule", { value: true });
13
- exports.isKnownRpcMessage = exports.parseRpcMessage = exports.parseRpc = exports.TypedRpcConnection = exports.RpcConnection = exports.msgpackDecode = exports.msgpackEncode = void 0;
14
- const msgpack = require("@msgpack/msgpack");
15
- const serialization_1 = require("../schema/serialization");
16
- const result_1 = require("./result");
17
- function msgpackEncode(value) {
18
- return msgpack.encode(value);
19
- }
20
- exports.msgpackEncode = msgpackEncode;
21
- function msgpackDecode(buffer) {
22
- return msgpack.decode(buffer);
23
- }
24
- exports.msgpackDecode = msgpackDecode;
25
- class RpcConnection {
26
- get closed() {
27
- return this._Close.signal.aborted;
28
- }
29
- get closeSignal() {
30
- return this._Close.signal;
31
- }
32
- constructor(webSocket) {
33
- this.webSocket = webSocket;
34
- this._SendQueue = [];
35
- this._RecvQueue = [];
36
- this._Requests = new Map();
37
- this._Close = new AbortController();
38
- this._NextId = 1;
39
- this.webSocket.addEventListener('open', this._OnWebSocketOpen.bind(this));
40
- this.webSocket.addEventListener('close', this.close.bind(this));
41
- this.webSocket.addEventListener('message', this._OnWebSocketMessage.bind(this));
42
- this.webSocket.binaryType = 'arraybuffer';
43
- this._Close.signal.addEventListener('abort', this._Cleanup.bind(this), {
44
- once: true,
45
- });
46
- }
47
- request(name, properties, timeout) {
48
- return __awaiter(this, void 0, void 0, function* () {
49
- if (this.closed) {
50
- return Promise.resolve('closed');
51
- }
52
- const id = this._NextId;
53
- const timeoutId = timeout === undefined
54
- ? undefined
55
- : setTimeout(() => this._TimeoutRequest(id), timeout);
56
- this._Send([0, id, name, properties]);
57
- return new Promise((resolve) => {
58
- this._Requests.set(id, { resolve, timeoutId });
59
- this._NextId += 1;
60
- });
61
- });
62
- }
63
- notify(name, properties) {
64
- if (this.closed === false) {
65
- this._Send([2, name, properties]);
66
- }
67
- }
68
- recv() {
69
- if (this.closed === false) {
70
- return new Promise((resolve) => this._RecvQueue.push(resolve));
71
- }
72
- else {
73
- return Promise.resolve('closed');
74
- }
75
- }
76
- close() {
77
- this._Close.abort();
78
- }
79
- _TimeoutRequest(requestId) {
80
- const request = this._Requests.get(requestId);
81
- if (request === undefined)
82
- return;
83
- this._Requests.delete(requestId);
84
- clearTimeout(request.timeoutId);
85
- request.resolve('timeout');
86
- }
87
- _Send(message) {
88
- this.webSocket.send(msgpack.encode(message));
89
- }
90
- _OnWebSocketOpen(ev) {
91
- for (const data in this._SendQueue) {
92
- this.webSocket.send(data);
93
- }
94
- this._SendQueue.length = 0;
95
- }
96
- _OnWebSocketMessage(ev) {
97
- const rpc = parseRpc(ev.data);
98
- if (rpc.type !== 'Success') {
99
- this.webSocket.close();
100
- return;
101
- }
102
- switch (rpc.value[0]) {
103
- case 0:
104
- this._Send([1, rpc.value[1], 'not supported', undefined]);
105
- break;
106
- case 1:
107
- this._OnResponse(rpc.value[1], rpc.value[2], rpc.value[3]);
108
- break;
109
- case 2:
110
- this._OnEvent(rpc.value[1], rpc.value[2]);
111
- break;
112
- }
113
- }
114
- _OnResponse(id, error, result) {
115
- const request = this._Requests.get(id);
116
- if (request === undefined)
117
- return;
118
- clearTimeout(request.timeoutId);
119
- request.resolve(error === null ? (0, result_1.success)(result) : (0, result_1.failure)(error));
120
- }
121
- _OnEvent(name, properties) {
122
- const receiver = this._RecvQueue.shift();
123
- if (receiver !== undefined) {
124
- receiver({ name, properties });
125
- }
126
- }
127
- _Cleanup() {
128
- for (const request of this._Requests.values()) {
129
- clearTimeout(request.timeoutId);
130
- request.resolve('closed');
131
- }
132
- this._Requests.clear();
133
- for (const accept of this._RecvQueue) {
134
- accept('closed');
135
- }
136
- this._RecvQueue.length = 0;
137
- this._SendQueue.length = 0;
138
- this.webSocket.close();
139
- }
140
- }
141
- exports.RpcConnection = RpcConnection;
142
- class TypedRpcConnection extends RpcConnection {
143
- constructor(webSocket, _Commands, _Events) {
144
- super(webSocket);
145
- this._Commands = _Commands;
146
- this._Events = _Events;
147
- }
148
- request(name, properties, timeout) {
149
- const _super = Object.create(null, {
150
- request: { get: () => super.request }
151
- });
152
- return __awaiter(this, void 0, void 0, function* () {
153
- properties = this._Commands[name].request.parse(properties);
154
- const response = yield (timeout !== undefined
155
- ? _super.request.call(this, name, properties, timeout)
156
- : _super.request.call(this, name, properties));
157
- if (response === 'closed' ||
158
- response === 'timeout' ||
159
- response.type === 'Failure') {
160
- return response;
161
- }
162
- const parsed = this._Commands[name].response.safeParse(response.value);
163
- if (parsed.success) {
164
- response.value = parsed.data;
165
- return response;
166
- }
167
- else {
168
- return (0, result_1.failure)(`response schema failed validation: ${parsed.error}`);
169
- }
170
- });
171
- }
172
- notify(name, properties) {
173
- properties = this._Commands[name].request.parse(properties);
174
- super.notify(name, properties);
175
- }
176
- recv() {
177
- const _super = Object.create(null, {
178
- recv: { get: () => super.recv }
179
- });
180
- return __awaiter(this, void 0, void 0, function* () {
181
- const event = yield _super.recv.call(this);
182
- if (event === 'closed')
183
- return event;
184
- const parsed = parseRpcMessage(this._Events, event);
185
- if (parsed !== undefined) {
186
- return parsed;
187
- }
188
- if (!isKnownRpcMessage(this._Events, event.name)) {
189
- console.warn(`dropping unknown event ${event.name}`);
190
- }
191
- else {
192
- console.error(`schema validation for ${event.name} failed; closing connection`);
193
- this.close();
194
- }
195
- return 'closed';
196
- });
197
- }
198
- }
199
- exports.TypedRpcConnection = TypedRpcConnection;
200
- function parseRpc(buffer) {
201
- try {
202
- return (0, result_1.success)(serialization_1.MessagePackRpcSchema.parse(msgpackDecode(buffer)));
203
- }
204
- catch (error) {
205
- return (0, result_1.failure)(String(error));
206
- }
207
- }
208
- exports.parseRpc = parseRpc;
209
- function parseRpcMessage(events, rpc) {
210
- if (!isKnownRpcMessage(events, rpc.name))
211
- return undefined;
212
- const parsed = events[rpc.name].safeParse(rpc.properties);
213
- if (!parsed.success) {
214
- return undefined;
215
- }
216
- return {
217
- name: rpc.name,
218
- properties: parsed.data,
219
- };
220
- }
221
- exports.parseRpcMessage = parseRpcMessage;
222
- function isKnownRpcMessage(events, name) {
223
- return name in events;
224
- }
225
- exports.isKnownRpcMessage = isKnownRpcMessage;
@@ -1,86 +0,0 @@
1
- "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
- Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.webSocketConnectOnce = exports.webSocketConnect = exports.WebSocketClient = void 0;
13
- const ws_1 = require("ws");
14
- Object.defineProperty(exports, "WebSocketClient", { enumerable: true, get: function () { return ws_1.WebSocket; } });
15
- const result_1 = require("./result");
16
- const sleep_1 = require("./sleep");
17
- function webSocketConnect(url, connectIntervals, clientOptions, onFailure) {
18
- return __awaiter(this, void 0, void 0, function* () {
19
- const start = performance.now();
20
- let connection = (0, result_1.failure)('no connection was attempted');
21
- let cancelled = false;
22
- const cancel = () => {
23
- cancelled = true;
24
- };
25
- const connect = () => __awaiter(this, void 0, void 0, function* () {
26
- for (let failures = 0; failures < connectIntervals.length && !cancelled; failures++) {
27
- const nextReconnectAt = start + whenToConnect(failures, connectIntervals);
28
- yield (0, sleep_1.sleep)(nextReconnectAt - performance.now(), 'interval');
29
- if (cancelled) {
30
- return (0, result_1.failure)('cancelled');
31
- }
32
- connection = yield webSocketConnectOnce(url, clientOptions);
33
- if (connection.type === 'Success') {
34
- return connection;
35
- }
36
- else if (onFailure !== undefined) {
37
- onFailure(failures + 1, cancel);
38
- }
39
- }
40
- return connection;
41
- });
42
- return { connect, cancel };
43
- });
44
- }
45
- exports.webSocketConnect = webSocketConnect;
46
- function webSocketConnectOnce(url, clientOptions) {
47
- return __awaiter(this, void 0, void 0, function* () {
48
- let webSocket;
49
- try {
50
- webSocket = new ws_1.WebSocket(url, clientOptions);
51
- }
52
- catch (reason) {
53
- return (0, result_1.failure)(`unable to create websocket; ${reason}`);
54
- }
55
- return new Promise((resolve) => {
56
- const onOpen = () => {
57
- cleanup();
58
- resolve((0, result_1.success)(webSocket));
59
- };
60
- const onError = (event) => {
61
- cleanup();
62
- resolve((0, result_1.failure)(event.message));
63
- };
64
- const onClose = (event) => {
65
- cleanup();
66
- resolve((0, result_1.failure)(event.reason));
67
- };
68
- const cleanup = () => {
69
- webSocket.removeEventListener('open', onOpen);
70
- webSocket.removeEventListener('error', onError);
71
- webSocket.removeEventListener('close', onClose);
72
- };
73
- webSocket.addEventListener('open', onOpen);
74
- webSocket.addEventListener('error', onError);
75
- webSocket.addEventListener('close', onClose);
76
- });
77
- });
78
- }
79
- exports.webSocketConnectOnce = webSocketConnectOnce;
80
- function whenToConnect(failures, connectIntervals) {
81
- const past_connects = connectIntervals
82
- .slice(0, failures)
83
- .reduce((a, b) => a + b, 0);
84
- const interval = connectIntervals[failures] * Math.random();
85
- return past_connects + interval;
86
- }
@@ -1,215 +0,0 @@
1
- /* eslint-disable no-dupe-class-members */
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
- import * as msgpack from '@msgpack/msgpack';
12
- import { MessagePackRpcSchema } from '../schema/serialization';
13
- import { failure, success } from './result';
14
- export function msgpackEncode(value) {
15
- return msgpack.encode(value);
16
- }
17
- export function msgpackDecode(buffer) {
18
- return msgpack.decode(buffer);
19
- }
20
- export class RpcConnection {
21
- get closed() {
22
- return this._Close.signal.aborted;
23
- }
24
- get closeSignal() {
25
- return this._Close.signal;
26
- }
27
- constructor(webSocket) {
28
- this.webSocket = webSocket;
29
- this._SendQueue = [];
30
- this._RecvQueue = [];
31
- this._Requests = new Map();
32
- this._Close = new AbortController();
33
- this._NextId = 1;
34
- this.webSocket.addEventListener('open', this._OnWebSocketOpen.bind(this));
35
- this.webSocket.addEventListener('close', this.close.bind(this));
36
- this.webSocket.addEventListener('message', this._OnWebSocketMessage.bind(this));
37
- this.webSocket.binaryType = 'arraybuffer';
38
- this._Close.signal.addEventListener('abort', this._Cleanup.bind(this), {
39
- once: true,
40
- });
41
- }
42
- request(name, properties, timeout) {
43
- return __awaiter(this, void 0, void 0, function* () {
44
- if (this.closed) {
45
- return Promise.resolve('closed');
46
- }
47
- const id = this._NextId;
48
- const timeoutId = timeout === undefined
49
- ? undefined
50
- : setTimeout(() => this._TimeoutRequest(id), timeout);
51
- this._Send([0, id, name, properties]);
52
- return new Promise((resolve) => {
53
- this._Requests.set(id, { resolve, timeoutId });
54
- this._NextId += 1;
55
- });
56
- });
57
- }
58
- notify(name, properties) {
59
- if (this.closed === false) {
60
- this._Send([2, name, properties]);
61
- }
62
- }
63
- recv() {
64
- if (this.closed === false) {
65
- return new Promise((resolve) => this._RecvQueue.push(resolve));
66
- }
67
- else {
68
- return Promise.resolve('closed');
69
- }
70
- }
71
- close() {
72
- this._Close.abort();
73
- }
74
- _TimeoutRequest(requestId) {
75
- const request = this._Requests.get(requestId);
76
- if (request === undefined)
77
- return;
78
- this._Requests.delete(requestId);
79
- clearTimeout(request.timeoutId);
80
- request.resolve('timeout');
81
- }
82
- _Send(message) {
83
- this.webSocket.send(msgpack.encode(message));
84
- }
85
- _OnWebSocketOpen(ev) {
86
- for (const data in this._SendQueue) {
87
- this.webSocket.send(data);
88
- }
89
- this._SendQueue.length = 0;
90
- }
91
- _OnWebSocketMessage(ev) {
92
- const rpc = parseRpc(ev.data);
93
- if (rpc.type !== 'Success') {
94
- this.webSocket.close();
95
- return;
96
- }
97
- switch (rpc.value[0]) {
98
- case 0:
99
- this._Send([1, rpc.value[1], 'not supported', undefined]);
100
- break;
101
- case 1:
102
- this._OnResponse(rpc.value[1], rpc.value[2], rpc.value[3]);
103
- break;
104
- case 2:
105
- this._OnEvent(rpc.value[1], rpc.value[2]);
106
- break;
107
- }
108
- }
109
- _OnResponse(id, error, result) {
110
- const request = this._Requests.get(id);
111
- if (request === undefined)
112
- return;
113
- clearTimeout(request.timeoutId);
114
- request.resolve(error === null ? success(result) : failure(error));
115
- }
116
- _OnEvent(name, properties) {
117
- const receiver = this._RecvQueue.shift();
118
- if (receiver !== undefined) {
119
- receiver({ name, properties });
120
- }
121
- }
122
- _Cleanup() {
123
- for (const request of this._Requests.values()) {
124
- clearTimeout(request.timeoutId);
125
- request.resolve('closed');
126
- }
127
- this._Requests.clear();
128
- for (const accept of this._RecvQueue) {
129
- accept('closed');
130
- }
131
- this._RecvQueue.length = 0;
132
- this._SendQueue.length = 0;
133
- this.webSocket.close();
134
- }
135
- }
136
- export class TypedRpcConnection extends RpcConnection {
137
- constructor(webSocket, _Commands, _Events) {
138
- super(webSocket);
139
- this._Commands = _Commands;
140
- this._Events = _Events;
141
- }
142
- request(name, properties, timeout) {
143
- const _super = Object.create(null, {
144
- request: { get: () => super.request }
145
- });
146
- return __awaiter(this, void 0, void 0, function* () {
147
- properties = this._Commands[name].request.parse(properties);
148
- const response = yield (timeout !== undefined
149
- ? _super.request.call(this, name, properties, timeout)
150
- : _super.request.call(this, name, properties));
151
- if (response === 'closed' ||
152
- response === 'timeout' ||
153
- response.type === 'Failure') {
154
- return response;
155
- }
156
- const parsed = this._Commands[name].response.safeParse(response.value);
157
- if (parsed.success) {
158
- response.value = parsed.data;
159
- return response;
160
- }
161
- else {
162
- return failure(`response schema failed validation: ${parsed.error}`);
163
- }
164
- });
165
- }
166
- notify(name, properties) {
167
- properties = this._Commands[name].request.parse(properties);
168
- super.notify(name, properties);
169
- }
170
- recv() {
171
- const _super = Object.create(null, {
172
- recv: { get: () => super.recv }
173
- });
174
- return __awaiter(this, void 0, void 0, function* () {
175
- const event = yield _super.recv.call(this);
176
- if (event === 'closed')
177
- return event;
178
- const parsed = parseRpcMessage(this._Events, event);
179
- if (parsed !== undefined) {
180
- return parsed;
181
- }
182
- if (!isKnownRpcMessage(this._Events, event.name)) {
183
- console.warn(`dropping unknown event ${event.name}`);
184
- }
185
- else {
186
- console.error(`schema validation for ${event.name} failed; closing connection`);
187
- this.close();
188
- }
189
- return 'closed';
190
- });
191
- }
192
- }
193
- export function parseRpc(buffer) {
194
- try {
195
- return success(MessagePackRpcSchema.parse(msgpackDecode(buffer)));
196
- }
197
- catch (error) {
198
- return failure(String(error));
199
- }
200
- }
201
- export function parseRpcMessage(events, rpc) {
202
- if (!isKnownRpcMessage(events, rpc.name))
203
- return undefined;
204
- const parsed = events[rpc.name].safeParse(rpc.properties);
205
- if (!parsed.success) {
206
- return undefined;
207
- }
208
- return {
209
- name: rpc.name,
210
- properties: parsed.data,
211
- };
212
- }
213
- export function isKnownRpcMessage(events, name) {
214
- return name in events;
215
- }
@@ -1,81 +0,0 @@
1
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
- return new (P || (P = Promise))(function (resolve, reject) {
4
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
- step((generator = generator.apply(thisArg, _arguments || [])).next());
8
- });
9
- };
10
- import { WebSocket as WebSocketClient, } from 'ws';
11
- import { failure, success } from './result';
12
- import { sleep } from './sleep';
13
- export { WebSocketClient, };
14
- export function webSocketConnect(url, connectIntervals, clientOptions, onFailure) {
15
- return __awaiter(this, void 0, void 0, function* () {
16
- const start = performance.now();
17
- let connection = failure('no connection was attempted');
18
- let cancelled = false;
19
- const cancel = () => {
20
- cancelled = true;
21
- };
22
- const connect = () => __awaiter(this, void 0, void 0, function* () {
23
- for (let failures = 0; failures < connectIntervals.length && !cancelled; failures++) {
24
- const nextReconnectAt = start + whenToConnect(failures, connectIntervals);
25
- yield sleep(nextReconnectAt - performance.now(), 'interval');
26
- if (cancelled) {
27
- return failure('cancelled');
28
- }
29
- connection = yield webSocketConnectOnce(url, clientOptions);
30
- if (connection.type === 'Success') {
31
- return connection;
32
- }
33
- else if (onFailure !== undefined) {
34
- onFailure(failures + 1, cancel);
35
- }
36
- }
37
- return connection;
38
- });
39
- return { connect, cancel };
40
- });
41
- }
42
- export function webSocketConnectOnce(url, clientOptions) {
43
- return __awaiter(this, void 0, void 0, function* () {
44
- let webSocket;
45
- try {
46
- webSocket = new WebSocketClient(url, clientOptions);
47
- }
48
- catch (reason) {
49
- return failure(`unable to create websocket; ${reason}`);
50
- }
51
- return new Promise((resolve) => {
52
- const onOpen = () => {
53
- cleanup();
54
- resolve(success(webSocket));
55
- };
56
- const onError = (event) => {
57
- cleanup();
58
- resolve(failure(event.message));
59
- };
60
- const onClose = (event) => {
61
- cleanup();
62
- resolve(failure(event.reason));
63
- };
64
- const cleanup = () => {
65
- webSocket.removeEventListener('open', onOpen);
66
- webSocket.removeEventListener('error', onError);
67
- webSocket.removeEventListener('close', onClose);
68
- };
69
- webSocket.addEventListener('open', onOpen);
70
- webSocket.addEventListener('error', onError);
71
- webSocket.addEventListener('close', onClose);
72
- });
73
- });
74
- }
75
- function whenToConnect(failures, connectIntervals) {
76
- const past_connects = connectIntervals
77
- .slice(0, failures)
78
- .reduce((a, b) => a + b, 0);
79
- const interval = connectIntervals[failures] * Math.random();
80
- return past_connects + interval;
81
- }
@@ -1,59 +0,0 @@
1
- /// <reference types="ws" />
2
- import * as z from 'zod';
3
- import { MessagePackRpc } from '../schema/serialization';
4
- import { Accept, Result } from './result';
5
- import { Commands } from '../rpc/commands';
6
- import { Notifications } from '../rpc/notifications';
7
- import { WebSocketClient } from './websocket';
8
- export declare function msgpackEncode(value: unknown): ArrayBuffer;
9
- export declare function msgpackDecode(buffer: ArrayBuffer): unknown;
10
- export interface RpcMessage {
11
- name: string;
12
- properties: unknown;
13
- }
14
- export interface RpcRequest {
15
- resolve: Accept<Result<unknown> | 'closed' | 'timeout'>;
16
- timeoutId: ReturnType<typeof setTimeout> | undefined;
17
- }
18
- export declare class RpcConnection {
19
- readonly webSocket: WebSocketClient;
20
- private readonly _SendQueue;
21
- private readonly _RecvQueue;
22
- private readonly _Requests;
23
- private readonly _Close;
24
- private _NextId;
25
- get closed(): boolean;
26
- get closeSignal(): AbortSignal;
27
- constructor(webSocket: WebSocketClient);
28
- request(name: string, properties: unknown): Promise<Result<unknown> | 'closed'>;
29
- request(name: string, properties: unknown, timeout: number): Promise<Result<unknown> | 'closed' | 'timeout'>;
30
- notify(name: string, properties: unknown): void;
31
- recv(): Promise<RpcMessage | 'closed'>;
32
- close(): void;
33
- private _TimeoutRequest;
34
- private _Send;
35
- private _OnWebSocketOpen;
36
- private _OnWebSocketMessage;
37
- private _OnResponse;
38
- private _OnEvent;
39
- private _Cleanup;
40
- }
41
- export interface TypedRpcMessage<Name extends string, Properties> extends RpcMessage {
42
- name: Name;
43
- properties: Properties;
44
- }
45
- export type RealizedEvents<E extends Notifications> = {
46
- [Name in Extract<keyof E, string>]: TypedRpcMessage<Name, z.infer<E[Name]>>;
47
- }[Extract<keyof E, string>];
48
- export declare class TypedRpcConnection<C extends Commands, E extends Notifications> extends RpcConnection {
49
- readonly _Commands: C;
50
- readonly _Events: E;
51
- constructor(webSocket: WebSocketClient, _Commands: C, _Events: E);
52
- request<Name extends Extract<keyof C, string>>(name: Name, properties: z.infer<C[Name]['request']>): Promise<Result<z.infer<C[Name]['response']>> | 'closed'>;
53
- request<Name extends Extract<keyof C, string>>(name: Name, properties: z.infer<C[Name]['request']>, timeout: number): Promise<Result<z.infer<C[Name]['response']>> | 'closed' | 'timeout'>;
54
- notify<Name extends Extract<keyof C, string>>(name: Name, properties: z.infer<C[Name]['request']>): void;
55
- recv(): Promise<RealizedEvents<E> | 'closed'>;
56
- }
57
- export declare function parseRpc(buffer: ArrayBuffer): Result<MessagePackRpc>;
58
- export declare function parseRpcMessage<E extends Notifications>(events: E, rpc: RpcMessage): RealizedEvents<E> | undefined;
59
- export declare function isKnownRpcMessage<E extends Notifications>(events: E, name: string): name is Extract<keyof E, string>;
@@ -1,8 +0,0 @@
1
- import { WebSocket as WebSocketClient, ClientOptions as WebSocketClientOptions, CloseEvent as WebSocketCloseEvent, ErrorEvent as WebSocketErrorEvent, MessageEvent as WebSocketMessageEvent, EventListenerOptions as WebSocketEventListenerOptions, Event as WebSocketEvent } from 'ws';
2
- import { Result } from './result';
3
- export { WebSocketClient, WebSocketClientOptions, WebSocketCloseEvent, WebSocketErrorEvent, WebSocketMessageEvent, WebSocketEventListenerOptions, WebSocketEvent, };
4
- export declare function webSocketConnect(url: URL, connectIntervals: number[], clientOptions?: WebSocketClientOptions, onFailure?: (failures: number, cancel: () => void) => void): Promise<{
5
- connect: () => Promise<Result<WebSocketClient>>;
6
- cancel: () => void;
7
- }>;
8
- export declare function webSocketConnectOnce(url: URL, clientOptions?: WebSocketClientOptions): Promise<Result<WebSocketClient>>;