fix(carousel): switch to viewOnceMessage V1 + stop skipping own devices
1. Switch wrapper from viewOnceMessageV2 (field 55) to viewOnceMessage V1 (field 37). V2 renders on mobile but NOT on WhatsApp Web/Desktop. V1 is what ckptw, Vkazee, and most working Baileys forks use. Previous error 479 with V1 was caused by missing root header and fromObject() corruption - both now fixed. 2. Stop skipping own linked devices for carousel messages. This was preventing the sender's WhatsApp Web from receiving the carousel. 3. Allow DSM (deviceSentMessage) wrapper for carousel - no longer skip it for own devices or retry paths. https://claude.ai/code/session_018DkDxsjWzM131jy3ivWjZp
This commit is contained in:
@@ -681,12 +681,13 @@ export const generateCarouselMessage = async (
|
||||
'[CAROUSEL] Structure summary'
|
||||
)
|
||||
|
||||
// Wrap in viewOnceMessageV2 (NOT V1!) for WhatsApp Web/Desktop rendering
|
||||
// V2 (field 55) is the stable wrapper for interactive messages from non-Cloud API accounts
|
||||
// V1 (field 37) caused error 479 - V2 is the correct approach (confirmed by Z-API)
|
||||
// messageContextInfo with deviceListMetadata is required for multi-device rendering
|
||||
// Wrap in viewOnceMessage V1 (field 37) - used by ckptw, Vkazee, and most Baileys forks
|
||||
// V2 (field 55) renders on mobile but NOT on WhatsApp Web/Desktop
|
||||
// V1 is what WhatsApp Web expects for interactive messages
|
||||
// Previous error 479 with V1 was caused by missing root header + fromObject() corruption
|
||||
// Now fixed: root header always present, plain JS object, messageContextInfo included
|
||||
return {
|
||||
viewOnceMessageV2: {
|
||||
viewOnceMessage: {
|
||||
message: {
|
||||
messageContextInfo: {
|
||||
deviceListMetadata: {},
|
||||
@@ -1191,11 +1192,11 @@ export const generateWAMessageContent = async (
|
||||
}
|
||||
// Pass options for media processing if cards have images/videos
|
||||
const generated = await generateCarouselMessage(carouselOptions, options)
|
||||
m.viewOnceMessageV2 = generated.viewOnceMessageV2
|
||||
// messageContextInfo at the OUTER Message level too (not just inside the V2 wrapper)
|
||||
m.viewOnceMessage = generated.viewOnceMessage
|
||||
// messageContextInfo at the OUTER Message level too (not just inside the wrapper)
|
||||
// This ensures meMsg/DSM and multi-device routing get proper device list metadata
|
||||
m.messageContextInfo = { deviceListMetadata: {}, deviceListMetadataVersion: 2 }
|
||||
options.logger?.info('Sending carousel with viewOnceMessageV2 wrapper (plain object, no proto conversion)')
|
||||
options.logger?.info('Sending carousel with viewOnceMessage V1 wrapper (plain object, no proto conversion)')
|
||||
// Return the plain JS object directly WITHOUT calling WAProto.Message.fromObject()
|
||||
// This matches Pastorini's working approach where plain objects are passed directly
|
||||
// to relayMessage. The fromObject() conversion can corrupt nested carousel structures
|
||||
|
||||
Reference in New Issue
Block a user