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,14 +1,14 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { WaAppStateCrypto } from '
|
|
3
|
-
import { parseSyncResponse } from '
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import { bytesToHex,
|
|
10
|
-
import { longToNumber } from '
|
|
11
|
-
|
|
1
|
+
import { APP_STATE_DEFAULT_COLLECTION_VERSION, APP_STATE_DEFAULT_COLLECTIONS, APP_STATE_EMPTY_LT_HASH } from '../constants.js';
|
|
2
|
+
import { WaAppStateCrypto } from '../crypto/WaAppStateCrypto.js';
|
|
3
|
+
import { parseSyncResponse } from '../parsers/response-parser.js';
|
|
4
|
+
import { randomBytesAsync, randomIntAsync } from '../../crypto/index.js';
|
|
5
|
+
import { proto } from '../../proto.js';
|
|
6
|
+
import { WA_APP_STATE_COLLECTION_STATES, WA_DEFAULTS, WA_IQ_TYPES, WA_NODE_TAGS, WA_XMLNS } from '../../protocol/constants.js';
|
|
7
|
+
import { applyDeviceToJid, normalizeDeviceJid, parseSignalAddressFromJid } from '../../protocol/jid.js';
|
|
8
|
+
import { assertIqResult } from '../../transport/node/query.js';
|
|
9
|
+
import { bytesToHex, decodeProtoBytes, uint8TimingSafeEqual } from '../../util/bytes.js';
|
|
10
|
+
import { longToNumber, toError } from '../../util/primitives.js';
|
|
11
|
+
class WaAppStateMissingKeyError extends Error {
|
|
12
12
|
constructor(message, keyId, collection) {
|
|
13
13
|
super(message);
|
|
14
14
|
this.keyId = keyId;
|
|
@@ -16,23 +16,56 @@ export class WaAppStateMissingKeyError extends Error {
|
|
|
16
16
|
this.name = 'WaAppStateMissingKeyError';
|
|
17
17
|
}
|
|
18
18
|
}
|
|
19
|
+
/**
|
|
20
|
+
* App-state synchronization client. Owns the sync key inventory, processes
|
|
21
|
+
* snapshots/patches, encrypts pending mutations, and persists the resulting
|
|
22
|
+
* collection state in the {@link WaAppStateStore}.
|
|
23
|
+
*/
|
|
19
24
|
export class WaAppStateSyncClient {
|
|
20
25
|
constructor(options) {
|
|
21
26
|
this.logger = options.logger;
|
|
22
27
|
this.query = options.query;
|
|
23
28
|
this.store = options.store;
|
|
29
|
+
this.serverClock = options.serverClock;
|
|
24
30
|
this.getCurrentMeJid = options.getCurrentMeJid;
|
|
25
31
|
this.hostDomain = options.hostDomain ?? WA_DEFAULTS.HOST_DOMAIN;
|
|
26
32
|
this.defaultTimeoutMs = options.defaultTimeoutMs ?? WA_DEFAULTS.APP_STATE_SYNC_TIMEOUT_MS;
|
|
27
33
|
this.onMissingKeys = options.onMissingKeys;
|
|
28
|
-
this.
|
|
34
|
+
this.isOwnAccountDevice = options.isOwnAccountDevice;
|
|
35
|
+
this.sendKeyShare = options.sendKeyShare;
|
|
36
|
+
this.triggerSync = options.triggerSync;
|
|
37
|
+
this.crypto = new WaAppStateCrypto(undefined, options.skipMacVerification === true);
|
|
38
|
+
this.mobilePrimary = options.mobilePrimary ?? false;
|
|
29
39
|
this.syncContext = null;
|
|
30
40
|
this.syncPromise = null;
|
|
31
41
|
}
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
42
|
+
/**
|
|
43
|
+
* Returns the active app-state sync key, generating and persisting a new
|
|
44
|
+
* one when the store is empty (used during initial setup).
|
|
45
|
+
*/
|
|
46
|
+
async ensureInitialSyncKey() {
|
|
47
|
+
const existing = await this.store.getActiveSyncKey();
|
|
48
|
+
if (existing) {
|
|
49
|
+
return existing;
|
|
50
|
+
}
|
|
51
|
+
const keyIdBytes = await randomBytesAsync(2);
|
|
52
|
+
const keyData = await randomBytesAsync(32);
|
|
53
|
+
const rawId = await randomIntAsync(0, 4294967295);
|
|
54
|
+
const key = {
|
|
55
|
+
keyId: keyIdBytes,
|
|
56
|
+
keyData,
|
|
57
|
+
timestamp: this.serverClock.nowMs(),
|
|
58
|
+
fingerprint: { rawId, currentIndex: 0, deviceIndexes: [0] }
|
|
59
|
+
};
|
|
60
|
+
await this.store.upsertSyncKeys([key]);
|
|
61
|
+
this.crypto.clearCache();
|
|
62
|
+
this.logger.info('app-state initial sync key generated (mobile primary)', {
|
|
63
|
+
keyId: bytesToHex(keyIdBytes),
|
|
64
|
+
rawId
|
|
65
|
+
});
|
|
66
|
+
return key;
|
|
35
67
|
}
|
|
68
|
+
/** Imports peer-shared sync keys into the store; returns the count actually added. */
|
|
36
69
|
async importSyncKeys(keys) {
|
|
37
70
|
this.logger.debug('app-state importing sync keys', { count: keys.length });
|
|
38
71
|
const inserted = await this.store.upsertSyncKeys(keys);
|
|
@@ -42,6 +75,119 @@ export class WaAppStateSyncClient {
|
|
|
42
75
|
}
|
|
43
76
|
return inserted;
|
|
44
77
|
}
|
|
78
|
+
/** Handler for `AppStateSyncKeyShare` protocol messages – stores received keys and triggers a sync. */
|
|
79
|
+
async handleIncomingKeyShare(context, protocolMessage) {
|
|
80
|
+
const log = this.logger.child({ id: context.id, from: context.remoteJid });
|
|
81
|
+
const share = protocolMessage.appStateSyncKeyShare;
|
|
82
|
+
if (!share) {
|
|
83
|
+
log.warn('incoming app-state key share protocol message without payload');
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
try {
|
|
87
|
+
const imported = await this.importSyncKeyShare(share);
|
|
88
|
+
log.info('imported app-state sync key share from protocol message', { imported });
|
|
89
|
+
if (imported > 0 && this.triggerSync) {
|
|
90
|
+
void this.triggerSync().catch((error) => {
|
|
91
|
+
log.warn('failed to sync app-state after key share import', {
|
|
92
|
+
message: toError(error).message
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
log.warn('failed to import app-state sync key share from protocol message', {
|
|
99
|
+
message: toError(error).message
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
/** Handler for `AppStateSyncKeyRequest` protocol messages – replies with the requested keys via `sendKeyShare`. */
|
|
104
|
+
async handleIncomingKeyRequest(context, protocolMessage) {
|
|
105
|
+
const log = this.logger.child({ id: context.id, from: context.remoteJid });
|
|
106
|
+
const request = protocolMessage.appStateSyncKeyRequest;
|
|
107
|
+
if (!request) {
|
|
108
|
+
log.warn('incoming app-state key request protocol message without payload');
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
const senderJid = context.participant ?? context.remoteJid;
|
|
112
|
+
if (!senderJid) {
|
|
113
|
+
log.warn('incoming app-state key request missing sender jid');
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
let requesterDeviceJid;
|
|
117
|
+
try {
|
|
118
|
+
const requesterRaw = applyDeviceToJid(senderJid, context.senderDevice);
|
|
119
|
+
requesterDeviceJid = normalizeDeviceJid(requesterRaw);
|
|
120
|
+
}
|
|
121
|
+
catch (error) {
|
|
122
|
+
log.warn('incoming app-state key request has malformed sender jid', {
|
|
123
|
+
senderJid,
|
|
124
|
+
message: toError(error).message
|
|
125
|
+
});
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
const deviceLog = log.child({ to: requesterDeviceJid });
|
|
129
|
+
if (this.isOwnAccountDevice && !this.isOwnAccountDevice(requesterDeviceJid)) {
|
|
130
|
+
deviceLog.warn('incoming app-state key request ignored: sender is not own account');
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
const requestedKeyIds = this.extractKeyRequestIds(request);
|
|
134
|
+
if (requestedKeyIds.length === 0) {
|
|
135
|
+
deviceLog.warn('incoming app-state key request has no valid key ids');
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
if (!this.sendKeyShare) {
|
|
139
|
+
deviceLog.warn('incoming app-state key request received but no sendKeyShare wired');
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
const requestedKeys = await this.store.getSyncKeysBatch(requestedKeyIds);
|
|
143
|
+
const availableKeys = [];
|
|
144
|
+
const missingKeyIds = [];
|
|
145
|
+
for (let i = 0; i < requestedKeys.length; i += 1) {
|
|
146
|
+
const key = requestedKeys[i];
|
|
147
|
+
if (key !== null) {
|
|
148
|
+
availableKeys.push(key);
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
missingKeyIds.push(requestedKeyIds[i]);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
try {
|
|
155
|
+
await this.sendKeyShare(requesterDeviceJid, availableKeys, missingKeyIds);
|
|
156
|
+
deviceLog.info('responded to app-state key request', {
|
|
157
|
+
requested: requestedKeyIds.length,
|
|
158
|
+
shared: availableKeys.length,
|
|
159
|
+
missing: missingKeyIds.length
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
catch (error) {
|
|
163
|
+
deviceLog.warn('failed to respond to app-state key request', {
|
|
164
|
+
requested: requestedKeyIds.length,
|
|
165
|
+
shared: availableKeys.length,
|
|
166
|
+
missing: missingKeyIds.length,
|
|
167
|
+
message: toError(error).message
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
extractKeyRequestIds(request) {
|
|
172
|
+
const deduped = new Map();
|
|
173
|
+
for (const key of request.keyIds ?? []) {
|
|
174
|
+
try {
|
|
175
|
+
const keyId = decodeProtoBytes(key.keyId, 'appStateSyncKeyRequest.keyIds[].keyId');
|
|
176
|
+
const keyHex = bytesToHex(keyId);
|
|
177
|
+
if (deduped.has(keyHex)) {
|
|
178
|
+
continue;
|
|
179
|
+
}
|
|
180
|
+
deduped.set(keyHex, keyId);
|
|
181
|
+
}
|
|
182
|
+
catch (error) {
|
|
183
|
+
this.logger.trace('ignoring malformed app-state key id request entry', {
|
|
184
|
+
message: toError(error).message
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
return [...deduped.values()];
|
|
189
|
+
}
|
|
190
|
+
/** Imports the keys from a decoded `AppStateSyncKeyShare` proto message. */
|
|
45
191
|
async importSyncKeyShare(share) {
|
|
46
192
|
const keys = [];
|
|
47
193
|
for (const item of share.keys ?? []) {
|
|
@@ -57,13 +203,19 @@ export class WaAppStateSyncClient {
|
|
|
57
203
|
keyId,
|
|
58
204
|
keyData,
|
|
59
205
|
timestamp: item.keyData?.timestamp === null || item.keyData?.timestamp === undefined
|
|
60
|
-
?
|
|
206
|
+
? this.serverClock.nowMs()
|
|
61
207
|
: this.normalizeProtoLong(item.keyData?.timestamp, 'appStateSyncKeyShare.keys[].keyData.timestamp'),
|
|
62
208
|
fingerprint: item.keyData?.fingerprint ?? undefined
|
|
63
209
|
});
|
|
64
210
|
}
|
|
65
211
|
return this.importSyncKeys(keys);
|
|
66
212
|
}
|
|
213
|
+
/**
|
|
214
|
+
* Runs one app-state sync round across the requested collections,
|
|
215
|
+
* applying any `pendingMutations` and downloading external snapshots
|
|
216
|
+
* via `options.downloadExternalBlob` when present. Concurrent calls
|
|
217
|
+
* share the in-flight promise.
|
|
218
|
+
*/
|
|
67
219
|
async sync(options = {}) {
|
|
68
220
|
if (this.syncPromise) {
|
|
69
221
|
this.logger.debug('app-state sync already in flight, joining existing run');
|
|
@@ -95,7 +247,7 @@ export class WaAppStateSyncClient {
|
|
|
95
247
|
for (let index = 0; index < collections.length; index += 1) {
|
|
96
248
|
context.collections.set(collections[index], initialCollectionStates[index]);
|
|
97
249
|
}
|
|
98
|
-
this.logger.
|
|
250
|
+
this.logger.debug('app-state sync start', {
|
|
99
251
|
collections: collections.length,
|
|
100
252
|
pendingMutations: options.pendingMutations?.length ?? 0
|
|
101
253
|
});
|
|
@@ -145,13 +297,13 @@ export class WaAppStateSyncClient {
|
|
|
145
297
|
}
|
|
146
298
|
if (stateChanged && context.dirtyCollections.size > 0) {
|
|
147
299
|
await this.persistCollectionUpdates();
|
|
148
|
-
this.logger.
|
|
300
|
+
this.logger.debug('app-state sync persisted updated state');
|
|
149
301
|
}
|
|
150
302
|
const orderedResults = collections.map((collection) => resultMap.get(collection) ?? {
|
|
151
303
|
collection,
|
|
152
304
|
state: WA_APP_STATE_COLLECTION_STATES.ERROR_RETRY
|
|
153
305
|
});
|
|
154
|
-
this.logger.
|
|
306
|
+
this.logger.debug('app-state sync finished', {
|
|
155
307
|
collections: orderedResults.length,
|
|
156
308
|
stateChanged
|
|
157
309
|
});
|
|
@@ -283,7 +435,7 @@ export class WaAppStateSyncClient {
|
|
|
283
435
|
content: [
|
|
284
436
|
{
|
|
285
437
|
tag: WA_NODE_TAGS.SYNC,
|
|
286
|
-
attrs: {},
|
|
438
|
+
attrs: this.mobilePrimary ? { data_namespace: '3' } : {},
|
|
287
439
|
content: collectionNodes
|
|
288
440
|
}
|
|
289
441
|
]
|
|
@@ -305,11 +457,12 @@ export class WaAppStateSyncClient {
|
|
|
305
457
|
return payloadByCollection;
|
|
306
458
|
}
|
|
307
459
|
async processCollectionRound({ collection, payloadByCollection, pendingByCollection, options, outgoingContexts, skippedUploadCollections }) {
|
|
460
|
+
const collectionLogger = this.logger.child({ collection });
|
|
308
461
|
const payload = payloadByCollection.get(collection);
|
|
309
462
|
let shouldRefetch = false;
|
|
310
463
|
let collectionStateChanged = false;
|
|
311
464
|
if (!payload) {
|
|
312
|
-
|
|
465
|
+
collectionLogger.warn('app-state sync response missing collection payload');
|
|
313
466
|
return this.createCollectionOutcome(collection, WA_APP_STATE_COLLECTION_STATES.ERROR_RETRY);
|
|
314
467
|
}
|
|
315
468
|
if (payload.state === WA_APP_STATE_COLLECTION_STATES.ERROR_FATAL ||
|
|
@@ -369,8 +522,7 @@ export class WaAppStateSyncClient {
|
|
|
369
522
|
payload.state === WA_APP_STATE_COLLECTION_STATES.SUCCESS_HAS_MORE ||
|
|
370
523
|
(payload.state === WA_APP_STATE_COLLECTION_STATES.SUCCESS &&
|
|
371
524
|
skippedUploadCollections.has(collection));
|
|
372
|
-
|
|
373
|
-
collection: payload.collection,
|
|
525
|
+
collectionLogger.debug('app-state collection processed', {
|
|
374
526
|
state: payload.state,
|
|
375
527
|
version: payload.version,
|
|
376
528
|
appliedMutations: appliedMutations.length
|
|
@@ -379,16 +531,13 @@ export class WaAppStateSyncClient {
|
|
|
379
531
|
}
|
|
380
532
|
catch (error) {
|
|
381
533
|
if (error instanceof WaAppStateMissingKeyError) {
|
|
382
|
-
|
|
383
|
-
collection: payload.collection,
|
|
534
|
+
collectionLogger.debug('app-state blocked by missing key', {
|
|
384
535
|
message: error.message
|
|
385
536
|
});
|
|
386
537
|
return this.createCollectionOutcome(collection, WA_APP_STATE_COLLECTION_STATES.BLOCKED, payload.version, shouldRefetch, collectionStateChanged, undefined, error.keyId);
|
|
387
538
|
}
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
collection: payload.collection,
|
|
391
|
-
message
|
|
539
|
+
collectionLogger.debug('app-state collection processing failed', {
|
|
540
|
+
message: toError(error).message
|
|
392
541
|
});
|
|
393
542
|
return this.createCollectionOutcome(collection, WA_APP_STATE_COLLECTION_STATES.ERROR_RETRY, payload.version, true, collectionStateChanged);
|
|
394
543
|
}
|
|
@@ -414,11 +563,13 @@ export class WaAppStateSyncClient {
|
|
|
414
563
|
return;
|
|
415
564
|
}
|
|
416
565
|
const keyIdsHex = keyIds.map((keyId) => bytesToHex(keyId));
|
|
417
|
-
this.logger.
|
|
566
|
+
const requestLogger = this.logger.child({
|
|
418
567
|
keys: keyIdsHex.length,
|
|
419
|
-
keyIds: keyIdsHex.join(','),
|
|
420
568
|
collections: collections.join(',')
|
|
421
569
|
});
|
|
570
|
+
requestLogger.debug('app-state requesting missing sync keys', {
|
|
571
|
+
keyIds: keyIdsHex.join(',')
|
|
572
|
+
});
|
|
422
573
|
try {
|
|
423
574
|
await input.onMissingKeys({
|
|
424
575
|
keyIds,
|
|
@@ -426,10 +577,8 @@ export class WaAppStateSyncClient {
|
|
|
426
577
|
});
|
|
427
578
|
}
|
|
428
579
|
catch (error) {
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
collections: collections.join(','),
|
|
432
|
-
message: error instanceof Error ? error.message : String(error)
|
|
580
|
+
requestLogger.warn('app-state missing key callback failed', {
|
|
581
|
+
message: toError(error).message
|
|
433
582
|
});
|
|
434
583
|
}
|
|
435
584
|
}
|
|
@@ -452,7 +601,8 @@ export class WaAppStateSyncClient {
|
|
|
452
601
|
const decodedMutations = proto.SyncdMutations.decode(patchBytes);
|
|
453
602
|
readyPatch = {
|
|
454
603
|
...readyPatch,
|
|
455
|
-
mutations: decodedMutations.mutations ?? []
|
|
604
|
+
mutations: decodedMutations.mutations ?? [],
|
|
605
|
+
externalMutations: undefined
|
|
456
606
|
};
|
|
457
607
|
}
|
|
458
608
|
return this.validatePatch(payload.collection, readyPatch);
|
|
@@ -462,11 +612,13 @@ export class WaAppStateSyncClient {
|
|
|
462
612
|
if (!snapshot.version?.version) {
|
|
463
613
|
throw new Error(`snapshot for ${collection} is missing version`);
|
|
464
614
|
}
|
|
465
|
-
if (!
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
615
|
+
if (!this.crypto.isMacVerificationSkipped) {
|
|
616
|
+
if (!snapshot.mac) {
|
|
617
|
+
throw new Error(`snapshot for ${collection} is missing mac`);
|
|
618
|
+
}
|
|
619
|
+
if (!snapshot.keyId?.id) {
|
|
620
|
+
throw new Error(`snapshot for ${collection} is missing keyId`);
|
|
621
|
+
}
|
|
470
622
|
}
|
|
471
623
|
return snapshot;
|
|
472
624
|
}
|
|
@@ -481,14 +633,16 @@ export class WaAppStateSyncClient {
|
|
|
481
633
|
if (!patch.version?.version) {
|
|
482
634
|
throw new Error(`patch for ${collection} is missing version`);
|
|
483
635
|
}
|
|
484
|
-
if (!
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
636
|
+
if (!this.crypto.isMacVerificationSkipped) {
|
|
637
|
+
if (!patch.snapshotMac) {
|
|
638
|
+
throw new Error(`patch for ${collection} is missing snapshotMac`);
|
|
639
|
+
}
|
|
640
|
+
if (!patch.patchMac) {
|
|
641
|
+
throw new Error(`patch for ${collection} is missing patchMac`);
|
|
642
|
+
}
|
|
643
|
+
if (!patch.keyId?.id) {
|
|
644
|
+
throw new Error(`patch for ${collection} is missing keyId`);
|
|
645
|
+
}
|
|
492
646
|
}
|
|
493
647
|
if (patch.mutations && patch.mutations.length > 0 && patch.externalMutations) {
|
|
494
648
|
throw new Error(`patch for ${collection} has inline and external mutations together`);
|
|
@@ -502,10 +656,13 @@ export class WaAppStateSyncClient {
|
|
|
502
656
|
}
|
|
503
657
|
async applySnapshot(collection, snapshot) {
|
|
504
658
|
const version = this.normalizeProtoLong(snapshot.version?.version, `snapshot.version.version (${collection})`);
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
659
|
+
let keyData = null;
|
|
660
|
+
if (!this.crypto.isMacVerificationSkipped) {
|
|
661
|
+
const keyId = decodeProtoBytes(snapshot.keyId?.id, `snapshot.keyId.id (${collection})`);
|
|
662
|
+
keyData = await this.getKeyData(keyId);
|
|
663
|
+
if (!keyData) {
|
|
664
|
+
throw new WaAppStateMissingKeyError(`missing snapshot key ${bytesToHex(keyId)} for ${collection}`, keyId, collection);
|
|
665
|
+
}
|
|
509
666
|
}
|
|
510
667
|
const indexValueMap = new Map();
|
|
511
668
|
const mutations = [];
|
|
@@ -533,9 +690,11 @@ export class WaAppStateSyncClient {
|
|
|
533
690
|
ltHashInputIndex += 1;
|
|
534
691
|
}
|
|
535
692
|
const ltHash = await this.crypto.ltHashAdd(APP_STATE_EMPTY_LT_HASH, ltHashInput);
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
693
|
+
if (keyData !== null) {
|
|
694
|
+
const expectedSnapshotMac = await this.crypto.generateSnapshotMac(keyData, ltHash, version, collection);
|
|
695
|
+
if (!uint8TimingSafeEqual(expectedSnapshotMac, snapshot.mac)) {
|
|
696
|
+
throw new Error(`snapshot MAC mismatch for ${collection}`);
|
|
697
|
+
}
|
|
539
698
|
}
|
|
540
699
|
this.setCollectionState(collection, version, ltHash, indexValueMap);
|
|
541
700
|
return mutations;
|
|
@@ -546,10 +705,13 @@ export class WaAppStateSyncClient {
|
|
|
546
705
|
if (current.version !== patchVersion - 1) {
|
|
547
706
|
throw new Error(`patch version mismatch for ${collection}: local=${current.version}, incoming=${patchVersion}`);
|
|
548
707
|
}
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
708
|
+
let patchKeyData = null;
|
|
709
|
+
if (!this.crypto.isMacVerificationSkipped) {
|
|
710
|
+
const patchKeyId = decodeProtoBytes(patch.keyId?.id, `patch.keyId.id (${collection})`);
|
|
711
|
+
patchKeyData = await this.getKeyData(patchKeyId);
|
|
712
|
+
if (!patchKeyData) {
|
|
713
|
+
throw new WaAppStateMissingKeyError(`missing patch key ${bytesToHex(patchKeyId)} for ${collection}`, patchKeyId, collection);
|
|
714
|
+
}
|
|
553
715
|
}
|
|
554
716
|
const decryptedMutations = await this.decryptPatchMutations(collection, patch);
|
|
555
717
|
const macMutations = new Array(decryptedMutations.length);
|
|
@@ -564,7 +726,9 @@ export class WaAppStateSyncClient {
|
|
|
564
726
|
};
|
|
565
727
|
}
|
|
566
728
|
const nextState = await this.computeNextCollectionState(current.hash, current.indexValueMap, macMutations, collection);
|
|
567
|
-
|
|
729
|
+
if (patchKeyData !== null) {
|
|
730
|
+
await this.assertPatchMacsMatch(patch, collection, patchKeyData, patchVersion, nextState.hash, valueMacs);
|
|
731
|
+
}
|
|
568
732
|
this.setCollectionState(collection, patchVersion, nextState.hash, nextState.indexValueMap);
|
|
569
733
|
return decryptedMutations;
|
|
570
734
|
}
|
|
@@ -667,12 +831,16 @@ export class WaAppStateSyncClient {
|
|
|
667
831
|
async assertPatchMacsMatch(patch, collection, patchKeyData, patchVersion, nextHash, valueMacs) {
|
|
668
832
|
const snapshotMac = decodeProtoBytes(patch.snapshotMac, `patch.snapshotMac (${collection})`);
|
|
669
833
|
const expectedSnapshotMac = await this.crypto.generateSnapshotMac(patchKeyData, nextHash, patchVersion, collection);
|
|
670
|
-
|
|
671
|
-
|
|
834
|
+
// non-fatal: wa-mob/wa-web tolerate this – patchMac below covers payload integrity.
|
|
835
|
+
if (!uint8TimingSafeEqual(expectedSnapshotMac, snapshotMac)) {
|
|
836
|
+
this.logger.debug('patch snapshot MAC mismatch (tolerated)', {
|
|
837
|
+
collection,
|
|
838
|
+
patchVersion
|
|
839
|
+
});
|
|
672
840
|
}
|
|
673
841
|
const patchMac = decodeProtoBytes(patch.patchMac, `patch.patchMac (${collection})`);
|
|
674
842
|
const expectedPatchMac = await this.crypto.generatePatchMac(patchKeyData, snapshotMac, valueMacs, patchVersion, collection);
|
|
675
|
-
if (!
|
|
843
|
+
if (!uint8TimingSafeEqual(expectedPatchMac, patchMac)) {
|
|
676
844
|
throw new Error(`patch MAC mismatch for ${collection}`);
|
|
677
845
|
}
|
|
678
846
|
}
|
|
@@ -681,7 +849,7 @@ export class WaAppStateSyncClient {
|
|
|
681
849
|
throw new WaAppStateMissingKeyError(`no sync key available to upload ${collection}`, null, collection);
|
|
682
850
|
}
|
|
683
851
|
const encryptedResults = await Promise.all(pendingMutations.map(async (mutation) => {
|
|
684
|
-
const value = mutation.operation === 'set' ? mutation.value :
|
|
852
|
+
const value = mutation.operation === 'set' ? mutation.value : null;
|
|
685
853
|
const operationCode = mutation.operation === 'remove'
|
|
686
854
|
? proto.SyncdMutation.SyncdOperation.REMOVE
|
|
687
855
|
: proto.SyncdMutation.SyncdOperation.SET;
|
|
@@ -720,14 +888,12 @@ export class WaAppStateSyncClient {
|
|
|
720
888
|
const snapshotMac = await this.crypto.generateSnapshotMac(activeKey.keyData, nextState.hash, patchVersion, collection);
|
|
721
889
|
const patchMac = await this.crypto.generatePatchMac(activeKey.keyData, snapshotMac, valueMacs, patchVersion, collection);
|
|
722
890
|
const deviceIndex = this.resolveDeviceIndex();
|
|
723
|
-
const clientDebugData = this.buildPatchClientDebugData();
|
|
724
891
|
const encodedPatch = proto.SyncdPatch.encode({
|
|
725
892
|
mutations: encryptedMutations,
|
|
726
893
|
snapshotMac,
|
|
727
894
|
patchMac,
|
|
728
895
|
keyId: { id: activeKey.keyId },
|
|
729
|
-
...(deviceIndex === undefined ? {} : { deviceIndex })
|
|
730
|
-
clientDebugData
|
|
896
|
+
...(deviceIndex === undefined ? {} : { deviceIndex })
|
|
731
897
|
}).finish();
|
|
732
898
|
return {
|
|
733
899
|
encodedPatch,
|
|
@@ -755,12 +921,6 @@ export class WaAppStateSyncClient {
|
|
|
755
921
|
return undefined;
|
|
756
922
|
}
|
|
757
923
|
}
|
|
758
|
-
buildPatchClientDebugData() {
|
|
759
|
-
return proto.PatchDebugData.encode({
|
|
760
|
-
isSenderPrimary: false,
|
|
761
|
-
senderPlatform: proto.PatchDebugData.Platform.WEB
|
|
762
|
-
}).finish();
|
|
763
|
-
}
|
|
764
924
|
async computeNextCollectionState(baseHash, baseMap, mutations, collection) {
|
|
765
925
|
const indexValueMap = new Map(baseMap);
|
|
766
926
|
const addValues = [];
|
|
@@ -801,8 +961,7 @@ export class WaAppStateSyncClient {
|
|
|
801
961
|
return longToNumber(value);
|
|
802
962
|
}
|
|
803
963
|
catch (error) {
|
|
804
|
-
|
|
805
|
-
throw new Error(`invalid ${field}: ${reason}`);
|
|
964
|
+
throw new Error(`invalid ${field}: ${toError(error).message}`);
|
|
806
965
|
}
|
|
807
966
|
}
|
|
808
967
|
groupPendingMutations(pendingMutations) {
|
|
@@ -1,17 +1,29 @@
|
|
|
1
1
|
import { WA_APP_STATE_COLLECTIONS, WA_APP_STATE_KEY_TYPES } from '../protocol/constants.js';
|
|
2
2
|
import { decodeProtoBytes } from '../util/bytes.js';
|
|
3
3
|
const APP_STATE_COLLECTION_NAMES = new Set(Object.values(WA_APP_STATE_COLLECTIONS));
|
|
4
|
+
/**
|
|
5
|
+
* Returns `value` typed as a known {@link AppStateCollectionName}, or `null`
|
|
6
|
+
* when the string is unrecognized.
|
|
7
|
+
*/
|
|
4
8
|
export function parseCollectionName(value) {
|
|
5
9
|
return value && APP_STATE_COLLECTION_NAMES.has(value) ? value : null;
|
|
6
10
|
}
|
|
7
11
|
function keyDeviceId(keyId) {
|
|
8
12
|
return keyId.byteLength < 6 ? null : (keyId[0] << 8) | keyId[1];
|
|
9
13
|
}
|
|
14
|
+
/**
|
|
15
|
+
* Reads the 32-bit big-endian epoch encoded in bytes 2..5 of an app-state key id.
|
|
16
|
+
* Returns `-1` when the key id is too short.
|
|
17
|
+
*/
|
|
10
18
|
export function keyEpoch(keyId) {
|
|
11
19
|
return keyId.byteLength < 6
|
|
12
20
|
? -1
|
|
13
21
|
: keyId[2] * 16777216 + keyId[3] * 65536 + keyId[4] * 256 + keyId[5];
|
|
14
22
|
}
|
|
23
|
+
/**
|
|
24
|
+
* Picks the highest-epoch app-state sync key from `keys`. Ties are broken by
|
|
25
|
+
* the lower device id. Returns `null` when the iterable is empty.
|
|
26
|
+
*/
|
|
15
27
|
export function pickActiveSyncKey(keys) {
|
|
16
28
|
let active = null;
|
|
17
29
|
for (const key of keys) {
|
|
@@ -36,6 +48,10 @@ export function pickActiveSyncKey(keys) {
|
|
|
36
48
|
}
|
|
37
49
|
return active;
|
|
38
50
|
}
|
|
51
|
+
/**
|
|
52
|
+
* Downloads and decrypts an external app-state blob via the media transfer
|
|
53
|
+
* client. Throws when the reference is missing required fields.
|
|
54
|
+
*/
|
|
39
55
|
export async function downloadExternalBlobReference(mediaTransfer, reference) {
|
|
40
56
|
if (!reference.directPath) {
|
|
41
57
|
throw new Error('external blob reference is missing directPath');
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { proto } from './proto.js';
|
|
2
|
+
import { WA_APPSTATE_SCHEMAS as RAW_WA_APPSTATE_SCHEMAS } from '../spec/appstate';
|
|
3
|
+
export { WA_APPSTATE_COLLECTIONS, WA_APPSTATE_SCHEMAS } from '../spec/appstate';
|
|
4
|
+
const SCHEMA_BY_ACTION_NAME_BUILDER = {};
|
|
5
|
+
for (const key of Object.keys(RAW_WA_APPSTATE_SCHEMAS)) {
|
|
6
|
+
SCHEMA_BY_ACTION_NAME_BUILDER[RAW_WA_APPSTATE_SCHEMAS[key].name] = key;
|
|
7
|
+
}
|
|
8
|
+
export const WA_APPSTATE_SCHEMA_BY_ACTION_NAME = Object.freeze(SCHEMA_BY_ACTION_NAME_BUILDER);
|
|
9
|
+
export function getAppstateSchemaByActionName(actionName) {
|
|
10
|
+
const key = WA_APPSTATE_SCHEMA_BY_ACTION_NAME[actionName];
|
|
11
|
+
if (!key) {
|
|
12
|
+
return null;
|
|
13
|
+
}
|
|
14
|
+
return { key, schema: RAW_WA_APPSTATE_SCHEMAS[key] };
|
|
15
|
+
}
|
|
16
|
+
export function resolveEnumObject(protoEnumPath) {
|
|
17
|
+
const segments = protoEnumPath.split('.');
|
|
18
|
+
let cursor = proto.SyncActionValue;
|
|
19
|
+
for (const seg of segments) {
|
|
20
|
+
if (cursor === null || cursor === undefined)
|
|
21
|
+
return null;
|
|
22
|
+
if (typeof cursor !== 'object' && typeof cursor !== 'function')
|
|
23
|
+
return null;
|
|
24
|
+
cursor = cursor[seg];
|
|
25
|
+
}
|
|
26
|
+
if (cursor === null || cursor === undefined)
|
|
27
|
+
return null;
|
|
28
|
+
if (typeof cursor !== 'object' && typeof cursor !== 'function')
|
|
29
|
+
return null;
|
|
30
|
+
return cursor;
|
|
31
|
+
}
|
|
32
|
+
export function encodeEnumValue(protoEnumPath, name) {
|
|
33
|
+
const enumObj = resolveEnumObject(protoEnumPath);
|
|
34
|
+
if (!enumObj)
|
|
35
|
+
return null;
|
|
36
|
+
const value = enumObj[name];
|
|
37
|
+
return typeof value === 'number' ? value : null;
|
|
38
|
+
}
|
|
39
|
+
export function decodeEnumValue(protoEnumPath, value) {
|
|
40
|
+
const enumObj = resolveEnumObject(protoEnumPath);
|
|
41
|
+
if (!enumObj)
|
|
42
|
+
return null;
|
|
43
|
+
for (const key of Object.keys(enumObj)) {
|
|
44
|
+
if (enumObj[key] === value)
|
|
45
|
+
return key;
|
|
46
|
+
}
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
export function decodeIndexArgsFromSchema(schema, parts) {
|
|
50
|
+
if (parts.length !== schema.indexParts.length) {
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
const args = {};
|
|
54
|
+
for (let i = 0; i < schema.indexParts.length; i += 1) {
|
|
55
|
+
const part = schema.indexParts[i];
|
|
56
|
+
const raw = parts[i];
|
|
57
|
+
if (part.type === 'literal') {
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
if (part.type === 'boolString') {
|
|
61
|
+
if (raw !== '0' && raw !== '1')
|
|
62
|
+
return null;
|
|
63
|
+
args[part.name] = raw === '1';
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
if (part.type === 'jidOrZero') {
|
|
67
|
+
args[part.name] = raw === '0' ? null : raw;
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
if (part.type === 'enum') {
|
|
71
|
+
const numeric = Number(raw);
|
|
72
|
+
const name = Number.isFinite(numeric) ? decodeEnumValue(part.protoEnum, numeric) : null;
|
|
73
|
+
args[part.name] = name ?? raw;
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
args[part.name] = raw;
|
|
77
|
+
}
|
|
78
|
+
return args;
|
|
79
|
+
}
|