fix(carousel): skip segundo create() + tctoken + ephemeral para corrigir 479

Três correções para eliminar erro 479 em dispositivos vinculados:

1. Skip WAProto.Message.create() em generateWAMessageFromContent para carousel
   - O carousel já foi processado com fromObject() (conversão profunda)
   - O segundo create() faz cópia rasa que pode perder tipos protobuf nested
   - Preserva a estrutura deep: cards > headers > imageMessage > nativeFlowMessage

2. Skip tctoken no stanza para carousel
   - Implementações que funcionam não incluem tctoken para carousel
   - Pode causar rejeição 479 em dispositivos vinculados (Web/Desktop)

3. Skip contextInfo.expiration (ephemeral) para carousel
   - Se mensagens temporárias estão ativadas, contextInfo.expiration era
     adicionado ao interactiveMessage, o que pode causar 479
   - Implementações que funcionam não passam por generateWAMessageFromContent

https://claude.ai/code/session_01EK9NpViRCtda1WAvFd8ptR
This commit is contained in:
Claude
2026-02-06 20:56:11 +00:00
parent 4037b3fcdd
commit dede2fa3c0
2 changed files with 18 additions and 3 deletions
+14 -2
View File
@@ -1712,6 +1712,10 @@ export const generateWAMessageFromContent = (
}
}
// Skip ephemeral contextInfo for carousel messages - carousel was already
// processed with fromObject and adding contextInfo.expiration may cause
// error 479 on linked devices (Web/Desktop)
const isCarouselEphemeral = !!(message as any)?.viewOnceMessage?.message?.interactiveMessage?.carouselMessage
if (
// if we want to send a disappearing message
!!options?.ephemeralExpiration &&
@@ -1720,7 +1724,9 @@ export const generateWAMessageFromContent = (
// already not converted to disappearing message
key !== 'ephemeralMessage' &&
// newsletters don't support ephemeral messages
!isJidNewsletter(jid)
!isJidNewsletter(jid) &&
// carousel messages should not have ephemeral contextInfo
!isCarouselEphemeral
) {
/* @ts-ignore */
innerMessage[key].contextInfo = {
@@ -1730,7 +1736,13 @@ export const generateWAMessageFromContent = (
}
}
message = WAProto.Message.create(message)
// For carousel messages already processed with fromObject, skip create() to
// preserve the deep protobuf conversion. create() does shallow assignment which
// may not properly handle deeply nested carousel structures (cards > headers > media)
const isCarouselVOM = !!(message as any)?.viewOnceMessage?.message?.interactiveMessage?.carouselMessage
if (!isCarouselVOM) {
message = WAProto.Message.create(message)
}
const messageJSON = {
key: {