@ubedsockets/baileys 1.6.8 → 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 +745 -221
- 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/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/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
|
@@ -3,26 +3,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.assertMediaContent =
|
|
7
|
-
exports.downloadMediaMessage =
|
|
8
|
-
exports.aggregateMessageKeysNotFromMe =
|
|
9
|
-
exports.updateMessageWithPollUpdate =
|
|
10
|
-
exports.updateMessageWithReaction =
|
|
11
|
-
exports.updateMessageWithReceipt =
|
|
12
|
-
exports.getDevice =
|
|
13
|
-
exports.extractMessageContent =
|
|
14
|
-
exports.normalizeMessageContent =
|
|
15
|
-
exports.getContentType =
|
|
16
|
-
exports.generateWAMessage =
|
|
17
|
-
exports.generateWAMessageFromContent =
|
|
18
|
-
exports.generateWAMessageContent =
|
|
19
|
-
exports.generateForwardMessageContent =
|
|
20
|
-
exports.prepareDisappearingMessageSettingContent =
|
|
21
|
-
exports.prepareWAMessageMedia =
|
|
22
|
-
exports.generateLinkPreviewIfRequired =
|
|
23
|
-
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;
|
|
24
7
|
exports.getAggregateVotesInPollMessage = getAggregateVotesInPollMessage;
|
|
25
|
-
|
|
26
8
|
const boom_1 = require("@hapi/boom");
|
|
27
9
|
const axios_1 = __importDefault(require("axios"));
|
|
28
10
|
const crypto_1 = require("crypto");
|
|
@@ -42,6 +24,18 @@ const MIMETYPE_MAP = {
|
|
|
42
24
|
sticker: 'image/webp',
|
|
43
25
|
'product-catalog-image': 'image/jpeg',
|
|
44
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);
|
|
45
39
|
const MessageTypeProto = {
|
|
46
40
|
'image': Types_1.WAProto.Message.ImageMessage,
|
|
47
41
|
'video': Types_1.WAProto.Message.VideoMessage,
|
|
@@ -50,12 +44,96 @@ const MessageTypeProto = {
|
|
|
50
44
|
'document': Types_1.WAProto.Message.DocumentMessage,
|
|
51
45
|
};
|
|
52
46
|
const ButtonType = WAProto_1.proto.Message.ButtonsMessage.HeaderType;
|
|
53
|
-
|
|
54
|
-
* Uses a regex to test whether the string contains a URL, and returns the URL if it does.
|
|
55
|
-
* @param text eg. hello https://google.com
|
|
56
|
-
* @returns the URL, eg. https://google.com
|
|
57
|
-
*/
|
|
47
|
+
|
|
58
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
|
+
};
|
|
59
137
|
exports.extractUrlFromText = extractUrlFromText;
|
|
60
138
|
const generateLinkPreviewIfRequired = async (text, getUrlInfo, logger) => {
|
|
61
139
|
const url = (0, exports.extractUrlFromText)(text);
|
|
@@ -87,140 +165,124 @@ const assertColor = async (color) => {
|
|
|
87
165
|
const prepareWAMessageMedia = async (message, options) => {
|
|
88
166
|
const logger = options.logger;
|
|
89
167
|
let mediaType;
|
|
168
|
+
let sourceMediaKey;
|
|
90
169
|
for (const key of Defaults_1.MEDIA_KEYS) {
|
|
91
170
|
if (key in message) {
|
|
92
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
|
+
}
|
|
93
183
|
}
|
|
94
184
|
}
|
|
95
185
|
if (!mediaType) {
|
|
96
186
|
throw new boom_1.Boom('Invalid media type', { statusCode: 400 });
|
|
97
187
|
}
|
|
98
|
-
|
|
99
|
-
|
|
100
188
|
const uploadData = {
|
|
101
189
|
...message,
|
|
102
|
-
media: message[
|
|
190
|
+
media: message[sourceMediaKey]
|
|
103
191
|
};
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
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
|
+
}
|
|
107
198
|
const cacheableKey = typeof uploadData.media === 'object' &&
|
|
108
199
|
('url' in uploadData.media) &&
|
|
109
200
|
!!uploadData.media.url &&
|
|
110
201
|
!!options.mediaCache &&
|
|
111
|
-
mediaType + ':' + uploadData.media.url.toString();
|
|
112
|
-
|
|
202
|
+
(mediaType + ':' + uploadData.media.url.toString());
|
|
113
203
|
if (mediaType === 'document' && !uploadData.fileName) {
|
|
114
204
|
uploadData.fileName = 'file';
|
|
115
205
|
}
|
|
116
|
-
|
|
117
206
|
if (!uploadData.mimetype) {
|
|
118
207
|
uploadData.mimetype = MIMETYPE_MAP[mediaType];
|
|
119
208
|
}
|
|
120
|
-
|
|
209
|
+
|
|
121
210
|
if (cacheableKey) {
|
|
122
211
|
const mediaBuff = options.mediaCache.get(cacheableKey);
|
|
123
212
|
if (mediaBuff) {
|
|
124
|
-
logger
|
|
213
|
+
logger === null || logger === void 0 ? void 0 : logger.debug({ cacheableKey }, 'got media cache hit');
|
|
125
214
|
const obj = Types_1.WAProto.Message.decode(mediaBuff);
|
|
126
215
|
const key = `${mediaType}Message`;
|
|
127
216
|
Object.assign(obj[key], { ...uploadData, media: undefined });
|
|
128
217
|
return obj;
|
|
129
218
|
}
|
|
130
219
|
}
|
|
131
|
-
|
|
132
220
|
const requiresDurationComputation = mediaType === 'audio' && typeof uploadData.seconds === 'undefined';
|
|
133
221
|
const requiresThumbnailComputation = (mediaType === 'image' || mediaType === 'video') &&
|
|
134
|
-
typeof uploadData['jpegThumbnail'] === 'undefined';
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
const requiresWaveformProcessing = mediaType === 'audio' && (uploadData.ptt === true || !!options.backgroundColor);
|
|
138
|
-
// MODIFIED BY VYZEN
|
|
139
|
-
const requiresAudioBackground = options.backgroundColor && mediaType === 'audio';
|
|
140
|
-
|
|
222
|
+
(typeof uploadData['jpegThumbnail'] === 'undefined');
|
|
223
|
+
const requiresWaveformProcessing = mediaType === 'audio' && uploadData.ptt === true;
|
|
224
|
+
const requiresAudioBackground = options.backgroundColor && mediaType === 'audio' && uploadData.ptt === true;
|
|
141
225
|
const requiresOriginalForSomeProcessing = requiresDurationComputation || requiresThumbnailComputation;
|
|
142
|
-
|
|
143
|
-
const { mediaKey, encWriteStream, bodyPath, fileEncSha256, fileSha256, fileLength, didSaveToTmpPath,
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
opts: options.options,
|
|
151
|
-
isPtt: uploadData.ptt,
|
|
152
|
-
forceOpus: (mediaType === 'audio' && uploadData.mimetype && uploadData.mimetype.includes('opus')),
|
|
153
|
-
convertVideo: (mediaType === 'video')
|
|
154
|
-
}
|
|
155
|
-
);
|
|
156
|
-
|
|
157
|
-
if (mediaType === 'audio' && opusConverted) {
|
|
158
|
-
uploadData.mimetype = 'audio/ogg; codecs=opus';
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
const fileEncSha256B64 = (options.newsletter ? fileSha256 : fileEncSha256 ?? fileSha256).toString('base64');
|
|
162
|
-
|
|
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');
|
|
163
234
|
const [{ mediaUrl, directPath, handle }] = await Promise.all([
|
|
164
235
|
(async () => {
|
|
165
236
|
const result = await options.upload(encWriteStream, { fileEncSha256B64, mediaType, timeoutMs: options.mediaUploadTimeoutMs });
|
|
166
|
-
logger
|
|
237
|
+
logger === null || logger === void 0 ? void 0 : logger.debug({ mediaType, cacheableKey }, 'uploaded media');
|
|
167
238
|
return result;
|
|
168
239
|
})(),
|
|
169
240
|
(async () => {
|
|
170
241
|
try {
|
|
171
242
|
if (requiresThumbnailComputation) {
|
|
172
|
-
const { thumbnail, originalImageDimensions } = await messages_media_1.generateThumbnail(bodyPath, mediaType, options);
|
|
243
|
+
const { thumbnail, originalImageDimensions } = await (0, messages_media_1.generateThumbnail)(bodyPath, mediaType, options);
|
|
173
244
|
uploadData.jpegThumbnail = thumbnail;
|
|
174
245
|
if (!uploadData.width && originalImageDimensions) {
|
|
175
246
|
uploadData.width = originalImageDimensions.width;
|
|
176
247
|
uploadData.height = originalImageDimensions.height;
|
|
177
|
-
logger
|
|
248
|
+
logger === null || logger === void 0 ? void 0 : logger.debug('set dimensions');
|
|
178
249
|
}
|
|
179
|
-
logger
|
|
250
|
+
logger === null || logger === void 0 ? void 0 : logger.debug('generated thumbnail');
|
|
180
251
|
}
|
|
181
252
|
if (requiresDurationComputation) {
|
|
182
|
-
uploadData.seconds = await messages_media_1.getAudioDuration(bodyPath);
|
|
183
|
-
logger
|
|
253
|
+
uploadData.seconds = await (0, messages_media_1.getAudioDuration)(bodyPath);
|
|
254
|
+
logger === null || logger === void 0 ? void 0 : logger.debug('computed audio duration');
|
|
184
255
|
}
|
|
185
|
-
|
|
186
|
-
// MODIFIED BY VYZEN
|
|
187
256
|
if (requiresWaveformProcessing) {
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
} catch (err) {
|
|
191
|
-
logger?.warn('Failed to generate waveform, using fallback');
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
if (!uploadData.waveform) {
|
|
195
|
-
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]);
|
|
196
|
-
}
|
|
197
|
-
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');
|
|
198
259
|
}
|
|
199
|
-
|
|
200
260
|
if (requiresAudioBackground) {
|
|
201
261
|
uploadData.backgroundArgb = await assertColor(options.backgroundColor);
|
|
202
|
-
logger
|
|
262
|
+
logger === null || logger === void 0 ? void 0 : logger.debug('computed backgroundColor audio status');
|
|
203
263
|
}
|
|
204
|
-
}
|
|
205
|
-
|
|
264
|
+
}
|
|
265
|
+
catch (error) {
|
|
266
|
+
logger === null || logger === void 0 ? void 0 : logger.warn({ trace: error.stack }, 'failed to obtain extra info');
|
|
206
267
|
}
|
|
207
268
|
})(),
|
|
208
269
|
])
|
|
209
270
|
.finally(async () => {
|
|
210
|
-
|
|
211
|
-
|
|
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');
|
|
212
280
|
}
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
await fs_1.promises.access(bodyPath);
|
|
216
|
-
await fs_1.promises.unlink(bodyPath);
|
|
217
|
-
logger?.debug('removed tmp file');
|
|
218
|
-
} catch (error) {
|
|
219
|
-
logger?.warn('failed to remove tmp file');
|
|
220
|
-
}
|
|
281
|
+
catch (error) {
|
|
282
|
+
logger === null || logger === void 0 ? void 0 : logger.warn('failed to remove tmp file');
|
|
221
283
|
}
|
|
222
|
-
}
|
|
223
|
-
|
|
284
|
+
}
|
|
285
|
+
});
|
|
224
286
|
const obj = Types_1.WAProto.Message.fromObject({
|
|
225
287
|
[`${mediaType}Message`]: MessageTypeProto[mediaType].fromObject({
|
|
226
288
|
url: handle ? undefined : mediaUrl,
|
|
@@ -229,25 +291,21 @@ const prepareWAMessageMedia = async (message, options) => {
|
|
|
229
291
|
fileEncSha256: fileEncSha256,
|
|
230
292
|
fileSha256,
|
|
231
293
|
fileLength,
|
|
232
|
-
mediaKeyTimestamp: handle ? undefined : generics_1.unixTimestampSeconds(),
|
|
294
|
+
mediaKeyTimestamp: handle ? undefined : (0, generics_1.unixTimestampSeconds)(),
|
|
233
295
|
...uploadData,
|
|
234
296
|
media: undefined
|
|
235
297
|
})
|
|
236
298
|
});
|
|
237
|
-
|
|
238
299
|
if (uploadData.ptv) {
|
|
239
300
|
obj.ptvMessage = obj.videoMessage;
|
|
240
301
|
delete obj.videoMessage;
|
|
241
302
|
}
|
|
242
|
-
|
|
243
303
|
if (cacheableKey) {
|
|
244
|
-
logger
|
|
304
|
+
logger === null || logger === void 0 ? void 0 : logger.debug({ cacheableKey }, 'set cache');
|
|
245
305
|
options.mediaCache.set(cacheableKey, Types_1.WAProto.Message.encode(obj).finish());
|
|
246
306
|
}
|
|
247
|
-
|
|
248
307
|
return obj;
|
|
249
308
|
};
|
|
250
|
-
|
|
251
309
|
exports.prepareWAMessageMedia = prepareWAMessageMedia;
|
|
252
310
|
const prepareDisappearingMessageSettingContent = (ephemeralExpiration) => {
|
|
253
311
|
ephemeralExpiration = ephemeralExpiration || 0;
|
|
@@ -264,11 +322,7 @@ const prepareDisappearingMessageSettingContent = (ephemeralExpiration) => {
|
|
|
264
322
|
return Types_1.WAProto.Message.fromObject(content);
|
|
265
323
|
};
|
|
266
324
|
exports.prepareDisappearingMessageSettingContent = prepareDisappearingMessageSettingContent;
|
|
267
|
-
|
|
268
|
-
* Generate forwarded message content like WA does
|
|
269
|
-
* @param message the message to forward
|
|
270
|
-
* @param options.forceForward will show the message as forwarded even if it is from you
|
|
271
|
-
*/
|
|
325
|
+
|
|
272
326
|
const generateForwardMessageContent = (message, forceForward) => {
|
|
273
327
|
var _a;
|
|
274
328
|
let content = message.message;
|
|
@@ -295,10 +349,165 @@ const generateForwardMessageContent = (message, forceForward) => {
|
|
|
295
349
|
return content;
|
|
296
350
|
};
|
|
297
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
|
+
};
|
|
298
502
|
const generateWAMessageContent = async (message, options) => {
|
|
299
503
|
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;
|
|
300
504
|
var _p, _q;
|
|
301
505
|
let m = {};
|
|
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);
|
|
302
511
|
if ('text' in message) {
|
|
303
512
|
const extContent = { text: message.text };
|
|
304
513
|
let urlInfo = message.linkPreview;
|
|
@@ -373,8 +582,8 @@ const generateWAMessageContent = async (message, options) => {
|
|
|
373
582
|
m.groupInviteMessage.caption = message.groupInvite.text;
|
|
374
583
|
m.groupInviteMessage.groupJid = message.groupInvite.jid;
|
|
375
584
|
m.groupInviteMessage.groupName = message.groupInvite.subject;
|
|
376
|
-
|
|
377
|
-
|
|
585
|
+
//TODO: use built-in interface and get disappearing mode info etc.
|
|
586
|
+
//TODO: cache / use store!?
|
|
378
587
|
if (options.getProfilePicUrl) {
|
|
379
588
|
const pfpUrl = await options.getProfilePicUrl(message.groupInvite.jid, 'preview');
|
|
380
589
|
if (pfpUrl) {
|
|
@@ -416,6 +625,16 @@ const generateWAMessageContent = async (message, options) => {
|
|
|
416
625
|
}
|
|
417
626
|
else if ('buttonReply' in message) {
|
|
418
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;
|
|
419
638
|
case 'template':
|
|
420
639
|
m.templateButtonReplyMessage = {
|
|
421
640
|
selectedDisplayText: message.buttonReply.displayText,
|
|
@@ -430,6 +649,19 @@ const generateWAMessageContent = async (message, options) => {
|
|
|
430
649
|
type: WAProto_1.proto.Message.ButtonsResponseMessage.Type.DISPLAY_TEXT,
|
|
431
650
|
};
|
|
432
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;
|
|
433
665
|
}
|
|
434
666
|
}
|
|
435
667
|
else if ('ptv' in message && message.ptv) {
|
|
@@ -475,7 +707,7 @@ const generateWAMessageContent = async (message, options) => {
|
|
|
475
707
|
throw new boom_1.Boom(`poll.selectableCount in poll should be >= 0 and <= ${message.poll.values.length}`, { statusCode: 400 });
|
|
476
708
|
}
|
|
477
709
|
m.messageContextInfo = {
|
|
478
|
-
|
|
710
|
+
// encKey
|
|
479
711
|
messageSecret: message.poll.messageSecret || (0, crypto_1.randomBytes)(32),
|
|
480
712
|
};
|
|
481
713
|
const pollCreationMessage = {
|
|
@@ -512,39 +744,116 @@ const generateWAMessageContent = async (message, options) => {
|
|
|
512
744
|
m.newsletterAdminInviteMessage.newsletterName = message.inviteAdmin.subject;
|
|
513
745
|
m.newsletterAdminInviteMessage.jpegThumbnail = message.inviteAdmin.thumbnail;
|
|
514
746
|
}
|
|
515
|
-
else if ('requestPayment' in message) {
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
: null;
|
|
519
|
-
let notes = {};
|
|
520
|
-
if ((_e = message === null || message === void 0 ? void 0 : message.requestPayment) === null || _e === void 0 ? void 0 : _e.sticker) {
|
|
521
|
-
notes = {
|
|
522
|
-
stickerMessage: {
|
|
523
|
-
...sticker === null || sticker === void 0 ? void 0 : sticker.stickerMessage,
|
|
524
|
-
contextInfo: (_f = message === null || message === void 0 ? void 0 : message.requestPayment) === null || _f === void 0 ? void 0 : _f.contextInfo
|
|
525
|
-
}
|
|
526
|
-
};
|
|
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 });
|
|
527
750
|
}
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
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 });
|
|
535
766
|
}
|
|
536
|
-
|
|
537
|
-
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 });
|
|
538
769
|
}
|
|
770
|
+
const bg = requestPayment.background;
|
|
539
771
|
m.requestPaymentMessage = Types_1.WAProto.Message.RequestPaymentMessage.fromObject({
|
|
540
|
-
expiryTimestamp:
|
|
541
|
-
amount1000
|
|
542
|
-
currencyCodeIso4217
|
|
543
|
-
requestFrom
|
|
544
|
-
noteMessage:
|
|
545
|
-
|
|
772
|
+
expiryTimestamp: requestPayment.expiry ?? requestPayment.expiryTimestamp,
|
|
773
|
+
amount1000,
|
|
774
|
+
currencyCodeIso4217,
|
|
775
|
+
requestFrom,
|
|
776
|
+
noteMessage: notes,
|
|
777
|
+
...(bg != null ? { background: bg } : {})
|
|
546
778
|
});
|
|
547
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
|
+
}
|
|
548
857
|
else if ('sharePhoneNumber' in message) {
|
|
549
858
|
m.protocolMessage = {
|
|
550
859
|
type: WAProto_1.proto.Message.ProtocolMessage.Type.SHARE_PHONE_NUMBER
|
|
@@ -553,6 +862,17 @@ const generateWAMessageContent = async (message, options) => {
|
|
|
553
862
|
else if ('requestPhoneNumber' in message) {
|
|
554
863
|
m.requestPhoneNumberMessage = {};
|
|
555
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
|
+
}
|
|
556
876
|
else if ('album' in message) {
|
|
557
877
|
const imageMessages = message.album.filter(item => 'image' in item);
|
|
558
878
|
const videoMessages = message.album.filter(item => 'video' in item);
|
|
@@ -561,39 +881,91 @@ const generateWAMessageContent = async (message, options) => {
|
|
|
561
881
|
expectedVideoCount: videoMessages.length,
|
|
562
882
|
});
|
|
563
883
|
}
|
|
564
|
-
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)) {
|
|
565
931
|
m = await (0, exports.prepareWAMessageMedia)(message, options);
|
|
566
932
|
}
|
|
567
933
|
if ('buttons' in message && !!message.buttons) {
|
|
568
|
-
const
|
|
569
|
-
|
|
934
|
+
const interactiveMessage = {
|
|
935
|
+
nativeFlowMessage: Types_1.WAProto.Message.InteractiveMessage.NativeFlowMessage.fromObject({
|
|
936
|
+
buttons: message.buttons.map(normalizeQuickReplyButton),
|
|
937
|
+
})
|
|
570
938
|
};
|
|
571
939
|
if ('text' in message) {
|
|
572
|
-
|
|
573
|
-
buttonsMessage.headerType = ButtonType.EMPTY;
|
|
574
|
-
}
|
|
575
|
-
else {
|
|
576
|
-
if ('caption' in message) {
|
|
577
|
-
buttonsMessage.contentText = message.caption;
|
|
578
|
-
}
|
|
579
|
-
const type = Object.keys(m)[0].replace('Message', '').toUpperCase();
|
|
580
|
-
buttonsMessage.headerType = ButtonType[type];
|
|
581
|
-
Object.assign(buttonsMessage, m);
|
|
940
|
+
interactiveMessage.body = { text: message.text };
|
|
582
941
|
}
|
|
583
|
-
if ('
|
|
584
|
-
|
|
585
|
-
|
|
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);
|
|
586
950
|
}
|
|
587
|
-
if ('
|
|
588
|
-
|
|
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
|
+
};
|
|
589
957
|
}
|
|
590
|
-
if ('
|
|
591
|
-
|
|
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
|
+
}
|
|
592
963
|
}
|
|
593
|
-
if ('
|
|
594
|
-
|
|
964
|
+
if ('footer' in message && !!message.footer) {
|
|
965
|
+
interactiveMessage.footer = { text: message.footer };
|
|
595
966
|
}
|
|
596
|
-
|
|
967
|
+
applyContextInfoAndMentions(interactiveMessage, message);
|
|
968
|
+
m = { interactiveMessage };
|
|
597
969
|
}
|
|
598
970
|
else if ('templateButtons' in message && !!message.templateButtons) {
|
|
599
971
|
const msg = {
|
|
@@ -629,6 +1001,26 @@ const generateWAMessageContent = async (message, options) => {
|
|
|
629
1001
|
};
|
|
630
1002
|
m = { listMessage };
|
|
631
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
|
+
}
|
|
632
1024
|
if ('interactiveButtons' in message && !!message.interactiveButtons) {
|
|
633
1025
|
const interactiveMessage = {
|
|
634
1026
|
nativeFlowMessage: Types_1.WAProto.Message.InteractiveMessage.NativeFlowMessage.fromObject({
|
|
@@ -647,7 +1039,7 @@ const generateWAMessageContent = async (message, options) => {
|
|
|
647
1039
|
interactiveMessage.header = {
|
|
648
1040
|
title: message.title,
|
|
649
1041
|
subtitle: message.subtitle,
|
|
650
|
-
hasMediaAttachment: (
|
|
1042
|
+
hasMediaAttachment: Boolean(message.hasMediaAttachment),
|
|
651
1043
|
};
|
|
652
1044
|
Object.assign(interactiveMessage.header, m);
|
|
653
1045
|
}
|
|
@@ -660,23 +1052,18 @@ const generateWAMessageContent = async (message, options) => {
|
|
|
660
1052
|
interactiveMessage.header = {
|
|
661
1053
|
title: message.title,
|
|
662
1054
|
subtitle: message.subtitle,
|
|
663
|
-
hasMediaAttachment: (
|
|
1055
|
+
hasMediaAttachment: Boolean(message.hasMediaAttachment),
|
|
664
1056
|
};
|
|
665
1057
|
Object.assign(interactiveMessage.header, m);
|
|
666
1058
|
}
|
|
667
|
-
|
|
668
|
-
interactiveMessage.contextInfo = message.contextInfo;
|
|
669
|
-
}
|
|
670
|
-
if ('mentions' in message && !!message.mentions) {
|
|
671
|
-
interactiveMessage.contextInfo = { mentionedJid: message.mentions };
|
|
672
|
-
}
|
|
1059
|
+
applyContextInfoAndMentions(interactiveMessage, message);
|
|
673
1060
|
m = { interactiveMessage };
|
|
674
1061
|
}
|
|
675
1062
|
if ('shop' in message && !!message.shop) {
|
|
676
1063
|
const interactiveMessage = {
|
|
677
1064
|
shopStorefrontMessage: Types_1.WAProto.Message.InteractiveMessage.ShopMessage.fromObject({
|
|
678
|
-
surface: message.shop,
|
|
679
|
-
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
|
|
680
1067
|
})
|
|
681
1068
|
};
|
|
682
1069
|
if ('text' in message) {
|
|
@@ -691,7 +1078,7 @@ const generateWAMessageContent = async (message, options) => {
|
|
|
691
1078
|
interactiveMessage.header = {
|
|
692
1079
|
title: message.title,
|
|
693
1080
|
subtitle: message.subtitle,
|
|
694
|
-
hasMediaAttachment: (
|
|
1081
|
+
hasMediaAttachment: Boolean(message.hasMediaAttachment),
|
|
695
1082
|
};
|
|
696
1083
|
Object.assign(interactiveMessage.header, m);
|
|
697
1084
|
}
|
|
@@ -704,25 +1091,137 @@ const generateWAMessageContent = async (message, options) => {
|
|
|
704
1091
|
interactiveMessage.header = {
|
|
705
1092
|
title: message.title,
|
|
706
1093
|
subtitle: message.subtitle,
|
|
707
|
-
hasMediaAttachment: (
|
|
1094
|
+
hasMediaAttachment: Boolean(message.hasMediaAttachment),
|
|
708
1095
|
};
|
|
709
1096
|
Object.assign(interactiveMessage.header, m);
|
|
710
1097
|
}
|
|
711
|
-
|
|
712
|
-
|
|
1098
|
+
applyContextInfoAndMentions(interactiveMessage, message);
|
|
1099
|
+
m = { interactiveMessage };
|
|
1100
|
+
if ('interactiveAsTemplate' in message && message.interactiveAsTemplate !== false) {
|
|
1101
|
+
m = { templateMessage: { interactiveMessageTemplate: interactiveMessage } };
|
|
713
1102
|
}
|
|
714
|
-
|
|
715
|
-
|
|
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
|
+
});
|
|
716
1128
|
}
|
|
717
|
-
|
|
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);
|
|
718
1199
|
}
|
|
719
1200
|
if ('viewOnce' in message && !!message.viewOnce) {
|
|
720
1201
|
m = { viewOnceMessage: { message: m } };
|
|
721
1202
|
}
|
|
722
|
-
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)) {
|
|
723
1217
|
const [messageType] = Object.keys(m);
|
|
724
|
-
m[messageType].contextInfo = m[messageType] || {};
|
|
725
|
-
|
|
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
|
+
}
|
|
726
1225
|
}
|
|
727
1226
|
if ('edit' in message) {
|
|
728
1227
|
m = {
|
|
@@ -737,8 +1236,34 @@ const generateWAMessageContent = async (message, options) => {
|
|
|
737
1236
|
if ('contextInfo' in message && !!message.contextInfo) {
|
|
738
1237
|
const [messageType] = Object.keys(m);
|
|
739
1238
|
m[messageType] = m[messageType] || {};
|
|
740
|
-
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
|
+
};
|
|
741
1265
|
}
|
|
1266
|
+
applyDefaultNewsletterAnnotation(m, message);
|
|
742
1267
|
return Types_1.WAProto.Message.fromObject(m);
|
|
743
1268
|
};
|
|
744
1269
|
exports.generateWAMessageContent = generateWAMessageContent;
|
|
@@ -788,7 +1313,7 @@ const generateWAMessageFromContent = (jid, message, options) => {
|
|
|
788
1313
|
innerMessage[key].contextInfo = {
|
|
789
1314
|
...(innerMessage[key].contextInfo || {}),
|
|
790
1315
|
expiration: options.ephemeralExpiration || Defaults_1.WA_DEFAULT_EPHEMERAL,
|
|
791
|
-
|
|
1316
|
+
|
|
792
1317
|
};
|
|
793
1318
|
}
|
|
794
1319
|
message = Types_1.WAProto.Message.fromObject(message);
|
|
@@ -811,10 +1336,10 @@ const generateWAMessage = async (jid, content, options) => {
|
|
|
811
1336
|
var _a;
|
|
812
1337
|
|
|
813
1338
|
options.logger = (_a = options === null || options === void 0 ? void 0 : options.logger) === null || _a === void 0 ? void 0 : _a.child({ msgId: options.messageId });
|
|
814
|
-
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);
|
|
815
1340
|
};
|
|
816
1341
|
exports.generateWAMessage = generateWAMessage;
|
|
817
|
-
|
|
1342
|
+
|
|
818
1343
|
const getContentType = (content) => {
|
|
819
1344
|
if (content) {
|
|
820
1345
|
const keys = Object.keys(content);
|
|
@@ -823,12 +1348,7 @@ const getContentType = (content) => {
|
|
|
823
1348
|
}
|
|
824
1349
|
};
|
|
825
1350
|
exports.getContentType = getContentType;
|
|
826
|
-
|
|
827
|
-
* Normalizes ephemeral, view once messages to regular message content
|
|
828
|
-
* Eg. image messages in ephemeral messages, in view once messages etc.
|
|
829
|
-
* @param content
|
|
830
|
-
* @returns
|
|
831
|
-
*/
|
|
1351
|
+
|
|
832
1352
|
const normalizeMessageContent = (content) => {
|
|
833
1353
|
if (!content) {
|
|
834
1354
|
return undefined;
|
|
@@ -865,14 +1385,12 @@ const normalizeMessageContent = (content) => {
|
|
|
865
1385
|
|| (message === null || message === void 0 ? void 0 : message.botTaskMessage)
|
|
866
1386
|
|| (message === null || message === void 0 ? void 0 : message.questionMessage)
|
|
867
1387
|
|| (message === null || message === void 0 ? void 0 : message.groupStatusMessageV2)
|
|
868
|
-
|| (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));
|
|
869
1390
|
}
|
|
870
1391
|
};
|
|
871
1392
|
exports.normalizeMessageContent = normalizeMessageContent;
|
|
872
|
-
|
|
873
|
-
* Extract the true message content from a message
|
|
874
|
-
* Eg. extracts the inner message from a disappearing message/view once message
|
|
875
|
-
*/
|
|
1393
|
+
|
|
876
1394
|
const extractMessageContent = (content) => {
|
|
877
1395
|
var _a, _b, _c, _d, _e, _f;
|
|
878
1396
|
const extractFromTemplateMessage = (msg) => {
|
|
@@ -912,16 +1430,14 @@ const extractMessageContent = (content) => {
|
|
|
912
1430
|
return content;
|
|
913
1431
|
};
|
|
914
1432
|
exports.extractMessageContent = extractMessageContent;
|
|
915
|
-
|
|
916
|
-
* Returns the device predicted by message ID
|
|
917
|
-
*/
|
|
1433
|
+
|
|
918
1434
|
const getDevice = (id) => /^3A.{18}$/.test(id) ? 'ios' :
|
|
919
1435
|
/^3E.{20}$/.test(id) ? 'web' :
|
|
920
1436
|
/^(.{21}|.{32})$/.test(id) ? 'android' :
|
|
921
1437
|
/^(3F|.{18}$)/.test(id) ? 'desktop' :
|
|
922
1438
|
'unknown';
|
|
923
1439
|
exports.getDevice = getDevice;
|
|
924
|
-
|
|
1440
|
+
|
|
925
1441
|
const updateMessageWithReceipt = (msg, receipt) => {
|
|
926
1442
|
msg.userReceipt = msg.userReceipt || [];
|
|
927
1443
|
const recp = msg.userReceipt.find(m => m.userJid === receipt.userJid);
|
|
@@ -933,7 +1449,7 @@ const updateMessageWithReceipt = (msg, receipt) => {
|
|
|
933
1449
|
}
|
|
934
1450
|
};
|
|
935
1451
|
exports.updateMessageWithReceipt = updateMessageWithReceipt;
|
|
936
|
-
|
|
1452
|
+
|
|
937
1453
|
const updateMessageWithReaction = (msg, reaction) => {
|
|
938
1454
|
const authorID = (0, generics_1.getKeyAuthor)(reaction.key);
|
|
939
1455
|
const reactions = (msg.reactions || [])
|
|
@@ -943,7 +1459,7 @@ const updateMessageWithReaction = (msg, reaction) => {
|
|
|
943
1459
|
msg.reactions = reactions;
|
|
944
1460
|
};
|
|
945
1461
|
exports.updateMessageWithReaction = updateMessageWithReaction;
|
|
946
|
-
|
|
1462
|
+
|
|
947
1463
|
const updateMessageWithPollUpdate = (msg, update) => {
|
|
948
1464
|
var _a, _b;
|
|
949
1465
|
const authorID = (0, generics_1.getKeyAuthor)(update.pollUpdateMessageKey);
|
|
@@ -955,12 +1471,7 @@ const updateMessageWithPollUpdate = (msg, update) => {
|
|
|
955
1471
|
msg.pollUpdates = reactions;
|
|
956
1472
|
};
|
|
957
1473
|
exports.updateMessageWithPollUpdate = updateMessageWithPollUpdate;
|
|
958
|
-
|
|
959
|
-
* Aggregates all poll updates in a poll.
|
|
960
|
-
* @param msg the poll creation message
|
|
961
|
-
* @param meId your jid
|
|
962
|
-
* @returns A list of options & their voters
|
|
963
|
-
*/
|
|
1474
|
+
|
|
964
1475
|
function getAggregateVotesInPollMessage({ message, pollUpdates }, meId) {
|
|
965
1476
|
var _a, _b, _c;
|
|
966
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) || [];
|
|
@@ -992,7 +1503,7 @@ function getAggregateVotesInPollMessage({ message, pollUpdates }, meId) {
|
|
|
992
1503
|
}
|
|
993
1504
|
return Object.values(voteHashMap);
|
|
994
1505
|
}
|
|
995
|
-
|
|
1506
|
+
|
|
996
1507
|
const aggregateMessageKeysNotFromMe = (keys) => {
|
|
997
1508
|
const keyMap = {};
|
|
998
1509
|
for (const { remoteJid, id, participant, fromMe } of keys) {
|
|
@@ -1012,9 +1523,7 @@ const aggregateMessageKeysNotFromMe = (keys) => {
|
|
|
1012
1523
|
};
|
|
1013
1524
|
exports.aggregateMessageKeysNotFromMe = aggregateMessageKeysNotFromMe;
|
|
1014
1525
|
const REUPLOAD_REQUIRED_STATUS = [410, 404];
|
|
1015
|
-
|
|
1016
|
-
* Downloads the given message. Throws an error if it's not a media message
|
|
1017
|
-
*/
|
|
1526
|
+
|
|
1018
1527
|
const downloadMediaMessage = async (message, type, options, ctx) => {
|
|
1019
1528
|
const result = await downloadMsg()
|
|
1020
1529
|
.catch(async (error) => {
|
|
@@ -1068,7 +1577,7 @@ const downloadMediaMessage = async (message, type, options, ctx) => {
|
|
|
1068
1577
|
}
|
|
1069
1578
|
};
|
|
1070
1579
|
exports.downloadMediaMessage = downloadMediaMessage;
|
|
1071
|
-
|
|
1580
|
+
|
|
1072
1581
|
const assertMediaContent = (content) => {
|
|
1073
1582
|
content = (0, exports.extractMessageContent)(content);
|
|
1074
1583
|
const mediaContent = (content === null || content === void 0 ? void 0 : content.documentMessage)
|
|
@@ -1083,21 +1592,36 @@ const assertMediaContent = (content) => {
|
|
|
1083
1592
|
};
|
|
1084
1593
|
exports.assertMediaContent = assertMediaContent;
|
|
1085
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
|
+
*/
|
|
1086
1598
|
const toJid = (id) => {
|
|
1087
1599
|
if (!id)
|
|
1088
1600
|
return '';
|
|
1089
|
-
if (id.endsWith('@lid'))
|
|
1090
|
-
return id.replace('@lid', '@s.whatsapp.net');
|
|
1091
1601
|
if (id.includes('@'))
|
|
1092
1602
|
return id;
|
|
1093
1603
|
return `${id}@s.whatsapp.net`;
|
|
1094
1604
|
};
|
|
1095
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
|
+
*/
|
|
1096
1609
|
const getSenderLid = (message) => {
|
|
1097
|
-
const
|
|
1098
|
-
|
|
1099
|
-
|
|
1100
|
-
|
|
1101
|
-
|
|
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: '' };
|
|
1102
1626
|
};
|
|
1103
1627
|
exports.getSenderLid = getSenderLid;
|