@rc-ex/ws 1.2.0 → 1.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +49 -22
- package/lib/exceptions/ClosedException.js +1 -1
- package/lib/exceptions/ClosedException.js.map +1 -1
- package/lib/exceptions/ClosedException.ts +7 -0
- package/lib/exceptions/ConnectionException.d.ts +1 -1
- package/lib/exceptions/ConnectionException.js.map +1 -1
- package/lib/exceptions/ConnectionException.ts +17 -0
- package/lib/exceptions/TimeoutException.js +1 -1
- package/lib/exceptions/TimeoutException.js.map +1 -1
- package/lib/exceptions/TimeoutException.ts +7 -0
- package/lib/index.d.ts +8 -8
- package/lib/index.js +23 -23
- package/lib/index.js.map +1 -1
- package/lib/index.ts +418 -0
- package/lib/rest.d.ts +2 -2
- package/lib/rest.js +5 -6
- package/lib/rest.js.map +1 -1
- package/lib/rest.ts +71 -0
- package/lib/subscription.d.ts +4 -4
- package/lib/subscription.js +11 -9
- package/lib/subscription.js.map +1 -1
- package/lib/subscription.ts +131 -0
- package/lib/types.d.ts +5 -5
- package/lib/types.js.map +1 -1
- package/lib/types.ts +85 -0
- package/lib/utils.d.ts +2 -2
- package/lib/utils.js +16 -16
- package/lib/utils.js.map +1 -1
- package/lib/utils.ts +82 -0
- package/package.json +6 -6
- package/src/exceptions/ClosedException.d.ts +4 -0
- package/src/exceptions/ClosedException.js +9 -0
- package/src/exceptions/ClosedException.js.map +1 -0
- package/src/exceptions/ClosedException.ts +1 -1
- package/src/exceptions/ConnectionException.d.ts +7 -0
- package/src/exceptions/ConnectionException.js +16 -0
- package/src/exceptions/ConnectionException.js.map +1 -0
- package/src/exceptions/ConnectionException.ts +2 -2
- package/src/exceptions/TimeoutException.d.ts +4 -0
- package/src/exceptions/TimeoutException.js +9 -0
- package/src/exceptions/TimeoutException.js.map +1 -0
- package/src/exceptions/TimeoutException.ts +1 -1
- package/src/index.d.ts +44 -0
- package/src/index.js +329 -0
- package/src/index.js.map +1 -0
- package/src/index.ts +81 -51
- package/src/rest.d.ts +3 -0
- package/src/rest.js +55 -0
- package/src/rest.js.map +1 -0
- package/src/rest.ts +22 -12
- package/src/subscription.d.ts +20 -0
- package/src/subscription.js +91 -0
- package/src/subscription.js.map +1 -0
- package/src/subscription.ts +36 -18
- package/src/types.d.ts +61 -0
- package/src/types.js +3 -0
- package/src/types.js.map +1 -0
- package/src/types.ts +14 -5
- package/src/utils.d.ts +8 -0
- package/src/utils.js +72 -0
- package/src/utils.js.map +1 -0
- package/src/utils.ts +26 -23
- package/tsconfig.json +0 -3
package/src/index.js
ADDED
|
@@ -0,0 +1,329 @@
|
|
|
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.Events = void 0;
|
|
7
|
+
const SdkExtension_1 = __importDefault(require("@rc-ex/core/src/SdkExtension"));
|
|
8
|
+
const isomorphic_ws_1 = __importDefault(require("isomorphic-ws"));
|
|
9
|
+
const hyperid_1 = __importDefault(require("hyperid"));
|
|
10
|
+
const events_1 = require("events");
|
|
11
|
+
const wait_for_async_1 = __importDefault(require("wait-for-async"));
|
|
12
|
+
const RestException_1 = __importDefault(require("@rc-ex/core/src/RestException"));
|
|
13
|
+
const rest_1 = require("./rest");
|
|
14
|
+
const subscription_1 = __importDefault(require("./subscription"));
|
|
15
|
+
const ConnectionException_1 = __importDefault(require("./exceptions/ConnectionException"));
|
|
16
|
+
const utils_1 = __importDefault(require("./utils"));
|
|
17
|
+
const CONNECTING = 0;
|
|
18
|
+
const OPEN = 1;
|
|
19
|
+
const uuid = (0, hyperid_1.default)();
|
|
20
|
+
var Events;
|
|
21
|
+
(function (Events) {
|
|
22
|
+
Events["autoRecoverSuccess"] = "autoRecoverSuccess";
|
|
23
|
+
Events["autoRecoverFailed"] = "autoRecoverFailed";
|
|
24
|
+
Events["autoRecoverError"] = "autoRecoverError";
|
|
25
|
+
Events["newWebSocketObject"] = "newWebSocketObject";
|
|
26
|
+
Events["newWsc"] = "newWsc";
|
|
27
|
+
Events["connectionReady"] = "connectionReady";
|
|
28
|
+
})(Events || (exports.Events = Events = {}));
|
|
29
|
+
class WebSocketExtension extends SdkExtension_1.default {
|
|
30
|
+
constructor(options = {}) {
|
|
31
|
+
var _a, _b, _c, _d, _e;
|
|
32
|
+
var _f, _g, _h, _j, _k;
|
|
33
|
+
super();
|
|
34
|
+
this.eventEmitter = new events_1.EventEmitter();
|
|
35
|
+
this.wsTokenExpiresAt = 0;
|
|
36
|
+
this.request = rest_1.request; // request method was moved to another file to keep this file short
|
|
37
|
+
this.options = options;
|
|
38
|
+
(_a = (_f = this.options).restOverWebSocket) !== null && _a !== void 0 ? _a : (_f.restOverWebSocket = false);
|
|
39
|
+
(_b = (_g = this.options).debugMode) !== null && _b !== void 0 ? _b : (_g.debugMode = false);
|
|
40
|
+
(_c = (_h = this.options).autoRecover) !== null && _c !== void 0 ? _c : (_h.autoRecover = {
|
|
41
|
+
enabled: true,
|
|
42
|
+
});
|
|
43
|
+
(_d = (_j = this.options.autoRecover).checkInterval) !== null && _d !== void 0 ? _d : (_j.checkInterval = (retriesAttempted) => {
|
|
44
|
+
const interval = 2000 + 2000 * retriesAttempted;
|
|
45
|
+
return Math.min(8000, interval);
|
|
46
|
+
});
|
|
47
|
+
(_e = (_k = this.options.autoRecover).pingServerInterval) !== null && _e !== void 0 ? _e : (_k.pingServerInterval = 60000);
|
|
48
|
+
}
|
|
49
|
+
disable() {
|
|
50
|
+
super.disable();
|
|
51
|
+
if (this.subscription) {
|
|
52
|
+
this.subscription.enabled = false;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
async install(rc) {
|
|
56
|
+
this.rc = rc;
|
|
57
|
+
if (this.options.restOverWebSocket) {
|
|
58
|
+
const request = rc.request.bind(rc);
|
|
59
|
+
rc.request = async (method, endpoint, content, queryParams, config) => {
|
|
60
|
+
var _a, _b, _c;
|
|
61
|
+
if (!this.enabled || !this.options.restOverWebSocket) {
|
|
62
|
+
return request(method, endpoint, content, queryParams, config);
|
|
63
|
+
}
|
|
64
|
+
if (
|
|
65
|
+
// the following cannot be done with WebSocket
|
|
66
|
+
((_c = (_b = (_a = config === null || config === void 0 ? void 0 : config.headers) === null || _a === void 0 ? void 0 : _a.getContentType) === null || _b === void 0 ? void 0 : _b.toString()) === null || _c === void 0 ? void 0 : _c.includes("multipart/form-data")) ||
|
|
67
|
+
(config === null || config === void 0 ? void 0 : config.responseType) === "arraybuffer" ||
|
|
68
|
+
endpoint.startsWith("/restapi/oauth/") // token, revoke, wstoken
|
|
69
|
+
) {
|
|
70
|
+
return request(method, endpoint, content, queryParams, config);
|
|
71
|
+
}
|
|
72
|
+
return this.request(method, endpoint, content, queryParams, config);
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
// should recover if this.options.wscToken
|
|
76
|
+
let connectMethod = this.connect.bind(this);
|
|
77
|
+
if (this.options.wscToken) {
|
|
78
|
+
this.wsc = {
|
|
79
|
+
token: this.options.wscToken,
|
|
80
|
+
sequence: 0,
|
|
81
|
+
};
|
|
82
|
+
connectMethod = this.recover.bind(this);
|
|
83
|
+
}
|
|
84
|
+
if (!this.options.autoRecover.enabled) {
|
|
85
|
+
await connectMethod();
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
// code after is for auto recover
|
|
89
|
+
try {
|
|
90
|
+
await connectMethod();
|
|
91
|
+
}
|
|
92
|
+
catch (e) {
|
|
93
|
+
if (e instanceof RestException_1.default) {
|
|
94
|
+
throw e; // such as InsufficientPermissions
|
|
95
|
+
}
|
|
96
|
+
if (this.options.debugMode) {
|
|
97
|
+
console.debug("Initial connect failed:", e);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
let retriesAttempted = 0;
|
|
101
|
+
let checking = false;
|
|
102
|
+
const check = async () => {
|
|
103
|
+
var _a, _b, _c;
|
|
104
|
+
if (!this.enabled) {
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
if (((_a = this.options.autoRecover) === null || _a === void 0 ? void 0 : _a.enabled) !== true) {
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
if (checking) {
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
checking = true;
|
|
114
|
+
if (((_b = this.ws) === null || _b === void 0 ? void 0 : _b.readyState) !== OPEN && ((_c = this.ws) === null || _c === void 0 ? void 0 : _c.readyState) !== CONNECTING) {
|
|
115
|
+
clearInterval(this.intervalHandle);
|
|
116
|
+
try {
|
|
117
|
+
await this.recover();
|
|
118
|
+
retriesAttempted = 0;
|
|
119
|
+
if (this.options.debugMode) {
|
|
120
|
+
console.debug(`Auto recover done, recoveryState: ${this.connectionDetails.recoveryState}`);
|
|
121
|
+
}
|
|
122
|
+
this.eventEmitter.emit(this.connectionDetails.recoveryState === "Successful"
|
|
123
|
+
? Events.autoRecoverSuccess
|
|
124
|
+
: Events.autoRecoverFailed, this.ws);
|
|
125
|
+
}
|
|
126
|
+
catch (e) {
|
|
127
|
+
if (e instanceof RestException_1.default) {
|
|
128
|
+
throw e; // such as InsufficientPermissions
|
|
129
|
+
}
|
|
130
|
+
retriesAttempted += 1;
|
|
131
|
+
if (this.options.debugMode) {
|
|
132
|
+
console.debug("Auto recover error:", e);
|
|
133
|
+
}
|
|
134
|
+
this.eventEmitter.emit(Events.autoRecoverError, e);
|
|
135
|
+
}
|
|
136
|
+
this.intervalHandle = setInterval(check, this.options.autoRecover.checkInterval(retriesAttempted));
|
|
137
|
+
}
|
|
138
|
+
checking = false;
|
|
139
|
+
};
|
|
140
|
+
this.intervalHandle = setInterval(check, this.options.autoRecover.checkInterval(retriesAttempted));
|
|
141
|
+
// browser only code start
|
|
142
|
+
if (typeof window !== "undefined" && window.addEventListener) {
|
|
143
|
+
window.addEventListener("offline", () => {
|
|
144
|
+
var _a;
|
|
145
|
+
if (this.pingServerHandle) {
|
|
146
|
+
clearTimeout(this.pingServerHandle);
|
|
147
|
+
}
|
|
148
|
+
(_a = this.ws) === null || _a === void 0 ? void 0 : _a.close();
|
|
149
|
+
});
|
|
150
|
+
window.addEventListener("online", () => {
|
|
151
|
+
check();
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
// browser only code end
|
|
155
|
+
}
|
|
156
|
+
async recover() {
|
|
157
|
+
if (this._recoverPromise) {
|
|
158
|
+
return this._recoverPromise;
|
|
159
|
+
}
|
|
160
|
+
this._recoverPromise = this._recover();
|
|
161
|
+
try {
|
|
162
|
+
await this._recoverPromise;
|
|
163
|
+
}
|
|
164
|
+
finally {
|
|
165
|
+
this._recoverPromise = undefined;
|
|
166
|
+
}
|
|
167
|
+
return undefined;
|
|
168
|
+
}
|
|
169
|
+
async _recover() {
|
|
170
|
+
var _a, _b;
|
|
171
|
+
if (((_a = this.ws) === null || _a === void 0 ? void 0 : _a.readyState) === OPEN || ((_b = this.ws) === null || _b === void 0 ? void 0 : _b.readyState) === CONNECTING) {
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
if (!this.wsc || !this.wsc.token) {
|
|
175
|
+
await this.connect(false); // connect to WSG but do not recover
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
if (this.recoverTimestamp === undefined) {
|
|
179
|
+
this.recoverTimestamp = Date.now();
|
|
180
|
+
}
|
|
181
|
+
if (this.connectionDetails !== undefined &&
|
|
182
|
+
Date.now() - this.recoverTimestamp >
|
|
183
|
+
this.connectionDetails.recoveryTimeout * 1000) {
|
|
184
|
+
if (this.options.debugMode) {
|
|
185
|
+
console.debug("connect to WSG but do not recover");
|
|
186
|
+
}
|
|
187
|
+
await this.connect(false); // connect to WSG but do not recover
|
|
188
|
+
}
|
|
189
|
+
else {
|
|
190
|
+
if (this.options.debugMode) {
|
|
191
|
+
console.debug("connect to WSG and recover");
|
|
192
|
+
}
|
|
193
|
+
await this.connect(true); // connect to WSG and recover
|
|
194
|
+
}
|
|
195
|
+
this.recoverTimestamp = undefined;
|
|
196
|
+
this.enable();
|
|
197
|
+
}
|
|
198
|
+
async pingServer() {
|
|
199
|
+
var _a, _b;
|
|
200
|
+
if (((_a = this.options.autoRecover) === null || _a === void 0 ? void 0 : _a.enabled) !== true) {
|
|
201
|
+
return;
|
|
202
|
+
}
|
|
203
|
+
if (((_b = this.ws) === null || _b === void 0 ? void 0 : _b.readyState) !== OPEN) {
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
try {
|
|
207
|
+
await this.ws.send(JSON.stringify([
|
|
208
|
+
{
|
|
209
|
+
type: "Heartbeat",
|
|
210
|
+
messageId: uuid(),
|
|
211
|
+
},
|
|
212
|
+
]));
|
|
213
|
+
}
|
|
214
|
+
catch (e) {
|
|
215
|
+
this.ws.close(); // Explicitly mark WS as closed
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
async connect(recoverSession) {
|
|
219
|
+
if (this._connectPromise) {
|
|
220
|
+
return this._connectPromise;
|
|
221
|
+
}
|
|
222
|
+
this._connectPromise = this._connect(recoverSession);
|
|
223
|
+
try {
|
|
224
|
+
await this._connectPromise;
|
|
225
|
+
}
|
|
226
|
+
finally {
|
|
227
|
+
this._connectPromise = undefined;
|
|
228
|
+
}
|
|
229
|
+
return undefined;
|
|
230
|
+
}
|
|
231
|
+
async _connect(recoverSession = false) {
|
|
232
|
+
var _a;
|
|
233
|
+
if (!this.wsToken || Date.now() > this.wsTokenExpiresAt) {
|
|
234
|
+
const r = await this.rc.post("/restapi/oauth/wstoken");
|
|
235
|
+
this.wsToken = r.data;
|
|
236
|
+
// `expires_in` default value is 600 seconds. That's why we `* 0.8`
|
|
237
|
+
this.wsTokenExpiresAt = Date.now() + this.wsToken.expires_in * 0.8 * 1000;
|
|
238
|
+
}
|
|
239
|
+
let wsUri = `${this.wsToken.uri}?access_token=${this.wsToken.ws_access_token}`;
|
|
240
|
+
if (recoverSession && this.wsc) {
|
|
241
|
+
wsUri += `&wsc=${this.wsc.token}`;
|
|
242
|
+
}
|
|
243
|
+
this.ws = new isomorphic_ws_1.default(wsUri);
|
|
244
|
+
this.eventEmitter.emit(Events.newWebSocketObject, this.ws);
|
|
245
|
+
// override send method to wait for connecting
|
|
246
|
+
const send = this.ws.send.bind(this.ws);
|
|
247
|
+
this.ws.send = async (s) => {
|
|
248
|
+
if (this.ws.readyState === CONNECTING) {
|
|
249
|
+
await (0, wait_for_async_1.default)({
|
|
250
|
+
interval: 100,
|
|
251
|
+
condition: () => this.ws.readyState !== CONNECTING,
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
await send(s);
|
|
255
|
+
};
|
|
256
|
+
if ((_a = this.options.autoRecover) === null || _a === void 0 ? void 0 : _a.enabled) {
|
|
257
|
+
this.ws.addEventListener("message", () => {
|
|
258
|
+
if (this.pingServerHandle) {
|
|
259
|
+
clearTimeout(this.pingServerHandle);
|
|
260
|
+
}
|
|
261
|
+
this.pingServerHandle = setTimeout(() => this.pingServer(), this.options.autoRecover.pingServerInterval);
|
|
262
|
+
});
|
|
263
|
+
}
|
|
264
|
+
// debug mode to print all WebSocket traffic
|
|
265
|
+
if (this.options.debugMode) {
|
|
266
|
+
utils_1.default.debugWebSocket(this.ws);
|
|
267
|
+
}
|
|
268
|
+
// listen for new wsc data
|
|
269
|
+
this.ws.addEventListener("message", (mEvent) => {
|
|
270
|
+
const event = mEvent;
|
|
271
|
+
const [meta, body] = utils_1.default.splitWsgData(event.data);
|
|
272
|
+
if (meta.wsc &&
|
|
273
|
+
(!this.wsc ||
|
|
274
|
+
(meta.type === "ConnectionDetails" && body.recoveryState) ||
|
|
275
|
+
this.wsc.sequence < meta.wsc.sequence)) {
|
|
276
|
+
this.wsc = meta.wsc;
|
|
277
|
+
this.eventEmitter.emit(Events.newWsc, this.wsc);
|
|
278
|
+
}
|
|
279
|
+
});
|
|
280
|
+
// get initial ConnectionDetails data
|
|
281
|
+
const [meta, body, event] = await utils_1.default.waitForWebSocketMessage(this.ws, (meta) => meta.type === "ConnectionDetails" || meta.type === "Error");
|
|
282
|
+
if (meta.type === "Error") {
|
|
283
|
+
throw new ConnectionException_1.default(event);
|
|
284
|
+
}
|
|
285
|
+
this.connectionDetails = body;
|
|
286
|
+
// fired when ws connection is ready for creating subscription
|
|
287
|
+
this.eventEmitter.emit(Events.connectionReady, this.ws);
|
|
288
|
+
// recover the subscription, if it exists and enabled
|
|
289
|
+
if (this.subscription && this.subscription.enabled) {
|
|
290
|
+
// because we have a new ws object
|
|
291
|
+
this.subscription.setupWsEventListener();
|
|
292
|
+
if (!recoverSession || this.connectionDetails.recoveryState === "Failed") {
|
|
293
|
+
// create new subscription if don't recover existing one
|
|
294
|
+
await this.subscription.subscribe();
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
// keepInterval means we do not clear the interval
|
|
299
|
+
async revoke(keepInterval = false) {
|
|
300
|
+
var _a, _b;
|
|
301
|
+
await ((_a = this.subscription) === null || _a === void 0 ? void 0 : _a.revoke());
|
|
302
|
+
this.subscription = undefined;
|
|
303
|
+
if (!keepInterval && this.intervalHandle) {
|
|
304
|
+
clearInterval(this.intervalHandle);
|
|
305
|
+
}
|
|
306
|
+
if (this.pingServerHandle) {
|
|
307
|
+
clearTimeout(this.pingServerHandle);
|
|
308
|
+
}
|
|
309
|
+
(_b = this.ws) === null || _b === void 0 ? void 0 : _b.close();
|
|
310
|
+
this.wsc = undefined;
|
|
311
|
+
this.wsToken = undefined;
|
|
312
|
+
this.wsTokenExpiresAt = 0;
|
|
313
|
+
this.disable();
|
|
314
|
+
}
|
|
315
|
+
async subscribe(eventFilters, callback, cache = undefined) {
|
|
316
|
+
const subscription = new subscription_1.default(this, eventFilters, callback);
|
|
317
|
+
if (cache === undefined || cache === null) {
|
|
318
|
+
await subscription.subscribe();
|
|
319
|
+
}
|
|
320
|
+
else {
|
|
321
|
+
subscription.subscriptionInfo = cache;
|
|
322
|
+
await subscription.refresh();
|
|
323
|
+
}
|
|
324
|
+
this.subscription = subscription;
|
|
325
|
+
return subscription;
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
exports.default = WebSocketExtension;
|
|
329
|
+
//# sourceMappingURL=index.js.map
|
package/src/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"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"}
|
package/src/index.ts
CHANGED
|
@@ -1,20 +1,30 @@
|
|
|
1
|
-
|
|
2
|
-
import type
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
import
|
|
8
|
-
import {
|
|
9
|
-
import
|
|
10
|
-
import
|
|
11
|
-
import
|
|
12
|
-
|
|
13
|
-
import
|
|
14
|
-
import type
|
|
15
|
-
|
|
16
|
-
import
|
|
17
|
-
import
|
|
1
|
+
import type RingCentral from "@rc-ex/core";
|
|
2
|
+
import type {
|
|
3
|
+
RestMethod,
|
|
4
|
+
RestRequestConfig,
|
|
5
|
+
RestResponse,
|
|
6
|
+
} from "@rc-ex/core/src/types";
|
|
7
|
+
import SdkExtension from "@rc-ex/core/src/SdkExtension";
|
|
8
|
+
import type { MessageEvent } from "isomorphic-ws";
|
|
9
|
+
import WS from "isomorphic-ws";
|
|
10
|
+
import hyperid from "hyperid";
|
|
11
|
+
import { EventEmitter } from "events";
|
|
12
|
+
import waitFor from "wait-for-async";
|
|
13
|
+
import RestException from "@rc-ex/core/src/RestException";
|
|
14
|
+
import type SubscriptionInfo from "@rc-ex/core/src/definitions/SubscriptionInfo";
|
|
15
|
+
|
|
16
|
+
import { request } from "./rest";
|
|
17
|
+
import type {
|
|
18
|
+
ConnectionDetails,
|
|
19
|
+
WebSocketExtensionInterface,
|
|
20
|
+
WebSocketOptions,
|
|
21
|
+
Wsc,
|
|
22
|
+
WsgEvent,
|
|
23
|
+
WsToken,
|
|
24
|
+
} from "./types";
|
|
25
|
+
import Subscription from "./subscription";
|
|
26
|
+
import ConnectionException from "./exceptions/ConnectionException";
|
|
27
|
+
import Utils from "./utils";
|
|
18
28
|
|
|
19
29
|
const CONNECTING = 0;
|
|
20
30
|
const OPEN = 1;
|
|
@@ -22,12 +32,12 @@ const OPEN = 1;
|
|
|
22
32
|
const uuid = hyperid();
|
|
23
33
|
|
|
24
34
|
export enum Events {
|
|
25
|
-
autoRecoverSuccess =
|
|
26
|
-
autoRecoverFailed =
|
|
27
|
-
autoRecoverError =
|
|
28
|
-
newWebSocketObject =
|
|
29
|
-
newWsc =
|
|
30
|
-
connectionReady =
|
|
35
|
+
autoRecoverSuccess = "autoRecoverSuccess",
|
|
36
|
+
autoRecoverFailed = "autoRecoverFailed",
|
|
37
|
+
autoRecoverError = "autoRecoverError",
|
|
38
|
+
newWebSocketObject = "newWebSocketObject",
|
|
39
|
+
newWsc = "newWsc",
|
|
40
|
+
connectionReady = "connectionReady",
|
|
31
41
|
}
|
|
32
42
|
|
|
33
43
|
class WebSocketExtension extends SdkExtension {
|
|
@@ -94,16 +104,17 @@ class WebSocketExtension extends SdkExtension {
|
|
|
94
104
|
content?: {},
|
|
95
105
|
queryParams?: {},
|
|
96
106
|
config?: RestRequestConfig,
|
|
97
|
-
// eslint-disable-next-line max-params
|
|
98
107
|
): Promise<RestResponse<T>> => {
|
|
99
108
|
if (!this.enabled || !this.options.restOverWebSocket) {
|
|
100
109
|
return request(method, endpoint, content, queryParams, config);
|
|
101
110
|
}
|
|
102
111
|
if (
|
|
103
112
|
// the following cannot be done with WebSocket
|
|
104
|
-
config?.headers?.getContentType?.toString()?.includes(
|
|
105
|
-
|
|
106
|
-
|
|
113
|
+
config?.headers?.getContentType?.toString()?.includes(
|
|
114
|
+
"multipart/form-data",
|
|
115
|
+
) ||
|
|
116
|
+
config?.responseType === "arraybuffer" ||
|
|
117
|
+
endpoint.startsWith("/restapi/oauth/") // token, revoke, wstoken
|
|
107
118
|
) {
|
|
108
119
|
return request(method, endpoint, content, queryParams, config);
|
|
109
120
|
}
|
|
@@ -134,7 +145,7 @@ class WebSocketExtension extends SdkExtension {
|
|
|
134
145
|
throw e; // such as InsufficientPermissions
|
|
135
146
|
}
|
|
136
147
|
if (this.options.debugMode) {
|
|
137
|
-
console.debug(
|
|
148
|
+
console.debug("Initial connect failed:", e);
|
|
138
149
|
}
|
|
139
150
|
}
|
|
140
151
|
let retriesAttempted = 0;
|
|
@@ -156,10 +167,12 @@ class WebSocketExtension extends SdkExtension {
|
|
|
156
167
|
await this.recover();
|
|
157
168
|
retriesAttempted = 0;
|
|
158
169
|
if (this.options.debugMode) {
|
|
159
|
-
console.debug(
|
|
170
|
+
console.debug(
|
|
171
|
+
`Auto recover done, recoveryState: ${this.connectionDetails.recoveryState}`,
|
|
172
|
+
);
|
|
160
173
|
}
|
|
161
174
|
this.eventEmitter.emit(
|
|
162
|
-
this.connectionDetails.recoveryState ===
|
|
175
|
+
this.connectionDetails.recoveryState === "Successful"
|
|
163
176
|
? Events.autoRecoverSuccess
|
|
164
177
|
: Events.autoRecoverFailed,
|
|
165
178
|
this.ws,
|
|
@@ -170,25 +183,31 @@ class WebSocketExtension extends SdkExtension {
|
|
|
170
183
|
}
|
|
171
184
|
retriesAttempted += 1;
|
|
172
185
|
if (this.options.debugMode) {
|
|
173
|
-
console.debug(
|
|
186
|
+
console.debug("Auto recover error:", e);
|
|
174
187
|
}
|
|
175
188
|
this.eventEmitter.emit(Events.autoRecoverError, e);
|
|
176
189
|
}
|
|
177
|
-
this.intervalHandle = setInterval(
|
|
190
|
+
this.intervalHandle = setInterval(
|
|
191
|
+
check,
|
|
192
|
+
this.options.autoRecover!.checkInterval!(retriesAttempted),
|
|
193
|
+
);
|
|
178
194
|
}
|
|
179
195
|
checking = false;
|
|
180
196
|
};
|
|
181
|
-
this.intervalHandle = setInterval(
|
|
197
|
+
this.intervalHandle = setInterval(
|
|
198
|
+
check,
|
|
199
|
+
this.options.autoRecover!.checkInterval!(retriesAttempted),
|
|
200
|
+
);
|
|
182
201
|
|
|
183
202
|
// browser only code start
|
|
184
|
-
if (typeof window !==
|
|
185
|
-
window.addEventListener(
|
|
203
|
+
if (typeof window !== "undefined" && window.addEventListener) {
|
|
204
|
+
window.addEventListener("offline", () => {
|
|
186
205
|
if (this.pingServerHandle) {
|
|
187
206
|
clearTimeout(this.pingServerHandle);
|
|
188
207
|
}
|
|
189
208
|
this.ws?.close();
|
|
190
209
|
});
|
|
191
|
-
window.addEventListener(
|
|
210
|
+
window.addEventListener("online", () => {
|
|
192
211
|
check();
|
|
193
212
|
});
|
|
194
213
|
}
|
|
@@ -221,15 +240,16 @@ class WebSocketExtension extends SdkExtension {
|
|
|
221
240
|
}
|
|
222
241
|
if (
|
|
223
242
|
this.connectionDetails !== undefined &&
|
|
224
|
-
Date.now() - this.recoverTimestamp >
|
|
243
|
+
Date.now() - this.recoverTimestamp >
|
|
244
|
+
this.connectionDetails.recoveryTimeout * 1000
|
|
225
245
|
) {
|
|
226
246
|
if (this.options.debugMode) {
|
|
227
|
-
console.debug(
|
|
247
|
+
console.debug("connect to WSG but do not recover");
|
|
228
248
|
}
|
|
229
249
|
await this.connect(false); // connect to WSG but do not recover
|
|
230
250
|
} else {
|
|
231
251
|
if (this.options.debugMode) {
|
|
232
|
-
console.debug(
|
|
252
|
+
console.debug("connect to WSG and recover");
|
|
233
253
|
}
|
|
234
254
|
await this.connect(true); // connect to WSG and recover
|
|
235
255
|
}
|
|
@@ -248,12 +268,11 @@ class WebSocketExtension extends SdkExtension {
|
|
|
248
268
|
await this.ws.send(
|
|
249
269
|
JSON.stringify([
|
|
250
270
|
{
|
|
251
|
-
type:
|
|
271
|
+
type: "Heartbeat",
|
|
252
272
|
messageId: uuid(),
|
|
253
273
|
},
|
|
254
274
|
]),
|
|
255
275
|
);
|
|
256
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
257
276
|
} catch (e) {
|
|
258
277
|
this.ws.close(); // Explicitly mark WS as closed
|
|
259
278
|
}
|
|
@@ -274,12 +293,14 @@ class WebSocketExtension extends SdkExtension {
|
|
|
274
293
|
|
|
275
294
|
public async _connect(recoverSession = false) {
|
|
276
295
|
if (!this.wsToken || Date.now() > this.wsTokenExpiresAt) {
|
|
277
|
-
const r = await this.rc.post(
|
|
296
|
+
const r = await this.rc.post("/restapi/oauth/wstoken");
|
|
278
297
|
this.wsToken = r.data as WsToken;
|
|
279
298
|
// `expires_in` default value is 600 seconds. That's why we `* 0.8`
|
|
280
299
|
this.wsTokenExpiresAt = Date.now() + this.wsToken.expires_in * 0.8 * 1000;
|
|
281
300
|
}
|
|
282
|
-
let wsUri = `${this.wsToken!.uri}?access_token=${
|
|
301
|
+
let wsUri = `${this.wsToken!.uri}?access_token=${
|
|
302
|
+
this.wsToken!.ws_access_token
|
|
303
|
+
}`;
|
|
283
304
|
if (recoverSession && this.wsc) {
|
|
284
305
|
wsUri += `&wsc=${this.wsc.token}`;
|
|
285
306
|
}
|
|
@@ -299,11 +320,14 @@ class WebSocketExtension extends SdkExtension {
|
|
|
299
320
|
};
|
|
300
321
|
|
|
301
322
|
if (this.options.autoRecover?.enabled) {
|
|
302
|
-
this.ws.addEventListener(
|
|
323
|
+
this.ws.addEventListener("message", () => {
|
|
303
324
|
if (this.pingServerHandle) {
|
|
304
325
|
clearTimeout(this.pingServerHandle);
|
|
305
326
|
}
|
|
306
|
-
this.pingServerHandle = setTimeout(
|
|
327
|
+
this.pingServerHandle = setTimeout(
|
|
328
|
+
() => this.pingServer(),
|
|
329
|
+
this.options.autoRecover!.pingServerInterval,
|
|
330
|
+
);
|
|
307
331
|
});
|
|
308
332
|
}
|
|
309
333
|
|
|
@@ -313,13 +337,13 @@ class WebSocketExtension extends SdkExtension {
|
|
|
313
337
|
}
|
|
314
338
|
|
|
315
339
|
// listen for new wsc data
|
|
316
|
-
this.ws.addEventListener(
|
|
340
|
+
this.ws.addEventListener("message", (mEvent: MessageEvent) => {
|
|
317
341
|
const event = mEvent as WsgEvent;
|
|
318
342
|
const [meta, body] = Utils.splitWsgData(event.data);
|
|
319
343
|
if (
|
|
320
344
|
meta.wsc &&
|
|
321
345
|
(!this.wsc ||
|
|
322
|
-
(meta.type ===
|
|
346
|
+
(meta.type === "ConnectionDetails" && body.recoveryState) ||
|
|
323
347
|
this.wsc.sequence < meta.wsc.sequence)
|
|
324
348
|
) {
|
|
325
349
|
this.wsc = meta.wsc;
|
|
@@ -330,9 +354,9 @@ class WebSocketExtension extends SdkExtension {
|
|
|
330
354
|
// get initial ConnectionDetails data
|
|
331
355
|
const [meta, body, event] = await Utils.waitForWebSocketMessage(
|
|
332
356
|
this.ws,
|
|
333
|
-
(meta) => meta.type ===
|
|
357
|
+
(meta) => meta.type === "ConnectionDetails" || meta.type === "Error",
|
|
334
358
|
);
|
|
335
|
-
if (meta.type ===
|
|
359
|
+
if (meta.type === "Error") {
|
|
336
360
|
throw new ConnectionException(event);
|
|
337
361
|
}
|
|
338
362
|
this.connectionDetails = body;
|
|
@@ -344,7 +368,9 @@ class WebSocketExtension extends SdkExtension {
|
|
|
344
368
|
if (this.subscription && this.subscription.enabled) {
|
|
345
369
|
// because we have a new ws object
|
|
346
370
|
this.subscription.setupWsEventListener();
|
|
347
|
-
if (
|
|
371
|
+
if (
|
|
372
|
+
!recoverSession || this.connectionDetails.recoveryState === "Failed"
|
|
373
|
+
) {
|
|
348
374
|
// create new subscription if don't recover existing one
|
|
349
375
|
await this.subscription.subscribe();
|
|
350
376
|
}
|
|
@@ -373,7 +399,11 @@ class WebSocketExtension extends SdkExtension {
|
|
|
373
399
|
callback: (event: {}) => void,
|
|
374
400
|
cache: SubscriptionInfo | undefined | null = undefined,
|
|
375
401
|
) {
|
|
376
|
-
const subscription = new Subscription(
|
|
402
|
+
const subscription = new Subscription(
|
|
403
|
+
this as WebSocketExtensionInterface,
|
|
404
|
+
eventFilters,
|
|
405
|
+
callback,
|
|
406
|
+
);
|
|
377
407
|
if (cache === undefined || cache === null) {
|
|
378
408
|
await subscription.subscribe();
|
|
379
409
|
} else {
|
package/src/rest.d.ts
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { RestMethod, RestRequestConfig, RestResponse } from "@rc-ex/core/src/types";
|
|
2
|
+
import type { WebSocketExtensionInterface } from "./types";
|
|
3
|
+
export declare function request<T>(this: WebSocketExtensionInterface, method: RestMethod, endpoint: string, content?: {}, queryParams?: {}, config?: RestRequestConfig): Promise<RestResponse<T>>;
|