Skip to content

Commit fb9b2ed

Browse files
committed
Use RpcResponseTransformer in PubSubSubscriptionPlan
1 parent ba341d8 commit fb9b2ed

File tree

2 files changed

+12
-16
lines changed

2 files changed

+12
-16
lines changed

packages/rpc-subscriptions-spec/src/rpc-subscriptions-pubsub-plan.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import {
55
SolanaError,
66
} from '@solana/errors';
77
import { safeRace } from '@solana/promises';
8-
import { createRpcMessage, RpcRequest, RpcResponseData } from '@solana/rpc-spec-types';
8+
import { createRpcMessage, RpcRequest, RpcResponseData, RpcResponseTransformer } from '@solana/rpc-spec-types';
99
import { DataPublisher } from '@solana/subscribable';
1010
import { demultiplexDataPublisher } from '@solana/subscribable';
1111

@@ -14,7 +14,7 @@ import { RpcSubscriptionsChannel } from './rpc-subscriptions-channel';
1414

1515
type Config<TNotification> = Readonly<{
1616
channel: RpcSubscriptionsChannel<unknown, RpcNotification<TNotification> | RpcResponseData<RpcSubscriptionId>>;
17-
responseTransformer?: <T>(response: unknown, notificationName: string) => T;
17+
responseTransformer?: RpcResponseTransformer;
1818
signal: AbortSignal;
1919
subscribeRequest: RpcRequest;
2020
unsubscribeMethodName: string;
@@ -65,7 +65,8 @@ function augmentSubscriberCountAndReturnNewCount(
6565
const cache = new WeakMap();
6666
function getMemoizedDemultiplexedNotificationPublisherFromChannelAndResponseTransformer<TNotification>(
6767
channel: RpcSubscriptionsChannel<unknown, RpcNotification<TNotification>>,
68-
responseTransformer?: <T>(response: unknown, notificationName: string) => T,
68+
subscribeRequest: RpcRequest,
69+
responseTransformer?: RpcResponseTransformer,
6970
): DataPublisher<{
7071
[channelName: `notification:${number}`]: TNotification;
7172
}> {
@@ -84,7 +85,7 @@ function getMemoizedDemultiplexedNotificationPublisherFromChannelAndResponseTran
8485
return;
8586
}
8687
const transformedNotification = responseTransformer
87-
? responseTransformer(message.params.result, message.method)
88+
? responseTransformer(message.params.result, subscribeRequest)
8889
: message.params.result;
8990
return [`notification:${message.params.subscription}`, transformedNotification];
9091
})),
@@ -189,6 +190,7 @@ export async function executeRpcPubSubSubscriptionPlan<TNotification>({
189190
*/
190191
const notificationPublisher = getMemoizedDemultiplexedNotificationPublisherFromChannelAndResponseTransformer(
191192
channel,
193+
subscribeRequest,
192194
responseTransformer,
193195
);
194196
const notificationKey = `notification:${subscriptionId}` as const;

packages/rpc-transformers/src/response-transformer.ts

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,9 @@ import { pipe } from '@solana/functional';
22
import { RpcRequest, RpcResponse, RpcResponseTransformer } from '@solana/rpc-spec-types';
33

44
import { AllowedNumericKeypaths } from './response-transformer-allowed-numeric-values';
5-
import { getBigIntUpcastResponseTransformer, getBigIntUpcastVisitor } from './response-transformer-bigint-upcast';
5+
import { getBigIntUpcastResponseTransformer } from './response-transformer-bigint-upcast';
66
import { getResultResponseTransformer } from './response-transformer-result';
77
import { getThrowSolanaErrorResponseTransformer } from './response-transformer-throw-solana-error';
8-
import { getTreeWalker } from './tree-traversal';
98

109
export type ResponseTransformerConfig<TApi> = Readonly<{
1110
allowedNumericKeyPaths?: AllowedNumericKeypaths<TApi>;
@@ -29,16 +28,11 @@ export function getDefaultResponseTransformerForSolanaRpc<TApi>(
2928

3029
export function getDefaultResponseTransformerForSolanaRpcSubscriptions<TApi>(
3130
config?: ResponseTransformerConfig<TApi>,
32-
): <T>(notification: unknown, notificationName: string) => T {
33-
return <T>(notification: unknown, notificationName: string): T => {
31+
): RpcResponseTransformer {
32+
return (response: RpcResponse, request: RpcRequest): RpcResponse => {
33+
const methodName = request.methodName as keyof TApi;
3434
const keyPaths =
35-
config?.allowedNumericKeyPaths && notificationName
36-
? config.allowedNumericKeyPaths[notificationName as keyof TApi]
37-
: undefined;
38-
const traverse = getTreeWalker([getBigIntUpcastVisitor(keyPaths ?? [])]);
39-
const initialState = {
40-
keyPath: [],
41-
};
42-
return traverse(notification, initialState) as T;
35+
config?.allowedNumericKeyPaths && methodName ? config.allowedNumericKeyPaths[methodName] : undefined;
36+
return pipe(response, r => getBigIntUpcastResponseTransformer(keyPaths ?? [])(r, request));
4337
};
4438
}

0 commit comments

Comments
 (0)