Skip to content

Commit 34446d1

Browse files
author
KokeroO
committed
fix(whatsapp-baileys):
- Implement broken event checking before duplicate message checking. (Do not process failed events). - Implement error handling when downloading media with a fallback mechanism.
1 parent d7afe5d commit 34446d1

File tree

1 file changed

+59
-9
lines changed

1 file changed

+59
-9
lines changed

src/api/integrations/channel/whatsapp/whatsapp.baileys.service.ts

Lines changed: 59 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@ import makeWASocket, {
9999
Contact,
100100
delay,
101101
DisconnectReason,
102+
downloadContentFromMessage,
102103
downloadMediaMessage,
103104
generateWAMessageFromContent,
104105
getAggregateVotesInPollMessage,
@@ -1035,6 +1036,16 @@ export class BaileysStartupService extends ChannelStartupService {
10351036
) => {
10361037
try {
10371038
for (const received of messages) {
1039+
if (
1040+
received?.messageStubParameters?.some?.((param) =>
1041+
['No matching sessions found for message', 'Bad MAC', 'failed to decrypt message', 'SessionError'].some(
1042+
(err) => param?.includes?.(err),
1043+
),
1044+
)
1045+
) {
1046+
this.logger.warn(`Message ignored with messageStubParameters: ${JSON.stringify(received, null, 2)}`);
1047+
continue;
1048+
}
10381049
if (received.message?.conversation || received.message?.extendedTextMessage?.text) {
10391050
const text = received.message?.conversation || received.message?.extendedTextMessage?.text;
10401051

@@ -3242,8 +3253,8 @@ export class BaileysStartupService extends ChannelStartupService {
32423253
typeof numberVerified?.lid === 'string'
32433254
? numberVerified.lid
32443255
: numberJid.includes('@lid')
3245-
? numberJid.split('@')[1]
3246-
: undefined;
3256+
? numberJid.split('@')[1]
3257+
: undefined;
32473258
return new OnWhatsAppDto(
32483259
numberJid,
32493260
!!numberVerified?.exists,
@@ -3429,7 +3440,19 @@ export class BaileysStartupService extends ChannelStartupService {
34293440
}
34303441
}
34313442

3432-
public async getBase64FromMediaMessage(data: getBase64FromMediaMessageDto, getBuffer = false) {
3443+
public async mapMediaType(mediaType) {
3444+
const map = {
3445+
imageMessage: 'image',
3446+
videoMessage: 'video',
3447+
documentMessage: 'document',
3448+
stickerMessage: 'sticker',
3449+
audioMessage: 'audio',
3450+
ptvMessage: 'video',
3451+
};
3452+
return map[mediaType] || null;
3453+
}
3454+
3455+
public async getBase64FromMediaMessage(data: getBase64FromMediaMessageDto, getBuffer = false) {
34333456
try {
34343457
const m = data?.message;
34353458
const convertToMp4 = data?.convertToMp4 ?? false;
@@ -3469,12 +3492,39 @@ export class BaileysStartupService extends ChannelStartupService {
34693492
msg.message = JSON.parse(JSON.stringify(msg.message));
34703493
}
34713494

3472-
const buffer = await downloadMediaMessage(
3473-
{ key: msg?.key, message: msg?.message },
3474-
'buffer',
3475-
{},
3476-
{ logger: P({ level: 'error' }) as any, reuploadRequest: this.client.updateMediaMessage },
3477-
);
3495+
let buffer: Buffer;
3496+
3497+
try {
3498+
buffer = await downloadMediaMessage(
3499+
{ key: msg?.key, message: msg?.message },
3500+
'buffer',
3501+
{},
3502+
{ logger: P({ level: 'error' }) as any, reuploadRequest: this.client.updateMediaMessage },
3503+
);
3504+
} catch (err) {
3505+
this.logger.error('Download Media failed, trying to retry in 5 seconds...');
3506+
await new Promise((resolve) => setTimeout(resolve, 5000));
3507+
const mediaType = Object.keys(msg.message).find((key) => key.endsWith('Message'));
3508+
try {
3509+
const media = await downloadContentFromMessage(
3510+
{
3511+
mediaKey: msg.message?.[mediaType]?.mediaKey,
3512+
directPath: msg.message?.[mediaType]?.directPath,
3513+
url: `https://mmg.whatsapp.net${msg?.message?.[mediaType]?.directPath}`,
3514+
},
3515+
await this.mapMediaType(mediaType),
3516+
{},
3517+
);
3518+
const chunks = [];
3519+
for await (const chunk of media) {
3520+
chunks.push(chunk);
3521+
}
3522+
buffer = Buffer.concat(chunks);
3523+
this.logger.info('Download Media with downloadContentFromMessage was successful!');
3524+
} catch (fallbackErr) {
3525+
this.logger.error('Download Media with downloadContentFromMessage also failed!');
3526+
}
3527+
}
34783528
const typeMessage = getContentType(msg.message);
34793529

34803530
const ext = mimeTypes.extension(mediaMessage?.['mimetype']);

0 commit comments

Comments
 (0)