diff --git a/src/index.ts b/src/index.ts index dbbde58..0f875bd 100644 --- a/src/index.ts +++ b/src/index.ts @@ -243,11 +243,18 @@ export function createAlchemyWeb3( function fillInConfigDefaults({ writeProvider = getWindowProvider(), + jsonRpcSenderMiddlewares = [], maxRetries = DEFAULT_MAX_RETRIES, retryInterval = DEFAULT_RETRY_INTERVAL, retryJitter = DEFAULT_RETRY_JITTER, }: AlchemyWeb3Config = {}): FullConfig { - return { writeProvider, maxRetries, retryInterval, retryJitter }; + return { + writeProvider, + jsonRpcSenderMiddlewares, + maxRetries, + retryInterval, + retryJitter, + }; } function getWindowProvider(): Provider | null { diff --git a/src/types.ts b/src/types.ts index 87cf888..a577912 100644 --- a/src/types.ts +++ b/src/types.ts @@ -53,6 +53,7 @@ export function isSubscriptionEvent( export interface AlchemyWeb3Config { writeProvider?: Provider | null; + jsonRpcSenderMiddlewares?: JsonRpcSenderMiddleware[]; maxRetries?: number; retryInterval?: number; retryJitter?: number; @@ -86,3 +87,8 @@ export type SendJsonRpcFunction = ( export interface TransactionsOptions { address?: string; } + +export type JsonRpcSenderMiddleware = ( + req: SingleOrBatchRequest, + next: () => Promise, +) => Promise; diff --git a/src/web3-adapter/sendJsonRpcPayload.ts b/src/web3-adapter/sendJsonRpcPayload.ts index ae2cb7e..9adc526 100644 --- a/src/web3-adapter/sendJsonRpcPayload.ts +++ b/src/web3-adapter/sendJsonRpcPayload.ts @@ -3,6 +3,7 @@ import { FullConfig, JsonRpcRequest, JsonRpcResponse, + JsonRpcSenderMiddleware, Provider, SingleOrBatchRequest, SingleOrBatchResponse, @@ -34,11 +35,12 @@ export function makeJsonRpcPayloadSender( alchemySendJsonRpc: AlchemySendJsonRpcFunction, config: FullConfig, ): JsonRpcPayloadSender { - let currentWriteProvider = config.writeProvider; + // Copy middlewares from config. + const middlewares: JsonRpcSenderMiddleware[] = []; + config.jsonRpcSenderMiddlewares.forEach((m) => middlewares.push(m)); - const sendJsonRpcPayload = ( - payload: SingleOrBatchRequest, - ): Promise => { + let currentWriteProvider = config.writeProvider; + middlewares.push((payload) => { const disallowedMethod = getDisallowedMethod(payload); if (!disallowedMethod) { try { @@ -63,6 +65,16 @@ export function makeJsonRpcPayloadSender( } return sendJsonRpcWithProvider(currentWriteProvider, payload); } + }); + + const sendJsonRpcPayload = ( + payload: SingleOrBatchRequest, + ): Promise => { + const getNext = (i: number) => { + const middleware = middlewares[i]; + return () => middleware(payload, getNext(i + 1)); + }; + return getNext(0)(); }; function setWriteProvider(writeProvider: Provider | null | undefined) {