@fer2809fl/baileys 1.4.9 → 7.0.0
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 -674
- package/README.md +556 -523
- package/WAProto/GenerateStatics.sh +3 -4
- package/WAProto/WAProto.proto +1215 -511
- package/WAProto/fix-imports.js +85 -0
- package/WAProto/index.d.ts +4347 -45387
- package/WAProto/index.js +65475 -137445
- package/engine-requirements.js +10 -0
- package/lib/Defaults/index.d.ts +34 -18
- package/lib/Defaults/index.d.ts.map +1 -0
- package/lib/Defaults/index.js +95 -67
- 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 +4 -4
- package/lib/Signal/Group/group_cipher.d.ts.map +1 -0
- package/lib/Signal/Group/group_cipher.js +37 -60
- 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 +7 -44
- package/lib/Signal/Group/keyhelper.js.map +1 -0
- package/lib/Signal/Group/sender-chain-key.d.ts +3 -2
- package/lib/Signal/Group/sender-chain-key.d.ts.map +1 -0
- package/lib/Signal/Group/sender-chain-key.js +7 -15
- 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 +8 -11
- 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 +9 -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 +3 -2
- package/lib/Signal/Group/sender-key-record.d.ts.map +1 -0
- package/lib/Signal/Group/sender-key-record.js +12 -37
- package/lib/Signal/Group/sender-key-record.js.map +1 -0
- package/lib/Signal/Group/sender-key-state.d.ts +7 -6
- package/lib/Signal/Group/sender-key-state.d.ts.map +1 -0
- package/lib/Signal/Group/sender-key-state.js +27 -42
- 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 +4 -7
- 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 +347 -90
- package/lib/Signal/libsignal.js.map +1 -0
- package/lib/Signal/lid-mapping.d.ts +23 -0
- package/lib/Signal/lid-mapping.d.ts.map +1 -0
- package/lib/Signal/lid-mapping.js +277 -0
- package/lib/Signal/lid-mapping.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 +4 -4
- 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 +3 -3
- package/lib/Socket/Client/websocket.d.ts.map +1 -0
- package/lib/Socket/Client/websocket.js +21 -78
- package/lib/Socket/Client/websocket.js.map +1 -0
- package/lib/Socket/business.d.ts +205 -93
- 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 +77 -28
- package/lib/Socket/chats.d.ts.map +1 -0
- package/lib/Socket/chats.js +639 -248
- package/lib/Socket/chats.js.map +1 -0
- package/lib/Socket/communities.d.ts +340 -0
- package/lib/Socket/communities.d.ts.map +1 -0
- package/lib/Socket/communities.js +434 -0
- package/lib/Socket/communities.js.map +1 -0
- package/lib/Socket/groups.d.ts +93 -46
- package/lib/Socket/groups.d.ts.map +1 -0
- package/lib/Socket/groups.js +260 -102
- package/lib/Socket/groups.js.map +1 -0
- package/lib/Socket/index.d.ts +253 -98
- package/lib/Socket/index.d.ts.map +1 -0
- package/lib/Socket/index.js +11 -9
- package/lib/Socket/index.js.map +1 -0
- package/lib/Socket/messages-recv.d.ts +192 -83
- package/lib/Socket/messages-recv.d.ts.map +1 -0
- package/lib/Socket/messages-recv.js +1314 -559
- package/lib/Socket/messages-recv.js.map +1 -0
- package/lib/Socket/messages-send.d.ts +190 -75
- package/lib/Socket/messages-send.d.ts.map +1 -0
- package/lib/Socket/messages-send.js +937 -581
- package/lib/Socket/messages-send.js.map +1 -0
- package/lib/Socket/mex.d.ts +4 -0
- package/lib/Socket/mex.d.ts.map +1 -0
- package/lib/Socket/mex.js +62 -0
- package/lib/Socket/mex.js.map +1 -0
- package/lib/Socket/newsletter.d.ts +129 -73
- package/lib/Socket/newsletter.d.ts.map +1 -0
- package/lib/Socket/newsletter.js +373 -222
- package/lib/Socket/newsletter.js.map +1 -0
- package/lib/Socket/smgss.d.ts +119 -0
- package/lib/Socket/smgss.d.ts.map +1 -0
- package/lib/Socket/smgss.js +453 -0
- package/lib/Socket/smgss.js.map +1 -0
- package/lib/Socket/socket.d.ts +59 -270
- package/lib/Socket/socket.d.ts.map +1 -0
- package/lib/Socket/socket.js +738 -326
- package/lib/Socket/socket.js.map +1 -0
- package/lib/Store/index.d.ts +4 -2
- package/lib/Store/index.d.ts.map +1 -0
- package/lib/Store/index.js +4 -8
- package/lib/Store/index.js.map +1 -0
- package/lib/Store/make-in-memory-store.d.ts +74 -60
- package/lib/Store/make-in-memory-store.d.ts.map +1 -0
- package/lib/Store/make-in-memory-store.js +130 -119
- package/lib/Store/make-in-memory-store.js.map +1 -0
- package/lib/Store/make-ordered-dictionary.d.ts +4 -3
- package/lib/Store/make-ordered-dictionary.d.ts.map +1 -0
- package/lib/Store/make-ordered-dictionary.js +5 -6
- package/lib/Store/make-ordered-dictionary.js.map +1 -0
- package/lib/Store/object-repository.d.ts +6 -3
- package/lib/Store/object-repository.d.ts.map +1 -0
- package/lib/Store/object-repository.js +2 -5
- package/lib/Store/object-repository.js.map +1 -0
- package/lib/Types/Auth.d.ts +19 -5
- 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 +3 -1
- 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 -9
- 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 +7 -4
- 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 +90 -33
- 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 +16 -9
- 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 +12 -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 +176 -148
- package/lib/Types/Message.d.ts.map +1 -0
- package/lib/Types/Message.js +15 -7
- package/lib/Types/Message.js.map +1 -0
- package/lib/Types/Mex.d.ts +154 -0
- package/lib/Types/Mex.d.ts.map +1 -0
- package/lib/Types/Mex.js +39 -0
- package/lib/Types/Mex.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 +32 -2
- 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 +46 -20
- 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 +79 -2
- package/lib/Types/State.d.ts.map +1 -0
- package/lib/Types/State.js +56 -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 +16 -14
- 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 +10 -4
- package/lib/Utils/auth-utils.d.ts.map +1 -0
- package/lib/Utils/auth-utils.js +242 -151
- 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 +29 -0
- package/lib/Utils/browser-utils.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 +66 -69
- package/lib/Utils/business.js.map +1 -0
- package/lib/Utils/button-handler.d.ts +28 -0
- package/lib/Utils/button-handler.d.ts.map +1 -0
- package/lib/Utils/button-handler.js +79 -90
- package/lib/Utils/button-handler.js.map +1 -0
- package/lib/Utils/chat-utils.d.ts +42 -12
- package/lib/Utils/chat-utils.d.ts.map +1 -0
- package/lib/Utils/chat-utils.js +380 -238
- package/lib/Utils/chat-utils.js.map +1 -0
- package/lib/Utils/companion-reg-client-utils.d.ts +17 -0
- package/lib/Utils/companion-reg-client-utils.d.ts.map +1 -0
- package/lib/Utils/companion-reg-client-utils.js +35 -0
- package/lib/Utils/companion-reg-client-utils.js.map +1 -0
- package/lib/Utils/crypto.d.ts +11 -14
- package/lib/Utils/crypto.d.ts.map +1 -0
- package/lib/Utils/crypto.js +41 -116
- package/lib/Utils/crypto.js.map +1 -0
- package/lib/Utils/decode-wa-message.d.ts +36 -5
- package/lib/Utils/decode-wa-message.d.ts.map +1 -0
- package/lib/Utils/decode-wa-message.js +173 -63
- package/lib/Utils/decode-wa-message.js.map +1 -0
- package/lib/Utils/event-buffer.d.ts +8 -7
- package/lib/Utils/event-buffer.d.ts.map +1 -0
- package/lib/Utils/event-buffer.js +174 -70
- package/lib/Utils/event-buffer.js.map +1 -0
- package/lib/Utils/generics.d.ts +20 -17
- package/lib/Utils/generics.d.ts.map +1 -0
- package/lib/Utils/generics.js +159 -207
- package/lib/Utils/generics.js.map +1 -0
- package/lib/Utils/history.d.ts +16 -11
- package/lib/Utils/history.d.ts.map +1 -0
- package/lib/Utils/history.js +93 -53
- package/lib/Utils/history.js.map +1 -0
- package/lib/Utils/identity-change-handler.d.ts +44 -0
- package/lib/Utils/identity-change-handler.d.ts.map +1 -0
- package/lib/Utils/identity-change-handler.js +50 -0
- package/lib/Utils/identity-change-handler.js.map +1 -0
- package/lib/Utils/index.d.ts +30 -18
- package/lib/Utils/index.d.ts.map +1 -0
- package/lib/Utils/index.js +30 -34
- package/lib/Utils/index.js.map +1 -0
- package/lib/Utils/interactive.d.ts +60 -0
- package/lib/Utils/interactive.d.ts.map +1 -0
- package/lib/Utils/interactive.js +87 -117
- package/lib/Utils/interactive.js.map +1 -0
- package/lib/Utils/link-preview.d.ts +4 -4
- package/lib/Utils/link-preview.d.ts.map +1 -0
- package/lib/Utils/link-preview.js +17 -58
- 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 -10
- 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-composer.d.ts +93 -0
- package/lib/Utils/message-composer.d.ts.map +1 -0
- package/lib/Utils/message-composer.js +311 -0
- package/lib/Utils/message-composer.js.map +1 -0
- package/lib/Utils/message-retry-manager.d.ts +115 -0
- package/lib/Utils/message-retry-manager.d.ts.map +1 -0
- package/lib/Utils/message-retry-manager.js +265 -0
- package/lib/Utils/message-retry-manager.js.map +1 -0
- package/lib/Utils/messages-media.d.ts +82 -40
- package/lib/Utils/messages-media.d.ts.map +1 -0
- package/lib/Utils/messages-media.js +674 -677
- package/lib/Utils/messages-media.js.map +1 -0
- package/lib/Utils/messages-newsletter.d.ts +74 -0
- package/lib/Utils/messages-newsletter.d.ts.map +1 -0
- package/lib/Utils/messages-newsletter.js +128 -0
- package/lib/Utils/messages-newsletter.js.map +1 -0
- package/lib/Utils/messages.d.ts +38 -14
- package/lib/Utils/messages.d.ts.map +1 -0
- package/lib/Utils/messages.js +835 -602
- package/lib/Utils/messages.js.map +1 -0
- package/lib/Utils/noise-handler.d.ts +9 -8
- package/lib/Utils/noise-handler.d.ts.map +1 -0
- package/lib/Utils/noise-handler.js +149 -98
- 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 -12
- package/lib/Utils/process-message.d.ts.map +1 -0
- package/lib/Utils/process-message.js +438 -230
- 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/shortcake-crypto.d.ts +36 -0
- package/lib/Utils/shortcake-crypto.d.ts.map +1 -0
- package/lib/Utils/shortcake-crypto.js +71 -0
- package/lib/Utils/shortcake-crypto.js.map +1 -0
- package/lib/Utils/shortcake.d.ts +36 -0
- package/lib/Utils/shortcake.d.ts.map +1 -0
- package/lib/Utils/shortcake.js +162 -0
- package/lib/Utils/shortcake.js.map +1 -0
- package/lib/Utils/signal.d.ts +20 -6
- package/lib/Utils/signal.d.ts.map +1 -0
- package/lib/Utils/signal.js +112 -64
- 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 +49 -0
- package/lib/Utils/sync-action-utils.js.map +1 -0
- package/lib/Utils/tc-token-utils.d.ts +37 -0
- package/lib/Utils/tc-token-utils.d.ts.map +1 -0
- package/lib/Utils/tc-token-utils.js +164 -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 +40 -64
- package/lib/Utils/use-multi-file-auth-state.js.map +1 -0
- package/lib/Utils/use-single-file-auth-state.d.ts +6 -0
- package/lib/Utils/use-single-file-auth-state.d.ts.map +1 -0
- package/lib/Utils/use-single-file-auth-state.js +111 -0
- package/lib/Utils/use-single-file-auth-state.js.map +1 -0
- package/lib/Utils/use-sqlite-auth-state.d.ts +14 -0
- package/lib/Utils/use-sqlite-auth-state.d.ts.map +1 -0
- package/lib/Utils/use-sqlite-auth-state.js +107 -0
- package/lib/Utils/use-sqlite-auth-state.js.map +1 -0
- package/lib/Utils/validate-connection.d.ts +5 -3
- package/lib/Utils/validate-connection.d.ts.map +1 -0
- package/lib/Utils/validate-connection.js +82 -101
- 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 +10 -12
- 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 +49 -52
- package/lib/WABinary/decode.js.map +1 -0
- package/lib/WABinary/encode.d.ts +2 -1
- package/lib/WABinary/encode.d.ts.map +1 -0
- package/lib/WABinary/encode.js +19 -49
- package/lib/WABinary/encode.js.map +1 -0
- package/lib/WABinary/generic-utils.d.ts +5 -4
- package/lib/WABinary/generic-utils.d.ts.map +1 -0
- package/lib/WABinary/generic-utils.js +46 -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 +32 -10
- package/lib/WABinary/jid-utils.d.ts.map +1 -0
- package/lib/WABinary/jid-utils.js +103 -59
- 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 +2 -1
- 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/WAUSync/Protocols/USyncContactProtocol.d.ts +4 -3
- package/lib/WAUSync/Protocols/USyncContactProtocol.d.ts.map +1 -0
- package/lib/WAUSync/Protocols/USyncContactProtocol.js +33 -13
- 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 +8 -11
- 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/USyncUsernameProtocol.d.ts +10 -0
- package/lib/WAUSync/Protocols/USyncUsernameProtocol.d.ts.map +1 -0
- package/lib/WAUSync/Protocols/USyncUsernameProtocol.js +25 -0
- package/lib/WAUSync/Protocols/USyncUsernameProtocol.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 +6 -4
- package/lib/WAUSync/Protocols/index.d.ts.map +1 -0
- package/lib/WAUSync/Protocols/index.js +6 -20
- package/lib/WAUSync/Protocols/index.js.map +1 -0
- package/lib/WAUSync/USyncQuery.d.ts +6 -4
- package/lib/WAUSync/USyncQuery.d.ts.map +1 -0
- package/lib/WAUSync/USyncQuery.js +44 -35
- package/lib/WAUSync/USyncQuery.js.map +1 -0
- package/lib/WAUSync/USyncUser.d.ts +10 -5
- package/lib/WAUSync/USyncUser.d.ts.map +1 -0
- package/lib/WAUSync/USyncUser.js +10 -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 +12 -15
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +15 -48
- package/lib/index.js.map +1 -0
- package/package.json +44 -64
- package/WAProto/index.ts.ts +0 -53473
- package/WAProto/n +0 -1
- package/lib/Baileys.jpeg +0 -0
- package/lib/Defaults/baileys-version.json +0 -3
- package/lib/Defaults/n +0 -1
- package/lib/Signal/Group/queue-job.d.ts +0 -1
- package/lib/Signal/Group/queue-job.js +0 -57
- package/lib/Signal/n +0 -1
- package/lib/Socket/Client/n +0 -1
- package/lib/Socket/n +0 -1
- package/lib/Socket/setup.js +0 -480
- package/lib/Socket/setup.ts +0 -622
- package/lib/Socket/usync.d.ts +0 -36
- package/lib/Socket/usync.js +0 -70
- package/lib/Store/n +0 -1
- package/lib/Types/Newsletter.d.ts +0 -79
- package/lib/Types/Newsletter.js +0 -18
- package/lib/Types/n +0 -1
- package/lib/Utils/baileys-event-stream.d.ts +0 -16
- package/lib/Utils/baileys-event-stream.js +0 -63
- package/lib/Utils/error-handler.js +0 -37
- package/lib/Utils/n +0 -1
- package/lib/WABinary/jid-utils.js.bak +0 -83
- package/lib/WABinary/n +0 -1
- package/lib/WAM/n +0 -1
- package/lib/WAUSync/Protocols/n +0 -1
- package/lib/WAUSync/n +0 -1
- package/lib/n +0 -1
package/lib/Utils/messages.js
CHANGED
|
@@ -1,58 +1,51 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
};
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
const Types_1 = require("../Types");
|
|
16
|
-
const WABinary_1 = require("../WABinary");
|
|
17
|
-
const crypto_2 = require("./crypto");
|
|
18
|
-
const generics_1 = require("./generics");
|
|
19
|
-
const messages_media_1 = require("./messages-media");
|
|
1
|
+
import { Boom } from '@hapi/boom';
|
|
2
|
+
import { createCipheriv, createHash, createHmac, randomBytes } from 'crypto';
|
|
3
|
+
import { promises as fs } from 'fs';
|
|
4
|
+
import { tmpdir } from 'os';
|
|
5
|
+
import { join } from 'path';
|
|
6
|
+
import {} from 'stream';
|
|
7
|
+
import { proto } from '../../WAProto/index.js';
|
|
8
|
+
import { CALL_AUDIO_PREFIX, CALL_VIDEO_PREFIX, MEDIA_KEYS, URL_REGEX, WA_DEFAULT_EPHEMERAL } from '../Defaults/index.js';
|
|
9
|
+
import { ButtonHeaderType, ButtonType, CarouselCardType, ListType, WAMessageStatus, WAProto } from '../Types/index.js';
|
|
10
|
+
import { isJidGroup, isJidNewsletter, isJidStatusBroadcast, jidDecode, jidEncode, jidNormalizedUser } from '../WABinary/index.js';
|
|
11
|
+
import { sha256 } from './crypto.js';
|
|
12
|
+
import { generateMessageIDV2, getKeyAuthor, unixTimestampSeconds } from './generics.js';
|
|
13
|
+
import { downloadContentFromMessage, encryptedStream, generateThumbnail, getAudioDuration, getAudioWaveform, getMediaKeys, getRawMediaUploadData, getStream, toBuffer } from './messages-media.js';
|
|
14
|
+
import { shouldIncludeReportingToken } from './reporting-utils.js';
|
|
20
15
|
const MIMETYPE_MAP = {
|
|
21
16
|
image: 'image/jpeg',
|
|
22
17
|
video: 'video/mp4',
|
|
23
18
|
document: 'application/pdf',
|
|
24
19
|
audio: 'audio/ogg; codecs=opus',
|
|
25
20
|
sticker: 'image/webp',
|
|
26
|
-
'product-catalog-image': 'image/jpeg'
|
|
21
|
+
'product-catalog-image': 'image/jpeg'
|
|
27
22
|
};
|
|
28
23
|
const MessageTypeProto = {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
24
|
+
image: WAProto.Message.ImageMessage,
|
|
25
|
+
video: WAProto.Message.VideoMessage,
|
|
26
|
+
audio: WAProto.Message.AudioMessage,
|
|
27
|
+
sticker: WAProto.Message.StickerMessage,
|
|
28
|
+
document: WAProto.Message.DocumentMessage
|
|
34
29
|
};
|
|
35
|
-
const ButtonType = WAProto_1.proto.Message.ButtonsMessage.HeaderType;
|
|
36
30
|
/**
|
|
37
31
|
* Uses a regex to test whether the string contains a URL, and returns the URL if it does.
|
|
38
32
|
* @param text eg. hello https://google.com
|
|
39
33
|
* @returns the URL, eg. https://google.com
|
|
40
34
|
*/
|
|
41
|
-
const extractUrlFromText = (text) =>
|
|
42
|
-
|
|
43
|
-
const
|
|
44
|
-
const url = (0, exports.extractUrlFromText)(text);
|
|
35
|
+
export const extractUrlFromText = (text) => text.match(URL_REGEX)?.[0];
|
|
36
|
+
export const generateLinkPreviewIfRequired = async (text, getUrlInfo, logger) => {
|
|
37
|
+
const url = extractUrlFromText(text);
|
|
45
38
|
if (!!getUrlInfo && url) {
|
|
46
39
|
try {
|
|
47
40
|
const urlInfo = await getUrlInfo(url);
|
|
48
41
|
return urlInfo;
|
|
49
42
|
}
|
|
50
|
-
catch (error) {
|
|
51
|
-
|
|
43
|
+
catch (error) {
|
|
44
|
+
// ignore if fails
|
|
45
|
+
logger?.warn({ trace: error.stack }, 'url generation failed');
|
|
52
46
|
}
|
|
53
47
|
}
|
|
54
48
|
};
|
|
55
|
-
exports.generateLinkPreviewIfRequired = generateLinkPreviewIfRequired;
|
|
56
49
|
const assertColor = async (color) => {
|
|
57
50
|
let assertedColor;
|
|
58
51
|
if (typeof color === 'number') {
|
|
@@ -67,241 +60,625 @@ const assertColor = async (color) => {
|
|
|
67
60
|
return assertedColor;
|
|
68
61
|
}
|
|
69
62
|
};
|
|
70
|
-
const
|
|
63
|
+
const isWebPBuffer = (buf) => buf.length >= 12 &&
|
|
64
|
+
buf[0] === 0x52 &&
|
|
65
|
+
buf[1] === 0x49 &&
|
|
66
|
+
buf[2] === 0x46 &&
|
|
67
|
+
buf[3] === 0x46 &&
|
|
68
|
+
buf[8] === 0x57 &&
|
|
69
|
+
buf[9] === 0x45 &&
|
|
70
|
+
buf[10] === 0x42 &&
|
|
71
|
+
buf[11] === 0x50;
|
|
72
|
+
const isAnimatedWebP = (buf) => {
|
|
73
|
+
if (!isWebPBuffer(buf)) {
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
76
|
+
let offset = 12;
|
|
77
|
+
while (offset < buf.length - 8) {
|
|
78
|
+
const fourCC = buf.toString('ascii', offset, offset + 4);
|
|
79
|
+
const chunkSize = buf.readUInt32LE(offset + 4);
|
|
80
|
+
if (fourCC === 'VP8X') {
|
|
81
|
+
const flagsOffset = offset + 8;
|
|
82
|
+
if (flagsOffset < buf.length && (buf[flagsOffset] & 0x02) !== 0) {
|
|
83
|
+
return true;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
else if (fourCC === 'ANIM' || fourCC === 'ANMF') {
|
|
87
|
+
return true;
|
|
88
|
+
}
|
|
89
|
+
offset += 8 + chunkSize + (chunkSize % 2);
|
|
90
|
+
}
|
|
91
|
+
return false;
|
|
92
|
+
};
|
|
93
|
+
const encryptMediaBuffer = async (buf, mediaKey) => {
|
|
94
|
+
const { cipherKey, iv, macKey } = await getMediaKeys(mediaKey, 'sticker-pack');
|
|
95
|
+
const aes = createCipheriv('aes-256-cbc', cipherKey, iv);
|
|
96
|
+
const hmac = createHmac('sha256', macKey).update(iv);
|
|
97
|
+
const encPart1 = aes.update(buf);
|
|
98
|
+
const encPart2 = aes.final();
|
|
99
|
+
hmac.update(encPart1).update(encPart2);
|
|
100
|
+
const mac = hmac.digest().subarray(0, 10);
|
|
101
|
+
const encBody = Buffer.concat([encPart1, encPart2, mac]);
|
|
102
|
+
const fileEncSha256 = createHash('sha256').update(encPart1).update(encPart2).update(mac).digest();
|
|
103
|
+
const fileSha256 = createHash('sha256').update(buf).digest();
|
|
104
|
+
return { encBody, fileSha256, fileEncSha256 };
|
|
105
|
+
};
|
|
106
|
+
export const generateStickerPackMessage = async (stickerPack, options) => {
|
|
107
|
+
const { stickers, cover, name, publisher, packId, description } = stickerPack;
|
|
108
|
+
if (!stickers || stickers.length === 0) {
|
|
109
|
+
throw new Boom('Sticker pack must contain at least one sticker', { statusCode: 400 });
|
|
110
|
+
}
|
|
111
|
+
if (stickers.length > 120) {
|
|
112
|
+
throw new Boom('Sticker pack exceeds the maximum limit of 120 stickers', { statusCode: 400 });
|
|
113
|
+
}
|
|
114
|
+
const [sharpLib, jimpLib] = await Promise.all([
|
|
115
|
+
import('sharp').catch(() => null),
|
|
116
|
+
import('jimp').catch(() => null)
|
|
117
|
+
]);
|
|
118
|
+
const stickerPackId = packId || generateMessageIDV2();
|
|
119
|
+
const stickerData = {};
|
|
120
|
+
const stickerMetadata = await Promise.all(stickers.map(async (s, i) => {
|
|
121
|
+
const source = s.sticker ?? s.data;
|
|
122
|
+
if (!source) {
|
|
123
|
+
throw new Boom(`Sticker at index ${i} is missing its image data`, { statusCode: 400 });
|
|
124
|
+
}
|
|
125
|
+
const { stream } = await getStream(source);
|
|
126
|
+
const buffer = await toBuffer(stream);
|
|
127
|
+
let webpBuffer;
|
|
128
|
+
let isAnimated = false;
|
|
129
|
+
if (isWebPBuffer(buffer)) {
|
|
130
|
+
webpBuffer = buffer;
|
|
131
|
+
isAnimated = isAnimatedWebP(buffer);
|
|
132
|
+
}
|
|
133
|
+
else if (sharpLib) {
|
|
134
|
+
webpBuffer = await sharpLib.default(buffer).webp().toBuffer();
|
|
135
|
+
}
|
|
136
|
+
else if (jimpLib) {
|
|
137
|
+
const Jimp = jimpLib.Jimp || jimpLib.default;
|
|
138
|
+
const jimpImage = await Jimp.read(buffer);
|
|
139
|
+
webpBuffer = await jimpImage
|
|
140
|
+
.resize({ w: 512, h: 512, mode: jimpLib.ResizeStrategy?.BILINEAR })
|
|
141
|
+
.getBuffer('image/webp');
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
webpBuffer = buffer;
|
|
145
|
+
}
|
|
146
|
+
if (webpBuffer.length > 1024 * 1024) {
|
|
147
|
+
throw new Boom(`Sticker at index ${i} exceeds the 1MB size limit`, { statusCode: 400 });
|
|
148
|
+
}
|
|
149
|
+
const fileName = `${i + 1}.webp`;
|
|
150
|
+
stickerData[fileName] = [new Uint8Array(webpBuffer), { level: 0 }];
|
|
151
|
+
return {
|
|
152
|
+
fileName,
|
|
153
|
+
mimetype: 'image/webp',
|
|
154
|
+
isAnimated: s.isAnimated !== undefined ? s.isAnimated : isAnimated,
|
|
155
|
+
isLottie: s.isLottie || false,
|
|
156
|
+
emojis: s.emojis || [],
|
|
157
|
+
accessibilityLabel: s.accessibilityLabel || ''
|
|
158
|
+
};
|
|
159
|
+
}));
|
|
160
|
+
const { stream: coverStream } = await getStream(cover);
|
|
161
|
+
const coverBuffer = await toBuffer(coverStream);
|
|
162
|
+
const coverFileName = `${stickerPackId}.webp`;
|
|
163
|
+
stickerData[coverFileName] = [new Uint8Array(coverBuffer), { level: 0 }];
|
|
164
|
+
const { zipSync } = await import('fflate');
|
|
165
|
+
const zipBuffer = Buffer.from(zipSync(stickerData));
|
|
166
|
+
const mediaKey = randomBytes(32);
|
|
167
|
+
const zipEnc = await encryptMediaBuffer(zipBuffer, mediaKey);
|
|
168
|
+
const zipEncPath = join(tmpdir(), 'stickerpack_' + stickerPackId);
|
|
169
|
+
await fs.writeFile(zipEncPath, zipEnc.encBody);
|
|
170
|
+
let stickerPackUploadResult;
|
|
171
|
+
try {
|
|
172
|
+
stickerPackUploadResult = await options.upload(zipEncPath, {
|
|
173
|
+
fileEncSha256B64: zipEnc.fileEncSha256.toString('base64'),
|
|
174
|
+
mediaType: 'sticker-pack',
|
|
175
|
+
timeoutMs: options.mediaUploadTimeoutMs
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
finally {
|
|
179
|
+
await fs.unlink(zipEncPath).catch(() => { });
|
|
180
|
+
}
|
|
181
|
+
const thumbEnc = await encryptMediaBuffer(coverBuffer, mediaKey);
|
|
182
|
+
const thumbEncPath = join(tmpdir(), 'stickerthumb_' + stickerPackId);
|
|
183
|
+
await fs.writeFile(thumbEncPath, thumbEnc.encBody);
|
|
184
|
+
let thumbUploadResult;
|
|
185
|
+
try {
|
|
186
|
+
thumbUploadResult = await options.upload(thumbEncPath, {
|
|
187
|
+
fileEncSha256B64: thumbEnc.fileEncSha256.toString('base64'),
|
|
188
|
+
mediaType: 'thumbnail-sticker-pack',
|
|
189
|
+
timeoutMs: options.mediaUploadTimeoutMs
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
finally {
|
|
193
|
+
await fs.unlink(thumbEncPath).catch(() => { });
|
|
194
|
+
}
|
|
195
|
+
const imageDataHash = sha256(coverBuffer).toString('base64');
|
|
196
|
+
return {
|
|
197
|
+
name,
|
|
198
|
+
publisher,
|
|
199
|
+
stickerPackId,
|
|
200
|
+
packDescription: description,
|
|
201
|
+
stickerPackOrigin: proto.Message.StickerPackMessage.StickerPackOrigin.USER_CREATED,
|
|
202
|
+
stickerPackSize: zipBuffer.length,
|
|
203
|
+
stickers: stickerMetadata,
|
|
204
|
+
fileSha256: zipEnc.fileSha256,
|
|
205
|
+
fileEncSha256: zipEnc.fileEncSha256,
|
|
206
|
+
mediaKey,
|
|
207
|
+
directPath: stickerPackUploadResult.directPath,
|
|
208
|
+
fileLength: zipBuffer.length,
|
|
209
|
+
mediaKeyTimestamp: unixTimestampSeconds(),
|
|
210
|
+
trayIconFileName: coverFileName,
|
|
211
|
+
imageDataHash,
|
|
212
|
+
thumbnailDirectPath: thumbUploadResult.directPath,
|
|
213
|
+
thumbnailSha256: thumbEnc.fileSha256,
|
|
214
|
+
thumbnailEncSha256: thumbEnc.fileEncSha256,
|
|
215
|
+
thumbnailHeight: 96,
|
|
216
|
+
thumbnailWidth: 96
|
|
217
|
+
};
|
|
218
|
+
};
|
|
219
|
+
export const prepareWAMessageMedia = async (message, options) => {
|
|
71
220
|
const logger = options.logger;
|
|
72
221
|
let mediaType;
|
|
73
|
-
for (const key of
|
|
222
|
+
for (const key of MEDIA_KEYS) {
|
|
74
223
|
if (key in message) {
|
|
75
224
|
mediaType = key;
|
|
76
225
|
}
|
|
77
226
|
}
|
|
78
227
|
if (!mediaType) {
|
|
79
|
-
throw new
|
|
228
|
+
throw new Boom('Invalid media type', { statusCode: 400 });
|
|
80
229
|
}
|
|
81
230
|
const uploadData = {
|
|
82
231
|
...message,
|
|
83
|
-
...(message.annotations ? {
|
|
84
|
-
annotations: message.annotations
|
|
85
|
-
} : {
|
|
86
|
-
annotations: [
|
|
87
|
-
{
|
|
88
|
-
polygonVertices: [
|
|
89
|
-
{
|
|
90
|
-
x: 60.71664810180664,
|
|
91
|
-
y: -36.39784622192383
|
|
92
|
-
},
|
|
93
|
-
{
|
|
94
|
-
x: -16.710189819335938,
|
|
95
|
-
y: 49.263675689697266
|
|
96
|
-
},
|
|
97
|
-
{
|
|
98
|
-
x: -56.585853576660156,
|
|
99
|
-
y: 37.85963439941406
|
|
100
|
-
},
|
|
101
|
-
{
|
|
102
|
-
x: 20.840980529785156,
|
|
103
|
-
y: -47.80188751220703
|
|
104
|
-
}
|
|
105
|
-
],
|
|
106
|
-
newsletter: {
|
|
107
|
-
newsletterJid: "120363399175402285@newsletter",
|
|
108
|
-
serverMessageId: 0,
|
|
109
|
-
newsletterName: "Asta",
|
|
110
|
-
contentType: "UPDATE",
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
]
|
|
114
|
-
}),
|
|
115
232
|
media: message[mediaType]
|
|
116
233
|
};
|
|
117
234
|
delete uploadData[mediaType];
|
|
118
235
|
// check if cacheable + generate cache key
|
|
119
236
|
const cacheableKey = typeof uploadData.media === 'object' &&
|
|
120
|
-
|
|
237
|
+
'url' in uploadData.media &&
|
|
121
238
|
!!uploadData.media.url &&
|
|
122
|
-
!!options.mediaCache &&
|
|
123
|
-
|
|
124
|
-
mediaType + ':' + uploadData.media.url.toString());
|
|
239
|
+
!!options.mediaCache &&
|
|
240
|
+
mediaType + ':' + uploadData.media.url.toString();
|
|
125
241
|
if (mediaType === 'document' && !uploadData.fileName) {
|
|
126
242
|
uploadData.fileName = 'file';
|
|
127
243
|
}
|
|
128
244
|
if (!uploadData.mimetype) {
|
|
129
245
|
uploadData.mimetype = MIMETYPE_MAP[mediaType];
|
|
130
246
|
}
|
|
131
|
-
// check for cache hit
|
|
132
247
|
if (cacheableKey) {
|
|
133
|
-
const mediaBuff = options.mediaCache.get(cacheableKey);
|
|
248
|
+
const mediaBuff = await options.mediaCache.get(cacheableKey);
|
|
134
249
|
if (mediaBuff) {
|
|
135
|
-
logger
|
|
136
|
-
const obj =
|
|
250
|
+
logger?.debug({ cacheableKey }, 'got media cache hit');
|
|
251
|
+
const obj = proto.Message.decode(mediaBuff);
|
|
137
252
|
const key = `${mediaType}Message`;
|
|
138
253
|
Object.assign(obj[key], { ...uploadData, media: undefined });
|
|
139
254
|
return obj;
|
|
140
255
|
}
|
|
141
256
|
}
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
(
|
|
145
|
-
|
|
257
|
+
const isNewsletter = !!options.jid && isJidNewsletter(options.jid);
|
|
258
|
+
if (isNewsletter) {
|
|
259
|
+
logger?.info({ key: cacheableKey }, 'Preparing raw media for newsletter');
|
|
260
|
+
const { filePath, fileSha256, fileLength } = await getRawMediaUploadData(uploadData.media, options.mediaTypeOverride || mediaType, logger);
|
|
261
|
+
const fileSha256B64 = fileSha256.toString('base64');
|
|
262
|
+
const { mediaUrl, directPath } = await options.upload(filePath, {
|
|
263
|
+
fileEncSha256B64: fileSha256B64,
|
|
264
|
+
mediaType: mediaType,
|
|
265
|
+
timeoutMs: options.mediaUploadTimeoutMs
|
|
266
|
+
});
|
|
267
|
+
await fs.unlink(filePath);
|
|
268
|
+
const obj = WAProto.Message.fromObject({
|
|
269
|
+
// todo: add more support here
|
|
270
|
+
[`${mediaType}Message`]: MessageTypeProto[mediaType].fromObject({
|
|
271
|
+
url: mediaUrl,
|
|
272
|
+
directPath,
|
|
273
|
+
fileSha256,
|
|
274
|
+
fileLength,
|
|
275
|
+
...uploadData,
|
|
276
|
+
media: undefined
|
|
277
|
+
})
|
|
278
|
+
});
|
|
279
|
+
if (uploadData.ptv) {
|
|
280
|
+
obj.ptvMessage = obj.videoMessage;
|
|
281
|
+
delete obj.videoMessage;
|
|
282
|
+
}
|
|
283
|
+
if (obj.stickerMessage) {
|
|
284
|
+
obj.stickerMessage.stickerSentTs = Date.now();
|
|
285
|
+
}
|
|
286
|
+
if (cacheableKey) {
|
|
287
|
+
logger?.debug({ cacheableKey }, 'set cache');
|
|
288
|
+
await options.mediaCache.set(cacheableKey, WAProto.Message.encode(obj).finish());
|
|
289
|
+
}
|
|
290
|
+
return obj;
|
|
291
|
+
}
|
|
292
|
+
const requiresDurationComputation = mediaType === 'audio' && typeof uploadData.seconds === 'undefined';
|
|
293
|
+
const requiresThumbnailComputation = (mediaType === 'image' || mediaType === 'video') && typeof uploadData['jpegThumbnail'] === 'undefined';
|
|
294
|
+
const requiresWaveformProcessing = mediaType === 'audio' && uploadData.ptt === true && typeof uploadData.waveform === 'undefined';
|
|
146
295
|
const requiresAudioBackground = options.backgroundColor && mediaType === 'audio' && uploadData.ptt === true;
|
|
147
296
|
const requiresOriginalForSomeProcessing = requiresDurationComputation || requiresThumbnailComputation;
|
|
148
|
-
|
|
149
|
-
const { mediaKey, encWriteStream, bodyPath, fileEncSha256, fileSha256, fileLength, didSaveToTmpPath, opusConverted } = await (options.newsletter ? messages_media_1.prepareStream : messages_media_1.encryptedStream)(uploadData.media, options.mediaTypeOverride || mediaType, {
|
|
297
|
+
const { mediaKey, encFilePath, originalFilePath, fileEncSha256, fileSha256, fileLength } = await encryptedStream(uploadData.media, options.mediaTypeOverride || mediaType, {
|
|
150
298
|
logger,
|
|
151
299
|
saveOriginalFileIfRequired: requiresOriginalForSomeProcessing,
|
|
152
|
-
opts: options.options
|
|
153
|
-
isPtt: uploadData.ptt,
|
|
154
|
-
forceOpus: (mediaType === "audio" && uploadData.mimetype && uploadData.mimetype.includes('opus'))
|
|
300
|
+
opts: options.options
|
|
155
301
|
});
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
uploadData.mimetype = 'audio/ogg; codecs=opus';
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
const fileEncSha256B64 = (options.newsletter ? fileSha256 : fileEncSha256 !== null && fileEncSha256 !== void 0 ? fileEncSha256 : fileSha256).toString('base64');
|
|
162
|
-
|
|
163
|
-
const [{ mediaUrl, directPath, handle }] = await Promise.all([
|
|
302
|
+
const fileEncSha256B64 = fileEncSha256.toString('base64');
|
|
303
|
+
const [{ mediaUrl, directPath }] = await Promise.all([
|
|
164
304
|
(async () => {
|
|
165
|
-
const result = await options.upload(
|
|
166
|
-
|
|
305
|
+
const result = await options.upload(encFilePath, {
|
|
306
|
+
fileEncSha256B64,
|
|
307
|
+
mediaType,
|
|
308
|
+
timeoutMs: options.mediaUploadTimeoutMs
|
|
309
|
+
});
|
|
310
|
+
logger?.debug({ mediaType, cacheableKey }, 'uploaded media');
|
|
167
311
|
return result;
|
|
168
312
|
})(),
|
|
169
313
|
(async () => {
|
|
170
314
|
try {
|
|
171
315
|
if (requiresThumbnailComputation) {
|
|
172
|
-
const { thumbnail, originalImageDimensions } = await
|
|
316
|
+
const { thumbnail, originalImageDimensions } = await generateThumbnail(originalFilePath, mediaType, options);
|
|
173
317
|
uploadData.jpegThumbnail = thumbnail;
|
|
174
318
|
if (!uploadData.width && originalImageDimensions) {
|
|
175
319
|
uploadData.width = originalImageDimensions.width;
|
|
176
320
|
uploadData.height = originalImageDimensions.height;
|
|
177
|
-
logger
|
|
321
|
+
logger?.debug('set dimensions');
|
|
178
322
|
}
|
|
179
|
-
logger
|
|
323
|
+
logger?.debug('generated thumbnail');
|
|
180
324
|
}
|
|
181
325
|
if (requiresDurationComputation) {
|
|
182
|
-
uploadData.seconds = await
|
|
183
|
-
logger
|
|
326
|
+
uploadData.seconds = await getAudioDuration(originalFilePath);
|
|
327
|
+
logger?.debug('computed audio duration');
|
|
184
328
|
}
|
|
185
329
|
if (requiresWaveformProcessing) {
|
|
186
|
-
uploadData.waveform = await
|
|
187
|
-
logger
|
|
330
|
+
uploadData.waveform = await getAudioWaveform(originalFilePath, logger);
|
|
331
|
+
logger?.debug('processed waveform');
|
|
188
332
|
}
|
|
189
333
|
if (requiresAudioBackground) {
|
|
190
334
|
uploadData.backgroundArgb = await assertColor(options.backgroundColor);
|
|
191
|
-
logger
|
|
335
|
+
logger?.debug('computed backgroundColor audio status');
|
|
192
336
|
}
|
|
193
337
|
}
|
|
194
338
|
catch (error) {
|
|
195
|
-
logger
|
|
339
|
+
logger?.warn({ trace: error.stack }, 'failed to obtain extra info');
|
|
196
340
|
}
|
|
197
|
-
})()
|
|
198
|
-
])
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
// remove tmp files
|
|
204
|
-
if (didSaveToTmpPath && bodyPath) {
|
|
205
|
-
try {
|
|
206
|
-
await fs_1.promises.access(bodyPath);
|
|
207
|
-
await fs_1.promises.unlink(bodyPath);
|
|
208
|
-
logger === null || logger === void 0 ? void 0 : logger.debug('removed tmp file');
|
|
209
|
-
}
|
|
210
|
-
catch (error) {
|
|
211
|
-
logger === null || logger === void 0 ? void 0 : logger.warn('failed to remove tmp file');
|
|
341
|
+
})()
|
|
342
|
+
]).finally(async () => {
|
|
343
|
+
try {
|
|
344
|
+
await fs.unlink(encFilePath);
|
|
345
|
+
if (originalFilePath) {
|
|
346
|
+
await fs.unlink(originalFilePath);
|
|
212
347
|
}
|
|
348
|
+
logger?.debug('removed tmp files');
|
|
349
|
+
}
|
|
350
|
+
catch (error) {
|
|
351
|
+
logger?.warn('failed to remove tmp file');
|
|
213
352
|
}
|
|
214
353
|
});
|
|
215
|
-
const obj =
|
|
354
|
+
const obj = WAProto.Message.fromObject({
|
|
216
355
|
[`${mediaType}Message`]: MessageTypeProto[mediaType].fromObject({
|
|
217
|
-
url:
|
|
356
|
+
url: mediaUrl,
|
|
218
357
|
directPath,
|
|
219
|
-
mediaKey
|
|
220
|
-
fileEncSha256
|
|
358
|
+
mediaKey,
|
|
359
|
+
fileEncSha256,
|
|
221
360
|
fileSha256,
|
|
222
361
|
fileLength,
|
|
223
|
-
mediaKeyTimestamp:
|
|
362
|
+
mediaKeyTimestamp: unixTimestampSeconds(),
|
|
224
363
|
...uploadData,
|
|
225
364
|
media: undefined
|
|
226
365
|
})
|
|
227
366
|
});
|
|
228
|
-
|
|
229
|
-
// START PERBAIKAN PTV UNTUK CHANNEL
|
|
230
367
|
if (uploadData.ptv) {
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
obj.videoMessage = obj.videoMessage;
|
|
234
|
-
obj.videoMessage.viewOnce = true;
|
|
235
|
-
} else {
|
|
236
|
-
// Untuk chat biasa, gunakan ptvMessage
|
|
237
|
-
obj.ptvMessage = obj.videoMessage;
|
|
238
|
-
delete obj.videoMessage;
|
|
239
|
-
}
|
|
368
|
+
obj.ptvMessage = obj.videoMessage;
|
|
369
|
+
delete obj.videoMessage;
|
|
240
370
|
}
|
|
241
|
-
// END PERBAIKAN PTV UNTUK CHANNEL
|
|
242
|
-
|
|
243
371
|
if (cacheableKey) {
|
|
244
|
-
logger
|
|
245
|
-
options.mediaCache.set(cacheableKey,
|
|
372
|
+
logger?.debug({ cacheableKey }, 'set cache');
|
|
373
|
+
await options.mediaCache.set(cacheableKey, WAProto.Message.encode(obj).finish());
|
|
246
374
|
}
|
|
247
375
|
return obj;
|
|
248
376
|
};
|
|
249
|
-
|
|
250
|
-
const prepareDisappearingMessageSettingContent = (ephemeralExpiration) => {
|
|
377
|
+
export const prepareDisappearingMessageSettingContent = (ephemeralExpiration) => {
|
|
251
378
|
ephemeralExpiration = ephemeralExpiration || 0;
|
|
252
379
|
const content = {
|
|
253
380
|
ephemeralMessage: {
|
|
254
381
|
message: {
|
|
255
382
|
protocolMessage: {
|
|
256
|
-
type:
|
|
383
|
+
type: WAProto.Message.ProtocolMessage.Type.EPHEMERAL_SETTING,
|
|
257
384
|
ephemeralExpiration
|
|
258
385
|
}
|
|
259
386
|
}
|
|
260
387
|
}
|
|
261
388
|
};
|
|
262
|
-
return
|
|
389
|
+
return WAProto.Message.fromObject(content);
|
|
263
390
|
};
|
|
264
|
-
exports.prepareDisappearingMessageSettingContent = prepareDisappearingMessageSettingContent;
|
|
265
391
|
/**
|
|
266
392
|
* Generate forwarded message content like WA does
|
|
267
393
|
* @param message the message to forward
|
|
268
394
|
* @param options.forceForward will show the message as forwarded even if it is from you
|
|
269
395
|
*/
|
|
270
|
-
const generateForwardMessageContent = (message, forceForward) => {
|
|
271
|
-
var _a;
|
|
396
|
+
export const generateForwardMessageContent = (message, forceForward) => {
|
|
272
397
|
let content = message.message;
|
|
273
398
|
if (!content) {
|
|
274
|
-
throw new
|
|
399
|
+
throw new Boom('no content in message', { statusCode: 400 });
|
|
275
400
|
}
|
|
276
401
|
// hacky copy
|
|
277
|
-
content =
|
|
278
|
-
content =
|
|
402
|
+
content = normalizeMessageContent(content);
|
|
403
|
+
content = proto.Message.decode(proto.Message.encode(content).finish());
|
|
279
404
|
let key = Object.keys(content)[0];
|
|
280
|
-
let score =
|
|
405
|
+
let score = content?.[key]?.contextInfo?.forwardingScore || 0;
|
|
281
406
|
score += message.key.fromMe && !forceForward ? 0 : 1;
|
|
282
407
|
if (key === 'conversation') {
|
|
283
408
|
content.extendedTextMessage = { text: content[key] };
|
|
284
409
|
delete content.conversation;
|
|
285
410
|
key = 'extendedTextMessage';
|
|
286
411
|
}
|
|
412
|
+
const key_ = content?.[key];
|
|
287
413
|
if (score > 0) {
|
|
288
|
-
|
|
414
|
+
key_.contextInfo = { forwardingScore: score, isForwarded: true };
|
|
289
415
|
}
|
|
290
416
|
else {
|
|
291
|
-
|
|
417
|
+
key_.contextInfo = {};
|
|
292
418
|
}
|
|
293
419
|
return content;
|
|
294
420
|
};
|
|
295
|
-
|
|
296
|
-
const
|
|
297
|
-
|
|
298
|
-
|
|
421
|
+
const prepareNativeFlowButtons = (message) => {
|
|
422
|
+
const buttons = message.nativeFlow;
|
|
423
|
+
const correctedField = Array.isArray(buttons) ? buttons : buttons.buttons;
|
|
424
|
+
return {
|
|
425
|
+
buttons: correctedField.map((button) => {
|
|
426
|
+
const buttonText = button.text || button.buttonText;
|
|
427
|
+
const icon = button.icon?.toUpperCase();
|
|
428
|
+
if (button.id) {
|
|
429
|
+
return {
|
|
430
|
+
name: 'quick_reply',
|
|
431
|
+
buttonParamsJson: JSON.stringify({ display_text: buttonText || 'Click', id: button.id, icon })
|
|
432
|
+
};
|
|
433
|
+
}
|
|
434
|
+
else if (button.copy) {
|
|
435
|
+
return {
|
|
436
|
+
name: 'cta_copy',
|
|
437
|
+
buttonParamsJson: JSON.stringify({ display_text: buttonText || 'Copy', copy_code: button.copy, icon })
|
|
438
|
+
};
|
|
439
|
+
}
|
|
440
|
+
else if (button.url) {
|
|
441
|
+
return {
|
|
442
|
+
name: 'cta_url',
|
|
443
|
+
buttonParamsJson: JSON.stringify({
|
|
444
|
+
display_text: buttonText || 'Visit',
|
|
445
|
+
url: button.url,
|
|
446
|
+
merchant_url: button.url,
|
|
447
|
+
webview_interaction: button.useWebview,
|
|
448
|
+
icon
|
|
449
|
+
})
|
|
450
|
+
};
|
|
451
|
+
}
|
|
452
|
+
else if (button.call) {
|
|
453
|
+
return {
|
|
454
|
+
name: 'cta_call',
|
|
455
|
+
buttonParamsJson: JSON.stringify({ display_text: buttonText || 'Call', phone_number: button.call, icon })
|
|
456
|
+
};
|
|
457
|
+
}
|
|
458
|
+
else if (button.sections) {
|
|
459
|
+
return {
|
|
460
|
+
name: 'single_select',
|
|
461
|
+
buttonParamsJson: JSON.stringify({ title: buttonText || 'Select', sections: button.sections, icon })
|
|
462
|
+
};
|
|
463
|
+
}
|
|
464
|
+
return { name: button.name, buttonParamsJson: button.paramsJson };
|
|
465
|
+
})
|
|
466
|
+
};
|
|
467
|
+
};
|
|
468
|
+
export const hasValidInteractiveHeader = (message) => {
|
|
469
|
+
return !!(message.imageMessage ||
|
|
470
|
+
message.videoMessage ||
|
|
471
|
+
message.documentMessage ||
|
|
472
|
+
message.productMessage ||
|
|
473
|
+
message.locationMessage);
|
|
474
|
+
};
|
|
475
|
+
export const hasValidCarouselHeader = (message) => {
|
|
476
|
+
return !!(message.imageMessage || message.videoMessage || message.productMessage);
|
|
477
|
+
};
|
|
478
|
+
export const hasNonNullishProperty = (message, key) => {
|
|
479
|
+
return (typeof message === 'object' &&
|
|
480
|
+
message !== null &&
|
|
481
|
+
key in message &&
|
|
482
|
+
message[key] !== null &&
|
|
483
|
+
message[key] !== undefined);
|
|
484
|
+
};
|
|
485
|
+
function hasOptionalProperty(obj, key) {
|
|
486
|
+
return typeof obj === 'object' && obj !== null && key in obj && obj[key] !== null;
|
|
487
|
+
}
|
|
488
|
+
export const generateWAMessageContent = async (message, options) => {
|
|
489
|
+
var _a, _b;
|
|
299
490
|
let m = {};
|
|
300
|
-
if ('
|
|
491
|
+
if (hasNonNullishProperty(message, 'raw')) {
|
|
492
|
+
delete message.raw;
|
|
493
|
+
return message;
|
|
494
|
+
}
|
|
495
|
+
else if (hasNonNullishProperty(message, 'buttons')) {
|
|
496
|
+
const buttonsMessage = {
|
|
497
|
+
buttons: message.buttons.map((button) => {
|
|
498
|
+
const buttonText = button.text || button.buttonText;
|
|
499
|
+
if (button.nativeFlowInfo) {
|
|
500
|
+
return {
|
|
501
|
+
buttonId: button.id || button.buttonId,
|
|
502
|
+
buttonText: typeof buttonText === 'string' ? { displayText: buttonText } : buttonText,
|
|
503
|
+
nativeFlowInfo: button.nativeFlowInfo,
|
|
504
|
+
type: ButtonType.NATIVE_FLOW
|
|
505
|
+
};
|
|
506
|
+
}
|
|
507
|
+
else if (button.sections) {
|
|
508
|
+
return {
|
|
509
|
+
nativeFlowInfo: {
|
|
510
|
+
name: 'single_select',
|
|
511
|
+
paramsJson: JSON.stringify({ title: buttonText, sections: button.sections })
|
|
512
|
+
},
|
|
513
|
+
type: ButtonType.NATIVE_FLOW
|
|
514
|
+
};
|
|
515
|
+
}
|
|
516
|
+
else if (button.name) {
|
|
517
|
+
return {
|
|
518
|
+
nativeFlowInfo: { name: button.name, paramsJson: button.paramsJson },
|
|
519
|
+
type: ButtonType.NATIVE_FLOW
|
|
520
|
+
};
|
|
521
|
+
}
|
|
522
|
+
return {
|
|
523
|
+
buttonId: button.id || button.buttonId,
|
|
524
|
+
buttonText: typeof buttonText === 'string' ? { displayText: buttonText } : buttonText,
|
|
525
|
+
type: button.type || ButtonType.RESPONSE
|
|
526
|
+
};
|
|
527
|
+
})
|
|
528
|
+
};
|
|
529
|
+
if (message.text) {
|
|
530
|
+
buttonsMessage.contentText = message.text;
|
|
531
|
+
buttonsMessage.headerType = ButtonHeaderType.EMPTY;
|
|
532
|
+
}
|
|
533
|
+
else {
|
|
534
|
+
const media = await prepareWAMessageMedia(message, options);
|
|
535
|
+
if (message.caption) {
|
|
536
|
+
buttonsMessage.contentText = message.caption;
|
|
537
|
+
}
|
|
538
|
+
const mediaKey = Object.keys(media)[0];
|
|
539
|
+
if (!mediaKey) {
|
|
540
|
+
throw new Boom('buttons message needs either "text" or a media field (image/video/document) as header', {
|
|
541
|
+
statusCode: 400
|
|
542
|
+
});
|
|
543
|
+
}
|
|
544
|
+
const type = mediaKey.replace('Message', '').toUpperCase();
|
|
545
|
+
buttonsMessage.headerType = ButtonHeaderType[type];
|
|
546
|
+
Object.assign(buttonsMessage, media);
|
|
547
|
+
}
|
|
548
|
+
if (message.footer) {
|
|
549
|
+
buttonsMessage.footerText = message.footer;
|
|
550
|
+
}
|
|
551
|
+
m.buttonsMessage = buttonsMessage;
|
|
552
|
+
}
|
|
553
|
+
else if (hasNonNullishProperty(message, 'sections')) {
|
|
554
|
+
m.listMessage = {
|
|
555
|
+
sections: message.sections,
|
|
556
|
+
buttonText: message.buttonText,
|
|
557
|
+
title: message.title,
|
|
558
|
+
footerText: message.footer,
|
|
559
|
+
description: message.description,
|
|
560
|
+
listType: ListType.SINGLE_SELECT
|
|
561
|
+
};
|
|
562
|
+
}
|
|
563
|
+
else if (hasNonNullishProperty(message, 'templateButtons')) {
|
|
564
|
+
const hydratedTemplate = {
|
|
565
|
+
hydratedButtons: message.templateButtons.map((button, i) => {
|
|
566
|
+
const buttonText = button.text || button.buttonText;
|
|
567
|
+
if (button.id) {
|
|
568
|
+
return { index: i, quickReplyButton: { displayText: buttonText || 'Click', id: button.id } };
|
|
569
|
+
}
|
|
570
|
+
else if (button.url) {
|
|
571
|
+
return { index: i, urlButton: { displayText: buttonText || 'Visit', url: button.url } };
|
|
572
|
+
}
|
|
573
|
+
else if (button.call) {
|
|
574
|
+
return { index: i, callButton: { displayText: buttonText || 'Call', phoneNumber: button.call } };
|
|
575
|
+
}
|
|
576
|
+
button.index = button.index || i;
|
|
577
|
+
return button;
|
|
578
|
+
})
|
|
579
|
+
};
|
|
580
|
+
if (message.text) {
|
|
581
|
+
hydratedTemplate.hydratedContentText = message.text;
|
|
582
|
+
}
|
|
583
|
+
else {
|
|
584
|
+
const media = await prepareWAMessageMedia(message, options);
|
|
585
|
+
if (message.caption) {
|
|
586
|
+
hydratedTemplate.hydratedTitleText = message.title;
|
|
587
|
+
hydratedTemplate.hydratedContentText = message.caption;
|
|
588
|
+
}
|
|
589
|
+
Object.assign(hydratedTemplate, media);
|
|
590
|
+
}
|
|
591
|
+
if (message.footer) {
|
|
592
|
+
hydratedTemplate.hydratedFooterText = message.footer;
|
|
593
|
+
}
|
|
594
|
+
hydratedTemplate.templateId = message.id || `template-${Date.now()}`;
|
|
595
|
+
m.templateMessage = {
|
|
596
|
+
hydratedFourRowTemplate: hydratedTemplate,
|
|
597
|
+
hydratedTemplate
|
|
598
|
+
};
|
|
599
|
+
}
|
|
600
|
+
else if (hasNonNullishProperty(message, 'nativeFlow')) {
|
|
601
|
+
const interactiveMessage = {
|
|
602
|
+
nativeFlowMessage: prepareNativeFlowButtons(message)
|
|
603
|
+
};
|
|
604
|
+
if (message.text) {
|
|
605
|
+
interactiveMessage.body = { text: message.text };
|
|
606
|
+
}
|
|
607
|
+
else {
|
|
608
|
+
const media = await prepareWAMessageMedia(message, options);
|
|
609
|
+
if (message.caption) {
|
|
610
|
+
const isValidHeader = hasValidInteractiveHeader(media);
|
|
611
|
+
if (!isValidHeader) {
|
|
612
|
+
throw new Boom('Invalid media type for interactive message header', { statusCode: 400 });
|
|
613
|
+
}
|
|
614
|
+
interactiveMessage.header = {
|
|
615
|
+
title: message.title || '',
|
|
616
|
+
subtitle: message.subtitle || '',
|
|
617
|
+
hasMediaAttachment: isValidHeader
|
|
618
|
+
};
|
|
619
|
+
interactiveMessage.body = { text: message.caption };
|
|
620
|
+
}
|
|
621
|
+
Object.assign(interactiveMessage.header || (interactiveMessage.header = {}), media);
|
|
622
|
+
}
|
|
623
|
+
if (message.audioFooter) {
|
|
624
|
+
const { audioMessage } = await prepareWAMessageMedia({ audio: message.audioFooter }, options);
|
|
625
|
+
interactiveMessage.footer = { audioMessage, hasMediaAttachment: true };
|
|
626
|
+
}
|
|
627
|
+
else if (message.footer) {
|
|
628
|
+
interactiveMessage.footer = { text: message.footer };
|
|
629
|
+
}
|
|
630
|
+
m.interactiveMessage = interactiveMessage;
|
|
631
|
+
}
|
|
632
|
+
else if (hasNonNullishProperty(message, 'cards')) {
|
|
633
|
+
const interactiveMessage = {
|
|
634
|
+
carouselMessage: {
|
|
635
|
+
cards: await Promise.all(message.cards.map(async (card) => {
|
|
636
|
+
const carouselHeader = await prepareWAMessageMedia(card, options).catch(() => ({}));
|
|
637
|
+
const isValidHeader = hasValidCarouselHeader(carouselHeader);
|
|
638
|
+
if (!isValidHeader) {
|
|
639
|
+
throw new Boom('Invalid media type for carousel card', { statusCode: 400 });
|
|
640
|
+
}
|
|
641
|
+
const carouselCard = {
|
|
642
|
+
nativeFlowMessage: prepareNativeFlowButtons({ nativeFlow: card.nativeFlow || [] })
|
|
643
|
+
};
|
|
644
|
+
if (card.text) {
|
|
645
|
+
carouselCard.body = { text: card.text };
|
|
646
|
+
}
|
|
647
|
+
else if (card.caption) {
|
|
648
|
+
carouselCard.header = {
|
|
649
|
+
title: card.title || '',
|
|
650
|
+
subtitle: card.subtitle || '',
|
|
651
|
+
hasMediaAttachment: isValidHeader,
|
|
652
|
+
...carouselHeader
|
|
653
|
+
};
|
|
654
|
+
carouselCard.body = { text: card.caption };
|
|
655
|
+
}
|
|
656
|
+
if (card.audioFooter) {
|
|
657
|
+
const { audioMessage } = await prepareWAMessageMedia({ audio: card.audioFooter }, options);
|
|
658
|
+
carouselCard.footer = { audioMessage, hasMediaAttachment: true };
|
|
659
|
+
}
|
|
660
|
+
else if (card.footer) {
|
|
661
|
+
carouselCard.footer = { text: card.footer };
|
|
662
|
+
}
|
|
663
|
+
if (card.contextInfo) {
|
|
664
|
+
carouselCard.contextInfo = card.contextInfo;
|
|
665
|
+
}
|
|
666
|
+
return carouselCard;
|
|
667
|
+
})),
|
|
668
|
+
carouselCardType: CarouselCardType.UNKNOWN,
|
|
669
|
+
messageVersion: 1
|
|
670
|
+
}
|
|
671
|
+
};
|
|
672
|
+
if (message.footer) {
|
|
673
|
+
interactiveMessage.footer = { text: message.footer };
|
|
674
|
+
}
|
|
675
|
+
m.interactiveMessage = interactiveMessage;
|
|
676
|
+
}
|
|
677
|
+
else if (hasNonNullishProperty(message, 'text')) {
|
|
301
678
|
const extContent = { text: message.text };
|
|
302
679
|
let urlInfo = message.linkPreview;
|
|
303
680
|
if (typeof urlInfo === 'undefined') {
|
|
304
|
-
urlInfo = await
|
|
681
|
+
urlInfo = await generateLinkPreviewIfRequired(message.text, options.getUrlInfo, options.logger);
|
|
305
682
|
}
|
|
306
683
|
if (urlInfo) {
|
|
307
684
|
extContent.matchedText = urlInfo['matched-text'];
|
|
@@ -328,43 +705,45 @@ const generateWAMessageContent = async (message, options) => {
|
|
|
328
705
|
}
|
|
329
706
|
m.extendedTextMessage = extContent;
|
|
330
707
|
}
|
|
331
|
-
else if ('contacts'
|
|
708
|
+
else if (hasNonNullishProperty(message, 'contacts')) {
|
|
332
709
|
const contactLen = message.contacts.contacts.length;
|
|
333
710
|
if (!contactLen) {
|
|
334
|
-
throw new
|
|
711
|
+
throw new Boom('require atleast 1 contact', { statusCode: 400 });
|
|
335
712
|
}
|
|
336
713
|
if (contactLen === 1) {
|
|
337
|
-
m.contactMessage =
|
|
714
|
+
m.contactMessage = WAProto.Message.ContactMessage.create(message.contacts.contacts[0]);
|
|
338
715
|
}
|
|
339
716
|
else {
|
|
340
|
-
m.contactsArrayMessage =
|
|
717
|
+
m.contactsArrayMessage = WAProto.Message.ContactsArrayMessage.create(message.contacts);
|
|
341
718
|
}
|
|
342
719
|
}
|
|
343
|
-
else if ('location'
|
|
344
|
-
m.locationMessage =
|
|
720
|
+
else if (hasNonNullishProperty(message, 'location')) {
|
|
721
|
+
m.locationMessage = WAProto.Message.LocationMessage.create(message.location);
|
|
345
722
|
}
|
|
346
|
-
else if ('react'
|
|
723
|
+
else if (hasNonNullishProperty(message, 'react')) {
|
|
347
724
|
if (!message.react.senderTimestampMs) {
|
|
348
725
|
message.react.senderTimestampMs = Date.now();
|
|
349
726
|
}
|
|
350
|
-
m.reactionMessage =
|
|
727
|
+
m.reactionMessage = WAProto.Message.ReactionMessage.create(message.react);
|
|
351
728
|
}
|
|
352
|
-
else if ('delete'
|
|
729
|
+
else if (hasNonNullishProperty(message, 'delete')) {
|
|
353
730
|
m.protocolMessage = {
|
|
354
731
|
key: message.delete,
|
|
355
|
-
type:
|
|
732
|
+
type: WAProto.Message.ProtocolMessage.Type.REVOKE
|
|
356
733
|
};
|
|
357
734
|
}
|
|
358
|
-
else if ('forward'
|
|
359
|
-
m =
|
|
735
|
+
else if (hasNonNullishProperty(message, 'forward')) {
|
|
736
|
+
m = generateForwardMessageContent(message.forward, message.force);
|
|
360
737
|
}
|
|
361
|
-
else if ('disappearingMessagesInChat'
|
|
362
|
-
const exp = typeof message.disappearingMessagesInChat === 'boolean'
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
738
|
+
else if (hasNonNullishProperty(message, 'disappearingMessagesInChat')) {
|
|
739
|
+
const exp = typeof message.disappearingMessagesInChat === 'boolean'
|
|
740
|
+
? message.disappearingMessagesInChat
|
|
741
|
+
? WA_DEFAULT_EPHEMERAL
|
|
742
|
+
: 0
|
|
743
|
+
: message.disappearingMessagesInChat;
|
|
744
|
+
m = prepareDisappearingMessageSettingContent(exp);
|
|
366
745
|
}
|
|
367
|
-
else if ('groupInvite'
|
|
746
|
+
else if (hasNonNullishProperty(message, 'groupInvite')) {
|
|
368
747
|
m.groupInviteMessage = {};
|
|
369
748
|
m.groupInviteMessage.inviteCode = message.groupInvite.inviteCode;
|
|
370
749
|
m.groupInviteMessage.inviteExpiration = message.groupInvite.inviteExpiration;
|
|
@@ -376,14 +755,15 @@ const generateWAMessageContent = async (message, options) => {
|
|
|
376
755
|
if (options.getProfilePicUrl) {
|
|
377
756
|
const pfpUrl = await options.getProfilePicUrl(message.groupInvite.jid, 'preview');
|
|
378
757
|
if (pfpUrl) {
|
|
379
|
-
const resp = await
|
|
380
|
-
if (resp.
|
|
381
|
-
|
|
758
|
+
const resp = await fetch(pfpUrl, { method: 'GET', dispatcher: options?.options?.dispatcher });
|
|
759
|
+
if (resp.ok) {
|
|
760
|
+
const buf = Buffer.from(await resp.arrayBuffer());
|
|
761
|
+
m.groupInviteMessage.jpegThumbnail = buf;
|
|
382
762
|
}
|
|
383
763
|
}
|
|
384
764
|
}
|
|
385
765
|
}
|
|
386
|
-
else if ('pin'
|
|
766
|
+
else if (hasNonNullishProperty(message, 'pin')) {
|
|
387
767
|
m.pinInChatMessage = {};
|
|
388
768
|
m.messageContextInfo = {};
|
|
389
769
|
m.pinInChatMessage.key = message.pin;
|
|
@@ -391,95 +771,80 @@ const generateWAMessageContent = async (message, options) => {
|
|
|
391
771
|
m.pinInChatMessage.senderTimestampMs = Date.now();
|
|
392
772
|
m.messageContextInfo.messageAddOnDurationInSecs = message.type === 1 ? message.time || 86400 : 0;
|
|
393
773
|
}
|
|
394
|
-
else if ('
|
|
395
|
-
m.keepInChatMessage = {};
|
|
396
|
-
m.keepInChatMessage.key = message.keep;
|
|
397
|
-
m.keepInChatMessage.keepType = message.type;
|
|
398
|
-
m.keepInChatMessage.timestampMs = Date.now();
|
|
399
|
-
}
|
|
400
|
-
else if ('call' in message) {
|
|
401
|
-
m = {
|
|
402
|
-
scheduledCallCreationMessage: {
|
|
403
|
-
scheduledTimestampMs: (_a = message.call.time) !== null && _a !== void 0 ? _a : Date.now(),
|
|
404
|
-
callType: (_b = message.call.type) !== null && _b !== void 0 ? _b : 1,
|
|
405
|
-
title: message.call.title
|
|
406
|
-
}
|
|
407
|
-
};
|
|
408
|
-
}
|
|
409
|
-
else if ('paymentInvite' in message) {
|
|
410
|
-
m.paymentInviteMessage = {
|
|
411
|
-
serviceType: message.paymentInvite.type,
|
|
412
|
-
expiryTimestamp: message.paymentInvite.expiry
|
|
413
|
-
};
|
|
414
|
-
}
|
|
415
|
-
else if ('buttonReply' in message) {
|
|
774
|
+
else if (hasNonNullishProperty(message, 'buttonReply')) {
|
|
416
775
|
switch (message.type) {
|
|
417
776
|
case 'template':
|
|
418
777
|
m.templateButtonReplyMessage = {
|
|
419
778
|
selectedDisplayText: message.buttonReply.displayText,
|
|
420
779
|
selectedId: message.buttonReply.id,
|
|
421
|
-
selectedIndex: message.buttonReply.index
|
|
780
|
+
selectedIndex: message.buttonReply.index
|
|
422
781
|
};
|
|
423
782
|
break;
|
|
424
783
|
case 'plain':
|
|
425
784
|
m.buttonsResponseMessage = {
|
|
426
785
|
selectedButtonId: message.buttonReply.id,
|
|
427
786
|
selectedDisplayText: message.buttonReply.displayText,
|
|
428
|
-
type:
|
|
787
|
+
type: proto.Message.ButtonsResponseMessage.Type.DISPLAY_TEXT
|
|
429
788
|
};
|
|
430
789
|
break;
|
|
431
790
|
}
|
|
432
791
|
}
|
|
433
|
-
else if ('ptv'
|
|
434
|
-
const { videoMessage } = await
|
|
792
|
+
else if (hasOptionalProperty(message, 'ptv') && message.ptv) {
|
|
793
|
+
const { videoMessage } = await prepareWAMessageMedia({ video: message.video }, options);
|
|
435
794
|
m.ptvMessage = videoMessage;
|
|
436
795
|
}
|
|
437
|
-
else if ('product'
|
|
438
|
-
const { imageMessage } = await
|
|
439
|
-
m.productMessage =
|
|
796
|
+
else if (hasNonNullishProperty(message, 'product')) {
|
|
797
|
+
const { imageMessage } = await prepareWAMessageMedia({ image: message.product.productImage }, options);
|
|
798
|
+
m.productMessage = WAProto.Message.ProductMessage.create({
|
|
440
799
|
...message,
|
|
441
800
|
product: {
|
|
442
801
|
...message.product,
|
|
443
|
-
productImage: imageMessage
|
|
802
|
+
productImage: imageMessage
|
|
444
803
|
}
|
|
445
804
|
});
|
|
446
805
|
}
|
|
447
|
-
else if ('
|
|
448
|
-
m.orderMessage = Types_1.WAProto.Message.OrderMessage.fromObject({
|
|
449
|
-
orderId: message.order.id,
|
|
450
|
-
thumbnail: message.order.thumbnail,
|
|
451
|
-
itemCount: message.order.itemCount,
|
|
452
|
-
status: message.order.status,
|
|
453
|
-
surface: message.order.surface,
|
|
454
|
-
orderTitle: message.order.title,
|
|
455
|
-
message: message.order.text,
|
|
456
|
-
sellerJid: message.order.seller,
|
|
457
|
-
token: message.order.token,
|
|
458
|
-
totalAmount1000: message.order.amount,
|
|
459
|
-
totalCurrencyCode: message.order.currency
|
|
460
|
-
});
|
|
461
|
-
}
|
|
462
|
-
else if ('listReply' in message) {
|
|
806
|
+
else if (hasNonNullishProperty(message, 'listReply')) {
|
|
463
807
|
m.listResponseMessage = { ...message.listReply };
|
|
464
808
|
}
|
|
465
|
-
else if ('
|
|
466
|
-
|
|
467
|
-
|
|
809
|
+
else if (hasNonNullishProperty(message, 'event')) {
|
|
810
|
+
m.eventMessage = {};
|
|
811
|
+
const startTime = Math.floor(message.event.startDate.getTime() / 1000);
|
|
812
|
+
if (message.event.call && options.getCallLink) {
|
|
813
|
+
const token = await options.getCallLink(message.event.call, { startTime });
|
|
814
|
+
m.eventMessage.joinLink = (message.event.call === 'audio' ? CALL_AUDIO_PREFIX : CALL_VIDEO_PREFIX) + token;
|
|
815
|
+
}
|
|
816
|
+
m.messageContextInfo = {
|
|
817
|
+
// encKey
|
|
818
|
+
messageSecret: message.event.messageSecret || randomBytes(32)
|
|
819
|
+
};
|
|
820
|
+
m.eventMessage.name = message.event.name;
|
|
821
|
+
m.eventMessage.description = message.event.description;
|
|
822
|
+
m.eventMessage.startTime = startTime;
|
|
823
|
+
m.eventMessage.endTime = message.event.endDate ? message.event.endDate.getTime() / 1000 : undefined;
|
|
824
|
+
m.eventMessage.isCanceled = message.event.isCancelled ?? false;
|
|
825
|
+
m.eventMessage.extraGuestsAllowed = message.event.extraGuestsAllowed;
|
|
826
|
+
m.eventMessage.isScheduleCall = message.event.isScheduleCall ?? false;
|
|
827
|
+
m.eventMessage.location = message.event.location;
|
|
828
|
+
}
|
|
829
|
+
else if (hasNonNullishProperty(message, 'poll')) {
|
|
830
|
+
(_a = message.poll).selectableCount || (_a.selectableCount = 0);
|
|
831
|
+
(_b = message.poll).toAnnouncementGroup || (_b.toAnnouncementGroup = false);
|
|
468
832
|
if (!Array.isArray(message.poll.values)) {
|
|
469
|
-
throw new
|
|
833
|
+
throw new Boom('Invalid poll values', { statusCode: 400 });
|
|
470
834
|
}
|
|
471
|
-
if (message.poll.selectableCount < 0
|
|
472
|
-
|
|
473
|
-
|
|
835
|
+
if (message.poll.selectableCount < 0 || message.poll.selectableCount > message.poll.values.length) {
|
|
836
|
+
throw new Boom(`poll.selectableCount in poll should be >= 0 and <= ${message.poll.values.length}`, {
|
|
837
|
+
statusCode: 400
|
|
838
|
+
});
|
|
474
839
|
}
|
|
475
840
|
m.messageContextInfo = {
|
|
476
841
|
// encKey
|
|
477
|
-
messageSecret: message.poll.messageSecret ||
|
|
842
|
+
messageSecret: message.poll.messageSecret || randomBytes(32)
|
|
478
843
|
};
|
|
479
844
|
const pollCreationMessage = {
|
|
480
845
|
name: message.poll.name,
|
|
481
846
|
selectableOptionsCount: message.poll.selectableCount,
|
|
482
|
-
options: message.poll.values.map(optionName => ({ optionName }))
|
|
847
|
+
options: message.poll.values.map(optionName => ({ optionName }))
|
|
483
848
|
};
|
|
484
849
|
if (message.poll.toAnnouncementGroup) {
|
|
485
850
|
// poll v2 is for community announcement groups (single select and multiple)
|
|
@@ -487,7 +852,7 @@ const generateWAMessageContent = async (message, options) => {
|
|
|
487
852
|
}
|
|
488
853
|
else {
|
|
489
854
|
if (message.poll.selectableCount === 1) {
|
|
490
|
-
//
|
|
855
|
+
//poll v3 is for single select polls
|
|
491
856
|
m.pollCreationMessageV3 = pollCreationMessage;
|
|
492
857
|
}
|
|
493
858
|
else {
|
|
@@ -496,338 +861,198 @@ const generateWAMessageContent = async (message, options) => {
|
|
|
496
861
|
}
|
|
497
862
|
}
|
|
498
863
|
}
|
|
499
|
-
else if ('
|
|
500
|
-
m.
|
|
501
|
-
|
|
864
|
+
else if (hasNonNullishProperty(message, 'album')) {
|
|
865
|
+
m.albumMessage = {
|
|
866
|
+
expectedImageCount: message.album.expectedImageCount,
|
|
867
|
+
expectedVideoCount: message.album.expectedVideoCount
|
|
502
868
|
};
|
|
503
|
-
m.eventMessage = { ...message.event };
|
|
504
|
-
}
|
|
505
|
-
else if ('inviteAdmin' in message) {
|
|
506
|
-
m.newsletterAdminInviteMessage = {};
|
|
507
|
-
m.newsletterAdminInviteMessage.inviteExpiration = message.inviteAdmin.inviteExpiration;
|
|
508
|
-
m.newsletterAdminInviteMessage.caption = message.inviteAdmin.text;
|
|
509
|
-
m.newsletterAdminInviteMessage.newsletterJid = message.inviteAdmin.jid;
|
|
510
|
-
m.newsletterAdminInviteMessage.newsletterName = message.inviteAdmin.subject;
|
|
511
|
-
m.newsletterAdminInviteMessage.jpegThumbnail = message.inviteAdmin.thumbnail;
|
|
512
|
-
}
|
|
513
|
-
else if ('requestPayment' in message) {
|
|
514
|
-
const sticker = ((_c = message === null || message === void 0 ? void 0 : message.requestPayment) === null || _c === void 0 ? void 0 : _c.sticker) ?
|
|
515
|
-
await (0, exports.prepareWAMessageMedia)({ sticker: (_d = message === null || message === void 0 ? void 0 : message.requestPayment) === null || _d === void 0 ? void 0 : _d.sticker, ...options }, options)
|
|
516
|
-
: null;
|
|
517
|
-
let notes = {};
|
|
518
|
-
if ((_e = message === null || message === void 0 ? void 0 : message.requestPayment) === null || _e === void 0 ? void 0 : _e.sticker) {
|
|
519
|
-
notes = {
|
|
520
|
-
stickerMessage: {
|
|
521
|
-
...sticker === null || sticker === void 0 ? void 0 : sticker.stickerMessage,
|
|
522
|
-
contextInfo: (_f = message === null || message === void 0 ? void 0 : message.requestPayment) === null || _f === void 0 ? void 0 : _f.contextInfo
|
|
523
|
-
}
|
|
524
|
-
};
|
|
525
|
-
}
|
|
526
|
-
else if (message.requestPayment.note) {
|
|
527
|
-
notes = {
|
|
528
|
-
extendedTextMessage: {
|
|
529
|
-
text: message.requestPayment.note,
|
|
530
|
-
contextInfo: (_g = message === null || message === void 0 ? void 0 : message.requestPayment) === null || _g === void 0 ? void 0 : _g.contextInfo,
|
|
531
|
-
}
|
|
532
|
-
};
|
|
533
|
-
}
|
|
534
|
-
else {
|
|
535
|
-
throw new boom_1.Boom('Invalid media type', { statusCode: 400 });
|
|
536
|
-
}
|
|
537
|
-
m.requestPaymentMessage = Types_1.WAProto.Message.RequestPaymentMessage.fromObject({
|
|
538
|
-
expiryTimestamp: message.requestPayment.expiry,
|
|
539
|
-
amount1000: message.requestPayment.amount,
|
|
540
|
-
currencyCodeIso4217: message.requestPayment.currency,
|
|
541
|
-
requestFrom: message.requestPayment.from,
|
|
542
|
-
noteMessage: { ...notes },
|
|
543
|
-
background: (_h = message.requestPayment.background) !== null && _h !== void 0 ? _h : null,
|
|
544
|
-
});
|
|
545
869
|
}
|
|
546
|
-
else if ('sharePhoneNumber'
|
|
870
|
+
else if (hasNonNullishProperty(message, 'sharePhoneNumber')) {
|
|
547
871
|
m.protocolMessage = {
|
|
548
|
-
type:
|
|
872
|
+
type: proto.Message.ProtocolMessage.Type.SHARE_PHONE_NUMBER
|
|
549
873
|
};
|
|
550
874
|
}
|
|
551
|
-
else if ('requestPhoneNumber'
|
|
875
|
+
else if (hasNonNullishProperty(message, 'requestPhoneNumber')) {
|
|
552
876
|
m.requestPhoneNumberMessage = {};
|
|
553
877
|
}
|
|
554
|
-
else if ('
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
878
|
+
else if (hasNonNullishProperty(message, 'limitSharing')) {
|
|
879
|
+
m.protocolMessage = {
|
|
880
|
+
type: proto.Message.ProtocolMessage.Type.LIMIT_SHARING,
|
|
881
|
+
limitSharing: {
|
|
882
|
+
sharingLimited: message.limitSharing === true,
|
|
883
|
+
trigger: 1,
|
|
884
|
+
limitSharingSettingTimestamp: Date.now(),
|
|
885
|
+
initiatedByMe: true
|
|
886
|
+
}
|
|
887
|
+
};
|
|
888
|
+
}
|
|
889
|
+
else if (hasNonNullishProperty(message, 'stickerPack')) {
|
|
890
|
+
m.stickerPackMessage = await generateStickerPackMessage(message.stickerPack, options);
|
|
891
|
+
m.stickerPackMessage.contextInfo = {
|
|
892
|
+
...(message.contextInfo || {}),
|
|
893
|
+
...(message.mentions ? { mentionedJid: message.mentions } : {})
|
|
894
|
+
};
|
|
561
895
|
}
|
|
562
896
|
else {
|
|
563
|
-
m = await
|
|
897
|
+
m = await prepareWAMessageMedia(message, options);
|
|
564
898
|
}
|
|
565
|
-
if ('
|
|
566
|
-
|
|
567
|
-
buttons: message.buttons.map(b => ({ ...b, type: WAProto_1.proto.Message.ButtonsMessage.Button.Type.RESPONSE }))
|
|
568
|
-
};
|
|
569
|
-
if ('text' in message) {
|
|
570
|
-
buttonsMessage.contentText = message.text;
|
|
571
|
-
buttonsMessage.headerType = ButtonType.EMPTY;
|
|
572
|
-
}
|
|
573
|
-
else {
|
|
574
|
-
if ('caption' in message) {
|
|
575
|
-
buttonsMessage.contentText = message.caption;
|
|
576
|
-
}
|
|
577
|
-
const type = Object.keys(m)[0].replace('Message', '').toUpperCase();
|
|
578
|
-
buttonsMessage.headerType = ButtonType[type];
|
|
579
|
-
Object.assign(buttonsMessage, m);
|
|
580
|
-
}
|
|
581
|
-
if ('title' in message && !!message.title) {
|
|
582
|
-
buttonsMessage.text = message.title,
|
|
583
|
-
buttonsMessage.headerType = ButtonType.TEXT;
|
|
584
|
-
}
|
|
585
|
-
if ('footer' in message && !!message.footer) {
|
|
586
|
-
buttonsMessage.footerText = message.footer;
|
|
587
|
-
}
|
|
588
|
-
if ('contextInfo' in message && !!message.contextInfo) {
|
|
589
|
-
buttonsMessage.contextInfo = message.contextInfo;
|
|
590
|
-
}
|
|
591
|
-
if ('mentions' in message && !!message.mentions) {
|
|
592
|
-
buttonsMessage.contextInfo = { mentionedJid: message.mentions };
|
|
593
|
-
}
|
|
594
|
-
m = { buttonsMessage };
|
|
899
|
+
if (hasOptionalProperty(message, 'isLottie') && !!message.isLottie) {
|
|
900
|
+
m = { lottieStickerMessage: { message: m } };
|
|
595
901
|
}
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
hydratedButtons: message.hasOwnProperty("templateButtons") ? message.templateButtons : message.templateButtons
|
|
599
|
-
};
|
|
600
|
-
if ('text' in message) {
|
|
601
|
-
msg.hydratedContentText = message.text;
|
|
602
|
-
}
|
|
603
|
-
else {
|
|
604
|
-
if ('caption' in message) {
|
|
605
|
-
msg.hydratedContentText = message.caption;
|
|
606
|
-
}
|
|
607
|
-
Object.assign(msg, m);
|
|
608
|
-
}
|
|
609
|
-
if ('footer' in message && !!message.footer) {
|
|
610
|
-
msg.hydratedFooterText = message.footer;
|
|
611
|
-
}
|
|
612
|
-
m = {
|
|
613
|
-
templateMessage: {
|
|
614
|
-
fourRowTemplate: msg,
|
|
615
|
-
hydratedTemplate: msg
|
|
616
|
-
}
|
|
617
|
-
};
|
|
902
|
+
if (hasOptionalProperty(message, 'viewOnceV2Extension') && !!message.viewOnceV2Extension) {
|
|
903
|
+
m = { viewOnceMessageV2Extension: { message: m } };
|
|
618
904
|
}
|
|
619
|
-
if ('
|
|
620
|
-
|
|
621
|
-
sections: message.sections,
|
|
622
|
-
buttonText: message.buttonText,
|
|
623
|
-
title: message.title,
|
|
624
|
-
footerText: message.footer,
|
|
625
|
-
description: message.text,
|
|
626
|
-
listType: WAProto_1.proto.Message.ListMessage.ListType.SINGLE_SELECT
|
|
627
|
-
};
|
|
628
|
-
m = { listMessage };
|
|
905
|
+
else if (hasOptionalProperty(message, 'viewOnceV2') && !!message.viewOnceV2) {
|
|
906
|
+
m = { viewOnceMessageV2: { message: m } };
|
|
629
907
|
}
|
|
630
|
-
if ('
|
|
631
|
-
|
|
632
|
-
nativeFlowMessage: Types_1.WAProto.Message.InteractiveMessage.NativeFlowMessage.fromObject({
|
|
633
|
-
buttons: message.interactiveButtons,
|
|
634
|
-
})
|
|
635
|
-
};
|
|
636
|
-
if ('text' in message) {
|
|
637
|
-
interactiveMessage.body = {
|
|
638
|
-
text: message.text
|
|
639
|
-
};
|
|
640
|
-
}
|
|
641
|
-
else if ('caption' in message) {
|
|
642
|
-
interactiveMessage.body = {
|
|
643
|
-
text: message.caption
|
|
644
|
-
};
|
|
645
|
-
interactiveMessage.header = {
|
|
646
|
-
title: message.title,
|
|
647
|
-
subtitle: message.subtitle,
|
|
648
|
-
hasMediaAttachment: (_j = message === null || message === void 0 ? void 0 : message.media) !== null && _j !== void 0 ? _j : false,
|
|
649
|
-
};
|
|
650
|
-
Object.assign(interactiveMessage.header, m);
|
|
651
|
-
}
|
|
652
|
-
if ('footer' in message && !!message.footer) {
|
|
653
|
-
interactiveMessage.footer = {
|
|
654
|
-
text: message.footer
|
|
655
|
-
};
|
|
656
|
-
}
|
|
657
|
-
if ('title' in message && !!message.title) {
|
|
658
|
-
interactiveMessage.header = {
|
|
659
|
-
title: message.title,
|
|
660
|
-
subtitle: message.subtitle,
|
|
661
|
-
hasMediaAttachment: (_k = message === null || message === void 0 ? void 0 : message.media) !== null && _k !== void 0 ? _k : false,
|
|
662
|
-
};
|
|
663
|
-
Object.assign(interactiveMessage.header, m);
|
|
664
|
-
}
|
|
665
|
-
if ('contextInfo' in message && !!message.contextInfo) {
|
|
666
|
-
interactiveMessage.contextInfo = message.contextInfo;
|
|
667
|
-
}
|
|
668
|
-
if ('mentions' in message && !!message.mentions) {
|
|
669
|
-
interactiveMessage.contextInfo = { mentionedJid: message.mentions };
|
|
670
|
-
}
|
|
671
|
-
m = { interactiveMessage };
|
|
908
|
+
else if (hasOptionalProperty(message, 'viewOnce') && !!message.viewOnce) {
|
|
909
|
+
m = { viewOnceMessage: { message: m } };
|
|
672
910
|
}
|
|
673
|
-
if ('
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
}
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
else if ('caption' in message) {
|
|
686
|
-
interactiveMessage.body = {
|
|
687
|
-
text: message.caption
|
|
688
|
-
};
|
|
689
|
-
interactiveMessage.header = {
|
|
690
|
-
title: message.title,
|
|
691
|
-
subtitle: message.subtitle,
|
|
692
|
-
hasMediaAttachment: (_l = message === null || message === void 0 ? void 0 : message.media) !== null && _l !== void 0 ? _l : false,
|
|
693
|
-
};
|
|
694
|
-
Object.assign(interactiveMessage.header, m);
|
|
695
|
-
}
|
|
696
|
-
if ('footer' in message && !!message.footer) {
|
|
697
|
-
interactiveMessage.footer = {
|
|
698
|
-
text: message.footer
|
|
699
|
-
};
|
|
911
|
+
if ((hasOptionalProperty(message, 'mentions') && message.mentions?.length) ||
|
|
912
|
+
(hasOptionalProperty(message, 'mentionAll') && message.mentionAll)) {
|
|
913
|
+
const messageType = Object.keys(m)[0];
|
|
914
|
+
const key = m[messageType];
|
|
915
|
+
if (key && 'contextInfo' in key) {
|
|
916
|
+
key.contextInfo = key.contextInfo || {};
|
|
917
|
+
if (message.mentions?.length) {
|
|
918
|
+
key.contextInfo.mentionedJid = message.mentions;
|
|
919
|
+
}
|
|
920
|
+
if (message.mentionAll) {
|
|
921
|
+
key.contextInfo.nonJidMentions = 1;
|
|
922
|
+
}
|
|
700
923
|
}
|
|
701
|
-
if (
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
hasMediaAttachment: (_m = message === null || message === void 0 ? void 0 : message.media) !== null && _m !== void 0 ? _m : false,
|
|
924
|
+
else if (key) {
|
|
925
|
+
key.contextInfo = {
|
|
926
|
+
mentionedJid: message.mentions,
|
|
927
|
+
nonJidMentions: message.mentionAll ? 1 : 0
|
|
706
928
|
};
|
|
707
|
-
Object.assign(interactiveMessage.header, m);
|
|
708
|
-
}
|
|
709
|
-
if ('contextInfo' in message && !!message.contextInfo) {
|
|
710
|
-
interactiveMessage.contextInfo = message.contextInfo;
|
|
711
929
|
}
|
|
712
|
-
if ('mentions' in message && !!message.mentions) {
|
|
713
|
-
interactiveMessage.contextInfo = { mentionedJid: message.mentions };
|
|
714
|
-
}
|
|
715
|
-
m = { interactiveMessage };
|
|
716
930
|
}
|
|
717
|
-
if ('
|
|
718
|
-
m = { viewOnceMessage: { message: m } };
|
|
719
|
-
}
|
|
720
|
-
if ('mentions' in message && ((_o = message.mentions) === null || _o === void 0 ? void 0 : _o.length)) {
|
|
721
|
-
const [messageType] = Object.keys(m);
|
|
722
|
-
m[messageType].contextInfo = m[messageType] || {};
|
|
723
|
-
m[messageType].contextInfo.mentionedJid = message.mentions;
|
|
724
|
-
}
|
|
725
|
-
if ('edit' in message) {
|
|
931
|
+
if (hasOptionalProperty(message, 'edit')) {
|
|
726
932
|
m = {
|
|
727
933
|
protocolMessage: {
|
|
728
934
|
key: message.edit,
|
|
729
935
|
editedMessage: m,
|
|
730
936
|
timestampMs: Date.now(),
|
|
731
|
-
type:
|
|
937
|
+
type: WAProto.Message.ProtocolMessage.Type.MESSAGE_EDIT
|
|
732
938
|
}
|
|
733
939
|
};
|
|
734
940
|
}
|
|
735
|
-
if ('contextInfo'
|
|
736
|
-
const
|
|
737
|
-
|
|
738
|
-
|
|
941
|
+
if (hasOptionalProperty(message, 'contextInfo') && !!message.contextInfo) {
|
|
942
|
+
const messageType = Object.keys(m)[0];
|
|
943
|
+
const key = m[messageType];
|
|
944
|
+
if ('contextInfo' in key && !!key.contextInfo) {
|
|
945
|
+
key.contextInfo = { ...key.contextInfo, ...message.contextInfo };
|
|
946
|
+
}
|
|
947
|
+
else if (key) {
|
|
948
|
+
key.contextInfo = message.contextInfo;
|
|
949
|
+
}
|
|
950
|
+
}
|
|
951
|
+
if (hasOptionalProperty(message, 'albumParentKey') && !!message.albumParentKey) {
|
|
952
|
+
m.messageContextInfo = {
|
|
953
|
+
...m.messageContextInfo,
|
|
954
|
+
messageAssociation: {
|
|
955
|
+
associationType: WAProto.MessageAssociation.AssociationType.MEDIA_ALBUM,
|
|
956
|
+
parentMessageKey: message.albumParentKey
|
|
957
|
+
}
|
|
958
|
+
};
|
|
959
|
+
}
|
|
960
|
+
if (shouldIncludeReportingToken(m)) {
|
|
961
|
+
m.messageContextInfo = m.messageContextInfo || {};
|
|
962
|
+
if (!m.messageContextInfo.messageSecret) {
|
|
963
|
+
m.messageContextInfo.messageSecret = randomBytes(32);
|
|
964
|
+
}
|
|
739
965
|
}
|
|
740
|
-
return
|
|
966
|
+
return WAProto.Message.create(m);
|
|
741
967
|
};
|
|
742
|
-
|
|
743
|
-
const generateWAMessageFromContent = (jid, message, options) => {
|
|
968
|
+
export const generateWAMessageFromContent = (jid, message, options) => {
|
|
744
969
|
// set timestamp to now
|
|
745
970
|
// if not specified
|
|
746
971
|
if (!options.timestamp) {
|
|
747
972
|
options.timestamp = new Date();
|
|
748
973
|
}
|
|
749
|
-
const innerMessage =
|
|
750
|
-
const key =
|
|
751
|
-
const timestamp =
|
|
974
|
+
const innerMessage = normalizeMessageContent(message);
|
|
975
|
+
const key = getContentType(innerMessage);
|
|
976
|
+
const timestamp = unixTimestampSeconds(options.timestamp);
|
|
752
977
|
const { quoted, userJid } = options;
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
978
|
+
if (quoted && !isJidNewsletter(jid)) {
|
|
979
|
+
const participant = quoted.key.fromMe
|
|
980
|
+
? userJid // TODO: Add support for LIDs
|
|
981
|
+
: quoted.participant || quoted.key.participant || quoted.key.remoteJid;
|
|
982
|
+
let quotedMsg = normalizeMessageContent(quoted.message);
|
|
983
|
+
const msgType = getContentType(quotedMsg);
|
|
758
984
|
// strip any redundant properties
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
985
|
+
quotedMsg = proto.Message.create({ [msgType]: quotedMsg[msgType] });
|
|
986
|
+
const quotedContent = quotedMsg[msgType];
|
|
987
|
+
if (typeof quotedContent === 'object' && quotedContent && 'contextInfo' in quotedContent) {
|
|
988
|
+
delete quotedContent.contextInfo;
|
|
989
|
+
}
|
|
990
|
+
const contextInfo = ('contextInfo' in innerMessage[key] && innerMessage[key]?.contextInfo) || {};
|
|
991
|
+
contextInfo.participant = jidNormalizedUser(participant);
|
|
992
|
+
contextInfo.stanzaId = quoted.key.id;
|
|
993
|
+
contextInfo.quotedMessage = quotedMsg;
|
|
994
|
+
// if a participant is quoted, then it must be a group
|
|
995
|
+
// hence, remoteJid of group must also be entered
|
|
996
|
+
if (jid !== quoted.key.remoteJid) {
|
|
997
|
+
contextInfo.remoteJid = quoted.key.remoteJid;
|
|
998
|
+
}
|
|
999
|
+
if (contextInfo && innerMessage[key]) {
|
|
1000
|
+
/* @ts-ignore */
|
|
774
1001
|
innerMessage[key].contextInfo = contextInfo;
|
|
775
1002
|
}
|
|
776
1003
|
}
|
|
777
1004
|
if (
|
|
778
1005
|
// if we want to send a disappearing message
|
|
779
|
-
!!
|
|
1006
|
+
!!options?.ephemeralExpiration &&
|
|
780
1007
|
// and it's not a protocol message -- delete, toggle disappear message
|
|
781
1008
|
key !== 'protocolMessage' &&
|
|
782
1009
|
// already not converted to disappearing message
|
|
783
1010
|
key !== 'ephemeralMessage' &&
|
|
784
|
-
//
|
|
785
|
-
!
|
|
1011
|
+
// newsletters don't support ephemeral messages
|
|
1012
|
+
!isJidNewsletter(jid)) {
|
|
1013
|
+
/* @ts-ignore */
|
|
786
1014
|
innerMessage[key].contextInfo = {
|
|
787
1015
|
...(innerMessage[key].contextInfo || {}),
|
|
788
|
-
expiration: options.ephemeralExpiration ||
|
|
1016
|
+
expiration: options.ephemeralExpiration || WA_DEFAULT_EPHEMERAL
|
|
789
1017
|
//ephemeralSettingTimestamp: options.ephemeralOptions.eph_setting_ts?.toString()
|
|
790
1018
|
};
|
|
791
1019
|
}
|
|
792
|
-
message =
|
|
1020
|
+
message = WAProto.Message.create(message);
|
|
793
1021
|
const messageJSON = {
|
|
794
1022
|
key: {
|
|
795
1023
|
remoteJid: jid,
|
|
796
1024
|
fromMe: true,
|
|
797
|
-
id:
|
|
1025
|
+
id: options?.messageId || generateMessageIDV2()
|
|
798
1026
|
},
|
|
799
1027
|
message: message,
|
|
800
1028
|
messageTimestamp: timestamp,
|
|
801
1029
|
messageStubParameters: [],
|
|
802
|
-
participant:
|
|
803
|
-
status:
|
|
1030
|
+
participant: isJidGroup(jid) || isJidStatusBroadcast(jid) ? userJid : undefined, // TODO: Add support for LIDs
|
|
1031
|
+
status: WAMessageStatus.PENDING
|
|
804
1032
|
};
|
|
805
|
-
return
|
|
1033
|
+
return WAProto.WebMessageInfo.fromObject(messageJSON);
|
|
806
1034
|
};
|
|
807
|
-
|
|
808
|
-
const generateWAMessage = async (jid, content, options) => {
|
|
809
|
-
var _a;
|
|
1035
|
+
export const generateWAMessage = async (jid, content, options) => {
|
|
810
1036
|
// ensure msg ID is with every log
|
|
811
|
-
options.logger =
|
|
812
|
-
|
|
1037
|
+
options.logger = options?.logger?.child({ msgId: options.messageId });
|
|
1038
|
+
// Pass jid in the options to generateWAMessageContent
|
|
1039
|
+
return generateWAMessageFromContent(jid, await generateWAMessageContent(content, { ...options, jid }), options);
|
|
813
1040
|
};
|
|
814
|
-
exports.generateWAMessage = generateWAMessage;
|
|
815
1041
|
/** Get the key to access the true type of content */
|
|
816
|
-
const getContentType = (content) => {
|
|
1042
|
+
export const getContentType = (content) => {
|
|
817
1043
|
if (content) {
|
|
818
1044
|
const keys = Object.keys(content);
|
|
819
1045
|
const key = keys.find(k => (k === 'conversation' || k.includes('Message')) && k !== 'senderKeyDistributionMessage');
|
|
820
1046
|
return key;
|
|
821
1047
|
}
|
|
822
1048
|
};
|
|
823
|
-
exports.getContentType = getContentType;
|
|
824
1049
|
/**
|
|
825
1050
|
* Normalizes ephemeral, view once messages to regular message content
|
|
826
1051
|
* Eg. image messages in ephemeral messages, in view once messages etc.
|
|
827
1052
|
* @param content
|
|
828
1053
|
* @returns
|
|
829
1054
|
*/
|
|
830
|
-
const normalizeMessageContent = (content) => {
|
|
1055
|
+
export const normalizeMessageContent = (content) => {
|
|
831
1056
|
if (!content) {
|
|
832
1057
|
return undefined;
|
|
833
1058
|
}
|
|
@@ -841,38 +1066,23 @@ const normalizeMessageContent = (content) => {
|
|
|
841
1066
|
}
|
|
842
1067
|
return content;
|
|
843
1068
|
function getFutureProofMessage(message) {
|
|
844
|
-
return (
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|| (message === null || message === void 0 ? void 0 : message.statusMentionMessage)
|
|
855
|
-
|| (message === null || message === void 0 ? void 0 : message.pollCreationOptionImageMessage)
|
|
856
|
-
|| (message === null || message === void 0 ? void 0 : message.associatedChildMessage)
|
|
857
|
-
|| (message === null || message === void 0 ? void 0 : message.groupStatusMentionMessage)
|
|
858
|
-
|| (message === null || message === void 0 ? void 0 : message.pollCreationMessageV4)
|
|
859
|
-
|| (message === null || message === void 0 ? void 0 : message.pollCreationMessageV5)
|
|
860
|
-
|| (message === null || message === void 0 ? void 0 : message.statusAddYours)
|
|
861
|
-
|| (message === null || message === void 0 ? void 0 : message.groupStatusMessage)
|
|
862
|
-
|| (message === null || message === void 0 ? void 0 : message.limitSharingMessage)
|
|
863
|
-
|| (message === null || message === void 0 ? void 0 : message.botTaskMessage)
|
|
864
|
-
|| (message === null || message === void 0 ? void 0 : message.questionMessage)
|
|
865
|
-
|| (message === null || message === void 0 ? void 0 : message.groupStatusMessageV2)
|
|
866
|
-
|| (message === null || message === void 0 ? void 0 : message.botForwardedMessage));
|
|
1069
|
+
return (message?.ephemeralMessage ||
|
|
1070
|
+
message?.viewOnceMessage ||
|
|
1071
|
+
message?.documentWithCaptionMessage ||
|
|
1072
|
+
message?.viewOnceMessageV2 ||
|
|
1073
|
+
message?.viewOnceMessageV2Extension ||
|
|
1074
|
+
message?.editedMessage ||
|
|
1075
|
+
message?.associatedChildMessage ||
|
|
1076
|
+
message?.groupStatusMessage ||
|
|
1077
|
+
message?.groupStatusMessageV2 ||
|
|
1078
|
+
message?.lottieStickerMessage);
|
|
867
1079
|
}
|
|
868
1080
|
};
|
|
869
|
-
exports.normalizeMessageContent = normalizeMessageContent;
|
|
870
1081
|
/**
|
|
871
1082
|
* Extract the true message content from a message
|
|
872
1083
|
* Eg. extracts the inner message from a disappearing message/view once message
|
|
873
1084
|
*/
|
|
874
|
-
const extractMessageContent = (content) => {
|
|
875
|
-
var _a, _b, _c, _d, _e, _f;
|
|
1085
|
+
export const extractMessageContent = (content) => {
|
|
876
1086
|
const extractFromTemplateMessage = (msg) => {
|
|
877
1087
|
if (msg.imageMessage) {
|
|
878
1088
|
return { imageMessage: msg.imageMessage };
|
|
@@ -888,39 +1098,39 @@ const extractMessageContent = (content) => {
|
|
|
888
1098
|
}
|
|
889
1099
|
else {
|
|
890
1100
|
return {
|
|
891
|
-
conversation: 'contentText' in msg
|
|
892
|
-
? msg.contentText
|
|
893
|
-
: ('hydratedContentText' in msg ? msg.hydratedContentText : '')
|
|
1101
|
+
conversation: 'contentText' in msg ? msg.contentText : 'hydratedContentText' in msg ? msg.hydratedContentText : ''
|
|
894
1102
|
};
|
|
895
1103
|
}
|
|
896
1104
|
};
|
|
897
|
-
content =
|
|
898
|
-
if (content
|
|
1105
|
+
content = normalizeMessageContent(content);
|
|
1106
|
+
if (content?.buttonsMessage) {
|
|
899
1107
|
return extractFromTemplateMessage(content.buttonsMessage);
|
|
900
1108
|
}
|
|
901
|
-
if (
|
|
902
|
-
return extractFromTemplateMessage(
|
|
1109
|
+
if (content?.templateMessage?.hydratedFourRowTemplate) {
|
|
1110
|
+
return extractFromTemplateMessage(content?.templateMessage?.hydratedFourRowTemplate);
|
|
903
1111
|
}
|
|
904
|
-
if (
|
|
905
|
-
return extractFromTemplateMessage(
|
|
1112
|
+
if (content?.templateMessage?.hydratedTemplate) {
|
|
1113
|
+
return extractFromTemplateMessage(content?.templateMessage?.hydratedTemplate);
|
|
906
1114
|
}
|
|
907
|
-
if (
|
|
908
|
-
return extractFromTemplateMessage(
|
|
1115
|
+
if (content?.templateMessage?.fourRowTemplate) {
|
|
1116
|
+
return extractFromTemplateMessage(content?.templateMessage?.fourRowTemplate);
|
|
909
1117
|
}
|
|
910
1118
|
return content;
|
|
911
1119
|
};
|
|
912
|
-
exports.extractMessageContent = extractMessageContent;
|
|
913
1120
|
/**
|
|
914
1121
|
* Returns the device predicted by message ID
|
|
915
1122
|
*/
|
|
916
|
-
const getDevice = (id) => /^3A.{18}$/.test(id)
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
1123
|
+
export const getDevice = (id) => /^3A.{18}$/.test(id)
|
|
1124
|
+
? 'ios'
|
|
1125
|
+
: /^3E.{20}$/.test(id)
|
|
1126
|
+
? 'web'
|
|
1127
|
+
: /^(.{21}|.{32})$/.test(id)
|
|
1128
|
+
? 'android'
|
|
1129
|
+
: /^(3F|.{18}$)/.test(id)
|
|
1130
|
+
? 'desktop'
|
|
1131
|
+
: 'unknown';
|
|
922
1132
|
/** Upserts a receipt in the message */
|
|
923
|
-
const updateMessageWithReceipt = (msg, receipt) => {
|
|
1133
|
+
export const updateMessageWithReceipt = (msg, receipt) => {
|
|
924
1134
|
msg.userReceipt = msg.userReceipt || [];
|
|
925
1135
|
const recp = msg.userReceipt.find(m => m.userJid === receipt.userJid);
|
|
926
1136
|
if (recp) {
|
|
@@ -930,40 +1140,43 @@ const updateMessageWithReceipt = (msg, receipt) => {
|
|
|
930
1140
|
msg.userReceipt.push(receipt);
|
|
931
1141
|
}
|
|
932
1142
|
};
|
|
933
|
-
exports.updateMessageWithReceipt = updateMessageWithReceipt;
|
|
934
1143
|
/** Update the message with a new reaction */
|
|
935
|
-
const updateMessageWithReaction = (msg, reaction) => {
|
|
936
|
-
const authorID =
|
|
937
|
-
const reactions = (msg.reactions || [])
|
|
938
|
-
.filter(r => (0, generics_1.getKeyAuthor)(r.key) !== authorID);
|
|
1144
|
+
export const updateMessageWithReaction = (msg, reaction) => {
|
|
1145
|
+
const authorID = getKeyAuthor(reaction.key);
|
|
1146
|
+
const reactions = (msg.reactions || []).filter(r => getKeyAuthor(r.key) !== authorID);
|
|
939
1147
|
reaction.text = reaction.text || '';
|
|
940
1148
|
reactions.push(reaction);
|
|
941
1149
|
msg.reactions = reactions;
|
|
942
1150
|
};
|
|
943
|
-
exports.updateMessageWithReaction = updateMessageWithReaction;
|
|
944
1151
|
/** Update the message with a new poll update */
|
|
945
|
-
const updateMessageWithPollUpdate = (msg, update) => {
|
|
946
|
-
|
|
947
|
-
const
|
|
948
|
-
|
|
949
|
-
.filter(r => (0, generics_1.getKeyAuthor)(r.pollUpdateMessageKey) !== authorID);
|
|
950
|
-
if ((_b = (_a = update.vote) === null || _a === void 0 ? void 0 : _a.selectedOptions) === null || _b === void 0 ? void 0 : _b.length) {
|
|
1152
|
+
export const updateMessageWithPollUpdate = (msg, update) => {
|
|
1153
|
+
const authorID = getKeyAuthor(update.pollUpdateMessageKey);
|
|
1154
|
+
const reactions = (msg.pollUpdates || []).filter(r => getKeyAuthor(r.pollUpdateMessageKey) !== authorID);
|
|
1155
|
+
if (update.vote?.selectedOptions?.length) {
|
|
951
1156
|
reactions.push(update);
|
|
952
1157
|
}
|
|
953
1158
|
msg.pollUpdates = reactions;
|
|
954
1159
|
};
|
|
955
|
-
|
|
1160
|
+
/** Update the message with a new event response */
|
|
1161
|
+
export const updateMessageWithEventResponse = (msg, update) => {
|
|
1162
|
+
const authorID = getKeyAuthor(update.eventResponseMessageKey);
|
|
1163
|
+
const responses = (msg.eventResponses || []).filter(r => getKeyAuthor(r.eventResponseMessageKey) !== authorID);
|
|
1164
|
+
responses.push(update);
|
|
1165
|
+
msg.eventResponses = responses;
|
|
1166
|
+
};
|
|
956
1167
|
/**
|
|
957
1168
|
* Aggregates all poll updates in a poll.
|
|
958
1169
|
* @param msg the poll creation message
|
|
959
1170
|
* @param meId your jid
|
|
960
1171
|
* @returns A list of options & their voters
|
|
961
1172
|
*/
|
|
962
|
-
function getAggregateVotesInPollMessage({ message, pollUpdates }, meId) {
|
|
963
|
-
|
|
964
|
-
|
|
1173
|
+
export function getAggregateVotesInPollMessage({ message, pollUpdates }, meId) {
|
|
1174
|
+
const opts = message?.pollCreationMessage?.options ||
|
|
1175
|
+
message?.pollCreationMessageV2?.options ||
|
|
1176
|
+
message?.pollCreationMessageV3?.options ||
|
|
1177
|
+
[];
|
|
965
1178
|
const voteHashMap = opts.reduce((acc, opt) => {
|
|
966
|
-
const hash =
|
|
1179
|
+
const hash = sha256(Buffer.from(opt.optionName || '')).toString();
|
|
967
1180
|
acc[hash] = {
|
|
968
1181
|
name: opt.optionName || '',
|
|
969
1182
|
voters: []
|
|
@@ -985,13 +1198,36 @@ function getAggregateVotesInPollMessage({ message, pollUpdates }, meId) {
|
|
|
985
1198
|
};
|
|
986
1199
|
data = voteHashMap[hash];
|
|
987
1200
|
}
|
|
988
|
-
voteHashMap[hash].voters.push(
|
|
1201
|
+
voteHashMap[hash].voters.push(getKeyAuthor(update.pollUpdateMessageKey, meId));
|
|
989
1202
|
}
|
|
990
1203
|
}
|
|
991
1204
|
return Object.values(voteHashMap);
|
|
992
1205
|
}
|
|
1206
|
+
/**
|
|
1207
|
+
* Aggregates all event responses in an event message.
|
|
1208
|
+
* @param msg the event creation message
|
|
1209
|
+
* @param meId your jid
|
|
1210
|
+
* @returns A list of response types & their responders
|
|
1211
|
+
*/
|
|
1212
|
+
export function getAggregateResponsesInEventMessage({ eventResponses }, meId) {
|
|
1213
|
+
const responseTypes = ['GOING', 'NOT_GOING', 'MAYBE'];
|
|
1214
|
+
const responseMap = {};
|
|
1215
|
+
for (const type of responseTypes) {
|
|
1216
|
+
responseMap[type] = {
|
|
1217
|
+
response: type,
|
|
1218
|
+
responders: []
|
|
1219
|
+
};
|
|
1220
|
+
}
|
|
1221
|
+
for (const update of eventResponses || []) {
|
|
1222
|
+
const responseType = update.eventResponse || 'UNKNOWN';
|
|
1223
|
+
if (responseType !== 'UNKNOWN' && responseMap[responseType]) {
|
|
1224
|
+
responseMap[responseType].responders.push(getKeyAuthor(update.eventResponseMessageKey, meId));
|
|
1225
|
+
}
|
|
1226
|
+
}
|
|
1227
|
+
return Object.values(responseMap);
|
|
1228
|
+
}
|
|
993
1229
|
/** Given a list of message keys, aggregates them by chat & sender. Useful for sending read receipts in bulk */
|
|
994
|
-
const aggregateMessageKeysNotFromMe = (keys) => {
|
|
1230
|
+
export const aggregateMessageKeysNotFromMe = (keys) => {
|
|
995
1231
|
const keyMap = {};
|
|
996
1232
|
for (const { remoteJid, id, participant, fromMe } of keys) {
|
|
997
1233
|
if (!fromMe) {
|
|
@@ -1008,40 +1244,34 @@ const aggregateMessageKeysNotFromMe = (keys) => {
|
|
|
1008
1244
|
}
|
|
1009
1245
|
return Object.values(keyMap);
|
|
1010
1246
|
};
|
|
1011
|
-
exports.aggregateMessageKeysNotFromMe = aggregateMessageKeysNotFromMe;
|
|
1012
1247
|
const REUPLOAD_REQUIRED_STATUS = [410, 404];
|
|
1013
1248
|
/**
|
|
1014
1249
|
* Downloads the given message. Throws an error if it's not a media message
|
|
1015
1250
|
*/
|
|
1016
|
-
const downloadMediaMessage = async (message, type, options, ctx) => {
|
|
1017
|
-
const result = await downloadMsg()
|
|
1018
|
-
|
|
1019
|
-
|
|
1020
|
-
|
|
1021
|
-
|
|
1022
|
-
|
|
1023
|
-
|
|
1024
|
-
|
|
1025
|
-
|
|
1026
|
-
message = await ctx.reuploadRequest(message);
|
|
1027
|
-
const result = await downloadMsg();
|
|
1028
|
-
return result;
|
|
1029
|
-
}
|
|
1030
|
-
}
|
|
1251
|
+
export const downloadMediaMessage = async (message, type, options, ctx) => {
|
|
1252
|
+
const result = await downloadMsg().catch(async (error) => {
|
|
1253
|
+
if (ctx &&
|
|
1254
|
+
typeof error?.status === 'number' && // treat errors with status as HTTP failures requiring reupload
|
|
1255
|
+
REUPLOAD_REQUIRED_STATUS.includes(error.status)) {
|
|
1256
|
+
ctx.logger.info({ key: message.key }, 'sending reupload media request...');
|
|
1257
|
+
// request reupload
|
|
1258
|
+
message = await ctx.reuploadRequest(message);
|
|
1259
|
+
const result = await downloadMsg();
|
|
1260
|
+
return result;
|
|
1031
1261
|
}
|
|
1032
1262
|
throw error;
|
|
1033
1263
|
});
|
|
1034
1264
|
return result;
|
|
1035
1265
|
async function downloadMsg() {
|
|
1036
|
-
const mContent =
|
|
1266
|
+
const mContent = extractMessageContent(message.message);
|
|
1037
1267
|
if (!mContent) {
|
|
1038
|
-
throw new
|
|
1268
|
+
throw new Boom('No message present', { statusCode: 400, data: message });
|
|
1039
1269
|
}
|
|
1040
|
-
const contentType =
|
|
1041
|
-
let mediaType = contentType
|
|
1270
|
+
const contentType = getContentType(mContent);
|
|
1271
|
+
let mediaType = contentType?.replace('Message', '');
|
|
1042
1272
|
const media = mContent[contentType];
|
|
1043
1273
|
if (!media || typeof media !== 'object' || (!('url' in media) && !('thumbnailDirectPath' in media))) {
|
|
1044
|
-
throw new
|
|
1274
|
+
throw new Boom(`"${contentType}" message is not a media message`);
|
|
1045
1275
|
}
|
|
1046
1276
|
let download;
|
|
1047
1277
|
if ('thumbnailDirectPath' in media && !('url' in media)) {
|
|
@@ -1054,7 +1284,7 @@ const downloadMediaMessage = async (message, type, options, ctx) => {
|
|
|
1054
1284
|
else {
|
|
1055
1285
|
download = media;
|
|
1056
1286
|
}
|
|
1057
|
-
const stream = await
|
|
1287
|
+
const stream = await downloadContentFromMessage(download, mediaType, options);
|
|
1058
1288
|
if (type === 'buffer') {
|
|
1059
1289
|
const bufferArray = [];
|
|
1060
1290
|
for await (const chunk of stream) {
|
|
@@ -1065,37 +1295,40 @@ const downloadMediaMessage = async (message, type, options, ctx) => {
|
|
|
1065
1295
|
return stream;
|
|
1066
1296
|
}
|
|
1067
1297
|
};
|
|
1068
|
-
exports.downloadMediaMessage = downloadMediaMessage;
|
|
1069
1298
|
/** Checks whether the given message is a media message; if it is returns the inner content */
|
|
1070
|
-
const assertMediaContent = (content) => {
|
|
1071
|
-
content =
|
|
1072
|
-
const mediaContent =
|
|
1073
|
-
|
|
1074
|
-
|
|
1075
|
-
|
|
1076
|
-
|
|
1299
|
+
export const assertMediaContent = (content) => {
|
|
1300
|
+
content = extractMessageContent(content);
|
|
1301
|
+
const mediaContent = content?.documentMessage ||
|
|
1302
|
+
content?.imageMessage ||
|
|
1303
|
+
content?.videoMessage ||
|
|
1304
|
+
content?.audioMessage ||
|
|
1305
|
+
content?.stickerMessage;
|
|
1077
1306
|
if (!mediaContent) {
|
|
1078
|
-
throw new
|
|
1307
|
+
throw new Boom('given message is not a media message', { statusCode: 400, data: content });
|
|
1079
1308
|
}
|
|
1080
1309
|
return mediaContent;
|
|
1081
1310
|
};
|
|
1082
|
-
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
|
|
1311
|
+
/**
|
|
1312
|
+
* Normaliza cualquier identificador (número suelto, JID con @lid, o JID ya completo)
|
|
1313
|
+
* a un JID válido de tipo @s.whatsapp.net
|
|
1314
|
+
*/
|
|
1315
|
+
export const toJid = (id) => {
|
|
1316
|
+
if (!id) {
|
|
1086
1317
|
return '';
|
|
1087
|
-
|
|
1318
|
+
}
|
|
1319
|
+
if (id.endsWith('@lid')) {
|
|
1088
1320
|
return id.replace('@lid', '@s.whatsapp.net');
|
|
1089
|
-
|
|
1321
|
+
}
|
|
1322
|
+
if (id.includes('@')) {
|
|
1090
1323
|
return id;
|
|
1324
|
+
}
|
|
1091
1325
|
return `${id}@s.whatsapp.net`;
|
|
1092
1326
|
};
|
|
1093
|
-
|
|
1094
|
-
const getSenderLid = (message) => {
|
|
1095
|
-
const sender = message.key
|
|
1096
|
-
const user =
|
|
1097
|
-
const lid =
|
|
1098
|
-
console.log('sender lid:', lid);
|
|
1327
|
+
/** Obtiene el JID y el LID del remitente de un mensaje */
|
|
1328
|
+
export const getSenderLid = (message) => {
|
|
1329
|
+
const sender = message.key?.participant || message.key?.remoteJid;
|
|
1330
|
+
const user = jidDecode(sender)?.user || '';
|
|
1331
|
+
const lid = jidEncode(user, 'lid');
|
|
1099
1332
|
return { jid: sender, lid };
|
|
1100
1333
|
};
|
|
1101
|
-
|
|
1334
|
+
//# sourceMappingURL=messages.js.map
|