Review a real-time subscription lifecycle

src/subscription-gateway-types.tsTypeScript
@@ -0,0 +1,37 @@
1+export interface RealtimeMessage {
2+ topic: string;
3+ data: string;
4+}
5+
6+export interface ClientConnection {
7+ id: string;
8+ accept(): Promise<void>;
9+ send(message: RealtimeMessage): Promise<void>;
10+ close(reason: "server-shutdown" | "slow-client"): Promise<void>;
11+ closed: Promise<{ orderly: boolean }>;
12+}
13+
14+export interface MessageQueue extends AsyncIterable<RealtimeMessage> {
15+ push(message: RealtimeMessage): "queued" | "full";
16+ close(): void;
17+}
18+
19+export interface Subscription {
20+ unsubscribe(): void;
21+}
22+
23+export interface SubscriptionGatewayDependencies {
24+ capacity: {
25+ acquire(): Promise<{ release(): void }>;
26+ };
27+ broker: {
28+ subscribe(topics: string[], onMessage: (message: RealtimeMessage) => void): Subscription;
29+ };
30+ queues: {
31+ create(capacity?: number): MessageQueue;
32+ };
33+ clientsLock: {
34+ runExclusive<T>(work: () => Promise<T> | T): Promise<T>;
35+ };
36+ shutdownTimeoutMilliseconds: number;
37+}