feat(server): stream replayable harness events

This commit is contained in:
Wenxin Duan
2026-09-07 16:43:14 +08:00
parent 5e28e74ca1
commit acc5e26b1c
9 changed files with 314 additions and 6 deletions
+35
View File
@@ -0,0 +1,35 @@
import type { SseConnection } from "./sse-connection.js";
export interface SseRegistryPort {
add(sessionId: string, connection: SseConnection): void;
remove?(sessionId: string, connection: SseConnection): void;
closeForSession(sessionId: string): void;
closeAll(): void;
}
export class SseRegistry implements SseRegistryPort {
readonly #connections = new Map<string, Set<SseConnection>>();
public add(sessionId: string, connection: SseConnection): void {
const existing = this.#connections.get(sessionId);
if (existing !== undefined) existing.add(connection);
else this.#connections.set(sessionId, new Set([connection]));
}
public remove(sessionId: string, connection: SseConnection): void {
const existing = this.#connections.get(sessionId);
existing?.delete(connection);
if (existing?.size === 0) this.#connections.delete(sessionId);
}
public closeForSession(sessionId: string): void {
const connections = this.#connections.get(sessionId);
if (connections === undefined) return;
this.#connections.delete(sessionId);
for (const connection of [...connections]) connection.close();
}
public closeAll(): void {
for (const sessionId of [...this.#connections.keys()]) this.closeForSession(sessionId);
}
}