Skip to content
This repository has been archived by the owner on Jan 22, 2025. It is now read-only.

Commit

Permalink
refactor(experimental): graphql: add loadMany to loaders
Browse files Browse the repository at this point in the history
  • Loading branch information
buffalojoec committed Feb 5, 2024
1 parent a832ba7 commit fbbdd5d
Show file tree
Hide file tree
Showing 5 changed files with 14 additions and 19 deletions.
8 changes: 3 additions & 5 deletions packages/rpc-graphql/src/loaders/account.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,16 +32,14 @@ async function loadAccount(

function createAccountBatchLoadFn(rpc: Rpc<GetAccountInfoApi>) {
const resolveAccountUsingRpc = loadAccount.bind(null, rpc);
return async (accountQueryArgs: readonly AccountLoaderArgs[]) => {
return await Promise.all(
accountQueryArgs.map(async args => await resolveAccountUsingRpc(applyDefaultArgs(args))),
);
};
return async (accountQueryArgs: readonly AccountLoaderArgs[]) =>
accountQueryArgs.map(async args => await resolveAccountUsingRpc(applyDefaultArgs(args)));
}

export function createAccountLoader(rpc: Rpc<GetAccountInfoApi>): AccountLoader {
const loader = new DataLoader(createAccountBatchLoadFn(rpc), { cacheKeyFn });
return {
load: async args => loader.load(applyDefaultArgs(args)),
loadMany: async args => loader.loadMany(args.map(applyDefaultArgs)),
};
}
6 changes: 3 additions & 3 deletions packages/rpc-graphql/src/loaders/block.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,14 +35,14 @@ async function loadBlock(rpc: Rpc<GetBlockApi>, { slot, ...config }: BlockLoader

function createBlockBatchLoadFn(rpc: Rpc<GetBlockApi>) {
const resolveBlockUsingRpc = loadBlock.bind(null, rpc);
return async (blockQueryArgs: readonly BlockLoaderArgs[]) => {
return await Promise.all(blockQueryArgs.map(async args => await resolveBlockUsingRpc(applyDefaultArgs(args))));
};
return async (blockQueryArgs: readonly BlockLoaderArgs[]) =>
blockQueryArgs.map(async args => await resolveBlockUsingRpc(applyDefaultArgs(args)));
}

export function createBlockLoader(rpc: Rpc<GetBlockApi>): BlockLoader {
const loader = new DataLoader(createBlockBatchLoadFn(rpc), { cacheKeyFn });
return {
load: async args => loader.load(applyDefaultArgs(args)),
loadMany: async args => loader.loadMany(args.map(applyDefaultArgs)),
};
}
3 changes: 2 additions & 1 deletion packages/rpc-graphql/src/loaders/loader.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@ import { Commitment, Slot } from '@solana/rpc-types';
import stringify from 'json-stable-stringify';

export type LoadFn<TArgs, T> = (args: TArgs) => Promise<T>;
export type Loader<TArgs, T> = { load: LoadFn<TArgs, T> };
export type LoadManyFn<TArgs, T> = (args: TArgs[]) => Promise<(Promise<T> | Error)[]>;
export type Loader<TArgs, T> = { load: LoadFn<TArgs, T>; loadMany: LoadManyFn<TArgs, T> };

// FIX ME: https://github.com/solana-labs/solana-web3.js/pull/2052
// export type AccountLoaderArgs = { address: Parameters<GetAccountInfoApi['getAccountInfo']>[0] } & Parameters<
Expand Down
8 changes: 3 additions & 5 deletions packages/rpc-graphql/src/loaders/program-accounts.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,16 +38,14 @@ async function loadProgramAccounts(

function createProgramAccountsBatchLoadFn(rpc: Rpc<GetProgramAccountsApi>) {
const resolveProgramAccountsUsingRpc = loadProgramAccounts.bind(null, rpc);
return async (programAccountsQueryArgs: readonly ProgramAccountsLoaderArgs[]) => {
return await Promise.all(
programAccountsQueryArgs.map(async args => await resolveProgramAccountsUsingRpc(applyDefaultArgs(args))),
);
};
return async (programAccountsQueryArgs: readonly ProgramAccountsLoaderArgs[]) =>
programAccountsQueryArgs.map(async args => await resolveProgramAccountsUsingRpc(applyDefaultArgs(args)));
}

export function createProgramAccountsLoader(rpc: Rpc<GetProgramAccountsApi>): ProgramAccountsLoader {
const loader = new DataLoader(createProgramAccountsBatchLoadFn(rpc), { cacheKeyFn });
return {
load: async args => loader.load(applyDefaultArgs(args)),
loadMany: async args => loader.loadMany(args.map(applyDefaultArgs)),
};
}
8 changes: 3 additions & 5 deletions packages/rpc-graphql/src/loaders/transaction.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,16 +32,14 @@ async function loadTransaction(

function createTransactionBatchLoadFn(rpc: Rpc<GetTransactionApi>) {
const resolveTransactionUsingRpc = loadTransaction.bind(null, rpc);
return async (transactionQueryArgs: readonly TransactionLoaderArgs[]) => {
return await Promise.all(
transactionQueryArgs.map(async args => await resolveTransactionUsingRpc(applyDefaultArgs(args))),
);
};
return async (transactionQueryArgs: readonly TransactionLoaderArgs[]) =>
transactionQueryArgs.map(async args => await resolveTransactionUsingRpc(applyDefaultArgs(args)));
}

export function createTransactionLoader(rpc: Rpc<GetTransactionApi>): TransactionLoader {
const loader = new DataLoader(createTransactionBatchLoadFn(rpc), { cacheKeyFn });
return {
load: async args => loader.load(applyDefaultArgs(args)),
loadMany: async args => loader.loadMany(args.map(applyDefaultArgs)),
};
}

0 comments on commit fbbdd5d

Please sign in to comment.