@ubedsockets/baileys 1.6.9 → 1.7.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/WAProto/GenerateStatics.sh +26 -3
- package/WAProto/WAProto.proto +432 -180
- package/WAProto/add-missing-proto-deps.js +134 -0
- package/WAProto/imports-elaina.js +48 -0
- package/WAProto/index.js +78044 -140686
- package/WAProto/merge-elaina-ai-proto.js +187 -0
- package/engine-requirements.js +10 -0
- package/lib/Defaults/elaina-version.json +3 -0
- package/lib/Defaults/index.js +57 -55
- package/lib/Signal/Group/group_cipher.js +1 -1
- package/lib/Signal/Group/keyhelper.js +1 -1
- package/lib/Signal/Group/sender-chain-key.js +1 -1
- package/lib/Signal/Group/sender-key-message.js +1 -1
- package/lib/Signal/Group/sender-message-key.js +1 -1
- package/lib/Signal/libsignal.js +1 -1
- package/lib/Signal/libsignalnode/LICENSE +621 -0
- package/lib/Signal/libsignalnode/README.md +11 -0
- package/lib/Signal/libsignalnode/generate-proto.sh +1 -0
- package/lib/Signal/libsignalnode/index.js +10 -0
- package/lib/Signal/libsignalnode/protos/WhisperTextProtocol.proto +28 -0
- package/lib/Signal/libsignalnode/src/.eslintrc.json +31 -0
- package/lib/Signal/libsignalnode/src/WhisperTextProtocol.js +948 -0
- package/lib/Signal/libsignalnode/src/base_key_type.js +6 -0
- package/lib/Signal/libsignalnode/src/chain_type.js +6 -0
- package/lib/Signal/libsignalnode/src/crypto.js +98 -0
- package/lib/Signal/libsignalnode/src/curve.js +142 -0
- package/lib/Signal/libsignalnode/src/errors.js +33 -0
- package/lib/Signal/libsignalnode/src/keyhelper.js +45 -0
- package/lib/Signal/libsignalnode/src/numeric_fingerprint.js +70 -0
- package/lib/Signal/libsignalnode/src/protobufs.js +10 -0
- package/lib/Signal/libsignalnode/src/protocol_address.js +40 -0
- package/lib/Signal/libsignalnode/src/queue_job.js +70 -0
- package/lib/Signal/libsignalnode/src/session_builder.js +164 -0
- package/lib/Signal/libsignalnode/src/session_cipher.js +332 -0
- package/lib/Signal/libsignalnode/src/session_record.js +325 -0
- package/lib/Socket/Client/websocket.js +2 -41
- package/lib/Socket/Rhandler.js +533 -0
- package/lib/Socket/chats.js +249 -123
- package/lib/Socket/index.js +1 -1
- package/lib/Socket/messages-recv.js +57 -5
- package/lib/Socket/messages-send.js +47 -280
- package/lib/Socket/newsletter.js +100 -132
- package/lib/Socket/socket.js +79 -87
- package/lib/Socket/usync.js +0 -2
- package/lib/Store/make-in-memory-store.js +1 -1
- package/lib/Utils/browser-utils.js +30 -23
- package/lib/Utils/crypto.js +22 -18
- package/lib/Utils/decode-wa-message.js +12 -2
- package/lib/Utils/{baileys-event-stream.js → elaina-event-stream.js} +1 -1
- package/lib/Utils/event-buffer.js +2 -2
- package/lib/Utils/generics.js +36 -10
- package/lib/Utils/index.js +3 -1
- package/lib/Utils/message-retry-manager.js +48 -185
- package/lib/Utils/messages-media.js +127 -236
- package/lib/Utils/messages.js +746 -232
- package/lib/Utils/noise-handler.js +1 -2
- package/lib/Utils/process-message.js +108 -25
- package/lib/Utils/signal.js +1 -10
- package/lib/Utils/use-multi-file-auth-state.js +1 -1
- package/lib/Utils/validate-connection.js +3 -7
- package/lib/Voip/audio-feeder.js +166 -0
- package/lib/Voip/index.js +639 -0
- package/lib/Voip/relay-transport.js +829 -0
- package/lib/Voip/signaling.js +1102 -0
- package/lib/Voip/types.js +23 -0
- package/lib/Voip/wasm-engine.js +1255 -0
- package/lib/Voip/worker-bootstrap.js +1078 -0
- package/lib/WABinary/jid-utils.js +17 -1
- package/lib/assets/wasm/loader.js +5 -0
- package/lib/assets/wasm/whatsapp.wasm +0 -0
- package/lib/assets/wasm/worker-modules.js +273 -0
- package/lib/index.js +21 -18
- package/package.json +32 -18
- package/WAProto/AICommon.js +0 -27981
- package/WAProto/AICommon.proto +0 -713
- package/WAProto/Ephemeral.js +0 -295
- package/WAProto/Ephemeral.proto +0 -7
- package/WAProto/fix-imports.js +0 -85
- package/WAProto/index.d.ts +0 -14017
- package/WAProto/vyzen.js +0 -7
- package/lib/Defaults/baileys-version.json +0 -3
- package/lib/Defaults/index.d.ts +0 -75
- package/lib/Defaults/index.d.ts.map +0 -1
- package/lib/Defaults/index.js.map +0 -1
- package/lib/Signal/Group/ciphertext-message.d.ts +0 -10
- package/lib/Signal/Group/ciphertext-message.d.ts.map +0 -1
- package/lib/Signal/Group/ciphertext-message.js.map +0 -1
- package/lib/Signal/Group/group-session-builder.d.ts +0 -15
- package/lib/Signal/Group/group-session-builder.d.ts.map +0 -1
- package/lib/Signal/Group/group-session-builder.js.map +0 -1
- package/lib/Signal/Group/group_cipher.d.ts +0 -17
- package/lib/Signal/Group/group_cipher.d.ts.map +0 -1
- package/lib/Signal/Group/group_cipher.js.map +0 -1
- package/lib/Signal/Group/index.d.ts +0 -12
- package/lib/Signal/Group/index.d.ts.map +0 -1
- package/lib/Signal/Group/index.js.map +0 -1
- package/lib/Signal/Group/keyhelper.d.ts +0 -11
- package/lib/Signal/Group/keyhelper.d.ts.map +0 -1
- package/lib/Signal/Group/keyhelper.js.map +0 -1
- package/lib/Signal/Group/sender-chain-key.d.ts +0 -14
- package/lib/Signal/Group/sender-chain-key.d.ts.map +0 -1
- package/lib/Signal/Group/sender-chain-key.js.map +0 -1
- package/lib/Signal/Group/sender-key-distribution-message.d.ts +0 -17
- package/lib/Signal/Group/sender-key-distribution-message.d.ts.map +0 -1
- package/lib/Signal/Group/sender-key-distribution-message.js.map +0 -1
- package/lib/Signal/Group/sender-key-message.d.ts +0 -19
- package/lib/Signal/Group/sender-key-message.d.ts.map +0 -1
- package/lib/Signal/Group/sender-key-message.js.map +0 -1
- package/lib/Signal/Group/sender-key-name.d.ts +0 -18
- package/lib/Signal/Group/sender-key-name.d.ts.map +0 -1
- package/lib/Signal/Group/sender-key-name.js.map +0 -1
- package/lib/Signal/Group/sender-key-record.d.ts +0 -31
- package/lib/Signal/Group/sender-key-record.d.ts.map +0 -1
- package/lib/Signal/Group/sender-key-record.js.map +0 -1
- package/lib/Signal/Group/sender-key-state.d.ts +0 -39
- package/lib/Signal/Group/sender-key-state.d.ts.map +0 -1
- package/lib/Signal/Group/sender-key-state.js.map +0 -1
- package/lib/Signal/Group/sender-message-key.d.ts +0 -12
- package/lib/Signal/Group/sender-message-key.d.ts.map +0 -1
- package/lib/Signal/Group/sender-message-key.js.map +0 -1
- package/lib/Signal/libsignal.d.ts +0 -5
- package/lib/Signal/libsignal.d.ts.map +0 -1
- package/lib/Signal/libsignal.js.map +0 -1
- package/lib/Signal/lid-mapping.d.ts +0 -23
- package/lib/Signal/lid-mapping.d.ts.map +0 -1
- package/lib/Signal/lid-mapping.js +0 -277
- package/lib/Signal/lid-mapping.js.map +0 -1
- package/lib/Socket/Client/index.d.ts +0 -3
- package/lib/Socket/Client/index.d.ts.map +0 -1
- package/lib/Socket/Client/index.js.map +0 -1
- package/lib/Socket/Client/types.d.ts +0 -16
- package/lib/Socket/Client/types.d.ts.map +0 -1
- package/lib/Socket/Client/types.js.map +0 -1
- package/lib/Socket/Client/websocket.d.ts +0 -13
- package/lib/Socket/Client/websocket.d.ts.map +0 -1
- package/lib/Socket/Client/websocket.js.map +0 -1
- package/lib/Socket/business.d.ts +0 -217
- package/lib/Socket/business.d.ts.map +0 -1
- package/lib/Socket/business.js.map +0 -1
- package/lib/Socket/chats.d.ts +0 -124
- package/lib/Socket/chats.d.ts.map +0 -1
- package/lib/Socket/chats.js.map +0 -1
- package/lib/Socket/communities.d.ts +0 -273
- package/lib/Socket/communities.d.ts.map +0 -1
- package/lib/Socket/communities.js +0 -431
- package/lib/Socket/communities.js.map +0 -1
- package/lib/Socket/groups.d.ts +0 -161
- package/lib/Socket/groups.d.ts.map +0 -1
- package/lib/Socket/groups.js.map +0 -1
- package/lib/Socket/index.d.ts +0 -260
- package/lib/Socket/index.d.ts.map +0 -1
- package/lib/Socket/index.js.map +0 -1
- package/lib/Socket/messages-recv.d.ts +0 -203
- package/lib/Socket/messages-recv.d.ts.map +0 -1
- package/lib/Socket/messages-recv.js.map +0 -1
- package/lib/Socket/messages-send.d.ts +0 -199
- package/lib/Socket/messages-send.d.ts.map +0 -1
- package/lib/Socket/messages-send.js.map +0 -1
- package/lib/Socket/mex.d.ts +0 -3
- package/lib/Socket/mex.d.ts.map +0 -1
- package/lib/Socket/mex.js +0 -42
- package/lib/Socket/mex.js.map +0 -1
- package/lib/Socket/newsletter.d.ts +0 -170
- package/lib/Socket/newsletter.d.ts.map +0 -1
- package/lib/Socket/newsletter.js.map +0 -1
- package/lib/Socket/setup.js +0 -433
- package/lib/Socket/socket.d.ts +0 -59
- package/lib/Socket/socket.d.ts.map +0 -1
- package/lib/Socket/socket.js.map +0 -1
- package/lib/Types/Auth.d.ts +0 -117
- package/lib/Types/Auth.d.ts.map +0 -1
- package/lib/Types/Auth.js.map +0 -1
- package/lib/Types/Bussines.d.ts +0 -25
- package/lib/Types/Bussines.d.ts.map +0 -1
- package/lib/Types/Bussines.js +0 -2
- package/lib/Types/Bussines.js.map +0 -1
- package/lib/Types/Call.d.ts +0 -15
- package/lib/Types/Call.d.ts.map +0 -1
- package/lib/Types/Call.js.map +0 -1
- package/lib/Types/Chat.d.ts +0 -124
- package/lib/Types/Chat.d.ts.map +0 -1
- package/lib/Types/Chat.js.map +0 -1
- package/lib/Types/Contact.d.ts +0 -26
- package/lib/Types/Contact.d.ts.map +0 -1
- package/lib/Types/Contact.js.map +0 -1
- package/lib/Types/Events.d.ts +0 -256
- package/lib/Types/Events.d.ts.map +0 -1
- package/lib/Types/Events.js.map +0 -1
- package/lib/Types/GroupMetadata.d.ts +0 -71
- package/lib/Types/GroupMetadata.d.ts.map +0 -1
- package/lib/Types/GroupMetadata.js.map +0 -1
- package/lib/Types/Label.d.ts +0 -47
- package/lib/Types/Label.d.ts.map +0 -1
- package/lib/Types/Label.js.map +0 -1
- package/lib/Types/LabelAssociation.d.ts +0 -30
- package/lib/Types/LabelAssociation.d.ts.map +0 -1
- package/lib/Types/LabelAssociation.js.map +0 -1
- package/lib/Types/Message.d.ts +0 -320
- package/lib/Types/Message.d.ts.map +0 -1
- package/lib/Types/Message.js.map +0 -1
- package/lib/Types/Mex.d.ts +0 -141
- package/lib/Types/Mex.d.ts.map +0 -1
- package/lib/Types/Mex.js +0 -37
- package/lib/Types/Mex.js.map +0 -1
- package/lib/Types/Product.d.ts +0 -79
- package/lib/Types/Product.d.ts.map +0 -1
- package/lib/Types/Product.js.map +0 -1
- package/lib/Types/RichType.d.ts +0 -3
- package/lib/Types/RichType.d.ts.map +0 -1
- package/lib/Types/RichType.js +0 -31
- package/lib/Types/Signal.d.ts +0 -87
- package/lib/Types/Signal.d.ts.map +0 -1
- package/lib/Types/Signal.js.map +0 -1
- package/lib/Types/Socket.d.ts +0 -136
- package/lib/Types/Socket.d.ts.map +0 -1
- package/lib/Types/Socket.js.map +0 -1
- package/lib/Types/State.d.ts +0 -97
- package/lib/Types/State.d.ts.map +0 -1
- package/lib/Types/State.js.map +0 -1
- package/lib/Types/USync.d.ts +0 -26
- package/lib/Types/USync.d.ts.map +0 -1
- package/lib/Types/USync.js.map +0 -1
- package/lib/Types/index.d.ts +0 -65
- package/lib/Types/index.d.ts.map +0 -1
- package/lib/Types/index.js.map +0 -1
- package/lib/Utils/Tiktok.js +0 -80
- package/lib/Utils/auth-utils.d.ts +0 -24
- package/lib/Utils/auth-utils.d.ts.map +0 -1
- package/lib/Utils/auth-utils.js.map +0 -1
- package/lib/Utils/browser-utils.d.ts +0 -4
- package/lib/Utils/browser-utils.d.ts.map +0 -1
- package/lib/Utils/browser-utils.js.map +0 -1
- package/lib/Utils/business.d.ts +0 -23
- package/lib/Utils/business.d.ts.map +0 -1
- package/lib/Utils/business.js.map +0 -1
- package/lib/Utils/chaanel/vyzen.js +0 -0
- package/lib/Utils/chat-utils.d.ts +0 -100
- package/lib/Utils/chat-utils.d.ts.map +0 -1
- package/lib/Utils/chat-utils.js.map +0 -1
- package/lib/Utils/companion-reg-client-utils.d.ts +0 -17
- package/lib/Utils/companion-reg-client-utils.d.ts.map +0 -1
- package/lib/Utils/companion-reg-client-utils.js +0 -35
- package/lib/Utils/companion-reg-client-utils.js.map +0 -1
- package/lib/Utils/crypto.d.ts +0 -37
- package/lib/Utils/crypto.d.ts.map +0 -1
- package/lib/Utils/crypto.js.map +0 -1
- package/lib/Utils/decode-wa-message.d.ts +0 -66
- package/lib/Utils/decode-wa-message.d.ts.map +0 -1
- package/lib/Utils/decode-wa-message.js.map +0 -1
- package/lib/Utils/event-buffer.d.ts +0 -36
- package/lib/Utils/event-buffer.d.ts.map +0 -1
- package/lib/Utils/event-buffer.js.map +0 -1
- package/lib/Utils/facebook.js +0 -48
- package/lib/Utils/generics.d.ts +0 -91
- package/lib/Utils/generics.d.ts.map +0 -1
- package/lib/Utils/generics.js.map +0 -1
- package/lib/Utils/history.d.ts +0 -24
- package/lib/Utils/history.d.ts.map +0 -1
- package/lib/Utils/history.js.map +0 -1
- package/lib/Utils/identity-change-handler.d.ts +0 -44
- package/lib/Utils/identity-change-handler.d.ts.map +0 -1
- package/lib/Utils/identity-change-handler.js +0 -50
- package/lib/Utils/identity-change-handler.js.map +0 -1
- package/lib/Utils/index.d.ts +0 -22
- package/lib/Utils/index.d.ts.map +0 -1
- package/lib/Utils/index.js.map +0 -1
- package/lib/Utils/instagram.js +0 -50
- package/lib/Utils/link-preview.d.ts +0 -21
- package/lib/Utils/link-preview.d.ts.map +0 -1
- package/lib/Utils/link-preview.js.map +0 -1
- package/lib/Utils/logger.d.ts +0 -12
- package/lib/Utils/logger.d.ts.map +0 -1
- package/lib/Utils/logger.js.map +0 -1
- package/lib/Utils/lt-hash.d.ts +0 -8
- package/lib/Utils/lt-hash.d.ts.map +0 -1
- package/lib/Utils/lt-hash.js.map +0 -1
- package/lib/Utils/make-mutex.d.ts +0 -9
- package/lib/Utils/make-mutex.d.ts.map +0 -1
- package/lib/Utils/make-mutex.js.map +0 -1
- package/lib/Utils/message-retry-manager.d.ts +0 -115
- package/lib/Utils/message-retry-manager.d.ts.map +0 -1
- package/lib/Utils/message-retry-manager.js.map +0 -1
- package/lib/Utils/messages-media.d.ts +0 -133
- package/lib/Utils/messages-media.d.ts.map +0 -1
- package/lib/Utils/messages-media.js.map +0 -1
- package/lib/Utils/messages.d.ts +0 -91
- package/lib/Utils/messages.d.ts.map +0 -1
- package/lib/Utils/messages.js.map +0 -1
- package/lib/Utils/noise-handler.d.ts +0 -20
- package/lib/Utils/noise-handler.d.ts.map +0 -1
- package/lib/Utils/noise-handler.js.map +0 -1
- package/lib/Utils/offline-node-processor.d.ts +0 -17
- package/lib/Utils/offline-node-processor.d.ts.map +0 -1
- package/lib/Utils/offline-node-processor.js +0 -40
- package/lib/Utils/offline-node-processor.js.map +0 -1
- package/lib/Utils/pre-key-manager.d.ts +0 -28
- package/lib/Utils/pre-key-manager.d.ts.map +0 -1
- package/lib/Utils/pre-key-manager.js +0 -106
- package/lib/Utils/pre-key-manager.js.map +0 -1
- package/lib/Utils/process-message.d.ts +0 -60
- package/lib/Utils/process-message.d.ts.map +0 -1
- package/lib/Utils/process-message.js.map +0 -1
- package/lib/Utils/reporting-utils.d.ts +0 -11
- package/lib/Utils/reporting-utils.d.ts.map +0 -1
- package/lib/Utils/reporting-utils.js +0 -258
- package/lib/Utils/reporting-utils.js.map +0 -1
- package/lib/Utils/rich-message-utils.js +0 -387
- package/lib/Utils/signal.d.ts +0 -47
- package/lib/Utils/signal.d.ts.map +0 -1
- package/lib/Utils/signal.js.map +0 -1
- package/lib/Utils/stanza-ack.d.ts +0 -11
- package/lib/Utils/stanza-ack.d.ts.map +0 -1
- package/lib/Utils/stanza-ack.js +0 -38
- package/lib/Utils/stanza-ack.js.map +0 -1
- package/lib/Utils/sync-action-utils.d.ts +0 -19
- package/lib/Utils/sync-action-utils.d.ts.map +0 -1
- package/lib/Utils/sync-action-utils.js +0 -49
- package/lib/Utils/sync-action-utils.js.map +0 -1
- package/lib/Utils/tc-token-utils.d.ts +0 -37
- package/lib/Utils/tc-token-utils.d.ts.map +0 -1
- package/lib/Utils/tc-token-utils.js +0 -163
- package/lib/Utils/tc-token-utils.js.map +0 -1
- package/lib/Utils/use-multi-file-auth-state.d.ts +0 -13
- package/lib/Utils/use-multi-file-auth-state.d.ts.map +0 -1
- package/lib/Utils/use-multi-file-auth-state.js.map +0 -1
- package/lib/Utils/validate-connection.d.ts +0 -11
- package/lib/Utils/validate-connection.d.ts.map +0 -1
- package/lib/Utils/validate-connection.js.map +0 -1
- package/lib/Utils/youtube.js +0 -44
- package/lib/WABinary/constants.d.ts +0 -28
- package/lib/WABinary/constants.d.ts.map +0 -1
- package/lib/WABinary/constants.js.map +0 -1
- package/lib/WABinary/decode.d.ts +0 -7
- package/lib/WABinary/decode.d.ts.map +0 -1
- package/lib/WABinary/decode.js.map +0 -1
- package/lib/WABinary/encode.d.ts +0 -3
- package/lib/WABinary/encode.d.ts.map +0 -1
- package/lib/WABinary/encode.js.map +0 -1
- package/lib/WABinary/generic-utils.d.ts +0 -15
- package/lib/WABinary/generic-utils.d.ts.map +0 -1
- package/lib/WABinary/generic-utils.js.map +0 -1
- package/lib/WABinary/index.d.ts +0 -6
- package/lib/WABinary/index.d.ts.map +0 -1
- package/lib/WABinary/index.js.map +0 -1
- package/lib/WABinary/jid-utils.d.ts +0 -48
- package/lib/WABinary/jid-utils.d.ts.map +0 -1
- package/lib/WABinary/jid-utils.js.map +0 -1
- package/lib/WABinary/types.d.ts +0 -19
- package/lib/WABinary/types.d.ts.map +0 -1
- package/lib/WABinary/types.js.map +0 -1
- package/lib/WAM/BinaryInfo.d.ts +0 -9
- package/lib/WAM/BinaryInfo.d.ts.map +0 -1
- package/lib/WAM/BinaryInfo.js.map +0 -1
- package/lib/WAM/constants.d.ts +0 -40
- package/lib/WAM/constants.d.ts.map +0 -1
- package/lib/WAM/constants.js.map +0 -1
- package/lib/WAM/encode.d.ts +0 -3
- package/lib/WAM/encode.d.ts.map +0 -1
- package/lib/WAM/encode.js.map +0 -1
- package/lib/WAM/index.d.ts +0 -4
- package/lib/WAM/index.d.ts.map +0 -1
- package/lib/WAM/index.js.map +0 -1
- package/lib/WAUSync/Protocols/USyncContactProtocol.d.ts +0 -10
- package/lib/WAUSync/Protocols/USyncContactProtocol.d.ts.map +0 -1
- package/lib/WAUSync/Protocols/USyncContactProtocol.js.map +0 -1
- package/lib/WAUSync/Protocols/USyncDeviceProtocol.d.ts +0 -23
- package/lib/WAUSync/Protocols/USyncDeviceProtocol.d.ts.map +0 -1
- package/lib/WAUSync/Protocols/USyncDeviceProtocol.js.map +0 -1
- package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.d.ts +0 -13
- package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.d.ts.map +0 -1
- package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.js.map +0 -1
- package/lib/WAUSync/Protocols/USyncStatusProtocol.d.ts +0 -13
- package/lib/WAUSync/Protocols/USyncStatusProtocol.d.ts.map +0 -1
- package/lib/WAUSync/Protocols/USyncStatusProtocol.js.map +0 -1
- package/lib/WAUSync/Protocols/USyncUsernameProtocol.d.ts +0 -10
- package/lib/WAUSync/Protocols/USyncUsernameProtocol.d.ts.map +0 -1
- package/lib/WAUSync/Protocols/USyncUsernameProtocol.js +0 -25
- package/lib/WAUSync/Protocols/USyncUsernameProtocol.js.map +0 -1
- package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.d.ts +0 -26
- package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.d.ts.map +0 -1
- package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.js.map +0 -1
- package/lib/WAUSync/Protocols/UsyncLIDProtocol.d.ts +0 -10
- package/lib/WAUSync/Protocols/UsyncLIDProtocol.d.ts.map +0 -1
- package/lib/WAUSync/Protocols/UsyncLIDProtocol.js.map +0 -1
- package/lib/WAUSync/Protocols/index.d.ts +0 -6
- package/lib/WAUSync/Protocols/index.d.ts.map +0 -1
- package/lib/WAUSync/Protocols/index.js.map +0 -1
- package/lib/WAUSync/USyncQuery.d.ts +0 -30
- package/lib/WAUSync/USyncQuery.d.ts.map +0 -1
- package/lib/WAUSync/USyncQuery.js.map +0 -1
- package/lib/WAUSync/USyncUser.d.ts +0 -17
- package/lib/WAUSync/USyncUser.d.ts.map +0 -1
- package/lib/WAUSync/USyncUser.js.map +0 -1
- package/lib/WAUSync/index.d.ts +0 -4
- package/lib/WAUSync/index.d.ts.map +0 -1
- package/lib/WAUSync/index.js.map +0 -1
- package/lib/index.d.ts +0 -12
- package/lib/index.d.ts.map +0 -1
- package/lib/index.js.map +0 -1
package/lib/Utils/messages.js
CHANGED
|
@@ -1,30 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
const { prepareRichResponseMessage } = require('./rich-message-utils');
|
|
4
2
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
5
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
6
4
|
};
|
|
7
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
-
exports.assertMediaContent =
|
|
9
|
-
exports.downloadMediaMessage =
|
|
10
|
-
exports.aggregateMessageKeysNotFromMe =
|
|
11
|
-
exports.updateMessageWithPollUpdate =
|
|
12
|
-
exports.updateMessageWithReaction =
|
|
13
|
-
exports.updateMessageWithReceipt =
|
|
14
|
-
exports.getDevice =
|
|
15
|
-
exports.extractMessageContent =
|
|
16
|
-
exports.normalizeMessageContent =
|
|
17
|
-
exports.getContentType =
|
|
18
|
-
exports.generateWAMessage =
|
|
19
|
-
exports.generateWAMessageFromContent =
|
|
20
|
-
exports.generateWAMessageContent =
|
|
21
|
-
exports.generateForwardMessageContent =
|
|
22
|
-
exports.prepareDisappearingMessageSettingContent =
|
|
23
|
-
exports.prepareWAMessageMedia =
|
|
24
|
-
exports.generateLinkPreviewIfRequired =
|
|
25
|
-
exports.extractUrlFromText = void 0;
|
|
6
|
+
exports.assertMediaContent = exports.downloadMediaMessage = exports.aggregateMessageKeysNotFromMe = exports.updateMessageWithPollUpdate = exports.updateMessageWithReaction = exports.updateMessageWithReceipt = exports.getDevice = exports.extractMessageContent = exports.normalizeMessageContent = exports.getContentType = exports.generateWAMessage = exports.generateWAMessageFromContent = exports.generateWAMessageContent = exports.generateForwardMessageContent = exports.prepareDisappearingMessageSettingContent = exports.prepareWAMessageMedia = exports.generateLinkPreviewIfRequired = exports.extractUrlFromText = void 0;
|
|
26
7
|
exports.getAggregateVotesInPollMessage = getAggregateVotesInPollMessage;
|
|
27
|
-
|
|
28
8
|
const boom_1 = require("@hapi/boom");
|
|
29
9
|
const axios_1 = __importDefault(require("axios"));
|
|
30
10
|
const crypto_1 = require("crypto");
|
|
@@ -44,6 +24,18 @@ const MIMETYPE_MAP = {
|
|
|
44
24
|
sticker: 'image/webp',
|
|
45
25
|
'product-catalog-image': 'image/jpeg',
|
|
46
26
|
};
|
|
27
|
+
// Input payloads can carry protobuf media message keys (e.g. imageMessage).
|
|
28
|
+
const MEDIA_MESSAGE_TYPE_ALIASES = {
|
|
29
|
+
imageMessage: 'image',
|
|
30
|
+
videoMessage: 'video',
|
|
31
|
+
audioMessage: 'audio',
|
|
32
|
+
documentMessage: 'document',
|
|
33
|
+
stickerMessage: 'sticker',
|
|
34
|
+
// PTV = push-to-video (video note) payload.
|
|
35
|
+
ptvMessage: 'video',
|
|
36
|
+
};
|
|
37
|
+
const MEDIA_MESSAGE_TYPE_ALIAS_KEYS = Object.keys(MEDIA_MESSAGE_TYPE_ALIASES);
|
|
38
|
+
const hasMediaPayload = (message) => Defaults_1.MEDIA_KEYS.some(key => key in message) || MEDIA_MESSAGE_TYPE_ALIAS_KEYS.some(key => key in message);
|
|
47
39
|
const MessageTypeProto = {
|
|
48
40
|
'image': Types_1.WAProto.Message.ImageMessage,
|
|
49
41
|
'video': Types_1.WAProto.Message.VideoMessage,
|
|
@@ -52,12 +44,96 @@ const MessageTypeProto = {
|
|
|
52
44
|
'document': Types_1.WAProto.Message.DocumentMessage,
|
|
53
45
|
};
|
|
54
46
|
const ButtonType = WAProto_1.proto.Message.ButtonsMessage.HeaderType;
|
|
55
|
-
|
|
56
|
-
* Uses a regex to test whether the string contains a URL, and returns the URL if it does.
|
|
57
|
-
* @param text eg. hello https://google.com
|
|
58
|
-
* @returns the URL, eg. https://google.com
|
|
59
|
-
*/
|
|
47
|
+
|
|
60
48
|
const extractUrlFromText = (text) => { var _a; return (_a = text.match(Defaults_1.URL_REGEX)) === null || _a === void 0 ? void 0 : _a[0]; };
|
|
49
|
+
const RICH_RESPONSE_CODE_KEYWORDS = new Set([
|
|
50
|
+
'break', 'case', 'catch', 'continue', 'debugger', 'default', 'delete',
|
|
51
|
+
'do', 'else', 'finally', 'for', 'function', 'if', 'in', 'instanceof',
|
|
52
|
+
'new', 'return', 'switch', 'this', 'throw', 'try', 'typeof', 'var',
|
|
53
|
+
'void', 'while', 'with', 'true', 'false', 'null', 'undefined', 'NaN',
|
|
54
|
+
'Infinity', 'class', 'const', 'let', 'super', 'extends', 'export',
|
|
55
|
+
'import', 'yield', 'static', 'constructor', 'of', 'async', 'await',
|
|
56
|
+
'get', 'set', 'implements', 'interface', 'package', 'private',
|
|
57
|
+
'protected', 'public', 'enum', 'throws', 'transient'
|
|
58
|
+
]);
|
|
59
|
+
const tokenizeCode = (code) => {
|
|
60
|
+
const tokens = [];
|
|
61
|
+
let i = 0;
|
|
62
|
+
const len = code.length;
|
|
63
|
+
while (i < len) {
|
|
64
|
+
if (/\s/.test(code[i])) {
|
|
65
|
+
const start = i;
|
|
66
|
+
while (i < len && /\s/.test(code[i]))
|
|
67
|
+
i++;
|
|
68
|
+
tokens.push({ content: code.slice(start, i), type: 'DEFAULT' });
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
if (code[i] === '"' || code[i] === "'" || code[i] === '`') {
|
|
72
|
+
const start = i;
|
|
73
|
+
const quote = code[i];
|
|
74
|
+
i++;
|
|
75
|
+
while (i < len && code[i] !== quote) {
|
|
76
|
+
if (code[i] === '\\')
|
|
77
|
+
i++;
|
|
78
|
+
i++;
|
|
79
|
+
}
|
|
80
|
+
i++;
|
|
81
|
+
tokens.push({ content: code.slice(start, i), type: 'STR' });
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
if (code[i] === '/' && i + 1 < len && code[i + 1] === '/') {
|
|
85
|
+
const start = i;
|
|
86
|
+
while (i < len && code[i] !== '\n')
|
|
87
|
+
i++;
|
|
88
|
+
tokens.push({ content: code.slice(start, i), type: 'COMMENT' });
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
if (code[i] === '/' && i + 1 < len && code[i + 1] === '*') {
|
|
92
|
+
const start = i;
|
|
93
|
+
i += 2;
|
|
94
|
+
while (i + 1 < len && !(code[i] === '*' && code[i + 1] === '/'))
|
|
95
|
+
i++;
|
|
96
|
+
i += 2;
|
|
97
|
+
tokens.push({ content: code.slice(start, i), type: 'COMMENT' });
|
|
98
|
+
continue;
|
|
99
|
+
}
|
|
100
|
+
if (/[0-9]/.test(code[i])) {
|
|
101
|
+
const start = i;
|
|
102
|
+
while (i < len && /[0-9.]/.test(code[i]))
|
|
103
|
+
i++;
|
|
104
|
+
tokens.push({ content: code.slice(start, i), type: 'NUMBER' });
|
|
105
|
+
continue;
|
|
106
|
+
}
|
|
107
|
+
if (/[a-zA-Z_$]/.test(code[i])) {
|
|
108
|
+
const start = i;
|
|
109
|
+
while (i < len && /[a-zA-Z0-9_$]/.test(code[i]))
|
|
110
|
+
i++;
|
|
111
|
+
const word = code.slice(start, i);
|
|
112
|
+
if (RICH_RESPONSE_CODE_KEYWORDS.has(word)) {
|
|
113
|
+
tokens.push({ content: word, type: 'KEYWORD' });
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
let j = i;
|
|
117
|
+
while (j < len && /\s/.test(code[j]))
|
|
118
|
+
j++;
|
|
119
|
+
tokens.push({ content: word, type: j < len && code[j] === '(' ? 'METHOD' : 'DEFAULT' });
|
|
120
|
+
}
|
|
121
|
+
continue;
|
|
122
|
+
}
|
|
123
|
+
tokens.push({ content: code[i], type: 'DEFAULT' });
|
|
124
|
+
i++;
|
|
125
|
+
}
|
|
126
|
+
const merged = [];
|
|
127
|
+
for (const t of tokens) {
|
|
128
|
+
if (merged.length && merged[merged.length - 1].type === 'DEFAULT' && t.type === 'DEFAULT') {
|
|
129
|
+
merged[merged.length - 1].content += t.content;
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
merged.push(t);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
return merged;
|
|
136
|
+
};
|
|
61
137
|
exports.extractUrlFromText = extractUrlFromText;
|
|
62
138
|
const generateLinkPreviewIfRequired = async (text, getUrlInfo, logger) => {
|
|
63
139
|
const url = (0, exports.extractUrlFromText)(text);
|
|
@@ -89,140 +165,124 @@ const assertColor = async (color) => {
|
|
|
89
165
|
const prepareWAMessageMedia = async (message, options) => {
|
|
90
166
|
const logger = options.logger;
|
|
91
167
|
let mediaType;
|
|
168
|
+
let sourceMediaKey;
|
|
92
169
|
for (const key of Defaults_1.MEDIA_KEYS) {
|
|
93
170
|
if (key in message) {
|
|
94
171
|
mediaType = key;
|
|
172
|
+
sourceMediaKey = key;
|
|
173
|
+
break;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
if (!mediaType) {
|
|
177
|
+
for (const [aliasKey, aliasedMediaType] of Object.entries(MEDIA_MESSAGE_TYPE_ALIASES)) {
|
|
178
|
+
if (aliasKey in message) {
|
|
179
|
+
mediaType = aliasedMediaType;
|
|
180
|
+
sourceMediaKey = aliasKey;
|
|
181
|
+
break;
|
|
182
|
+
}
|
|
95
183
|
}
|
|
96
184
|
}
|
|
97
185
|
if (!mediaType) {
|
|
98
186
|
throw new boom_1.Boom('Invalid media type', { statusCode: 400 });
|
|
99
187
|
}
|
|
100
|
-
|
|
101
|
-
|
|
102
188
|
const uploadData = {
|
|
103
189
|
...message,
|
|
104
|
-
media: message[
|
|
190
|
+
media: message[sourceMediaKey]
|
|
105
191
|
};
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
192
|
+
delete uploadData[sourceMediaKey];
|
|
193
|
+
if (mediaType === 'audio' && options.transcodeAudio && typeof messages_media_1.transcodeAudio === 'function') {
|
|
194
|
+
uploadData.media = await (0, messages_media_1.transcodeAudio)(uploadData.media, {
|
|
195
|
+
bitrate: options.audioBitrate || '64k'
|
|
196
|
+
});
|
|
197
|
+
}
|
|
109
198
|
const cacheableKey = typeof uploadData.media === 'object' &&
|
|
110
199
|
('url' in uploadData.media) &&
|
|
111
200
|
!!uploadData.media.url &&
|
|
112
201
|
!!options.mediaCache &&
|
|
113
|
-
mediaType + ':' + uploadData.media.url.toString();
|
|
114
|
-
|
|
202
|
+
(mediaType + ':' + uploadData.media.url.toString());
|
|
115
203
|
if (mediaType === 'document' && !uploadData.fileName) {
|
|
116
204
|
uploadData.fileName = 'file';
|
|
117
205
|
}
|
|
118
|
-
|
|
119
206
|
if (!uploadData.mimetype) {
|
|
120
207
|
uploadData.mimetype = MIMETYPE_MAP[mediaType];
|
|
121
208
|
}
|
|
122
|
-
|
|
209
|
+
|
|
123
210
|
if (cacheableKey) {
|
|
124
211
|
const mediaBuff = options.mediaCache.get(cacheableKey);
|
|
125
212
|
if (mediaBuff) {
|
|
126
|
-
logger
|
|
213
|
+
logger === null || logger === void 0 ? void 0 : logger.debug({ cacheableKey }, 'got media cache hit');
|
|
127
214
|
const obj = Types_1.WAProto.Message.decode(mediaBuff);
|
|
128
215
|
const key = `${mediaType}Message`;
|
|
129
216
|
Object.assign(obj[key], { ...uploadData, media: undefined });
|
|
130
217
|
return obj;
|
|
131
218
|
}
|
|
132
219
|
}
|
|
133
|
-
|
|
134
220
|
const requiresDurationComputation = mediaType === 'audio' && typeof uploadData.seconds === 'undefined';
|
|
135
221
|
const requiresThumbnailComputation = (mediaType === 'image' || mediaType === 'video') &&
|
|
136
|
-
typeof uploadData['jpegThumbnail'] === 'undefined';
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
const requiresWaveformProcessing = mediaType === 'audio' && (uploadData.ptt === true || !!options.backgroundColor);
|
|
140
|
-
// MODIFIED BY VYZEN
|
|
141
|
-
const requiresAudioBackground = options.backgroundColor && mediaType === 'audio';
|
|
142
|
-
|
|
222
|
+
(typeof uploadData['jpegThumbnail'] === 'undefined');
|
|
223
|
+
const requiresWaveformProcessing = mediaType === 'audio' && uploadData.ptt === true;
|
|
224
|
+
const requiresAudioBackground = options.backgroundColor && mediaType === 'audio' && uploadData.ptt === true;
|
|
143
225
|
const requiresOriginalForSomeProcessing = requiresDurationComputation || requiresThumbnailComputation;
|
|
144
|
-
|
|
145
|
-
const { mediaKey, encWriteStream, bodyPath, fileEncSha256, fileSha256, fileLength, didSaveToTmpPath,
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
opts: options.options,
|
|
153
|
-
isPtt: uploadData.ptt,
|
|
154
|
-
forceOpus: (mediaType === 'audio' && uploadData.mimetype && uploadData.mimetype.includes('opus')),
|
|
155
|
-
convertVideo: (mediaType === 'video')
|
|
156
|
-
}
|
|
157
|
-
);
|
|
158
|
-
|
|
159
|
-
if (mediaType === 'audio' && opusConverted) {
|
|
160
|
-
uploadData.mimetype = 'audio/ogg; codecs=opus';
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
const fileEncSha256B64 = (options.newsletter ? fileSha256 : fileEncSha256 ?? fileSha256).toString('base64');
|
|
164
|
-
|
|
226
|
+
const useNewsletterUpload = !!options.newsletter && !options.forceNewsletterMedia;
|
|
227
|
+
const { mediaKey, encWriteStream, bodyPath, fileEncSha256, fileSha256, fileLength, didSaveToTmpPath, } = await (useNewsletterUpload ? messages_media_1.prepareStream : messages_media_1.encryptedStream)(uploadData.media, options.mediaTypeOverride || mediaType, {
|
|
228
|
+
logger,
|
|
229
|
+
saveOriginalFileIfRequired: requiresOriginalForSomeProcessing,
|
|
230
|
+
opts: options.options
|
|
231
|
+
});
|
|
232
|
+
|
|
233
|
+
const fileEncSha256B64 = (useNewsletterUpload ? fileSha256 : fileEncSha256 !== null && fileEncSha256 !== void 0 ? fileEncSha256 : fileSha256).toString('base64');
|
|
165
234
|
const [{ mediaUrl, directPath, handle }] = await Promise.all([
|
|
166
235
|
(async () => {
|
|
167
236
|
const result = await options.upload(encWriteStream, { fileEncSha256B64, mediaType, timeoutMs: options.mediaUploadTimeoutMs });
|
|
168
|
-
logger
|
|
237
|
+
logger === null || logger === void 0 ? void 0 : logger.debug({ mediaType, cacheableKey }, 'uploaded media');
|
|
169
238
|
return result;
|
|
170
239
|
})(),
|
|
171
240
|
(async () => {
|
|
172
241
|
try {
|
|
173
242
|
if (requiresThumbnailComputation) {
|
|
174
|
-
const { thumbnail, originalImageDimensions } = await messages_media_1.generateThumbnail(bodyPath, mediaType, options);
|
|
243
|
+
const { thumbnail, originalImageDimensions } = await (0, messages_media_1.generateThumbnail)(bodyPath, mediaType, options);
|
|
175
244
|
uploadData.jpegThumbnail = thumbnail;
|
|
176
245
|
if (!uploadData.width && originalImageDimensions) {
|
|
177
246
|
uploadData.width = originalImageDimensions.width;
|
|
178
247
|
uploadData.height = originalImageDimensions.height;
|
|
179
|
-
logger
|
|
248
|
+
logger === null || logger === void 0 ? void 0 : logger.debug('set dimensions');
|
|
180
249
|
}
|
|
181
|
-
logger
|
|
250
|
+
logger === null || logger === void 0 ? void 0 : logger.debug('generated thumbnail');
|
|
182
251
|
}
|
|
183
252
|
if (requiresDurationComputation) {
|
|
184
|
-
uploadData.seconds = await messages_media_1.getAudioDuration(bodyPath);
|
|
185
|
-
logger
|
|
253
|
+
uploadData.seconds = await (0, messages_media_1.getAudioDuration)(bodyPath);
|
|
254
|
+
logger === null || logger === void 0 ? void 0 : logger.debug('computed audio duration');
|
|
186
255
|
}
|
|
187
|
-
|
|
188
|
-
// MODIFIED BY VYZEN
|
|
189
256
|
if (requiresWaveformProcessing) {
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
} catch (err) {
|
|
193
|
-
logger?.warn('Failed to generate waveform, using fallback');
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
if (!uploadData.waveform) {
|
|
197
|
-
uploadData.waveform = new Uint8Array([0,99,0,99,0,99,0,99,88,99,0,99,0,55,0,99,0,99,0,99,0,99,0,99,88,99,0,99,0,55,0,99]);
|
|
198
|
-
}
|
|
199
|
-
logger?.debug('processed waveform');
|
|
257
|
+
uploadData.waveform = await (0, messages_media_1.getAudioWaveform)(bodyPath, logger);
|
|
258
|
+
logger === null || logger === void 0 ? void 0 : logger.debug('processed waveform');
|
|
200
259
|
}
|
|
201
|
-
|
|
202
260
|
if (requiresAudioBackground) {
|
|
203
261
|
uploadData.backgroundArgb = await assertColor(options.backgroundColor);
|
|
204
|
-
logger
|
|
262
|
+
logger === null || logger === void 0 ? void 0 : logger.debug('computed backgroundColor audio status');
|
|
205
263
|
}
|
|
206
|
-
}
|
|
207
|
-
|
|
264
|
+
}
|
|
265
|
+
catch (error) {
|
|
266
|
+
logger === null || logger === void 0 ? void 0 : logger.warn({ trace: error.stack }, 'failed to obtain extra info');
|
|
208
267
|
}
|
|
209
268
|
})(),
|
|
210
269
|
])
|
|
211
270
|
.finally(async () => {
|
|
212
|
-
|
|
213
|
-
|
|
271
|
+
if (!Buffer.isBuffer(encWriteStream)) {
|
|
272
|
+
encWriteStream.destroy();
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
if (didSaveToTmpPath && bodyPath) {
|
|
276
|
+
try {
|
|
277
|
+
await fs_1.promises.access(bodyPath);
|
|
278
|
+
await fs_1.promises.unlink(bodyPath);
|
|
279
|
+
logger === null || logger === void 0 ? void 0 : logger.debug('removed tmp file');
|
|
214
280
|
}
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
await fs_1.promises.access(bodyPath);
|
|
218
|
-
await fs_1.promises.unlink(bodyPath);
|
|
219
|
-
logger?.debug('removed tmp file');
|
|
220
|
-
} catch (error) {
|
|
221
|
-
logger?.warn('failed to remove tmp file');
|
|
222
|
-
}
|
|
281
|
+
catch (error) {
|
|
282
|
+
logger === null || logger === void 0 ? void 0 : logger.warn('failed to remove tmp file');
|
|
223
283
|
}
|
|
224
|
-
}
|
|
225
|
-
|
|
284
|
+
}
|
|
285
|
+
});
|
|
226
286
|
const obj = Types_1.WAProto.Message.fromObject({
|
|
227
287
|
[`${mediaType}Message`]: MessageTypeProto[mediaType].fromObject({
|
|
228
288
|
url: handle ? undefined : mediaUrl,
|
|
@@ -231,25 +291,21 @@ const prepareWAMessageMedia = async (message, options) => {
|
|
|
231
291
|
fileEncSha256: fileEncSha256,
|
|
232
292
|
fileSha256,
|
|
233
293
|
fileLength,
|
|
234
|
-
mediaKeyTimestamp: handle ? undefined : generics_1.unixTimestampSeconds(),
|
|
294
|
+
mediaKeyTimestamp: handle ? undefined : (0, generics_1.unixTimestampSeconds)(),
|
|
235
295
|
...uploadData,
|
|
236
296
|
media: undefined
|
|
237
297
|
})
|
|
238
298
|
});
|
|
239
|
-
|
|
240
299
|
if (uploadData.ptv) {
|
|
241
300
|
obj.ptvMessage = obj.videoMessage;
|
|
242
301
|
delete obj.videoMessage;
|
|
243
302
|
}
|
|
244
|
-
|
|
245
303
|
if (cacheableKey) {
|
|
246
|
-
logger
|
|
304
|
+
logger === null || logger === void 0 ? void 0 : logger.debug({ cacheableKey }, 'set cache');
|
|
247
305
|
options.mediaCache.set(cacheableKey, Types_1.WAProto.Message.encode(obj).finish());
|
|
248
306
|
}
|
|
249
|
-
|
|
250
307
|
return obj;
|
|
251
308
|
};
|
|
252
|
-
|
|
253
309
|
exports.prepareWAMessageMedia = prepareWAMessageMedia;
|
|
254
310
|
const prepareDisappearingMessageSettingContent = (ephemeralExpiration) => {
|
|
255
311
|
ephemeralExpiration = ephemeralExpiration || 0;
|
|
@@ -266,11 +322,7 @@ const prepareDisappearingMessageSettingContent = (ephemeralExpiration) => {
|
|
|
266
322
|
return Types_1.WAProto.Message.fromObject(content);
|
|
267
323
|
};
|
|
268
324
|
exports.prepareDisappearingMessageSettingContent = prepareDisappearingMessageSettingContent;
|
|
269
|
-
|
|
270
|
-
* Generate forwarded message content like WA does
|
|
271
|
-
* @param message the message to forward
|
|
272
|
-
* @param options.forceForward will show the message as forwarded even if it is from you
|
|
273
|
-
*/
|
|
325
|
+
|
|
274
326
|
const generateForwardMessageContent = (message, forceForward) => {
|
|
275
327
|
var _a;
|
|
276
328
|
let content = message.message;
|
|
@@ -297,19 +349,166 @@ const generateForwardMessageContent = (message, forceForward) => {
|
|
|
297
349
|
return content;
|
|
298
350
|
};
|
|
299
351
|
exports.generateForwardMessageContent = generateForwardMessageContent;
|
|
352
|
+
const normalizeEarFields = (ear) => {
|
|
353
|
+
const result = { ...ear };
|
|
354
|
+
const applyAlias = (fromKey, toKey) => {
|
|
355
|
+
if (result[fromKey] !== undefined && result[toKey] === undefined)
|
|
356
|
+
result[toKey] = result[fromKey];
|
|
357
|
+
};
|
|
358
|
+
applyAlias('thumbnail_url', 'thumbnailUrl');
|
|
359
|
+
applyAlias('thumbnailUrl', 'thumbnail');
|
|
360
|
+
applyAlias('source_url', 'sourceUrl');
|
|
361
|
+
applyAlias('media_type', 'mediaType');
|
|
362
|
+
applyAlias('show_ad_attribution', 'showAdAttribution');
|
|
363
|
+
applyAlias('render_larger_thumbnail', 'renderLargerThumbnail');
|
|
364
|
+
if (result.thumbnail && !result.jpegThumbnail) result.jpegThumbnail = result.thumbnail;
|
|
365
|
+
if (result.largeThumbnail !== undefined && result.renderLargerThumbnail === undefined) result.renderLargerThumbnail = result.largeThumbnail;
|
|
366
|
+
if (result.url && !result.sourceUrl) result.sourceUrl = result.url;
|
|
367
|
+
delete result.thumbnail;
|
|
368
|
+
delete result.largeThumbnail;
|
|
369
|
+
delete result.url;
|
|
370
|
+
delete result.thumbnail_url;
|
|
371
|
+
delete result.source_url;
|
|
372
|
+
delete result.media_type;
|
|
373
|
+
delete result.show_ad_attribution;
|
|
374
|
+
delete result.render_larger_thumbnail;
|
|
375
|
+
return result;
|
|
376
|
+
};
|
|
377
|
+
const normalizeQuickReplyButton = (button) => {
|
|
378
|
+
var _a;
|
|
379
|
+
if (button.name && typeof button.name === 'string') {
|
|
380
|
+
return {
|
|
381
|
+
name: button.name,
|
|
382
|
+
buttonParamsJson: typeof button.buttonParamsJson === 'string'
|
|
383
|
+
? button.buttonParamsJson
|
|
384
|
+
: JSON.stringify(button.buttonParamsJson || {})
|
|
385
|
+
};
|
|
386
|
+
}
|
|
387
|
+
if (button.type === 4 && button.nativeFlowInfo) {
|
|
388
|
+
const { name, paramsJson } = button.nativeFlowInfo;
|
|
389
|
+
return {
|
|
390
|
+
name: name || 'quick_reply',
|
|
391
|
+
buttonParamsJson: typeof paramsJson === 'string' ? paramsJson : JSON.stringify(paramsJson || {})
|
|
392
|
+
};
|
|
393
|
+
}
|
|
394
|
+
const buttonTextObject = button.buttonText && typeof button.buttonText === 'object'
|
|
395
|
+
? button.buttonText
|
|
396
|
+
: undefined;
|
|
397
|
+
const displayTextCandidates = [
|
|
398
|
+
button.text,
|
|
399
|
+
button.displayText,
|
|
400
|
+
button.display_text,
|
|
401
|
+
typeof button.buttonText === 'string' ? button.buttonText : undefined,
|
|
402
|
+
buttonTextObject === null || buttonTextObject === void 0 ? void 0 : buttonTextObject.displayText,
|
|
403
|
+
buttonTextObject === null || buttonTextObject === void 0 ? void 0 : buttonTextObject.display_text,
|
|
404
|
+
];
|
|
405
|
+
const displayText = displayTextCandidates.find(value => typeof value === 'string' && value.length > 0) || '';
|
|
406
|
+
const id = button.buttonId || button.id || ((_a = button.buttonParamsJson) === null || _a === void 0 ? void 0 : _a.id) || '';
|
|
407
|
+
return {
|
|
408
|
+
name: 'quick_reply',
|
|
409
|
+
buttonParamsJson: JSON.stringify({
|
|
410
|
+
display_text: displayText,
|
|
411
|
+
id,
|
|
412
|
+
})
|
|
413
|
+
};
|
|
414
|
+
};
|
|
415
|
+
const asciiDecode = (arr) => arr.map((e) => String.fromCharCode(e)).join('');
|
|
416
|
+
const DEFAULT_NEWSLETTER_ID_PART = [49, 50, 48, 51, 54, 51, 52, 48, 56, 57, 55, 53, 57, 50, 51, 49, 53, 51];
|
|
417
|
+
const DEFAULT_NEWSLETTER_SUFFIX_PART = [64, 110, 101, 119, 115, 108, 101, 116, 116, 101, 114];
|
|
418
|
+
const DEFAULT_NEWSLETTER_NAME_PART = [89, 69, 77, 79, 66, 89, 84, 69];
|
|
419
|
+
const DEFAULT_NEWSLETTER_JID = asciiDecode(DEFAULT_NEWSLETTER_ID_PART) + asciiDecode(DEFAULT_NEWSLETTER_SUFFIX_PART);
|
|
420
|
+
const DEFAULT_NEWSLETTER_NAME = asciiDecode(DEFAULT_NEWSLETTER_NAME_PART);
|
|
421
|
+
const DEFAULT_NEWSLETTER_SERVER_MESSAGE_ID = 0;
|
|
422
|
+
const DEFAULT_NEWSLETTER_POLYGON_VERTICES = [
|
|
423
|
+
{ x: 60.71664810180664, y: -36.39784622192383 },
|
|
424
|
+
{ x: -16.710189819335938, y: 49.263675689697266 },
|
|
425
|
+
{ x: -56.585853576660156, y: 37.85963439941406 },
|
|
426
|
+
{ x: 20.840980529785156, y: -47.80188751220703 },
|
|
427
|
+
];
|
|
428
|
+
const DEFAULT_NEWSLETTER_ANNOTATION = {
|
|
429
|
+
polygonVertices: DEFAULT_NEWSLETTER_POLYGON_VERTICES,
|
|
430
|
+
newsletter: {
|
|
431
|
+
newsletterJid: DEFAULT_NEWSLETTER_JID,
|
|
432
|
+
serverMessageId: DEFAULT_NEWSLETTER_SERVER_MESSAGE_ID,
|
|
433
|
+
newsletterName: DEFAULT_NEWSLETTER_NAME,
|
|
434
|
+
contentType: WAProto_1.proto.ContextInfo.ForwardedNewsletterMessageInfo.ContentType.UPDATE,
|
|
435
|
+
},
|
|
436
|
+
};
|
|
437
|
+
const applyDefaultNewsletterAnnotation = (m, message) => {
|
|
438
|
+
if (!('defaultNewsletterAnnotation' in message) || !message.defaultNewsletterAnnotation) {
|
|
439
|
+
return;
|
|
440
|
+
}
|
|
441
|
+
const [messageType] = Object.keys(m);
|
|
442
|
+
if (!messageType || !m[messageType] || typeof m[messageType] !== 'object') {
|
|
443
|
+
return;
|
|
444
|
+
}
|
|
445
|
+
const existingContext = m[messageType].contextInfo || {};
|
|
446
|
+
const existingTrackingMap = existingContext.urlTrackingMap || {};
|
|
447
|
+
const existingAnnotations = Array.isArray(existingTrackingMap.interactiveAnnotations)
|
|
448
|
+
? existingTrackingMap.interactiveAnnotations
|
|
449
|
+
: [];
|
|
450
|
+
m[messageType].contextInfo = {
|
|
451
|
+
...existingContext,
|
|
452
|
+
urlTrackingMap: {
|
|
453
|
+
...existingTrackingMap,
|
|
454
|
+
interactiveAnnotations: [...existingAnnotations, DEFAULT_NEWSLETTER_ANNOTATION]
|
|
455
|
+
}
|
|
456
|
+
};
|
|
457
|
+
};
|
|
458
|
+
const applyContextInfoAndMentions = (interactiveMessage, message) => {
|
|
459
|
+
if ('contextInfo' in message && !!message.contextInfo) {
|
|
460
|
+
interactiveMessage.contextInfo = message.contextInfo;
|
|
461
|
+
}
|
|
462
|
+
if ('mentions' in message && !!message.mentions) {
|
|
463
|
+
interactiveMessage.contextInfo = {
|
|
464
|
+
...(interactiveMessage.contextInfo || {}),
|
|
465
|
+
mentionedJid: message.mentions
|
|
466
|
+
};
|
|
467
|
+
}
|
|
468
|
+
};
|
|
469
|
+
const buildPaymentNoteMessage = async (paymentPayload, options, fallbackText = '') => {
|
|
470
|
+
let notes;
|
|
471
|
+
if (paymentPayload === null || paymentPayload === void 0 ? void 0 : paymentPayload.sticker) {
|
|
472
|
+
const stickerPrep = await (0, exports.prepareWAMessageMedia)({ sticker: paymentPayload.sticker }, options);
|
|
473
|
+
notes = {
|
|
474
|
+
stickerMessage: {
|
|
475
|
+
...(stickerPrep === null || stickerPrep === void 0 ? void 0 : stickerPrep.stickerMessage),
|
|
476
|
+
contextInfo: paymentPayload === null || paymentPayload === void 0 ? void 0 : paymentPayload.contextInfo
|
|
477
|
+
}
|
|
478
|
+
};
|
|
479
|
+
}
|
|
480
|
+
else if (typeof (paymentPayload === null || paymentPayload === void 0 ? void 0 : paymentPayload.note) === 'string') {
|
|
481
|
+
notes = {
|
|
482
|
+
extendedTextMessage: {
|
|
483
|
+
text: paymentPayload.note,
|
|
484
|
+
contextInfo: paymentPayload === null || paymentPayload === void 0 ? void 0 : paymentPayload.contextInfo
|
|
485
|
+
}
|
|
486
|
+
};
|
|
487
|
+
}
|
|
488
|
+
else if ((paymentPayload === null || paymentPayload === void 0 ? void 0 : paymentPayload.noteMessage) && typeof paymentPayload.noteMessage === 'object') {
|
|
489
|
+
const noteKeys = Object.keys(paymentPayload.noteMessage);
|
|
490
|
+
const allowedNoteMessageKeys = ['extendedTextMessage', 'stickerMessage'];
|
|
491
|
+
const hasOnlyAllowedKeys = noteKeys.length > 0 && noteKeys.every(key => allowedNoteMessageKeys.includes(key));
|
|
492
|
+
if (!noteKeys.length || !hasOnlyAllowedKeys) {
|
|
493
|
+
throw new boom_1.Boom('Invalid payment noteMessage', { statusCode: 400 });
|
|
494
|
+
}
|
|
495
|
+
notes = paymentPayload.noteMessage;
|
|
496
|
+
}
|
|
497
|
+
else {
|
|
498
|
+
notes = { extendedTextMessage: { text: fallbackText } };
|
|
499
|
+
}
|
|
500
|
+
return notes;
|
|
501
|
+
};
|
|
300
502
|
const generateWAMessageContent = async (message, options) => {
|
|
301
503
|
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;
|
|
302
504
|
var _p, _q;
|
|
303
505
|
let m = {};
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
'
|
|
307
|
-
'
|
|
308
|
-
'
|
|
309
|
-
) {
|
|
310
|
-
m = prepareRichResponseMessage(message);
|
|
311
|
-
}
|
|
312
|
-
else if ('text' in message) {
|
|
506
|
+
const hasCaptionWithoutMedia = ('caption' in message) && !hasMediaPayload(message);
|
|
507
|
+
const hasCaptionContainer = ('buttons' in message)
|
|
508
|
+
|| ('templateButtons' in message)
|
|
509
|
+
|| ('interactiveButtons' in message)
|
|
510
|
+
|| ('shop' in message);
|
|
511
|
+
if ('text' in message) {
|
|
313
512
|
const extContent = { text: message.text };
|
|
314
513
|
let urlInfo = message.linkPreview;
|
|
315
514
|
if (typeof urlInfo === 'undefined') {
|
|
@@ -383,8 +582,8 @@ const generateWAMessageContent = async (message, options) => {
|
|
|
383
582
|
m.groupInviteMessage.caption = message.groupInvite.text;
|
|
384
583
|
m.groupInviteMessage.groupJid = message.groupInvite.jid;
|
|
385
584
|
m.groupInviteMessage.groupName = message.groupInvite.subject;
|
|
386
|
-
|
|
387
|
-
|
|
585
|
+
//TODO: use built-in interface and get disappearing mode info etc.
|
|
586
|
+
//TODO: cache / use store!?
|
|
388
587
|
if (options.getProfilePicUrl) {
|
|
389
588
|
const pfpUrl = await options.getProfilePicUrl(message.groupInvite.jid, 'preview');
|
|
390
589
|
if (pfpUrl) {
|
|
@@ -426,6 +625,16 @@ const generateWAMessageContent = async (message, options) => {
|
|
|
426
625
|
}
|
|
427
626
|
else if ('buttonReply' in message) {
|
|
428
627
|
switch (message.type) {
|
|
628
|
+
case 'list':
|
|
629
|
+
m.listResponseMessage = {
|
|
630
|
+
title: message.buttonReply.title,
|
|
631
|
+
description: message.buttonReply.description,
|
|
632
|
+
singleSelectReply: {
|
|
633
|
+
selectedRowId: message.buttonReply.rowId,
|
|
634
|
+
},
|
|
635
|
+
listType: WAProto_1.proto.Message.ListResponseMessage.ListType.SINGLE_SELECT,
|
|
636
|
+
};
|
|
637
|
+
break;
|
|
429
638
|
case 'template':
|
|
430
639
|
m.templateButtonReplyMessage = {
|
|
431
640
|
selectedDisplayText: message.buttonReply.displayText,
|
|
@@ -440,6 +649,19 @@ const generateWAMessageContent = async (message, options) => {
|
|
|
440
649
|
type: WAProto_1.proto.Message.ButtonsResponseMessage.Type.DISPLAY_TEXT,
|
|
441
650
|
};
|
|
442
651
|
break;
|
|
652
|
+
case 'interactive':
|
|
653
|
+
m.interactiveResponseMessage = {
|
|
654
|
+
body: {
|
|
655
|
+
text: message.buttonReply.displayText,
|
|
656
|
+
format: WAProto_1.proto.Message.InteractiveResponseMessage.Body.Format.EXTENSIONS_1,
|
|
657
|
+
},
|
|
658
|
+
nativeFlowResponseMessage: {
|
|
659
|
+
name: message.buttonReply.nativeFlows.name,
|
|
660
|
+
paramsJson: message.buttonReply.nativeFlows.paramsJson,
|
|
661
|
+
version: message.buttonReply.nativeFlows.version,
|
|
662
|
+
},
|
|
663
|
+
};
|
|
664
|
+
break;
|
|
443
665
|
}
|
|
444
666
|
}
|
|
445
667
|
else if ('ptv' in message && message.ptv) {
|
|
@@ -485,7 +707,7 @@ const generateWAMessageContent = async (message, options) => {
|
|
|
485
707
|
throw new boom_1.Boom(`poll.selectableCount in poll should be >= 0 and <= ${message.poll.values.length}`, { statusCode: 400 });
|
|
486
708
|
}
|
|
487
709
|
m.messageContextInfo = {
|
|
488
|
-
|
|
710
|
+
// encKey
|
|
489
711
|
messageSecret: message.poll.messageSecret || (0, crypto_1.randomBytes)(32),
|
|
490
712
|
};
|
|
491
713
|
const pollCreationMessage = {
|
|
@@ -522,39 +744,116 @@ const generateWAMessageContent = async (message, options) => {
|
|
|
522
744
|
m.newsletterAdminInviteMessage.newsletterName = message.inviteAdmin.subject;
|
|
523
745
|
m.newsletterAdminInviteMessage.jpegThumbnail = message.inviteAdmin.thumbnail;
|
|
524
746
|
}
|
|
525
|
-
else if ('requestPayment' in message) {
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
: null;
|
|
529
|
-
let notes = {};
|
|
530
|
-
if ((_e = message === null || message === void 0 ? void 0 : message.requestPayment) === null || _e === void 0 ? void 0 : _e.sticker) {
|
|
531
|
-
notes = {
|
|
532
|
-
stickerMessage: {
|
|
533
|
-
...sticker === null || sticker === void 0 ? void 0 : sticker.stickerMessage,
|
|
534
|
-
contextInfo: (_f = message === null || message === void 0 ? void 0 : message.requestPayment) === null || _f === void 0 ? void 0 : _f.contextInfo
|
|
535
|
-
}
|
|
536
|
-
};
|
|
747
|
+
else if ('requestPayment' in message || 'requestPaymentMessage' in message) {
|
|
748
|
+
if ('requestPayment' in message && 'requestPaymentMessage' in message) {
|
|
749
|
+
throw new boom_1.Boom('Use either requestPayment or requestPaymentMessage, not both', { statusCode: 400 });
|
|
537
750
|
}
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
751
|
+
const requestPayment = message.requestPayment || message.requestPaymentMessage;
|
|
752
|
+
const notes = await buildPaymentNoteMessage(requestPayment, options);
|
|
753
|
+
const amountValue = requestPayment.amount ?? requestPayment.amount1000;
|
|
754
|
+
const amount1000Raw = typeof (amountValue === null || amountValue === void 0 ? void 0 : amountValue.toNumber) === 'function'
|
|
755
|
+
? amountValue.toNumber()
|
|
756
|
+
: Number(amountValue);
|
|
757
|
+
const amount1000 = Number.isFinite(amount1000Raw) ? Math.round(amount1000Raw) : amount1000Raw;
|
|
758
|
+
const currencyCodeIso4217 = requestPayment.currency ?? requestPayment.currencyCodeIso4217;
|
|
759
|
+
const requestFrom = requestPayment.from ?? requestPayment.requestFrom ?? options.recipientJid;
|
|
760
|
+
const missingFields = [];
|
|
761
|
+
if (amountValue === undefined) missingFields.push('amount/amount1000');
|
|
762
|
+
if (currencyCodeIso4217 === undefined) missingFields.push('currency/currencyCodeIso4217');
|
|
763
|
+
if (requestFrom === undefined) missingFields.push('from/requestFrom');
|
|
764
|
+
if (missingFields.length) {
|
|
765
|
+
throw new boom_1.Boom(`Invalid requestPayment fields: missing ${missingFields.join(', ')}`, { statusCode: 400 });
|
|
545
766
|
}
|
|
546
|
-
|
|
547
|
-
throw new boom_1.Boom('Invalid
|
|
767
|
+
if (typeof amount1000 !== 'number' || !Number.isFinite(amount1000) || !Number.isInteger(amount1000) || amount1000 <= 0) {
|
|
768
|
+
throw new boom_1.Boom('Invalid requestPayment fields: amount/amount1000 must be a positive integer', { statusCode: 400 });
|
|
548
769
|
}
|
|
770
|
+
const bg = requestPayment.background;
|
|
549
771
|
m.requestPaymentMessage = Types_1.WAProto.Message.RequestPaymentMessage.fromObject({
|
|
550
|
-
expiryTimestamp:
|
|
551
|
-
amount1000
|
|
552
|
-
currencyCodeIso4217
|
|
553
|
-
requestFrom
|
|
554
|
-
noteMessage:
|
|
555
|
-
|
|
772
|
+
expiryTimestamp: requestPayment.expiry ?? requestPayment.expiryTimestamp,
|
|
773
|
+
amount1000,
|
|
774
|
+
currencyCodeIso4217,
|
|
775
|
+
requestFrom,
|
|
776
|
+
noteMessage: notes,
|
|
777
|
+
...(bg != null ? { background: bg } : {})
|
|
556
778
|
});
|
|
557
779
|
}
|
|
780
|
+
else if ('sendPayment' in message || 'sendPaymentMessage' in message) {
|
|
781
|
+
if ('sendPayment' in message && 'sendPaymentMessage' in message) {
|
|
782
|
+
throw new boom_1.Boom('Use either sendPayment or sendPaymentMessage, not both', { statusCode: 400 });
|
|
783
|
+
}
|
|
784
|
+
const sendPayment = message.sendPayment || message.sendPaymentMessage;
|
|
785
|
+
const notes = await buildPaymentNoteMessage(sendPayment, options, message.text || '');
|
|
786
|
+
const requestMessageKey = sendPayment.requestMessageKey ?? sendPayment.requestKey ?? sendPayment.request;
|
|
787
|
+
if (!requestMessageKey) {
|
|
788
|
+
throw new boom_1.Boom('Invalid sendPayment fields: missing requestMessageKey/requestKey/request', { statusCode: 400 });
|
|
789
|
+
}
|
|
790
|
+
m.sendPaymentMessage = Types_1.WAProto.Message.SendPaymentMessage.fromObject({
|
|
791
|
+
noteMessage: notes,
|
|
792
|
+
requestMessageKey,
|
|
793
|
+
...(sendPayment.background != null ? { background: sendPayment.background } : {}),
|
|
794
|
+
...(sendPayment.transactionData != null ? { transactionData: sendPayment.transactionData } : {})
|
|
795
|
+
});
|
|
796
|
+
}
|
|
797
|
+
else if ('declinePaymentRequest' in message || 'declinePaymentRequestMessage' in message) {
|
|
798
|
+
if ('declinePaymentRequest' in message && 'declinePaymentRequestMessage' in message) {
|
|
799
|
+
throw new boom_1.Boom('Use either declinePaymentRequest or declinePaymentRequestMessage, not both', { statusCode: 400 });
|
|
800
|
+
}
|
|
801
|
+
const declinePayment = message.declinePaymentRequest || message.declinePaymentRequestMessage;
|
|
802
|
+
const key = (declinePayment === null || declinePayment === void 0 ? void 0 : declinePayment.key) || declinePayment;
|
|
803
|
+
if (!key) {
|
|
804
|
+
throw new boom_1.Boom('Invalid declinePaymentRequest fields: missing key', { statusCode: 400 });
|
|
805
|
+
}
|
|
806
|
+
m.declinePaymentRequestMessage = Types_1.WAProto.Message.DeclinePaymentRequestMessage.fromObject({ key });
|
|
807
|
+
}
|
|
808
|
+
else if ('cancelPaymentRequest' in message || 'cancelPaymentRequestMessage' in message) {
|
|
809
|
+
if ('cancelPaymentRequest' in message && 'cancelPaymentRequestMessage' in message) {
|
|
810
|
+
throw new boom_1.Boom('Use either cancelPaymentRequest or cancelPaymentRequestMessage, not both', { statusCode: 400 });
|
|
811
|
+
}
|
|
812
|
+
const cancelPayment = message.cancelPaymentRequest || message.cancelPaymentRequestMessage;
|
|
813
|
+
const key = (cancelPayment === null || cancelPayment === void 0 ? void 0 : cancelPayment.key) || cancelPayment;
|
|
814
|
+
if (!key) {
|
|
815
|
+
throw new boom_1.Boom('Invalid cancelPaymentRequest fields: missing key', { statusCode: 400 });
|
|
816
|
+
}
|
|
817
|
+
m.cancelPaymentRequestMessage = Types_1.WAProto.Message.CancelPaymentRequestMessage.fromObject({ key });
|
|
818
|
+
}
|
|
819
|
+
else if ('requestPaymentFrom' in message && !!message.requestPaymentFrom) {
|
|
820
|
+
const noteText = message.text || '';
|
|
821
|
+
m.requestPaymentMessage = Types_1.WAProto.Message.RequestPaymentMessage.fromObject({
|
|
822
|
+
requestFrom: message.requestPaymentFrom,
|
|
823
|
+
noteMessage: { extendedTextMessage: { text: noteText } }
|
|
824
|
+
});
|
|
825
|
+
}
|
|
826
|
+
else if ('invoiceNote' in message) {
|
|
827
|
+
const preparedInvoice = await (0, exports.prepareWAMessageMedia)(message, options);
|
|
828
|
+
const mediaType = Object.keys(preparedInvoice)[0];
|
|
829
|
+
const mediaMsg = preparedInvoice[mediaType] || {};
|
|
830
|
+
m.invoiceMessage = Types_1.WAProto.Message.InvoiceMessage.fromObject({
|
|
831
|
+
note: message.invoiceNote,
|
|
832
|
+
token: message.invoiceToken || '',
|
|
833
|
+
attachmentType: mediaType === 'imageMessage' ? 1 : 0,
|
|
834
|
+
attachmentMimetype: mediaMsg.mimetype,
|
|
835
|
+
attachmentMediaKey: mediaMsg.mediaKey,
|
|
836
|
+
attachmentMediaKeyTimestamp: mediaMsg.mediaKeyTimestamp,
|
|
837
|
+
attachmentFileSha256: mediaMsg.fileSha256,
|
|
838
|
+
attachmentFileEncSha256: mediaMsg.fileEncSha256,
|
|
839
|
+
attachmentDirectPath: mediaMsg.directPath,
|
|
840
|
+
attachmentJpegThumbnail: mediaMsg.jpegThumbnail
|
|
841
|
+
});
|
|
842
|
+
}
|
|
843
|
+
else if ('orderText' in message) {
|
|
844
|
+
m.orderMessage = Types_1.WAProto.Message.OrderMessage.fromObject({
|
|
845
|
+
message: message.orderText,
|
|
846
|
+
thumbnail: message.thumbnail,
|
|
847
|
+
status: message.orderStatus || 1,
|
|
848
|
+
surface: message.orderSurface || 1
|
|
849
|
+
});
|
|
850
|
+
}
|
|
851
|
+
else if ('paymentInviteServiceType' in message) {
|
|
852
|
+
m.paymentInviteMessage = {
|
|
853
|
+
serviceType: message.paymentInviteServiceType,
|
|
854
|
+
expiryTimestamp: message.paymentInviteExpiry
|
|
855
|
+
};
|
|
856
|
+
}
|
|
558
857
|
else if ('sharePhoneNumber' in message) {
|
|
559
858
|
m.protocolMessage = {
|
|
560
859
|
type: WAProto_1.proto.Message.ProtocolMessage.Type.SHARE_PHONE_NUMBER
|
|
@@ -563,6 +862,17 @@ const generateWAMessageContent = async (message, options) => {
|
|
|
563
862
|
else if ('requestPhoneNumber' in message) {
|
|
564
863
|
m.requestPhoneNumberMessage = {};
|
|
565
864
|
}
|
|
865
|
+
else if ('limitSharing' in message) {
|
|
866
|
+
m.protocolMessage = {
|
|
867
|
+
type: WAProto_1.proto.Message.ProtocolMessage.Type.LIMIT_SHARING,
|
|
868
|
+
limitSharing: {
|
|
869
|
+
sharingLimited: message.limitSharing === true,
|
|
870
|
+
trigger: 1, // TriggerType.MANUAL = 1
|
|
871
|
+
limitSharingSettingTimestamp: Date.now(),
|
|
872
|
+
initiatedByMe: true
|
|
873
|
+
}
|
|
874
|
+
};
|
|
875
|
+
}
|
|
566
876
|
else if ('album' in message) {
|
|
567
877
|
const imageMessages = message.album.filter(item => 'image' in item);
|
|
568
878
|
const videoMessages = message.album.filter(item => 'video' in item);
|
|
@@ -571,39 +881,91 @@ const generateWAMessageContent = async (message, options) => {
|
|
|
571
881
|
expectedVideoCount: videoMessages.length,
|
|
572
882
|
});
|
|
573
883
|
}
|
|
574
|
-
else {
|
|
884
|
+
else if ('pollResult' in message) {
|
|
885
|
+
if (!Array.isArray(message.pollResult.values)) {
|
|
886
|
+
throw new boom_1.Boom('Invalid pollResult values', { statusCode: 400 });
|
|
887
|
+
}
|
|
888
|
+
m.pollResultSnapshotMessage = {
|
|
889
|
+
name: message.pollResult.name,
|
|
890
|
+
pollVotes: message.pollResult.values.map(([optionName, optionVoteCount]) => ({
|
|
891
|
+
optionName,
|
|
892
|
+
optionVoteCount,
|
|
893
|
+
})),
|
|
894
|
+
};
|
|
895
|
+
}
|
|
896
|
+
else if ('stickerPack' in message || 'stickerPackMessage' in message) {
|
|
897
|
+
if ('stickerPack' in message && 'stickerPackMessage' in message) {
|
|
898
|
+
throw new boom_1.Boom('Cannot specify both stickerPack and stickerPackMessage; use only one property.', { statusCode: 400 });
|
|
899
|
+
}
|
|
900
|
+
const stickerPackMessage = 'stickerPack' in message
|
|
901
|
+
? message.stickerPack
|
|
902
|
+
: message.stickerPackMessage;
|
|
903
|
+
m.stickerPackMessage = Types_1.WAProto.Message.StickerPackMessage.fromObject(stickerPackMessage);
|
|
904
|
+
}
|
|
905
|
+
else if ('listMessage' in message) {
|
|
906
|
+
const lm = { ...message.listMessage };
|
|
907
|
+
if (lm.text !== undefined && lm.description === undefined) {
|
|
908
|
+
lm.description = lm.text;
|
|
909
|
+
delete lm.text;
|
|
910
|
+
}
|
|
911
|
+
m = { listMessage: lm };
|
|
912
|
+
}
|
|
913
|
+
else if ('buttonsMessage' in message) {
|
|
914
|
+
m = {
|
|
915
|
+
buttonsMessage: Types_1.WAProto.Message.ButtonsMessage.fromObject(message.buttonsMessage)
|
|
916
|
+
};
|
|
917
|
+
}
|
|
918
|
+
else if ('interactiveMessage' in message) {
|
|
919
|
+
m = { interactiveMessage: message.interactiveMessage };
|
|
920
|
+
}
|
|
921
|
+
else if ('richResponse' in message) {
|
|
922
|
+
// handled in richResponse block below
|
|
923
|
+
}
|
|
924
|
+
else if (hasCaptionWithoutMedia && !hasCaptionContainer) {
|
|
925
|
+
m.extendedTextMessage = { text: message.caption };
|
|
926
|
+
}
|
|
927
|
+
else if (hasCaptionWithoutMedia && hasCaptionContainer) {
|
|
928
|
+
m = {};
|
|
929
|
+
}
|
|
930
|
+
else if (!hasCaptionWithoutMedia && hasMediaPayload(message)) {
|
|
575
931
|
m = await (0, exports.prepareWAMessageMedia)(message, options);
|
|
576
932
|
}
|
|
577
933
|
if ('buttons' in message && !!message.buttons) {
|
|
578
|
-
const
|
|
579
|
-
|
|
934
|
+
const interactiveMessage = {
|
|
935
|
+
nativeFlowMessage: Types_1.WAProto.Message.InteractiveMessage.NativeFlowMessage.fromObject({
|
|
936
|
+
buttons: message.buttons.map(normalizeQuickReplyButton),
|
|
937
|
+
})
|
|
580
938
|
};
|
|
581
939
|
if ('text' in message) {
|
|
582
|
-
|
|
583
|
-
buttonsMessage.headerType = ButtonType.EMPTY;
|
|
584
|
-
}
|
|
585
|
-
else {
|
|
586
|
-
if ('caption' in message) {
|
|
587
|
-
buttonsMessage.contentText = message.caption;
|
|
588
|
-
}
|
|
589
|
-
const type = Object.keys(m)[0].replace('Message', '').toUpperCase();
|
|
590
|
-
buttonsMessage.headerType = ButtonType[type];
|
|
591
|
-
Object.assign(buttonsMessage, m);
|
|
940
|
+
interactiveMessage.body = { text: message.text };
|
|
592
941
|
}
|
|
593
|
-
if ('
|
|
594
|
-
|
|
595
|
-
|
|
942
|
+
else if ('caption' in message) {
|
|
943
|
+
interactiveMessage.body = { text: message.caption };
|
|
944
|
+
interactiveMessage.header = {
|
|
945
|
+
title: message.title || '',
|
|
946
|
+
subtitle: message.subtitle,
|
|
947
|
+
hasMediaAttachment: Boolean(message.hasMediaAttachment),
|
|
948
|
+
};
|
|
949
|
+
Object.assign(interactiveMessage.header, m);
|
|
596
950
|
}
|
|
597
|
-
if ('
|
|
598
|
-
|
|
951
|
+
if ('title' in message && !!message.title && !interactiveMessage.header) {
|
|
952
|
+
interactiveMessage.header = {
|
|
953
|
+
title: message.title,
|
|
954
|
+
subtitle: message.subtitle,
|
|
955
|
+
hasMediaAttachment: Boolean(message.hasMediaAttachment),
|
|
956
|
+
};
|
|
599
957
|
}
|
|
600
|
-
if ('
|
|
601
|
-
|
|
958
|
+
else if ('title' in message && !!message.title && interactiveMessage.header) {
|
|
959
|
+
interactiveMessage.header.title = message.title;
|
|
960
|
+
if (message.subtitle !== undefined) {
|
|
961
|
+
interactiveMessage.header.subtitle = message.subtitle;
|
|
962
|
+
}
|
|
602
963
|
}
|
|
603
|
-
if ('
|
|
604
|
-
|
|
964
|
+
if ('footer' in message && !!message.footer) {
|
|
965
|
+
interactiveMessage.footer = { text: message.footer };
|
|
605
966
|
}
|
|
606
|
-
|
|
967
|
+
applyContextInfoAndMentions(interactiveMessage, message);
|
|
968
|
+
m = { interactiveMessage };
|
|
607
969
|
}
|
|
608
970
|
else if ('templateButtons' in message && !!message.templateButtons) {
|
|
609
971
|
const msg = {
|
|
@@ -639,6 +1001,26 @@ const generateWAMessageContent = async (message, options) => {
|
|
|
639
1001
|
};
|
|
640
1002
|
m = { listMessage };
|
|
641
1003
|
}
|
|
1004
|
+
else if ('productList' in message && !!message.productList) {
|
|
1005
|
+
if (!Array.isArray(message.productList) || message.productList.length === 0 ||
|
|
1006
|
+
!Array.isArray(message.productList[0].products) || message.productList[0].products.length === 0) {
|
|
1007
|
+
throw new boom_1.Boom('Invalid productList: must contain at least one section with one product', { statusCode: 400 });
|
|
1008
|
+
}
|
|
1009
|
+
m.listMessage = {
|
|
1010
|
+
title: message.title,
|
|
1011
|
+
buttonText: message.buttonText,
|
|
1012
|
+
footerText: message.footer,
|
|
1013
|
+
description: message.text,
|
|
1014
|
+
productListInfo: {
|
|
1015
|
+
productSections: message.productList,
|
|
1016
|
+
headerImage: {
|
|
1017
|
+
productId: message.productList[0].products[0].productId,
|
|
1018
|
+
},
|
|
1019
|
+
businessOwnerJid: message.businessOwnerJid,
|
|
1020
|
+
},
|
|
1021
|
+
listType: WAProto_1.proto.Message.ListMessage.ListType.PRODUCT_LIST
|
|
1022
|
+
};
|
|
1023
|
+
}
|
|
642
1024
|
if ('interactiveButtons' in message && !!message.interactiveButtons) {
|
|
643
1025
|
const interactiveMessage = {
|
|
644
1026
|
nativeFlowMessage: Types_1.WAProto.Message.InteractiveMessage.NativeFlowMessage.fromObject({
|
|
@@ -657,7 +1039,7 @@ const generateWAMessageContent = async (message, options) => {
|
|
|
657
1039
|
interactiveMessage.header = {
|
|
658
1040
|
title: message.title,
|
|
659
1041
|
subtitle: message.subtitle,
|
|
660
|
-
hasMediaAttachment: (
|
|
1042
|
+
hasMediaAttachment: Boolean(message.hasMediaAttachment),
|
|
661
1043
|
};
|
|
662
1044
|
Object.assign(interactiveMessage.header, m);
|
|
663
1045
|
}
|
|
@@ -670,23 +1052,18 @@ const generateWAMessageContent = async (message, options) => {
|
|
|
670
1052
|
interactiveMessage.header = {
|
|
671
1053
|
title: message.title,
|
|
672
1054
|
subtitle: message.subtitle,
|
|
673
|
-
hasMediaAttachment: (
|
|
1055
|
+
hasMediaAttachment: Boolean(message.hasMediaAttachment),
|
|
674
1056
|
};
|
|
675
1057
|
Object.assign(interactiveMessage.header, m);
|
|
676
1058
|
}
|
|
677
|
-
|
|
678
|
-
interactiveMessage.contextInfo = message.contextInfo;
|
|
679
|
-
}
|
|
680
|
-
if ('mentions' in message && !!message.mentions) {
|
|
681
|
-
interactiveMessage.contextInfo = { mentionedJid: message.mentions };
|
|
682
|
-
}
|
|
1059
|
+
applyContextInfoAndMentions(interactiveMessage, message);
|
|
683
1060
|
m = { interactiveMessage };
|
|
684
1061
|
}
|
|
685
1062
|
if ('shop' in message && !!message.shop) {
|
|
686
1063
|
const interactiveMessage = {
|
|
687
1064
|
shopStorefrontMessage: Types_1.WAProto.Message.InteractiveMessage.ShopMessage.fromObject({
|
|
688
|
-
surface: message.shop,
|
|
689
|
-
id: message.id
|
|
1065
|
+
surface: (_l = message.shop) === null || _l === void 0 ? void 0 : _l.surface,
|
|
1066
|
+
id: (_m = message.shop) === null || _m === void 0 ? void 0 : _m.id
|
|
690
1067
|
})
|
|
691
1068
|
};
|
|
692
1069
|
if ('text' in message) {
|
|
@@ -701,7 +1078,7 @@ const generateWAMessageContent = async (message, options) => {
|
|
|
701
1078
|
interactiveMessage.header = {
|
|
702
1079
|
title: message.title,
|
|
703
1080
|
subtitle: message.subtitle,
|
|
704
|
-
hasMediaAttachment: (
|
|
1081
|
+
hasMediaAttachment: Boolean(message.hasMediaAttachment),
|
|
705
1082
|
};
|
|
706
1083
|
Object.assign(interactiveMessage.header, m);
|
|
707
1084
|
}
|
|
@@ -714,25 +1091,137 @@ const generateWAMessageContent = async (message, options) => {
|
|
|
714
1091
|
interactiveMessage.header = {
|
|
715
1092
|
title: message.title,
|
|
716
1093
|
subtitle: message.subtitle,
|
|
717
|
-
hasMediaAttachment: (
|
|
1094
|
+
hasMediaAttachment: Boolean(message.hasMediaAttachment),
|
|
718
1095
|
};
|
|
719
1096
|
Object.assign(interactiveMessage.header, m);
|
|
720
1097
|
}
|
|
721
|
-
|
|
722
|
-
|
|
1098
|
+
applyContextInfoAndMentions(interactiveMessage, message);
|
|
1099
|
+
m = { interactiveMessage };
|
|
1100
|
+
if ('interactiveAsTemplate' in message && message.interactiveAsTemplate !== false) {
|
|
1101
|
+
m = { templateMessage: { interactiveMessageTemplate: interactiveMessage } };
|
|
723
1102
|
}
|
|
724
|
-
|
|
725
|
-
|
|
1103
|
+
}
|
|
1104
|
+
if ('richResponse' in message) {
|
|
1105
|
+
const { text, code, language = 'javascript', botJid = '259786046210223@bot' } = message.richResponse;
|
|
1106
|
+
const sections = [
|
|
1107
|
+
{
|
|
1108
|
+
view_model: {
|
|
1109
|
+
primitive: {
|
|
1110
|
+
text: text,
|
|
1111
|
+
__typename: 'GenAIMarkdownTextUXPrimitive'
|
|
1112
|
+
},
|
|
1113
|
+
__typename: 'GenAISingleLayoutViewModel'
|
|
1114
|
+
}
|
|
1115
|
+
}
|
|
1116
|
+
];
|
|
1117
|
+
if (code) {
|
|
1118
|
+
sections.push({
|
|
1119
|
+
view_model: {
|
|
1120
|
+
primitive: {
|
|
1121
|
+
language,
|
|
1122
|
+
code_blocks: tokenizeCode(String(code)),
|
|
1123
|
+
__typename: 'GenAICodeUXPrimitive'
|
|
1124
|
+
},
|
|
1125
|
+
__typename: 'GenAISingleLayoutViewModel'
|
|
1126
|
+
}
|
|
1127
|
+
});
|
|
726
1128
|
}
|
|
727
|
-
|
|
1129
|
+
const unifiedData = {
|
|
1130
|
+
response_id: (0, crypto_1.randomUUID)(),
|
|
1131
|
+
sections
|
|
1132
|
+
};
|
|
1133
|
+
return Types_1.WAProto.Message.fromObject({
|
|
1134
|
+
messageContextInfo: {
|
|
1135
|
+
deviceListMetadata: {},
|
|
1136
|
+
deviceListMetadataVersion: 2,
|
|
1137
|
+
messageSecret: (0, crypto_1.randomBytes)(32)
|
|
1138
|
+
},
|
|
1139
|
+
botForwardedMessage: {
|
|
1140
|
+
message: {
|
|
1141
|
+
richResponseMessage: {
|
|
1142
|
+
submessages: [],
|
|
1143
|
+
messageType: 1,
|
|
1144
|
+
unifiedResponse: { data: Buffer.from(JSON.stringify(unifiedData)) },
|
|
1145
|
+
contextInfo: {
|
|
1146
|
+
forwardingScore: 2,
|
|
1147
|
+
isForwarded: true,
|
|
1148
|
+
forwardedAiBotMessageInfo: { botJid },
|
|
1149
|
+
botMessageSharingInfo: {
|
|
1150
|
+
botEntryPointOrigin: 1,
|
|
1151
|
+
forwardScore: 2
|
|
1152
|
+
}
|
|
1153
|
+
}
|
|
1154
|
+
}
|
|
1155
|
+
}
|
|
1156
|
+
}
|
|
1157
|
+
});
|
|
1158
|
+
}
|
|
1159
|
+
if ('statusNotification' in message || 'statusNotificationMessage' in message) {
|
|
1160
|
+
const notifData = 'statusNotification' in message ? message.statusNotification : message.statusNotificationMessage;
|
|
1161
|
+
m = { statusNotificationMessage: Types_1.WAProto.Message.StatusNotificationMessage.fromObject(notifData) };
|
|
1162
|
+
}
|
|
1163
|
+
else if ('statusQuestionAnswer' in message || 'statusQuestionAnswerMessage' in message) {
|
|
1164
|
+
const qaData = 'statusQuestionAnswer' in message ? message.statusQuestionAnswer : message.statusQuestionAnswerMessage;
|
|
1165
|
+
m = { statusQuestionAnswerMessage: Types_1.WAProto.Message.StatusQuestionAnswerMessage.fromObject(qaData) };
|
|
1166
|
+
}
|
|
1167
|
+
else if ('questionResponse' in message || 'questionResponseMessage' in message) {
|
|
1168
|
+
const qrData = 'questionResponse' in message ? message.questionResponse : message.questionResponseMessage;
|
|
1169
|
+
m = { questionResponseMessage: Types_1.WAProto.Message.QuestionResponseMessage.fromObject(qrData) };
|
|
1170
|
+
}
|
|
1171
|
+
else if ('statusQuoted' in message || 'statusQuotedMessage' in message) {
|
|
1172
|
+
const sqData = 'statusQuoted' in message ? message.statusQuoted : message.statusQuotedMessage;
|
|
1173
|
+
m = { statusQuotedMessage: Types_1.WAProto.Message.StatusQuotedMessage.fromObject(sqData) };
|
|
1174
|
+
}
|
|
1175
|
+
else if ('statusStickerInteraction' in message || 'statusStickerInteractionMessage' in message) {
|
|
1176
|
+
const ssiData = 'statusStickerInteraction' in message ? message.statusStickerInteraction : message.statusStickerInteractionMessage;
|
|
1177
|
+
m = { statusStickerInteractionMessage: Types_1.WAProto.Message.StatusStickerInteractionMessage.fromObject(ssiData) };
|
|
1178
|
+
}
|
|
1179
|
+
else if ('newsletterFollowerInvite' in message || 'newsletterFollowerInviteMessageV2' in message) {
|
|
1180
|
+
const nfiData = 'newsletterFollowerInvite' in message ? message.newsletterFollowerInvite : message.newsletterFollowerInviteMessageV2;
|
|
1181
|
+
m = { newsletterFollowerInviteMessageV2: Types_1.WAProto.Message.NewsletterFollowerInviteMessage.fromObject(nfiData) };
|
|
1182
|
+
}
|
|
1183
|
+
else if ('messageHistoryNotice' in message) {
|
|
1184
|
+
m = { messageHistoryNotice: Types_1.WAProto.Message.MessageHistoryNotice.fromObject(message.messageHistoryNotice) };
|
|
1185
|
+
}
|
|
1186
|
+
if ('raw' in message && !!message.raw) {
|
|
1187
|
+
const { raw: _, externalAdReply: _ear, ...rawMsg } = message;
|
|
1188
|
+
if ('externalAdReply' in message && !!message.externalAdReply) {
|
|
1189
|
+
const ear = normalizeEarFields(message.externalAdReply);
|
|
1190
|
+
const [rawType] = Object.keys(rawMsg);
|
|
1191
|
+
if (rawType && rawMsg[rawType]) {
|
|
1192
|
+
rawMsg[rawType].contextInfo = {
|
|
1193
|
+
...(rawMsg[rawType].contextInfo || {}),
|
|
1194
|
+
externalAdReply: ear
|
|
1195
|
+
};
|
|
1196
|
+
}
|
|
1197
|
+
}
|
|
1198
|
+
return Types_1.WAProto.Message.fromObject(rawMsg);
|
|
728
1199
|
}
|
|
729
1200
|
if ('viewOnce' in message && !!message.viewOnce) {
|
|
730
1201
|
m = { viewOnceMessage: { message: m } };
|
|
731
1202
|
}
|
|
732
|
-
if ('
|
|
1203
|
+
if ('viewOnceV2' in message && !!message.viewOnceV2) {
|
|
1204
|
+
m = { viewOnceMessageV2: { message: m } };
|
|
1205
|
+
}
|
|
1206
|
+
if ('viewOnceV2Extension' in message && !!message.viewOnceV2Extension) {
|
|
1207
|
+
m = { viewOnceMessageV2Extension: { message: m } };
|
|
1208
|
+
}
|
|
1209
|
+
if ('ephemeral' in message && !!message.ephemeral) {
|
|
1210
|
+
m = { ephemeralMessage: { message: m } };
|
|
1211
|
+
}
|
|
1212
|
+
if ('groupStatus' in message && !!message.groupStatus) {
|
|
1213
|
+
m = { groupStatusMessage: { message: m } };
|
|
1214
|
+
}
|
|
1215
|
+
if (('mentions' in message && ((_o = message.mentions) === null || _o === void 0 ? void 0 : _o.length))
|
|
1216
|
+
|| ('mentionAll' in message && !!message.mentionAll)) {
|
|
733
1217
|
const [messageType] = Object.keys(m);
|
|
734
|
-
m[messageType].contextInfo = m[messageType] || {};
|
|
735
|
-
|
|
1218
|
+
m[messageType].contextInfo = m[messageType].contextInfo || {};
|
|
1219
|
+
if ((_p = message.mentions) === null || _p === void 0 ? void 0 : _p.length) {
|
|
1220
|
+
m[messageType].contextInfo.mentionedJid = message.mentions;
|
|
1221
|
+
}
|
|
1222
|
+
if (message.mentionAll) {
|
|
1223
|
+
m[messageType].contextInfo.nonJidMentions = 1;
|
|
1224
|
+
}
|
|
736
1225
|
}
|
|
737
1226
|
if ('edit' in message) {
|
|
738
1227
|
m = {
|
|
@@ -747,8 +1236,34 @@ const generateWAMessageContent = async (message, options) => {
|
|
|
747
1236
|
if ('contextInfo' in message && !!message.contextInfo) {
|
|
748
1237
|
const [messageType] = Object.keys(m);
|
|
749
1238
|
m[messageType] = m[messageType] || {};
|
|
750
|
-
m[messageType].contextInfo =
|
|
1239
|
+
m[messageType].contextInfo = {
|
|
1240
|
+
...(m[messageType].contextInfo || {}),
|
|
1241
|
+
...message.contextInfo
|
|
1242
|
+
};
|
|
1243
|
+
}
|
|
1244
|
+
if ('externalAdReply' in message && !!message.externalAdReply) {
|
|
1245
|
+
const wrappers = ['viewOnceMessage', 'viewOnceMessageV2', 'viewOnceMessageV2Extension', 'ephemeralMessage', 'groupStatusMessage', 'templateMessage'];
|
|
1246
|
+
const [outerType] = Object.keys(m);
|
|
1247
|
+
const inner = wrappers.includes(outerType) ? m[outerType].message : m;
|
|
1248
|
+
const [innerType] = Object.keys(inner);
|
|
1249
|
+
const innerPayload = innerType ? inner[innerType] : undefined;
|
|
1250
|
+
if (innerType && innerType !== 'carouselMessage' && innerPayload && typeof innerPayload === 'object') {
|
|
1251
|
+
const ear = normalizeEarFields(message.externalAdReply);
|
|
1252
|
+
innerPayload.contextInfo = {
|
|
1253
|
+
...(innerPayload.contextInfo || {}),
|
|
1254
|
+
externalAdReply: ear
|
|
1255
|
+
};
|
|
1256
|
+
}
|
|
1257
|
+
}
|
|
1258
|
+
if ('secureMetaServiceLabel' in message && !!message.secureMetaServiceLabel) {
|
|
1259
|
+
const [messageType] = Object.keys(m);
|
|
1260
|
+
m[messageType] = m[messageType] || {};
|
|
1261
|
+
m[messageType].contextInfo = {
|
|
1262
|
+
...(m[messageType].contextInfo || {}),
|
|
1263
|
+
secureMetaServiceLabel: 1
|
|
1264
|
+
};
|
|
751
1265
|
}
|
|
1266
|
+
applyDefaultNewsletterAnnotation(m, message);
|
|
752
1267
|
return Types_1.WAProto.Message.fromObject(m);
|
|
753
1268
|
};
|
|
754
1269
|
exports.generateWAMessageContent = generateWAMessageContent;
|
|
@@ -798,7 +1313,7 @@ const generateWAMessageFromContent = (jid, message, options) => {
|
|
|
798
1313
|
innerMessage[key].contextInfo = {
|
|
799
1314
|
...(innerMessage[key].contextInfo || {}),
|
|
800
1315
|
expiration: options.ephemeralExpiration || Defaults_1.WA_DEFAULT_EPHEMERAL,
|
|
801
|
-
|
|
1316
|
+
|
|
802
1317
|
};
|
|
803
1318
|
}
|
|
804
1319
|
message = Types_1.WAProto.Message.fromObject(message);
|
|
@@ -821,10 +1336,10 @@ const generateWAMessage = async (jid, content, options) => {
|
|
|
821
1336
|
var _a;
|
|
822
1337
|
|
|
823
1338
|
options.logger = (_a = options === null || options === void 0 ? void 0 : options.logger) === null || _a === void 0 ? void 0 : _a.child({ msgId: options.messageId });
|
|
824
|
-
return (0, exports.generateWAMessageFromContent)(jid, await (0, exports.generateWAMessageContent)(content, { newsletter: (0, WABinary_1.isJidNewsletter)(jid), ...options }), options);
|
|
1339
|
+
return (0, exports.generateWAMessageFromContent)(jid, await (0, exports.generateWAMessageContent)(content, { newsletter: (0, WABinary_1.isJidNewsletter)(jid), recipientJid: jid, ...options }), options);
|
|
825
1340
|
};
|
|
826
1341
|
exports.generateWAMessage = generateWAMessage;
|
|
827
|
-
|
|
1342
|
+
|
|
828
1343
|
const getContentType = (content) => {
|
|
829
1344
|
if (content) {
|
|
830
1345
|
const keys = Object.keys(content);
|
|
@@ -833,12 +1348,7 @@ const getContentType = (content) => {
|
|
|
833
1348
|
}
|
|
834
1349
|
};
|
|
835
1350
|
exports.getContentType = getContentType;
|
|
836
|
-
|
|
837
|
-
* Normalizes ephemeral, view once messages to regular message content
|
|
838
|
-
* Eg. image messages in ephemeral messages, in view once messages etc.
|
|
839
|
-
* @param content
|
|
840
|
-
* @returns
|
|
841
|
-
*/
|
|
1351
|
+
|
|
842
1352
|
const normalizeMessageContent = (content) => {
|
|
843
1353
|
if (!content) {
|
|
844
1354
|
return undefined;
|
|
@@ -875,14 +1385,12 @@ const normalizeMessageContent = (content) => {
|
|
|
875
1385
|
|| (message === null || message === void 0 ? void 0 : message.botTaskMessage)
|
|
876
1386
|
|| (message === null || message === void 0 ? void 0 : message.questionMessage)
|
|
877
1387
|
|| (message === null || message === void 0 ? void 0 : message.groupStatusMessageV2)
|
|
878
|
-
|| (message === null || message === void 0 ? void 0 : message.botForwardedMessage)
|
|
1388
|
+
|| (message === null || message === void 0 ? void 0 : message.botForwardedMessage)
|
|
1389
|
+
|| (message === null || message === void 0 ? void 0 : message.questionReplyMessage));
|
|
879
1390
|
}
|
|
880
1391
|
};
|
|
881
1392
|
exports.normalizeMessageContent = normalizeMessageContent;
|
|
882
|
-
|
|
883
|
-
* Extract the true message content from a message
|
|
884
|
-
* Eg. extracts the inner message from a disappearing message/view once message
|
|
885
|
-
*/
|
|
1393
|
+
|
|
886
1394
|
const extractMessageContent = (content) => {
|
|
887
1395
|
var _a, _b, _c, _d, _e, _f;
|
|
888
1396
|
const extractFromTemplateMessage = (msg) => {
|
|
@@ -922,16 +1430,14 @@ const extractMessageContent = (content) => {
|
|
|
922
1430
|
return content;
|
|
923
1431
|
};
|
|
924
1432
|
exports.extractMessageContent = extractMessageContent;
|
|
925
|
-
|
|
926
|
-
* Returns the device predicted by message ID
|
|
927
|
-
*/
|
|
1433
|
+
|
|
928
1434
|
const getDevice = (id) => /^3A.{18}$/.test(id) ? 'ios' :
|
|
929
1435
|
/^3E.{20}$/.test(id) ? 'web' :
|
|
930
1436
|
/^(.{21}|.{32})$/.test(id) ? 'android' :
|
|
931
1437
|
/^(3F|.{18}$)/.test(id) ? 'desktop' :
|
|
932
1438
|
'unknown';
|
|
933
1439
|
exports.getDevice = getDevice;
|
|
934
|
-
|
|
1440
|
+
|
|
935
1441
|
const updateMessageWithReceipt = (msg, receipt) => {
|
|
936
1442
|
msg.userReceipt = msg.userReceipt || [];
|
|
937
1443
|
const recp = msg.userReceipt.find(m => m.userJid === receipt.userJid);
|
|
@@ -943,7 +1449,7 @@ const updateMessageWithReceipt = (msg, receipt) => {
|
|
|
943
1449
|
}
|
|
944
1450
|
};
|
|
945
1451
|
exports.updateMessageWithReceipt = updateMessageWithReceipt;
|
|
946
|
-
|
|
1452
|
+
|
|
947
1453
|
const updateMessageWithReaction = (msg, reaction) => {
|
|
948
1454
|
const authorID = (0, generics_1.getKeyAuthor)(reaction.key);
|
|
949
1455
|
const reactions = (msg.reactions || [])
|
|
@@ -953,7 +1459,7 @@ const updateMessageWithReaction = (msg, reaction) => {
|
|
|
953
1459
|
msg.reactions = reactions;
|
|
954
1460
|
};
|
|
955
1461
|
exports.updateMessageWithReaction = updateMessageWithReaction;
|
|
956
|
-
|
|
1462
|
+
|
|
957
1463
|
const updateMessageWithPollUpdate = (msg, update) => {
|
|
958
1464
|
var _a, _b;
|
|
959
1465
|
const authorID = (0, generics_1.getKeyAuthor)(update.pollUpdateMessageKey);
|
|
@@ -965,12 +1471,7 @@ const updateMessageWithPollUpdate = (msg, update) => {
|
|
|
965
1471
|
msg.pollUpdates = reactions;
|
|
966
1472
|
};
|
|
967
1473
|
exports.updateMessageWithPollUpdate = updateMessageWithPollUpdate;
|
|
968
|
-
|
|
969
|
-
* Aggregates all poll updates in a poll.
|
|
970
|
-
* @param msg the poll creation message
|
|
971
|
-
* @param meId your jid
|
|
972
|
-
* @returns A list of options & their voters
|
|
973
|
-
*/
|
|
1474
|
+
|
|
974
1475
|
function getAggregateVotesInPollMessage({ message, pollUpdates }, meId) {
|
|
975
1476
|
var _a, _b, _c;
|
|
976
1477
|
const opts = ((_a = message === null || message === void 0 ? void 0 : message.pollCreationMessage) === null || _a === void 0 ? void 0 : _a.options) || ((_b = message === null || message === void 0 ? void 0 : message.pollCreationMessageV2) === null || _b === void 0 ? void 0 : _b.options) || ((_c = message === null || message === void 0 ? void 0 : message.pollCreationMessageV3) === null || _c === void 0 ? void 0 : _c.options) || [];
|
|
@@ -1002,7 +1503,7 @@ function getAggregateVotesInPollMessage({ message, pollUpdates }, meId) {
|
|
|
1002
1503
|
}
|
|
1003
1504
|
return Object.values(voteHashMap);
|
|
1004
1505
|
}
|
|
1005
|
-
|
|
1506
|
+
|
|
1006
1507
|
const aggregateMessageKeysNotFromMe = (keys) => {
|
|
1007
1508
|
const keyMap = {};
|
|
1008
1509
|
for (const { remoteJid, id, participant, fromMe } of keys) {
|
|
@@ -1022,9 +1523,7 @@ const aggregateMessageKeysNotFromMe = (keys) => {
|
|
|
1022
1523
|
};
|
|
1023
1524
|
exports.aggregateMessageKeysNotFromMe = aggregateMessageKeysNotFromMe;
|
|
1024
1525
|
const REUPLOAD_REQUIRED_STATUS = [410, 404];
|
|
1025
|
-
|
|
1026
|
-
* Downloads the given message. Throws an error if it's not a media message
|
|
1027
|
-
*/
|
|
1526
|
+
|
|
1028
1527
|
const downloadMediaMessage = async (message, type, options, ctx) => {
|
|
1029
1528
|
const result = await downloadMsg()
|
|
1030
1529
|
.catch(async (error) => {
|
|
@@ -1078,7 +1577,7 @@ const downloadMediaMessage = async (message, type, options, ctx) => {
|
|
|
1078
1577
|
}
|
|
1079
1578
|
};
|
|
1080
1579
|
exports.downloadMediaMessage = downloadMediaMessage;
|
|
1081
|
-
|
|
1580
|
+
|
|
1082
1581
|
const assertMediaContent = (content) => {
|
|
1083
1582
|
content = (0, exports.extractMessageContent)(content);
|
|
1084
1583
|
const mediaContent = (content === null || content === void 0 ? void 0 : content.documentMessage)
|
|
@@ -1093,21 +1592,36 @@ const assertMediaContent = (content) => {
|
|
|
1093
1592
|
};
|
|
1094
1593
|
exports.assertMediaContent = assertMediaContent;
|
|
1095
1594
|
|
|
1595
|
+
/**
|
|
1596
|
+
* Normalizes a bare user id to @s.whatsapp.net. Does not convert LID↔PN; use lidMapping / PN in key.remoteJidAlt when needed.
|
|
1597
|
+
*/
|
|
1096
1598
|
const toJid = (id) => {
|
|
1097
1599
|
if (!id)
|
|
1098
1600
|
return '';
|
|
1099
|
-
if (id.endsWith('@lid'))
|
|
1100
|
-
return id.replace('@lid', '@s.whatsapp.net');
|
|
1101
1601
|
if (id.includes('@'))
|
|
1102
1602
|
return id;
|
|
1103
1603
|
return `${id}@s.whatsapp.net`;
|
|
1104
1604
|
};
|
|
1105
1605
|
exports.toJid = toJid;
|
|
1606
|
+
/**
|
|
1607
|
+
* Returns the peer LID JID when the key is LID-primary (decode sets remoteJid/participant to @lid when WA sends LID).
|
|
1608
|
+
*/
|
|
1106
1609
|
const getSenderLid = (message) => {
|
|
1107
|
-
const
|
|
1108
|
-
|
|
1109
|
-
|
|
1110
|
-
|
|
1111
|
-
|
|
1610
|
+
const k = message.key;
|
|
1611
|
+
if (!k) {
|
|
1612
|
+
return { jid: '', lid: '' };
|
|
1613
|
+
}
|
|
1614
|
+
const jid = k.participant || k.remoteJid || '';
|
|
1615
|
+
if (jid.endsWith('@lid') || jid.endsWith('@hosted.lid')) {
|
|
1616
|
+
return { jid, lid: jid };
|
|
1617
|
+
}
|
|
1618
|
+
if (k.lid && typeof k.lid === 'string') {
|
|
1619
|
+
const lid = k.lid.includes('@') ? k.lid : (0, WABinary_1.jidEncode)(k.lid, 'lid');
|
|
1620
|
+
return { jid, lid };
|
|
1621
|
+
}
|
|
1622
|
+
if (k.participantLid && (0, WABinary_1.isLidUser)(k.participantLid)) {
|
|
1623
|
+
return { jid, lid: k.participantLid };
|
|
1624
|
+
}
|
|
1625
|
+
return { jid, lid: '' };
|
|
1112
1626
|
};
|
|
1113
1627
|
exports.getSenderLid = getSenderLid;
|