zapo-js 0.2.0 → 0.3.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/README.md +7 -3
- package/dist/appstate/WaAppStateCrypto.js +49 -41
- package/dist/appstate/WaAppStateSyncClient.js +79 -42
- package/dist/appstate/index.js +2 -2
- package/dist/auth/WaAuthClient.js +20 -11
- package/dist/auth/{flow/WaAuthCredentialsFlow.js → credentials-flow.js} +83 -18
- package/dist/auth/pairing/WaPairingFlow.js +26 -29
- package/dist/auth/pairing/{WaPairingCodeCrypto.js → pairing-code-crypto.js} +29 -13
- package/dist/client/WaClient.js +115 -75
- package/dist/client/WaClientFactory.js +113 -30
- package/dist/client/connection/WaConnectionManager.js +4 -1
- package/dist/client/coordinators/WaAbPropsCoordinator.js +141 -0
- package/dist/client/coordinators/WaBusinessCoordinator.js +3 -12
- package/dist/client/coordinators/WaEmailCoordinator.js +63 -0
- package/dist/client/coordinators/WaIncomingNodeCoordinator.js +33 -8
- package/dist/client/coordinators/WaMessageDispatchCoordinator.js +55 -25
- package/dist/client/coordinators/WaOfflineResumeCoordinator.js +114 -0
- package/dist/client/coordinators/WaPassiveTasksCoordinator.js +38 -20
- package/dist/client/coordinators/WaProfileCoordinator.js +3 -1
- package/dist/client/coordinators/WaRetryCoordinator.js +11 -9
- package/dist/client/coordinators/WaTrustedContactTokenCoordinator.js +22 -4
- package/dist/client/dirty.js +1 -1
- package/dist/client/events/abprops.js +43 -0
- package/dist/client/events/privacy-token.js +1 -2
- package/dist/client/events/registration.js +42 -0
- package/dist/client/incoming.js +37 -0
- package/dist/client/mailbox.js +17 -1
- package/dist/client/media.js +243 -0
- package/dist/client/messages.js +163 -86
- package/dist/crypto/core/index.js +4 -1
- package/dist/crypto/core/random.js +3 -9
- package/dist/crypto/core/xeddsa.js +57 -0
- package/dist/crypto/curves/X25519.js +18 -0
- package/dist/crypto/curves/constants.js +2 -1
- package/dist/esm/appstate/WaAppStateCrypto.js +39 -31
- package/dist/esm/appstate/WaAppStateSyncClient.js +68 -31
- package/dist/esm/appstate/index.js +1 -1
- package/dist/esm/appstate/{WaAppStateSyncResponseParser.js → response-parser.js} +1 -1
- package/dist/esm/auth/WaAuthClient.js +17 -8
- package/dist/esm/auth/{flow/WaAuthCredentialsFlow.js → credentials-flow.js} +83 -18
- package/dist/esm/auth/pairing/WaPairingFlow.js +25 -28
- package/dist/esm/auth/pairing/{WaPairingCodeCrypto.js → pairing-code-crypto.js} +20 -6
- package/dist/esm/client/WaClient.js +116 -76
- package/dist/esm/client/WaClientFactory.js +114 -31
- package/dist/esm/client/connection/WaConnectionManager.js +4 -1
- package/dist/esm/client/coordinators/WaAbPropsCoordinator.js +137 -0
- package/dist/esm/client/coordinators/WaBusinessCoordinator.js +4 -13
- package/dist/esm/client/coordinators/WaEmailCoordinator.js +60 -0
- package/dist/esm/client/coordinators/WaIncomingNodeCoordinator.js +35 -10
- package/dist/esm/client/coordinators/WaMessageDispatchCoordinator.js +47 -17
- package/dist/esm/client/coordinators/WaOfflineResumeCoordinator.js +110 -0
- package/dist/esm/client/coordinators/WaPassiveTasksCoordinator.js +38 -20
- package/dist/esm/client/coordinators/WaProfileCoordinator.js +3 -1
- package/dist/esm/client/coordinators/WaRetryCoordinator.js +11 -9
- package/dist/esm/client/coordinators/WaTrustedContactTokenCoordinator.js +24 -6
- package/dist/esm/client/dirty.js +1 -1
- package/dist/esm/client/events/abprops.js +40 -0
- package/dist/esm/client/events/privacy-token.js +1 -2
- package/dist/esm/client/events/registration.js +39 -0
- package/dist/esm/client/incoming.js +36 -0
- package/dist/esm/client/mailbox.js +17 -1
- package/dist/esm/client/media.js +234 -0
- package/dist/esm/client/messages.js +162 -85
- package/dist/esm/crypto/core/index.js +1 -0
- package/dist/esm/crypto/core/random.js +2 -7
- package/dist/esm/crypto/core/xeddsa.js +53 -0
- package/dist/esm/crypto/curves/X25519.js +20 -2
- package/dist/esm/crypto/curves/constants.js +1 -0
- package/dist/esm/infra/perf/StoreLock.js +7 -4
- package/dist/esm/media/WaMediaCrypto.js +257 -62
- package/dist/esm/media/WaMediaTransferClient.js +47 -190
- package/dist/esm/media/constants.js +2 -0
- package/dist/esm/media/processor.js +1 -0
- package/dist/esm/message/addon-crypto.js +130 -3
- package/dist/esm/message/content.js +12 -6
- package/dist/esm/message/icdc.js +8 -8
- package/dist/esm/message/incoming.js +14 -12
- package/dist/esm/message/phash.js +32 -12
- package/dist/esm/message/reporting-token.js +3 -3
- package/dist/esm/message/use-case-secret.js +1 -1
- package/dist/esm/protocol/abprops.js +159 -0
- package/dist/esm/protocol/browser.js +14 -0
- package/dist/esm/protocol/constants.js +3 -1
- package/dist/esm/protocol/email.js +30 -0
- package/dist/esm/protocol/jid.js +44 -10
- package/dist/esm/protocol/nodes.js +6 -2
- package/dist/esm/protocol/notification.js +7 -1
- package/dist/esm/retry/reason.js +1 -1
- package/dist/esm/signal/api/SignalDeviceSyncApi.js +5 -2
- package/dist/esm/signal/api/SignalDigestSyncApi.js +8 -6
- package/dist/esm/signal/api/SignalIdentitySyncApi.js +4 -4
- package/dist/esm/signal/api/SignalMissingPreKeysSyncApi.js +1 -1
- package/dist/esm/signal/api/SignalSessionSyncApi.js +1 -1
- package/dist/esm/signal/crypto/WaAdvSignature.js +5 -51
- package/dist/esm/signal/crypto/constants.js +0 -4
- package/dist/esm/signal/encoding.js +11 -54
- package/dist/esm/signal/group/SenderKeyChain.js +3 -3
- package/dist/esm/signal/group/SenderKeyCodec.js +5 -6
- package/dist/esm/signal/group/SenderKeyManager.js +13 -10
- package/dist/esm/signal/registration/keygen.js +2 -3
- package/dist/esm/signal/registration/utils.js +2 -2
- package/dist/esm/signal/session/SignalProtocol.js +18 -17
- package/dist/esm/signal/session/SignalRatchet.js +21 -10
- package/dist/esm/signal/session/SignalSerializer.js +5 -6
- package/dist/esm/signal/session/SignalSession.js +11 -9
- package/dist/esm/signal/session/resolver.js +6 -6
- package/dist/esm/store/contracts/identity.store.js +1 -0
- package/dist/esm/store/contracts/message-secret.store.js +1 -0
- package/dist/esm/store/contracts/pre-key.store.js +1 -0
- package/dist/esm/store/contracts/session.store.js +1 -0
- package/dist/esm/store/createStore.js +48 -12
- package/dist/esm/store/index.js +4 -0
- package/dist/esm/store/locks/identity.lock.js +16 -0
- package/dist/esm/store/locks/message-secret.lock.js +17 -0
- package/dist/esm/store/locks/pre-key.lock.js +27 -0
- package/dist/esm/store/locks/session.lock.js +19 -0
- package/dist/esm/store/locks/signal.lock.js +0 -24
- package/dist/esm/store/noop.store.js +20 -0
- package/dist/esm/store/providers/memory/device-list.store.js +3 -0
- package/dist/esm/store/providers/memory/identity.store.js +31 -0
- package/dist/esm/store/providers/memory/message-secret.store.js +81 -0
- package/dist/esm/store/providers/memory/participants.store.js +3 -0
- package/dist/esm/store/providers/memory/pre-key.store.js +97 -0
- package/dist/esm/store/providers/memory/retry.store.js +25 -11
- package/dist/esm/store/providers/memory/session.store.js +45 -0
- package/dist/esm/store/providers/memory/signal.store.js +1 -164
- package/dist/esm/transport/WaComms.js +4 -3
- package/dist/esm/transport/WaWebSocket.js +9 -1
- package/dist/esm/transport/index.js +6 -0
- package/dist/esm/transport/keepalive/WaKeepAlive.js +17 -8
- package/dist/esm/transport/node/WaMobileTcpSocket.js +114 -0
- package/dist/esm/transport/node/WaNodeOrchestrator.js +17 -8
- package/dist/esm/transport/node/builders/abprops.js +20 -0
- package/dist/esm/transport/node/builders/device.js +11 -0
- package/dist/esm/transport/node/builders/email.js +65 -0
- package/dist/esm/transport/node/builders/offline.js +14 -0
- package/dist/esm/transport/node/builders/prekeys.js +37 -40
- package/dist/esm/transport/node/builders/presence.js +13 -0
- package/dist/esm/transport/node/builders/privacy-token.js +19 -23
- package/dist/esm/transport/node/builders/retry.js +1 -1
- package/dist/esm/transport/node/helpers.js +24 -0
- package/dist/esm/transport/node/mex/argo-decoder.js +152 -0
- package/dist/esm/transport/node/mex/client.js +83 -0
- package/dist/esm/transport/node/mex/persist-ids.js +10 -0
- package/dist/esm/transport/noise/WaClientPayload.js +15 -10
- package/dist/esm/transport/noise/WaFrameCodec.js +2 -2
- package/dist/esm/transport/noise/WaMobileClientPayload.js +53 -0
- package/dist/esm/transport/noise/WaNoiseCert.js +9 -27
- package/dist/esm/transport/noise/WaNoiseSession.js +12 -11
- package/dist/infra/perf/StoreLock.js +7 -4
- package/dist/media/WaMediaCrypto.js +253 -58
- package/dist/media/WaMediaTransferClient.js +50 -223
- package/dist/media/constants.js +3 -1
- package/dist/media/processor.js +2 -0
- package/dist/message/addon-crypto.js +131 -0
- package/dist/message/content.js +13 -5
- package/dist/message/icdc.js +8 -8
- package/dist/message/incoming.js +14 -12
- package/dist/message/phash.js +32 -12
- package/dist/message/reporting-token.js +2 -2
- package/dist/message/use-case-secret.js +1 -1
- package/dist/protocol/abprops.js +163 -0
- package/dist/protocol/browser.js +15 -0
- package/dist/protocol/constants.js +14 -2
- package/dist/protocol/email.js +33 -0
- package/dist/protocol/jid.js +45 -10
- package/dist/protocol/nodes.js +6 -2
- package/dist/protocol/notification.js +8 -2
- package/dist/retry/reason.js +1 -1
- package/dist/signal/api/SignalDeviceSyncApi.js +5 -2
- package/dist/signal/api/SignalDigestSyncApi.js +8 -6
- package/dist/signal/api/SignalIdentitySyncApi.js +4 -4
- package/dist/signal/crypto/WaAdvSignature.js +2 -50
- package/dist/signal/crypto/constants.js +1 -5
- package/dist/signal/encoding.js +11 -49
- package/dist/signal/group/SenderKeyChain.js +2 -2
- package/dist/signal/group/SenderKeyCodec.js +4 -5
- package/dist/signal/group/SenderKeyManager.js +12 -9
- package/dist/signal/registration/keygen.js +1 -2
- package/dist/signal/registration/utils.js +2 -2
- package/dist/signal/session/SignalProtocol.js +18 -17
- package/dist/signal/session/SignalRatchet.js +19 -8
- package/dist/signal/session/SignalSerializer.js +5 -6
- package/dist/signal/session/SignalSession.js +11 -9
- package/dist/signal/session/resolver.js +6 -6
- package/dist/store/contracts/identity.store.js +2 -0
- package/dist/store/contracts/message-secret.store.js +2 -0
- package/dist/store/contracts/pre-key.store.js +2 -0
- package/dist/store/contracts/session.store.js +2 -0
- package/dist/store/createStore.js +47 -11
- package/dist/store/index.js +9 -1
- package/dist/store/locks/identity.lock.js +19 -0
- package/dist/store/locks/message-secret.lock.js +20 -0
- package/dist/store/locks/pre-key.lock.js +30 -0
- package/dist/store/locks/session.lock.js +22 -0
- package/dist/store/locks/signal.lock.js +0 -24
- package/dist/store/noop.store.js +21 -1
- package/dist/store/providers/memory/device-list.store.js +3 -0
- package/dist/store/providers/memory/identity.store.js +35 -0
- package/dist/store/providers/memory/message-secret.store.js +85 -0
- package/dist/store/providers/memory/participants.store.js +3 -0
- package/dist/store/providers/memory/pre-key.store.js +101 -0
- package/dist/store/providers/memory/retry.store.js +24 -10
- package/dist/store/providers/memory/session.store.js +49 -0
- package/dist/store/providers/memory/signal.store.js +1 -164
- package/dist/transport/WaComms.js +4 -3
- package/dist/transport/WaWebSocket.js +9 -1
- package/dist/transport/index.js +17 -1
- package/dist/transport/keepalive/WaKeepAlive.js +17 -8
- package/dist/transport/node/WaMobileTcpSocket.js +118 -0
- package/dist/transport/node/WaNodeOrchestrator.js +16 -7
- package/dist/transport/node/builders/abprops.js +23 -0
- package/dist/transport/node/builders/device.js +14 -0
- package/dist/transport/node/builders/email.js +72 -0
- package/dist/transport/node/builders/offline.js +17 -0
- package/dist/transport/node/builders/prekeys.js +36 -39
- package/dist/transport/node/builders/presence.js +16 -0
- package/dist/transport/node/builders/privacy-token.js +18 -22
- package/dist/transport/node/builders/retry.js +1 -1
- package/dist/transport/node/helpers.js +26 -0
- package/dist/transport/node/mex/argo-decoder.js +189 -0
- package/dist/transport/node/mex/client.js +86 -0
- package/dist/transport/node/mex/persist-ids.js +13 -0
- package/dist/transport/noise/WaClientPayload.js +14 -9
- package/dist/transport/noise/WaFrameCodec.js +1 -1
- package/dist/transport/noise/WaMobileClientPayload.js +56 -0
- package/dist/transport/noise/WaNoiseCert.js +8 -26
- package/dist/transport/noise/WaNoiseSession.js +11 -10
- package/dist/types/appstate/WaAppStateCrypto.d.ts +11 -8
- package/dist/types/appstate/WaAppStateSyncClient.d.ts +6 -2
- package/dist/types/appstate/index.d.ts +1 -1
- package/dist/types/appstate/{WaAppStateSyncResponseParser.d.ts → response-parser.d.ts} +1 -1
- package/dist/types/appstate/types.d.ts +1 -1
- package/dist/types/auth/WaAuthClient.d.ts +9 -3
- package/dist/types/auth/credentials-flow.d.ts +20 -0
- package/dist/types/auth/pairing/WaPairingFlow.d.ts +3 -2
- package/dist/types/auth/pairing/{WaPairingCodeCrypto.d.ts → pairing-code-crypto.d.ts} +6 -1
- package/dist/types/auth/types.d.ts +40 -0
- package/dist/types/client/WaClient.d.ts +19 -8
- package/dist/types/client/WaClientFactory.d.ts +10 -4
- package/dist/types/client/coordinators/WaAbPropsCoordinator.d.ts +26 -0
- package/dist/types/client/coordinators/WaBusinessCoordinator.d.ts +1 -1
- package/dist/types/client/coordinators/WaEmailCoordinator.d.ts +24 -0
- package/dist/types/client/coordinators/WaIncomingNodeCoordinator.d.ts +6 -1
- package/dist/types/client/coordinators/WaMessageDispatchCoordinator.d.ts +15 -2
- package/dist/types/client/coordinators/WaOfflineResumeCoordinator.d.ts +31 -0
- package/dist/types/client/coordinators/WaPassiveTasksCoordinator.d.ts +13 -2
- package/dist/types/client/coordinators/WaPrivacyCoordinator.d.ts +1 -1
- package/dist/types/client/coordinators/WaProfileCoordinator.d.ts +4 -2
- package/dist/types/client/coordinators/WaRetryCoordinator.d.ts +6 -0
- package/dist/types/client/coordinators/WaTrustedContactTokenCoordinator.d.ts +11 -1
- package/dist/types/client/dirty.d.ts +3 -1
- package/dist/types/client/events/abprops.d.ts +14 -0
- package/dist/types/client/events/registration.d.ts +17 -0
- package/dist/types/client/incoming.d.ts +6 -1
- package/dist/types/client/mailbox.d.ts +2 -0
- package/dist/types/client/media.d.ts +31 -0
- package/dist/types/client/messages.d.ts +2 -0
- package/dist/types/client/persistence/WriteBehindPersistence.d.ts +1 -1
- package/dist/types/client/types.d.ts +100 -1
- package/dist/types/crypto/core/index.d.ts +1 -0
- package/dist/types/crypto/core/primitives.d.ts +1 -1
- package/dist/types/crypto/core/random.d.ts +1 -1
- package/dist/types/crypto/core/xeddsa.d.ts +2 -0
- package/dist/types/crypto/curves/constants.d.ts +1 -0
- package/dist/types/crypto/index.d.ts +1 -0
- package/dist/types/index.d.ts +2 -1
- package/dist/types/infra/log/ConsoleLogger.d.ts +1 -1
- package/dist/types/infra/log/PinoLogger.d.ts +1 -1
- package/dist/types/infra/perf/StoreLock.d.ts +1 -0
- package/dist/types/media/WaMediaCrypto.d.ts +15 -6
- package/dist/types/media/WaMediaTransferClient.d.ts +3 -11
- package/dist/types/media/constants.d.ts +2 -0
- package/dist/types/media/index.d.ts +1 -0
- package/dist/types/media/processor.d.ts +28 -0
- package/dist/types/media/types.d.ts +9 -3
- package/dist/types/message/addon-crypto.d.ts +34 -3
- package/dist/types/message/content.d.ts +3 -1
- package/dist/types/message/icdc.d.ts +4 -4
- package/dist/types/message/types.d.ts +16 -24
- package/dist/types/protocol/abprops.d.ts +142 -0
- package/dist/types/protocol/browser.d.ts +1 -0
- package/dist/types/protocol/constants.d.ts +5 -1
- package/dist/types/protocol/email.d.ts +32 -0
- package/dist/types/protocol/jid.d.ts +1 -0
- package/dist/types/protocol/nodes.d.ts +4 -0
- package/dist/types/protocol/notification.d.ts +6 -0
- package/dist/types/protocol/stream.d.ts +1 -0
- package/dist/types/retry/reason.d.ts +1 -1
- package/dist/types/signal/api/SignalDigestSyncApi.d.ts +3 -0
- package/dist/types/signal/api/SignalIdentitySyncApi.d.ts +3 -3
- package/dist/types/signal/crypto/WaAdvSignature.d.ts +0 -2
- package/dist/types/signal/crypto/constants.d.ts +0 -1
- package/dist/types/signal/encoding.d.ts +7 -1
- package/dist/types/signal/group/SenderKeyChain.d.ts +1 -1
- package/dist/types/signal/group/SenderKeyManager.d.ts +7 -2
- package/dist/types/signal/registration/utils.d.ts +2 -1
- package/dist/types/signal/session/SignalProtocol.d.ts +11 -2
- package/dist/types/signal/session/SignalSerializer.d.ts +2 -1
- package/dist/types/signal/session/resolver.d.ts +4 -2
- package/dist/types/signal/types.d.ts +16 -4
- package/dist/types/store/contracts/identity.store.d.ts +11 -0
- package/dist/types/store/contracts/message-secret.store.d.ts +16 -0
- package/dist/types/store/contracts/pre-key.store.d.ts +13 -0
- package/dist/types/store/contracts/session.store.d.ts +14 -0
- package/dist/types/store/contracts/signal.store.d.ts +1 -34
- package/dist/types/store/index.d.ts +9 -1
- package/dist/types/store/locks/identity.lock.d.ts +3 -0
- package/dist/types/store/locks/message-secret.lock.d.ts +3 -0
- package/dist/types/store/locks/pre-key.lock.d.ts +3 -0
- package/dist/types/store/locks/session.lock.d.ts +3 -0
- package/dist/types/store/noop.store.d.ts +4 -0
- package/dist/types/store/providers/memory/identity.store.d.ts +18 -0
- package/dist/types/store/providers/memory/message-secret.store.d.ts +21 -0
- package/dist/types/store/providers/memory/pre-key.store.d.ts +23 -0
- package/dist/types/store/providers/memory/retry.store.d.ts +7 -1
- package/dist/types/store/providers/memory/session.store.d.ts +21 -0
- package/dist/types/store/providers/memory/signal.store.d.ts +3 -45
- package/dist/types/store/providers/memory/thread.store.d.ts +1 -1
- package/dist/types/store/types.d.ts +21 -1
- package/dist/types/transport/WaWebSocket.d.ts +1 -0
- package/dist/types/transport/index.d.ts +8 -1
- package/dist/types/transport/keepalive/WaKeepAlive.d.ts +4 -1
- package/dist/types/transport/node/WaMobileTcpSocket.d.ts +18 -0
- package/dist/types/transport/node/WaNodeOrchestrator.d.ts +6 -2
- package/dist/types/transport/node/builders/abprops.d.ts +5 -0
- package/dist/types/transport/node/builders/device.d.ts +2 -0
- package/dist/types/transport/node/builders/email.d.ts +11 -0
- package/dist/types/transport/node/builders/offline.d.ts +2 -0
- package/dist/types/transport/node/builders/prekeys.d.ts +4 -3
- package/dist/types/transport/node/builders/presence.d.ts +6 -0
- package/dist/types/transport/node/helpers.d.ts +3 -0
- package/dist/types/transport/node/mex/argo-decoder.d.ts +11 -0
- package/dist/types/transport/node/mex/client.d.ts +18 -0
- package/dist/types/transport/node/mex/persist-ids.d.ts +14 -0
- package/dist/types/transport/noise/WaMobileClientPayload.d.ts +29 -0
- package/dist/types/transport/noise/WaNoiseCert.d.ts +7 -1
- package/dist/types/transport/noise/WaNoiseSession.d.ts +1 -0
- package/dist/types/transport/types.d.ts +8 -0
- package/package.json +6 -4
- package/dist/auth/pairing/constants.js +0 -5
- package/dist/client/connection/WaKeyShareCoordinator.js +0 -63
- package/dist/esm/auth/pairing/constants.js +0 -2
- package/dist/esm/client/connection/WaKeyShareCoordinator.js +0 -59
- package/dist/esm/transport/node/builders/index.js +0 -11
- package/dist/transport/node/builders/index.js +0 -51
- package/dist/types/auth/flow/WaAuthCredentialsFlow.d.ts +0 -14
- package/dist/types/auth/pairing/constants.d.ts +0 -2
- package/dist/types/client/connection/WaKeyShareCoordinator.d.ts +0 -14
- package/dist/types/transport/node/builders/index.d.ts +0 -11
- /package/dist/appstate/{WaAppStateSyncResponseParser.js → response-parser.js} +0 -0
|
@@ -1,46 +1,16 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
-
var ownKeys = function(o) {
|
|
20
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
-
var ar = [];
|
|
22
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
-
return ar;
|
|
24
|
-
};
|
|
25
|
-
return ownKeys(o);
|
|
26
|
-
};
|
|
27
|
-
return function (mod) {
|
|
28
|
-
if (mod && mod.__esModule) return mod;
|
|
29
|
-
var result = {};
|
|
30
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
-
__setModuleDefault(result, mod);
|
|
32
|
-
return result;
|
|
33
|
-
};
|
|
34
|
-
})();
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
35
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
6
|
exports.WaMediaTransferClient = void 0;
|
|
37
|
-
const
|
|
7
|
+
const node_http_1 = __importDefault(require("node:http"));
|
|
8
|
+
const node_https_1 = __importDefault(require("node:https"));
|
|
38
9
|
const constants_1 = require("./constants");
|
|
39
10
|
const WaMediaCrypto_1 = require("./WaMediaCrypto");
|
|
40
11
|
const constants_2 = require("../protocol/constants");
|
|
41
12
|
const bytes_1 = require("../util/bytes");
|
|
42
13
|
const primitives_1 = require("../util/primitives");
|
|
43
|
-
const GOT_OPTIONAL_MODULE = 'got';
|
|
44
14
|
function normalizeHeaderRecord(headers) {
|
|
45
15
|
if (!headers) {
|
|
46
16
|
return {};
|
|
@@ -51,56 +21,6 @@ function normalizeHeaderRecord(headers) {
|
|
|
51
21
|
}
|
|
52
22
|
return normalized;
|
|
53
23
|
}
|
|
54
|
-
function asOptionalGotModule(loaded) {
|
|
55
|
-
if (loaded && typeof loaded === 'object') {
|
|
56
|
-
const direct = loaded.stream;
|
|
57
|
-
if (typeof direct === 'function') {
|
|
58
|
-
return loaded;
|
|
59
|
-
}
|
|
60
|
-
const fallback = loaded.default;
|
|
61
|
-
if (fallback &&
|
|
62
|
-
typeof fallback === 'object' &&
|
|
63
|
-
'stream' in fallback &&
|
|
64
|
-
typeof fallback.stream === 'function') {
|
|
65
|
-
return fallback;
|
|
66
|
-
}
|
|
67
|
-
if (typeof fallback === 'function' && 'stream' in fallback) {
|
|
68
|
-
const maybeStream = fallback.stream;
|
|
69
|
-
if (typeof maybeStream === 'function') {
|
|
70
|
-
return fallback;
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
if (typeof loaded === 'function' && 'stream' in loaded) {
|
|
75
|
-
const maybeStream = loaded.stream;
|
|
76
|
-
if (typeof maybeStream === 'function') {
|
|
77
|
-
return loaded;
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
return null;
|
|
81
|
-
}
|
|
82
|
-
async function loadOptionalGotModule() {
|
|
83
|
-
try {
|
|
84
|
-
const loaded = await Promise.resolve(`${GOT_OPTIONAL_MODULE}`).then(s => __importStar(require(s)));
|
|
85
|
-
const module = asOptionalGotModule(loaded);
|
|
86
|
-
if (module) {
|
|
87
|
-
return module;
|
|
88
|
-
}
|
|
89
|
-
throw new Error('invalid got module export');
|
|
90
|
-
}
|
|
91
|
-
catch (error) {
|
|
92
|
-
const normalized = (0, primitives_1.toError)(error);
|
|
93
|
-
const code = normalized.code;
|
|
94
|
-
const message = normalized.message ?? '';
|
|
95
|
-
const isModuleNotFound = (code === 'ERR_MODULE_NOT_FOUND' || code === 'MODULE_NOT_FOUND') &&
|
|
96
|
-
(message.includes(`'${GOT_OPTIONAL_MODULE}'`) ||
|
|
97
|
-
message.includes(`"${GOT_OPTIONAL_MODULE}"`));
|
|
98
|
-
if (isModuleNotFound) {
|
|
99
|
-
throw new Error('optional dependency "got" is not installed. Install with: npm i got');
|
|
100
|
-
}
|
|
101
|
-
throw normalized;
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
24
|
class WaMediaTransferClient {
|
|
105
25
|
constructor(options = {}) {
|
|
106
26
|
this.logger = options.logger;
|
|
@@ -108,25 +28,18 @@ class WaMediaTransferClient {
|
|
|
108
28
|
this.defaultTimeoutMs = options.defaultTimeoutMs ?? constants_2.WA_DEFAULTS.MEDIA_TIMEOUT_MS;
|
|
109
29
|
this.defaultMaxReadBytes = options.defaultMaxReadBytes;
|
|
110
30
|
this.defaultHeaders = normalizeHeaderRecord(options.defaultHeaders);
|
|
111
|
-
this.defaultUploadDispatcher = options.defaultUploadDispatcher;
|
|
112
|
-
this.defaultDownloadDispatcher = options.defaultDownloadDispatcher;
|
|
113
31
|
this.defaultUploadAgent = options.defaultUploadAgent;
|
|
114
32
|
this.defaultDownloadAgent = options.defaultDownloadAgent;
|
|
115
|
-
this.
|
|
33
|
+
this.skipMacVerification = options.skipMacVerification === true;
|
|
116
34
|
}
|
|
117
35
|
async downloadStream(request) {
|
|
118
36
|
const { urls, headers, timeoutMs } = this.resolveTransferRequest(request);
|
|
119
|
-
const dispatcher = request.dispatcher ?? this.defaultDownloadDispatcher;
|
|
120
37
|
const agent = request.agent ?? this.defaultDownloadAgent;
|
|
121
38
|
this.logger?.debug('media download stream start', {
|
|
122
39
|
urls: urls.length,
|
|
123
40
|
timeoutMs
|
|
124
41
|
});
|
|
125
|
-
const result = await this.fetchWithFallback(urls, timeoutMs, request.signal, (url, signal) => this.
|
|
126
|
-
method: 'GET',
|
|
127
|
-
headers,
|
|
128
|
-
signal
|
|
129
|
-
}, dispatcher, agent));
|
|
42
|
+
const result = await this.fetchWithFallback(urls, timeoutMs, request.signal, (url, signal) => this.httpRequest(url, { method: 'GET', headers, signal }, agent));
|
|
130
43
|
this.logger?.trace('media download stream response', {
|
|
131
44
|
url: result.url,
|
|
132
45
|
status: result.status
|
|
@@ -151,7 +64,6 @@ class WaMediaTransferClient {
|
|
|
151
64
|
? String(request.contentLength)
|
|
152
65
|
: undefined
|
|
153
66
|
});
|
|
154
|
-
const dispatcher = request.dispatcher ?? this.defaultUploadDispatcher;
|
|
155
67
|
const agent = request.agent ?? this.defaultUploadAgent;
|
|
156
68
|
const uploadUrls = bodyIsBytes ? urls : urls.slice(0, 1);
|
|
157
69
|
if (!bodyIsBytes && urls.length > 1) {
|
|
@@ -165,23 +77,7 @@ class WaMediaTransferClient {
|
|
|
165
77
|
timeoutMs,
|
|
166
78
|
method
|
|
167
79
|
});
|
|
168
|
-
const result = await this.fetchWithFallback(uploadUrls, timeoutMs, request.signal,
|
|
169
|
-
if (bodyIsBytes) {
|
|
170
|
-
return this.transferRequest(url, {
|
|
171
|
-
method,
|
|
172
|
-
headers,
|
|
173
|
-
signal,
|
|
174
|
-
body: request.body
|
|
175
|
-
}, dispatcher, agent);
|
|
176
|
-
}
|
|
177
|
-
return this.transferRequest(url, {
|
|
178
|
-
method,
|
|
179
|
-
headers,
|
|
180
|
-
signal,
|
|
181
|
-
body: request.body,
|
|
182
|
-
duplex: 'half'
|
|
183
|
-
}, dispatcher, agent);
|
|
184
|
-
});
|
|
80
|
+
const result = await this.fetchWithFallback(uploadUrls, timeoutMs, request.signal, (url, signal) => this.httpRequest(url, { method, headers, signal, body: request.body }, agent));
|
|
185
81
|
this.logger?.trace('media upload stream response', {
|
|
186
82
|
url: result.url,
|
|
187
83
|
status: result.status
|
|
@@ -201,7 +97,6 @@ class WaMediaTransferClient {
|
|
|
201
97
|
directPath: request.directPath,
|
|
202
98
|
hosts: request.hosts,
|
|
203
99
|
headers: request.headers,
|
|
204
|
-
dispatcher: request.dispatcher,
|
|
205
100
|
agent: request.agent,
|
|
206
101
|
timeoutMs: request.timeoutMs,
|
|
207
102
|
signal: request.signal,
|
|
@@ -257,7 +152,8 @@ class WaMediaTransferClient {
|
|
|
257
152
|
mediaType: request.mediaType,
|
|
258
153
|
mediaKey: request.mediaKey,
|
|
259
154
|
expectedFileSha256: request.fileSha256,
|
|
260
|
-
expectedFileEncSha256: request.fileEncSha256
|
|
155
|
+
expectedFileEncSha256: request.fileEncSha256,
|
|
156
|
+
skipMacVerification: this.skipMacVerification
|
|
261
157
|
});
|
|
262
158
|
decrypted.metadata.catch(() => undefined);
|
|
263
159
|
this.logger?.debug('media encrypted download stream ready', {
|
|
@@ -274,119 +170,50 @@ class WaMediaTransferClient {
|
|
|
274
170
|
}
|
|
275
171
|
return (0, bytes_1.readAllBytes)(response.body, { maxBytes: maxBytes ?? this.defaultMaxReadBytes });
|
|
276
172
|
}
|
|
277
|
-
async
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
}
|
|
281
|
-
return this.fetchWithDispatcher(url, init, dispatcher);
|
|
282
|
-
}
|
|
283
|
-
async fetchWithDispatcher(url, init, dispatcher) {
|
|
284
|
-
const response = !dispatcher
|
|
285
|
-
? await fetch(url, init)
|
|
286
|
-
: await fetch(url, {
|
|
287
|
-
...init,
|
|
288
|
-
dispatcher
|
|
289
|
-
});
|
|
290
|
-
return this.toFetchTransferResponse(response);
|
|
291
|
-
}
|
|
292
|
-
toFetchTransferResponse(response) {
|
|
293
|
-
return {
|
|
294
|
-
status: response.status,
|
|
295
|
-
ok: response.ok,
|
|
296
|
-
headers: Object.fromEntries(response.headers.entries()),
|
|
297
|
-
body: response.body
|
|
298
|
-
? node_stream_1.Readable.fromWeb(response.body)
|
|
299
|
-
: null,
|
|
300
|
-
cancel: async () => {
|
|
301
|
-
if (!response.body) {
|
|
302
|
-
return;
|
|
303
|
-
}
|
|
304
|
-
try {
|
|
305
|
-
await response.body.cancel();
|
|
306
|
-
}
|
|
307
|
-
catch {
|
|
308
|
-
// ignore cancel errors from remote resets
|
|
309
|
-
}
|
|
310
|
-
}
|
|
311
|
-
};
|
|
312
|
-
}
|
|
313
|
-
async gotWithAgent(url, init, agent) {
|
|
314
|
-
const got = await this.loadGotModule();
|
|
315
|
-
const urlObj = new URL(url);
|
|
316
|
-
const gotAgent = urlObj.protocol === 'http:'
|
|
317
|
-
? { http: agent }
|
|
318
|
-
: urlObj.protocol === 'https:'
|
|
319
|
-
? { https: agent }
|
|
320
|
-
: { http: agent, https: agent };
|
|
173
|
+
async httpRequest(url, init, agent) {
|
|
174
|
+
const parsed = new URL(url);
|
|
175
|
+
const transport = parsed.protocol === 'https:' ? node_https_1.default : node_http_1.default;
|
|
321
176
|
return new Promise((resolve, reject) => {
|
|
322
|
-
const
|
|
323
|
-
method: init.method,
|
|
324
|
-
headers:
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
};
|
|
339
|
-
request.once('error', onError);
|
|
340
|
-
request.once('response', onResponse);
|
|
341
|
-
});
|
|
342
|
-
}
|
|
343
|
-
async loadGotModule() {
|
|
344
|
-
if (!this.gotModulePromise) {
|
|
345
|
-
this.gotModulePromise = loadOptionalGotModule().catch((error) => {
|
|
346
|
-
this.gotModulePromise = null;
|
|
347
|
-
throw error;
|
|
348
|
-
});
|
|
349
|
-
}
|
|
350
|
-
return this.gotModulePromise;
|
|
351
|
-
}
|
|
352
|
-
toGotTransferResponse(incoming) {
|
|
353
|
-
if (!incoming || typeof incoming !== 'object') {
|
|
354
|
-
throw new Error('invalid got response object');
|
|
355
|
-
}
|
|
356
|
-
const stream = incoming;
|
|
357
|
-
const status = typeof stream.statusCode === 'number' &&
|
|
358
|
-
Number.isFinite(stream.statusCode) &&
|
|
359
|
-
stream.statusCode >= 100 &&
|
|
360
|
-
stream.statusCode <= 599
|
|
361
|
-
? stream.statusCode
|
|
362
|
-
: 500;
|
|
363
|
-
const headers = {};
|
|
364
|
-
if (stream.headers && typeof stream.headers === 'object') {
|
|
365
|
-
const input = stream.headers;
|
|
366
|
-
for (const key in input) {
|
|
367
|
-
const value = input[key];
|
|
368
|
-
if (typeof value === 'string') {
|
|
369
|
-
headers[key] = value;
|
|
370
|
-
continue;
|
|
371
|
-
}
|
|
372
|
-
if (Array.isArray(value)) {
|
|
373
|
-
headers[key] = value.join(', ');
|
|
374
|
-
continue;
|
|
375
|
-
}
|
|
376
|
-
if (value !== undefined && value !== null) {
|
|
377
|
-
headers[key] = String(value);
|
|
177
|
+
const req = transport.request(url, {
|
|
178
|
+
method: init.method ?? 'GET',
|
|
179
|
+
headers: init.headers,
|
|
180
|
+
signal: init.signal ?? undefined,
|
|
181
|
+
agent: agent ?? undefined
|
|
182
|
+
}, (res) => {
|
|
183
|
+
const status = res.statusCode ?? 500;
|
|
184
|
+
const headers = {};
|
|
185
|
+
for (const key in res.headers) {
|
|
186
|
+
const value = res.headers[key];
|
|
187
|
+
if (typeof value === 'string') {
|
|
188
|
+
headers[key] = value;
|
|
189
|
+
}
|
|
190
|
+
else if (Array.isArray(value)) {
|
|
191
|
+
headers[key] = value.join(', ');
|
|
192
|
+
}
|
|
378
193
|
}
|
|
194
|
+
resolve({
|
|
195
|
+
status,
|
|
196
|
+
ok: status >= 200 && status < 300,
|
|
197
|
+
headers,
|
|
198
|
+
body: res,
|
|
199
|
+
cancel: async () => {
|
|
200
|
+
res.destroy();
|
|
201
|
+
}
|
|
202
|
+
});
|
|
203
|
+
});
|
|
204
|
+
req.on('error', (error) => reject((0, primitives_1.toError)(error)));
|
|
205
|
+
const body = init.body;
|
|
206
|
+
if (body instanceof Uint8Array) {
|
|
207
|
+
req.end(body);
|
|
379
208
|
}
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
ok: status >= 200 && status < 300,
|
|
384
|
-
headers,
|
|
385
|
-
body: stream,
|
|
386
|
-
cancel: async () => {
|
|
387
|
-
stream.destroy();
|
|
209
|
+
else if (body) {
|
|
210
|
+
body.on('error', (err) => req.destroy((0, primitives_1.toError)(err)));
|
|
211
|
+
body.pipe(req);
|
|
388
212
|
}
|
|
389
|
-
|
|
213
|
+
else {
|
|
214
|
+
req.end();
|
|
215
|
+
}
|
|
216
|
+
});
|
|
390
217
|
}
|
|
391
218
|
resolveTransferRequest(request, extraHeaders) {
|
|
392
219
|
const headers = { ...this.defaultHeaders };
|
package/dist/media/constants.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.MEDIA_UPLOAD_PATHS = exports.HMAC_TRUNCATED_SIZE = exports.MAC_KEY_END = exports.MAC_KEY_START = exports.ENC_KEY_END = exports.ENC_KEY_START = exports.IV_SIZE = exports.MEDIA_HKDF_SIZE = exports.MEDIA_CONN_CACHE_GRACE_MS = exports.DEFAULT_MEDIA_HOSTS = void 0;
|
|
3
|
+
exports.MEDIA_UPLOAD_PATHS = exports.SIDECAR_HMAC_SIZE = exports.SIDECAR_CHUNK_SIZE = exports.HMAC_TRUNCATED_SIZE = exports.MAC_KEY_END = exports.MAC_KEY_START = exports.ENC_KEY_END = exports.ENC_KEY_START = exports.IV_SIZE = exports.MEDIA_HKDF_SIZE = exports.MEDIA_CONN_CACHE_GRACE_MS = exports.DEFAULT_MEDIA_HOSTS = void 0;
|
|
4
4
|
exports.DEFAULT_MEDIA_HOSTS = Object.freeze([
|
|
5
5
|
'mmg.whatsapp.net',
|
|
6
6
|
'mmg-fallback.whatsapp.net'
|
|
@@ -13,6 +13,8 @@ exports.ENC_KEY_END = 48;
|
|
|
13
13
|
exports.MAC_KEY_START = 48;
|
|
14
14
|
exports.MAC_KEY_END = 80;
|
|
15
15
|
exports.HMAC_TRUNCATED_SIZE = 10;
|
|
16
|
+
exports.SIDECAR_CHUNK_SIZE = 65536;
|
|
17
|
+
exports.SIDECAR_HMAC_SIZE = 10;
|
|
16
18
|
exports.MEDIA_UPLOAD_PATHS = Object.freeze({
|
|
17
19
|
image: '/mms/image',
|
|
18
20
|
video: '/mms/video',
|
|
@@ -4,8 +4,14 @@ exports.shouldUseAddonAdditionalData = shouldUseAddonAdditionalData;
|
|
|
4
4
|
exports.buildAddonAdditionalData = buildAddonAdditionalData;
|
|
5
5
|
exports.encryptAddonPayload = encryptAddonPayload;
|
|
6
6
|
exports.decryptAddonPayload = decryptAddonPayload;
|
|
7
|
+
exports.identifyEncryptedAddon = identifyEncryptedAddon;
|
|
8
|
+
exports.decodeAddonPlaintext = decodeAddonPlaintext;
|
|
9
|
+
exports.resolveParentMessageSecret = resolveParentMessageSecret;
|
|
10
|
+
exports.resolvePollOptionNames = resolvePollOptionNames;
|
|
7
11
|
const _crypto_1 = require("../crypto/index.js");
|
|
12
|
+
const content_1 = require("./content");
|
|
8
13
|
const use_case_secret_1 = require("./use-case-secret");
|
|
14
|
+
const _proto_1 = require("../proto.js");
|
|
9
15
|
const bytes_1 = require("../util/bytes");
|
|
10
16
|
const WA_ADDON_ENCRYPTION_NONCE_BYTES = 12;
|
|
11
17
|
function shouldUseAddonAdditionalData(modificationType) {
|
|
@@ -47,6 +53,131 @@ async function decryptAddonPayload(input) {
|
|
|
47
53
|
const additionalData = resolveAddonAdditionalData(input);
|
|
48
54
|
return (0, _crypto_1.aesGcmDecrypt)(key, iv, (0, bytes_1.toBytesView)(input.ciphertext), additionalData);
|
|
49
55
|
}
|
|
56
|
+
function identifyEncryptedAddon(message) {
|
|
57
|
+
const msg = (0, content_1.unwrapMessage)(message);
|
|
58
|
+
if (msg.encReactionMessage) {
|
|
59
|
+
const { targetMessageKey, encPayload, encIv } = msg.encReactionMessage;
|
|
60
|
+
if (targetMessageKey && encPayload && encIv) {
|
|
61
|
+
return {
|
|
62
|
+
kind: 'reaction',
|
|
63
|
+
targetMessageKey,
|
|
64
|
+
encPayload: encPayload,
|
|
65
|
+
encIv: encIv,
|
|
66
|
+
modificationType: use_case_secret_1.WA_USE_CASE_SECRET_MODIFICATION_TYPES.ENC_REACTION,
|
|
67
|
+
raw: message
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
if (msg.pollUpdateMessage) {
|
|
72
|
+
const { pollCreationMessageKey, vote } = msg.pollUpdateMessage;
|
|
73
|
+
if (pollCreationMessageKey && vote?.encPayload && vote.encIv) {
|
|
74
|
+
return {
|
|
75
|
+
kind: 'poll_vote',
|
|
76
|
+
targetMessageKey: pollCreationMessageKey,
|
|
77
|
+
encPayload: vote.encPayload,
|
|
78
|
+
encIv: vote.encIv,
|
|
79
|
+
modificationType: use_case_secret_1.WA_USE_CASE_SECRET_MODIFICATION_TYPES.POLL_VOTE,
|
|
80
|
+
raw: message
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
if (msg.encEventResponseMessage) {
|
|
85
|
+
const { eventCreationMessageKey, encPayload, encIv } = msg.encEventResponseMessage;
|
|
86
|
+
if (eventCreationMessageKey && encPayload && encIv) {
|
|
87
|
+
return {
|
|
88
|
+
kind: 'event_response',
|
|
89
|
+
targetMessageKey: eventCreationMessageKey,
|
|
90
|
+
encPayload: encPayload,
|
|
91
|
+
encIv: encIv,
|
|
92
|
+
modificationType: use_case_secret_1.WA_USE_CASE_SECRET_MODIFICATION_TYPES.EVENT_RESPONSE,
|
|
93
|
+
raw: message
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
if (msg.encCommentMessage) {
|
|
98
|
+
const { targetMessageKey, encPayload, encIv } = msg.encCommentMessage;
|
|
99
|
+
if (targetMessageKey && encPayload && encIv) {
|
|
100
|
+
return {
|
|
101
|
+
kind: 'comment',
|
|
102
|
+
targetMessageKey,
|
|
103
|
+
encPayload: encPayload,
|
|
104
|
+
encIv: encIv,
|
|
105
|
+
modificationType: use_case_secret_1.WA_USE_CASE_SECRET_MODIFICATION_TYPES.ENC_COMMENT,
|
|
106
|
+
raw: message
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return null;
|
|
111
|
+
}
|
|
112
|
+
function decodeAddonPlaintext(kind, plaintext) {
|
|
113
|
+
switch (kind) {
|
|
114
|
+
case 'reaction':
|
|
115
|
+
return { kind, reaction: _proto_1.proto.Message.ReactionMessage.decode(plaintext) };
|
|
116
|
+
case 'poll_vote':
|
|
117
|
+
return {
|
|
118
|
+
kind,
|
|
119
|
+
pollVote: _proto_1.proto.Message.PollVoteMessage.decode(plaintext),
|
|
120
|
+
selectedOptionNames: null
|
|
121
|
+
};
|
|
122
|
+
case 'event_response':
|
|
123
|
+
return { kind, eventResponse: _proto_1.proto.Message.EventResponseMessage.decode(plaintext) };
|
|
124
|
+
case 'comment':
|
|
125
|
+
return { kind, comment: _proto_1.proto.Message.CommentMessage.decode(plaintext) };
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
async function resolveParentMessageSecret(targetMessageId, messageSecretStore, messageStore) {
|
|
129
|
+
const cached = await messageSecretStore.get(targetMessageId);
|
|
130
|
+
if (cached)
|
|
131
|
+
return cached;
|
|
132
|
+
const record = await messageStore.getById(targetMessageId);
|
|
133
|
+
if (!record?.messageBytes)
|
|
134
|
+
return null;
|
|
135
|
+
try {
|
|
136
|
+
const decoded = _proto_1.proto.Message.decode(record.messageBytes);
|
|
137
|
+
const secret = decoded.messageContextInfo?.messageSecret;
|
|
138
|
+
if (!secret || secret.byteLength !== use_case_secret_1.WA_MESSAGE_SECRET_BYTES)
|
|
139
|
+
return null;
|
|
140
|
+
return { secret, senderJid: record.senderJid ?? '' };
|
|
141
|
+
}
|
|
142
|
+
catch {
|
|
143
|
+
return null;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
async function resolvePollOptionNames(selectedOptions, pollCreationMessageId, messageStore) {
|
|
147
|
+
const record = await messageStore.getById(pollCreationMessageId);
|
|
148
|
+
if (!record?.messageBytes)
|
|
149
|
+
return null;
|
|
150
|
+
let decoded;
|
|
151
|
+
try {
|
|
152
|
+
decoded = _proto_1.proto.Message.decode(record.messageBytes);
|
|
153
|
+
}
|
|
154
|
+
catch {
|
|
155
|
+
return null;
|
|
156
|
+
}
|
|
157
|
+
const pollMsg = (0, content_1.unwrapMessage)(decoded);
|
|
158
|
+
const options = pollMsg.pollCreationMessage?.options ??
|
|
159
|
+
pollMsg.pollCreationMessageV2?.options ??
|
|
160
|
+
pollMsg.pollCreationMessageV3?.options ??
|
|
161
|
+
pollMsg.pollCreationMessageV5?.options;
|
|
162
|
+
if (!options || options.length === 0)
|
|
163
|
+
return null;
|
|
164
|
+
const hashToName = new Map();
|
|
165
|
+
for (const option of options) {
|
|
166
|
+
if (!option.optionName)
|
|
167
|
+
continue;
|
|
168
|
+
const hash = await (0, _crypto_1.sha256)(bytes_1.TEXT_ENCODER.encode(option.optionName));
|
|
169
|
+
hashToName.set((0, bytes_1.bytesToHex)(hash), option.optionName);
|
|
170
|
+
}
|
|
171
|
+
const names = [];
|
|
172
|
+
for (const selected of selectedOptions) {
|
|
173
|
+
const hex = (0, bytes_1.bytesToHex)(selected);
|
|
174
|
+
const name = hashToName.get(hex);
|
|
175
|
+
if (!name)
|
|
176
|
+
return null;
|
|
177
|
+
names.push(name);
|
|
178
|
+
}
|
|
179
|
+
return names;
|
|
180
|
+
}
|
|
50
181
|
function assertAddonIv(iv) {
|
|
51
182
|
const normalized = (0, bytes_1.toBytesView)(iv);
|
|
52
183
|
if (normalized.byteLength !== WA_ADDON_ENCRYPTION_NONCE_BYTES) {
|
package/dist/message/content.js
CHANGED
|
@@ -1,18 +1,16 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.isSendMediaMessage = isSendMediaMessage;
|
|
4
|
+
exports.unwrapMessage = unwrapMessage;
|
|
4
5
|
exports.resolveMessageTypeAttr = resolveMessageTypeAttr;
|
|
6
|
+
exports.needsSecretPersistence = needsSecretPersistence;
|
|
5
7
|
exports.resolveEditAttr = resolveEditAttr;
|
|
6
8
|
exports.resolveEncMediaType = resolveEncMediaType;
|
|
7
9
|
exports.resolveMetaAttrs = resolveMetaAttrs;
|
|
8
10
|
const _proto_1 = require("../proto.js");
|
|
9
11
|
const constants_1 = require("../protocol/constants");
|
|
10
12
|
function isSendMediaMessage(content) {
|
|
11
|
-
return
|
|
12
|
-
typeof content === 'object' &&
|
|
13
|
-
'type' in content &&
|
|
14
|
-
'media' in content &&
|
|
15
|
-
'mimetype' in content);
|
|
13
|
+
return !!content && typeof content === 'object' && 'type' in content && 'media' in content;
|
|
16
14
|
}
|
|
17
15
|
function unwrapMessage(message) {
|
|
18
16
|
let msg = message;
|
|
@@ -77,6 +75,16 @@ function resolveMessageTypeAttr(message) {
|
|
|
77
75
|
return constants_1.WA_STANZA_MSG_TYPES.MEDIA;
|
|
78
76
|
}
|
|
79
77
|
const REVOKED_REACTION_TEXT = '';
|
|
78
|
+
function needsSecretPersistence(message) {
|
|
79
|
+
const msg = unwrapMessage(message);
|
|
80
|
+
return !!(msg.pollCreationMessage ||
|
|
81
|
+
msg.pollCreationMessageV2 ||
|
|
82
|
+
msg.pollCreationMessageV3 ||
|
|
83
|
+
msg.pollCreationMessageV4 ||
|
|
84
|
+
msg.pollCreationMessageV5 ||
|
|
85
|
+
msg.pollCreationMessageV6 ||
|
|
86
|
+
msg.eventMessage);
|
|
87
|
+
}
|
|
80
88
|
function resolveEditAttr(message, subtype) {
|
|
81
89
|
const msg = unwrapMessage(message);
|
|
82
90
|
if (msg.protocolMessage) {
|
package/dist/message/icdc.js
CHANGED
|
@@ -6,13 +6,13 @@ exports.injectDeviceListMetadata = injectDeviceListMetadata;
|
|
|
6
6
|
const _crypto_1 = require("../crypto/index.js");
|
|
7
7
|
const jid_1 = require("../protocol/jid");
|
|
8
8
|
const bytes_1 = require("../util/bytes");
|
|
9
|
-
const
|
|
9
|
+
const ICDC_DEFAULT_HASH_LENGTH = 8;
|
|
10
10
|
const ICDC_FRESHNESS_THRESHOLD_MS = 30 * 24 * 60 * 60 * 1000;
|
|
11
11
|
const DEVICE_LIST_METADATA_VERSION = 2;
|
|
12
|
-
|
|
13
|
-
|
|
12
|
+
async function computeDeviceKeyHash(identityKeys, hashLength) {
|
|
13
|
+
const length = hashLength ?? ICDC_DEFAULT_HASH_LENGTH;
|
|
14
14
|
if (identityKeys.length === 0) {
|
|
15
|
-
return
|
|
15
|
+
return new Uint8Array(length);
|
|
16
16
|
}
|
|
17
17
|
const rawKeys = new Array(identityKeys.length);
|
|
18
18
|
for (let i = 0; i < identityKeys.length; i += 1) {
|
|
@@ -21,9 +21,9 @@ async function computeDeviceKeyHash(identityKeys) {
|
|
|
21
21
|
}
|
|
22
22
|
const combined = (0, bytes_1.concatBytes)(rawKeys);
|
|
23
23
|
const hash = await (0, _crypto_1.sha256)(combined);
|
|
24
|
-
return hash.subarray(0,
|
|
24
|
+
return hash.subarray(0, length);
|
|
25
25
|
}
|
|
26
|
-
async function resolveIcdcMeta(deviceJids,
|
|
26
|
+
async function resolveIcdcMeta(deviceJids, identityStore, updatedAtMs, localIdentity, hashLength) {
|
|
27
27
|
if (deviceJids.length === 0) {
|
|
28
28
|
return null;
|
|
29
29
|
}
|
|
@@ -31,7 +31,7 @@ async function resolveIcdcMeta(deviceJids, signalStore, updatedAtMs, localIdenti
|
|
|
31
31
|
for (let i = 0; i < deviceJids.length; i += 1) {
|
|
32
32
|
addresses[i] = (0, jid_1.parseSignalAddressFromJid)(deviceJids[i]);
|
|
33
33
|
}
|
|
34
|
-
const remoteKeys = await
|
|
34
|
+
const remoteKeys = await identityStore.getRemoteIdentities(addresses);
|
|
35
35
|
const keys = [];
|
|
36
36
|
for (let i = 0; i < addresses.length; i += 1) {
|
|
37
37
|
const key = remoteKeys[i];
|
|
@@ -47,7 +47,7 @@ async function resolveIcdcMeta(deviceJids, signalStore, updatedAtMs, localIdenti
|
|
|
47
47
|
if (keys.length === 0) {
|
|
48
48
|
return null;
|
|
49
49
|
}
|
|
50
|
-
const keyHash = await computeDeviceKeyHash(keys);
|
|
50
|
+
const keyHash = await computeDeviceKeyHash(keys, hashLength);
|
|
51
51
|
const timestamp = updatedAtMs !== undefined && Date.now() - updatedAtMs < ICDC_FRESHNESS_THRESHOLD_MS
|
|
52
52
|
? Math.floor(updatedAtMs / 1000)
|
|
53
53
|
: undefined;
|
package/dist/message/incoming.js
CHANGED
|
@@ -51,14 +51,6 @@ function buildIncomingEventRawNode(node) {
|
|
|
51
51
|
content: children
|
|
52
52
|
};
|
|
53
53
|
}
|
|
54
|
-
function buildBaseIncomingEvent(node) {
|
|
55
|
-
return {
|
|
56
|
-
rawNode: buildIncomingEventRawNode(node),
|
|
57
|
-
stanzaId: node.attrs.id,
|
|
58
|
-
chatJid: node.attrs.from,
|
|
59
|
-
stanzaType: node.attrs.type
|
|
60
|
-
};
|
|
61
|
-
}
|
|
62
54
|
function pickSenderKeyDistributionPayload(message) {
|
|
63
55
|
const direct = pickDirectSenderKeyDistributionPayload(message);
|
|
64
56
|
if (direct) {
|
|
@@ -184,7 +176,10 @@ async function decryptAndProcessEncNode(node, encNode, encType, senderJid, optio
|
|
|
184
176
|
if (shouldEmitIncomingMessage(message)) {
|
|
185
177
|
const chatJid = node.attrs.from;
|
|
186
178
|
options.emitIncomingMessage?.({
|
|
187
|
-
|
|
179
|
+
rawNode: buildIncomingEventRawNode(node),
|
|
180
|
+
stanzaId: node.attrs.id,
|
|
181
|
+
chatJid,
|
|
182
|
+
stanzaType: node.attrs.type,
|
|
188
183
|
timestampSeconds: (0, primitives_1.parseOptionalInt)(node.attrs.t),
|
|
189
184
|
senderJid,
|
|
190
185
|
encryptionType: encType,
|
|
@@ -205,7 +200,10 @@ async function decryptAndProcessEncNode(node, encNode, encType, senderJid, optio
|
|
|
205
200
|
message: (0, primitives_1.toError)(error).message
|
|
206
201
|
});
|
|
207
202
|
options.emitUnhandledStanza?.({
|
|
208
|
-
|
|
203
|
+
rawNode: buildIncomingEventRawNode(node),
|
|
204
|
+
stanzaId: node.attrs.id,
|
|
205
|
+
chatJid: node.attrs.from,
|
|
206
|
+
stanzaType: node.attrs.type,
|
|
209
207
|
reason: `message.decrypt_failed.${encType}`
|
|
210
208
|
});
|
|
211
209
|
return { success: false, encType, error };
|
|
@@ -236,7 +234,10 @@ async function handleIncomingMessageAck(node, options) {
|
|
|
236
234
|
case 'skmsg': {
|
|
237
235
|
if (!senderJid || !node.attrs.from || !options.senderKeyManager) {
|
|
238
236
|
options.emitUnhandledStanza?.({
|
|
239
|
-
|
|
237
|
+
rawNode: buildIncomingEventRawNode(node),
|
|
238
|
+
stanzaId: node.attrs.id,
|
|
239
|
+
chatJid: node.attrs.from,
|
|
240
|
+
stanzaType: node.attrs.type,
|
|
240
241
|
reason: 'message.skmsg.missing_group_context'
|
|
241
242
|
});
|
|
242
243
|
continue;
|
|
@@ -278,7 +279,8 @@ async function handleIncomingMessageAck(node, options) {
|
|
|
278
279
|
});
|
|
279
280
|
}
|
|
280
281
|
if (encCount > 0 && !hasSuccessfulDecrypt && firstDecryptFailure) {
|
|
281
|
-
|
|
282
|
+
await sendRetryReceiptForDecryptFailure(node, options, firstDecryptFailure.error, firstDecryptFailure.encType);
|
|
283
|
+
shouldSendStandardReceipt = false;
|
|
282
284
|
}
|
|
283
285
|
}
|
|
284
286
|
const id = node.attrs.id;
|