28 lines
879 B
TypeScript
28 lines
879 B
TypeScript
import { FastifyInstance, FastifyReply, FastifyRequest } from "fastify";
|
|
import { ChangeEvent, dbEvents } from "../realtime";
|
|
import { hasValidClaims } from "../auth";
|
|
|
|
export async function realTimeRoutes(fastify: FastifyInstance) {
|
|
fastify.get("/events", async (req: FastifyRequest, res: FastifyReply) => {
|
|
if (!req.user.role) {
|
|
return res.code(401).send({ error: "not authorized" });
|
|
}
|
|
|
|
res.raw.setHeader("Content-Type", "text/event-stream");
|
|
res.raw.setHeader("Cache-Control", "no-cache");
|
|
res.raw.setHeader("Connection", "keep-alive");
|
|
res.raw.flushHeaders();
|
|
|
|
dbEvents.on("change", (event: ChangeEvent) => {
|
|
if (hasValidClaims(req.user, event.requiredClaims)) {
|
|
delete event.requiredClaims;
|
|
res.raw.write(JSON.stringify(event));
|
|
}
|
|
});
|
|
|
|
req.raw.on("close", () => {
|
|
res.raw.end();
|
|
});
|
|
});
|
|
}
|