From 9f99a45b925fbd2af557f0fe45036becf73ee953 Mon Sep 17 00:00:00 2001 From: "Kalle (Sendou)" <38327916+Sendouc@users.noreply.github.com> Date: Tue, 11 Jan 2022 23:06:58 +0200 Subject: [PATCH] Events endpoint working example --- server/events.ts | 32 ++++++++++++++++++++++++++++++++ server/index.ts | 3 +++ 2 files changed, 35 insertions(+) create mode 100644 server/events.ts diff --git a/server/events.ts b/server/events.ts new file mode 100644 index 000000000..0b02dee45 --- /dev/null +++ b/server/events.ts @@ -0,0 +1,32 @@ +import type { Express } from "express"; + +export function setUpEvents(app: Express): void { + // https://stackoverflow.com/a/59041709 + app.get("/events", (_req, res) => { + res.setHeader("Cache-Control", "no-cache"); + res.setHeader("Content-Type", "text/event-stream"); + res.setHeader("Access-Control-Allow-Origin", "*"); + res.setHeader("Connection", "keep-alive"); + + // https://stackoverflow.com/a/69938612 + // Without this Express compression prevents any messages from being + // sent until `res.end()` is called + res.setHeader("Cache-Control", "no-cache, no-transform"); + + res.flushHeaders(); + + let counter = 0; + let interValID = setInterval(() => { + counter++; + console.log("write", counter); + res.write(`data: ${JSON.stringify({ num: counter })}\n\n`); // res.write() instead of res.send() + }, 1000); + + // If client closes connection, stop sending events + res.on("close", () => { + console.log("client dropped me"); + clearInterval(interValID); + res.end(); + }); + }); +} diff --git a/server/index.ts b/server/index.ts index 919e48b50..3710b95ea 100644 --- a/server/index.ts +++ b/server/index.ts @@ -8,6 +8,7 @@ import morgan from "morgan"; import path from "path"; import { LoggedInUser } from "~/validators/user"; import { setUpAuth } from "./auth"; +import { setUpEvents } from "./events"; import { setUpMockAuth } from "./mock-auth"; import { setUpSeed } from "./seed"; @@ -15,6 +16,7 @@ const MODE = process.env.NODE_ENV; const BUILD_DIR = path.join(process.cwd(), "server/build"); const app = express(); +app.disable("x-powered-by"); app.use(compression()); // You may want to be more aggressive with this caching @@ -31,6 +33,7 @@ try { setUpAuth(app); setUpMockAuth(app, mockUserFromHTTPCall); setUpSeed(app); + setUpEvents(app); } catch (err) { console.error(err); }