@push-rpc/next 2.0.11 → 2.0.12

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 (79) hide show
  1. package/README.md +214 -20
  2. package/example/client.ts +1 -1
  3. package/example/server.ts +2 -2
  4. package/package-lock.json +1291 -0
  5. package/package.json +1 -1
  6. package/src/client/RpcClientImpl.ts +11 -3
  7. package/src/client/WebSocketConnection.ts +7 -3
  8. package/src/client/index.ts +2 -2
  9. package/src/utils/middleware.ts +7 -2
  10. package/tests/middleware.ts +104 -7
  11. package/tests/testUtils.ts +2 -2
  12. package/dist/client/HttpClient.d.ts +0 -11
  13. package/dist/client/HttpClient.js +0 -84
  14. package/dist/client/HttpClient.js.map +0 -1
  15. package/dist/client/RemoteSubscriptions.d.ts +0 -18
  16. package/dist/client/RemoteSubscriptions.js +0 -120
  17. package/dist/client/RemoteSubscriptions.js.map +0 -1
  18. package/dist/client/RpcClientImpl.d.ts +0 -22
  19. package/dist/client/RpcClientImpl.js +0 -121
  20. package/dist/client/RpcClientImpl.js.map +0 -1
  21. package/dist/client/WebSocketConnection.d.ts +0 -36
  22. package/dist/client/WebSocketConnection.js +0 -161
  23. package/dist/client/WebSocketConnection.js.map +0 -1
  24. package/dist/client/index.d.ts +0 -29
  25. package/dist/client/index.js +0 -39
  26. package/dist/client/index.js.map +0 -1
  27. package/dist/client/remote.d.ts +0 -14
  28. package/dist/client/remote.js +0 -66
  29. package/dist/client/remote.js.map +0 -1
  30. package/dist/index.d.ts +0 -13
  31. package/dist/index.js.map +0 -1
  32. package/dist/logger.d.ts +0 -8
  33. package/dist/logger.js +0 -9
  34. package/dist/logger.js.map +0 -1
  35. package/dist/rpc.d.ts +0 -37
  36. package/dist/rpc.js +0 -33
  37. package/dist/rpc.js.map +0 -1
  38. package/dist/server/ConnectionsServer.d.ts +0 -13
  39. package/dist/server/ConnectionsServer.js +0 -72
  40. package/dist/server/ConnectionsServer.js.map +0 -1
  41. package/dist/server/LocalSubscriptions.d.ts +0 -12
  42. package/dist/server/LocalSubscriptions.js +0 -113
  43. package/dist/server/LocalSubscriptions.js.map +0 -1
  44. package/dist/server/RpcServerImpl.d.ts +0 -24
  45. package/dist/server/RpcServerImpl.js +0 -200
  46. package/dist/server/RpcServerImpl.js.map +0 -1
  47. package/dist/server/http.d.ts +0 -9
  48. package/dist/server/http.js +0 -89
  49. package/dist/server/http.js.map +0 -1
  50. package/dist/server/index.d.ts +0 -32
  51. package/dist/server/index.js +0 -33
  52. package/dist/server/index.js.map +0 -1
  53. package/dist/server/local.d.ts +0 -15
  54. package/dist/server/local.js +0 -46
  55. package/dist/server/local.js.map +0 -1
  56. package/dist/utils/cookies.d.ts +0 -7
  57. package/dist/utils/cookies.js +0 -31
  58. package/dist/utils/cookies.js.map +0 -1
  59. package/dist/utils/env.d.ts +0 -6
  60. package/dist/utils/env.js +0 -22
  61. package/dist/utils/env.js.map +0 -1
  62. package/dist/utils/json.d.ts +0 -2
  63. package/dist/utils/json.js +0 -34
  64. package/dist/utils/json.js.map +0 -1
  65. package/dist/utils/middleware.d.ts +0 -2
  66. package/dist/utils/middleware.js +0 -31
  67. package/dist/utils/middleware.js.map +0 -1
  68. package/dist/utils/promises.d.ts +0 -5
  69. package/dist/utils/promises.js +0 -29
  70. package/dist/utils/promises.js.map +0 -1
  71. package/dist/utils/server.d.ts +0 -5
  72. package/dist/utils/server.js +0 -48
  73. package/dist/utils/server.js.map +0 -1
  74. package/dist/utils/throttle.d.ts +0 -4
  75. package/dist/utils/throttle.js +0 -40
  76. package/dist/utils/throttle.js.map +0 -1
  77. package/dist/utils/types.d.ts +0 -1
  78. package/dist/utils/types.js +0 -3
  79. package/dist/utils/types.js.map +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@push-rpc/next",
