From b8210ddd669c8bec428b8f57e7c3a5a2eb4898a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Thu, 11 Jul 2024 03:49:14 +0200 Subject: [PATCH] Express work --- bun.lockb | Bin 265078 -> 265046 bytes packages/server/src/express/ExpressApp.ts | 2 +- .../server/src/express/ExpressHTTPServer.ts | 32 ++++++++++++------ packages/server/src/rpc/RPCWebSocketServer.ts | 10 ++++-- packages/webui/package.json | 3 +- 5 files changed, 31 insertions(+), 16 deletions(-) diff --git a/bun.lockb b/bun.lockb index 690ee21edbc42c4c5140b1313f60ef07de51a2d2..a6e4ede6fbc1e414ca49fcaed0491018c78c4ea9 100755 GIT binary patch delta 20876 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 NdX{Bev)pU(e*g=3_dNgr delta 20234 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 {} +export class ExpressApp extends Context.Tag("ExpressApp")() {} export module ExpressApp { export const Live = Layer.sync(ExpressApp, () => express()) diff --git a/packages/server/src/express/ExpressHTTPServer.ts b/packages/server/src/express/ExpressHTTPServer.ts index e17efd5..6191476 100644 --- a/packages/server/src/express/ExpressHTTPServer.ts +++ b/packages/server/src/express/ExpressHTTPServer.ts @@ -1,19 +1,31 @@ -import { Effect, Layer } from "effect" +import { Context, Effect, Layer, Runtime } from "effect" +import { Server } from "node:http" import { httpPort } from "../config" import { ExpressApp } from "./ExpressApp" +export class ExpressHTTPServer extends Context.Tag("ExpressHTTPServer")() {} + export module ExpressHTTPServer { export const Live = Layer.scopedDiscard(Effect.acquireRelease( - Effect.gen(function*() { - const app = yield* ExpressApp - const port = yield* httpPort + Effect.gen(function*() { + const runSync = yield* Effect.runtime().pipe( + Effect.map(Runtime.runSync) + ) - return app.listen(port, () => console.log(`HTTP server listening on ${ port }.`)) - }), + const app = yield* ExpressApp + const port = yield* httpPort - server => Effect.sync(() => - server.close() - ), - )) + return app.listen(port, () => runSync(Effect.logInfo(`HTTP server listening on ${ port }`))) + }), + + server => Effect.gen(function*() { + yield* Effect.logInfo(`HTTP server is closing. Waiting for existing connections to end...`) + + yield* Effect.async(resume => { + server.close(() => resume(Effect.logInfo(`HTTP server closed`))) + }) + }), + ) + ) } diff --git a/packages/server/src/rpc/RPCWebSocketServer.ts b/packages/server/src/rpc/RPCWebSocketServer.ts index 303b3f4..4fb7d2c 100644 --- a/packages/server/src/rpc/RPCWebSocketServer.ts +++ b/packages/server/src/rpc/RPCWebSocketServer.ts @@ -1,6 +1,6 @@ import { applyWSSHandler } from "@trpc/server/adapters/ws" -import { Effect, Layer } from "effect" -import ws from "ws" +import { Effect, Layer, Runtime } from "effect" +import { WebSocketServer } from "ws" import { websocketPort } from "../config" import { TRPCContextCreator } from "../trpc/TRPCContextCreator" import { RPCRouter } from "./RPCRouter" @@ -9,7 +9,11 @@ import { RPCRouter } from "./RPCRouter" export module RPCWebSocketServer { export const Live = Layer.scopedDiscard(Effect.acquireRelease( Effect.gen(function*() { - const wss = new ws.Server({ port: yield* websocketPort }) + const runSync = yield* Effect.runtime().pipe( + Effect.map(Runtime.runSync) + ) + + const wss = new WebSocketServer({ port: yield* websocketPort }) const handler = applyWSSHandler({ wss, diff --git a/packages/webui/package.json b/packages/webui/package.json index 446d49b..69a4ce8 100644 --- a/packages/webui/package.json +++ b/packages/webui/package.json @@ -20,8 +20,7 @@ "mobx-react-lite": "^4.0.7", "primereact": "^10.7.0", "react": "^18.3.1", - "react-dom": "^18.3.1", - "ws": "^8.18.0" + "react-dom": "^18.3.1" }, "devDependencies": { "@types/react": "^18.3.3",