zapo-js 0.2.0 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +103 -179
- package/dist/appstate/{WaAppStateCrypto.js → crypto/WaAppStateCrypto.js} +79 -62
- package/dist/appstate/index.js +8 -7
- package/dist/appstate/{encoding.js → parsers/encoding.js} +11 -4
- package/dist/appstate/{WaAppStateSyncResponseParser.js → parsers/response-parser.js} +20 -8
- package/dist/appstate/{WaAppStateSyncClient.js → sync/WaAppStateSyncClient.js} +246 -88
- package/dist/appstate/utils.js +16 -0
- package/dist/appstate-spec.js +89 -0
- package/dist/auth/WaAuthClient.js +117 -13
- package/dist/auth/credentials-flow.js +207 -0
- package/dist/auth/pairing/WaPairingFlow.js +53 -47
- package/dist/auth/pairing/pairing-code-crypto.js +91 -0
- package/dist/client/WaClient.js +369 -460
- package/dist/client/WaClientFactory.js +377 -93
- package/dist/client/connection/WaConnectionManager.js +31 -11
- package/dist/client/coordinators/WaAbPropsCoordinator.js +140 -0
- package/dist/client/coordinators/WaAppStateMutationCoordinator.js +663 -143
- package/dist/client/coordinators/WaBotCoordinator.js +345 -0
- package/dist/client/coordinators/WaBroadcastListCoordinator.js +20 -0
- package/dist/client/coordinators/WaBusinessCoordinator.js +81 -180
- package/dist/client/coordinators/WaEmailCoordinator.js +64 -0
- package/dist/client/coordinators/WaGroupCoordinator.js +529 -52
- package/dist/client/coordinators/WaIncomingNodeCoordinator.js +130 -20
- package/dist/client/coordinators/WaLowLevelCoordinator.js +41 -0
- package/dist/client/coordinators/WaMessageCoordinator.js +365 -0
- package/dist/client/coordinators/WaMessageDispatchCoordinator.js +724 -216
- package/dist/client/coordinators/WaNewsletterCoordinator.js +18 -0
- package/dist/client/coordinators/WaOfflineResumeCoordinator.js +114 -0
- package/dist/client/coordinators/WaPassiveTasksCoordinator.js +53 -22
- package/dist/client/coordinators/WaPresenceCoordinator.js +21 -0
- package/dist/client/coordinators/WaPrivacyCoordinator.js +7 -5
- package/dist/client/coordinators/WaProfileCoordinator.js +223 -50
- package/dist/client/coordinators/WaRetryCoordinator.js +256 -123
- package/dist/client/coordinators/WaStatusCoordinator.js +49 -0
- package/dist/client/coordinators/WaStreamControlCoordinator.js +6 -6
- package/dist/client/coordinators/WaTrustedContactTokenCoordinator.js +29 -10
- package/dist/client/events/abprops.js +43 -0
- package/dist/client/events/appstate-mutation.js +133 -0
- package/dist/client/events/business.js +375 -0
- package/dist/client/events/call.js +58 -0
- package/dist/client/events/chatstate.js +23 -0
- package/dist/client/events/devices.js +15 -16
- package/dist/client/{dirty.js → events/dirty.js} +34 -20
- package/dist/client/events/group.js +13 -24
- package/dist/client/events/identity.js +2 -1
- package/dist/client/events/incoming.js +502 -0
- package/dist/client/events/mex-notification.js +181 -0
- package/dist/client/events/picture.js +33 -0
- package/dist/client/events/presence.js +44 -0
- package/dist/client/events/privacy-token.js +1 -2
- package/dist/client/events/receipt.js +26 -0
- package/dist/client/events/registration.js +42 -0
- package/dist/client/media.js +400 -0
- package/dist/client/messaging/fanout.js +9 -10
- package/dist/client/messaging/{participants.js → group-metadata.js} +73 -35
- package/dist/client/messaging/ignore-key.js +132 -0
- package/dist/client/messaging/key-protocol.js +3 -17
- package/dist/client/messaging/link-preview.js +159 -0
- package/dist/client/messaging/messages.js +671 -0
- package/dist/client/newsletter/admin.js +165 -0
- package/dist/client/newsletter/content.js +253 -0
- package/dist/client/newsletter/discovery.js +115 -0
- package/dist/client/newsletter/messaging.js +197 -0
- package/dist/client/newsletter/mex.js +41 -0
- package/dist/client/newsletter/parse.js +217 -0
- package/dist/client/persistence/WriteBehindPersistence.js +31 -4
- package/dist/client/{history-sync.js → persistence/history-sync.js} +125 -18
- package/dist/client/persistence/mailbox.js +104 -0
- package/dist/client/tokens/cs-token.js +11 -17
- package/dist/crypto/core/hkdf.js +12 -12
- package/dist/crypto/core/index.js +9 -8
- package/dist/crypto/core/keys.js +1 -8
- package/dist/crypto/core/nonce.js +12 -12
- package/dist/crypto/core/primitives.js +123 -93
- package/dist/crypto/core/random.js +9 -9
- package/dist/crypto/core/xeddsa.js +59 -0
- package/dist/crypto/curves/Ed25519.js +32 -21
- package/dist/crypto/curves/X25519.js +71 -17
- package/dist/crypto/curves/constants.js +3 -1
- package/dist/crypto/math/constants.js +1 -2
- package/dist/crypto/math/mod.js +0 -33
- package/dist/esm/appstate/{WaAppStateCrypto.js → crypto/WaAppStateCrypto.js} +72 -55
- package/dist/esm/appstate/index.js +5 -5
- package/dist/esm/appstate/{encoding.js → parsers/encoding.js} +11 -4
- package/dist/esm/appstate/{WaAppStateSyncResponseParser.js → parsers/response-parser.js} +20 -8
- package/dist/esm/appstate/{WaAppStateSyncClient.js → sync/WaAppStateSyncClient.js} +235 -76
- package/dist/esm/appstate/utils.js +16 -0
- package/dist/esm/appstate-spec.js +79 -0
- package/dist/esm/auth/WaAuthClient.js +114 -10
- package/dist/esm/auth/credentials-flow.js +202 -0
- package/dist/esm/auth/pairing/WaPairingFlow.js +52 -46
- package/dist/esm/auth/pairing/pairing-code-crypto.js +85 -0
- package/dist/esm/client/WaClient.js +372 -463
- package/dist/esm/client/WaClientFactory.js +380 -96
- package/dist/esm/client/connection/WaConnectionManager.js +31 -11
- package/dist/esm/client/coordinators/WaAbPropsCoordinator.js +136 -0
- package/dist/esm/client/coordinators/WaAppStateMutationCoordinator.js +665 -145
- package/dist/esm/client/coordinators/WaBotCoordinator.js +342 -0
- package/dist/esm/client/coordinators/WaBroadcastListCoordinator.js +17 -0
- package/dist/esm/client/coordinators/WaBusinessCoordinator.js +78 -177
- package/dist/esm/client/coordinators/WaEmailCoordinator.js +61 -0
- package/dist/esm/client/coordinators/WaGroupCoordinator.js +532 -55
- package/dist/esm/client/coordinators/WaIncomingNodeCoordinator.js +132 -22
- package/dist/esm/client/coordinators/WaLowLevelCoordinator.js +38 -0
- package/dist/esm/client/coordinators/WaMessageCoordinator.js +361 -0
- package/dist/esm/client/coordinators/WaMessageDispatchCoordinator.js +719 -211
- package/dist/esm/client/coordinators/WaNewsletterCoordinator.js +13 -0
- package/dist/esm/client/coordinators/WaOfflineResumeCoordinator.js +110 -0
- package/dist/esm/client/coordinators/WaPassiveTasksCoordinator.js +54 -23
- package/dist/esm/client/coordinators/WaPresenceCoordinator.js +18 -0
- package/dist/esm/client/coordinators/WaPrivacyCoordinator.js +7 -5
- package/dist/esm/client/coordinators/WaProfileCoordinator.js +226 -53
- package/dist/esm/client/coordinators/WaRetryCoordinator.js +258 -125
- package/dist/esm/client/coordinators/WaStatusCoordinator.js +46 -0
- package/dist/esm/client/coordinators/WaStreamControlCoordinator.js +6 -6
- package/dist/esm/client/coordinators/WaTrustedContactTokenCoordinator.js +31 -12
- package/dist/esm/client/events/abprops.js +40 -0
- package/dist/esm/client/events/appstate-mutation.js +130 -0
- package/dist/esm/client/events/business.js +370 -0
- package/dist/esm/client/events/call.js +55 -0
- package/dist/esm/client/events/chatstate.js +20 -0
- package/dist/esm/client/events/devices.js +15 -16
- package/dist/esm/client/{dirty.js → events/dirty.js} +34 -20
- package/dist/esm/client/events/group.js +14 -25
- package/dist/esm/client/events/identity.js +2 -1
- package/dist/esm/client/events/incoming.js +487 -0
- package/dist/esm/client/events/mex-notification.js +178 -0
- package/dist/esm/client/events/picture.js +30 -0
- package/dist/esm/client/events/presence.js +41 -0
- package/dist/esm/client/events/privacy-token.js +1 -2
- package/dist/esm/client/events/receipt.js +23 -0
- package/dist/esm/client/events/registration.js +39 -0
- package/dist/esm/client/media.js +384 -0
- package/dist/esm/client/messaging/fanout.js +10 -11
- package/dist/esm/client/messaging/{participants.js → group-metadata.js} +72 -34
- package/dist/esm/client/messaging/ignore-key.js +126 -0
- package/dist/esm/client/messaging/key-protocol.js +3 -17
- package/dist/esm/client/messaging/link-preview.js +156 -0
- package/dist/esm/client/messaging/messages.js +667 -0
- package/dist/esm/client/newsletter/admin.js +162 -0
- package/dist/esm/client/newsletter/content.js +249 -0
- package/dist/esm/client/newsletter/discovery.js +112 -0
- package/dist/esm/client/newsletter/messaging.js +194 -0
- package/dist/esm/client/newsletter/mex.js +37 -0
- package/dist/esm/client/newsletter/parse.js +200 -0
- package/dist/esm/client/persistence/WriteBehindPersistence.js +31 -4
- package/dist/esm/client/{history-sync.js → persistence/history-sync.js} +124 -18
- package/dist/esm/client/persistence/mailbox.js +101 -0
- package/dist/esm/client/tokens/cs-token.js +12 -18
- package/dist/esm/crypto/core/hkdf.js +14 -14
- package/dist/esm/crypto/core/index.js +3 -2
- package/dist/esm/crypto/core/keys.js +1 -7
- package/dist/esm/crypto/core/nonce.js +11 -11
- package/dist/esm/crypto/core/primitives.js +121 -88
- package/dist/esm/crypto/core/random.js +8 -7
- package/dist/esm/crypto/core/xeddsa.js +55 -0
- package/dist/esm/crypto/curves/Ed25519.js +35 -24
- package/dist/esm/crypto/curves/X25519.js +74 -20
- package/dist/esm/crypto/curves/constants.js +2 -0
- package/dist/esm/crypto/math/constants.js +1 -2
- package/dist/esm/crypto/math/mod.js +0 -32
- package/dist/esm/index.js +7 -2
- package/dist/esm/infra/log/ConsoleLogger.js +30 -6
- package/dist/esm/infra/log/PinoLogger.js +64 -0
- package/dist/esm/infra/log/types.js +4 -2
- package/dist/esm/infra/perf/BackgroundQueue.js +55 -13
- package/dist/esm/infra/perf/StoreLock.js +7 -4
- package/dist/esm/media/constants.js +35 -2
- package/dist/esm/media/crypto/WaMediaCrypto.js +374 -0
- package/dist/esm/media/index.js +4 -3
- package/dist/esm/media/processor.js +1 -0
- package/dist/esm/media/sticker/sticker-pack.js +133 -0
- package/dist/esm/media/{WaMediaTransferClient.js → transfer/WaMediaTransferClient.js} +84 -196
- package/dist/esm/media/{conn.js → transfer/conn.js} +10 -5
- package/dist/esm/message/WaMessageClient.js +46 -15
- package/dist/esm/message/addons/link-preview/builder.js +36 -0
- package/dist/esm/message/addons/link-preview/detect.js +55 -0
- package/dist/esm/message/addons/link-preview/fetcher.js +391 -0
- package/dist/esm/message/addons/link-preview/types.js +1 -0
- package/dist/esm/message/context-info.js +123 -0
- package/dist/esm/message/crypto/addon-crypto.js +244 -0
- package/dist/esm/message/{icdc.js → crypto/icdc.js} +11 -13
- package/dist/esm/message/crypto/phash.js +133 -0
- package/dist/esm/message/{reporting-token.js → crypto/reporting-token.js} +7 -7
- package/dist/esm/message/{use-case-secret.js → crypto/use-case-secret.js} +21 -4
- package/dist/esm/message/{content.js → encode/content.js} +183 -8
- package/dist/esm/message/encode/media-payload.js +42 -0
- package/dist/esm/message/{padding.js → encode/padding.js} +9 -3
- package/dist/esm/message/index.js +2 -2
- package/dist/esm/message/kinds/bot.js +111 -0
- package/dist/esm/message/kinds/newsletter.js +244 -0
- package/dist/esm/message/kinds/sticker-pack.js +29 -0
- package/dist/esm/message/{ack.js → primitives/ack.js} +8 -1
- package/dist/esm/message/primitives/incoming.js +511 -0
- package/dist/esm/message/primitives/peer-data-operation.js +93 -0
- package/dist/esm/mex.js +1 -0
- package/dist/esm/protocol/abprops.js +169 -0
- package/dist/esm/protocol/appstate.js +6 -30
- package/dist/esm/protocol/auth.js +3 -2
- package/dist/esm/protocol/bot.js +77 -0
- package/dist/esm/protocol/browser.js +22 -0
- package/dist/esm/protocol/business.js +19 -0
- package/dist/esm/protocol/call.js +48 -0
- package/dist/esm/protocol/constants.js +10 -2
- package/dist/esm/protocol/defaults.js +3 -0
- package/dist/esm/protocol/email.js +30 -0
- package/dist/esm/protocol/index.js +1 -1
- package/dist/esm/protocol/jid.js +142 -11
- package/dist/esm/protocol/media.js +25 -12
- package/dist/esm/protocol/message.js +4 -1
- package/dist/esm/protocol/newsletter.js +61 -0
- package/dist/esm/protocol/nodes.js +26 -2
- package/dist/esm/protocol/notification.js +24 -2
- package/dist/esm/protocol/presence.js +13 -0
- package/dist/esm/protocol/status.js +6 -0
- package/dist/esm/retry/codec.js +5 -0
- package/dist/esm/retry/parse.js +20 -38
- package/dist/esm/retry/reason.js +6 -1
- package/dist/esm/retry/replay.js +131 -37
- package/dist/esm/retry/tracker.js +4 -8
- package/dist/esm/signal/api/SignalDeviceSyncApi.js +71 -21
- package/dist/esm/signal/api/SignalDigestSyncApi.js +15 -8
- package/dist/esm/signal/api/SignalIdentitySyncApi.js +13 -4
- package/dist/esm/signal/api/SignalMissingPreKeysSyncApi.js +24 -63
- package/dist/esm/signal/api/SignalRotateKeyApi.js +10 -0
- package/dist/esm/signal/api/SignalSessionSyncApi.js +23 -51
- package/dist/esm/signal/api/codec.js +52 -1
- package/dist/esm/signal/api/prekeys.js +4 -0
- package/dist/esm/signal/attestation/WaAdvSignature.js +17 -0
- package/dist/esm/signal/{crypto → attestation}/constants.js +0 -4
- package/dist/esm/signal/constants.js +3 -0
- package/dist/esm/signal/encoding.js +6 -332
- package/dist/esm/signal/group/SenderKeyChain.js +20 -35
- package/dist/esm/signal/group/SenderKeyCodec.js +5 -6
- package/dist/esm/signal/group/SenderKeyManager.js +37 -17
- package/dist/esm/signal/group/encoding.js +96 -0
- package/dist/esm/signal/index.js +4 -1
- package/dist/esm/signal/registration/encoding.js +34 -0
- package/dist/esm/signal/registration/keygen.js +12 -3
- package/dist/esm/signal/registration/utils.js +8 -2
- package/dist/esm/signal/session/SignalProtocol.js +129 -26
- package/dist/esm/signal/session/SignalRatchet.js +46 -64
- package/dist/esm/signal/session/SignalSerializer.js +5 -6
- package/dist/esm/signal/session/SignalSession.js +14 -19
- package/dist/esm/signal/session/encoding.js +173 -0
- package/dist/esm/signal/session/resolver.js +144 -35
- package/dist/esm/store/cache/identity.cache.js +75 -0
- package/dist/esm/store/cache/privacy-token.cache.js +57 -0
- package/dist/esm/store/cache/sender-key.cache.js +101 -0
- package/dist/esm/store/cache/session.cache.js +92 -0
- package/dist/esm/store/contracts/group-metadata.store.js +1 -0
- 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 +129 -39
- package/dist/esm/store/index.js +15 -10
- package/dist/esm/store/locks/contact.lock.js +1 -0
- package/dist/esm/store/locks/device-list.lock.js +1 -0
- package/dist/esm/store/locks/group-metadata.lock.js +20 -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/{providers/memory → memory}/appstate.store.js +5 -5
- package/dist/esm/store/memory/auth.store.js +24 -0
- package/dist/esm/store/memory/contact.store.js +79 -0
- package/dist/esm/store/memory/device-list.store.js +103 -0
- package/dist/esm/store/{providers/memory/participants.store.js → memory/group-metadata.store.js} +24 -12
- package/dist/esm/store/memory/identity.store.js +31 -0
- package/dist/esm/store/memory/message-secret.store.js +90 -0
- package/dist/esm/store/{providers/memory → memory}/message.store.js +2 -2
- package/dist/esm/store/memory/pre-key.store.js +97 -0
- package/dist/esm/store/{providers/memory → memory}/privacy-token.store.js +1 -1
- package/dist/esm/store/{providers/memory → memory}/retry.store.js +49 -14
- package/dist/esm/store/{providers/memory → memory}/sender-key.store.js +3 -3
- package/dist/esm/store/memory/session.store.js +45 -0
- package/dist/esm/store/memory/signal.store.js +36 -0
- package/dist/esm/store/{providers/memory → memory}/thread.store.js +2 -2
- package/dist/esm/store/noop.store.js +26 -4
- package/dist/esm/transport/WaComms.js +18 -8
- package/dist/esm/transport/WaWebSocket.js +41 -9
- package/dist/esm/transport/binary/constants.js +10 -4
- package/dist/esm/transport/binary/decoder.js +21 -15
- package/dist/esm/transport/binary/encoder.js +96 -21
- package/dist/esm/transport/binary/tokens.js +12 -12
- package/dist/esm/transport/index.js +7 -0
- package/dist/esm/transport/keepalive/WaKeepAlive.js +35 -12
- package/dist/esm/transport/node/WaMobileTcpSocket.js +120 -0
- package/dist/esm/transport/node/WaNodeOrchestrator.js +26 -13
- package/dist/esm/transport/node/WaNodeTransport.js +13 -0
- package/dist/esm/transport/node/builders/abprops.js +20 -0
- package/dist/esm/transport/node/builders/account-sync.js +7 -15
- package/dist/esm/transport/node/builders/bot.js +38 -0
- package/dist/esm/transport/node/builders/business.js +30 -30
- package/dist/esm/transport/node/builders/chatstate.js +28 -0
- package/dist/esm/transport/node/builders/community.js +53 -0
- package/dist/esm/transport/node/builders/device.js +11 -0
- package/dist/esm/transport/node/builders/email.js +66 -0
- package/dist/esm/transport/node/builders/global.js +1 -1
- package/dist/esm/transport/node/builders/group.js +114 -4
- package/dist/esm/transport/node/builders/media.js +2 -2
- package/dist/esm/transport/node/builders/message.js +83 -49
- package/dist/esm/transport/node/builders/newsletter.js +176 -0
- package/dist/esm/transport/node/builders/offline.js +14 -0
- package/dist/esm/transport/node/builders/passive.js +7 -0
- package/dist/esm/transport/node/builders/prekeys.js +40 -43
- package/dist/esm/transport/node/builders/presence.js +39 -0
- package/dist/esm/transport/node/builders/privacy-token.js +19 -23
- package/dist/esm/transport/node/builders/privacy.js +6 -6
- package/dist/esm/transport/node/builders/profile.js +28 -8
- package/dist/esm/transport/node/builders/retry.js +1 -1
- package/dist/esm/transport/node/builders/tos.js +58 -0
- package/dist/esm/transport/node/builders/usync.js +51 -2
- package/dist/esm/transport/node/helpers.js +27 -1
- package/dist/esm/transport/node/mex/argo-decoder.js +152 -0
- package/dist/esm/transport/node/mex/client.js +105 -0
- package/dist/esm/transport/node/query.js +17 -0
- package/dist/esm/transport/node/usync.js +12 -0
- package/dist/esm/transport/noise/WaClientPayload.js +23 -18
- package/dist/esm/transport/noise/WaFrameCodec.js +2 -2
- package/dist/esm/transport/noise/WaMobileClientPayload.js +58 -0
- package/dist/esm/transport/noise/WaNoiseCert.js +14 -27
- package/dist/esm/transport/noise/WaNoiseHandshake.js +27 -25
- package/dist/esm/transport/noise/WaNoiseSession.js +48 -67
- package/dist/esm/transport/noise/WaNoiseSocket.js +19 -13
- package/dist/esm/transport/noise/constants.js +0 -1
- package/dist/esm/transport/proxy.js +5 -0
- package/dist/esm/transport/stream/parse.js +3 -7
- package/dist/esm/transport/wa-web-version-fetcher.js +91 -0
- package/dist/esm/util/async.js +4 -0
- package/dist/esm/util/bytes.js +37 -2
- package/dist/esm/util/clock.js +15 -0
- package/dist/esm/util/coercion.js +45 -3
- package/dist/esm/util/collections.js +11 -0
- package/dist/esm/util/index.js +2 -2
- package/dist/esm/util/primitives.js +19 -0
- package/dist/esm/util/runtime.js +5 -0
- package/dist/esm/version-spec.js +1 -0
- package/dist/index.js +31 -1
- package/dist/infra/log/ConsoleLogger.js +30 -6
- package/dist/infra/log/PinoLogger.js +64 -0
- package/dist/infra/log/types.js +4 -2
- package/dist/infra/perf/BackgroundQueue.js +55 -13
- package/dist/infra/perf/StoreLock.js +7 -4
- package/dist/media/constants.js +36 -3
- package/dist/media/crypto/WaMediaCrypto.js +378 -0
- package/dist/media/index.js +9 -4
- package/dist/media/processor.js +2 -0
- package/dist/media/sticker/sticker-pack.js +136 -0
- package/dist/media/{WaMediaTransferClient.js → transfer/WaMediaTransferClient.js} +87 -229
- package/dist/media/{conn.js → transfer/conn.js} +10 -5
- package/dist/message/WaMessageClient.js +46 -15
- package/dist/message/addons/link-preview/builder.js +39 -0
- package/dist/message/addons/link-preview/detect.js +58 -0
- package/dist/message/addons/link-preview/fetcher.js +394 -0
- package/dist/message/addons/link-preview/types.js +2 -0
- package/dist/message/context-info.js +129 -0
- package/dist/message/crypto/addon-crypto.js +254 -0
- package/dist/message/{icdc.js → crypto/icdc.js} +11 -13
- package/dist/message/crypto/phash.js +136 -0
- package/dist/message/{reporting-token.js → crypto/reporting-token.js} +7 -7
- package/dist/message/{use-case-secret.js → crypto/use-case-secret.js} +21 -4
- package/dist/message/{content.js → encode/content.js} +200 -7
- package/dist/message/encode/media-payload.js +45 -0
- package/dist/message/{padding.js → encode/padding.js} +9 -3
- package/dist/message/index.js +2 -2
- package/dist/message/kinds/bot.js +120 -0
- package/dist/message/kinds/newsletter.js +248 -0
- package/dist/message/kinds/sticker-pack.js +34 -0
- package/dist/message/{ack.js → primitives/ack.js} +8 -1
- package/dist/message/{incoming.js → primitives/incoming.js} +225 -38
- package/dist/message/primitives/peer-data-operation.js +96 -0
- package/dist/mex.js +6 -0
- package/dist/proto.js +1 -1
- package/dist/protocol/abprops.js +173 -0
- package/dist/protocol/appstate.js +7 -31
- package/dist/protocol/auth.js +3 -2
- package/dist/protocol/bot.js +81 -0
- package/dist/protocol/browser.js +23 -0
- package/dist/protocol/business.js +22 -0
- package/dist/protocol/call.js +51 -0
- package/dist/protocol/constants.js +51 -3
- package/dist/protocol/defaults.js +3 -0
- package/dist/protocol/email.js +33 -0
- package/dist/protocol/index.js +12 -3
- package/dist/protocol/jid.js +148 -11
- package/dist/protocol/media.js +25 -12
- package/dist/protocol/message.js +4 -1
- package/dist/protocol/newsletter.js +64 -0
- package/dist/protocol/nodes.js +26 -2
- package/dist/protocol/notification.js +25 -3
- package/dist/protocol/presence.js +16 -0
- package/dist/protocol/status.js +9 -0
- package/dist/retry/codec.js +5 -0
- package/dist/retry/parse.js +16 -34
- package/dist/retry/reason.js +6 -1
- package/dist/retry/replay.js +129 -35
- package/dist/retry/tracker.js +3 -7
- package/dist/signal/api/SignalDeviceSyncApi.js +69 -19
- package/dist/signal/api/SignalDigestSyncApi.js +14 -7
- package/dist/signal/api/SignalIdentitySyncApi.js +13 -4
- package/dist/signal/api/SignalMissingPreKeysSyncApi.js +21 -60
- package/dist/signal/api/SignalRotateKeyApi.js +10 -0
- package/dist/signal/api/SignalSessionSyncApi.js +20 -48
- package/dist/signal/api/codec.js +52 -0
- package/dist/signal/api/prekeys.js +4 -0
- package/dist/signal/attestation/WaAdvSignature.js +26 -0
- package/dist/signal/{crypto → attestation}/constants.js +1 -5
- package/dist/signal/constants.js +4 -1
- package/dist/signal/encoding.js +5 -341
- package/dist/signal/group/SenderKeyChain.js +19 -34
- package/dist/signal/group/SenderKeyCodec.js +4 -5
- package/dist/signal/group/SenderKeyManager.js +36 -16
- package/dist/signal/group/encoding.js +101 -0
- package/dist/signal/index.js +13 -10
- package/dist/signal/registration/encoding.js +39 -0
- package/dist/signal/registration/keygen.js +11 -2
- package/dist/signal/registration/utils.js +8 -2
- package/dist/signal/session/SignalProtocol.js +128 -25
- package/dist/signal/session/SignalRatchet.js +41 -60
- package/dist/signal/session/SignalSerializer.js +5 -6
- package/dist/signal/session/SignalSession.js +13 -19
- package/dist/signal/session/encoding.js +183 -0
- package/dist/signal/session/resolver.js +144 -35
- package/dist/store/cache/identity.cache.js +78 -0
- package/dist/store/cache/privacy-token.cache.js +60 -0
- package/dist/store/cache/sender-key.cache.js +104 -0
- package/dist/store/cache/session.cache.js +95 -0
- package/dist/store/contracts/group-metadata.store.js +2 -0
- 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 +128 -38
- package/dist/store/index.js +22 -12
- package/dist/store/locks/contact.lock.js +1 -0
- package/dist/store/locks/device-list.lock.js +1 -0
- package/dist/store/locks/group-metadata.lock.js +23 -0
- 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/{providers/memory → memory}/appstate.store.js +5 -5
- package/dist/store/memory/auth.store.js +28 -0
- package/dist/store/memory/contact.store.js +83 -0
- package/dist/store/memory/device-list.store.js +107 -0
- package/dist/store/{providers/memory/participants.store.js → memory/group-metadata.store.js} +26 -14
- package/dist/store/memory/identity.store.js +35 -0
- package/dist/store/memory/message-secret.store.js +94 -0
- package/dist/store/{providers/memory → memory}/message.store.js +2 -2
- package/dist/store/memory/pre-key.store.js +101 -0
- package/dist/store/{providers/memory → memory}/privacy-token.store.js +1 -1
- package/dist/store/{providers/memory → memory}/retry.store.js +49 -14
- package/dist/store/{providers/memory → memory}/sender-key.store.js +3 -3
- package/dist/store/memory/session.store.js +49 -0
- package/dist/store/memory/signal.store.js +40 -0
- package/dist/store/{providers/memory → memory}/thread.store.js +2 -2
- package/dist/store/noop.store.js +27 -5
- package/dist/transport/WaComms.js +18 -8
- package/dist/transport/WaWebSocket.js +41 -9
- package/dist/transport/binary/constants.js +11 -5
- package/dist/transport/binary/decoder.js +24 -18
- package/dist/transport/binary/encoder.js +109 -34
- package/dist/transport/binary/tokens.js +12 -12
- package/dist/transport/index.js +19 -1
- package/dist/transport/keepalive/WaKeepAlive.js +35 -12
- package/dist/transport/node/WaMobileTcpSocket.js +124 -0
- package/dist/transport/node/WaNodeOrchestrator.js +25 -12
- package/dist/transport/node/WaNodeTransport.js +13 -0
- package/dist/transport/node/builders/abprops.js +23 -0
- package/dist/transport/node/builders/account-sync.js +7 -16
- package/dist/transport/node/builders/bot.js +43 -0
- package/dist/transport/node/builders/business.js +31 -31
- package/dist/transport/node/builders/chatstate.js +31 -0
- package/dist/transport/node/builders/community.js +59 -0
- package/dist/transport/node/builders/device.js +14 -0
- package/dist/transport/node/builders/email.js +73 -0
- package/dist/transport/node/builders/global.js +1 -1
- package/dist/transport/node/builders/group.js +121 -3
- package/dist/transport/node/builders/media.js +1 -1
- package/dist/transport/node/builders/message.js +84 -49
- package/dist/transport/node/builders/newsletter.js +183 -0
- package/dist/transport/node/builders/offline.js +17 -0
- package/dist/transport/node/builders/passive.js +10 -0
- package/dist/transport/node/builders/prekeys.js +38 -41
- package/dist/transport/node/builders/presence.js +43 -0
- package/dist/transport/node/builders/privacy-token.js +18 -22
- package/dist/transport/node/builders/privacy.js +5 -5
- package/dist/transport/node/builders/profile.js +30 -7
- package/dist/transport/node/builders/retry.js +1 -1
- package/dist/transport/node/builders/tos.js +63 -0
- package/dist/transport/node/builders/usync.js +52 -1
- package/dist/transport/node/helpers.js +28 -1
- package/dist/transport/node/mex/argo-decoder.js +189 -0
- package/dist/transport/node/mex/client.js +109 -0
- package/dist/transport/node/query.js +17 -0
- package/dist/transport/node/usync.js +13 -0
- package/dist/transport/noise/WaClientPayload.js +22 -17
- package/dist/transport/noise/WaFrameCodec.js +1 -1
- package/dist/transport/noise/WaMobileClientPayload.js +61 -0
- package/dist/transport/noise/WaNoiseCert.js +13 -26
- package/dist/transport/noise/WaNoiseHandshake.js +25 -23
- package/dist/transport/noise/WaNoiseSession.js +47 -66
- package/dist/transport/noise/WaNoiseSocket.js +18 -12
- package/dist/transport/noise/constants.js +1 -2
- package/dist/transport/proxy.js +5 -0
- package/dist/transport/stream/parse.js +3 -7
- package/dist/transport/wa-web-version-fetcher.js +94 -0
- package/dist/types/appstate/constants.d.ts +1 -1
- package/dist/types/appstate/{WaAppStateCrypto.d.ts → crypto/WaAppStateCrypto.d.ts} +29 -9
- package/dist/types/appstate/index.d.ts +5 -5
- package/dist/types/appstate/{encoding.d.ts → parsers/encoding.d.ts} +8 -1
- package/dist/types/appstate/{WaAppStateSyncResponseParser.d.ts → parsers/response-parser.d.ts} +13 -3
- package/dist/types/appstate/sync/WaAppStateSyncClient.d.ts +105 -0
- package/dist/types/appstate/types.d.ts +1 -1
- package/dist/types/appstate/utils.d.ts +17 -1
- package/dist/types/appstate-spec.d.ts +24 -0
- package/dist/types/auth/WaAuthClient.d.ts +95 -3
- package/dist/types/auth/credentials-flow.d.ts +21 -0
- package/dist/types/auth/pairing/WaPairingFlow.d.ts +3 -2
- package/dist/types/auth/pairing/{WaPairingCodeCrypto.d.ts → pairing-code-crypto.d.ts} +5 -1
- package/dist/types/auth/types.d.ts +88 -1
- package/dist/types/client/WaClient.d.ts +183 -65
- package/dist/types/client/WaClientFactory.d.ts +40 -9
- package/dist/types/client/connection/WaConnectionManager.d.ts +4 -2
- package/dist/types/client/connection/WaReceiptQueue.d.ts +1 -1
- package/dist/types/client/coordinators/WaAbPropsCoordinator.d.ts +26 -0
- package/dist/types/client/coordinators/WaAppStateMutationCoordinator.d.ts +215 -5
- package/dist/types/client/coordinators/WaBotCoordinator.d.ts +117 -0
- package/dist/types/client/coordinators/WaBroadcastListCoordinator.d.ts +39 -0
- package/dist/types/client/coordinators/WaBusinessCoordinator.d.ts +45 -44
- package/dist/types/client/coordinators/WaEmailCoordinator.d.ts +40 -0
- package/dist/types/client/coordinators/WaGroupCoordinator.d.ts +311 -9
- package/dist/types/client/coordinators/WaIncomingNodeCoordinator.d.ts +16 -4
- package/dist/types/client/coordinators/WaLowLevelCoordinator.d.ts +47 -0
- package/dist/types/client/coordinators/WaMessageCoordinator.d.ts +232 -0
- package/dist/types/client/coordinators/WaMessageDispatchCoordinator.d.ts +65 -29
- package/dist/types/client/coordinators/WaNewsletterCoordinator.d.ts +13 -0
- package/dist/types/client/coordinators/WaOfflineResumeCoordinator.d.ts +31 -0
- package/dist/types/client/coordinators/WaPassiveTasksCoordinator.d.ts +15 -3
- package/dist/types/client/coordinators/WaPresenceCoordinator.d.ts +27 -0
- package/dist/types/client/coordinators/WaPrivacyCoordinator.d.ts +28 -1
- package/dist/types/client/coordinators/WaProfileCoordinator.d.ts +117 -2
- package/dist/types/client/coordinators/WaRetryCoordinator.d.ts +23 -15
- package/dist/types/client/coordinators/WaStatusCoordinator.d.ts +42 -0
- package/dist/types/client/coordinators/WaTrustedContactTokenCoordinator.d.ts +16 -2
- package/dist/types/client/events/abprops.d.ts +15 -0
- package/dist/types/client/events/appstate-mutation.d.ts +3 -0
- package/dist/types/client/events/business.d.ts +10 -0
- package/dist/types/client/events/call.d.ts +31 -0
- package/dist/types/client/events/chatstate.d.ts +9 -0
- package/dist/types/client/events/devices.d.ts +5 -4
- package/dist/types/client/{dirty.d.ts → events/dirty.d.ts} +7 -4
- package/dist/types/client/events/group.d.ts +2 -1
- package/dist/types/client/events/identity.d.ts +2 -1
- package/dist/types/client/events/incoming.d.ts +65 -0
- package/dist/types/client/events/mex-notification.d.ts +6 -0
- package/dist/types/client/events/picture.d.ts +8 -0
- package/dist/types/client/events/presence.d.ts +28 -0
- package/dist/types/client/events/receipt.d.ts +14 -0
- package/dist/types/client/events/registration.d.ts +18 -0
- package/dist/types/client/index.d.ts +1 -1
- package/dist/types/client/media.d.ts +65 -0
- package/dist/types/client/messaging/fanout.d.ts +2 -2
- package/dist/types/client/messaging/group-metadata.d.ts +19 -0
- package/dist/types/client/messaging/ignore-key.d.ts +11 -0
- package/dist/types/client/messaging/key-protocol.d.ts +9 -7
- package/dist/types/client/messaging/link-preview.d.ts +19 -0
- package/dist/types/client/messaging/messages.d.ts +28 -0
- package/dist/types/client/newsletter/admin.d.ts +71 -0
- package/dist/types/client/newsletter/content.d.ts +42 -0
- package/dist/types/client/newsletter/discovery.d.ts +33 -0
- package/dist/types/client/newsletter/messaging.d.ts +66 -0
- package/dist/types/client/newsletter/mex.d.ts +14 -0
- package/dist/types/client/newsletter/parse.d.ts +19 -0
- package/dist/types/client/newsletter/types.d.ts +190 -0
- package/dist/types/client/persistence/WriteBehindPersistence.d.ts +13 -2
- package/dist/types/client/persistence/history-sync.d.ts +29 -0
- package/dist/types/client/persistence/mailbox.d.ts +12 -0
- package/dist/types/client/tokens/cs-token.d.ts +1 -3
- package/dist/types/client/types.d.ts +926 -55
- package/dist/types/crypto/core/hkdf.d.ts +10 -2
- package/dist/types/crypto/core/index.d.ts +3 -2
- package/dist/types/crypto/core/keys.d.ts +0 -4
- package/dist/types/crypto/core/nonce.d.ts +4 -5
- package/dist/types/crypto/core/primitives.d.ts +31 -20
- package/dist/types/crypto/core/random.d.ts +7 -1
- package/dist/types/crypto/core/xeddsa.d.ts +11 -0
- package/dist/types/crypto/curves/Ed25519.d.ts +7 -1
- package/dist/types/crypto/curves/X25519.d.ts +20 -1
- package/dist/types/crypto/curves/constants.d.ts +4 -2
- package/dist/types/crypto/curves/types.d.ts +0 -5
- package/dist/types/crypto/index.d.ts +1 -0
- package/dist/types/crypto/math/constants.d.ts +0 -1
- package/dist/types/crypto/math/mod.d.ts +0 -1
- package/dist/types/index.d.ts +32 -5
- package/dist/types/infra/log/ConsoleLogger.d.ts +19 -2
- package/dist/types/infra/log/PinoLogger.d.ts +56 -2
- package/dist/types/infra/log/types.d.ts +6 -0
- package/dist/types/infra/perf/BackgroundQueue.d.ts +19 -0
- package/dist/types/infra/perf/StoreLock.d.ts +1 -0
- package/dist/types/media/constants.d.ts +9 -2
- package/dist/types/media/crypto/WaMediaCrypto.d.ts +59 -0
- package/dist/types/media/index.d.ts +7 -4
- package/dist/types/media/processor.d.ts +50 -0
- package/dist/types/media/sticker/sticker-pack.d.ts +6 -0
- package/dist/types/media/{WaMediaTransferClient.d.ts → transfer/WaMediaTransferClient.d.ts} +33 -12
- package/dist/types/media/transfer/conn.d.ts +7 -0
- package/dist/types/media/types.d.ts +10 -5
- package/dist/types/message/WaMessageClient.d.ts +14 -0
- package/dist/types/message/addons/link-preview/builder.d.ts +13 -0
- package/dist/types/message/addons/link-preview/detect.d.ts +5 -0
- package/dist/types/message/addons/link-preview/fetcher.d.ts +13 -0
- package/dist/types/message/addons/link-preview/types.d.ts +51 -0
- package/dist/types/message/context-info.d.ts +66 -0
- package/dist/types/message/crypto/addon-crypto.d.ts +78 -0
- package/dist/types/message/{icdc.d.ts → crypto/icdc.d.ts} +6 -6
- package/dist/types/message/{phash.d.ts → crypto/phash.d.ts} +1 -1
- package/dist/types/message/{reporting-token.d.ts → crypto/reporting-token.d.ts} +2 -2
- package/dist/types/message/{use-case-secret.d.ts → crypto/use-case-secret.d.ts} +17 -1
- package/dist/types/message/encode/content.d.ts +43 -0
- package/dist/types/message/{device-sent.d.ts → encode/device-sent.d.ts} +1 -1
- package/dist/types/message/encode/media-payload.d.ts +12 -0
- package/dist/types/message/index.d.ts +2 -2
- package/dist/types/message/kinds/bot.d.ts +31 -0
- package/dist/types/message/kinds/newsletter.d.ts +12 -0
- package/dist/types/message/kinds/sticker-pack.d.ts +6 -0
- package/dist/types/message/{ack.d.ts → primitives/ack.d.ts} +1 -1
- package/dist/types/message/primitives/incoming.d.ts +21 -0
- package/dist/types/message/primitives/peer-data-operation.d.ts +23 -0
- package/dist/types/message/types.d.ts +218 -28
- package/dist/types/mex.d.ts +2 -0
- package/dist/types/proto.d.ts +2 -2
- package/dist/types/protocol/abprops.d.ts +151 -0
- package/dist/types/protocol/appstate.d.ts +4 -49
- package/dist/types/protocol/auth.d.ts +2 -2
- package/dist/types/protocol/bot.d.ts +45 -0
- package/dist/types/protocol/browser.d.ts +9 -0
- package/dist/types/protocol/business.d.ts +21 -0
- package/dist/types/protocol/call.d.ts +44 -0
- package/dist/types/protocol/constants.d.ts +20 -3
- package/dist/types/protocol/defaults.d.ts +3 -0
- package/dist/types/protocol/email.d.ts +32 -0
- package/dist/types/protocol/group.d.ts +1 -1
- package/dist/types/protocol/index.d.ts +2 -1
- package/dist/types/protocol/jid.d.ts +79 -0
- package/dist/types/protocol/media.d.ts +21 -13
- package/dist/types/protocol/message.d.ts +4 -0
- package/dist/types/protocol/newsletter.d.ts +65 -0
- package/dist/types/protocol/nodes.d.ts +24 -0
- package/dist/types/protocol/notification.d.ts +22 -0
- package/dist/types/protocol/presence.d.ts +16 -0
- package/dist/types/protocol/status.d.ts +7 -0
- package/dist/types/protocol/stream.d.ts +1 -0
- package/dist/types/retry/codec.d.ts +5 -0
- package/dist/types/retry/index.d.ts +1 -1
- package/dist/types/retry/parse.d.ts +9 -0
- package/dist/types/retry/reason.d.ts +6 -1
- package/dist/types/retry/replay.d.ts +19 -5
- package/dist/types/retry/tracker.d.ts +10 -3
- package/dist/types/retry/types.d.ts +3 -8
- package/dist/types/signal/api/SignalDeviceSyncApi.d.ts +20 -0
- package/dist/types/signal/api/SignalDigestSyncApi.d.ts +13 -0
- package/dist/types/signal/api/SignalIdentitySyncApi.d.ts +12 -3
- package/dist/types/signal/api/SignalMissingPreKeysSyncApi.d.ts +8 -0
- package/dist/types/signal/api/SignalRotateKeyApi.d.ts +10 -0
- package/dist/types/signal/api/SignalSessionSyncApi.d.ts +13 -0
- package/dist/types/signal/api/codec.d.ts +20 -0
- package/dist/types/signal/api/constants.d.ts +1 -1
- package/dist/types/signal/api/prekeys.d.ts +4 -0
- package/dist/types/signal/{crypto → attestation}/WaAdvSignature.d.ts +2 -4
- package/dist/types/signal/attestation/constants.d.ts +4 -0
- package/dist/types/signal/constants.d.ts +7 -4
- package/dist/types/signal/encoding.d.ts +6 -62
- package/dist/types/signal/group/SenderKeyChain.d.ts +2 -2
- package/dist/types/signal/group/SenderKeyManager.d.ts +24 -2
- package/dist/types/signal/group/encoding.d.ts +25 -0
- package/dist/types/signal/index.d.ts +4 -1
- package/dist/types/signal/registration/encoding.d.ts +30 -0
- package/dist/types/signal/registration/keygen.d.ts +10 -0
- package/dist/types/signal/registration/utils.d.ts +7 -1
- package/dist/types/signal/session/SignalProtocol.d.ts +66 -2
- package/dist/types/signal/session/SignalRatchet.d.ts +2 -3
- package/dist/types/signal/session/SignalSerializer.d.ts +2 -1
- package/dist/types/signal/session/SignalSession.d.ts +0 -1
- package/dist/types/signal/session/encoding.d.ts +28 -0
- package/dist/types/signal/session/resolver.d.ts +18 -2
- package/dist/types/signal/types.d.ts +16 -4
- package/dist/types/store/cache/identity.cache.d.ts +15 -0
- package/dist/types/store/cache/privacy-token.cache.d.ts +15 -0
- package/dist/types/store/cache/sender-key.cache.d.ts +18 -0
- package/dist/types/store/cache/session.cache.d.ts +23 -0
- package/dist/types/store/contracts/contact.store.d.ts +14 -0
- package/dist/types/store/contracts/device-list.store.d.ts +13 -0
- package/dist/types/store/contracts/group-metadata.store.d.ts +14 -0
- 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/message.store.d.ts +0 -2
- 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/createStore.d.ts +54 -2
- package/dist/types/store/index.d.ts +22 -13
- package/dist/types/store/locks/group-metadata.lock.d.ts +2 -0
- 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/{providers/memory → memory}/appstate.store.d.ts +2 -2
- package/dist/types/store/memory/auth.store.d.ts +18 -0
- package/dist/types/store/{providers/memory → memory}/contact.store.d.ts +6 -1
- package/dist/types/store/{providers/memory → memory}/device-list.store.d.ts +15 -2
- package/dist/types/store/memory/group-metadata.store.d.ts +27 -0
- package/dist/types/store/memory/identity.store.d.ts +18 -0
- package/dist/types/store/memory/message-secret.store.d.ts +31 -0
- package/dist/types/store/{providers/memory → memory}/message.store.d.ts +1 -1
- package/dist/types/store/memory/pre-key.store.d.ts +23 -0
- package/dist/types/store/{providers/memory → memory}/privacy-token.store.d.ts +1 -1
- package/dist/types/store/{providers/memory → memory}/retry.store.d.ts +23 -4
- package/dist/types/store/{providers/memory → memory}/sender-key.store.d.ts +2 -2
- package/dist/types/store/memory/session.store.d.ts +21 -0
- package/dist/types/store/memory/signal.store.d.ts +16 -0
- package/dist/types/store/{providers/memory → memory}/thread.store.d.ts +1 -1
- package/dist/types/store/noop.store.d.ts +6 -2
- package/dist/types/store/types.d.ts +271 -7
- package/dist/types/transport/WaComms.d.ts +5 -0
- package/dist/types/transport/WaWebSocket.d.ts +6 -0
- package/dist/types/transport/binary/constants.d.ts +8 -2
- package/dist/types/transport/binary/decoder.d.ts +5 -0
- package/dist/types/transport/binary/encoder.d.ts +5 -0
- package/dist/types/transport/binary/tokens.d.ts +6 -6
- package/dist/types/transport/index.d.ts +9 -0
- package/dist/types/transport/keepalive/WaKeepAlive.d.ts +11 -1
- package/dist/types/transport/node/WaMobileTcpSocket.d.ts +24 -0
- package/dist/types/transport/node/WaNodeOrchestrator.d.ts +11 -2
- package/dist/types/transport/node/WaNodeTransport.d.ts +13 -0
- package/dist/types/transport/node/builders/abprops.d.ts +5 -0
- package/dist/types/transport/node/builders/account-sync.d.ts +1 -2
- package/dist/types/transport/node/builders/bot.d.ts +4 -0
- package/dist/types/transport/node/builders/business.d.ts +21 -4
- package/dist/types/transport/node/builders/chatstate.d.ts +11 -0
- package/dist/types/transport/node/builders/community.d.ts +17 -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/group.d.ts +44 -2
- package/dist/types/transport/node/builders/message.d.ts +11 -6
- package/dist/types/transport/node/builders/newsletter.d.ts +73 -0
- package/dist/types/transport/node/builders/offline.d.ts +2 -0
- package/dist/types/transport/node/builders/passive.d.ts +3 -0
- package/dist/types/transport/node/builders/prekeys.d.ts +4 -3
- package/dist/types/transport/node/builders/presence.d.ts +13 -0
- package/dist/types/transport/node/builders/profile.d.ts +3 -0
- package/dist/types/transport/node/builders/tos.d.ts +12 -0
- package/dist/types/transport/node/builders/usync.d.ts +16 -0
- package/dist/types/transport/node/helpers.d.ts +3 -1
- package/dist/types/transport/node/mex/argo-decoder.d.ts +11 -0
- package/dist/types/transport/node/mex/client.d.ts +29 -0
- package/dist/types/transport/node/query.d.ts +19 -1
- package/dist/types/transport/node/usync.d.ts +3 -0
- package/dist/types/transport/noise/WaMobileClientPayload.d.ts +34 -0
- package/dist/types/transport/noise/WaNoiseCert.d.ts +12 -1
- package/dist/types/transport/noise/WaNoiseHandshake.d.ts +12 -6
- package/dist/types/transport/noise/WaNoiseSession.d.ts +1 -1
- package/dist/types/transport/noise/WaNoiseSocket.d.ts +12 -6
- package/dist/types/transport/noise/constants.d.ts +4 -5
- package/dist/types/transport/proxy.d.ts +5 -0
- package/dist/types/transport/types.d.ts +15 -0
- package/dist/types/transport/wa-web-version-fetcher.d.ts +44 -0
- package/dist/types/util/async.d.ts +4 -0
- package/dist/types/util/bytes.d.ts +36 -1
- package/dist/types/util/clock.d.ts +6 -0
- package/dist/types/util/coercion.d.ts +25 -0
- package/dist/types/util/collections.d.ts +8 -0
- package/dist/types/util/index.d.ts +2 -2
- package/dist/types/util/primitives.d.ts +11 -0
- package/dist/types/util/runtime.d.ts +5 -0
- package/dist/types/version-spec.d.ts +1 -0
- package/dist/util/async.js +4 -0
- package/dist/util/bytes.js +37 -2
- package/dist/util/clock.js +18 -0
- package/dist/util/coercion.js +48 -3
- package/dist/util/collections.js +12 -0
- package/dist/util/index.js +7 -1
- package/dist/util/primitives.js +20 -0
- package/dist/util/runtime.js +5 -0
- package/dist/version-spec.js +5 -0
- package/package.json +37 -11
- package/spec/appstate/index.d.ts +188 -0
- package/spec/appstate/index.js +850 -0
- package/spec/mex/index.d.ts +4172 -0
- package/spec/mex/index.js +261 -0
- package/spec/proto/index.d.ts +16305 -0
- package/spec/proto/index.js +1 -0
- package/spec/version/index.d.ts +4 -0
- package/spec/version/index.js +9 -0
- package/spec/version/version.json +3 -0
- package/dist/auth/flow/WaAuthCredentialsFlow.js +0 -130
- package/dist/auth/pairing/WaPairingCodeCrypto.js +0 -77
- package/dist/auth/pairing/constants.js +0 -5
- package/dist/client/connection/WaKeyShareCoordinator.js +0 -63
- package/dist/client/events/chat.js +0 -227
- package/dist/client/incoming.js +0 -269
- package/dist/client/mailbox.js +0 -50
- package/dist/client/messages.js +0 -228
- package/dist/esm/auth/flow/WaAuthCredentialsFlow.js +0 -125
- package/dist/esm/auth/pairing/WaPairingCodeCrypto.js +0 -73
- package/dist/esm/auth/pairing/constants.js +0 -2
- package/dist/esm/client/connection/WaKeyShareCoordinator.js +0 -59
- package/dist/esm/client/events/chat.js +0 -224
- package/dist/esm/client/incoming.js +0 -260
- package/dist/esm/client/mailbox.js +0 -47
- package/dist/esm/client/messages.js +0 -224
- package/dist/esm/media/WaMediaCrypto.js +0 -304
- package/dist/esm/message/addon-crypto.js +0 -59
- package/dist/esm/message/incoming.js +0 -325
- package/dist/esm/message/phash.js +0 -27
- package/dist/esm/signal/crypto/WaAdvSignature.js +0 -64
- package/dist/esm/store/locks/participants.lock.js +0 -20
- package/dist/esm/store/providers/memory/contact.store.js +0 -28
- package/dist/esm/store/providers/memory/device-list.store.js +0 -64
- package/dist/esm/store/providers/memory/signal.store.js +0 -199
- package/dist/esm/transport/node/builders/index.js +0 -11
- package/dist/media/WaMediaCrypto.js +0 -308
- package/dist/message/addon-crypto.js +0 -65
- package/dist/message/phash.js +0 -30
- package/dist/signal/crypto/WaAdvSignature.js +0 -76
- package/dist/store/locks/participants.lock.js +0 -23
- package/dist/store/providers/memory/contact.store.js +0 -32
- package/dist/store/providers/memory/device-list.store.js +0 -68
- package/dist/store/providers/memory/signal.store.js +0 -203
- package/dist/transport/node/builders/index.js +0 -51
- package/dist/types/appstate/WaAppStateSyncClient.d.ts +0 -66
- 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/client/events/chat.d.ts +0 -3
- package/dist/types/client/history-sync.d.ts +0 -20
- package/dist/types/client/incoming.d.ts +0 -37
- package/dist/types/client/mailbox.d.ts +0 -10
- package/dist/types/client/messages.d.ts +0 -16
- package/dist/types/client/messaging/participants.d.ts +0 -13
- package/dist/types/media/WaMediaCrypto.d.ts +0 -13
- package/dist/types/media/conn.d.ts +0 -3
- package/dist/types/message/addon-crypto.d.ts +0 -25
- package/dist/types/message/content.d.ts +0 -12
- package/dist/types/message/incoming.d.ts +0 -18
- package/dist/types/signal/crypto/constants.d.ts +0 -5
- package/dist/types/store/contracts/participants.store.d.ts +0 -13
- package/dist/types/store/locks/participants.lock.d.ts +0 -2
- package/dist/types/store/providers/memory/participants.store.d.ts +0 -17
- package/dist/types/store/providers/memory/signal.store.d.ts +0 -58
- package/dist/types/transport/node/builders/index.d.ts +0 -11
- package/proto/index.d.ts +0 -10903
- package/proto/index.js +0 -1
- /package/dist/{store/contracts/participants.store.js → client/newsletter/types.js} +0 -0
- /package/dist/esm/{store/contracts/participants.store.js → client/newsletter/types.js} +0 -0
- /package/dist/esm/message/{device-sent.js → encode/device-sent.js} +0 -0
- /package/dist/message/{device-sent.js → encode/device-sent.js} +0 -0
- /package/dist/types/message/{padding.d.ts → encode/padding.d.ts} +0 -0
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.WaAppStateSyncClient =
|
|
4
|
-
const constants_1 = require("
|
|
5
|
-
const WaAppStateCrypto_1 = require("
|
|
6
|
-
const
|
|
7
|
-
const
|
|
8
|
-
const
|
|
9
|
-
const
|
|
10
|
-
const
|
|
11
|
-
const
|
|
12
|
-
const
|
|
13
|
-
const primitives_1 = require("
|
|
3
|
+
exports.WaAppStateSyncClient = void 0;
|
|
4
|
+
const constants_1 = require("../constants");
|
|
5
|
+
const WaAppStateCrypto_1 = require("../crypto/WaAppStateCrypto");
|
|
6
|
+
const response_parser_1 = require("../parsers/response-parser");
|
|
7
|
+
const _crypto_1 = require("../../crypto/index.js");
|
|
8
|
+
const _proto_1 = require("../../proto.js");
|
|
9
|
+
const constants_2 = require("../../protocol/constants");
|
|
10
|
+
const jid_1 = require("../../protocol/jid");
|
|
11
|
+
const query_1 = require("../../transport/node/query");
|
|
12
|
+
const bytes_1 = require("../../util/bytes");
|
|
13
|
+
const primitives_1 = require("../../util/primitives");
|
|
14
14
|
class WaAppStateMissingKeyError extends Error {
|
|
15
15
|
constructor(message, keyId, collection) {
|
|
16
16
|
super(message);
|
|
@@ -19,24 +19,56 @@ class WaAppStateMissingKeyError extends Error {
|
|
|
19
19
|
this.name = 'WaAppStateMissingKeyError';
|
|
20
20
|
}
|
|
21
21
|
}
|
|
22
|
-
|
|
22
|
+
/**
|
|
23
|
+
* App-state synchronization client. Owns the sync key inventory, processes
|
|
24
|
+
* snapshots/patches, encrypts pending mutations, and persists the resulting
|
|
25
|
+
* collection state in the {@link WaAppStateStore}.
|
|
26
|
+
*/
|
|
23
27
|
class WaAppStateSyncClient {
|
|
24
28
|
constructor(options) {
|
|
25
29
|
this.logger = options.logger;
|
|
26
30
|
this.query = options.query;
|
|
27
31
|
this.store = options.store;
|
|
32
|
+
this.serverClock = options.serverClock;
|
|
28
33
|
this.getCurrentMeJid = options.getCurrentMeJid;
|
|
29
34
|
this.hostDomain = options.hostDomain ?? constants_2.WA_DEFAULTS.HOST_DOMAIN;
|
|
30
35
|
this.defaultTimeoutMs = options.defaultTimeoutMs ?? constants_2.WA_DEFAULTS.APP_STATE_SYNC_TIMEOUT_MS;
|
|
31
36
|
this.onMissingKeys = options.onMissingKeys;
|
|
32
|
-
this.
|
|
37
|
+
this.isOwnAccountDevice = options.isOwnAccountDevice;
|
|
38
|
+
this.sendKeyShare = options.sendKeyShare;
|
|
39
|
+
this.triggerSync = options.triggerSync;
|
|
40
|
+
this.crypto = new WaAppStateCrypto_1.WaAppStateCrypto(undefined, options.skipMacVerification === true);
|
|
41
|
+
this.mobilePrimary = options.mobilePrimary ?? false;
|
|
33
42
|
this.syncContext = null;
|
|
34
43
|
this.syncPromise = null;
|
|
35
44
|
}
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
45
|
+
/**
|
|
46
|
+
* Returns the active app-state sync key, generating and persisting a new
|
|
47
|
+
* one when the store is empty (used during initial setup).
|
|
48
|
+
*/
|
|
49
|
+
async ensureInitialSyncKey() {
|
|
50
|
+
const existing = await this.store.getActiveSyncKey();
|
|
51
|
+
if (existing) {
|
|
52
|
+
return existing;
|
|
53
|
+
}
|
|
54
|
+
const keyIdBytes = await (0, _crypto_1.randomBytesAsync)(2);
|
|
55
|
+
const keyData = await (0, _crypto_1.randomBytesAsync)(32);
|
|
56
|
+
const rawId = await (0, _crypto_1.randomIntAsync)(0, 4294967295);
|
|
57
|
+
const key = {
|
|
58
|
+
keyId: keyIdBytes,
|
|
59
|
+
keyData,
|
|
60
|
+
timestamp: this.serverClock.nowMs(),
|
|
61
|
+
fingerprint: { rawId, currentIndex: 0, deviceIndexes: [0] }
|
|
62
|
+
};
|
|
63
|
+
await this.store.upsertSyncKeys([key]);
|
|
64
|
+
this.crypto.clearCache();
|
|
65
|
+
this.logger.info('app-state initial sync key generated (mobile primary)', {
|
|
66
|
+
keyId: (0, bytes_1.bytesToHex)(keyIdBytes),
|
|
67
|
+
rawId
|
|
68
|
+
});
|
|
69
|
+
return key;
|
|
39
70
|
}
|
|
71
|
+
/** Imports peer-shared sync keys into the store; returns the count actually added. */
|
|
40
72
|
async importSyncKeys(keys) {
|
|
41
73
|
this.logger.debug('app-state importing sync keys', { count: keys.length });
|
|
42
74
|
const inserted = await this.store.upsertSyncKeys(keys);
|
|
@@ -46,13 +78,126 @@ class WaAppStateSyncClient {
|
|
|
46
78
|
}
|
|
47
79
|
return inserted;
|
|
48
80
|
}
|
|
81
|
+
/** Handler for `AppStateSyncKeyShare` protocol messages – stores received keys and triggers a sync. */
|
|
82
|
+
async handleIncomingKeyShare(context, protocolMessage) {
|
|
83
|
+
const log = this.logger.child({ id: context.id, from: context.remoteJid });
|
|
84
|
+
const share = protocolMessage.appStateSyncKeyShare;
|
|
85
|
+
if (!share) {
|
|
86
|
+
log.warn('incoming app-state key share protocol message without payload');
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
try {
|
|
90
|
+
const imported = await this.importSyncKeyShare(share);
|
|
91
|
+
log.info('imported app-state sync key share from protocol message', { imported });
|
|
92
|
+
if (imported > 0 && this.triggerSync) {
|
|
93
|
+
void this.triggerSync().catch((error) => {
|
|
94
|
+
log.warn('failed to sync app-state after key share import', {
|
|
95
|
+
message: (0, primitives_1.toError)(error).message
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
catch (error) {
|
|
101
|
+
log.warn('failed to import app-state sync key share from protocol message', {
|
|
102
|
+
message: (0, primitives_1.toError)(error).message
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
/** Handler for `AppStateSyncKeyRequest` protocol messages – replies with the requested keys via `sendKeyShare`. */
|
|
107
|
+
async handleIncomingKeyRequest(context, protocolMessage) {
|
|
108
|
+
const log = this.logger.child({ id: context.id, from: context.remoteJid });
|
|
109
|
+
const request = protocolMessage.appStateSyncKeyRequest;
|
|
110
|
+
if (!request) {
|
|
111
|
+
log.warn('incoming app-state key request protocol message without payload');
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
const senderJid = context.participant ?? context.remoteJid;
|
|
115
|
+
if (!senderJid) {
|
|
116
|
+
log.warn('incoming app-state key request missing sender jid');
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
let requesterDeviceJid;
|
|
120
|
+
try {
|
|
121
|
+
const requesterRaw = (0, jid_1.applyDeviceToJid)(senderJid, context.senderDevice);
|
|
122
|
+
requesterDeviceJid = (0, jid_1.normalizeDeviceJid)(requesterRaw);
|
|
123
|
+
}
|
|
124
|
+
catch (error) {
|
|
125
|
+
log.warn('incoming app-state key request has malformed sender jid', {
|
|
126
|
+
senderJid,
|
|
127
|
+
message: (0, primitives_1.toError)(error).message
|
|
128
|
+
});
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
const deviceLog = log.child({ to: requesterDeviceJid });
|
|
132
|
+
if (this.isOwnAccountDevice && !this.isOwnAccountDevice(requesterDeviceJid)) {
|
|
133
|
+
deviceLog.warn('incoming app-state key request ignored: sender is not own account');
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
const requestedKeyIds = this.extractKeyRequestIds(request);
|
|
137
|
+
if (requestedKeyIds.length === 0) {
|
|
138
|
+
deviceLog.warn('incoming app-state key request has no valid key ids');
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
if (!this.sendKeyShare) {
|
|
142
|
+
deviceLog.warn('incoming app-state key request received but no sendKeyShare wired');
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
const requestedKeys = await this.store.getSyncKeysBatch(requestedKeyIds);
|
|
146
|
+
const availableKeys = [];
|
|
147
|
+
const missingKeyIds = [];
|
|
148
|
+
for (let i = 0; i < requestedKeys.length; i += 1) {
|
|
149
|
+
const key = requestedKeys[i];
|
|
150
|
+
if (key !== null) {
|
|
151
|
+
availableKeys.push(key);
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
missingKeyIds.push(requestedKeyIds[i]);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
try {
|
|
158
|
+
await this.sendKeyShare(requesterDeviceJid, availableKeys, missingKeyIds);
|
|
159
|
+
deviceLog.info('responded to app-state key request', {
|
|
160
|
+
requested: requestedKeyIds.length,
|
|
161
|
+
shared: availableKeys.length,
|
|
162
|
+
missing: missingKeyIds.length
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
catch (error) {
|
|
166
|
+
deviceLog.warn('failed to respond to app-state key request', {
|
|
167
|
+
requested: requestedKeyIds.length,
|
|
168
|
+
shared: availableKeys.length,
|
|
169
|
+
missing: missingKeyIds.length,
|
|
170
|
+
message: (0, primitives_1.toError)(error).message
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
extractKeyRequestIds(request) {
|
|
175
|
+
const deduped = new Map();
|
|
176
|
+
for (const key of request.keyIds ?? []) {
|
|
177
|
+
try {
|
|
178
|
+
const keyId = (0, bytes_1.decodeProtoBytes)(key.keyId, 'appStateSyncKeyRequest.keyIds[].keyId');
|
|
179
|
+
const keyHex = (0, bytes_1.bytesToHex)(keyId);
|
|
180
|
+
if (deduped.has(keyHex)) {
|
|
181
|
+
continue;
|
|
182
|
+
}
|
|
183
|
+
deduped.set(keyHex, keyId);
|
|
184
|
+
}
|
|
185
|
+
catch (error) {
|
|
186
|
+
this.logger.trace('ignoring malformed app-state key id request entry', {
|
|
187
|
+
message: (0, primitives_1.toError)(error).message
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
return [...deduped.values()];
|
|
192
|
+
}
|
|
193
|
+
/** Imports the keys from a decoded `AppStateSyncKeyShare` proto message. */
|
|
49
194
|
async importSyncKeyShare(share) {
|
|
50
195
|
const keys = [];
|
|
51
196
|
for (const item of share.keys ?? []) {
|
|
52
197
|
const keyId = (0, bytes_1.decodeProtoBytes)(item.keyId?.keyId, 'appStateSyncKeyShare.keys[].keyId.keyId');
|
|
53
198
|
if (!item.keyData?.keyData) {
|
|
54
199
|
this.logger.debug('app-state sync key share entry missing key data', {
|
|
55
|
-
keyId: (0,
|
|
200
|
+
keyId: (0, bytes_1.bytesToHex)(keyId)
|
|
56
201
|
});
|
|
57
202
|
continue;
|
|
58
203
|
}
|
|
@@ -61,13 +206,19 @@ class WaAppStateSyncClient {
|
|
|
61
206
|
keyId,
|
|
62
207
|
keyData,
|
|
63
208
|
timestamp: item.keyData?.timestamp === null || item.keyData?.timestamp === undefined
|
|
64
|
-
?
|
|
209
|
+
? this.serverClock.nowMs()
|
|
65
210
|
: this.normalizeProtoLong(item.keyData?.timestamp, 'appStateSyncKeyShare.keys[].keyData.timestamp'),
|
|
66
211
|
fingerprint: item.keyData?.fingerprint ?? undefined
|
|
67
212
|
});
|
|
68
213
|
}
|
|
69
214
|
return this.importSyncKeys(keys);
|
|
70
215
|
}
|
|
216
|
+
/**
|
|
217
|
+
* Runs one app-state sync round across the requested collections,
|
|
218
|
+
* applying any `pendingMutations` and downloading external snapshots
|
|
219
|
+
* via `options.downloadExternalBlob` when present. Concurrent calls
|
|
220
|
+
* share the in-flight promise.
|
|
221
|
+
*/
|
|
71
222
|
async sync(options = {}) {
|
|
72
223
|
if (this.syncPromise) {
|
|
73
224
|
this.logger.debug('app-state sync already in flight, joining existing run');
|
|
@@ -99,7 +250,7 @@ class WaAppStateSyncClient {
|
|
|
99
250
|
for (let index = 0; index < collections.length; index += 1) {
|
|
100
251
|
context.collections.set(collections[index], initialCollectionStates[index]);
|
|
101
252
|
}
|
|
102
|
-
this.logger.
|
|
253
|
+
this.logger.debug('app-state sync start', {
|
|
103
254
|
collections: collections.length,
|
|
104
255
|
pendingMutations: options.pendingMutations?.length ?? 0
|
|
105
256
|
});
|
|
@@ -149,13 +300,13 @@ class WaAppStateSyncClient {
|
|
|
149
300
|
}
|
|
150
301
|
if (stateChanged && context.dirtyCollections.size > 0) {
|
|
151
302
|
await this.persistCollectionUpdates();
|
|
152
|
-
this.logger.
|
|
303
|
+
this.logger.debug('app-state sync persisted updated state');
|
|
153
304
|
}
|
|
154
305
|
const orderedResults = collections.map((collection) => resultMap.get(collection) ?? {
|
|
155
306
|
collection,
|
|
156
307
|
state: constants_2.WA_APP_STATE_COLLECTION_STATES.ERROR_RETRY
|
|
157
308
|
});
|
|
158
|
-
this.logger.
|
|
309
|
+
this.logger.debug('app-state sync finished', {
|
|
159
310
|
collections: orderedResults.length,
|
|
160
311
|
stateChanged
|
|
161
312
|
});
|
|
@@ -220,7 +371,7 @@ class WaAppStateSyncClient {
|
|
|
220
371
|
blockedCollections.push(entry.collection);
|
|
221
372
|
}
|
|
222
373
|
if (entry.missingKeyId) {
|
|
223
|
-
const keyHex = (0,
|
|
374
|
+
const keyHex = (0, bytes_1.bytesToHex)(entry.missingKeyId);
|
|
224
375
|
if (!missingKeyIdHexes.has(keyHex)) {
|
|
225
376
|
missingKeyIdHexes.add(keyHex);
|
|
226
377
|
missingKeyIds.push(entry.missingKeyId);
|
|
@@ -287,7 +438,7 @@ class WaAppStateSyncClient {
|
|
|
287
438
|
content: [
|
|
288
439
|
{
|
|
289
440
|
tag: constants_2.WA_NODE_TAGS.SYNC,
|
|
290
|
-
attrs: {},
|
|
441
|
+
attrs: this.mobilePrimary ? { data_namespace: '3' } : {},
|
|
291
442
|
content: collectionNodes
|
|
292
443
|
}
|
|
293
444
|
]
|
|
@@ -300,7 +451,7 @@ class WaAppStateSyncClient {
|
|
|
300
451
|
type: responseNode.attrs.type
|
|
301
452
|
});
|
|
302
453
|
(0, query_1.assertIqResult)(responseNode, 'app-state sync');
|
|
303
|
-
const payloads = (0,
|
|
454
|
+
const payloads = (0, response_parser_1.parseSyncResponse)(responseNode);
|
|
304
455
|
this.logger.debug('app-state sync payloads parsed', { count: payloads.length });
|
|
305
456
|
const payloadByCollection = new Map();
|
|
306
457
|
for (const payload of payloads) {
|
|
@@ -309,11 +460,12 @@ class WaAppStateSyncClient {
|
|
|
309
460
|
return payloadByCollection;
|
|
310
461
|
}
|
|
311
462
|
async processCollectionRound({ collection, payloadByCollection, pendingByCollection, options, outgoingContexts, skippedUploadCollections }) {
|
|
463
|
+
const collectionLogger = this.logger.child({ collection });
|
|
312
464
|
const payload = payloadByCollection.get(collection);
|
|
313
465
|
let shouldRefetch = false;
|
|
314
466
|
let collectionStateChanged = false;
|
|
315
467
|
if (!payload) {
|
|
316
|
-
|
|
468
|
+
collectionLogger.warn('app-state sync response missing collection payload');
|
|
317
469
|
return this.createCollectionOutcome(collection, constants_2.WA_APP_STATE_COLLECTION_STATES.ERROR_RETRY);
|
|
318
470
|
}
|
|
319
471
|
if (payload.state === constants_2.WA_APP_STATE_COLLECTION_STATES.ERROR_FATAL ||
|
|
@@ -373,8 +525,7 @@ class WaAppStateSyncClient {
|
|
|
373
525
|
payload.state === constants_2.WA_APP_STATE_COLLECTION_STATES.SUCCESS_HAS_MORE ||
|
|
374
526
|
(payload.state === constants_2.WA_APP_STATE_COLLECTION_STATES.SUCCESS &&
|
|
375
527
|
skippedUploadCollections.has(collection));
|
|
376
|
-
|
|
377
|
-
collection: payload.collection,
|
|
528
|
+
collectionLogger.debug('app-state collection processed', {
|
|
378
529
|
state: payload.state,
|
|
379
530
|
version: payload.version,
|
|
380
531
|
appliedMutations: appliedMutations.length
|
|
@@ -383,16 +534,13 @@ class WaAppStateSyncClient {
|
|
|
383
534
|
}
|
|
384
535
|
catch (error) {
|
|
385
536
|
if (error instanceof WaAppStateMissingKeyError) {
|
|
386
|
-
|
|
387
|
-
collection: payload.collection,
|
|
537
|
+
collectionLogger.debug('app-state blocked by missing key', {
|
|
388
538
|
message: error.message
|
|
389
539
|
});
|
|
390
540
|
return this.createCollectionOutcome(collection, constants_2.WA_APP_STATE_COLLECTION_STATES.BLOCKED, payload.version, shouldRefetch, collectionStateChanged, undefined, error.keyId);
|
|
391
541
|
}
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
collection: payload.collection,
|
|
395
|
-
message
|
|
542
|
+
collectionLogger.debug('app-state collection processing failed', {
|
|
543
|
+
message: (0, primitives_1.toError)(error).message
|
|
396
544
|
});
|
|
397
545
|
return this.createCollectionOutcome(collection, constants_2.WA_APP_STATE_COLLECTION_STATES.ERROR_RETRY, payload.version, true, collectionStateChanged);
|
|
398
546
|
}
|
|
@@ -417,12 +565,14 @@ class WaAppStateSyncClient {
|
|
|
417
565
|
if (keyIds.length === 0 || collections.length === 0) {
|
|
418
566
|
return;
|
|
419
567
|
}
|
|
420
|
-
const keyIdsHex = keyIds.map((keyId) => (0,
|
|
421
|
-
this.logger.
|
|
568
|
+
const keyIdsHex = keyIds.map((keyId) => (0, bytes_1.bytesToHex)(keyId));
|
|
569
|
+
const requestLogger = this.logger.child({
|
|
422
570
|
keys: keyIdsHex.length,
|
|
423
|
-
keyIds: keyIdsHex.join(','),
|
|
424
571
|
collections: collections.join(',')
|
|
425
572
|
});
|
|
573
|
+
requestLogger.debug('app-state requesting missing sync keys', {
|
|
574
|
+
keyIds: keyIdsHex.join(',')
|
|
575
|
+
});
|
|
426
576
|
try {
|
|
427
577
|
await input.onMissingKeys({
|
|
428
578
|
keyIds,
|
|
@@ -430,10 +580,8 @@ class WaAppStateSyncClient {
|
|
|
430
580
|
});
|
|
431
581
|
}
|
|
432
582
|
catch (error) {
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
collections: collections.join(','),
|
|
436
|
-
message: error instanceof Error ? error.message : String(error)
|
|
583
|
+
requestLogger.warn('app-state missing key callback failed', {
|
|
584
|
+
message: (0, primitives_1.toError)(error).message
|
|
437
585
|
});
|
|
438
586
|
}
|
|
439
587
|
}
|
|
@@ -456,7 +604,8 @@ class WaAppStateSyncClient {
|
|
|
456
604
|
const decodedMutations = _proto_1.proto.SyncdMutations.decode(patchBytes);
|
|
457
605
|
readyPatch = {
|
|
458
606
|
...readyPatch,
|
|
459
|
-
mutations: decodedMutations.mutations ?? []
|
|
607
|
+
mutations: decodedMutations.mutations ?? [],
|
|
608
|
+
externalMutations: undefined
|
|
460
609
|
};
|
|
461
610
|
}
|
|
462
611
|
return this.validatePatch(payload.collection, readyPatch);
|
|
@@ -466,11 +615,13 @@ class WaAppStateSyncClient {
|
|
|
466
615
|
if (!snapshot.version?.version) {
|
|
467
616
|
throw new Error(`snapshot for ${collection} is missing version`);
|
|
468
617
|
}
|
|
469
|
-
if (!
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
618
|
+
if (!this.crypto.isMacVerificationSkipped) {
|
|
619
|
+
if (!snapshot.mac) {
|
|
620
|
+
throw new Error(`snapshot for ${collection} is missing mac`);
|
|
621
|
+
}
|
|
622
|
+
if (!snapshot.keyId?.id) {
|
|
623
|
+
throw new Error(`snapshot for ${collection} is missing keyId`);
|
|
624
|
+
}
|
|
474
625
|
}
|
|
475
626
|
return snapshot;
|
|
476
627
|
}
|
|
@@ -485,14 +636,16 @@ class WaAppStateSyncClient {
|
|
|
485
636
|
if (!patch.version?.version) {
|
|
486
637
|
throw new Error(`patch for ${collection} is missing version`);
|
|
487
638
|
}
|
|
488
|
-
if (!
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
639
|
+
if (!this.crypto.isMacVerificationSkipped) {
|
|
640
|
+
if (!patch.snapshotMac) {
|
|
641
|
+
throw new Error(`patch for ${collection} is missing snapshotMac`);
|
|
642
|
+
}
|
|
643
|
+
if (!patch.patchMac) {
|
|
644
|
+
throw new Error(`patch for ${collection} is missing patchMac`);
|
|
645
|
+
}
|
|
646
|
+
if (!patch.keyId?.id) {
|
|
647
|
+
throw new Error(`patch for ${collection} is missing keyId`);
|
|
648
|
+
}
|
|
496
649
|
}
|
|
497
650
|
if (patch.mutations && patch.mutations.length > 0 && patch.externalMutations) {
|
|
498
651
|
throw new Error(`patch for ${collection} has inline and external mutations together`);
|
|
@@ -506,16 +659,19 @@ class WaAppStateSyncClient {
|
|
|
506
659
|
}
|
|
507
660
|
async applySnapshot(collection, snapshot) {
|
|
508
661
|
const version = this.normalizeProtoLong(snapshot.version?.version, `snapshot.version.version (${collection})`);
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
662
|
+
let keyData = null;
|
|
663
|
+
if (!this.crypto.isMacVerificationSkipped) {
|
|
664
|
+
const keyId = (0, bytes_1.decodeProtoBytes)(snapshot.keyId?.id, `snapshot.keyId.id (${collection})`);
|
|
665
|
+
keyData = await this.getKeyData(keyId);
|
|
666
|
+
if (!keyData) {
|
|
667
|
+
throw new WaAppStateMissingKeyError(`missing snapshot key ${(0, bytes_1.bytesToHex)(keyId)} for ${collection}`, keyId, collection);
|
|
668
|
+
}
|
|
513
669
|
}
|
|
514
670
|
const indexValueMap = new Map();
|
|
515
671
|
const mutations = [];
|
|
516
672
|
const decryptedRecords = await this.decryptSnapshotRecords(collection, snapshot);
|
|
517
673
|
for (const { decrypted, recordKeyId } of decryptedRecords) {
|
|
518
|
-
const indexMacHex = (0,
|
|
674
|
+
const indexMacHex = (0, bytes_1.bytesToHex)(decrypted.indexMac);
|
|
519
675
|
indexValueMap.set(indexMacHex, decrypted.valueMac);
|
|
520
676
|
mutations.push({
|
|
521
677
|
collection,
|
|
@@ -537,9 +693,11 @@ class WaAppStateSyncClient {
|
|
|
537
693
|
ltHashInputIndex += 1;
|
|
538
694
|
}
|
|
539
695
|
const ltHash = await this.crypto.ltHashAdd(constants_1.APP_STATE_EMPTY_LT_HASH, ltHashInput);
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
696
|
+
if (keyData !== null) {
|
|
697
|
+
const expectedSnapshotMac = await this.crypto.generateSnapshotMac(keyData, ltHash, version, collection);
|
|
698
|
+
if (!(0, bytes_1.uint8TimingSafeEqual)(expectedSnapshotMac, snapshot.mac)) {
|
|
699
|
+
throw new Error(`snapshot MAC mismatch for ${collection}`);
|
|
700
|
+
}
|
|
543
701
|
}
|
|
544
702
|
this.setCollectionState(collection, version, ltHash, indexValueMap);
|
|
545
703
|
return mutations;
|
|
@@ -550,10 +708,13 @@ class WaAppStateSyncClient {
|
|
|
550
708
|
if (current.version !== patchVersion - 1) {
|
|
551
709
|
throw new Error(`patch version mismatch for ${collection}: local=${current.version}, incoming=${patchVersion}`);
|
|
552
710
|
}
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
711
|
+
let patchKeyData = null;
|
|
712
|
+
if (!this.crypto.isMacVerificationSkipped) {
|
|
713
|
+
const patchKeyId = (0, bytes_1.decodeProtoBytes)(patch.keyId?.id, `patch.keyId.id (${collection})`);
|
|
714
|
+
patchKeyData = await this.getKeyData(patchKeyId);
|
|
715
|
+
if (!patchKeyData) {
|
|
716
|
+
throw new WaAppStateMissingKeyError(`missing patch key ${(0, bytes_1.bytesToHex)(patchKeyId)} for ${collection}`, patchKeyId, collection);
|
|
717
|
+
}
|
|
557
718
|
}
|
|
558
719
|
const decryptedMutations = await this.decryptPatchMutations(collection, patch);
|
|
559
720
|
const macMutations = new Array(decryptedMutations.length);
|
|
@@ -568,7 +729,9 @@ class WaAppStateSyncClient {
|
|
|
568
729
|
};
|
|
569
730
|
}
|
|
570
731
|
const nextState = await this.computeNextCollectionState(current.hash, current.indexValueMap, macMutations, collection);
|
|
571
|
-
|
|
732
|
+
if (patchKeyData !== null) {
|
|
733
|
+
await this.assertPatchMacsMatch(patch, collection, patchKeyData, patchVersion, nextState.hash, valueMacs);
|
|
734
|
+
}
|
|
572
735
|
this.setCollectionState(collection, patchVersion, nextState.hash, nextState.indexValueMap);
|
|
573
736
|
return decryptedMutations;
|
|
574
737
|
}
|
|
@@ -593,7 +756,7 @@ class WaAppStateSyncClient {
|
|
|
593
756
|
decryptTasks[i] = (async () => {
|
|
594
757
|
const recordKeyData = await this.getKeyData(recordKeyId);
|
|
595
758
|
if (!recordKeyData) {
|
|
596
|
-
throw new WaAppStateMissingKeyError(`missing snapshot mutation key ${(0,
|
|
759
|
+
throw new WaAppStateMissingKeyError(`missing snapshot mutation key ${(0, bytes_1.bytesToHex)(recordKeyId)} for ${collection}`, recordKeyId, collection);
|
|
597
760
|
}
|
|
598
761
|
const decrypted = await this.crypto.decryptMutation({
|
|
599
762
|
operation: _proto_1.proto.SyncdMutation.SyncdOperation.SET,
|
|
@@ -640,7 +803,7 @@ class WaAppStateSyncClient {
|
|
|
640
803
|
decryptTasks[i] = (async () => {
|
|
641
804
|
const recordKeyData = await this.getKeyData(recordKeyId);
|
|
642
805
|
if (!recordKeyData) {
|
|
643
|
-
throw new WaAppStateMissingKeyError(`missing mutation key ${(0,
|
|
806
|
+
throw new WaAppStateMissingKeyError(`missing mutation key ${(0, bytes_1.bytesToHex)(recordKeyId)} for ${collection}`, recordKeyId, collection);
|
|
644
807
|
}
|
|
645
808
|
const decrypted = await this.crypto.decryptMutation({
|
|
646
809
|
operation: operationCode,
|
|
@@ -671,12 +834,16 @@ class WaAppStateSyncClient {
|
|
|
671
834
|
async assertPatchMacsMatch(patch, collection, patchKeyData, patchVersion, nextHash, valueMacs) {
|
|
672
835
|
const snapshotMac = (0, bytes_1.decodeProtoBytes)(patch.snapshotMac, `patch.snapshotMac (${collection})`);
|
|
673
836
|
const expectedSnapshotMac = await this.crypto.generateSnapshotMac(patchKeyData, nextHash, patchVersion, collection);
|
|
674
|
-
|
|
675
|
-
|
|
837
|
+
// non-fatal: wa-mob/wa-web tolerate this – patchMac below covers payload integrity.
|
|
838
|
+
if (!(0, bytes_1.uint8TimingSafeEqual)(expectedSnapshotMac, snapshotMac)) {
|
|
839
|
+
this.logger.debug('patch snapshot MAC mismatch (tolerated)', {
|
|
840
|
+
collection,
|
|
841
|
+
patchVersion
|
|
842
|
+
});
|
|
676
843
|
}
|
|
677
844
|
const patchMac = (0, bytes_1.decodeProtoBytes)(patch.patchMac, `patch.patchMac (${collection})`);
|
|
678
845
|
const expectedPatchMac = await this.crypto.generatePatchMac(patchKeyData, snapshotMac, valueMacs, patchVersion, collection);
|
|
679
|
-
if (!(0,
|
|
846
|
+
if (!(0, bytes_1.uint8TimingSafeEqual)(expectedPatchMac, patchMac)) {
|
|
680
847
|
throw new Error(`patch MAC mismatch for ${collection}`);
|
|
681
848
|
}
|
|
682
849
|
}
|
|
@@ -685,7 +852,7 @@ class WaAppStateSyncClient {
|
|
|
685
852
|
throw new WaAppStateMissingKeyError(`no sync key available to upload ${collection}`, null, collection);
|
|
686
853
|
}
|
|
687
854
|
const encryptedResults = await Promise.all(pendingMutations.map(async (mutation) => {
|
|
688
|
-
const value = mutation.operation === 'set' ? mutation.value :
|
|
855
|
+
const value = mutation.operation === 'set' ? mutation.value : null;
|
|
689
856
|
const operationCode = mutation.operation === 'remove'
|
|
690
857
|
? _proto_1.proto.SyncdMutation.SyncdOperation.REMOVE
|
|
691
858
|
: _proto_1.proto.SyncdMutation.SyncdOperation.SET;
|
|
@@ -724,14 +891,12 @@ class WaAppStateSyncClient {
|
|
|
724
891
|
const snapshotMac = await this.crypto.generateSnapshotMac(activeKey.keyData, nextState.hash, patchVersion, collection);
|
|
725
892
|
const patchMac = await this.crypto.generatePatchMac(activeKey.keyData, snapshotMac, valueMacs, patchVersion, collection);
|
|
726
893
|
const deviceIndex = this.resolveDeviceIndex();
|
|
727
|
-
const clientDebugData = this.buildPatchClientDebugData();
|
|
728
894
|
const encodedPatch = _proto_1.proto.SyncdPatch.encode({
|
|
729
895
|
mutations: encryptedMutations,
|
|
730
896
|
snapshotMac,
|
|
731
897
|
patchMac,
|
|
732
898
|
keyId: { id: activeKey.keyId },
|
|
733
|
-
...(deviceIndex === undefined ? {} : { deviceIndex })
|
|
734
|
-
clientDebugData
|
|
899
|
+
...(deviceIndex === undefined ? {} : { deviceIndex })
|
|
735
900
|
}).finish();
|
|
736
901
|
return {
|
|
737
902
|
encodedPatch,
|
|
@@ -759,19 +924,13 @@ class WaAppStateSyncClient {
|
|
|
759
924
|
return undefined;
|
|
760
925
|
}
|
|
761
926
|
}
|
|
762
|
-
buildPatchClientDebugData() {
|
|
763
|
-
return _proto_1.proto.PatchDebugData.encode({
|
|
764
|
-
isSenderPrimary: false,
|
|
765
|
-
senderPlatform: _proto_1.proto.PatchDebugData.Platform.WEB
|
|
766
|
-
}).finish();
|
|
767
|
-
}
|
|
768
927
|
async computeNextCollectionState(baseHash, baseMap, mutations, collection) {
|
|
769
928
|
const indexValueMap = new Map(baseMap);
|
|
770
929
|
const addValues = [];
|
|
771
930
|
const removeValues = [];
|
|
772
931
|
let missingRemoveCount = 0;
|
|
773
932
|
for (const mutation of mutations) {
|
|
774
|
-
const indexMacHex = (0,
|
|
933
|
+
const indexMacHex = (0, bytes_1.bytesToHex)(mutation.indexMac);
|
|
775
934
|
const existing = indexValueMap.get(indexMacHex);
|
|
776
935
|
if (mutation.operation === _proto_1.proto.SyncdMutation.SyncdOperation.REMOVE) {
|
|
777
936
|
if (!existing) {
|
|
@@ -805,8 +964,7 @@ class WaAppStateSyncClient {
|
|
|
805
964
|
return (0, primitives_1.longToNumber)(value);
|
|
806
965
|
}
|
|
807
966
|
catch (error) {
|
|
808
|
-
|
|
809
|
-
throw new Error(`invalid ${field}: ${reason}`);
|
|
967
|
+
throw new Error(`invalid ${field}: ${(0, primitives_1.toError)(error).message}`);
|
|
810
968
|
}
|
|
811
969
|
}
|
|
812
970
|
groupPendingMutations(pendingMutations) {
|
|
@@ -845,7 +1003,7 @@ class WaAppStateSyncClient {
|
|
|
845
1003
|
const missingKeyHexes = new Set();
|
|
846
1004
|
for (let index = 0; index < keyIds.length; index += 1) {
|
|
847
1005
|
const keyId = keyIds[index];
|
|
848
|
-
const keyHex = (0,
|
|
1006
|
+
const keyHex = (0, bytes_1.bytesToHex)(keyId);
|
|
849
1007
|
if (context.keys.has(keyHex) || missingKeyHexes.has(keyHex)) {
|
|
850
1008
|
continue;
|
|
851
1009
|
}
|
|
@@ -857,12 +1015,12 @@ class WaAppStateSyncClient {
|
|
|
857
1015
|
}
|
|
858
1016
|
const loadedKeyData = await this.store.getSyncKeyDataBatch(missingKeyIds);
|
|
859
1017
|
for (let index = 0; index < missingKeyIds.length; index += 1) {
|
|
860
|
-
context.keys.set((0,
|
|
1018
|
+
context.keys.set((0, bytes_1.bytesToHex)(missingKeyIds[index]), loadedKeyData[index] ?? null);
|
|
861
1019
|
}
|
|
862
1020
|
}
|
|
863
1021
|
async getKeyData(keyId) {
|
|
864
1022
|
const context = this.requireSyncContext();
|
|
865
|
-
const keyHex = (0,
|
|
1023
|
+
const keyHex = (0, bytes_1.bytesToHex)(keyId);
|
|
866
1024
|
if (context.keys.has(keyHex)) {
|
|
867
1025
|
return context.keys.get(keyHex) ?? null;
|
|
868
1026
|
}
|
package/dist/appstate/utils.js
CHANGED
|
@@ -7,17 +7,29 @@ exports.downloadExternalBlobReference = downloadExternalBlobReference;
|
|
|
7
7
|
const constants_1 = require("../protocol/constants");
|
|
8
8
|
const bytes_1 = require("../util/bytes");
|
|
9
9
|
const APP_STATE_COLLECTION_NAMES = new Set(Object.values(constants_1.WA_APP_STATE_COLLECTIONS));
|
|
10
|
+
/**
|
|
11
|
+
* Returns `value` typed as a known {@link AppStateCollectionName}, or `null`
|
|
12
|
+
* when the string is unrecognized.
|
|
13
|
+
*/
|
|
10
14
|
function parseCollectionName(value) {
|
|
11
15
|
return value && APP_STATE_COLLECTION_NAMES.has(value) ? value : null;
|
|
12
16
|
}
|
|
13
17
|
function keyDeviceId(keyId) {
|
|
14
18
|
return keyId.byteLength < 6 ? null : (keyId[0] << 8) | keyId[1];
|
|
15
19
|
}
|
|
20
|
+
/**
|
|
21
|
+
* Reads the 32-bit big-endian epoch encoded in bytes 2..5 of an app-state key id.
|
|
22
|
+
* Returns `-1` when the key id is too short.
|
|
23
|
+
*/
|
|
16
24
|
function keyEpoch(keyId) {
|
|
17
25
|
return keyId.byteLength < 6
|
|
18
26
|
? -1
|
|
19
27
|
: keyId[2] * 16777216 + keyId[3] * 65536 + keyId[4] * 256 + keyId[5];
|
|
20
28
|
}
|
|
29
|
+
/**
|
|
30
|
+
* Picks the highest-epoch app-state sync key from `keys`. Ties are broken by
|
|
31
|
+
* the lower device id. Returns `null` when the iterable is empty.
|
|
32
|
+
*/
|
|
21
33
|
function pickActiveSyncKey(keys) {
|
|
22
34
|
let active = null;
|
|
23
35
|
for (const key of keys) {
|
|
@@ -42,6 +54,10 @@ function pickActiveSyncKey(keys) {
|
|
|
42
54
|
}
|
|
43
55
|
return active;
|
|
44
56
|
}
|
|
57
|
+
/**
|
|
58
|
+
* Downloads and decrypts an external app-state blob via the media transfer
|
|
59
|
+
* client. Throws when the reference is missing required fields.
|
|
60
|
+
*/
|
|
45
61
|
async function downloadExternalBlobReference(mediaTransfer, reference) {
|
|
46
62
|
if (!reference.directPath) {
|
|
47
63
|
throw new Error('external blob reference is missing directPath');
|