phantom-baileys 0.0.8 → 0.1.3
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/LICENSE +21 -0
- package/README.md +592 -0
- package/WAProto/GenerateStatics.sh +3 -0
- package/WAProto/WAProto.proto +5479 -0
- package/WAProto/fix-imports.js +81 -0
- package/WAProto/index.d.ts +5147 -41513
- package/WAProto/index.js +84008 -142014
- package/lib/Defaults/index.d.ts +29 -8
- package/lib/Defaults/index.d.ts.map +1 -0
- package/lib/Defaults/index.js +80 -60
- package/lib/Defaults/index.js.map +1 -0
- package/lib/Signal/Group/ciphertext-message.d.ts +10 -0
- package/lib/Signal/Group/ciphertext-message.d.ts.map +1 -0
- package/lib/Signal/Group/ciphertext-message.js +12 -0
- package/lib/Signal/Group/ciphertext-message.js.map +1 -0
- package/lib/Signal/Group/group-session-builder.d.ts +15 -0
- package/lib/Signal/Group/group-session-builder.d.ts.map +1 -0
- package/lib/Signal/Group/group-session-builder.js +30 -0
- package/lib/Signal/Group/group-session-builder.js.map +1 -0
- package/lib/Signal/Group/group_cipher.d.ts +17 -0
- package/lib/Signal/Group/group_cipher.d.ts.map +1 -0
- package/lib/Signal/Group/group_cipher.js +82 -0
- package/lib/Signal/Group/group_cipher.js.map +1 -0
- package/lib/Signal/Group/index.d.ts +12 -0
- package/lib/Signal/Group/index.d.ts.map +1 -0
- package/lib/Signal/Group/index.js +12 -0
- package/lib/Signal/Group/index.js.map +1 -0
- package/lib/Signal/Group/keyhelper.d.ts +11 -0
- package/lib/Signal/Group/keyhelper.d.ts.map +1 -0
- package/lib/Signal/Group/keyhelper.js +18 -0
- package/lib/Signal/Group/keyhelper.js.map +1 -0
- package/lib/Signal/Group/sender-chain-key.d.ts +14 -0
- package/lib/Signal/Group/sender-chain-key.d.ts.map +1 -0
- package/lib/Signal/Group/sender-chain-key.js +26 -0
- package/lib/Signal/Group/sender-chain-key.js.map +1 -0
- package/lib/Signal/Group/sender-key-distribution-message.d.ts +17 -0
- package/lib/Signal/Group/sender-key-distribution-message.d.ts.map +1 -0
- package/lib/Signal/Group/sender-key-distribution-message.js +63 -0
- package/lib/Signal/Group/sender-key-distribution-message.js.map +1 -0
- package/lib/Signal/Group/sender-key-message.d.ts +19 -0
- package/lib/Signal/Group/sender-key-message.d.ts.map +1 -0
- package/lib/Signal/Group/sender-key-message.js +66 -0
- package/lib/Signal/Group/sender-key-message.js.map +1 -0
- package/lib/Signal/Group/sender-key-name.d.ts +18 -0
- package/lib/Signal/Group/sender-key-name.d.ts.map +1 -0
- package/lib/Signal/Group/sender-key-name.js +48 -0
- package/lib/Signal/Group/sender-key-name.js.map +1 -0
- package/lib/Signal/Group/sender-key-record.d.ts +31 -0
- package/lib/Signal/Group/sender-key-record.d.ts.map +1 -0
- package/lib/Signal/Group/sender-key-record.js +41 -0
- package/lib/Signal/Group/sender-key-record.js.map +1 -0
- package/lib/Signal/Group/sender-key-state.d.ts +39 -0
- package/lib/Signal/Group/sender-key-state.d.ts.map +1 -0
- package/lib/Signal/Group/sender-key-state.js +84 -0
- package/lib/Signal/Group/sender-key-state.js.map +1 -0
- package/lib/Signal/Group/sender-message-key.d.ts +12 -0
- package/lib/Signal/Group/sender-message-key.d.ts.map +1 -0
- package/{WASignalGroup/sender_message_key.js → lib/Signal/Group/sender-message-key.js} +3 -16
- package/lib/Signal/Group/sender-message-key.js.map +1 -0
- package/lib/Signal/libsignal.d.ts +5 -3
- package/lib/Signal/libsignal.d.ts.map +1 -0
- package/lib/Signal/libsignal.js +331 -80
- package/lib/Signal/libsignal.js.map +1 -0
- package/lib/Signal/lid-mapping.d.ts +19 -0
- package/lib/Signal/lid-mapping.d.ts.map +1 -0
- package/lib/Signal/lid-mapping.js +271 -0
- package/lib/Signal/lid-mapping.js.map +1 -0
- package/lib/Socket/Client/index.d.ts +3 -3
- package/lib/Socket/Client/index.d.ts.map +1 -0
- package/lib/Socket/Client/index.js +3 -19
- package/lib/Socket/Client/index.js.map +1 -0
- package/lib/Socket/Client/{abstract-socket-client.d.ts → types.d.ts} +4 -5
- package/lib/Socket/Client/types.d.ts.map +1 -0
- package/lib/Socket/Client/types.js +11 -0
- package/lib/Socket/Client/types.js.map +1 -0
- package/lib/Socket/Client/{web-socket-client.d.ts → websocket.d.ts} +3 -2
- package/lib/Socket/Client/websocket.d.ts.map +1 -0
- package/lib/Socket/Client/websocket.js +54 -0
- package/lib/Socket/Client/websocket.js.map +1 -0
- package/lib/Socket/business.d.ts +184 -101
- package/lib/Socket/business.d.ts.map +1 -0
- package/lib/Socket/business.js +162 -43
- package/lib/Socket/business.js.map +1 -0
- package/lib/Socket/chats.d.ts +72 -42
- package/lib/Socket/chats.d.ts.map +1 -0
- package/lib/Socket/chats.js +340 -299
- package/lib/Socket/chats.js.map +1 -0
- package/lib/Socket/communities.d.ts +309 -0
- package/lib/Socket/communities.d.ts.map +1 -0
- package/lib/Socket/communities.js +431 -0
- package/lib/Socket/communities.js.map +1 -0
- package/lib/Socket/dugong.d.ts +79 -0
- package/lib/Socket/dugong.d.ts.map +1 -0
- package/lib/Socket/dugong.js +527 -0
- package/lib/Socket/dugong.js.map +1 -0
- package/lib/Socket/groups.d.ts +93 -58
- package/lib/Socket/groups.d.ts.map +1 -0
- package/lib/Socket/groups.js +96 -84
- package/lib/Socket/groups.js.map +1 -0
- package/lib/Socket/index.d.ts +232 -107
- package/lib/Socket/index.d.ts.map +1 -0
- package/lib/Socket/index.js +13 -10
- package/lib/Socket/index.js.map +1 -0
- package/lib/Socket/messages-recv.d.ts +170 -90
- package/lib/Socket/messages-recv.d.ts.map +1 -0
- package/lib/Socket/messages-recv.js +798 -462
- package/lib/Socket/messages-recv.js.map +1 -0
- package/lib/Socket/messages-send.d.ts +180 -99
- package/lib/Socket/messages-send.d.ts.map +1 -0
- package/lib/Socket/messages-send.js +833 -709
- 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 +120 -75
- package/lib/Socket/newsletter.d.ts.map +1 -0
- package/lib/Socket/newsletter.js +227 -198
- package/lib/Socket/newsletter.js.map +1 -0
- package/lib/Socket/socket.d.ts +31 -20
- package/lib/Socket/socket.d.ts.map +1 -0
- package/lib/Socket/socket.js +508 -215
- package/lib/Socket/socket.js.map +1 -0
- package/lib/Types/Auth.d.ts +18 -11
- 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/Bussines.d.ts +25 -0
- package/lib/Types/Bussines.d.ts.map +1 -0
- package/lib/Types/Bussines.js +2 -0
- package/lib/Types/Bussines.js.map +1 -0
- package/lib/Types/Call.d.ts +2 -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 +24 -8
- package/lib/Types/Chat.d.ts.map +1 -0
- package/lib/Types/Chat.js +8 -4
- package/lib/Types/Chat.js.map +1 -0
- package/lib/Types/Contact.d.ts +6 -1
- 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 +82 -17
- 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 +15 -3
- 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 +77 -202
- package/lib/Types/Message.d.ts.map +1 -0
- package/lib/Types/Message.js +11 -9
- package/lib/Types/Message.js.map +1 -0
- package/lib/Types/Newsletter.d.ts +128 -85
- package/lib/Types/Newsletter.d.ts.map +1 -0
- package/lib/Types/Newsletter.js +25 -26
- 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 +20 -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 +41 -24
- 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 -16
- package/lib/Types/index.d.ts.map +1 -0
- package/lib/Types/index.js +15 -31
- package/lib/Types/index.js.map +1 -0
- package/lib/Utils/auth-utils.d.ts +7 -6
- package/lib/Utils/auth-utils.d.ts.map +1 -0
- package/lib/Utils/auth-utils.js +228 -165
- package/lib/Utils/auth-utils.js.map +1 -0
- package/lib/Utils/browser-utils.d.ts +4 -0
- package/lib/Utils/browser-utils.d.ts.map +1 -0
- package/lib/Utils/browser-utils.js +28 -0
- package/lib/Utils/browser-utils.js.map +1 -0
- package/lib/Utils/business.d.ts +4 -3
- package/lib/Utils/business.d.ts.map +1 -0
- package/lib/Utils/business.js +66 -69
- package/lib/Utils/business.js.map +1 -0
- package/lib/Utils/chat-utils.d.ts +16 -16
- package/lib/Utils/chat-utils.d.ts.map +1 -0
- package/lib/Utils/chat-utils.js +299 -232
- package/lib/Utils/chat-utils.js.map +1 -0
- package/lib/Utils/crypto.d.ts +18 -21
- package/lib/Utils/crypto.d.ts.map +1 -0
- package/lib/Utils/crypto.js +44 -125
- package/lib/Utils/crypto.js.map +1 -0
- package/lib/Utils/decode-wa-message.d.ts +20 -8
- package/lib/Utils/decode-wa-message.d.ts.map +1 -0
- package/lib/Utils/decode-wa-message.js +139 -90
- package/lib/Utils/decode-wa-message.js.map +1 -0
- package/lib/Utils/event-buffer.d.ts +7 -8
- package/lib/Utils/event-buffer.d.ts.map +1 -0
- package/lib/Utils/event-buffer.js +129 -72
- package/lib/Utils/event-buffer.js.map +1 -0
- package/lib/Utils/generics.d.ts +25 -22
- package/lib/Utils/generics.d.ts.map +1 -0
- package/lib/Utils/generics.js +157 -175
- package/lib/Utils/generics.js.map +1 -0
- package/lib/Utils/history.d.ts +14 -11
- package/lib/Utils/history.d.ts.map +1 -0
- package/lib/Utils/history.js +83 -46
- package/lib/Utils/history.js.map +1 -0
- package/lib/Utils/identity-change-handler.d.ts +37 -0
- package/lib/Utils/identity-change-handler.d.ts.map +1 -0
- package/lib/Utils/identity-change-handler.js +49 -0
- package/lib/Utils/identity-change-handler.js.map +1 -0
- package/lib/Utils/index.d.ts +22 -17
- package/lib/Utils/index.d.ts.map +1 -0
- package/lib/Utils/index.js +22 -33
- package/lib/Utils/index.js.map +1 -0
- package/lib/Utils/link-preview.d.ts +5 -5
- package/lib/Utils/link-preview.d.ts.map +1 -0
- package/lib/Utils/link-preview.js +14 -22
- package/lib/Utils/link-preview.js.map +1 -0
- package/lib/Utils/logger.d.ts +12 -1
- 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 +8 -12
- package/lib/Utils/lt-hash.d.ts.map +1 -0
- package/lib/Utils/lt-hash.js +3 -46
- package/lib/Utils/lt-hash.js.map +1 -0
- package/lib/Utils/make-mutex.d.ts +2 -0
- package/lib/Utils/make-mutex.d.ts.map +1 -0
- package/lib/Utils/make-mutex.js +24 -34
- package/lib/Utils/make-mutex.js.map +1 -0
- package/lib/Utils/message-retry-manager.d.ts +110 -0
- package/lib/Utils/message-retry-manager.d.ts.map +1 -0
- package/lib/Utils/message-retry-manager.js +225 -0
- package/lib/Utils/message-retry-manager.js.map +1 -0
- package/lib/Utils/messages-media.d.ts +59 -42
- package/lib/Utils/messages-media.d.ts.map +1 -0
- package/lib/Utils/messages-media.js +411 -356
- package/lib/Utils/messages-media.js.map +1 -0
- package/lib/Utils/messages.d.ts +32 -18
- package/lib/Utils/messages.d.ts.map +1 -0
- package/lib/Utils/messages.js +412 -723
- package/lib/Utils/messages.js.map +1 -0
- package/lib/Utils/noise-handler.d.ts +13 -13
- package/lib/Utils/noise-handler.d.ts.map +1 -0
- package/lib/Utils/noise-handler.js +149 -108
- package/lib/Utils/noise-handler.js.map +1 -0
- package/lib/Utils/offline-node-processor.d.ts +17 -0
- package/lib/Utils/offline-node-processor.d.ts.map +1 -0
- package/lib/Utils/offline-node-processor.js +40 -0
- package/lib/Utils/offline-node-processor.js.map +1 -0
- package/lib/Utils/pre-key-manager.d.ts +28 -0
- package/lib/Utils/pre-key-manager.d.ts.map +1 -0
- package/lib/Utils/pre-key-manager.js +106 -0
- package/lib/Utils/pre-key-manager.js.map +1 -0
- package/lib/Utils/process-message.d.ts +30 -11
- package/lib/Utils/process-message.d.ts.map +1 -0
- package/lib/Utils/process-message.js +321 -166
- package/lib/Utils/process-message.js.map +1 -0
- package/lib/Utils/reporting-utils.d.ts +11 -0
- package/lib/Utils/reporting-utils.d.ts.map +1 -0
- package/lib/Utils/reporting-utils.js +258 -0
- package/lib/Utils/reporting-utils.js.map +1 -0
- package/lib/Utils/rich-messages.d.ts +129 -0
- package/lib/Utils/rich-messages.d.ts.map +1 -0
- package/lib/Utils/rich-messages.js +455 -0
- package/lib/Utils/rich-messages.js.map +1 -0
- package/lib/Utils/signal.d.ts +7 -6
- package/lib/Utils/signal.d.ts.map +1 -0
- package/lib/Utils/signal.js +65 -65
- package/lib/Utils/signal.js.map +1 -0
- package/lib/Utils/stanza-ack.d.ts +11 -0
- package/lib/Utils/stanza-ack.d.ts.map +1 -0
- package/lib/Utils/stanza-ack.js +38 -0
- package/lib/Utils/stanza-ack.js.map +1 -0
- package/lib/Utils/sync-action-utils.d.ts +19 -0
- package/lib/Utils/sync-action-utils.d.ts.map +1 -0
- package/lib/Utils/sync-action-utils.js +48 -0
- package/lib/Utils/sync-action-utils.js.map +1 -0
- package/lib/Utils/tc-token-utils.d.ts +12 -0
- package/lib/Utils/tc-token-utils.d.ts.map +1 -0
- package/lib/Utils/tc-token-utils.js +18 -0
- package/lib/Utils/tc-token-utils.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 +79 -253
- package/lib/Utils/use-multi-file-auth-state.js.map +1 -0
- package/lib/Utils/validate-connection.d.ts +6 -6
- package/lib/Utils/validate-connection.d.ts.map +1 -0
- package/lib/Utils/validate-connection.js +111 -116
- package/lib/Utils/validate-connection.js.map +1 -0
- package/lib/WABinary/constants.d.ts +5 -4
- package/lib/WABinary/constants.d.ts.map +1 -0
- package/lib/WABinary/constants.js +1281 -20
- package/lib/WABinary/constants.js.map +1 -0
- package/lib/WABinary/decode.d.ts +4 -3
- package/lib/WABinary/decode.d.ts.map +1 -0
- package/lib/WABinary/decode.js +51 -53
- 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 +12 -44
- package/lib/WABinary/encode.js.map +1 -0
- package/lib/WABinary/generic-utils.d.ts +9 -6
- package/lib/WABinary/generic-utils.d.ts.map +1 -0
- package/lib/WABinary/generic-utils.js +124 -43
- 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 +24 -7
- package/lib/WABinary/jid-utils.d.ts.map +1 -0
- package/lib/WABinary/jid-utils.js +74 -40
- 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 +5 -3
- package/lib/WAM/constants.d.ts.map +1 -0
- package/lib/WAM/constants.js +19071 -11568
- package/lib/WAM/constants.js.map +1 -0
- package/lib/WAM/encode.d.ts +3 -2
- package/lib/WAM/encode.d.ts.map +1 -0
- package/lib/WAM/encode.js +17 -22
- 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/WAProto/fix-imports.d.ts +1 -0
- package/lib/WAProto/fix-imports.js +71 -0
- package/lib/WAProto/index.js +89345 -0
- package/lib/WAUSync/Protocols/USyncContactProtocol.d.ts +4 -3
- package/lib/WAUSync/Protocols/USyncContactProtocol.d.ts.map +1 -0
- package/lib/WAUSync/Protocols/USyncContactProtocol.js +8 -11
- package/lib/WAUSync/Protocols/USyncContactProtocol.js.map +1 -0
- package/lib/WAUSync/Protocols/USyncDeviceProtocol.d.ts +3 -2
- package/lib/WAUSync/Protocols/USyncDeviceProtocol.d.ts.map +1 -0
- package/lib/WAUSync/Protocols/USyncDeviceProtocol.js +11 -14
- package/lib/WAUSync/Protocols/USyncDeviceProtocol.js.map +1 -0
- package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.d.ts +3 -2
- package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.d.ts.map +1 -0
- package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.js +9 -12
- package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.js.map +1 -0
- package/lib/WAUSync/Protocols/USyncStatusProtocol.d.ts +3 -2
- package/lib/WAUSync/Protocols/USyncStatusProtocol.d.ts.map +1 -0
- package/lib/WAUSync/Protocols/USyncStatusProtocol.js +9 -13
- package/lib/WAUSync/Protocols/USyncStatusProtocol.js.map +1 -0
- package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.d.ts +4 -3
- package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.d.ts.map +1 -0
- package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.js +20 -22
- package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.js.map +1 -0
- package/lib/WAUSync/Protocols/UsyncLIDProtocol.d.ts +5 -3
- package/lib/WAUSync/Protocols/UsyncLIDProtocol.d.ts.map +1 -0
- package/lib/WAUSync/Protocols/UsyncLIDProtocol.js +13 -8
- 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 +5 -4
- package/lib/WAUSync/USyncQuery.d.ts.map +1 -0
- package/lib/WAUSync/USyncQuery.js +40 -35
- package/lib/WAUSync/USyncQuery.js.map +1 -0
- package/lib/WAUSync/USyncUser.d.ts +7 -4
- 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 +13 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +16 -31
- package/lib/index.js.map +1 -0
- package/package.json +34 -74
- package/Readme.md +0 -1
- package/WASignalGroup/GroupProtocol.js +0 -1697
- package/WASignalGroup/ciphertext_message.js +0 -16
- package/WASignalGroup/group_cipher.js +0 -120
- package/WASignalGroup/group_session_builder.js +0 -46
- package/WASignalGroup/index.js +0 -5
- package/WASignalGroup/keyhelper.js +0 -21
- package/WASignalGroup/protobufs.js +0 -3
- package/WASignalGroup/queue_job.js +0 -69
- package/WASignalGroup/sender_chain_key.js +0 -50
- package/WASignalGroup/sender_key_distribution_message.js +0 -78
- package/WASignalGroup/sender_key_message.js +0 -92
- package/WASignalGroup/sender_key_name.js +0 -70
- package/WASignalGroup/sender_key_record.js +0 -56
- package/WASignalGroup/sender_key_state.js +0 -129
- package/lib/Defaults/baileys-version.json +0 -3
- package/lib/Socket/Client/abstract-socket-client.js +0 -13
- package/lib/Socket/Client/mobile-socket-client.d.ts +0 -13
- package/lib/Socket/Client/mobile-socket-client.js +0 -65
- package/lib/Socket/Client/web-socket-client.js +0 -62
- package/lib/Socket/registration.d.ts +0 -264
- package/lib/Socket/registration.js +0 -166
- package/lib/Socket/usync.d.ts +0 -37
- package/lib/Socket/usync.js +0 -70
- package/lib/Store/index.d.ts +0 -3
- package/lib/Store/index.js +0 -10
- package/lib/Store/make-cache-manager-store.d.ts +0 -14
- package/lib/Store/make-cache-manager-store.js +0 -83
- package/lib/Store/make-in-memory-store.d.ts +0 -118
- package/lib/Store/make-in-memory-store.js +0 -431
- package/lib/Store/make-ordered-dictionary.d.ts +0 -13
- package/lib/Store/make-ordered-dictionary.js +0 -81
- package/lib/Store/object-repository.d.ts +0 -10
- package/lib/Store/object-repository.js +0 -27
- package/lib/Utils/baileys-event-stream.d.ts +0 -16
- package/lib/Utils/baileys-event-stream.js +0 -63
- package/lib/Utils/use-single-file-auth-state.d.ts +0 -12
- package/lib/Utils/use-single-file-auth-state.js +0 -75
package/lib/Utils/messages.js
CHANGED
|
@@ -1,56 +1,49 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
};
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
const Types_1 = require("../Types");
|
|
14
|
-
const WABinary_1 = require("../WABinary");
|
|
15
|
-
const crypto_2 = require("./crypto");
|
|
16
|
-
const generics_1 = require("./generics");
|
|
17
|
-
const messages_media_1 = require("./messages-media");
|
|
1
|
+
import { Boom } from '@hapi/boom';
|
|
2
|
+
import { randomBytes } from 'crypto';
|
|
3
|
+
import { promises as fs } from 'fs';
|
|
4
|
+
import {} from 'stream';
|
|
5
|
+
import { proto } from '../../WAProto/index.js';
|
|
6
|
+
import { CALL_AUDIO_PREFIX, CALL_VIDEO_PREFIX, MEDIA_KEYS, URL_REGEX, WA_DEFAULT_EPHEMERAL } from '../Defaults/index.js';
|
|
7
|
+
import { WAMessageStatus, WAProto } from '../Types/index.js';
|
|
8
|
+
import { isJidGroup, isJidNewsletter, isJidStatusBroadcast, jidNormalizedUser } from '../WABinary/index.js';
|
|
9
|
+
import { sha256 } from './crypto.js';
|
|
10
|
+
import { generateMessageIDV2, getKeyAuthor, unixTimestampSeconds } from './generics.js';
|
|
11
|
+
import { downloadContentFromMessage, encryptedStream, generateThumbnail, getAudioDuration, getAudioWaveform, getRawMediaUploadData } from './messages-media.js';
|
|
12
|
+
import { shouldIncludeReportingToken } from './reporting-utils.js';
|
|
18
13
|
const MIMETYPE_MAP = {
|
|
19
14
|
image: 'image/jpeg',
|
|
20
15
|
video: 'video/mp4',
|
|
21
16
|
document: 'application/pdf',
|
|
22
17
|
audio: 'audio/ogg; codecs=opus',
|
|
23
18
|
sticker: 'image/webp',
|
|
24
|
-
'product-catalog-image': 'image/jpeg'
|
|
19
|
+
'product-catalog-image': 'image/jpeg'
|
|
25
20
|
};
|
|
26
21
|
const MessageTypeProto = {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
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
|
|
32
27
|
};
|
|
33
|
-
const ButtonType = WAProto_1.proto.Message.ButtonsMessage.HeaderType;
|
|
34
28
|
/**
|
|
35
29
|
* Uses a regex to test whether the string contains a URL, and returns the URL if it does.
|
|
36
30
|
* @param text eg. hello https://google.com
|
|
37
31
|
* @returns the URL, eg. https://google.com
|
|
38
32
|
*/
|
|
39
|
-
const extractUrlFromText = (text) =>
|
|
40
|
-
|
|
41
|
-
const
|
|
42
|
-
const url = (0, exports.extractUrlFromText)(text);
|
|
33
|
+
export const extractUrlFromText = (text) => text.match(URL_REGEX)?.[0];
|
|
34
|
+
export const generateLinkPreviewIfRequired = async (text, getUrlInfo, logger) => {
|
|
35
|
+
const url = extractUrlFromText(text);
|
|
43
36
|
if (!!getUrlInfo && url) {
|
|
44
37
|
try {
|
|
45
38
|
const urlInfo = await getUrlInfo(url);
|
|
46
39
|
return urlInfo;
|
|
47
40
|
}
|
|
48
|
-
catch (error) {
|
|
49
|
-
|
|
41
|
+
catch (error) {
|
|
42
|
+
// ignore if fails
|
|
43
|
+
logger?.warn({ trace: error.stack }, 'url generation failed');
|
|
50
44
|
}
|
|
51
45
|
}
|
|
52
46
|
};
|
|
53
|
-
exports.generateLinkPreviewIfRequired = generateLinkPreviewIfRequired;
|
|
54
47
|
const assertColor = async (color) => {
|
|
55
48
|
let assertedColor;
|
|
56
49
|
if (typeof color === 'number') {
|
|
@@ -65,16 +58,16 @@ const assertColor = async (color) => {
|
|
|
65
58
|
return assertedColor;
|
|
66
59
|
}
|
|
67
60
|
};
|
|
68
|
-
const prepareWAMessageMedia = async (message, options) => {
|
|
61
|
+
export const prepareWAMessageMedia = async (message, options) => {
|
|
69
62
|
const logger = options.logger;
|
|
70
63
|
let mediaType;
|
|
71
|
-
for (const key of
|
|
64
|
+
for (const key of MEDIA_KEYS) {
|
|
72
65
|
if (key in message) {
|
|
73
66
|
mediaType = key;
|
|
74
67
|
}
|
|
75
68
|
}
|
|
76
69
|
if (!mediaType) {
|
|
77
|
-
throw new
|
|
70
|
+
throw new Boom('Invalid media type', { statusCode: 400 });
|
|
78
71
|
}
|
|
79
72
|
const uploadData = {
|
|
80
73
|
...message,
|
|
@@ -83,100 +76,164 @@ const prepareWAMessageMedia = async (message, options) => {
|
|
|
83
76
|
delete uploadData[mediaType];
|
|
84
77
|
// check if cacheable + generate cache key
|
|
85
78
|
const cacheableKey = typeof uploadData.media === 'object' &&
|
|
86
|
-
|
|
79
|
+
'url' in uploadData.media &&
|
|
87
80
|
!!uploadData.media.url &&
|
|
88
|
-
!!options.mediaCache &&
|
|
89
|
-
|
|
90
|
-
mediaType + ':' + uploadData.media.url.toString());
|
|
81
|
+
!!options.mediaCache &&
|
|
82
|
+
mediaType + ':' + uploadData.media.url.toString();
|
|
91
83
|
if (mediaType === 'document' && !uploadData.fileName) {
|
|
92
84
|
uploadData.fileName = 'file';
|
|
93
85
|
}
|
|
94
86
|
if (!uploadData.mimetype) {
|
|
95
87
|
uploadData.mimetype = MIMETYPE_MAP[mediaType];
|
|
96
88
|
}
|
|
97
|
-
// check for cache hit
|
|
98
89
|
if (cacheableKey) {
|
|
99
|
-
const mediaBuff = options.mediaCache.get(cacheableKey);
|
|
90
|
+
const mediaBuff = await options.mediaCache.get(cacheableKey);
|
|
100
91
|
if (mediaBuff) {
|
|
101
|
-
logger
|
|
102
|
-
const obj =
|
|
92
|
+
logger?.debug({ cacheableKey }, 'got media cache hit');
|
|
93
|
+
const obj = proto.Message.decode(mediaBuff);
|
|
103
94
|
const key = `${mediaType}Message`;
|
|
104
95
|
Object.assign(obj[key], { ...uploadData, media: undefined });
|
|
105
96
|
return obj;
|
|
106
97
|
}
|
|
107
98
|
}
|
|
99
|
+
const isNewsletter = !!options.jid && isJidNewsletter(options.jid);
|
|
100
|
+
if (isNewsletter) {
|
|
101
|
+
logger?.info({ key: cacheableKey }, 'Preparing raw media for newsletter');
|
|
102
|
+
const { filePath, fileSha256, fileLength } = await getRawMediaUploadData(uploadData.media, options.mediaTypeOverride || mediaType, logger);
|
|
103
|
+
const requiresDurationComputation = mediaType === 'audio' && typeof uploadData.seconds === 'undefined';
|
|
104
|
+
const requiresThumbnailComputation = (mediaType === 'image' || mediaType === 'video') && typeof uploadData['jpegThumbnail'] === 'undefined';
|
|
105
|
+
const requiresWaveformProcessing = mediaType === 'audio' && uploadData.ptt === true && typeof uploadData.waveform === 'undefined';
|
|
106
|
+
const requiresAudioBackground = options.backgroundColor && mediaType === 'audio' && uploadData.ptt === true;
|
|
107
|
+
try {
|
|
108
|
+
if (requiresThumbnailComputation) {
|
|
109
|
+
const { thumbnail, originalImageDimensions } = await generateThumbnail(filePath, mediaType, options);
|
|
110
|
+
uploadData.jpegThumbnail = thumbnail;
|
|
111
|
+
if (!uploadData.width && originalImageDimensions) {
|
|
112
|
+
uploadData.width = originalImageDimensions.width;
|
|
113
|
+
uploadData.height = originalImageDimensions.height;
|
|
114
|
+
logger?.debug('set dimensions');
|
|
115
|
+
}
|
|
116
|
+
logger?.debug('generated thumbnail');
|
|
117
|
+
}
|
|
118
|
+
if (requiresDurationComputation) {
|
|
119
|
+
uploadData.seconds = await getAudioDuration(filePath);
|
|
120
|
+
logger?.debug('computed audio duration');
|
|
121
|
+
}
|
|
122
|
+
if (requiresWaveformProcessing) {
|
|
123
|
+
uploadData.waveform = await getAudioWaveform(filePath, logger);
|
|
124
|
+
logger?.debug('processed waveform');
|
|
125
|
+
}
|
|
126
|
+
if (requiresAudioBackground) {
|
|
127
|
+
uploadData.backgroundArgb = await assertColor(options.backgroundColor);
|
|
128
|
+
logger?.debug('computed backgroundColor audio status');
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
catch (error) {
|
|
132
|
+
logger?.warn({ trace: error.stack }, 'failed to obtain extra info');
|
|
133
|
+
}
|
|
134
|
+
const fileSha256B64 = fileSha256.toString('base64');
|
|
135
|
+
const { mediaUrl, directPath } = await options.upload(filePath, {
|
|
136
|
+
fileEncSha256B64: fileSha256B64,
|
|
137
|
+
mediaType: mediaType,
|
|
138
|
+
newsletter: true,
|
|
139
|
+
timeoutMs: options.mediaUploadTimeoutMs
|
|
140
|
+
});
|
|
141
|
+
await fs.unlink(filePath);
|
|
142
|
+
const obj = WAProto.Message.fromObject({
|
|
143
|
+
[`${mediaType}Message`]: MessageTypeProto[mediaType].fromObject({
|
|
144
|
+
url: mediaUrl,
|
|
145
|
+
directPath,
|
|
146
|
+
fileSha256,
|
|
147
|
+
fileLength,
|
|
148
|
+
mediaKeyTimestamp: unixTimestampSeconds(),
|
|
149
|
+
...uploadData,
|
|
150
|
+
media: undefined
|
|
151
|
+
})
|
|
152
|
+
});
|
|
153
|
+
if (uploadData.ptv) {
|
|
154
|
+
obj.ptvMessage = obj.videoMessage;
|
|
155
|
+
delete obj.videoMessage;
|
|
156
|
+
}
|
|
157
|
+
if (obj.stickerMessage) {
|
|
158
|
+
obj.stickerMessage.stickerSentTs = Date.now();
|
|
159
|
+
}
|
|
160
|
+
if (cacheableKey) {
|
|
161
|
+
logger?.debug({ cacheableKey }, 'set cache');
|
|
162
|
+
await options.mediaCache.set(cacheableKey, WAProto.Message.encode(obj).finish());
|
|
163
|
+
}
|
|
164
|
+
return obj;
|
|
165
|
+
}
|
|
108
166
|
const requiresDurationComputation = mediaType === 'audio' && typeof uploadData.seconds === 'undefined';
|
|
109
|
-
const requiresThumbnailComputation = (mediaType === 'image' || mediaType === 'video') &&
|
|
110
|
-
|
|
111
|
-
const requiresWaveformProcessing = mediaType === 'audio' && uploadData.ptt === true;
|
|
167
|
+
const requiresThumbnailComputation = (mediaType === 'image' || mediaType === 'video') && typeof uploadData['jpegThumbnail'] === 'undefined';
|
|
168
|
+
const requiresWaveformProcessing = mediaType === 'audio' && uploadData.ptt === true && typeof uploadData.waveform === 'undefined';
|
|
112
169
|
const requiresAudioBackground = options.backgroundColor && mediaType === 'audio' && uploadData.ptt === true;
|
|
113
170
|
const requiresOriginalForSomeProcessing = requiresDurationComputation || requiresThumbnailComputation;
|
|
114
|
-
const { mediaKey,
|
|
171
|
+
const { mediaKey, encFilePath, originalFilePath, fileEncSha256, fileSha256, fileLength } = await encryptedStream(uploadData.media, options.mediaTypeOverride || mediaType, {
|
|
115
172
|
logger,
|
|
116
173
|
saveOriginalFileIfRequired: requiresOriginalForSomeProcessing,
|
|
117
174
|
opts: options.options
|
|
118
175
|
});
|
|
119
|
-
|
|
120
|
-
const
|
|
121
|
-
const [{ mediaUrl, directPath, handle }] = await Promise.all([
|
|
176
|
+
const fileEncSha256B64 = fileEncSha256.toString('base64');
|
|
177
|
+
const [{ mediaUrl, directPath }] = await Promise.all([
|
|
122
178
|
(async () => {
|
|
123
|
-
const result = await options.upload(
|
|
124
|
-
|
|
179
|
+
const result = await options.upload(encFilePath, {
|
|
180
|
+
fileEncSha256B64,
|
|
181
|
+
mediaType,
|
|
182
|
+
timeoutMs: options.mediaUploadTimeoutMs
|
|
183
|
+
});
|
|
184
|
+
logger?.debug({ mediaType, cacheableKey }, 'uploaded media');
|
|
125
185
|
return result;
|
|
126
186
|
})(),
|
|
127
187
|
(async () => {
|
|
128
188
|
try {
|
|
129
189
|
if (requiresThumbnailComputation) {
|
|
130
|
-
const { thumbnail, originalImageDimensions } = await
|
|
190
|
+
const { thumbnail, originalImageDimensions } = await generateThumbnail(originalFilePath, mediaType, options);
|
|
131
191
|
uploadData.jpegThumbnail = thumbnail;
|
|
132
192
|
if (!uploadData.width && originalImageDimensions) {
|
|
133
193
|
uploadData.width = originalImageDimensions.width;
|
|
134
194
|
uploadData.height = originalImageDimensions.height;
|
|
135
|
-
logger
|
|
195
|
+
logger?.debug('set dimensions');
|
|
136
196
|
}
|
|
137
|
-
logger
|
|
197
|
+
logger?.debug('generated thumbnail');
|
|
138
198
|
}
|
|
139
199
|
if (requiresDurationComputation) {
|
|
140
|
-
uploadData.seconds = await
|
|
141
|
-
logger
|
|
142
|
-
}
|
|
143
|
-
if (requiresWaveformProcessing) {
|
|
144
|
-
uploadData.waveform = await (0, messages_media_1.getAudioWaveform)(bodyPath, logger);
|
|
145
|
-
logger === null || logger === void 0 ? void 0 : logger.debug('processed waveform');
|
|
200
|
+
uploadData.seconds = await getAudioDuration(originalFilePath);
|
|
201
|
+
logger?.debug('computed audio duration');
|
|
146
202
|
}
|
|
147
203
|
if (requiresWaveformProcessing) {
|
|
148
|
-
uploadData.waveform = await
|
|
149
|
-
logger
|
|
204
|
+
uploadData.waveform = await getAudioWaveform(originalFilePath, logger);
|
|
205
|
+
logger?.debug('processed waveform');
|
|
150
206
|
}
|
|
151
207
|
if (requiresAudioBackground) {
|
|
152
208
|
uploadData.backgroundArgb = await assertColor(options.backgroundColor);
|
|
153
|
-
logger
|
|
209
|
+
logger?.debug('computed backgroundColor audio status');
|
|
154
210
|
}
|
|
155
211
|
}
|
|
156
212
|
catch (error) {
|
|
157
|
-
logger
|
|
213
|
+
logger?.warn({ trace: error.stack }, 'failed to obtain extra info');
|
|
158
214
|
}
|
|
159
|
-
})()
|
|
160
|
-
])
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
215
|
+
})()
|
|
216
|
+
]).finally(async () => {
|
|
217
|
+
try {
|
|
218
|
+
await fs.unlink(encFilePath);
|
|
219
|
+
if (originalFilePath) {
|
|
220
|
+
await fs.unlink(originalFilePath);
|
|
221
|
+
}
|
|
222
|
+
logger?.debug('removed tmp files');
|
|
164
223
|
}
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
await fs_1.promises.unlink(bodyPath);
|
|
168
|
-
logger === null || logger === void 0 ? void 0 : logger.debug('removed tmp files');
|
|
224
|
+
catch (error) {
|
|
225
|
+
logger?.warn('failed to remove tmp file');
|
|
169
226
|
}
|
|
170
227
|
});
|
|
171
|
-
const obj =
|
|
228
|
+
const obj = WAProto.Message.fromObject({
|
|
172
229
|
[`${mediaType}Message`]: MessageTypeProto[mediaType].fromObject({
|
|
173
|
-
url:
|
|
230
|
+
url: mediaUrl,
|
|
174
231
|
directPath,
|
|
175
|
-
mediaKey
|
|
176
|
-
fileEncSha256
|
|
232
|
+
mediaKey,
|
|
233
|
+
fileEncSha256,
|
|
177
234
|
fileSha256,
|
|
178
235
|
fileLength,
|
|
179
|
-
mediaKeyTimestamp:
|
|
236
|
+
mediaKeyTimestamp: unixTimestampSeconds(),
|
|
180
237
|
...uploadData,
|
|
181
238
|
media: undefined
|
|
182
239
|
})
|
|
@@ -186,70 +243,75 @@ const prepareWAMessageMedia = async (message, options) => {
|
|
|
186
243
|
delete obj.videoMessage;
|
|
187
244
|
}
|
|
188
245
|
if (cacheableKey) {
|
|
189
|
-
logger
|
|
190
|
-
options.mediaCache.set(cacheableKey,
|
|
246
|
+
logger?.debug({ cacheableKey }, 'set cache');
|
|
247
|
+
await options.mediaCache.set(cacheableKey, WAProto.Message.encode(obj).finish());
|
|
191
248
|
}
|
|
192
249
|
return obj;
|
|
193
250
|
};
|
|
194
|
-
|
|
195
|
-
const prepareDisappearingMessageSettingContent = (ephemeralExpiration) => {
|
|
251
|
+
export const prepareDisappearingMessageSettingContent = (ephemeralExpiration) => {
|
|
196
252
|
ephemeralExpiration = ephemeralExpiration || 0;
|
|
197
253
|
const content = {
|
|
198
254
|
ephemeralMessage: {
|
|
199
255
|
message: {
|
|
200
256
|
protocolMessage: {
|
|
201
|
-
type:
|
|
257
|
+
type: WAProto.Message.ProtocolMessage.Type.EPHEMERAL_SETTING,
|
|
202
258
|
ephemeralExpiration
|
|
203
259
|
}
|
|
204
260
|
}
|
|
205
261
|
}
|
|
206
262
|
};
|
|
207
|
-
return
|
|
263
|
+
return WAProto.Message.fromObject(content);
|
|
208
264
|
};
|
|
209
|
-
exports.prepareDisappearingMessageSettingContent = prepareDisappearingMessageSettingContent;
|
|
210
265
|
/**
|
|
211
266
|
* Generate forwarded message content like WA does
|
|
212
267
|
* @param message the message to forward
|
|
213
268
|
* @param options.forceForward will show the message as forwarded even if it is from you
|
|
214
269
|
*/
|
|
215
|
-
const generateForwardMessageContent = (message, forceForward) => {
|
|
216
|
-
var _a;
|
|
270
|
+
export const generateForwardMessageContent = (message, forceForward) => {
|
|
217
271
|
let content = message.message;
|
|
218
272
|
if (!content) {
|
|
219
|
-
throw new
|
|
273
|
+
throw new Boom('no content in message', { statusCode: 400 });
|
|
220
274
|
}
|
|
221
275
|
// hacky copy
|
|
222
|
-
content =
|
|
223
|
-
content =
|
|
276
|
+
content = normalizeMessageContent(content);
|
|
277
|
+
content = proto.Message.decode(proto.Message.encode(content).finish());
|
|
224
278
|
let key = Object.keys(content)[0];
|
|
225
|
-
let score =
|
|
279
|
+
let score = content?.[key]?.contextInfo?.forwardingScore || 0;
|
|
226
280
|
score += message.key.fromMe && !forceForward ? 0 : 1;
|
|
227
281
|
if (key === 'conversation') {
|
|
228
282
|
content.extendedTextMessage = { text: content[key] };
|
|
229
283
|
delete content.conversation;
|
|
230
284
|
key = 'extendedTextMessage';
|
|
231
285
|
}
|
|
286
|
+
const key_ = content?.[key];
|
|
232
287
|
if (score > 0) {
|
|
233
|
-
|
|
288
|
+
key_.contextInfo = { forwardingScore: score, isForwarded: true };
|
|
234
289
|
}
|
|
235
290
|
else {
|
|
236
|
-
|
|
291
|
+
key_.contextInfo = {};
|
|
237
292
|
}
|
|
238
293
|
return content;
|
|
239
294
|
};
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
295
|
+
export const hasNonNullishProperty = (message, key) => {
|
|
296
|
+
return (typeof message === 'object' &&
|
|
297
|
+
message !== null &&
|
|
298
|
+
key in message &&
|
|
299
|
+
message[key] !== null &&
|
|
300
|
+
message[key] !== undefined);
|
|
301
|
+
};
|
|
302
|
+
function hasOptionalProperty(obj, key) {
|
|
303
|
+
return typeof obj === 'object' && obj !== null && key in obj && obj[key] !== null;
|
|
304
|
+
}
|
|
305
|
+
export const generateWAMessageContent = async (message, options) => {
|
|
306
|
+
var _a, _b;
|
|
244
307
|
let m = {};
|
|
245
|
-
if ('text'
|
|
308
|
+
if (hasNonNullishProperty(message, 'text')) {
|
|
246
309
|
const extContent = { text: message.text };
|
|
247
310
|
let urlInfo = message.linkPreview;
|
|
248
311
|
if (typeof urlInfo === 'undefined') {
|
|
249
|
-
urlInfo = await
|
|
312
|
+
urlInfo = await generateLinkPreviewIfRequired(message.text, options.getUrlInfo, options.logger);
|
|
250
313
|
}
|
|
251
314
|
if (urlInfo) {
|
|
252
|
-
extContent.canonicalUrl = urlInfo['canonical-url'];
|
|
253
315
|
extContent.matchedText = urlInfo['matched-text'];
|
|
254
316
|
extContent.jpegThumbnail = urlInfo.jpegThumbnail;
|
|
255
317
|
extContent.description = urlInfo.description;
|
|
@@ -274,81 +336,65 @@ const generateWAMessageContent = async (message, options) => {
|
|
|
274
336
|
}
|
|
275
337
|
m.extendedTextMessage = extContent;
|
|
276
338
|
}
|
|
277
|
-
else if ('contacts'
|
|
339
|
+
else if (hasNonNullishProperty(message, 'contacts')) {
|
|
278
340
|
const contactLen = message.contacts.contacts.length;
|
|
279
341
|
if (!contactLen) {
|
|
280
|
-
throw new
|
|
342
|
+
throw new Boom('require atleast 1 contact', { statusCode: 400 });
|
|
281
343
|
}
|
|
282
344
|
if (contactLen === 1) {
|
|
283
|
-
m.contactMessage =
|
|
345
|
+
m.contactMessage = WAProto.Message.ContactMessage.create(message.contacts.contacts[0]);
|
|
284
346
|
}
|
|
285
347
|
else {
|
|
286
|
-
m.contactsArrayMessage =
|
|
348
|
+
m.contactsArrayMessage = WAProto.Message.ContactsArrayMessage.create(message.contacts);
|
|
287
349
|
}
|
|
288
350
|
}
|
|
289
|
-
else if ('location'
|
|
290
|
-
m.locationMessage =
|
|
291
|
-
if ('contextInfo' in message && !!message.contextInfo) {
|
|
292
|
-
m.locationMessage.contextInfo = message.contextInfo;
|
|
293
|
-
}
|
|
294
|
-
}
|
|
295
|
-
else if ('liveLocation' in message) {
|
|
296
|
-
m.liveLocationMessage = Types_1.WAProto.Message.LiveLocationMessage.fromObject(message.liveLocation);
|
|
297
|
-
if ('contextInfo' in message && !!message.contextInfo) {
|
|
298
|
-
m.liveLocationMessage.contextInfo = message.contextInfo;
|
|
299
|
-
}
|
|
351
|
+
else if (hasNonNullishProperty(message, 'location')) {
|
|
352
|
+
m.locationMessage = WAProto.Message.LocationMessage.create(message.location);
|
|
300
353
|
}
|
|
301
|
-
else if ('react'
|
|
354
|
+
else if (hasNonNullishProperty(message, 'react')) {
|
|
302
355
|
if (!message.react.senderTimestampMs) {
|
|
303
356
|
message.react.senderTimestampMs = Date.now();
|
|
304
357
|
}
|
|
305
|
-
m.reactionMessage =
|
|
358
|
+
m.reactionMessage = WAProto.Message.ReactionMessage.create(message.react);
|
|
306
359
|
}
|
|
307
|
-
else if ('delete'
|
|
360
|
+
else if (hasNonNullishProperty(message, 'delete')) {
|
|
308
361
|
m.protocolMessage = {
|
|
309
362
|
key: message.delete,
|
|
310
|
-
type:
|
|
363
|
+
type: WAProto.Message.ProtocolMessage.Type.REVOKE
|
|
311
364
|
};
|
|
312
365
|
}
|
|
313
|
-
else if ('forward'
|
|
314
|
-
m =
|
|
366
|
+
else if (hasNonNullishProperty(message, 'forward')) {
|
|
367
|
+
m = generateForwardMessageContent(message.forward, message.force);
|
|
315
368
|
}
|
|
316
|
-
else if ('disappearingMessagesInChat'
|
|
317
|
-
const exp = typeof message.disappearingMessagesInChat === 'boolean'
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
369
|
+
else if (hasNonNullishProperty(message, 'disappearingMessagesInChat')) {
|
|
370
|
+
const exp = typeof message.disappearingMessagesInChat === 'boolean'
|
|
371
|
+
? message.disappearingMessagesInChat
|
|
372
|
+
? WA_DEFAULT_EPHEMERAL
|
|
373
|
+
: 0
|
|
374
|
+
: message.disappearingMessagesInChat;
|
|
375
|
+
m = prepareDisappearingMessageSettingContent(exp);
|
|
321
376
|
}
|
|
322
|
-
else if ('groupInvite'
|
|
377
|
+
else if (hasNonNullishProperty(message, 'groupInvite')) {
|
|
323
378
|
m.groupInviteMessage = {};
|
|
324
379
|
m.groupInviteMessage.inviteCode = message.groupInvite.inviteCode;
|
|
325
380
|
m.groupInviteMessage.inviteExpiration = message.groupInvite.inviteExpiration;
|
|
326
381
|
m.groupInviteMessage.caption = message.groupInvite.text;
|
|
327
382
|
m.groupInviteMessage.groupJid = message.groupInvite.jid;
|
|
328
383
|
m.groupInviteMessage.groupName = message.groupInvite.subject;
|
|
329
|
-
m.groupInviteMessage.jpegThumbnail = message.groupInvite.thumbnail;
|
|
330
384
|
//TODO: use built-in interface and get disappearing mode info etc.
|
|
331
385
|
//TODO: cache / use store!?
|
|
332
386
|
if (options.getProfilePicUrl) {
|
|
333
|
-
|
|
334
|
-
try {
|
|
335
|
-
pfpUrl = await options.getProfilePicUrl(message.groupInvite.jid, 'preview');
|
|
336
|
-
}
|
|
337
|
-
catch (_8) {
|
|
338
|
-
pfpUrl = null;
|
|
339
|
-
}
|
|
387
|
+
const pfpUrl = await options.getProfilePicUrl(message.groupInvite.jid, 'preview');
|
|
340
388
|
if (pfpUrl) {
|
|
341
|
-
const resp = await
|
|
342
|
-
if (resp.
|
|
343
|
-
|
|
389
|
+
const resp = await fetch(pfpUrl, { method: 'GET', dispatcher: options?.options?.dispatcher });
|
|
390
|
+
if (resp.ok) {
|
|
391
|
+
const buf = Buffer.from(await resp.arrayBuffer());
|
|
392
|
+
m.groupInviteMessage.jpegThumbnail = buf;
|
|
344
393
|
}
|
|
345
394
|
}
|
|
346
|
-
else {
|
|
347
|
-
m.groupInviteMessage.jpegThumbnail = null;
|
|
348
|
-
}
|
|
349
395
|
}
|
|
350
396
|
}
|
|
351
|
-
else if ('pin'
|
|
397
|
+
else if (hasNonNullishProperty(message, 'pin')) {
|
|
352
398
|
m.pinInChatMessage = {};
|
|
353
399
|
m.messageContextInfo = {};
|
|
354
400
|
m.pinInChatMessage.key = message.pin;
|
|
@@ -356,573 +402,193 @@ const generateWAMessageContent = async (message, options) => {
|
|
|
356
402
|
m.pinInChatMessage.senderTimestampMs = Date.now();
|
|
357
403
|
m.messageContextInfo.messageAddOnDurationInSecs = message.type === 1 ? message.time || 86400 : 0;
|
|
358
404
|
}
|
|
359
|
-
else if ('
|
|
360
|
-
m.keepInChatMessage = {};
|
|
361
|
-
m.keepInChatMessage.key = message.keep;
|
|
362
|
-
m.keepInChatMessage.keepType = message.type;
|
|
363
|
-
m.keepInChatMessage.timestampMs = Date.now();
|
|
364
|
-
}
|
|
365
|
-
else if ('call' in message) {
|
|
366
|
-
m = {
|
|
367
|
-
scheduledCallCreationMessage: {
|
|
368
|
-
scheduledTimestampMs: (_a = message.call.time) !== null && _a !== void 0 ? _a : Date.now(),
|
|
369
|
-
callType: (_b = message.call.type) !== null && _b !== void 0 ? _b : 1,
|
|
370
|
-
title: message.call.title
|
|
371
|
-
}
|
|
372
|
-
};
|
|
373
|
-
}
|
|
374
|
-
else if ('paymentInvite' in message) {
|
|
375
|
-
m.paymentInviteMessage = {
|
|
376
|
-
serviceType: message.paymentInvite.type,
|
|
377
|
-
expiryTimestamp: message.paymentInvite.expiry
|
|
378
|
-
};
|
|
379
|
-
}
|
|
380
|
-
else if ('buttonReply' in message) {
|
|
405
|
+
else if (hasNonNullishProperty(message, 'buttonReply')) {
|
|
381
406
|
switch (message.type) {
|
|
382
407
|
case 'template':
|
|
383
408
|
m.templateButtonReplyMessage = {
|
|
384
409
|
selectedDisplayText: message.buttonReply.displayText,
|
|
385
410
|
selectedId: message.buttonReply.id,
|
|
386
|
-
selectedIndex: message.buttonReply.index
|
|
411
|
+
selectedIndex: message.buttonReply.index
|
|
387
412
|
};
|
|
388
413
|
break;
|
|
389
414
|
case 'plain':
|
|
390
415
|
m.buttonsResponseMessage = {
|
|
391
416
|
selectedButtonId: message.buttonReply.id,
|
|
392
417
|
selectedDisplayText: message.buttonReply.displayText,
|
|
393
|
-
type:
|
|
394
|
-
};
|
|
395
|
-
break;
|
|
396
|
-
case 'interactive':
|
|
397
|
-
m.interactiveResponseMessage = {
|
|
398
|
-
body: {
|
|
399
|
-
text: message.buttonReply.text,
|
|
400
|
-
format: WAProto_1.proto.Message.InteractiveResponseMessage.Body.Format.EXTENSIONS_1
|
|
401
|
-
},
|
|
402
|
-
nativeFlowResponseMessage: {
|
|
403
|
-
name: message.buttonReply.nativeFlow.name,
|
|
404
|
-
paramsJson: message.buttonReply.nativeFlow.paramsJson,
|
|
405
|
-
version: message.buttonReply.nativeFlow.version
|
|
406
|
-
}
|
|
418
|
+
type: proto.Message.ButtonsResponseMessage.Type.DISPLAY_TEXT
|
|
407
419
|
};
|
|
408
420
|
break;
|
|
409
421
|
}
|
|
410
422
|
}
|
|
411
|
-
else if ('ptv'
|
|
412
|
-
const { videoMessage } = await
|
|
423
|
+
else if (hasOptionalProperty(message, 'ptv') && message.ptv) {
|
|
424
|
+
const { videoMessage } = await prepareWAMessageMedia({ video: message.video }, options);
|
|
413
425
|
m.ptvMessage = videoMessage;
|
|
414
426
|
}
|
|
415
|
-
else if ('product'
|
|
416
|
-
const { imageMessage } = await
|
|
417
|
-
m.productMessage =
|
|
427
|
+
else if (hasNonNullishProperty(message, 'product')) {
|
|
428
|
+
const { imageMessage } = await prepareWAMessageMedia({ image: message.product.productImage }, options);
|
|
429
|
+
m.productMessage = WAProto.Message.ProductMessage.create({
|
|
418
430
|
...message,
|
|
419
431
|
product: {
|
|
420
432
|
...message.product,
|
|
421
|
-
productImage: imageMessage
|
|
433
|
+
productImage: imageMessage
|
|
422
434
|
}
|
|
423
435
|
});
|
|
424
|
-
if ('contextInfo' in message && !!message.contextInfo) {
|
|
425
|
-
m.productMessage.contextInfo = message.contextInfo;
|
|
426
|
-
}
|
|
427
|
-
if ('mentions' in message && !!message.mentions) {
|
|
428
|
-
m.productMessage.contextInfo = { mentionedJid: message.mentions };
|
|
429
|
-
}
|
|
430
|
-
}
|
|
431
|
-
else if ('order' in message) {
|
|
432
|
-
m.orderMessage = Types_1.WAProto.Message.OrderMessage.fromObject({
|
|
433
|
-
orderId: message.order.id,
|
|
434
|
-
thumbnail: message.order.thumbnail,
|
|
435
|
-
itemCount: message.order.itemCount,
|
|
436
|
-
status: message.order.status,
|
|
437
|
-
surface: message.order.surface,
|
|
438
|
-
orderTitle: message.order.title,
|
|
439
|
-
message: message.order.text,
|
|
440
|
-
sellerJid: message.order.seller,
|
|
441
|
-
token: message.order.token,
|
|
442
|
-
totalAmount1000: message.order.amount,
|
|
443
|
-
totalCurrencyCode: message.order.currency
|
|
444
|
-
});
|
|
445
436
|
}
|
|
446
|
-
else if ('listReply'
|
|
437
|
+
else if (hasNonNullishProperty(message, 'listReply')) {
|
|
447
438
|
m.listResponseMessage = { ...message.listReply };
|
|
448
439
|
}
|
|
449
|
-
else if ('
|
|
450
|
-
|
|
451
|
-
|
|
440
|
+
else if (hasNonNullishProperty(message, 'event')) {
|
|
441
|
+
m.eventMessage = {};
|
|
442
|
+
const startTime = Math.floor(message.event.startDate.getTime() / 1000);
|
|
443
|
+
if (message.event.call && options.getCallLink) {
|
|
444
|
+
const token = await options.getCallLink(message.event.call, { startTime });
|
|
445
|
+
m.eventMessage.joinLink = (message.event.call === 'audio' ? CALL_AUDIO_PREFIX : CALL_VIDEO_PREFIX) + token;
|
|
446
|
+
}
|
|
447
|
+
m.messageContextInfo = {
|
|
448
|
+
// encKey
|
|
449
|
+
messageSecret: message.event.messageSecret || randomBytes(32)
|
|
450
|
+
};
|
|
451
|
+
m.eventMessage.name = message.event.name;
|
|
452
|
+
m.eventMessage.description = message.event.description;
|
|
453
|
+
m.eventMessage.startTime = startTime;
|
|
454
|
+
m.eventMessage.endTime = message.event.endDate ? message.event.endDate.getTime() / 1000 : undefined;
|
|
455
|
+
m.eventMessage.isCanceled = message.event.isCancelled ?? false;
|
|
456
|
+
m.eventMessage.extraGuestsAllowed = message.event.extraGuestsAllowed;
|
|
457
|
+
m.eventMessage.isScheduleCall = message.event.isScheduleCall ?? false;
|
|
458
|
+
m.eventMessage.location = message.event.location;
|
|
459
|
+
}
|
|
460
|
+
else if (hasNonNullishProperty(message, 'poll')) {
|
|
461
|
+
(_a = message.poll).selectableCount || (_a.selectableCount = 0);
|
|
462
|
+
(_b = message.poll).toAnnouncementGroup || (_b.toAnnouncementGroup = false);
|
|
452
463
|
if (!Array.isArray(message.poll.values)) {
|
|
453
|
-
throw new
|
|
464
|
+
throw new Boom('Invalid poll values', { statusCode: 400 });
|
|
454
465
|
}
|
|
455
|
-
if (message.poll.selectableCount < 0
|
|
456
|
-
|
|
457
|
-
|
|
466
|
+
if (message.poll.selectableCount < 0 || message.poll.selectableCount > message.poll.values.length) {
|
|
467
|
+
throw new Boom(`poll.selectableCount in poll should be >= 0 and <= ${message.poll.values.length}`, {
|
|
468
|
+
statusCode: 400
|
|
469
|
+
});
|
|
458
470
|
}
|
|
459
471
|
m.messageContextInfo = {
|
|
460
472
|
// encKey
|
|
461
|
-
messageSecret: message.poll.messageSecret ||
|
|
473
|
+
messageSecret: message.poll.messageSecret || randomBytes(32)
|
|
462
474
|
};
|
|
463
475
|
const pollCreationMessage = {
|
|
464
476
|
name: message.poll.name,
|
|
465
477
|
selectableOptionsCount: message.poll.selectableCount,
|
|
466
|
-
options: message.poll.values.map(optionName => ({ optionName }))
|
|
478
|
+
options: message.poll.values.map(optionName => ({ optionName }))
|
|
467
479
|
};
|
|
468
480
|
if (message.poll.toAnnouncementGroup) {
|
|
469
481
|
// poll v2 is for community announcement groups (single select and multiple)
|
|
470
482
|
m.pollCreationMessageV2 = pollCreationMessage;
|
|
471
483
|
}
|
|
472
484
|
else {
|
|
473
|
-
if (message.poll.selectableCount
|
|
485
|
+
if (message.poll.selectableCount === 1) {
|
|
474
486
|
//poll v3 is for single select polls
|
|
475
487
|
m.pollCreationMessageV3 = pollCreationMessage;
|
|
476
488
|
}
|
|
477
489
|
else {
|
|
478
|
-
// poll
|
|
490
|
+
// poll for multiple choice polls
|
|
479
491
|
m.pollCreationMessage = pollCreationMessage;
|
|
480
492
|
}
|
|
481
493
|
}
|
|
482
|
-
if ('contextInfo' in message && !!message.contextInfo) {
|
|
483
|
-
pollCreationMessage.contextInfo = message.contextInfo;
|
|
484
|
-
}
|
|
485
|
-
}
|
|
486
|
-
else if ('pollResult' in message) {
|
|
487
|
-
if (!Array.isArray(message.pollResult.votes)) {
|
|
488
|
-
throw new boom_1.Boom('Invalid poll votes result', { statusCode: 400 });
|
|
489
|
-
}
|
|
490
|
-
m.messageContextInfo = {
|
|
491
|
-
// encKey
|
|
492
|
-
messageSecret: message.pollResult.messageSecret || (0, crypto_1.randomBytes)(32),
|
|
493
|
-
};
|
|
494
|
-
const pollResultSnapshotMessage = {
|
|
495
|
-
name: message.pollResult.name,
|
|
496
|
-
pollVotes: message.pollResult.votes.map((option) => ({
|
|
497
|
-
optionName: option[0],
|
|
498
|
-
optionVoteCount: option[1]
|
|
499
|
-
})),
|
|
500
|
-
};
|
|
501
|
-
if ('contextInfo' in message && !!message.contextInfo) {
|
|
502
|
-
pollResultSnapshotMessage.contextInfo = message.contextInfo;
|
|
503
|
-
}
|
|
504
|
-
if ('mentions' in message && !!message.mentions) {
|
|
505
|
-
pollResultSnapshotMessage.contextInfo = { mentionedJid: message.mentions };
|
|
506
|
-
}
|
|
507
|
-
m.pollResultSnapshotMessage = pollResultSnapshotMessage;
|
|
508
|
-
}
|
|
509
|
-
else if ('event' in message) {
|
|
510
|
-
m.messageContextInfo = {
|
|
511
|
-
messageSecret: message.event.messageSecret || (0, crypto_1.randomBytes)(32),
|
|
512
|
-
};
|
|
513
|
-
m.eventMessage = { ...message.event };
|
|
514
|
-
}
|
|
515
|
-
else if ('inviteAdmin' in message) {
|
|
516
|
-
m.newsletterAdminInviteMessage = {};
|
|
517
|
-
m.newsletterAdminInviteMessage.inviteExpiration = message.inviteAdmin.inviteExpiration;
|
|
518
|
-
m.newsletterAdminInviteMessage.caption = message.inviteAdmin.text;
|
|
519
|
-
m.newsletterAdminInviteMessage.newsletterJid = message.inviteAdmin.jid;
|
|
520
|
-
m.newsletterAdminInviteMessage.newsletterName = message.inviteAdmin.subject;
|
|
521
|
-
m.newsletterAdminInviteMessage.jpegThumbnail = message.inviteAdmin.thumbnail;
|
|
522
|
-
//TODO: use built-in interface and get disappearing mode info etc.
|
|
523
|
-
//TODO: cache / use store!?
|
|
524
|
-
if (options.getProfilePicUrl) {
|
|
525
|
-
let pfpUrl;
|
|
526
|
-
try {
|
|
527
|
-
pfpUrl = await options.getProfilePicUrl(message.inviteAdmin.jid, 'preview');
|
|
528
|
-
}
|
|
529
|
-
catch (_9) {
|
|
530
|
-
pfpUrl = null;
|
|
531
|
-
}
|
|
532
|
-
if (pfpUrl) {
|
|
533
|
-
const resp = await axios_1.default.get(pfpUrl, { responseType: 'arraybuffer' });
|
|
534
|
-
if (resp.status === 200) {
|
|
535
|
-
m.newsletterAdminInviteMessage.jpegThumbnail = resp.data;
|
|
536
|
-
}
|
|
537
|
-
}
|
|
538
|
-
else {
|
|
539
|
-
m.newsletterAdminInviteMessage.jpegThumbnail = null;
|
|
540
|
-
}
|
|
541
|
-
}
|
|
542
|
-
}
|
|
543
|
-
else if ('requestPayment' in message) {
|
|
544
|
-
const sticker = ((_d = message === null || message === void 0 ? void 0 : message.requestPayment) === null || _d === void 0 ? void 0 : _d.sticker) ?
|
|
545
|
-
await (0, exports.prepareWAMessageMedia)({ sticker: (_e = message === null || message === void 0 ? void 0 : message.requestPayment) === null || _e === void 0 ? void 0 : _e.sticker, ...options }, options)
|
|
546
|
-
: null;
|
|
547
|
-
let notes = {};
|
|
548
|
-
if ((_f = message === null || message === void 0 ? void 0 : message.requestPayment) === null || _f === void 0 ? void 0 : _f.sticker) {
|
|
549
|
-
notes = {
|
|
550
|
-
stickerMessage: {
|
|
551
|
-
...sticker === null || sticker === void 0 ? void 0 : sticker.stickerMessage,
|
|
552
|
-
contextInfo: {
|
|
553
|
-
stanzaId: (_h = (_g = options === null || options === void 0 ? void 0 : options.quoted) === null || _g === void 0 ? void 0 : _g.key) === null || _h === void 0 ? void 0 : _h.id,
|
|
554
|
-
participant: (_k = (_j = options === null || options === void 0 ? void 0 : options.quoted) === null || _j === void 0 ? void 0 : _j.key) === null || _k === void 0 ? void 0 : _k.participant,
|
|
555
|
-
quotedMessage: (_l = options === null || options === void 0 ? void 0 : options.quoted) === null || _l === void 0 ? void 0 : _l.message,
|
|
556
|
-
...(_m = message === null || message === void 0 ? void 0 : message.requestPayment) === null || _m === void 0 ? void 0 : _m.contextInfo,
|
|
557
|
-
}
|
|
558
|
-
}
|
|
559
|
-
};
|
|
560
|
-
}
|
|
561
|
-
else if (message.requestPayment.note) {
|
|
562
|
-
notes = {
|
|
563
|
-
extendedTextMessage: {
|
|
564
|
-
text: message.requestPayment.note,
|
|
565
|
-
contextInfo: {
|
|
566
|
-
stanzaId: (_p = (_o = options === null || options === void 0 ? void 0 : options.quoted) === null || _o === void 0 ? void 0 : _o.key) === null || _p === void 0 ? void 0 : _p.id,
|
|
567
|
-
participant: (_r = (_q = options === null || options === void 0 ? void 0 : options.quoted) === null || _q === void 0 ? void 0 : _q.key) === null || _r === void 0 ? void 0 : _r.participant,
|
|
568
|
-
quotedMessage: (_s = options === null || options === void 0 ? void 0 : options.quoted) === null || _s === void 0 ? void 0 : _s.message,
|
|
569
|
-
...(_t = message === null || message === void 0 ? void 0 : message.requestPayment) === null || _t === void 0 ? void 0 : _t.contextInfo,
|
|
570
|
-
}
|
|
571
|
-
}
|
|
572
|
-
};
|
|
573
|
-
}
|
|
574
|
-
m.requestPaymentMessage = Types_1.WAProto.Message.RequestPaymentMessage.fromObject({
|
|
575
|
-
expiryTimestamp: message.requestPayment.expiry,
|
|
576
|
-
amount1000: message.requestPayment.amount,
|
|
577
|
-
currencyCodeIso4217: message.requestPayment.currency,
|
|
578
|
-
requestFrom: message.requestPayment.from,
|
|
579
|
-
noteMessage: { ...notes },
|
|
580
|
-
background: (_u = message.requestPayment.background) !== null && _u !== void 0 ? _u : null,
|
|
581
|
-
});
|
|
582
494
|
}
|
|
583
|
-
else if ('sharePhoneNumber'
|
|
495
|
+
else if (hasNonNullishProperty(message, 'sharePhoneNumber')) {
|
|
584
496
|
m.protocolMessage = {
|
|
585
|
-
type:
|
|
497
|
+
type: proto.Message.ProtocolMessage.Type.SHARE_PHONE_NUMBER
|
|
586
498
|
};
|
|
587
499
|
}
|
|
588
|
-
else if ('requestPhoneNumber'
|
|
500
|
+
else if (hasNonNullishProperty(message, 'requestPhoneNumber')) {
|
|
589
501
|
m.requestPhoneNumberMessage = {};
|
|
590
502
|
}
|
|
591
|
-
else {
|
|
592
|
-
m =
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
buttonsMessage.contentText = message.text;
|
|
600
|
-
buttonsMessage.headerType = ButtonType.EMPTY;
|
|
601
|
-
}
|
|
602
|
-
else {
|
|
603
|
-
if ('caption' in message) {
|
|
604
|
-
buttonsMessage.contentText = message.caption;
|
|
605
|
-
}
|
|
606
|
-
const type = Object.keys(m)[0].replace('Message', '').toUpperCase();
|
|
607
|
-
buttonsMessage.headerType = ButtonType[type];
|
|
608
|
-
Object.assign(buttonsMessage, m);
|
|
609
|
-
}
|
|
610
|
-
if ('footer' in message && !!message.footer) {
|
|
611
|
-
buttonsMessage.footerText = message.footer;
|
|
612
|
-
}
|
|
613
|
-
if ('title' in message && !!message.title) {
|
|
614
|
-
buttonsMessage.text = message.title,
|
|
615
|
-
buttonsMessage.headerType = ButtonType.TEXT;
|
|
616
|
-
}
|
|
617
|
-
if ('contextInfo' in message && !!message.contextInfo) {
|
|
618
|
-
buttonsMessage.contextInfo = message.contextInfo;
|
|
619
|
-
}
|
|
620
|
-
if ('mentions' in message && !!message.mentions) {
|
|
621
|
-
buttonsMessage.contextInfo = { mentionedJid: message.mentions };
|
|
622
|
-
}
|
|
623
|
-
m = { buttonsMessage };
|
|
624
|
-
}
|
|
625
|
-
else if ('templateButtons' in message && !!message.templateButtons) {
|
|
626
|
-
const msg = {
|
|
627
|
-
hydratedButtons: message.hasOwnProperty("templateButtons") ? message.templateButtons : message.templateButtons
|
|
628
|
-
};
|
|
629
|
-
if ('text' in message) {
|
|
630
|
-
msg.hydratedContentText = message.text;
|
|
631
|
-
}
|
|
632
|
-
else {
|
|
633
|
-
if ('caption' in message) {
|
|
634
|
-
msg.hydratedContentText = message.caption;
|
|
635
|
-
}
|
|
636
|
-
Object.assign(msg, m);
|
|
637
|
-
}
|
|
638
|
-
if ('footer' in message && !!message.footer) {
|
|
639
|
-
msg.hydratedFooterText = message.footer;
|
|
640
|
-
}
|
|
641
|
-
m = {
|
|
642
|
-
templateMessage: {
|
|
643
|
-
fourRowTemplate: msg,
|
|
644
|
-
hydratedTemplate: msg
|
|
503
|
+
else if (hasNonNullishProperty(message, 'limitSharing')) {
|
|
504
|
+
m.protocolMessage = {
|
|
505
|
+
type: proto.Message.ProtocolMessage.Type.LIMIT_SHARING,
|
|
506
|
+
limitSharing: {
|
|
507
|
+
sharingLimited: message.limitSharing === true,
|
|
508
|
+
trigger: 1,
|
|
509
|
+
limitSharingSettingTimestamp: Date.now(),
|
|
510
|
+
initiatedByMe: true
|
|
645
511
|
}
|
|
646
512
|
};
|
|
647
513
|
}
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
nativeFlowMessage: Types_1.WAProto.Message.InteractiveMessage.NativeFlowMessage.fromObject({
|
|
651
|
-
buttons: message.interactiveButtons,
|
|
652
|
-
})
|
|
653
|
-
};
|
|
654
|
-
if ('text' in message) {
|
|
655
|
-
body: interactiveMessage.body = {
|
|
656
|
-
text: message.text
|
|
657
|
-
};
|
|
658
|
-
header: interactiveMessage.header = {
|
|
659
|
-
title: message.title,
|
|
660
|
-
subtitle: message.subtitle,
|
|
661
|
-
hasMediaAttachment: (_v = message === null || message === void 0 ? void 0 : message.media) !== null && _v !== void 0 ? _v : false,
|
|
662
|
-
};
|
|
663
|
-
}
|
|
664
|
-
else {
|
|
665
|
-
if ('caption' in message) {
|
|
666
|
-
body: interactiveMessage.body = {
|
|
667
|
-
text: message.caption
|
|
668
|
-
};
|
|
669
|
-
header: interactiveMessage.header = {
|
|
670
|
-
title: message.title,
|
|
671
|
-
subtitle: message.subtitle,
|
|
672
|
-
hasMediaAttachment: (_w = message === null || message === void 0 ? void 0 : message.media) !== null && _w !== void 0 ? _w : false,
|
|
673
|
-
};
|
|
674
|
-
Object.assign(interactiveMessage.header, m);
|
|
675
|
-
}
|
|
676
|
-
}
|
|
677
|
-
if ('footer' in message && !!message.footer) {
|
|
678
|
-
footer: interactiveMessage.footer = {
|
|
679
|
-
text: message.footer
|
|
680
|
-
};
|
|
681
|
-
}
|
|
682
|
-
if ('contextInfo' in message && !!message.contextInfo) {
|
|
683
|
-
interactiveMessage.contextInfo = message.contextInfo;
|
|
684
|
-
}
|
|
685
|
-
if ('mentions' in message && !!message.mentions) {
|
|
686
|
-
interactiveMessage.contextInfo = { mentionedJid: message.mentions };
|
|
687
|
-
}
|
|
688
|
-
m = { interactiveMessage };
|
|
689
|
-
}
|
|
690
|
-
if ('shop' in message && !!message.shop) {
|
|
691
|
-
const interactiveMessage = {
|
|
692
|
-
shopStorefrontMessage: Types_1.WAProto.Message.InteractiveMessage.ShopMessage.fromObject({
|
|
693
|
-
surface: message.shop,
|
|
694
|
-
id: message.id
|
|
695
|
-
})
|
|
696
|
-
};
|
|
697
|
-
if ('text' in message) {
|
|
698
|
-
body: interactiveMessage.body = {
|
|
699
|
-
text: message.text
|
|
700
|
-
};
|
|
701
|
-
header: interactiveMessage.header = {
|
|
702
|
-
title: message.title,
|
|
703
|
-
subtitle: message.subtitle,
|
|
704
|
-
hasMediaAttachment: (_x = message === null || message === void 0 ? void 0 : message.media) !== null && _x !== void 0 ? _x : false,
|
|
705
|
-
};
|
|
706
|
-
}
|
|
707
|
-
else {
|
|
708
|
-
if ('caption' in message) {
|
|
709
|
-
body: interactiveMessage.body = {
|
|
710
|
-
text: message.caption
|
|
711
|
-
};
|
|
712
|
-
header: interactiveMessage.header = {
|
|
713
|
-
title: message.title,
|
|
714
|
-
subtitle: message.subtitle,
|
|
715
|
-
hasMediaAttachment: (_y = message === null || message === void 0 ? void 0 : message.media) !== null && _y !== void 0 ? _y : false,
|
|
716
|
-
};
|
|
717
|
-
Object.assign(interactiveMessage.header, m);
|
|
718
|
-
}
|
|
719
|
-
}
|
|
720
|
-
if ('footer' in message && !!message.footer) {
|
|
721
|
-
footer: interactiveMessage.footer = {
|
|
722
|
-
text: message.footer
|
|
723
|
-
};
|
|
724
|
-
}
|
|
725
|
-
if ('contextInfo' in message && !!message.contextInfo) {
|
|
726
|
-
interactiveMessage.contextInfo = message.contextInfo;
|
|
727
|
-
}
|
|
728
|
-
if ('mentions' in message && !!message.mentions) {
|
|
729
|
-
interactiveMessage.contextInfo = { mentionedJid: message.mentions };
|
|
730
|
-
}
|
|
731
|
-
m = { interactiveMessage };
|
|
514
|
+
else {
|
|
515
|
+
m = await prepareWAMessageMedia(message, options);
|
|
732
516
|
}
|
|
733
|
-
if ('
|
|
734
|
-
|
|
735
|
-
collectionMessage: Types_1.WAProto.Message.InteractiveMessage.CollectionMessage.fromObject({
|
|
736
|
-
bizJid: (_z = message === null || message === void 0 ? void 0 : message.collection) === null || _z === void 0 ? void 0 : _z.bizJid,
|
|
737
|
-
id: (_0 = message === null || message === void 0 ? void 0 : message.collection) === null || _0 === void 0 ? void 0 : _0.id,
|
|
738
|
-
messageVersion: (_1 = message === null || message === void 0 ? void 0 : message.collection) === null || _1 === void 0 ? void 0 : _1.version
|
|
739
|
-
})
|
|
740
|
-
};
|
|
741
|
-
if ('text' in message) {
|
|
742
|
-
body: interactiveMessage.body = {
|
|
743
|
-
text: message.text
|
|
744
|
-
};
|
|
745
|
-
header: interactiveMessage.header = {
|
|
746
|
-
title: message.title,
|
|
747
|
-
subtitle: message.subtitle,
|
|
748
|
-
hasMediaAttachment: (_2 = message === null || message === void 0 ? void 0 : message.media) !== null && _2 !== void 0 ? _2 : false,
|
|
749
|
-
};
|
|
750
|
-
}
|
|
751
|
-
else {
|
|
752
|
-
if ('caption' in message) {
|
|
753
|
-
body: interactiveMessage.body = {
|
|
754
|
-
text: message.caption
|
|
755
|
-
};
|
|
756
|
-
header: interactiveMessage.header = {
|
|
757
|
-
title: message.title,
|
|
758
|
-
subtitle: message.subtitle,
|
|
759
|
-
hasMediaAttachment: (_3 = message === null || message === void 0 ? void 0 : message.media) !== null && _3 !== void 0 ? _3 : false,
|
|
760
|
-
};
|
|
761
|
-
Object.assign(interactiveMessage.header, m);
|
|
762
|
-
}
|
|
763
|
-
}
|
|
764
|
-
if ('footer' in message && !!message.footer) {
|
|
765
|
-
footer: interactiveMessage.footer = {
|
|
766
|
-
text: message.footer
|
|
767
|
-
};
|
|
768
|
-
}
|
|
769
|
-
if ('contextInfo' in message && !!message.contextInfo) {
|
|
770
|
-
interactiveMessage.contextInfo = message.contextInfo;
|
|
771
|
-
}
|
|
772
|
-
if ('mentions' in message && !!message.mentions) {
|
|
773
|
-
interactiveMessage.contextInfo = { mentionedJid: message.mentions };
|
|
774
|
-
}
|
|
775
|
-
m = { interactiveMessage };
|
|
517
|
+
if (hasOptionalProperty(message, 'viewOnce') && !!message.viewOnce) {
|
|
518
|
+
m = { viewOnceMessage: { message: m } };
|
|
776
519
|
}
|
|
777
|
-
if ('
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
product: {
|
|
786
|
-
...product,
|
|
787
|
-
productImage: imageMessage,
|
|
788
|
-
},
|
|
789
|
-
...slide
|
|
790
|
-
})
|
|
791
|
-
};
|
|
792
|
-
}
|
|
793
|
-
else if (image) {
|
|
794
|
-
header = await (0, exports.prepareWAMessageMedia)({ image: image, ...options }, options);
|
|
520
|
+
if ((hasOptionalProperty(message, 'mentions') && message.mentions?.length) ||
|
|
521
|
+
(hasOptionalProperty(message, 'mentionAll') && message.mentionAll)) {
|
|
522
|
+
const messageType = Object.keys(m)[0];
|
|
523
|
+
const key = m[messageType];
|
|
524
|
+
if (key && 'contextInfo' in key) {
|
|
525
|
+
key.contextInfo = key.contextInfo || {};
|
|
526
|
+
if (message.mentions?.length) {
|
|
527
|
+
key.contextInfo.mentionedJid = message.mentions;
|
|
795
528
|
}
|
|
796
|
-
|
|
797
|
-
|
|
529
|
+
if (message.mentionAll) {
|
|
530
|
+
key.contextInfo.nonJidMentions = 1;
|
|
798
531
|
}
|
|
799
|
-
const msg = {
|
|
800
|
-
header: Types_1.WAProto.Message.InteractiveMessage.Header.fromObject({
|
|
801
|
-
title,
|
|
802
|
-
hasMediaAttachment: true,
|
|
803
|
-
...header
|
|
804
|
-
}),
|
|
805
|
-
body: Types_1.WAProto.Message.InteractiveMessage.Body.fromObject({
|
|
806
|
-
text: caption
|
|
807
|
-
}),
|
|
808
|
-
footer: Types_1.WAProto.Message.InteractiveMessage.Footer.fromObject({
|
|
809
|
-
text: footer
|
|
810
|
-
}),
|
|
811
|
-
nativeFlowMessage: Types_1.WAProto.Message.InteractiveMessage.NativeFlowMessage.fromObject({
|
|
812
|
-
buttons,
|
|
813
|
-
}),
|
|
814
|
-
};
|
|
815
|
-
return msg;
|
|
816
|
-
}));
|
|
817
|
-
const interactiveMessage = {
|
|
818
|
-
carouselMessage: Types_1.WAProto.Message.InteractiveMessage.CarouselMessage.fromObject({
|
|
819
|
-
cards: slides
|
|
820
|
-
})
|
|
821
|
-
};
|
|
822
|
-
if ('text' in message) {
|
|
823
|
-
interactiveMessage.body = Types_1.WAProto.Message.InteractiveMessage.Body.fromObject({
|
|
824
|
-
text: message.text
|
|
825
|
-
});
|
|
826
|
-
interactiveMessage.header = Types_1.WAProto.Message.InteractiveMessage.Header.fromObject({
|
|
827
|
-
title: message.title,
|
|
828
|
-
subtitle: message.subtitle,
|
|
829
|
-
hasMediaAttachment: (_4 = message === null || message === void 0 ? void 0 : message.media) !== null && _4 !== void 0 ? _4 : false,
|
|
830
|
-
});
|
|
831
|
-
}
|
|
832
|
-
if ('footer' in message && !!message.footer) {
|
|
833
|
-
interactiveMessage.footer = Types_1.WAProto.Message.InteractiveMessage.Footer.fromObject({
|
|
834
|
-
text: message.footer
|
|
835
|
-
});
|
|
836
532
|
}
|
|
837
|
-
if (
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
533
|
+
else if (key) {
|
|
534
|
+
key.contextInfo = {
|
|
535
|
+
mentionedJid: message.mentions,
|
|
536
|
+
nonJidMentions: message.mentionAll ? 1 : 0
|
|
537
|
+
};
|
|
842
538
|
}
|
|
843
|
-
m = { interactiveMessage };
|
|
844
|
-
}
|
|
845
|
-
if ('sections' in message && !!message.sections) {
|
|
846
|
-
const listMessage = WAProto_1.proto.Message.ListMessage.fromObject({
|
|
847
|
-
sections: message.sections,
|
|
848
|
-
buttonText: message.buttonText,
|
|
849
|
-
title: message.title,
|
|
850
|
-
footerText: message.footer,
|
|
851
|
-
description: message.text,
|
|
852
|
-
listType: WAProto_1.proto.Message.ListMessage.ListType.PRODUCT_LIST
|
|
853
|
-
});
|
|
854
|
-
m = { listMessage };
|
|
855
|
-
}
|
|
856
|
-
if ('viewOnce' in message && !!message.viewOnce) {
|
|
857
|
-
m = { viewOnceMessage: { message: m } };
|
|
858
|
-
}
|
|
859
|
-
if ('viewOnceV2' in message && !!message.viewOnceV2) {
|
|
860
|
-
m = { viewOnceMessageV2: { message: m } };
|
|
861
|
-
}
|
|
862
|
-
if ('viewOnceV2Extension' in message && !!message.viewOnceV2Extension) {
|
|
863
|
-
m = { viewOnceMessageV2Extension: { message: m } };
|
|
864
|
-
}
|
|
865
|
-
if ('ephemeral' in message && !!message.ephemeral) {
|
|
866
|
-
m = { ephemeralMessage: { message: m } };
|
|
867
539
|
}
|
|
868
|
-
if ('
|
|
869
|
-
m = { lottieStickerMessage: { message: m } };
|
|
870
|
-
}
|
|
871
|
-
if ('mentions' in message && ((_5 = message.mentions) === null || _5 === void 0 ? void 0 : _5.length)) {
|
|
872
|
-
const [messageType] = Object.keys(m);
|
|
873
|
-
m[messageType].contextInfo = m[messageType] || {};
|
|
874
|
-
m[messageType].contextInfo.mentionedJid = message.mentions;
|
|
875
|
-
}
|
|
876
|
-
if ('edit' in message) {
|
|
540
|
+
if (hasOptionalProperty(message, 'edit')) {
|
|
877
541
|
m = {
|
|
878
542
|
protocolMessage: {
|
|
879
543
|
key: message.edit,
|
|
880
544
|
editedMessage: m,
|
|
881
545
|
timestampMs: Date.now(),
|
|
882
|
-
type:
|
|
546
|
+
type: WAProto.Message.ProtocolMessage.Type.MESSAGE_EDIT
|
|
883
547
|
}
|
|
884
548
|
};
|
|
885
549
|
}
|
|
886
|
-
if ('contextInfo'
|
|
887
|
-
const
|
|
888
|
-
|
|
889
|
-
|
|
550
|
+
if (hasOptionalProperty(message, 'contextInfo') && !!message.contextInfo) {
|
|
551
|
+
const messageType = Object.keys(m)[0];
|
|
552
|
+
const key = m[messageType];
|
|
553
|
+
if ('contextInfo' in key && !!key.contextInfo) {
|
|
554
|
+
key.contextInfo = { ...key.contextInfo, ...message.contextInfo };
|
|
555
|
+
}
|
|
556
|
+
else if (key) {
|
|
557
|
+
key.contextInfo = message.contextInfo;
|
|
558
|
+
}
|
|
559
|
+
}
|
|
560
|
+
if (shouldIncludeReportingToken(m)) {
|
|
561
|
+
m.messageContextInfo = m.messageContextInfo || {};
|
|
562
|
+
if (!m.messageContextInfo.messageSecret) {
|
|
563
|
+
m.messageContextInfo.messageSecret = randomBytes(32);
|
|
564
|
+
}
|
|
890
565
|
}
|
|
891
|
-
return
|
|
566
|
+
return WAProto.Message.create(m);
|
|
892
567
|
};
|
|
893
|
-
|
|
894
|
-
const generateWAMessageFromContent = (jid, message, options) => {
|
|
895
|
-
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
|
|
568
|
+
export const generateWAMessageFromContent = (jid, message, options) => {
|
|
896
569
|
// set timestamp to now
|
|
897
570
|
// if not specified
|
|
898
571
|
if (!options.timestamp) {
|
|
899
572
|
options.timestamp = new Date();
|
|
900
573
|
}
|
|
901
|
-
const innerMessage =
|
|
902
|
-
const key =
|
|
903
|
-
const timestamp =
|
|
574
|
+
const innerMessage = normalizeMessageContent(message);
|
|
575
|
+
const key = getContentType(innerMessage);
|
|
576
|
+
const timestamp = unixTimestampSeconds(options.timestamp);
|
|
904
577
|
const { quoted, userJid } = options;
|
|
905
|
-
if (quoted && !(
|
|
906
|
-
const participant = quoted.key.fromMe
|
|
907
|
-
|
|
908
|
-
|
|
578
|
+
if (quoted && !isJidNewsletter(jid)) {
|
|
579
|
+
const participant = quoted.key.fromMe
|
|
580
|
+
? userJid // TODO: Add support for LIDs
|
|
581
|
+
: quoted.participant || quoted.key.participant || quoted.key.remoteJid;
|
|
582
|
+
let quotedMsg = normalizeMessageContent(quoted.message);
|
|
583
|
+
const msgType = getContentType(quotedMsg);
|
|
909
584
|
// strip any redundant properties
|
|
910
|
-
quotedMsg =
|
|
585
|
+
quotedMsg = proto.Message.create({ [msgType]: quotedMsg[msgType] });
|
|
911
586
|
const quotedContent = quotedMsg[msgType];
|
|
912
587
|
if (typeof quotedContent === 'object' && quotedContent && 'contextInfo' in quotedContent) {
|
|
913
588
|
delete quotedContent.contextInfo;
|
|
914
589
|
}
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
if (((_a = innerMessage === null || innerMessage === void 0 ? void 0 : innerMessage.requestPaymentMessage) === null || _a === void 0 ? void 0 : _a.noteMessage) && ((_c = (_b = innerMessage === null || innerMessage === void 0 ? void 0 : innerMessage.requestPaymentMessage) === null || _b === void 0 ? void 0 : _b.noteMessage) === null || _c === void 0 ? void 0 : _c.extendedTextMessage)) {
|
|
918
|
-
requestPayment = (_e = (_d = innerMessage === null || innerMessage === void 0 ? void 0 : innerMessage.requestPaymentMessage) === null || _d === void 0 ? void 0 : _d.noteMessage) === null || _e === void 0 ? void 0 : _e.extendedTextMessage;
|
|
919
|
-
}
|
|
920
|
-
else if (((_f = innerMessage === null || innerMessage === void 0 ? void 0 : innerMessage.requestPaymentMessage) === null || _f === void 0 ? void 0 : _f.noteMessage) && ((_h = (_g = innerMessage === null || innerMessage === void 0 ? void 0 : innerMessage.requestPaymentMessage) === null || _g === void 0 ? void 0 : _g.noteMessage) === null || _h === void 0 ? void 0 : _h.stickerMessage)) {
|
|
921
|
-
requestPayment = (_k = (_j = innerMessage.requestPaymentMessage) === null || _j === void 0 ? void 0 : _j.noteMessage) === null || _k === void 0 ? void 0 : _k.stickerMessage;
|
|
922
|
-
}
|
|
923
|
-
}
|
|
924
|
-
const contextInfo = (key === 'requestPaymentMessage' ? requestPayment.contextInfo : innerMessage[key].contextInfo) || {};
|
|
925
|
-
contextInfo.participant = (0, WABinary_1.jidNormalizedUser)(participant);
|
|
590
|
+
const contextInfo = ('contextInfo' in innerMessage[key] && innerMessage[key]?.contextInfo) || {};
|
|
591
|
+
contextInfo.participant = jidNormalizedUser(participant);
|
|
926
592
|
contextInfo.stanzaId = quoted.key.id;
|
|
927
593
|
contextInfo.quotedMessage = quotedMsg;
|
|
928
594
|
// if a participant is quoted, then it must be a group
|
|
@@ -930,62 +596,63 @@ const generateWAMessageFromContent = (jid, message, options) => {
|
|
|
930
596
|
if (jid !== quoted.key.remoteJid) {
|
|
931
597
|
contextInfo.remoteJid = quoted.key.remoteJid;
|
|
932
598
|
}
|
|
933
|
-
innerMessage[key]
|
|
599
|
+
if (contextInfo && innerMessage[key]) {
|
|
600
|
+
/* @ts-ignore */
|
|
601
|
+
innerMessage[key].contextInfo = contextInfo;
|
|
602
|
+
}
|
|
934
603
|
}
|
|
935
604
|
if (
|
|
936
605
|
// if we want to send a disappearing message
|
|
937
|
-
!!
|
|
606
|
+
!!options?.ephemeralExpiration &&
|
|
938
607
|
// and it's not a protocol message -- delete, toggle disappear message
|
|
939
608
|
key !== 'protocolMessage' &&
|
|
940
609
|
// already not converted to disappearing message
|
|
941
610
|
key !== 'ephemeralMessage' &&
|
|
942
|
-
//
|
|
943
|
-
!(
|
|
611
|
+
// newsletters don't support ephemeral messages
|
|
612
|
+
!isJidNewsletter(jid)) {
|
|
613
|
+
/* @ts-ignore */
|
|
944
614
|
innerMessage[key].contextInfo = {
|
|
945
615
|
...(innerMessage[key].contextInfo || {}),
|
|
946
|
-
expiration: options.ephemeralExpiration ||
|
|
616
|
+
expiration: options.ephemeralExpiration || WA_DEFAULT_EPHEMERAL
|
|
947
617
|
//ephemeralSettingTimestamp: options.ephemeralOptions.eph_setting_ts?.toString()
|
|
948
618
|
};
|
|
949
619
|
}
|
|
950
|
-
message =
|
|
620
|
+
message = WAProto.Message.create(message);
|
|
951
621
|
const messageJSON = {
|
|
952
622
|
key: {
|
|
953
623
|
remoteJid: jid,
|
|
954
624
|
fromMe: true,
|
|
955
|
-
id:
|
|
625
|
+
id: options?.messageId || generateMessageIDV2()
|
|
956
626
|
},
|
|
957
627
|
message: message,
|
|
958
628
|
messageTimestamp: timestamp,
|
|
959
629
|
messageStubParameters: [],
|
|
960
|
-
participant:
|
|
961
|
-
status:
|
|
630
|
+
participant: isJidGroup(jid) || isJidStatusBroadcast(jid) ? userJid : undefined, // TODO: Add support for LIDs
|
|
631
|
+
status: WAMessageStatus.PENDING
|
|
962
632
|
};
|
|
963
|
-
return
|
|
633
|
+
return WAProto.WebMessageInfo.fromObject(messageJSON);
|
|
964
634
|
};
|
|
965
|
-
|
|
966
|
-
const generateWAMessage = async (jid, content, options) => {
|
|
967
|
-
var _a;
|
|
635
|
+
export const generateWAMessage = async (jid, content, options) => {
|
|
968
636
|
// ensure msg ID is with every log
|
|
969
|
-
options.logger =
|
|
970
|
-
|
|
637
|
+
options.logger = options?.logger?.child({ msgId: options.messageId });
|
|
638
|
+
// Pass jid in the options to generateWAMessageContent
|
|
639
|
+
return generateWAMessageFromContent(jid, await generateWAMessageContent(content, { ...options, jid }), options);
|
|
971
640
|
};
|
|
972
|
-
exports.generateWAMessage = generateWAMessage;
|
|
973
641
|
/** Get the key to access the true type of content */
|
|
974
|
-
const getContentType = (content) => {
|
|
642
|
+
export const getContentType = (content) => {
|
|
975
643
|
if (content) {
|
|
976
644
|
const keys = Object.keys(content);
|
|
977
645
|
const key = keys.find(k => (k === 'conversation' || k.includes('Message')) && k !== 'senderKeyDistributionMessage');
|
|
978
646
|
return key;
|
|
979
647
|
}
|
|
980
648
|
};
|
|
981
|
-
exports.getContentType = getContentType;
|
|
982
649
|
/**
|
|
983
650
|
* Normalizes ephemeral, view once messages to regular message content
|
|
984
651
|
* Eg. image messages in ephemeral messages, in view once messages etc.
|
|
985
652
|
* @param content
|
|
986
653
|
* @returns
|
|
987
654
|
*/
|
|
988
|
-
const normalizeMessageContent = (content) => {
|
|
655
|
+
export const normalizeMessageContent = (content) => {
|
|
989
656
|
if (!content) {
|
|
990
657
|
return undefined;
|
|
991
658
|
}
|
|
@@ -999,21 +666,22 @@ const normalizeMessageContent = (content) => {
|
|
|
999
666
|
}
|
|
1000
667
|
return content;
|
|
1001
668
|
function getFutureProofMessage(message) {
|
|
1002
|
-
return (
|
|
1003
|
-
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
|
|
1007
|
-
|
|
669
|
+
return (message?.ephemeralMessage ||
|
|
670
|
+
message?.viewOnceMessage ||
|
|
671
|
+
message?.documentWithCaptionMessage ||
|
|
672
|
+
message?.viewOnceMessageV2 ||
|
|
673
|
+
message?.viewOnceMessageV2Extension ||
|
|
674
|
+
message?.editedMessage ||
|
|
675
|
+
message?.associatedChildMessage ||
|
|
676
|
+
message?.groupStatusMessage ||
|
|
677
|
+
message?.groupStatusMessageV2);
|
|
1008
678
|
}
|
|
1009
679
|
};
|
|
1010
|
-
exports.normalizeMessageContent = normalizeMessageContent;
|
|
1011
680
|
/**
|
|
1012
681
|
* Extract the true message content from a message
|
|
1013
682
|
* Eg. extracts the inner message from a disappearing message/view once message
|
|
1014
683
|
*/
|
|
1015
|
-
const extractMessageContent = (content) => {
|
|
1016
|
-
var _a, _b, _c, _d, _e, _f;
|
|
684
|
+
export const extractMessageContent = (content) => {
|
|
1017
685
|
const extractFromTemplateMessage = (msg) => {
|
|
1018
686
|
if (msg.imageMessage) {
|
|
1019
687
|
return { imageMessage: msg.imageMessage };
|
|
@@ -1029,35 +697,39 @@ const extractMessageContent = (content) => {
|
|
|
1029
697
|
}
|
|
1030
698
|
else {
|
|
1031
699
|
return {
|
|
1032
|
-
conversation: 'contentText' in msg
|
|
1033
|
-
? msg.contentText
|
|
1034
|
-
: ('hydratedContentText' in msg ? msg.hydratedContentText : '')
|
|
700
|
+
conversation: 'contentText' in msg ? msg.contentText : 'hydratedContentText' in msg ? msg.hydratedContentText : ''
|
|
1035
701
|
};
|
|
1036
702
|
}
|
|
1037
703
|
};
|
|
1038
|
-
content =
|
|
1039
|
-
if (content
|
|
704
|
+
content = normalizeMessageContent(content);
|
|
705
|
+
if (content?.buttonsMessage) {
|
|
1040
706
|
return extractFromTemplateMessage(content.buttonsMessage);
|
|
1041
707
|
}
|
|
1042
|
-
if (
|
|
1043
|
-
return extractFromTemplateMessage(
|
|
708
|
+
if (content?.templateMessage?.hydratedFourRowTemplate) {
|
|
709
|
+
return extractFromTemplateMessage(content?.templateMessage?.hydratedFourRowTemplate);
|
|
1044
710
|
}
|
|
1045
|
-
if (
|
|
1046
|
-
return extractFromTemplateMessage(
|
|
711
|
+
if (content?.templateMessage?.hydratedTemplate) {
|
|
712
|
+
return extractFromTemplateMessage(content?.templateMessage?.hydratedTemplate);
|
|
1047
713
|
}
|
|
1048
|
-
if (
|
|
1049
|
-
return extractFromTemplateMessage(
|
|
714
|
+
if (content?.templateMessage?.fourRowTemplate) {
|
|
715
|
+
return extractFromTemplateMessage(content?.templateMessage?.fourRowTemplate);
|
|
1050
716
|
}
|
|
1051
717
|
return content;
|
|
1052
718
|
};
|
|
1053
|
-
exports.extractMessageContent = extractMessageContent;
|
|
1054
719
|
/**
|
|
1055
720
|
* Returns the device predicted by message ID
|
|
1056
721
|
*/
|
|
1057
|
-
const getDevice = (id) => /^3A.{18}$/.test(id)
|
|
1058
|
-
|
|
722
|
+
export const getDevice = (id) => /^3A.{18}$/.test(id)
|
|
723
|
+
? 'ios'
|
|
724
|
+
: /^3E.{20}$/.test(id)
|
|
725
|
+
? 'web'
|
|
726
|
+
: /^(.{21}|.{32})$/.test(id)
|
|
727
|
+
? 'android'
|
|
728
|
+
: /^(3F|.{18}$)/.test(id)
|
|
729
|
+
? 'desktop'
|
|
730
|
+
: 'unknown';
|
|
1059
731
|
/** Upserts a receipt in the message */
|
|
1060
|
-
const updateMessageWithReceipt = (msg, receipt) => {
|
|
732
|
+
export const updateMessageWithReceipt = (msg, receipt) => {
|
|
1061
733
|
msg.userReceipt = msg.userReceipt || [];
|
|
1062
734
|
const recp = msg.userReceipt.find(m => m.userJid === receipt.userJid);
|
|
1063
735
|
if (recp) {
|
|
@@ -1067,41 +739,43 @@ const updateMessageWithReceipt = (msg, receipt) => {
|
|
|
1067
739
|
msg.userReceipt.push(receipt);
|
|
1068
740
|
}
|
|
1069
741
|
};
|
|
1070
|
-
exports.updateMessageWithReceipt = updateMessageWithReceipt;
|
|
1071
742
|
/** Update the message with a new reaction */
|
|
1072
|
-
const updateMessageWithReaction = (msg, reaction) => {
|
|
1073
|
-
const authorID =
|
|
1074
|
-
const reactions = (msg.reactions || [])
|
|
1075
|
-
|
|
1076
|
-
|
|
1077
|
-
reactions.push(reaction);
|
|
1078
|
-
}
|
|
743
|
+
export const updateMessageWithReaction = (msg, reaction) => {
|
|
744
|
+
const authorID = getKeyAuthor(reaction.key);
|
|
745
|
+
const reactions = (msg.reactions || []).filter(r => getKeyAuthor(r.key) !== authorID);
|
|
746
|
+
reaction.text = reaction.text || '';
|
|
747
|
+
reactions.push(reaction);
|
|
1079
748
|
msg.reactions = reactions;
|
|
1080
749
|
};
|
|
1081
|
-
exports.updateMessageWithReaction = updateMessageWithReaction;
|
|
1082
750
|
/** Update the message with a new poll update */
|
|
1083
|
-
const updateMessageWithPollUpdate = (msg, update) => {
|
|
1084
|
-
|
|
1085
|
-
const
|
|
1086
|
-
|
|
1087
|
-
.filter(r => (0, generics_1.getKeyAuthor)(r.pollUpdateMessageKey) !== authorID);
|
|
1088
|
-
if ((_b = (_a = update.vote) === null || _a === void 0 ? void 0 : _a.selectedOptions) === null || _b === void 0 ? void 0 : _b.length) {
|
|
751
|
+
export const updateMessageWithPollUpdate = (msg, update) => {
|
|
752
|
+
const authorID = getKeyAuthor(update.pollUpdateMessageKey);
|
|
753
|
+
const reactions = (msg.pollUpdates || []).filter(r => getKeyAuthor(r.pollUpdateMessageKey) !== authorID);
|
|
754
|
+
if (update.vote?.selectedOptions?.length) {
|
|
1089
755
|
reactions.push(update);
|
|
1090
756
|
}
|
|
1091
757
|
msg.pollUpdates = reactions;
|
|
1092
758
|
};
|
|
1093
|
-
|
|
759
|
+
/** Update the message with a new event response */
|
|
760
|
+
export const updateMessageWithEventResponse = (msg, update) => {
|
|
761
|
+
const authorID = getKeyAuthor(update.eventResponseMessageKey);
|
|
762
|
+
const responses = (msg.eventResponses || []).filter(r => getKeyAuthor(r.eventResponseMessageKey) !== authorID);
|
|
763
|
+
responses.push(update);
|
|
764
|
+
msg.eventResponses = responses;
|
|
765
|
+
};
|
|
1094
766
|
/**
|
|
1095
767
|
* Aggregates all poll updates in a poll.
|
|
1096
768
|
* @param msg the poll creation message
|
|
1097
769
|
* @param meId your jid
|
|
1098
770
|
* @returns A list of options & their voters
|
|
1099
771
|
*/
|
|
1100
|
-
function getAggregateVotesInPollMessage({ message, pollUpdates }, meId) {
|
|
1101
|
-
|
|
1102
|
-
|
|
772
|
+
export function getAggregateVotesInPollMessage({ message, pollUpdates }, meId) {
|
|
773
|
+
const opts = message?.pollCreationMessage?.options ||
|
|
774
|
+
message?.pollCreationMessageV2?.options ||
|
|
775
|
+
message?.pollCreationMessageV3?.options ||
|
|
776
|
+
[];
|
|
1103
777
|
const voteHashMap = opts.reduce((acc, opt) => {
|
|
1104
|
-
const hash =
|
|
778
|
+
const hash = sha256(Buffer.from(opt.optionName || '')).toString();
|
|
1105
779
|
acc[hash] = {
|
|
1106
780
|
name: opt.optionName || '',
|
|
1107
781
|
voters: []
|
|
@@ -1123,14 +797,36 @@ function getAggregateVotesInPollMessage({ message, pollUpdates }, meId) {
|
|
|
1123
797
|
};
|
|
1124
798
|
data = voteHashMap[hash];
|
|
1125
799
|
}
|
|
1126
|
-
voteHashMap[hash].voters.push(
|
|
800
|
+
voteHashMap[hash].voters.push(getKeyAuthor(update.pollUpdateMessageKey, meId));
|
|
1127
801
|
}
|
|
1128
802
|
}
|
|
1129
803
|
return Object.values(voteHashMap);
|
|
1130
804
|
}
|
|
1131
|
-
|
|
805
|
+
/**
|
|
806
|
+
* Aggregates all event responses in an event message.
|
|
807
|
+
* @param msg the event creation message
|
|
808
|
+
* @param meId your jid
|
|
809
|
+
* @returns A list of response types & their responders
|
|
810
|
+
*/
|
|
811
|
+
export function getAggregateResponsesInEventMessage({ eventResponses }, meId) {
|
|
812
|
+
const responseTypes = ['GOING', 'NOT_GOING', 'MAYBE'];
|
|
813
|
+
const responseMap = {};
|
|
814
|
+
for (const type of responseTypes) {
|
|
815
|
+
responseMap[type] = {
|
|
816
|
+
response: type,
|
|
817
|
+
responders: []
|
|
818
|
+
};
|
|
819
|
+
}
|
|
820
|
+
for (const update of eventResponses || []) {
|
|
821
|
+
const responseType = update.eventResponse || 'UNKNOWN';
|
|
822
|
+
if (responseType !== 'UNKNOWN' && responseMap[responseType]) {
|
|
823
|
+
responseMap[responseType].responders.push(getKeyAuthor(update.eventResponseMessageKey, meId));
|
|
824
|
+
}
|
|
825
|
+
}
|
|
826
|
+
return Object.values(responseMap);
|
|
827
|
+
}
|
|
1132
828
|
/** Given a list of message keys, aggregates them by chat & sender. Useful for sending read receipts in bulk */
|
|
1133
|
-
const aggregateMessageKeysNotFromMe = (keys) => {
|
|
829
|
+
export const aggregateMessageKeysNotFromMe = (keys) => {
|
|
1134
830
|
const keyMap = {};
|
|
1135
831
|
for (const { remoteJid, id, participant, fromMe } of keys) {
|
|
1136
832
|
if (!fromMe) {
|
|
@@ -1147,40 +843,34 @@ const aggregateMessageKeysNotFromMe = (keys) => {
|
|
|
1147
843
|
}
|
|
1148
844
|
return Object.values(keyMap);
|
|
1149
845
|
};
|
|
1150
|
-
exports.aggregateMessageKeysNotFromMe = aggregateMessageKeysNotFromMe;
|
|
1151
846
|
const REUPLOAD_REQUIRED_STATUS = [410, 404];
|
|
1152
847
|
/**
|
|
1153
848
|
* Downloads the given message. Throws an error if it's not a media message
|
|
1154
849
|
*/
|
|
1155
|
-
const downloadMediaMessage = async (message, type, options, ctx) => {
|
|
1156
|
-
const result = await downloadMsg()
|
|
1157
|
-
|
|
1158
|
-
|
|
1159
|
-
|
|
1160
|
-
|
|
1161
|
-
|
|
1162
|
-
|
|
1163
|
-
|
|
1164
|
-
|
|
1165
|
-
message = await ctx.reuploadRequest(message);
|
|
1166
|
-
const result = await downloadMsg();
|
|
1167
|
-
return result;
|
|
1168
|
-
}
|
|
1169
|
-
}
|
|
850
|
+
export const downloadMediaMessage = async (message, type, options, ctx) => {
|
|
851
|
+
const result = await downloadMsg().catch(async (error) => {
|
|
852
|
+
if (ctx &&
|
|
853
|
+
typeof error?.status === 'number' && // treat errors with status as HTTP failures requiring reupload
|
|
854
|
+
REUPLOAD_REQUIRED_STATUS.includes(error.status)) {
|
|
855
|
+
ctx.logger.info({ key: message.key }, 'sending reupload media request...');
|
|
856
|
+
// request reupload
|
|
857
|
+
message = await ctx.reuploadRequest(message);
|
|
858
|
+
const result = await downloadMsg();
|
|
859
|
+
return result;
|
|
1170
860
|
}
|
|
1171
861
|
throw error;
|
|
1172
862
|
});
|
|
1173
863
|
return result;
|
|
1174
864
|
async function downloadMsg() {
|
|
1175
|
-
const mContent =
|
|
865
|
+
const mContent = extractMessageContent(message.message);
|
|
1176
866
|
if (!mContent) {
|
|
1177
|
-
throw new
|
|
867
|
+
throw new Boom('No message present', { statusCode: 400, data: message });
|
|
1178
868
|
}
|
|
1179
|
-
const contentType =
|
|
1180
|
-
let mediaType = contentType
|
|
869
|
+
const contentType = getContentType(mContent);
|
|
870
|
+
let mediaType = contentType?.replace('Message', '');
|
|
1181
871
|
const media = mContent[contentType];
|
|
1182
872
|
if (!media || typeof media !== 'object' || (!('url' in media) && !('thumbnailDirectPath' in media))) {
|
|
1183
|
-
throw new
|
|
873
|
+
throw new Boom(`"${contentType}" message is not a media message`);
|
|
1184
874
|
}
|
|
1185
875
|
let download;
|
|
1186
876
|
if ('thumbnailDirectPath' in media && !('url' in media)) {
|
|
@@ -1193,7 +883,7 @@ const downloadMediaMessage = async (message, type, options, ctx) => {
|
|
|
1193
883
|
else {
|
|
1194
884
|
download = media;
|
|
1195
885
|
}
|
|
1196
|
-
const stream = await
|
|
886
|
+
const stream = await downloadContentFromMessage(download, mediaType, options);
|
|
1197
887
|
if (type === 'buffer') {
|
|
1198
888
|
const bufferArray = [];
|
|
1199
889
|
for await (const chunk of stream) {
|
|
@@ -1204,18 +894,17 @@ const downloadMediaMessage = async (message, type, options, ctx) => {
|
|
|
1204
894
|
return stream;
|
|
1205
895
|
}
|
|
1206
896
|
};
|
|
1207
|
-
exports.downloadMediaMessage = downloadMediaMessage;
|
|
1208
897
|
/** Checks whether the given message is a media message; if it is returns the inner content */
|
|
1209
|
-
const assertMediaContent = (content) => {
|
|
1210
|
-
content =
|
|
1211
|
-
const mediaContent =
|
|
1212
|
-
|
|
1213
|
-
|
|
1214
|
-
|
|
1215
|
-
|
|
898
|
+
export const assertMediaContent = (content) => {
|
|
899
|
+
content = extractMessageContent(content);
|
|
900
|
+
const mediaContent = content?.documentMessage ||
|
|
901
|
+
content?.imageMessage ||
|
|
902
|
+
content?.videoMessage ||
|
|
903
|
+
content?.audioMessage ||
|
|
904
|
+
content?.stickerMessage;
|
|
1216
905
|
if (!mediaContent) {
|
|
1217
|
-
throw new
|
|
906
|
+
throw new Boom('given message is not a media message', { statusCode: 400, data: content });
|
|
1218
907
|
}
|
|
1219
908
|
return mediaContent;
|
|
1220
909
|
};
|
|
1221
|
-
|
|
910
|
+
//# sourceMappingURL=messages.js.map
|