From 527b8a8f22245d05a5122854a4bd7dca21880a21 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sat, 7 Sep 2024 19:10:42 +0200 Subject: [PATCH] Refactoring --- src/TRPC/TRPCExpressRoute.ts | 15 ++---- src/TRPC/TRPCWebSocketServer.ts | 89 +++++++++++++++------------------ src/TRPC/example.ts | 7 +-- 3 files changed, 48 insertions(+), 63 deletions(-) diff --git a/src/TRPC/TRPCExpressRoute.ts b/src/TRPC/TRPCExpressRoute.ts index 411ecd5..22333dd 100644 --- a/src/TRPC/TRPCExpressRoute.ts +++ b/src/TRPC/TRPCExpressRoute.ts @@ -1,8 +1,8 @@ -import type { AnyRouter } from "@trpc/server" -import { Config, Context, Effect, Layer } from "effect" +import { Config, Effect, Layer } from "effect" import { ExpressApp } from "../Express" import { ImportError } from "../ImportError" import { TRPCUnknownContextCreator } from "./TRPCContextCreator" +import { TRPCAnyRouter } from "./TRPCRouter" const importTRPCServerExpressAdapter = Effect.tryPromise({ @@ -10,22 +10,17 @@ const importTRPCServerExpressAdapter = Effect.tryPromise({ catch: cause => new ImportError({ path: "@trpc/server/adapters/express", cause }), }) -export const TRPCExpressRouteLive = < - Tag, - TagShape extends AnyRouter, ->( - routerTag: Context.TagClass, - +export const TRPCExpressRouteLive = ( config: { readonly root: Config.Config - }, + } ) => Layer.effectDiscard(Effect.gen(function*() { const { createExpressMiddleware } = yield* importTRPCServerExpressAdapter const app = yield* ExpressApp.ExpressApp app.use(yield* config.root, createExpressMiddleware({ - router: yield* routerTag, + router: yield* TRPCAnyRouter, createContext: (yield* TRPCUnknownContextCreator).createExpressContext, }) ) diff --git a/src/TRPC/TRPCWebSocketServer.ts b/src/TRPC/TRPCWebSocketServer.ts index 9a95b0e..22238fe 100644 --- a/src/TRPC/TRPCWebSocketServer.ts +++ b/src/TRPC/TRPCWebSocketServer.ts @@ -1,10 +1,18 @@ -import type { AnyRouter } from "@trpc/server" import type { applyWSSHandler } from "@trpc/server/adapters/ws" import { Config, Context, Effect, Layer } from "effect" import type ws from "ws" import { ExpressNodeHTTPServer } from "../Express" import { ImportError } from "../ImportError" import { TRPCUnknownContextCreator } from "./TRPCContextCreator" +import { TRPCAnyRouter } from "./TRPCRouter" + + +export class TRPCWebSocketServer extends Context.Tag("@thilalib/TRPC/TRPCWebSocketServer")() {} + +export interface TRPCWebSocketServerService { + wss: ws.Server + handler: ReturnType +} const importWS = Effect.tryPromise({ @@ -17,57 +25,42 @@ const importTRPCServerWSAdapter = Effect.tryPromise({ catch: cause => new ImportError({ path: "@trpc/server/adapters/ws", cause }), }) +export const TRPCWebSocketServerLive = ( + config: { + readonly host: Config.Config + } +) => Layer.effect(TRPCWebSocketServer, Effect.gen(function*() { + const { WebSocketServer } = yield* importWS + const { applyWSSHandler } = yield* importTRPCServerWSAdapter -export const make = < - Tag, - TagShape extends AnyRouter, ->( - routerTag: Context.TagClass -) => { - class TRPCWebSocketServer extends Context.Tag("@thilalib/TRPC/TRPCWebSocketServer")> - }>() {} + const host = yield* config.host - const TRPCWebSocketServerLive = ( - config: { - readonly host: Config.Config - } - ) => Layer.effect(TRPCWebSocketServer, Effect.gen(function*() { - const { WebSocketServer } = yield* importWS - const { applyWSSHandler } = yield* importTRPCServerWSAdapter + return yield* Effect.acquireRelease( + Effect.gen(function*() { + yield* Effect.logInfo(`WebSocket server started on ${ host }`) - const host = yield* config.host + const wss = new WebSocketServer({ + server: yield* ExpressNodeHTTPServer.ExpressNodeHTTPServer, + host, + }) - return yield* Effect.acquireRelease( - Effect.gen(function*() { - yield* Effect.logInfo(`WebSocket server started on ${ host }`) - - const wss = new WebSocketServer({ - server: yield* ExpressNodeHTTPServer.ExpressNodeHTTPServer, - host, - }) - - return { + return { + wss, + handler: applyWSSHandler({ wss, - handler: applyWSSHandler({ - wss, - router: yield* routerTag, - createContext: (yield* TRPCUnknownContextCreator).createWebSocketContext, - }), - } - }), + router: yield* TRPCAnyRouter, + createContext: (yield* TRPCUnknownContextCreator).createWebSocketContext, + }), + } + }), - ({ wss, handler }) => Effect.gen(function*() { - yield* Effect.logInfo(`WebSocket server on ${ host } is stopping. Waiting for existing connections to end...`) + ({ wss, handler }) => Effect.gen(function*() { + yield* Effect.logInfo(`WebSocket server on ${ host } is stopping. Waiting for existing connections to end...`) - handler.broadcastReconnectNotification() - yield* Effect.async(resume => { - wss.close(() => resume(Effect.logInfo("WebSocket server closed"))) - }) - }), - ) - })) - - return { TRPCWebSocketServer, TRPCWebSocketServerLive } -} + handler.broadcastReconnectNotification() + yield* Effect.async(resume => { + wss.close(() => resume(Effect.logInfo("WebSocket server closed"))) + }) + }), + ) +})) diff --git a/src/TRPC/example.ts b/src/TRPC/example.ts index 6d6043f..1a3bd14 100644 --- a/src/TRPC/example.ts +++ b/src/TRPC/example.ts @@ -24,14 +24,11 @@ const router = TRPCBuilder.pipe(Effect.map(t => t.router({ const { TRPCRouter, TRPCRouterLive } = TRPC.TRPCRouter.make(router) -const { TRPCWebSocketServer, TRPCWebSocketServerLive } = TRPC.TRPCWebSocketServer.make(TRPCRouter) - - const ServerLive = Layer.empty.pipe( - Layer.provideMerge(TRPC.TRPCExpressRoute.TRPCExpressRouteLive(TRPCRouter, { + Layer.provideMerge(TRPC.TRPCExpressRoute.TRPCExpressRouteLive({ root: Config.succeed("/rpc") })), - Layer.provideMerge(TRPCWebSocketServerLive({ + Layer.provideMerge(TRPC.TRPCWebSocketServer.TRPCWebSocketServerLive({ host: Config.succeed("/rpc") })),