viem 2.9.11 → 2.9.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/CHANGELOG.md +6 -0
- package/_cjs/clients/transports/ipc.js +2 -2
- package/_cjs/clients/transports/ipc.js.map +1 -1
- package/_cjs/clients/transports/webSocket.js +2 -2
- package/_cjs/clients/transports/webSocket.js.map +1 -1
- package/_cjs/errors/version.js +1 -1
- package/_cjs/utils/rpc/ipc.js +8 -2
- package/_cjs/utils/rpc/ipc.js.map +1 -1
- package/_cjs/utils/rpc/socket.js +46 -15
- package/_cjs/utils/rpc/socket.js.map +1 -1
- package/_cjs/utils/rpc/webSocket.js +8 -2
- package/_cjs/utils/rpc/webSocket.js.map +1 -1
- package/_esm/clients/transports/ipc.js +3 -3
- package/_esm/clients/transports/ipc.js.map +1 -1
- package/_esm/clients/transports/webSocket.js +3 -3
- package/_esm/clients/transports/webSocket.js.map +1 -1
- package/_esm/errors/version.js +1 -1
- package/_esm/utils/rpc/ipc.js +8 -2
- package/_esm/utils/rpc/ipc.js.map +1 -1
- package/_esm/utils/rpc/socket.js +49 -16
- package/_esm/utils/rpc/socket.js.map +1 -1
- package/_esm/utils/rpc/webSocket.js +8 -2
- package/_esm/utils/rpc/webSocket.js.map +1 -1
- package/_types/clients/transports/ipc.d.ts +6 -1
- package/_types/clients/transports/ipc.d.ts.map +1 -1
- package/_types/clients/transports/webSocket.d.ts +6 -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 +8 -2
- package/_types/utils/rpc/compat.d.ts.map +1 -1
- package/_types/utils/rpc/ipc.d.ts +3 -2
- package/_types/utils/rpc/ipc.d.ts.map +1 -1
- package/_types/utils/rpc/socket.d.ts +25 -4
- package/_types/utils/rpc/socket.d.ts.map +1 -1
- package/_types/utils/rpc/webSocket.d.ts +3 -2
- package/_types/utils/rpc/webSocket.d.ts.map +1 -1
- package/clients/transports/ipc.ts +12 -3
- package/clients/transports/webSocket.ts +16 -3
- package/errors/version.ts +1 -1
- package/package.json +1 -1
- package/utils/rpc/ipc.ts +18 -2
- package/utils/rpc/socket.ts +78 -19
- package/utils/rpc/webSocket.ts +15 -1
package/CHANGELOG.md
CHANGED
@@ -1,5 +1,11 @@
|
|
1
1
|
# viem
|
2
2
|
|
3
|
+
## 2.9.12
|
4
|
+
|
5
|
+
### Patch Changes
|
6
|
+
|
7
|
+
- [#2073](https://github.com/wevm/viem/pull/2073) [`212eab2c5514444441fe298584a0d9b35c7cdee7`](https://github.com/wevm/viem/commit/212eab2c5514444441fe298584a0d9b35c7cdee7) Thanks [@jxom](https://github.com/jxom)! - Added reconnect functionality to `webSocket` & `ipc` transports.
|
8
|
+
|
3
9
|
## 2.9.11
|
4
10
|
|
5
11
|
### Patch Changes
|
@@ -5,7 +5,7 @@ const request_js_1 = require("../../errors/request.js");
|
|
5
5
|
const ipc_js_1 = require("../../utils/rpc/ipc.js");
|
6
6
|
const createTransport_js_1 = require("./createTransport.js");
|
7
7
|
function ipc(path, config = {}) {
|
8
|
-
const { key = 'ipc', name = 'IPC JSON-RPC', retryDelay } = config;
|
8
|
+
const { key = 'ipc', name = 'IPC JSON-RPC', reconnect, retryDelay } = config;
|
9
9
|
return ({ retryCount: retryCount_, timeout: timeout_ }) => {
|
10
10
|
const retryCount = config.retryCount ?? retryCount_;
|
11
11
|
const timeout = timeout_ ?? config.timeout ?? 10_000;
|
@@ -14,7 +14,7 @@ function ipc(path, config = {}) {
|
|
14
14
|
name,
|
15
15
|
async request({ method, params }) {
|
16
16
|
const body = { method, params };
|
17
|
-
const rpcClient = await (0, ipc_js_1.getIpcRpcClient)(path);
|
17
|
+
const rpcClient = await (0, ipc_js_1.getIpcRpcClient)(path, { reconnect });
|
18
18
|
const { error, result } = await rpcClient.requestAsync({
|
19
19
|
body,
|
20
20
|
timeout,
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"ipc.js","sourceRoot":"","sources":["../../../clients/transports/ipc.ts"],"names":[],"mappings":";;;AAAA,wDAAyD;AAKzD,
|
1
|
+
{"version":3,"file":"ipc.js","sourceRoot":"","sources":["../../../clients/transports/ipc.ts"],"names":[],"mappings":";;;AAAA,wDAAyD;AAKzD,mDAI+B;AAC/B,6DAK6B;AA0D7B,SAAgB,GAAG,CACjB,IAAY,EACZ,SAA6B,EAAE;IAE/B,MAAM,EAAE,GAAG,GAAG,KAAK,EAAE,IAAI,GAAG,cAAc,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,MAAM,CAAA;IAC5E,OAAO,CAAC,EAAE,UAAU,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE;QACxD,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,WAAW,CAAA;QACnD,MAAM,OAAO,GAAG,QAAQ,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAA;QACpD,OAAO,IAAA,oCAAe,EACpB;YACE,GAAG;YACH,IAAI;YACJ,KAAK,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE;gBAC9B,MAAM,IAAI,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,CAAA;gBAC/B,MAAM,SAAS,GAAG,MAAM,IAAA,wBAAe,EAAC,IAAI,EAAE,EAAE,SAAS,EAAE,CAAC,CAAA;gBAC5D,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,YAAY,CAAC;oBACrD,IAAI;oBACJ,OAAO;iBACR,CAAC,CAAA;gBACF,IAAI,KAAK;oBACP,MAAM,IAAI,4BAAe,CAAC;wBACxB,IAAI;wBACJ,KAAK;wBACL,GAAG,EAAE,IAAI;qBACV,CAAC,CAAA;gBACJ,OAAO,MAAM,CAAA;YACf,CAAC;YACD,UAAU;YACV,UAAU;YACV,OAAO;YACP,IAAI,EAAE,KAAK;SACZ,EACD;YACE,YAAY;gBACV,OAAO,IAAA,wBAAe,EAAC,IAAI,CAAC,CAAA;YAC9B,CAAC;YACD,KAAK,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAO;gBAC9C,MAAM,SAAS,GAAG,MAAM,IAAA,wBAAe,EAAC,IAAI,CAAC,CAAA;gBAC7C,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,IAAI,OAAO,CAClD,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,CAClB,SAAS,CAAC,OAAO,CAAC;oBAChB,IAAI,EAAE;wBACJ,MAAM,EAAE,eAAe;wBACvB,MAAM;qBACP;oBACD,UAAU,CAAC,QAAQ;wBACjB,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;4BACnB,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;4BACtB,OAAO,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;4BACzB,OAAM;wBACR,CAAC;wBAED,IAAI,OAAO,QAAQ,CAAC,EAAE,KAAK,QAAQ,EAAE,CAAC;4BACpC,OAAO,CAAC,QAAQ,CAAC,CAAA;4BACjB,OAAM;wBACR,CAAC;wBACD,IAAI,QAAQ,CAAC,MAAM,KAAK,kBAAkB;4BAAE,OAAM;wBAClD,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;oBACzB,CAAC;iBACF,CAAC,CACL,CAAA;gBACD,OAAO;oBACL,cAAc;oBACd,KAAK,CAAC,WAAW;wBACf,OAAO,IAAI,OAAO,CAAM,CAAC,OAAO,EAAE,EAAE,CAClC,SAAS,CAAC,OAAO,CAAC;4BAChB,IAAI,EAAE;gCACJ,MAAM,EAAE,iBAAiB;gCACzB,MAAM,EAAE,CAAC,cAAc,CAAC;6BACzB;4BACD,UAAU,EAAE,OAAO;yBACpB,CAAC,CACH,CAAA;oBACH,CAAC;iBACF,CAAA;YACH,CAAC;SACF,CACF,CAAA;IACH,CAAC,CAAA;AACH,CAAC;AA/ED,kBA+EC"}
|
@@ -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', retryDelay } = config;
|
10
|
+
const { 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,7 @@ 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_, { reconnect });
|
23
23
|
const { error, result } = await rpcClient.requestAsync({
|
24
24
|
body,
|
25
25
|
timeout,
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"webSocket.js","sourceRoot":"","sources":["../../../clients/transports/webSocket.ts"],"names":[],"mappings":";;;AAAA,wDAAyD;AACzD,4DAGkC;AAIlC,yDAAqD;AAErD,+
|
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/ipc.js
CHANGED
@@ -26,13 +26,16 @@ function extractMessages(buffer) {
|
|
26
26
|
return [messages, buffer.subarray(cursor)];
|
27
27
|
}
|
28
28
|
exports.extractMessages = extractMessages;
|
29
|
-
async function getIpcRpcClient(path) {
|
29
|
+
async function getIpcRpcClient(path, options = {}) {
|
30
|
+
const { reconnect } = options;
|
30
31
|
return (0, socket_js_1.getSocketRpcClient)({
|
31
|
-
async getSocket({ onResponse }) {
|
32
|
+
async getSocket({ onError, onOpen, onResponse }) {
|
32
33
|
const socket = (0, node_net_1.connect)(path);
|
33
34
|
function onClose() {
|
34
35
|
socket.off('close', onClose);
|
35
36
|
socket.off('message', onData);
|
37
|
+
socket.off('error', onError);
|
38
|
+
socket.off('connect', onOpen);
|
36
39
|
}
|
37
40
|
let lastRemaining = Buffer.alloc(0);
|
38
41
|
function onData(buffer) {
|
@@ -45,6 +48,8 @@ async function getIpcRpcClient(path) {
|
|
45
48
|
}
|
46
49
|
socket.on('close', onClose);
|
47
50
|
socket.on('data', onData);
|
51
|
+
socket.on('error', onError);
|
52
|
+
socket.on('connect', onOpen);
|
48
53
|
await new Promise((resolve, reject) => {
|
49
54
|
socket.on('ready', () => {
|
50
55
|
resolve();
|
@@ -68,6 +73,7 @@ async function getIpcRpcClient(path) {
|
|
68
73
|
},
|
69
74
|
});
|
70
75
|
},
|
76
|
+
reconnect,
|
71
77
|
url: path,
|
72
78
|
});
|
73
79
|
}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"ipc.js","sourceRoot":"","sources":["../../../utils/rpc/ipc.ts"],"names":[],"mappings":";;;AAAA,uCAA4D;AAC5D,6CAAsD;AACtD,
|
1
|
+
{"version":3,"file":"ipc.js","sourceRoot":"","sources":["../../../utils/rpc/ipc.ts"],"names":[],"mappings":"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"}
|
package/_cjs/utils/rpc/socket.js
CHANGED
@@ -7,27 +7,53 @@ const withTimeout_js_1 = require("../promise/withTimeout.js");
|
|
7
7
|
const id_js_1 = require("./id.js");
|
8
8
|
exports.socketClientCache = new Map();
|
9
9
|
async function getSocketRpcClient(params) {
|
10
|
-
const { getSocket, url } = params;
|
10
|
+
const { getSocket, reconnect = true, url } = params;
|
11
|
+
const { attempts = 5, delay = 2_000 } = typeof reconnect === 'object' ? reconnect : {};
|
11
12
|
let socketClient = exports.socketClientCache.get(url);
|
12
13
|
if (socketClient)
|
13
14
|
return socketClient;
|
15
|
+
let reconnectCount = 0;
|
14
16
|
const { schedule } = (0, createBatchScheduler_js_1.createBatchScheduler)({
|
15
17
|
id: url,
|
16
18
|
fn: async () => {
|
17
19
|
const requests = new Map();
|
18
20
|
const subscriptions = new Map();
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
21
|
+
let error;
|
22
|
+
let socket;
|
23
|
+
async function setup() {
|
24
|
+
return getSocket({
|
25
|
+
onError(error_) {
|
26
|
+
error = error_;
|
27
|
+
for (const request of requests.values())
|
28
|
+
request.onError?.(error);
|
29
|
+
for (const subscription of subscriptions.values())
|
30
|
+
subscription.onError?.(error);
|
31
|
+
requests.clear();
|
32
|
+
subscriptions.clear();
|
33
|
+
if (reconnect && reconnectCount < attempts)
|
34
|
+
setTimeout(async () => {
|
35
|
+
reconnectCount++;
|
36
|
+
socket = await setup().catch(console.error);
|
37
|
+
}, delay);
|
38
|
+
},
|
39
|
+
onOpen() {
|
40
|
+
error = undefined;
|
41
|
+
reconnectCount = 0;
|
42
|
+
},
|
43
|
+
onResponse(data) {
|
44
|
+
const isSubscription = data.method === 'eth_subscription';
|
45
|
+
const id = isSubscription ? data.params.subscription : data.id;
|
46
|
+
const cache = isSubscription ? subscriptions : requests;
|
47
|
+
const callback = cache.get(id);
|
48
|
+
if (callback)
|
49
|
+
callback.onResponse(data);
|
50
|
+
if (!isSubscription)
|
51
|
+
cache.delete(id);
|
52
|
+
},
|
53
|
+
});
|
54
|
+
}
|
55
|
+
socket = await setup();
|
56
|
+
error = undefined;
|
31
57
|
socketClient = {
|
32
58
|
close() {
|
33
59
|
socket.close();
|
@@ -35,18 +61,23 @@ async function getSocketRpcClient(params) {
|
|
35
61
|
},
|
36
62
|
socket,
|
37
63
|
request({ body, onError, onResponse }) {
|
64
|
+
if (error && onError)
|
65
|
+
onError(error);
|
38
66
|
const id = body.id ?? id_js_1.idCache.take();
|
39
67
|
const callback = (response) => {
|
40
68
|
if (typeof response.id === 'number' && id !== response.id)
|
41
69
|
return;
|
42
70
|
if (body.method === 'eth_subscribe' &&
|
43
71
|
typeof response.result === 'string')
|
44
|
-
subscriptions.set(response.result,
|
72
|
+
subscriptions.set(response.result, {
|
73
|
+
onResponse: callback,
|
74
|
+
onError,
|
75
|
+
});
|
45
76
|
if (body.method === 'eth_unsubscribe')
|
46
77
|
subscriptions.delete(body.params?.[0]);
|
47
78
|
onResponse(response);
|
48
79
|
};
|
49
|
-
requests.set(id, callback);
|
80
|
+
requests.set(id, { onResponse: callback, onError });
|
50
81
|
try {
|
51
82
|
socket.request({
|
52
83
|
body: {
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"socket.js","sourceRoot":"","sources":["../../../utils/rpc/socket.ts"],"names":[],"mappings":";;;AAAA,wDAAsD;AAGtD,gFAG2C;AAC3C,8DAAuD;AACvD,mCAAiC;
|
1
|
+
{"version":3,"file":"socket.js","sourceRoot":"","sources":["../../../utils/rpc/socket.ts"],"names":[],"mappings":"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"}
|
@@ -3,20 +3,25 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.getWebSocketRpcClient = void 0;
|
4
4
|
const request_js_1 = require("../../errors/request.js");
|
5
5
|
const socket_js_1 = require("./socket.js");
|
6
|
-
async function getWebSocketRpcClient(url) {
|
6
|
+
async function getWebSocketRpcClient(url, options = {}) {
|
7
|
+
const { reconnect } = options;
|
7
8
|
return (0, socket_js_1.getSocketRpcClient)({
|
8
|
-
async getSocket({ onResponse }) {
|
9
|
+
async getSocket({ onError, onOpen, onResponse }) {
|
9
10
|
const WebSocket = await Promise.resolve().then(() => require('isows')).then((module) => module.WebSocket);
|
10
11
|
const socket = new WebSocket(url);
|
11
12
|
function onClose() {
|
12
13
|
socket.removeEventListener('close', onClose);
|
13
14
|
socket.removeEventListener('message', onMessage);
|
15
|
+
socket.removeEventListener('error', onError);
|
16
|
+
socket.removeEventListener('open', onOpen);
|
14
17
|
}
|
15
18
|
function onMessage({ data }) {
|
16
19
|
onResponse(JSON.parse(data));
|
17
20
|
}
|
18
21
|
socket.addEventListener('close', onClose);
|
19
22
|
socket.addEventListener('message', onMessage);
|
23
|
+
socket.addEventListener('error', onError);
|
24
|
+
socket.addEventListener('open', onOpen);
|
20
25
|
if (socket.readyState === WebSocket.CONNECTING) {
|
21
26
|
await new Promise((resolve, reject) => {
|
22
27
|
if (!socket)
|
@@ -43,6 +48,7 @@ async function getWebSocketRpcClient(url) {
|
|
43
48
|
},
|
44
49
|
});
|
45
50
|
},
|
51
|
+
reconnect,
|
46
52
|
url,
|
47
53
|
});
|
48
54
|
}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"webSocket.js","sourceRoot":"","sources":["../../../utils/rpc/webSocket.ts"],"names":[],"mappings":";;;AAEA,wDAA+D;AAC/D,
|
1
|
+
{"version":3,"file":"webSocket.js","sourceRoot":"","sources":["../../../utils/rpc/webSocket.ts"],"names":[],"mappings":";;;AAEA,wDAA+D;AAC/D,2CAKoB;AAOb,KAAK,UAAU,qBAAqB,CACzC,GAAW,EACX,UAAoD,EAAE;IAEtD,MAAM,EAAE,SAAS,EAAE,GAAG,OAAO,CAAA;IAE7B,OAAO,IAAA,8BAAkB,EAAC;QACxB,KAAK,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE;YAC7C,MAAM,SAAS,GAAG,MAAM,qCAAO,OAAO,GAAE,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;YAC1E,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,GAAG,CAAC,CAAA;YAEjC,SAAS,OAAO;gBACd,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;gBAC5C,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAA;gBAChD,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;gBAC5C,MAAM,CAAC,mBAAmB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;YAC5C,CAAC;YACD,SAAS,SAAS,CAAC,EAAE,IAAI,EAAgB;gBACvC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAA;YAC9B,CAAC;YAGD,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;YACzC,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAA;YAC7C,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;YACzC,MAAM,CAAC,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;YAGvC,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS,CAAC,UAAU,EAAE,CAAC;gBAC/C,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;oBACpC,IAAI,CAAC,MAAM;wBAAE,OAAM;oBACnB,MAAM,CAAC,MAAM,GAAG,OAAO,CAAA;oBACvB,MAAM,CAAC,OAAO,GAAG,MAAM,CAAA;gBACzB,CAAC,CAAC,CAAA;YACJ,CAAC;YAED,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAAA;YAEhC,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE;gBAC3B,KAAK;oBACH,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAA;oBACrB,OAAO,EAAE,CAAA;gBACX,CAAC;gBACD,OAAO,CAAC,EAAE,IAAI,EAAE;oBACd,IACE,MAAM,CAAC,UAAU,KAAK,MAAM,CAAC,MAAM;wBACnC,MAAM,CAAC,UAAU,KAAK,MAAM,CAAC,OAAO;wBAEpC,MAAM,IAAI,kCAAqB,CAAC;4BAC9B,IAAI;4BACJ,GAAG,EAAE,MAAM,CAAC,GAAG;4BACf,OAAO,EAAE,mBAAmB;yBAC7B,CAAC,CAAA;oBAEJ,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAA;gBAC1C,CAAC;aACmB,CAAC,CAAA;QACzB,CAAC;QACD,SAAS;QACT,GAAG;KACJ,CAAC,CAAA;AACJ,CAAC;AA7DD,sDA6DC"}
|
@@ -1,12 +1,12 @@
|
|
1
1
|
import { RpcRequestError } from '../../errors/request.js';
|
2
2
|
import {} from '../../errors/transport.js';
|
3
|
-
import { getIpcRpcClient } from '../../utils/rpc/ipc.js';
|
3
|
+
import { getIpcRpcClient, } from '../../utils/rpc/ipc.js';
|
4
4
|
import { createTransport, } from './createTransport.js';
|
5
5
|
/**
|
6
6
|
* @description Creates an IPC transport that connects to a JSON-RPC API.
|
7
7
|
*/
|
8
8
|
export function ipc(path, config = {}) {
|
9
|
-
const { key = 'ipc', name = 'IPC JSON-RPC', retryDelay } = config;
|
9
|
+
const { key = 'ipc', name = 'IPC JSON-RPC', reconnect, retryDelay } = config;
|
10
10
|
return ({ retryCount: retryCount_, timeout: timeout_ }) => {
|
11
11
|
const retryCount = config.retryCount ?? retryCount_;
|
12
12
|
const timeout = timeout_ ?? config.timeout ?? 10_000;
|
@@ -15,7 +15,7 @@ export function ipc(path, config = {}) {
|
|
15
15
|
name,
|
16
16
|
async request({ method, params }) {
|
17
17
|
const body = { method, params };
|
18
|
-
const rpcClient = await getIpcRpcClient(path);
|
18
|
+
const rpcClient = await getIpcRpcClient(path, { reconnect });
|
19
19
|
const { error, result } = await rpcClient.requestAsync({
|
20
20
|
body,
|
21
21
|
timeout,
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"ipc.js","sourceRoot":"","sources":["../../../clients/transports/ipc.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAA;AACzD,OAAO,EAA6B,MAAM,2BAA2B,CAAA;AAIrE,OAAO,
|
1
|
+
{"version":3,"file":"ipc.js","sourceRoot":"","sources":["../../../clients/transports/ipc.ts"],"names":[],"mappings":"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"}
|
@@ -1,7 +1,7 @@
|
|
1
1
|
import { RpcRequestError } from '../../errors/request.js';
|
2
2
|
import { UrlRequiredError, } from '../../errors/transport.js';
|
3
3
|
import { getSocket } from '../../utils/rpc/compat.js';
|
4
|
-
import { getWebSocketRpcClient } from '../../utils/rpc/webSocket.js';
|
4
|
+
import { getWebSocketRpcClient, } from '../../utils/rpc/webSocket.js';
|
5
5
|
import { createTransport, } from './createTransport.js';
|
6
6
|
/**
|
7
7
|
* @description Creates a WebSocket transport that connects to a JSON-RPC API.
|
@@ -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', retryDelay } = config;
|
12
|
+
const { 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,7 @@ 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_, { reconnect });
|
25
25
|
const { error, result } = await rpcClient.requestAsync({
|
26
26
|
body,
|
27
27
|
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,
|
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;AA2D7B;;GAEG;AACH,MAAM,UAAU,SAAS;AACvB,uEAAuE;AACvE,GAAY,EACZ,SAAmC,EAAE;IAErC,MAAM,EACJ,GAAG,GAAG,WAAW,EACjB,IAAI,GAAG,oBAAoB,EAC3B,SAAS,EACT,UAAU,GACX,GAAG,MAAM,CAAA;IACV,OAAO,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE;QAC/D,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,WAAW,CAAA;QACnD,MAAM,OAAO,GAAG,QAAQ,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAA;QACpD,MAAM,IAAI,GAAG,GAAG,IAAI,KAAK,EAAE,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAA;QACzD,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,gBAAgB,EAAE,CAAA;QACvC,OAAO,eAAe,CACpB;YACE,GAAG;YACH,IAAI;YACJ,KAAK,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE;gBAC9B,MAAM,IAAI,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,CAAA;gBAC/B,MAAM,SAAS,GAAG,MAAM,qBAAqB,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,CAAC,CAAA;gBAClE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,YAAY,CAAC;oBACrD,IAAI;oBACJ,OAAO;iBACR,CAAC,CAAA;gBACF,IAAI,KAAK;oBACP,MAAM,IAAI,eAAe,CAAC;wBACxB,IAAI;wBACJ,KAAK;wBACL,GAAG,EAAE,IAAI;qBACV,CAAC,CAAA;gBACJ,OAAO,MAAM,CAAA;YACf,CAAC;YACD,UAAU;YACV,UAAU;YACV,OAAO;YACP,IAAI,EAAE,WAAW;SAClB,EACD;YACE,SAAS;gBACP,OAAO,SAAS,CAAC,IAAI,CAAC,CAAA;YACxB,CAAC;YACD,YAAY;gBACV,OAAO,qBAAqB,CAAC,IAAI,CAAC,CAAA;YACpC,CAAC;YACD,KAAK,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAO;gBAC9C,MAAM,SAAS,GAAG,MAAM,qBAAqB,CAAC,IAAI,CAAC,CAAA;gBACnD,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,IAAI,OAAO,CAClD,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,CAClB,SAAS,CAAC,OAAO,CAAC;oBAChB,IAAI,EAAE;wBACJ,MAAM,EAAE,eAAe;wBACvB,MAAM;qBACP;oBACD,UAAU,CAAC,QAAQ;wBACjB,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;4BACnB,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;4BACtB,OAAO,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;4BACzB,OAAM;wBACR,CAAC;wBAED,IAAI,OAAO,QAAQ,CAAC,EAAE,KAAK,QAAQ,EAAE,CAAC;4BACpC,OAAO,CAAC,QAAQ,CAAC,CAAA;4BACjB,OAAM;wBACR,CAAC;wBACD,IAAI,QAAQ,CAAC,MAAM,KAAK,kBAAkB;4BAAE,OAAM;wBAClD,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;oBACzB,CAAC;iBACF,CAAC,CACL,CAAA;gBACD,OAAO;oBACL,cAAc;oBACd,KAAK,CAAC,WAAW;wBACf,OAAO,IAAI,OAAO,CAAM,CAAC,OAAO,EAAE,EAAE,CAClC,SAAS,CAAC,OAAO,CAAC;4BAChB,IAAI,EAAE;gCACJ,MAAM,EAAE,iBAAiB;gCACzB,MAAM,EAAE,CAAC,cAAc,CAAC;6BACzB;4BACD,UAAU,EAAE,OAAO;yBACpB,CAAC,CACH,CAAA;oBACH,CAAC;iBACF,CAAA;YACH,CAAC;SACF,CACF,CAAA;IACH,CAAC,CAAA;AACH,CAAC"}
|
package/_esm/errors/version.js
CHANGED
@@ -1,2 +1,2 @@
|
|
1
|
-
export const version = '2.9.
|
1
|
+
export const version = '2.9.12';
|
2
2
|
//# sourceMappingURL=version.js.map
|
package/_esm/utils/rpc/ipc.js
CHANGED
@@ -22,13 +22,16 @@ export function extractMessages(buffer) {
|
|
22
22
|
}
|
23
23
|
return [messages, buffer.subarray(cursor)];
|
24
24
|
}
|
25
|
-
export async function getIpcRpcClient(path) {
|
25
|
+
export async function getIpcRpcClient(path, options = {}) {
|
26
|
+
const { reconnect } = options;
|
26
27
|
return getSocketRpcClient({
|
27
|
-
async getSocket({ onResponse }) {
|
28
|
+
async getSocket({ onError, onOpen, onResponse }) {
|
28
29
|
const socket = connect(path);
|
29
30
|
function onClose() {
|
30
31
|
socket.off('close', onClose);
|
31
32
|
socket.off('message', onData);
|
33
|
+
socket.off('error', onError);
|
34
|
+
socket.off('connect', onOpen);
|
32
35
|
}
|
33
36
|
let lastRemaining = Buffer.alloc(0);
|
34
37
|
function onData(buffer) {
|
@@ -41,6 +44,8 @@ export async function getIpcRpcClient(path) {
|
|
41
44
|
}
|
42
45
|
socket.on('close', onClose);
|
43
46
|
socket.on('data', onData);
|
47
|
+
socket.on('error', onError);
|
48
|
+
socket.on('connect', onOpen);
|
44
49
|
// Wait for the socket to open.
|
45
50
|
await new Promise((resolve, reject) => {
|
46
51
|
socket.on('ready', () => {
|
@@ -65,6 +70,7 @@ export async function getIpcRpcClient(path) {
|
|
65
70
|
},
|
66
71
|
});
|
67
72
|
},
|
73
|
+
reconnect,
|
68
74
|
url: path,
|
69
75
|
});
|
70
76
|
}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"ipc.js","sourceRoot":"","sources":["../../../utils/rpc/ipc.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,OAAO,EAAE,MAAM,UAAU,CAAA;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAA;AACtD,OAAO,
|
1
|
+
{"version":3,"file":"ipc.js","sourceRoot":"","sources":["../../../utils/rpc/ipc.ts"],"names":[],"mappings":"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"}
|
package/_esm/utils/rpc/socket.js
CHANGED
@@ -4,11 +4,13 @@ import { withTimeout } from '../promise/withTimeout.js';
|
|
4
4
|
import { idCache } from './id.js';
|
5
5
|
export const socketClientCache = /*#__PURE__*/ new Map();
|
6
6
|
export async function getSocketRpcClient(params) {
|
7
|
-
const { getSocket, url } = params;
|
7
|
+
const { getSocket, reconnect = true, url } = params;
|
8
|
+
const { attempts = 5, delay = 2_000 } = typeof reconnect === 'object' ? reconnect : {};
|
8
9
|
let socketClient = socketClientCache.get(url);
|
9
10
|
// If the socket already exists, return it.
|
10
11
|
if (socketClient)
|
11
12
|
return socketClient;
|
13
|
+
let reconnectCount = 0;
|
12
14
|
const { schedule } = createBatchScheduler({
|
13
15
|
id: url,
|
14
16
|
fn: async () => {
|
@@ -16,19 +18,46 @@ export async function getSocketRpcClient(params) {
|
|
16
18
|
const requests = new Map();
|
17
19
|
// Set up a cache for subscriptions (eth_subscribe).
|
18
20
|
const subscriptions = new Map();
|
21
|
+
let error;
|
22
|
+
let socket;
|
19
23
|
// Set up socket implementation.
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
24
|
+
async function setup() {
|
25
|
+
return getSocket({
|
26
|
+
onError(error_) {
|
27
|
+
error = error_;
|
28
|
+
// Notify all requests and subscriptions of the error.
|
29
|
+
for (const request of requests.values())
|
30
|
+
request.onError?.(error);
|
31
|
+
for (const subscription of subscriptions.values())
|
32
|
+
subscription.onError?.(error);
|
33
|
+
// Clear all requests and subscriptions.
|
34
|
+
requests.clear();
|
35
|
+
subscriptions.clear();
|
36
|
+
// Attempt to reconnect.
|
37
|
+
if (reconnect && reconnectCount < attempts)
|
38
|
+
setTimeout(async () => {
|
39
|
+
reconnectCount++;
|
40
|
+
socket = await setup().catch(console.error);
|
41
|
+
}, delay);
|
42
|
+
},
|
43
|
+
onOpen() {
|
44
|
+
error = undefined;
|
45
|
+
reconnectCount = 0;
|
46
|
+
},
|
47
|
+
onResponse(data) {
|
48
|
+
const isSubscription = data.method === 'eth_subscription';
|
49
|
+
const id = isSubscription ? data.params.subscription : data.id;
|
50
|
+
const cache = isSubscription ? subscriptions : requests;
|
51
|
+
const callback = cache.get(id);
|
52
|
+
if (callback)
|
53
|
+
callback.onResponse(data);
|
54
|
+
if (!isSubscription)
|
55
|
+
cache.delete(id);
|
56
|
+
},
|
57
|
+
});
|
58
|
+
}
|
59
|
+
socket = await setup();
|
60
|
+
error = undefined;
|
32
61
|
// Create a new socket instance.
|
33
62
|
socketClient = {
|
34
63
|
close() {
|
@@ -37,6 +66,8 @@ export async function getSocketRpcClient(params) {
|
|
37
66
|
},
|
38
67
|
socket,
|
39
68
|
request({ body, onError, onResponse }) {
|
69
|
+
if (error && onError)
|
70
|
+
onError(error);
|
40
71
|
const id = body.id ?? idCache.take();
|
41
72
|
const callback = (response) => {
|
42
73
|
if (typeof response.id === 'number' && id !== response.id)
|
@@ -45,14 +76,16 @@ export async function getSocketRpcClient(params) {
|
|
45
76
|
// messages.
|
46
77
|
if (body.method === 'eth_subscribe' &&
|
47
78
|
typeof response.result === 'string')
|
48
|
-
subscriptions.set(response.result,
|
79
|
+
subscriptions.set(response.result, {
|
80
|
+
onResponse: callback,
|
81
|
+
onError,
|
82
|
+
});
|
49
83
|
// If we are unsubscribing from a topic, we want to remove the listener.
|
50
84
|
if (body.method === 'eth_unsubscribe')
|
51
85
|
subscriptions.delete(body.params?.[0]);
|
52
86
|
onResponse(response);
|
53
|
-
// TODO: delete request?
|
54
87
|
};
|
55
|
-
requests.set(id, callback);
|
88
|
+
requests.set(id, { onResponse: callback, onError });
|
56
89
|
try {
|
57
90
|
socket.request({
|
58
91
|
body: {
|
@@ -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,16 @@
|
|
1
1
|
import { WebSocketRequestError } from '../../errors/request.js';
|
2
2
|
import { getSocketRpcClient, } from './socket.js';
|
3
|
-
export async function getWebSocketRpcClient(url) {
|
3
|
+
export async function getWebSocketRpcClient(url, options = {}) {
|
4
|
+
const { reconnect } = options;
|
4
5
|
return getSocketRpcClient({
|
5
|
-
async getSocket({ onResponse }) {
|
6
|
+
async getSocket({ onError, onOpen, onResponse }) {
|
6
7
|
const WebSocket = await import('isows').then((module) => module.WebSocket);
|
7
8
|
const socket = new WebSocket(url);
|
8
9
|
function onClose() {
|
9
10
|
socket.removeEventListener('close', onClose);
|
10
11
|
socket.removeEventListener('message', onMessage);
|
12
|
+
socket.removeEventListener('error', onError);
|
13
|
+
socket.removeEventListener('open', onOpen);
|
11
14
|
}
|
12
15
|
function onMessage({ data }) {
|
13
16
|
onResponse(JSON.parse(data));
|
@@ -15,6 +18,8 @@ export async function getWebSocketRpcClient(url) {
|
|
15
18
|
// Setup event listeners for RPC & subscription responses.
|
16
19
|
socket.addEventListener('close', onClose);
|
17
20
|
socket.addEventListener('message', onMessage);
|
21
|
+
socket.addEventListener('error', onError);
|
22
|
+
socket.addEventListener('open', onOpen);
|
18
23
|
// Wait for the socket to open.
|
19
24
|
if (socket.readyState === WebSocket.CONNECTING) {
|
20
25
|
await new Promise((resolve, reject) => {
|
@@ -42,6 +47,7 @@ export async function getWebSocketRpcClient(url) {
|
|
42
47
|
},
|
43
48
|
});
|
44
49
|
},
|
50
|
+
reconnect,
|
45
51
|
url,
|
46
52
|
});
|
47
53
|
}
|
@@ -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,
|
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;IAE7B,OAAO,kBAAkB,CAAC;QACxB,KAAK,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE;YAC7C,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;YAC1E,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,GAAG,CAAC,CAAA;YAEjC,SAAS,OAAO;gBACd,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;gBAC5C,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAA;gBAChD,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;gBAC5C,MAAM,CAAC,mBAAmB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;YAC5C,CAAC;YACD,SAAS,SAAS,CAAC,EAAE,IAAI,EAAgB;gBACvC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAA;YAC9B,CAAC;YAED,0DAA0D;YAC1D,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;YACzC,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAA;YAC7C,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;YACzC,MAAM,CAAC,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;YAEvC,+BAA+B;YAC/B,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS,CAAC,UAAU,EAAE,CAAC;gBAC/C,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;oBACpC,IAAI,CAAC,MAAM;wBAAE,OAAM;oBACnB,MAAM,CAAC,MAAM,GAAG,OAAO,CAAA;oBACvB,MAAM,CAAC,OAAO,GAAG,MAAM,CAAA;gBACzB,CAAC,CAAC,CAAA;YACJ,CAAC;YAED,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAAA;YAEhC,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE;gBAC3B,KAAK;oBACH,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAA;oBACrB,OAAO,EAAE,CAAA;gBACX,CAAC;gBACD,OAAO,CAAC,EAAE,IAAI,EAAE;oBACd,IACE,MAAM,CAAC,UAAU,KAAK,MAAM,CAAC,MAAM;wBACnC,MAAM,CAAC,UAAU,KAAK,MAAM,CAAC,OAAO;wBAEpC,MAAM,IAAI,qBAAqB,CAAC;4BAC9B,IAAI;4BACJ,GAAG,EAAE,MAAM,CAAC,GAAG;4BACf,OAAO,EAAE,mBAAmB;yBAC7B,CAAC,CAAA;oBAEJ,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAA;gBAC1C,CAAC;aACmB,CAAC,CAAA;QACzB,CAAC;QACD,SAAS;QACT,GAAG;KACJ,CAAC,CAAA;AACJ,CAAC"}
|
@@ -2,7 +2,7 @@ import { type UrlRequiredErrorType } from '../../errors/transport.js';
|
|
2
2
|
import type { ErrorType } from '../../errors/utils.js';
|
3
3
|
import type { Hash } from '../../types/misc.js';
|
4
4
|
import type { RpcResponse } from '../../types/rpc.js';
|
5
|
-
import { type IpcRpcClient } from '../../utils/rpc/ipc.js';
|
5
|
+
import { type GetIpcRpcClientOptions, type IpcRpcClient } from '../../utils/rpc/ipc.js';
|
6
6
|
import { type CreateTransportErrorType, type Transport, type TransportConfig } from './createTransport.js';
|
7
7
|
type IpcTransportSubscribeParameters = {
|
8
8
|
onData: (data: RpcResponse) => void;
|
@@ -26,6 +26,11 @@ export type IpcTransportConfig = {
|
|
26
26
|
key?: TransportConfig['key'] | undefined;
|
27
27
|
/** The name of the Ipc transport. */
|
28
28
|
name?: TransportConfig['name'] | undefined;
|
29
|
+
/**
|
30
|
+
* Whether or not to attempt to reconnect on socket failure.
|
31
|
+
* @default true
|
32
|
+
*/
|
33
|
+
reconnect?: GetIpcRpcClientOptions['reconnect'] | undefined;
|
29
34
|
/** The max number of times to retry. */
|
30
35
|
retryCount?: TransportConfig['retryCount'] | undefined;
|
31
36
|
/** The base delay (in ms) between retries. */
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"ipc.d.ts","sourceRoot":"","sources":["../../../clients/transports/ipc.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,oBAAoB,EAAE,MAAM,2BAA2B,CAAA;AACrE,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;AACrD,OAAO,
|
1
|
+
{"version":3,"file":"ipc.d.ts","sourceRoot":"","sources":["../../../clients/transports/ipc.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,oBAAoB,EAAE,MAAM,2BAA2B,CAAA;AACrE,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;AACrD,OAAO,EACL,KAAK,sBAAsB,EAC3B,KAAK,YAAY,EAElB,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EACL,KAAK,wBAAwB,EAC7B,KAAK,SAAS,EACd,KAAK,eAAe,EAErB,MAAM,sBAAsB,CAAA;AAE7B,KAAK,+BAA+B,GAAG;IACrC,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,+BAA+B,GAAG;IACrC,cAAc,EAAE,IAAI,CAAA;IACpB,WAAW,EAAE,MAAM,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAA;CACjD,CAAA;AAED,KAAK,qBAAqB,GAAG;IAC3B,SAAS,CACP,IAAI,EAAE,+BAA+B,GAAG;QACtC;;;WAGG;QACH,MAAM,EAAE,CAAC,UAAU,CAAC,CAAA;KACrB,GACA,OAAO,CAAC,+BAA+B,CAAC,CAAA;CAC5C,CAAA;AAED,MAAM,MAAM,kBAAkB,GAAG;IAC/B,oCAAoC;IACpC,GAAG,CAAC,EAAE,eAAe,CAAC,KAAK,CAAC,GAAG,SAAS,CAAA;IACxC,qCAAqC;IACrC,IAAI,CAAC,EAAE,eAAe,CAAC,MAAM,CAAC,GAAG,SAAS,CAAA;IAC1C;;;OAGG;IACH,SAAS,CAAC,EAAE,sBAAsB,CAAC,WAAW,CAAC,GAAG,SAAS,CAAA;IAC3D,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,kEAAkE;IAClE,OAAO,CAAC,EAAE,eAAe,CAAC,SAAS,CAAC,GAAG,SAAS,CAAA;CACjD,CAAA;AAED,MAAM,MAAM,YAAY,GAAG,SAAS,CAClC,KAAK,EACL;IACE,YAAY,IAAI,OAAO,CAAC,YAAY,CAAC,CAAA;IACrC,SAAS,EAAE,qBAAqB,CAAC,WAAW,CAAC,CAAA;CAC9C,CACF,CAAA;AAED,MAAM,MAAM,qBAAqB,GAC7B,wBAAwB,GACxB,oBAAoB,GACpB,SAAS,CAAA;AAEb;;GAEG;AACH,wBAAgB,GAAG,CACjB,IAAI,EAAE,MAAM,EACZ,MAAM,GAAE,kBAAuB,GAC9B,YAAY,CA4Ed"}
|
@@ -3,6 +3,7 @@ import type { ErrorType } from '../../errors/utils.js';
|
|
3
3
|
import type { Hash } from '../../types/misc.js';
|
4
4
|
import type { RpcResponse } from '../../types/rpc.js';
|
5
5
|
import type { SocketRpcClient } from '../../utils/rpc/socket.js';
|
6
|
+
import { type GetWebSocketRpcClientOptions } from '../../utils/rpc/webSocket.js';
|
6
7
|
import { type CreateTransportErrorType, type Transport, type TransportConfig } from './createTransport.js';
|
7
8
|
type WebSocketTransportSubscribeParameters = {
|
8
9
|
onData: (data: RpcResponse) => void;
|
@@ -26,6 +27,11 @@ export type WebSocketTransportConfig = {
|
|
26
27
|
key?: TransportConfig['key'] | undefined;
|
27
28
|
/** The name of the WebSocket transport. */
|
28
29
|
name?: TransportConfig['name'] | undefined;
|
30
|
+
/**
|
31
|
+
* Whether or not to attempt to reconnect on socket failure.
|
32
|
+
* @default true
|
33
|
+
*/
|
34
|
+
reconnect?: GetWebSocketRpcClientOptions['reconnect'] | undefined;
|
29
35
|
/** The max number of times to retry. */
|
30
36
|
retryCount?: TransportConfig['retryCount'] | undefined;
|
31
37
|
/** The base delay (in ms) between retries. */
|
@@ -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;
|
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,CAsFpB"}
|
@@ -1,2 +1,2 @@
|
|
1
|
-
export declare const version = "2.9.
|
1
|
+
export declare const version = "2.9.12";
|
2
2
|
//# sourceMappingURL=version.d.ts.map
|
@@ -30,8 +30,14 @@ export declare function getSocket(url: string): Promise<WebSocket & {
|
|
30
30
|
body: import("../../types/rpc.js").RpcRequest;
|
31
31
|
}): void;
|
32
32
|
} & {
|
33
|
-
requests: Map<string | number,
|
34
|
-
|
33
|
+
requests: Map<string | number, {
|
34
|
+
onResponse: (message: any) => void;
|
35
|
+
onError?: ((error?: Error | Event | undefined) => void) | undefined;
|
36
|
+
}>;
|
37
|
+
subscriptions: Map<string | number, {
|
38
|
+
onResponse: (message: any) => void;
|
39
|
+
onError?: ((error?: Error | Event | undefined) => void) | undefined;
|
40
|
+
}>;
|
35
41
|
}>;
|
36
42
|
export declare const rpc: {
|
37
43
|
/**
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"compat.d.ts","sourceRoot":"","sources":["../../../utils/rpc/compat.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,KAAK,gBAAgB,EACrB,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,EAAE,KAAK,oBAAoB,EAAE,MAAM,2BAA2B,CAAA;AACrE,OAAO,EAAE,KAAK,qBAAqB,EAAoB,MAAM,WAAW,CAAA;AACxE,OAAO,EAAE,KAAK,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,EACL,KAAK,gBAAgB,EACrB,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,EAAE,KAAK,oBAAoB,EAAE,MAAM,2BAA2B,CAAA;AACrE,OAAO,EAAE,KAAK,qBAAqB,EAAoB,MAAM,WAAW,CAAA;AACxE,OAAO,EAAE,KAAK,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;;;;;;;;;;;;;;GAM1C;AAED,eAAO,MAAM,GAAG;IACd;;;;;;;;;;;OAWG;cACO,MAAM,UAAU,qBAAqB;IAG/C;;;;;;;;;;;OAWG;;IAEH;;;;;;;;;;;OAWG;;CAEJ,CAAA"}
|
@@ -1,8 +1,9 @@
|
|
1
1
|
/// <reference types="node" />
|
2
2
|
/// <reference types="node" />
|
3
3
|
import { type Socket as NetSocket } from 'node:net';
|
4
|
-
import { type SocketRpcClient } from './socket.js';
|
4
|
+
import { type GetSocketRpcClientParameters, type SocketRpcClient } from './socket.js';
|
5
|
+
export type GetIpcRpcClientOptions = Pick<GetSocketRpcClientParameters, 'reconnect'>;
|
5
6
|
export declare function extractMessages(buffer: Buffer): [Buffer[], Buffer];
|
6
7
|
export type IpcRpcClient = SocketRpcClient<NetSocket>;
|
7
|
-
export declare function getIpcRpcClient(path: string): Promise<IpcRpcClient>;
|
8
|
+
export declare function getIpcRpcClient(path: string, options?: GetIpcRpcClientOptions): Promise<IpcRpcClient>;
|
8
9
|
//# sourceMappingURL=ipc.d.ts.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"ipc.d.ts","sourceRoot":"","sources":["../../../utils/rpc/ipc.ts"],"names":[],"mappings":";;AAAA,OAAO,EAAE,KAAK,MAAM,IAAI,SAAS,EAAW,MAAM,UAAU,CAAA;AAE5D,OAAO,
|
1
|
+
{"version":3,"file":"ipc.d.ts","sourceRoot":"","sources":["../../../utils/rpc/ipc.ts"],"names":[],"mappings":";;AAAA,OAAO,EAAE,KAAK,MAAM,IAAI,SAAS,EAAW,MAAM,UAAU,CAAA;AAE5D,OAAO,EACL,KAAK,4BAA4B,EAEjC,KAAK,eAAe,EAErB,MAAM,aAAa,CAAA;AAEpB,MAAM,MAAM,sBAAsB,GAAG,IAAI,CACvC,4BAA4B,EAC5B,WAAW,CACZ,CAAA;AAKD,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,EAAE,MAAM,CAAC,CAoBlE;AAED,MAAM,MAAM,YAAY,GAAG,eAAe,CAAC,SAAS,CAAC,CAAA;AAErD,wBAAsB,eAAe,CACnC,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,sBAA2B,GACnC,OAAO,CAAC,YAAY,CAAC,CA4DvB"}
|
@@ -2,9 +2,14 @@ import type { ErrorType } from '../../errors/utils.js';
|
|
2
2
|
import type { RpcRequest, RpcResponse } from '../../types/rpc.js';
|
3
3
|
import { type CreateBatchSchedulerErrorType } from '../promise/createBatchScheduler.js';
|
4
4
|
type Id = string | number;
|
5
|
-
type CallbackFn =
|
5
|
+
type CallbackFn = {
|
6
|
+
onResponse: (message: any) => void;
|
7
|
+
onError?: ((error?: Error | Event | undefined) => void) | undefined;
|
8
|
+
};
|
6
9
|
type CallbackMap = Map<Id, CallbackFn>;
|
7
10
|
export type GetSocketParameters = {
|
11
|
+
onError: (error?: Error | Event | undefined) => void;
|
12
|
+
onOpen: () => void;
|
8
13
|
onResponse: (data: RpcResponse) => void;
|
9
14
|
};
|
10
15
|
export type Socket<socket extends {}> = socket & {
|
@@ -18,7 +23,7 @@ export type SocketRpcClient<socket extends {}> = {
|
|
18
23
|
socket: Socket<socket>;
|
19
24
|
request(params: {
|
20
25
|
body: RpcRequest;
|
21
|
-
onError?: ((error
|
26
|
+
onError?: ((error?: Error | Event | undefined) => void) | undefined;
|
22
27
|
onResponse: (message: RpcResponse) => void;
|
23
28
|
}): void;
|
24
29
|
requestAsync(params: {
|
@@ -29,9 +34,25 @@ export type SocketRpcClient<socket extends {}> = {
|
|
29
34
|
subscriptions: CallbackMap;
|
30
35
|
url: string;
|
31
36
|
};
|
32
|
-
export type GetSocketRpcClientParameters<socket extends {}> = {
|
33
|
-
url: string;
|
37
|
+
export type GetSocketRpcClientParameters<socket extends {} = {}> = {
|
34
38
|
getSocket(params: GetSocketParameters): Promise<Socket<socket>>;
|
39
|
+
/**
|
40
|
+
* Whether or not to attempt to reconnect on socket failure.
|
41
|
+
* @default true
|
42
|
+
*/
|
43
|
+
reconnect?: boolean | {
|
44
|
+
/**
|
45
|
+
* The maximum number of reconnection attempts.
|
46
|
+
* @default 5
|
47
|
+
*/
|
48
|
+
attempts?: number | undefined;
|
49
|
+
/**
|
50
|
+
* The delay (in ms) between reconnection attempts.
|
51
|
+
* @default 2_000
|
52
|
+
*/
|
53
|
+
delay?: number | undefined;
|
54
|
+
} | undefined;
|
55
|
+
url: string;
|
35
56
|
};
|
36
57
|
export type GetSocketRpcClientErrorType = CreateBatchSchedulerErrorType | ErrorType;
|
37
58
|
export declare const socketClientCache: Map<string, SocketRpcClient<{
|
@@ -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,CAAC,OAAO,EAAE,GAAG,KAAK,IAAI,CAAA;
|
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;QACd,IAAI,EAAE,UAAU,CAAA;KACjB,GAAG,IAAI,CAAA;CACT,CAAA;AAED,MAAM,MAAM,eAAe,CAAC,MAAM,SAAS,EAAE,IAAI;IAC/C,KAAK,IAAI,IAAI,CAAA;IACb,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAA;IACtB,OAAO,CAAC,MAAM,EAAE;QACd,IAAI,EAAE,UAAU,CAAA;QAChB,OAAO,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,KAAK,GAAG,SAAS,KAAK,IAAI,CAAC,GAAG,SAAS,CAAA;QACnE,UAAU,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,IAAI,CAAA;KAC3C,GAAG,IAAI,CAAA;IACR,YAAY,CAAC,MAAM,EAAE;QACnB,IAAI,EAAE,UAAU,CAAA;QAChB,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;KAC7B,GAAG,OAAO,CAAC,WAAW,CAAC,CAAA;IACxB,QAAQ,EAAE,WAAW,CAAA;IACrB,aAAa,EAAE,WAAW,CAAA;IAC1B,GAAG,EAAE,MAAM,CAAA;CACZ,CAAA;AAED,MAAM,MAAM,4BAA4B,CAAC,MAAM,SAAS,EAAE,GAAG,EAAE,IAAI;IACjE,SAAS,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAA;IAC/D;;;OAGG;IACH,SAAS,CAAC,EACN,OAAO,GACP;QACE;;;WAGG;QACH,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QAC7B;;;WAGG;QACH,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;KAC3B,GACD,SAAS,CAAA;IACb,GAAG,EAAE,MAAM,CAAA;CACZ,CAAA;AAED,MAAM,MAAM,2BAA2B,GACnC,6BAA6B,GAC7B,SAAS,CAAA;AAEb,eAAO,MAAM,iBAAiB;aAnDnB,IAAI;oBACG;QACd,IAAI,EAAE,UAAU,CAAA;KACjB,GAAG,IAAI;GAmDP,CAAA;AAEH,wBAAsB,kBAAkB,CAAC,MAAM,SAAS,EAAE,EACxD,MAAM,EAAE,4BAA4B,CAAC,MAAM,CAAC,GAC3C,OAAO,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CA0IlC"}
|
@@ -1,3 +1,4 @@
|
|
1
|
-
import { type SocketRpcClient } from './socket.js';
|
2
|
-
export
|
1
|
+
import { type GetSocketRpcClientParameters, type SocketRpcClient } from './socket.js';
|
2
|
+
export type GetWebSocketRpcClientOptions = Pick<GetSocketRpcClientParameters, 'reconnect'>;
|
3
|
+
export declare function getWebSocketRpcClient(url: string, options?: GetWebSocketRpcClientOptions | undefined): Promise<SocketRpcClient<WebSocket>>;
|
3
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,
|
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,CACZ,CAAA;AAED,wBAAsB,qBAAqB,CACzC,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,4BAA4B,GAAG,SAAc,GACrD,OAAO,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,CA0DrC"}
|
@@ -3,7 +3,11 @@ import { type UrlRequiredErrorType } from '../../errors/transport.js'
|
|
3
3
|
import type { ErrorType } from '../../errors/utils.js'
|
4
4
|
import type { Hash } from '../../types/misc.js'
|
5
5
|
import type { RpcResponse } from '../../types/rpc.js'
|
6
|
-
import {
|
6
|
+
import {
|
7
|
+
type GetIpcRpcClientOptions,
|
8
|
+
type IpcRpcClient,
|
9
|
+
getIpcRpcClient,
|
10
|
+
} from '../../utils/rpc/ipc.js'
|
7
11
|
import {
|
8
12
|
type CreateTransportErrorType,
|
9
13
|
type Transport,
|
@@ -38,6 +42,11 @@ export type IpcTransportConfig = {
|
|
38
42
|
key?: TransportConfig['key'] | undefined
|
39
43
|
/** The name of the Ipc transport. */
|
40
44
|
name?: TransportConfig['name'] | undefined
|
45
|
+
/**
|
46
|
+
* Whether or not to attempt to reconnect on socket failure.
|
47
|
+
* @default true
|
48
|
+
*/
|
49
|
+
reconnect?: GetIpcRpcClientOptions['reconnect'] | undefined
|
41
50
|
/** The max number of times to retry. */
|
42
51
|
retryCount?: TransportConfig['retryCount'] | undefined
|
43
52
|
/** The base delay (in ms) between retries. */
|
@@ -66,7 +75,7 @@ export function ipc(
|
|
66
75
|
path: string,
|
67
76
|
config: IpcTransportConfig = {},
|
68
77
|
): IpcTransport {
|
69
|
-
const { key = 'ipc', name = 'IPC JSON-RPC', retryDelay } = config
|
78
|
+
const { key = 'ipc', name = 'IPC JSON-RPC', reconnect, retryDelay } = config
|
70
79
|
return ({ retryCount: retryCount_, timeout: timeout_ }) => {
|
71
80
|
const retryCount = config.retryCount ?? retryCount_
|
72
81
|
const timeout = timeout_ ?? config.timeout ?? 10_000
|
@@ -76,7 +85,7 @@ export function ipc(
|
|
76
85
|
name,
|
77
86
|
async request({ method, params }) {
|
78
87
|
const body = { method, params }
|
79
|
-
const rpcClient = await getIpcRpcClient(path)
|
88
|
+
const rpcClient = await getIpcRpcClient(path, { reconnect })
|
80
89
|
const { error, result } = await rpcClient.requestAsync({
|
81
90
|
body,
|
82
91
|
timeout,
|
@@ -8,7 +8,10 @@ import type { Hash } from '../../types/misc.js'
|
|
8
8
|
import type { RpcResponse } from '../../types/rpc.js'
|
9
9
|
import { getSocket } from '../../utils/rpc/compat.js'
|
10
10
|
import type { SocketRpcClient } from '../../utils/rpc/socket.js'
|
11
|
-
import {
|
11
|
+
import {
|
12
|
+
type GetWebSocketRpcClientOptions,
|
13
|
+
getWebSocketRpcClient,
|
14
|
+
} from '../../utils/rpc/webSocket.js'
|
12
15
|
import {
|
13
16
|
type CreateTransportErrorType,
|
14
17
|
type Transport,
|
@@ -43,6 +46,11 @@ export type WebSocketTransportConfig = {
|
|
43
46
|
key?: TransportConfig['key'] | undefined
|
44
47
|
/** The name of the WebSocket transport. */
|
45
48
|
name?: TransportConfig['name'] | undefined
|
49
|
+
/**
|
50
|
+
* Whether or not to attempt to reconnect on socket failure.
|
51
|
+
* @default true
|
52
|
+
*/
|
53
|
+
reconnect?: GetWebSocketRpcClientOptions['reconnect'] | undefined
|
46
54
|
/** The max number of times to retry. */
|
47
55
|
retryCount?: TransportConfig['retryCount'] | undefined
|
48
56
|
/** The base delay (in ms) between retries. */
|
@@ -76,7 +84,12 @@ export function webSocket(
|
|
76
84
|
url?: string,
|
77
85
|
config: WebSocketTransportConfig = {},
|
78
86
|
): WebSocketTransport {
|
79
|
-
const {
|
87
|
+
const {
|
88
|
+
key = 'webSocket',
|
89
|
+
name = 'WebSocket JSON-RPC',
|
90
|
+
reconnect,
|
91
|
+
retryDelay,
|
92
|
+
} = config
|
80
93
|
return ({ chain, retryCount: retryCount_, timeout: timeout_ }) => {
|
81
94
|
const retryCount = config.retryCount ?? retryCount_
|
82
95
|
const timeout = timeout_ ?? config.timeout ?? 10_000
|
@@ -88,7 +101,7 @@ export function webSocket(
|
|
88
101
|
name,
|
89
102
|
async request({ method, params }) {
|
90
103
|
const body = { method, params }
|
91
|
-
const rpcClient = await getWebSocketRpcClient(url_)
|
104
|
+
const rpcClient = await getWebSocketRpcClient(url_, { reconnect })
|
92
105
|
const { error, result } = await rpcClient.requestAsync({
|
93
106
|
body,
|
94
107
|
timeout,
|
package/errors/version.ts
CHANGED
@@ -1 +1 @@
|
|
1
|
-
export const version = '2.9.
|
1
|
+
export const version = '2.9.12'
|
package/package.json
CHANGED
package/utils/rpc/ipc.ts
CHANGED
@@ -1,11 +1,17 @@
|
|
1
1
|
import { type Socket as NetSocket, connect } from 'node:net'
|
2
2
|
import { WebSocketRequestError } from '../../index.js'
|
3
3
|
import {
|
4
|
+
type GetSocketRpcClientParameters,
|
4
5
|
type Socket,
|
5
6
|
type SocketRpcClient,
|
6
7
|
getSocketRpcClient,
|
7
8
|
} from './socket.js'
|
8
9
|
|
10
|
+
export type GetIpcRpcClientOptions = Pick<
|
11
|
+
GetSocketRpcClientParameters,
|
12
|
+
'reconnect'
|
13
|
+
>
|
14
|
+
|
9
15
|
const openingBrace = '{'.charCodeAt(0)
|
10
16
|
const closingBrace = '}'.charCodeAt(0)
|
11
17
|
|
@@ -33,14 +39,21 @@ export function extractMessages(buffer: Buffer): [Buffer[], Buffer] {
|
|
33
39
|
|
34
40
|
export type IpcRpcClient = SocketRpcClient<NetSocket>
|
35
41
|
|
36
|
-
export async function getIpcRpcClient(
|
42
|
+
export async function getIpcRpcClient(
|
43
|
+
path: string,
|
44
|
+
options: GetIpcRpcClientOptions = {},
|
45
|
+
): Promise<IpcRpcClient> {
|
46
|
+
const { reconnect } = options
|
47
|
+
|
37
48
|
return getSocketRpcClient({
|
38
|
-
async getSocket({ onResponse }) {
|
49
|
+
async getSocket({ onError, onOpen, onResponse }) {
|
39
50
|
const socket = connect(path)
|
40
51
|
|
41
52
|
function onClose() {
|
42
53
|
socket.off('close', onClose)
|
43
54
|
socket.off('message', onData)
|
55
|
+
socket.off('error', onError)
|
56
|
+
socket.off('connect', onOpen)
|
44
57
|
}
|
45
58
|
|
46
59
|
let lastRemaining = Buffer.alloc(0)
|
@@ -57,6 +70,8 @@ export async function getIpcRpcClient(path: string): Promise<IpcRpcClient> {
|
|
57
70
|
|
58
71
|
socket.on('close', onClose)
|
59
72
|
socket.on('data', onData)
|
73
|
+
socket.on('error', onError)
|
74
|
+
socket.on('connect', onOpen)
|
60
75
|
|
61
76
|
// Wait for the socket to open.
|
62
77
|
await new Promise<void>((resolve, reject) => {
|
@@ -84,6 +99,7 @@ export async function getIpcRpcClient(path: string): Promise<IpcRpcClient> {
|
|
84
99
|
},
|
85
100
|
} as Socket<{}>)
|
86
101
|
},
|
102
|
+
reconnect,
|
87
103
|
url: path,
|
88
104
|
})
|
89
105
|
}
|
package/utils/rpc/socket.ts
CHANGED
@@ -9,10 +9,15 @@ import { withTimeout } from '../promise/withTimeout.js'
|
|
9
9
|
import { idCache } from './id.js'
|
10
10
|
|
11
11
|
type Id = string | number
|
12
|
-
type CallbackFn =
|
12
|
+
type CallbackFn = {
|
13
|
+
onResponse: (message: any) => void
|
14
|
+
onError?: ((error?: Error | Event | undefined) => void) | undefined
|
15
|
+
}
|
13
16
|
type CallbackMap = Map<Id, CallbackFn>
|
14
17
|
|
15
18
|
export type GetSocketParameters = {
|
19
|
+
onError: (error?: Error | Event | undefined) => void
|
20
|
+
onOpen: () => void
|
16
21
|
onResponse: (data: RpcResponse) => void
|
17
22
|
}
|
18
23
|
|
@@ -28,7 +33,7 @@ export type SocketRpcClient<socket extends {}> = {
|
|
28
33
|
socket: Socket<socket>
|
29
34
|
request(params: {
|
30
35
|
body: RpcRequest
|
31
|
-
onError?: ((error
|
36
|
+
onError?: ((error?: Error | Event | undefined) => void) | undefined
|
32
37
|
onResponse: (message: RpcResponse) => void
|
33
38
|
}): void
|
34
39
|
requestAsync(params: {
|
@@ -40,9 +45,28 @@ export type SocketRpcClient<socket extends {}> = {
|
|
40
45
|
url: string
|
41
46
|
}
|
42
47
|
|
43
|
-
export type GetSocketRpcClientParameters<socket extends {}> = {
|
44
|
-
url: string
|
48
|
+
export type GetSocketRpcClientParameters<socket extends {} = {}> = {
|
45
49
|
getSocket(params: GetSocketParameters): Promise<Socket<socket>>
|
50
|
+
/**
|
51
|
+
* Whether or not to attempt to reconnect on socket failure.
|
52
|
+
* @default true
|
53
|
+
*/
|
54
|
+
reconnect?:
|
55
|
+
| boolean
|
56
|
+
| {
|
57
|
+
/**
|
58
|
+
* The maximum number of reconnection attempts.
|
59
|
+
* @default 5
|
60
|
+
*/
|
61
|
+
attempts?: number | undefined
|
62
|
+
/**
|
63
|
+
* The delay (in ms) between reconnection attempts.
|
64
|
+
* @default 2_000
|
65
|
+
*/
|
66
|
+
delay?: number | undefined
|
67
|
+
}
|
68
|
+
| undefined
|
69
|
+
url: string
|
46
70
|
}
|
47
71
|
|
48
72
|
export type GetSocketRpcClientErrorType =
|
@@ -57,13 +81,16 @@ export const socketClientCache = /*#__PURE__*/ new Map<
|
|
57
81
|
export async function getSocketRpcClient<socket extends {}>(
|
58
82
|
params: GetSocketRpcClientParameters<socket>,
|
59
83
|
): Promise<SocketRpcClient<socket>> {
|
60
|
-
const { getSocket, url } = params
|
84
|
+
const { getSocket, reconnect = true, url } = params
|
85
|
+
const { attempts = 5, delay = 2_000 } =
|
86
|
+
typeof reconnect === 'object' ? reconnect : {}
|
61
87
|
|
62
88
|
let socketClient = socketClientCache.get(url)
|
63
89
|
|
64
90
|
// If the socket already exists, return it.
|
65
91
|
if (socketClient) return socketClient as {} as SocketRpcClient<socket>
|
66
92
|
|
93
|
+
let reconnectCount = 0
|
67
94
|
const { schedule } = createBatchScheduler<
|
68
95
|
undefined,
|
69
96
|
[SocketRpcClient<socket>]
|
@@ -76,17 +103,46 @@ export async function getSocketRpcClient<socket extends {}>(
|
|
76
103
|
// Set up a cache for subscriptions (eth_subscribe).
|
77
104
|
const subscriptions = new Map<Id, CallbackFn>()
|
78
105
|
|
106
|
+
let error: Error | Event | undefined
|
107
|
+
let socket: Socket<any>
|
79
108
|
// Set up socket implementation.
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
109
|
+
async function setup() {
|
110
|
+
return getSocket({
|
111
|
+
onError(error_) {
|
112
|
+
error = error_
|
113
|
+
|
114
|
+
// Notify all requests and subscriptions of the error.
|
115
|
+
for (const request of requests.values()) request.onError?.(error)
|
116
|
+
for (const subscription of subscriptions.values())
|
117
|
+
subscription.onError?.(error)
|
118
|
+
|
119
|
+
// Clear all requests and subscriptions.
|
120
|
+
requests.clear()
|
121
|
+
subscriptions.clear()
|
122
|
+
|
123
|
+
// Attempt to reconnect.
|
124
|
+
if (reconnect && reconnectCount < attempts)
|
125
|
+
setTimeout(async () => {
|
126
|
+
reconnectCount++
|
127
|
+
socket = await setup().catch(console.error)
|
128
|
+
}, delay)
|
129
|
+
},
|
130
|
+
onOpen() {
|
131
|
+
error = undefined
|
132
|
+
reconnectCount = 0
|
133
|
+
},
|
134
|
+
onResponse(data) {
|
135
|
+
const isSubscription = data.method === 'eth_subscription'
|
136
|
+
const id = isSubscription ? data.params.subscription : data.id
|
137
|
+
const cache = isSubscription ? subscriptions : requests
|
138
|
+
const callback = cache.get(id)
|
139
|
+
if (callback) callback.onResponse(data)
|
140
|
+
if (!isSubscription) cache.delete(id)
|
141
|
+
},
|
142
|
+
})
|
143
|
+
}
|
144
|
+
socket = await setup()
|
145
|
+
error = undefined
|
90
146
|
|
91
147
|
// Create a new socket instance.
|
92
148
|
socketClient = {
|
@@ -96,6 +152,8 @@ export async function getSocketRpcClient<socket extends {}>(
|
|
96
152
|
},
|
97
153
|
socket,
|
98
154
|
request({ body, onError, onResponse }) {
|
155
|
+
if (error && onError) onError(error)
|
156
|
+
|
99
157
|
const id = body.id ?? idCache.take()
|
100
158
|
|
101
159
|
const callback = (response: RpcResponse) => {
|
@@ -107,18 +165,19 @@ export async function getSocketRpcClient<socket extends {}>(
|
|
107
165
|
body.method === 'eth_subscribe' &&
|
108
166
|
typeof response.result === 'string'
|
109
167
|
)
|
110
|
-
subscriptions.set(response.result,
|
168
|
+
subscriptions.set(response.result, {
|
169
|
+
onResponse: callback,
|
170
|
+
onError,
|
171
|
+
})
|
111
172
|
|
112
173
|
// If we are unsubscribing from a topic, we want to remove the listener.
|
113
174
|
if (body.method === 'eth_unsubscribe')
|
114
175
|
subscriptions.delete(body.params?.[0])
|
115
176
|
|
116
177
|
onResponse(response)
|
117
|
-
|
118
|
-
// TODO: delete request?
|
119
178
|
}
|
120
179
|
|
121
|
-
requests.set(id, callback)
|
180
|
+
requests.set(id, { onResponse: callback, onError })
|
122
181
|
try {
|
123
182
|
socket.request({
|
124
183
|
body: {
|
package/utils/rpc/webSocket.ts
CHANGED
@@ -2,22 +2,33 @@ import type { MessageEvent } from 'isows'
|
|
2
2
|
|
3
3
|
import { WebSocketRequestError } from '../../errors/request.js'
|
4
4
|
import {
|
5
|
+
type GetSocketRpcClientParameters,
|
5
6
|
type Socket,
|
6
7
|
type SocketRpcClient,
|
7
8
|
getSocketRpcClient,
|
8
9
|
} from './socket.js'
|
9
10
|
|
11
|
+
export type GetWebSocketRpcClientOptions = Pick<
|
12
|
+
GetSocketRpcClientParameters,
|
13
|
+
'reconnect'
|
14
|
+
>
|
15
|
+
|
10
16
|
export async function getWebSocketRpcClient(
|
11
17
|
url: string,
|
18
|
+
options: GetWebSocketRpcClientOptions | undefined = {},
|
12
19
|
): Promise<SocketRpcClient<WebSocket>> {
|
20
|
+
const { reconnect } = options
|
21
|
+
|
13
22
|
return getSocketRpcClient({
|
14
|
-
async getSocket({ onResponse }) {
|
23
|
+
async getSocket({ onError, onOpen, onResponse }) {
|
15
24
|
const WebSocket = await import('isows').then((module) => module.WebSocket)
|
16
25
|
const socket = new WebSocket(url)
|
17
26
|
|
18
27
|
function onClose() {
|
19
28
|
socket.removeEventListener('close', onClose)
|
20
29
|
socket.removeEventListener('message', onMessage)
|
30
|
+
socket.removeEventListener('error', onError)
|
31
|
+
socket.removeEventListener('open', onOpen)
|
21
32
|
}
|
22
33
|
function onMessage({ data }: MessageEvent) {
|
23
34
|
onResponse(JSON.parse(data))
|
@@ -26,6 +37,8 @@ export async function getWebSocketRpcClient(
|
|
26
37
|
// Setup event listeners for RPC & subscription responses.
|
27
38
|
socket.addEventListener('close', onClose)
|
28
39
|
socket.addEventListener('message', onMessage)
|
40
|
+
socket.addEventListener('error', onError)
|
41
|
+
socket.addEventListener('open', onOpen)
|
29
42
|
|
30
43
|
// Wait for the socket to open.
|
31
44
|
if (socket.readyState === WebSocket.CONNECTING) {
|
@@ -58,6 +71,7 @@ export async function getWebSocketRpcClient(
|
|
58
71
|
},
|
59
72
|
} as Socket<WebSocket>)
|
60
73
|
},
|
74
|
+
reconnect,
|
61
75
|
url,
|
62
76
|
})
|
63
77
|
}
|