@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.
Files changed (63) hide show
  1. package/README.md +49 -22
  2. package/lib/exceptions/ClosedException.js +1 -1
  3. package/lib/exceptions/ClosedException.js.map +1 -1
  4. package/lib/exceptions/ClosedException.ts +7 -0
  5. package/lib/exceptions/ConnectionException.d.ts +1 -1
  6. package/lib/exceptions/ConnectionException.js.map +1 -1
  7. package/lib/exceptions/ConnectionException.ts +17 -0
  8. package/lib/exceptions/TimeoutException.js +1 -1
  9. package/lib/exceptions/TimeoutException.js.map +1 -1
  10. package/lib/exceptions/TimeoutException.ts +7 -0
  11. package/lib/index.d.ts +8 -8
  12. package/lib/index.js +23 -23
  13. package/lib/index.js.map +1 -1
  14. package/lib/index.ts +418 -0
  15. package/lib/rest.d.ts +2 -2
  16. package/lib/rest.js +5 -6
  17. package/lib/rest.js.map +1 -1
  18. package/lib/rest.ts +71 -0
  19. package/lib/subscription.d.ts +4 -4
  20. package/lib/subscription.js +11 -9
  21. package/lib/subscription.js.map +1 -1
  22. package/lib/subscription.ts +131 -0
  23. package/lib/types.d.ts +5 -5
  24. package/lib/types.js.map +1 -1
  25. package/lib/types.ts +85 -0
  26. package/lib/utils.d.ts +2 -2
  27. package/lib/utils.js +16 -16
  28. package/lib/utils.js.map +1 -1
  29. package/lib/utils.ts +82 -0
  30. package/package.json +6 -6
  31. package/src/exceptions/ClosedException.d.ts +4 -0
  32. package/src/exceptions/ClosedException.js +9 -0
  33. package/src/exceptions/ClosedException.js.map +1 -0
  34. package/src/exceptions/ClosedException.ts +1 -1
  35. package/src/exceptions/ConnectionException.d.ts +7 -0
  36. package/src/exceptions/ConnectionException.js +16 -0
  37. package/src/exceptions/ConnectionException.js.map +1 -0
  38. package/src/exceptions/ConnectionException.ts +2 -2
  39. package/src/exceptions/TimeoutException.d.ts +4 -0
  40. package/src/exceptions/TimeoutException.js +9 -0
  41. package/src/exceptions/TimeoutException.js.map +1 -0
  42. package/src/exceptions/TimeoutException.ts +1 -1
  43. package/src/index.d.ts +44 -0
  44. package/src/index.js +329 -0
  45. package/src/index.js.map +1 -0
  46. package/src/index.ts +81 -51
  47. package/src/rest.d.ts +3 -0
  48. package/src/rest.js +55 -0
  49. package/src/rest.js.map +1 -0
  50. package/src/rest.ts +22 -12
  51. package/src/subscription.d.ts +20 -0
  52. package/src/subscription.js +91 -0
  53. package/src/subscription.js.map +1 -0
  54. package/src/subscription.ts +36 -18
  55. package/src/types.d.ts +61 -0
  56. package/src/types.js +3 -0
  57. package/src/types.js.map +1 -0
  58. package/src/types.ts +14 -5
  59. package/src/utils.d.ts +8 -0
  60. package/src/utils.js +72 -0
  61. package/src/utils.js.map +1 -0
  62. package/src/utils.ts +26 -23
  63. 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
@@ -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
- /* eslint-disable no-console */
2
- import type RingCentral from '@rc-ex/core';
3
- import type { RestMethod, RestRequestConfig, RestResponse } from '@rc-ex/core/lib/types';
4
- import SdkExtension from '@rc-ex/core/lib/SdkExtension';
5
- import type { MessageEvent } from 'isomorphic-ws';
6
- import WS from 'isomorphic-ws';
7
- import hyperid from 'hyperid';
8
- import { EventEmitter } from 'events';
9
- import waitFor from 'wait-for-async';
10
- import RestException from '@rc-ex/core/lib/RestException';
11
- import type SubscriptionInfo from '@rc-ex/core/lib/definitions/SubscriptionInfo';
12
-
13
- import { request } from './rest';
14
- import type { WsToken, ConnectionDetails, WebSocketOptions, WsgEvent, Wsc, WebSocketExtensionInterface } from './types';
15
- import Subscription from './subscription';
16
- import ConnectionException from './exceptions/ConnectionException';
17
- import Utils from './utils';
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 = 'autoRecoverSuccess',
26
- autoRecoverFailed = 'autoRecoverFailed',
27
- autoRecoverError = 'autoRecoverError',
28
- newWebSocketObject = 'newWebSocketObject',
29
- newWsc = 'newWsc',
30
- connectionReady = '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('multipart/form-data') ||
105
- config?.responseType === 'arraybuffer' ||
106
- endpoint.startsWith('/restapi/oauth/') // token, revoke, wstoken
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('Initial connect failed:', e);
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(`Auto recover done, recoveryState: ${this.connectionDetails.recoveryState}`);
170
+ console.debug(
171
+ `Auto recover done, recoveryState: ${this.connectionDetails.recoveryState}`,
172
+ );
160
173
  }
161
174
  this.eventEmitter.emit(
162
- this.connectionDetails.recoveryState === 'Successful'
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('Auto recover error:', e);
186
+ console.debug("Auto recover error:", e);
174
187
  }
175
188
  this.eventEmitter.emit(Events.autoRecoverError, e);
176
189
  }
177
- this.intervalHandle = setInterval(check, this.options.autoRecover!.checkInterval!(retriesAttempted));
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(check, this.options.autoRecover!.checkInterval!(retriesAttempted));
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 !== 'undefined' && window.addEventListener) {
185
- window.addEventListener('offline', () => {
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('online', () => {
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 > this.connectionDetails.recoveryTimeout * 1000
243
+ Date.now() - this.recoverTimestamp >
244
+ this.connectionDetails.recoveryTimeout * 1000
225
245
  ) {
226
246
  if (this.options.debugMode) {
227
- console.debug('connect to WSG but do not recover');
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('connect to WSG and recover');
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: 'Heartbeat',
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('/restapi/oauth/wstoken');
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=${this.wsToken!.ws_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('message', () => {
323
+ this.ws.addEventListener("message", () => {
303
324
  if (this.pingServerHandle) {
304
325
  clearTimeout(this.pingServerHandle);
305
326
  }
306
- this.pingServerHandle = setTimeout(() => this.pingServer(), this.options.autoRecover!.pingServerInterval);
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('message', (mEvent: MessageEvent) => {
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 === 'ConnectionDetails' && body.recoveryState) ||
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 === 'ConnectionDetails' || meta.type === 'Error',
357
+ (meta) => meta.type === "ConnectionDetails" || meta.type === "Error",
334
358
  );
335
- if (meta.type === 'Error') {
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 (!recoverSession || this.connectionDetails.recoveryState === 'Failed') {
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(this as WebSocketExtensionInterface, eventFilters, callback);
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>>;