@d0v3riz/baileys 6.7.20 → 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/WAProto/GenerateStatics.sh +3 -2
- package/WAProto/fix-imports.js +29 -0
- package/WAProto/index.js +4136 -4138
- package/lib/Defaults/index.d.ts +3 -2
- package/lib/Defaults/index.d.ts.map +1 -0
- package/lib/Defaults/index.js +36 -40
- package/lib/Defaults/index.js.map +1 -0
- package/lib/Signal/Group/ciphertext-message.d.ts +1 -0
- package/lib/Signal/Group/ciphertext-message.d.ts.map +1 -0
- package/lib/Signal/Group/ciphertext-message.js +2 -5
- package/lib/Signal/Group/ciphertext-message.js.map +1 -0
- package/lib/Signal/Group/group-session-builder.d.ts +4 -3
- package/lib/Signal/Group/group-session-builder.d.ts.map +1 -0
- package/lib/Signal/Group/group-session-builder.js +7 -41
- package/lib/Signal/Group/group-session-builder.js.map +1 -0
- package/lib/Signal/Group/group_cipher.d.ts +3 -2
- package/lib/Signal/Group/group_cipher.d.ts.map +1 -0
- package/lib/Signal/Group/group_cipher.js +14 -16
- package/lib/Signal/Group/group_cipher.js.map +1 -0
- package/lib/Signal/Group/index.d.ts +12 -11
- package/lib/Signal/Group/index.d.ts.map +1 -0
- package/lib/Signal/Group/index.js +12 -57
- package/lib/Signal/Group/index.js.map +1 -0
- package/lib/Signal/Group/keyhelper.d.ts +2 -1
- package/lib/Signal/Group/keyhelper.d.ts.map +1 -0
- package/lib/Signal/Group/keyhelper.js +8 -44
- package/lib/Signal/Group/keyhelper.js.map +1 -0
- package/lib/Signal/Group/queue-job.d.ts +2 -0
- package/lib/Signal/Group/queue-job.d.ts.map +1 -0
- package/lib/Signal/Group/queue-job.js +5 -5
- package/lib/Signal/Group/queue-job.js.map +1 -0
- package/lib/Signal/Group/sender-chain-key.d.ts +2 -1
- package/lib/Signal/Group/sender-chain-key.d.ts.map +1 -0
- package/lib/Signal/Group/sender-chain-key.js +7 -9
- package/lib/Signal/Group/sender-chain-key.js.map +1 -0
- package/lib/Signal/Group/sender-key-distribution-message.d.ts +2 -1
- package/lib/Signal/Group/sender-key-distribution-message.d.ts.map +1 -0
- package/lib/Signal/Group/sender-key-distribution-message.js +6 -9
- package/lib/Signal/Group/sender-key-distribution-message.js.map +1 -0
- package/lib/Signal/Group/sender-key-message.d.ts +2 -1
- package/lib/Signal/Group/sender-key-message.d.ts.map +1 -0
- package/lib/Signal/Group/sender-key-message.js +10 -12
- package/lib/Signal/Group/sender-key-message.js.map +1 -0
- package/lib/Signal/Group/sender-key-name.d.ts +1 -0
- package/lib/Signal/Group/sender-key-name.d.ts.map +1 -0
- package/lib/Signal/Group/sender-key-name.js +2 -5
- package/lib/Signal/Group/sender-key-name.js.map +1 -0
- package/lib/Signal/Group/sender-key-record.d.ts +2 -1
- package/lib/Signal/Group/sender-key-record.d.ts.map +1 -0
- package/lib/Signal/Group/sender-key-record.js +9 -12
- package/lib/Signal/Group/sender-key-record.js.map +1 -0
- package/lib/Signal/Group/sender-key-state.d.ts +3 -2
- package/lib/Signal/Group/sender-key-state.d.ts.map +1 -0
- package/lib/Signal/Group/sender-key-state.js +6 -9
- package/lib/Signal/Group/sender-key-state.js.map +1 -0
- package/lib/Signal/Group/sender-message-key.d.ts +1 -0
- package/lib/Signal/Group/sender-message-key.d.ts.map +1 -0
- package/lib/Signal/Group/sender-message-key.js +5 -7
- package/lib/Signal/Group/sender-message-key.js.map +1 -0
- package/lib/Signal/libsignal.d.ts +3 -2
- package/lib/Signal/libsignal.d.ts.map +1 -0
- package/lib/Signal/libsignal.js +22 -55
- package/lib/Signal/libsignal.js.map +1 -0
- package/lib/Socket/Client/index.d.ts +3 -2
- package/lib/Socket/Client/index.d.ts.map +1 -0
- package/lib/Socket/Client/index.js +3 -18
- package/lib/Socket/Client/index.js.map +1 -0
- package/lib/Socket/Client/types.d.ts +2 -1
- package/lib/Socket/Client/types.d.ts.map +1 -0
- package/lib/Socket/Client/types.js +4 -6
- package/lib/Socket/Client/types.js.map +1 -0
- package/lib/Socket/Client/websocket.d.ts +2 -1
- package/lib/Socket/Client/websocket.d.ts.map +1 -0
- package/lib/Socket/Client/websocket.js +14 -26
- package/lib/Socket/Client/websocket.js.map +1 -0
- package/lib/Socket/business.d.ts +89 -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 +28 -21
- package/lib/Socket/chats.d.ts.map +1 -0
- package/lib/Socket/chats.js +195 -142
- 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 +43 -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 +125 -65
- 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 +75 -45
- package/lib/Socket/messages-recv.d.ts.map +1 -0
- package/lib/Socket/messages-recv.js +303 -156
- package/lib/Socket/messages-recv.js.map +1 -0
- package/lib/Socket/messages-send.d.ts +72 -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 +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 +13 -12
- package/lib/Socket/socket.d.ts.map +1 -0
- package/lib/Socket/socket.js +135 -116
- package/lib/Socket/socket.js.map +1 -0
- package/lib/Socket/usync.d.ts +15 -14
- 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 +13 -7
- package/lib/Types/Chat.d.ts.map +1 -0
- package/lib/Types/Chat.js +2 -4
- package/lib/Types/Chat.js.map +1 -0
- package/lib/Types/Contact.d.ts +1 -0
- package/lib/Types/Contact.d.ts.map +1 -0
- package/lib/Types/Contact.js +2 -2
- package/lib/Types/Contact.js.map +1 -0
- package/lib/Types/Events.d.ts +37 -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 +15 -8
- 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 +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 +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 +8 -7
- package/lib/Utils/chat-utils.d.ts.map +1 -0
- package/lib/Utils/chat-utils.js +144 -138
- 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 +42 -44
- package/lib/Utils/decode-wa-message.js.map +1 -0
- package/lib/Utils/event-buffer.d.ts +4 -4
- package/lib/Utils/event-buffer.d.ts.map +1 -0
- package/lib/Utils/event-buffer.js +37 -50
- package/lib/Utils/event-buffer.js.map +1 -0
- package/lib/Utils/generics.d.ts +10 -8
- 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 +32 -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 +10 -47
- package/lib/Utils/link-preview.js.map +1 -0
- package/lib/Utils/logger.d.ts +8 -6
- package/lib/Utils/logger.d.ts.map +1 -0
- package/lib/Utils/logger.js +3 -7
- package/lib/Utils/logger.js.map +1 -0
- package/lib/Utils/lt-hash.d.ts +9 -8
- package/lib/Utils/lt-hash.d.ts.map +1 -0
- package/lib/Utils/lt-hash.js +23 -26
- package/lib/Utils/lt-hash.js.map +1 -0
- package/lib/Utils/make-mutex.d.ts +1 -0
- package/lib/Utils/make-mutex.d.ts.map +1 -0
- package/lib/Utils/make-mutex.js +5 -9
- package/lib/Utils/make-mutex.js.map +1 -0
- package/lib/Utils/messages-media.d.ts +20 -11
- package/lib/Utils/messages-media.d.ts.map +1 -0
- package/lib/Utils/messages-media.js +191 -214
- package/lib/Utils/messages-media.js.map +1 -0
- package/lib/Utils/messages.d.ts +8 -7
- package/lib/Utils/messages.d.ts.map +1 -0
- package/lib/Utils/messages.js +218 -197
- package/lib/Utils/messages.js.map +1 -0
- package/lib/Utils/noise-handler.d.ts +5 -4
- package/lib/Utils/noise-handler.d.ts.map +1 -0
- package/lib/Utils/noise-handler.js +22 -26
- package/lib/Utils/noise-handler.js.map +1 -0
- package/lib/Utils/process-message.d.ts +5 -4
- package/lib/Utils/process-message.d.ts.map +1 -0
- package/lib/Utils/process-message.js +95 -104
- package/lib/Utils/process-message.js.map +1 -0
- package/lib/Utils/signal.d.ts +5 -4
- package/lib/Utils/signal.d.ts.map +1 -0
- package/lib/Utils/signal.js +47 -52
- package/lib/Utils/signal.js.map +1 -0
- package/lib/Utils/use-multi-file-auth-state.d.ts +2 -1
- package/lib/Utils/use-multi-file-auth-state.d.ts.map +1 -0
- package/lib/Utils/use-multi-file-auth-state.js +23 -26
- package/lib/Utils/use-multi-file-auth-state.js.map +1 -0
- package/lib/Utils/validate-connection.d.ts +4 -3
- package/lib/Utils/validate-connection.d.ts.map +1 -0
- package/lib/Utils/validate-connection.js +52 -58
- package/lib/Utils/validate-connection.js.map +1 -0
- package/lib/WABinary/constants.d.ts +1 -0
- package/lib/WABinary/constants.d.ts.map +1 -0
- package/lib/WABinary/constants.js +9 -11
- package/lib/WABinary/constants.js.map +1 -0
- package/lib/WABinary/decode.d.ts +2 -1
- package/lib/WABinary/decode.d.ts.map +1 -0
- package/lib/WABinary/decode.js +13 -51
- package/lib/WABinary/decode.js.map +1 -0
- package/lib/WABinary/encode.d.ts +2 -1
- package/lib/WABinary/encode.d.ts.map +1 -0
- package/lib/WABinary/encode.js +5 -41
- package/lib/WABinary/encode.js.map +1 -0
- package/lib/WABinary/generic-utils.d.ts +4 -3
- package/lib/WABinary/generic-utils.d.ts.map +1 -0
- package/lib/WABinary/generic-utils.js +30 -38
- package/lib/WABinary/generic-utils.js.map +1 -0
- package/lib/WABinary/index.d.ts +6 -5
- package/lib/WABinary/index.d.ts.map +1 -0
- package/lib/WABinary/index.js +6 -21
- package/lib/WABinary/index.js.map +1 -0
- package/lib/WABinary/jid-utils.d.ts +1 -0
- package/lib/WABinary/jid-utils.d.ts.map +1 -0
- package/lib/WABinary/jid-utils.js +21 -35
- package/lib/WABinary/jid-utils.js.map +1 -0
- package/lib/WABinary/types.d.ts +2 -1
- package/lib/WABinary/types.d.ts.map +1 -0
- package/lib/WABinary/types.js +2 -2
- package/lib/WABinary/types.js.map +1 -0
- package/lib/WAM/BinaryInfo.d.ts +2 -1
- package/lib/WAM/BinaryInfo.d.ts.map +1 -0
- package/lib/WAM/BinaryInfo.js +2 -5
- package/lib/WAM/BinaryInfo.js.map +1 -0
- package/lib/WAM/constants.d.ts +1 -0
- package/lib/WAM/constants.d.ts.map +1 -0
- package/lib/WAM/constants.js +4 -6
- package/lib/WAM/constants.js.map +1 -0
- package/lib/WAM/encode.d.ts +2 -1
- package/lib/WAM/encode.d.ts.map +1 -0
- package/lib/WAM/encode.js +12 -14
- package/lib/WAM/encode.js.map +1 -0
- package/lib/WAM/index.d.ts +4 -3
- package/lib/WAM/index.d.ts.map +1 -0
- package/lib/WAM/index.js +4 -19
- package/lib/WAM/index.js.map +1 -0
- package/lib/WAUSync/Protocols/USyncContactProtocol.d.ts +4 -3
- package/lib/WAUSync/Protocols/USyncContactProtocol.d.ts.map +1 -0
- package/lib/WAUSync/Protocols/USyncContactProtocol.js +6 -9
- package/lib/WAUSync/Protocols/USyncContactProtocol.js.map +1 -0
- package/lib/WAUSync/Protocols/USyncDeviceProtocol.d.ts +3 -2
- package/lib/WAUSync/Protocols/USyncDeviceProtocol.d.ts.map +1 -0
- package/lib/WAUSync/Protocols/USyncDeviceProtocol.js +9 -12
- package/lib/WAUSync/Protocols/USyncDeviceProtocol.js.map +1 -0
- package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.d.ts +3 -2
- package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.d.ts.map +1 -0
- package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.js +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 +28 -28
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,42 +458,46 @@ 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, contextInfo } = 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 =
|
|
464
|
-
const msgType =
|
|
491
|
+
let quotedMsg = normalizeMessageContent(quoted.message);
|
|
492
|
+
const msgType = getContentType(quotedMsg);
|
|
465
493
|
// strip any redundant properties
|
|
466
|
-
quotedMsg =
|
|
494
|
+
quotedMsg = proto.Message.fromObject({ [msgType]: quotedMsg[msgType] });
|
|
467
495
|
const quotedContent = quotedMsg[msgType];
|
|
468
496
|
if (typeof quotedContent === 'object' && quotedContent && 'contextInfo' in quotedContent) {
|
|
469
497
|
delete quotedContent.contextInfo;
|
|
470
498
|
}
|
|
471
|
-
const contextInfo = innerMessage[key]
|
|
472
|
-
contextInfo.participant =
|
|
499
|
+
const contextInfo = ('contextInfo' in innerMessage[key] && innerMessage[key]?.contextInfo) || {};
|
|
500
|
+
contextInfo.participant = jidNormalizedUser(participant);
|
|
473
501
|
contextInfo.stanzaId = quoted.key.id;
|
|
474
502
|
contextInfo.quotedMessage = quotedMsg;
|
|
475
503
|
// if a participant is quoted, then it must be a group
|
|
@@ -477,66 +505,71 @@ const generateWAMessageFromContent = (jid, message, options) => {
|
|
|
477
505
|
if (jid !== quoted.key.remoteJid) {
|
|
478
506
|
contextInfo.remoteJid = quoted.key.remoteJid;
|
|
479
507
|
}
|
|
480
|
-
innerMessage[key]
|
|
508
|
+
if (contextInfo && innerMessage[key]) {
|
|
509
|
+
/* @ts-ignore */
|
|
510
|
+
innerMessage[key].contextInfo = contextInfo;
|
|
511
|
+
}
|
|
481
512
|
}
|
|
482
|
-
if (contextInfo) {
|
|
513
|
+
if (contextInfo && message[key]) {
|
|
514
|
+
/* @ts-ignore */
|
|
483
515
|
message[key].contextInfo = {
|
|
516
|
+
/* @ts-ignore */
|
|
484
517
|
...(message[key].contextInfo || {}),
|
|
485
518
|
...contextInfo
|
|
486
519
|
};
|
|
487
520
|
}
|
|
488
521
|
if (
|
|
489
522
|
// if we want to send a disappearing message
|
|
490
|
-
!!
|
|
523
|
+
!!options?.ephemeralExpiration &&
|
|
491
524
|
// and it's not a protocol message -- delete, toggle disappear message
|
|
492
525
|
key !== 'protocolMessage' &&
|
|
493
526
|
// already not converted to disappearing message
|
|
494
|
-
key !== 'ephemeralMessage'
|
|
527
|
+
key !== 'ephemeralMessage' &&
|
|
528
|
+
// newsletters don't support ephemeral messages
|
|
529
|
+
!isJidNewsletter(jid)) {
|
|
530
|
+
/* @ts-ignore */
|
|
495
531
|
innerMessage[key].contextInfo = {
|
|
496
532
|
...(innerMessage[key].contextInfo || {}),
|
|
497
|
-
expiration: options.ephemeralExpiration ||
|
|
533
|
+
expiration: options.ephemeralExpiration || WA_DEFAULT_EPHEMERAL
|
|
498
534
|
//ephemeralSettingTimestamp: options.ephemeralOptions.eph_setting_ts?.toString()
|
|
499
535
|
};
|
|
500
536
|
}
|
|
501
|
-
message =
|
|
537
|
+
message = WAProto.Message.fromObject(message);
|
|
502
538
|
const messageJSON = {
|
|
503
539
|
key: {
|
|
504
540
|
remoteJid: jid,
|
|
505
541
|
fromMe: true,
|
|
506
|
-
id:
|
|
542
|
+
id: options?.messageId || generateMessageIDV2()
|
|
507
543
|
},
|
|
508
544
|
message: message,
|
|
509
545
|
messageTimestamp: timestamp,
|
|
510
546
|
messageStubParameters: [],
|
|
511
|
-
participant:
|
|
512
|
-
status:
|
|
547
|
+
participant: isJidGroup(jid) || isJidStatusBroadcast(jid) ? userJid : undefined,
|
|
548
|
+
status: WAMessageStatus.PENDING
|
|
513
549
|
};
|
|
514
|
-
return
|
|
550
|
+
return WAProto.WebMessageInfo.fromObject(messageJSON);
|
|
515
551
|
};
|
|
516
|
-
|
|
517
|
-
const generateWAMessage = async (jid, content, options) => {
|
|
518
|
-
var _a;
|
|
552
|
+
export const generateWAMessage = async (jid, content, options) => {
|
|
519
553
|
// ensure msg ID is with every log
|
|
520
|
-
options.logger =
|
|
521
|
-
|
|
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);
|
|
522
557
|
};
|
|
523
|
-
exports.generateWAMessage = generateWAMessage;
|
|
524
558
|
/** Get the key to access the true type of content */
|
|
525
|
-
const getContentType = (content) => {
|
|
559
|
+
export const getContentType = (content) => {
|
|
526
560
|
if (content) {
|
|
527
561
|
const keys = Object.keys(content);
|
|
528
562
|
const key = keys.find(k => (k === 'conversation' || k.includes('Message')) && k !== 'senderKeyDistributionMessage');
|
|
529
563
|
return key;
|
|
530
564
|
}
|
|
531
565
|
};
|
|
532
|
-
exports.getContentType = getContentType;
|
|
533
566
|
/**
|
|
534
567
|
* Normalizes ephemeral, view once messages to regular message content
|
|
535
568
|
* Eg. image messages in ephemeral messages, in view once messages etc.
|
|
536
569
|
* @param content
|
|
537
570
|
* @returns
|
|
538
571
|
*/
|
|
539
|
-
const normalizeMessageContent = (content) => {
|
|
572
|
+
export const normalizeMessageContent = (content) => {
|
|
540
573
|
if (!content) {
|
|
541
574
|
return undefined;
|
|
542
575
|
}
|
|
@@ -550,21 +583,19 @@ const normalizeMessageContent = (content) => {
|
|
|
550
583
|
}
|
|
551
584
|
return content;
|
|
552
585
|
function getFutureProofMessage(message) {
|
|
553
|
-
return (
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
586
|
+
return (message?.ephemeralMessage ||
|
|
587
|
+
message?.viewOnceMessage ||
|
|
588
|
+
message?.documentWithCaptionMessage ||
|
|
589
|
+
message?.viewOnceMessageV2 ||
|
|
590
|
+
message?.viewOnceMessageV2Extension ||
|
|
591
|
+
message?.editedMessage);
|
|
559
592
|
}
|
|
560
593
|
};
|
|
561
|
-
exports.normalizeMessageContent = normalizeMessageContent;
|
|
562
594
|
/**
|
|
563
595
|
* Extract the true message content from a message
|
|
564
596
|
* Eg. extracts the inner message from a disappearing message/view once message
|
|
565
597
|
*/
|
|
566
|
-
const extractMessageContent = (content) => {
|
|
567
|
-
var _a, _b, _c, _d, _e, _f;
|
|
598
|
+
export const extractMessageContent = (content) => {
|
|
568
599
|
const extractFromTemplateMessage = (msg) => {
|
|
569
600
|
if (msg.imageMessage) {
|
|
570
601
|
return { imageMessage: msg.imageMessage };
|
|
@@ -584,26 +615,25 @@ const extractMessageContent = (content) => {
|
|
|
584
615
|
};
|
|
585
616
|
}
|
|
586
617
|
};
|
|
587
|
-
content =
|
|
588
|
-
if (content
|
|
618
|
+
content = normalizeMessageContent(content);
|
|
619
|
+
if (content?.buttonsMessage) {
|
|
589
620
|
return extractFromTemplateMessage(content.buttonsMessage);
|
|
590
621
|
}
|
|
591
|
-
if (
|
|
592
|
-
return extractFromTemplateMessage(
|
|
622
|
+
if (content?.templateMessage?.hydratedFourRowTemplate) {
|
|
623
|
+
return extractFromTemplateMessage(content?.templateMessage?.hydratedFourRowTemplate);
|
|
593
624
|
}
|
|
594
|
-
if (
|
|
595
|
-
return extractFromTemplateMessage(
|
|
625
|
+
if (content?.templateMessage?.hydratedTemplate) {
|
|
626
|
+
return extractFromTemplateMessage(content?.templateMessage?.hydratedTemplate);
|
|
596
627
|
}
|
|
597
|
-
if (
|
|
598
|
-
return extractFromTemplateMessage(
|
|
628
|
+
if (content?.templateMessage?.fourRowTemplate) {
|
|
629
|
+
return extractFromTemplateMessage(content?.templateMessage?.fourRowTemplate);
|
|
599
630
|
}
|
|
600
631
|
return content;
|
|
601
632
|
};
|
|
602
|
-
exports.extractMessageContent = extractMessageContent;
|
|
603
633
|
/**
|
|
604
634
|
* Returns the device predicted by message ID
|
|
605
635
|
*/
|
|
606
|
-
const getDevice = (id) => /^3A.{18}$/.test(id)
|
|
636
|
+
export const getDevice = (id) => /^3A.{18}$/.test(id)
|
|
607
637
|
? 'ios'
|
|
608
638
|
: /^3E.{20}$/.test(id)
|
|
609
639
|
? 'web'
|
|
@@ -612,9 +642,8 @@ const getDevice = (id) => /^3A.{18}$/.test(id)
|
|
|
612
642
|
: /^(3F|.{18}$)/.test(id)
|
|
613
643
|
? 'desktop'
|
|
614
644
|
: 'unknown';
|
|
615
|
-
exports.getDevice = getDevice;
|
|
616
645
|
/** Upserts a receipt in the message */
|
|
617
|
-
const updateMessageWithReceipt = (msg, receipt) => {
|
|
646
|
+
export const updateMessageWithReceipt = (msg, receipt) => {
|
|
618
647
|
msg.userReceipt = msg.userReceipt || [];
|
|
619
648
|
const recp = msg.userReceipt.find(m => m.userJid === receipt.userJid);
|
|
620
649
|
if (recp) {
|
|
@@ -624,41 +653,36 @@ const updateMessageWithReceipt = (msg, receipt) => {
|
|
|
624
653
|
msg.userReceipt.push(receipt);
|
|
625
654
|
}
|
|
626
655
|
};
|
|
627
|
-
exports.updateMessageWithReceipt = updateMessageWithReceipt;
|
|
628
656
|
/** Update the message with a new reaction */
|
|
629
|
-
const updateMessageWithReaction = (msg, reaction) => {
|
|
630
|
-
const authorID =
|
|
631
|
-
const reactions = (msg.reactions || []).filter(r =>
|
|
657
|
+
export const updateMessageWithReaction = (msg, reaction) => {
|
|
658
|
+
const authorID = getKeyAuthor(reaction.key);
|
|
659
|
+
const reactions = (msg.reactions || []).filter(r => getKeyAuthor(r.key) !== authorID);
|
|
632
660
|
reaction.text = reaction.text || '';
|
|
633
661
|
reactions.push(reaction);
|
|
634
662
|
msg.reactions = reactions;
|
|
635
663
|
};
|
|
636
|
-
exports.updateMessageWithReaction = updateMessageWithReaction;
|
|
637
664
|
/** Update the message with a new poll update */
|
|
638
|
-
const updateMessageWithPollUpdate = (msg, update) => {
|
|
639
|
-
|
|
640
|
-
const
|
|
641
|
-
|
|
642
|
-
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) {
|
|
643
669
|
reactions.push(update);
|
|
644
670
|
}
|
|
645
671
|
msg.pollUpdates = reactions;
|
|
646
672
|
};
|
|
647
|
-
exports.updateMessageWithPollUpdate = updateMessageWithPollUpdate;
|
|
648
673
|
/**
|
|
649
674
|
* Aggregates all poll updates in a poll.
|
|
650
675
|
* @param msg the poll creation message
|
|
651
676
|
* @param meId your jid
|
|
652
677
|
* @returns A list of options & their voters
|
|
653
678
|
*/
|
|
654
|
-
function getAggregateVotesInPollMessage({ message, pollUpdates }, meId) {
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
((_c = message === null || message === void 0 ? void 0 : message.pollCreationMessageV3) === null || _c === void 0 ? void 0 : _c.options) ||
|
|
679
|
+
export function getAggregateVotesInPollMessage({ message, pollUpdates }, meId) {
|
|
680
|
+
const opts = message?.pollCreationMessage?.options ||
|
|
681
|
+
message?.pollCreationMessageV2?.options ||
|
|
682
|
+
message?.pollCreationMessageV3?.options ||
|
|
659
683
|
[];
|
|
660
684
|
const voteHashMap = opts.reduce((acc, opt) => {
|
|
661
|
-
const hash =
|
|
685
|
+
const hash = sha256(Buffer.from(opt.optionName || '')).toString();
|
|
662
686
|
acc[hash] = {
|
|
663
687
|
name: opt.optionName || '',
|
|
664
688
|
voters: []
|
|
@@ -680,13 +704,13 @@ function getAggregateVotesInPollMessage({ message, pollUpdates }, meId) {
|
|
|
680
704
|
};
|
|
681
705
|
data = voteHashMap[hash];
|
|
682
706
|
}
|
|
683
|
-
voteHashMap[hash].voters.push(
|
|
707
|
+
voteHashMap[hash].voters.push(getKeyAuthor(update.pollUpdateMessageKey, meId));
|
|
684
708
|
}
|
|
685
709
|
}
|
|
686
710
|
return Object.values(voteHashMap);
|
|
687
711
|
}
|
|
688
712
|
/** Given a list of message keys, aggregates them by chat & sender. Useful for sending read receipts in bulk */
|
|
689
|
-
const aggregateMessageKeysNotFromMe = (keys) => {
|
|
713
|
+
export const aggregateMessageKeysNotFromMe = (keys) => {
|
|
690
714
|
const keyMap = {};
|
|
691
715
|
for (const { remoteJid, id, participant, fromMe } of keys) {
|
|
692
716
|
if (!fromMe) {
|
|
@@ -703,17 +727,15 @@ const aggregateMessageKeysNotFromMe = (keys) => {
|
|
|
703
727
|
}
|
|
704
728
|
return Object.values(keyMap);
|
|
705
729
|
};
|
|
706
|
-
exports.aggregateMessageKeysNotFromMe = aggregateMessageKeysNotFromMe;
|
|
707
730
|
const REUPLOAD_REQUIRED_STATUS = [410, 404];
|
|
708
731
|
/**
|
|
709
732
|
* Downloads the given message. Throws an error if it's not a media message
|
|
710
733
|
*/
|
|
711
|
-
const downloadMediaMessage = async (message, type, options, ctx) => {
|
|
734
|
+
export const downloadMediaMessage = async (message, type, options, ctx) => {
|
|
712
735
|
const result = await downloadMsg().catch(async (error) => {
|
|
713
|
-
var _a;
|
|
714
736
|
if (ctx &&
|
|
715
|
-
|
|
716
|
-
REUPLOAD_REQUIRED_STATUS.includes(
|
|
737
|
+
axios.isAxiosError(error) && // check if the message requires a reupload
|
|
738
|
+
REUPLOAD_REQUIRED_STATUS.includes(error.response?.status)) {
|
|
717
739
|
ctx.logger.info({ key: message.key }, 'sending reupload media request...');
|
|
718
740
|
// request reupload
|
|
719
741
|
message = await ctx.reuploadRequest(message);
|
|
@@ -724,15 +746,15 @@ const downloadMediaMessage = async (message, type, options, ctx) => {
|
|
|
724
746
|
});
|
|
725
747
|
return result;
|
|
726
748
|
async function downloadMsg() {
|
|
727
|
-
const mContent =
|
|
749
|
+
const mContent = extractMessageContent(message.message);
|
|
728
750
|
if (!mContent) {
|
|
729
|
-
throw new
|
|
751
|
+
throw new Boom('No message present', { statusCode: 400, data: message });
|
|
730
752
|
}
|
|
731
|
-
const contentType =
|
|
732
|
-
let mediaType = contentType
|
|
753
|
+
const contentType = getContentType(mContent);
|
|
754
|
+
let mediaType = contentType?.replace('Message', '');
|
|
733
755
|
const media = mContent[contentType];
|
|
734
756
|
if (!media || typeof media !== 'object' || (!('url' in media) && !('thumbnailDirectPath' in media))) {
|
|
735
|
-
throw new
|
|
757
|
+
throw new Boom(`"${contentType}" message is not a media message`);
|
|
736
758
|
}
|
|
737
759
|
let download;
|
|
738
760
|
if ('thumbnailDirectPath' in media && !('url' in media)) {
|
|
@@ -745,7 +767,7 @@ const downloadMediaMessage = async (message, type, options, ctx) => {
|
|
|
745
767
|
else {
|
|
746
768
|
download = media;
|
|
747
769
|
}
|
|
748
|
-
const stream = await
|
|
770
|
+
const stream = await downloadContentFromMessage(download, mediaType, options);
|
|
749
771
|
if (type === 'buffer') {
|
|
750
772
|
const bufferArray = [];
|
|
751
773
|
for await (const chunk of stream) {
|
|
@@ -756,18 +778,17 @@ const downloadMediaMessage = async (message, type, options, ctx) => {
|
|
|
756
778
|
return stream;
|
|
757
779
|
}
|
|
758
780
|
};
|
|
759
|
-
exports.downloadMediaMessage = downloadMediaMessage;
|
|
760
781
|
/** Checks whether the given message is a media message; if it is returns the inner content */
|
|
761
|
-
const assertMediaContent = (content) => {
|
|
762
|
-
content =
|
|
763
|
-
const mediaContent =
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
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;
|
|
768
789
|
if (!mediaContent) {
|
|
769
|
-
throw new
|
|
790
|
+
throw new Boom('given message is not a media message', { statusCode: 400, data: content });
|
|
770
791
|
}
|
|
771
792
|
return mediaContent;
|
|
772
793
|
};
|
|
773
|
-
|
|
794
|
+
//# sourceMappingURL=messages.js.map
|