@across-protocol/sdk 4.3.19 → 4.3.20
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/cjs/providers/mocks/MockCachedSolanaRpcFactory.d.ts +2 -2
- package/dist/cjs/providers/mocks/MockCachedSolanaRpcFactory.js +3 -3
- package/dist/cjs/providers/mocks/MockCachedSolanaRpcFactory.js.map +1 -1
- package/dist/cjs/providers/mocks/MockRetrySolanaRpcFactory.d.ts +5 -0
- package/dist/cjs/providers/mocks/MockRetrySolanaRpcFactory.js +21 -0
- package/dist/cjs/providers/mocks/MockRetrySolanaRpcFactory.js.map +1 -0
- package/dist/cjs/providers/mocks/index.d.ts +1 -0
- package/dist/cjs/providers/mocks/index.js +1 -0
- package/dist/cjs/providers/mocks/index.js.map +1 -1
- package/dist/cjs/providers/solana/cachedRpcFactory.d.ts +4 -4
- package/dist/cjs/providers/solana/cachedRpcFactory.js +14 -14
- package/dist/cjs/providers/solana/cachedRpcFactory.js.map +1 -1
- package/dist/cjs/providers/solana/index.d.ts +1 -0
- package/dist/cjs/providers/solana/index.js +1 -0
- package/dist/cjs/providers/solana/index.js.map +1 -1
- package/dist/cjs/providers/solana/retryRpcFactory.d.ts +14 -0
- package/dist/cjs/providers/solana/retryRpcFactory.js +88 -0
- package/dist/cjs/providers/solana/retryRpcFactory.js.map +1 -0
- package/dist/esm/providers/mocks/MockCachedSolanaRpcFactory.d.ts +2 -2
- package/dist/esm/providers/mocks/MockCachedSolanaRpcFactory.js +4 -4
- package/dist/esm/providers/mocks/MockCachedSolanaRpcFactory.js.map +1 -1
- package/dist/esm/providers/mocks/MockRetrySolanaRpcFactory.d.ts +5 -0
- package/dist/esm/providers/mocks/MockRetrySolanaRpcFactory.js +20 -0
- package/dist/esm/providers/mocks/MockRetrySolanaRpcFactory.js.map +1 -0
- package/dist/esm/providers/mocks/index.d.ts +1 -0
- package/dist/esm/providers/mocks/index.js +1 -0
- package/dist/esm/providers/mocks/index.js.map +1 -1
- package/dist/esm/providers/solana/cachedRpcFactory.d.ts +4 -4
- package/dist/esm/providers/solana/cachedRpcFactory.js +15 -15
- package/dist/esm/providers/solana/cachedRpcFactory.js.map +1 -1
- package/dist/esm/providers/solana/index.d.ts +1 -0
- package/dist/esm/providers/solana/index.js +1 -0
- package/dist/esm/providers/solana/index.js.map +1 -1
- package/dist/esm/providers/solana/retryRpcFactory.d.ts +26 -0
- package/dist/esm/providers/solana/retryRpcFactory.js +105 -0
- package/dist/esm/providers/solana/retryRpcFactory.js.map +1 -0
- package/dist/types/providers/mocks/MockCachedSolanaRpcFactory.d.ts +2 -2
- package/dist/types/providers/mocks/MockCachedSolanaRpcFactory.d.ts.map +1 -1
- package/dist/types/providers/mocks/MockRetrySolanaRpcFactory.d.ts +6 -0
- package/dist/types/providers/mocks/MockRetrySolanaRpcFactory.d.ts.map +1 -0
- package/dist/types/providers/mocks/index.d.ts +1 -0
- package/dist/types/providers/mocks/index.d.ts.map +1 -1
- package/dist/types/providers/solana/cachedRpcFactory.d.ts +4 -4
- package/dist/types/providers/solana/cachedRpcFactory.d.ts.map +1 -1
- package/dist/types/providers/solana/index.d.ts +1 -0
- package/dist/types/providers/solana/index.d.ts.map +1 -1
- package/dist/types/providers/solana/retryRpcFactory.d.ts +27 -0
- package/dist/types/providers/solana/retryRpcFactory.d.ts.map +1 -0
- package/package.json +2 -1
- package/src/providers/mocks/MockCachedSolanaRpcFactory.ts +5 -5
- package/src/providers/mocks/MockRetrySolanaRpcFactory.ts +16 -0
- package/src/providers/mocks/index.ts +1 -0
- package/src/providers/solana/cachedRpcFactory.ts +17 -17
- package/src/providers/solana/index.ts +1 -0
- package/src/providers/solana/retryRpcFactory.ts +97 -0
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { CachedSolanaRpcFactory } from "..";
|
|
2
|
-
import {
|
|
2
|
+
import { MockRetrySolanaRpcFactory } from "./MockRetrySolanaRpcFactory";
|
|
3
3
|
export declare class MockCachedSolanaRpcFactory extends CachedSolanaRpcFactory {
|
|
4
|
-
constructor(
|
|
4
|
+
constructor(mockRetrySolanaRpcFactory: MockRetrySolanaRpcFactory, ...cachedConstructorParams: ConstructorParameters<typeof CachedSolanaRpcFactory>);
|
|
5
5
|
}
|
|
@@ -5,14 +5,14 @@ var tslib_1 = require("tslib");
|
|
|
5
5
|
var __1 = require("..");
|
|
6
6
|
var MockCachedSolanaRpcFactory = (function (_super) {
|
|
7
7
|
tslib_1.__extends(MockCachedSolanaRpcFactory, _super);
|
|
8
|
-
function MockCachedSolanaRpcFactory(
|
|
8
|
+
function MockCachedSolanaRpcFactory(mockRetrySolanaRpcFactory) {
|
|
9
9
|
var cachedConstructorParams = [];
|
|
10
10
|
for (var _i = 1; _i < arguments.length; _i++) {
|
|
11
11
|
cachedConstructorParams[_i - 1] = arguments[_i];
|
|
12
12
|
}
|
|
13
13
|
var _this = _super.apply(this, cachedConstructorParams) || this;
|
|
14
|
-
_this.
|
|
15
|
-
_this.
|
|
14
|
+
_this.retryTransport = mockRetrySolanaRpcFactory.createTransport();
|
|
15
|
+
_this.retryRpcClient = mockRetrySolanaRpcFactory.createRpcClient();
|
|
16
16
|
return _this;
|
|
17
17
|
}
|
|
18
18
|
return MockCachedSolanaRpcFactory;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MockCachedSolanaRpcFactory.js","sourceRoot":"","sources":["../../../../src/providers/mocks/MockCachedSolanaRpcFactory.ts"],"names":[],"mappings":";;;;AAAA,wBAA4C;AAI5C;IAAgD,sDAAsB;IACpE,oCACE
|
|
1
|
+
{"version":3,"file":"MockCachedSolanaRpcFactory.js","sourceRoot":"","sources":["../../../../src/providers/mocks/MockCachedSolanaRpcFactory.ts"],"names":[],"mappings":";;;;AAAA,wBAA4C;AAI5C;IAAgD,sDAAsB;IACpE,oCACE,yBAAoD;QACpD,iCAAgF;aAAhF,UAAgF,EAAhF,qBAAgF,EAAhF,IAAgF;YAAhF,gDAAgF;;QAFlF,+BAIW,uBAAuB,UAIjC;QAFC,KAAI,CAAC,cAAc,GAAG,yBAAyB,CAAC,eAAe,EAAE,CAAC;QAClE,KAAI,CAAC,cAAc,GAAG,yBAAyB,CAAC,eAAe,EAAE,CAAC;;IACpE,CAAC;IACH,iCAAC;AAAD,CAAC,AAVD,CAAgD,0BAAsB,GAUrE;AAVY,gEAA0B"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { RetrySolanaRpcFactory } from "..";
|
|
2
|
+
import { MockRateLimitedSolanaRpcFactory } from "./MockRateLimitedSolanaRpcFactory";
|
|
3
|
+
export declare class MockRetrySolanaRpcFactory extends RetrySolanaRpcFactory {
|
|
4
|
+
constructor(mockRateLimitedSolanaRpcFactory: MockRateLimitedSolanaRpcFactory, ...retryConstructorParams: ConstructorParameters<typeof RetrySolanaRpcFactory>);
|
|
5
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MockRetrySolanaRpcFactory = void 0;
|
|
4
|
+
var tslib_1 = require("tslib");
|
|
5
|
+
var __1 = require("..");
|
|
6
|
+
var MockRetrySolanaRpcFactory = (function (_super) {
|
|
7
|
+
tslib_1.__extends(MockRetrySolanaRpcFactory, _super);
|
|
8
|
+
function MockRetrySolanaRpcFactory(mockRateLimitedSolanaRpcFactory) {
|
|
9
|
+
var retryConstructorParams = [];
|
|
10
|
+
for (var _i = 1; _i < arguments.length; _i++) {
|
|
11
|
+
retryConstructorParams[_i - 1] = arguments[_i];
|
|
12
|
+
}
|
|
13
|
+
var _this = _super.apply(this, retryConstructorParams) || this;
|
|
14
|
+
_this.rateLimitedTransport = mockRateLimitedSolanaRpcFactory.createTransport();
|
|
15
|
+
_this.logger = mockRateLimitedSolanaRpcFactory.logger;
|
|
16
|
+
return _this;
|
|
17
|
+
}
|
|
18
|
+
return MockRetrySolanaRpcFactory;
|
|
19
|
+
}(__1.RetrySolanaRpcFactory));
|
|
20
|
+
exports.MockRetrySolanaRpcFactory = MockRetrySolanaRpcFactory;
|
|
21
|
+
//# sourceMappingURL=MockRetrySolanaRpcFactory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MockRetrySolanaRpcFactory.js","sourceRoot":"","sources":["../../../../src/providers/mocks/MockRetrySolanaRpcFactory.ts"],"names":[],"mappings":";;;;AAAA,wBAA2C;AAI3C;IAA+C,qDAAqB;IAClE,mCACE,+BAAgE;QAChE,gCAA8E;aAA9E,UAA8E,EAA9E,qBAA8E,EAA9E,IAA8E;YAA9E,+CAA8E;;QAFhF,+BAIW,sBAAsB,UAKhC;QAFC,KAAI,CAAC,oBAAoB,GAAG,+BAA+B,CAAC,eAAe,EAAE,CAAC;QAC9E,KAAI,CAAC,MAAM,GAAG,+BAA+B,CAAC,MAAM,CAAC;;IACvD,CAAC;IACH,gCAAC;AAAD,CAAC,AAXD,CAA+C,yBAAqB,GAWnE;AAXY,8DAAyB"}
|
|
@@ -4,5 +4,6 @@ var tslib_1 = require("tslib");
|
|
|
4
4
|
tslib_1.__exportStar(require("./mockEthersProvider"), exports);
|
|
5
5
|
tslib_1.__exportStar(require("./MockCachedSolanaRpcFactory"), exports);
|
|
6
6
|
tslib_1.__exportStar(require("./MockRateLimitedSolanaRpcFactory"), exports);
|
|
7
|
+
tslib_1.__exportStar(require("./MockRetrySolanaRpcFactory"), exports);
|
|
7
8
|
tslib_1.__exportStar(require("./MockSolanaRpcFactory"), exports);
|
|
8
9
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/providers/mocks/index.ts"],"names":[],"mappings":";;;AAAA,+DAAqC;AACrC,uEAA6C;AAC7C,4EAAkD;AAClD,iEAAuC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/providers/mocks/index.ts"],"names":[],"mappings":";;;AAAA,+DAAqC;AACrC,uEAA6C;AAC7C,4EAAkD;AAClD,sEAA4C;AAC5C,iEAAuC"}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { RpcTransport, RpcFromTransport, SolanaRpcApiFromTransport } from "@solana/kit";
|
|
2
2
|
import { CachingMechanismInterface } from "../../interfaces";
|
|
3
3
|
import { SolanaClusterRpcFactory } from "./baseRpcFactories";
|
|
4
|
-
import {
|
|
4
|
+
import { RetrySolanaRpcFactory } from "./retryRpcFactory";
|
|
5
5
|
export declare class CachedSolanaRpcFactory extends SolanaClusterRpcFactory {
|
|
6
6
|
readonly redisClient?: CachingMechanismInterface | undefined;
|
|
7
7
|
readonly getTransactionCachePrefix: string;
|
|
8
|
-
protected
|
|
9
|
-
protected
|
|
10
|
-
constructor(providerCacheNamespace: string, redisClient?: CachingMechanismInterface | undefined, ...
|
|
8
|
+
protected retryTransport: RpcTransport;
|
|
9
|
+
protected retryRpcClient: RpcFromTransport<SolanaRpcApiFromTransport<RpcTransport>, RpcTransport>;
|
|
10
|
+
constructor(providerCacheNamespace: string, redisClient?: CachingMechanismInterface | undefined, ...retryConstructorParams: ConstructorParameters<typeof RetrySolanaRpcFactory>);
|
|
11
11
|
createTransport(): RpcTransport;
|
|
12
12
|
private requestAndCacheFinalized;
|
|
13
13
|
private buildRedisKey;
|
|
@@ -5,23 +5,23 @@ var tslib_1 = require("tslib");
|
|
|
5
5
|
var rpc_transformers_1 = require("@solana/rpc-transformers");
|
|
6
6
|
var superstruct_1 = require("superstruct");
|
|
7
7
|
var baseRpcFactories_1 = require("./baseRpcFactories");
|
|
8
|
-
var rateLimitedRpcFactory_1 = require("./rateLimitedRpcFactory");
|
|
9
8
|
var utils_1 = require("../utils");
|
|
10
9
|
var utils_2 = require("../../utils");
|
|
10
|
+
var retryRpcFactory_1 = require("./retryRpcFactory");
|
|
11
11
|
var CachedSolanaRpcFactory = (function (_super) {
|
|
12
12
|
tslib_1.__extends(CachedSolanaRpcFactory, _super);
|
|
13
13
|
function CachedSolanaRpcFactory(providerCacheNamespace, redisClient) {
|
|
14
14
|
var _this = this;
|
|
15
|
-
var
|
|
15
|
+
var retryConstructorParams = [];
|
|
16
16
|
for (var _i = 2; _i < arguments.length; _i++) {
|
|
17
|
-
|
|
17
|
+
retryConstructorParams[_i - 2] = arguments[_i];
|
|
18
18
|
}
|
|
19
|
-
var superParams =
|
|
19
|
+
var superParams = retryConstructorParams.slice(-2);
|
|
20
20
|
_this = _super.apply(this, superParams) || this;
|
|
21
21
|
_this.redisClient = redisClient;
|
|
22
|
-
var
|
|
23
|
-
_this.
|
|
24
|
-
_this.
|
|
22
|
+
var retryRpcFactory = new (retryRpcFactory_1.RetrySolanaRpcFactory.bind.apply(retryRpcFactory_1.RetrySolanaRpcFactory, tslib_1.__spreadArray([void 0], retryConstructorParams, false)))();
|
|
23
|
+
_this.retryTransport = retryRpcFactory.createTransport();
|
|
24
|
+
_this.retryRpcClient = retryRpcFactory.createRpcClient();
|
|
25
25
|
var cachePrefix = "".concat(providerCacheNamespace, ",").concat(new URL(_this.clusterUrl).hostname, ",").concat(_this.chainId);
|
|
26
26
|
_this.getTransactionCachePrefix = "".concat(cachePrefix, ":getTransaction,");
|
|
27
27
|
return _this;
|
|
@@ -42,7 +42,7 @@ var CachedSolanaRpcFactory = (function (_super) {
|
|
|
42
42
|
_a = args[0].payload, method = _a.method, params = _a.params;
|
|
43
43
|
cacheType = this.redisClient ? this.cacheType(method) : utils_1.CacheType.NONE;
|
|
44
44
|
if (cacheType === utils_1.CacheType.NONE) {
|
|
45
|
-
return [2, this.
|
|
45
|
+
return [2, this.retryTransport.apply(this, args)];
|
|
46
46
|
}
|
|
47
47
|
redisKey = this.buildRedisKey(method, params);
|
|
48
48
|
return [4, ((_b = this.redisClient) === null || _b === void 0 ? void 0 : _b.get(redisKey))];
|
|
@@ -70,13 +70,13 @@ var CachedSolanaRpcFactory = (function (_super) {
|
|
|
70
70
|
case 0:
|
|
71
71
|
_c = args[0].payload, method = _c.method, params = _c.params;
|
|
72
72
|
if (method !== "getTransaction")
|
|
73
|
-
return [2, this.
|
|
73
|
+
return [2, this.retryTransport.apply(this, args)];
|
|
74
74
|
if (!this.isGetTransactionParams(params))
|
|
75
|
-
return [2, this.
|
|
75
|
+
return [2, this.retryTransport.apply(this, args)];
|
|
76
76
|
_d.label = 1;
|
|
77
77
|
case 1:
|
|
78
78
|
_d.trys.push([1, 3, , 4]);
|
|
79
|
-
return [4, this.
|
|
79
|
+
return [4, this.retryRpcClient
|
|
80
80
|
.getSignatureStatuses([params[0]], {
|
|
81
81
|
searchTransactionHistory: true,
|
|
82
82
|
})
|
|
@@ -84,13 +84,13 @@ var CachedSolanaRpcFactory = (function (_super) {
|
|
|
84
84
|
case 2:
|
|
85
85
|
getSignatureStatusesResponse = _d.sent();
|
|
86
86
|
if (((_a = getSignatureStatusesResponse.value[0]) === null || _a === void 0 ? void 0 : _a.confirmationStatus) !== "finalized") {
|
|
87
|
-
return [2, this.
|
|
87
|
+
return [2, this.retryTransport.apply(this, args)];
|
|
88
88
|
}
|
|
89
89
|
return [3, 4];
|
|
90
90
|
case 3:
|
|
91
91
|
error_1 = _d.sent();
|
|
92
|
-
return [2, this.
|
|
93
|
-
case 4: return [4, this.
|
|
92
|
+
return [2, this.retryTransport.apply(this, args)];
|
|
93
|
+
case 4: return [4, this.retryTransport.apply(this, args)];
|
|
94
94
|
case 5:
|
|
95
95
|
getTransactionResponse = _d.sent();
|
|
96
96
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cachedRpcFactory.js","sourceRoot":"","sources":["../../../../src/providers/solana/cachedRpcFactory.ts"],"names":[],"mappings":";;;;AACA,6DAAkF;AAClF,2CAAkE;AAElE,uDAA6D;AAC7D,
|
|
1
|
+
{"version":3,"file":"cachedRpcFactory.js","sourceRoot":"","sources":["../../../../src/providers/solana/cachedRpcFactory.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,5 +5,6 @@ tslib_1.__exportStar(require("./baseRpcFactories"), exports);
|
|
|
5
5
|
tslib_1.__exportStar(require("./cachedRpcFactory"), exports);
|
|
6
6
|
tslib_1.__exportStar(require("./defaultRpcFactory"), exports);
|
|
7
7
|
tslib_1.__exportStar(require("./rateLimitedRpcFactory"), exports);
|
|
8
|
+
tslib_1.__exportStar(require("./retryRpcFactory"), exports);
|
|
8
9
|
tslib_1.__exportStar(require("./utils"), exports);
|
|
9
10
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/providers/solana/index.ts"],"names":[],"mappings":";;;AAAA,6DAAmC;AACnC,6DAAmC;AACnC,8DAAoC;AACpC,kEAAwC;AACxC,kDAAwB"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/providers/solana/index.ts"],"names":[],"mappings":";;;AAAA,6DAAmC;AACnC,6DAAmC;AACnC,8DAAoC;AACpC,kEAAwC;AACxC,4DAAkC;AAClC,kDAAwB"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { RpcTransport } from "@solana/kit";
|
|
2
|
+
import { SolanaClusterRpcFactory } from "./baseRpcFactories";
|
|
3
|
+
import { RateLimitedSolanaRpcFactory } from "./rateLimitedRpcFactory";
|
|
4
|
+
import { Logger } from "winston";
|
|
5
|
+
export declare class RetrySolanaRpcFactory extends SolanaClusterRpcFactory {
|
|
6
|
+
readonly retries: number;
|
|
7
|
+
readonly retryDelaySeconds: number;
|
|
8
|
+
protected rateLimitedTransport: RpcTransport;
|
|
9
|
+
protected logger: Logger;
|
|
10
|
+
constructor(retries: number, retryDelaySeconds: number, ...rateLimitedConstructorParams: ConstructorParameters<typeof RateLimitedSolanaRpcFactory>);
|
|
11
|
+
createTransport(): RpcTransport;
|
|
12
|
+
private _tryCall;
|
|
13
|
+
private shouldFailImmediate;
|
|
14
|
+
}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RetrySolanaRpcFactory = void 0;
|
|
4
|
+
var tslib_1 = require("tslib");
|
|
5
|
+
var baseRpcFactories_1 = require("./baseRpcFactories");
|
|
6
|
+
var rateLimitedRpcFactory_1 = require("./rateLimitedRpcFactory");
|
|
7
|
+
var utils_1 = require("../../utils");
|
|
8
|
+
var NetworkUtils_1 = require("../../utils/NetworkUtils");
|
|
9
|
+
var RetrySolanaRpcFactory = (function (_super) {
|
|
10
|
+
tslib_1.__extends(RetrySolanaRpcFactory, _super);
|
|
11
|
+
function RetrySolanaRpcFactory(retries, retryDelaySeconds) {
|
|
12
|
+
var _this = this;
|
|
13
|
+
var rateLimitedConstructorParams = [];
|
|
14
|
+
for (var _i = 2; _i < arguments.length; _i++) {
|
|
15
|
+
rateLimitedConstructorParams[_i - 2] = arguments[_i];
|
|
16
|
+
}
|
|
17
|
+
var superParams = rateLimitedConstructorParams.slice(-2);
|
|
18
|
+
_this = _super.apply(this, superParams) || this;
|
|
19
|
+
_this.retries = retries;
|
|
20
|
+
_this.retryDelaySeconds = retryDelaySeconds;
|
|
21
|
+
if (_this.retries < 0 || !Number.isInteger(_this.retries)) {
|
|
22
|
+
throw new Error("retries cannot be < 0 and must be an integer. Currently set to ".concat(_this.retries));
|
|
23
|
+
}
|
|
24
|
+
if (_this.retryDelaySeconds < 0) {
|
|
25
|
+
throw new Error("retryDelaySeconds cannot be < 0. Currently set to ".concat(_this.retryDelaySeconds));
|
|
26
|
+
}
|
|
27
|
+
var rateLimitedRpcFactory = new (rateLimitedRpcFactory_1.RateLimitedSolanaRpcFactory.bind.apply(rateLimitedRpcFactory_1.RateLimitedSolanaRpcFactory, tslib_1.__spreadArray([void 0], rateLimitedConstructorParams, false)))();
|
|
28
|
+
_this.rateLimitedTransport = rateLimitedRpcFactory.createTransport();
|
|
29
|
+
_this.logger = rateLimitedRpcFactory.logger;
|
|
30
|
+
return _this;
|
|
31
|
+
}
|
|
32
|
+
RetrySolanaRpcFactory.prototype.createTransport = function () {
|
|
33
|
+
var _this = this;
|
|
34
|
+
return function () {
|
|
35
|
+
var args = [];
|
|
36
|
+
for (var _i = 0; _i < arguments.length; _i++) {
|
|
37
|
+
args[_i] = arguments[_i];
|
|
38
|
+
}
|
|
39
|
+
return _this._tryCall(function () { return _this.rateLimitedTransport.apply(_this, args); }, args);
|
|
40
|
+
};
|
|
41
|
+
};
|
|
42
|
+
RetrySolanaRpcFactory.prototype._tryCall = function (transportCall, args) {
|
|
43
|
+
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
|
44
|
+
var method, retries, error_1;
|
|
45
|
+
return tslib_1.__generator(this, function (_a) {
|
|
46
|
+
switch (_a.label) {
|
|
47
|
+
case 0:
|
|
48
|
+
method = args[0].payload.method;
|
|
49
|
+
retries = this.retries;
|
|
50
|
+
_a.label = 1;
|
|
51
|
+
case 1:
|
|
52
|
+
if (!true) return [3, 7];
|
|
53
|
+
_a.label = 2;
|
|
54
|
+
case 2:
|
|
55
|
+
_a.trys.push([2, 4, , 6]);
|
|
56
|
+
return [4, transportCall()];
|
|
57
|
+
case 3: return [2, _a.sent()];
|
|
58
|
+
case 4:
|
|
59
|
+
error_1 = _a.sent();
|
|
60
|
+
if (retries-- <= 0 || this.shouldFailImmediate(method, error_1)) {
|
|
61
|
+
throw error_1;
|
|
62
|
+
}
|
|
63
|
+
this.logger.debug({
|
|
64
|
+
at: "RetryRpcFactory",
|
|
65
|
+
message: "Retrying Solana RPC call",
|
|
66
|
+
provider: (0, NetworkUtils_1.getOriginFromURL)(this.clusterUrl),
|
|
67
|
+
method: method,
|
|
68
|
+
retryAttempt: this.retries - retries,
|
|
69
|
+
retryDelaySeconds: this.retryDelaySeconds,
|
|
70
|
+
error: error_1 === null || error_1 === void 0 ? void 0 : error_1.toString(),
|
|
71
|
+
});
|
|
72
|
+
return [4, (0, utils_1.delay)(this.retryDelaySeconds)];
|
|
73
|
+
case 5:
|
|
74
|
+
_a.sent();
|
|
75
|
+
return [3, 6];
|
|
76
|
+
case 6: return [3, 1];
|
|
77
|
+
case 7: return [2];
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
};
|
|
82
|
+
RetrySolanaRpcFactory.prototype.shouldFailImmediate = function (_method, _error) {
|
|
83
|
+
return false;
|
|
84
|
+
};
|
|
85
|
+
return RetrySolanaRpcFactory;
|
|
86
|
+
}(baseRpcFactories_1.SolanaClusterRpcFactory));
|
|
87
|
+
exports.RetrySolanaRpcFactory = RetrySolanaRpcFactory;
|
|
88
|
+
//# sourceMappingURL=retryRpcFactory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retryRpcFactory.js","sourceRoot":"","sources":["../../../../src/providers/solana/retryRpcFactory.ts"],"names":[],"mappings":";;;;AACA,uDAA6D;AAC7D,iEAAsE;AACtE,qCAAoC;AACpC,yDAA4D;AAK5D;IAA2C,iDAAuB;IAMhE,+BACW,OAAe,EACf,iBAAyB;QAFpC,iBAwBC;QArBC,sCAA0F;aAA1F,UAA0F,EAA1F,qBAA0F,EAA1F,IAA0F;YAA1F,qDAA0F;;QAG1F,IAAM,WAAW,GAAG,4BAA4B,CAAC,KAAK,CAAC,CAAC,CAAC,CAGxD,CAAC;mCACO,WAAW;QATX,aAAO,GAAP,OAAO,CAAQ;QACf,uBAAiB,GAAjB,iBAAiB,CAAQ;QAWlC,IAAI,KAAI,CAAC,OAAO,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAI,CAAC,OAAO,CAAC,EAAE;YACvD,MAAM,IAAI,KAAK,CAAC,yEAAkE,KAAI,CAAC,OAAO,CAAE,CAAC,CAAC;SACnG;QACD,IAAI,KAAI,CAAC,iBAAiB,GAAG,CAAC,EAAE;YAC9B,MAAM,IAAI,KAAK,CAAC,4DAAqD,KAAI,CAAC,iBAAiB,CAAE,CAAC,CAAC;SAChG;QAGD,IAAM,qBAAqB,QAAO,mDAA2B,YAA3B,mDAA2B,kCAAI,4BAA4B,YAAC,CAAC;QAC/F,KAAI,CAAC,oBAAoB,GAAG,qBAAqB,CAAC,eAAe,EAAE,CAAC;QACpE,KAAI,CAAC,MAAM,GAAG,qBAAqB,CAAC,MAAM,CAAC;;IAC7C,CAAC;IAEM,+CAAe,GAAtB;QAAA,iBAIC;QAHC,OAAO;YAAY,cAAiC;iBAAjC,UAAiC,EAAjC,qBAAiC,EAAjC,IAAiC;gBAAjC,yBAAiC;;YAClD,OAAO,KAAI,CAAC,QAAQ,CAAC,cAAM,OAAA,KAAI,CAAC,oBAAoB,OAAzB,KAAI,EAAoC,IAAI,GAA5C,CAA6C,EAAE,IAAI,CAAC,CAAC;QAClF,CAAC,CAAC;IACJ,CAAC;IAQa,wCAAQ,GAAtB,UACE,aAAuC,EACvC,IAA8B;;;;;;wBAEtB,MAAM,GAAK,IAAI,CAAC,CAAC,CAAC,CAAC,OAAiD,OAA9D,CAA+D;wBACzE,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;;;6BAGpB,IAAI;;;;wBAEA,WAAM,aAAa,EAAE,EAAA;4BAA5B,WAAO,SAAqB,EAAC;;;wBAE7B,IAAI,OAAO,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,OAAK,CAAC,EAAE;4BAC7D,MAAM,OAAK,CAAC;yBACb;wBAGD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;4BAChB,EAAE,EAAE,iBAAiB;4BACrB,OAAO,EAAE,0BAA0B;4BACnC,QAAQ,EAAE,IAAA,+BAAgB,EAAC,IAAI,CAAC,UAAU,CAAC;4BAC3C,MAAM,QAAA;4BACN,YAAY,EAAE,IAAI,CAAC,OAAO,GAAG,OAAO;4BACpC,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;4BACzC,KAAK,EAAE,OAAK,aAAL,OAAK,uBAAL,OAAK,CAAE,QAAQ,EAAE;yBACzB,CAAC,CAAC;wBAEH,WAAM,IAAA,aAAK,EAAC,IAAI,CAAC,iBAAiB,CAAC,EAAA;;wBAAnC,SAAmC,CAAC;;;;;;;KAGzC;IAQO,mDAAmB,GAA3B,UAA4B,OAAe,EAAE,MAAe;QAG1D,OAAO,KAAK,CAAC;IACf,CAAC;IACH,4BAAC;AAAD,CAAC,AAvFD,CAA2C,0CAAuB,GAuFjE;AAvFY,sDAAqB"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { CachedSolanaRpcFactory } from "..";
|
|
2
|
-
import {
|
|
2
|
+
import { MockRetrySolanaRpcFactory } from "./MockRetrySolanaRpcFactory";
|
|
3
3
|
export declare class MockCachedSolanaRpcFactory extends CachedSolanaRpcFactory {
|
|
4
|
-
constructor(
|
|
4
|
+
constructor(mockRetrySolanaRpcFactory: MockRetrySolanaRpcFactory, ...cachedConstructorParams: ConstructorParameters<typeof CachedSolanaRpcFactory>);
|
|
5
5
|
}
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
import { __extends } from "tslib";
|
|
2
2
|
import { CachedSolanaRpcFactory } from "..";
|
|
3
|
-
// Creates mocked cached Solana RPC factory by using the mocked Solana RPC factory.
|
|
3
|
+
// Creates mocked cached Solana RPC factory by using the mocked retry Solana RPC factory.
|
|
4
4
|
var MockCachedSolanaRpcFactory = /** @class */ (function (_super) {
|
|
5
5
|
__extends(MockCachedSolanaRpcFactory, _super);
|
|
6
|
-
function MockCachedSolanaRpcFactory(
|
|
6
|
+
function MockCachedSolanaRpcFactory(mockRetrySolanaRpcFactory) {
|
|
7
7
|
var cachedConstructorParams = [];
|
|
8
8
|
for (var _i = 1; _i < arguments.length; _i++) {
|
|
9
9
|
cachedConstructorParams[_i - 1] = arguments[_i];
|
|
10
10
|
}
|
|
11
11
|
var _this = _super.apply(this, cachedConstructorParams) || this;
|
|
12
|
-
_this.
|
|
13
|
-
_this.
|
|
12
|
+
_this.retryTransport = mockRetrySolanaRpcFactory.createTransport();
|
|
13
|
+
_this.retryRpcClient = mockRetrySolanaRpcFactory.createRpcClient();
|
|
14
14
|
return _this;
|
|
15
15
|
}
|
|
16
16
|
return MockCachedSolanaRpcFactory;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MockCachedSolanaRpcFactory.js","sourceRoot":"","sources":["../../../../src/providers/mocks/MockCachedSolanaRpcFactory.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,IAAI,CAAC;AAG5C,
|
|
1
|
+
{"version":3,"file":"MockCachedSolanaRpcFactory.js","sourceRoot":"","sources":["../../../../src/providers/mocks/MockCachedSolanaRpcFactory.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,IAAI,CAAC;AAG5C,yFAAyF;AACzF;IAAgD,8CAAsB;IACpE,oCACE,yBAAoD;QACpD,iCAAgF;aAAhF,UAAgF,EAAhF,qBAAgF,EAAhF,IAAgF;YAAhF,gDAAgF;;QAFlF,+BAIW,uBAAuB,UAIjC;QAFC,KAAI,CAAC,cAAc,GAAG,yBAAyB,CAAC,eAAe,EAAE,CAAC;QAClE,KAAI,CAAC,cAAc,GAAG,yBAAyB,CAAC,eAAe,EAAE,CAAC;;IACpE,CAAC;IACH,iCAAC;AAAD,CAAC,AAVD,CAAgD,sBAAsB,GAUrE"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { RetrySolanaRpcFactory } from "..";
|
|
2
|
+
import { MockRateLimitedSolanaRpcFactory } from "./MockRateLimitedSolanaRpcFactory";
|
|
3
|
+
export declare class MockRetrySolanaRpcFactory extends RetrySolanaRpcFactory {
|
|
4
|
+
constructor(mockRateLimitedSolanaRpcFactory: MockRateLimitedSolanaRpcFactory, ...retryConstructorParams: ConstructorParameters<typeof RetrySolanaRpcFactory>);
|
|
5
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { __extends } from "tslib";
|
|
2
|
+
import { RetrySolanaRpcFactory } from "..";
|
|
3
|
+
// Creates mocked retry Solana RPC factory by using the mocked rate limited Solana RPC factory.
|
|
4
|
+
var MockRetrySolanaRpcFactory = /** @class */ (function (_super) {
|
|
5
|
+
__extends(MockRetrySolanaRpcFactory, _super);
|
|
6
|
+
function MockRetrySolanaRpcFactory(mockRateLimitedSolanaRpcFactory) {
|
|
7
|
+
var retryConstructorParams = [];
|
|
8
|
+
for (var _i = 1; _i < arguments.length; _i++) {
|
|
9
|
+
retryConstructorParams[_i - 1] = arguments[_i];
|
|
10
|
+
}
|
|
11
|
+
var _this = _super.apply(this, retryConstructorParams) || this;
|
|
12
|
+
// Use the mock rate limited transport instead of creating a real one
|
|
13
|
+
_this.rateLimitedTransport = mockRateLimitedSolanaRpcFactory.createTransport();
|
|
14
|
+
_this.logger = mockRateLimitedSolanaRpcFactory.logger;
|
|
15
|
+
return _this;
|
|
16
|
+
}
|
|
17
|
+
return MockRetrySolanaRpcFactory;
|
|
18
|
+
}(RetrySolanaRpcFactory));
|
|
19
|
+
export { MockRetrySolanaRpcFactory };
|
|
20
|
+
//# sourceMappingURL=MockRetrySolanaRpcFactory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MockRetrySolanaRpcFactory.js","sourceRoot":"","sources":["../../../../src/providers/mocks/MockRetrySolanaRpcFactory.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,IAAI,CAAC;AAG3C,+FAA+F;AAC/F;IAA+C,6CAAqB;IAClE,mCACE,+BAAgE;QAChE,gCAA8E;aAA9E,UAA8E,EAA9E,qBAA8E,EAA9E,IAA8E;YAA9E,+CAA8E;;QAFhF,+BAIW,sBAAsB,UAKhC;QAHC,qEAAqE;QACrE,KAAI,CAAC,oBAAoB,GAAG,+BAA+B,CAAC,eAAe,EAAE,CAAC;QAC9E,KAAI,CAAC,MAAM,GAAG,+BAA+B,CAAC,MAAM,CAAC;;IACvD,CAAC;IACH,gCAAC;AAAD,CAAC,AAXD,CAA+C,qBAAqB,GAWnE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/providers/mocks/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC;AACrC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,mCAAmC,CAAC;AAClD,cAAc,wBAAwB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/providers/mocks/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC;AACrC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,mCAAmC,CAAC;AAClD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,wBAAwB,CAAC"}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { RpcTransport, RpcFromTransport, SolanaRpcApiFromTransport } from "@solana/kit";
|
|
2
2
|
import { CachingMechanismInterface } from "../../interfaces";
|
|
3
3
|
import { SolanaClusterRpcFactory } from "./baseRpcFactories";
|
|
4
|
-
import {
|
|
4
|
+
import { RetrySolanaRpcFactory } from "./retryRpcFactory";
|
|
5
5
|
export declare class CachedSolanaRpcFactory extends SolanaClusterRpcFactory {
|
|
6
6
|
readonly redisClient?: CachingMechanismInterface | undefined;
|
|
7
7
|
readonly getTransactionCachePrefix: string;
|
|
8
|
-
protected
|
|
9
|
-
protected
|
|
10
|
-
constructor(providerCacheNamespace: string, redisClient?: CachingMechanismInterface | undefined, ...
|
|
8
|
+
protected retryTransport: RpcTransport;
|
|
9
|
+
protected retryRpcClient: RpcFromTransport<SolanaRpcApiFromTransport<RpcTransport>, RpcTransport>;
|
|
10
|
+
constructor(providerCacheNamespace: string, redisClient?: CachingMechanismInterface | undefined, ...retryConstructorParams: ConstructorParameters<typeof RetrySolanaRpcFactory>);
|
|
11
11
|
createTransport(): RpcTransport;
|
|
12
12
|
private requestAndCacheFinalized;
|
|
13
13
|
private buildRedisKey;
|
|
@@ -2,25 +2,25 @@ import { __awaiter, __extends, __generator, __spreadArray } from "tslib";
|
|
|
2
2
|
import { getThrowSolanaErrorResponseTransformer } from "@solana/rpc-transformers";
|
|
3
3
|
import { is, object, optional, string, tuple } from "superstruct";
|
|
4
4
|
import { SolanaClusterRpcFactory } from "./baseRpcFactories";
|
|
5
|
-
import { RateLimitedSolanaRpcFactory } from "./rateLimitedRpcFactory";
|
|
6
5
|
import { CacheType } from "../utils";
|
|
7
6
|
import { jsonReplacerWithBigInts, jsonReviverWithBigInts } from "../../utils";
|
|
7
|
+
import { RetrySolanaRpcFactory } from "./retryRpcFactory";
|
|
8
8
|
var CachedSolanaRpcFactory = /** @class */ (function (_super) {
|
|
9
9
|
__extends(CachedSolanaRpcFactory, _super);
|
|
10
10
|
function CachedSolanaRpcFactory(providerCacheNamespace, redisClient) {
|
|
11
11
|
var _this = this;
|
|
12
|
-
var
|
|
12
|
+
var retryConstructorParams = [];
|
|
13
13
|
for (var _i = 2; _i < arguments.length; _i++) {
|
|
14
|
-
|
|
14
|
+
retryConstructorParams[_i - 2] = arguments[_i];
|
|
15
15
|
}
|
|
16
|
-
// SolanaClusterRpcFactory shares the last two constructor parameters with
|
|
17
|
-
var superParams =
|
|
16
|
+
// SolanaClusterRpcFactory shares the last two constructor parameters with RetryRpcFactory.
|
|
17
|
+
var superParams = retryConstructorParams.slice(-2);
|
|
18
18
|
_this = _super.apply(this, superParams) || this;
|
|
19
19
|
_this.redisClient = redisClient;
|
|
20
20
|
// Create the rate limited transport and RPC client.
|
|
21
|
-
var
|
|
22
|
-
_this.
|
|
23
|
-
_this.
|
|
21
|
+
var retryRpcFactory = new (RetrySolanaRpcFactory.bind.apply(RetrySolanaRpcFactory, __spreadArray([void 0], retryConstructorParams, false)))();
|
|
22
|
+
_this.retryTransport = retryRpcFactory.createTransport();
|
|
23
|
+
_this.retryRpcClient = retryRpcFactory.createRpcClient();
|
|
24
24
|
// Pre-compute as much of the redis key as possible.
|
|
25
25
|
var cachePrefix = "".concat(providerCacheNamespace, ",").concat(new URL(_this.clusterUrl).hostname, ",").concat(_this.chainId);
|
|
26
26
|
_this.getTransactionCachePrefix = "".concat(cachePrefix, ":getTransaction,");
|
|
@@ -42,7 +42,7 @@ var CachedSolanaRpcFactory = /** @class */ (function (_super) {
|
|
|
42
42
|
_a = args[0].payload, method = _a.method, params = _a.params;
|
|
43
43
|
cacheType = this.redisClient ? this.cacheType(method) : CacheType.NONE;
|
|
44
44
|
if (cacheType === CacheType.NONE) {
|
|
45
|
-
return [2 /*return*/, this.
|
|
45
|
+
return [2 /*return*/, this.retryTransport.apply(this, args)];
|
|
46
46
|
}
|
|
47
47
|
redisKey = this.buildRedisKey(method, params);
|
|
48
48
|
return [4 /*yield*/, ((_b = this.redisClient) === null || _b === void 0 ? void 0 : _b.get(redisKey))];
|
|
@@ -73,14 +73,14 @@ var CachedSolanaRpcFactory = /** @class */ (function (_super) {
|
|
|
73
73
|
_c = args[0].payload, method = _c.method, params = _c.params;
|
|
74
74
|
// Only handles getTransaction right now.
|
|
75
75
|
if (method !== "getTransaction")
|
|
76
|
-
return [2 /*return*/, this.
|
|
76
|
+
return [2 /*return*/, this.retryTransport.apply(this, args)];
|
|
77
77
|
// Do not throw if params are not valid, just skip caching and pass through to the underlying transport.
|
|
78
78
|
if (!this.isGetTransactionParams(params))
|
|
79
|
-
return [2 /*return*/, this.
|
|
79
|
+
return [2 /*return*/, this.retryTransport.apply(this, args)];
|
|
80
80
|
_d.label = 1;
|
|
81
81
|
case 1:
|
|
82
82
|
_d.trys.push([1, 3, , 4]);
|
|
83
|
-
return [4 /*yield*/, this.
|
|
83
|
+
return [4 /*yield*/, this.retryRpcClient
|
|
84
84
|
.getSignatureStatuses([params[0]], {
|
|
85
85
|
searchTransactionHistory: true,
|
|
86
86
|
})
|
|
@@ -88,13 +88,13 @@ var CachedSolanaRpcFactory = /** @class */ (function (_super) {
|
|
|
88
88
|
case 2:
|
|
89
89
|
getSignatureStatusesResponse = _d.sent();
|
|
90
90
|
if (((_a = getSignatureStatusesResponse.value[0]) === null || _a === void 0 ? void 0 : _a.confirmationStatus) !== "finalized") {
|
|
91
|
-
return [2 /*return*/, this.
|
|
91
|
+
return [2 /*return*/, this.retryTransport.apply(this, args)];
|
|
92
92
|
}
|
|
93
93
|
return [3 /*break*/, 4];
|
|
94
94
|
case 3:
|
|
95
95
|
error_1 = _d.sent();
|
|
96
|
-
return [2 /*return*/, this.
|
|
97
|
-
case 4: return [4 /*yield*/, this.
|
|
96
|
+
return [2 /*return*/, this.retryTransport.apply(this, args)];
|
|
97
|
+
case 4: return [4 /*yield*/, this.retryTransport.apply(this, args)];
|
|
98
98
|
case 5:
|
|
99
99
|
getTransactionResponse = _d.sent();
|
|
100
100
|
// Do not cache JSON-RPC error responses, let them pass through for the RPC client to handle.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cachedRpcFactory.js","sourceRoot":"","sources":["../../../../src/providers/solana/cachedRpcFactory.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,sCAAsC,EAAE,MAAM,0BAA0B,CAAC;AAClF,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAElE,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"cachedRpcFactory.js","sourceRoot":"","sources":["../../../../src/providers/solana/cachedRpcFactory.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/providers/solana/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,yBAAyB,CAAC;AACxC,cAAc,SAAS,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/providers/solana/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,yBAAyB,CAAC;AACxC,cAAc,mBAAmB,CAAC;AAClC,cAAc,SAAS,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { RpcTransport } from "@solana/kit";
|
|
2
|
+
import { SolanaClusterRpcFactory } from "./baseRpcFactories";
|
|
3
|
+
import { RateLimitedSolanaRpcFactory } from "./rateLimitedRpcFactory";
|
|
4
|
+
import { Logger } from "winston";
|
|
5
|
+
export declare class RetrySolanaRpcFactory extends SolanaClusterRpcFactory {
|
|
6
|
+
readonly retries: number;
|
|
7
|
+
readonly retryDelaySeconds: number;
|
|
8
|
+
protected rateLimitedTransport: RpcTransport;
|
|
9
|
+
protected logger: Logger;
|
|
10
|
+
constructor(retries: number, retryDelaySeconds: number, ...rateLimitedConstructorParams: ConstructorParameters<typeof RateLimitedSolanaRpcFactory>);
|
|
11
|
+
createTransport(): RpcTransport;
|
|
12
|
+
/**
|
|
13
|
+
* Retry wrapper for transport calls with Solana-specific error handling.
|
|
14
|
+
* @param transportCall Function that makes the transport call
|
|
15
|
+
* @param args Original transport arguments for logging
|
|
16
|
+
* @returns Promise that resolves to the transport response
|
|
17
|
+
*/
|
|
18
|
+
private _tryCall;
|
|
19
|
+
/**
|
|
20
|
+
* Determine whether a Solana RPC error indicates an unrecoverable error that should not be retried.
|
|
21
|
+
* @param method RPC method name
|
|
22
|
+
* @param error Error object from the RPC call
|
|
23
|
+
* @returns True if the request should be aborted immediately, otherwise false
|
|
24
|
+
*/
|
|
25
|
+
private shouldFailImmediate;
|
|
26
|
+
}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { __awaiter, __extends, __generator, __spreadArray } from "tslib";
|
|
2
|
+
import { SolanaClusterRpcFactory } from "./baseRpcFactories";
|
|
3
|
+
import { RateLimitedSolanaRpcFactory } from "./rateLimitedRpcFactory";
|
|
4
|
+
import { delay } from "../../utils";
|
|
5
|
+
import { getOriginFromURL } from "../../utils/NetworkUtils";
|
|
6
|
+
// This factory adds retry logic on top of the RateLimitedSolanaRpcFactory.
|
|
7
|
+
// It follows the same composition pattern as other factories in this module.
|
|
8
|
+
var RetrySolanaRpcFactory = /** @class */ (function (_super) {
|
|
9
|
+
__extends(RetrySolanaRpcFactory, _super);
|
|
10
|
+
function RetrySolanaRpcFactory(retries, retryDelaySeconds) {
|
|
11
|
+
var _this = this;
|
|
12
|
+
var rateLimitedConstructorParams = [];
|
|
13
|
+
for (var _i = 2; _i < arguments.length; _i++) {
|
|
14
|
+
rateLimitedConstructorParams[_i - 2] = arguments[_i];
|
|
15
|
+
}
|
|
16
|
+
// SolanaClusterRpcFactory shares the last two constructor parameters with RateLimitedSolanaRpcFactory.
|
|
17
|
+
var superParams = rateLimitedConstructorParams.slice(-2);
|
|
18
|
+
_this = _super.apply(this, superParams) || this;
|
|
19
|
+
_this.retries = retries;
|
|
20
|
+
_this.retryDelaySeconds = retryDelaySeconds;
|
|
21
|
+
// Validate retry configuration
|
|
22
|
+
if (_this.retries < 0 || !Number.isInteger(_this.retries)) {
|
|
23
|
+
throw new Error("retries cannot be < 0 and must be an integer. Currently set to ".concat(_this.retries));
|
|
24
|
+
}
|
|
25
|
+
if (_this.retryDelaySeconds < 0) {
|
|
26
|
+
throw new Error("retryDelaySeconds cannot be < 0. Currently set to ".concat(_this.retryDelaySeconds));
|
|
27
|
+
}
|
|
28
|
+
// Create the rate limited transport.
|
|
29
|
+
var rateLimitedRpcFactory = new (RateLimitedSolanaRpcFactory.bind.apply(RateLimitedSolanaRpcFactory, __spreadArray([void 0], rateLimitedConstructorParams, false)))();
|
|
30
|
+
_this.rateLimitedTransport = rateLimitedRpcFactory.createTransport();
|
|
31
|
+
_this.logger = rateLimitedRpcFactory.logger;
|
|
32
|
+
return _this;
|
|
33
|
+
}
|
|
34
|
+
RetrySolanaRpcFactory.prototype.createTransport = function () {
|
|
35
|
+
var _this = this;
|
|
36
|
+
return function () {
|
|
37
|
+
var args = [];
|
|
38
|
+
for (var _i = 0; _i < arguments.length; _i++) {
|
|
39
|
+
args[_i] = arguments[_i];
|
|
40
|
+
}
|
|
41
|
+
return _this._tryCall(function () { return _this.rateLimitedTransport.apply(_this, args); }, args);
|
|
42
|
+
};
|
|
43
|
+
};
|
|
44
|
+
/**
|
|
45
|
+
* Retry wrapper for transport calls with Solana-specific error handling.
|
|
46
|
+
* @param transportCall Function that makes the transport call
|
|
47
|
+
* @param args Original transport arguments for logging
|
|
48
|
+
* @returns Promise that resolves to the transport response
|
|
49
|
+
*/
|
|
50
|
+
RetrySolanaRpcFactory.prototype._tryCall = function (transportCall, args) {
|
|
51
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
52
|
+
var method, retries, error_1;
|
|
53
|
+
return __generator(this, function (_a) {
|
|
54
|
+
switch (_a.label) {
|
|
55
|
+
case 0:
|
|
56
|
+
method = args[0].payload.method;
|
|
57
|
+
retries = this.retries;
|
|
58
|
+
_a.label = 1;
|
|
59
|
+
case 1:
|
|
60
|
+
if (!true) return [3 /*break*/, 7];
|
|
61
|
+
_a.label = 2;
|
|
62
|
+
case 2:
|
|
63
|
+
_a.trys.push([2, 4, , 6]);
|
|
64
|
+
return [4 /*yield*/, transportCall()];
|
|
65
|
+
case 3: return [2 /*return*/, _a.sent()];
|
|
66
|
+
case 4:
|
|
67
|
+
error_1 = _a.sent();
|
|
68
|
+
if (retries-- <= 0 || this.shouldFailImmediate(method, error_1)) {
|
|
69
|
+
throw error_1;
|
|
70
|
+
}
|
|
71
|
+
// Log retry attempt if logger is available
|
|
72
|
+
this.logger.debug({
|
|
73
|
+
at: "RetryRpcFactory",
|
|
74
|
+
message: "Retrying Solana RPC call",
|
|
75
|
+
provider: getOriginFromURL(this.clusterUrl),
|
|
76
|
+
method: method,
|
|
77
|
+
retryAttempt: this.retries - retries,
|
|
78
|
+
retryDelaySeconds: this.retryDelaySeconds,
|
|
79
|
+
error: error_1 === null || error_1 === void 0 ? void 0 : error_1.toString(),
|
|
80
|
+
});
|
|
81
|
+
return [4 /*yield*/, delay(this.retryDelaySeconds)];
|
|
82
|
+
case 5:
|
|
83
|
+
_a.sent();
|
|
84
|
+
return [3 /*break*/, 6];
|
|
85
|
+
case 6: return [3 /*break*/, 1];
|
|
86
|
+
case 7: return [2 /*return*/];
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
};
|
|
91
|
+
/**
|
|
92
|
+
* Determine whether a Solana RPC error indicates an unrecoverable error that should not be retried.
|
|
93
|
+
* @param method RPC method name
|
|
94
|
+
* @param error Error object from the RPC call
|
|
95
|
+
* @returns True if the request should be aborted immediately, otherwise false
|
|
96
|
+
*/
|
|
97
|
+
RetrySolanaRpcFactory.prototype.shouldFailImmediate = function (_method, _error) {
|
|
98
|
+
// TODO: Decide which Solana RPC errors should be considered non-transitory and should not be retried.
|
|
99
|
+
// For now, retry all errors.
|
|
100
|
+
return false;
|
|
101
|
+
};
|
|
102
|
+
return RetrySolanaRpcFactory;
|
|
103
|
+
}(SolanaClusterRpcFactory));
|
|
104
|
+
export { RetrySolanaRpcFactory };
|
|
105
|
+
//# sourceMappingURL=retryRpcFactory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retryRpcFactory.js","sourceRoot":"","sources":["../../../../src/providers/solana/retryRpcFactory.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { CachedSolanaRpcFactory } from "..";
|
|
2
|
-
import {
|
|
2
|
+
import { MockRetrySolanaRpcFactory } from "./MockRetrySolanaRpcFactory";
|
|
3
3
|
export declare class MockCachedSolanaRpcFactory extends CachedSolanaRpcFactory {
|
|
4
|
-
constructor(
|
|
4
|
+
constructor(mockRetrySolanaRpcFactory: MockRetrySolanaRpcFactory, ...cachedConstructorParams: ConstructorParameters<typeof CachedSolanaRpcFactory>);
|
|
5
5
|
}
|
|
6
6
|
//# sourceMappingURL=MockCachedSolanaRpcFactory.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MockCachedSolanaRpcFactory.d.ts","sourceRoot":"","sources":["../../../../src/providers/mocks/MockCachedSolanaRpcFactory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,IAAI,CAAC;AAC5C,OAAO,EAAE
|
|
1
|
+
{"version":3,"file":"MockCachedSolanaRpcFactory.d.ts","sourceRoot":"","sources":["../../../../src/providers/mocks/MockCachedSolanaRpcFactory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,IAAI,CAAC;AAC5C,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AAGxE,qBAAa,0BAA2B,SAAQ,sBAAsB;gBAElE,yBAAyB,EAAE,yBAAyB,EACpD,GAAG,uBAAuB,EAAE,qBAAqB,CAAC,OAAO,sBAAsB,CAAC;CAOnF"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { RetrySolanaRpcFactory } from "..";
|
|
2
|
+
import { MockRateLimitedSolanaRpcFactory } from "./MockRateLimitedSolanaRpcFactory";
|
|
3
|
+
export declare class MockRetrySolanaRpcFactory extends RetrySolanaRpcFactory {
|
|
4
|
+
constructor(mockRateLimitedSolanaRpcFactory: MockRateLimitedSolanaRpcFactory, ...retryConstructorParams: ConstructorParameters<typeof RetrySolanaRpcFactory>);
|
|
5
|
+
}
|
|
6
|
+
//# sourceMappingURL=MockRetrySolanaRpcFactory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MockRetrySolanaRpcFactory.d.ts","sourceRoot":"","sources":["../../../../src/providers/mocks/MockRetrySolanaRpcFactory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,IAAI,CAAC;AAC3C,OAAO,EAAE,+BAA+B,EAAE,MAAM,mCAAmC,CAAC;AAGpF,qBAAa,yBAA0B,SAAQ,qBAAqB;gBAEhE,+BAA+B,EAAE,+BAA+B,EAChE,GAAG,sBAAsB,EAAE,qBAAqB,CAAC,OAAO,qBAAqB,CAAC;CAQjF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/providers/mocks/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC;AACrC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,mCAAmC,CAAC;AAClD,cAAc,wBAAwB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/providers/mocks/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC;AACrC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,mCAAmC,CAAC;AAClD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,wBAAwB,CAAC"}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { RpcTransport, RpcFromTransport, SolanaRpcApiFromTransport } from "@solana/kit";
|
|
2
2
|
import { CachingMechanismInterface } from "../../interfaces";
|
|
3
3
|
import { SolanaClusterRpcFactory } from "./baseRpcFactories";
|
|
4
|
-
import {
|
|
4
|
+
import { RetrySolanaRpcFactory } from "./retryRpcFactory";
|
|
5
5
|
export declare class CachedSolanaRpcFactory extends SolanaClusterRpcFactory {
|
|
6
6
|
readonly redisClient?: CachingMechanismInterface | undefined;
|
|
7
7
|
readonly getTransactionCachePrefix: string;
|
|
8
|
-
protected
|
|
9
|
-
protected
|
|
10
|
-
constructor(providerCacheNamespace: string, redisClient?: CachingMechanismInterface | undefined, ...
|
|
8
|
+
protected retryTransport: RpcTransport;
|
|
9
|
+
protected retryRpcClient: RpcFromTransport<SolanaRpcApiFromTransport<RpcTransport>, RpcTransport>;
|
|
10
|
+
constructor(providerCacheNamespace: string, redisClient?: CachingMechanismInterface | undefined, ...retryConstructorParams: ConstructorParameters<typeof RetrySolanaRpcFactory>);
|
|
11
11
|
createTransport(): RpcTransport;
|
|
12
12
|
private requestAndCacheFinalized;
|
|
13
13
|
private buildRedisKey;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cachedRpcFactory.d.ts","sourceRoot":"","sources":["../../../../src/providers/solana/cachedRpcFactory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAqB,gBAAgB,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAG3G,OAAO,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"cachedRpcFactory.d.ts","sourceRoot":"","sources":["../../../../src/providers/solana/cachedRpcFactory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAqB,gBAAgB,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAG3G,OAAO,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAG7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAE1D,qBAAa,sBAAuB,SAAQ,uBAAuB;IAW/D,QAAQ,CAAC,WAAW,CAAC;IAVvB,SAAgB,yBAAyB,EAAE,MAAM,CAAC;IAGlD,SAAS,CAAC,cAAc,EAAE,YAAY,CAAC;IAGvC,SAAS,CAAC,cAAc,EAAE,gBAAgB,CAAC,yBAAyB,CAAC,YAAY,CAAC,EAAE,YAAY,CAAC,CAAC;gBAGhG,sBAAsB,EAAE,MAAM,EACrB,WAAW,CAAC,uCAA2B,EAChD,GAAG,sBAAsB,EAAE,qBAAqB,CAAC,OAAO,qBAAqB,CAAC;IAmBzE,eAAe,IAAI,YAAY;YAwBxB,wBAAwB;IA4CtC,OAAO,CAAC,aAAa;IAUrB,OAAO,CAAC,SAAS;IAUjB,OAAO,CAAC,sBAAsB;CAS/B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/providers/solana/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,yBAAyB,CAAC;AACxC,cAAc,SAAS,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/providers/solana/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,yBAAyB,CAAC;AACxC,cAAc,mBAAmB,CAAC;AAClC,cAAc,SAAS,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { RpcTransport } from "@solana/kit";
|
|
2
|
+
import { SolanaClusterRpcFactory } from "./baseRpcFactories";
|
|
3
|
+
import { RateLimitedSolanaRpcFactory } from "./rateLimitedRpcFactory";
|
|
4
|
+
import { Logger } from "winston";
|
|
5
|
+
export declare class RetrySolanaRpcFactory extends SolanaClusterRpcFactory {
|
|
6
|
+
readonly retries: number;
|
|
7
|
+
readonly retryDelaySeconds: number;
|
|
8
|
+
protected rateLimitedTransport: RpcTransport;
|
|
9
|
+
protected logger: Logger;
|
|
10
|
+
constructor(retries: number, retryDelaySeconds: number, ...rateLimitedConstructorParams: ConstructorParameters<typeof RateLimitedSolanaRpcFactory>);
|
|
11
|
+
createTransport(): RpcTransport;
|
|
12
|
+
/**
|
|
13
|
+
* Retry wrapper for transport calls with Solana-specific error handling.
|
|
14
|
+
* @param transportCall Function that makes the transport call
|
|
15
|
+
* @param args Original transport arguments for logging
|
|
16
|
+
* @returns Promise that resolves to the transport response
|
|
17
|
+
*/
|
|
18
|
+
private _tryCall;
|
|
19
|
+
/**
|
|
20
|
+
* Determine whether a Solana RPC error indicates an unrecoverable error that should not be retried.
|
|
21
|
+
* @param method RPC method name
|
|
22
|
+
* @param error Error object from the RPC call
|
|
23
|
+
* @returns True if the request should be aborted immediately, otherwise false
|
|
24
|
+
*/
|
|
25
|
+
private shouldFailImmediate;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=retryRpcFactory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retryRpcFactory.d.ts","sourceRoot":"","sources":["../../../../src/providers/solana/retryRpcFactory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAE,2BAA2B,EAAE,MAAM,yBAAyB,CAAC;AAGtE,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAIjC,qBAAa,qBAAsB,SAAQ,uBAAuB;IAO9D,QAAQ,CAAC,OAAO,EAAE,MAAM;IACxB,QAAQ,CAAC,iBAAiB,EAAE,MAAM;IANpC,SAAS,CAAC,oBAAoB,EAAE,YAAY,CAAC;IAE7C,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC;gBAGd,OAAO,EAAE,MAAM,EACf,iBAAiB,EAAE,MAAM,EAClC,GAAG,4BAA4B,EAAE,qBAAqB,CAAC,OAAO,2BAA2B,CAAC;IAuBrF,eAAe,IAAI,YAAY;IAMtC;;;;;OAKG;YACW,QAAQ;IAgCtB;;;;;OAKG;IACH,OAAO,CAAC,mBAAmB;CAK5B"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@across-protocol/sdk",
|
|
3
3
|
"author": "UMA Team",
|
|
4
|
-
"version": "4.3.
|
|
4
|
+
"version": "4.3.20",
|
|
5
5
|
"license": "AGPL-3.0",
|
|
6
6
|
"homepage": "https://docs.across.to/reference/sdk",
|
|
7
7
|
"files": [
|
|
@@ -72,6 +72,7 @@
|
|
|
72
72
|
"arlocal": "^1.1.65",
|
|
73
73
|
"chai": "^4.3.8",
|
|
74
74
|
"chai-exclude": "^2.1.0",
|
|
75
|
+
"commander": "^14.0.0",
|
|
75
76
|
"concurrently": "^9.1.2",
|
|
76
77
|
"dotenv": "^16.0.0",
|
|
77
78
|
"eslint": "^8.49.0",
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import { CachedSolanaRpcFactory } from "..";
|
|
2
|
-
import {
|
|
2
|
+
import { MockRetrySolanaRpcFactory } from "./MockRetrySolanaRpcFactory";
|
|
3
3
|
|
|
4
|
-
// Creates mocked cached Solana RPC factory by using the mocked Solana RPC factory.
|
|
4
|
+
// Creates mocked cached Solana RPC factory by using the mocked retry Solana RPC factory.
|
|
5
5
|
export class MockCachedSolanaRpcFactory extends CachedSolanaRpcFactory {
|
|
6
6
|
constructor(
|
|
7
|
-
|
|
7
|
+
mockRetrySolanaRpcFactory: MockRetrySolanaRpcFactory,
|
|
8
8
|
...cachedConstructorParams: ConstructorParameters<typeof CachedSolanaRpcFactory>
|
|
9
9
|
) {
|
|
10
10
|
super(...cachedConstructorParams);
|
|
11
11
|
|
|
12
|
-
this.
|
|
13
|
-
this.
|
|
12
|
+
this.retryTransport = mockRetrySolanaRpcFactory.createTransport();
|
|
13
|
+
this.retryRpcClient = mockRetrySolanaRpcFactory.createRpcClient();
|
|
14
14
|
}
|
|
15
15
|
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { RetrySolanaRpcFactory } from "..";
|
|
2
|
+
import { MockRateLimitedSolanaRpcFactory } from "./MockRateLimitedSolanaRpcFactory";
|
|
3
|
+
|
|
4
|
+
// Creates mocked retry Solana RPC factory by using the mocked rate limited Solana RPC factory.
|
|
5
|
+
export class MockRetrySolanaRpcFactory extends RetrySolanaRpcFactory {
|
|
6
|
+
constructor(
|
|
7
|
+
mockRateLimitedSolanaRpcFactory: MockRateLimitedSolanaRpcFactory,
|
|
8
|
+
...retryConstructorParams: ConstructorParameters<typeof RetrySolanaRpcFactory>
|
|
9
|
+
) {
|
|
10
|
+
super(...retryConstructorParams);
|
|
11
|
+
|
|
12
|
+
// Use the mock rate limited transport instead of creating a real one
|
|
13
|
+
this.rateLimitedTransport = mockRateLimitedSolanaRpcFactory.createTransport();
|
|
14
|
+
this.logger = mockRateLimitedSolanaRpcFactory.logger;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
@@ -3,35 +3,35 @@ import { getThrowSolanaErrorResponseTransformer } from "@solana/rpc-transformers
|
|
|
3
3
|
import { is, object, optional, string, tuple } from "superstruct";
|
|
4
4
|
import { CachingMechanismInterface } from "../../interfaces";
|
|
5
5
|
import { SolanaClusterRpcFactory } from "./baseRpcFactories";
|
|
6
|
-
import { RateLimitedSolanaRpcFactory } from "./rateLimitedRpcFactory";
|
|
7
6
|
import { CacheType } from "../utils";
|
|
8
7
|
import { jsonReplacerWithBigInts, jsonReviverWithBigInts } from "../../utils";
|
|
8
|
+
import { RetrySolanaRpcFactory } from "./retryRpcFactory";
|
|
9
9
|
|
|
10
10
|
export class CachedSolanaRpcFactory extends SolanaClusterRpcFactory {
|
|
11
11
|
public readonly getTransactionCachePrefix: string;
|
|
12
12
|
|
|
13
13
|
// Holds the underlying transport that the cached transport wraps.
|
|
14
|
-
protected
|
|
14
|
+
protected retryTransport: RpcTransport;
|
|
15
15
|
|
|
16
|
-
// RPC client based on the
|
|
17
|
-
protected
|
|
16
|
+
// RPC client based on the retry transport, used internally to check confirmation status.
|
|
17
|
+
protected retryRpcClient: RpcFromTransport<SolanaRpcApiFromTransport<RpcTransport>, RpcTransport>;
|
|
18
18
|
|
|
19
19
|
constructor(
|
|
20
20
|
providerCacheNamespace: string,
|
|
21
21
|
readonly redisClient?: CachingMechanismInterface,
|
|
22
|
-
...
|
|
22
|
+
...retryConstructorParams: ConstructorParameters<typeof RetrySolanaRpcFactory>
|
|
23
23
|
) {
|
|
24
|
-
// SolanaClusterRpcFactory shares the last two constructor parameters with
|
|
25
|
-
const superParams =
|
|
24
|
+
// SolanaClusterRpcFactory shares the last two constructor parameters with RetryRpcFactory.
|
|
25
|
+
const superParams = retryConstructorParams.slice(-2) as [
|
|
26
26
|
ConstructorParameters<typeof SolanaClusterRpcFactory>[0], // clusterUrl: ClusterUrl
|
|
27
27
|
ConstructorParameters<typeof SolanaClusterRpcFactory>[1], // chainId: number
|
|
28
28
|
];
|
|
29
29
|
super(...superParams);
|
|
30
30
|
|
|
31
31
|
// Create the rate limited transport and RPC client.
|
|
32
|
-
const
|
|
33
|
-
this.
|
|
34
|
-
this.
|
|
32
|
+
const retryRpcFactory = new RetrySolanaRpcFactory(...retryConstructorParams);
|
|
33
|
+
this.retryTransport = retryRpcFactory.createTransport();
|
|
34
|
+
this.retryRpcClient = retryRpcFactory.createRpcClient();
|
|
35
35
|
|
|
36
36
|
// Pre-compute as much of the redis key as possible.
|
|
37
37
|
const cachePrefix = `${providerCacheNamespace},${new URL(this.clusterUrl).hostname},${this.chainId}`;
|
|
@@ -44,7 +44,7 @@ export class CachedSolanaRpcFactory extends SolanaClusterRpcFactory {
|
|
|
44
44
|
const cacheType = this.redisClient ? this.cacheType(method) : CacheType.NONE;
|
|
45
45
|
|
|
46
46
|
if (cacheType === CacheType.NONE) {
|
|
47
|
-
return this.
|
|
47
|
+
return this.retryTransport<TResponse>(...args);
|
|
48
48
|
}
|
|
49
49
|
|
|
50
50
|
const redisKey = this.buildRedisKey(method, params);
|
|
@@ -66,27 +66,27 @@ export class CachedSolanaRpcFactory extends SolanaClusterRpcFactory {
|
|
|
66
66
|
const { method, params } = args[0].payload as { method: string; params?: unknown[] };
|
|
67
67
|
|
|
68
68
|
// Only handles getTransaction right now.
|
|
69
|
-
if (method !== "getTransaction") return this.
|
|
69
|
+
if (method !== "getTransaction") return this.retryTransport<TResponse>(...args);
|
|
70
70
|
|
|
71
71
|
// Do not throw if params are not valid, just skip caching and pass through to the underlying transport.
|
|
72
|
-
if (!this.isGetTransactionParams(params)) return this.
|
|
72
|
+
if (!this.isGetTransactionParams(params)) return this.retryTransport<TResponse>(...args);
|
|
73
73
|
|
|
74
74
|
// Check the confirmation status first to avoid caching non-finalized transactions. In case of null or errors just
|
|
75
75
|
// skip caching and pass through to the underlying transport.
|
|
76
76
|
try {
|
|
77
|
-
const getSignatureStatusesResponse = await this.
|
|
77
|
+
const getSignatureStatusesResponse = await this.retryRpcClient
|
|
78
78
|
.getSignatureStatuses([params[0]], {
|
|
79
79
|
searchTransactionHistory: true,
|
|
80
80
|
})
|
|
81
81
|
.send();
|
|
82
82
|
if (getSignatureStatusesResponse.value[0]?.confirmationStatus !== "finalized") {
|
|
83
|
-
return this.
|
|
83
|
+
return this.retryTransport<TResponse>(...args);
|
|
84
84
|
}
|
|
85
85
|
} catch (error) {
|
|
86
|
-
return this.
|
|
86
|
+
return this.retryTransport<TResponse>(...args);
|
|
87
87
|
}
|
|
88
88
|
|
|
89
|
-
const getTransactionResponse = await this.
|
|
89
|
+
const getTransactionResponse = await this.retryTransport<TResponse>(...args);
|
|
90
90
|
|
|
91
91
|
// Do not cache JSON-RPC error responses, let them pass through for the RPC client to handle.
|
|
92
92
|
try {
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { RpcTransport } from "@solana/kit";
|
|
2
|
+
import { SolanaClusterRpcFactory } from "./baseRpcFactories";
|
|
3
|
+
import { RateLimitedSolanaRpcFactory } from "./rateLimitedRpcFactory";
|
|
4
|
+
import { delay } from "../../utils";
|
|
5
|
+
import { getOriginFromURL } from "../../utils/NetworkUtils";
|
|
6
|
+
import { Logger } from "winston";
|
|
7
|
+
|
|
8
|
+
// This factory adds retry logic on top of the RateLimitedSolanaRpcFactory.
|
|
9
|
+
// It follows the same composition pattern as other factories in this module.
|
|
10
|
+
export class RetrySolanaRpcFactory extends SolanaClusterRpcFactory {
|
|
11
|
+
// Holds the underlying transport that the retry wrapper wraps.
|
|
12
|
+
protected rateLimitedTransport: RpcTransport;
|
|
13
|
+
|
|
14
|
+
protected logger: Logger;
|
|
15
|
+
|
|
16
|
+
constructor(
|
|
17
|
+
readonly retries: number,
|
|
18
|
+
readonly retryDelaySeconds: number,
|
|
19
|
+
...rateLimitedConstructorParams: ConstructorParameters<typeof RateLimitedSolanaRpcFactory>
|
|
20
|
+
) {
|
|
21
|
+
// SolanaClusterRpcFactory shares the last two constructor parameters with RateLimitedSolanaRpcFactory.
|
|
22
|
+
const superParams = rateLimitedConstructorParams.slice(-2) as [
|
|
23
|
+
ConstructorParameters<typeof SolanaClusterRpcFactory>[0], // clusterUrl: ClusterUrl
|
|
24
|
+
ConstructorParameters<typeof SolanaClusterRpcFactory>[1], // chainId: number
|
|
25
|
+
];
|
|
26
|
+
super(...superParams);
|
|
27
|
+
|
|
28
|
+
// Validate retry configuration
|
|
29
|
+
if (this.retries < 0 || !Number.isInteger(this.retries)) {
|
|
30
|
+
throw new Error(`retries cannot be < 0 and must be an integer. Currently set to ${this.retries}`);
|
|
31
|
+
}
|
|
32
|
+
if (this.retryDelaySeconds < 0) {
|
|
33
|
+
throw new Error(`retryDelaySeconds cannot be < 0. Currently set to ${this.retryDelaySeconds}`);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// Create the rate limited transport.
|
|
37
|
+
const rateLimitedRpcFactory = new RateLimitedSolanaRpcFactory(...rateLimitedConstructorParams);
|
|
38
|
+
this.rateLimitedTransport = rateLimitedRpcFactory.createTransport();
|
|
39
|
+
this.logger = rateLimitedRpcFactory.logger;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
public createTransport(): RpcTransport {
|
|
43
|
+
return <TResponse>(...args: Parameters<RpcTransport>): Promise<TResponse> => {
|
|
44
|
+
return this._tryCall(() => this.rateLimitedTransport<TResponse>(...args), args);
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Retry wrapper for transport calls with Solana-specific error handling.
|
|
50
|
+
* @param transportCall Function that makes the transport call
|
|
51
|
+
* @param args Original transport arguments for logging
|
|
52
|
+
* @returns Promise that resolves to the transport response
|
|
53
|
+
*/
|
|
54
|
+
private async _tryCall<TResponse>(
|
|
55
|
+
transportCall: () => Promise<TResponse>,
|
|
56
|
+
args: Parameters<RpcTransport>
|
|
57
|
+
): Promise<TResponse> {
|
|
58
|
+
const { method } = args[0].payload as { method: string; params?: unknown[] };
|
|
59
|
+
let retries = this.retries;
|
|
60
|
+
|
|
61
|
+
// eslint-disable-next-line no-constant-condition
|
|
62
|
+
while (true) {
|
|
63
|
+
try {
|
|
64
|
+
return await transportCall();
|
|
65
|
+
} catch (error) {
|
|
66
|
+
if (retries-- <= 0 || this.shouldFailImmediate(method, error)) {
|
|
67
|
+
throw error;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// Log retry attempt if logger is available
|
|
71
|
+
this.logger.debug({
|
|
72
|
+
at: "RetryRpcFactory",
|
|
73
|
+
message: "Retrying Solana RPC call",
|
|
74
|
+
provider: getOriginFromURL(this.clusterUrl),
|
|
75
|
+
method,
|
|
76
|
+
retryAttempt: this.retries - retries,
|
|
77
|
+
retryDelaySeconds: this.retryDelaySeconds,
|
|
78
|
+
error: error?.toString(),
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
await delay(this.retryDelaySeconds);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Determine whether a Solana RPC error indicates an unrecoverable error that should not be retried.
|
|
88
|
+
* @param method RPC method name
|
|
89
|
+
* @param error Error object from the RPC call
|
|
90
|
+
* @returns True if the request should be aborted immediately, otherwise false
|
|
91
|
+
*/
|
|
92
|
+
private shouldFailImmediate(_method: string, _error: unknown): boolean {
|
|
93
|
+
// TODO: Decide which Solana RPC errors should be considered non-transitory and should not be retried.
|
|
94
|
+
// For now, retry all errors.
|
|
95
|
+
return false;
|
|
96
|
+
}
|
|
97
|
+
}
|