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