diff --git a/src/Layers/trpc/TRPCExpressRoute.ts b/src/Layers/trpc/TRPCExpressRoute.ts index d46e288..66bface 100644 --- a/src/Layers/trpc/TRPCExpressRoute.ts +++ b/src/Layers/trpc/TRPCExpressRoute.ts @@ -1,8 +1,8 @@ -import { Config, Effect, Layer } from "effect" +import type { AnyRouter } from "@trpc/server" +import { Config, Context, Effect, Layer } from "effect" import { ImportError } from "../../ImportError" import { ExpressApp } from "../express" import { TRPCUnknownContextCreator } from "./TRPCContextCreator" -import { TRPCAnyRouter } from "./TRPCRouter" const importTRPCServerExpressAdapter = Effect.tryPromise({ @@ -10,17 +10,19 @@ const importTRPCServerExpressAdapter = Effect.tryPromise({ catch: cause => new ImportError({ path: "@trpc/server/adapters/express", cause }), }) -export const TRPCExpressRouteLive = ( +export const TRPCExpressRouteLive = ( + routerTag: Context.Tag<"@thilalib/TRCP/TRPCRouter", T>, + 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* TRPCAnyRouter, + router: yield* routerTag, createContext: (yield* TRPCUnknownContextCreator).createExpressContext, }) ) diff --git a/src/Layers/trpc/TRPCRouter.ts b/src/Layers/trpc/TRPCRouter.ts index a475740..827e478 100644 --- a/src/Layers/trpc/TRPCRouter.ts +++ b/src/Layers/trpc/TRPCRouter.ts @@ -1,14 +1,9 @@ -import type { AnyRouter, AnyRouterDef, Router } from "@trpc/server" +import type { AnyRouter } from "@trpc/server" import { Context, Effect, Layer } from "effect" -export class TRPCAnyRouter extends Context.Tag("@thilalib/TRCP/TRPCRouter")() {} - - export const make = < - A extends Router, + A extends AnyRouter, E, R, >(router: Effect.Effect) => { class TRPCRouter extends Context.Tag("@thilalib/TRCP/TRPCRouter")() {} diff --git a/src/Layers/trpc/TRPCWebSocketServer.ts b/src/Layers/trpc/TRPCWebSocketServer.ts index bcf214a..64169ad 100644 --- a/src/Layers/trpc/TRPCWebSocketServer.ts +++ b/src/Layers/trpc/TRPCWebSocketServer.ts @@ -1,16 +1,10 @@ +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 { ImportError } from "../../ImportError" import { ExpressNodeHTTPServer } from "../express" import { TRPCUnknownContextCreator } from "./TRPCContextCreator" -import { TRPCAnyRouter } from "./TRPCRouter" - - -export class TRPCWebSocketServer extends Context.Tag("@thilalib/TRPC/TRPCWebSocketServer") -}>() {} const importWS = Effect.tryPromise({ @@ -23,42 +17,54 @@ 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 - const host = yield* config.host +export const make = ( + routerTag: Context.Tag<"@thilalib/TRCP/TRPCRouter", T> +) => { + class TRPCWebSocketServer extends Context.Tag("@thilalib/TRPC/TRPCWebSocketServer")> + }>() {} - return yield* Effect.acquireRelease( - Effect.gen(function*() { - yield* Effect.logInfo(`WebSocket server started on ${ host }`) + const TRPCWebSocketServerLive = ( + config: { + readonly host: Config.Config + } + ) => Layer.effect(TRPCWebSocketServer, Effect.gen(function*() { + const { WebSocketServer } = yield* importWS + const { applyWSSHandler } = yield* importTRPCServerWSAdapter - const wss = new WebSocketServer({ - server: yield* ExpressNodeHTTPServer.ExpressNodeHTTPServer, - host, - }) + const host = yield* config.host - return { - wss, - handler: applyWSSHandler({ + 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 { wss, - router: yield* TRPCAnyRouter, - createContext: (yield* TRPCUnknownContextCreator).createWebSocketContext, - }), - } - }), + handler: applyWSSHandler({ + wss, + router: yield* routerTag, + 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"))) - }) - }), - ) -})) + handler.broadcastReconnectNotification() + yield* Effect.async(resume => { + wss.close(() => resume(Effect.logInfo("WebSocket server closed"))) + }) + }), + ) + })) + + return { TRPCWebSocketServer, TRPCWebSocketServerLive } +} diff --git a/src/Layers/trpc/tests.ts b/src/Layers/trpc/tests.ts index 366521a..359fb8b 100644 --- a/src/Layers/trpc/tests.ts +++ b/src/Layers/trpc/tests.ts @@ -16,11 +16,10 @@ const router = TRPCBuilder.pipe(Effect.map(t => t.router({ }))) const { TRPCRouter, TRPCRouterLive } = TRPC.TRPCRouter.make(router) -type TRouter = Context.Tag.Service const ServerLive = Layer.empty.pipe( - Layer.provideMerge(TRPC.TRPCExpressRoute.TRPCExpressRouteLive({ + Layer.provideMerge(TRPC.TRPCExpressRoute.TRPCExpressRouteLive(TRPCRouter, { root: Config.succeed("/rpc") })), diff --git a/src/Layers/trpc/tests2.ts b/src/Layers/trpc/tests2.ts deleted file mode 100644 index c1f2330..0000000 --- a/src/Layers/trpc/tests2.ts +++ /dev/null @@ -1,35 +0,0 @@ -import type { AnyRouter } from "@trpc/server" -import { Context, Effect, Layer } from "effect" -import * as TRPC from "." - - -const { TRPCBuilder, TRPCBuilderLive } = TRPC.TRPCBuilder.make() - -const router = TRPCBuilder.pipe(Effect.map(t => t.router({ - ping: t.procedure.query(({ ctx }) => ctx.run( - Effect.succeed("pong") - )), -}))) - - -export class TRPCAnyRouter extends Context.Tag("@thilalib/TRCP/TRPCRouter")() {} - -export class TRPCRouter extends Context.Tag("@thilalib/TRCP/TRPCRouter") ->() {} - -const RouterLive = Layer.effect(TRPCRouter, router) -const AnyRouterLive = Layer.effect(TRPCAnyRouter, router) - - -const main = Effect.gen(function*() { - yield* TRPCAnyRouter - yield* TRPCRouter -}) - -const runnable = main.pipe( - Effect.provide(RouterLive), - Effect.provide(TRPCBuilderLive), -)