define mailbox
This commit is contained in:
@@ -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<string>();
|
||||
|
||||
// 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<Subscriber, Set<string>>();
|
||||
subscribersPerChannel = new Map<string, Set<Subscriber>>();
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user