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