Skip to content

Commit

Permalink
refactor(experimental): add cluster level subscriptions API for rpc-core
Browse files Browse the repository at this point in the history
  • Loading branch information
buffalojoec committed Jan 30, 2024
1 parent ce4d683 commit 7d37771
Show file tree
Hide file tree
Showing 2 changed files with 94 additions and 13 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
import {
IRpcSubscriptionsApi,
IRpcSubscriptionsApiDevnet,
IRpcSubscriptionsApiMainnet,
IRpcSubscriptionsApiTestnet,
} from '@solana/rpc-types';

import { createSolanaRpcSubscriptionsApi, createSolanaRpcSubscriptionsApi_UNSTABLE, SolanaRpcSubscriptions } from '..';

const config = null as unknown as Parameters<typeof createSolanaRpcSubscriptionsApi>[0];

// No cluster specified should be generic `IRpcSubscriptionsApi`
createSolanaRpcSubscriptionsApi(config) satisfies IRpcSubscriptionsApi<SolanaRpcSubscriptions>;

// When devnet is specified, should be `IRpcSubscriptionsApiDevnet`
createSolanaRpcSubscriptionsApi<'devnet'>(config) satisfies IRpcSubscriptionsApiDevnet<SolanaRpcSubscriptions>;
// @ts-expect-error Should not be a testnet API
createSolanaRpcSubscriptionsApi<'devnet'>(config) satisfies IRpcSubscriptionsApiTestnet<SolanaRpcSubscriptions>;
// @ts-expect-error Should not be a mainnet API
createSolanaRpcSubscriptionsApi<'devnet'>(config) satisfies IRpcSubscriptionsApiMainnet<SolanaRpcSubscriptions>;

// When testnet is specified, should be `IRpcSubscriptionsApiTestnet`
createSolanaRpcSubscriptionsApi<'testnet'>(config) satisfies IRpcSubscriptionsApiTestnet<SolanaRpcSubscriptions>;
// @ts-expect-error Should not be a devnet API
createSolanaRpcSubscriptionsApi<'testnet'>(config) satisfies IRpcSubscriptionsApiDevnet<SolanaRpcSubscriptions>;
// @ts-expect-error Should not be a mainnet API
createSolanaRpcSubscriptionsApi<'testnet'>(config) satisfies IRpcSubscriptionsApiMainnet<SolanaRpcSubscriptions>;

// When mainnet is specified, should be `IRpcSubscriptionsApiMainnet`
createSolanaRpcSubscriptionsApi<'mainnet'>(config) satisfies IRpcSubscriptionsApiMainnet<SolanaRpcSubscriptions>;
// @ts-expect-error Should not be a devnet API
createSolanaRpcSubscriptionsApi<'mainnet'>(config) satisfies IRpcSubscriptionsApiDevnet<SolanaRpcSubscriptions>;
// @ts-expect-error Should not be a testnet API
createSolanaRpcSubscriptionsApi<'mainnet'>(config) satisfies IRpcSubscriptionsApiTestnet<SolanaRpcSubscriptions>;

// Unstable API

// No cluster specified should be generic `IRpcSubscriptionsApi`
createSolanaRpcSubscriptionsApi_UNSTABLE(config) satisfies IRpcSubscriptionsApi<SolanaRpcSubscriptions>;

// When devnet is specified, should be `IRpcSubscriptionsApiDevnet`
createSolanaRpcSubscriptionsApi_UNSTABLE<'devnet'>(config) satisfies IRpcSubscriptionsApiDevnet<SolanaRpcSubscriptions>;
createSolanaRpcSubscriptionsApi_UNSTABLE<'devnet'>(
config,
// @ts-expect-error Should not be a testnet API
) satisfies IRpcSubscriptionsApiTestnet<SolanaRpcSubscriptions>;
createSolanaRpcSubscriptionsApi_UNSTABLE<'devnet'>(
config,
// @ts-expect-error Should not be a mainnet API
) satisfies IRpcSubscriptionsApiMainnet<SolanaRpcSubscriptions>;

// When testnet is specified, should be `IRpcSubscriptionsApiTestnet`
createSolanaRpcSubscriptionsApi_UNSTABLE<'testnet'>(
config,
) satisfies IRpcSubscriptionsApiTestnet<SolanaRpcSubscriptions>;
createSolanaRpcSubscriptionsApi_UNSTABLE<'testnet'>(
config,
// @ts-expect-error Should not be a devnet API
) satisfies IRpcSubscriptionsApiDevnet<SolanaRpcSubscriptions>;
createSolanaRpcSubscriptionsApi_UNSTABLE<'testnet'>(
config,
// @ts-expect-error Should not be a mainnet API
) satisfies IRpcSubscriptionsApiMainnet<SolanaRpcSubscriptions>;

