From 655a25026618e394925496db7d09e0427d716cdf Mon Sep 17 00:00:00 2001 From: Loris Leiva Date: Mon, 26 Aug 2024 23:44:02 +0100 Subject: [PATCH] Add `getDefaultCommitmentRequestTransformer` helper --- .changeset/pretty-worms-taste.md | 5 ++ packages/rpc-transformers/README.md | 15 +++++- .../src/__tests__/params-transformer-test.ts | 2 +- ...st-transformer-default-commitment-test.ts} | 2 +- packages/rpc-transformers/src/index.ts | 4 +- .../src/params-transformer.ts | 22 ++------- ...request-transformer-default-commitment.ts} | 46 ++++++++++++++++--- ...sformer-options-object-position-config.ts} | 0 8 files changed, 67 insertions(+), 29 deletions(-) create mode 100644 .changeset/pretty-worms-taste.md rename packages/rpc-transformers/src/__tests__/{default-commitment-test.ts => request-transformer-default-commitment-test.ts} (98%) rename packages/rpc-transformers/src/{default-commitment.ts => request-transformer-default-commitment.ts} (65%) rename packages/rpc-transformers/src/{params-transformer-options-object-position-config.ts => request-transformer-options-object-position-config.ts} (100%) diff --git a/.changeset/pretty-worms-taste.md b/.changeset/pretty-worms-taste.md new file mode 100644 index 00000000000..2715077f2a4 --- /dev/null +++ b/.changeset/pretty-worms-taste.md @@ -0,0 +1,5 @@ +--- +'@solana/rpc-transformers': patch +--- + +Add `getDefaultCommitmentRequestTransformer` helper diff --git a/packages/rpc-transformers/README.md b/packages/rpc-transformers/README.md index b2cd636e404..a44dc7b9078 100644 --- a/packages/rpc-transformers/README.md +++ b/packages/rpc-transformers/README.md @@ -14,4 +14,17 @@ # @solana/rpc-transformers -TODO +## Functions + +### `getDefaultCommitmentTransformer(config)` + +Creates a transformer that adds the provided default commitment to the configuration object of the request when applicable. + +```ts +import { getDefaultCommitmentTransformer, OPTIONS_OBJECT_POSITION_BY_METHOD } from '@solana/rpc-transformers'; + +const requestTransformer = getDefaultCommitmentTransformer({ + defaultCommitment: 'confirmed', + optionsObjectPositionByMethod: OPTIONS_OBJECT_POSITION_BY_METHOD, +}); +``` diff --git a/packages/rpc-transformers/src/__tests__/params-transformer-test.ts b/packages/rpc-transformers/src/__tests__/params-transformer-test.ts index cbd104a036b..0a8831bacb9 100644 --- a/packages/rpc-transformers/src/__tests__/params-transformer-test.ts +++ b/packages/rpc-transformers/src/__tests__/params-transformer-test.ts @@ -2,7 +2,7 @@ import type { RpcRequestTransformer } from '@solana/rpc-spec'; import type { Commitment } from '@solana/rpc-types'; import { getDefaultRequestTransformerForSolanaRpc } from '../params-transformer'; -import { OPTIONS_OBJECT_POSITION_BY_METHOD } from '../params-transformer-options-object-position-config'; +import { OPTIONS_OBJECT_POSITION_BY_METHOD } from '../request-transformer-options-object-position-config'; describe('getDefaultRequestTransformerForSolanaRpc', () => { describe('given no config', () => { diff --git a/packages/rpc-transformers/src/__tests__/default-commitment-test.ts b/packages/rpc-transformers/src/__tests__/request-transformer-default-commitment-test.ts similarity index 98% rename from packages/rpc-transformers/src/__tests__/default-commitment-test.ts rename to packages/rpc-transformers/src/__tests__/request-transformer-default-commitment-test.ts index 75a08b3d193..8c5301b8c2a 100644 --- a/packages/rpc-transformers/src/__tests__/default-commitment-test.ts +++ b/packages/rpc-transformers/src/__tests__/request-transformer-default-commitment-test.ts @@ -1,6 +1,6 @@ import type { Commitment } from '@solana/rpc-types'; -import { applyDefaultCommitment } from '../default-commitment'; +import { applyDefaultCommitment } from '../request-transformer-default-commitment'; const MOCK_COMMITMENT_PROPERTY_NAME = 'commitmentProperty'; diff --git a/packages/rpc-transformers/src/index.ts b/packages/rpc-transformers/src/index.ts index a501dacbe88..f27a74cbd2b 100644 --- a/packages/rpc-transformers/src/index.ts +++ b/packages/rpc-transformers/src/index.ts @@ -1,8 +1,8 @@ -export * from './default-commitment'; export * from './params-transformer'; export * from './params-transformer-bigint-downcast'; export * from './params-transformer-integer-overflow'; -export * from './params-transformer-options-object-position-config'; +export * from './request-transformer-default-commitment'; +export * from './request-transformer-options-object-position-config'; export * from './response-transformer'; export * from './response-transformer-allowed-numeric-values'; export * from './response-transformer-bigint-upcast'; diff --git a/packages/rpc-transformers/src/params-transformer.ts b/packages/rpc-transformers/src/params-transformer.ts index be10c5d4a92..dc5c1eba8a3 100644 --- a/packages/rpc-transformers/src/params-transformer.ts +++ b/packages/rpc-transformers/src/params-transformer.ts @@ -2,10 +2,10 @@ import { pipe } from '@solana/functional'; import { RpcRequest, RpcRequestTransformer } from '@solana/rpc-spec'; import { Commitment } from '@solana/rpc-types'; -import { applyDefaultCommitment } from './default-commitment'; import { downcastNodeToNumberIfBigint } from './params-transformer-bigint-downcast'; import { getIntegerOverflowNodeVisitor } from './params-transformer-integer-overflow'; -import { OPTIONS_OBJECT_POSITION_BY_METHOD } from './params-transformer-options-object-position-config'; +import { getDefaultCommitmentRequestTransformer } from './request-transformer-default-commitment'; +import { OPTIONS_OBJECT_POSITION_BY_METHOD } from './request-transformer-options-object-position-config'; import { getTreeWalker, KeyPath } from './tree-traversal'; export type RequestTransformerConfig = Readonly<{ @@ -28,23 +28,11 @@ export function getDefaultRequestTransformerForSolanaRpc(config?: RequestTransfo keyPath: [], }; const patchedRequest = { methodName, params: traverse(rawParams, initialState) as T }; - if (!Array.isArray(patchedRequest.params)) { - return patchedRequest; - } - const optionsObjectPositionInParams = OPTIONS_OBJECT_POSITION_BY_METHOD[methodName]; - if (optionsObjectPositionInParams == null) { - return patchedRequest; - } return pipe( patchedRequest, - ({ methodName, params }) => ({ - methodName, - params: applyDefaultCommitment({ - commitmentPropertyName: methodName === 'sendTransaction' ? 'preflightCommitment' : 'commitment', - optionsObjectPositionInParams, - overrideCommitment: defaultCommitment, - params: params as unknown[], - }), + getDefaultCommitmentRequestTransformer({ + defaultCommitment, + optionsObjectPositionByMethod: OPTIONS_OBJECT_POSITION_BY_METHOD, }), // FIXME Remove when https://github.com/anza-xyz/agave/pull/483 is deployed. ({ methodName, params }) => ({ diff --git a/packages/rpc-transformers/src/default-commitment.ts b/packages/rpc-transformers/src/request-transformer-default-commitment.ts similarity index 65% rename from packages/rpc-transformers/src/default-commitment.ts rename to packages/rpc-transformers/src/request-transformer-default-commitment.ts index 250c04188ad..ec6a4652e3c 100644 --- a/packages/rpc-transformers/src/default-commitment.ts +++ b/packages/rpc-transformers/src/request-transformer-default-commitment.ts @@ -1,18 +1,50 @@ +import type { RpcRequest, RpcRequestTransformer } from '@solana/rpc-spec'; import type { Commitment } from '@solana/rpc-types'; -type Config = Readonly<{ - commitmentPropertyName: string; - optionsObjectPositionInParams: number; - overrideCommitment?: Commitment; - params: unknown[]; -}>; +export function getDefaultCommitmentRequestTransformer({ + defaultCommitment, + optionsObjectPositionByMethod, +}: Readonly<{ + defaultCommitment?: Commitment; + optionsObjectPositionByMethod: Record; +}>): RpcRequestTransformer { + return (request: RpcRequest): RpcRequest => { + const { params, methodName } = request; + + // We only apply default commitment to array parameters. + if (!Array.isArray(params)) { + return request; + } + + // Find the position of the options object in the parameters and abort if not found. + const optionsObjectPositionInParams = optionsObjectPositionByMethod[methodName]; + if (optionsObjectPositionInParams == null) { + return request; + } + + return Object.freeze({ + methodName, + params: applyDefaultCommitment({ + commitmentPropertyName: methodName === 'sendTransaction' ? 'preflightCommitment' : 'commitment', + optionsObjectPositionInParams, + overrideCommitment: defaultCommitment, + params, + }), + }); + }; +} export function applyDefaultCommitment({ commitmentPropertyName, params, optionsObjectPositionInParams, overrideCommitment, -}: Config) { +}: Readonly<{ + commitmentPropertyName: string; + optionsObjectPositionInParams: number; + overrideCommitment?: Commitment; + params: unknown[]; +}>) { const paramInTargetPosition = params[optionsObjectPositionInParams]; if ( // There's no config. diff --git a/packages/rpc-transformers/src/params-transformer-options-object-position-config.ts b/packages/rpc-transformers/src/request-transformer-options-object-position-config.ts similarity index 100% rename from packages/rpc-transformers/src/params-transformer-options-object-position-config.ts rename to packages/rpc-transformers/src/request-transformer-options-object-position-config.ts