@push-rpc/next 2.0.10 → 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.
- package/README.md +216 -22
- package/example/client.ts +1 -1
- package/example/server.ts +2 -2
- package/package-lock.json +1291 -0
- package/package.json +1 -1
- package/src/client/HttpClient.ts +1 -20
- package/src/client/RpcClientImpl.ts +18 -6
- package/src/client/WebSocketConnection.ts +8 -27
- package/src/client/index.ts +2 -0
- package/src/index.ts +1 -0
- package/src/rpc.ts +1 -0
- package/src/server/RpcServerImpl.ts +12 -8
- package/src/server/index.ts +2 -0
- package/src/utils/middleware.ts +7 -2
- package/tests/connection.ts +2 -87
- package/tests/middleware.ts +129 -1
- package/tests/testUtils.ts +25 -0
- package/dist/client/HttpClient.d.ts +0 -13
- package/dist/client/HttpClient.js +0 -98
- package/dist/client/HttpClient.js.map +0 -1
- package/dist/client/RemoteSubscriptions.d.ts +0 -18
- package/dist/client/RemoteSubscriptions.js +0 -120
- package/dist/client/RemoteSubscriptions.js.map +0 -1
- package/dist/client/RpcClientImpl.d.ts +0 -23
- package/dist/client/RpcClientImpl.js +0 -117
- package/dist/client/RpcClientImpl.js.map +0 -1
- package/dist/client/WebSocketConnection.d.ts +0 -38
- package/dist/client/WebSocketConnection.js +0 -180
- package/dist/client/WebSocketConnection.js.map +0 -1
- package/dist/client/index.d.ts +0 -28
- package/dist/client/index.js +0 -38
- package/dist/client/index.js.map +0 -1
- package/dist/client/remote.d.ts +0 -14
- package/dist/client/remote.js +0 -66
- package/dist/client/remote.js.map +0 -1
- package/dist/index.d.ts +0 -12
- package/dist/index.js.map +0 -1
- package/dist/logger.d.ts +0 -8
- package/dist/logger.js +0 -9
- package/dist/logger.js.map +0 -1
- package/dist/rpc.d.ts +0 -36
- package/dist/rpc.js +0 -32
- package/dist/rpc.js.map +0 -1
- package/dist/server/ConnectionsServer.d.ts +0 -13
- package/dist/server/ConnectionsServer.js +0 -72
- package/dist/server/ConnectionsServer.js.map +0 -1
- package/dist/server/LocalSubscriptions.d.ts +0 -12
- package/dist/server/LocalSubscriptions.js +0 -113
- package/dist/server/LocalSubscriptions.js.map +0 -1
- package/dist/server/RpcServerImpl.d.ts +0 -24
- package/dist/server/RpcServerImpl.js +0 -195
- package/dist/server/RpcServerImpl.js.map +0 -1
- package/dist/server/http.d.ts +0 -9
- package/dist/server/http.js +0 -89
- package/dist/server/http.js.map +0 -1
- package/dist/server/index.d.ts +0 -30
- package/dist/server/index.js +0 -33
- package/dist/server/index.js.map +0 -1
- package/dist/server/local.d.ts +0 -15
- package/dist/server/local.js +0 -46
- package/dist/server/local.js.map +0 -1
- package/dist/utils/cookies.d.ts +0 -7
- package/dist/utils/cookies.js +0 -31
- package/dist/utils/cookies.js.map +0 -1
- package/dist/utils/env.d.ts +0 -6
- package/dist/utils/env.js +0 -22
- package/dist/utils/env.js.map +0 -1
- package/dist/utils/json.d.ts +0 -2
- package/dist/utils/json.js +0 -34
- package/dist/utils/json.js.map +0 -1
- package/dist/utils/middleware.d.ts +0 -2
- package/dist/utils/middleware.js +0 -31
- package/dist/utils/middleware.js.map +0 -1
- package/dist/utils/promises.d.ts +0 -5
- package/dist/utils/promises.js +0 -29
- package/dist/utils/promises.js.map +0 -1
- package/dist/utils/server.d.ts +0 -5
- package/dist/utils/server.js +0 -48
- package/dist/utils/server.js.map +0 -1
- package/dist/utils/throttle.d.ts +0 -4
- package/dist/utils/throttle.js +0 -40
- package/dist/utils/throttle.js.map +0 -1
- package/dist/utils/types.d.ts +0 -1
- package/dist/utils/types.js +0 -3
- package/dist/utils/types.js.map +0 -1
|
@@ -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,23 +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
|
-
private readonly cookies;
|
|
12
|
-
isConnected(): boolean;
|
|
13
|
-
close(): Promise<void>;
|
|
14
|
-
_allSubscriptions(): [itemName: string, parameters: unknown[], consumers: (d: unknown) => void][];
|
|
15
|
-
_webSocket(): WebSocket | null;
|
|
16
|
-
createRemote(): ServicesWithSubscriptions<S>;
|
|
17
|
-
connect(): Promise<void>;
|
|
18
|
-
private call;
|
|
19
|
-
private subscribe;
|
|
20
|
-
private unsubscribe;
|
|
21
|
-
private resubscribe;
|
|
22
|
-
private invoke;
|
|
23
|
-
}
|
|
@@ -1,117 +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
|
-
const cookies_js_1 = require("../utils/cookies.js");
|
|
12
|
-
class RpcClientImpl {
|
|
13
|
-
constructor(url, options) {
|
|
14
|
-
this.options = options;
|
|
15
|
-
this.clientId = (0, nanoid_1.nanoid)();
|
|
16
|
-
this.cookies = new cookies_js_1.ClientCookies();
|
|
17
|
-
this.call = (itemName, parameters, callOptions) => {
|
|
18
|
-
return this.invoke(itemName, rpc_js_1.InvocationType.Call, (...parameters) => this.httpClient.call(itemName, parameters, callOptions?.timeout ?? this.options.callTimeout), parameters);
|
|
19
|
-
};
|
|
20
|
-
this.subscribe = async (itemName, parameters, consumer, callOptions) => {
|
|
21
|
-
const cached = this.remoteSubscriptions.getCached(itemName, parameters);
|
|
22
|
-
if (cached !== undefined) {
|
|
23
|
-
consumer(cached);
|
|
24
|
-
}
|
|
25
|
-
// Needs to be awaited b/c resubscribe will make a 2nd request then.
|
|
26
|
-
// Also, server needs the connection to be established before making a subscription
|
|
27
|
-
await this.connection.connect();
|
|
28
|
-
try {
|
|
29
|
-
this.remoteSubscriptions.addSubscription(itemName, parameters, consumer);
|
|
30
|
-
this.remoteSubscriptions.pause(itemName, parameters);
|
|
31
|
-
const data = await this.invoke(itemName, rpc_js_1.InvocationType.Subscribe, (...parameters) => this.httpClient.subscribe(itemName, parameters, callOptions?.timeout ?? this.options.callTimeout), parameters);
|
|
32
|
-
this.remoteSubscriptions.unpause(itemName, parameters);
|
|
33
|
-
this.remoteSubscriptions.consume(itemName, parameters, data);
|
|
34
|
-
this.remoteSubscriptions.flushQueue(itemName, parameters);
|
|
35
|
-
}
|
|
36
|
-
catch (e) {
|
|
37
|
-
this.remoteSubscriptions.unpause(itemName, parameters);
|
|
38
|
-
this.remoteSubscriptions.emptyQueue(itemName, parameters);
|
|
39
|
-
await this.unsubscribe(itemName, parameters, consumer);
|
|
40
|
-
throw e;
|
|
41
|
-
}
|
|
42
|
-
};
|
|
43
|
-
this.unsubscribe = async (itemName, parameters, consumer, callOptions) => {
|
|
44
|
-
const noSubscriptionsLeft = this.remoteSubscriptions.unsubscribe(itemName, parameters, consumer);
|
|
45
|
-
if (noSubscriptionsLeft) {
|
|
46
|
-
await this.invoke(itemName, rpc_js_1.InvocationType.Unsubscribe, (...parameters) => this.httpClient.unsubscribe(itemName, parameters, callOptions?.timeout ?? this.options.callTimeout), parameters);
|
|
47
|
-
}
|
|
48
|
-
};
|
|
49
|
-
this.resubscribe = () => {
|
|
50
|
-
for (const [itemName, params, consumers] of this.remoteSubscriptions.getAllSubscriptions()) {
|
|
51
|
-
this.httpClient
|
|
52
|
-
.subscribe(itemName, params, this.options.callTimeout)
|
|
53
|
-
.then((data) => {
|
|
54
|
-
this.remoteSubscriptions.consume(itemName, params, data);
|
|
55
|
-
})
|
|
56
|
-
.catch((e) => {
|
|
57
|
-
for (const consumer of consumers) {
|
|
58
|
-
this.remoteSubscriptions.unsubscribe(itemName, params, consumer);
|
|
59
|
-
}
|
|
60
|
-
});
|
|
61
|
-
}
|
|
62
|
-
};
|
|
63
|
-
this.httpClient = new HttpClient_js_1.HttpClient(url, this.clientId, options.getHeaders, this.cookies);
|
|
64
|
-
this.remoteSubscriptions = new RemoteSubscriptions_js_1.RemoteSubscriptions();
|
|
65
|
-
this.connection = new WebSocketConnection_js_1.WebSocketConnection(options.getSubscriptionsUrl(url), this.clientId, this.cookies, {
|
|
66
|
-
subscriptions: options.subscriptions,
|
|
67
|
-
errorDelayMaxDuration: options.errorDelayMaxDuration,
|
|
68
|
-
reconnectDelay: options.reconnectDelay,
|
|
69
|
-
pingInterval: options.pingInterval,
|
|
70
|
-
}, (itemName, parameters, data) => {
|
|
71
|
-
this.remoteSubscriptions.consume(itemName, parameters, data);
|
|
72
|
-
}, () => {
|
|
73
|
-
this.resubscribe();
|
|
74
|
-
options.onConnected();
|
|
75
|
-
}, () => {
|
|
76
|
-
options.onDisconnected();
|
|
77
|
-
});
|
|
78
|
-
}
|
|
79
|
-
isConnected() {
|
|
80
|
-
return this.connection.isConnected();
|
|
81
|
-
}
|
|
82
|
-
close() {
|
|
83
|
-
return this.connection.close();
|
|
84
|
-
}
|
|
85
|
-
_allSubscriptions() {
|
|
86
|
-
const result = [];
|
|
87
|
-
for (const [itemName, parameters, consumers,] of this.remoteSubscriptions.getAllSubscriptions()) {
|
|
88
|
-
for (const consumer of consumers) {
|
|
89
|
-
result.push([itemName, parameters, consumer]);
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
return result;
|
|
93
|
-
}
|
|
94
|
-
_webSocket() {
|
|
95
|
-
return this.connection._webSocket();
|
|
96
|
-
}
|
|
97
|
-
createRemote() {
|
|
98
|
-
return (0, remote_js_1.createRemote)({
|
|
99
|
-
call: this.call,
|
|
100
|
-
subscribe: this.subscribe,
|
|
101
|
-
unsubscribe: this.unsubscribe,
|
|
102
|
-
});
|
|
103
|
-
}
|
|
104
|
-
async connect() {
|
|
105
|
-
await this.connection.connect();
|
|
106
|
-
}
|
|
107
|
-
invoke(itemName, invocationType, next, parameters) {
|
|
108
|
-
const ctx = {
|
|
109
|
-
clientId: this.clientId,
|
|
110
|
-
itemName,
|
|
111
|
-
invocationType: invocationType,
|
|
112
|
-
};
|
|
113
|
-
return (0, middleware_js_1.withMiddlewares)(ctx, this.options.middleware, next, ...parameters);
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
exports.RpcClientImpl = RpcClientImpl;
|
|
117
|
-
//# 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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"}
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
import { ClientCookies } from "../utils/cookies.js";
|
|
2
|
-
export declare class WebSocketConnection {
|
|
3
|
-
private readonly url;
|
|
4
|
-
private readonly clientId;
|
|
5
|
-
private readonly cookies;
|
|
6
|
-
private readonly options;
|
|
7
|
-
private readonly consume;
|
|
8
|
-
private readonly onConnected;
|
|
9
|
-
private readonly onDisconnected;
|
|
10
|
-
constructor(url: string, clientId: string, cookies: ClientCookies, options: {
|
|
11
|
-
subscriptions: boolean;
|
|
12
|
-
reconnectDelay: number;
|
|
13
|
-
errorDelayMaxDuration: number;
|
|
14
|
-
pingInterval: number | null;
|
|
15
|
-
}, consume: (itemName: string, parameters: unknown[], data: unknown) => void, onConnected: () => void, onDisconnected: () => void);
|
|
16
|
-
private resolveClose;
|
|
17
|
-
close(): Promise<void>;
|
|
18
|
-
private waitConnectionPromise;
|
|
19
|
-
/**
|
|
20
|
-
* Connect to the server, on each disconnect try to disconnect.
|
|
21
|
-
* Resolves at next successful connect. Reconnection loop continues even after resolution
|
|
22
|
-
* Never rejects
|
|
23
|
-
*/
|
|
24
|
-
connect(): Promise<void>;
|
|
25
|
-
isConnected(): boolean;
|
|
26
|
-
/**
|
|
27
|
-
* Connect this to server
|
|
28
|
-
*
|
|
29
|
-
* Resolves on successful connection, rejects on connection error or connection timeout
|
|
30
|
-
*/
|
|
31
|
-
private establishConnection;
|
|
32
|
-
private socket;
|
|
33
|
-
private disconnectedMark;
|
|
34
|
-
private pingTimeout;
|
|
35
|
-
private heartbeat;
|
|
36
|
-
private receiveSocketMessage;
|
|
37
|
-
_webSocket(): WebSocket | null;
|
|
38
|
-
}
|
|
@@ -1,180 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.WebSocketConnection = void 0;
|
|
4
|
-
const logger_js_1 = require("../logger.js");
|
|
5
|
-
const json_js_1 = require("../utils/json.js");
|
|
6
|
-
const promises_js_1 = require("../utils/promises.js");
|
|
7
|
-
const env_js_1 = require("../utils/env.js");
|
|
8
|
-
class WebSocketConnection {
|
|
9
|
-
constructor(url, clientId, cookies, options, consume, onConnected, onDisconnected) {
|
|
10
|
-
this.url = url;
|
|
11
|
-
this.clientId = clientId;
|
|
12
|
-
this.cookies = cookies;
|
|
13
|
-
this.options = options;
|
|
14
|
-
this.consume = consume;
|
|
15
|
-
this.onConnected = onConnected;
|
|
16
|
-
this.onDisconnected = onDisconnected;
|
|
17
|
-
this.resolveClose = () => { };
|
|
18
|
-
this.socket = null;
|
|
19
|
-
this.disconnectedMark = false;
|
|
20
|
-
this.pingTimeout = null;
|
|
21
|
-
this.clientId = clientId;
|
|
22
|
-
}
|
|
23
|
-
async close() {
|
|
24
|
-
this.disconnectedMark = true;
|
|
25
|
-
if (this.socket) {
|
|
26
|
-
this.socket.close();
|
|
27
|
-
return new Promise((resolve, reject) => {
|
|
28
|
-
this.resolveClose = resolve;
|
|
29
|
-
});
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
/**
|
|
33
|
-
* Connect to the server, on each disconnect try to disconnect.
|
|
34
|
-
* Resolves at next successful connect. Reconnection loop continues even after resolution
|
|
35
|
-
* Never rejects
|
|
36
|
-
*/
|
|
37
|
-
connect() {
|
|
38
|
-
// no subscriptions support, no need to connect
|
|
39
|
-
if (!this.options.subscriptions) {
|
|
40
|
-
return Promise.resolve();
|
|
41
|
-
}
|
|
42
|
-
// already started connecting
|
|
43
|
-
if (this.waitConnectionPromise)
|
|
44
|
-
return this.waitConnectionPromise;
|
|
45
|
-
// start connection process
|
|
46
|
-
let resolveConnectionPromise;
|
|
47
|
-
let errorDelay = 0;
|
|
48
|
-
this.waitConnectionPromise = new Promise(async (resolve) => {
|
|
49
|
-
resolveConnectionPromise = resolve;
|
|
50
|
-
while (true) {
|
|
51
|
-
// connect, and wait for ...
|
|
52
|
-
await new Promise((resolve) => {
|
|
53
|
-
const connectionPromise = this.establishConnection(() => {
|
|
54
|
-
// 1. ...disconnected
|
|
55
|
-
// recreate promise so new clients will wait for new connection
|
|
56
|
-
this.waitConnectionPromise = new Promise((resolve) => (resolveConnectionPromise = resolve));
|
|
57
|
-
resolve();
|
|
58
|
-
});
|
|
59
|
-
connectionPromise.then(() => {
|
|
60
|
-
// first reconnect after successful connection is done without delay
|
|
61
|
-
errorDelay = 0;
|
|
62
|
-
resolveConnectionPromise();
|
|
63
|
-
}, (e) => {
|
|
64
|
-
logger_js_1.log.warn("Unable to connect WS", e);
|
|
65
|
-
// 2. ... unable to establish connection
|
|
66
|
-
resolve();
|
|
67
|
-
});
|
|
68
|
-
});
|
|
69
|
-
// disconnected while connecting?
|
|
70
|
-
if (this.disconnectedMark) {
|
|
71
|
-
return;
|
|
72
|
-
}
|
|
73
|
-
await (0, promises_js_1.adelay)(this.options.reconnectDelay + errorDelay);
|
|
74
|
-
// disconnected while waiting?
|
|
75
|
-
if (this.disconnectedMark) {
|
|
76
|
-
return;
|
|
77
|
-
}
|
|
78
|
-
errorDelay = Math.round(Math.random() * this.options.errorDelayMaxDuration);
|
|
79
|
-
}
|
|
80
|
-
});
|
|
81
|
-
return this.waitConnectionPromise;
|
|
82
|
-
}
|
|
83
|
-
isConnected() {
|
|
84
|
-
return this.socket !== null;
|
|
85
|
-
}
|
|
86
|
-
/**
|
|
87
|
-
* Connect this to server
|
|
88
|
-
*
|
|
89
|
-
* Resolves on successful connection, rejects on connection error or connection timeout
|
|
90
|
-
*/
|
|
91
|
-
async establishConnection(onDisconnected) {
|
|
92
|
-
return new Promise(async (resolve, reject) => {
|
|
93
|
-
try {
|
|
94
|
-
let socket;
|
|
95
|
-
if ([env_js_1.Environment.ReactNative, env_js_1.Environment.Node].includes(env_js_1.environment)) {
|
|
96
|
-
// use RN WS or node-ws headers extensions to set cookie
|
|
97
|
-
let options = undefined;
|
|
98
|
-
const cookie = this.cookies.getCookieString();
|
|
99
|
-
if (cookie) {
|
|
100
|
-
options = {
|
|
101
|
-
headers: {
|
|
102
|
-
Cookie: cookie,
|
|
103
|
-
},
|
|
104
|
-
};
|
|
105
|
-
}
|
|
106
|
-
socket = new WebSocket(this.url, this.clientId, options);
|
|
107
|
-
}
|
|
108
|
-
else {
|
|
109
|
-
// rely on browser cookie handling
|
|
110
|
-
socket = new WebSocket(this.url, this.clientId);
|
|
111
|
-
}
|
|
112
|
-
let connected = false;
|
|
113
|
-
socket.addEventListener("open", () => {
|
|
114
|
-
this.socket = socket;
|
|
115
|
-
connected = true;
|
|
116
|
-
resolve();
|
|
117
|
-
this.heartbeat();
|
|
118
|
-
this.onConnected();
|
|
119
|
-
});
|
|
120
|
-
socket.addEventListener("ping", () => {
|
|
121
|
-
this.heartbeat();
|
|
122
|
-
});
|
|
123
|
-
socket.addEventListener("close", () => {
|
|
124
|
-
this.socket = null;
|
|
125
|
-
if (connected) {
|
|
126
|
-
onDisconnected();
|
|
127
|
-
this.onDisconnected();
|
|
128
|
-
}
|
|
129
|
-
if (this.pingTimeout) {
|
|
130
|
-
clearTimeout(this.pingTimeout);
|
|
131
|
-
}
|
|
132
|
-
this.resolveClose();
|
|
133
|
-
});
|
|
134
|
-
socket.addEventListener("error", (e) => {
|
|
135
|
-
if (!connected) {
|
|
136
|
-
reject(e);
|
|
137
|
-
}
|
|
138
|
-
try {
|
|
139
|
-
socket.close();
|
|
140
|
-
}
|
|
141
|
-
catch (e) {
|
|
142
|
-
// ignore
|
|
143
|
-
}
|
|
144
|
-
});
|
|
145
|
-
socket.addEventListener("message", (message) => {
|
|
146
|
-
this.receiveSocketMessage(message.data);
|
|
147
|
-
});
|
|
148
|
-
}
|
|
149
|
-
catch (e) {
|
|
150
|
-
reject(e);
|
|
151
|
-
}
|
|
152
|
-
});
|
|
153
|
-
}
|
|
154
|
-
heartbeat() {
|
|
155
|
-
if (this.pingTimeout) {
|
|
156
|
-
clearTimeout(this.pingTimeout);
|
|
157
|
-
}
|
|
158
|
-
if (this.options.pingInterval) {
|
|
159
|
-
this.pingTimeout = setTimeout(() => {
|
|
160
|
-
this.socket?.close();
|
|
161
|
-
}, this.options.pingInterval * 1.5);
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
async receiveSocketMessage(rawMessage) {
|
|
165
|
-
try {
|
|
166
|
-
const msg = rawMessage.toString();
|
|
167
|
-
const [itemName, data, ...parameters] = (0, json_js_1.safeParseJson)(msg);
|
|
168
|
-
this.consume(itemName, parameters, data);
|
|
169
|
-
}
|
|
170
|
-
catch (e) {
|
|
171
|
-
logger_js_1.log.warn("Invalid message received", e);
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
// test-only
|
|
175
|
-
_webSocket() {
|
|
176
|
-
return this.socket;
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
exports.WebSocketConnection = WebSocketConnection;
|
|
180
|
-
//# sourceMappingURL=WebSocketConnection.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"WebSocketConnection.js","sourceRoot":"","sources":["../../src/client/WebSocketConnection.ts"],"names":[],"mappings":"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"}
|
package/dist/client/index.d.ts
DELETED
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import { RpcContext, Services } from "../rpc.js";
|
|
2
|
-
import { ServicesWithSubscriptions } from "./remote.js";
|
|
3
|
-
import { Middleware } from "../utils/middleware.js";
|
|
4
|
-
export type RpcClient = {
|
|
5
|
-
readonly clientId: string;
|
|
6
|
-
connect(): Promise<void>;
|
|
7
|
-
isConnected(): boolean;
|
|
8
|
-
close(): Promise<void>;
|
|
9
|
-
_allSubscriptions(): Array<any[]>;
|
|
10
|
-
_webSocket(): WebSocket | null;
|
|
11
|
-
};
|
|
12
|
-
export type ConsumeServicesOptions = {
|
|
13
|
-
callTimeout: number;
|
|
14
|
-
reconnectDelay: number;
|
|
15
|
-
errorDelayMaxDuration: number;
|
|
16
|
-
pingInterval: number | null;
|
|
17
|
-
subscriptions: boolean;
|
|
18
|
-
middleware: Middleware<RpcContext>[];
|
|
19
|
-
connectOnCreate: boolean;
|
|
20
|
-
onConnected: () => void;
|
|
21
|
-
onDisconnected: () => void;
|
|
22
|
-
getHeaders: () => Promise<Record<string, string>>;
|
|
23
|
-
getSubscriptionsUrl(url: string): string;
|
|
24
|
-
};
|
|
25
|
-
export declare function consumeServices<S extends Services<S>>(url: string, overrideOptions?: Partial<ConsumeServicesOptions>): Promise<{
|
|
26
|
-
client: RpcClient;
|
|
27
|
-
remote: ServicesWithSubscriptions<S>;
|
|
28
|
-
}>;
|
package/dist/client/index.js
DELETED
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.consumeServices = void 0;
|
|
4
|
-
const RpcClientImpl_js_1 = require("./RpcClientImpl.js");
|
|
5
|
-
async function consumeServices(url, overrideOptions = {}) {
|
|
6
|
-
if (url.endsWith("/")) {
|
|
7
|
-
throw new Error("URL must not end with /");
|
|
8
|
-
}
|
|
9
|
-
const options = {
|
|
10
|
-
...defaultOptions,
|
|
11
|
-
...overrideOptions,
|
|
12
|
-
};
|
|
13
|
-
const client = new RpcClientImpl_js_1.RpcClientImpl(url, options);
|
|
14
|
-
if (options.connectOnCreate) {
|
|
15
|
-
await client.connect();
|
|
16
|
-
}
|
|
17
|
-
return {
|
|
18
|
-
client,
|
|
19
|
-
remote: client.createRemote(),
|
|
20
|
-
};
|
|
21
|
-
}
|
|
22
|
-
exports.consumeServices = consumeServices;
|
|
23
|
-
const defaultOptions = {
|
|
24
|
-
callTimeout: 5 * 1000,
|
|
25
|
-
reconnectDelay: 0,
|
|
26
|
-
errorDelayMaxDuration: 15 * 1000,
|
|
27
|
-
pingInterval: null, // if set, should be in-sync with server, ie 30 * 1000
|
|
28
|
-
subscriptions: true,
|
|
29
|
-
middleware: [],
|
|
30
|
-
connectOnCreate: false,
|
|
31
|
-
onConnected: () => { },
|
|
32
|
-
onDisconnected: () => { },
|
|
33
|
-
getHeaders: async () => ({}),
|
|
34
|
-
getSubscriptionsUrl(url) {
|
|
35
|
-
return url.replace(/^https(.*)/, "wss$1").replace(/^http(.*)/, "ws$1");
|
|
36
|
-
},
|
|
37
|
-
};
|
|
38
|
-
//# sourceMappingURL=index.js.map
|
package/dist/client/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":";;;AAEA,yDAAgD;AA6BzC,KAAK,UAAU,eAAe,CACnC,GAAW,EACX,kBAAmD,EAAE;IAKrD,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAA;IAC5C,CAAC;IAED,MAAM,OAAO,GAAG;QACd,GAAG,cAAc;QACjB,GAAG,eAAe;KACnB,CAAA;IAED,MAAM,MAAM,GAAG,IAAI,gCAAa,CAAI,GAAG,EAAE,OAAO,CAAC,CAAA;IAEjD,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;QAC5B,MAAM,MAAM,CAAC,OAAO,EAAE,CAAA;IACxB,CAAC;IAED,OAAO;QACL,MAAM;QACN,MAAM,EAAE,MAAM,CAAC,YAAY,EAAE;KAC9B,CAAA;AACH,CAAC;AA1BD,0CA0BC;AAED,MAAM,cAAc,GAA2B;IAC7C,WAAW,EAAE,CAAC,GAAG,IAAI;IACrB,cAAc,EAAE,CAAC;IACjB,qBAAqB,EAAE,EAAE,GAAG,IAAI;IAChC,YAAY,EAAE,IAAI,EAAE,sDAAsD;IAC1E,aAAa,EAAE,IAAI;IACnB,UAAU,EAAE,EAAE;IACd,eAAe,EAAE,KAAK;IACtB,WAAW,EAAE,GAAG,EAAE,GAAE,CAAC;IACrB,cAAc,EAAE,GAAG,EAAE,GAAE,CAAC;IACxB,UAAU,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;IAE5B,mBAAmB,CAAC,GAAW;QAC7B,OAAO,GAAG,CAAC,OAAO,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,MAAM,CAAC,CAAA;IACxE,CAAC;CACF,CAAA"}
|
package/dist/client/remote.d.ts
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import { CallOptions, Consumer, RemoteFunction, Services } from "../rpc.js";
|
|
2
|
-
export declare function createRemote<S extends Services<S>>(hooks: RemoteHooks, name?: string): ServicesWithSubscriptions<S>;
|
|
3
|
-
export type RemoteHooks = {
|
|
4
|
-
call(itemName: string, parameters: unknown[], callOptions?: CallOptions): Promise<unknown>;
|
|
5
|
-
subscribe(itemName: string, parameters: unknown[], consumer: (d: unknown) => void, callOptions?: CallOptions): Promise<void>;
|
|
6
|
-
unsubscribe(itemName: string, parameters: unknown[], consumer: (d: unknown) => void, callOptions?: CallOptions): Promise<void>;
|
|
7
|
-
};
|
|
8
|
-
export type AddParameters<TFunction extends (...args: any) => any, TParameters extends [...args: any]> = (...args: [...Parameters<TFunction>, ...TParameters]) => ReturnType<TFunction>;
|
|
9
|
-
export type ServicesWithSubscriptions<T extends Services<T>> = {
|
|
10
|
-
[K in keyof T]: T[K] extends RemoteFunction ? AddParameters<T[K], [CallOptions?]> & {
|
|
11
|
-
subscribe(consumer: Consumer<T[K]>, ...parameters: [...Parameters<T[K]>, CallOptions?]): Promise<void>;
|
|
12
|
-
unsubscribe(consumer: Consumer<T[K]>, ...parameters: [...Parameters<T[K]>, CallOptions?]): Promise<void>;
|
|
13
|
-
} : T[K] extends object ? ServicesWithSubscriptions<T[K]> : never;
|
|
14
|
-
};
|