// When mainnet is specified, should be `IRpcSubscriptionsApiMainnet`
createSolanaRpcSubscriptionsApi_UNSTABLE<'mainnet'>(
config,
) satisfies IRpcSubscriptionsApiMainnet<SolanaRpcSubscriptions>;
createSolanaRpcSubscriptionsApi_UNSTABLE<'mainnet'>(
config,
// @ts-expect-error Should not be a devnet API
) satisfies IRpcSubscriptionsApiDevnet<SolanaRpcSubscriptions>;
createSolanaRpcSubscriptionsApi_UNSTABLE<'mainnet'>(
config,
// @ts-expect-error Should not be a testnet API
) satisfies IRpcSubscriptionsApiTestnet<SolanaRpcSubscriptions>;
31 changes: 18 additions & 13 deletions packages/rpc-core/src/rpc-subscriptions/index.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { createJsonRpcSubscriptionsApi } from '@solana/rpc-transport';
import { IRpcSubscriptionsApi } from '@solana/rpc-types';
import { IRpcSubscriptionsApi, IRpcSubscriptionsApiFromCluster } from '@solana/rpc-types';

import { getParamsPatcherForSolanaLabsRpc, ParamsPatcherConfig } from '../params-patcher';
import { patchResponseForSolanaLabsRpcSubscriptions } from '../response-patcher';
Expand All @@ -24,29 +24,34 @@ export type SolanaRpcSubscriptions = AccountNotificationsApi &
SlotNotificationsApi;
export type SolanaRpcSubscriptionsUnstable = SlotsUpdatesNotificationsApi & VoteNotificationsApi;

export function createSolanaRpcSubscriptionsApi_INTERNAL(
config?: Config,
): IRpcSubscriptionsApi<SolanaRpcSubscriptions & SolanaRpcSubscriptionsUnstable> {
return createJsonRpcSubscriptionsApi<SolanaRpcSubscriptions & SolanaRpcSubscriptionsUnstable>({
export function createSolanaRpcSubscriptionsApi_INTERNAL<
TCluster extends 'devnet' | 'testnet' | 'mainnet' | void = void,
>(config?: Config): IRpcSubscriptionsApiFromCluster<SolanaRpcSubscriptions & SolanaRpcSubscriptionsUnstable, TCluster> {
return createJsonRpcSubscriptionsApi<SolanaRpcSubscriptions & SolanaRpcSubscriptionsUnstable, TCluster>({
parametersTransformer: getParamsPatcherForSolanaLabsRpc(config) as (params: unknown[]) => unknown[],
responseTransformer: patchResponseForSolanaLabsRpcSubscriptions,
subscribeNotificationNameTransformer: (notificationName: string) =>
notificationName.replace(/Notifications$/, 'Subscribe'),
unsubscribeNotificationNameTransformer: (notificationName: string) =>
notificationName.replace(/Notifications$/, 'Unsubscribe'),
});
}) as IRpcSubscriptionsApiFromCluster<SolanaRpcSubscriptions & SolanaRpcSubscriptionsUnstable, TCluster>;
}

export function createSolanaRpcSubscriptionsApi(config?: Config): IRpcSubscriptionsApi<SolanaRpcSubscriptions> {
return createSolanaRpcSubscriptionsApi_INTERNAL(config) as IRpcSubscriptionsApi<SolanaRpcSubscriptions>;
export function createSolanaRpcSubscriptionsApi<TCluster extends 'devnet' | 'testnet' | 'mainnet' | void = void>(
config?: Config,
): IRpcSubscriptionsApiFromCluster<SolanaRpcSubscriptions, TCluster> {
return createSolanaRpcSubscriptionsApi_INTERNAL<TCluster>(config) as IRpcSubscriptionsApiFromCluster<
SolanaRpcSubscriptions,
TCluster
>;
}

export function createSolanaRpcSubscriptionsApi_UNSTABLE(
config?: Config,
): IRpcSubscriptionsApi<SolanaRpcSubscriptions & SolanaRpcSubscriptionsUnstable> {
return createSolanaRpcSubscriptionsApi_INTERNAL(config) as IRpcSubscriptionsApi<
export function createSolanaRpcSubscriptionsApi_UNSTABLE<
TCluster extends 'devnet' | 'testnet' | 'mainnet' | void = void,
>(config?: Config): IRpcSubscriptionsApiFromCluster<SolanaRpcSubscriptions & SolanaRpcSubscriptionsUnstable, TCluster> {
return createSolanaRpcSubscriptionsApi_INTERNAL<TCluster>(config) as IRpcSubscriptionsApi<
SolanaRpcSubscriptions & SolanaRpcSubscriptionsUnstable
>;
> as IRpcSubscriptionsApiFromCluster<SolanaRpcSubscriptions & SolanaRpcSubscriptionsUnstable, TCluster>;
}

export type {
Expand Down

0 comments on commit 7d37771

Please sign in to comment.