Skip to content

Commit

Permalink
Add getDefaultCommitmentRequestTransformer helper
Browse files Browse the repository at this point in the history
  • Loading branch information
lorisleiva committed Aug 26, 2024
1 parent 3081766 commit 655a250
Show file tree
Hide file tree
Showing 8 changed files with 67 additions and 29 deletions.
5 changes: 5 additions & 0 deletions .changeset/pretty-worms-taste.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@solana/rpc-transformers': patch
---

Add `getDefaultCommitmentRequestTransformer` helper
15 changes: 14 additions & 1 deletion packages/rpc-transformers/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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,
});
```
Original file line number Diff line number Diff line change
Expand Up @@ -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', () => {
Expand Down
Original file line number Diff line number Diff line change
@@ -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';

Expand Down
4 changes: 2 additions & 2 deletions packages/rpc-transformers/src/index.ts
Original file line number Diff line number Diff line change
@@ -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';
Expand Down
22 changes: 5 additions & 17 deletions packages/rpc-transformers/src/params-transformer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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<{
Expand All @@ -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 }) => ({
Expand Down
Original file line number Diff line number Diff line change
@@ -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<string, number>;
}>): RpcRequestTransformer {
return <TParams>(request: RpcRequest<TParams>): 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.
Expand Down

0 comments on commit 655a250

Please sign in to comment.