diff --git a/vite.config.ts b/vite.config.ts index 07318c9..7d00bd1 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,9 +1,66 @@ import react from "@vitejs/plugin-react"; -import { defineConfig } from "vite"; +import { PassThrough } from "stream"; +import { defineConfig, type ViteDevServer } from "vite"; + +// A simple connection manager for SSE +const clients = new Set(); + +type ConsoleLevel = "log" | "warn" | "error" | "info"; + +function sendLog(message: { level: ConsoleLevel; message: string }) { + clients.forEach((client) => + client.write(`data: ${JSON.stringify(message)}\n\n`) + ); +} + +// Intercept console messages +const originalConsole = { + log: console.log, + warn: console.warn, + error: console.error, + info: console.info, +}; + +Object.keys(originalConsole).forEach((level) => { + console[level as ConsoleLevel] = ( + ...args: Parameters + ) => { + sendLog({ level: level as ConsoleLevel, message: args.join(" ") }); + originalConsole[level as ConsoleLevel](...args); + }; +}); -// https://vite.dev/config/ export default defineConfig({ - plugins: [react()], + plugins: [ + react(), + { + name: "sse-plugin", + apply: "serve" as const, + configureServer(server: ViteDevServer) { + server.middlewares.use("/sse-logs", (req, res) => { + res.writeHead(200, { + "Content-Type": "text/event-stream", + "Cache-Control": "no-cache", + Connection: "keep-alive", + }); + + const stream = new PassThrough(); + clients.add(stream); + sendLog({ level: "info", message: "Client connected to SSE logs" }); + + stream.pipe(res); + + req.on("close", () => { + clients.delete(stream); + sendLog({ + level: "info", + message: "Client disconnected from SSE logs", + }); + }); + }); + }, + }, + ], server: { allowedHosts: [".develop.taylordb.ai", "localhost", "127.0.0.1"], host: "0.0.0.0", // Listen on all network interfaces