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:
+15
-13
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user