diff --git a/subscriptionHandler.ts b/subscriptionHandler.ts index adc254b..4a08c91 100644 --- a/subscriptionHandler.ts +++ b/subscriptionHandler.ts @@ -1,9 +1,46 @@ +import Crypto from "crypto"; import { WS } from "./index"; export interface Subscriber { send: (message: string) => void; } +export class Mailbox implements Subscriber { + // basic + id = Crypto.randomUUID(); + messages = new Set(); + + // websocket + _ws: WS | undefined; + + get ws(): WS | undefined { + return this._ws; + } + + set ws(ws: WS) { + this._ws = ws; + this.sendUnreadMessages(); + } + + // sending + send(message) { + if (this._ws) { + this._ws.send(message); + } else { + this.messages.add(message); + } + } + + sendUnreadMessages() { + this.messages.forEach((message) => { + if (!this._ws) return; + + this._ws.send(message); + this.messages.delete(message); + }); + } +} + export class SubscriptionMap { channelsPerSubscriber = new Map>(); subscribersPerChannel = new Map>(); diff --git a/websocket-handler.ts b/websocket-handler.ts index f827e13..5ab0d54 100644 --- a/websocket-handler.ts +++ b/websocket-handler.ts @@ -1,7 +1,4 @@ -import { - Subscriber, - SubscriptionMap, -} from "./subscriptionHandler"; +import { Subscriber, SubscriptionMap } from "./subscriptionHandler"; import { doIfIsString, parseMessage, @@ -23,11 +20,13 @@ export interface WebSocketMessage { // mailbox requestingMailboxSetup?: boolean; - assignedMailboxId?: string; + assignedMailboxId?: string; // sent by server + requestedMailbox?: string; // subscribing to channel subscribeChannel?: string; unsubscribeChannel?: string; + subscribed?: string; // sent by server to confirm subscription //sending message messageChannel?: string; @@ -216,7 +215,7 @@ function confirmSubscription( subscriber: Subscriber, messageChannel: string ): void { - const messageObject = { + const messageObject: WebSocketMessage = { messageChannel, subscribed: subscriptionMap.getChannelList(subscriber)?.has(messageChannel) ? true