diff --git a/src/Layers/trpc/createTRCPErrorMapper.ts b/src/Layers/trpc/createTRCPErrorMapper.ts index 38af078..d59ac86 100644 --- a/src/Layers/trpc/createTRCPErrorMapper.ts +++ b/src/Layers/trpc/createTRCPErrorMapper.ts @@ -1,12 +1,7 @@ import { Effect, type Cause } from "effect" -import { ImportError } from "../../ImportError" +import { importTRPCServer } from "./importTRPCServer" -const importTRPCServer = Effect.tryPromise({ - try: () => import("@trpc/server"), - catch: cause => new ImportError({ path: "@trpc/server", cause }), -}) - export const createTRCPErrorMapper = importTRPCServer.pipe(Effect.map(({ TRPCError }) => (effect: Effect.Effect) => Effect.sandbox(effect).pipe( Effect.catchTags({ diff --git a/src/Layers/trpc/importTRPCServer.ts b/src/Layers/trpc/importTRPCServer.ts new file mode 100644 index 0000000..26a5ea1 --- /dev/null +++ b/src/Layers/trpc/importTRPCServer.ts @@ -0,0 +1,8 @@ +import { Effect } from "effect" +import { ImportError } from "../../ImportError" + + +export const importTRPCServer = Effect.tryPromise({ + try: () => import("@trpc/server"), + catch: cause => new ImportError({ path: "@trpc/server", cause }), +}) diff --git a/src/Layers/trpc/index.ts b/src/Layers/trpc/index.ts index 9e23e90..71403b6 100644 --- a/src/Layers/trpc/index.ts +++ b/src/Layers/trpc/index.ts @@ -1,3 +1,4 @@ +export * from "./middlewares" export * as TRPCBuilder from "./TRPCBuilder" export * as TRPCContext from "./TRPCContext" export * as TRPCContextCreator from "./TRPCContextCreator" diff --git a/src/Layers/trpc/middlewares.ts b/src/Layers/trpc/middlewares.ts new file mode 100644 index 0000000..c63b0d1 --- /dev/null +++ b/src/Layers/trpc/middlewares.ts @@ -0,0 +1,24 @@ +import { Effect, Match } from "effect" +import type { TRPCContextTransaction } from "./TRPCContext" +import { importTRPCServer } from "./importTRPCServer" + + +export const ExpressOnly = importTRPCServer.pipe(Effect.map(({ + experimental_standaloneMiddleware, + TRPCError, +}) => experimental_standaloneMiddleware<{ + ctx: { readonly transaction: TRPCContextTransaction } +}>().create(opts => + Match.value(opts.ctx.transaction).pipe( + Match.tag("Express", transaction => + opts.next({ ctx: { transaction } }) + ), + + Match.orElse(() => { + throw new TRPCError({ + code: "BAD_REQUEST", + message: "Only Express backend is supported by this procedure", + }) + }), + ) +)))