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",
+ })
+ }),
+ )
+)))