From 99cece16c0c709f6a707db5af8863ca0e5597513 Mon Sep 17 00:00:00 2001 From: yiekheng Date: Sat, 9 May 2026 16:48:42 +0800 Subject: [PATCH] fix(bot): pre-fetch group metadata + retry sender on libsignal race First send to a group after pairing fails with libsignal SessionError "No sessions" because Baileys hasn't yet established encryption sessions with all participants. Force-fetch group metadata before sendMessage so Baileys populates its participant map; if the first send still races, retry once after a 1.5s delay. --- apps/bot/src/whatsapp/sender.ts | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/apps/bot/src/whatsapp/sender.ts b/apps/bot/src/whatsapp/sender.ts index a66ada0..d1db645 100644 --- a/apps/bot/src/whatsapp/sender.ts +++ b/apps/bot/src/whatsapp/sender.ts @@ -5,6 +5,29 @@ export async function sendTextToGroup( groupJid: string, text: string, ): Promise<{ messageId: string | undefined }> { - const result = await socket.sendMessage(groupJid, { text }); - return { messageId: result?.key?.id ?? undefined }; + // Force-fetch group metadata so Baileys populates its internal participant + // map and triggers libsignal session establishment for any unknown member. + // Without this, the first send to a freshly-paired group fails with + // "No sessions" from libsignal-node. + try { + await socket.groupMetadata(groupJid); + } catch { + // If metadata fetch itself fails we still try the send — sendMessage will + // surface a clearer error than the metadata layer. + } + + try { + const result = await socket.sendMessage(groupJid, { text }); + return { messageId: result?.key?.id ?? undefined }; + } catch (err) { + // libsignal session establishment can race on the very first send. Retry + // once after a brief delay before giving up. + const message = (err as Error)?.message ?? ""; + if (message.includes("No sessions")) { + await new Promise((resolve) => setTimeout(resolve, 1500)); + const result = await socket.sendMessage(groupJid, { text }); + return { messageId: result?.key?.id ?? undefined }; + } + throw err; + } }