@push-rpc/next 2.0.0-beta.4 → 2.0.1
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 +6 -1
- package/dist/client/RpcClientImpl.d.ts +2 -2
- package/dist/client/RpcClientImpl.js +5 -5
- package/dist/client/RpcClientImpl.js.map +1 -1
- package/dist/client/WebSocketConnection.d.ts +2 -2
- package/dist/client/WebSocketConnection.js +21 -37
- package/dist/client/WebSocketConnection.js.map +1 -1
- package/dist/client/index.d.ts +2 -2
- package/dist/client/index.js +5 -1
- package/dist/client/index.js.map +1 -1
- package/dist/server/http.js +1 -1
- package/dist/server/http.js.map +1 -1
- package/dist/server/index.js +2 -1
- package/dist/server/index.js.map +1 -1
- package/package.json +1 -1
- package/src/client/RpcClientImpl.ts +6 -5
- package/src/client/WebSocketConnection.ts +26 -19
- package/src/client/index.ts +8 -3
- package/src/server/http.ts +1 -1
- package/src/server/index.ts +3 -1
- package/tests/testUtils.ts +3 -0
- package/tsconfig.cjs.json +2 -1
- package/tsconfig.json +2 -1
package/README.md
CHANGED
|
@@ -23,4 +23,9 @@ arguments in the invocation. Middleware can modify context.
|
|
|
23
23
|
|
|
24
24
|
**Throttling**. Used to limit number of notifications from the remote functions. With throttling enabled, not all
|
|
25
25
|
triggers will result in new notifications. Throttling can be used with reducers to aggregate values supplied in
|
|
26
|
-
triggers.
|
|
26
|
+
triggers.
|
|
27
|
+
|
|
28
|
+
## Issues / TBDs
|
|
29
|
+
|
|
30
|
+
- [important] Importing index.js from the root of the package will import node's http package. Not good for clients.
|
|
31
|
+
- Browser sockets don't have 'ping' event. Need to find a different way to detect connection loss.
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
/// <reference types="ws" />
|
|
2
1
|
import { Services } from "../rpc.js";
|
|
3
2
|
import { ServicesWithSubscriptions } from "./remote.js";
|
|
4
3
|
import { ConsumeServicesOptions, RpcClient } from "./index.js";
|
|
@@ -12,8 +11,9 @@ export declare class RpcClientImpl<S extends Services<S>> implements RpcClient {
|
|
|
12
11
|
isConnected(): boolean;
|
|
13
12
|
close(): Promise<void>;
|
|
14
13
|
_allSubscriptions(): [itemName: string, parameters: unknown[], consumers: (d: unknown) => void][];
|
|
15
|
-
_webSocket():
|
|
14
|
+
_webSocket(): WebSocket | null;
|
|
16
15
|
createRemote(): ServicesWithSubscriptions<S>;
|
|
16
|
+
connect(): Promise<void>;
|
|
17
17
|
private call;
|
|
18
18
|
private subscribe;
|
|
19
19
|
private unsubscribe;
|
|
@@ -20,11 +20,7 @@ class RpcClientImpl {
|
|
|
20
20
|
if (cached !== undefined) {
|
|
21
21
|
consumer(cached);
|
|
22
22
|
}
|
|
23
|
-
|
|
24
|
-
this.connection.connect().catch((e) => {
|
|
25
|
-
// ignored
|
|
26
|
-
});
|
|
27
|
-
}
|
|
23
|
+
void this.connection.connect();
|
|
28
24
|
const data = await this.invoke(itemName, rpc_js_1.InvocationType.Subscribe, (...parameters) => this.httpClient.subscribe(itemName, parameters, callOptions?.timeout ?? this.options.callTimeout), parameters);
|
|
29
25
|
this.remoteSubscriptions.subscribe(data, itemName, parameters, consumer);
|
|
30
26
|
};
|
|
@@ -51,6 +47,7 @@ class RpcClientImpl {
|
|
|
51
47
|
this.httpClient = new HttpClient_js_1.HttpClient(url, this.clientId);
|
|
52
48
|
this.remoteSubscriptions = new RemoteSubscriptions_js_1.RemoteSubscriptions();
|
|
53
49
|
this.connection = new WebSocketConnection_js_1.WebSocketConnection(url, this.clientId, {
|
|
50
|
+
subscriptions: options.subscriptions,
|
|
54
51
|
errorDelayMaxDuration: options.errorDelayMaxDuration,
|
|
55
52
|
reconnectDelay: options.reconnectDelay,
|
|
56
53
|
pingInterval: options.pingInterval,
|
|
@@ -83,6 +80,9 @@ class RpcClientImpl {
|
|
|
83
80
|
unsubscribe: this.unsubscribe,
|
|
84
81
|
});
|
|
85
82
|
}
|
|
83
|
+
async connect() {
|
|
84
|
+
await this.connection.connect();
|
|
85
|
+
}
|
|
86
86
|
invoke(itemName, invocationType, next, parameters) {
|
|
87
87
|
const ctx = {
|
|
88
88
|
clientId: this.clientId,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RpcClientImpl.js","sourceRoot":"","sources":["../../src/client/RpcClientImpl.ts"],"names":[],"mappings":";;;AAAA,sCAA2E;AAC3E,mDAA0C;AAC1C,qEAA4D;AAC5D,qEAA4D;AAC5D,mCAA6B;AAC7B,2CAAmE;AAEnE,0DAAsD;AAEtD,MAAa,aAAa;IACxB,YACE,GAAW,EACM,OAA+B;QAA/B,YAAO,GAAP,OAAO,CAAwB;
|
|
1
|
+
{"version":3,"file":"RpcClientImpl.js","sourceRoot":"","sources":["../../src/client/RpcClientImpl.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import type WebSocket from "ws";
|
|
2
1
|
export declare class WebSocketConnection {
|
|
3
2
|
private readonly url;
|
|
4
3
|
private readonly clientId;
|
|
@@ -6,9 +5,10 @@ export declare class WebSocketConnection {
|
|
|
6
5
|
private readonly consume;
|
|
7
6
|
private readonly onConnected;
|
|
8
7
|
constructor(url: string, clientId: string, options: {
|
|
8
|
+
subscriptions: boolean;
|
|
9
9
|
reconnectDelay: number;
|
|
10
10
|
errorDelayMaxDuration: number;
|
|
11
|
-
pingInterval: number;
|
|
11
|
+
pingInterval: number | null;
|
|
12
12
|
}, consume: (itemName: string, parameters: unknown[], data: unknown) => void, onConnected: () => void);
|
|
13
13
|
close(): Promise<void>;
|
|
14
14
|
/**
|
|
@@ -1,27 +1,4 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
-
if (mod && mod.__esModule) return mod;
|
|
20
|
-
var result = {};
|
|
21
|
-
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
-
__setModuleDefault(result, mod);
|
|
23
|
-
return result;
|
|
24
|
-
};
|
|
25
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
3
|
exports.WebSocketConnection = void 0;
|
|
27
4
|
const logger_js_1 = require("../logger.js");
|
|
@@ -37,13 +14,13 @@ class WebSocketConnection {
|
|
|
37
14
|
this.socket = null;
|
|
38
15
|
this.disconnectedMark = true;
|
|
39
16
|
this.pingTimeout = null;
|
|
40
|
-
this.url = url;
|
|
17
|
+
this.url = url.replace(/^https(.*)/, "wss$1").replace(/^http(.*)/, "ws$1");
|
|
41
18
|
this.clientId = clientId;
|
|
42
19
|
}
|
|
43
20
|
async close() {
|
|
44
21
|
this.disconnectedMark = true;
|
|
45
22
|
if (this.socket) {
|
|
46
|
-
this.socket.
|
|
23
|
+
this.socket.close();
|
|
47
24
|
this.socket = null;
|
|
48
25
|
}
|
|
49
26
|
if (this.pingTimeout) {
|
|
@@ -56,8 +33,14 @@ class WebSocketConnection {
|
|
|
56
33
|
* Never rejects
|
|
57
34
|
*/
|
|
58
35
|
connect() {
|
|
36
|
+
// no subscriptions support, no need to connect
|
|
37
|
+
if (!this.options.subscriptions) {
|
|
38
|
+
return Promise.resolve();
|
|
39
|
+
}
|
|
40
|
+
// already started connecting
|
|
59
41
|
if (this.socket || !this.disconnectedMark)
|
|
60
42
|
return Promise.resolve();
|
|
43
|
+
// start connection process
|
|
61
44
|
this.disconnectedMark = false;
|
|
62
45
|
return new Promise(async (resolve) => {
|
|
63
46
|
let onFirstConnection = resolve;
|
|
@@ -73,7 +56,8 @@ class WebSocketConnection {
|
|
|
73
56
|
// signal about first connection
|
|
74
57
|
onFirstConnection();
|
|
75
58
|
onFirstConnection = () => { };
|
|
76
|
-
}, () => {
|
|
59
|
+
}, (e) => {
|
|
60
|
+
logger_js_1.log.warn("Unable to connect WS", e);
|
|
77
61
|
// 2. ... unable to establish connection
|
|
78
62
|
resolve();
|
|
79
63
|
});
|
|
@@ -102,20 +86,19 @@ class WebSocketConnection {
|
|
|
102
86
|
async establishConnection(onDisconnected) {
|
|
103
87
|
return new Promise(async (resolve, reject) => {
|
|
104
88
|
try {
|
|
105
|
-
const { WebSocket } = await Promise.resolve().then(() => __importStar(require("ws")));
|
|
106
89
|
const socket = new WebSocket(this.url, this.clientId);
|
|
107
90
|
let connected = false;
|
|
108
|
-
socket.
|
|
91
|
+
socket.addEventListener("open", () => {
|
|
109
92
|
this.socket = socket;
|
|
110
93
|
connected = true;
|
|
111
94
|
resolve();
|
|
112
95
|
this.heartbeat();
|
|
113
96
|
this.onConnected();
|
|
114
97
|
});
|
|
115
|
-
socket.
|
|
98
|
+
socket.addEventListener("ping", () => {
|
|
116
99
|
this.heartbeat();
|
|
117
100
|
});
|
|
118
|
-
socket.
|
|
101
|
+
socket.addEventListener("close", () => {
|
|
119
102
|
this.socket = null;
|
|
120
103
|
if (connected) {
|
|
121
104
|
onDisconnected();
|
|
@@ -124,11 +107,10 @@ class WebSocketConnection {
|
|
|
124
107
|
clearTimeout(this.pingTimeout);
|
|
125
108
|
}
|
|
126
109
|
});
|
|
127
|
-
socket.
|
|
110
|
+
socket.addEventListener("error", (e) => {
|
|
128
111
|
if (!connected) {
|
|
129
112
|
reject(e);
|
|
130
113
|
}
|
|
131
|
-
logger_js_1.log.warn("WS connection error", e.message);
|
|
132
114
|
try {
|
|
133
115
|
socket.close();
|
|
134
116
|
}
|
|
@@ -136,8 +118,8 @@ class WebSocketConnection {
|
|
|
136
118
|
// ignore
|
|
137
119
|
}
|
|
138
120
|
});
|
|
139
|
-
socket.
|
|
140
|
-
this.receiveSocketMessage(message);
|
|
121
|
+
socket.addEventListener("message", (message) => {
|
|
122
|
+
this.receiveSocketMessage(message.data);
|
|
141
123
|
});
|
|
142
124
|
}
|
|
143
125
|
catch (e) {
|
|
@@ -149,9 +131,11 @@ class WebSocketConnection {
|
|
|
149
131
|
if (this.pingTimeout) {
|
|
150
132
|
clearTimeout(this.pingTimeout);
|
|
151
133
|
}
|
|
152
|
-
this.
|
|
153
|
-
this.
|
|
154
|
-
|
|
134
|
+
if (this.options.pingInterval) {
|
|
135
|
+
this.pingTimeout = setTimeout(() => {
|
|
136
|
+
this.socket?.close();
|
|
137
|
+
}, this.options.pingInterval * 1.5);
|
|
138
|
+
}
|
|
155
139
|
}
|
|
156
140
|
async receiveSocketMessage(rawMessage) {
|
|
157
141
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WebSocketConnection.js","sourceRoot":"","sources":["../../src/client/WebSocketConnection.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"WebSocketConnection.js","sourceRoot":"","sources":["../../src/client/WebSocketConnection.ts"],"names":[],"mappings":"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"}
|
package/dist/client/index.d.ts
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { RpcContext, Services } from "../rpc.js";
|
|
2
2
|
import { ServicesWithSubscriptions } from "./remote.js";
|
|
3
|
-
import type WebSocket from "ws";
|
|
4
3
|
import { Middleware } from "../utils/middleware.js";
|
|
5
4
|
export type RpcClient = {
|
|
6
5
|
isConnected(): boolean;
|
|
@@ -12,9 +11,10 @@ export type ConsumeServicesOptions = {
|
|
|
12
11
|
callTimeout: number;
|
|
13
12
|
reconnectDelay: number;
|
|
14
13
|
errorDelayMaxDuration: number;
|
|
15
|
-
pingInterval: number;
|
|
14
|
+
pingInterval: number | null;
|
|
16
15
|
subscriptions: boolean;
|
|
17
16
|
middleware: Middleware<RpcContext>[];
|
|
17
|
+
connectOnCreate: boolean;
|
|
18
18
|
};
|
|
19
19
|
export declare function consumeServices<S extends Services<S>>(url: string, overrideOptions?: Partial<ConsumeServicesOptions>): Promise<{
|
|
20
20
|
client: RpcClient;
|
package/dist/client/index.js
CHANGED
|
@@ -11,6 +11,9 @@ async function consumeServices(url, overrideOptions = {}) {
|
|
|
11
11
|
...overrideOptions,
|
|
12
12
|
};
|
|
13
13
|
const client = new RpcClientImpl_js_1.RpcClientImpl(url, options);
|
|
14
|
+
if (options.connectOnCreate) {
|
|
15
|
+
await client.connect();
|
|
16
|
+
}
|
|
14
17
|
return {
|
|
15
18
|
client,
|
|
16
19
|
remote: client.createRemote(),
|
|
@@ -21,8 +24,9 @@ const defaultOptions = {
|
|
|
21
24
|
callTimeout: 5 * 1000,
|
|
22
25
|
reconnectDelay: 0,
|
|
23
26
|
errorDelayMaxDuration: 15 * 1000,
|
|
24
|
-
pingInterval:
|
|
27
|
+
pingInterval: null, // if set, should be in-sync with server, ie 30 * 1000
|
|
25
28
|
subscriptions: true,
|
|
26
29
|
middleware: [],
|
|
30
|
+
connectOnCreate: false,
|
|
27
31
|
};
|
|
28
32
|
//# sourceMappingURL=index.js.map
|
package/dist/client/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":";;;AAEA,yDAAgD;AAsBzC,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;CACvB,CAAA"}
|
package/dist/server/http.js
CHANGED
|
@@ -10,7 +10,7 @@ async function serveHttpRequest(req, res, path, hooks, createConnectionContext)
|
|
|
10
10
|
try {
|
|
11
11
|
const ctx = await createConnectionContext(req);
|
|
12
12
|
const itemName = req.url.slice(path.length + 1);
|
|
13
|
-
const isJson = req.
|
|
13
|
+
const isJson = req.headers["content-type"]?.includes("application/json") ?? false;
|
|
14
14
|
const textBody = await readBody(req);
|
|
15
15
|
let body = isJson && !!textBody ? (0, json_js_1.safeParseJson)(textBody) : [];
|
|
16
16
|
if (!Array.isArray(body)) {
|
package/dist/server/http.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/server/http.ts"],"names":[],"mappings":";;;AAGA,8CAA6D;AAC7D,4CAAgC;AAEzB,KAAK,UAAU,gBAAgB,CACpC,GAAoB,EACpB,GAAmB,EACnB,IAAY,EACZ,KAAsB,EACtB,uBAAgF;IAEhF,qDAAqD;IACrD,+BAA+B;IAE/B,IAAI,GAAG,CAAC,GAAG,EAAE,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9B,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,uBAAuB,CAAC,GAAG,CAAC,CAAA;YAE9C,MAAM,QAAQ,GAAG,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;YAE/C,MAAM,MAAM,GAAG,GAAG,CAAC,
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/server/http.ts"],"names":[],"mappings":"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"}
|
package/dist/server/index.js
CHANGED
|
@@ -24,8 +24,9 @@ const defaultOptions = {
|
|
|
24
24
|
pingInterval: 30 * 1000, // should be in-sync with client
|
|
25
25
|
subscriptions: true,
|
|
26
26
|
async createConnectionContext(req) {
|
|
27
|
+
const header = req.headers[rpc_js_1.CLIENT_ID_HEADER];
|
|
27
28
|
return {
|
|
28
|
-
clientId:
|
|
29
|
+
clientId: (Array.isArray(header) ? header[0] : header) || "anon",
|
|
29
30
|
};
|
|
30
31
|
},
|
|
31
32
|
};
|
package/dist/server/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":";;;AAAA,sCAAsF;AAGtF,yDAAgD;AAGzC,KAAK,UAAU,eAAe,CACnC,QAAW,EACX,eAA8F;IAM9F,MAAM,OAAO,GAAG;QACd,GAAG,cAAc;QACjB,GAAG,eAAe;KACnB,CAAA;IAED,MAAM,SAAS,GAAG,IAAI,gCAAa,CAAO,QAAQ,EAAE,OAAO,CAAC,CAAA;IAE5D,MAAM,SAAS,CAAC,KAAK,EAAE,CAAA;IAEvB,OAAO;QACL,QAAQ,EAAE,SAAS,CAAC,0BAA0B,EAAE;QAChD,MAAM,EAAE,SAAS;QACjB,UAAU,EAAE,SAAS,CAAC,UAAU;KACjC,CAAA;AACH,CAAC;AAtBD,0CAsBC;AAyBD,MAAM,cAAc,GAAqD;IACvE,IAAI,EAAE,EAAE;IACR,IAAI,EAAE,SAAS;IACf,UAAU,EAAE,EAAE;IACd,YAAY,EAAE,EAAE,GAAG,IAAI,EAAE,gCAAgC;IACzD,aAAa,EAAE,IAAI;IAEnB,KAAK,CAAC,uBAAuB,CAAC,GAAoB;QAChD,OAAO;YACL,QAAQ,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":";;;AAAA,sCAAsF;AAGtF,yDAAgD;AAGzC,KAAK,UAAU,eAAe,CACnC,QAAW,EACX,eAA8F;IAM9F,MAAM,OAAO,GAAG;QACd,GAAG,cAAc;QACjB,GAAG,eAAe;KACnB,CAAA;IAED,MAAM,SAAS,GAAG,IAAI,gCAAa,CAAO,QAAQ,EAAE,OAAO,CAAC,CAAA;IAE5D,MAAM,SAAS,CAAC,KAAK,EAAE,CAAA;IAEvB,OAAO;QACL,QAAQ,EAAE,SAAS,CAAC,0BAA0B,EAAE;QAChD,MAAM,EAAE,SAAS;QACjB,UAAU,EAAE,SAAS,CAAC,UAAU;KACjC,CAAA;AACH,CAAC;AAtBD,0CAsBC;AAyBD,MAAM,cAAc,GAAqD;IACvE,IAAI,EAAE,EAAE;IACR,IAAI,EAAE,SAAS;IACf,UAAU,EAAE,EAAE;IACd,YAAY,EAAE,EAAE,GAAG,IAAI,EAAE,gCAAgC;IACzD,aAAa,EAAE,IAAI;IAEnB,KAAK,CAAC,uBAAuB,CAAC,GAAoB;QAChD,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,yBAAgB,CAAC,CAAA;QAE5C,OAAO;YACL,QAAQ,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,MAAM;SACjE,CAAA;IACH,CAAC;CACF,CAAA"}
|
package/package.json
CHANGED
|
@@ -19,6 +19,7 @@ export class RpcClientImpl<S extends Services<S>> implements RpcClient {
|
|
|
19
19
|
url,
|
|
20
20
|
this.clientId,
|
|
21
21
|
{
|
|
22
|
+
subscriptions: options.subscriptions,
|
|
22
23
|
errorDelayMaxDuration: options.errorDelayMaxDuration,
|
|
23
24
|
reconnectDelay: options.reconnectDelay,
|
|
24
25
|
pingInterval: options.pingInterval,
|
|
@@ -72,6 +73,10 @@ export class RpcClientImpl<S extends Services<S>> implements RpcClient {
|
|
|
72
73
|
})
|
|
73
74
|
}
|
|
74
75
|
|
|
76
|
+
async connect() {
|
|
77
|
+
await this.connection.connect()
|
|
78
|
+
}
|
|
79
|
+
|
|
75
80
|
private call = (
|
|
76
81
|
itemName: string,
|
|
77
82
|
parameters: unknown[],
|
|
@@ -102,11 +107,7 @@ export class RpcClientImpl<S extends Services<S>> implements RpcClient {
|
|
|
102
107
|
consumer(cached)
|
|
103
108
|
}
|
|
104
109
|
|
|
105
|
-
|
|
106
|
-
this.connection.connect().catch((e) => {
|
|
107
|
-
// ignored
|
|
108
|
-
})
|
|
109
|
-
}
|
|
110
|
+
void this.connection.connect()
|
|
110
111
|
|
|
111
112
|
const data = await this.invoke(
|
|
112
113
|
itemName,
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import type WebSocket from "ws"
|
|
2
1
|
import {log} from "../logger.js"
|
|
3
2
|
import {safeParseJson} from "../utils/json.js"
|
|
4
3
|
import {adelay} from "../utils/promises.js"
|
|
@@ -8,14 +7,15 @@ export class WebSocketConnection {
|
|
|
8
7
|
private readonly url: string,
|
|
9
8
|
private readonly clientId: string,
|
|
10
9
|
private readonly options: {
|
|
10
|
+
subscriptions: boolean
|
|
11
11
|
reconnectDelay: number
|
|
12
12
|
errorDelayMaxDuration: number
|
|
13
|
-
pingInterval: number
|
|
13
|
+
pingInterval: number | null
|
|
14
14
|
},
|
|
15
15
|
private readonly consume: (itemName: string, parameters: unknown[], data: unknown) => void,
|
|
16
16
|
private readonly onConnected: () => void
|
|
17
17
|
) {
|
|
18
|
-
this.url = url
|
|
18
|
+
this.url = url.replace(/^https(.*)/, "wss$1").replace(/^http(.*)/, "ws$1")
|
|
19
19
|
this.clientId = clientId
|
|
20
20
|
}
|
|
21
21
|
|
|
@@ -23,7 +23,7 @@ export class WebSocketConnection {
|
|
|
23
23
|
this.disconnectedMark = true
|
|
24
24
|
|
|
25
25
|
if (this.socket) {
|
|
26
|
-
this.socket!.
|
|
26
|
+
this.socket!.close()
|
|
27
27
|
this.socket = null
|
|
28
28
|
}
|
|
29
29
|
|
|
@@ -38,8 +38,15 @@ export class WebSocketConnection {
|
|
|
38
38
|
* Never rejects
|
|
39
39
|
*/
|
|
40
40
|
connect() {
|
|
41
|
+
// no subscriptions support, no need to connect
|
|
42
|
+
if (!this.options.subscriptions) {
|
|
43
|
+
return Promise.resolve()
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// already started connecting
|
|
41
47
|
if (this.socket || !this.disconnectedMark) return Promise.resolve()
|
|
42
48
|
|
|
49
|
+
// start connection process
|
|
43
50
|
this.disconnectedMark = false
|
|
44
51
|
|
|
45
52
|
return new Promise<void>(async (resolve) => {
|
|
@@ -61,7 +68,9 @@ export class WebSocketConnection {
|
|
|
61
68
|
onFirstConnection()
|
|
62
69
|
onFirstConnection = () => {}
|
|
63
70
|
},
|
|
64
|
-
() => {
|
|
71
|
+
(e) => {
|
|
72
|
+
log.warn("Unable to connect WS", e)
|
|
73
|
+
|
|
65
74
|
// 2. ... unable to establish connection
|
|
66
75
|
resolve()
|
|
67
76
|
}
|
|
@@ -97,13 +106,11 @@ export class WebSocketConnection {
|
|
|
97
106
|
private async establishConnection(onDisconnected: () => void): Promise<void> {
|
|
98
107
|
return new Promise(async (resolve, reject) => {
|
|
99
108
|
try {
|
|
100
|
-
const {WebSocket} = await import("ws")
|
|
101
|
-
|
|
102
109
|
const socket = new WebSocket(this.url, this.clientId)
|
|
103
110
|
|
|
104
111
|
let connected = false
|
|
105
112
|
|
|
106
|
-
socket.
|
|
113
|
+
socket.addEventListener("open", () => {
|
|
107
114
|
this.socket = socket
|
|
108
115
|
connected = true
|
|
109
116
|
resolve()
|
|
@@ -113,11 +120,11 @@ export class WebSocketConnection {
|
|
|
113
120
|
this.onConnected()
|
|
114
121
|
})
|
|
115
122
|
|
|
116
|
-
socket.
|
|
123
|
+
socket.addEventListener("ping", () => {
|
|
117
124
|
this.heartbeat()
|
|
118
125
|
})
|
|
119
126
|
|
|
120
|
-
socket.
|
|
127
|
+
socket.addEventListener("close", () => {
|
|
121
128
|
this.socket = null
|
|
122
129
|
|
|
123
130
|
if (connected) {
|
|
@@ -129,13 +136,11 @@ export class WebSocketConnection {
|
|
|
129
136
|
}
|
|
130
137
|
})
|
|
131
138
|
|
|
132
|
-
socket.
|
|
139
|
+
socket.addEventListener("error", (e) => {
|
|
133
140
|
if (!connected) {
|
|
134
141
|
reject(e)
|
|
135
142
|
}
|
|
136
143
|
|
|
137
|
-
log.warn("WS connection error", e.message)
|
|
138
|
-
|
|
139
144
|
try {
|
|
140
145
|
socket.close()
|
|
141
146
|
} catch (e) {
|
|
@@ -143,8 +148,8 @@ export class WebSocketConnection {
|
|
|
143
148
|
}
|
|
144
149
|
})
|
|
145
150
|
|
|
146
|
-
socket.
|
|
147
|
-
this.receiveSocketMessage(message)
|
|
151
|
+
socket.addEventListener("message", (message) => {
|
|
152
|
+
this.receiveSocketMessage(message.data)
|
|
148
153
|
})
|
|
149
154
|
} catch (e) {
|
|
150
155
|
reject(e)
|
|
@@ -161,12 +166,14 @@ export class WebSocketConnection {
|
|
|
161
166
|
clearTimeout(this.pingTimeout)
|
|
162
167
|
}
|
|
163
168
|
|
|
164
|
-
this.
|
|
165
|
-
this.
|
|
166
|
-
|
|
169
|
+
if (this.options.pingInterval) {
|
|
170
|
+
this.pingTimeout = setTimeout(() => {
|
|
171
|
+
this.socket?.close()
|
|
172
|
+
}, this.options.pingInterval * 1.5)
|
|
173
|
+
}
|
|
167
174
|
}
|
|
168
175
|
|
|
169
|
-
private async receiveSocketMessage(rawMessage:
|
|
176
|
+
private async receiveSocketMessage(rawMessage: string | ArrayBuffer | Blob) {
|
|
170
177
|
try {
|
|
171
178
|
const msg = rawMessage.toString()
|
|
172
179
|
|
package/src/client/index.ts
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import {RpcContext, Services} from "../rpc.js"
|
|
2
2
|
import {ServicesWithSubscriptions} from "./remote.js"
|
|
3
|
-
import type WebSocket from "ws"
|
|
4
3
|
import {RpcClientImpl} from "./RpcClientImpl.js"
|
|
5
4
|
import {Middleware} from "../utils/middleware.js"
|
|
6
5
|
|
|
@@ -17,9 +16,10 @@ export type ConsumeServicesOptions = {
|
|
|
17
16
|
callTimeout: number
|
|
18
17
|
reconnectDelay: number
|
|
19
18
|
errorDelayMaxDuration: number
|
|
20
|
-
pingInterval: number
|
|
19
|
+
pingInterval: number | null
|
|
21
20
|
subscriptions: boolean
|
|
22
21
|
middleware: Middleware<RpcContext>[]
|
|
22
|
+
connectOnCreate: boolean
|
|
23
23
|
}
|
|
24
24
|
|
|
25
25
|
export async function consumeServices<S extends Services<S>>(
|
|
@@ -40,6 +40,10 @@ export async function consumeServices<S extends Services<S>>(
|
|
|
40
40
|
|
|
41
41
|
const client = new RpcClientImpl<S>(url, options)
|
|
42
42
|
|
|
43
|
+
if (options.connectOnCreate) {
|
|
44
|
+
await client.connect()
|
|
45
|
+
}
|
|
46
|
+
|
|
43
47
|
return {
|
|
44
48
|
client,
|
|
45
49
|
remote: client.createRemote(),
|
|
@@ -50,7 +54,8 @@ const defaultOptions: ConsumeServicesOptions = {
|
|
|
50
54
|
callTimeout: 5 * 1000,
|
|
51
55
|
reconnectDelay: 0,
|
|
52
56
|
errorDelayMaxDuration: 15 * 1000,
|
|
53
|
-
pingInterval:
|
|
57
|
+
pingInterval: null, // if set, should be in-sync with server, ie 30 * 1000
|
|
54
58
|
subscriptions: true,
|
|
55
59
|
middleware: [],
|
|
60
|
+
connectOnCreate: false,
|
|
56
61
|
}
|
package/src/server/http.ts
CHANGED
|
@@ -20,7 +20,7 @@ export async function serveHttpRequest(
|
|
|
20
20
|
|
|
21
21
|
const itemName = req.url.slice(path.length + 1)
|
|
22
22
|
|
|
23
|
-
const isJson = req.
|
|
23
|
+
const isJson = req.headers["content-type"]?.includes("application/json") ?? false
|
|
24
24
|
const textBody = await readBody(req)
|
|
25
25
|
let body = isJson && !!textBody ? safeParseJson(textBody) : []
|
|
26
26
|
|
package/src/server/index.ts
CHANGED
|
@@ -59,8 +59,10 @@ const defaultOptions: Omit<PublishServicesOptions<RpcContext>, "port"> = {
|
|
|
59
59
|
subscriptions: true,
|
|
60
60
|
|
|
61
61
|
async createConnectionContext(req: IncomingMessage): Promise<RpcConnectionContext> {
|
|
62
|
+
const header = req.headers[CLIENT_ID_HEADER]
|
|
63
|
+
|
|
62
64
|
return {
|
|
63
|
-
clientId:
|
|
65
|
+
clientId: (Array.isArray(header) ? header[0] : header) || "anon",
|
|
64
66
|
}
|
|
65
67
|
},
|
|
66
68
|
}
|
package/tests/testUtils.ts
CHANGED
package/tsconfig.cjs.json
CHANGED