From 7a9065b4da0f286f71cc84eae346f46c9022f6a7 Mon Sep 17 00:00:00 2001 From: Arseny Mitin Date: Tue, 8 Aug 2023 15:49:02 +0300 Subject: [PATCH 1/4] feat: createRetryOnRateLimitMiddleware --- src/index.ts | 1 + src/retryOnRateLimit.ts | 23 +++++++++++++++++++++++ 2 files changed, 24 insertions(+) create mode 100644 src/retryOnRateLimit.ts diff --git a/src/index.ts b/src/index.ts index 80efdcd0..967102d7 100644 --- a/src/index.ts +++ b/src/index.ts @@ -6,4 +6,5 @@ export * from './fetch'; export * from './inflight-cache'; export * from './providerAsMiddleware'; export * from './retryOnEmpty'; +export * from './retryOnRateLimit'; export * from './wallet'; diff --git a/src/retryOnRateLimit.ts b/src/retryOnRateLimit.ts new file mode 100644 index 00000000..89a477b7 --- /dev/null +++ b/src/retryOnRateLimit.ts @@ -0,0 +1,23 @@ +import type { JsonRpcError, errorCodes } from 'rpc-errors'; +import { JsonRpcMiddleware, createAsyncMiddleware } from 'json-rpc-engine'; +import { timeout } from './utils/timeout'; + +export function createRetryOnRateLimitMiddleware( + provider: JsonRpcMiddleware, +): JsonRpcMiddleware { + return createAsyncMiddleware(async (_req, _res, next) => { + const maxAttempts = 5; + const retryInterval = 800; + for (let attempt = 0; attempt < maxAttempts; attempt++) { + try { + return next(); + } catch (err: JsonRpcError) { + // re-throw error if not limit exceeded + if (!err.code == errorCodes.rpc.limitExceeded) { + throw err; + } + } + await timeout(retryInterval); + } + }); +} \ No newline at end of file From 546e9359e420f33a3b2ae73304e0ce59b1357f81 Mon Sep 17 00:00:00 2001 From: Arseny Mitin Date: Tue, 8 Aug 2023 16:06:21 +0300 Subject: [PATCH 2/4] fix: ts syntax --- src/retryOnRateLimit.ts | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/src/retryOnRateLimit.ts b/src/retryOnRateLimit.ts index 89a477b7..4b54423d 100644 --- a/src/retryOnRateLimit.ts +++ b/src/retryOnRateLimit.ts @@ -1,7 +1,9 @@ -import type { JsonRpcError, errorCodes } from 'rpc-errors'; -import { JsonRpcMiddleware, createAsyncMiddleware } from 'json-rpc-engine'; -import { timeout } from './utils/timeout'; +import { EthereumRpcError } from 'eth-rpc-errors'; +import { errorCodes } from 'eth-rpc-errors'; +import type { JsonRpcMiddleware } from 'json-rpc-engine'; +import { createAsyncMiddleware } from 'json-rpc-engine'; +import { timeout } from './utils/timeout'; export function createRetryOnRateLimitMiddleware( provider: JsonRpcMiddleware, ): JsonRpcMiddleware { @@ -11,13 +13,15 @@ export function createRetryOnRateLimitMiddleware( for (let attempt = 0; attempt < maxAttempts; attempt++) { try { return next(); - } catch (err: JsonRpcError) { - // re-throw error if not limit exceeded - if (!err.code == errorCodes.rpc.limitExceeded) { + } catch (err) { + if (!(err instanceof EthereumRpcError && + err.code == errorCodes.rpc.limitExceeded)) { + // re-throw error if not limit exceeded throw err; } + await timeout(retryInterval); } - await timeout(retryInterval); + } }); } \ No newline at end of file From aadb0272496c64035a42a1c72d9ae058a1bc8ed9 Mon Sep 17 00:00:00 2001 From: Arseny Mitin Date: Tue, 8 Aug 2023 16:08:05 +0300 Subject: [PATCH 3/4] format: ts --- src/retryOnRateLimit.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/retryOnRateLimit.ts b/src/retryOnRateLimit.ts index 4b54423d..1ab48d8f 100644 --- a/src/retryOnRateLimit.ts +++ b/src/retryOnRateLimit.ts @@ -1,9 +1,8 @@ -import { EthereumRpcError } from 'eth-rpc-errors'; -import { errorCodes } from 'eth-rpc-errors'; +import { EthereumRpcError, errorCodes } from 'eth-rpc-errors'; import type { JsonRpcMiddleware } from 'json-rpc-engine'; import { createAsyncMiddleware } from 'json-rpc-engine'; - import { timeout } from './utils/timeout'; + export function createRetryOnRateLimitMiddleware( provider: JsonRpcMiddleware, ): JsonRpcMiddleware { @@ -21,7 +20,6 @@ export function createRetryOnRateLimitMiddleware( } await timeout(retryInterval); } - } }); } \ No newline at end of file From 384b1eff57993be3455d12bc986985c67994b441 Mon Sep 17 00:00:00 2001 From: Arseny Mitin Date: Tue, 8 Aug 2023 17:08:01 +0300 Subject: [PATCH 4/4] fix: createRetryOnRateLimitMiddleware should not accept any params --- src/retryOnRateLimit.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/retryOnRateLimit.ts b/src/retryOnRateLimit.ts index 1ab48d8f..8fba97f7 100644 --- a/src/retryOnRateLimit.ts +++ b/src/retryOnRateLimit.ts @@ -3,9 +3,7 @@ import type { JsonRpcMiddleware } from 'json-rpc-engine'; import { createAsyncMiddleware } from 'json-rpc-engine'; import { timeout } from './utils/timeout'; -export function createRetryOnRateLimitMiddleware( - provider: JsonRpcMiddleware, -): JsonRpcMiddleware { +export function createRetryOnRateLimitMiddleware(): JsonRpcMiddleware { return createAsyncMiddleware(async (_req, _res, next) => { const maxAttempts = 5; const retryInterval = 800;