From 69d9ffb3e0a615ecf20179db0b08cd6032df9ced Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sun, 14 Jul 2024 03:11:44 +0200 Subject: [PATCH] Context transaction --- packages/server/src/rpc/RPCRoute.ts | 3 ++- .../server/src/rpc/RPCWebSocketHandler.ts | 3 ++- packages/server/src/trpc/TRPCContext.ts | 22 +++++++++++++------ .../server/src/trpc/TRPCContextCreator.ts | 14 ++++-------- packages/server/src/trpc/adapters.ts | 18 +++++++++++++++ packages/server/src/trpc/handlers.ts | 11 ---------- 6 files changed, 41 insertions(+), 30 deletions(-) create mode 100644 packages/server/src/trpc/adapters.ts delete mode 100644 packages/server/src/trpc/handlers.ts diff --git a/packages/server/src/rpc/RPCRoute.ts b/packages/server/src/rpc/RPCRoute.ts index d2374b7..b5d5ee9 100644 --- a/packages/server/src/rpc/RPCRoute.ts +++ b/packages/server/src/rpc/RPCRoute.ts @@ -3,6 +3,7 @@ import { Effect, Layer } from "effect" import { rpcHTTPRoot } from "../config" import { ExpressApp } from "../http/ExpressApp" import { TRPCContextCreator } from "../trpc/TRPCContextCreator" +import { contextCreatorExpressAdapter } from "../trpc/adapters" import { RPCRouter } from "./RPCRouter" @@ -13,7 +14,7 @@ export module RPCRoute { app.use(yield* rpcHTTPRoot, createExpressMiddleware({ router: yield* RPCRouter, - createContext: yield* TRPCContextCreator, + createContext: contextCreatorExpressAdapter(yield* TRPCContextCreator), }), ) })) diff --git a/packages/server/src/rpc/RPCWebSocketHandler.ts b/packages/server/src/rpc/RPCWebSocketHandler.ts index 30954d2..a8df918 100644 --- a/packages/server/src/rpc/RPCWebSocketHandler.ts +++ b/packages/server/src/rpc/RPCWebSocketHandler.ts @@ -2,6 +2,7 @@ import { applyWSSHandler } from "@trpc/server/adapters/ws" import { Effect, Layer } from "effect" import { WebSocketServer } from "../http/WebSocketServer" import { TRPCContextCreator } from "../trpc/TRPCContextCreator" +import { contextCreatorWSSAdapter } from "../trpc/adapters" import { RPCRouter } from "./RPCRouter" @@ -11,7 +12,7 @@ export module RPCWebSocketHandler { return applyWSSHandler({ wss: yield* WebSocketServer, router: yield* RPCRouter, - createContext: yield* TRPCContextCreator, + createContext: contextCreatorWSSAdapter(yield* TRPCContextCreator), }) }), diff --git a/packages/server/src/trpc/TRPCContext.ts b/packages/server/src/trpc/TRPCContext.ts index e7b6571..1183795 100644 --- a/packages/server/src/trpc/TRPCContext.ts +++ b/packages/server/src/trpc/TRPCContext.ts @@ -1,14 +1,13 @@ import type { TRPCError } from "@trpc/server" import { Data, type Effect, type Runtime } from "effect" import type { RuntimeFiber } from "effect/Fiber" -import type { Request } from "express" +import express from "express" import type { IncomingMessage } from "node:http" +import { WebSocket } from "ws" import type { Services } from "../Services" export interface TRPCContext { - req: TRPCContextRequest - runtime: Runtime.Runtime run: ( @@ -20,12 +19,21 @@ export interface TRPCContext { effect: Effect.Effect, options?: Runtime.RunForkOptions, ) => RuntimeFiber + + transaction: TRPCContextTransaction } -export type TRPCContextRequest = Data.TaggedEnum<{ - Express: { readonly req: Request } - WebSocket: { readonly req: IncomingMessage } +export type TRPCContextTransaction = Data.TaggedEnum<{ + Express: { + readonly req: express.Request + readonly res: express.Response + } + + WebSocket: { + readonly req: IncomingMessage + readonly res: WebSocket + } }> -export const TRPCContextRequestEnum = Data.taggedEnum() +export const TRPCContextTransactionEnum = Data.taggedEnum() diff --git a/packages/server/src/trpc/TRPCContextCreator.ts b/packages/server/src/trpc/TRPCContextCreator.ts index 7599d82..be86c1f 100644 --- a/packages/server/src/trpc/TRPCContextCreator.ts +++ b/packages/server/src/trpc/TRPCContextCreator.ts @@ -1,19 +1,14 @@ 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" +import type { TRPCContext, TRPCContextTransaction } from "./TRPCContext" /** * Provides a function that instantiates a fresh context for each tRPC procedure call */ export class TRPCContextCreator extends Context.Tag("TRPCContextCreator") TRPCContext + (transaction: TRPCContextTransaction) => TRPCContext >() {} export module TRPCContextCreator { @@ -36,12 +31,11 @@ export module TRPCContextCreator { options, ) - return ({ req }) => ({ - - + return transaction => ({ runtime, run, fork, + transaction, }) })) } diff --git a/packages/server/src/trpc/adapters.ts b/packages/server/src/trpc/adapters.ts new file mode 100644 index 0000000..5540097 --- /dev/null +++ b/packages/server/src/trpc/adapters.ts @@ -0,0 +1,18 @@ +import { type CreateExpressContextOptions } from "@trpc/server/adapters/express" +import type { CreateWSSContextFnOptions } from "@trpc/server/adapters/ws" +import type { Context } from "effect" +import { TRPCContextTransactionEnum } from "./TRPCContext" +import { TRPCContextCreator } from "./TRPCContextCreator" + + +export const contextCreatorExpressAdapter = ( + createContext: Context.Tag.Service +) => + (opts: CreateExpressContextOptions) => + createContext(TRPCContextTransactionEnum.Express(opts)) + +export const contextCreatorWSSAdapter = ( + createContext: Context.Tag.Service +) => + (opts: CreateWSSContextFnOptions) => + createContext(TRPCContextTransactionEnum.WebSocket(opts)) diff --git a/packages/server/src/trpc/handlers.ts b/packages/server/src/trpc/handlers.ts deleted file mode 100644 index c50c0e5..0000000 --- a/packages/server/src/trpc/handlers.ts +++ /dev/null @@ -1,11 +0,0 @@ -import type { AnyRouter } from "@trpc/server" -import { createExpressMiddleware } from "@trpc/server/adapters/express" -import type { NodeHTTPHandlerOptions } from "@trpc/server/adapters/node-http" -import express from "express" - - -export const createExpressHandler = ( - opts: NodeHTTPHandlerOptions, -) => { - const t = createExpressMiddleware(opts) -}