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; + } }