@queenanya/baileys 8.6.0-beta → 9.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/WAProto/GenerateStatics.sh +3 -0
- package/WAProto/WAProto.proto +4633 -0
- package/WAProto/fix-imports.js +29 -0
- package/WAProto/index.d.ts +2165 -45253
- package/WAProto/index.js +45236 -130529
- package/lib/Defaults/index.d.ts +14 -3
- package/lib/Defaults/index.d.ts.map +1 -0
- package/lib/Defaults/index.js +64 -55
- 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 -51
- 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 +9 -21
- 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 +258 -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 +171 -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 +2 -2
- package/lib/Socket/Client/types.d.ts.map +1 -0
- package/lib/Socket/Client/types.js +4 -6
- package/lib/Socket/Client/types.js.map +1 -0
- package/lib/Socket/Client/websocket.d.ts +2 -2
- package/lib/Socket/Client/websocket.d.ts.map +1 -0
- package/lib/Socket/Client/websocket.js +15 -37
- package/lib/Socket/Client/websocket.js.map +1 -0
- package/lib/Socket/business.d.ts +106 -94
- package/lib/Socket/business.d.ts.map +1 -0
- package/lib/Socket/business.js +159 -43
- package/lib/Socket/business.js.map +1 -0
- package/lib/Socket/chats.d.ts +39 -27
- package/lib/Socket/chats.d.ts.map +1 -0
- package/lib/Socket/chats.js +271 -261
- package/lib/Socket/chats.js.map +1 -0
- package/lib/Socket/communities.d.ts +111 -86
- package/lib/Socket/communities.d.ts.map +1 -0
- package/lib/Socket/communities.js +138 -70
- package/lib/Socket/communities.js.map +1 -0
- package/lib/Socket/groups.d.ts +53 -43
- package/lib/Socket/groups.d.ts.map +1 -0
- package/lib/Socket/groups.js +94 -99
- package/lib/Socket/groups.js.map +1 -0
- package/lib/Socket/index.d.ts +133 -108
- package/lib/Socket/index.d.ts.map +1 -0
- package/lib/Socket/index.js +17 -9
- package/lib/Socket/index.js.map +1 -0
- package/lib/Socket/messages-recv.d.ts +90 -82
- package/lib/Socket/messages-recv.d.ts.map +1 -0
- package/lib/Socket/messages-recv.js +635 -480
- package/lib/Socket/messages-recv.js.map +1 -0
- package/lib/Socket/messages-send.d.ts +90 -76
- package/lib/Socket/messages-send.d.ts.map +1 -0
- package/lib/Socket/messages-send.js +476 -402
- package/lib/Socket/messages-send.js.map +1 -0
- package/lib/Socket/mex.d.ts +3 -0
- package/lib/Socket/mex.d.ts.map +1 -0
- package/lib/Socket/mex.js +42 -0
- package/lib/Socket/mex.js.map +1 -0
- package/lib/Socket/newsletter.d.ts +83 -73
- package/lib/Socket/newsletter.d.ts.map +1 -0
- package/lib/Socket/newsletter.js +181 -202
- package/lib/Socket/newsletter.js.map +1 -0
- package/lib/Socket/socket.d.ts +24 -16
- package/lib/Socket/socket.d.ts.map +1 -0
- package/lib/Socket/socket.js +402 -196
- package/lib/Socket/socket.js.map +1 -0
- package/lib/Types/Auth.d.ts +13 -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 +1 -0
- package/lib/Types/Call.d.ts.map +1 -0
- package/lib/Types/Call.js +2 -2
- package/lib/Types/Call.js.map +1 -0
- package/lib/Types/Chat.d.ts +18 -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 +5 -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 +36 -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 +12 -11
- 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 +51 -148
- package/lib/Types/Message.d.ts.map +1 -0
- package/lib/Types/Message.js +11 -7
- package/lib/Types/Message.js.map +1 -0
- package/lib/Types/Newsletter.d.ts +173 -71
- package/lib/Types/Newsletter.d.ts.map +1 -0
- package/lib/Types/Newsletter.js +54 -11
- package/lib/Types/Newsletter.js.map +1 -0
- package/lib/Types/Product.d.ts +2 -1
- package/lib/Types/Product.d.ts.map +1 -0
- package/lib/Types/Product.js +2 -2
- package/lib/Types/Product.js.map +1 -0
- package/lib/Types/Signal.d.ts +20 -1
- package/lib/Types/Signal.d.ts.map +1 -0
- package/lib/Types/Signal.js +2 -2
- package/lib/Types/Signal.js.map +1 -0
- package/lib/Types/Socket.d.ts +34 -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 +14 -2
- package/lib/Types/State.d.ts.map +1 -0
- package/lib/Types/State.js +13 -2
- package/lib/Types/State.js.map +1 -0
- package/lib/Types/USync.d.ts +3 -2
- package/lib/Types/USync.d.ts.map +1 -0
- package/lib/Types/USync.js +2 -2
- package/lib/Types/USync.js.map +1 -0
- package/lib/Types/index.d.ts +15 -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 +5 -4
- package/lib/Utils/auth-utils.d.ts.map +1 -0
- package/lib/Utils/auth-utils.js +199 -141
- package/lib/Utils/auth-utils.js.map +1 -0
- package/lib/Utils/baileys-event-stream.d.ts +2 -1
- package/lib/Utils/baileys-event-stream.d.ts.map +1 -0
- package/lib/Utils/baileys-event-stream.js +15 -22
- package/lib/Utils/baileys-event-stream.js.map +1 -0
- package/lib/Utils/browser-utils.d.ts +4 -0
- package/lib/Utils/browser-utils.d.ts.map +1 -0
- package/lib/Utils/browser-utils.js +28 -0
- package/lib/Utils/browser-utils.js.map +1 -0
- package/lib/Utils/business.d.ts +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/chat-utils.d.ts +11 -11
- package/lib/Utils/chat-utils.d.ts.map +1 -0
- package/lib/Utils/chat-utils.js +203 -194
- package/lib/Utils/chat-utils.js.map +1 -0
- package/lib/Utils/crypto.d.ts +8 -7
- package/lib/Utils/crypto.d.ts.map +1 -0
- package/lib/Utils/crypto.js +50 -101
- package/lib/Utils/crypto.js.map +1 -0
- package/lib/Utils/decode-wa-message.d.ts +18 -5
- package/lib/Utils/decode-wa-message.d.ts.map +1 -0
- package/lib/Utils/decode-wa-message.js +134 -62
- package/lib/Utils/decode-wa-message.js.map +1 -0
- package/lib/Utils/event-buffer.d.ts +6 -7
- package/lib/Utils/event-buffer.d.ts.map +1 -0
- package/lib/Utils/event-buffer.js +99 -69
- package/lib/Utils/event-buffer.js.map +1 -0
- package/lib/Utils/generics.d.ts +57 -68
- package/lib/Utils/generics.d.ts.map +1 -0
- package/lib/Utils/generics.js +179 -356
- package/lib/Utils/generics.js.map +1 -0
- package/lib/Utils/history.d.ts +10 -10
- package/lib/Utils/history.d.ts.map +1 -0
- package/lib/Utils/history.js +37 -50
- package/lib/Utils/history.js.map +1 -0
- package/lib/Utils/index.d.ts +21 -17
- package/lib/Utils/index.d.ts.map +1 -0
- package/lib/Utils/index.js +21 -33
- package/lib/Utils/index.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 +15 -56
- package/lib/Utils/link-preview.js.map +1 -0
- package/lib/Utils/logger.d.ts +8 -6
- package/lib/Utils/logger.d.ts.map +1 -0
- package/lib/Utils/logger.js +3 -7
- package/lib/Utils/logger.js.map +1 -0
- package/lib/Utils/lt-hash.d.ts +9 -8
- package/lib/Utils/lt-hash.d.ts.map +1 -0
- package/lib/Utils/lt-hash.js +23 -26
- package/lib/Utils/lt-hash.js.map +1 -0
- package/lib/Utils/make-mutex.d.ts +1 -0
- package/lib/Utils/make-mutex.d.ts.map +1 -0
- package/lib/Utils/make-mutex.js +7 -10
- package/lib/Utils/make-mutex.js.map +1 -0
- package/lib/Utils/message-retry-manager.d.ts +82 -0
- package/lib/Utils/message-retry-manager.d.ts.map +1 -0
- package/lib/Utils/message-retry-manager.js +149 -0
- package/lib/Utils/message-retry-manager.js.map +1 -0
- package/lib/Utils/messages-media.d.ts +32 -38
- package/lib/Utils/messages-media.d.ts.map +1 -0
- package/lib/Utils/messages-media.js +283 -496
- package/lib/Utils/messages-media.js.map +1 -0
- package/lib/Utils/messages.d.ts +11 -10
- package/lib/Utils/messages.d.ts.map +1 -0
- package/lib/Utils/messages.js +309 -519
- package/lib/Utils/messages.js.map +1 -0
- package/lib/Utils/noise-handler.d.ts +5 -4
- package/lib/Utils/noise-handler.d.ts.map +1 -0
- package/lib/Utils/noise-handler.js +23 -26
- package/lib/Utils/noise-handler.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 +12 -12
- package/lib/Utils/process-message.d.ts.map +1 -0
- package/lib/Utils/process-message.js +196 -155
- package/lib/Utils/process-message.js.map +1 -0
- package/lib/Utils/signal.d.ts +7 -6
- package/lib/Utils/signal.d.ts.map +1 -0
- package/lib/Utils/signal.js +70 -64
- package/lib/Utils/signal.js.map +1 -0
- package/lib/Utils/use-multi-file-auth-state.d.ts +2 -1
- package/lib/Utils/use-multi-file-auth-state.d.ts.map +1 -0
- package/lib/Utils/use-multi-file-auth-state.js +23 -27
- package/lib/Utils/use-multi-file-auth-state.js.map +1 -0
- package/lib/Utils/use-single-file-auth-state.d.ts +3 -2
- package/lib/Utils/use-single-file-auth-state.d.ts.map +1 -0
- package/lib/Utils/use-single-file-auth-state.js +63 -41
- package/lib/Utils/use-single-file-auth-state.js.map +1 -0
- package/lib/Utils/validate-connection.d.ts +4 -3
- package/lib/Utils/validate-connection.d.ts.map +1 -0
- package/lib/Utils/validate-connection.js +99 -77
- package/lib/Utils/validate-connection.js.map +1 -0
- package/lib/WABinary/constants.d.ts +1 -0
- package/lib/WABinary/constants.d.ts.map +1 -0
- package/lib/WABinary/constants.js +9 -11
- package/lib/WABinary/constants.js.map +1 -0
- package/lib/WABinary/decode.d.ts +2 -1
- package/lib/WABinary/decode.d.ts.map +1 -0
- package/lib/WABinary/decode.js +25 -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 +14 -48
- package/lib/WABinary/encode.js.map +1 -0
- package/lib/WABinary/generic-utils.d.ts +4 -3
- package/lib/WABinary/generic-utils.d.ts.map +1 -0
- package/lib/WABinary/generic-utils.js +31 -39
- 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 +21 -11
- package/lib/WABinary/jid-utils.d.ts.map +1 -0
- package/lib/WABinary/jid-utils.js +71 -60
- 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 +8 -11
- package/lib/WAUSync/Protocols/USyncContactProtocol.js.map +1 -0
- package/lib/WAUSync/Protocols/USyncDeviceProtocol.d.ts +3 -2
- package/lib/WAUSync/Protocols/USyncDeviceProtocol.d.ts.map +1 -0
- package/lib/WAUSync/Protocols/USyncDeviceProtocol.js +11 -14
- package/lib/WAUSync/Protocols/USyncDeviceProtocol.js.map +1 -0
- package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.d.ts +3 -2
- package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.d.ts.map +1 -0
- package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.js +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/UsyncBotProfileProtocol.d.ts +4 -3
- package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.d.ts.map +1 -0
- package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.js +20 -22
- package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.js.map +1 -0
- package/lib/WAUSync/Protocols/UsyncLIDProtocol.d.ts +5 -3
- package/lib/WAUSync/Protocols/UsyncLIDProtocol.d.ts.map +1 -0
- package/lib/WAUSync/Protocols/UsyncLIDProtocol.js +13 -8
- package/lib/WAUSync/Protocols/UsyncLIDProtocol.js.map +1 -0
- package/lib/WAUSync/Protocols/index.d.ts +5 -4
- package/lib/WAUSync/Protocols/index.d.ts.map +1 -0
- package/lib/WAUSync/Protocols/index.js +5 -20
- package/lib/WAUSync/Protocols/index.js.map +1 -0
- package/lib/WAUSync/USyncQuery.d.ts +5 -4
- package/lib/WAUSync/USyncQuery.d.ts.map +1 -0
- package/lib/WAUSync/USyncQuery.js +40 -35
- package/lib/WAUSync/USyncQuery.js.map +1 -0
- package/lib/WAUSync/USyncUser.d.ts +6 -5
- package/lib/WAUSync/USyncUser.d.ts.map +1 -0
- package/lib/WAUSync/USyncUser.js +2 -5
- package/lib/WAUSync/USyncUser.js.map +1 -0
- package/lib/WAUSync/index.d.ts +4 -3
- package/lib/WAUSync/index.d.ts.map +1 -0
- package/lib/WAUSync/index.js +4 -19
- package/lib/WAUSync/index.js.map +1 -0
- package/lib/index.d.ts +10 -12
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +11 -34
- package/lib/index.js.map +1 -0
- package/package.json +55 -65
- package/CHANGELOG.md +0 -4
- package/README-anya.md +0 -459
- package/README-shizo.md +0 -445
- package/README-whiskey.md +0 -44
- package/lib/Defaults/baileys-version.json +0 -3
- package/lib/Signal/Group/queue-job.d.ts +0 -1
- package/lib/Signal/Group/queue-job.js +0 -57
- package/lib/Socket/usync.d.ts +0 -36
- package/lib/Socket/usync.js +0 -70
- package/lib/Store/index.d.ts +0 -2
- package/lib/Store/index.js +0 -8
- package/lib/Store/make-in-memory-store.d.ts +0 -118
- package/lib/Store/make-in-memory-store.js +0 -429
- package/lib/Store/make-ordered-dictionary.d.ts +0 -13
- package/lib/Store/make-ordered-dictionary.js +0 -81
- package/lib/Store/object-repository.d.ts +0 -10
- package/lib/Store/object-repository.js +0 -27
- package/lib/WAMedia/index.d.ts +0 -2
- package/lib/WAMedia/index.js +0 -18
- package/lib/WAMedia/media-messages.d.ts +0 -18
- package/lib/WAMedia/media-messages.js +0 -102
- package/lib/WAMedia/media-set.d.ts +0 -9
- package/lib/WAMedia/media-set.js +0 -312
package/lib/Utils/messages.js
CHANGED
|
@@ -1,57 +1,48 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
};
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
const WAProto_1 = require("../../WAProto");
|
|
13
|
-
const Defaults_1 = require("../Defaults");
|
|
14
|
-
const Types_1 = require("../Types");
|
|
15
|
-
const WABinary_1 = require("../WABinary");
|
|
16
|
-
const crypto_2 = require("./crypto");
|
|
17
|
-
const generics_1 = require("./generics");
|
|
18
|
-
const messages_media_1 = require("./messages-media");
|
|
1
|
+
import { Boom } from '@hapi/boom';
|
|
2
|
+
import { randomBytes } from 'crypto';
|
|
3
|
+
import { promises as fs } from 'fs';
|
|
4
|
+
import {} from 'stream';
|
|
5
|
+
import { proto } from '../../WAProto/index.js';
|
|
6
|
+
import { CALL_AUDIO_PREFIX, CALL_VIDEO_PREFIX, MEDIA_KEYS, URL_REGEX, WA_DEFAULT_EPHEMERAL } from '../Defaults/index.js';
|
|
7
|
+
import { WAMessageStatus, WAProto } from '../Types/index.js';
|
|
8
|
+
import { isJidGroup, isJidNewsletter, isJidStatusBroadcast, jidNormalizedUser } from '../WABinary/index.js';
|
|
9
|
+
import { sha256 } from './crypto.js';
|
|
10
|
+
import { generateMessageIDV2, getKeyAuthor, unixTimestampSeconds } from './generics.js';
|
|
11
|
+
import { downloadContentFromMessage, encryptedStream, generateThumbnail, getAudioDuration, getAudioWaveform, getRawMediaUploadData } from './messages-media.js';
|
|
19
12
|
const MIMETYPE_MAP = {
|
|
20
13
|
image: 'image/jpeg',
|
|
21
14
|
video: 'video/mp4',
|
|
22
15
|
document: 'application/pdf',
|
|
23
16
|
audio: 'audio/ogg; codecs=opus',
|
|
24
17
|
sticker: 'image/webp',
|
|
25
|
-
'product-catalog-image': 'image/jpeg'
|
|
18
|
+
'product-catalog-image': 'image/jpeg'
|
|
26
19
|
};
|
|
27
20
|
const MessageTypeProto = {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
21
|
+
image: WAProto.Message.ImageMessage,
|
|
22
|
+
video: WAProto.Message.VideoMessage,
|
|
23
|
+
audio: WAProto.Message.AudioMessage,
|
|
24
|
+
sticker: WAProto.Message.StickerMessage,
|
|
25
|
+
document: WAProto.Message.DocumentMessage
|
|
33
26
|
};
|
|
34
|
-
const ButtonType = WAProto_1.proto.Message.ButtonsMessage.HeaderType;
|
|
35
27
|
/**
|
|
36
28
|
* Uses a regex to test whether the string contains a URL, and returns the URL if it does.
|
|
37
29
|
* @param text eg. hello https://google.com
|
|
38
30
|
* @returns the URL, eg. https://google.com
|
|
39
31
|
*/
|
|
40
|
-
const extractUrlFromText = (text) =>
|
|
41
|
-
|
|
42
|
-
const
|
|
43
|
-
const url = (0, exports.extractUrlFromText)(text);
|
|
32
|
+
export const extractUrlFromText = (text) => text.match(URL_REGEX)?.[0];
|
|
33
|
+
export const generateLinkPreviewIfRequired = async (text, getUrlInfo, logger) => {
|
|
34
|
+
const url = extractUrlFromText(text);
|
|
44
35
|
if (!!getUrlInfo && url) {
|
|
45
36
|
try {
|
|
46
37
|
const urlInfo = await getUrlInfo(url);
|
|
47
38
|
return urlInfo;
|
|
48
39
|
}
|
|
49
|
-
catch (error) {
|
|
50
|
-
|
|
40
|
+
catch (error) {
|
|
41
|
+
// ignore if fails
|
|
42
|
+
logger?.warn({ trace: error.stack }, 'url generation failed');
|
|
51
43
|
}
|
|
52
44
|
}
|
|
53
45
|
};
|
|
54
|
-
exports.generateLinkPreviewIfRequired = generateLinkPreviewIfRequired;
|
|
55
46
|
const assertColor = async (color) => {
|
|
56
47
|
let assertedColor;
|
|
57
48
|
if (typeof color === 'number') {
|
|
@@ -66,16 +57,16 @@ const assertColor = async (color) => {
|
|
|
66
57
|
return assertedColor;
|
|
67
58
|
}
|
|
68
59
|
};
|
|
69
|
-
const prepareWAMessageMedia = async (message, options) => {
|
|
60
|
+
export const prepareWAMessageMedia = async (message, options) => {
|
|
70
61
|
const logger = options.logger;
|
|
71
62
|
let mediaType;
|
|
72
|
-
for (const key of
|
|
63
|
+
for (const key of MEDIA_KEYS) {
|
|
73
64
|
if (key in message) {
|
|
74
65
|
mediaType = key;
|
|
75
66
|
}
|
|
76
67
|
}
|
|
77
68
|
if (!mediaType) {
|
|
78
|
-
throw new
|
|
69
|
+
throw new Boom('Invalid media type', { statusCode: 400 });
|
|
79
70
|
}
|
|
80
71
|
const uploadData = {
|
|
81
72
|
...message,
|
|
@@ -84,102 +75,132 @@ const prepareWAMessageMedia = async (message, options) => {
|
|
|
84
75
|
delete uploadData[mediaType];
|
|
85
76
|
// check if cacheable + generate cache key
|
|
86
77
|
const cacheableKey = typeof uploadData.media === 'object' &&
|
|
87
|
-
|
|
78
|
+
'url' in uploadData.media &&
|
|
88
79
|
!!uploadData.media.url &&
|
|
89
|
-
!!options.mediaCache &&
|
|
90
|
-
|
|
91
|
-
mediaType + ':' + uploadData.media.url.toString());
|
|
80
|
+
!!options.mediaCache &&
|
|
81
|
+
mediaType + ':' + uploadData.media.url.toString();
|
|
92
82
|
if (mediaType === 'document' && !uploadData.fileName) {
|
|
93
83
|
uploadData.fileName = 'file';
|
|
94
84
|
}
|
|
95
85
|
if (!uploadData.mimetype) {
|
|
96
86
|
uploadData.mimetype = MIMETYPE_MAP[mediaType];
|
|
97
87
|
}
|
|
98
|
-
// check for cache hit
|
|
99
88
|
if (cacheableKey) {
|
|
100
|
-
const mediaBuff = options.mediaCache.get(cacheableKey);
|
|
89
|
+
const mediaBuff = await options.mediaCache.get(cacheableKey);
|
|
101
90
|
if (mediaBuff) {
|
|
102
|
-
logger
|
|
103
|
-
const obj =
|
|
91
|
+
logger?.debug({ cacheableKey }, 'got media cache hit');
|
|
92
|
+
const obj = proto.Message.decode(mediaBuff);
|
|
104
93
|
const key = `${mediaType}Message`;
|
|
105
94
|
Object.assign(obj[key], { ...uploadData, media: undefined });
|
|
106
95
|
return obj;
|
|
107
96
|
}
|
|
108
97
|
}
|
|
98
|
+
const isNewsletter = !!options.jid && isJidNewsletter(options.jid);
|
|
99
|
+
if (isNewsletter) {
|
|
100
|
+
logger?.info({ key: cacheableKey }, 'Preparing raw media for newsletter');
|
|
101
|
+
const { filePath, fileSha256, fileLength } = await getRawMediaUploadData(uploadData.media, options.mediaTypeOverride || mediaType, logger);
|
|
102
|
+
const fileSha256B64 = fileSha256.toString('base64');
|
|
103
|
+
const { mediaUrl, directPath } = await options.upload(filePath, {
|
|
104
|
+
fileEncSha256B64: fileSha256B64,
|
|
105
|
+
mediaType: mediaType,
|
|
106
|
+
timeoutMs: options.mediaUploadTimeoutMs
|
|
107
|
+
});
|
|
108
|
+
await fs.unlink(filePath);
|
|
109
|
+
const obj = WAProto.Message.fromObject({
|
|
110
|
+
// todo: add more support here
|
|
111
|
+
[`${mediaType}Message`]: MessageTypeProto[mediaType].fromObject({
|
|
112
|
+
url: mediaUrl,
|
|
113
|
+
directPath,
|
|
114
|
+
fileSha256,
|
|
115
|
+
fileLength,
|
|
116
|
+
...uploadData,
|
|
117
|
+
media: undefined
|
|
118
|
+
})
|
|
119
|
+
});
|
|
120
|
+
if (uploadData.ptv) {
|
|
121
|
+
obj.ptvMessage = obj.videoMessage;
|
|
122
|
+
delete obj.videoMessage;
|
|
123
|
+
}
|
|
124
|
+
if (obj.stickerMessage) {
|
|
125
|
+
obj.stickerMessage.stickerSentTs = Date.now();
|
|
126
|
+
}
|
|
127
|
+
if (cacheableKey) {
|
|
128
|
+
logger?.debug({ cacheableKey }, 'set cache');
|
|
129
|
+
await options.mediaCache.set(cacheableKey, WAProto.Message.encode(obj).finish());
|
|
130
|
+
}
|
|
131
|
+
return obj;
|
|
132
|
+
}
|
|
109
133
|
const requiresDurationComputation = mediaType === 'audio' && typeof uploadData.seconds === 'undefined';
|
|
110
|
-
const requiresThumbnailComputation = (mediaType === 'image' || mediaType === 'video') &&
|
|
111
|
-
(typeof uploadData['jpegThumbnail'] === 'undefined');
|
|
134
|
+
const requiresThumbnailComputation = (mediaType === 'image' || mediaType === 'video') && typeof uploadData['jpegThumbnail'] === 'undefined';
|
|
112
135
|
const requiresWaveformProcessing = mediaType === 'audio' && uploadData.ptt === true;
|
|
113
136
|
const requiresAudioBackground = options.backgroundColor && mediaType === 'audio' && uploadData.ptt === true;
|
|
114
137
|
const requiresOriginalForSomeProcessing = requiresDurationComputation || requiresThumbnailComputation;
|
|
115
|
-
const { mediaKey,
|
|
138
|
+
const { mediaKey, encFilePath, originalFilePath, fileEncSha256, fileSha256, fileLength } = await encryptedStream(uploadData.media, options.mediaTypeOverride || mediaType, {
|
|
116
139
|
logger,
|
|
117
140
|
saveOriginalFileIfRequired: requiresOriginalForSomeProcessing,
|
|
118
141
|
opts: options.options
|
|
119
142
|
});
|
|
120
|
-
|
|
121
|
-
const
|
|
122
|
-
const [{ mediaUrl, directPath, handle }] = await Promise.all([
|
|
143
|
+
const fileEncSha256B64 = fileEncSha256.toString('base64');
|
|
144
|
+
const [{ mediaUrl, directPath }] = await Promise.all([
|
|
123
145
|
(async () => {
|
|
124
|
-
const result = await options.upload(
|
|
125
|
-
|
|
146
|
+
const result = await options.upload(encFilePath, {
|
|
147
|
+
fileEncSha256B64,
|
|
148
|
+
mediaType,
|
|
149
|
+
timeoutMs: options.mediaUploadTimeoutMs
|
|
150
|
+
});
|
|
151
|
+
logger?.debug({ mediaType, cacheableKey }, 'uploaded media');
|
|
126
152
|
return result;
|
|
127
153
|
})(),
|
|
128
154
|
(async () => {
|
|
129
155
|
try {
|
|
130
156
|
if (requiresThumbnailComputation) {
|
|
131
|
-
const { thumbnail, originalImageDimensions } = await
|
|
157
|
+
const { thumbnail, originalImageDimensions } = await generateThumbnail(originalFilePath, mediaType, options);
|
|
132
158
|
uploadData.jpegThumbnail = thumbnail;
|
|
133
159
|
if (!uploadData.width && originalImageDimensions) {
|
|
134
160
|
uploadData.width = originalImageDimensions.width;
|
|
135
161
|
uploadData.height = originalImageDimensions.height;
|
|
136
|
-
logger
|
|
162
|
+
logger?.debug('set dimensions');
|
|
137
163
|
}
|
|
138
|
-
logger
|
|
164
|
+
logger?.debug('generated thumbnail');
|
|
139
165
|
}
|
|
140
166
|
if (requiresDurationComputation) {
|
|
141
|
-
uploadData.seconds = await
|
|
142
|
-
logger
|
|
167
|
+
uploadData.seconds = await getAudioDuration(originalFilePath);
|
|
168
|
+
logger?.debug('computed audio duration');
|
|
143
169
|
}
|
|
144
170
|
if (requiresWaveformProcessing) {
|
|
145
|
-
uploadData.waveform = await
|
|
146
|
-
logger
|
|
171
|
+
uploadData.waveform = await getAudioWaveform(originalFilePath, logger);
|
|
172
|
+
logger?.debug('processed waveform');
|
|
147
173
|
}
|
|
148
174
|
if (requiresAudioBackground) {
|
|
149
175
|
uploadData.backgroundArgb = await assertColor(options.backgroundColor);
|
|
150
|
-
logger
|
|
176
|
+
logger?.debug('computed backgroundColor audio status');
|
|
151
177
|
}
|
|
152
178
|
}
|
|
153
179
|
catch (error) {
|
|
154
|
-
logger
|
|
180
|
+
logger?.warn({ trace: error.stack }, 'failed to obtain extra info');
|
|
155
181
|
}
|
|
156
|
-
})()
|
|
157
|
-
])
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
// remove tmp files
|
|
163
|
-
if (didSaveToTmpPath && bodyPath) {
|
|
164
|
-
try {
|
|
165
|
-
await fs_1.promises.access(bodyPath);
|
|
166
|
-
await fs_1.promises.unlink(bodyPath);
|
|
167
|
-
logger === null || logger === void 0 ? void 0 : logger.debug('removed tmp file');
|
|
168
|
-
}
|
|
169
|
-
catch (error) {
|
|
170
|
-
logger === null || logger === void 0 ? void 0 : logger.warn('failed to remove tmp file');
|
|
182
|
+
})()
|
|
183
|
+
]).finally(async () => {
|
|
184
|
+
try {
|
|
185
|
+
await fs.unlink(encFilePath);
|
|
186
|
+
if (originalFilePath) {
|
|
187
|
+
await fs.unlink(originalFilePath);
|
|
171
188
|
}
|
|
189
|
+
logger?.debug('removed tmp files');
|
|
190
|
+
}
|
|
191
|
+
catch (error) {
|
|
192
|
+
logger?.warn('failed to remove tmp file');
|
|
172
193
|
}
|
|
173
194
|
});
|
|
174
|
-
const obj =
|
|
195
|
+
const obj = WAProto.Message.fromObject({
|
|
175
196
|
[`${mediaType}Message`]: MessageTypeProto[mediaType].fromObject({
|
|
176
|
-
url:
|
|
197
|
+
url: mediaUrl,
|
|
177
198
|
directPath,
|
|
178
|
-
mediaKey
|
|
179
|
-
fileEncSha256
|
|
199
|
+
mediaKey,
|
|
200
|
+
fileEncSha256,
|
|
180
201
|
fileSha256,
|
|
181
202
|
fileLength,
|
|
182
|
-
mediaKeyTimestamp:
|
|
203
|
+
mediaKeyTimestamp: unixTimestampSeconds(),
|
|
183
204
|
...uploadData,
|
|
184
205
|
media: undefined
|
|
185
206
|
})
|
|
@@ -189,67 +210,63 @@ const prepareWAMessageMedia = async (message, options) => {
|
|
|
189
210
|
delete obj.videoMessage;
|
|
190
211
|
}
|
|
191
212
|
if (cacheableKey) {
|
|
192
|
-
logger
|
|
193
|
-
options.mediaCache.set(cacheableKey,
|
|
213
|
+
logger?.debug({ cacheableKey }, 'set cache');
|
|
214
|
+
await options.mediaCache.set(cacheableKey, WAProto.Message.encode(obj).finish());
|
|
194
215
|
}
|
|
195
216
|
return obj;
|
|
196
217
|
};
|
|
197
|
-
|
|
198
|
-
const prepareDisappearingMessageSettingContent = (ephemeralExpiration) => {
|
|
218
|
+
export const prepareDisappearingMessageSettingContent = (ephemeralExpiration) => {
|
|
199
219
|
ephemeralExpiration = ephemeralExpiration || 0;
|
|
200
220
|
const content = {
|
|
201
221
|
ephemeralMessage: {
|
|
202
222
|
message: {
|
|
203
223
|
protocolMessage: {
|
|
204
|
-
type:
|
|
224
|
+
type: WAProto.Message.ProtocolMessage.Type.EPHEMERAL_SETTING,
|
|
205
225
|
ephemeralExpiration
|
|
206
226
|
}
|
|
207
227
|
}
|
|
208
228
|
}
|
|
209
229
|
};
|
|
210
|
-
return
|
|
230
|
+
return WAProto.Message.fromObject(content);
|
|
211
231
|
};
|
|
212
|
-
exports.prepareDisappearingMessageSettingContent = prepareDisappearingMessageSettingContent;
|
|
213
232
|
/**
|
|
214
233
|
* Generate forwarded message content like WA does
|
|
215
234
|
* @param message the message to forward
|
|
216
235
|
* @param options.forceForward will show the message as forwarded even if it is from you
|
|
217
236
|
*/
|
|
218
|
-
const generateForwardMessageContent = (message, forceForward) => {
|
|
219
|
-
var _a;
|
|
237
|
+
export const generateForwardMessageContent = (message, forceForward) => {
|
|
220
238
|
let content = message.message;
|
|
221
239
|
if (!content) {
|
|
222
|
-
throw new
|
|
240
|
+
throw new Boom('no content in message', { statusCode: 400 });
|
|
223
241
|
}
|
|
224
242
|
// hacky copy
|
|
225
|
-
content =
|
|
226
|
-
content =
|
|
243
|
+
content = normalizeMessageContent(content);
|
|
244
|
+
content = proto.Message.decode(proto.Message.encode(content).finish());
|
|
227
245
|
let key = Object.keys(content)[0];
|
|
228
|
-
let score =
|
|
246
|
+
let score = content?.[key]?.contextInfo?.forwardingScore || 0;
|
|
229
247
|
score += message.key.fromMe && !forceForward ? 0 : 1;
|
|
230
248
|
if (key === 'conversation') {
|
|
231
249
|
content.extendedTextMessage = { text: content[key] };
|
|
232
250
|
delete content.conversation;
|
|
233
251
|
key = 'extendedTextMessage';
|
|
234
252
|
}
|
|
253
|
+
const key_ = content?.[key];
|
|
235
254
|
if (score > 0) {
|
|
236
|
-
|
|
255
|
+
key_.contextInfo = { forwardingScore: score, isForwarded: true };
|
|
237
256
|
}
|
|
238
257
|
else {
|
|
239
|
-
|
|
258
|
+
key_.contextInfo = {};
|
|
240
259
|
}
|
|
241
260
|
return content;
|
|
242
261
|
};
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;
|
|
246
|
-
var _p, _q;
|
|
262
|
+
export const generateWAMessageContent = async (message, options) => {
|
|
263
|
+
var _a, _b;
|
|
247
264
|
let m = {};
|
|
248
265
|
if ('text' in message) {
|
|
249
266
|
const extContent = { text: message.text };
|
|
250
267
|
let urlInfo = message.linkPreview;
|
|
251
268
|
if (typeof urlInfo === 'undefined') {
|
|
252
|
-
urlInfo = await
|
|
269
|
+
urlInfo = await generateLinkPreviewIfRequired(message.text, options.getUrlInfo, options.logger);
|
|
253
270
|
}
|
|
254
271
|
if (urlInfo) {
|
|
255
272
|
extContent.matchedText = urlInfo['matched-text'];
|
|
@@ -279,38 +296,40 @@ const generateWAMessageContent = async (message, options) => {
|
|
|
279
296
|
else if ('contacts' in message) {
|
|
280
297
|
const contactLen = message.contacts.contacts.length;
|
|
281
298
|
if (!contactLen) {
|
|
282
|
-
throw new
|
|
299
|
+
throw new Boom('require atleast 1 contact', { statusCode: 400 });
|
|
283
300
|
}
|
|
284
301
|
if (contactLen === 1) {
|
|
285
|
-
m.contactMessage =
|
|
302
|
+
m.contactMessage = WAProto.Message.ContactMessage.create(message.contacts.contacts[0]);
|
|
286
303
|
}
|
|
287
304
|
else {
|
|
288
|
-
m.contactsArrayMessage =
|
|
305
|
+
m.contactsArrayMessage = WAProto.Message.ContactsArrayMessage.create(message.contacts);
|
|
289
306
|
}
|
|
290
307
|
}
|
|
291
308
|
else if ('location' in message) {
|
|
292
|
-
m.locationMessage =
|
|
309
|
+
m.locationMessage = WAProto.Message.LocationMessage.create(message.location);
|
|
293
310
|
}
|
|
294
311
|
else if ('react' in message) {
|
|
295
312
|
if (!message.react.senderTimestampMs) {
|
|
296
313
|
message.react.senderTimestampMs = Date.now();
|
|
297
314
|
}
|
|
298
|
-
m.reactionMessage =
|
|
315
|
+
m.reactionMessage = WAProto.Message.ReactionMessage.create(message.react);
|
|
299
316
|
}
|
|
300
317
|
else if ('delete' in message) {
|
|
301
318
|
m.protocolMessage = {
|
|
302
319
|
key: message.delete,
|
|
303
|
-
type:
|
|
320
|
+
type: WAProto.Message.ProtocolMessage.Type.REVOKE
|
|
304
321
|
};
|
|
305
322
|
}
|
|
306
323
|
else if ('forward' in message) {
|
|
307
|
-
m =
|
|
324
|
+
m = generateForwardMessageContent(message.forward, message.force);
|
|
308
325
|
}
|
|
309
326
|
else if ('disappearingMessagesInChat' in message) {
|
|
310
|
-
const exp = typeof message.disappearingMessagesInChat === 'boolean'
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
327
|
+
const exp = typeof message.disappearingMessagesInChat === 'boolean'
|
|
328
|
+
? message.disappearingMessagesInChat
|
|
329
|
+
? WA_DEFAULT_EPHEMERAL
|
|
330
|
+
: 0
|
|
331
|
+
: message.disappearingMessagesInChat;
|
|
332
|
+
m = prepareDisappearingMessageSettingContent(exp);
|
|
314
333
|
}
|
|
315
334
|
else if ('groupInvite' in message) {
|
|
316
335
|
m.groupInviteMessage = {};
|
|
@@ -324,9 +343,10 @@ const generateWAMessageContent = async (message, options) => {
|
|
|
324
343
|
if (options.getProfilePicUrl) {
|
|
325
344
|
const pfpUrl = await options.getProfilePicUrl(message.groupInvite.jid, 'preview');
|
|
326
345
|
if (pfpUrl) {
|
|
327
|
-
const resp = await
|
|
328
|
-
if (resp.
|
|
329
|
-
|
|
346
|
+
const resp = await fetch(pfpUrl, { method: 'GET', dispatcher: options?.options?.dispatcher });
|
|
347
|
+
if (resp.ok) {
|
|
348
|
+
const buf = Buffer.from(await resp.arrayBuffer());
|
|
349
|
+
m.groupInviteMessage.jpegThumbnail = buf;
|
|
330
350
|
}
|
|
331
351
|
}
|
|
332
352
|
}
|
|
@@ -339,95 +359,80 @@ const generateWAMessageContent = async (message, options) => {
|
|
|
339
359
|
m.pinInChatMessage.senderTimestampMs = Date.now();
|
|
340
360
|
m.messageContextInfo.messageAddOnDurationInSecs = message.type === 1 ? message.time || 86400 : 0;
|
|
341
361
|
}
|
|
342
|
-
else if ('keep' in message) {
|
|
343
|
-
m.keepInChatMessage = {};
|
|
344
|
-
m.keepInChatMessage.key = message.keep;
|
|
345
|
-
m.keepInChatMessage.keepType = message.type;
|
|
346
|
-
m.keepInChatMessage.timestampMs = Date.now();
|
|
347
|
-
}
|
|
348
|
-
else if ('call' in message) {
|
|
349
|
-
m = {
|
|
350
|
-
scheduledCallCreationMessage: {
|
|
351
|
-
scheduledTimestampMs: (_a = message.call.time) !== null && _a !== void 0 ? _a : Date.now(),
|
|
352
|
-
callType: (_b = message.call.type) !== null && _b !== void 0 ? _b : 1,
|
|
353
|
-
title: message.call.title
|
|
354
|
-
}
|
|
355
|
-
};
|
|
356
|
-
}
|
|
357
|
-
else if ('paymentInvite' in message) {
|
|
358
|
-
m.paymentInviteMessage = {
|
|
359
|
-
serviceType: message.paymentInvite.type,
|
|
360
|
-
expiryTimestamp: message.paymentInvite.expiry
|
|
361
|
-
};
|
|
362
|
-
}
|
|
363
362
|
else if ('buttonReply' in message) {
|
|
364
363
|
switch (message.type) {
|
|
365
364
|
case 'template':
|
|
366
365
|
m.templateButtonReplyMessage = {
|
|
367
366
|
selectedDisplayText: message.buttonReply.displayText,
|
|
368
367
|
selectedId: message.buttonReply.id,
|
|
369
|
-
selectedIndex: message.buttonReply.index
|
|
368
|
+
selectedIndex: message.buttonReply.index
|
|
370
369
|
};
|
|
371
370
|
break;
|
|
372
371
|
case 'plain':
|
|
373
372
|
m.buttonsResponseMessage = {
|
|
374
373
|
selectedButtonId: message.buttonReply.id,
|
|
375
374
|
selectedDisplayText: message.buttonReply.displayText,
|
|
376
|
-
type:
|
|
375
|
+
type: proto.Message.ButtonsResponseMessage.Type.DISPLAY_TEXT
|
|
377
376
|
};
|
|
378
377
|
break;
|
|
379
378
|
}
|
|
380
379
|
}
|
|
381
380
|
else if ('ptv' in message && message.ptv) {
|
|
382
|
-
const { videoMessage } = await
|
|
381
|
+
const { videoMessage } = await prepareWAMessageMedia({ video: message.video }, options);
|
|
383
382
|
m.ptvMessage = videoMessage;
|
|
384
383
|
}
|
|
385
384
|
else if ('product' in message) {
|
|
386
|
-
const { imageMessage } = await
|
|
387
|
-
m.productMessage =
|
|
385
|
+
const { imageMessage } = await prepareWAMessageMedia({ image: message.product.productImage }, options);
|
|
386
|
+
m.productMessage = WAProto.Message.ProductMessage.create({
|
|
388
387
|
...message,
|
|
389
388
|
product: {
|
|
390
389
|
...message.product,
|
|
391
|
-
productImage: imageMessage
|
|
390
|
+
productImage: imageMessage
|
|
392
391
|
}
|
|
393
392
|
});
|
|
394
393
|
}
|
|
395
|
-
else if ('order' in message) {
|
|
396
|
-
m.orderMessage = Types_1.WAProto.Message.OrderMessage.fromObject({
|
|
397
|
-
orderId: message.order.id,
|
|
398
|
-
thumbnail: message.order.thumbnail,
|
|
399
|
-
itemCount: message.order.itemCount,
|
|
400
|
-
status: message.order.status,
|
|
401
|
-
surface: message.order.surface,
|
|
402
|
-
orderTitle: message.order.title,
|
|
403
|
-
message: message.order.text,
|
|
404
|
-
sellerJid: message.order.seller,
|
|
405
|
-
token: message.order.token,
|
|
406
|
-
totalAmount1000: message.order.amount,
|
|
407
|
-
totalCurrencyCode: message.order.currency
|
|
408
|
-
});
|
|
409
|
-
}
|
|
410
394
|
else if ('listReply' in message) {
|
|
411
395
|
m.listResponseMessage = { ...message.listReply };
|
|
412
396
|
}
|
|
397
|
+
else if ('event' in message) {
|
|
398
|
+
m.eventMessage = {};
|
|
399
|
+
const startTime = Math.floor(message.event.startDate.getTime() / 1000);
|
|
400
|
+
if (message.event.call && options.getCallLink) {
|
|
401
|
+
const token = await options.getCallLink(message.event.call, { startTime });
|
|
402
|
+
m.eventMessage.joinLink = (message.event.call === 'audio' ? CALL_AUDIO_PREFIX : CALL_VIDEO_PREFIX) + token;
|
|
403
|
+
}
|
|
404
|
+
m.messageContextInfo = {
|
|
405
|
+
// encKey
|
|
406
|
+
messageSecret: message.event.messageSecret || randomBytes(32)
|
|
407
|
+
};
|
|
408
|
+
m.eventMessage.name = message.event.name;
|
|
409
|
+
m.eventMessage.description = message.event.description;
|
|
410
|
+
m.eventMessage.startTime = startTime;
|
|
411
|
+
m.eventMessage.endTime = message.event.endDate ? message.event.endDate.getTime() / 1000 : undefined;
|
|
412
|
+
m.eventMessage.isCanceled = message.event.isCancelled ?? false;
|
|
413
|
+
m.eventMessage.extraGuestsAllowed = message.event.extraGuestsAllowed;
|
|
414
|
+
m.eventMessage.isScheduleCall = message.event.isScheduleCall ?? false;
|
|
415
|
+
m.eventMessage.location = message.event.location;
|
|
416
|
+
}
|
|
413
417
|
else if ('poll' in message) {
|
|
414
|
-
(
|
|
415
|
-
(
|
|
418
|
+
(_a = message.poll).selectableCount || (_a.selectableCount = 0);
|
|
419
|
+
(_b = message.poll).toAnnouncementGroup || (_b.toAnnouncementGroup = false);
|
|
416
420
|
if (!Array.isArray(message.poll.values)) {
|
|
417
|
-
throw new
|
|
421
|
+
throw new Boom('Invalid poll values', { statusCode: 400 });
|
|
418
422
|
}
|
|
419
|
-
if (message.poll.selectableCount < 0
|
|
420
|
-
|
|
421
|
-
|
|
423
|
+
if (message.poll.selectableCount < 0 || message.poll.selectableCount > message.poll.values.length) {
|
|
424
|
+
throw new Boom(`poll.selectableCount in poll should be >= 0 and <= ${message.poll.values.length}`, {
|
|
425
|
+
statusCode: 400
|
|
426
|
+
});
|
|
422
427
|
}
|
|
423
428
|
m.messageContextInfo = {
|
|
424
429
|
// encKey
|
|
425
|
-
messageSecret: message.poll.messageSecret ||
|
|
430
|
+
messageSecret: message.poll.messageSecret || randomBytes(32)
|
|
426
431
|
};
|
|
427
432
|
const pollCreationMessage = {
|
|
428
433
|
name: message.poll.name,
|
|
429
434
|
selectableOptionsCount: message.poll.selectableCount,
|
|
430
|
-
options: message.poll.values.map(optionName => ({ optionName }))
|
|
435
|
+
options: message.poll.values.map(optionName => ({ optionName }))
|
|
431
436
|
};
|
|
432
437
|
if (message.poll.toAnnouncementGroup) {
|
|
433
438
|
// poll v2 is for community announcement groups (single select and multiple)
|
|
@@ -435,7 +440,7 @@ const generateWAMessageContent = async (message, options) => {
|
|
|
435
440
|
}
|
|
436
441
|
else {
|
|
437
442
|
if (message.poll.selectableCount === 1) {
|
|
438
|
-
//
|
|
443
|
+
//poll v3 is for single select polls
|
|
439
444
|
m.pollCreationMessageV3 = pollCreationMessage;
|
|
440
445
|
}
|
|
441
446
|
else {
|
|
@@ -444,231 +449,42 @@ const generateWAMessageContent = async (message, options) => {
|
|
|
444
449
|
}
|
|
445
450
|
}
|
|
446
451
|
}
|
|
447
|
-
else if ('event' in message) {
|
|
448
|
-
m.messageContextInfo = {
|
|
449
|
-
messageSecret: message.event.messageSecret || (0, crypto_1.randomBytes)(32),
|
|
450
|
-
};
|
|
451
|
-
m.eventMessage = { ...message.event };
|
|
452
|
-
}
|
|
453
|
-
else if ('inviteAdmin' in message) {
|
|
454
|
-
m.newsletterAdminInviteMessage = {};
|
|
455
|
-
m.newsletterAdminInviteMessage.inviteExpiration = message.inviteAdmin.inviteExpiration;
|
|
456
|
-
m.newsletterAdminInviteMessage.caption = message.inviteAdmin.text;
|
|
457
|
-
m.newsletterAdminInviteMessage.newsletterJid = message.inviteAdmin.jid;
|
|
458
|
-
m.newsletterAdminInviteMessage.newsletterName = message.inviteAdmin.subject;
|
|
459
|
-
m.newsletterAdminInviteMessage.jpegThumbnail = message.inviteAdmin.thumbnail;
|
|
460
|
-
}
|
|
461
|
-
else if ('requestPayment' in message) {
|
|
462
|
-
const sticker = ((_c = message === null || message === void 0 ? void 0 : message.requestPayment) === null || _c === void 0 ? void 0 : _c.sticker) ?
|
|
463
|
-
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)
|
|
464
|
-
: null;
|
|
465
|
-
let notes = {};
|
|
466
|
-
if ((_e = message === null || message === void 0 ? void 0 : message.requestPayment) === null || _e === void 0 ? void 0 : _e.sticker) {
|
|
467
|
-
notes = {
|
|
468
|
-
stickerMessage: {
|
|
469
|
-
...sticker === null || sticker === void 0 ? void 0 : sticker.stickerMessage,
|
|
470
|
-
contextInfo: (_f = message === null || message === void 0 ? void 0 : message.requestPayment) === null || _f === void 0 ? void 0 : _f.contextInfo
|
|
471
|
-
}
|
|
472
|
-
};
|
|
473
|
-
}
|
|
474
|
-
else if (message.requestPayment.note) {
|
|
475
|
-
notes = {
|
|
476
|
-
extendedTextMessage: {
|
|
477
|
-
text: message.requestPayment.note,
|
|
478
|
-
contextInfo: (_g = message === null || message === void 0 ? void 0 : message.requestPayment) === null || _g === void 0 ? void 0 : _g.contextInfo,
|
|
479
|
-
}
|
|
480
|
-
};
|
|
481
|
-
}
|
|
482
|
-
else {
|
|
483
|
-
throw new boom_1.Boom('Invalid media type', { statusCode: 400 });
|
|
484
|
-
}
|
|
485
|
-
m.requestPaymentMessage = Types_1.WAProto.Message.RequestPaymentMessage.fromObject({
|
|
486
|
-
expiryTimestamp: message.requestPayment.expiry,
|
|
487
|
-
amount1000: message.requestPayment.amount,
|
|
488
|
-
currencyCodeIso4217: message.requestPayment.currency,
|
|
489
|
-
requestFrom: message.requestPayment.from,
|
|
490
|
-
noteMessage: { ...notes },
|
|
491
|
-
background: (_h = message.requestPayment.background) !== null && _h !== void 0 ? _h : null,
|
|
492
|
-
});
|
|
493
|
-
}
|
|
494
452
|
else if ('sharePhoneNumber' in message) {
|
|
495
453
|
m.protocolMessage = {
|
|
496
|
-
type:
|
|
454
|
+
type: proto.Message.ProtocolMessage.Type.SHARE_PHONE_NUMBER
|
|
497
455
|
};
|
|
498
456
|
}
|
|
499
457
|
else if ('requestPhoneNumber' in message) {
|
|
500
458
|
m.requestPhoneNumberMessage = {};
|
|
501
459
|
}
|
|
502
|
-
else if ('
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
else {
|
|
511
|
-
m = await (0, exports.prepareWAMessageMedia)(message, options);
|
|
512
|
-
}
|
|
513
|
-
if ('buttons' in message && !!message.buttons) {
|
|
514
|
-
const buttonsMessage = {
|
|
515
|
-
buttons: message.buttons.map(b => ({ ...b, type: WAProto_1.proto.Message.ButtonsMessage.Button.Type.RESPONSE }))
|
|
516
|
-
};
|
|
517
|
-
if ('text' in message) {
|
|
518
|
-
buttonsMessage.contentText = message.text;
|
|
519
|
-
buttonsMessage.headerType = ButtonType.EMPTY;
|
|
520
|
-
}
|
|
521
|
-
else {
|
|
522
|
-
if ('caption' in message) {
|
|
523
|
-
buttonsMessage.contentText = message.caption;
|
|
524
|
-
}
|
|
525
|
-
const type = Object.keys(m)[0].replace('Message', '').toUpperCase();
|
|
526
|
-
buttonsMessage.headerType = ButtonType[type];
|
|
527
|
-
Object.assign(buttonsMessage, m);
|
|
528
|
-
}
|
|
529
|
-
if ('title' in message && !!message.title) {
|
|
530
|
-
buttonsMessage.text = message.title,
|
|
531
|
-
buttonsMessage.headerType = ButtonType.TEXT;
|
|
532
|
-
}
|
|
533
|
-
if ('footer' in message && !!message.footer) {
|
|
534
|
-
buttonsMessage.footerText = message.footer;
|
|
535
|
-
}
|
|
536
|
-
if ('contextInfo' in message && !!message.contextInfo) {
|
|
537
|
-
buttonsMessage.contextInfo = message.contextInfo;
|
|
538
|
-
}
|
|
539
|
-
if ('mentions' in message && !!message.mentions) {
|
|
540
|
-
buttonsMessage.contextInfo = { mentionedJid: message.mentions };
|
|
541
|
-
}
|
|
542
|
-
m = { buttonsMessage };
|
|
543
|
-
}
|
|
544
|
-
else if ('templateButtons' in message && !!message.templateButtons) {
|
|
545
|
-
const msg = {
|
|
546
|
-
hydratedButtons: message.hasOwnProperty("templateButtons") ? message.templateButtons : message.templateButtons
|
|
547
|
-
};
|
|
548
|
-
if ('text' in message) {
|
|
549
|
-
msg.hydratedContentText = message.text;
|
|
550
|
-
}
|
|
551
|
-
else {
|
|
552
|
-
if ('caption' in message) {
|
|
553
|
-
msg.hydratedContentText = message.caption;
|
|
554
|
-
}
|
|
555
|
-
Object.assign(msg, m);
|
|
556
|
-
}
|
|
557
|
-
if ('footer' in message && !!message.footer) {
|
|
558
|
-
msg.hydratedFooterText = message.footer;
|
|
559
|
-
}
|
|
560
|
-
m = {
|
|
561
|
-
templateMessage: {
|
|
562
|
-
fourRowTemplate: msg,
|
|
563
|
-
hydratedTemplate: msg
|
|
460
|
+
else if ('limitSharing' in message) {
|
|
461
|
+
m.protocolMessage = {
|
|
462
|
+
type: proto.Message.ProtocolMessage.Type.LIMIT_SHARING,
|
|
463
|
+
limitSharing: {
|
|
464
|
+
sharingLimited: message.limitSharing === true,
|
|
465
|
+
trigger: 1,
|
|
466
|
+
limitSharingSettingTimestamp: Date.now(),
|
|
467
|
+
initiatedByMe: true
|
|
564
468
|
}
|
|
565
469
|
};
|
|
566
470
|
}
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
sections: message.sections,
|
|
570
|
-
buttonText: message.buttonText,
|
|
571
|
-
title: message.title,
|
|
572
|
-
footerText: message.footer,
|
|
573
|
-
description: message.text,
|
|
574
|
-
listType: WAProto_1.proto.Message.ListMessage.ListType.SINGLE_SELECT
|
|
575
|
-
};
|
|
576
|
-
m = { listMessage };
|
|
471
|
+
else {
|
|
472
|
+
m = await prepareWAMessageMedia(message, options);
|
|
577
473
|
}
|
|
578
|
-
if ('
|
|
579
|
-
|
|
580
|
-
nativeFlowMessage: Types_1.WAProto.Message.InteractiveMessage.NativeFlowMessage.fromObject({
|
|
581
|
-
buttons: message.interactiveButtons,
|
|
582
|
-
})
|
|
583
|
-
};
|
|
584
|
-
if ('text' in message) {
|
|
585
|
-
interactiveMessage.body = {
|
|
586
|
-
text: message.text
|
|
587
|
-
};
|
|
588
|
-
}
|
|
589
|
-
else if ('caption' in message) {
|
|
590
|
-
interactiveMessage.body = {
|
|
591
|
-
text: message.caption
|
|
592
|
-
};
|
|
593
|
-
interactiveMessage.header = {
|
|
594
|
-
title: message.title,
|
|
595
|
-
subtitle: message.subtitle,
|
|
596
|
-
hasMediaAttachment: (_j = message === null || message === void 0 ? void 0 : message.media) !== null && _j !== void 0 ? _j : false,
|
|
597
|
-
};
|
|
598
|
-
Object.assign(interactiveMessage.header, m);
|
|
599
|
-
}
|
|
600
|
-
if ('footer' in message && !!message.footer) {
|
|
601
|
-
interactiveMessage.footer = {
|
|
602
|
-
text: message.footer
|
|
603
|
-
};
|
|
604
|
-
}
|
|
605
|
-
if ('title' in message && !!message.title) {
|
|
606
|
-
interactiveMessage.header = {
|
|
607
|
-
title: message.title,
|
|
608
|
-
subtitle: message.subtitle,
|
|
609
|
-
hasMediaAttachment: (_k = message === null || message === void 0 ? void 0 : message.media) !== null && _k !== void 0 ? _k : false,
|
|
610
|
-
};
|
|
611
|
-
Object.assign(interactiveMessage.header, m);
|
|
612
|
-
}
|
|
613
|
-
if ('contextInfo' in message && !!message.contextInfo) {
|
|
614
|
-
interactiveMessage.contextInfo = message.contextInfo;
|
|
615
|
-
}
|
|
616
|
-
if ('mentions' in message && !!message.mentions) {
|
|
617
|
-
interactiveMessage.contextInfo = { mentionedJid: message.mentions };
|
|
618
|
-
}
|
|
619
|
-
m = { interactiveMessage };
|
|
474
|
+
if ('viewOnce' in message && !!message.viewOnce) {
|
|
475
|
+
m = { viewOnceMessage: { message: m } };
|
|
620
476
|
}
|
|
621
|
-
if ('
|
|
622
|
-
const
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
})
|
|
627
|
-
};
|
|
628
|
-
if ('text' in message) {
|
|
629
|
-
interactiveMessage.body = {
|
|
630
|
-
text: message.text
|
|
631
|
-
};
|
|
477
|
+
if ('mentions' in message && message.mentions?.length) {
|
|
478
|
+
const messageType = Object.keys(m)[0];
|
|
479
|
+
const key = m[messageType];
|
|
480
|
+
if ('contextInfo' in key && !!key.contextInfo) {
|
|
481
|
+
key.contextInfo.mentionedJid = message.mentions;
|
|
632
482
|
}
|
|
633
|
-
else if (
|
|
634
|
-
|
|
635
|
-
|
|
483
|
+
else if (key) {
|
|
484
|
+
key.contextInfo = {
|
|
485
|
+
mentionedJid: message.mentions
|
|
636
486
|
};
|
|
637
|
-
interactiveMessage.header = {
|
|
638
|
-
title: message.title,
|
|
639
|
-
subtitle: message.subtitle,
|
|
640
|
-
hasMediaAttachment: (_l = message === null || message === void 0 ? void 0 : message.media) !== null && _l !== void 0 ? _l : false,
|
|
641
|
-
};
|
|
642
|
-
Object.assign(interactiveMessage.header, m);
|
|
643
|
-
}
|
|
644
|
-
if ('footer' in message && !!message.footer) {
|
|
645
|
-
interactiveMessage.footer = {
|
|
646
|
-
text: message.footer
|
|
647
|
-
};
|
|
648
|
-
}
|
|
649
|
-
if ('title' in message && !!message.title) {
|
|
650
|
-
interactiveMessage.header = {
|
|
651
|
-
title: message.title,
|
|
652
|
-
subtitle: message.subtitle,
|
|
653
|
-
hasMediaAttachment: (_m = message === null || message === void 0 ? void 0 : message.media) !== null && _m !== void 0 ? _m : false,
|
|
654
|
-
};
|
|
655
|
-
Object.assign(interactiveMessage.header, m);
|
|
656
|
-
}
|
|
657
|
-
if ('contextInfo' in message && !!message.contextInfo) {
|
|
658
|
-
interactiveMessage.contextInfo = message.contextInfo;
|
|
659
487
|
}
|
|
660
|
-
if ('mentions' in message && !!message.mentions) {
|
|
661
|
-
interactiveMessage.contextInfo = { mentionedJid: message.mentions };
|
|
662
|
-
}
|
|
663
|
-
m = { interactiveMessage };
|
|
664
|
-
}
|
|
665
|
-
if ('viewOnce' in message && !!message.viewOnce) {
|
|
666
|
-
m = { viewOnceMessage: { message: m } };
|
|
667
|
-
}
|
|
668
|
-
if ('mentions' in message && ((_o = message.mentions) === null || _o === void 0 ? void 0 : _o.length)) {
|
|
669
|
-
const [messageType] = Object.keys(m);
|
|
670
|
-
m[messageType].contextInfo = m[messageType] || {};
|
|
671
|
-
m[messageType].contextInfo.mentionedJid = message.mentions;
|
|
672
488
|
}
|
|
673
489
|
if ('edit' in message) {
|
|
674
490
|
m = {
|
|
@@ -676,106 +492,110 @@ const generateWAMessageContent = async (message, options) => {
|
|
|
676
492
|
key: message.edit,
|
|
677
493
|
editedMessage: m,
|
|
678
494
|
timestampMs: Date.now(),
|
|
679
|
-
type:
|
|
495
|
+
type: WAProto.Message.ProtocolMessage.Type.MESSAGE_EDIT
|
|
680
496
|
}
|
|
681
497
|
};
|
|
682
498
|
}
|
|
683
499
|
if ('contextInfo' in message && !!message.contextInfo) {
|
|
684
|
-
const
|
|
685
|
-
|
|
686
|
-
|
|
500
|
+
const messageType = Object.keys(m)[0];
|
|
501
|
+
const key = m[messageType];
|
|
502
|
+
if ('contextInfo' in key && !!key.contextInfo) {
|
|
503
|
+
key.contextInfo = { ...key.contextInfo, ...message.contextInfo };
|
|
504
|
+
}
|
|
505
|
+
else if (key) {
|
|
506
|
+
key.contextInfo = message.contextInfo;
|
|
507
|
+
}
|
|
687
508
|
}
|
|
688
|
-
return
|
|
509
|
+
return WAProto.Message.create(m);
|
|
689
510
|
};
|
|
690
|
-
|
|
691
|
-
const generateWAMessageFromContent = (jid, message, options) => {
|
|
511
|
+
export const generateWAMessageFromContent = (jid, message, options) => {
|
|
692
512
|
// set timestamp to now
|
|
693
513
|
// if not specified
|
|
694
514
|
if (!options.timestamp) {
|
|
695
515
|
options.timestamp = new Date();
|
|
696
516
|
}
|
|
697
|
-
const innerMessage =
|
|
698
|
-
const key =
|
|
699
|
-
const timestamp =
|
|
517
|
+
const innerMessage = normalizeMessageContent(message);
|
|
518
|
+
const key = getContentType(innerMessage);
|
|
519
|
+
const timestamp = unixTimestampSeconds(options.timestamp);
|
|
700
520
|
const { quoted, userJid } = options;
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
521
|
+
if (quoted && !isJidNewsletter(jid)) {
|
|
522
|
+
const participant = quoted.key.fromMe
|
|
523
|
+
? userJid // TODO: Add support for LIDs
|
|
524
|
+
: quoted.participant || quoted.key.participant || quoted.key.remoteJid;
|
|
525
|
+
let quotedMsg = normalizeMessageContent(quoted.message);
|
|
526
|
+
const msgType = getContentType(quotedMsg);
|
|
706
527
|
// strip any redundant properties
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
528
|
+
quotedMsg = proto.Message.create({ [msgType]: quotedMsg[msgType] });
|
|
529
|
+
const quotedContent = quotedMsg[msgType];
|
|
530
|
+
if (typeof quotedContent === 'object' && quotedContent && 'contextInfo' in quotedContent) {
|
|
531
|
+
delete quotedContent.contextInfo;
|
|
532
|
+
}
|
|
533
|
+
const contextInfo = ('contextInfo' in innerMessage[key] && innerMessage[key]?.contextInfo) || {};
|
|
534
|
+
contextInfo.participant = jidNormalizedUser(participant);
|
|
535
|
+
contextInfo.stanzaId = quoted.key.id;
|
|
536
|
+
contextInfo.quotedMessage = quotedMsg;
|
|
537
|
+
// if a participant is quoted, then it must be a group
|
|
538
|
+
// hence, remoteJid of group must also be entered
|
|
539
|
+
if (jid !== quoted.key.remoteJid) {
|
|
540
|
+
contextInfo.remoteJid = quoted.key.remoteJid;
|
|
541
|
+
}
|
|
542
|
+
if (contextInfo && innerMessage[key]) {
|
|
543
|
+
/* @ts-ignore */
|
|
722
544
|
innerMessage[key].contextInfo = contextInfo;
|
|
723
545
|
}
|
|
724
546
|
}
|
|
725
547
|
if (
|
|
726
548
|
// if we want to send a disappearing message
|
|
727
|
-
!!
|
|
549
|
+
!!options?.ephemeralExpiration &&
|
|
728
550
|
// and it's not a protocol message -- delete, toggle disappear message
|
|
729
551
|
key !== 'protocolMessage' &&
|
|
730
552
|
// already not converted to disappearing message
|
|
731
553
|
key !== 'ephemeralMessage' &&
|
|
732
|
-
//
|
|
733
|
-
!
|
|
554
|
+
// newsletters don't support ephemeral messages
|
|
555
|
+
!isJidNewsletter(jid)) {
|
|
556
|
+
/* @ts-ignore */
|
|
734
557
|
innerMessage[key].contextInfo = {
|
|
735
558
|
...(innerMessage[key].contextInfo || {}),
|
|
736
|
-
expiration: options.ephemeralExpiration ||
|
|
559
|
+
expiration: options.ephemeralExpiration || WA_DEFAULT_EPHEMERAL
|
|
737
560
|
//ephemeralSettingTimestamp: options.ephemeralOptions.eph_setting_ts?.toString()
|
|
738
561
|
};
|
|
739
562
|
}
|
|
740
|
-
message =
|
|
563
|
+
message = WAProto.Message.create(message);
|
|
741
564
|
const messageJSON = {
|
|
742
565
|
key: {
|
|
743
566
|
remoteJid: jid,
|
|
744
567
|
fromMe: true,
|
|
745
|
-
id:
|
|
568
|
+
id: options?.messageId || generateMessageIDV2()
|
|
746
569
|
},
|
|
747
570
|
message: message,
|
|
748
571
|
messageTimestamp: timestamp,
|
|
749
572
|
messageStubParameters: [],
|
|
750
|
-
participant:
|
|
751
|
-
status:
|
|
573
|
+
participant: isJidGroup(jid) || isJidStatusBroadcast(jid) ? userJid : undefined, // TODO: Add support for LIDs
|
|
574
|
+
status: WAMessageStatus.PENDING
|
|
752
575
|
};
|
|
753
|
-
return
|
|
576
|
+
return WAProto.WebMessageInfo.fromObject(messageJSON);
|
|
754
577
|
};
|
|
755
|
-
|
|
756
|
-
const generateWAMessage = async (jid, content, options) => {
|
|
757
|
-
var _a;
|
|
578
|
+
export const generateWAMessage = async (jid, content, options) => {
|
|
758
579
|
// ensure msg ID is with every log
|
|
759
|
-
options.logger =
|
|
760
|
-
|
|
580
|
+
options.logger = options?.logger?.child({ msgId: options.messageId });
|
|
581
|
+
// Pass jid in the options to generateWAMessageContent
|
|
582
|
+
return generateWAMessageFromContent(jid, await generateWAMessageContent(content, { ...options, jid }), options);
|
|
761
583
|
};
|
|
762
|
-
exports.generateWAMessage = generateWAMessage;
|
|
763
584
|
/** Get the key to access the true type of content */
|
|
764
|
-
const getContentType = (content) => {
|
|
585
|
+
export const getContentType = (content) => {
|
|
765
586
|
if (content) {
|
|
766
587
|
const keys = Object.keys(content);
|
|
767
588
|
const key = keys.find(k => (k === 'conversation' || k.includes('Message')) && k !== 'senderKeyDistributionMessage');
|
|
768
589
|
return key;
|
|
769
590
|
}
|
|
770
591
|
};
|
|
771
|
-
exports.getContentType = getContentType;
|
|
772
592
|
/**
|
|
773
593
|
* Normalizes ephemeral, view once messages to regular message content
|
|
774
594
|
* Eg. image messages in ephemeral messages, in view once messages etc.
|
|
775
595
|
* @param content
|
|
776
596
|
* @returns
|
|
777
597
|
*/
|
|
778
|
-
const normalizeMessageContent = (content) => {
|
|
598
|
+
export const normalizeMessageContent = (content) => {
|
|
779
599
|
if (!content) {
|
|
780
600
|
return undefined;
|
|
781
601
|
}
|
|
@@ -789,38 +609,19 @@ const normalizeMessageContent = (content) => {
|
|
|
789
609
|
}
|
|
790
610
|
return content;
|
|
791
611
|
function getFutureProofMessage(message) {
|
|
792
|
-
return (
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|| (message === null || message === void 0 ? void 0 : message.groupMentionedMessage)
|
|
799
|
-
|| (message === null || message === void 0 ? void 0 : message.botInvokeMessage)
|
|
800
|
-
|| (message === null || message === void 0 ? void 0 : message.lottieStickerMessage)
|
|
801
|
-
|| (message === null || message === void 0 ? void 0 : message.eventCoverImage)
|
|
802
|
-
|| (message === null || message === void 0 ? void 0 : message.statusMentionMessage)
|
|
803
|
-
|| (message === null || message === void 0 ? void 0 : message.pollCreationOptionImageMessage)
|
|
804
|
-
|| (message === null || message === void 0 ? void 0 : message.associatedChildMessage)
|
|
805
|
-
|| (message === null || message === void 0 ? void 0 : message.groupStatusMentionMessage)
|
|
806
|
-
|| (message === null || message === void 0 ? void 0 : message.pollCreationMessageV4)
|
|
807
|
-
|| (message === null || message === void 0 ? void 0 : message.pollCreationMessageV5)
|
|
808
|
-
|| (message === null || message === void 0 ? void 0 : message.statusAddYours)
|
|
809
|
-
|| (message === null || message === void 0 ? void 0 : message.groupStatusMessage)
|
|
810
|
-
|| (message === null || message === void 0 ? void 0 : message.limitSharingMessage)
|
|
811
|
-
|| (message === null || message === void 0 ? void 0 : message.botTaskMessage)
|
|
812
|
-
|| (message === null || message === void 0 ? void 0 : message.questionMessage)
|
|
813
|
-
|| (message === null || message === void 0 ? void 0 : message.groupStatusMessageV2)
|
|
814
|
-
|| (message === null || message === void 0 ? void 0 : message.botForwardedMessage));
|
|
612
|
+
return (message?.ephemeralMessage ||
|
|
613
|
+
message?.viewOnceMessage ||
|
|
614
|
+
message?.documentWithCaptionMessage ||
|
|
615
|
+
message?.viewOnceMessageV2 ||
|
|
616
|
+
message?.viewOnceMessageV2Extension ||
|
|
617
|
+
message?.editedMessage);
|
|
815
618
|
}
|
|
816
619
|
};
|
|
817
|
-
exports.normalizeMessageContent = normalizeMessageContent;
|
|
818
620
|
/**
|
|
819
621
|
* Extract the true message content from a message
|
|
820
622
|
* Eg. extracts the inner message from a disappearing message/view once message
|
|
821
623
|
*/
|
|
822
|
-
const extractMessageContent = (content) => {
|
|
823
|
-
var _a, _b, _c, _d, _e, _f;
|
|
624
|
+
export const extractMessageContent = (content) => {
|
|
824
625
|
const extractFromTemplateMessage = (msg) => {
|
|
825
626
|
if (msg.imageMessage) {
|
|
826
627
|
return { imageMessage: msg.imageMessage };
|
|
@@ -836,39 +637,39 @@ const extractMessageContent = (content) => {
|
|
|
836
637
|
}
|
|
837
638
|
else {
|
|
838
639
|
return {
|
|
839
|
-
conversation: 'contentText' in msg
|
|
840
|
-
? msg.contentText
|
|
841
|
-
: ('hydratedContentText' in msg ? msg.hydratedContentText : '')
|
|
640
|
+
conversation: 'contentText' in msg ? msg.contentText : 'hydratedContentText' in msg ? msg.hydratedContentText : ''
|
|
842
641
|
};
|
|
843
642
|
}
|
|
844
643
|
};
|
|
845
|
-
content =
|
|
846
|
-
if (content
|
|
644
|
+
content = normalizeMessageContent(content);
|
|
645
|
+
if (content?.buttonsMessage) {
|
|
847
646
|
return extractFromTemplateMessage(content.buttonsMessage);
|
|
848
647
|
}
|
|
849
|
-
if (
|
|
850
|
-
return extractFromTemplateMessage(
|
|
648
|
+
if (content?.templateMessage?.hydratedFourRowTemplate) {
|
|
649
|
+
return extractFromTemplateMessage(content?.templateMessage?.hydratedFourRowTemplate);
|
|
851
650
|
}
|
|
852
|
-
if (
|
|
853
|
-
return extractFromTemplateMessage(
|
|
651
|
+
if (content?.templateMessage?.hydratedTemplate) {
|
|
652
|
+
return extractFromTemplateMessage(content?.templateMessage?.hydratedTemplate);
|
|
854
653
|
}
|
|
855
|
-
if (
|
|
856
|
-
return extractFromTemplateMessage(
|
|
654
|
+
if (content?.templateMessage?.fourRowTemplate) {
|
|
655
|
+
return extractFromTemplateMessage(content?.templateMessage?.fourRowTemplate);
|
|
857
656
|
}
|
|
858
657
|
return content;
|
|
859
658
|
};
|
|
860
|
-
exports.extractMessageContent = extractMessageContent;
|
|
861
659
|
/**
|
|
862
660
|
* Returns the device predicted by message ID
|
|
863
661
|
*/
|
|
864
|
-
const getDevice = (id) => /^3A.{18}$/.test(id)
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
662
|
+
export const getDevice = (id) => /^3A.{18}$/.test(id)
|
|
663
|
+
? 'ios'
|
|
664
|
+
: /^3E.{20}$/.test(id)
|
|
665
|
+
? 'web'
|
|
666
|
+
: /^(.{21}|.{32})$/.test(id)
|
|
667
|
+
? 'android'
|
|
668
|
+
: /^(3F|.{18}$)/.test(id)
|
|
669
|
+
? 'desktop'
|
|
670
|
+
: 'unknown';
|
|
870
671
|
/** Upserts a receipt in the message */
|
|
871
|
-
const updateMessageWithReceipt = (msg, receipt) => {
|
|
672
|
+
export const updateMessageWithReceipt = (msg, receipt) => {
|
|
872
673
|
msg.userReceipt = msg.userReceipt || [];
|
|
873
674
|
const recp = msg.userReceipt.find(m => m.userJid === receipt.userJid);
|
|
874
675
|
if (recp) {
|
|
@@ -878,40 +679,36 @@ const updateMessageWithReceipt = (msg, receipt) => {
|
|
|
878
679
|
msg.userReceipt.push(receipt);
|
|
879
680
|
}
|
|
880
681
|
};
|
|
881
|
-
exports.updateMessageWithReceipt = updateMessageWithReceipt;
|
|
882
682
|
/** Update the message with a new reaction */
|
|
883
|
-
const updateMessageWithReaction = (msg, reaction) => {
|
|
884
|
-
const authorID =
|
|
885
|
-
const reactions = (msg.reactions || [])
|
|
886
|
-
.filter(r => (0, generics_1.getKeyAuthor)(r.key) !== authorID);
|
|
683
|
+
export const updateMessageWithReaction = (msg, reaction) => {
|
|
684
|
+
const authorID = getKeyAuthor(reaction.key);
|
|
685
|
+
const reactions = (msg.reactions || []).filter(r => getKeyAuthor(r.key) !== authorID);
|
|
887
686
|
reaction.text = reaction.text || '';
|
|
888
687
|
reactions.push(reaction);
|
|
889
688
|
msg.reactions = reactions;
|
|
890
689
|
};
|
|
891
|
-
exports.updateMessageWithReaction = updateMessageWithReaction;
|
|
892
690
|
/** Update the message with a new poll update */
|
|
893
|
-
const updateMessageWithPollUpdate = (msg, update) => {
|
|
894
|
-
|
|
895
|
-
const
|
|
896
|
-
|
|
897
|
-
.filter(r => (0, generics_1.getKeyAuthor)(r.pollUpdateMessageKey) !== authorID);
|
|
898
|
-
if ((_b = (_a = update.vote) === null || _a === void 0 ? void 0 : _a.selectedOptions) === null || _b === void 0 ? void 0 : _b.length) {
|
|
691
|
+
export const updateMessageWithPollUpdate = (msg, update) => {
|
|
692
|
+
const authorID = getKeyAuthor(update.pollUpdateMessageKey);
|
|
693
|
+
const reactions = (msg.pollUpdates || []).filter(r => getKeyAuthor(r.pollUpdateMessageKey) !== authorID);
|
|
694
|
+
if (update.vote?.selectedOptions?.length) {
|
|
899
695
|
reactions.push(update);
|
|
900
696
|
}
|
|
901
697
|
msg.pollUpdates = reactions;
|
|
902
698
|
};
|
|
903
|
-
exports.updateMessageWithPollUpdate = updateMessageWithPollUpdate;
|
|
904
699
|
/**
|
|
905
700
|
* Aggregates all poll updates in a poll.
|
|
906
701
|
* @param msg the poll creation message
|
|
907
702
|
* @param meId your jid
|
|
908
703
|
* @returns A list of options & their voters
|
|
909
704
|
*/
|
|
910
|
-
function getAggregateVotesInPollMessage({ message, pollUpdates }, meId) {
|
|
911
|
-
|
|
912
|
-
|
|
705
|
+
export function getAggregateVotesInPollMessage({ message, pollUpdates }, meId) {
|
|
706
|
+
const opts = message?.pollCreationMessage?.options ||
|
|
707
|
+
message?.pollCreationMessageV2?.options ||
|
|
708
|
+
message?.pollCreationMessageV3?.options ||
|
|
709
|
+
[];
|
|
913
710
|
const voteHashMap = opts.reduce((acc, opt) => {
|
|
914
|
-
const hash =
|
|
711
|
+
const hash = sha256(Buffer.from(opt.optionName || '')).toString();
|
|
915
712
|
acc[hash] = {
|
|
916
713
|
name: opt.optionName || '',
|
|
917
714
|
voters: []
|
|
@@ -933,13 +730,13 @@ function getAggregateVotesInPollMessage({ message, pollUpdates }, meId) {
|
|
|
933
730
|
};
|
|
934
731
|
data = voteHashMap[hash];
|
|
935
732
|
}
|
|
936
|
-
voteHashMap[hash].voters.push(
|
|
733
|
+
voteHashMap[hash].voters.push(getKeyAuthor(update.pollUpdateMessageKey, meId));
|
|
937
734
|
}
|
|
938
735
|
}
|
|
939
736
|
return Object.values(voteHashMap);
|
|
940
737
|
}
|
|
941
738
|
/** Given a list of message keys, aggregates them by chat & sender. Useful for sending read receipts in bulk */
|
|
942
|
-
const aggregateMessageKeysNotFromMe = (keys) => {
|
|
739
|
+
export const aggregateMessageKeysNotFromMe = (keys) => {
|
|
943
740
|
const keyMap = {};
|
|
944
741
|
for (const { remoteJid, id, participant, fromMe } of keys) {
|
|
945
742
|
if (!fromMe) {
|
|
@@ -956,40 +753,34 @@ const aggregateMessageKeysNotFromMe = (keys) => {
|
|
|
956
753
|
}
|
|
957
754
|
return Object.values(keyMap);
|
|
958
755
|
};
|
|
959
|
-
exports.aggregateMessageKeysNotFromMe = aggregateMessageKeysNotFromMe;
|
|
960
756
|
const REUPLOAD_REQUIRED_STATUS = [410, 404];
|
|
961
757
|
/**
|
|
962
758
|
* Downloads the given message. Throws an error if it's not a media message
|
|
963
759
|
*/
|
|
964
|
-
const downloadMediaMessage = async (message, type, options, ctx) => {
|
|
965
|
-
const result = await downloadMsg()
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
message = await ctx.reuploadRequest(message);
|
|
975
|
-
const result = await downloadMsg();
|
|
976
|
-
return result;
|
|
977
|
-
}
|
|
978
|
-
}
|
|
760
|
+
export const downloadMediaMessage = async (message, type, options, ctx) => {
|
|
761
|
+
const result = await downloadMsg().catch(async (error) => {
|
|
762
|
+
if (ctx &&
|
|
763
|
+
typeof error?.status === 'number' && // treat errors with status as HTTP failures requiring reupload
|
|
764
|
+
REUPLOAD_REQUIRED_STATUS.includes(error.status)) {
|
|
765
|
+
ctx.logger.info({ key: message.key }, 'sending reupload media request...');
|
|
766
|
+
// request reupload
|
|
767
|
+
message = await ctx.reuploadRequest(message);
|
|
768
|
+
const result = await downloadMsg();
|
|
769
|
+
return result;
|
|
979
770
|
}
|
|
980
771
|
throw error;
|
|
981
772
|
});
|
|
982
773
|
return result;
|
|
983
774
|
async function downloadMsg() {
|
|
984
|
-
const mContent =
|
|
775
|
+
const mContent = extractMessageContent(message.message);
|
|
985
776
|
if (!mContent) {
|
|
986
|
-
throw new
|
|
777
|
+
throw new Boom('No message present', { statusCode: 400, data: message });
|
|
987
778
|
}
|
|
988
|
-
const contentType =
|
|
989
|
-
let mediaType = contentType
|
|
779
|
+
const contentType = getContentType(mContent);
|
|
780
|
+
let mediaType = contentType?.replace('Message', '');
|
|
990
781
|
const media = mContent[contentType];
|
|
991
782
|
if (!media || typeof media !== 'object' || (!('url' in media) && !('thumbnailDirectPath' in media))) {
|
|
992
|
-
throw new
|
|
783
|
+
throw new Boom(`"${contentType}" message is not a media message`);
|
|
993
784
|
}
|
|
994
785
|
let download;
|
|
995
786
|
if ('thumbnailDirectPath' in media && !('url' in media)) {
|
|
@@ -1002,7 +793,7 @@ const downloadMediaMessage = async (message, type, options, ctx) => {
|
|
|
1002
793
|
else {
|
|
1003
794
|
download = media;
|
|
1004
795
|
}
|
|
1005
|
-
const stream = await
|
|
796
|
+
const stream = await downloadContentFromMessage(download, mediaType, options);
|
|
1006
797
|
if (type === 'buffer') {
|
|
1007
798
|
const bufferArray = [];
|
|
1008
799
|
for await (const chunk of stream) {
|
|
@@ -1013,18 +804,17 @@ const downloadMediaMessage = async (message, type, options, ctx) => {
|
|
|
1013
804
|
return stream;
|
|
1014
805
|
}
|
|
1015
806
|
};
|
|
1016
|
-
exports.downloadMediaMessage = downloadMediaMessage;
|
|
1017
807
|
/** Checks whether the given message is a media message; if it is returns the inner content */
|
|
1018
|
-
const assertMediaContent = (content) => {
|
|
1019
|
-
content =
|
|
1020
|
-
const mediaContent =
|
|
1021
|
-
|
|
1022
|
-
|
|
1023
|
-
|
|
1024
|
-
|
|
808
|
+
export const assertMediaContent = (content) => {
|
|
809
|
+
content = extractMessageContent(content);
|
|
810
|
+
const mediaContent = content?.documentMessage ||
|
|
811
|
+
content?.imageMessage ||
|
|
812
|
+
content?.videoMessage ||
|
|
813
|
+
content?.audioMessage ||
|
|
814
|
+
content?.stickerMessage;
|
|
1025
815
|
if (!mediaContent) {
|
|
1026
|
-
throw new
|
|
816
|
+
throw new Boom('given message is not a media message', { statusCode: 400, data: content });
|
|
1027
817
|
}
|
|
1028
818
|
return mediaContent;
|
|
1029
819
|
};
|
|
1030
|
-
|
|
820
|
+
//# sourceMappingURL=messages.js.map
|