import { firstValueFrom, Subject } from "rxjs"; export class MessageQueue { private queue: T[] = []; private messageAvailable$ = new Subject(); async enqueue(message: T): Promise { this.queue.push(message); this.messageAvailable$.next(); } async dequeue(): Promise { if (this.queue.length > 0) { return this.queue.shift() as T; } await firstValueFrom(this.messageAvailable$); return this.queue.shift() as T; } }