@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
|
@@ -1,39 +1,34 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
const
|
|
14
|
-
const make_mutex_1 = require("../Utils/make-mutex");
|
|
15
|
-
const WABinary_1 = require("../WABinary");
|
|
16
|
-
const groups_1 = require("./groups");
|
|
17
|
-
const messages_send_1 = require("./messages-send");
|
|
18
|
-
const makeMessagesRecvSocket = (config) => {
|
|
1
|
+
import NodeCache from '@cacheable/node-cache';
|
|
2
|
+
import { Boom } from '@hapi/boom';
|
|
3
|
+
import { randomBytes } from 'crypto';
|
|
4
|
+
import Long from 'long';
|
|
5
|
+
import { proto } from '../../WAProto/index.js';
|
|
6
|
+
import { DEFAULT_CACHE_TTLS, KEY_BUNDLE_TYPE, MIN_PREKEY_COUNT } from '../Defaults/index.js';
|
|
7
|
+
import { WAMessageStatus, WAMessageStubType } from '../Types/index.js';
|
|
8
|
+
import { aesDecryptCTR, aesEncryptGCM, cleanMessage, Curve, decodeMediaRetryNode, decodeMessageNode, decryptMessageNode, delay, derivePairingCodeKey, encodeBigEndian, encodeSignedDeviceIdentity, getCallStatusFromNode, getHistoryMsg, getNextPreKeys, getStatusFromReceiptType, hkdf, MISSING_KEYS_ERROR_TEXT, NACK_REASONS, NO_MESSAGE_FOUND_ERROR_TEXT, unixTimestampSeconds, xmppPreKey, xmppSignedPreKey } from '../Utils/index.js';
|
|
9
|
+
import { makeMutex } from '../Utils/make-mutex.js';
|
|
10
|
+
import { areJidsSameUser, getAllBinaryNodeChildren, getBinaryNodeChild, getBinaryNodeChildBuffer, getBinaryNodeChildren, getBinaryNodeChildString, isJidGroup, isJidStatusBroadcast, isJidUser, isLidUser, jidDecode, jidNormalizedUser, S_WHATSAPP_NET } from '../WABinary/index.js';
|
|
11
|
+
import { extractGroupMetadata } from './groups.js';
|
|
12
|
+
import { makeMessagesSocket } from './messages-send.js';
|
|
13
|
+
export const makeMessagesRecvSocket = (config) => {
|
|
19
14
|
const { logger, retryRequestDelayMs, maxMsgRetryCount, getMessage, shouldIgnoreJid } = config;
|
|
20
|
-
const sock =
|
|
15
|
+
const sock = makeMessagesSocket(config);
|
|
21
16
|
const { ev, authState, ws, processingMutex, signalRepository, query, upsertMessage, resyncAppState, onUnexpectedError, assertSessions, sendNode, relayMessage, sendReceipt, uploadPreKeys, sendPeerDataOperationMessage } = sock;
|
|
22
17
|
/** this mutex ensures that each retryRequest will wait for the previous one to finish */
|
|
23
|
-
const retryMutex =
|
|
18
|
+
const retryMutex = makeMutex();
|
|
24
19
|
const msgRetryCache = config.msgRetryCounterCache ||
|
|
25
|
-
new
|
|
26
|
-
stdTTL:
|
|
20
|
+
new NodeCache({
|
|
21
|
+
stdTTL: DEFAULT_CACHE_TTLS.MSG_RETRY, // 1 hour
|
|
27
22
|
useClones: false
|
|
28
23
|
});
|
|
29
24
|
const callOfferCache = config.callOfferCache ||
|
|
30
|
-
new
|
|
31
|
-
stdTTL:
|
|
25
|
+
new NodeCache({
|
|
26
|
+
stdTTL: DEFAULT_CACHE_TTLS.CALL_OFFER, // 5 mins
|
|
32
27
|
useClones: false
|
|
33
28
|
});
|
|
34
29
|
const placeholderResendCache = config.placeholderResendCache ||
|
|
35
|
-
new
|
|
36
|
-
stdTTL:
|
|
30
|
+
new NodeCache({
|
|
31
|
+
stdTTL: DEFAULT_CACHE_TTLS.MSG_RETRY, // 1 hour
|
|
37
32
|
useClones: false
|
|
38
33
|
});
|
|
39
34
|
let sendActiveReceipts = false;
|
|
@@ -56,10 +51,10 @@ const makeMessagesRecvSocket = (config) => {
|
|
|
56
51
|
stanza.attrs.recipient = attrs.recipient;
|
|
57
52
|
}
|
|
58
53
|
if (!!attrs.type &&
|
|
59
|
-
(tag !== 'message' ||
|
|
54
|
+
(tag !== 'message' || getBinaryNodeChild({ tag, attrs, content }, 'unavailable') || errorCode !== 0)) {
|
|
60
55
|
stanza.attrs.type = attrs.type;
|
|
61
56
|
}
|
|
62
|
-
if (tag === 'message' &&
|
|
57
|
+
if (tag === 'message' && getBinaryNodeChild({ tag, attrs, content }, 'unavailable')) {
|
|
63
58
|
stanza.attrs.from = authState.creds.me.id;
|
|
64
59
|
}
|
|
65
60
|
logger.debug({ recv: { tag, attrs }, sent: stanza.attrs }, 'sent ack');
|
|
@@ -87,10 +82,10 @@ const makeMessagesRecvSocket = (config) => {
|
|
|
87
82
|
await query(stanza);
|
|
88
83
|
};
|
|
89
84
|
const sendRetryRequest = async (node, forceIncludeKeys = false) => {
|
|
90
|
-
const { fullMessage } =
|
|
85
|
+
const { fullMessage } = decodeMessageNode(node, authState.creds.me.id, authState.creds.me.lid || '');
|
|
91
86
|
const { key: msgKey } = fullMessage;
|
|
92
87
|
const msgId = msgKey.id;
|
|
93
|
-
const key = `${msgId}:${msgKey
|
|
88
|
+
const key = `${msgId}:${msgKey?.participant}`;
|
|
94
89
|
let retryCount = msgRetryCache.get(key) || 0;
|
|
95
90
|
if (retryCount >= maxMsgRetryCount) {
|
|
96
91
|
logger.debug({ retryCount, msgId }, 'reached retry limit, clearing');
|
|
@@ -105,7 +100,7 @@ const makeMessagesRecvSocket = (config) => {
|
|
|
105
100
|
const msgId = await requestPlaceholderResend(msgKey);
|
|
106
101
|
logger.debug(`sendRetryRequest: requested placeholder resend for message ${msgId}`);
|
|
107
102
|
}
|
|
108
|
-
const deviceIdentity =
|
|
103
|
+
const deviceIdentity = encodeSignedDeviceIdentity(account, true);
|
|
109
104
|
await authState.keys.transaction(async () => {
|
|
110
105
|
const receipt = {
|
|
111
106
|
tag: 'receipt',
|
|
@@ -127,7 +122,7 @@ const makeMessagesRecvSocket = (config) => {
|
|
|
127
122
|
{
|
|
128
123
|
tag: 'registration',
|
|
129
124
|
attrs: {},
|
|
130
|
-
content:
|
|
125
|
+
content: encodeBigEndian(authState.creds.registrationId)
|
|
131
126
|
}
|
|
132
127
|
]
|
|
133
128
|
};
|
|
@@ -138,7 +133,7 @@ const makeMessagesRecvSocket = (config) => {
|
|
|
138
133
|
receipt.attrs.participant = node.attrs.participant;
|
|
139
134
|
}
|
|
140
135
|
if (retryCount > 1 || forceIncludeKeys) {
|
|
141
|
-
const { update, preKeys } = await
|
|
136
|
+
const { update, preKeys } = await getNextPreKeys(authState, 1);
|
|
142
137
|
const [keyId] = Object.keys(preKeys);
|
|
143
138
|
const key = preKeys[+keyId];
|
|
144
139
|
const content = receipt.content;
|
|
@@ -146,10 +141,10 @@ const makeMessagesRecvSocket = (config) => {
|
|
|
146
141
|
tag: 'keys',
|
|
147
142
|
attrs: {},
|
|
148
143
|
content: [
|
|
149
|
-
{ tag: 'type', attrs: {}, content: Buffer.from(
|
|
144
|
+
{ tag: 'type', attrs: {}, content: Buffer.from(KEY_BUNDLE_TYPE) },
|
|
150
145
|
{ tag: 'identity', attrs: {}, content: identityKey.public },
|
|
151
|
-
|
|
152
|
-
|
|
146
|
+
xmppPreKey(key, +keyId),
|
|
147
|
+
xmppSignedPreKey(signedPreKey),
|
|
153
148
|
{ tag: 'device-identity', attrs: {}, content: deviceIdentity }
|
|
154
149
|
]
|
|
155
150
|
});
|
|
@@ -161,17 +156,17 @@ const makeMessagesRecvSocket = (config) => {
|
|
|
161
156
|
};
|
|
162
157
|
const handleEncryptNotification = async (node) => {
|
|
163
158
|
const from = node.attrs.from;
|
|
164
|
-
if (from ===
|
|
165
|
-
const countChild =
|
|
159
|
+
if (from === S_WHATSAPP_NET) {
|
|
160
|
+
const countChild = getBinaryNodeChild(node, 'count');
|
|
166
161
|
const count = +countChild.attrs.value;
|
|
167
|
-
const shouldUploadMorePreKeys = count <
|
|
162
|
+
const shouldUploadMorePreKeys = count < MIN_PREKEY_COUNT;
|
|
168
163
|
logger.debug({ count, shouldUploadMorePreKeys }, 'recv pre-key count');
|
|
169
164
|
if (shouldUploadMorePreKeys) {
|
|
170
165
|
await uploadPreKeys();
|
|
171
166
|
}
|
|
172
167
|
}
|
|
173
168
|
else {
|
|
174
|
-
const identityNode =
|
|
169
|
+
const identityNode = getBinaryNodeChild(node, 'identity');
|
|
175
170
|
if (identityNode) {
|
|
176
171
|
logger.info({ jid: from }, 'identity changed');
|
|
177
172
|
// not handling right now
|
|
@@ -183,12 +178,11 @@ const makeMessagesRecvSocket = (config) => {
|
|
|
183
178
|
}
|
|
184
179
|
};
|
|
185
180
|
const handleGroupNotification = (participant, child, msg) => {
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
switch (child === null || child === void 0 ? void 0 : child.tag) {
|
|
181
|
+
const participantJid = getBinaryNodeChild(child, 'participant')?.attrs?.jid || participant;
|
|
182
|
+
switch (child?.tag) {
|
|
189
183
|
case 'create':
|
|
190
|
-
const metadata =
|
|
191
|
-
msg.messageStubType =
|
|
184
|
+
const metadata = extractGroupMetadata(child);
|
|
185
|
+
msg.messageStubType = WAMessageStubType.GROUP_CREATE;
|
|
192
186
|
msg.messageStubParameters = [metadata.subject];
|
|
193
187
|
msg.key = { participant: metadata.owner };
|
|
194
188
|
ev.emit('chats.upsert', [
|
|
@@ -209,15 +203,15 @@ const makeMessagesRecvSocket = (config) => {
|
|
|
209
203
|
case 'not_ephemeral':
|
|
210
204
|
msg.message = {
|
|
211
205
|
protocolMessage: {
|
|
212
|
-
type:
|
|
206
|
+
type: proto.Message.ProtocolMessage.Type.EPHEMERAL_SETTING,
|
|
213
207
|
ephemeralExpiration: +(child.attrs.expiration || 0)
|
|
214
208
|
}
|
|
215
209
|
};
|
|
216
210
|
break;
|
|
217
211
|
case 'modify':
|
|
218
|
-
const oldNumber =
|
|
212
|
+
const oldNumber = getBinaryNodeChildren(child, 'participant').map(p => p.attrs.jid);
|
|
219
213
|
msg.messageStubParameters = oldNumber || [];
|
|
220
|
-
msg.messageStubType =
|
|
214
|
+
msg.messageStubType = WAMessageStubType.GROUP_PARTICIPANT_CHANGE_NUMBER;
|
|
221
215
|
break;
|
|
222
216
|
case 'promote':
|
|
223
217
|
case 'demote':
|
|
@@ -225,74 +219,73 @@ const makeMessagesRecvSocket = (config) => {
|
|
|
225
219
|
case 'add':
|
|
226
220
|
case 'leave':
|
|
227
221
|
const stubType = `GROUP_PARTICIPANT_${child.tag.toUpperCase()}`;
|
|
228
|
-
msg.messageStubType =
|
|
229
|
-
const participants =
|
|
222
|
+
msg.messageStubType = WAMessageStubType[stubType];
|
|
223
|
+
const participants = getBinaryNodeChildren(child, 'participant').map(p => p.attrs.jid);
|
|
230
224
|
if (participants.length === 1 &&
|
|
231
225
|
// if recv. "remove" message and sender removed themselves
|
|
232
226
|
// mark as left
|
|
233
|
-
|
|
227
|
+
areJidsSameUser(participants[0], participant) &&
|
|
234
228
|
child.tag === 'remove') {
|
|
235
|
-
msg.messageStubType =
|
|
229
|
+
msg.messageStubType = WAMessageStubType.GROUP_PARTICIPANT_LEAVE;
|
|
236
230
|
}
|
|
237
231
|
msg.messageStubParameters = participants;
|
|
238
232
|
break;
|
|
239
233
|
case 'subject':
|
|
240
|
-
msg.messageStubType =
|
|
234
|
+
msg.messageStubType = WAMessageStubType.GROUP_CHANGE_SUBJECT;
|
|
241
235
|
msg.messageStubParameters = [child.attrs.subject];
|
|
242
236
|
break;
|
|
243
237
|
case 'description':
|
|
244
|
-
const description =
|
|
245
|
-
msg.messageStubType =
|
|
238
|
+
const description = getBinaryNodeChild(child, 'body')?.content?.toString();
|
|
239
|
+
msg.messageStubType = WAMessageStubType.GROUP_CHANGE_DESCRIPTION;
|
|
246
240
|
msg.messageStubParameters = description ? [description] : undefined;
|
|
247
241
|
break;
|
|
248
242
|
case 'announcement':
|
|
249
243
|
case 'not_announcement':
|
|
250
|
-
msg.messageStubType =
|
|
244
|
+
msg.messageStubType = WAMessageStubType.GROUP_CHANGE_ANNOUNCE;
|
|
251
245
|
msg.messageStubParameters = [child.tag === 'announcement' ? 'on' : 'off'];
|
|
252
246
|
break;
|
|
253
247
|
case 'locked':
|
|
254
248
|
case 'unlocked':
|
|
255
|
-
msg.messageStubType =
|
|
249
|
+
msg.messageStubType = WAMessageStubType.GROUP_CHANGE_RESTRICT;
|
|
256
250
|
msg.messageStubParameters = [child.tag === 'locked' ? 'on' : 'off'];
|
|
257
251
|
break;
|
|
258
252
|
case 'invite':
|
|
259
|
-
msg.messageStubType =
|
|
253
|
+
msg.messageStubType = WAMessageStubType.GROUP_CHANGE_INVITE_LINK;
|
|
260
254
|
msg.messageStubParameters = [child.attrs.code];
|
|
261
255
|
break;
|
|
262
256
|
case 'member_add_mode':
|
|
263
257
|
const addMode = child.content;
|
|
264
258
|
if (addMode) {
|
|
265
|
-
msg.messageStubType =
|
|
259
|
+
msg.messageStubType = WAMessageStubType.GROUP_MEMBER_ADD_MODE;
|
|
266
260
|
msg.messageStubParameters = [addMode.toString()];
|
|
267
261
|
}
|
|
268
262
|
break;
|
|
269
263
|
case 'membership_approval_mode':
|
|
270
|
-
const approvalMode =
|
|
264
|
+
const approvalMode = getBinaryNodeChild(child, 'group_join');
|
|
271
265
|
if (approvalMode) {
|
|
272
|
-
msg.messageStubType =
|
|
266
|
+
msg.messageStubType = WAMessageStubType.GROUP_MEMBERSHIP_JOIN_APPROVAL_MODE;
|
|
273
267
|
msg.messageStubParameters = [approvalMode.attrs.state];
|
|
274
268
|
}
|
|
275
269
|
break;
|
|
276
270
|
case 'created_membership_requests':
|
|
277
|
-
msg.messageStubType =
|
|
271
|
+
msg.messageStubType = WAMessageStubType.GROUP_MEMBERSHIP_JOIN_APPROVAL_REQUEST_NON_ADMIN_ADD;
|
|
278
272
|
msg.messageStubParameters = [participantJid, 'created', child.attrs.request_method];
|
|
279
273
|
break;
|
|
280
274
|
case 'revoked_membership_requests':
|
|
281
|
-
const isDenied =
|
|
282
|
-
msg.messageStubType =
|
|
275
|
+
const isDenied = areJidsSameUser(participantJid, participant);
|
|
276
|
+
msg.messageStubType = WAMessageStubType.GROUP_MEMBERSHIP_JOIN_APPROVAL_REQUEST_NON_ADMIN_ADD;
|
|
283
277
|
msg.messageStubParameters = [participantJid, isDenied ? 'revoked' : 'rejected'];
|
|
284
278
|
break;
|
|
285
279
|
}
|
|
286
280
|
};
|
|
287
281
|
const processNotification = async (node) => {
|
|
288
|
-
var _a, _b, _c;
|
|
289
282
|
const result = {};
|
|
290
|
-
const [child] =
|
|
283
|
+
const [child] = getAllBinaryNodeChildren(node);
|
|
291
284
|
const nodeType = node.attrs.type;
|
|
292
|
-
const from =
|
|
285
|
+
const from = jidNormalizedUser(node.attrs.from);
|
|
293
286
|
switch (nodeType) {
|
|
294
287
|
case 'privacy_token':
|
|
295
|
-
const tokenList =
|
|
288
|
+
const tokenList = getBinaryNodeChildren(child, 'token');
|
|
296
289
|
for (const { attrs, content } of tokenList) {
|
|
297
290
|
const jid = attrs.jid;
|
|
298
291
|
ev.emit('chats.update', [
|
|
@@ -304,49 +297,55 @@ const makeMessagesRecvSocket = (config) => {
|
|
|
304
297
|
logger.debug({ jid }, 'got privacy token update');
|
|
305
298
|
}
|
|
306
299
|
break;
|
|
300
|
+
case 'newsletter':
|
|
301
|
+
await handleNewsletterNotification(node);
|
|
302
|
+
break;
|
|
303
|
+
case 'mex':
|
|
304
|
+
await handleMexNewsletterNotification(node);
|
|
305
|
+
break;
|
|
307
306
|
case 'w:gp2':
|
|
308
307
|
handleGroupNotification(node.attrs.participant, child, result);
|
|
309
308
|
break;
|
|
310
309
|
case 'mediaretry':
|
|
311
|
-
const event =
|
|
310
|
+
const event = decodeMediaRetryNode(node);
|
|
312
311
|
ev.emit('messages.media-update', [event]);
|
|
313
312
|
break;
|
|
314
313
|
case 'encrypt':
|
|
315
314
|
await handleEncryptNotification(node);
|
|
316
315
|
break;
|
|
317
316
|
case 'devices':
|
|
318
|
-
const devices =
|
|
319
|
-
if (
|
|
317
|
+
const devices = getBinaryNodeChildren(child, 'device');
|
|
318
|
+
if (areJidsSameUser(child.attrs.jid, authState.creds.me.id)) {
|
|
320
319
|
const deviceJids = devices.map(d => d.attrs.jid);
|
|
321
320
|
logger.info({ deviceJids }, 'got my own devices');
|
|
322
321
|
}
|
|
323
322
|
break;
|
|
324
323
|
case 'server_sync':
|
|
325
|
-
const update =
|
|
324
|
+
const update = getBinaryNodeChild(node, 'collection');
|
|
326
325
|
if (update) {
|
|
327
326
|
const name = update.attrs.name;
|
|
328
327
|
await resyncAppState([name], false);
|
|
329
328
|
}
|
|
330
329
|
break;
|
|
331
330
|
case 'picture':
|
|
332
|
-
const setPicture =
|
|
333
|
-
const delPicture =
|
|
331
|
+
const setPicture = getBinaryNodeChild(node, 'set');
|
|
332
|
+
const delPicture = getBinaryNodeChild(node, 'delete');
|
|
334
333
|
ev.emit('contacts.update', [
|
|
335
334
|
{
|
|
336
|
-
id:
|
|
335
|
+
id: jidNormalizedUser(node?.attrs?.from) || (setPicture || delPicture)?.attrs?.hash || '',
|
|
337
336
|
imgUrl: setPicture ? 'changed' : 'removed'
|
|
338
337
|
}
|
|
339
338
|
]);
|
|
340
|
-
if (
|
|
339
|
+
if (isJidGroup(from)) {
|
|
341
340
|
const node = setPicture || delPicture;
|
|
342
|
-
result.messageStubType =
|
|
341
|
+
result.messageStubType = WAMessageStubType.GROUP_CHANGE_ICON;
|
|
343
342
|
if (setPicture) {
|
|
344
343
|
result.messageStubParameters = [setPicture.attrs.id];
|
|
345
344
|
}
|
|
346
|
-
result.participant = node
|
|
345
|
+
result.participant = node?.attrs.author;
|
|
347
346
|
result.key = {
|
|
348
347
|
...(result.key || {}),
|
|
349
|
-
participant: setPicture
|
|
348
|
+
participant: setPicture?.attrs.author
|
|
350
349
|
};
|
|
351
350
|
}
|
|
352
351
|
break;
|
|
@@ -366,7 +365,7 @@ const makeMessagesRecvSocket = (config) => {
|
|
|
366
365
|
});
|
|
367
366
|
}
|
|
368
367
|
else if (child.tag === 'blocklist') {
|
|
369
|
-
const blocklists =
|
|
368
|
+
const blocklists = getBinaryNodeChildren(child, 'item');
|
|
370
369
|
for (const { attrs } of blocklists) {
|
|
371
370
|
const blocklist = [attrs.jid];
|
|
372
371
|
const type = attrs.action === 'block' ? 'add' : 'remove';
|
|
@@ -375,15 +374,15 @@ const makeMessagesRecvSocket = (config) => {
|
|
|
375
374
|
}
|
|
376
375
|
break;
|
|
377
376
|
case 'link_code_companion_reg':
|
|
378
|
-
const linkCodeCompanionReg =
|
|
379
|
-
const ref = toRequiredBuffer(
|
|
380
|
-
const primaryIdentityPublicKey = toRequiredBuffer(
|
|
381
|
-
const primaryEphemeralPublicKeyWrapped = toRequiredBuffer(
|
|
377
|
+
const linkCodeCompanionReg = getBinaryNodeChild(node, 'link_code_companion_reg');
|
|
378
|
+
const ref = toRequiredBuffer(getBinaryNodeChildBuffer(linkCodeCompanionReg, 'link_code_pairing_ref'));
|
|
379
|
+
const primaryIdentityPublicKey = toRequiredBuffer(getBinaryNodeChildBuffer(linkCodeCompanionReg, 'primary_identity_pub'));
|
|
380
|
+
const primaryEphemeralPublicKeyWrapped = toRequiredBuffer(getBinaryNodeChildBuffer(linkCodeCompanionReg, 'link_code_pairing_wrapped_primary_ephemeral_pub'));
|
|
382
381
|
const codePairingPublicKey = await decipherLinkPublicKey(primaryEphemeralPublicKeyWrapped);
|
|
383
|
-
const companionSharedKey =
|
|
384
|
-
const random =
|
|
385
|
-
const linkCodeSalt =
|
|
386
|
-
const linkCodePairingExpanded = await
|
|
382
|
+
const companionSharedKey = Curve.sharedKey(authState.creds.pairingEphemeralKeyPair.private, codePairingPublicKey);
|
|
383
|
+
const random = randomBytes(32);
|
|
384
|
+
const linkCodeSalt = randomBytes(32);
|
|
385
|
+
const linkCodePairingExpanded = await hkdf(companionSharedKey, 32, {
|
|
387
386
|
salt: linkCodeSalt,
|
|
388
387
|
info: 'link_code_pairing_key_bundle_encryption_key'
|
|
389
388
|
});
|
|
@@ -392,16 +391,16 @@ const makeMessagesRecvSocket = (config) => {
|
|
|
392
391
|
primaryIdentityPublicKey,
|
|
393
392
|
random
|
|
394
393
|
]);
|
|
395
|
-
const encryptIv =
|
|
396
|
-
const encrypted =
|
|
394
|
+
const encryptIv = randomBytes(12);
|
|
395
|
+
const encrypted = aesEncryptGCM(encryptPayload, linkCodePairingExpanded, encryptIv, Buffer.alloc(0));
|
|
397
396
|
const encryptedPayload = Buffer.concat([linkCodeSalt, encryptIv, encrypted]);
|
|
398
|
-
const identitySharedKey =
|
|
397
|
+
const identitySharedKey = Curve.sharedKey(authState.creds.signedIdentityKey.private, primaryIdentityPublicKey);
|
|
399
398
|
const identityPayload = Buffer.concat([companionSharedKey, identitySharedKey, random]);
|
|
400
|
-
authState.creds.advSecretKey = (await
|
|
399
|
+
authState.creds.advSecretKey = (await hkdf(identityPayload, 32, { info: 'adv_secret' })).toString('base64');
|
|
401
400
|
await query({
|
|
402
401
|
tag: 'iq',
|
|
403
402
|
attrs: {
|
|
404
|
-
to:
|
|
403
|
+
to: S_WHATSAPP_NET,
|
|
405
404
|
type: 'set',
|
|
406
405
|
id: sock.generateMessageTag(),
|
|
407
406
|
xmlns: 'md'
|
|
@@ -443,14 +442,14 @@ const makeMessagesRecvSocket = (config) => {
|
|
|
443
442
|
async function decipherLinkPublicKey(data) {
|
|
444
443
|
const buffer = toRequiredBuffer(data);
|
|
445
444
|
const salt = buffer.slice(0, 32);
|
|
446
|
-
const secretKey = await
|
|
445
|
+
const secretKey = await derivePairingCodeKey(authState.creds.pairingCode, salt);
|
|
447
446
|
const iv = buffer.slice(32, 48);
|
|
448
447
|
const payload = buffer.slice(48, 80);
|
|
449
|
-
return
|
|
448
|
+
return aesDecryptCTR(payload, secretKey, iv);
|
|
450
449
|
}
|
|
451
450
|
function toRequiredBuffer(data) {
|
|
452
451
|
if (data === undefined) {
|
|
453
|
-
throw new
|
|
452
|
+
throw new Boom('Invalid buffer', { statusCode: 400 });
|
|
454
453
|
}
|
|
455
454
|
return data instanceof Buffer ? data : Buffer.from(data);
|
|
456
455
|
}
|
|
@@ -465,7 +464,6 @@ const makeMessagesRecvSocket = (config) => {
|
|
|
465
464
|
msgRetryCache.set(key, newValue);
|
|
466
465
|
};
|
|
467
466
|
const sendMessagesAgain = async (key, ids, retryNode) => {
|
|
468
|
-
var _a;
|
|
469
467
|
// todo: implement a cache to store the last 256 sent messages (copy whatsmeow)
|
|
470
468
|
const msgs = await Promise.all(ids.map(id => getMessage({ ...key, id })));
|
|
471
469
|
const remoteJid = key.remoteJid;
|
|
@@ -473,9 +471,9 @@ const makeMessagesRecvSocket = (config) => {
|
|
|
473
471
|
// if it's the primary jid sending the request
|
|
474
472
|
// just re-send the message to everyone
|
|
475
473
|
// prevents the first message decryption failure
|
|
476
|
-
const sendToAll = !
|
|
474
|
+
const sendToAll = !jidDecode(participant)?.device;
|
|
477
475
|
await assertSessions([participant], true);
|
|
478
|
-
if (
|
|
476
|
+
if (isJidGroup(remoteJid)) {
|
|
479
477
|
await authState.keys.set({ 'sender-key-memory': { [remoteJid]: null } });
|
|
480
478
|
}
|
|
481
479
|
logger.debug({ participant, sendToAll }, 'forced new session for retry recp');
|
|
@@ -500,11 +498,10 @@ const makeMessagesRecvSocket = (config) => {
|
|
|
500
498
|
}
|
|
501
499
|
};
|
|
502
500
|
const handleReceipt = async (node) => {
|
|
503
|
-
var _a, _b;
|
|
504
501
|
const { attrs, content } = node;
|
|
505
502
|
const isLid = attrs.from.includes('lid');
|
|
506
|
-
const isNodeFromMe =
|
|
507
|
-
const remoteJid = !isNodeFromMe ||
|
|
503
|
+
const isNodeFromMe = areJidsSameUser(attrs.participant || attrs.from, isLid ? authState.creds.me?.lid : authState.creds.me?.id);
|
|
504
|
+
const remoteJid = !isNodeFromMe || isJidGroup(attrs.from) ? attrs.from : attrs.recipient;
|
|
508
505
|
const fromMe = !attrs.recipient || ((attrs.type === 'retry' || attrs.type === 'sender') && isNodeFromMe);
|
|
509
506
|
const key = {
|
|
510
507
|
remoteJid,
|
|
@@ -519,24 +516,24 @@ const makeMessagesRecvSocket = (config) => {
|
|
|
519
516
|
}
|
|
520
517
|
const ids = [attrs.id];
|
|
521
518
|
if (Array.isArray(content)) {
|
|
522
|
-
const items =
|
|
519
|
+
const items = getBinaryNodeChildren(content[0], 'item');
|
|
523
520
|
ids.push(...items.map(i => i.attrs.id));
|
|
524
521
|
}
|
|
525
522
|
try {
|
|
526
523
|
await Promise.all([
|
|
527
524
|
processingMutex.mutex(async () => {
|
|
528
|
-
const status =
|
|
525
|
+
const status = getStatusFromReceiptType(attrs.type);
|
|
529
526
|
if (typeof status !== 'undefined' &&
|
|
530
527
|
// basically, we only want to know when a message from us has been delivered to/read by the other person
|
|
531
528
|
// or another device of ours has read some messages
|
|
532
|
-
(status >=
|
|
533
|
-
if (
|
|
529
|
+
(status >= proto.WebMessageInfo.Status.SERVER_ACK || !isNodeFromMe)) {
|
|
530
|
+
if (isJidGroup(remoteJid) || isJidStatusBroadcast(remoteJid)) {
|
|
534
531
|
if (attrs.participant) {
|
|
535
|
-
const updateKey = status ===
|
|
532
|
+
const updateKey = status === proto.WebMessageInfo.Status.DELIVERY_ACK ? 'receiptTimestamp' : 'readTimestamp';
|
|
536
533
|
ev.emit('message-receipt.update', ids.map(id => ({
|
|
537
534
|
key: { ...key, id },
|
|
538
535
|
receipt: {
|
|
539
|
-
userJid:
|
|
536
|
+
userJid: jidNormalizedUser(attrs.participant),
|
|
540
537
|
[updateKey]: +attrs.t
|
|
541
538
|
}
|
|
542
539
|
})));
|
|
@@ -552,7 +549,7 @@ const makeMessagesRecvSocket = (config) => {
|
|
|
552
549
|
if (attrs.type === 'retry') {
|
|
553
550
|
// correctly set who is asking for the retry
|
|
554
551
|
key.participant = key.participant || attrs.from;
|
|
555
|
-
const retryNode =
|
|
552
|
+
const retryNode = getBinaryNodeChild(node, 'retry');
|
|
556
553
|
if (willSendMessageAgain(ids[0], key.participant)) {
|
|
557
554
|
if (key.fromMe) {
|
|
558
555
|
try {
|
|
@@ -588,10 +585,9 @@ const makeMessagesRecvSocket = (config) => {
|
|
|
588
585
|
try {
|
|
589
586
|
await Promise.all([
|
|
590
587
|
processingMutex.mutex(async () => {
|
|
591
|
-
var _a;
|
|
592
588
|
const msg = await processNotification(node);
|
|
593
589
|
if (msg) {
|
|
594
|
-
const fromMe =
|
|
590
|
+
const fromMe = areJidsSameUser(node.attrs.participant || remoteJid, authState.creds.me.id);
|
|
595
591
|
msg.key = {
|
|
596
592
|
remoteJid,
|
|
597
593
|
fromMe,
|
|
@@ -599,9 +595,9 @@ const makeMessagesRecvSocket = (config) => {
|
|
|
599
595
|
id: node.attrs.id,
|
|
600
596
|
...(msg.key || {})
|
|
601
597
|
};
|
|
602
|
-
|
|
598
|
+
msg.participant ?? (msg.participant = node.attrs.participant);
|
|
603
599
|
msg.messageTimestamp = +node.attrs.t;
|
|
604
|
-
const fullMsg =
|
|
600
|
+
const fullMsg = proto.WebMessageInfo.fromObject(msg);
|
|
605
601
|
await upsertMessage(fullMsg, 'append');
|
|
606
602
|
}
|
|
607
603
|
})
|
|
@@ -612,13 +608,12 @@ const makeMessagesRecvSocket = (config) => {
|
|
|
612
608
|
}
|
|
613
609
|
};
|
|
614
610
|
const handleMessage = async (node) => {
|
|
615
|
-
var _a, _b, _c;
|
|
616
611
|
if (shouldIgnoreJid(node.attrs.from) && node.attrs.from !== '@s.whatsapp.net') {
|
|
617
612
|
logger.debug({ key: node.attrs.key }, 'ignored message');
|
|
618
613
|
await sendMessageAck(node);
|
|
619
614
|
return;
|
|
620
615
|
}
|
|
621
|
-
const encNode =
|
|
616
|
+
const encNode = getBinaryNodeChild(node, 'enc');
|
|
622
617
|
// TODO: temporary fix for crashes and issues resulting of failed msmsg decryption
|
|
623
618
|
if (encNode && encNode.attrs.type === 'msmsg') {
|
|
624
619
|
logger.debug({ key: node.attrs.key }, 'ignored msmsg');
|
|
@@ -626,9 +621,9 @@ const makeMessagesRecvSocket = (config) => {
|
|
|
626
621
|
return;
|
|
627
622
|
}
|
|
628
623
|
let response;
|
|
629
|
-
if (
|
|
624
|
+
if (getBinaryNodeChild(node, 'unavailable') && !encNode) {
|
|
630
625
|
await sendMessageAck(node);
|
|
631
|
-
const { key } =
|
|
626
|
+
const { key } = decodeMessageNode(node, authState.creds.me.id, authState.creds.me.lid || '').fullMessage;
|
|
632
627
|
response = await requestPlaceholderResend(key);
|
|
633
628
|
if (response === 'RESOLVED') {
|
|
634
629
|
return;
|
|
@@ -640,33 +635,32 @@ const makeMessagesRecvSocket = (config) => {
|
|
|
640
635
|
placeholderResendCache.del(node.attrs.id);
|
|
641
636
|
}
|
|
642
637
|
}
|
|
643
|
-
const { fullMessage: msg, category, author, decrypt } =
|
|
644
|
-
if (response &&
|
|
645
|
-
msg.messageStubParameters = [
|
|
638
|
+
const { fullMessage: msg, category, author, decrypt } = decryptMessageNode(node, authState.creds.me.id, authState.creds.me.lid || '', signalRepository, logger);
|
|
639
|
+
if (response && msg?.messageStubParameters?.[0] === NO_MESSAGE_FOUND_ERROR_TEXT) {
|
|
640
|
+
msg.messageStubParameters = [NO_MESSAGE_FOUND_ERROR_TEXT, response];
|
|
646
641
|
}
|
|
647
|
-
if (
|
|
642
|
+
if (msg.message?.protocolMessage?.type === proto.Message.ProtocolMessage.Type.SHARE_PHONE_NUMBER &&
|
|
648
643
|
node.attrs.sender_pn) {
|
|
649
644
|
ev.emit('chats.phoneNumberShare', { lid: node.attrs.from, jid: node.attrs.sender_pn });
|
|
650
645
|
}
|
|
651
646
|
try {
|
|
652
647
|
await Promise.all([
|
|
653
648
|
processingMutex.mutex(async () => {
|
|
654
|
-
var _a;
|
|
655
649
|
await decrypt();
|
|
656
650
|
// message failed to decrypt
|
|
657
|
-
if (msg.messageStubType ===
|
|
658
|
-
if (
|
|
659
|
-
return sendMessageAck(node,
|
|
651
|
+
if (msg.messageStubType === proto.WebMessageInfo.StubType.CIPHERTEXT) {
|
|
652
|
+
if (msg?.messageStubParameters?.[0] === MISSING_KEYS_ERROR_TEXT) {
|
|
653
|
+
return sendMessageAck(node, NACK_REASONS.ParsingError);
|
|
660
654
|
}
|
|
661
655
|
retryMutex.mutex(async () => {
|
|
662
656
|
if (ws.isOpen) {
|
|
663
|
-
if (
|
|
657
|
+
if (getBinaryNodeChild(node, 'unavailable')) {
|
|
664
658
|
return;
|
|
665
659
|
}
|
|
666
|
-
const encNode =
|
|
660
|
+
const encNode = getBinaryNodeChild(node, 'enc');
|
|
667
661
|
await sendRetryRequest(node, !encNode);
|
|
668
662
|
if (retryRequestDelayMs) {
|
|
669
|
-
await
|
|
663
|
+
await delay(retryRequestDelayMs);
|
|
670
664
|
}
|
|
671
665
|
}
|
|
672
666
|
else {
|
|
@@ -686,7 +680,7 @@ const makeMessagesRecvSocket = (config) => {
|
|
|
686
680
|
// message was sent by us from a different device
|
|
687
681
|
type = 'sender';
|
|
688
682
|
// need to specially handle this case
|
|
689
|
-
if (
|
|
683
|
+
if (isJidUser(msg.key.remoteJid)) {
|
|
690
684
|
participant = author;
|
|
691
685
|
}
|
|
692
686
|
}
|
|
@@ -695,13 +689,13 @@ const makeMessagesRecvSocket = (config) => {
|
|
|
695
689
|
}
|
|
696
690
|
await sendReceipt(msg.key.remoteJid, participant, [msg.key.id], type);
|
|
697
691
|
// send ack for history message
|
|
698
|
-
const isAnyHistoryMsg =
|
|
692
|
+
const isAnyHistoryMsg = getHistoryMsg(msg.message);
|
|
699
693
|
if (isAnyHistoryMsg) {
|
|
700
|
-
const jid =
|
|
694
|
+
const jid = jidNormalizedUser(msg.key.remoteJid);
|
|
701
695
|
await sendReceipt(jid, undefined, [msg.key.id], 'hist_sync');
|
|
702
696
|
}
|
|
703
697
|
}
|
|
704
|
-
|
|
698
|
+
cleanMessage(msg, authState.creds.me.id);
|
|
705
699
|
await sendMessageAck(node);
|
|
706
700
|
await upsertMessage(msg, node.attrs.offline ? 'append' : 'notify');
|
|
707
701
|
})
|
|
@@ -712,9 +706,8 @@ const makeMessagesRecvSocket = (config) => {
|
|
|
712
706
|
}
|
|
713
707
|
};
|
|
714
708
|
const fetchMessageHistory = async (count, oldestMsgKey, oldestMsgTimestamp) => {
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
throw new boom_1.Boom('Not authenticated');
|
|
709
|
+
if (!authState.creds.me?.id) {
|
|
710
|
+
throw new Boom('Not authenticated');
|
|
718
711
|
}
|
|
719
712
|
const pdoMessage = {
|
|
720
713
|
historySyncOnDemandRequest: {
|
|
@@ -724,24 +717,23 @@ const makeMessagesRecvSocket = (config) => {
|
|
|
724
717
|
oldestMsgTimestampMs: oldestMsgTimestamp,
|
|
725
718
|
onDemandMsgCount: count
|
|
726
719
|
},
|
|
727
|
-
peerDataOperationRequestType:
|
|
720
|
+
peerDataOperationRequestType: proto.Message.PeerDataOperationRequestType.HISTORY_SYNC_ON_DEMAND
|
|
728
721
|
};
|
|
729
722
|
return sendPeerDataOperationMessage(pdoMessage);
|
|
730
723
|
};
|
|
731
724
|
const requestPlaceholderResend = async (messageKey) => {
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
throw new boom_1.Boom('Not authenticated');
|
|
725
|
+
if (!authState.creds.me?.id) {
|
|
726
|
+
throw new Boom('Not authenticated');
|
|
735
727
|
}
|
|
736
|
-
if (placeholderResendCache.get(messageKey
|
|
728
|
+
if (placeholderResendCache.get(messageKey?.id)) {
|
|
737
729
|
logger.debug({ messageKey }, 'already requested resend');
|
|
738
730
|
return;
|
|
739
731
|
}
|
|
740
732
|
else {
|
|
741
|
-
placeholderResendCache.set(messageKey
|
|
733
|
+
placeholderResendCache.set(messageKey?.id, true);
|
|
742
734
|
}
|
|
743
|
-
await
|
|
744
|
-
if (!placeholderResendCache.get(messageKey
|
|
735
|
+
await delay(5000);
|
|
736
|
+
if (!placeholderResendCache.get(messageKey?.id)) {
|
|
745
737
|
logger.debug({ messageKey }, 'message received while resend requested');
|
|
746
738
|
return 'RESOLVED';
|
|
747
739
|
}
|
|
@@ -751,22 +743,41 @@ const makeMessagesRecvSocket = (config) => {
|
|
|
751
743
|
messageKey
|
|
752
744
|
}
|
|
753
745
|
],
|
|
754
|
-
peerDataOperationRequestType:
|
|
746
|
+
peerDataOperationRequestType: proto.Message.PeerDataOperationRequestType.PLACEHOLDER_MESSAGE_RESEND
|
|
755
747
|
};
|
|
756
748
|
setTimeout(() => {
|
|
757
|
-
if (placeholderResendCache.get(messageKey
|
|
749
|
+
if (placeholderResendCache.get(messageKey?.id)) {
|
|
758
750
|
logger.debug({ messageKey }, 'PDO message without response after 15 seconds. Phone possibly offline');
|
|
759
|
-
placeholderResendCache.del(messageKey
|
|
751
|
+
placeholderResendCache.del(messageKey?.id);
|
|
760
752
|
}
|
|
761
753
|
}, 15000);
|
|
762
754
|
return sendPeerDataOperationMessage(pdoMessage);
|
|
763
755
|
};
|
|
764
756
|
const handleCall = async (node) => {
|
|
757
|
+
let status;
|
|
765
758
|
const { attrs } = node;
|
|
766
|
-
const [infoChild] =
|
|
759
|
+
const [infoChild] = getAllBinaryNodeChildren(node);
|
|
760
|
+
if (!infoChild) {
|
|
761
|
+
throw new Boom('Missing call info in call node');
|
|
762
|
+
}
|
|
767
763
|
const callId = infoChild.attrs['call-id'];
|
|
768
764
|
const from = infoChild.attrs.from || infoChild.attrs['call-creator'];
|
|
769
|
-
|
|
765
|
+
status = getCallStatusFromNode(infoChild);
|
|
766
|
+
if (isLidUser(from) && infoChild.tag === 'relaylatency') {
|
|
767
|
+
const verify = callOfferCache.get(callId);
|
|
768
|
+
if (!verify) {
|
|
769
|
+
status = 'offer';
|
|
770
|
+
const callLid = {
|
|
771
|
+
chatId: attrs.from,
|
|
772
|
+
from,
|
|
773
|
+
id: callId,
|
|
774
|
+
date: new Date(+attrs.t * 1000),
|
|
775
|
+
offline: !!attrs.offline,
|
|
776
|
+
status
|
|
777
|
+
};
|
|
778
|
+
callOfferCache.set(callId, callLid);
|
|
779
|
+
}
|
|
780
|
+
}
|
|
770
781
|
const call = {
|
|
771
782
|
chatId: attrs.from,
|
|
772
783
|
from,
|
|
@@ -776,7 +787,7 @@ const makeMessagesRecvSocket = (config) => {
|
|
|
776
787
|
status
|
|
777
788
|
};
|
|
778
789
|
if (status === 'offer') {
|
|
779
|
-
call.isVideo = !!
|
|
790
|
+
call.isVideo = !!getBinaryNodeChild(infoChild, 'video');
|
|
780
791
|
call.isGroup = infoChild.attrs.type === 'group' || !!infoChild.attrs['group-jid'];
|
|
781
792
|
call.groupJid = infoChild.attrs['group-jid'];
|
|
782
793
|
callOfferCache.set(call.id, call);
|
|
@@ -817,7 +828,7 @@ const makeMessagesRecvSocket = (config) => {
|
|
|
817
828
|
{
|
|
818
829
|
key,
|
|
819
830
|
update: {
|
|
820
|
-
status:
|
|
831
|
+
status: WAMessageStatus.ERROR,
|
|
821
832
|
messageStubParameters: [attrs.error]
|
|
822
833
|
}
|
|
823
834
|
}
|
|
@@ -875,6 +886,139 @@ const makeMessagesRecvSocket = (config) => {
|
|
|
875
886
|
processNodeWithBuffer(node, identifier, exec);
|
|
876
887
|
}
|
|
877
888
|
};
|
|
889
|
+
// Handles newsletter notifications
|
|
890
|
+
async function handleNewsletterNotification(node) {
|
|
891
|
+
const from = node.attrs.from;
|
|
892
|
+
const child = getAllBinaryNodeChildren(node)[0];
|
|
893
|
+
const author = node.attrs.participant;
|
|
894
|
+
logger.info({ from, child }, 'got newsletter notification');
|
|
895
|
+
switch (child.tag) {
|
|
896
|
+
case 'reaction':
|
|
897
|
+
const reactionUpdate = {
|
|
898
|
+
id: from,
|
|
899
|
+
server_id: child.attrs.message_id,
|
|
900
|
+
reaction: {
|
|
901
|
+
code: getBinaryNodeChildString(child, 'reaction'),
|
|
902
|
+
count: 1
|
|
903
|
+
}
|
|
904
|
+
};
|
|
905
|
+
ev.emit('newsletter.reaction', reactionUpdate);
|
|
906
|
+
break;
|
|
907
|
+
case 'view':
|
|
908
|
+
const viewUpdate = {
|
|
909
|
+
id: from,
|
|
910
|
+
server_id: child.attrs.message_id,
|
|
911
|
+
count: parseInt(child.content?.toString() || '0', 10)
|
|
912
|
+
};
|
|
913
|
+
ev.emit('newsletter.view', viewUpdate);
|
|
914
|
+
break;
|
|
915
|
+
case 'participant':
|
|
916
|
+
const participantUpdate = {
|
|
917
|
+
id: from,
|
|
918
|
+
author,
|
|
919
|
+
user: child.attrs.jid,
|
|
920
|
+
action: child.attrs.action,
|
|
921
|
+
new_role: child.attrs.role
|
|
922
|
+
};
|
|
923
|
+
ev.emit('newsletter-participants.update', participantUpdate);
|
|
924
|
+
break;
|
|
925
|
+
case 'update':
|
|
926
|
+
const settingsNode = getBinaryNodeChild(child, 'settings');
|
|
927
|
+
if (settingsNode) {
|
|
928
|
+
const update = {};
|
|
929
|
+
const nameNode = getBinaryNodeChild(settingsNode, 'name');
|
|
930
|
+
if (nameNode?.content)
|
|
931
|
+
update.name = nameNode.content.toString();
|
|
932
|
+
const descriptionNode = getBinaryNodeChild(settingsNode, 'description');
|
|
933
|
+
if (descriptionNode?.content)
|
|
934
|
+
update.description = descriptionNode.content.toString();
|
|
935
|
+
ev.emit('newsletter-settings.update', {
|
|
936
|
+
id: from,
|
|
937
|
+
update
|
|
938
|
+
});
|
|
939
|
+
}
|
|
940
|
+
break;
|
|
941
|
+
case 'message':
|
|
942
|
+
const plaintextNode = getBinaryNodeChild(child, 'plaintext');
|
|
943
|
+
if (plaintextNode?.content) {
|
|
944
|
+
try {
|
|
945
|
+
const contentBuf = typeof plaintextNode.content === 'string'
|
|
946
|
+
? Buffer.from(plaintextNode.content, 'binary')
|
|
947
|
+
: Buffer.from(plaintextNode.content);
|
|
948
|
+
const messageProto = proto.Message.decode(contentBuf);
|
|
949
|
+
const fullMessage = proto.WebMessageInfo.fromObject({
|
|
950
|
+
key: {
|
|
951
|
+
remoteJid: from,
|
|
952
|
+
id: child.attrs.message_id || child.attrs.server_id,
|
|
953
|
+
fromMe: false
|
|
954
|
+
},
|
|
955
|
+
message: messageProto,
|
|
956
|
+
messageTimestamp: +child.attrs.t
|
|
957
|
+
});
|
|
958
|
+
await upsertMessage(fullMessage, 'append');
|
|
959
|
+
logger.info('Processed plaintext newsletter message');
|
|
960
|
+
}
|
|
961
|
+
catch (error) {
|
|
962
|
+
logger.error({ error }, 'Failed to decode plaintext newsletter message');
|
|
963
|
+
}
|
|
964
|
+
}
|
|
965
|
+
break;
|
|
966
|
+
default:
|
|
967
|
+
logger.warn({ node }, 'Unknown newsletter notification');
|
|
968
|
+
break;
|
|
969
|
+
}
|
|
970
|
+
}
|
|
971
|
+
// Handles mex newsletter notifications
|
|
972
|
+
async function handleMexNewsletterNotification(node) {
|
|
973
|
+
const mexNode = getBinaryNodeChild(node, 'mex');
|
|
974
|
+
if (!mexNode?.content) {
|
|
975
|
+
logger.warn({ node }, 'Invalid mex newsletter notification');
|
|
976
|
+
return;
|
|
977
|
+
}
|
|
978
|
+
let data;
|
|
979
|
+
try {
|
|
980
|
+
data = JSON.parse(mexNode.content.toString());
|
|
981
|
+
}
|
|
982
|
+
catch (error) {
|
|
983
|
+
logger.error({ err: error, node }, 'Failed to parse mex newsletter notification');
|
|
984
|
+
return;
|
|
985
|
+
}
|
|
986
|
+
const operation = data?.operation;
|
|
987
|
+
const updates = data?.updates;
|
|
988
|
+
if (!updates || !operation) {
|
|
989
|
+
logger.warn({ data }, 'Invalid mex newsletter notification content');
|
|
990
|
+
return;
|
|
991
|
+
}
|
|
992
|
+
logger.info({ operation, updates }, 'got mex newsletter notification');
|
|
993
|
+
switch (operation) {
|
|
994
|
+
case 'NotificationNewsletterUpdate':
|
|
995
|
+
for (const update of updates) {
|
|
996
|
+
if (update.jid && update.settings && Object.keys(update.settings).length > 0) {
|
|
997
|
+
ev.emit('newsletter-settings.update', {
|
|
998
|
+
id: update.jid,
|
|
999
|
+
update: update.settings
|
|
1000
|
+
});
|
|
1001
|
+
}
|
|
1002
|
+
}
|
|
1003
|
+
break;
|
|
1004
|
+
case 'NotificationNewsletterAdminPromote':
|
|
1005
|
+
for (const update of updates) {
|
|
1006
|
+
if (update.jid && update.user) {
|
|
1007
|
+
ev.emit('newsletter-participants.update', {
|
|
1008
|
+
id: update.jid,
|
|
1009
|
+
author: node.attrs.from,
|
|
1010
|
+
user: update.user,
|
|
1011
|
+
new_role: 'ADMIN',
|
|
1012
|
+
action: 'promote'
|
|
1013
|
+
});
|
|
1014
|
+
}
|
|
1015
|
+
}
|
|
1016
|
+
break;
|
|
1017
|
+
default:
|
|
1018
|
+
logger.info({ operation, data }, 'Unhandled mex newsletter notification');
|
|
1019
|
+
break;
|
|
1020
|
+
}
|
|
1021
|
+
}
|
|
878
1022
|
// recv a message
|
|
879
1023
|
ws.on('CB:message', (node) => {
|
|
880
1024
|
processNode('message', node, 'processing message', handleMessage);
|
|
@@ -892,6 +1036,9 @@ const makeMessagesRecvSocket = (config) => {
|
|
|
892
1036
|
handleBadAck(node).catch(error => onUnexpectedError(error, 'handling bad ack'));
|
|
893
1037
|
});
|
|
894
1038
|
ev.on('call', ([call]) => {
|
|
1039
|
+
if (!call) {
|
|
1040
|
+
return;
|
|
1041
|
+
}
|
|
895
1042
|
// missed call + group call notification message generation
|
|
896
1043
|
if (call.status === 'timeout' || (call.status === 'offer' && call.isGroup)) {
|
|
897
1044
|
const msg = {
|
|
@@ -900,22 +1047,22 @@ const makeMessagesRecvSocket = (config) => {
|
|
|
900
1047
|
id: call.id,
|
|
901
1048
|
fromMe: false
|
|
902
1049
|
},
|
|
903
|
-
messageTimestamp:
|
|
1050
|
+
messageTimestamp: unixTimestampSeconds(call.date)
|
|
904
1051
|
};
|
|
905
1052
|
if (call.status === 'timeout') {
|
|
906
1053
|
if (call.isGroup) {
|
|
907
1054
|
msg.messageStubType = call.isVideo
|
|
908
|
-
?
|
|
909
|
-
:
|
|
1055
|
+
? WAMessageStubType.CALL_MISSED_GROUP_VIDEO
|
|
1056
|
+
: WAMessageStubType.CALL_MISSED_GROUP_VOICE;
|
|
910
1057
|
}
|
|
911
1058
|
else {
|
|
912
|
-
msg.messageStubType = call.isVideo ?
|
|
1059
|
+
msg.messageStubType = call.isVideo ? WAMessageStubType.CALL_MISSED_VIDEO : WAMessageStubType.CALL_MISSED_VOICE;
|
|
913
1060
|
}
|
|
914
1061
|
}
|
|
915
1062
|
else {
|
|
916
1063
|
msg.message = { call: { callKey: Buffer.from(call.id) } };
|
|
917
1064
|
}
|
|
918
|
-
const protoMsg =
|
|
1065
|
+
const protoMsg = proto.WebMessageInfo.fromObject(msg);
|
|
919
1066
|
upsertMessage(protoMsg, call.offline ? 'append' : 'notify');
|
|
920
1067
|
}
|
|
921
1068
|
});
|
|
@@ -934,4 +1081,4 @@ const makeMessagesRecvSocket = (config) => {
|
|
|
934
1081
|
requestPlaceholderResend
|
|
935
1082
|
};
|
|
936
1083
|
};
|
|
937
|
-
|
|
1084
|
+
//# sourceMappingURL=messages-recv.js.map
|