zomars
zomarsβ€’8mo ago

Is there a way to extract a procedure signature?

I'm looking into extracting certain handlers into functions to keep certain procedures more manageable. Is there a way to define a function that expects the same signature as a procedure? Here's an example of what I'm trying to achieve.
No description
4 Replies
Nick
Nickβ€’8mo ago
Best to keep it simple and request exactly what’s needed rather than coupling it to trpc. The code is more reusable that way
Alex / KATT 🐱
Alex / KATT πŸ±β€’8mo ago
i'd probably make it independent of trpc too - perhaps even extracting the zod schema of the input like
const schema = z.object({ foo: z.string() })

function myFn(opts: {
input: typeof schema['_output']
user: { id: string }
}) {
/// ..
}

export const adminRouter = router({
toggleFeatureFlag: authedAdminProcedure.input(schema).mutation(async opts => { })
const schema = z.object({ foo: z.string() })

function myFn(opts: {
input: typeof schema['_output']
user: { id: string }
}) {
/// ..
}

export const adminRouter = router({
toggleFeatureFlag: authedAdminProcedure.input(schema).mutation(async opts => { })
another useful pattern in cases like this where you want to pass data deeply is to use async local storage in node i use it for logging and making sure that all logs, no matter how deep, have correlation ids example:
import { AsyncLocalStorage } from 'node:async_hooks';

interface LogStore {
correlationId: string;
user: {
id: string | null;
email: string | null;
} | null;
}
export const logStorage = new AsyncLocalStorage<LogStore>();
import { AsyncLocalStorage } from 'node:async_hooks';

interface LogStore {
correlationId: string;
user: {
id: string | null;
email: string | null;
} | null;
}
export const logStorage = new AsyncLocalStorage<LogStore>();
and i have a HOC around my API requests to attach data to the storage you could potentially do an AdminStore, call adminStorge.run() in the authedAdminProcedure and then those things will just magically exist anywhere down the stack of those functions
zomars
zomarsβ€’8mo ago
Some real wizardry in here Thanks πŸ™
Alex / KATT 🐱
Alex / KATT πŸ±β€’8mo ago
Don't hesitate to reach out if you wanna pair on anything You got my cal ☺
More Posts
Is there a pattern for omitting certain types of errors from being returned in the API responseI'd prefer not to expose the ORM queries being used in my resolver. I'm already providing an `onErroDynamic input not leading to changes on the front endI'm building a dynamic procedure to access my database via Drizzle ORM. Ideally a developer would btRPC with with react-query prefetching in Next.js app directory.Hi. What is currently the best way to do prefetching in Next.js app directory when using @tanstack/rHello, is there any way to create a base router with common procedures? like an interfaceI want all routers that use it have the state procedure (subscriptions), so I can create a common hHelp Retrieving req.url from opts in useMutation from tRPCHello, i'm trying to essentially send a magiclink email using supabase client libraries, however, i'Express tRPC NextJSI've custom expressjs server with Nextjs + im using internal package for handling OneLogin (OIDC) hoDynamic links url dependent on next headers?Hi, We're currently explore if we can use trpc on a multi tenant next.js 13 application. But we cancalling TRPCProxyClient from inside trpc procedure fails on vercel route handlers edge runtimei setup my client as following: ``` export const serverToServerApi = createTRPCProxyClient<AppRouterPrivate procedures and serverside callsHello, I am just diving into trpc in my Next.js (app router) application and I am wondering if is thinferRouterOutputs ignore "complex data type" fields and only have primitive fields. Bug?Is this a bug ? I have done npx prisma db push, I have restarted VSCode and Typescript. Any comments