49 lines
1.5 KiB
TypeScript
49 lines
1.5 KiB
TypeScript
import { TRPCError } from "@trpc/server"
|
|
import type { CreateExpressContextOptions } from "@trpc/server/adapters/express"
|
|
import type { CreateWSSContextFnOptions } from "@trpc/server/adapters/ws"
|
|
import { Context, Effect, Layer, Runtime } from "effect"
|
|
import type { Services } from "../Services"
|
|
import type { TRPCContext } from "./TRPCContext"
|
|
|
|
|
|
/**
|
|
* Provides a function that instantiates a fresh context for each tRPC procedure call
|
|
*/
|
|
export class TRPCContextCreator extends Context.Tag("TRPCContextCreator")<TRPCContextCreator,
|
|
(opts:
|
|
| CreateExpressContextOptions
|
|
| CreateWSSContextFnOptions
|
|
) => TRPCContext
|
|
>() {}
|
|
|
|
export module TRPCContextCreator {
|
|
export const Live = Layer.effect(TRPCContextCreator, Effect.gen(function*() {
|
|
const runtime = yield* Effect.runtime<Services>()
|
|
const run = Runtime.runPromise(runtime)
|
|
|
|
return ({ req }) => ({
|
|
runtime,
|
|
run,
|
|
// req,
|
|
})
|
|
}))
|
|
}
|
|
|
|
|
|
const mapErrorsToTRPC = <A, E, R>(effect: Effect.Effect<A, E, R>) =>
|
|
Effect.sandbox(effect).pipe(
|
|
Effect.catchTags({
|
|
Die: cause => Effect.fail(
|
|
new TRPCError({ code: "INTERNAL_SERVER_ERROR", cause })
|
|
),
|
|
|
|
Interrupt: cause => Effect.fail(
|
|
new TRPCError({ code: "INTERNAL_SERVER_ERROR", cause })
|
|
),
|
|
|
|
Fail: cause => Effect.fail(
|
|
new TRPCError({ code: "INTERNAL_SERVER_ERROR", cause })
|
|
),
|
|
})
|
|
)
|