From ea5333e5f77d81a0010e843295ee5e44858d8085 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Sat, 20 Dec 2025 18:24:05 +0100 Subject: [PATCH] fix: make web inbox non-blocking --- src/web/inbound.ts | 21 ++++++++++++-------- src/web/monitor-inbox.test.ts | 37 +++++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+), 8 deletions(-) diff --git a/src/web/inbound.ts b/src/web/inbound.ts index deff1e81f..f7f8ea334 100644 --- a/src/web/inbound.ts +++ b/src/web/inbound.ts @@ -227,12 +227,13 @@ export async function monitorWebInbox(options: { "inbound message", ); try { - await options.onMessage({ - id, - from, - conversationId: from, - to: selfE164 ?? "me", - body, + const task = Promise.resolve( + options.onMessage({ + id, + from, + conversationId: from, + to: selfE164 ?? "me", + body, pushName: senderName, timestamp, chatType: group ? "group" : "direct", @@ -248,8 +249,12 @@ export async function monitorWebInbox(options: { sendComposing, reply, sendMedia, - mediaPath, - mediaType, + mediaPath, + mediaType, + }), + ); + void task.catch((err) => { + console.error("Failed handling inbound web message:", String(err)); }); } catch (err) { console.error("Failed handling inbound web message:", String(err)); diff --git a/src/web/monitor-inbox.test.ts b/src/web/monitor-inbox.test.ts index fa26d6850..16bccef7c 100644 --- a/src/web/monitor-inbox.test.ts +++ b/src/web/monitor-inbox.test.ts @@ -114,6 +114,43 @@ describe("web monitor inbox", () => { await listener.close(); }); + it("does not block follow-up messages when handler is pending", async () => { + let resolveFirst: (() => void) | null = null; + const onMessage = vi.fn(async () => { + if (!resolveFirst) { + await new Promise((resolve) => { + resolveFirst = resolve; + }); + } + }); + + const listener = await monitorWebInbox({ verbose: false, onMessage }); + const sock = await createWaSocket(); + const upsert = { + type: "notify", + messages: [ + { + key: { id: "abc1", fromMe: false, remoteJid: "999@s.whatsapp.net" }, + message: { conversation: "ping" }, + messageTimestamp: 1_700_000_000, + }, + { + key: { id: "abc2", fromMe: false, remoteJid: "999@s.whatsapp.net" }, + message: { conversation: "pong" }, + messageTimestamp: 1_700_000_001, + }, + ], + }; + + sock.ev.emit("messages.upsert", upsert); + await new Promise((resolve) => setImmediate(resolve)); + + expect(onMessage).toHaveBeenCalledTimes(2); + + resolveFirst?.(); + await listener.close(); + }); + it("captures media path for image messages", async () => { const onMessage = vi.fn(); const listener = await monitorWebInbox({ verbose: false, onMessage });