import type { InboundMessage, OutboundMessage } from './types.ts'; /** A simple async FIFO queue that mirrors Python's asyncio.Queue behaviour. */ class AsyncQueue { private _items: T[] = []; private _waiters: Array<(value: T) => void> = []; enqueue(item: T): void { const waiter = this._waiters.shift(); if (waiter) { waiter(item); } else { this._items.push(item); } } dequeue(): Promise { const item = this._items.shift(); if (item !== undefined) { return Promise.resolve(item); } return new Promise((resolve) => { this._waiters.push(resolve); }); } get size(): number { return this._items.length; } } export class MessageBus { private _inbound = new AsyncQueue(); private _outbound = new AsyncQueue(); publishInbound(msg: InboundMessage): void { this._inbound.enqueue(msg); } consumeInbound(): Promise { return this._inbound.dequeue(); } publishOutbound(msg: OutboundMessage): void { this._outbound.enqueue(msg); } consumeOutbound(): Promise { return this._outbound.dequeue(); } }