@chainflip/rpc 1.4.0
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/dist/Client.cjs +32 -0
- package/dist/Client.d.cts +22 -0
- package/dist/Client.d.ts +22 -0
- package/dist/Client.js +32 -0
- package/dist/HttpClient.cjs +24 -0
- package/dist/HttpClient.d.cts +17 -0
- package/dist/HttpClient.d.ts +17 -0
- package/dist/HttpClient.js +24 -0
- package/dist/WsClient.cjs +107 -0
- package/dist/WsClient.d.cts +30 -0
- package/dist/WsClient.d.ts +30 -0
- package/dist/WsClient.js +107 -0
- package/dist/common.cjs +33 -0
- package/dist/common.d.cts +2595 -0
- package/dist/common.d.ts +2595 -0
- package/dist/common.js +33 -0
- package/dist/constants-jLrn-AnI.d.cts +13 -0
- package/dist/constants-jLrn-AnI.d.ts +13 -0
- package/dist/constants.cjs +9 -0
- package/dist/constants.d.cts +1 -0
- package/dist/constants.d.ts +1 -0
- package/dist/constants.js +9 -0
- package/dist/index.cjs +9 -0
- package/dist/index.d.cts +9 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.js +9 -0
- package/dist/parsers.cjs +113 -0
- package/dist/parsers.d.cts +2612 -0
- package/dist/parsers.d.ts +2612 -0
- package/dist/parsers.js +113 -0
- package/dist/types.cjs +1 -0
- package/dist/types.d.cts +24 -0
- package/dist/types.d.ts +24 -0
- package/dist/types.js +0 -0
- package/package.json +52 -0
package/dist/Client.cjs
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});var _common = require('./common');
|
|
2
|
+
var _assertion = require('@chainflip/utils/assertion');
|
|
3
|
+
class Client {
|
|
4
|
+
constructor(url) {
|
|
5
|
+
this.url = url;
|
|
6
|
+
}
|
|
7
|
+
getRequestId() {
|
|
8
|
+
return "1";
|
|
9
|
+
}
|
|
10
|
+
formatRequest(method, params) {
|
|
11
|
+
return { jsonrpc: "2.0", id: this.getRequestId(), method, params };
|
|
12
|
+
}
|
|
13
|
+
async sendRequest(method, ...params) {
|
|
14
|
+
const response = await this.send(this.formatRequest(method, params));
|
|
15
|
+
if (!response.success)
|
|
16
|
+
throw response.error;
|
|
17
|
+
const parseResult = _common.rpcResponse.safeParse(response.result);
|
|
18
|
+
_assertion.assert.call(void 0, parseResult.success, "Malformed RPC response received");
|
|
19
|
+
if ("error" in parseResult.data) {
|
|
20
|
+
throw new Error(
|
|
21
|
+
`RPC error [${parseResult.data.error.code}]: ${parseResult.data.error.message}`
|
|
22
|
+
);
|
|
23
|
+
}
|
|
24
|
+
return _common.rpcResult[method].parse(parseResult.data.result);
|
|
25
|
+
}
|
|
26
|
+
methods() {
|
|
27
|
+
return Object.keys(_common.rpcResult).sort();
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
exports.default = Client;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { RpcMethod, JsonRpcRequest, RpcRequest, RpcResult } from './common.cjs';
|
|
2
|
+
import 'zod';
|
|
3
|
+
import './parsers.cjs';
|
|
4
|
+
import '@chainflip/utils/types';
|
|
5
|
+
|
|
6
|
+
declare abstract class Client {
|
|
7
|
+
protected readonly url: string;
|
|
8
|
+
constructor(url: string);
|
|
9
|
+
protected abstract send<const T extends RpcMethod>(data: JsonRpcRequest<T>): Promise<{
|
|
10
|
+
success: true;
|
|
11
|
+
result: unknown;
|
|
12
|
+
} | {
|
|
13
|
+
success: false;
|
|
14
|
+
error: Error;
|
|
15
|
+
}>;
|
|
16
|
+
protected getRequestId(): string;
|
|
17
|
+
private formatRequest;
|
|
18
|
+
sendRequest<const T extends RpcMethod>(method: T, ...params: RpcRequest[T]): Promise<RpcResult<T>>;
|
|
19
|
+
methods(): RpcMethod[];
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export { Client as default };
|
package/dist/Client.d.ts
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { RpcMethod, JsonRpcRequest, RpcRequest, RpcResult } from './common.js';
|
|
2
|
+
import 'zod';
|
|
3
|
+
import './parsers.js';
|
|
4
|
+
import '@chainflip/utils/types';
|
|
5
|
+
|
|
6
|
+
declare abstract class Client {
|
|
7
|
+
protected readonly url: string;
|
|
8
|
+
constructor(url: string);
|
|
9
|
+
protected abstract send<const T extends RpcMethod>(data: JsonRpcRequest<T>): Promise<{
|
|
10
|
+
success: true;
|
|
11
|
+
result: unknown;
|
|
12
|
+
} | {
|
|
13
|
+
success: false;
|
|
14
|
+
error: Error;
|
|
15
|
+
}>;
|
|
16
|
+
protected getRequestId(): string;
|
|
17
|
+
private formatRequest;
|
|
18
|
+
sendRequest<const T extends RpcMethod>(method: T, ...params: RpcRequest[T]): Promise<RpcResult<T>>;
|
|
19
|
+
methods(): RpcMethod[];
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export { Client as default };
|
package/dist/Client.js
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { rpcResult, rpcResponse } from "./common";
|
|
2
|
+
import { assert } from "@chainflip/utils/assertion";
|
|
3
|
+
class Client {
|
|
4
|
+
constructor(url) {
|
|
5
|
+
this.url = url;
|
|
6
|
+
}
|
|
7
|
+
getRequestId() {
|
|
8
|
+
return "1";
|
|
9
|
+
}
|
|
10
|
+
formatRequest(method, params) {
|
|
11
|
+
return { jsonrpc: "2.0", id: this.getRequestId(), method, params };
|
|
12
|
+
}
|
|
13
|
+
async sendRequest(method, ...params) {
|
|
14
|
+
const response = await this.send(this.formatRequest(method, params));
|
|
15
|
+
if (!response.success)
|
|
16
|
+
throw response.error;
|
|
17
|
+
const parseResult = rpcResponse.safeParse(response.result);
|
|
18
|
+
assert(parseResult.success, "Malformed RPC response received");
|
|
19
|
+
if ("error" in parseResult.data) {
|
|
20
|
+
throw new Error(
|
|
21
|
+
`RPC error [${parseResult.data.error.code}]: ${parseResult.data.error.message}`
|
|
22
|
+
);
|
|
23
|
+
}
|
|
24
|
+
return rpcResult[method].parse(parseResult.data.result);
|
|
25
|
+
}
|
|
26
|
+
methods() {
|
|
27
|
+
return Object.keys(rpcResult).sort();
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
export {
|
|
31
|
+
Client as default
|
|
32
|
+
};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }var _Client = require('./Client'); var _Client2 = _interopRequireDefault(_Client);
|
|
2
|
+
class HttpClient extends _Client2.default {
|
|
3
|
+
async send(request) {
|
|
4
|
+
const res = await fetch(this.url, {
|
|
5
|
+
body: JSON.stringify(request),
|
|
6
|
+
method: "POST",
|
|
7
|
+
headers: {
|
|
8
|
+
"Content-Type": "application/json"
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
if (!res.ok) {
|
|
12
|
+
return { success: false, error: new Error(`HTTP error: ${res.status}`) };
|
|
13
|
+
}
|
|
14
|
+
try {
|
|
15
|
+
const result = await res.json();
|
|
16
|
+
return { success: true, result };
|
|
17
|
+
} catch (error) {
|
|
18
|
+
return { success: false, error: new Error("Invalid JSON response") };
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
exports.default = HttpClient;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import Client from './Client.cjs';
|
|
2
|
+
import { RpcMethod, JsonRpcRequest } from './common.cjs';
|
|
3
|
+
import 'zod';
|
|
4
|
+
import './parsers.cjs';
|
|
5
|
+
import '@chainflip/utils/types';
|
|
6
|
+
|
|
7
|
+
declare class HttpClient extends Client {
|
|
8
|
+
protected send<const T extends RpcMethod>(request: JsonRpcRequest<T>): Promise<{
|
|
9
|
+
success: true;
|
|
10
|
+
result: unknown;
|
|
11
|
+
} | {
|
|
12
|
+
success: false;
|
|
13
|
+
error: Error;
|
|
14
|
+
}>;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export { HttpClient as default };
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import Client from './Client.js';
|
|
2
|
+
import { RpcMethod, JsonRpcRequest } from './common.js';
|
|
3
|
+
import 'zod';
|
|
4
|
+
import './parsers.js';
|
|
5
|
+
import '@chainflip/utils/types';
|
|
6
|
+
|
|
7
|
+
declare class HttpClient extends Client {
|
|
8
|
+
protected send<const T extends RpcMethod>(request: JsonRpcRequest<T>): Promise<{
|
|
9
|
+
success: true;
|
|
10
|
+
result: unknown;
|
|
11
|
+
} | {
|
|
12
|
+
success: false;
|
|
13
|
+
error: Error;
|
|
14
|
+
}>;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export { HttpClient as default };
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import Client from "./Client";
|
|
2
|
+
class HttpClient extends Client {
|
|
3
|
+
async send(request) {
|
|
4
|
+
const res = await fetch(this.url, {
|
|
5
|
+
body: JSON.stringify(request),
|
|
6
|
+
method: "POST",
|
|
7
|
+
headers: {
|
|
8
|
+
"Content-Type": "application/json"
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
if (!res.ok) {
|
|
12
|
+
return { success: false, error: new Error(`HTTP error: ${res.status}`) };
|
|
13
|
+
}
|
|
14
|
+
try {
|
|
15
|
+
const result = await res.json();
|
|
16
|
+
return { success: true, result };
|
|
17
|
+
} catch (error) {
|
|
18
|
+
return { success: false, error: new Error("Invalid JSON response") };
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
export {
|
|
23
|
+
HttpClient as default
|
|
24
|
+
};
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }var _async = require('@chainflip/utils/async');
|
|
2
|
+
var _crypto = require('crypto');
|
|
3
|
+
var _Client = require('./Client'); var _Client2 = _interopRequireDefault(_Client);
|
|
4
|
+
var _common = require('./common');
|
|
5
|
+
const READY = "READY";
|
|
6
|
+
const DISCONNECT = "DISCONNECT";
|
|
7
|
+
class WsClient extends _Client2.default {
|
|
8
|
+
constructor(url, WebSocket = globalThis.WebSocket) {
|
|
9
|
+
super(url);WsClient.prototype.__init.call(this);WsClient.prototype.__init2.call(this);WsClient.prototype.__init3.call(this);WsClient.prototype.__init4.call(this);WsClient.prototype.__init5.call(this);;
|
|
10
|
+
this.WebSocket = WebSocket;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
__init() {this.reconnectAttempts = 0}
|
|
14
|
+
__init2() {this.emitter = new EventTarget()}
|
|
15
|
+
__init3() {this.requestMap = /* @__PURE__ */ new Map()}
|
|
16
|
+
getRequestId() {
|
|
17
|
+
return _crypto.randomUUID.call(void 0, );
|
|
18
|
+
}
|
|
19
|
+
async close() {
|
|
20
|
+
await this.handleClose();
|
|
21
|
+
}
|
|
22
|
+
async handleClose() {
|
|
23
|
+
if (!this.ws)
|
|
24
|
+
return;
|
|
25
|
+
this.ws.removeEventListener("close", this.handleDisconnect);
|
|
26
|
+
this.ws.close();
|
|
27
|
+
if (this.ws.readyState !== this.WebSocket.CLOSED) {
|
|
28
|
+
await _async.once.call(void 0, this.ws, "close");
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
async connectionReady() {
|
|
32
|
+
if (!this.ws) {
|
|
33
|
+
return this.connect();
|
|
34
|
+
}
|
|
35
|
+
if (this.ws.readyState !== this.WebSocket.OPEN) {
|
|
36
|
+
await _async.once.call(void 0, this.emitter, READY, { timeout: 3e4 });
|
|
37
|
+
}
|
|
38
|
+
return this.ws;
|
|
39
|
+
}
|
|
40
|
+
__init4() {this.handleDisconnect = async () => {
|
|
41
|
+
this.emitter.dispatchEvent(new Event(DISCONNECT));
|
|
42
|
+
this.requestMap.forEach((request) => {
|
|
43
|
+
request.reject(new Error("disconnected"));
|
|
44
|
+
});
|
|
45
|
+
this.requestMap.clear();
|
|
46
|
+
const backoff = 250 * 2 ** this.reconnectAttempts;
|
|
47
|
+
await _async.sleep.call(void 0, backoff);
|
|
48
|
+
await this.connect().catch(() => {
|
|
49
|
+
this.reconnectAttempts = Math.min(this.reconnectAttempts + 1, 6);
|
|
50
|
+
});
|
|
51
|
+
}}
|
|
52
|
+
__init5() {this.handleMessage = (data) => {
|
|
53
|
+
const parsedData = JSON.parse(data.data);
|
|
54
|
+
const response = _common.rpcResponse.safeParse(parsedData);
|
|
55
|
+
if (!response.success)
|
|
56
|
+
return;
|
|
57
|
+
const { id } = response.data;
|
|
58
|
+
_optionalChain([this, 'access', _6 => _6.requestMap, 'access', _7 => _7.get, 'call', _8 => _8(id), 'optionalAccess', _9 => _9.resolve, 'call', _10 => _10(response.data)]);
|
|
59
|
+
}}
|
|
60
|
+
async connect() {
|
|
61
|
+
const socket = new this.WebSocket(this.url);
|
|
62
|
+
this.ws = socket;
|
|
63
|
+
this.ws.addEventListener("message", this.handleMessage);
|
|
64
|
+
this.ws.addEventListener("close", this.handleDisconnect, { once: true });
|
|
65
|
+
await _async.once.call(void 0, this.ws, "open", { timeout: 3e4 });
|
|
66
|
+
this.ws.addEventListener("error", () => {
|
|
67
|
+
socket.close();
|
|
68
|
+
});
|
|
69
|
+
this.emitter.dispatchEvent(new Event(READY));
|
|
70
|
+
this.reconnectAttempts = 0;
|
|
71
|
+
return socket;
|
|
72
|
+
}
|
|
73
|
+
async send(data) {
|
|
74
|
+
let requestId = data.id;
|
|
75
|
+
for (let i = 0; i < 5; i += 1) {
|
|
76
|
+
let socket;
|
|
77
|
+
try {
|
|
78
|
+
socket = await this.connectionReady();
|
|
79
|
+
} catch (err) {
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
socket.send(JSON.stringify({ ...data, id: requestId }));
|
|
83
|
+
const request = _async.deferredPromise.call(void 0, );
|
|
84
|
+
this.requestMap.set(requestId, request);
|
|
85
|
+
const controller = new AbortController();
|
|
86
|
+
const result = await Promise.race([
|
|
87
|
+
_async.sleep.call(void 0, 3e4, { signal: controller.signal }).then(
|
|
88
|
+
() => ({ success: false, retry: false, error: new Error("timeout") })
|
|
89
|
+
),
|
|
90
|
+
request.promise.then(
|
|
91
|
+
(result2) => ({ success: true, result: result2 }),
|
|
92
|
+
(error) => ({ success: false, error, retry: true })
|
|
93
|
+
)
|
|
94
|
+
]).finally(() => {
|
|
95
|
+
this.requestMap.delete(requestId);
|
|
96
|
+
controller.abort();
|
|
97
|
+
});
|
|
98
|
+
if (result.success || !result.retry)
|
|
99
|
+
return result;
|
|
100
|
+
requestId = this.getRequestId();
|
|
101
|
+
}
|
|
102
|
+
return { success: false, error: new Error("max retries exceeded") };
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
exports.default = WsClient;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import Client from './Client.cjs';
|
|
2
|
+
import { RpcMethod, JsonRpcRequest } from './common.cjs';
|
|
3
|
+
import 'zod';
|
|
4
|
+
import './parsers.cjs';
|
|
5
|
+
import '@chainflip/utils/types';
|
|
6
|
+
|
|
7
|
+
declare class WsClient extends Client {
|
|
8
|
+
private readonly WebSocket;
|
|
9
|
+
private ws?;
|
|
10
|
+
private reconnectAttempts;
|
|
11
|
+
private emitter;
|
|
12
|
+
private requestMap;
|
|
13
|
+
constructor(url: string, WebSocket?: typeof globalThis.WebSocket);
|
|
14
|
+
protected getRequestId(): `${string}-${string}-${string}-${string}-${string}`;
|
|
15
|
+
close(): Promise<void>;
|
|
16
|
+
private handleClose;
|
|
17
|
+
private connectionReady;
|
|
18
|
+
private handleDisconnect;
|
|
19
|
+
private handleMessage;
|
|
20
|
+
private connect;
|
|
21
|
+
protected send<const T extends RpcMethod>(data: JsonRpcRequest<T>): Promise<{
|
|
22
|
+
success: true;
|
|
23
|
+
result: unknown;
|
|
24
|
+
} | {
|
|
25
|
+
success: false;
|
|
26
|
+
error: Error;
|
|
27
|
+
}>;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export { WsClient as default };
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import Client from './Client.js';
|
|
2
|
+
import { RpcMethod, JsonRpcRequest } from './common.js';
|
|
3
|
+
import 'zod';
|
|
4
|
+
import './parsers.js';
|
|
5
|
+
import '@chainflip/utils/types';
|
|
6
|
+
|
|
7
|
+
declare class WsClient extends Client {
|
|
8
|
+
private readonly WebSocket;
|
|
9
|
+
private ws?;
|
|
10
|
+
private reconnectAttempts;
|
|
11
|
+
private emitter;
|
|
12
|
+
private requestMap;
|
|
13
|
+
constructor(url: string, WebSocket?: typeof globalThis.WebSocket);
|
|
14
|
+
protected getRequestId(): `${string}-${string}-${string}-${string}-${string}`;
|
|
15
|
+
close(): Promise<void>;
|
|
16
|
+
private handleClose;
|
|
17
|
+
private connectionReady;
|
|
18
|
+
private handleDisconnect;
|
|
19
|
+
private handleMessage;
|
|
20
|
+
private connect;
|
|
21
|
+
protected send<const T extends RpcMethod>(data: JsonRpcRequest<T>): Promise<{
|
|
22
|
+
success: true;
|
|
23
|
+
result: unknown;
|
|
24
|
+
} | {
|
|
25
|
+
success: false;
|
|
26
|
+
error: Error;
|
|
27
|
+
}>;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export { WsClient as default };
|
package/dist/WsClient.js
ADDED
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { deferredPromise, once, sleep } from "@chainflip/utils/async";
|
|
2
|
+
import { randomUUID } from "crypto";
|
|
3
|
+
import Client from "./Client";
|
|
4
|
+
import { rpcResponse } from "./common";
|
|
5
|
+
const READY = "READY";
|
|
6
|
+
const DISCONNECT = "DISCONNECT";
|
|
7
|
+
class WsClient extends Client {
|
|
8
|
+
constructor(url, WebSocket = globalThis.WebSocket) {
|
|
9
|
+
super(url);
|
|
10
|
+
this.WebSocket = WebSocket;
|
|
11
|
+
}
|
|
12
|
+
ws;
|
|
13
|
+
reconnectAttempts = 0;
|
|
14
|
+
emitter = new EventTarget();
|
|
15
|
+
requestMap = /* @__PURE__ */ new Map();
|
|
16
|
+
getRequestId() {
|
|
17
|
+
return randomUUID();
|
|
18
|
+
}
|
|
19
|
+
async close() {
|
|
20
|
+
await this.handleClose();
|
|
21
|
+
}
|
|
22
|
+
async handleClose() {
|
|
23
|
+
if (!this.ws)
|
|
24
|
+
return;
|
|
25
|
+
this.ws.removeEventListener("close", this.handleDisconnect);
|
|
26
|
+
this.ws.close();
|
|
27
|
+
if (this.ws.readyState !== this.WebSocket.CLOSED) {
|
|
28
|
+
await once(this.ws, "close");
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
async connectionReady() {
|
|
32
|
+
if (!this.ws) {
|
|
33
|
+
return this.connect();
|
|
34
|
+
}
|
|
35
|
+
if (this.ws.readyState !== this.WebSocket.OPEN) {
|
|
36
|
+
await once(this.emitter, READY, { timeout: 3e4 });
|
|
37
|
+
}
|
|
38
|
+
return this.ws;
|
|
39
|
+
}
|
|
40
|
+
handleDisconnect = async () => {
|
|
41
|
+
this.emitter.dispatchEvent(new Event(DISCONNECT));
|
|
42
|
+
this.requestMap.forEach((request) => {
|
|
43
|
+
request.reject(new Error("disconnected"));
|
|
44
|
+
});
|
|
45
|
+
this.requestMap.clear();
|
|
46
|
+
const backoff = 250 * 2 ** this.reconnectAttempts;
|
|
47
|
+
await sleep(backoff);
|
|
48
|
+
await this.connect().catch(() => {
|
|
49
|
+
this.reconnectAttempts = Math.min(this.reconnectAttempts + 1, 6);
|
|
50
|
+
});
|
|
51
|
+
};
|
|
52
|
+
handleMessage = (data) => {
|
|
53
|
+
const parsedData = JSON.parse(data.data);
|
|
54
|
+
const response = rpcResponse.safeParse(parsedData);
|
|
55
|
+
if (!response.success)
|
|
56
|
+
return;
|
|
57
|
+
const { id } = response.data;
|
|
58
|
+
this.requestMap.get(id)?.resolve(response.data);
|
|
59
|
+
};
|
|
60
|
+
async connect() {
|
|
61
|
+
const socket = new this.WebSocket(this.url);
|
|
62
|
+
this.ws = socket;
|
|
63
|
+
this.ws.addEventListener("message", this.handleMessage);
|
|
64
|
+
this.ws.addEventListener("close", this.handleDisconnect, { once: true });
|
|
65
|
+
await once(this.ws, "open", { timeout: 3e4 });
|
|
66
|
+
this.ws.addEventListener("error", () => {
|
|
67
|
+
socket.close();
|
|
68
|
+
});
|
|
69
|
+
this.emitter.dispatchEvent(new Event(READY));
|
|
70
|
+
this.reconnectAttempts = 0;
|
|
71
|
+
return socket;
|
|
72
|
+
}
|
|
73
|
+
async send(data) {
|
|
74
|
+
let requestId = data.id;
|
|
75
|
+
for (let i = 0; i < 5; i += 1) {
|
|
76
|
+
let socket;
|
|
77
|
+
try {
|
|
78
|
+
socket = await this.connectionReady();
|
|
79
|
+
} catch (err) {
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
socket.send(JSON.stringify({ ...data, id: requestId }));
|
|
83
|
+
const request = deferredPromise();
|
|
84
|
+
this.requestMap.set(requestId, request);
|
|
85
|
+
const controller = new AbortController();
|
|
86
|
+
const result = await Promise.race([
|
|
87
|
+
sleep(3e4, { signal: controller.signal }).then(
|
|
88
|
+
() => ({ success: false, retry: false, error: new Error("timeout") })
|
|
89
|
+
),
|
|
90
|
+
request.promise.then(
|
|
91
|
+
(result2) => ({ success: true, result: result2 }),
|
|
92
|
+
(error) => ({ success: false, error, retry: true })
|
|
93
|
+
)
|
|
94
|
+
]).finally(() => {
|
|
95
|
+
this.requestMap.delete(requestId);
|
|
96
|
+
controller.abort();
|
|
97
|
+
});
|
|
98
|
+
if (result.success || !result.retry)
|
|
99
|
+
return result;
|
|
100
|
+
requestId = this.getRequestId();
|
|
101
|
+
}
|
|
102
|
+
return { success: false, error: new Error("max retries exceeded") };
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
export {
|
|
106
|
+
WsClient as default
|
|
107
|
+
};
|
package/dist/common.cjs
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
var _parsers = require('./parsers');
|
|
15
|
+
const rpcResult = {
|
|
16
|
+
broker_requestSwapDepositAddress: _parsers.brokerRequestSwapDepositAddress,
|
|
17
|
+
cf_boost_pools_depth: _parsers.cfBoostPoolsDepth,
|
|
18
|
+
cf_environment: _parsers.cfEnvironment,
|
|
19
|
+
cf_funding_environment: _parsers.cfFundingEnvironment,
|
|
20
|
+
cf_ingress_egress_environment: _parsers.cfIngressEgressEnvironment,
|
|
21
|
+
cf_supported_assets: _parsers.cfSupportedAsssets,
|
|
22
|
+
cf_swap_rate: _parsers.cfSwapRate,
|
|
23
|
+
cf_swap_rate_v2: _parsers.cfSwapRateV2,
|
|
24
|
+
cf_swapping_environment: _parsers.cfSwappingEnvironment,
|
|
25
|
+
chain_getBlockHash: _parsers.chainGetBlockHash,
|
|
26
|
+
state_getMetadata: _parsers.stateGetMetadata,
|
|
27
|
+
state_getRuntimeVersion: _parsers.stateGetRuntimeVersion
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
exports.rpcResponse = _parsers.rpcResponse; exports.rpcResult = rpcResult;
|