fix: address PR review — parallelize LID resolution, use helper consistently

- 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 <noreply@anthropic.com>
This commit is contained in:
Renato Alcara
2026-03-01 17:39:52 -03:00
parent 0a43ad849d
commit f5c07163f8
2 changed files with 20 additions and 18 deletions
+15 -13
View File
@@ -23,10 +23,11 @@ export const makeGroupsSocket = (config: SocketConfig) => {
/** Normalize group metadata participant IDs from LID to PN */
const normalizeGroupMetadata = async (metadata: GroupMetadata): Promise<GroupMetadata> => {
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
}
+5 -5
View File
@@ -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