From f5c07163f8e05a9b2803b462d382a00f7f68da7e Mon Sep 17 00:00:00 2001 From: Renato Alcara Date: Sun, 1 Mar 2026 17:39:52 -0300 Subject: [PATCH] =?UTF-8?q?fix:=20address=20PR=20review=20=E2=80=94=20para?= =?UTF-8?q?llelize=20LID=20resolution,=20use=20helper=20consistently?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - normalizeGroupMetadata: resolve participant LIDs with Promise.all instead of sequential loop (perf on large groups) - handleCall: resolve participant JIDs with Promise.all - handleBadAck: use normalizeKeyLidToPn() helper instead of manual resolveLidToPn + assignment (consistency with other code paths) - CB:relay: resolve callCreator LID→PN before emitting Co-Authored-By: Claude Opus 4.6 --- src/Socket/groups.ts | 28 +++++++++++++++------------- src/Socket/messages-recv.ts | 10 +++++----- 2 files changed, 20 insertions(+), 18 deletions(-) diff --git a/src/Socket/groups.ts b/src/Socket/groups.ts index 56a2a0b1..0c4716da 100644 --- a/src/Socket/groups.ts +++ b/src/Socket/groups.ts @@ -23,10 +23,11 @@ export const makeGroupsSocket = (config: SocketConfig) => { /** Normalize group metadata participant IDs from LID to PN */ const normalizeGroupMetadata = async (metadata: GroupMetadata): Promise => { const lidMapping = signalRepository.lidMapping - for (const p of metadata.participants) { + + // Resolve all participant LIDs in parallel for better performance on large groups + await Promise.all(metadata.participants.map(async (p) => { if (isLidUser(p.id)) { if (p.phoneNumber) { - // Inline PN available — use it and preserve LID p.lid = p.id p.id = p.phoneNumber } else { @@ -37,18 +38,19 @@ export const makeGroupsSocket = (config: SocketConfig) => { } } } - } + })) - // Normalize owner/subjectOwner if LID - if (metadata.owner && isLidUser(metadata.owner)) { - const resolved = metadata.ownerPn || await resolveLidToPn(metadata.owner, lidMapping, logger) - if (resolved) metadata.owner = resolved - } - - if (metadata.subjectOwner && isLidUser(metadata.subjectOwner)) { - const resolved = metadata.subjectOwnerPn || await resolveLidToPn(metadata.subjectOwner, lidMapping, logger) - if (resolved) metadata.subjectOwner = resolved - } + // Normalize owner/subjectOwner if LID (parallel) + const [resolvedOwner, resolvedSubjectOwner] = await Promise.all([ + metadata.owner && isLidUser(metadata.owner) + ? (metadata.ownerPn || resolveLidToPn(metadata.owner, lidMapping, logger)) + : null, + metadata.subjectOwner && isLidUser(metadata.subjectOwner) + ? (metadata.subjectOwnerPn || resolveLidToPn(metadata.subjectOwner, lidMapping, logger)) + : null + ]) + if (resolvedOwner) metadata.owner = resolvedOwner + if (resolvedSubjectOwner) metadata.subjectOwner = resolvedSubjectOwner return metadata } diff --git a/src/Socket/messages-recv.ts b/src/Socket/messages-recv.ts index 3474dd26..8e8b1ae3 100644 --- a/src/Socket/messages-recv.ts +++ b/src/Socket/messages-recv.ts @@ -2719,14 +2719,14 @@ export const makeMessagesRecvSocket = (config: SocketConfig) => { if (resolvedChatId) call.chatId = resolvedChatId if (resolvedFrom) call.from = resolvedFrom if (resolvedLinkCreator) call.linkCreator = resolvedLinkCreator - // Resolve participant JIDs + // Resolve participant JIDs in parallel if (call.participants) { - for (const p of call.participants) { + await Promise.all(call.participants.map(async (p) => { if (p.jid) { const resolved = p.userPn || await resolveLidToPn(p.jid, callLidMapping, logger) if (resolved) p.jid = resolved } - } + })) } ev.emit('call', [call]) @@ -2736,8 +2736,8 @@ export const makeMessagesRecvSocket = (config: SocketConfig) => { } const handleBadAck = async ({ attrs }: BinaryNode) => { - const resolvedFrom = await resolveLidToPn(attrs.from, signalRepository.lidMapping, logger) || attrs.from - const key: WAMessageKey = { remoteJid: resolvedFrom, fromMe: true, id: attrs.id } + const key: WAMessageKey = { remoteJid: attrs.from, fromMe: true, id: attrs.id } + await normalizeKeyLidToPn(key, signalRepository.lidMapping, logger) // WARNING: REFRAIN FROM ENABLING THIS FOR NOW. IT WILL CAUSE A LOOP // // current hypothesis is that if pash is sent in the ack