@d0v3riz/baileys 6.7.22 → 6.7.24
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/WAProto/GenerateStatics.sh +3 -2
- package/WAProto/fix-imports.js +29 -0
- package/WAProto/index.js +4136 -4138
- package/lib/Defaults/index.d.ts +3 -2
- package/lib/Defaults/index.d.ts.map +1 -0
- package/lib/Defaults/index.js +36 -40
- package/lib/Defaults/index.js.map +1 -0
- package/lib/Signal/Group/ciphertext-message.d.ts +1 -0
- package/lib/Signal/Group/ciphertext-message.d.ts.map +1 -0
- package/lib/Signal/Group/ciphertext-message.js +2 -5
- package/lib/Signal/Group/ciphertext-message.js.map +1 -0
- package/lib/Signal/Group/group-session-builder.d.ts +4 -3
- package/lib/Signal/Group/group-session-builder.d.ts.map +1 -0
- package/lib/Signal/Group/group-session-builder.js +7 -41
- package/lib/Signal/Group/group-session-builder.js.map +1 -0
- package/lib/Signal/Group/group_cipher.d.ts +3 -2
- package/lib/Signal/Group/group_cipher.d.ts.map +1 -0
- package/lib/Signal/Group/group_cipher.js +14 -16
- package/lib/Signal/Group/group_cipher.js.map +1 -0
- package/lib/Signal/Group/index.d.ts +12 -11
- package/lib/Signal/Group/index.d.ts.map +1 -0
- package/lib/Signal/Group/index.js +12 -57
- package/lib/Signal/Group/index.js.map +1 -0
- package/lib/Signal/Group/keyhelper.d.ts +2 -1
- package/lib/Signal/Group/keyhelper.d.ts.map +1 -0
- package/lib/Signal/Group/keyhelper.js +8 -44
- package/lib/Signal/Group/keyhelper.js.map +1 -0
- package/lib/Signal/Group/queue-job.d.ts +1 -0
- package/lib/Signal/Group/queue-job.d.ts.map +1 -0
- package/lib/Signal/Group/queue-job.js +2 -5
- package/lib/Signal/Group/queue-job.js.map +1 -0
- package/lib/Signal/Group/sender-chain-key.d.ts +2 -1
- package/lib/Signal/Group/sender-chain-key.d.ts.map +1 -0
- package/lib/Signal/Group/sender-chain-key.js +7 -9
- package/lib/Signal/Group/sender-chain-key.js.map +1 -0
- package/lib/Signal/Group/sender-key-distribution-message.d.ts +2 -1
- package/lib/Signal/Group/sender-key-distribution-message.d.ts.map +1 -0
- package/lib/Signal/Group/sender-key-distribution-message.js +6 -9
- package/lib/Signal/Group/sender-key-distribution-message.js.map +1 -0
- package/lib/Signal/Group/sender-key-message.d.ts +2 -1
- package/lib/Signal/Group/sender-key-message.d.ts.map +1 -0
- package/lib/Signal/Group/sender-key-message.js +10 -12
- package/lib/Signal/Group/sender-key-message.js.map +1 -0
- package/lib/Signal/Group/sender-key-name.d.ts +1 -0
- package/lib/Signal/Group/sender-key-name.d.ts.map +1 -0
- package/lib/Signal/Group/sender-key-name.js +2 -5
- package/lib/Signal/Group/sender-key-name.js.map +1 -0
- package/lib/Signal/Group/sender-key-record.d.ts +2 -1
- package/lib/Signal/Group/sender-key-record.d.ts.map +1 -0
- package/lib/Signal/Group/sender-key-record.js +9 -12
- package/lib/Signal/Group/sender-key-record.js.map +1 -0
- package/lib/Signal/Group/sender-key-state.d.ts +3 -2
- package/lib/Signal/Group/sender-key-state.d.ts.map +1 -0
- package/lib/Signal/Group/sender-key-state.js +6 -9
- package/lib/Signal/Group/sender-key-state.js.map +1 -0
- package/lib/Signal/Group/sender-message-key.d.ts +1 -0
- package/lib/Signal/Group/sender-message-key.d.ts.map +1 -0
- package/lib/Signal/Group/sender-message-key.js +5 -7
- package/lib/Signal/Group/sender-message-key.js.map +1 -0
- package/lib/Signal/libsignal.d.ts +3 -2
- package/lib/Signal/libsignal.d.ts.map +1 -0
- package/lib/Signal/libsignal.js +22 -55
- package/lib/Signal/libsignal.js.map +1 -0
- package/lib/Socket/Client/index.d.ts +3 -2
- package/lib/Socket/Client/index.d.ts.map +1 -0
- package/lib/Socket/Client/index.js +3 -18
- package/lib/Socket/Client/index.js.map +1 -0
- package/lib/Socket/Client/types.d.ts +2 -1
- package/lib/Socket/Client/types.d.ts.map +1 -0
- package/lib/Socket/Client/types.js +4 -6
- package/lib/Socket/Client/types.js.map +1 -0
- package/lib/Socket/Client/websocket.d.ts +2 -1
- package/lib/Socket/Client/websocket.d.ts.map +1 -0
- package/lib/Socket/Client/websocket.js +14 -26
- package/lib/Socket/Client/websocket.js.map +1 -0
- package/lib/Socket/business.d.ts +65 -63
- package/lib/Socket/business.d.ts.map +1 -0
- package/lib/Socket/business.js +32 -37
- package/lib/Socket/business.js.map +1 -0
- package/lib/Socket/chats.d.ts +20 -18
- package/lib/Socket/chats.d.ts.map +1 -0
- package/lib/Socket/chats.js +176 -141
- package/lib/Socket/chats.js.map +1 -0
- package/lib/Socket/communities.d.ts +219 -0
- package/lib/Socket/communities.d.ts.map +1 -0
- package/lib/Socket/communities.js +351 -0
- package/lib/Socket/communities.js.map +1 -0
- package/lib/Socket/groups.d.ts +36 -34
- package/lib/Socket/groups.d.ts.map +1 -0
- package/lib/Socket/groups.js +56 -63
- package/lib/Socket/groups.js.map +1 -0
- package/lib/Socket/index.d.ts +101 -69
- package/lib/Socket/index.d.ts.map +1 -0
- package/lib/Socket/index.js +16 -9
- package/lib/Socket/index.js.map +1 -0
- package/lib/Socket/messages-recv.d.ts +50 -48
- package/lib/Socket/messages-recv.d.ts.map +1 -0
- package/lib/Socket/messages-recv.js +180 -173
- package/lib/Socket/messages-recv.js.map +1 -0
- package/lib/Socket/messages-send.d.ts +47 -45
- package/lib/Socket/messages-send.d.ts.map +1 -0
- package/lib/Socket/messages-send.js +75 -84
- package/lib/Socket/messages-send.js.map +1 -0
- package/lib/Socket/mex.d.ts +2 -1
- package/lib/Socket/mex.d.ts.map +1 -0
- package/lib/Socket/mex.js +12 -16
- package/lib/Socket/mex.js.map +1 -0
- package/lib/Socket/newsletter.d.ts +45 -43
- package/lib/Socket/newsletter.d.ts.map +1 -0
- package/lib/Socket/newsletter.js +23 -27
- package/lib/Socket/newsletter.js.map +1 -0
- package/lib/Socket/socket.d.ts +12 -11
- package/lib/Socket/socket.d.ts.map +1 -0
- package/lib/Socket/socket.js +96 -105
- package/lib/Socket/socket.js.map +1 -0
- package/lib/Socket/usync.d.ts +14 -13
- package/lib/Socket/usync.d.ts.map +1 -0
- package/lib/Socket/usync.js +9 -11
- package/lib/Socket/usync.js.map +1 -0
- package/lib/Types/Auth.d.ts +4 -3
- package/lib/Types/Auth.d.ts.map +1 -0
- package/lib/Types/Auth.js +2 -2
- package/lib/Types/Auth.js.map +1 -0
- package/lib/Types/Call.d.ts +1 -0
- package/lib/Types/Call.d.ts.map +1 -0
- package/lib/Types/Call.js +2 -2
- package/lib/Types/Call.js.map +1 -0
- package/lib/Types/Chat.d.ts +10 -7
- package/lib/Types/Chat.d.ts.map +1 -0
- package/lib/Types/Chat.js +2 -4
- package/lib/Types/Chat.js.map +1 -0
- package/lib/Types/Contact.d.ts +1 -0
- package/lib/Types/Contact.d.ts.map +1 -0
- package/lib/Types/Contact.js +2 -2
- package/lib/Types/Contact.js.map +1 -0
- package/lib/Types/Events.d.ts +11 -10
- package/lib/Types/Events.d.ts.map +1 -0
- package/lib/Types/Events.js +2 -2
- package/lib/Types/Events.js.map +1 -0
- package/lib/Types/GroupMetadata.d.ts +3 -2
- package/lib/Types/GroupMetadata.d.ts.map +1 -0
- package/lib/Types/GroupMetadata.js +2 -2
- package/lib/Types/GroupMetadata.js.map +1 -0
- package/lib/Types/Label.d.ts +1 -0
- package/lib/Types/Label.d.ts.map +1 -0
- package/lib/Types/Label.js +3 -5
- package/lib/Types/Label.js.map +1 -0
- package/lib/Types/LabelAssociation.d.ts +1 -0
- package/lib/Types/LabelAssociation.d.ts.map +1 -0
- package/lib/Types/LabelAssociation.js +3 -5
- package/lib/Types/LabelAssociation.js.map +1 -0
- package/lib/Types/Message.d.ts +9 -7
- package/lib/Types/Message.d.ts.map +1 -0
- package/lib/Types/Message.js +7 -7
- package/lib/Types/Message.js.map +1 -0
- package/lib/Types/Newsletter.d.ts +1 -0
- package/lib/Types/Newsletter.d.ts.map +1 -0
- package/lib/Types/Newsletter.js +5 -7
- package/lib/Types/Newsletter.js.map +1 -0
- package/lib/Types/Product.d.ts +2 -1
- package/lib/Types/Product.d.ts.map +1 -0
- package/lib/Types/Product.js +2 -2
- package/lib/Types/Product.js.map +1 -0
- package/lib/Types/Signal.d.ts +2 -1
- package/lib/Types/Signal.d.ts.map +1 -0
- package/lib/Types/Signal.js +2 -2
- package/lib/Types/Signal.js.map +1 -0
- package/lib/Types/Socket.d.ts +8 -7
- package/lib/Types/Socket.d.ts.map +1 -0
- package/lib/Types/Socket.js +3 -2
- package/lib/Types/Socket.js.map +1 -0
- package/lib/Types/State.d.ts +14 -2
- package/lib/Types/State.d.ts.map +1 -0
- package/lib/Types/State.js +13 -2
- package/lib/Types/State.js.map +1 -0
- package/lib/Types/USync.d.ts +3 -2
- package/lib/Types/USync.d.ts.map +1 -0
- package/lib/Types/USync.js +2 -2
- package/lib/Types/USync.js.map +1 -0
- package/lib/Types/index.d.ts +15 -14
- package/lib/Types/index.d.ts.map +1 -0
- package/lib/Types/index.js +15 -31
- package/lib/Types/index.js.map +1 -0
- package/lib/Utils/auth-utils.d.ts +3 -2
- package/lib/Utils/auth-utils.d.ts.map +1 -0
- package/lib/Utils/auth-utils.js +25 -34
- package/lib/Utils/auth-utils.js.map +1 -0
- package/lib/Utils/baileys-event-stream.d.ts +2 -1
- package/lib/Utils/baileys-event-stream.d.ts.map +1 -0
- package/lib/Utils/baileys-event-stream.js +15 -22
- package/lib/Utils/baileys-event-stream.js.map +1 -0
- package/lib/Utils/business.d.ts +3 -2
- package/lib/Utils/business.d.ts.map +1 -0
- package/lib/Utils/business.js +61 -70
- package/lib/Utils/business.js.map +1 -0
- package/lib/Utils/chat-utils.d.ts +8 -7
- package/lib/Utils/chat-utils.d.ts.map +1 -0
- package/lib/Utils/chat-utils.js +130 -137
- package/lib/Utils/chat-utils.js.map +1 -0
- package/lib/Utils/crypto.d.ts +2 -1
- package/lib/Utils/crypto.d.ts.map +1 -0
- package/lib/Utils/crypto.js +37 -86
- package/lib/Utils/crypto.js.map +1 -0
- package/lib/Utils/decode-wa-message.d.ts +5 -4
- package/lib/Utils/decode-wa-message.d.ts.map +1 -0
- package/lib/Utils/decode-wa-message.js +38 -44
- package/lib/Utils/decode-wa-message.js.map +1 -0
- package/lib/Utils/event-buffer.d.ts +4 -4
- package/lib/Utils/event-buffer.d.ts.map +1 -0
- package/lib/Utils/event-buffer.js +37 -50
- package/lib/Utils/event-buffer.js.map +1 -0
- package/lib/Utils/generics.d.ts +9 -8
- package/lib/Utils/generics.d.ts.map +1 -0
- package/lib/Utils/generics.js +87 -114
- package/lib/Utils/generics.js.map +1 -0
- package/lib/Utils/history.d.ts +4 -3
- package/lib/Utils/history.d.ts.map +1 -0
- package/lib/Utils/history.js +32 -40
- package/lib/Utils/history.js.map +1 -0
- package/lib/Utils/index.d.ts +18 -17
- package/lib/Utils/index.d.ts.map +1 -0
- package/lib/Utils/index.js +18 -33
- package/lib/Utils/index.js.map +1 -0
- package/lib/Utils/link-preview.d.ts +4 -3
- package/lib/Utils/link-preview.d.ts.map +1 -0
- package/lib/Utils/link-preview.js +10 -47
- package/lib/Utils/link-preview.js.map +1 -0
- package/lib/Utils/logger.d.ts +8 -6
- package/lib/Utils/logger.d.ts.map +1 -0
- package/lib/Utils/logger.js +3 -7
- package/lib/Utils/logger.js.map +1 -0
- package/lib/Utils/lt-hash.d.ts +9 -8
- package/lib/Utils/lt-hash.d.ts.map +1 -0
- package/lib/Utils/lt-hash.js +23 -26
- package/lib/Utils/lt-hash.js.map +1 -0
- package/lib/Utils/make-mutex.d.ts +1 -0
- package/lib/Utils/make-mutex.d.ts.map +1 -0
- package/lib/Utils/make-mutex.js +5 -9
- package/lib/Utils/make-mutex.js.map +1 -0
- package/lib/Utils/messages-media.d.ts +11 -10
- package/lib/Utils/messages-media.d.ts.map +1 -0
- package/lib/Utils/messages-media.js +141 -203
- package/lib/Utils/messages-media.js.map +1 -0
- package/lib/Utils/messages.d.ts +7 -6
- package/lib/Utils/messages.d.ts.map +1 -0
- package/lib/Utils/messages.js +189 -198
- package/lib/Utils/messages.js.map +1 -0
- package/lib/Utils/noise-handler.d.ts +5 -4
- package/lib/Utils/noise-handler.d.ts.map +1 -0
- package/lib/Utils/noise-handler.js +22 -26
- package/lib/Utils/noise-handler.js.map +1 -0
- package/lib/Utils/process-message.d.ts +5 -4
- package/lib/Utils/process-message.d.ts.map +1 -0
- package/lib/Utils/process-message.js +95 -104
- package/lib/Utils/process-message.js.map +1 -0
- package/lib/Utils/signal.d.ts +5 -4
- package/lib/Utils/signal.d.ts.map +1 -0
- package/lib/Utils/signal.js +47 -52
- package/lib/Utils/signal.js.map +1 -0
- package/lib/Utils/use-multi-file-auth-state.d.ts +2 -1
- package/lib/Utils/use-multi-file-auth-state.d.ts.map +1 -0
- package/lib/Utils/use-multi-file-auth-state.js +23 -26
- package/lib/Utils/use-multi-file-auth-state.js.map +1 -0
- package/lib/Utils/validate-connection.d.ts +4 -3
- package/lib/Utils/validate-connection.d.ts.map +1 -0
- package/lib/Utils/validate-connection.js +52 -58
- package/lib/Utils/validate-connection.js.map +1 -0
- package/lib/WABinary/constants.d.ts +1 -0
- package/lib/WABinary/constants.d.ts.map +1 -0
- package/lib/WABinary/constants.js +9 -11
- package/lib/WABinary/constants.js.map +1 -0
- package/lib/WABinary/decode.d.ts +2 -1
- package/lib/WABinary/decode.d.ts.map +1 -0
- package/lib/WABinary/decode.js +13 -51
- package/lib/WABinary/decode.js.map +1 -0
- package/lib/WABinary/encode.d.ts +2 -1
- package/lib/WABinary/encode.d.ts.map +1 -0
- package/lib/WABinary/encode.js +5 -41
- package/lib/WABinary/encode.js.map +1 -0
- package/lib/WABinary/generic-utils.d.ts +4 -3
- package/lib/WABinary/generic-utils.d.ts.map +1 -0
- package/lib/WABinary/generic-utils.js +30 -38
- package/lib/WABinary/generic-utils.js.map +1 -0
- package/lib/WABinary/index.d.ts +6 -5
- package/lib/WABinary/index.d.ts.map +1 -0
- package/lib/WABinary/index.js +6 -21
- package/lib/WABinary/index.js.map +1 -0
- package/lib/WABinary/jid-utils.d.ts +1 -0
- package/lib/WABinary/jid-utils.d.ts.map +1 -0
- package/lib/WABinary/jid-utils.js +21 -35
- package/lib/WABinary/jid-utils.js.map +1 -0
- package/lib/WABinary/types.d.ts +2 -1
- package/lib/WABinary/types.d.ts.map +1 -0
- package/lib/WABinary/types.js +2 -2
- package/lib/WABinary/types.js.map +1 -0
- package/lib/WAM/BinaryInfo.d.ts +2 -1
- package/lib/WAM/BinaryInfo.d.ts.map +1 -0
- package/lib/WAM/BinaryInfo.js +2 -5
- package/lib/WAM/BinaryInfo.js.map +1 -0
- package/lib/WAM/constants.d.ts +1 -0
- package/lib/WAM/constants.d.ts.map +1 -0
- package/lib/WAM/constants.js +4 -6
- package/lib/WAM/constants.js.map +1 -0
- package/lib/WAM/encode.d.ts +2 -1
- package/lib/WAM/encode.d.ts.map +1 -0
- package/lib/WAM/encode.js +12 -14
- package/lib/WAM/encode.js.map +1 -0
- package/lib/WAM/index.d.ts +4 -3
- package/lib/WAM/index.d.ts.map +1 -0
- package/lib/WAM/index.js +4 -19
- package/lib/WAM/index.js.map +1 -0
- package/lib/WAUSync/Protocols/USyncContactProtocol.d.ts +4 -3
- package/lib/WAUSync/Protocols/USyncContactProtocol.d.ts.map +1 -0
- package/lib/WAUSync/Protocols/USyncContactProtocol.js +6 -9
- package/lib/WAUSync/Protocols/USyncContactProtocol.js.map +1 -0
- package/lib/WAUSync/Protocols/USyncDeviceProtocol.d.ts +3 -2
- package/lib/WAUSync/Protocols/USyncDeviceProtocol.d.ts.map +1 -0
- package/lib/WAUSync/Protocols/USyncDeviceProtocol.js +9 -12
- package/lib/WAUSync/Protocols/USyncDeviceProtocol.js.map +1 -0
- package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.d.ts +3 -2
- package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.d.ts.map +1 -0
- package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.js +6 -9
- package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.js.map +1 -0
- package/lib/WAUSync/Protocols/USyncStatusProtocol.d.ts +3 -2
- package/lib/WAUSync/Protocols/USyncStatusProtocol.d.ts.map +1 -0
- package/lib/WAUSync/Protocols/USyncStatusProtocol.js +7 -11
- package/lib/WAUSync/Protocols/USyncStatusProtocol.js.map +1 -0
- package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.d.ts +4 -3
- package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.d.ts.map +1 -0
- package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.js +19 -21
- package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.js.map +1 -0
- package/lib/WAUSync/Protocols/UsyncLIDProtocol.d.ts +3 -2
- package/lib/WAUSync/Protocols/UsyncLIDProtocol.d.ts.map +1 -0
- package/lib/WAUSync/Protocols/UsyncLIDProtocol.js +2 -5
- package/lib/WAUSync/Protocols/UsyncLIDProtocol.js.map +1 -0
- package/lib/WAUSync/Protocols/index.d.ts +5 -4
- package/lib/WAUSync/Protocols/index.d.ts.map +1 -0
- package/lib/WAUSync/Protocols/index.js +5 -20
- package/lib/WAUSync/Protocols/index.js.map +1 -0
- package/lib/WAUSync/USyncQuery.d.ts +4 -3
- package/lib/WAUSync/USyncQuery.d.ts.map +1 -0
- package/lib/WAUSync/USyncQuery.js +18 -20
- package/lib/WAUSync/USyncQuery.js.map +1 -0
- package/lib/WAUSync/USyncUser.d.ts +6 -5
- package/lib/WAUSync/USyncUser.d.ts.map +1 -0
- package/lib/WAUSync/USyncUser.js +2 -5
- package/lib/WAUSync/USyncUser.js.map +1 -0
- package/lib/WAUSync/index.d.ts +4 -3
- package/lib/WAUSync/index.d.ts.map +1 -0
- package/lib/WAUSync/index.js +4 -19
- package/lib/WAUSync/index.js.map +1 -0
- package/lib/index.d.ts +9 -8
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +11 -30
- package/lib/index.js.map +1 -0
- package/package.json +25 -24
package/lib/Utils/messages.js
CHANGED
|
@@ -1,21 +1,15 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
};
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
const Defaults_1 = require("../Defaults");
|
|
14
|
-
const Types_1 = require("../Types");
|
|
15
|
-
const WABinary_1 = require("../WABinary");
|
|
16
|
-
const crypto_2 = require("./crypto");
|
|
17
|
-
const generics_1 = require("./generics");
|
|
18
|
-
const messages_media_1 = require("./messages-media");
|
|
1
|
+
import { Boom } from '@hapi/boom';
|
|
2
|
+
import axios from 'axios';
|
|
3
|
+
import { randomBytes } from 'crypto';
|
|
4
|
+
import { promises as fs } from 'fs';
|
|
5
|
+
import {} from 'stream';
|
|
6
|
+
import { proto } from '../../WAProto/index.js';
|
|
7
|
+
import { MEDIA_KEYS, URL_REGEX, WA_DEFAULT_EPHEMERAL } from '../Defaults/index.js';
|
|
8
|
+
import { WAMessageStatus, WAProto } from '../Types/index.js';
|
|
9
|
+
import { isJidGroup, isJidNewsletter, isJidStatusBroadcast, jidNormalizedUser } from '../WABinary/index.js';
|
|
10
|
+
import { sha256 } from './crypto.js';
|
|
11
|
+
import { generateMessageIDV2, getKeyAuthor, unixTimestampSeconds } from './generics.js';
|
|
12
|
+
import { downloadContentFromMessage, encryptedStream, generateThumbnail, getAudioDuration, getAudioWaveform, getRawMediaUploadData } from './messages-media.js';
|
|
19
13
|
const MIMETYPE_MAP = {
|
|
20
14
|
image: 'image/jpeg',
|
|
21
15
|
video: 'video/mp4',
|
|
@@ -25,21 +19,20 @@ const MIMETYPE_MAP = {
|
|
|
25
19
|
'product-catalog-image': 'image/jpeg'
|
|
26
20
|
};
|
|
27
21
|
const MessageTypeProto = {
|
|
28
|
-
image:
|
|
29
|
-
video:
|
|
30
|
-
audio:
|
|
31
|
-
sticker:
|
|
32
|
-
document:
|
|
22
|
+
image: WAProto.Message.ImageMessage,
|
|
23
|
+
video: WAProto.Message.VideoMessage,
|
|
24
|
+
audio: WAProto.Message.AudioMessage,
|
|
25
|
+
sticker: WAProto.Message.StickerMessage,
|
|
26
|
+
document: WAProto.Message.DocumentMessage
|
|
33
27
|
};
|
|
34
28
|
/**
|
|
35
29
|
* Uses a regex to test whether the string contains a URL, and returns the URL if it does.
|
|
36
30
|
* @param text eg. hello https://google.com
|
|
37
31
|
* @returns the URL, eg. https://google.com
|
|
38
32
|
*/
|
|
39
|
-
const extractUrlFromText = (text) =>
|
|
40
|
-
|
|
41
|
-
const
|
|
42
|
-
const url = (0, exports.extractUrlFromText)(text);
|
|
33
|
+
export const extractUrlFromText = (text) => text.match(URL_REGEX)?.[0];
|
|
34
|
+
export const generateLinkPreviewIfRequired = async (text, getUrlInfo, logger) => {
|
|
35
|
+
const url = extractUrlFromText(text);
|
|
43
36
|
if (!!getUrlInfo && url) {
|
|
44
37
|
try {
|
|
45
38
|
const urlInfo = await getUrlInfo(url);
|
|
@@ -47,11 +40,10 @@ const generateLinkPreviewIfRequired = async (text, getUrlInfo, logger) => {
|
|
|
47
40
|
}
|
|
48
41
|
catch (error) {
|
|
49
42
|
// ignore if fails
|
|
50
|
-
logger
|
|
43
|
+
logger?.warn({ trace: error.stack }, 'url generation failed');
|
|
51
44
|
}
|
|
52
45
|
}
|
|
53
46
|
};
|
|
54
|
-
exports.generateLinkPreviewIfRequired = generateLinkPreviewIfRequired;
|
|
55
47
|
const assertColor = async (color) => {
|
|
56
48
|
let assertedColor;
|
|
57
49
|
if (typeof color === 'number') {
|
|
@@ -66,22 +58,23 @@ const assertColor = async (color) => {
|
|
|
66
58
|
return assertedColor;
|
|
67
59
|
}
|
|
68
60
|
};
|
|
69
|
-
const prepareWAMessageMedia = async (message, options) => {
|
|
61
|
+
export const prepareWAMessageMedia = async (message, options) => {
|
|
70
62
|
const logger = options.logger;
|
|
71
63
|
let mediaType;
|
|
72
|
-
for (const key of
|
|
64
|
+
for (const key of MEDIA_KEYS) {
|
|
73
65
|
if (key in message) {
|
|
74
66
|
mediaType = key;
|
|
75
67
|
}
|
|
76
68
|
}
|
|
77
69
|
if (!mediaType) {
|
|
78
|
-
throw new
|
|
70
|
+
throw new Boom('Invalid media type', { statusCode: 400 });
|
|
79
71
|
}
|
|
80
72
|
const uploadData = {
|
|
81
73
|
...message,
|
|
82
74
|
media: message[mediaType]
|
|
83
75
|
};
|
|
84
76
|
delete uploadData[mediaType];
|
|
77
|
+
// check if cacheable + generate cache key
|
|
85
78
|
const cacheableKey = typeof uploadData.media === 'object' &&
|
|
86
79
|
'url' in uploadData.media &&
|
|
87
80
|
!!uploadData.media.url &&
|
|
@@ -96,25 +89,26 @@ const prepareWAMessageMedia = async (message, options) => {
|
|
|
96
89
|
if (cacheableKey) {
|
|
97
90
|
const mediaBuff = options.mediaCache.get(cacheableKey);
|
|
98
91
|
if (mediaBuff) {
|
|
99
|
-
logger
|
|
100
|
-
const obj =
|
|
92
|
+
logger?.debug({ cacheableKey }, 'got media cache hit');
|
|
93
|
+
const obj = WAProto.Message.decode(mediaBuff);
|
|
101
94
|
const key = `${mediaType}Message`;
|
|
102
95
|
Object.assign(obj[key], { ...uploadData, media: undefined });
|
|
103
96
|
return obj;
|
|
104
97
|
}
|
|
105
98
|
}
|
|
106
|
-
const isNewsletter = !!options.jid &&
|
|
99
|
+
const isNewsletter = !!options.jid && isJidNewsletter(options.jid);
|
|
107
100
|
if (isNewsletter) {
|
|
108
|
-
logger
|
|
109
|
-
const { filePath, fileSha256, fileLength } = await
|
|
101
|
+
logger?.info({ key: cacheableKey }, 'Preparing raw media for newsletter');
|
|
102
|
+
const { filePath, fileSha256, fileLength } = await getRawMediaUploadData(uploadData.media, options.mediaTypeOverride || mediaType, logger);
|
|
110
103
|
const fileSha256B64 = fileSha256.toString('base64');
|
|
111
104
|
const { mediaUrl, directPath } = await options.upload(filePath, {
|
|
112
105
|
fileEncSha256B64: fileSha256B64,
|
|
113
106
|
mediaType: mediaType,
|
|
114
107
|
timeoutMs: options.mediaUploadTimeoutMs
|
|
115
108
|
});
|
|
116
|
-
await
|
|
117
|
-
const obj =
|
|
109
|
+
await fs.unlink(filePath);
|
|
110
|
+
const obj = WAProto.Message.fromObject({
|
|
111
|
+
// todo: add more support here
|
|
118
112
|
[`${mediaType}Message`]: MessageTypeProto[mediaType].fromObject({
|
|
119
113
|
url: mediaUrl,
|
|
120
114
|
directPath,
|
|
@@ -129,8 +123,8 @@ const prepareWAMessageMedia = async (message, options) => {
|
|
|
129
123
|
delete obj.videoMessage;
|
|
130
124
|
}
|
|
131
125
|
if (cacheableKey) {
|
|
132
|
-
logger
|
|
133
|
-
options.mediaCache.set(cacheableKey,
|
|
126
|
+
logger?.debug({ cacheableKey }, 'set cache');
|
|
127
|
+
options.mediaCache.set(cacheableKey, WAProto.Message.encode(obj).finish());
|
|
134
128
|
}
|
|
135
129
|
return obj;
|
|
136
130
|
}
|
|
@@ -139,7 +133,7 @@ const prepareWAMessageMedia = async (message, options) => {
|
|
|
139
133
|
const requiresWaveformProcessing = mediaType === 'audio' && uploadData.ptt === true;
|
|
140
134
|
const requiresAudioBackground = options.backgroundColor && mediaType === 'audio' && uploadData.ptt === true;
|
|
141
135
|
const requiresOriginalForSomeProcessing = requiresDurationComputation || requiresThumbnailComputation;
|
|
142
|
-
const { mediaKey, encFilePath, originalFilePath, fileEncSha256, fileSha256, fileLength } = await
|
|
136
|
+
const { mediaKey, encFilePath, originalFilePath, fileEncSha256, fileSha256, fileLength } = await encryptedStream(uploadData.media, options.mediaTypeOverride || mediaType, {
|
|
143
137
|
logger,
|
|
144
138
|
saveOriginalFileIfRequired: requiresOriginalForSomeProcessing,
|
|
145
139
|
opts: options.options
|
|
@@ -152,51 +146,51 @@ const prepareWAMessageMedia = async (message, options) => {
|
|
|
152
146
|
mediaType,
|
|
153
147
|
timeoutMs: options.mediaUploadTimeoutMs
|
|
154
148
|
});
|
|
155
|
-
logger
|
|
149
|
+
logger?.debug({ mediaType, cacheableKey }, 'uploaded media');
|
|
156
150
|
return result;
|
|
157
151
|
})(),
|
|
158
152
|
(async () => {
|
|
159
153
|
try {
|
|
160
154
|
if (requiresThumbnailComputation) {
|
|
161
|
-
const { thumbnail, originalImageDimensions } = await
|
|
155
|
+
const { thumbnail, originalImageDimensions } = await generateThumbnail(originalFilePath, mediaType, options);
|
|
162
156
|
uploadData.jpegThumbnail = thumbnail;
|
|
163
157
|
if (!uploadData.width && originalImageDimensions) {
|
|
164
158
|
uploadData.width = originalImageDimensions.width;
|
|
165
159
|
uploadData.height = originalImageDimensions.height;
|
|
166
|
-
logger
|
|
160
|
+
logger?.debug('set dimensions');
|
|
167
161
|
}
|
|
168
|
-
logger
|
|
162
|
+
logger?.debug('generated thumbnail');
|
|
169
163
|
}
|
|
170
164
|
if (requiresDurationComputation) {
|
|
171
|
-
uploadData.seconds = await
|
|
172
|
-
logger
|
|
165
|
+
uploadData.seconds = await getAudioDuration(originalFilePath);
|
|
166
|
+
logger?.debug('computed audio duration');
|
|
173
167
|
}
|
|
174
168
|
if (requiresWaveformProcessing) {
|
|
175
|
-
uploadData.waveform = await
|
|
176
|
-
logger
|
|
169
|
+
uploadData.waveform = await getAudioWaveform(originalFilePath, logger);
|
|
170
|
+
logger?.debug('processed waveform');
|
|
177
171
|
}
|
|
178
172
|
if (requiresAudioBackground) {
|
|
179
173
|
uploadData.backgroundArgb = await assertColor(options.backgroundColor);
|
|
180
|
-
logger
|
|
174
|
+
logger?.debug('computed backgroundColor audio status');
|
|
181
175
|
}
|
|
182
176
|
}
|
|
183
177
|
catch (error) {
|
|
184
|
-
logger
|
|
178
|
+
logger?.warn({ trace: error.stack }, 'failed to obtain extra info');
|
|
185
179
|
}
|
|
186
180
|
})()
|
|
187
181
|
]).finally(async () => {
|
|
188
182
|
try {
|
|
189
|
-
await
|
|
183
|
+
await fs.unlink(encFilePath);
|
|
190
184
|
if (originalFilePath) {
|
|
191
|
-
await
|
|
185
|
+
await fs.unlink(originalFilePath);
|
|
192
186
|
}
|
|
193
|
-
logger
|
|
187
|
+
logger?.debug('removed tmp files');
|
|
194
188
|
}
|
|
195
189
|
catch (error) {
|
|
196
|
-
logger
|
|
190
|
+
logger?.warn('failed to remove tmp file');
|
|
197
191
|
}
|
|
198
192
|
});
|
|
199
|
-
const obj =
|
|
193
|
+
const obj = WAProto.Message.fromObject({
|
|
200
194
|
[`${mediaType}Message`]: MessageTypeProto[mediaType].fromObject({
|
|
201
195
|
url: mediaUrl,
|
|
202
196
|
directPath,
|
|
@@ -204,7 +198,7 @@ const prepareWAMessageMedia = async (message, options) => {
|
|
|
204
198
|
fileEncSha256,
|
|
205
199
|
fileSha256,
|
|
206
200
|
fileLength,
|
|
207
|
-
mediaKeyTimestamp:
|
|
201
|
+
mediaKeyTimestamp: unixTimestampSeconds(),
|
|
208
202
|
...uploadData,
|
|
209
203
|
media: undefined
|
|
210
204
|
})
|
|
@@ -214,67 +208,63 @@ const prepareWAMessageMedia = async (message, options) => {
|
|
|
214
208
|
delete obj.videoMessage;
|
|
215
209
|
}
|
|
216
210
|
if (cacheableKey) {
|
|
217
|
-
logger
|
|
218
|
-
options.mediaCache.set(cacheableKey,
|
|
211
|
+
logger?.debug({ cacheableKey }, 'set cache');
|
|
212
|
+
options.mediaCache.set(cacheableKey, WAProto.Message.encode(obj).finish());
|
|
219
213
|
}
|
|
220
214
|
return obj;
|
|
221
215
|
};
|
|
222
|
-
|
|
223
|
-
const prepareDisappearingMessageSettingContent = (ephemeralExpiration) => {
|
|
216
|
+
export const prepareDisappearingMessageSettingContent = (ephemeralExpiration) => {
|
|
224
217
|
ephemeralExpiration = ephemeralExpiration || 0;
|
|
225
218
|
const content = {
|
|
226
219
|
ephemeralMessage: {
|
|
227
220
|
message: {
|
|
228
221
|
protocolMessage: {
|
|
229
|
-
type:
|
|
222
|
+
type: WAProto.Message.ProtocolMessage.Type.EPHEMERAL_SETTING,
|
|
230
223
|
ephemeralExpiration
|
|
231
224
|
}
|
|
232
225
|
}
|
|
233
226
|
}
|
|
234
227
|
};
|
|
235
|
-
return
|
|
228
|
+
return WAProto.Message.fromObject(content);
|
|
236
229
|
};
|
|
237
|
-
exports.prepareDisappearingMessageSettingContent = prepareDisappearingMessageSettingContent;
|
|
238
230
|
/**
|
|
239
231
|
* Generate forwarded message content like WA does
|
|
240
232
|
* @param message the message to forward
|
|
241
233
|
* @param options.forceForward will show the message as forwarded even if it is from you
|
|
242
234
|
*/
|
|
243
|
-
const generateForwardMessageContent = (message, forceForward) => {
|
|
244
|
-
var _a;
|
|
235
|
+
export const generateForwardMessageContent = (message, forceForward) => {
|
|
245
236
|
let content = message.message;
|
|
246
237
|
if (!content) {
|
|
247
|
-
throw new
|
|
238
|
+
throw new Boom('no content in message', { statusCode: 400 });
|
|
248
239
|
}
|
|
249
240
|
// hacky copy
|
|
250
|
-
content =
|
|
251
|
-
content =
|
|
241
|
+
content = normalizeMessageContent(content);
|
|
242
|
+
content = proto.Message.decode(proto.Message.encode(content).finish());
|
|
252
243
|
let key = Object.keys(content)[0];
|
|
253
|
-
let score =
|
|
244
|
+
let score = content?.[key]?.contextInfo?.forwardingScore || 0;
|
|
254
245
|
score += message.key.fromMe && !forceForward ? 0 : 1;
|
|
255
246
|
if (key === 'conversation') {
|
|
256
247
|
content.extendedTextMessage = { text: content[key] };
|
|
257
248
|
delete content.conversation;
|
|
258
249
|
key = 'extendedTextMessage';
|
|
259
250
|
}
|
|
251
|
+
const key_ = content?.[key];
|
|
260
252
|
if (score > 0) {
|
|
261
|
-
|
|
253
|
+
key_.contextInfo = { forwardingScore: score, isForwarded: true };
|
|
262
254
|
}
|
|
263
255
|
else {
|
|
264
|
-
|
|
256
|
+
key_.contextInfo = {};
|
|
265
257
|
}
|
|
266
258
|
return content;
|
|
267
259
|
};
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
var _a;
|
|
271
|
-
var _b, _c;
|
|
260
|
+
export const generateWAMessageContent = async (message, options) => {
|
|
261
|
+
var _a, _b;
|
|
272
262
|
let m = {};
|
|
273
263
|
if ('text' in message) {
|
|
274
264
|
const extContent = { text: message.text };
|
|
275
265
|
let urlInfo = message.linkPreview;
|
|
276
266
|
if (typeof urlInfo === 'undefined') {
|
|
277
|
-
urlInfo = await
|
|
267
|
+
urlInfo = await generateLinkPreviewIfRequired(message.text, options.getUrlInfo, options.logger);
|
|
278
268
|
}
|
|
279
269
|
if (urlInfo) {
|
|
280
270
|
extContent.matchedText = urlInfo['matched-text'];
|
|
@@ -304,40 +294,40 @@ const generateWAMessageContent = async (message, options) => {
|
|
|
304
294
|
else if ('contacts' in message) {
|
|
305
295
|
const contactLen = message.contacts.contacts.length;
|
|
306
296
|
if (!contactLen) {
|
|
307
|
-
throw new
|
|
297
|
+
throw new Boom('require atleast 1 contact', { statusCode: 400 });
|
|
308
298
|
}
|
|
309
299
|
if (contactLen === 1) {
|
|
310
|
-
m.contactMessage =
|
|
300
|
+
m.contactMessage = WAProto.Message.ContactMessage.fromObject(message.contacts.contacts[0]);
|
|
311
301
|
}
|
|
312
302
|
else {
|
|
313
|
-
m.contactsArrayMessage =
|
|
303
|
+
m.contactsArrayMessage = WAProto.Message.ContactsArrayMessage.fromObject(message.contacts);
|
|
314
304
|
}
|
|
315
305
|
}
|
|
316
306
|
else if ('location' in message) {
|
|
317
|
-
m.locationMessage =
|
|
307
|
+
m.locationMessage = WAProto.Message.LocationMessage.fromObject(message.location);
|
|
318
308
|
}
|
|
319
309
|
else if ('react' in message) {
|
|
320
310
|
if (!message.react.senderTimestampMs) {
|
|
321
311
|
message.react.senderTimestampMs = Date.now();
|
|
322
312
|
}
|
|
323
|
-
m.reactionMessage =
|
|
313
|
+
m.reactionMessage = WAProto.Message.ReactionMessage.fromObject(message.react);
|
|
324
314
|
}
|
|
325
315
|
else if ('delete' in message) {
|
|
326
316
|
m.protocolMessage = {
|
|
327
317
|
key: message.delete,
|
|
328
|
-
type:
|
|
318
|
+
type: WAProto.Message.ProtocolMessage.Type.REVOKE
|
|
329
319
|
};
|
|
330
320
|
}
|
|
331
321
|
else if ('forward' in message) {
|
|
332
|
-
m =
|
|
322
|
+
m = generateForwardMessageContent(message.forward, message.force);
|
|
333
323
|
}
|
|
334
324
|
else if ('disappearingMessagesInChat' in message) {
|
|
335
325
|
const exp = typeof message.disappearingMessagesInChat === 'boolean'
|
|
336
326
|
? message.disappearingMessagesInChat
|
|
337
|
-
?
|
|
327
|
+
? WA_DEFAULT_EPHEMERAL
|
|
338
328
|
: 0
|
|
339
329
|
: message.disappearingMessagesInChat;
|
|
340
|
-
m =
|
|
330
|
+
m = prepareDisappearingMessageSettingContent(exp);
|
|
341
331
|
}
|
|
342
332
|
else if ('groupInvite' in message) {
|
|
343
333
|
m.groupInviteMessage = {};
|
|
@@ -351,7 +341,7 @@ const generateWAMessageContent = async (message, options) => {
|
|
|
351
341
|
if (options.getProfilePicUrl) {
|
|
352
342
|
const pfpUrl = await options.getProfilePicUrl(message.groupInvite.jid, 'preview');
|
|
353
343
|
if (pfpUrl) {
|
|
354
|
-
const resp = await
|
|
344
|
+
const resp = await axios.get(pfpUrl, { responseType: 'arraybuffer' });
|
|
355
345
|
if (resp.status === 200) {
|
|
356
346
|
m.groupInviteMessage.jpegThumbnail = resp.data;
|
|
357
347
|
}
|
|
@@ -379,18 +369,18 @@ const generateWAMessageContent = async (message, options) => {
|
|
|
379
369
|
m.buttonsResponseMessage = {
|
|
380
370
|
selectedButtonId: message.buttonReply.id,
|
|
381
371
|
selectedDisplayText: message.buttonReply.displayText,
|
|
382
|
-
type:
|
|
372
|
+
type: proto.Message.ButtonsResponseMessage.Type.DISPLAY_TEXT
|
|
383
373
|
};
|
|
384
374
|
break;
|
|
385
375
|
}
|
|
386
376
|
}
|
|
387
377
|
else if ('ptv' in message && message.ptv) {
|
|
388
|
-
const { videoMessage } = await
|
|
378
|
+
const { videoMessage } = await prepareWAMessageMedia({ video: message.video }, options);
|
|
389
379
|
m.ptvMessage = videoMessage;
|
|
390
380
|
}
|
|
391
381
|
else if ('product' in message) {
|
|
392
|
-
const { imageMessage } = await
|
|
393
|
-
m.productMessage =
|
|
382
|
+
const { imageMessage } = await prepareWAMessageMedia({ image: message.product.productImage }, options);
|
|
383
|
+
m.productMessage = WAProto.Message.ProductMessage.fromObject({
|
|
394
384
|
...message,
|
|
395
385
|
product: {
|
|
396
386
|
...message.product,
|
|
@@ -402,19 +392,19 @@ const generateWAMessageContent = async (message, options) => {
|
|
|
402
392
|
m.listResponseMessage = { ...message.listReply };
|
|
403
393
|
}
|
|
404
394
|
else if ('poll' in message) {
|
|
405
|
-
(
|
|
406
|
-
(
|
|
395
|
+
(_a = message.poll).selectableCount || (_a.selectableCount = 0);
|
|
396
|
+
(_b = message.poll).toAnnouncementGroup || (_b.toAnnouncementGroup = false);
|
|
407
397
|
if (!Array.isArray(message.poll.values)) {
|
|
408
|
-
throw new
|
|
398
|
+
throw new Boom('Invalid poll values', { statusCode: 400 });
|
|
409
399
|
}
|
|
410
400
|
if (message.poll.selectableCount < 0 || message.poll.selectableCount > message.poll.values.length) {
|
|
411
|
-
throw new
|
|
401
|
+
throw new Boom(`poll.selectableCount in poll should be >= 0 and <= ${message.poll.values.length}`, {
|
|
412
402
|
statusCode: 400
|
|
413
403
|
});
|
|
414
404
|
}
|
|
415
405
|
m.messageContextInfo = {
|
|
416
406
|
// encKey
|
|
417
|
-
messageSecret: message.poll.messageSecret ||
|
|
407
|
+
messageSecret: message.poll.messageSecret || randomBytes(32)
|
|
418
408
|
};
|
|
419
409
|
const pollCreationMessage = {
|
|
420
410
|
name: message.poll.name,
|
|
@@ -438,22 +428,29 @@ const generateWAMessageContent = async (message, options) => {
|
|
|
438
428
|
}
|
|
439
429
|
else if ('sharePhoneNumber' in message) {
|
|
440
430
|
m.protocolMessage = {
|
|
441
|
-
type:
|
|
431
|
+
type: proto.Message.ProtocolMessage.Type.SHARE_PHONE_NUMBER
|
|
442
432
|
};
|
|
443
433
|
}
|
|
444
434
|
else if ('requestPhoneNumber' in message) {
|
|
445
435
|
m.requestPhoneNumberMessage = {};
|
|
446
436
|
}
|
|
447
437
|
else {
|
|
448
|
-
m = await
|
|
438
|
+
m = await prepareWAMessageMedia(message, options);
|
|
449
439
|
}
|
|
450
440
|
if ('viewOnce' in message && !!message.viewOnce) {
|
|
451
441
|
m = { viewOnceMessage: { message: m } };
|
|
452
442
|
}
|
|
453
|
-
if ('mentions' in message &&
|
|
454
|
-
const
|
|
455
|
-
|
|
456
|
-
|
|
443
|
+
if ('mentions' in message && message.mentions?.length) {
|
|
444
|
+
const messageType = Object.keys(m)[0];
|
|
445
|
+
const key = m[messageType];
|
|
446
|
+
if ('contextInfo' in key && !!key.contextInfo) {
|
|
447
|
+
key.contextInfo.mentionedJid = message.mentions;
|
|
448
|
+
}
|
|
449
|
+
else if (key) {
|
|
450
|
+
key.contextInfo = {
|
|
451
|
+
mentionedJid: message.mentions
|
|
452
|
+
};
|
|
453
|
+
}
|
|
457
454
|
}
|
|
458
455
|
if ('edit' in message) {
|
|
459
456
|
m = {
|
|
@@ -461,42 +458,46 @@ const generateWAMessageContent = async (message, options) => {
|
|
|
461
458
|
key: message.edit,
|
|
462
459
|
editedMessage: m,
|
|
463
460
|
timestampMs: Date.now(),
|
|
464
|
-
type:
|
|
461
|
+
type: WAProto.Message.ProtocolMessage.Type.MESSAGE_EDIT
|
|
465
462
|
}
|
|
466
463
|
};
|
|
467
464
|
}
|
|
468
465
|
if ('contextInfo' in message && !!message.contextInfo) {
|
|
469
|
-
const
|
|
470
|
-
|
|
471
|
-
|
|
466
|
+
const messageType = Object.keys(m)[0];
|
|
467
|
+
const key = m[messageType];
|
|
468
|
+
if ('contextInfo' in key && !!key.contextInfo) {
|
|
469
|
+
key.contextInfo = { ...key.contextInfo, ...message.contextInfo };
|
|
470
|
+
}
|
|
471
|
+
else if (key) {
|
|
472
|
+
key.contextInfo = message.contextInfo;
|
|
473
|
+
}
|
|
472
474
|
}
|
|
473
|
-
return
|
|
475
|
+
return WAProto.Message.fromObject(m);
|
|
474
476
|
};
|
|
475
|
-
|
|
476
|
-
const generateWAMessageFromContent = (jid, message, options) => {
|
|
477
|
+
export const generateWAMessageFromContent = (jid, message, options) => {
|
|
477
478
|
// set timestamp to now
|
|
478
479
|
// if not specified
|
|
479
480
|
if (!options.timestamp) {
|
|
480
481
|
options.timestamp = new Date();
|
|
481
482
|
}
|
|
482
|
-
const innerMessage =
|
|
483
|
-
const key =
|
|
484
|
-
const timestamp =
|
|
483
|
+
const innerMessage = normalizeMessageContent(message);
|
|
484
|
+
const key = getContentType(innerMessage);
|
|
485
|
+
const timestamp = unixTimestampSeconds(options.timestamp);
|
|
485
486
|
const { quoted, userJid, contextInfo } = options;
|
|
486
|
-
if (quoted && !
|
|
487
|
+
if (quoted && !isJidNewsletter(jid)) {
|
|
487
488
|
const participant = quoted.key.fromMe
|
|
488
489
|
? userJid
|
|
489
490
|
: quoted.participant || quoted.key.participant || quoted.key.remoteJid;
|
|
490
|
-
let quotedMsg =
|
|
491
|
-
const msgType =
|
|
491
|
+
let quotedMsg = normalizeMessageContent(quoted.message);
|
|
492
|
+
const msgType = getContentType(quotedMsg);
|
|
492
493
|
// strip any redundant properties
|
|
493
|
-
quotedMsg =
|
|
494
|
+
quotedMsg = proto.Message.fromObject({ [msgType]: quotedMsg[msgType] });
|
|
494
495
|
const quotedContent = quotedMsg[msgType];
|
|
495
496
|
if (typeof quotedContent === 'object' && quotedContent && 'contextInfo' in quotedContent) {
|
|
496
497
|
delete quotedContent.contextInfo;
|
|
497
498
|
}
|
|
498
|
-
const contextInfo = innerMessage[key]
|
|
499
|
-
contextInfo.participant =
|
|
499
|
+
const contextInfo = ('contextInfo' in innerMessage[key] && innerMessage[key]?.contextInfo) || {};
|
|
500
|
+
contextInfo.participant = jidNormalizedUser(participant);
|
|
500
501
|
contextInfo.stanzaId = quoted.key.id;
|
|
501
502
|
contextInfo.quotedMessage = quotedMsg;
|
|
502
503
|
// if a participant is quoted, then it must be a group
|
|
@@ -504,69 +505,71 @@ const generateWAMessageFromContent = (jid, message, options) => {
|
|
|
504
505
|
if (jid !== quoted.key.remoteJid) {
|
|
505
506
|
contextInfo.remoteJid = quoted.key.remoteJid;
|
|
506
507
|
}
|
|
507
|
-
innerMessage[key]
|
|
508
|
+
if (contextInfo && innerMessage[key]) {
|
|
509
|
+
/* @ts-ignore */
|
|
510
|
+
innerMessage[key].contextInfo = contextInfo;
|
|
511
|
+
}
|
|
508
512
|
}
|
|
509
513
|
if (contextInfo) {
|
|
514
|
+
/* @ts-ignore */
|
|
510
515
|
message[key].contextInfo = {
|
|
516
|
+
/* @ts-ignore */
|
|
511
517
|
...(message[key].contextInfo || {}),
|
|
512
518
|
...contextInfo
|
|
513
519
|
};
|
|
514
520
|
}
|
|
515
521
|
if (
|
|
516
522
|
// if we want to send a disappearing message
|
|
517
|
-
!!
|
|
523
|
+
!!options?.ephemeralExpiration &&
|
|
518
524
|
// and it's not a protocol message -- delete, toggle disappear message
|
|
519
525
|
key !== 'protocolMessage' &&
|
|
520
526
|
// already not converted to disappearing message
|
|
521
527
|
key !== 'ephemeralMessage' &&
|
|
522
528
|
// newsletters don't support ephemeral messages
|
|
523
|
-
!
|
|
529
|
+
!isJidNewsletter(jid)) {
|
|
530
|
+
/* @ts-ignore */
|
|
524
531
|
innerMessage[key].contextInfo = {
|
|
525
532
|
...(innerMessage[key].contextInfo || {}),
|
|
526
|
-
expiration: options.ephemeralExpiration ||
|
|
533
|
+
expiration: options.ephemeralExpiration || WA_DEFAULT_EPHEMERAL
|
|
527
534
|
//ephemeralSettingTimestamp: options.ephemeralOptions.eph_setting_ts?.toString()
|
|
528
535
|
};
|
|
529
536
|
}
|
|
530
|
-
message =
|
|
537
|
+
message = WAProto.Message.fromObject(message);
|
|
531
538
|
const messageJSON = {
|
|
532
539
|
key: {
|
|
533
540
|
remoteJid: jid,
|
|
534
541
|
fromMe: true,
|
|
535
|
-
id:
|
|
542
|
+
id: options?.messageId || generateMessageIDV2()
|
|
536
543
|
},
|
|
537
544
|
message: message,
|
|
538
545
|
messageTimestamp: timestamp,
|
|
539
546
|
messageStubParameters: [],
|
|
540
|
-
participant:
|
|
541
|
-
status:
|
|
547
|
+
participant: isJidGroup(jid) || isJidStatusBroadcast(jid) ? userJid : undefined,
|
|
548
|
+
status: WAMessageStatus.PENDING
|
|
542
549
|
};
|
|
543
|
-
return
|
|
550
|
+
return WAProto.WebMessageInfo.fromObject(messageJSON);
|
|
544
551
|
};
|
|
545
|
-
|
|
546
|
-
const generateWAMessage = async (jid, content, options) => {
|
|
547
|
-
var _a;
|
|
552
|
+
export const generateWAMessage = async (jid, content, options) => {
|
|
548
553
|
// ensure msg ID is with every log
|
|
549
|
-
options.logger =
|
|
554
|
+
options.logger = options?.logger?.child({ msgId: options.messageId });
|
|
550
555
|
// Pass jid in the options to generateWAMessageContent
|
|
551
|
-
return
|
|
556
|
+
return generateWAMessageFromContent(jid, await generateWAMessageContent(content, { ...options, jid }), options);
|
|
552
557
|
};
|
|
553
|
-
exports.generateWAMessage = generateWAMessage;
|
|
554
558
|
/** Get the key to access the true type of content */
|
|
555
|
-
const getContentType = (content) => {
|
|
559
|
+
export const getContentType = (content) => {
|
|
556
560
|
if (content) {
|
|
557
561
|
const keys = Object.keys(content);
|
|
558
562
|
const key = keys.find(k => (k === 'conversation' || k.includes('Message')) && k !== 'senderKeyDistributionMessage');
|
|
559
563
|
return key;
|
|
560
564
|
}
|
|
561
565
|
};
|
|
562
|
-
exports.getContentType = getContentType;
|
|
563
566
|
/**
|
|
564
567
|
* Normalizes ephemeral, view once messages to regular message content
|
|
565
568
|
* Eg. image messages in ephemeral messages, in view once messages etc.
|
|
566
569
|
* @param content
|
|
567
570
|
* @returns
|
|
568
571
|
*/
|
|
569
|
-
const normalizeMessageContent = (content) => {
|
|
572
|
+
export const normalizeMessageContent = (content) => {
|
|
570
573
|
if (!content) {
|
|
571
574
|
return undefined;
|
|
572
575
|
}
|
|
@@ -580,21 +583,19 @@ const normalizeMessageContent = (content) => {
|
|
|
580
583
|
}
|
|
581
584
|
return content;
|
|
582
585
|
function getFutureProofMessage(message) {
|
|
583
|
-
return (
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
586
|
+
return (message?.ephemeralMessage ||
|
|
587
|
+
message?.viewOnceMessage ||
|
|
588
|
+
message?.documentWithCaptionMessage ||
|
|
589
|
+
message?.viewOnceMessageV2 ||
|
|
590
|
+
message?.viewOnceMessageV2Extension ||
|
|
591
|
+
message?.editedMessage);
|
|
589
592
|
}
|
|
590
593
|
};
|
|
591
|
-
exports.normalizeMessageContent = normalizeMessageContent;
|
|
592
594
|
/**
|
|
593
595
|
* Extract the true message content from a message
|
|
594
596
|
* Eg. extracts the inner message from a disappearing message/view once message
|
|
595
597
|
*/
|
|
596
|
-
const extractMessageContent = (content) => {
|
|
597
|
-
var _a, _b, _c, _d, _e, _f;
|
|
598
|
+
export const extractMessageContent = (content) => {
|
|
598
599
|
const extractFromTemplateMessage = (msg) => {
|
|
599
600
|
if (msg.imageMessage) {
|
|
600
601
|
return { imageMessage: msg.imageMessage };
|
|
@@ -614,26 +615,25 @@ const extractMessageContent = (content) => {
|
|
|
614
615
|
};
|
|
615
616
|
}
|
|
616
617
|
};
|
|
617
|
-
content =
|
|
618
|
-
if (content
|
|
618
|
+
content = normalizeMessageContent(content);
|
|
619
|
+
if (content?.buttonsMessage) {
|
|
619
620
|
return extractFromTemplateMessage(content.buttonsMessage);
|
|
620
621
|
}
|
|
621
|
-
if (
|
|
622
|
-
return extractFromTemplateMessage(
|
|
622
|
+
if (content?.templateMessage?.hydratedFourRowTemplate) {
|
|
623
|
+
return extractFromTemplateMessage(content?.templateMessage?.hydratedFourRowTemplate);
|
|
623
624
|
}
|
|
624
|
-
if (
|
|
625
|
-
return extractFromTemplateMessage(
|
|
625
|
+
if (content?.templateMessage?.hydratedTemplate) {
|
|
626
|
+
return extractFromTemplateMessage(content?.templateMessage?.hydratedTemplate);
|
|
626
627
|
}
|
|
627
|
-
if (
|
|
628
|
-
return extractFromTemplateMessage(
|
|
628
|
+
if (content?.templateMessage?.fourRowTemplate) {
|
|
629
|
+
return extractFromTemplateMessage(content?.templateMessage?.fourRowTemplate);
|
|
629
630
|
}
|
|
630
631
|
return content;
|
|
631
632
|
};
|
|
632
|
-
exports.extractMessageContent = extractMessageContent;
|
|
633
633
|
/**
|
|
634
634
|
* Returns the device predicted by message ID
|
|
635
635
|
*/
|
|
636
|
-
const getDevice = (id) => /^3A.{18}$/.test(id)
|
|
636
|
+
export const getDevice = (id) => /^3A.{18}$/.test(id)
|
|
637
637
|
? 'ios'
|
|
638
638
|
: /^3E.{20}$/.test(id)
|
|
639
639
|
? 'web'
|
|
@@ -642,9 +642,8 @@ const getDevice = (id) => /^3A.{18}$/.test(id)
|
|
|
642
642
|
: /^(3F|.{18}$)/.test(id)
|
|
643
643
|
? 'desktop'
|
|
644
644
|
: 'unknown';
|
|
645
|
-
exports.getDevice = getDevice;
|
|
646
645
|
/** Upserts a receipt in the message */
|
|
647
|
-
const updateMessageWithReceipt = (msg, receipt) => {
|
|
646
|
+
export const updateMessageWithReceipt = (msg, receipt) => {
|
|
648
647
|
msg.userReceipt = msg.userReceipt || [];
|
|
649
648
|
const recp = msg.userReceipt.find(m => m.userJid === receipt.userJid);
|
|
650
649
|
if (recp) {
|
|
@@ -654,41 +653,36 @@ const updateMessageWithReceipt = (msg, receipt) => {
|
|
|
654
653
|
msg.userReceipt.push(receipt);
|
|
655
654
|
}
|
|
656
655
|
};
|
|
657
|
-
exports.updateMessageWithReceipt = updateMessageWithReceipt;
|
|
658
656
|
/** Update the message with a new reaction */
|
|
659
|
-
const updateMessageWithReaction = (msg, reaction) => {
|
|
660
|
-
const authorID =
|
|
661
|
-
const reactions = (msg.reactions || []).filter(r =>
|
|
657
|
+
export const updateMessageWithReaction = (msg, reaction) => {
|
|
658
|
+
const authorID = getKeyAuthor(reaction.key);
|
|
659
|
+
const reactions = (msg.reactions || []).filter(r => getKeyAuthor(r.key) !== authorID);
|
|
662
660
|
reaction.text = reaction.text || '';
|
|
663
661
|
reactions.push(reaction);
|
|
664
662
|
msg.reactions = reactions;
|
|
665
663
|
};
|
|
666
|
-
exports.updateMessageWithReaction = updateMessageWithReaction;
|
|
667
664
|
/** Update the message with a new poll update */
|
|
668
|
-
const updateMessageWithPollUpdate = (msg, update) => {
|
|
669
|
-
|
|
670
|
-
const
|
|
671
|
-
|
|
672
|
-
if ((_b = (_a = update.vote) === null || _a === void 0 ? void 0 : _a.selectedOptions) === null || _b === void 0 ? void 0 : _b.length) {
|
|
665
|
+
export const updateMessageWithPollUpdate = (msg, update) => {
|
|
666
|
+
const authorID = getKeyAuthor(update.pollUpdateMessageKey);
|
|
667
|
+
const reactions = (msg.pollUpdates || []).filter(r => getKeyAuthor(r.pollUpdateMessageKey) !== authorID);
|
|
668
|
+
if (update.vote?.selectedOptions?.length) {
|
|
673
669
|
reactions.push(update);
|
|
674
670
|
}
|
|
675
671
|
msg.pollUpdates = reactions;
|
|
676
672
|
};
|
|
677
|
-
exports.updateMessageWithPollUpdate = updateMessageWithPollUpdate;
|
|
678
673
|
/**
|
|
679
674
|
* Aggregates all poll updates in a poll.
|
|
680
675
|
* @param msg the poll creation message
|
|
681
676
|
* @param meId your jid
|
|
682
677
|
* @returns A list of options & their voters
|
|
683
678
|
*/
|
|
684
|
-
function getAggregateVotesInPollMessage({ message, pollUpdates }, meId) {
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
((_c = message === null || message === void 0 ? void 0 : message.pollCreationMessageV3) === null || _c === void 0 ? void 0 : _c.options) ||
|
|
679
|
+
export function getAggregateVotesInPollMessage({ message, pollUpdates }, meId) {
|
|
680
|
+
const opts = message?.pollCreationMessage?.options ||
|
|
681
|
+
message?.pollCreationMessageV2?.options ||
|
|
682
|
+
message?.pollCreationMessageV3?.options ||
|
|
689
683
|
[];
|
|
690
684
|
const voteHashMap = opts.reduce((acc, opt) => {
|
|
691
|
-
const hash =
|
|
685
|
+
const hash = sha256(Buffer.from(opt.optionName || '')).toString();
|
|
692
686
|
acc[hash] = {
|
|
693
687
|
name: opt.optionName || '',
|
|
694
688
|
voters: []
|
|
@@ -710,13 +704,13 @@ function getAggregateVotesInPollMessage({ message, pollUpdates }, meId) {
|
|
|
710
704
|
};
|
|
711
705
|
data = voteHashMap[hash];
|
|
712
706
|
}
|
|
713
|
-
voteHashMap[hash].voters.push(
|
|
707
|
+
voteHashMap[hash].voters.push(getKeyAuthor(update.pollUpdateMessageKey, meId));
|
|
714
708
|
}
|
|
715
709
|
}
|
|
716
710
|
return Object.values(voteHashMap);
|
|
717
711
|
}
|
|
718
712
|
/** Given a list of message keys, aggregates them by chat & sender. Useful for sending read receipts in bulk */
|
|
719
|
-
const aggregateMessageKeysNotFromMe = (keys) => {
|
|
713
|
+
export const aggregateMessageKeysNotFromMe = (keys) => {
|
|
720
714
|
const keyMap = {};
|
|
721
715
|
for (const { remoteJid, id, participant, fromMe } of keys) {
|
|
722
716
|
if (!fromMe) {
|
|
@@ -733,17 +727,15 @@ const aggregateMessageKeysNotFromMe = (keys) => {
|
|
|
733
727
|
}
|
|
734
728
|
return Object.values(keyMap);
|
|
735
729
|
};
|
|
736
|
-
exports.aggregateMessageKeysNotFromMe = aggregateMessageKeysNotFromMe;
|
|
737
730
|
const REUPLOAD_REQUIRED_STATUS = [410, 404];
|
|
738
731
|
/**
|
|
739
732
|
* Downloads the given message. Throws an error if it's not a media message
|
|
740
733
|
*/
|
|
741
|
-
const downloadMediaMessage = async (message, type, options, ctx) => {
|
|
734
|
+
export const downloadMediaMessage = async (message, type, options, ctx) => {
|
|
742
735
|
const result = await downloadMsg().catch(async (error) => {
|
|
743
|
-
var _a;
|
|
744
736
|
if (ctx &&
|
|
745
|
-
|
|
746
|
-
REUPLOAD_REQUIRED_STATUS.includes(
|
|
737
|
+
axios.isAxiosError(error) && // check if the message requires a reupload
|
|
738
|
+
REUPLOAD_REQUIRED_STATUS.includes(error.response?.status)) {
|
|
747
739
|
ctx.logger.info({ key: message.key }, 'sending reupload media request...');
|
|
748
740
|
// request reupload
|
|
749
741
|
message = await ctx.reuploadRequest(message);
|
|
@@ -754,15 +746,15 @@ const downloadMediaMessage = async (message, type, options, ctx) => {
|
|
|
754
746
|
});
|
|
755
747
|
return result;
|
|
756
748
|
async function downloadMsg() {
|
|
757
|
-
const mContent =
|
|
749
|
+
const mContent = extractMessageContent(message.message);
|
|
758
750
|
if (!mContent) {
|
|
759
|
-
throw new
|
|
751
|
+
throw new Boom('No message present', { statusCode: 400, data: message });
|
|
760
752
|
}
|
|
761
|
-
const contentType =
|
|
762
|
-
let mediaType = contentType
|
|
753
|
+
const contentType = getContentType(mContent);
|
|
754
|
+
let mediaType = contentType?.replace('Message', '');
|
|
763
755
|
const media = mContent[contentType];
|
|
764
756
|
if (!media || typeof media !== 'object' || (!('url' in media) && !('thumbnailDirectPath' in media))) {
|
|
765
|
-
throw new
|
|
757
|
+
throw new Boom(`"${contentType}" message is not a media message`);
|
|
766
758
|
}
|
|
767
759
|
let download;
|
|
768
760
|
if ('thumbnailDirectPath' in media && !('url' in media)) {
|
|
@@ -775,7 +767,7 @@ const downloadMediaMessage = async (message, type, options, ctx) => {
|
|
|
775
767
|
else {
|
|
776
768
|
download = media;
|
|
777
769
|
}
|
|
778
|
-
const stream = await
|
|
770
|
+
const stream = await downloadContentFromMessage(download, mediaType, options);
|
|
779
771
|
if (type === 'buffer') {
|
|
780
772
|
const bufferArray = [];
|
|
781
773
|
for await (const chunk of stream) {
|
|
@@ -786,18 +778,17 @@ const downloadMediaMessage = async (message, type, options, ctx) => {
|
|
|
786
778
|
return stream;
|
|
787
779
|
}
|
|
788
780
|
};
|
|
789
|
-
exports.downloadMediaMessage = downloadMediaMessage;
|
|
790
781
|
/** Checks whether the given message is a media message; if it is returns the inner content */
|
|
791
|
-
const assertMediaContent = (content) => {
|
|
792
|
-
content =
|
|
793
|
-
const mediaContent =
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
782
|
+
export const assertMediaContent = (content) => {
|
|
783
|
+
content = extractMessageContent(content);
|
|
784
|
+
const mediaContent = content?.documentMessage ||
|
|
785
|
+
content?.imageMessage ||
|
|
786
|
+
content?.videoMessage ||
|
|
787
|
+
content?.audioMessage ||
|
|
788
|
+
content?.stickerMessage;
|
|
798
789
|
if (!mediaContent) {
|
|
799
|
-
throw new
|
|
790
|
+
throw new Boom('given message is not a media message', { statusCode: 400, data: content });
|
|
800
791
|
}
|
|
801
792
|
return mediaContent;
|
|
802
793
|
};
|
|
803
|
-
|
|
794
|
+
//# sourceMappingURL=messages.js.map
|