viem 2.18.1 → 2.18.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +6 -0
- package/_cjs/clients/transports/webSocket.js +5 -2
- package/_cjs/clients/transports/webSocket.js.map +1 -1
- package/_cjs/errors/version.js +1 -1
- package/_cjs/utils/rpc/socket.js +27 -6
- package/_cjs/utils/rpc/socket.js.map +1 -1
- package/_cjs/utils/rpc/webSocket.js +22 -5
- package/_cjs/utils/rpc/webSocket.js.map +1 -1
- package/_esm/clients/transports/webSocket.js +5 -2
- package/_esm/clients/transports/webSocket.js.map +1 -1
- package/_esm/errors/version.js +1 -1
- package/_esm/utils/rpc/socket.js +29 -6
- package/_esm/utils/rpc/socket.js.map +1 -1
- package/_esm/utils/rpc/webSocket.js +22 -5
- package/_esm/utils/rpc/webSocket.js.map +1 -1
- package/_types/clients/transports/webSocket.d.ts +5 -0
- package/_types/clients/transports/webSocket.d.ts.map +1 -1
- package/_types/errors/version.d.ts +1 -1
- package/_types/utils/rpc/compat.d.ts +1 -0
- package/_types/utils/rpc/compat.d.ts.map +1 -1
- package/_types/utils/rpc/socket.d.ts +16 -2
- package/_types/utils/rpc/socket.d.ts.map +1 -1
- package/_types/utils/rpc/webSocket.d.ts +1 -1
- package/_types/utils/rpc/webSocket.d.ts.map +1 -1
- package/clients/transports/webSocket.ts +10 -1
- package/errors/version.ts +1 -1
- package/package.json +1 -1
- package/utils/rpc/socket.ts +59 -11
- package/utils/rpc/webSocket.ts +25 -6
package/CHANGELOG.md
CHANGED
@@ -1,5 +1,11 @@
|
|
1
1
|
# viem
|
2
2
|
|
3
|
+
## 2.18.2
|
4
|
+
|
5
|
+
### Patch Changes
|
6
|
+
|
7
|
+
- [#2516](https://github.com/wevm/viem/pull/2516) [`44281e8`](https://github.com/wevm/viem/commit/44281e85e28f893df6e722ebadfe74b2a9bf93e2) Thanks [@izayl](https://github.com/izayl)! - Added `keepAlive` property to `webSocket` transport to send keep-alive ping messages (defaults to `true`).
|
8
|
+
|
3
9
|
## 2.18.1
|
4
10
|
|
5
11
|
### Patch Changes
|
@@ -7,7 +7,7 @@ const compat_js_1 = require("../../utils/rpc/compat.js");
|
|
7
7
|
const webSocket_js_1 = require("../../utils/rpc/webSocket.js");
|
8
8
|
const createTransport_js_1 = require("./createTransport.js");
|
9
9
|
function webSocket(url, config = {}) {
|
10
|
-
const { key = 'webSocket', name = 'WebSocket JSON-RPC', reconnect, retryDelay, } = config;
|
10
|
+
const { keepAlive, key = 'webSocket', name = 'WebSocket JSON-RPC', reconnect, retryDelay, } = config;
|
11
11
|
return ({ chain, retryCount: retryCount_, timeout: timeout_ }) => {
|
12
12
|
const retryCount = config.retryCount ?? retryCount_;
|
13
13
|
const timeout = timeout_ ?? config.timeout ?? 10_000;
|
@@ -19,7 +19,10 @@ function webSocket(url, config = {}) {
|
|
19
19
|
name,
|
20
20
|
async request({ method, params }) {
|
21
21
|
const body = { method, params };
|
22
|
-
const rpcClient = await (0, webSocket_js_1.getWebSocketRpcClient)(url_, {
|
22
|
+
const rpcClient = await (0, webSocket_js_1.getWebSocketRpcClient)(url_, {
|
23
|
+
keepAlive,
|
24
|
+
reconnect,
|
25
|
+
});
|
23
26
|
const { error, result } = await rpcClient.requestAsync({
|
24
27
|
body,
|
25
28
|
timeout,
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"webSocket.js","sourceRoot":"","sources":["../../../clients/transports/webSocket.ts"],"names":[],"mappings":";;
|
1
|
+
{"version":3,"file":"webSocket.js","sourceRoot":"","sources":["../../../clients/transports/webSocket.ts"],"names":[],"mappings":"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"}
|
package/_cjs/errors/version.js
CHANGED
package/_cjs/utils/rpc/socket.js
CHANGED
@@ -7,8 +7,9 @@ const createBatchScheduler_js_1 = require("../promise/createBatchScheduler.js");
|
|
7
7
|
const withTimeout_js_1 = require("../promise/withTimeout.js");
|
8
8
|
const id_js_1 = require("./id.js");
|
9
9
|
exports.socketClientCache = new Map();
|
10
|
-
async function getSocketRpcClient(
|
11
|
-
const { getSocket, key = 'socket', reconnect = true, url } =
|
10
|
+
async function getSocketRpcClient(parameters) {
|
11
|
+
const { getSocket, keepAlive = true, key = 'socket', reconnect = true, url, } = parameters;
|
12
|
+
const { interval: keepAliveInterval = 30_000 } = typeof keepAlive === 'object' ? keepAlive : {};
|
12
13
|
const { attempts = 5, delay = 2_000 } = typeof reconnect === 'object' ? reconnect : {};
|
13
14
|
let socketClient = exports.socketClientCache.get(`${key}:${url}`);
|
14
15
|
if (socketClient)
|
@@ -21,8 +22,18 @@ async function getSocketRpcClient(params) {
|
|
21
22
|
const subscriptions = new Map();
|
22
23
|
let error;
|
23
24
|
let socket;
|
25
|
+
let keepAliveTimer;
|
24
26
|
async function setup() {
|
25
|
-
|
27
|
+
const result = await getSocket({
|
28
|
+
onClose() {
|
29
|
+
requests.clear();
|
30
|
+
subscriptions.clear();
|
31
|
+
if (reconnect && reconnectCount < attempts)
|
32
|
+
setTimeout(async () => {
|
33
|
+
reconnectCount++;
|
34
|
+
await setup().catch(console.error);
|
35
|
+
}, delay);
|
36
|
+
},
|
26
37
|
onError(error_) {
|
27
38
|
error = error_;
|
28
39
|
for (const request of requests.values())
|
@@ -34,7 +45,7 @@ async function getSocketRpcClient(params) {
|
|
34
45
|
if (reconnect && reconnectCount < attempts)
|
35
46
|
setTimeout(async () => {
|
36
47
|
reconnectCount++;
|
37
|
-
|
48
|
+
await setup().catch(console.error);
|
38
49
|
}, delay);
|
39
50
|
},
|
40
51
|
onOpen() {
|
@@ -52,15 +63,25 @@ async function getSocketRpcClient(params) {
|
|
52
63
|
cache.delete(id);
|
53
64
|
},
|
54
65
|
});
|
66
|
+
socket = result;
|
67
|
+
if (keepAlive) {
|
68
|
+
if (keepAliveTimer)
|
69
|
+
clearInterval(keepAliveTimer);
|
70
|
+
keepAliveTimer = setInterval(() => socket.ping?.(), keepAliveInterval);
|
71
|
+
}
|
72
|
+
return result;
|
55
73
|
}
|
56
|
-
|
74
|
+
await setup();
|
57
75
|
error = undefined;
|
58
76
|
socketClient = {
|
59
77
|
close() {
|
78
|
+
keepAliveTimer && clearInterval(keepAliveTimer);
|
60
79
|
socket.close();
|
61
80
|
exports.socketClientCache.delete(`${key}:${url}`);
|
62
81
|
},
|
63
|
-
socket
|
82
|
+
get socket() {
|
83
|
+
return socket;
|
84
|
+
},
|
64
85
|
request({ body, onError, onResponse }) {
|
65
86
|
if (error && onError)
|
66
87
|
onError(error);
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"socket.js","sourceRoot":"","sources":["../../../utils/rpc/socket.ts"],"names":[],"mappings":";;;
|
1
|
+
{"version":3,"file":"socket.js","sourceRoot":"","sources":["../../../utils/rpc/socket.ts"],"names":[],"mappings":";;;AA+FA,gDA8KC;AA7QD,wDAAsD;AAGtD,gFAG2C;AAC3C,8DAAuD;AACvD,mCAAiC;AAkFpB,QAAA,iBAAiB,GAAiB,IAAI,GAAG,EAGnD,CAAA;AAEI,KAAK,UAAU,kBAAkB,CACtC,UAAgD;IAEhD,MAAM,EACJ,SAAS,EACT,SAAS,GAAG,IAAI,EAChB,GAAG,GAAG,QAAQ,EACd,SAAS,GAAG,IAAI,EAChB,GAAG,GACJ,GAAG,UAAU,CAAA;IACd,MAAM,EAAE,QAAQ,EAAE,iBAAiB,GAAG,MAAM,EAAE,GAC5C,OAAO,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAA;IAChD,MAAM,EAAE,QAAQ,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,EAAE,GACnC,OAAO,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAA;IAEhD,IAAI,YAAY,GAAG,yBAAiB,CAAC,GAAG,CAAC,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC,CAAA;IAGzD,IAAI,YAAY;QAAE,OAAO,YAA6C,CAAA;IAEtE,IAAI,cAAc,GAAG,CAAC,CAAA;IACtB,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAA,8CAAoB,EAGvC;QACA,EAAE,EAAE,GAAG,GAAG,IAAI,GAAG,EAAE;QACnB,EAAE,EAAE,KAAK,IAAI,EAAE;YAEb,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAA;YAG1C,MAAM,aAAa,GAAG,IAAI,GAAG,EAAkB,CAAA;YAE/C,IAAI,KAAgC,CAAA;YACpC,IAAI,MAAkB,CAAA;YACtB,IAAI,cAAiC,CAAA;YAGrC,KAAK,UAAU,KAAK;gBAClB,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC;oBAC7B,OAAO;wBAEL,QAAQ,CAAC,KAAK,EAAE,CAAA;wBAChB,aAAa,CAAC,KAAK,EAAE,CAAA;wBAGrB,IAAI,SAAS,IAAI,cAAc,GAAG,QAAQ;4BACxC,UAAU,CAAC,KAAK,IAAI,EAAE;gCACpB,cAAc,EAAE,CAAA;gCAChB,MAAM,KAAK,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;4BACpC,CAAC,EAAE,KAAK,CAAC,CAAA;oBACb,CAAC;oBACD,OAAO,CAAC,MAAM;wBACZ,KAAK,GAAG,MAAM,CAAA;wBAGd,KAAK,MAAM,OAAO,IAAI,QAAQ,CAAC,MAAM,EAAE;4BAAE,OAAO,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,CAAA;wBACjE,KAAK,MAAM,YAAY,IAAI,aAAa,CAAC,MAAM,EAAE;4BAC/C,YAAY,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,CAAA;wBAG/B,QAAQ,CAAC,KAAK,EAAE,CAAA;wBAChB,aAAa,CAAC,KAAK,EAAE,CAAA;wBAGrB,IAAI,SAAS,IAAI,cAAc,GAAG,QAAQ;4BACxC,UAAU,CAAC,KAAK,IAAI,EAAE;gCACpB,cAAc,EAAE,CAAA;gCAChB,MAAM,KAAK,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;4BACpC,CAAC,EAAE,KAAK,CAAC,CAAA;oBACb,CAAC;oBACD,MAAM;wBACJ,KAAK,GAAG,SAAS,CAAA;wBACjB,cAAc,GAAG,CAAC,CAAA;oBACpB,CAAC;oBACD,UAAU,CAAC,IAAI;wBACb,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,KAAK,kBAAkB,CAAA;wBACzD,MAAM,EAAE,GAAG,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAA;wBAC9D,MAAM,KAAK,GAAG,cAAc,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAA;wBACvD,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;wBAC9B,IAAI,QAAQ;4BAAE,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;wBACvC,IAAI,CAAC,cAAc;4BAAE,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;oBACvC,CAAC;iBACF,CAAC,CAAA;gBAEF,MAAM,GAAG,MAAM,CAAA;gBAEf,IAAI,SAAS,EAAE,CAAC;oBACd,IAAI,cAAc;wBAAE,aAAa,CAAC,cAAc,CAAC,CAAA;oBACjD,cAAc,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,EAAE,iBAAiB,CAAC,CAAA;gBACxE,CAAC;gBAED,OAAO,MAAM,CAAA;YACf,CAAC;YACD,MAAM,KAAK,EAAE,CAAA;YACb,KAAK,GAAG,SAAS,CAAA;YAGjB,YAAY,GAAG;gBACb,KAAK;oBACH,cAAc,IAAI,aAAa,CAAC,cAAc,CAAC,CAAA;oBAC/C,MAAM,CAAC,KAAK,EAAE,CAAA;oBACd,yBAAiB,CAAC,MAAM,CAAC,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC,CAAA;gBAC3C,CAAC;gBACD,IAAI,MAAM;oBACR,OAAO,MAAM,CAAA;gBACf,CAAC;gBACD,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE;oBACnC,IAAI,KAAK,IAAI,OAAO;wBAAE,OAAO,CAAC,KAAK,CAAC,CAAA;oBAEpC,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,eAAO,CAAC,IAAI,EAAE,CAAA;oBAEpC,MAAM,QAAQ,GAAG,CAAC,QAAqB,EAAE,EAAE;wBACzC,IAAI,OAAO,QAAQ,CAAC,EAAE,KAAK,QAAQ,IAAI,EAAE,KAAK,QAAQ,CAAC,EAAE;4BAAE,OAAM;wBAIjE,IACE,IAAI,CAAC,MAAM,KAAK,eAAe;4BAC/B,OAAO,QAAQ,CAAC,MAAM,KAAK,QAAQ;4BAEnC,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE;gCACjC,UAAU,EAAE,QAAQ;gCACpB,OAAO;6BACR,CAAC,CAAA;wBAGJ,IAAI,IAAI,CAAC,MAAM,KAAK,iBAAiB;4BACnC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;wBAExC,UAAU,CAAC,QAAQ,CAAC,CAAA;oBACtB,CAAC,CAAA;oBAED,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAA;oBACnD,IAAI,CAAC;wBACH,MAAM,CAAC,OAAO,CAAC;4BACb,IAAI,EAAE;gCACJ,OAAO,EAAE,KAAK;gCACd,EAAE;gCACF,GAAG,IAAI;6BACR;yBACF,CAAC,CAAA;oBACJ,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBACf,OAAO,EAAE,CAAC,KAAc,CAAC,CAAA;oBAC3B,CAAC;gBACH,CAAC;gBACD,YAAY,CAAC,EAAE,IAAI,EAAE,OAAO,GAAG,MAAM,EAAE;oBACrC,OAAO,IAAA,4BAAW,EAChB,GAAG,EAAE,CACH,IAAI,OAAO,CAAc,CAAC,UAAU,EAAE,OAAO,EAAE,EAAE,CAC/C,IAAI,CAAC,OAAO,CAAC;wBACX,IAAI;wBACJ,OAAO;wBACP,UAAU;qBACX,CAAC,CACH,EACH;wBACE,aAAa,EAAE,IAAI,yBAAY,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;wBAC9C,OAAO;qBACR,CACF,CAAA;gBACH,CAAC;gBACD,QAAQ;gBACR,aAAa;gBACb,GAAG;aACJ,CAAA;YACD,yBAAiB,CAAC,GAAG,CAAC,GAAG,GAAG,IAAI,GAAG,EAAE,EAAE,YAAY,CAAC,CAAA;YAEpD,OAAO,CAAC,YAA6C,CAAC,CAAA;QACxD,CAAC;KACF,CAAC,CAAA;IAEF,MAAM,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,GAAG,MAAM,QAAQ,EAAE,CAAA;IAC7C,OAAO,aAAa,CAAA;AACtB,CAAC"}
|
@@ -4,13 +4,14 @@ exports.getWebSocketRpcClient = getWebSocketRpcClient;
|
|
4
4
|
const request_js_1 = require("../../errors/request.js");
|
5
5
|
const socket_js_1 = require("./socket.js");
|
6
6
|
async function getWebSocketRpcClient(url, options = {}) {
|
7
|
-
const { reconnect } = options;
|
7
|
+
const { keepAlive, reconnect } = options;
|
8
8
|
return (0, socket_js_1.getSocketRpcClient)({
|
9
|
-
async getSocket({ onError, onOpen, onResponse }) {
|
9
|
+
async getSocket({ onClose, onError, onOpen, onResponse }) {
|
10
10
|
const WebSocket = await Promise.resolve().then(() => require('isows')).then((module) => module.WebSocket);
|
11
11
|
const socket = new WebSocket(url);
|
12
|
-
function
|
13
|
-
|
12
|
+
function onClose_() {
|
13
|
+
onClose();
|
14
|
+
socket.removeEventListener('close', onClose_);
|
14
15
|
socket.removeEventListener('message', onMessage);
|
15
16
|
socket.removeEventListener('error', onError);
|
16
17
|
socket.removeEventListener('open', onOpen);
|
@@ -18,7 +19,7 @@ async function getWebSocketRpcClient(url, options = {}) {
|
|
18
19
|
function onMessage({ data }) {
|
19
20
|
onResponse(JSON.parse(data));
|
20
21
|
}
|
21
|
-
socket.addEventListener('close',
|
22
|
+
socket.addEventListener('close', onClose_);
|
22
23
|
socket.addEventListener('message', onMessage);
|
23
24
|
socket.addEventListener('error', onError);
|
24
25
|
socket.addEventListener('open', onOpen);
|
@@ -36,6 +37,21 @@ async function getWebSocketRpcClient(url, options = {}) {
|
|
36
37
|
close_.bind(socket)();
|
37
38
|
onClose();
|
38
39
|
},
|
40
|
+
ping() {
|
41
|
+
try {
|
42
|
+
if (socket.readyState === socket.CLOSED ||
|
43
|
+
socket.readyState === socket.CLOSING)
|
44
|
+
throw new request_js_1.WebSocketRequestError({
|
45
|
+
body: {},
|
46
|
+
url: socket.url,
|
47
|
+
details: 'Socket is closed.',
|
48
|
+
});
|
49
|
+
socket.send('ping');
|
50
|
+
}
|
51
|
+
catch (error) {
|
52
|
+
onError(error);
|
53
|
+
}
|
54
|
+
},
|
39
55
|
request({ body }) {
|
40
56
|
if (socket.readyState === socket.CLOSED ||
|
41
57
|
socket.readyState === socket.CLOSING)
|
@@ -48,6 +64,7 @@ async function getWebSocketRpcClient(url, options = {}) {
|
|
48
64
|
},
|
49
65
|
});
|
50
66
|
},
|
67
|
+
keepAlive,
|
51
68
|
reconnect,
|
52
69
|
url,
|
53
70
|
});
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"webSocket.js","sourceRoot":"","sources":["../../../utils/rpc/webSocket.ts"],"names":[],"mappings":";;AAeA,
|
1
|
+
{"version":3,"file":"webSocket.js","sourceRoot":"","sources":["../../../utils/rpc/webSocket.ts"],"names":[],"mappings":"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"}
|
@@ -9,7 +9,7 @@ import { createTransport, } from './createTransport.js';
|
|
9
9
|
export function webSocket(
|
10
10
|
/** URL of the JSON-RPC API. Defaults to the chain's public RPC URL. */
|
11
11
|
url, config = {}) {
|
12
|
-
const { key = 'webSocket', name = 'WebSocket JSON-RPC', reconnect, retryDelay, } = config;
|
12
|
+
const { keepAlive, key = 'webSocket', name = 'WebSocket JSON-RPC', reconnect, retryDelay, } = config;
|
13
13
|
return ({ chain, retryCount: retryCount_, timeout: timeout_ }) => {
|
14
14
|
const retryCount = config.retryCount ?? retryCount_;
|
15
15
|
const timeout = timeout_ ?? config.timeout ?? 10_000;
|
@@ -21,7 +21,10 @@ url, config = {}) {
|
|
21
21
|
name,
|
22
22
|
async request({ method, params }) {
|
23
23
|
const body = { method, params };
|
24
|
-
const rpcClient = await getWebSocketRpcClient(url_, {
|
24
|
+
const rpcClient = await getWebSocketRpcClient(url_, {
|
25
|
+
keepAlive,
|
26
|
+
reconnect,
|
27
|
+
});
|
25
28
|
const { error, result } = await rpcClient.requestAsync({
|
26
29
|
body,
|
27
30
|
timeout,
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"webSocket.js","sourceRoot":"","sources":["../../../clients/transports/webSocket.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAA;AACzD,OAAO,EACL,gBAAgB,GAEjB,MAAM,2BAA2B,CAAA;AAIlC,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAA;AAErD,OAAO,EAEL,qBAAqB,GACtB,MAAM,8BAA8B,CAAA;AACrC,OAAO,EAIL,eAAe,GAChB,MAAM,sBAAsB,CAAA;
|
1
|
+
{"version":3,"file":"webSocket.js","sourceRoot":"","sources":["../../../clients/transports/webSocket.ts"],"names":[],"mappings":"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"}
|
package/_esm/errors/version.js
CHANGED
@@ -1,2 +1,2 @@
|
|
1
|
-
export const version = '2.18.
|
1
|
+
export const version = '2.18.2';
|
2
2
|
//# sourceMappingURL=version.js.map
|
package/_esm/utils/rpc/socket.js
CHANGED
@@ -3,8 +3,9 @@ import { createBatchScheduler, } from '../promise/createBatchScheduler.js';
|
|
3
3
|
import { withTimeout } from '../promise/withTimeout.js';
|
4
4
|
import { idCache } from './id.js';
|
5
5
|
export const socketClientCache = /*#__PURE__*/ new Map();
|
6
|
-
export async function getSocketRpcClient(
|
7
|
-
const { getSocket, key = 'socket', reconnect = true, url } =
|
6
|
+
export async function getSocketRpcClient(parameters) {
|
7
|
+
const { getSocket, keepAlive = true, key = 'socket', reconnect = true, url, } = parameters;
|
8
|
+
const { interval: keepAliveInterval = 30_000 } = typeof keepAlive === 'object' ? keepAlive : {};
|
8
9
|
const { attempts = 5, delay = 2_000 } = typeof reconnect === 'object' ? reconnect : {};
|
9
10
|
let socketClient = socketClientCache.get(`${key}:${url}`);
|
10
11
|
// If the socket already exists, return it.
|
@@ -20,9 +21,21 @@ export async function getSocketRpcClient(params) {
|
|
20
21
|
const subscriptions = new Map();
|
21
22
|
let error;
|
22
23
|
let socket;
|
24
|
+
let keepAliveTimer;
|
23
25
|
// Set up socket implementation.
|
24
26
|
async function setup() {
|
25
|
-
|
27
|
+
const result = await getSocket({
|
28
|
+
onClose() {
|
29
|
+
// Clear all requests and subscriptions.
|
30
|
+
requests.clear();
|
31
|
+
subscriptions.clear();
|
32
|
+
// Attempt to reconnect.
|
33
|
+
if (reconnect && reconnectCount < attempts)
|
34
|
+
setTimeout(async () => {
|
35
|
+
reconnectCount++;
|
36
|
+
await setup().catch(console.error);
|
37
|
+
}, delay);
|
38
|
+
},
|
26
39
|
onError(error_) {
|
27
40
|
error = error_;
|
28
41
|
// Notify all requests and subscriptions of the error.
|
@@ -37,7 +50,7 @@ export async function getSocketRpcClient(params) {
|
|
37
50
|
if (reconnect && reconnectCount < attempts)
|
38
51
|
setTimeout(async () => {
|
39
52
|
reconnectCount++;
|
40
|
-
|
53
|
+
await setup().catch(console.error);
|
41
54
|
}, delay);
|
42
55
|
},
|
43
56
|
onOpen() {
|
@@ -55,16 +68,26 @@ export async function getSocketRpcClient(params) {
|
|
55
68
|
cache.delete(id);
|
56
69
|
},
|
57
70
|
});
|
71
|
+
socket = result;
|
72
|
+
if (keepAlive) {
|
73
|
+
if (keepAliveTimer)
|
74
|
+
clearInterval(keepAliveTimer);
|
75
|
+
keepAliveTimer = setInterval(() => socket.ping?.(), keepAliveInterval);
|
76
|
+
}
|
77
|
+
return result;
|
58
78
|
}
|
59
|
-
|
79
|
+
await setup();
|
60
80
|
error = undefined;
|
61
81
|
// Create a new socket instance.
|
62
82
|
socketClient = {
|
63
83
|
close() {
|
84
|
+
keepAliveTimer && clearInterval(keepAliveTimer);
|
64
85
|
socket.close();
|
65
86
|
socketClientCache.delete(`${key}:${url}`);
|
66
87
|
},
|
67
|
-
socket
|
88
|
+
get socket() {
|
89
|
+
return socket;
|
90
|
+
},
|
68
91
|
request({ body, onError, onResponse }) {
|
69
92
|
if (error && onError)
|
70
93
|
onError(error);
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"socket.js","sourceRoot":"","sources":["../../../utils/rpc/socket.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAGtD,OAAO,EAEL,oBAAoB,GACrB,MAAM,oCAAoC,CAAA;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;
|
1
|
+
{"version":3,"file":"socket.js","sourceRoot":"","sources":["../../../utils/rpc/socket.ts"],"names":[],"mappings":"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"}
|
@@ -1,13 +1,14 @@
|
|
1
1
|
import { WebSocketRequestError } from '../../errors/request.js';
|
2
2
|
import { getSocketRpcClient, } from './socket.js';
|
3
3
|
export async function getWebSocketRpcClient(url, options = {}) {
|
4
|
-
const { reconnect } = options;
|
4
|
+
const { keepAlive, reconnect } = options;
|
5
5
|
return getSocketRpcClient({
|
6
|
-
async getSocket({ onError, onOpen, onResponse }) {
|
6
|
+
async getSocket({ onClose, onError, onOpen, onResponse }) {
|
7
7
|
const WebSocket = await import('isows').then((module) => module.WebSocket);
|
8
8
|
const socket = new WebSocket(url);
|
9
|
-
function
|
10
|
-
|
9
|
+
function onClose_() {
|
10
|
+
onClose();
|
11
|
+
socket.removeEventListener('close', onClose_);
|
11
12
|
socket.removeEventListener('message', onMessage);
|
12
13
|
socket.removeEventListener('error', onError);
|
13
14
|
socket.removeEventListener('open', onOpen);
|
@@ -16,7 +17,7 @@ export async function getWebSocketRpcClient(url, options = {}) {
|
|
16
17
|
onResponse(JSON.parse(data));
|
17
18
|
}
|
18
19
|
// Setup event listeners for RPC & subscription responses.
|
19
|
-
socket.addEventListener('close',
|
20
|
+
socket.addEventListener('close', onClose_);
|
20
21
|
socket.addEventListener('message', onMessage);
|
21
22
|
socket.addEventListener('error', onError);
|
22
23
|
socket.addEventListener('open', onOpen);
|
@@ -35,6 +36,21 @@ export async function getWebSocketRpcClient(url, options = {}) {
|
|
35
36
|
close_.bind(socket)();
|
36
37
|
onClose();
|
37
38
|
},
|
39
|
+
ping() {
|
40
|
+
try {
|
41
|
+
if (socket.readyState === socket.CLOSED ||
|
42
|
+
socket.readyState === socket.CLOSING)
|
43
|
+
throw new WebSocketRequestError({
|
44
|
+
body: {},
|
45
|
+
url: socket.url,
|
46
|
+
details: 'Socket is closed.',
|
47
|
+
});
|
48
|
+
socket.send('ping');
|
49
|
+
}
|
50
|
+
catch (error) {
|
51
|
+
onError(error);
|
52
|
+
}
|
53
|
+
},
|
38
54
|
request({ body }) {
|
39
55
|
if (socket.readyState === socket.CLOSED ||
|
40
56
|
socket.readyState === socket.CLOSING)
|
@@ -47,6 +63,7 @@ export async function getWebSocketRpcClient(url, options = {}) {
|
|
47
63
|
},
|
48
64
|
});
|
49
65
|
},
|
66
|
+
keepAlive,
|
50
67
|
reconnect,
|
51
68
|
url,
|
52
69
|
});
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"webSocket.js","sourceRoot":"","sources":["../../../utils/rpc/webSocket.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAA;AAC/D,OAAO,EAIL,kBAAkB,GACnB,MAAM,aAAa,CAAA;AAOpB,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,GAAW,EACX,UAAoD,EAAE;IAEtD,MAAM,EAAE,SAAS,EAAE,GAAG,OAAO,CAAA;
|
1
|
+
{"version":3,"file":"webSocket.js","sourceRoot":"","sources":["../../../utils/rpc/webSocket.ts"],"names":[],"mappings":"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"}
|
@@ -23,6 +23,11 @@ type WebSocketTransportSubscribe = {
|
|
23
23
|
}): Promise<WebSocketTransportSubscribeReturnType>;
|
24
24
|
};
|
25
25
|
export type WebSocketTransportConfig = {
|
26
|
+
/**
|
27
|
+
* Whether or not to send keep-alive ping messages.
|
28
|
+
* @default true
|
29
|
+
*/
|
30
|
+
keepAlive?: GetWebSocketRpcClientOptions['keepAlive'] | undefined;
|
26
31
|
/** The key of the WebSocket transport. */
|
27
32
|
key?: TransportConfig['key'] | undefined;
|
28
33
|
/** The name of the WebSocket transport. */
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"webSocket.d.ts","sourceRoot":"","sources":["../../../clients/transports/webSocket.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,KAAK,oBAAoB,EAC1B,MAAM,2BAA2B,CAAA;AAClC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAA;AAC/C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAErD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAA;AAChE,OAAO,EACL,KAAK,4BAA4B,EAElC,MAAM,8BAA8B,CAAA;AACrC,OAAO,EACL,KAAK,wBAAwB,EAC7B,KAAK,SAAS,EACd,KAAK,eAAe,EAErB,MAAM,sBAAsB,CAAA;AAE7B,KAAK,qCAAqC,GAAG;IAC3C,MAAM,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,IAAI,CAAA;IACnC,OAAO,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC,GAAG,SAAS,CAAA;CAC7C,CAAA;AAED,KAAK,qCAAqC,GAAG;IAC3C,cAAc,EAAE,IAAI,CAAA;IACpB,WAAW,EAAE,MAAM,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAA;CACjD,CAAA;AAED,KAAK,2BAA2B,GAAG;IACjC,SAAS,CACP,IAAI,EAAE,qCAAqC,GAAG;QAC5C;;;WAGG;QACH,MAAM,EAAE,CAAC,UAAU,CAAC,CAAA;KACrB,GACA,OAAO,CAAC,qCAAqC,CAAC,CAAA;CAClD,CAAA;AAED,MAAM,MAAM,wBAAwB,GAAG;IACrC,0CAA0C;IAC1C,GAAG,CAAC,EAAE,eAAe,CAAC,KAAK,CAAC,GAAG,SAAS,CAAA;IACxC,2CAA2C;IAC3C,IAAI,CAAC,EAAE,eAAe,CAAC,MAAM,CAAC,GAAG,SAAS,CAAA;IAC1C;;;OAGG;IACH,SAAS,CAAC,EAAE,4BAA4B,CAAC,WAAW,CAAC,GAAG,SAAS,CAAA;IACjE,wCAAwC;IACxC,UAAU,CAAC,EAAE,eAAe,CAAC,YAAY,CAAC,GAAG,SAAS,CAAA;IACtD,8CAA8C;IAC9C,UAAU,CAAC,EAAE,eAAe,CAAC,YAAY,CAAC,GAAG,SAAS,CAAA;IACtD,wEAAwE;IACxE,OAAO,CAAC,EAAE,eAAe,CAAC,SAAS,CAAC,GAAG,SAAS,CAAA;CACjD,CAAA;AAED,MAAM,MAAM,kBAAkB,GAAG,SAAS,CACxC,WAAW,EACX;IACE;;OAEG;IACH,SAAS,IAAI,OAAO,CAAC,SAAS,CAAC,CAAA;IAC/B,YAAY,IAAI,OAAO,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,CAAA;IACnD,SAAS,EAAE,2BAA2B,CAAC,WAAW,CAAC,CAAA;CACpD,CACF,CAAA;AAED,MAAM,MAAM,2BAA2B,GACnC,wBAAwB,GACxB,oBAAoB,GACpB,SAAS,CAAA;AAEb;;GAEG;AACH,wBAAgB,SAAS;AACvB,uEAAuE;AACvE,GAAG,CAAC,EAAE,MAAM,EACZ,MAAM,GAAE,wBAA6B,GACpC,kBAAkB,
|
1
|
+
{"version":3,"file":"webSocket.d.ts","sourceRoot":"","sources":["../../../clients/transports/webSocket.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,KAAK,oBAAoB,EAC1B,MAAM,2BAA2B,CAAA;AAClC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAA;AAC/C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAErD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAA;AAChE,OAAO,EACL,KAAK,4BAA4B,EAElC,MAAM,8BAA8B,CAAA;AACrC,OAAO,EACL,KAAK,wBAAwB,EAC7B,KAAK,SAAS,EACd,KAAK,eAAe,EAErB,MAAM,sBAAsB,CAAA;AAE7B,KAAK,qCAAqC,GAAG;IAC3C,MAAM,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,IAAI,CAAA;IACnC,OAAO,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC,GAAG,SAAS,CAAA;CAC7C,CAAA;AAED,KAAK,qCAAqC,GAAG;IAC3C,cAAc,EAAE,IAAI,CAAA;IACpB,WAAW,EAAE,MAAM,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAA;CACjD,CAAA;AAED,KAAK,2BAA2B,GAAG;IACjC,SAAS,CACP,IAAI,EAAE,qCAAqC,GAAG;QAC5C;;;WAGG;QACH,MAAM,EAAE,CAAC,UAAU,CAAC,CAAA;KACrB,GACA,OAAO,CAAC,qCAAqC,CAAC,CAAA;CAClD,CAAA;AAED,MAAM,MAAM,wBAAwB,GAAG;IACrC;;;OAGG;IACH,SAAS,CAAC,EAAE,4BAA4B,CAAC,WAAW,CAAC,GAAG,SAAS,CAAA;IACjE,0CAA0C;IAC1C,GAAG,CAAC,EAAE,eAAe,CAAC,KAAK,CAAC,GAAG,SAAS,CAAA;IACxC,2CAA2C;IAC3C,IAAI,CAAC,EAAE,eAAe,CAAC,MAAM,CAAC,GAAG,SAAS,CAAA;IAC1C;;;OAGG;IACH,SAAS,CAAC,EAAE,4BAA4B,CAAC,WAAW,CAAC,GAAG,SAAS,CAAA;IACjE,wCAAwC;IACxC,UAAU,CAAC,EAAE,eAAe,CAAC,YAAY,CAAC,GAAG,SAAS,CAAA;IACtD,8CAA8C;IAC9C,UAAU,CAAC,EAAE,eAAe,CAAC,YAAY,CAAC,GAAG,SAAS,CAAA;IACtD,wEAAwE;IACxE,OAAO,CAAC,EAAE,eAAe,CAAC,SAAS,CAAC,GAAG,SAAS,CAAA;CACjD,CAAA;AAED,MAAM,MAAM,kBAAkB,GAAG,SAAS,CACxC,WAAW,EACX;IACE;;OAEG;IACH,SAAS,IAAI,OAAO,CAAC,SAAS,CAAC,CAAA;IAC/B,YAAY,IAAI,OAAO,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,CAAA;IACnD,SAAS,EAAE,2BAA2B,CAAC,WAAW,CAAC,CAAA;CACpD,CACF,CAAA;AAED,MAAM,MAAM,2BAA2B,GACnC,wBAAwB,GACxB,oBAAoB,GACpB,SAAS,CAAA;AAEb;;GAEG;AACH,wBAAgB,SAAS;AACvB,uEAAuE;AACvE,GAAG,CAAC,EAAE,MAAM,EACZ,MAAM,GAAE,wBAA6B,GACpC,kBAAkB,CA0FpB"}
|
@@ -1,2 +1,2 @@
|
|
1
|
-
export declare const version = "2.18.
|
1
|
+
export declare const version = "2.18.2";
|
2
2
|
//# sourceMappingURL=version.d.ts.map
|
@@ -26,6 +26,7 @@ declare function webSocketAsync(socketClient: SocketRpcClient<WebSocket>, { body
|
|
26
26
|
*/
|
27
27
|
export declare function getSocket(url: string): Promise<WebSocket & {
|
28
28
|
close(): void;
|
29
|
+
ping?: (() => void) | undefined;
|
29
30
|
request(params: {
|
30
31
|
body: import("../../types/rpc.js").RpcRequest;
|
31
32
|
}): void;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"compat.d.ts","sourceRoot":"","sources":["../../../utils/rpc/compat.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,gBAAgB,EAChB,qBAAqB,EACtB,MAAM,yBAAyB,CAAA;AAChC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAA;AACrE,OAAO,EAAE,KAAK,qBAAqB,EAAoB,MAAM,WAAW,CAAA;AACxE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAGlD,MAAM,MAAM,gBAAgB,GAAG,UAAU,CACvC,eAAe,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,CACtC,CAAC,CAAC,CAAC,CAAA;AACJ,MAAM,MAAM,mBAAmB,GAAG,eAAe,CAAC,SAAS,CAAC,CAAA;AAC5D,MAAM,MAAM,kBAAkB,GAAG,qBAAqB,GAAG,SAAS,CAAA;AAElE,iBAAS,SAAS,CAChB,YAAY,EAAE,eAAe,CAAC,SAAS,CAAC,EACxC,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,gBAAgB,GAC9C,mBAAmB,CAOrB;AAED,MAAM,MAAM,qBAAqB,GAAG,UAAU,CAC5C,eAAe,CAAC,SAAS,CAAC,CAAC,cAAc,CAAC,CAC3C,CAAC,CAAC,CAAC,CAAA;AACJ,MAAM,MAAM,wBAAwB,GAAG,WAAW,CAAA;AAClD,MAAM,MAAM,uBAAuB,GAC/B,kBAAkB,GAClB,gBAAgB,GAChB,oBAAoB,GACpB,SAAS,CAAA;AAEb,iBAAe,cAAc,CAC3B,YAAY,EAAE,eAAe,CAAC,SAAS,CAAC,EACxC,EAAE,IAAI,EAAE,OAAgB,EAAE,EAAE,qBAAqB,GAChD,OAAO,CAAC,wBAAwB,CAAC,CAKnC;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,SAAS,CAAC,GAAG,EAAE,MAAM
|
1
|
+
{"version":3,"file":"compat.d.ts","sourceRoot":"","sources":["../../../utils/rpc/compat.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,gBAAgB,EAChB,qBAAqB,EACtB,MAAM,yBAAyB,CAAA;AAChC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAA;AACrE,OAAO,EAAE,KAAK,qBAAqB,EAAoB,MAAM,WAAW,CAAA;AACxE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAGlD,MAAM,MAAM,gBAAgB,GAAG,UAAU,CACvC,eAAe,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,CACtC,CAAC,CAAC,CAAC,CAAA;AACJ,MAAM,MAAM,mBAAmB,GAAG,eAAe,CAAC,SAAS,CAAC,CAAA;AAC5D,MAAM,MAAM,kBAAkB,GAAG,qBAAqB,GAAG,SAAS,CAAA;AAElE,iBAAS,SAAS,CAChB,YAAY,EAAE,eAAe,CAAC,SAAS,CAAC,EACxC,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,gBAAgB,GAC9C,mBAAmB,CAOrB;AAED,MAAM,MAAM,qBAAqB,GAAG,UAAU,CAC5C,eAAe,CAAC,SAAS,CAAC,CAAC,cAAc,CAAC,CAC3C,CAAC,CAAC,CAAC,CAAA;AACJ,MAAM,MAAM,wBAAwB,GAAG,WAAW,CAAA;AAClD,MAAM,MAAM,uBAAuB,GAC/B,kBAAkB,GAClB,gBAAgB,GAChB,oBAAoB,GACpB,SAAS,CAAA;AAEb,iBAAe,cAAc,CAC3B,YAAY,EAAE,eAAe,CAAC,SAAS,CAAC,EACxC,EAAE,IAAI,EAAE,OAAgB,EAAE,EAAE,qBAAqB,GAChD,OAAO,CAAC,wBAAwB,CAAC,CAKnC;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,SAAS,CAAC,GAAG,EAAE,MAAM;;;;;;;;;yBAtDkB,CAAA;;;;yBAAA,CAAA;;GA4D5D;AAED,eAAO,MAAM,GAAG;IACd;;;;;;;;;;;OAWG;cACO,MAAM,UAAU,qBAAqB;IAG/C;;;;;;;;;;;OAWG;;IAEH;;;;;;;;;;;OAWG;;CAEJ,CAAA"}
|
@@ -8,12 +8,14 @@ type CallbackFn = {
|
|
8
8
|
};
|
9
9
|
type CallbackMap = Map<Id, CallbackFn>;
|
10
10
|
export type GetSocketParameters = {
|
11
|
+
onClose: () => void;
|
11
12
|
onError: (error?: Error | Event | undefined) => void;
|
12
13
|
onOpen: () => void;
|
13
14
|
onResponse: (data: RpcResponse) => void;
|
14
15
|
};
|
15
16
|
export type Socket<socket extends {}> = socket & {
|
16
17
|
close(): void;
|
18
|
+
ping?: (() => void) | undefined;
|
17
19
|
request(params: {
|
18
20
|
body: RpcRequest;
|
19
21
|
}): void;
|
@@ -36,9 +38,20 @@ export type SocketRpcClient<socket extends {}> = {
|
|
36
38
|
};
|
37
39
|
export type GetSocketRpcClientParameters<socket extends {} = {}> = {
|
38
40
|
getSocket(params: GetSocketParameters): Promise<Socket<socket>>;
|
41
|
+
/**
|
42
|
+
* Whether or not to send keep-alive messages.
|
43
|
+
* @default true
|
44
|
+
*/
|
45
|
+
keepAlive?: boolean | {
|
46
|
+
/**
|
47
|
+
* The interval (in ms) to send keep-alive messages.
|
48
|
+
* @default 30_000
|
49
|
+
*/
|
50
|
+
interval?: number | undefined;
|
51
|
+
} | undefined;
|
39
52
|
key?: string;
|
40
53
|
/**
|
41
|
-
* Whether or not to attempt to reconnect on socket failure.
|
54
|
+
* Whether or not to attempt to reconnect on socket failure or closure.
|
42
55
|
* @default true
|
43
56
|
*/
|
44
57
|
reconnect?: boolean | {
|
@@ -58,10 +71,11 @@ export type GetSocketRpcClientParameters<socket extends {} = {}> = {
|
|
58
71
|
export type GetSocketRpcClientErrorType = CreateBatchSchedulerErrorType | ErrorType;
|
59
72
|
export declare const socketClientCache: Map<string, SocketRpcClient<{
|
60
73
|
close(): void;
|
74
|
+
ping?: (() => void) | undefined;
|
61
75
|
request(params: {
|
62
76
|
body: RpcRequest;
|
63
77
|
}): void;
|
64
78
|
}>>;
|
65
|
-
export declare function getSocketRpcClient<socket extends {}>(
|
79
|
+
export declare function getSocketRpcClient<socket extends {}>(parameters: GetSocketRpcClientParameters<socket>): Promise<SocketRpcClient<socket>>;
|
66
80
|
export {};
|
67
81
|
//# sourceMappingURL=socket.d.ts.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"socket.d.ts","sourceRoot":"","sources":["../../../utils/rpc/socket.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AACjE,OAAO,EACL,KAAK,6BAA6B,EAEnC,MAAM,oCAAoC,CAAA;AAI3C,KAAK,EAAE,GAAG,MAAM,GAAG,MAAM,CAAA;AACzB,KAAK,UAAU,GAAG;IAChB,UAAU,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,IAAI,CAAA;IAClC,OAAO,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,KAAK,GAAG,SAAS,KAAK,IAAI,CAAC,GAAG,SAAS,CAAA;CACpE,CAAA;AACD,KAAK,WAAW,GAAG,GAAG,CAAC,EAAE,EAAE,UAAU,CAAC,CAAA;AAEtC,MAAM,MAAM,mBAAmB,GAAG;IAChC,OAAO,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,KAAK,GAAG,SAAS,KAAK,IAAI,CAAA;IACpD,MAAM,EAAE,MAAM,IAAI,CAAA;IAClB,UAAU,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,IAAI,CAAA;CACxC,CAAA;AAED,MAAM,MAAM,MAAM,CAAC,MAAM,SAAS,EAAE,IAAI,MAAM,GAAG;IAC/C,KAAK,IAAI,IAAI,CAAA;IACb,OAAO,CAAC,MAAM,EAAE;
|
1
|
+
{"version":3,"file":"socket.d.ts","sourceRoot":"","sources":["../../../utils/rpc/socket.ts"],"names":[],"mappings":"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"}
|
@@ -1,4 +1,4 @@
|
|
1
1
|
import { type GetSocketRpcClientParameters, type SocketRpcClient } from './socket.js';
|
2
|
-
export type GetWebSocketRpcClientOptions = Pick<GetSocketRpcClientParameters, 'reconnect'>;
|
2
|
+
export type GetWebSocketRpcClientOptions = Pick<GetSocketRpcClientParameters, 'keepAlive' | 'reconnect'>;
|
3
3
|
export declare function getWebSocketRpcClient(url: string, options?: GetWebSocketRpcClientOptions | undefined): Promise<SocketRpcClient<WebSocket>>;
|
4
4
|
//# sourceMappingURL=webSocket.d.ts.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"webSocket.d.ts","sourceRoot":"","sources":["../../../utils/rpc/webSocket.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,KAAK,4BAA4B,EAEjC,KAAK,eAAe,EAErB,MAAM,aAAa,CAAA;AAEpB,MAAM,MAAM,4BAA4B,GAAG,IAAI,CAC7C,4BAA4B,EAC5B,WAAW,
|
1
|
+
{"version":3,"file":"webSocket.d.ts","sourceRoot":"","sources":["../../../utils/rpc/webSocket.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,KAAK,4BAA4B,EAEjC,KAAK,eAAe,EAErB,MAAM,aAAa,CAAA;AAEpB,MAAM,MAAM,4BAA4B,GAAG,IAAI,CAC7C,4BAA4B,EAC5B,WAAW,GAAG,WAAW,CAC1B,CAAA;AAED,wBAAsB,qBAAqB,CACzC,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,4BAA4B,GAAG,SAAc,GACrD,OAAO,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,CA6ErC"}
|
@@ -42,6 +42,11 @@ type WebSocketTransportSubscribe = {
|
|
42
42
|
}
|
43
43
|
|
44
44
|
export type WebSocketTransportConfig = {
|
45
|
+
/**
|
46
|
+
* Whether or not to send keep-alive ping messages.
|
47
|
+
* @default true
|
48
|
+
*/
|
49
|
+
keepAlive?: GetWebSocketRpcClientOptions['keepAlive'] | undefined
|
45
50
|
/** The key of the WebSocket transport. */
|
46
51
|
key?: TransportConfig['key'] | undefined
|
47
52
|
/** The name of the WebSocket transport. */
|
@@ -85,6 +90,7 @@ export function webSocket(
|
|
85
90
|
config: WebSocketTransportConfig = {},
|
86
91
|
): WebSocketTransport {
|
87
92
|
const {
|
93
|
+
keepAlive,
|
88
94
|
key = 'webSocket',
|
89
95
|
name = 'WebSocket JSON-RPC',
|
90
96
|
reconnect,
|
@@ -101,7 +107,10 @@ export function webSocket(
|
|
101
107
|
name,
|
102
108
|
async request({ method, params }) {
|
103
109
|
const body = { method, params }
|
104
|
-
const rpcClient = await getWebSocketRpcClient(url_, {
|
110
|
+
const rpcClient = await getWebSocketRpcClient(url_, {
|
111
|
+
keepAlive,
|
112
|
+
reconnect,
|
113
|
+
})
|
105
114
|
const { error, result } = await rpcClient.requestAsync({
|
106
115
|
body,
|
107
116
|
timeout,
|
package/errors/version.ts
CHANGED
@@ -1 +1 @@
|
|
1
|
-
export const version = '2.18.
|
1
|
+
export const version = '2.18.2'
|
package/package.json
CHANGED
package/utils/rpc/socket.ts
CHANGED
@@ -16,6 +16,7 @@ type CallbackFn = {
|
|
16
16
|
type CallbackMap = Map<Id, CallbackFn>
|
17
17
|
|
18
18
|
export type GetSocketParameters = {
|
19
|
+
onClose: () => void
|
19
20
|
onError: (error?: Error | Event | undefined) => void
|
20
21
|
onOpen: () => void
|
21
22
|
onResponse: (data: RpcResponse) => void
|
@@ -23,9 +24,8 @@ export type GetSocketParameters = {
|
|
23
24
|
|
24
25
|
export type Socket<socket extends {}> = socket & {
|
25
26
|
close(): void
|
26
|
-
|
27
|
-
|
28
|
-
}): void
|
27
|
+
ping?: (() => void) | undefined
|
28
|
+
request(params: { body: RpcRequest }): void
|
29
29
|
}
|
30
30
|
|
31
31
|
export type SocketRpcClient<socket extends {}> = {
|
@@ -47,9 +47,23 @@ export type SocketRpcClient<socket extends {}> = {
|
|
47
47
|
|
48
48
|
export type GetSocketRpcClientParameters<socket extends {} = {}> = {
|
49
49
|
getSocket(params: GetSocketParameters): Promise<Socket<socket>>
|
50
|
+
/**
|
51
|
+
* Whether or not to send keep-alive messages.
|
52
|
+
* @default true
|
53
|
+
*/
|
54
|
+
keepAlive?:
|
55
|
+
| boolean
|
56
|
+
| {
|
57
|
+
/**
|
58
|
+
* The interval (in ms) to send keep-alive messages.
|
59
|
+
* @default 30_000
|
60
|
+
*/
|
61
|
+
interval?: number | undefined
|
62
|
+
}
|
63
|
+
| undefined
|
50
64
|
key?: string
|
51
65
|
/**
|
52
|
-
* Whether or not to attempt to reconnect on socket failure.
|
66
|
+
* Whether or not to attempt to reconnect on socket failure or closure.
|
53
67
|
* @default true
|
54
68
|
*/
|
55
69
|
reconnect?:
|
@@ -80,9 +94,17 @@ export const socketClientCache = /*#__PURE__*/ new Map<
|
|
80
94
|
>()
|
81
95
|
|
82
96
|
export async function getSocketRpcClient<socket extends {}>(
|
83
|
-
|
97
|
+
parameters: GetSocketRpcClientParameters<socket>,
|
84
98
|
): Promise<SocketRpcClient<socket>> {
|
85
|
-
const {
|
99
|
+
const {
|
100
|
+
getSocket,
|
101
|
+
keepAlive = true,
|
102
|
+
key = 'socket',
|
103
|
+
reconnect = true,
|
104
|
+
url,
|
105
|
+
} = parameters
|
106
|
+
const { interval: keepAliveInterval = 30_000 } =
|
107
|
+
typeof keepAlive === 'object' ? keepAlive : {}
|
86
108
|
const { attempts = 5, delay = 2_000 } =
|
87
109
|
typeof reconnect === 'object' ? reconnect : {}
|
88
110
|
|
@@ -105,10 +127,24 @@ export async function getSocketRpcClient<socket extends {}>(
|
|
105
127
|
const subscriptions = new Map<Id, CallbackFn>()
|
106
128
|
|
107
129
|
let error: Error | Event | undefined
|
108
|
-
let socket: Socket<
|
130
|
+
let socket: Socket<{}>
|
131
|
+
let keepAliveTimer: Timer | undefined
|
132
|
+
|
109
133
|
// Set up socket implementation.
|
110
134
|
async function setup() {
|
111
|
-
|
135
|
+
const result = await getSocket({
|
136
|
+
onClose() {
|
137
|
+
// Clear all requests and subscriptions.
|
138
|
+
requests.clear()
|
139
|
+
subscriptions.clear()
|
140
|
+
|
141
|
+
// Attempt to reconnect.
|
142
|
+
if (reconnect && reconnectCount < attempts)
|
143
|
+
setTimeout(async () => {
|
144
|
+
reconnectCount++
|
145
|
+
await setup().catch(console.error)
|
146
|
+
}, delay)
|
147
|
+
},
|
112
148
|
onError(error_) {
|
113
149
|
error = error_
|
114
150
|
|
@@ -125,7 +161,7 @@ export async function getSocketRpcClient<socket extends {}>(
|
|
125
161
|
if (reconnect && reconnectCount < attempts)
|
126
162
|
setTimeout(async () => {
|
127
163
|
reconnectCount++
|
128
|
-
|
164
|
+
await setup().catch(console.error)
|
129
165
|
}, delay)
|
130
166
|
},
|
131
167
|
onOpen() {
|
@@ -141,17 +177,29 @@ export async function getSocketRpcClient<socket extends {}>(
|
|
141
177
|
if (!isSubscription) cache.delete(id)
|
142
178
|
},
|
143
179
|
})
|
180
|
+
|
181
|
+
socket = result
|
182
|
+
|
183
|
+
if (keepAlive) {
|
184
|
+
if (keepAliveTimer) clearInterval(keepAliveTimer)
|
185
|
+
keepAliveTimer = setInterval(() => socket.ping?.(), keepAliveInterval)
|
186
|
+
}
|
187
|
+
|
188
|
+
return result
|
144
189
|
}
|
145
|
-
|
190
|
+
await setup()
|
146
191
|
error = undefined
|
147
192
|
|
148
193
|
// Create a new socket instance.
|
149
194
|
socketClient = {
|
150
195
|
close() {
|
196
|
+
keepAliveTimer && clearInterval(keepAliveTimer)
|
151
197
|
socket.close()
|
152
198
|
socketClientCache.delete(`${key}:${url}`)
|
153
199
|
},
|
154
|
-
socket
|
200
|
+
get socket() {
|
201
|
+
return socket
|
202
|
+
},
|
155
203
|
request({ body, onError, onResponse }) {
|
156
204
|
if (error && onError) onError(error)
|
157
205
|
|
package/utils/rpc/webSocket.ts
CHANGED
@@ -10,22 +10,23 @@ import {
|
|
10
10
|
|
11
11
|
export type GetWebSocketRpcClientOptions = Pick<
|
12
12
|
GetSocketRpcClientParameters,
|
13
|
-
'reconnect'
|
13
|
+
'keepAlive' | 'reconnect'
|
14
14
|
>
|
15
15
|
|
16
16
|
export async function getWebSocketRpcClient(
|
17
17
|
url: string,
|
18
18
|
options: GetWebSocketRpcClientOptions | undefined = {},
|
19
19
|
): Promise<SocketRpcClient<WebSocket>> {
|
20
|
-
const { reconnect } = options
|
20
|
+
const { keepAlive, reconnect } = options
|
21
21
|
|
22
22
|
return getSocketRpcClient({
|
23
|
-
async getSocket({ onError, onOpen, onResponse }) {
|
23
|
+
async getSocket({ onClose, onError, onOpen, onResponse }) {
|
24
24
|
const WebSocket = await import('isows').then((module) => module.WebSocket)
|
25
25
|
const socket = new WebSocket(url)
|
26
26
|
|
27
|
-
function
|
28
|
-
|
27
|
+
function onClose_() {
|
28
|
+
onClose()
|
29
|
+
socket.removeEventListener('close', onClose_)
|
29
30
|
socket.removeEventListener('message', onMessage)
|
30
31
|
socket.removeEventListener('error', onError)
|
31
32
|
socket.removeEventListener('open', onOpen)
|
@@ -35,7 +36,7 @@ export async function getWebSocketRpcClient(
|
|
35
36
|
}
|
36
37
|
|
37
38
|
// Setup event listeners for RPC & subscription responses.
|
38
|
-
socket.addEventListener('close',
|
39
|
+
socket.addEventListener('close', onClose_)
|
39
40
|
socket.addEventListener('message', onMessage)
|
40
41
|
socket.addEventListener('error', onError)
|
41
42
|
socket.addEventListener('open', onOpen)
|
@@ -56,6 +57,23 @@ export async function getWebSocketRpcClient(
|
|
56
57
|
close_.bind(socket)()
|
57
58
|
onClose()
|
58
59
|
},
|
60
|
+
ping() {
|
61
|
+
try {
|
62
|
+
if (
|
63
|
+
socket.readyState === socket.CLOSED ||
|
64
|
+
socket.readyState === socket.CLOSING
|
65
|
+
)
|
66
|
+
throw new WebSocketRequestError({
|
67
|
+
body: {},
|
68
|
+
url: socket.url,
|
69
|
+
details: 'Socket is closed.',
|
70
|
+
})
|
71
|
+
|
72
|
+
socket.send('ping')
|
73
|
+
} catch (error) {
|
74
|
+
onError(error as Error)
|
75
|
+
}
|
76
|
+
},
|
59
77
|
request({ body }) {
|
60
78
|
if (
|
61
79
|
socket.readyState === socket.CLOSED ||
|
@@ -71,6 +89,7 @@ export async function getWebSocketRpcClient(
|
|
71
89
|
},
|
72
90
|
} as Socket<WebSocket>)
|
73
91
|
},
|
92
|
+
keepAlive,
|
74
93
|
reconnect,
|
75
94
|
url,
|
76
95
|
})
|