nydus-client 4.0.6 → 5.1.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/dist/index.d.ts +51 -11
- package/dist/index.js +250 -0
- package/dist/index.js.map +1 -0
- package/package.json +41 -36
- package/dist/cjs/index.js +0 -244
- package/dist/cjs/index.js.map +0 -1
- package/dist/cjs/typed-emitter.js +0 -39
- package/dist/cjs/typed-emitter.js.map +0 -1
- package/dist/modules/index.js +0 -235
- package/dist/modules/index.js.map +0 -1
- package/dist/modules/typed-emitter.js +0 -35
- package/dist/modules/typed-emitter.js.map +0 -1
- package/dist/typed-emitter.d.ts +0 -33
package/dist/index.d.ts
CHANGED
|
@@ -1,8 +1,41 @@
|
|
|
1
|
-
import { SocketOptions
|
|
2
|
-
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
import { SocketOptions, Socket } from 'engine.io-client';
|
|
2
|
+
export { protocolVersion } from 'nydus-protocol';
|
|
3
|
+
import { DefaultListener, TypedEmitter } from 'tiny-typed-emitter';
|
|
4
|
+
|
|
5
|
+
type EventMap = DefaultListener;
|
|
6
|
+
declare const TypedEventEmitter_base: {
|
|
7
|
+
new <T_1 extends EventMap>(): TypedEmitter<T_1>;
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* A typed version of the normal node EventEmitter class, such that emitted/handled events and
|
|
11
|
+
* their associated parameters can be type-checked properly.
|
|
12
|
+
*
|
|
13
|
+
* This uses typed-emitter under the hood, it just makes it easier to extend.
|
|
14
|
+
*
|
|
15
|
+
* Example:
|
|
16
|
+
* ```
|
|
17
|
+
* type FooEvents = {
|
|
18
|
+
* bar: (message: string) => void
|
|
19
|
+
* baz: (count: number, ...extras: any[]) => void
|
|
20
|
+
* }
|
|
21
|
+
*
|
|
22
|
+
* class Foo extends TypedEventEmitter<FooEvents> {
|
|
23
|
+
* constructor() {
|
|
24
|
+
* super()
|
|
25
|
+
* }
|
|
26
|
+
*
|
|
27
|
+
* test() {
|
|
28
|
+
* this.emit('bar', 'hello world')
|
|
29
|
+
* this.emit('baz', 5, 'extra', 'stuff', 'to', 'pass', 27)
|
|
30
|
+
* }
|
|
31
|
+
* }
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
declare abstract class TypedEventEmitter<T extends EventMap> extends TypedEventEmitter_base<T> {
|
|
35
|
+
constructor();
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
interface NydusClientOptions extends SocketOptions {
|
|
6
39
|
/**
|
|
7
40
|
* How long before a connection attempt should be considered failed. Optional, will not timeout
|
|
8
41
|
* if not specified.
|
|
@@ -25,15 +58,15 @@ export interface NydusClientOptions extends EngineIoSocketOptions {
|
|
|
25
58
|
*/
|
|
26
59
|
reconnectionJitter: number;
|
|
27
60
|
}
|
|
28
|
-
interface ExpandedSocket extends Omit<
|
|
61
|
+
interface ExpandedSocket extends Omit<Socket, 'readyState'> {
|
|
29
62
|
readonly readyState: string;
|
|
30
63
|
}
|
|
31
|
-
|
|
64
|
+
interface RouteInfo {
|
|
32
65
|
route: string;
|
|
33
66
|
params: Record<string, string>;
|
|
34
67
|
splats: string[];
|
|
35
68
|
}
|
|
36
|
-
|
|
69
|
+
type RouteHandler = (routeInfo: RouteInfo, data: any) => void;
|
|
37
70
|
type NydusEvents = {
|
|
38
71
|
/** Fired when the connection succeeds. */
|
|
39
72
|
connect: () => void;
|
|
@@ -48,6 +81,11 @@ type NydusEvents = {
|
|
|
48
81
|
}) => void;
|
|
49
82
|
/** Fired when a general error occurs. */
|
|
50
83
|
error: (err: Error) => void;
|
|
84
|
+
/**
|
|
85
|
+
* Fired when the server returns a 403 on connect. The client will not continue attempting
|
|
86
|
+
* to reconnect after this.
|
|
87
|
+
*/
|
|
88
|
+
unauthorized: () => void;
|
|
51
89
|
/** Fired when the connection attempt times out. */
|
|
52
90
|
connect_timeout: () => void;
|
|
53
91
|
/** Fired when the reconnection attempts exceeded the maximum allowed without success. */
|
|
@@ -55,12 +93,12 @@ type NydusEvents = {
|
|
|
55
93
|
/** Fired when the connection attempt failed. */
|
|
56
94
|
connect_failed: () => void;
|
|
57
95
|
};
|
|
58
|
-
|
|
96
|
+
declare class InvokeError extends Error {
|
|
59
97
|
readonly status: number;
|
|
60
98
|
readonly body: any;
|
|
61
99
|
constructor(message: string, status: number, body?: any);
|
|
62
100
|
}
|
|
63
|
-
|
|
101
|
+
declare class NydusClient extends TypedEventEmitter<NydusEvents> {
|
|
64
102
|
readonly host: string;
|
|
65
103
|
readonly opts: Partial<NydusClientOptions>;
|
|
66
104
|
conn: ExpandedSocket | null;
|
|
@@ -102,4 +140,6 @@ export declare class NydusClient extends TypedEventEmitter<NydusEvents> {
|
|
|
102
140
|
private onError;
|
|
103
141
|
clearConnectTimer(): void;
|
|
104
142
|
}
|
|
105
|
-
|
|
143
|
+
declare function createClient(host: string, opts?: Partial<NydusClientOptions>): NydusClient;
|
|
144
|
+
|
|
145
|
+
export { InvokeError, NydusClient, type NydusClientOptions, type RouteHandler, type RouteInfo, createClient as default };
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
// index.ts
|
|
2
|
+
import Backoff from "backo2";
|
|
3
|
+
import { Socket as EngineIoSocket } from "engine.io-client";
|
|
4
|
+
import { nanoid } from "nanoid";
|
|
5
|
+
import {
|
|
6
|
+
decode,
|
|
7
|
+
encode,
|
|
8
|
+
MessageType,
|
|
9
|
+
protocolVersion
|
|
10
|
+
} from "nydus-protocol";
|
|
11
|
+
import ruta from "ruta3";
|
|
12
|
+
|
|
13
|
+
// typed-emitter.ts
|
|
14
|
+
import { EventEmitter } from "events";
|
|
15
|
+
var TypedEventEmitter = class extends EventEmitter {
|
|
16
|
+
constructor() {
|
|
17
|
+
super();
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
// index.ts
|
|
22
|
+
function isTransportError(err) {
|
|
23
|
+
return err.type === "TransportError";
|
|
24
|
+
}
|
|
25
|
+
var InvokeError = class extends Error {
|
|
26
|
+
status;
|
|
27
|
+
body;
|
|
28
|
+
constructor(message, status, body) {
|
|
29
|
+
super(message);
|
|
30
|
+
this.status = status;
|
|
31
|
+
this.body = body;
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
var NydusClient = class extends TypedEventEmitter {
|
|
35
|
+
host;
|
|
36
|
+
opts;
|
|
37
|
+
conn = null;
|
|
38
|
+
outstanding = /* @__PURE__ */ new Map();
|
|
39
|
+
router = ruta();
|
|
40
|
+
backoff;
|
|
41
|
+
backoffTimer = null;
|
|
42
|
+
connectTimer = null;
|
|
43
|
+
wasOpened = false;
|
|
44
|
+
skipReconnect = false;
|
|
45
|
+
disconnectingPromise = void 0;
|
|
46
|
+
disconnectingResolver = void 0;
|
|
47
|
+
constructor(host, opts = {}) {
|
|
48
|
+
super();
|
|
49
|
+
this.host = host;
|
|
50
|
+
this.opts = opts;
|
|
51
|
+
this.opts.reconnectionAttempts = this.opts.reconnectionAttempts || Infinity;
|
|
52
|
+
this.backoff = new Backoff({
|
|
53
|
+
min: opts.reconnectionDelay || 1e3,
|
|
54
|
+
max: opts.reconnectionDelayMax || 1e4,
|
|
55
|
+
jitter: opts.reconnectionJitter || 0.5
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
// One of: opening, open, closing, closed.
|
|
59
|
+
get readyState() {
|
|
60
|
+
return this.conn != null ? this.conn.readyState : "closed";
|
|
61
|
+
}
|
|
62
|
+
doConnect() {
|
|
63
|
+
if (this.opts.connectTimeout) {
|
|
64
|
+
this.connectTimer = setTimeout(() => {
|
|
65
|
+
this.emit("connect_timeout");
|
|
66
|
+
this.disconnect();
|
|
67
|
+
this.skipReconnect = false;
|
|
68
|
+
this.onClose("connect timeout");
|
|
69
|
+
}, this.opts.connectTimeout);
|
|
70
|
+
}
|
|
71
|
+
this.conn = new EngineIoSocket(this.host, this.opts);
|
|
72
|
+
this.conn.on("open", this.onOpen.bind(this)).on("message", (data) => this.onMessage(data)).on("close", this.onClose.bind(this)).on("error", this.onError.bind(this));
|
|
73
|
+
}
|
|
74
|
+
// Connect to the server. If already connected, this will be a no-op.
|
|
75
|
+
connect() {
|
|
76
|
+
if (this.conn) {
|
|
77
|
+
if (this.conn.readyState === "closing") {
|
|
78
|
+
this.disconnectingPromise.then(() => {
|
|
79
|
+
this.connect();
|
|
80
|
+
}).catch((_err) => {
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
this.skipReconnect = false;
|
|
86
|
+
this.wasOpened = false;
|
|
87
|
+
this.doConnect();
|
|
88
|
+
}
|
|
89
|
+
reconnect() {
|
|
90
|
+
if (this.conn || this.skipReconnect || this.backoffTimer) {
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
if (this.backoff.attempts >= this.opts.reconnectionAttempts) {
|
|
94
|
+
this.backoff.reset();
|
|
95
|
+
this.emit("reconnect_failed");
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
this.backoffTimer = setTimeout(() => {
|
|
99
|
+
this.backoffTimer = null;
|
|
100
|
+
this.emit("reconnecting", this.backoff.attempts);
|
|
101
|
+
if (this.skipReconnect || this.conn) return;
|
|
102
|
+
this.doConnect();
|
|
103
|
+
}, this.backoff.duration());
|
|
104
|
+
}
|
|
105
|
+
// Disconnect from the server. If not already connected, this will be a no-op.
|
|
106
|
+
disconnect() {
|
|
107
|
+
this.skipReconnect = true;
|
|
108
|
+
if (this.backoffTimer) {
|
|
109
|
+
clearTimeout(this.backoffTimer);
|
|
110
|
+
this.backoffTimer = null;
|
|
111
|
+
}
|
|
112
|
+
if (!this.conn) return;
|
|
113
|
+
if (!this.disconnectingPromise) {
|
|
114
|
+
this.disconnectingPromise = new Promise((resolve) => {
|
|
115
|
+
this.disconnectingResolver = resolve;
|
|
116
|
+
}).catch((_err) => {
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
this.conn.close();
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Registers a handler function to respond to PUBLISHes to paths matching a specified pattern.
|
|
123
|
+
* Handlers are normal functions of the form:
|
|
124
|
+
* `function({ route, params, splats }, data)`
|
|
125
|
+
*
|
|
126
|
+
* PUBLISHes that don't match a route will be emitted as an 'unhandled' event on this object,
|
|
127
|
+
* which can be useful to track in development mode.
|
|
128
|
+
*/
|
|
129
|
+
registerRoute(pathPattern, handler) {
|
|
130
|
+
this.router.addRoute(pathPattern, handler);
|
|
131
|
+
}
|
|
132
|
+
onPublish({ path, data }) {
|
|
133
|
+
const route = this.router.match(path);
|
|
134
|
+
if (!route) {
|
|
135
|
+
this.emit("unhandled", { path, data });
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
route.action({ route: route.route, params: route.params, splats: route.splats }, data);
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Invoke a remote method on the server, specified via a path. Optionally, data can be specified
|
|
142
|
+
* to send along with the call (will be JSON encoded). A Promise will be returned, resolved or
|
|
143
|
+
* rejected with the result or error (respectively) from the server.
|
|
144
|
+
*/
|
|
145
|
+
invoke(path, data) {
|
|
146
|
+
const id = nanoid();
|
|
147
|
+
return new Promise((resolve, reject) => {
|
|
148
|
+
if (!this.conn) {
|
|
149
|
+
reject(new Error("Not connected"));
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
this.outstanding.set(id, { resolve, reject });
|
|
153
|
+
this.conn.send(encode(MessageType.Invoke, data, id, path), void 0);
|
|
154
|
+
}).catch((err) => {
|
|
155
|
+
if (err.message && err.status) {
|
|
156
|
+
const converted = new InvokeError(err.message, err.status, err.body);
|
|
157
|
+
throw converted;
|
|
158
|
+
}
|
|
159
|
+
throw err;
|
|
160
|
+
}).finally(() => this.outstanding.delete(id));
|
|
161
|
+
}
|
|
162
|
+
onInvokeResponse({ type, id, data }) {
|
|
163
|
+
const p = this.outstanding.get(id);
|
|
164
|
+
if (!p) {
|
|
165
|
+
this.emit("error", new Error("Unknown invoke id"));
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
p[type === MessageType.Result ? "resolve" : "reject"](data);
|
|
169
|
+
}
|
|
170
|
+
onOpen() {
|
|
171
|
+
this.clearConnectTimer();
|
|
172
|
+
this.wasOpened = true;
|
|
173
|
+
this.backoff.reset();
|
|
174
|
+
this.emit("connect");
|
|
175
|
+
}
|
|
176
|
+
onMessage(msg) {
|
|
177
|
+
const decoded = decode(msg);
|
|
178
|
+
switch (decoded.type) {
|
|
179
|
+
case MessageType.ParserError:
|
|
180
|
+
this.conn?.close();
|
|
181
|
+
break;
|
|
182
|
+
case MessageType.Welcome:
|
|
183
|
+
if (decoded.data !== protocolVersion) {
|
|
184
|
+
this.emit(
|
|
185
|
+
"error",
|
|
186
|
+
new Error("Server has incompatible protocol version: " + protocolVersion)
|
|
187
|
+
);
|
|
188
|
+
this.conn?.close();
|
|
189
|
+
}
|
|
190
|
+
break;
|
|
191
|
+
case MessageType.Result:
|
|
192
|
+
case MessageType.Error:
|
|
193
|
+
this.onInvokeResponse(decoded);
|
|
194
|
+
break;
|
|
195
|
+
case MessageType.Publish:
|
|
196
|
+
this.onPublish(decoded);
|
|
197
|
+
break;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
onClose(reason, details) {
|
|
201
|
+
this.clearConnectTimer();
|
|
202
|
+
this.conn = null;
|
|
203
|
+
if (this.disconnectingResolver) {
|
|
204
|
+
this.disconnectingResolver();
|
|
205
|
+
this.disconnectingResolver = void 0;
|
|
206
|
+
this.disconnectingPromise = void 0;
|
|
207
|
+
}
|
|
208
|
+
if (!this.wasOpened) {
|
|
209
|
+
this.emit("connect_failed");
|
|
210
|
+
this.reconnect();
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
this.emit("disconnect", reason, details);
|
|
214
|
+
this.outstanding.clear();
|
|
215
|
+
this.wasOpened = false;
|
|
216
|
+
this.reconnect();
|
|
217
|
+
}
|
|
218
|
+
onError(err) {
|
|
219
|
+
this.clearConnectTimer();
|
|
220
|
+
if (isTransportError(err) && err.message === "xhr poll error") {
|
|
221
|
+
if (err.description === 403) {
|
|
222
|
+
this.skipReconnect = true;
|
|
223
|
+
this.emit("unauthorized");
|
|
224
|
+
} else {
|
|
225
|
+
this.onClose("error", err);
|
|
226
|
+
}
|
|
227
|
+
return;
|
|
228
|
+
}
|
|
229
|
+
if (this.skipReconnect && isTransportError(err) && err.description && typeof err.description !== "number" && err.description.message && /closed before the connection (was|is) established/.test(err.description.message)) {
|
|
230
|
+
return;
|
|
231
|
+
}
|
|
232
|
+
this.emit("error", err);
|
|
233
|
+
}
|
|
234
|
+
clearConnectTimer() {
|
|
235
|
+
if (this.connectTimer) {
|
|
236
|
+
clearTimeout(this.connectTimer);
|
|
237
|
+
this.connectTimer = null;
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
};
|
|
241
|
+
function createClient(host, opts) {
|
|
242
|
+
return new NydusClient(host, opts);
|
|
243
|
+
}
|
|
244
|
+
export {
|
|
245
|
+
InvokeError,
|
|
246
|
+
NydusClient,
|
|
247
|
+
createClient as default,
|
|
248
|
+
protocolVersion
|
|
249
|
+
};
|
|
250
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../index.ts","../typed-emitter.ts"],"sourcesContent":["import Backoff from 'backo2'\nimport { Socket as EngineIoSocket, SocketOptions as EngineIoSocketOptions } from 'engine.io-client'\nimport { nanoid } from 'nanoid'\nimport {\n decode,\n encode,\n MessageType,\n NydusErrorMessage,\n NydusPublishMessage,\n NydusResultMessage,\n protocolVersion,\n} from 'nydus-protocol'\nimport ruta from 'ruta3'\nimport { TypedEventEmitter } from './typed-emitter'\n\nexport { protocolVersion }\n\nexport interface NydusClientOptions extends EngineIoSocketOptions {\n /**\n * How long before a connection attempt should be considered failed. Optional, will not timeout\n * if not specified.\n */\n connectTimeout?: number\n /** How many times to attempt to reconnect before giving up. */\n reconnectionAttempts: number\n /**\n * How long to wait before attempting to reconnect, in milliseconds. This time will be backed off\n * if successive attempts fail.\n */\n reconnectionDelay: number\n /**\n * The maximum amount of time to wait before attempting to reconnect, in milliseconds, when backed\n * off. */\n reconnectionDelayMax: number\n /**\n * How much to jitter reconnection attempts, to avoid all clients connecting at once. This value\n * should be between 0 and 1.\n */\n reconnectionJitter: number\n}\n\ninterface ExpandedSocket extends Omit<EngineIoSocket, 'readyState'> {\n readonly readyState: string\n}\n\ninterface TransportError extends Error {\n readonly type: 'TransportError'\n readonly description: Error | number\n}\n\nfunction isTransportError(err: Error): err is TransportError {\n return (err as any).type === 'TransportError'\n}\n\nexport interface RouteInfo {\n route: string\n params: Record<string, string>\n splats: string[]\n}\n\nexport type RouteHandler = (routeInfo: RouteInfo, data: any) => void\n\ntype NydusEvents = {\n /** Fired when the connection succeeds. */\n connect: () => void\n /** Fired when the connection has been closed */\n disconnect: (reason: string, details?: Error) => void\n /** Fired when a reconnect attempt is being initiated. */\n reconnecting: (attempts: number) => void\n /** Fired when a publish occurred that wasn't handled by any registered routes. */\n unhandled: (published: { path: string; data: any }) => void\n\n /** Fired when a general error occurs. */\n error: (err: Error) => void\n\n /**\n * Fired when the server returns a 403 on connect. The client will not continue attempting\n * to reconnect after this.\n */\n unauthorized: () => void\n\n /** Fired when the connection attempt times out. */\n connect_timeout: () => void\n\n /** Fired when the reconnection attempts exceeded the maximum allowed without success. */\n reconnect_failed: () => void\n\n /** Fired when the connection attempt failed. */\n connect_failed: () => void\n}\n\nexport class InvokeError extends Error {\n readonly status: number\n readonly body: any\n\n constructor(message: string, status: number, body?: any) {\n super(message)\n this.status = status\n this.body = body\n }\n}\n\ntype PromiseCompleters = { resolve: (value: unknown) => void; reject: (reason: any) => void }\n\nexport class NydusClient extends TypedEventEmitter<NydusEvents> {\n readonly host: string\n readonly opts: Partial<NydusClientOptions>\n conn: ExpandedSocket | null = null\n\n private outstanding = new Map<string, PromiseCompleters>()\n private router = ruta<RouteHandler>()\n private backoff: Backoff\n\n private backoffTimer: ReturnType<typeof setTimeout> | null = null\n private connectTimer: ReturnType<typeof setTimeout> | null = null\n\n private wasOpened = false\n private skipReconnect = false\n private disconnectingPromise: Promise<void> | undefined = undefined\n private disconnectingResolver: (() => void) | undefined = undefined\n\n constructor(host: string, opts: Partial<NydusClientOptions> = {}) {\n super()\n this.host = host\n this.opts = opts\n\n this.opts.reconnectionAttempts = this.opts.reconnectionAttempts || Infinity\n this.backoff = new Backoff({\n min: opts.reconnectionDelay || 1000,\n max: opts.reconnectionDelayMax || 10000,\n jitter: opts.reconnectionJitter || 0.5,\n })\n }\n\n // One of: opening, open, closing, closed.\n get readyState() {\n return this.conn != null ? this.conn.readyState : 'closed'\n }\n\n private doConnect() {\n if (this.opts.connectTimeout) {\n this.connectTimer = setTimeout(() => {\n this.emit('connect_timeout')\n this.disconnect()\n this.skipReconnect = false\n this.onClose('connect timeout')\n }, this.opts.connectTimeout)\n }\n\n this.conn = new EngineIoSocket(this.host, this.opts) as unknown as ExpandedSocket\n this.conn\n .on('open', this.onOpen.bind(this))\n .on('message', data => this.onMessage(data as string))\n .on('close', this.onClose.bind(this) as any)\n .on('error', this.onError.bind(this) as any)\n }\n\n // Connect to the server. If already connected, this will be a no-op.\n connect() {\n if (this.conn) {\n // If the socket is closing, wait for it to close before connecting again\n if (this.conn.readyState === 'closing') {\n this.disconnectingPromise!.then(() => {\n this.connect()\n }).catch(_err => {})\n }\n return\n }\n\n this.skipReconnect = false\n this.wasOpened = false\n this.doConnect()\n }\n\n reconnect() {\n if (this.conn || this.skipReconnect || this.backoffTimer) {\n return\n }\n\n if (this.backoff.attempts >= this.opts.reconnectionAttempts!) {\n this.backoff.reset()\n this.emit('reconnect_failed')\n return\n }\n\n this.backoffTimer = setTimeout(() => {\n this.backoffTimer = null\n this.emit('reconnecting', this.backoff.attempts)\n\n if (this.skipReconnect || this.conn) return\n\n this.doConnect()\n }, this.backoff.duration())\n }\n\n // Disconnect from the server. If not already connected, this will be a no-op.\n disconnect() {\n this.skipReconnect = true\n if (this.backoffTimer) {\n clearTimeout(this.backoffTimer)\n this.backoffTimer = null\n }\n\n if (!this.conn) return\n\n if (!this.disconnectingPromise) {\n this.disconnectingPromise = new Promise<void>(resolve => {\n this.disconnectingResolver = resolve\n }).catch(_err => {})\n }\n\n this.conn.close()\n }\n\n /**\n * Registers a handler function to respond to PUBLISHes to paths matching a specified pattern.\n * Handlers are normal functions of the form:\n * `function({ route, params, splats }, data)`\n *\n * PUBLISHes that don't match a route will be emitted as an 'unhandled' event on this object,\n * which can be useful to track in development mode.\n */\n registerRoute(pathPattern: string, handler: RouteHandler) {\n this.router.addRoute(pathPattern, handler)\n }\n\n private onPublish({ path, data }: NydusPublishMessage<any>) {\n const route = this.router.match(path)\n if (!route) {\n this.emit('unhandled', { path, data })\n return\n }\n\n route.action({ route: route.route, params: route.params, splats: route.splats }, data)\n }\n\n /**\n * Invoke a remote method on the server, specified via a path. Optionally, data can be specified\n * to send along with the call (will be JSON encoded). A Promise will be returned, resolved or\n * rejected with the result or error (respectively) from the server.\n */\n invoke(path: string, data?: any) {\n const id = nanoid()\n return new Promise((resolve, reject) => {\n if (!this.conn) {\n reject(new Error('Not connected'))\n return\n }\n\n this.outstanding.set(id, { resolve, reject })\n this.conn.send(encode(MessageType.Invoke, data, id, path), undefined)\n })\n .catch(err => {\n // Convert error-like objects back to Errors\n if (err.message && err.status) {\n const converted = new InvokeError(err.message, err.status, err.body)\n throw converted\n }\n\n throw err\n })\n .finally(() => this.outstanding.delete(id))\n }\n\n private onInvokeResponse({ type, id, data }: NydusResultMessage<any> | NydusErrorMessage<any>) {\n const p = this.outstanding.get(id)\n if (!p) {\n this.emit('error', new Error('Unknown invoke id'))\n return\n }\n\n p[type === MessageType.Result ? 'resolve' : 'reject'](data)\n }\n\n private onOpen() {\n this.clearConnectTimer()\n this.wasOpened = true\n this.backoff.reset()\n this.emit('connect')\n }\n\n private onMessage(msg: string) {\n const decoded = decode(msg)\n switch (decoded.type) {\n case MessageType.ParserError:\n this.conn?.close() // will cause a call to _onClose\n break\n case MessageType.Welcome:\n if (decoded.data !== protocolVersion) {\n this.emit(\n 'error',\n new Error('Server has incompatible protocol version: ' + protocolVersion),\n )\n this.conn?.close()\n }\n break\n case MessageType.Result:\n case MessageType.Error:\n this.onInvokeResponse(decoded)\n break\n case MessageType.Publish:\n this.onPublish(decoded)\n break\n }\n }\n\n private onClose(reason: string, details?: Error) {\n this.clearConnectTimer()\n this.conn = null\n\n if (this.disconnectingResolver) {\n this.disconnectingResolver()\n this.disconnectingResolver = undefined\n this.disconnectingPromise = undefined\n }\n\n if (!this.wasOpened) {\n this.emit('connect_failed')\n this.reconnect()\n // Sockets can emit 'close' even if the connection was never actually opened. Don't emit emits\n // upstream in that case, since they're rather unnecessary\n return\n }\n\n this.emit('disconnect', reason, details)\n this.outstanding.clear()\n this.wasOpened = false\n this.reconnect()\n }\n\n private onError(err: Error | TransportError) {\n this.clearConnectTimer()\n if (isTransportError(err) && err.message === 'xhr poll error') {\n if (err.description === 403) {\n this.skipReconnect = true\n this.emit('unauthorized')\n } else {\n this.onClose('error', err)\n }\n return\n }\n if (\n this.skipReconnect &&\n isTransportError(err) &&\n err.description &&\n typeof err.description !== 'number' &&\n err.description.message &&\n /closed before the connection (was|is) established/.test(err.description.message)\n ) {\n // ws sometimes throws errors if you disconnect a socket that was in the process of\n // reconnecting. Since the disconnect was requested (_skipReconnect is true), this seems\n // spurious, so we just ignore it\n return\n }\n\n this.emit('error', err)\n }\n\n clearConnectTimer() {\n if (this.connectTimer) {\n clearTimeout(this.connectTimer)\n this.connectTimer = null\n }\n }\n}\n\nexport default function createClient(host: string, opts?: Partial<NydusClientOptions>) {\n return new NydusClient(host, opts)\n}\n","import { EventEmitter } from 'events'\nimport { DefaultListener, TypedEmitter } from 'tiny-typed-emitter'\n\nexport type EventMap = DefaultListener\n\n/**\n * A typed version of the normal node EventEmitter class, such that emitted/handled events and\n * their associated parameters can be type-checked properly.\n *\n * This uses typed-emitter under the hood, it just makes it easier to extend.\n *\n * Example:\n * ```\n * type FooEvents = {\n * bar: (message: string) => void\n * baz: (count: number, ...extras: any[]) => void\n * }\n *\n * class Foo extends TypedEventEmitter<FooEvents> {\n * constructor() {\n * super()\n * }\n *\n * test() {\n * this.emit('bar', 'hello world')\n * this.emit('baz', 5, 'extra', 'stuff', 'to', 'pass', 27)\n * }\n * }\n * ```\n */\nexport abstract class TypedEventEmitter<T extends EventMap> extends (EventEmitter as {\n new <T extends EventMap>(): TypedEmitter<T>\n})<T> {\n constructor() {\n // NOTE(tec27): No idea why eslint thinks super isn't a constructor here, I assume it's failing\n // to parse things properly in some way\n // eslint-disable-next-line constructor-super\n super()\n }\n}\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1,20 +1,16 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "nydus-client",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "5.1.0",
|
|
4
4
|
"description": "WebSocket client library for the nydus protocol, a simple RPC/PubSub protocol.",
|
|
5
|
-
"
|
|
6
|
-
"
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
"
|
|
14
|
-
"test": "ts-mocha -p tsconfig-cjs.json -R spec test/**.ts",
|
|
15
|
-
"testonly": "ts-mocha -p tsconfig-cjs.json -R spec test/**.ts",
|
|
16
|
-
"posttest": "yarn run tsc --noEmit && yarn run lint",
|
|
17
|
-
"watch": "tsc -w"
|
|
5
|
+
"type": "module",
|
|
6
|
+
"exports": {
|
|
7
|
+
".": {
|
|
8
|
+
"import": "./dist/index.js",
|
|
9
|
+
"types": "./dist/index.d.ts"
|
|
10
|
+
}
|
|
11
|
+
},
|
|
12
|
+
"engines": {
|
|
13
|
+
"node": ">=22.12"
|
|
18
14
|
},
|
|
19
15
|
"repository": {
|
|
20
16
|
"type": "git",
|
|
@@ -38,32 +34,41 @@
|
|
|
38
34
|
],
|
|
39
35
|
"dependencies": {
|
|
40
36
|
"backo2": "^1.0.2",
|
|
41
|
-
"cuid": "^2.1.6",
|
|
42
37
|
"engine.io-client": "^6.6.3",
|
|
43
|
-
"
|
|
44
|
-
"
|
|
45
|
-
"
|
|
38
|
+
"nanoid": "^5.1.5",
|
|
39
|
+
"nydus-protocol": "^3.0.0",
|
|
40
|
+
"ruta3": "^2.0.1",
|
|
41
|
+
"tiny-typed-emitter": "^2.1.0"
|
|
46
42
|
},
|
|
47
43
|
"devDependencies": {
|
|
48
|
-
"@
|
|
44
|
+
"@eslint/eslintrc": "^3.3.1",
|
|
45
|
+
"@eslint/js": "^9.32.0",
|
|
46
|
+
"@swc/core": "^1.13.2",
|
|
47
|
+
"@types/backo2": "^1.0.4",
|
|
49
48
|
"@types/chai": "^5.2.2",
|
|
50
|
-
"@types/
|
|
51
|
-
"@types/mocha": "^10.0.
|
|
52
|
-
"@typescript-eslint/eslint-plugin": "^8.
|
|
53
|
-
"@typescript-eslint/parser": "^8.
|
|
54
|
-
"chai": "^5.2.
|
|
49
|
+
"@types/chai-as-promised": "^8.0.2",
|
|
50
|
+
"@types/mocha": "^10.0.10",
|
|
51
|
+
"@typescript-eslint/eslint-plugin": "^8.38.0",
|
|
52
|
+
"@typescript-eslint/parser": "^8.38.0",
|
|
53
|
+
"chai": "^5.2.1",
|
|
55
54
|
"chai-as-promised": "^8.0.1",
|
|
56
|
-
"
|
|
57
|
-
"eslint": "^
|
|
58
|
-
"eslint-
|
|
59
|
-
"
|
|
60
|
-
"mocha": "^11.
|
|
61
|
-
"nydus": "^
|
|
62
|
-
"prettier": "^3.
|
|
63
|
-
"
|
|
64
|
-
"
|
|
65
|
-
"
|
|
55
|
+
"eslint": "^9.32.0",
|
|
56
|
+
"eslint-config-prettier": "^10.1.8",
|
|
57
|
+
"eslint-plugin-prettier": "^5.5.3",
|
|
58
|
+
"globals": "^16.3.0",
|
|
59
|
+
"mocha": "^11.7.1",
|
|
60
|
+
"nydus": "^5.0.2",
|
|
61
|
+
"prettier": "^3.6.2",
|
|
62
|
+
"prettier-plugin-organize-imports": "^4.2.0",
|
|
63
|
+
"tsup": "^8.5.0",
|
|
64
|
+
"tsx": "^4.20.3",
|
|
66
65
|
"typescript": "^5.8.3"
|
|
67
66
|
},
|
|
68
|
-
"
|
|
69
|
-
|
|
67
|
+
"scripts": {
|
|
68
|
+
"build": "tsup",
|
|
69
|
+
"lint": "eslint --ext .js,.ts ./",
|
|
70
|
+
"test": "mocha --import=tsx -R spec test/**.ts",
|
|
71
|
+
"typecheck": "tsc --noEmit",
|
|
72
|
+
"watch": "tsup --watch"
|
|
73
|
+
}
|
|
74
|
+
}
|
package/dist/cjs/index.js
DELETED
|
@@ -1,244 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.NydusClient = exports.InvokeError = exports.protocolVersion = void 0;
|
|
7
|
-
exports.default = createClient;
|
|
8
|
-
const engine_io_client_1 = require("engine.io-client");
|
|
9
|
-
const cuid_1 = __importDefault(require("cuid"));
|
|
10
|
-
const ruta3_1 = __importDefault(require("ruta3"));
|
|
11
|
-
const backo2_1 = __importDefault(require("backo2"));
|
|
12
|
-
const nydus_protocol_1 = require("nydus-protocol");
|
|
13
|
-
Object.defineProperty(exports, "protocolVersion", { enumerable: true, get: function () { return nydus_protocol_1.protocolVersion; } });
|
|
14
|
-
const typed_emitter_1 = require("./typed-emitter");
|
|
15
|
-
function isTransportError(err) {
|
|
16
|
-
return err.type === 'TransportError';
|
|
17
|
-
}
|
|
18
|
-
class InvokeError extends Error {
|
|
19
|
-
constructor(message, status, body) {
|
|
20
|
-
super(message);
|
|
21
|
-
this.status = status;
|
|
22
|
-
this.body = body;
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
exports.InvokeError = InvokeError;
|
|
26
|
-
class NydusClient extends typed_emitter_1.TypedEventEmitter {
|
|
27
|
-
constructor(host, opts = {}) {
|
|
28
|
-
super();
|
|
29
|
-
this.conn = null;
|
|
30
|
-
this.outstanding = new Map();
|
|
31
|
-
this.router = (0, ruta3_1.default)();
|
|
32
|
-
this.backoffTimer = null;
|
|
33
|
-
this.connectTimer = null;
|
|
34
|
-
this.wasOpened = false;
|
|
35
|
-
this.skipReconnect = false;
|
|
36
|
-
this.disconnectingPromise = undefined;
|
|
37
|
-
this.disconnectingResolver = undefined;
|
|
38
|
-
this.host = host;
|
|
39
|
-
this.opts = opts;
|
|
40
|
-
this.opts.reconnectionAttempts = this.opts.reconnectionAttempts || Infinity;
|
|
41
|
-
this.backoff = new backo2_1.default({
|
|
42
|
-
min: opts.reconnectionDelay || 1000,
|
|
43
|
-
max: opts.reconnectionDelayMax || 10000,
|
|
44
|
-
jitter: opts.reconnectionJitter || 0.5,
|
|
45
|
-
});
|
|
46
|
-
}
|
|
47
|
-
// One of: opening, open, closing, closed.
|
|
48
|
-
get readyState() {
|
|
49
|
-
return this.conn != null ? this.conn.readyState : 'closed';
|
|
50
|
-
}
|
|
51
|
-
doConnect() {
|
|
52
|
-
if (this.opts.connectTimeout) {
|
|
53
|
-
this.connectTimer = setTimeout(() => {
|
|
54
|
-
this.emit('connect_timeout');
|
|
55
|
-
this.disconnect();
|
|
56
|
-
this.skipReconnect = false;
|
|
57
|
-
this.onClose('connect timeout');
|
|
58
|
-
}, this.opts.connectTimeout);
|
|
59
|
-
}
|
|
60
|
-
this.conn = new engine_io_client_1.Socket(this.host, this.opts);
|
|
61
|
-
this.conn
|
|
62
|
-
.on('open', this.onOpen.bind(this))
|
|
63
|
-
.on('message', data => this.onMessage(data))
|
|
64
|
-
.on('close', this.onClose.bind(this))
|
|
65
|
-
.on('error', this.onError.bind(this));
|
|
66
|
-
}
|
|
67
|
-
// Connect to the server. If already connected, this will be a no-op.
|
|
68
|
-
connect() {
|
|
69
|
-
if (this.conn) {
|
|
70
|
-
// If the socket is closing, wait for it to close before connecting again
|
|
71
|
-
if (this.conn.readyState === 'closing') {
|
|
72
|
-
this.disconnectingPromise.then(() => {
|
|
73
|
-
this.connect();
|
|
74
|
-
}).catch(_err => { });
|
|
75
|
-
}
|
|
76
|
-
return;
|
|
77
|
-
}
|
|
78
|
-
this.skipReconnect = false;
|
|
79
|
-
this.wasOpened = false;
|
|
80
|
-
this.doConnect();
|
|
81
|
-
}
|
|
82
|
-
reconnect() {
|
|
83
|
-
if (this.conn || this.skipReconnect || this.backoffTimer) {
|
|
84
|
-
return;
|
|
85
|
-
}
|
|
86
|
-
if (this.backoff.attempts >= this.opts.reconnectionAttempts) {
|
|
87
|
-
this.backoff.reset();
|
|
88
|
-
this.emit('reconnect_failed');
|
|
89
|
-
return;
|
|
90
|
-
}
|
|
91
|
-
this.backoffTimer = setTimeout(() => {
|
|
92
|
-
this.backoffTimer = null;
|
|
93
|
-
this.emit('reconnecting', this.backoff.attempts);
|
|
94
|
-
if (this.skipReconnect || this.conn)
|
|
95
|
-
return;
|
|
96
|
-
this.doConnect();
|
|
97
|
-
}, this.backoff.duration());
|
|
98
|
-
}
|
|
99
|
-
// Disconnect from the server. If not already connected, this will be a no-op.
|
|
100
|
-
disconnect() {
|
|
101
|
-
this.skipReconnect = true;
|
|
102
|
-
if (this.backoffTimer) {
|
|
103
|
-
clearTimeout(this.backoffTimer);
|
|
104
|
-
this.backoffTimer = null;
|
|
105
|
-
}
|
|
106
|
-
if (!this.conn)
|
|
107
|
-
return;
|
|
108
|
-
if (!this.disconnectingPromise) {
|
|
109
|
-
this.disconnectingPromise = new Promise(resolve => {
|
|
110
|
-
this.disconnectingResolver = resolve;
|
|
111
|
-
}).catch(_err => { });
|
|
112
|
-
}
|
|
113
|
-
this.conn.close();
|
|
114
|
-
}
|
|
115
|
-
/**
|
|
116
|
-
* Registers a handler function to respond to PUBLISHes to paths matching a specified pattern.
|
|
117
|
-
* Handlers are normal functions of the form:
|
|
118
|
-
* `function({ route, params, splats }, data)`
|
|
119
|
-
*
|
|
120
|
-
* PUBLISHes that don't match a route will be emitted as an 'unhandled' event on this object,
|
|
121
|
-
* which can be useful to track in development mode.
|
|
122
|
-
*/
|
|
123
|
-
registerRoute(pathPattern, handler) {
|
|
124
|
-
this.router.addRoute(pathPattern, handler);
|
|
125
|
-
}
|
|
126
|
-
onPublish({ path, data }) {
|
|
127
|
-
const route = this.router.match(path);
|
|
128
|
-
if (!route) {
|
|
129
|
-
this.emit('unhandled', { path, data });
|
|
130
|
-
return;
|
|
131
|
-
}
|
|
132
|
-
route.action({ route: route.route, params: route.params, splats: route.splats }, data);
|
|
133
|
-
}
|
|
134
|
-
/**
|
|
135
|
-
* Invoke a remote method on the server, specified via a path. Optionally, data can be specified
|
|
136
|
-
* to send along with the call (will be JSON encoded). A Promise will be returned, resolved or
|
|
137
|
-
* rejected with the result or error (respectively) from the server.
|
|
138
|
-
*/
|
|
139
|
-
invoke(path, data) {
|
|
140
|
-
const id = (0, cuid_1.default)();
|
|
141
|
-
return new Promise((resolve, reject) => {
|
|
142
|
-
if (!this.conn) {
|
|
143
|
-
reject(new Error('Not connected'));
|
|
144
|
-
return;
|
|
145
|
-
}
|
|
146
|
-
this.outstanding.set(id, { resolve, reject });
|
|
147
|
-
this.conn.send((0, nydus_protocol_1.encode)(nydus_protocol_1.MessageType.Invoke, data, id, path), undefined);
|
|
148
|
-
})
|
|
149
|
-
.catch(err => {
|
|
150
|
-
// Convert error-like objects back to Errors
|
|
151
|
-
if (err.message && err.status) {
|
|
152
|
-
const converted = new InvokeError(err.message, err.status, err.body);
|
|
153
|
-
throw converted;
|
|
154
|
-
}
|
|
155
|
-
throw err;
|
|
156
|
-
})
|
|
157
|
-
.finally(() => this.outstanding.delete(id));
|
|
158
|
-
}
|
|
159
|
-
onInvokeResponse({ type, id, data }) {
|
|
160
|
-
const p = this.outstanding.get(id);
|
|
161
|
-
if (!p) {
|
|
162
|
-
this.emit('error', new Error('Unknown invoke id'));
|
|
163
|
-
return;
|
|
164
|
-
}
|
|
165
|
-
p[type === nydus_protocol_1.MessageType.Result ? 'resolve' : 'reject'](data);
|
|
166
|
-
}
|
|
167
|
-
onOpen() {
|
|
168
|
-
this.clearConnectTimer();
|
|
169
|
-
this.wasOpened = true;
|
|
170
|
-
this.backoff.reset();
|
|
171
|
-
this.emit('connect');
|
|
172
|
-
}
|
|
173
|
-
onMessage(msg) {
|
|
174
|
-
var _a, _b;
|
|
175
|
-
const decoded = (0, nydus_protocol_1.decode)(msg);
|
|
176
|
-
switch (decoded.type) {
|
|
177
|
-
case nydus_protocol_1.MessageType.ParserError:
|
|
178
|
-
(_a = this.conn) === null || _a === void 0 ? void 0 : _a.close(); // will cause a call to _onClose
|
|
179
|
-
break;
|
|
180
|
-
case nydus_protocol_1.MessageType.Welcome:
|
|
181
|
-
if (decoded.data !== nydus_protocol_1.protocolVersion) {
|
|
182
|
-
this.emit('error', new Error('Server has incompatible protocol version: ' + nydus_protocol_1.protocolVersion));
|
|
183
|
-
(_b = this.conn) === null || _b === void 0 ? void 0 : _b.close();
|
|
184
|
-
}
|
|
185
|
-
break;
|
|
186
|
-
case nydus_protocol_1.MessageType.Result:
|
|
187
|
-
case nydus_protocol_1.MessageType.Error:
|
|
188
|
-
this.onInvokeResponse(decoded);
|
|
189
|
-
break;
|
|
190
|
-
case nydus_protocol_1.MessageType.Publish:
|
|
191
|
-
this.onPublish(decoded);
|
|
192
|
-
break;
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
onClose(reason, details) {
|
|
196
|
-
this.clearConnectTimer();
|
|
197
|
-
this.conn = null;
|
|
198
|
-
if (this.disconnectingResolver) {
|
|
199
|
-
this.disconnectingResolver();
|
|
200
|
-
this.disconnectingResolver = undefined;
|
|
201
|
-
this.disconnectingPromise = undefined;
|
|
202
|
-
}
|
|
203
|
-
if (!this.wasOpened) {
|
|
204
|
-
this.emit('connect_failed');
|
|
205
|
-
this.reconnect();
|
|
206
|
-
// Sockets can emit 'close' even if the connection was never actually opened. Don't emit emits
|
|
207
|
-
// upstream in that case, since they're rather unnecessary
|
|
208
|
-
return;
|
|
209
|
-
}
|
|
210
|
-
this.emit('disconnect', reason, details);
|
|
211
|
-
this.outstanding.clear();
|
|
212
|
-
this.wasOpened = false;
|
|
213
|
-
this.reconnect();
|
|
214
|
-
}
|
|
215
|
-
onError(err) {
|
|
216
|
-
this.clearConnectTimer();
|
|
217
|
-
if (isTransportError(err) && err.message === 'xhr poll error') {
|
|
218
|
-
this.onClose('error', err);
|
|
219
|
-
return;
|
|
220
|
-
}
|
|
221
|
-
if (this.skipReconnect &&
|
|
222
|
-
isTransportError(err) &&
|
|
223
|
-
err.description &&
|
|
224
|
-
err.description.message &&
|
|
225
|
-
/closed before the connection (was|is) established/.test(err.description.message)) {
|
|
226
|
-
// ws sometimes throws errors if you disconnect a socket that was in the process of
|
|
227
|
-
// reconnecting. Since the disconnect was requested (_skipReconnect is true), this seems
|
|
228
|
-
// spurious, so we just ignore it
|
|
229
|
-
return;
|
|
230
|
-
}
|
|
231
|
-
this.emit('error', err);
|
|
232
|
-
}
|
|
233
|
-
clearConnectTimer() {
|
|
234
|
-
if (this.connectTimer) {
|
|
235
|
-
clearTimeout(this.connectTimer);
|
|
236
|
-
this.connectTimer = null;
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
exports.NydusClient = NydusClient;
|
|
241
|
-
function createClient(host, opts) {
|
|
242
|
-
return new NydusClient(host, opts);
|
|
243
|
-
}
|
|
244
|
-
//# sourceMappingURL=index.js.map
|
package/dist/cjs/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.TypedEventEmitter = void 0;
|
|
4
|
-
const events_1 = require("events");
|
|
5
|
-
/**
|
|
6
|
-
* A typed version of the normal node EventEmitter class, such that emitted/handled events and
|
|
7
|
-
* their associated parameters can be type-checked properly.
|
|
8
|
-
*
|
|
9
|
-
* This uses typed-emitter under the hood, it just makes it easier to extend.
|
|
10
|
-
*
|
|
11
|
-
* Example:
|
|
12
|
-
* ```
|
|
13
|
-
* interface FooEvents {
|
|
14
|
-
* bar: (message: string) => void
|
|
15
|
-
* baz: (count: number, ...extras: any[]) => void
|
|
16
|
-
* }
|
|
17
|
-
*
|
|
18
|
-
* class Foo extends TypedEventEmitter<FooEvents> {
|
|
19
|
-
* constructor() {
|
|
20
|
-
* super()
|
|
21
|
-
* }
|
|
22
|
-
*
|
|
23
|
-
* test() {
|
|
24
|
-
* this.emit('bar', 'hello world')
|
|
25
|
-
* this.emit('baz', 5, 'extra', 'stuff', 'to', 'pass', 27)
|
|
26
|
-
* }
|
|
27
|
-
* }
|
|
28
|
-
* ```
|
|
29
|
-
*/
|
|
30
|
-
class TypedEventEmitter extends events_1.EventEmitter {
|
|
31
|
-
constructor() {
|
|
32
|
-
// NOTE(tec27): No idea why eslint thinks super isn't a constructor here, I assume it's failing
|
|
33
|
-
// to parse things properly in some way
|
|
34
|
-
// eslint-disable-next-line constructor-super
|
|
35
|
-
super();
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
exports.TypedEventEmitter = TypedEventEmitter;
|
|
39
|
-
//# sourceMappingURL=typed-emitter.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"typed-emitter.js","sourceRoot":"","sources":["../../typed-emitter.ts"],"names":[],"mappings":";;;AAAA,mCAAqC;AAGrC;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAsB,iBAAsC,SAAS,qBAEhE;IACH;QACE,+FAA+F;QAC/F,uCAAuC;QACvC,6CAA6C;QAC7C,KAAK,EAAE,CAAA;IACT,CAAC;CACF;AATD,8CASC"}
|
package/dist/modules/index.js
DELETED
|
@@ -1,235 +0,0 @@
|
|
|
1
|
-
import { Socket as EngineIoSocket } from 'engine.io-client';
|
|
2
|
-
import cuid from 'cuid';
|
|
3
|
-
import ruta from 'ruta3';
|
|
4
|
-
import Backoff from 'backo2';
|
|
5
|
-
import { encode, decode, protocolVersion, MessageType, } from 'nydus-protocol';
|
|
6
|
-
import { TypedEventEmitter } from './typed-emitter';
|
|
7
|
-
export { protocolVersion };
|
|
8
|
-
function isTransportError(err) {
|
|
9
|
-
return err.type === 'TransportError';
|
|
10
|
-
}
|
|
11
|
-
export class InvokeError extends Error {
|
|
12
|
-
constructor(message, status, body) {
|
|
13
|
-
super(message);
|
|
14
|
-
this.status = status;
|
|
15
|
-
this.body = body;
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
export class NydusClient extends TypedEventEmitter {
|
|
19
|
-
constructor(host, opts = {}) {
|
|
20
|
-
super();
|
|
21
|
-
this.conn = null;
|
|
22
|
-
this.outstanding = new Map();
|
|
23
|
-
this.router = ruta();
|
|
24
|
-
this.backoffTimer = null;
|
|
25
|
-
this.connectTimer = null;
|
|
26
|
-
this.wasOpened = false;
|
|
27
|
-
this.skipReconnect = false;
|
|
28
|
-
this.disconnectingPromise = undefined;
|
|
29
|
-
this.disconnectingResolver = undefined;
|
|
30
|
-
this.host = host;
|
|
31
|
-
this.opts = opts;
|
|
32
|
-
this.opts.reconnectionAttempts = this.opts.reconnectionAttempts || Infinity;
|
|
33
|
-
this.backoff = new Backoff({
|
|
34
|
-
min: opts.reconnectionDelay || 1000,
|
|
35
|
-
max: opts.reconnectionDelayMax || 10000,
|
|
36
|
-
jitter: opts.reconnectionJitter || 0.5,
|
|
37
|
-
});
|
|
38
|
-
}
|
|
39
|
-
// One of: opening, open, closing, closed.
|
|
40
|
-
get readyState() {
|
|
41
|
-
return this.conn != null ? this.conn.readyState : 'closed';
|
|
42
|
-
}
|
|
43
|
-
doConnect() {
|
|
44
|
-
if (this.opts.connectTimeout) {
|
|
45
|
-
this.connectTimer = setTimeout(() => {
|
|
46
|
-
this.emit('connect_timeout');
|
|
47
|
-
this.disconnect();
|
|
48
|
-
this.skipReconnect = false;
|
|
49
|
-
this.onClose('connect timeout');
|
|
50
|
-
}, this.opts.connectTimeout);
|
|
51
|
-
}
|
|
52
|
-
this.conn = new EngineIoSocket(this.host, this.opts);
|
|
53
|
-
this.conn
|
|
54
|
-
.on('open', this.onOpen.bind(this))
|
|
55
|
-
.on('message', data => this.onMessage(data))
|
|
56
|
-
.on('close', this.onClose.bind(this))
|
|
57
|
-
.on('error', this.onError.bind(this));
|
|
58
|
-
}
|
|
59
|
-
// Connect to the server. If already connected, this will be a no-op.
|
|
60
|
-
connect() {
|
|
61
|
-
if (this.conn) {
|
|
62
|
-
// If the socket is closing, wait for it to close before connecting again
|
|
63
|
-
if (this.conn.readyState === 'closing') {
|
|
64
|
-
this.disconnectingPromise.then(() => {
|
|
65
|
-
this.connect();
|
|
66
|
-
}).catch(_err => { });
|
|
67
|
-
}
|
|
68
|
-
return;
|
|
69
|
-
}
|
|
70
|
-
this.skipReconnect = false;
|
|
71
|
-
this.wasOpened = false;
|
|
72
|
-
this.doConnect();
|
|
73
|
-
}
|
|
74
|
-
reconnect() {
|
|
75
|
-
if (this.conn || this.skipReconnect || this.backoffTimer) {
|
|
76
|
-
return;
|
|
77
|
-
}
|
|
78
|
-
if (this.backoff.attempts >= this.opts.reconnectionAttempts) {
|
|
79
|
-
this.backoff.reset();
|
|
80
|
-
this.emit('reconnect_failed');
|
|
81
|
-
return;
|
|
82
|
-
}
|
|
83
|
-
this.backoffTimer = setTimeout(() => {
|
|
84
|
-
this.backoffTimer = null;
|
|
85
|
-
this.emit('reconnecting', this.backoff.attempts);
|
|
86
|
-
if (this.skipReconnect || this.conn)
|
|
87
|
-
return;
|
|
88
|
-
this.doConnect();
|
|
89
|
-
}, this.backoff.duration());
|
|
90
|
-
}
|
|
91
|
-
// Disconnect from the server. If not already connected, this will be a no-op.
|
|
92
|
-
disconnect() {
|
|
93
|
-
this.skipReconnect = true;
|
|
94
|
-
if (this.backoffTimer) {
|
|
95
|
-
clearTimeout(this.backoffTimer);
|
|
96
|
-
this.backoffTimer = null;
|
|
97
|
-
}
|
|
98
|
-
if (!this.conn)
|
|
99
|
-
return;
|
|
100
|
-
if (!this.disconnectingPromise) {
|
|
101
|
-
this.disconnectingPromise = new Promise(resolve => {
|
|
102
|
-
this.disconnectingResolver = resolve;
|
|
103
|
-
}).catch(_err => { });
|
|
104
|
-
}
|
|
105
|
-
this.conn.close();
|
|
106
|
-
}
|
|
107
|
-
/**
|
|
108
|
-
* Registers a handler function to respond to PUBLISHes to paths matching a specified pattern.
|
|
109
|
-
* Handlers are normal functions of the form:
|
|
110
|
-
* `function({ route, params, splats }, data)`
|
|
111
|
-
*
|
|
112
|
-
* PUBLISHes that don't match a route will be emitted as an 'unhandled' event on this object,
|
|
113
|
-
* which can be useful to track in development mode.
|
|
114
|
-
*/
|
|
115
|
-
registerRoute(pathPattern, handler) {
|
|
116
|
-
this.router.addRoute(pathPattern, handler);
|
|
117
|
-
}
|
|
118
|
-
onPublish({ path, data }) {
|
|
119
|
-
const route = this.router.match(path);
|
|
120
|
-
if (!route) {
|
|
121
|
-
this.emit('unhandled', { path, data });
|
|
122
|
-
return;
|
|
123
|
-
}
|
|
124
|
-
route.action({ route: route.route, params: route.params, splats: route.splats }, data);
|
|
125
|
-
}
|
|
126
|
-
/**
|
|
127
|
-
* Invoke a remote method on the server, specified via a path. Optionally, data can be specified
|
|
128
|
-
* to send along with the call (will be JSON encoded). A Promise will be returned, resolved or
|
|
129
|
-
* rejected with the result or error (respectively) from the server.
|
|
130
|
-
*/
|
|
131
|
-
invoke(path, data) {
|
|
132
|
-
const id = cuid();
|
|
133
|
-
return new Promise((resolve, reject) => {
|
|
134
|
-
if (!this.conn) {
|
|
135
|
-
reject(new Error('Not connected'));
|
|
136
|
-
return;
|
|
137
|
-
}
|
|
138
|
-
this.outstanding.set(id, { resolve, reject });
|
|
139
|
-
this.conn.send(encode(MessageType.Invoke, data, id, path), undefined);
|
|
140
|
-
})
|
|
141
|
-
.catch(err => {
|
|
142
|
-
// Convert error-like objects back to Errors
|
|
143
|
-
if (err.message && err.status) {
|
|
144
|
-
const converted = new InvokeError(err.message, err.status, err.body);
|
|
145
|
-
throw converted;
|
|
146
|
-
}
|
|
147
|
-
throw err;
|
|
148
|
-
})
|
|
149
|
-
.finally(() => this.outstanding.delete(id));
|
|
150
|
-
}
|
|
151
|
-
onInvokeResponse({ type, id, data }) {
|
|
152
|
-
const p = this.outstanding.get(id);
|
|
153
|
-
if (!p) {
|
|
154
|
-
this.emit('error', new Error('Unknown invoke id'));
|
|
155
|
-
return;
|
|
156
|
-
}
|
|
157
|
-
p[type === MessageType.Result ? 'resolve' : 'reject'](data);
|
|
158
|
-
}
|
|
159
|
-
onOpen() {
|
|
160
|
-
this.clearConnectTimer();
|
|
161
|
-
this.wasOpened = true;
|
|
162
|
-
this.backoff.reset();
|
|
163
|
-
this.emit('connect');
|
|
164
|
-
}
|
|
165
|
-
onMessage(msg) {
|
|
166
|
-
var _a, _b;
|
|
167
|
-
const decoded = decode(msg);
|
|
168
|
-
switch (decoded.type) {
|
|
169
|
-
case MessageType.ParserError:
|
|
170
|
-
(_a = this.conn) === null || _a === void 0 ? void 0 : _a.close(); // will cause a call to _onClose
|
|
171
|
-
break;
|
|
172
|
-
case MessageType.Welcome:
|
|
173
|
-
if (decoded.data !== protocolVersion) {
|
|
174
|
-
this.emit('error', new Error('Server has incompatible protocol version: ' + protocolVersion));
|
|
175
|
-
(_b = this.conn) === null || _b === void 0 ? void 0 : _b.close();
|
|
176
|
-
}
|
|
177
|
-
break;
|
|
178
|
-
case MessageType.Result:
|
|
179
|
-
case MessageType.Error:
|
|
180
|
-
this.onInvokeResponse(decoded);
|
|
181
|
-
break;
|
|
182
|
-
case MessageType.Publish:
|
|
183
|
-
this.onPublish(decoded);
|
|
184
|
-
break;
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
onClose(reason, details) {
|
|
188
|
-
this.clearConnectTimer();
|
|
189
|
-
this.conn = null;
|
|
190
|
-
if (this.disconnectingResolver) {
|
|
191
|
-
this.disconnectingResolver();
|
|
192
|
-
this.disconnectingResolver = undefined;
|
|
193
|
-
this.disconnectingPromise = undefined;
|
|
194
|
-
}
|
|
195
|
-
if (!this.wasOpened) {
|
|
196
|
-
this.emit('connect_failed');
|
|
197
|
-
this.reconnect();
|
|
198
|
-
// Sockets can emit 'close' even if the connection was never actually opened. Don't emit emits
|
|
199
|
-
// upstream in that case, since they're rather unnecessary
|
|
200
|
-
return;
|
|
201
|
-
}
|
|
202
|
-
this.emit('disconnect', reason, details);
|
|
203
|
-
this.outstanding.clear();
|
|
204
|
-
this.wasOpened = false;
|
|
205
|
-
this.reconnect();
|
|
206
|
-
}
|
|
207
|
-
onError(err) {
|
|
208
|
-
this.clearConnectTimer();
|
|
209
|
-
if (isTransportError(err) && err.message === 'xhr poll error') {
|
|
210
|
-
this.onClose('error', err);
|
|
211
|
-
return;
|
|
212
|
-
}
|
|
213
|
-
if (this.skipReconnect &&
|
|
214
|
-
isTransportError(err) &&
|
|
215
|
-
err.description &&
|
|
216
|
-
err.description.message &&
|
|
217
|
-
/closed before the connection (was|is) established/.test(err.description.message)) {
|
|
218
|
-
// ws sometimes throws errors if you disconnect a socket that was in the process of
|
|
219
|
-
// reconnecting. Since the disconnect was requested (_skipReconnect is true), this seems
|
|
220
|
-
// spurious, so we just ignore it
|
|
221
|
-
return;
|
|
222
|
-
}
|
|
223
|
-
this.emit('error', err);
|
|
224
|
-
}
|
|
225
|
-
clearConnectTimer() {
|
|
226
|
-
if (this.connectTimer) {
|
|
227
|
-
clearTimeout(this.connectTimer);
|
|
228
|
-
this.connectTimer = null;
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
|
-
export default function createClient(host, opts) {
|
|
233
|
-
return new NydusClient(host, opts);
|
|
234
|
-
}
|
|
235
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
import { EventEmitter } from 'events';
|
|
2
|
-
/**
|
|
3
|
-
* A typed version of the normal node EventEmitter class, such that emitted/handled events and
|
|
4
|
-
* their associated parameters can be type-checked properly.
|
|
5
|
-
*
|
|
6
|
-
* This uses typed-emitter under the hood, it just makes it easier to extend.
|
|
7
|
-
*
|
|
8
|
-
* Example:
|
|
9
|
-
* ```
|
|
10
|
-
* interface FooEvents {
|
|
11
|
-
* bar: (message: string) => void
|
|
12
|
-
* baz: (count: number, ...extras: any[]) => void
|
|
13
|
-
* }
|
|
14
|
-
*
|
|
15
|
-
* class Foo extends TypedEventEmitter<FooEvents> {
|
|
16
|
-
* constructor() {
|
|
17
|
-
* super()
|
|
18
|
-
* }
|
|
19
|
-
*
|
|
20
|
-
* test() {
|
|
21
|
-
* this.emit('bar', 'hello world')
|
|
22
|
-
* this.emit('baz', 5, 'extra', 'stuff', 'to', 'pass', 27)
|
|
23
|
-
* }
|
|
24
|
-
* }
|
|
25
|
-
* ```
|
|
26
|
-
*/
|
|
27
|
-
export class TypedEventEmitter extends EventEmitter {
|
|
28
|
-
constructor() {
|
|
29
|
-
// NOTE(tec27): No idea why eslint thinks super isn't a constructor here, I assume it's failing
|
|
30
|
-
// to parse things properly in some way
|
|
31
|
-
// eslint-disable-next-line constructor-super
|
|
32
|
-
super();
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
//# sourceMappingURL=typed-emitter.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"typed-emitter.js","sourceRoot":"","sources":["../../typed-emitter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAA;AAGrC;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,OAAgB,iBAAsC,SAAS,YAEhE;IACH;QACE,+FAA+F;QAC/F,uCAAuC;QACvC,6CAA6C;QAC7C,KAAK,EAAE,CAAA;IACT,CAAC;CACF"}
|
package/dist/typed-emitter.d.ts
DELETED
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import TypedEmitter, { EventMap } from 'typed-emitter';
|
|
2
|
-
declare const TypedEventEmitter_base: {
|
|
3
|
-
new <T_1 extends EventMap>(): TypedEmitter<T_1>;
|
|
4
|
-
};
|
|
5
|
-
/**
|
|
6
|
-
* A typed version of the normal node EventEmitter class, such that emitted/handled events and
|
|
7
|
-
* their associated parameters can be type-checked properly.
|
|
8
|
-
*
|
|
9
|
-
* This uses typed-emitter under the hood, it just makes it easier to extend.
|
|
10
|
-
*
|
|
11
|
-
* Example:
|
|
12
|
-
* ```
|
|
13
|
-
* interface FooEvents {
|
|
14
|
-
* bar: (message: string) => void
|
|
15
|
-
* baz: (count: number, ...extras: any[]) => void
|
|
16
|
-
* }
|
|
17
|
-
*
|
|
18
|
-
* class Foo extends TypedEventEmitter<FooEvents> {
|
|
19
|
-
* constructor() {
|
|
20
|
-
* super()
|
|
21
|
-
* }
|
|
22
|
-
*
|
|
23
|
-
* test() {
|
|
24
|
-
* this.emit('bar', 'hello world')
|
|
25
|
-
* this.emit('baz', 5, 'extra', 'stuff', 'to', 'pass', 27)
|
|
26
|
-
* }
|
|
27
|
-
* }
|
|
28
|
-
* ```
|
|
29
|
-
*/
|
|
30
|
-
export declare abstract class TypedEventEmitter<T extends EventMap> extends TypedEventEmitter_base<T> {
|
|
31
|
-
constructor();
|
|
32
|
-
}
|
|
33
|
-
export {};
|