From ada7268062337a62532793d221a638724a5b2fc6 Mon Sep 17 00:00:00 2001 From: Darius Date: Wed, 4 Feb 2026 21:52:32 +0100 Subject: [PATCH] sse typing --- dist/index.d.ts | 1 + dist/index.d.ts.map | 2 +- dist/index.js | 1 + dist/sse.d.ts | 17 +++++++++++++++++ dist/sse.d.ts.map | 1 + dist/sse.js | 23 +++++++++++++++++++++++ src/index.ts | 2 ++ src/sse.ts | 43 +++++++++++++++++++++++++++++++++++++++++++ 8 files changed, 89 insertions(+), 1 deletion(-) create mode 100644 dist/sse.d.ts create mode 100644 dist/sse.d.ts.map create mode 100644 dist/sse.js create mode 100644 src/sse.ts diff --git a/dist/index.d.ts b/dist/index.d.ts index 95b5110..2db5ce4 100644 --- a/dist/index.d.ts +++ b/dist/index.d.ts @@ -1,6 +1,7 @@ export * from "./fastify.js"; export * from "./homeassistant.js"; export * from "./logger.js"; +export * from "./sse.js"; export * from "./tidal.js"; export * from "./timehelper.js"; //# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/dist/index.d.ts.map b/dist/index.d.ts.map index aca554b..7f50797 100644 --- a/dist/index.d.ts.map +++ b/dist/index.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,oBAAoB,CAAC;AACnC,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC"} \ No newline at end of file +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,oBAAoB,CAAC;AACnC,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC"} \ No newline at end of file diff --git a/dist/index.js b/dist/index.js index 1e08bca..09b502f 100644 --- a/dist/index.js +++ b/dist/index.js @@ -1,5 +1,6 @@ export * from "./fastify.js"; export * from "./homeassistant.js"; export * from "./logger.js"; +export * from "./sse.js"; export * from "./tidal.js"; export * from "./timehelper.js"; diff --git a/dist/sse.d.ts b/dist/sse.d.ts new file mode 100644 index 0000000..cb02f35 --- /dev/null +++ b/dist/sse.d.ts @@ -0,0 +1,17 @@ +export interface SseClient { + id: number; + send: (data: SseEvent) => void; +} +export interface SseEvent { + type: string; + data?: unknown; + message?: string; +} +export declare class SseService { + private clients; + addClient(client: SseClient): void; + removeClient(clientId: number): void; + notifyClients(event: SseEvent): void; + getClientCount(): number; +} +//# sourceMappingURL=sse.d.ts.map \ No newline at end of file diff --git a/dist/sse.d.ts.map b/dist/sse.d.ts.map new file mode 100644 index 0000000..3383a3d --- /dev/null +++ b/dist/sse.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"sse.d.ts","sourceRoot":"","sources":["../src/sse.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,SAAS;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,CAAC;CAC/B;AAED,MAAM,WAAW,QAAQ;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,UAAU;IACtB,OAAO,CAAC,OAAO,CAAwB;IAEvC,SAAS,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI;IAOlC,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAUpC,aAAa,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI;IAMpC,cAAc,IAAI,MAAM;CAGxB"} \ No newline at end of file diff --git a/dist/sse.js b/dist/sse.js new file mode 100644 index 0000000..e10199f --- /dev/null +++ b/dist/sse.js @@ -0,0 +1,23 @@ +import { logInfo } from "./logger"; +export class SseService { + clients = new Set(); + addClient(client) { + this.clients.add(client); + logInfo(`SSE client connected: ${client.id}. Total clients: ${this.clients.size}`); + } + removeClient(clientId) { + const client = [...this.clients].find((c) => c.id === clientId); + if (client) { + this.clients.delete(client); + logInfo(`SSE client disconnected: ${clientId}. Total clients: ${this.clients.size}`); + } + } + notifyClients(event) { + this.clients.forEach((client) => { + client.send(event); + }); + } + getClientCount() { + return this.clients.size; + } +} diff --git a/src/index.ts b/src/index.ts index 1e08bca..daaf22a 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,5 +1,7 @@ export * from "./fastify.js"; export * from "./homeassistant.js"; export * from "./logger.js"; +export * from "./sse.js"; export * from "./tidal.js"; export * from "./timehelper.js"; + diff --git a/src/sse.ts b/src/sse.ts new file mode 100644 index 0000000..0dc3167 --- /dev/null +++ b/src/sse.ts @@ -0,0 +1,43 @@ +import { logInfo } from "./logger"; + +export interface SseClient { + id: number; + send: (data: SseEvent) => void; +} + +export interface SseEvent { + type: string; + data?: unknown; + message?: string; +} + +export class SseService { + private clients = new Set(); + + addClient(client: SseClient): void { + this.clients.add(client); + logInfo( + `SSE client connected: ${client.id}. Total clients: ${this.clients.size}`, + ); + } + + removeClient(clientId: number): void { + const client = [...this.clients].find((c) => c.id === clientId); + if (client) { + this.clients.delete(client); + logInfo( + `SSE client disconnected: ${clientId}. Total clients: ${this.clients.size}`, + ); + } + } + + notifyClients(event: SseEvent): void { + this.clients.forEach((client) => { + client.send(event); + }); + } + + getClientCount(): number { + return this.clients.size; + } +}