@chainflip/rpc 1.6.8 → 1.6.9
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 +19 -7
- package/dist/Client.d.cts +18 -10
- package/dist/Client.d.ts +18 -10
- package/dist/Client.mjs +19 -7
- package/dist/HttpClient.cjs +58 -7
- package/dist/HttpClient.d.cts +8 -9
- package/dist/HttpClient.d.ts +8 -9
- package/dist/HttpClient.mjs +55 -4
- package/dist/WsClient.cjs +39 -32
- package/dist/WsClient.d.cts +2 -9
- package/dist/WsClient.d.ts +2 -9
- package/dist/WsClient.mjs +39 -32
- package/dist/common.d.cts +4 -4
- package/dist/common.d.ts +4 -4
- package/dist/parsers.d.cts +4 -4
- package/dist/parsers.d.ts +4 -4
- package/package.json +2 -2
package/dist/Client.cjs
CHANGED
|
@@ -1,28 +1,40 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true});// src/Client.ts
|
|
2
|
+
var _crypto = require('crypto');
|
|
2
3
|
var _commoncjs = require('./common.cjs');
|
|
3
|
-
var _assertion = require('@chainflip/utils/assertion');
|
|
4
4
|
var Client = class {
|
|
5
5
|
constructor(url) {
|
|
6
6
|
this.url = url;
|
|
7
7
|
}
|
|
8
8
|
getRequestId() {
|
|
9
|
-
return
|
|
9
|
+
return _crypto.randomUUID.call(void 0, );
|
|
10
10
|
}
|
|
11
11
|
formatRequest(method, params) {
|
|
12
12
|
return { jsonrpc: "2.0", id: this.getRequestId(), method, params };
|
|
13
13
|
}
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
if (!response.success)
|
|
14
|
+
parseSingleResponse(response) {
|
|
15
|
+
if (!response.success) {
|
|
17
16
|
throw response.error;
|
|
17
|
+
}
|
|
18
18
|
const parseResult = _commoncjs.rpcResponse.safeParse(response.result);
|
|
19
|
-
|
|
19
|
+
if (!parseResult.success) {
|
|
20
|
+
throw new Error("Malformed RPC response received");
|
|
21
|
+
}
|
|
20
22
|
if ("error" in parseResult.data) {
|
|
21
23
|
throw new Error(
|
|
22
24
|
`RPC error [${parseResult.data.error.code}]: ${parseResult.data.error.message}`
|
|
23
25
|
);
|
|
24
26
|
}
|
|
25
|
-
|
|
27
|
+
if (parseResult.data.result) {
|
|
28
|
+
return parseResult.data;
|
|
29
|
+
}
|
|
30
|
+
throw new Error("Malformed RPC response received");
|
|
31
|
+
}
|
|
32
|
+
async sendRequest(method, ...params) {
|
|
33
|
+
const [response] = await this.send([this.formatRequest(method, params)]);
|
|
34
|
+
if (!response.success)
|
|
35
|
+
throw response.error;
|
|
36
|
+
const parseResult = this.parseSingleResponse(response);
|
|
37
|
+
return _commoncjs.rpcResult[method].parse(parseResult.result);
|
|
26
38
|
}
|
|
27
39
|
methods() {
|
|
28
40
|
return Object.keys(_commoncjs.rpcResult).sort();
|
package/dist/Client.d.cts
CHANGED
|
@@ -3,20 +3,28 @@ import '@chainflip/utils/types';
|
|
|
3
3
|
import 'zod';
|
|
4
4
|
import './parsers.cjs';
|
|
5
5
|
|
|
6
|
+
type Response = {
|
|
7
|
+
success: true;
|
|
8
|
+
id: string;
|
|
9
|
+
result: unknown;
|
|
10
|
+
} | {
|
|
11
|
+
success: false;
|
|
12
|
+
id: string;
|
|
13
|
+
error: Error;
|
|
14
|
+
};
|
|
6
15
|
declare abstract class Client {
|
|
7
16
|
protected readonly url: string;
|
|
8
17
|
constructor(url: string);
|
|
9
|
-
protected abstract send<const T extends RpcMethod>(data: JsonRpcRequest<T>): Promise<
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
private formatRequest;
|
|
18
|
+
protected abstract send<const T extends RpcMethod>(data: JsonRpcRequest<T>[]): Promise<Response[]>;
|
|
19
|
+
protected getRequestId(): `${string}-${string}-${string}-${string}-${string}`;
|
|
20
|
+
protected formatRequest<T extends RpcMethod>(method: T, params: RpcRequest[T]): JsonRpcRequest<T>;
|
|
21
|
+
protected parseSingleResponse(response: Response): {
|
|
22
|
+
id: string | number;
|
|
23
|
+
jsonrpc: "2.0";
|
|
24
|
+
result?: any;
|
|
25
|
+
};
|
|
18
26
|
sendRequest<const T extends RpcMethod>(method: T, ...params: RpcRequest[T]): Promise<RpcResult<T>>;
|
|
19
27
|
methods(): RpcMethod[];
|
|
20
28
|
}
|
|
21
29
|
|
|
22
|
-
export { Client as default };
|
|
30
|
+
export { type Response, Client as default };
|
package/dist/Client.d.ts
CHANGED
|
@@ -3,20 +3,28 @@ import '@chainflip/utils/types';
|
|
|
3
3
|
import 'zod';
|
|
4
4
|
import './parsers.js';
|
|
5
5
|
|
|
6
|
+
type Response = {
|
|
7
|
+
success: true;
|
|
8
|
+
id: string;
|
|
9
|
+
result: unknown;
|
|
10
|
+
} | {
|
|
11
|
+
success: false;
|
|
12
|
+
id: string;
|
|
13
|
+
error: Error;
|
|
14
|
+
};
|
|
6
15
|
declare abstract class Client {
|
|
7
16
|
protected readonly url: string;
|
|
8
17
|
constructor(url: string);
|
|
9
|
-
protected abstract send<const T extends RpcMethod>(data: JsonRpcRequest<T>): Promise<
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
private formatRequest;
|
|
18
|
+
protected abstract send<const T extends RpcMethod>(data: JsonRpcRequest<T>[]): Promise<Response[]>;
|
|
19
|
+
protected getRequestId(): `${string}-${string}-${string}-${string}-${string}`;
|
|
20
|
+
protected formatRequest<T extends RpcMethod>(method: T, params: RpcRequest[T]): JsonRpcRequest<T>;
|
|
21
|
+
protected parseSingleResponse(response: Response): {
|
|
22
|
+
id: string | number;
|
|
23
|
+
jsonrpc: "2.0";
|
|
24
|
+
result?: any;
|
|
25
|
+
};
|
|
18
26
|
sendRequest<const T extends RpcMethod>(method: T, ...params: RpcRequest[T]): Promise<RpcResult<T>>;
|
|
19
27
|
methods(): RpcMethod[];
|
|
20
28
|
}
|
|
21
29
|
|
|
22
|
-
export { Client as default };
|
|
30
|
+
export { type Response, Client as default };
|
package/dist/Client.mjs
CHANGED
|
@@ -1,28 +1,40 @@
|
|
|
1
1
|
// src/Client.ts
|
|
2
|
+
import { randomUUID } from "crypto";
|
|
2
3
|
import { rpcResult, rpcResponse } from "./common.mjs";
|
|
3
|
-
import { assert } from "@chainflip/utils/assertion";
|
|
4
4
|
var Client = class {
|
|
5
5
|
constructor(url) {
|
|
6
6
|
this.url = url;
|
|
7
7
|
}
|
|
8
8
|
getRequestId() {
|
|
9
|
-
return
|
|
9
|
+
return randomUUID();
|
|
10
10
|
}
|
|
11
11
|
formatRequest(method, params) {
|
|
12
12
|
return { jsonrpc: "2.0", id: this.getRequestId(), method, params };
|
|
13
13
|
}
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
if (!response.success)
|
|
14
|
+
parseSingleResponse(response) {
|
|
15
|
+
if (!response.success) {
|
|
17
16
|
throw response.error;
|
|
17
|
+
}
|
|
18
18
|
const parseResult = rpcResponse.safeParse(response.result);
|
|
19
|
-
|
|
19
|
+
if (!parseResult.success) {
|
|
20
|
+
throw new Error("Malformed RPC response received");
|
|
21
|
+
}
|
|
20
22
|
if ("error" in parseResult.data) {
|
|
21
23
|
throw new Error(
|
|
22
24
|
`RPC error [${parseResult.data.error.code}]: ${parseResult.data.error.message}`
|
|
23
25
|
);
|
|
24
26
|
}
|
|
25
|
-
|
|
27
|
+
if (parseResult.data.result) {
|
|
28
|
+
return parseResult.data;
|
|
29
|
+
}
|
|
30
|
+
throw new Error("Malformed RPC response received");
|
|
31
|
+
}
|
|
32
|
+
async sendRequest(method, ...params) {
|
|
33
|
+
const [response] = await this.send([this.formatRequest(method, params)]);
|
|
34
|
+
if (!response.success)
|
|
35
|
+
throw response.error;
|
|
36
|
+
const parseResult = this.parseSingleResponse(response);
|
|
37
|
+
return rpcResult[method].parse(parseResult.result);
|
|
26
38
|
}
|
|
27
39
|
methods() {
|
|
28
40
|
return Object.keys(rpcResult).sort();
|
package/dist/HttpClient.cjs
CHANGED
|
@@ -1,6 +1,13 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var _class;// src/HttpClient.ts
|
|
2
|
+
var _async = require('@chainflip/utils/async');
|
|
2
3
|
var _Clientcjs = require('./Client.cjs'); var _Clientcjs2 = _interopRequireDefault(_Clientcjs);
|
|
3
|
-
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
var _commoncjs = require('./common.cjs');
|
|
7
|
+
var HttpClient = (_class = class extends _Clientcjs2.default {constructor(...args) { super(...args); _class.prototype.__init.call(this);_class.prototype.__init2.call(this);_class.prototype.__init3.call(this); }
|
|
8
|
+
__init() {this.timer = null}
|
|
9
|
+
__init2() {this.batchDuration = 100}
|
|
10
|
+
__init3() {this.requestMap = /* @__PURE__ */ new Map()}
|
|
4
11
|
async send(request) {
|
|
5
12
|
const res = await fetch(this.url, {
|
|
6
13
|
body: JSON.stringify(request),
|
|
@@ -10,16 +17,60 @@ var HttpClient = class extends _Clientcjs2.default {
|
|
|
10
17
|
}
|
|
11
18
|
});
|
|
12
19
|
if (!res.ok) {
|
|
13
|
-
return
|
|
20
|
+
return request.map((r) => ({
|
|
21
|
+
id: r.id,
|
|
22
|
+
success: false,
|
|
23
|
+
error: new Error(`HTTP error: ${res.status}`)
|
|
24
|
+
}));
|
|
14
25
|
}
|
|
15
26
|
try {
|
|
16
|
-
const
|
|
17
|
-
return { success: true, result };
|
|
27
|
+
const jsonRpcResponse = await res.json();
|
|
28
|
+
return jsonRpcResponse.map((r) => ({ id: r.id, success: true, result: r }));
|
|
18
29
|
} catch (cause) {
|
|
19
|
-
return
|
|
30
|
+
return request.map((r) => ({
|
|
31
|
+
id: r.id,
|
|
32
|
+
success: false,
|
|
33
|
+
error: new Error("Invalid JSON response", { cause })
|
|
34
|
+
}));
|
|
20
35
|
}
|
|
21
36
|
}
|
|
22
|
-
|
|
37
|
+
sendRequest(method, ...params) {
|
|
38
|
+
const deferred = _async.deferredPromise.call(void 0, );
|
|
39
|
+
const body = this.formatRequest(method, params);
|
|
40
|
+
this.requestMap.set(body.id, { deferred, body, method });
|
|
41
|
+
if (this.timer)
|
|
42
|
+
clearTimeout(this.timer);
|
|
43
|
+
this.timer = setTimeout(() => this.sendBatch(), this.batchDuration);
|
|
44
|
+
return deferred.promise;
|
|
45
|
+
}
|
|
46
|
+
async sendBatch() {
|
|
47
|
+
const clonedMap = new Map(this.requestMap);
|
|
48
|
+
this.requestMap.clear();
|
|
49
|
+
const requests = [...clonedMap.values()].map((item) => item.body);
|
|
50
|
+
const responses = await this.send(requests);
|
|
51
|
+
for (const response of responses) {
|
|
52
|
+
const clonedItem = clonedMap.get(response.id);
|
|
53
|
+
if (!clonedItem) {
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
if (!response.success) {
|
|
57
|
+
clonedItem.deferred.reject(response.error);
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
try {
|
|
61
|
+
const parseResult = this.parseSingleResponse(response);
|
|
62
|
+
clonedItem.deferred.resolve(_commoncjs.rpcResult[clonedItem.method].parse(parseResult.result));
|
|
63
|
+
} catch (e) {
|
|
64
|
+
clonedItem.deferred.reject(e);
|
|
65
|
+
} finally {
|
|
66
|
+
clonedMap.delete(response.id);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
clonedMap.forEach((item) => {
|
|
70
|
+
item.deferred.reject(new Error("Could not find the result for the request"));
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
}, _class);
|
|
23
74
|
|
|
24
75
|
|
|
25
76
|
exports.default = HttpClient;
|
package/dist/HttpClient.d.cts
CHANGED
|
@@ -1,17 +1,16 @@
|
|
|
1
|
-
import Client from './Client.cjs';
|
|
2
|
-
import { RpcMethod, JsonRpcRequest } from './common.cjs';
|
|
1
|
+
import Client, { Response } from './Client.cjs';
|
|
2
|
+
import { RpcMethod, JsonRpcRequest, RpcRequest, RpcResult } from './common.cjs';
|
|
3
3
|
import '@chainflip/utils/types';
|
|
4
4
|
import 'zod';
|
|
5
5
|
import './parsers.cjs';
|
|
6
6
|
|
|
7
7
|
declare class HttpClient extends Client {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
}>;
|
|
8
|
+
private timer;
|
|
9
|
+
private batchDuration;
|
|
10
|
+
private requestMap;
|
|
11
|
+
protected send<const T extends RpcMethod>(request: JsonRpcRequest<T>[]): Promise<Response[]>;
|
|
12
|
+
sendRequest<const T extends RpcMethod>(method: T, ...params: RpcRequest[T]): Promise<RpcResult<T>>;
|
|
13
|
+
private sendBatch;
|
|
15
14
|
}
|
|
16
15
|
|
|
17
16
|
export { HttpClient as default };
|
package/dist/HttpClient.d.ts
CHANGED
|
@@ -1,17 +1,16 @@
|
|
|
1
|
-
import Client from './Client.js';
|
|
2
|
-
import { RpcMethod, JsonRpcRequest } from './common.js';
|
|
1
|
+
import Client, { Response } from './Client.js';
|
|
2
|
+
import { RpcMethod, JsonRpcRequest, RpcRequest, RpcResult } from './common.js';
|
|
3
3
|
import '@chainflip/utils/types';
|
|
4
4
|
import 'zod';
|
|
5
5
|
import './parsers.js';
|
|
6
6
|
|
|
7
7
|
declare class HttpClient extends Client {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
}>;
|
|
8
|
+
private timer;
|
|
9
|
+
private batchDuration;
|
|
10
|
+
private requestMap;
|
|
11
|
+
protected send<const T extends RpcMethod>(request: JsonRpcRequest<T>[]): Promise<Response[]>;
|
|
12
|
+
sendRequest<const T extends RpcMethod>(method: T, ...params: RpcRequest[T]): Promise<RpcResult<T>>;
|
|
13
|
+
private sendBatch;
|
|
15
14
|
}
|
|
16
15
|
|
|
17
16
|
export { HttpClient as default };
|
package/dist/HttpClient.mjs
CHANGED
|
@@ -1,6 +1,13 @@
|
|
|
1
1
|
// src/HttpClient.ts
|
|
2
|
+
import { deferredPromise } from "@chainflip/utils/async";
|
|
2
3
|
import Client from "./Client.mjs";
|
|
4
|
+
import {
|
|
5
|
+
rpcResult
|
|
6
|
+
} from "./common.mjs";
|
|
3
7
|
var HttpClient = class extends Client {
|
|
8
|
+
timer = null;
|
|
9
|
+
batchDuration = 100;
|
|
10
|
+
requestMap = /* @__PURE__ */ new Map();
|
|
4
11
|
async send(request) {
|
|
5
12
|
const res = await fetch(this.url, {
|
|
6
13
|
body: JSON.stringify(request),
|
|
@@ -10,15 +17,59 @@ var HttpClient = class extends Client {
|
|
|
10
17
|
}
|
|
11
18
|
});
|
|
12
19
|
if (!res.ok) {
|
|
13
|
-
return
|
|
20
|
+
return request.map((r) => ({
|
|
21
|
+
id: r.id,
|
|
22
|
+
success: false,
|
|
23
|
+
error: new Error(`HTTP error: ${res.status}`)
|
|
24
|
+
}));
|
|
14
25
|
}
|
|
15
26
|
try {
|
|
16
|
-
const
|
|
17
|
-
return { success: true, result };
|
|
27
|
+
const jsonRpcResponse = await res.json();
|
|
28
|
+
return jsonRpcResponse.map((r) => ({ id: r.id, success: true, result: r }));
|
|
18
29
|
} catch (cause) {
|
|
19
|
-
return
|
|
30
|
+
return request.map((r) => ({
|
|
31
|
+
id: r.id,
|
|
32
|
+
success: false,
|
|
33
|
+
error: new Error("Invalid JSON response", { cause })
|
|
34
|
+
}));
|
|
20
35
|
}
|
|
21
36
|
}
|
|
37
|
+
sendRequest(method, ...params) {
|
|
38
|
+
const deferred = deferredPromise();
|
|
39
|
+
const body = this.formatRequest(method, params);
|
|
40
|
+
this.requestMap.set(body.id, { deferred, body, method });
|
|
41
|
+
if (this.timer)
|
|
42
|
+
clearTimeout(this.timer);
|
|
43
|
+
this.timer = setTimeout(() => this.sendBatch(), this.batchDuration);
|
|
44
|
+
return deferred.promise;
|
|
45
|
+
}
|
|
46
|
+
async sendBatch() {
|
|
47
|
+
const clonedMap = new Map(this.requestMap);
|
|
48
|
+
this.requestMap.clear();
|
|
49
|
+
const requests = [...clonedMap.values()].map((item) => item.body);
|
|
50
|
+
const responses = await this.send(requests);
|
|
51
|
+
for (const response of responses) {
|
|
52
|
+
const clonedItem = clonedMap.get(response.id);
|
|
53
|
+
if (!clonedItem) {
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
if (!response.success) {
|
|
57
|
+
clonedItem.deferred.reject(response.error);
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
try {
|
|
61
|
+
const parseResult = this.parseSingleResponse(response);
|
|
62
|
+
clonedItem.deferred.resolve(rpcResult[clonedItem.method].parse(parseResult.result));
|
|
63
|
+
} catch (e) {
|
|
64
|
+
clonedItem.deferred.reject(e);
|
|
65
|
+
} finally {
|
|
66
|
+
clonedMap.delete(response.id);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
clonedMap.forEach((item) => {
|
|
70
|
+
item.deferred.reject(new Error("Could not find the result for the request"));
|
|
71
|
+
});
|
|
72
|
+
}
|
|
22
73
|
};
|
|
23
74
|
export {
|
|
24
75
|
HttpClient as default
|
package/dist/WsClient.cjs
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
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 _class;// src/WsClient.ts
|
|
2
2
|
var _async = require('@chainflip/utils/async');
|
|
3
|
-
var _crypto = require('crypto');
|
|
4
3
|
var _Clientcjs = require('./Client.cjs'); var _Clientcjs2 = _interopRequireDefault(_Clientcjs);
|
|
5
4
|
var _commoncjs = require('./common.cjs');
|
|
6
5
|
var READY = "READY";
|
|
@@ -14,9 +13,6 @@ var WsClient = (_class = class extends _Clientcjs2.default {
|
|
|
14
13
|
__init() {this.reconnectAttempts = 0}
|
|
15
14
|
__init2() {this.emitter = new EventTarget()}
|
|
16
15
|
__init3() {this.requestMap = /* @__PURE__ */ new Map()}
|
|
17
|
-
getRequestId() {
|
|
18
|
-
return _crypto.randomUUID.call(void 0, );
|
|
19
|
-
}
|
|
20
16
|
async close() {
|
|
21
17
|
await this.handleClose();
|
|
22
18
|
}
|
|
@@ -71,36 +67,47 @@ var WsClient = (_class = class extends _Clientcjs2.default {
|
|
|
71
67
|
this.reconnectAttempts = 0;
|
|
72
68
|
return socket;
|
|
73
69
|
}
|
|
74
|
-
async send(
|
|
75
|
-
|
|
76
|
-
for (
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
socket
|
|
80
|
-
|
|
81
|
-
|
|
70
|
+
async send(requests) {
|
|
71
|
+
const responses = [];
|
|
72
|
+
for (const data of requests) {
|
|
73
|
+
const MAX_RETRIES = 5;
|
|
74
|
+
for (let i = 0; i < MAX_RETRIES; i += 1) {
|
|
75
|
+
let socket;
|
|
76
|
+
try {
|
|
77
|
+
socket = await this.connectionReady();
|
|
78
|
+
} catch (e) {
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
socket.send(JSON.stringify(data));
|
|
82
|
+
const request = _async.deferredPromise.call(void 0, );
|
|
83
|
+
this.requestMap.set(data.id, request);
|
|
84
|
+
const controller = new AbortController();
|
|
85
|
+
const result = await Promise.race([
|
|
86
|
+
_async.sleep.call(void 0, 3e4, { signal: controller.signal }).then(
|
|
87
|
+
() => ({ success: false, retry: false, error: new Error("timeout") })
|
|
88
|
+
),
|
|
89
|
+
request.promise.then(
|
|
90
|
+
(result2) => ({ success: true, result: result2 }),
|
|
91
|
+
(error) => ({ success: false, error, retry: true })
|
|
92
|
+
)
|
|
93
|
+
]).finally(() => {
|
|
94
|
+
this.requestMap.delete(data.id);
|
|
95
|
+
controller.abort();
|
|
96
|
+
});
|
|
97
|
+
if (result.success || !result.retry) {
|
|
98
|
+
responses.push({ ...result, id: data.id });
|
|
99
|
+
break;
|
|
100
|
+
}
|
|
101
|
+
if (i === MAX_RETRIES - 1) {
|
|
102
|
+
responses.push({
|
|
103
|
+
success: false,
|
|
104
|
+
error: new Error("max retries exceeded"),
|
|
105
|
+
id: data.id
|
|
106
|
+
});
|
|
107
|
+
}
|
|
82
108
|
}
|
|
83
|
-
socket.send(JSON.stringify({ ...data, id: requestId }));
|
|
84
|
-
const request = _async.deferredPromise.call(void 0, );
|
|
85
|
-
this.requestMap.set(requestId, request);
|
|
86
|
-
const controller = new AbortController();
|
|
87
|
-
const result = await Promise.race([
|
|
88
|
-
_async.sleep.call(void 0, 3e4, { signal: controller.signal }).then(
|
|
89
|
-
() => ({ success: false, retry: false, error: new Error("timeout") })
|
|
90
|
-
),
|
|
91
|
-
request.promise.then(
|
|
92
|
-
(result2) => ({ success: true, result: result2 }),
|
|
93
|
-
(error) => ({ success: false, error, retry: true })
|
|
94
|
-
)
|
|
95
|
-
]).finally(() => {
|
|
96
|
-
this.requestMap.delete(requestId);
|
|
97
|
-
controller.abort();
|
|
98
|
-
});
|
|
99
|
-
if (result.success || !result.retry)
|
|
100
|
-
return result;
|
|
101
|
-
requestId = this.getRequestId();
|
|
102
109
|
}
|
|
103
|
-
return
|
|
110
|
+
return responses;
|
|
104
111
|
}
|
|
105
112
|
}, _class);
|
|
106
113
|
|
package/dist/WsClient.d.cts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import Client from './Client.cjs';
|
|
1
|
+
import Client, { Response } from './Client.cjs';
|
|
2
2
|
import { RpcMethod, JsonRpcRequest } from './common.cjs';
|
|
3
3
|
import '@chainflip/utils/types';
|
|
4
4
|
import 'zod';
|
|
@@ -11,20 +11,13 @@ declare class WsClient extends Client {
|
|
|
11
11
|
private emitter;
|
|
12
12
|
private requestMap;
|
|
13
13
|
constructor(url: string, WebSocket?: typeof globalThis.WebSocket);
|
|
14
|
-
protected getRequestId(): `${string}-${string}-${string}-${string}-${string}`;
|
|
15
14
|
close(): Promise<void>;
|
|
16
15
|
private handleClose;
|
|
17
16
|
private connectionReady;
|
|
18
17
|
private handleDisconnect;
|
|
19
18
|
private handleMessage;
|
|
20
19
|
private connect;
|
|
21
|
-
protected send<const T extends RpcMethod>(
|
|
22
|
-
success: true;
|
|
23
|
-
result: unknown;
|
|
24
|
-
} | {
|
|
25
|
-
success: false;
|
|
26
|
-
error: Error;
|
|
27
|
-
}>;
|
|
20
|
+
protected send<const T extends RpcMethod>(requests: JsonRpcRequest<T>[]): Promise<Response[]>;
|
|
28
21
|
}
|
|
29
22
|
|
|
30
23
|
export { WsClient as default };
|
package/dist/WsClient.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import Client from './Client.js';
|
|
1
|
+
import Client, { Response } from './Client.js';
|
|
2
2
|
import { RpcMethod, JsonRpcRequest } from './common.js';
|
|
3
3
|
import '@chainflip/utils/types';
|
|
4
4
|
import 'zod';
|
|
@@ -11,20 +11,13 @@ declare class WsClient extends Client {
|
|
|
11
11
|
private emitter;
|
|
12
12
|
private requestMap;
|
|
13
13
|
constructor(url: string, WebSocket?: typeof globalThis.WebSocket);
|
|
14
|
-
protected getRequestId(): `${string}-${string}-${string}-${string}-${string}`;
|
|
15
14
|
close(): Promise<void>;
|
|
16
15
|
private handleClose;
|
|
17
16
|
private connectionReady;
|
|
18
17
|
private handleDisconnect;
|
|
19
18
|
private handleMessage;
|
|
20
19
|
private connect;
|
|
21
|
-
protected send<const T extends RpcMethod>(
|
|
22
|
-
success: true;
|
|
23
|
-
result: unknown;
|
|
24
|
-
} | {
|
|
25
|
-
success: false;
|
|
26
|
-
error: Error;
|
|
27
|
-
}>;
|
|
20
|
+
protected send<const T extends RpcMethod>(requests: JsonRpcRequest<T>[]): Promise<Response[]>;
|
|
28
21
|
}
|
|
29
22
|
|
|
30
23
|
export { WsClient as default };
|
package/dist/WsClient.mjs
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
// src/WsClient.ts
|
|
2
2
|
import { deferredPromise, once, sleep } from "@chainflip/utils/async";
|
|
3
|
-
import { randomUUID } from "crypto";
|
|
4
3
|
import Client from "./Client.mjs";
|
|
5
4
|
import { rpcResponse } from "./common.mjs";
|
|
6
5
|
var READY = "READY";
|
|
@@ -14,9 +13,6 @@ var WsClient = class extends Client {
|
|
|
14
13
|
reconnectAttempts = 0;
|
|
15
14
|
emitter = new EventTarget();
|
|
16
15
|
requestMap = /* @__PURE__ */ new Map();
|
|
17
|
-
getRequestId() {
|
|
18
|
-
return randomUUID();
|
|
19
|
-
}
|
|
20
16
|
async close() {
|
|
21
17
|
await this.handleClose();
|
|
22
18
|
}
|
|
@@ -71,36 +67,47 @@ var WsClient = class extends Client {
|
|
|
71
67
|
this.reconnectAttempts = 0;
|
|
72
68
|
return socket;
|
|
73
69
|
}
|
|
74
|
-
async send(
|
|
75
|
-
|
|
76
|
-
for (
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
socket
|
|
80
|
-
|
|
81
|
-
|
|
70
|
+
async send(requests) {
|
|
71
|
+
const responses = [];
|
|
72
|
+
for (const data of requests) {
|
|
73
|
+
const MAX_RETRIES = 5;
|
|
74
|
+
for (let i = 0; i < MAX_RETRIES; i += 1) {
|
|
75
|
+
let socket;
|
|
76
|
+
try {
|
|
77
|
+
socket = await this.connectionReady();
|
|
78
|
+
} catch {
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
socket.send(JSON.stringify(data));
|
|
82
|
+
const request = deferredPromise();
|
|
83
|
+
this.requestMap.set(data.id, request);
|
|
84
|
+
const controller = new AbortController();
|
|
85
|
+
const result = await Promise.race([
|
|
86
|
+
sleep(3e4, { signal: controller.signal }).then(
|
|
87
|
+
() => ({ success: false, retry: false, error: new Error("timeout") })
|
|
88
|
+
),
|
|
89
|
+
request.promise.then(
|
|
90
|
+
(result2) => ({ success: true, result: result2 }),
|
|
91
|
+
(error) => ({ success: false, error, retry: true })
|
|
92
|
+
)
|
|
93
|
+
]).finally(() => {
|
|
94
|
+
this.requestMap.delete(data.id);
|
|
95
|
+
controller.abort();
|
|
96
|
+
});
|
|
97
|
+
if (result.success || !result.retry) {
|
|
98
|
+
responses.push({ ...result, id: data.id });
|
|
99
|
+
break;
|
|
100
|
+
}
|
|
101
|
+
if (i === MAX_RETRIES - 1) {
|
|
102
|
+
responses.push({
|
|
103
|
+
success: false,
|
|
104
|
+
error: new Error("max retries exceeded"),
|
|
105
|
+
id: data.id
|
|
106
|
+
});
|
|
107
|
+
}
|
|
82
108
|
}
|
|
83
|
-
socket.send(JSON.stringify({ ...data, id: requestId }));
|
|
84
|
-
const request = deferredPromise();
|
|
85
|
-
this.requestMap.set(requestId, request);
|
|
86
|
-
const controller = new AbortController();
|
|
87
|
-
const result = await Promise.race([
|
|
88
|
-
sleep(3e4, { signal: controller.signal }).then(
|
|
89
|
-
() => ({ success: false, retry: false, error: new Error("timeout") })
|
|
90
|
-
),
|
|
91
|
-
request.promise.then(
|
|
92
|
-
(result2) => ({ success: true, result: result2 }),
|
|
93
|
-
(error) => ({ success: false, error, retry: true })
|
|
94
|
-
)
|
|
95
|
-
]).finally(() => {
|
|
96
|
-
this.requestMap.delete(requestId);
|
|
97
|
-
controller.abort();
|
|
98
|
-
});
|
|
99
|
-
if (result.success || !result.retry)
|
|
100
|
-
return result;
|
|
101
|
-
requestId = this.getRequestId();
|
|
102
109
|
}
|
|
103
|
-
return
|
|
110
|
+
return responses;
|
|
104
111
|
}
|
|
105
112
|
};
|
|
106
113
|
export {
|
package/dist/common.d.cts
CHANGED
|
@@ -8418,8 +8418,6 @@ declare const rpcResult: {
|
|
|
8418
8418
|
asset: "USDC";
|
|
8419
8419
|
}>]>;
|
|
8420
8420
|
}, "strip", z.ZodTypeAny, {
|
|
8421
|
-
buy: bigint | null;
|
|
8422
|
-
sell: bigint | null;
|
|
8423
8421
|
quote_asset: {
|
|
8424
8422
|
chain: "Bitcoin";
|
|
8425
8423
|
asset: "BTC";
|
|
@@ -8451,6 +8449,8 @@ declare const rpcResult: {
|
|
|
8451
8449
|
chain: "Solana";
|
|
8452
8450
|
asset: "USDC";
|
|
8453
8451
|
};
|
|
8452
|
+
sell: bigint | null;
|
|
8453
|
+
buy: bigint | null;
|
|
8454
8454
|
range_order: bigint;
|
|
8455
8455
|
base_asset: {
|
|
8456
8456
|
chain: "Bitcoin";
|
|
@@ -8484,8 +8484,6 @@ declare const rpcResult: {
|
|
|
8484
8484
|
asset: "USDC";
|
|
8485
8485
|
};
|
|
8486
8486
|
}, {
|
|
8487
|
-
buy: string | number | null;
|
|
8488
|
-
sell: string | number | null;
|
|
8489
8487
|
quote_asset: {
|
|
8490
8488
|
chain: "Bitcoin";
|
|
8491
8489
|
asset: "BTC";
|
|
@@ -8517,6 +8515,8 @@ declare const rpcResult: {
|
|
|
8517
8515
|
chain: "Solana";
|
|
8518
8516
|
asset: "USDC";
|
|
8519
8517
|
};
|
|
8518
|
+
sell: string | number | null;
|
|
8519
|
+
buy: string | number | null;
|
|
8520
8520
|
range_order: string | number;
|
|
8521
8521
|
base_asset: {
|
|
8522
8522
|
chain: "Bitcoin";
|
package/dist/common.d.ts
CHANGED
|
@@ -8418,8 +8418,6 @@ declare const rpcResult: {
|
|
|
8418
8418
|
asset: "USDC";
|
|
8419
8419
|
}>]>;
|
|
8420
8420
|
}, "strip", z.ZodTypeAny, {
|
|
8421
|
-
buy: bigint | null;
|
|
8422
|
-
sell: bigint | null;
|
|
8423
8421
|
quote_asset: {
|
|
8424
8422
|
chain: "Bitcoin";
|
|
8425
8423
|
asset: "BTC";
|
|
@@ -8451,6 +8449,8 @@ declare const rpcResult: {
|
|
|
8451
8449
|
chain: "Solana";
|
|
8452
8450
|
asset: "USDC";
|
|
8453
8451
|
};
|
|
8452
|
+
sell: bigint | null;
|
|
8453
|
+
buy: bigint | null;
|
|
8454
8454
|
range_order: bigint;
|
|
8455
8455
|
base_asset: {
|
|
8456
8456
|
chain: "Bitcoin";
|
|
@@ -8484,8 +8484,6 @@ declare const rpcResult: {
|
|
|
8484
8484
|
asset: "USDC";
|
|
8485
8485
|
};
|
|
8486
8486
|
}, {
|
|
8487
|
-
buy: string | number | null;
|
|
8488
|
-
sell: string | number | null;
|
|
8489
8487
|
quote_asset: {
|
|
8490
8488
|
chain: "Bitcoin";
|
|
8491
8489
|
asset: "BTC";
|
|
@@ -8517,6 +8515,8 @@ declare const rpcResult: {
|
|
|
8517
8515
|
chain: "Solana";
|
|
8518
8516
|
asset: "USDC";
|
|
8519
8517
|
};
|
|
8518
|
+
sell: string | number | null;
|
|
8519
|
+
buy: string | number | null;
|
|
8520
8520
|
range_order: string | number;
|
|
8521
8521
|
base_asset: {
|
|
8522
8522
|
chain: "Bitcoin";
|
package/dist/parsers.d.cts
CHANGED
|
@@ -13610,8 +13610,6 @@ declare const cfPoolPriceV2: z.ZodObject<{
|
|
|
13610
13610
|
asset: "USDC";
|
|
13611
13611
|
}>]>;
|
|
13612
13612
|
}, "strip", z.ZodTypeAny, {
|
|
13613
|
-
buy: bigint | null;
|
|
13614
|
-
sell: bigint | null;
|
|
13615
13613
|
quote_asset: {
|
|
13616
13614
|
chain: "Bitcoin";
|
|
13617
13615
|
asset: "BTC";
|
|
@@ -13643,6 +13641,8 @@ declare const cfPoolPriceV2: z.ZodObject<{
|
|
|
13643
13641
|
chain: "Solana";
|
|
13644
13642
|
asset: "USDC";
|
|
13645
13643
|
};
|
|
13644
|
+
sell: bigint | null;
|
|
13645
|
+
buy: bigint | null;
|
|
13646
13646
|
range_order: bigint;
|
|
13647
13647
|
base_asset: {
|
|
13648
13648
|
chain: "Bitcoin";
|
|
@@ -13676,8 +13676,6 @@ declare const cfPoolPriceV2: z.ZodObject<{
|
|
|
13676
13676
|
asset: "USDC";
|
|
13677
13677
|
};
|
|
13678
13678
|
}, {
|
|
13679
|
-
buy: string | number | null;
|
|
13680
|
-
sell: string | number | null;
|
|
13681
13679
|
quote_asset: {
|
|
13682
13680
|
chain: "Bitcoin";
|
|
13683
13681
|
asset: "BTC";
|
|
@@ -13709,6 +13707,8 @@ declare const cfPoolPriceV2: z.ZodObject<{
|
|
|
13709
13707
|
chain: "Solana";
|
|
13710
13708
|
asset: "USDC";
|
|
13711
13709
|
};
|
|
13710
|
+
sell: string | number | null;
|
|
13711
|
+
buy: string | number | null;
|
|
13712
13712
|
range_order: string | number;
|
|
13713
13713
|
base_asset: {
|
|
13714
13714
|
chain: "Bitcoin";
|
package/dist/parsers.d.ts
CHANGED
|
@@ -13610,8 +13610,6 @@ declare const cfPoolPriceV2: z.ZodObject<{
|
|
|
13610
13610
|
asset: "USDC";
|
|
13611
13611
|
}>]>;
|
|
13612
13612
|
}, "strip", z.ZodTypeAny, {
|
|
13613
|
-
buy: bigint | null;
|
|
13614
|
-
sell: bigint | null;
|
|
13615
13613
|
quote_asset: {
|
|
13616
13614
|
chain: "Bitcoin";
|
|
13617
13615
|
asset: "BTC";
|
|
@@ -13643,6 +13641,8 @@ declare const cfPoolPriceV2: z.ZodObject<{
|
|
|
13643
13641
|
chain: "Solana";
|
|
13644
13642
|
asset: "USDC";
|
|
13645
13643
|
};
|
|
13644
|
+
sell: bigint | null;
|
|
13645
|
+
buy: bigint | null;
|
|
13646
13646
|
range_order: bigint;
|
|
13647
13647
|
base_asset: {
|
|
13648
13648
|
chain: "Bitcoin";
|
|
@@ -13676,8 +13676,6 @@ declare const cfPoolPriceV2: z.ZodObject<{
|
|
|
13676
13676
|
asset: "USDC";
|
|
13677
13677
|
};
|
|
13678
13678
|
}, {
|
|
13679
|
-
buy: string | number | null;
|
|
13680
|
-
sell: string | number | null;
|
|
13681
13679
|
quote_asset: {
|
|
13682
13680
|
chain: "Bitcoin";
|
|
13683
13681
|
asset: "BTC";
|
|
@@ -13709,6 +13707,8 @@ declare const cfPoolPriceV2: z.ZodObject<{
|
|
|
13709
13707
|
chain: "Solana";
|
|
13710
13708
|
asset: "USDC";
|
|
13711
13709
|
};
|
|
13710
|
+
sell: string | number | null;
|
|
13711
|
+
buy: string | number | null;
|
|
13712
13712
|
range_order: string | number;
|
|
13713
13713
|
base_asset: {
|
|
13714
13714
|
chain: "Bitcoin";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@chainflip/rpc",
|
|
3
|
-
"version": "1.6.
|
|
3
|
+
"version": "1.6.9",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"dependencies": {
|
|
6
6
|
"@chainflip/utils": "^0.3.0",
|
|
@@ -44,7 +44,7 @@
|
|
|
44
44
|
},
|
|
45
45
|
"scripts": {
|
|
46
46
|
"clean": "rm -rf dist",
|
|
47
|
-
"prepublish": "pnpm
|
|
47
|
+
"prepublish": "pnpm build",
|
|
48
48
|
"build": "pnpm clean && pnpm tsup",
|
|
49
49
|
"test": "vitest",
|
|
50
50
|
"coverage": "vitest run --coverage"
|