3
- "version": "2.0.11",
3
+ "version": "2.0.12",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "scripts": {
@@ -5,7 +5,7 @@ import {WebSocketConnection} from "./WebSocketConnection.js"
5
5
  import {nanoid} from "nanoid"
6
6
  import {createRemote, ServicesWithSubscriptions} from "./remote.js"
7
7
  import {ConsumeServicesOptions, RpcClient} from "./index.js"
8
- import {withMiddlewares} from "../utils/middleware.js"
8
+ import {Middleware, withMiddlewares} from "../utils/middleware.js"
9
9
 
10
10
  export class RpcClientImpl<S extends Services<S>> implements RpcClient {
11
11
  constructor(
@@ -31,8 +31,16 @@ export class RpcClientImpl<S extends Services<S>> implements RpcClient {
31
31
  invocationType: InvocationType.Update,
32
32
  }
33
33
 
34
- const next = async (p = data) => this.remoteSubscriptions.consume(itemName, parameters, p)
35
- return withMiddlewares(ctx, this.options.updatesMiddleware, next, data)
34
+ const next = async (nextData = data, nextParameters = parameters) =>
35
+ this.remoteSubscriptions.consume(itemName, nextParameters, nextData)
36
+
37
+ return withMiddlewares(
38
+ ctx,
39
+ this.options.notificationsMiddleware,
40
+ next as any,
41
+ data,
42
+ parameters
43
+ )
36
44
  },
37
45
  () => {
38
46
  this.resubscribe()
@@ -12,7 +12,11 @@ export class WebSocketConnection {
12
12
  errorDelayMaxDuration: number
13
13
  pingInterval: number | null
14
14
  },
15
- private readonly consume: (itemName: string, parameters: unknown[], data: unknown) => void,
15
+ private readonly consume: (
16
+ itemName: string,
17
+ parameters: unknown[],
18
+ data: unknown
19
+ ) => Promise<unknown>,
16
20
  private readonly onConnected: () => void,
17
21
  private readonly onDisconnected: () => void
18
22
  ) {
@@ -194,9 +198,9 @@ export class WebSocketConnection {
194
198
 
195
199
  const [itemName, data, ...parameters] = safeParseJson(msg)
196
200
 
197
- this.consume(itemName, parameters, data)
201
+ await this.consume(itemName, parameters, data)
198
202
  } catch (e) {
199
- log.warn("Invalid message received", e)
203
+ log.error("Can't handle notification", e)
200
204
  }
201
205
  }
202
206
 
@@ -22,7 +22,7 @@ export type ConsumeServicesOptions = {
22
22
  pingInterval: number | null
23
23
  subscriptions: boolean
24
24
  middleware: Middleware<RpcContext>[]
25
- updatesMiddleware: Middleware<RpcContext>[]
25
+ notificationsMiddleware: Middleware<RpcContext>[]
26
26
  connectOnCreate: boolean
27
27
  onConnected: () => void
28
28
  onDisconnected: () => void
@@ -65,7 +65,7 @@ const defaultOptions: ConsumeServicesOptions = {
65
65
  pingInterval: null, // if set, should be in-sync with server, ie 30 * 1000
66
66
  subscriptions: true,
67
67
  middleware: [],
68
- updatesMiddleware: [],
68
+ notificationsMiddleware: [],
69
69
  connectOnCreate: false,
70
70
  onConnected: () => {},
71
71
  onDisconnected: () => {},
@@ -25,11 +25,16 @@ export function withMiddlewares<Context>(
25
25
  index = i
26
26
 
27
27
  try {
28
+ let result
29
+
28
30
  if (i === middlewares.length) {
29
- return Promise.resolve(next(...p))
31
+ result = next(...p)
30
32
  } else {
31
- return Promise.resolve(middlewares[i](ctx, dispatch.bind(null, i + 1), ...p))
33
+ const dispatchNextMiddleware = dispatch.bind(null, i + 1)
34
+ result = middlewares[i](ctx, dispatchNextMiddleware, ...p)
32
35
  }
36
+
37
+ return Promise.resolve(result)
33
38
  } catch (err) {
34
39
  return Promise.reject(err)
35
40
  }
@@ -1,5 +1,5 @@
1
1
  import {assert} from "chai"
2
- import {Middleware, withMiddlewares} from "../src/index.js"
2
+ import {Middleware, setLogger, withMiddlewares} from "../src/index.js"
3
3
  import {createTestClient, startTestServer} from "./testUtils.js"
4
4
  import {adelay} from "../src/utils/promises.js"
5
5
 
@@ -110,19 +110,20 @@ describe("middleware", () => {
110
110
  }
111
111
  })
112
112
 
113
- it("updates middlewares", async () => {
113
+ it("notifications middlewares", async () => {
114
114
  let count = 1
115
115
 
116
116
  const services = await startTestServer({
117
- async remote() {
117
+ async remote(filter: {param: number}) {
118
118
  return count++
119
119
  },
120
120
  })
121
121
 
122
122
  const client = await createTestClient<typeof services>({
123
- updatesMiddleware: [
124
- (ctx, next, r) => {
123
+ notificationsMiddleware: [
124
+ (ctx, next, r, params) => {
125
125
  assert.ok(ctx.itemName)
126
+ assert.deepEqual(params, [{param: 1}])
126
127
 
127
128
  return next((r as number) + 1)
128
129
  },
@@ -130,14 +131,110 @@ describe("middleware", () => {
130
131
  })
131
132
 
132
133
  let response
134
+ await client.remote.subscribe(
135
+ (r) => {
136
+ response = r
137
+ },
138
+ {param: 1}
139
+ )
140
+
141
+ services.remote.trigger({param: 1})
142
+
143
+ await adelay(20)
144
+
145
+ assert.equal(response, 3)
146
+ })
147
+
148
+ it("error in notificationsMiddleware logged", async () => {
149
+ let log = ""
150
+
151
+ setLogger({
152
+ error(s: unknown, ...params) {
153
+ log += s + "\n" + params
154
+ },
155
+ warn: console.warn,
156
+ debug: console.debug,
157
+ info: console.info,
158
+ })
159
+
160
+ let count = 1
161
+ let result = 0
162
+
163
+ const services = await startTestServer({
164
+ async remote() {
165
+ return count++
166
+ },
167
+ })
168
+
169
+ const client = await createTestClient<typeof services>({
170
+ notificationsMiddleware: [
171
+ () => {
172
+ throw new Error("Test error")
173
+ },
174
+ ],
175
+ })
176
+
133
177
  await client.remote.subscribe((r) => {
134
- response = r
178
+ result = r
135
179
  })
136
180
 
137
181
  services.remote.trigger()
138
182
 
139
183
  await adelay(20)
140
184
 
141
- assert.equal(response, 3)
185
+ assert.equal(result, 1)
186
+
187
+ assert.include(log, "Test error")
188
+
189
+ setLogger(console)
190
+ })
191
+
192
+ it("error in client request middleware propagated", async () => {
193
+ let count = 1
194
+
195
+ const services = await startTestServer({
196
+ async remote() {
197
+ return count++
198
+ },
199
+ })
200
+
201
+ const client = await createTestClient<typeof services>({
202
+ middleware: [
203
+ () => {
204
+ throw new Error("Error")
205
+ },
206
+ ],
207
+ })
208
+
209
+ try {
210
+ await client.remote()
211
+ assert.fail("Expected to fail")
212
+ } catch (e) {}
213
+ })
214
+
215
+ it("error in server request middleware propagated", async () => {
216
+ let count = 1
217
+
218
+ const services = await startTestServer(
219
+ {
220
+ async remote() {
221
+ return count++
222
+ },
223
+ },
224
+ {
225
+ middleware: [
226
+ () => {
227
+ throw new Error("Error")
228
+ },
229
+ ],
230
+ }
231
+ )
232
+
233
+ const client = await createTestClient<typeof services>({})
234
+
235
+ try {
236
+ await client.remote()
237
+ assert.fail("Expected to fail")
238
+ } catch (e) {}
142
239
  })
143
240
  })
@@ -39,8 +39,8 @@ export async function createTestClient<S extends Services<S>>(
39
39
  if (!options) options = {}
40
40
  if (!options.middleware) options.middleware = []
41
41
  options.middleware = [logMiddleware, ...options.middleware]
42
- if (!options.updatesMiddleware) options.updatesMiddleware = []
43
- options.updatesMiddleware = [logUpdatesMiddleware, ...options.updatesMiddleware]
42
+ if (!options.notificationsMiddleware) options.notificationsMiddleware = []
43
+ options.notificationsMiddleware = [logUpdatesMiddleware, ...options.notificationsMiddleware]
44
44
 
45
45
  const r = await consumeServices<S>(`http://127.0.0.1:${TEST_PORT}/rpc`, options)
46
46
  testClient = r.client
@@ -1,11 +0,0 @@
1
- export declare class HttpClient {
2
- private url;
3
- private clientId;
4
- private getHeaders;
5
- constructor(url: string, clientId: string, getHeaders: () => Promise<Record<string, string>>);
6
- call(itemName: string, params: unknown[], callTimeout: number): Promise<unknown>;
7
- subscribe(itemName: string, params: unknown[], callTimeout: number): Promise<unknown>;
8
- unsubscribe(itemName: string, params: unknown[], callTimeout: number): Promise<void>;
9
- private getItemUrl;
10
- private httpRequest;
11
- }
@@ -1,84 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.HttpClient = void 0;
4
- const rpc_js_1 = require("../rpc.js");
5
- const json_js_1 = require("../utils/json.js");
6
- class HttpClient {
7
- constructor(url, clientId, getHeaders) {
8
- this.url = url;
9
- this.clientId = clientId;
10
- this.getHeaders = getHeaders;
11
- }
12
- async call(itemName, params, callTimeout) {
13
- return this.httpRequest("POST", itemName, params, callTimeout, await this.getHeaders());
14
- }
15
- async subscribe(itemName, params, callTimeout) {
16
- return this.httpRequest("PUT", itemName, params, callTimeout, await this.getHeaders());
17
- }
18
- async unsubscribe(itemName, params, callTimeout) {
19
- await this.httpRequest("PATCH", itemName, params, callTimeout, await this.getHeaders());
20
- }
21
- getItemUrl(itemName) {
22
- return `${this.url}/${itemName}`;
23
- }
24
- async httpRequest(method, itemName, params, callTimeout, headers) {
25
- const itemUrl = this.getItemUrl(itemName);
26
- try {
27
- const { signal, finished } = timeoutSignal(callTimeout);
28
- const response = await fetch(itemUrl, {
29
- method,
30
- headers: {
31
- "Content-Type": "application/json",
32
- [rpc_js_1.CLIENT_ID_HEADER]: this.clientId,
33
- ...headers,
34
- },
35
- body: (0, json_js_1.safeStringify)(params),
36
- signal,
37
- });
38
- finished();
39
- if (response.status == 204) {
40
- return;
41
- }
42
- const contentType = response.headers.get("content-type");
43
- const text = await response.text();
44
- const res = contentType && contentType.includes("application/json") ? (0, json_js_1.safeParseJson)(text) : text;
45
- if (response.status < 200 || response.status >= 300) {
46
- const error = new Error(response.statusText);
47
- Object.assign(error, { code: response.status });
48
- if (typeof res == "object") {
49
- Object.assign(error, res);
50
- }
51
- throw error;
52
- }
53
- else {
54
- return res;
55
- }
56
- }
57
- catch (e) {
58
- if (e.message == "Error" || !e.message) {
59
- e.message = `Error ${e.code} while ${itemUrl}`;
60
- }
61
- if (e.message == "fetch failed" && e.cause) {
62
- e = e.cause;
63
- }
64
- if (e.message?.toLowerCase()?.includes("timeout")) {
65
- // NodeJS undici http client timeout
66
- const error = new Error("Timeout");
67
- Object.assign(error, { code: rpc_js_1.RpcErrors.Timeout });
68
- throw error;
69
- }
70
- throw e;
71
- }
72
- }
73
- }
74
- exports.HttpClient = HttpClient;
75
- // AbortSignal.timeout polyfill for RN
76
- function timeoutSignal(time) {
77
- const controller = new AbortController();
78
- const timeout = setTimeout(() => controller.abort(new Error("TimeoutError")), time);
79
- return {
80
- signal: controller.signal,
81
- finished: () => clearTimeout(timeout),
82
- };
83
- }
84
- //# sourceMappingURL=HttpClient.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"HttpClient.js","sourceRoot":"","sources":["../../src/client/HttpClient.ts"],"names":[],"mappings":"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"}
@@ -1,18 +0,0 @@
1
- export declare class RemoteSubscriptions {
2
- unsubscribe(itemName: string, parameters: unknown[], consumer: (d: unknown) => void): boolean;
3
- addSubscription(itemName: string, parameters: unknown[], consumer: (d: unknown) => void): void;
4
- pause(itemName: string, parameters: unknown[]): void;
5
- unpause(itemName: string, parameters: unknown[]): void;
6
- flushQueue(itemName: string, parameters: unknown[]): void;
7
- emptyQueue(itemName: string, parameters: unknown[]): void;
8
- private removeSubscription;
9
- getCached(itemName: string, parameters: unknown[]): unknown | undefined;
10
- consume(itemName: string, parameters: unknown[], data: unknown): void;
11
- getAllSubscriptions(): Array<[
12
- itemName: string,
13
- parameters: unknown[],
14
- consumers: Array<(d: unknown) => void>
15
- ]>;
16
- private getFilterSubscriptions;
17
- private byItem;
18
- }
@@ -1,120 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.RemoteSubscriptions = void 0;
4
- const json_js_1 = require("../utils/json.js");
5
- class RemoteSubscriptions {
6
- constructor() {
7
- this.byItem = new Map();
8
- }
9
- unsubscribe(itemName, parameters, consumer) {
10
- const parametersKey = getParametersKey(parameters);
11
- return this.removeSubscription(itemName, parametersKey, consumer);
12
- }
13
- addSubscription(itemName, parameters, consumer) {
14
- const itemSubscriptions = this.byItem.get(itemName) || { byParameters: new Map() };
15
- this.byItem.set(itemName, itemSubscriptions);
16
- const parametersKey = getParametersKey(parameters);
17
- const parameterSubscriptions = itemSubscriptions.byParameters.get(parametersKey) || {
18
- parameters,
19
- cached: null,
20
- consumers: [],
21
- queue: [],
22
- };
23
- itemSubscriptions.byParameters.set(parametersKey, parameterSubscriptions);
24
- parameterSubscriptions.consumers.push(consumer);
25
- }
26
- pause(itemName, parameters) {
27
- const filterSubscriptions = this.getFilterSubscriptions(itemName, parameters);
28
- if (!filterSubscriptions)
29
- return;
30
- filterSubscriptions.paused = true;
31
- }
32
- unpause(itemName, parameters) {
33
- const filterSubscriptions = this.getFilterSubscriptions(itemName, parameters);
34
- if (!filterSubscriptions)
35
- return;
36
- filterSubscriptions.paused = false;
37
- }
38
- flushQueue(itemName, parameters) {
39
- const filterSubscriptions = this.getFilterSubscriptions(itemName, parameters);
40
- if (!filterSubscriptions)
41
- return;
42
- filterSubscriptions.queue.forEach((data) => {
43
- filterSubscriptions.cached = data;
44
- filterSubscriptions.consumers.forEach((consumer) => {
45
- consumer(data);
46
- });
47
- });
48
- filterSubscriptions.queue = [];
49
- }
50
- emptyQueue(itemName, parameters) {
51
- const filterSubscriptions = this.getFilterSubscriptions(itemName, parameters);
52
- if (!filterSubscriptions)
53
- return;
54
- filterSubscriptions.queue = [];
55
- }
56
- removeSubscription(itemName, parametersKey, consumer) {
57
- const itemSubscriptions = this.byItem.get(itemName);
58
- if (!itemSubscriptions)
59
- return false;
60
- const filterSubscriptions = itemSubscriptions.byParameters.get(parametersKey);
61
- if (!filterSubscriptions)
62
- return false;
63
- const index = filterSubscriptions.consumers.indexOf(consumer);
64
- if (index == -1)
65
- return false;
66
- filterSubscriptions.consumers.splice(index, 1);
67
- if (!filterSubscriptions.consumers.length) {
68
- itemSubscriptions.byParameters.delete(parametersKey);
69
- if (itemSubscriptions.byParameters.size == 0) {
70
- this.byItem.delete(itemName);
71
- }
72
- return true;
73
- }
74
- return false;
75
- }
76
- getCached(itemName, parameters) {
77
- const filterSubscriptions = this.getFilterSubscriptions(itemName, parameters);
78
- if (!filterSubscriptions)
79
- return;
80
- return filterSubscriptions.cached;
81
- }
82
- consume(itemName, parameters, data) {
83
- const filterSubscriptions = this.getFilterSubscriptions(itemName, parameters);
84
- if (!filterSubscriptions)
85
- return;
86
- if (filterSubscriptions.paused) {
87
- filterSubscriptions.queue.push(data);
88
- }
89
- else {
90
- filterSubscriptions.cached = data;
91
- filterSubscriptions.consumers.forEach((consumer) => {
92
- consumer(data);
93
- });
94
- }
95
- }
96
- getAllSubscriptions() {
97
- const result = [];
98
- for (const [itemName, itemSubscriptions] of this.byItem) {
99
- for (const [, parameterSubscriptions] of itemSubscriptions.byParameters) {
100
- result.push([itemName, parameterSubscriptions.parameters, parameterSubscriptions.consumers]);
101
- }
102
- }
103
- return result;
104
- }
105
- getFilterSubscriptions(itemName, parameters) {
106
- const parametersKey = getParametersKey(parameters);
107
- const itemSubscriptions = this.byItem.get(itemName);
108
- if (!itemSubscriptions)
109
- return;
110
- const filterSubscriptions = itemSubscriptions.byParameters.get(parametersKey);
111
- if (!filterSubscriptions)
112
- return;
113
- return filterSubscriptions;
114
- }
115
- }
116
- exports.RemoteSubscriptions = RemoteSubscriptions;
117
- function getParametersKey(parameters) {
118
- return (0, json_js_1.safeStringify)(parameters);
119
- }
120
- //# sourceMappingURL=RemoteSubscriptions.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"RemoteSubscriptions.js","sourceRoot":"","sources":["../../src/client/RemoteSubscriptions.ts"],"names":[],"mappings":"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"}
@@ -1,22 +0,0 @@
1
- import { Services } from "../rpc.js";
2
- import { ServicesWithSubscriptions } from "./remote.js";
3
- import { ConsumeServicesOptions, RpcClient } from "./index.js";
4
- export declare class RpcClientImpl<S extends Services<S>> implements RpcClient {
5
- private readonly options;
6
- constructor(url: string, options: ConsumeServicesOptions);
7
- readonly clientId: string;
8
- private readonly httpClient;
9
- private readonly remoteSubscriptions;
10
- private readonly connection;
11
- isConnected(): boolean;
12
- close(): Promise<void>;
13
- _allSubscriptions(): [itemName: string, parameters: unknown[], consumers: (d: unknown) => void][];
14
- _webSocket(): WebSocket | null;
15
- createRemote(): ServicesWithSubscriptions<S>;
16
- connect(): Promise<void>;
17
- private call;
18
- private subscribe;
19
- private unsubscribe;
20
- private resubscribe;
21
- private invoke;
22
- }
@@ -1,121 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.RpcClientImpl = void 0;
4
- const rpc_js_1 = require("../rpc.js");
5
- const HttpClient_js_1 = require("./HttpClient.js");
6
- const RemoteSubscriptions_js_1 = require("./RemoteSubscriptions.js");
7
- const WebSocketConnection_js_1 = require("./WebSocketConnection.js");
8
- const nanoid_1 = require("nanoid");
9
- const remote_js_1 = require("./remote.js");
10
- const middleware_js_1 = require("../utils/middleware.js");
11
- class RpcClientImpl {
12
- constructor(url, options) {
13
- this.options = options;
14
- this.clientId = (0, nanoid_1.nanoid)();
15
- this.call = (itemName, parameters, callOptions) => {
16
- return this.invoke(itemName, rpc_js_1.InvocationType.Call, (...parameters) => this.httpClient.call(itemName, parameters, callOptions?.timeout ?? this.options.callTimeout), parameters);
17
- };
18
- this.subscribe = async (itemName, parameters, consumer, callOptions) => {
19
- const cached = this.remoteSubscriptions.getCached(itemName, parameters);
20
- if (cached !== undefined) {
21
- consumer(cached);
22
- }
23
- // Needs to be awaited b/c resubscribe will make a 2nd request then.
24
- // Also, server needs the connection to be established before making a subscription
25
- await this.connection.connect();
26
- try {
27
- this.remoteSubscriptions.addSubscription(itemName, parameters, consumer);
28
- this.remoteSubscriptions.pause(itemName, parameters);
29
- const data = await this.invoke(itemName, rpc_js_1.InvocationType.Subscribe, (...parameters) => this.httpClient.subscribe(itemName, parameters, callOptions?.timeout ?? this.options.callTimeout), parameters);
30
- this.remoteSubscriptions.unpause(itemName, parameters);
31
- this.remoteSubscriptions.consume(itemName, parameters, data);
32
- this.remoteSubscriptions.flushQueue(itemName, parameters);
33
- }
34
- catch (e) {
35
- this.remoteSubscriptions.unpause(itemName, parameters);
36
- this.remoteSubscriptions.emptyQueue(itemName, parameters);
37
- await this.unsubscribe(itemName, parameters, consumer);
38
- throw e;
39
- }
40
- };
41
- this.unsubscribe = async (itemName, parameters, consumer, callOptions) => {
42
- const noSubscriptionsLeft = this.remoteSubscriptions.unsubscribe(itemName, parameters, consumer);
43
- if (noSubscriptionsLeft) {
44
- await this.invoke(itemName, rpc_js_1.InvocationType.Unsubscribe, (...parameters) => this.httpClient.unsubscribe(itemName, parameters, callOptions?.timeout ?? this.options.callTimeout), parameters);
45
- }
46
- };
47
- this.resubscribe = () => {
48
- for (const [itemName, params, consumers] of this.remoteSubscriptions.getAllSubscriptions()) {
49
- this.httpClient
50
- .subscribe(itemName, params, this.options.callTimeout)
51
- .then((data) => {
52
- this.remoteSubscriptions.consume(itemName, params, data);
53
- })
54
- .catch((e) => {
55
- for (const consumer of consumers) {
56
- this.remoteSubscriptions.unsubscribe(itemName, params, consumer);
57
- }
58
- });
59
- }
60
- };
61
- this.httpClient = new HttpClient_js_1.HttpClient(url, this.clientId, options.getHeaders);
62
- this.remoteSubscriptions = new RemoteSubscriptions_js_1.RemoteSubscriptions();
63
- this.connection = new WebSocketConnection_js_1.WebSocketConnection(options.getSubscriptionsUrl(url), this.clientId, {
64
- subscriptions: options.subscriptions,
65
- errorDelayMaxDuration: options.errorDelayMaxDuration,
66
- reconnectDelay: options.reconnectDelay,
67
- pingInterval: options.pingInterval,
68
- }, (itemName, parameters, data) => {
69
- const ctx = {
70
- clientId: this.clientId,
71
- itemName,
72
- invocationType: rpc_js_1.InvocationType.Update,
73
- };
74
- const next = async (p = data) => this.remoteSubscriptions.consume(itemName, parameters, p);
75
- return (0, middleware_js_1.withMiddlewares)(ctx, this.options.updatesMiddleware, next, data);
76
- }, () => {
77
- this.resubscribe();
78
- options.onConnected();
79
- }, () => {
80
- options.onDisconnected();
81
- });
82
- }
83
- isConnected() {
84
- return this.connection.isConnected();
85
- }
86
- close() {
87
- return this.connection.close();
88
- }
89
- _allSubscriptions() {
90
- const result = [];
91
- for (const [itemName, parameters, consumers,] of this.remoteSubscriptions.getAllSubscriptions()) {
92
- for (const consumer of consumers) {
93
- result.push([itemName, parameters, consumer]);
94
- }
95
- }
96
- return result;
97
- }
98
- _webSocket() {
99
- return this.connection._webSocket();
100
- }
101
- createRemote() {
102
- return (0, remote_js_1.createRemote)({
103
- call: this.call,
104
- subscribe: this.subscribe,
105
- unsubscribe: this.unsubscribe,
106
- });
107
- }
108
- async connect() {
109
- await this.connection.connect();
110
- }
111
- invoke(itemName, invocationType, next, parameters) {
112
- const ctx = {
113
- clientId: this.clientId,
114
- itemName,
115
- invocationType: invocationType,
116
- };
117
- return (0, middleware_js_1.withMiddlewares)(ctx, this.options.middleware, next, ...parameters);
118
- }
119
- }
120
- exports.RpcClientImpl = RpcClientImpl;
121
- //# sourceMappingURL=RpcClientImpl.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"RpcClientImpl.js","sourceRoot":"","sources":["../../src/client/RpcClientImpl.ts"],"names":[],"mappings":"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"}