diff --git a/packages/server/src/http/ExpressHTTPServer.ts b/packages/server/src/http/ExpressHTTPServer.ts index b0aaef2..1b5474a 100644 --- a/packages/server/src/http/ExpressHTTPServer.ts +++ b/packages/server/src/http/ExpressHTTPServer.ts @@ -20,8 +20,7 @@ export module ExpressHTTPServer { }), server => Effect.gen(function*() { - yield* Effect.logInfo(`HTTP server is closing. Waiting for existing connections to end...`) - + yield* Effect.logInfo(`HTTP server is stopping. Waiting for existing connections to end...`) yield* Effect.async(resume => { server.close(() => resume(Effect.logInfo(`HTTP server closed`))) }) diff --git a/packages/server/src/http/WebSocketServer.ts b/packages/server/src/http/WebSocketServer.ts index 711b001..99e8699 100644 --- a/packages/server/src/http/WebSocketServer.ts +++ b/packages/server/src/http/WebSocketServer.ts @@ -1,14 +1,9 @@ -import { applyWSSHandler } from "@trpc/server/adapters/ws" import { Context, Effect, Layer, Runtime } from "effect" import ws from "ws" import { ExpressHTTPServer } from "../http/ExpressHTTPServer" -import { TRPCContextCreator } from "../trpc/TRPCContextCreator" -export class WebSocketServer extends Context.Tag("RPCWebSocketServer") -}>() {} +export class WebSocketServer extends Context.Tag("RPCWebSocketServer")() {} export module WebSocketServer { export const Live = Layer.effect(WebSocketServer, Effect.acquireRelease( @@ -17,21 +12,13 @@ export module WebSocketServer { Effect.map(Runtime.runSync) ) - const wss = new ws.WebSocketServer({ server: yield* ExpressHTTPServer }, () => - runSync(Effect.logInfo(`WebSocket RPC server started`)) + return new ws.WebSocketServer({ server: yield* ExpressHTTPServer }, () => + runSync(Effect.logInfo(`WebSocket server started`)) ) - - const handler = applyWSSHandler({ - wss, - router: yield* RPCRouter, - createContext: yield* TRPCContextCreator, - }) - - return { wss, handler } }), - ({ wss, handler }) => Effect.gen(function*() { - yield* Effect.logInfo(`WebSocket server is closing. Waiting for existing connections to end...`) + wss => Effect.gen(function*() { + yield* Effect.logInfo(`WebSocket server is stopping. Waiting for existing connections to end...`) yield* Effect.async(resume => { wss.close(() => resume(Effect.logInfo(`WebSocket server closed`))) }) diff --git a/packages/server/src/index.ts b/packages/server/src/index.ts index ca623bb..95a7b6b 100644 --- a/packages/server/src/index.ts +++ b/packages/server/src/index.ts @@ -7,17 +7,17 @@ import { TodoRepository, createDefaultTodos } from "./TodoRepository" import { ExpressApp } from "./http/ExpressApp" import { ExpressHTTPServer } from "./http/ExpressHTTPServer" import { RPCPlaygroundRoute } from "./rpc/RPCPlaygroundRoute" +import { RPCRoute } from "./rpc/RPCRoute" import { RPCRouter } from "./rpc/RPCRouter" -import { RPCServerRoute } from "./rpc/RPCServerRoute" -import { RPCWebSocketServer } from "./rpc/RPCWebSocketServer" +import { RPCWebSocketHandler } from "./rpc/RPCWebSocketHandler" import { RPCProcedureBuilder } from "./rpc/procedures/RPCProcedureBuilder" import { TRPCBuilder } from "./trpc/TRPCBuilder" import { TRPCContextCreator } from "./trpc/TRPCContextCreator" const ServerDev = ExpressHTTPServer.Live.pipe( - Layer.provide(RPCWebSocketServer.Live), - Layer.provide(RPCServerRoute.Live), + Layer.provide(RPCWebSocketHandler.Live), + Layer.provide(RPCRoute.Live), Layer.provide(RPCPlaygroundRoute.Dev), Layer.provide(RPCRouter.Live), Layer.provide(RPCProcedureBuilder.Live), diff --git a/packages/server/src/rpc/RPCServerRoute.ts b/packages/server/src/rpc/RPCRoute.ts similarity index 95% rename from packages/server/src/rpc/RPCServerRoute.ts rename to packages/server/src/rpc/RPCRoute.ts index a8a8e53..d2374b7 100644 --- a/packages/server/src/rpc/RPCServerRoute.ts +++ b/packages/server/src/rpc/RPCRoute.ts @@ -6,7 +6,7 @@ import { TRPCContextCreator } from "../trpc/TRPCContextCreator" import { RPCRouter } from "./RPCRouter" -export module RPCServerRoute { +export module RPCRoute { export const Live = Layer.effectDiscard(Effect.gen(function*() { const app = yield* ExpressApp diff --git a/packages/server/src/rpc/RPCWebSocketHandler.ts b/packages/server/src/rpc/RPCWebSocketHandler.ts new file mode 100644 index 0000000..30954d2 --- /dev/null +++ b/packages/server/src/rpc/RPCWebSocketHandler.ts @@ -0,0 +1,22 @@ +import { applyWSSHandler } from "@trpc/server/adapters/ws" +import { Effect, Layer } from "effect" +import { WebSocketServer } from "../http/WebSocketServer" +import { TRPCContextCreator } from "../trpc/TRPCContextCreator" +import { RPCRouter } from "./RPCRouter" + + +export module RPCWebSocketHandler { + export const Live = Layer.effectDiscard(Effect.acquireRelease( + Effect.gen(function*() { + return applyWSSHandler({ + wss: yield* WebSocketServer, + router: yield* RPCRouter, + createContext: yield* TRPCContextCreator, + }) + }), + + handler => Effect.sync(() => + handler.broadcastReconnectNotification() + ), + )) +} diff --git a/packages/server/src/rpc/RPCWebSocketServer.ts b/packages/server/src/rpc/RPCWebSocketServer.ts deleted file mode 100644 index f2611e0..0000000 --- a/packages/server/src/rpc/RPCWebSocketServer.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { applyWSSHandler } from "@trpc/server/adapters/ws" -import { Context, Effect, Layer, Runtime } from "effect" -import ws from "ws" -import { ExpressHTTPServer } from "../http/ExpressHTTPServer" -import { TRPCContextCreator } from "../trpc/TRPCContextCreator" -import { RPCRouter } from "./RPCRouter" - - -export class RPCWebSocketServer extends Context.Tag("RPCWebSocketServer") -}>() {} - -export module RPCWebSocketServer { - export const Live = Layer.effect(RPCWebSocketServer, Effect.acquireRelease( - Effect.gen(function*() { - const runSync = yield* Effect.runtime().pipe( - Effect.map(Runtime.runSync) - ) - - // Extract this to its own service? - const wss = new ws.WebSocketServer({ server: yield* ExpressHTTPServer }, () => - runSync(Effect.logInfo(`WebSocket RPC server started`)) - ) - - const handler = applyWSSHandler({ - wss, - router: yield* RPCRouter, - createContext: yield* TRPCContextCreator, - }) - - return { wss, handler } - }), - - ({ wss, handler }) => Effect.gen(function*() { - yield* Effect.logInfo(`WebSocket server is closing. Waiting for existing connections to end...`) - - handler.broadcastReconnectNotification() - yield* Effect.async(resume => { - wss.close(() => resume(Effect.logInfo(`WebSocket server closed`))) - }) - }), - )) -}