import { KeyedAsyncQueue } from "openclaw/plugin-sdk/keyed-async-queue"; export const DEFAULT_SEND_GAP_MS = 150; type MatrixSendQueueOptions = { gapMs?: number; delayFn?: (ms: number) => Promise; }; // Serialize sends per room to preserve Matrix delivery order. const roomQueues = new KeyedAsyncQueue(); export function enqueueSend( roomId: string, fn: () => Promise, options?: MatrixSendQueueOptions, ): Promise { const gapMs = options?.gapMs ?? DEFAULT_SEND_GAP_MS; const delayFn = options?.delayFn ?? delay; return roomQueues.enqueue(roomId, async () => { await delayFn(gapMs); return await fn(); }); } function delay(ms: number): Promise { return new Promise((resolve) => setTimeout(resolve, ms)); }