zapo-js 0.3.0 → 1.0.1
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 +98 -178
- package/dist/appstate/{WaAppStateCrypto.js → crypto/WaAppStateCrypto.js} +58 -49
- package/dist/appstate/index.js +7 -6
- package/dist/appstate/{encoding.js → parsers/encoding.js} +11 -4
- package/dist/appstate/{response-parser.js → parsers/response-parser.js} +20 -8
- package/dist/appstate/{WaAppStateSyncClient.js → sync/WaAppStateSyncClient.js} +174 -53
- package/dist/appstate/utils.js +16 -0
- package/dist/appstate-spec.js +89 -0
- package/dist/auth/WaAuthClient.js +100 -5
- package/dist/auth/credentials-flow.js +20 -8
- package/dist/auth/pairing/WaPairingFlow.js +35 -26
- package/dist/auth/pairing/pairing-code-crypto.js +17 -19
- package/dist/client/WaClient.js +343 -474
- package/dist/client/WaClientFactory.js +281 -78
- package/dist/client/connection/WaConnectionManager.js +28 -11
- package/dist/client/coordinators/WaAbPropsCoordinator.js +1 -2
- 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 -171
- package/dist/client/coordinators/WaEmailCoordinator.js +1 -0
- package/dist/client/coordinators/WaGroupCoordinator.js +529 -52
- package/dist/client/coordinators/WaIncomingNodeCoordinator.js +97 -12
- package/dist/client/coordinators/WaLowLevelCoordinator.js +41 -0
- package/dist/client/coordinators/WaMessageCoordinator.js +365 -0
- package/dist/client/coordinators/WaMessageDispatchCoordinator.js +685 -207
- package/dist/client/coordinators/WaNewsletterCoordinator.js +18 -0
- package/dist/client/coordinators/WaPassiveTasksCoordinator.js +17 -4
- package/dist/client/coordinators/WaPresenceCoordinator.js +21 -0
- package/dist/client/coordinators/WaPrivacyCoordinator.js +7 -5
- package/dist/client/coordinators/WaProfileCoordinator.js +220 -49
- package/dist/client/coordinators/WaRetryCoordinator.js +257 -126
- package/dist/client/coordinators/WaStatusCoordinator.js +49 -0
- package/dist/client/coordinators/WaStreamControlCoordinator.js +8 -9
- package/dist/client/coordinators/WaTrustedContactTokenCoordinator.js +7 -6
- 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} +33 -19
- 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/receipt.js +26 -0
- package/dist/client/media.js +163 -6
- package/dist/client/messaging/fanout.js +9 -10
- package/dist/client/messaging/{participants.js → group-metadata.js} +93 -44
- package/dist/client/messaging/ignore-key.js +132 -0
- package/dist/client/messaging/key-protocol.js +4 -18
- 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 +6 -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 +6 -0
- package/dist/crypto/core/xeddsa.js +11 -9
- package/dist/crypto/curves/Ed25519.js +32 -21
- package/dist/crypto/curves/X25519.js +70 -34
- package/dist/crypto/curves/constants.js +2 -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} +58 -49
- package/dist/esm/appstate/index.js +5 -5
- package/dist/esm/appstate/{encoding.js → parsers/encoding.js} +11 -4
- package/dist/esm/appstate/{response-parser.js → parsers/response-parser.js} +20 -8
- package/dist/esm/appstate/{WaAppStateSyncClient.js → sync/WaAppStateSyncClient.js} +174 -52
- package/dist/esm/appstate/utils.js +16 -0
- package/dist/esm/appstate-spec.js +79 -0
- package/dist/esm/auth/WaAuthClient.js +100 -5
- package/dist/esm/auth/credentials-flow.js +18 -6
- package/dist/esm/auth/pairing/WaPairingFlow.js +34 -25
- package/dist/esm/auth/pairing/pairing-code-crypto.js +12 -14
- package/dist/esm/client/WaClient.js +345 -476
- package/dist/esm/client/WaClientFactory.js +282 -79
- package/dist/esm/client/connection/WaConnectionManager.js +28 -11
- package/dist/esm/client/coordinators/WaAbPropsCoordinator.js +2 -3
- 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 +79 -169
- package/dist/esm/client/coordinators/WaEmailCoordinator.js +1 -0
- package/dist/esm/client/coordinators/WaGroupCoordinator.js +532 -55
- package/dist/esm/client/coordinators/WaIncomingNodeCoordinator.js +98 -13
- 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 +686 -208
- package/dist/esm/client/coordinators/WaNewsletterCoordinator.js +13 -0
- package/dist/esm/client/coordinators/WaPassiveTasksCoordinator.js +18 -5
- 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 +223 -52
- package/dist/esm/client/coordinators/WaRetryCoordinator.js +258 -127
- package/dist/esm/client/coordinators/WaStatusCoordinator.js +46 -0
- package/dist/esm/client/coordinators/WaStreamControlCoordinator.js +8 -9
- package/dist/esm/client/coordinators/WaTrustedContactTokenCoordinator.js +7 -6
- 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} +33 -19
- 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/receipt.js +23 -0
- package/dist/esm/client/media.js +158 -8
- package/dist/esm/client/messaging/fanout.js +10 -11
- package/dist/esm/client/messaging/{participants.js → group-metadata.js} +92 -43
- 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 +2 -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 +6 -0
- package/dist/esm/crypto/core/xeddsa.js +11 -9
- package/dist/esm/crypto/curves/Ed25519.js +35 -24
- package/dist/esm/crypto/curves/X25519.js +72 -36
- package/dist/esm/crypto/curves/constants.js +1 -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/media/constants.js +33 -2
- package/dist/esm/media/crypto/WaMediaCrypto.js +374 -0
- package/dist/esm/media/index.js +4 -3
- package/dist/esm/media/sticker/sticker-pack.js +133 -0
- package/dist/esm/media/{WaMediaTransferClient.js → transfer/WaMediaTransferClient.js} +37 -6
- 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/{addon-crypto.js → crypto/addon-crypto.js} +68 -10
- package/dist/esm/message/{icdc.js → crypto/icdc.js} +5 -7
- package/dist/esm/message/crypto/phash.js +133 -0
- package/dist/esm/message/{reporting-token.js → crypto/reporting-token.js} +6 -6
- package/dist/esm/message/{use-case-secret.js → crypto/use-case-secret.js} +20 -3
- package/dist/esm/message/{content.js → encode/content.js} +176 -7
- 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/{incoming.js → primitives/incoming.js} +215 -31
- package/dist/esm/message/primitives/peer-data-operation.js +93 -0
- package/dist/esm/mex.js +1 -0
- package/dist/esm/protocol/abprops.js +10 -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 +8 -0
- package/dist/esm/protocol/business.js +19 -0
- package/dist/esm/protocol/call.js +48 -0
- package/dist/esm/protocol/constants.js +8 -2
- package/dist/esm/protocol/defaults.js +3 -0
- package/dist/esm/protocol/index.js +1 -1
- package/dist/esm/protocol/jid.js +102 -5
- 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 +22 -2
- package/dist/esm/protocol/notification.js +18 -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 +5 -0
- package/dist/esm/retry/replay.js +131 -37
- package/dist/esm/retry/tracker.js +4 -8
- package/dist/esm/signal/api/SignalDeviceSyncApi.js +69 -20
- package/dist/esm/signal/api/SignalDigestSyncApi.js +7 -2
- package/dist/esm/signal/api/SignalIdentitySyncApi.js +9 -0
- 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/{crypto → attestation}/WaAdvSignature.js +5 -6
- package/dist/esm/signal/constants.js +3 -0
- package/dist/esm/signal/encoding.js +6 -289
- package/dist/esm/signal/group/SenderKeyChain.js +18 -33
- package/dist/esm/signal/group/SenderKeyManager.js +25 -8
- 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 +10 -0
- package/dist/esm/signal/registration/utils.js +8 -1
- package/dist/esm/signal/session/SignalProtocol.js +113 -11
- package/dist/esm/signal/session/SignalRatchet.js +29 -58
- package/dist/esm/signal/session/SignalSession.js +7 -14
- package/dist/esm/signal/session/encoding.js +173 -0
- package/dist/esm/signal/session/resolver.js +139 -30
- 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/createStore.js +91 -37
- package/dist/esm/store/index.js +15 -14
- 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/pre-key.lock.js +4 -1
- 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} +22 -13
- package/dist/esm/store/{providers/memory → memory}/identity.store.js +3 -3
- package/dist/esm/store/{providers/memory → memory}/message-secret.store.js +17 -8
- package/dist/esm/store/{providers/memory → memory}/message.store.js +2 -2
- package/dist/esm/store/{providers/memory → memory}/pre-key.store.js +2 -2
- package/dist/esm/store/{providers/memory → memory}/privacy-token.store.js +1 -1
- package/dist/esm/store/{providers/memory → memory}/retry.store.js +28 -7
- package/dist/esm/store/{providers/memory → memory}/sender-key.store.js +3 -3
- package/dist/esm/store/{providers/memory → memory}/session.store.js +3 -3
- package/dist/esm/store/{providers/memory → memory}/thread.store.js +2 -2
- package/dist/esm/store/noop.store.js +6 -4
- package/dist/esm/transport/WaComms.js +14 -5
- package/dist/esm/transport/WaWebSocket.js +32 -8
- 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 +1 -0
- package/dist/esm/transport/keepalive/WaKeepAlive.js +18 -4
- package/dist/esm/transport/node/WaMobileTcpSocket.js +6 -0
- package/dist/esm/transport/node/WaNodeOrchestrator.js +9 -5
- package/dist/esm/transport/node/WaNodeTransport.js +13 -0
- package/dist/esm/transport/node/builders/abprops.js +2 -2
- 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 +2 -2
- package/dist/esm/transport/node/builders/email.js +6 -5
- 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/passive.js +7 -0
- package/dist/esm/transport/node/builders/prekeys.js +4 -4
- package/dist/esm/transport/node/builders/presence.js +27 -1
- package/dist/esm/transport/node/builders/privacy-token.js +2 -2
- 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/tos.js +58 -0
- package/dist/esm/transport/node/builders/usync.js +51 -2
- package/dist/esm/transport/node/helpers.js +3 -1
- package/dist/esm/transport/node/mex/argo-decoder.js +2 -2
- package/dist/esm/transport/node/mex/client.js +22 -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 +8 -8
- package/dist/esm/transport/noise/WaMobileClientPayload.js +5 -0
- package/dist/esm/transport/noise/WaNoiseCert.js +5 -0
- package/dist/esm/transport/noise/WaNoiseHandshake.js +27 -25
- package/dist/esm/transport/noise/WaNoiseSession.js +39 -59
- 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 +35 -5
- 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/media/constants.js +34 -3
- package/dist/media/crypto/WaMediaCrypto.js +378 -0
- package/dist/media/index.js +9 -4
- package/dist/media/sticker/sticker-pack.js +136 -0
- package/dist/media/{WaMediaTransferClient.js → transfer/WaMediaTransferClient.js} +37 -6
- 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/{addon-crypto.js → crypto/addon-crypto.js} +68 -10
- package/dist/message/{icdc.js → crypto/icdc.js} +5 -7
- package/dist/message/crypto/phash.js +136 -0
- package/dist/message/{reporting-token.js → crypto/reporting-token.js} +6 -6
- package/dist/message/{use-case-secret.js → crypto/use-case-secret.js} +20 -3
- package/dist/message/{content.js → encode/content.js} +192 -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} +216 -31
- 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 +10 -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 +8 -0
- package/dist/protocol/business.js +22 -0
- package/dist/protocol/call.js +51 -0
- package/dist/protocol/constants.js +39 -3
- package/dist/protocol/defaults.js +3 -0
- package/dist/protocol/index.js +12 -3
- package/dist/protocol/jid.js +107 -5
- 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 +22 -2
- package/dist/protocol/notification.js +19 -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 +5 -0
- package/dist/retry/replay.js +130 -36
- package/dist/retry/tracker.js +3 -7
- package/dist/signal/api/SignalDeviceSyncApi.js +67 -18
- package/dist/signal/api/SignalDigestSyncApi.js +7 -2
- package/dist/signal/api/SignalIdentitySyncApi.js +9 -0
- 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/{crypto → attestation}/WaAdvSignature.js +6 -8
- package/dist/signal/constants.js +4 -1
- package/dist/signal/encoding.js +5 -303
- package/dist/signal/group/SenderKeyChain.js +18 -33
- package/dist/signal/group/SenderKeyCodec.js +2 -2
- package/dist/signal/group/SenderKeyManager.js +26 -9
- 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 -1
- package/dist/signal/registration/utils.js +8 -1
- package/dist/signal/session/SignalProtocol.js +113 -11
- package/dist/signal/session/SignalRatchet.js +26 -56
- package/dist/signal/session/SignalSerializer.js +2 -2
- package/dist/signal/session/SignalSession.js +7 -15
- package/dist/signal/session/encoding.js +183 -0
- package/dist/signal/session/resolver.js +139 -30
- 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/createStore.js +90 -36
- package/dist/store/index.js +18 -16
- 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/pre-key.lock.js +4 -1
- 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} +24 -15
- package/dist/store/{providers/memory → memory}/identity.store.js +3 -3
- package/dist/store/{providers/memory → memory}/message-secret.store.js +17 -8
- package/dist/store/{providers/memory → memory}/message.store.js +2 -2
- package/dist/store/{providers/memory → memory}/pre-key.store.js +2 -2
- package/dist/store/{providers/memory → memory}/privacy-token.store.js +1 -1
- package/dist/store/{providers/memory → memory}/retry.store.js +28 -7
- package/dist/store/{providers/memory → memory}/sender-key.store.js +3 -3
- package/dist/store/{providers/memory → memory}/session.store.js +3 -3
- package/dist/store/{providers/memory → memory}/thread.store.js +2 -2
- package/dist/store/noop.store.js +7 -5
- package/dist/transport/WaComms.js +14 -5
- package/dist/transport/WaWebSocket.js +32 -8
- 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 +3 -1
- package/dist/transport/keepalive/WaKeepAlive.js +18 -4
- package/dist/transport/node/WaMobileTcpSocket.js +6 -0
- package/dist/transport/node/WaNodeOrchestrator.js +9 -5
- package/dist/transport/node/WaNodeTransport.js +13 -0
- package/dist/transport/node/builders/abprops.js +1 -1
- 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 +1 -1
- package/dist/transport/node/builders/email.js +6 -5
- package/dist/transport/node/builders/global.js +2 -2
- 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/passive.js +10 -0
- package/dist/transport/node/builders/prekeys.js +3 -3
- package/dist/transport/node/builders/presence.js +28 -1
- package/dist/transport/node/builders/privacy-token.js +1 -1
- package/dist/transport/node/builders/privacy.js +5 -5
- package/dist/transport/node/builders/profile.js +30 -7
- package/dist/transport/node/builders/tos.js +63 -0
- package/dist/transport/node/builders/usync.js +52 -1
- package/dist/transport/node/helpers.js +3 -2
- package/dist/transport/node/mex/argo-decoder.js +2 -2
- package/dist/transport/node/mex/client.js +23 -0
- package/dist/transport/node/query.js +17 -0
- package/dist/transport/node/usync.js +13 -0
- package/dist/transport/noise/WaClientPayload.js +9 -9
- package/dist/transport/noise/WaMobileClientPayload.js +6 -1
- package/dist/transport/noise/WaNoiseCert.js +7 -2
- package/dist/transport/noise/WaNoiseHandshake.js +26 -24
- package/dist/transport/noise/WaNoiseSession.js +41 -61
- package/dist/transport/noise/WaNoiseSocket.js +19 -13
- 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} +26 -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/{response-parser.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 +18 -2
- package/dist/types/appstate-spec.d.ts +24 -0
- package/dist/types/auth/WaAuthClient.d.ts +89 -3
- package/dist/types/auth/credentials-flow.d.ts +4 -3
- package/dist/types/auth/pairing/pairing-code-crypto.d.ts +0 -1
- package/dist/types/auth/types.d.ts +49 -2
- package/dist/types/client/WaClient.d.ts +178 -71
- package/dist/types/client/WaClientFactory.d.ts +30 -5
- 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/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 +44 -43
- package/dist/types/client/coordinators/WaEmailCoordinator.d.ts +16 -0
- package/dist/types/client/coordinators/WaGroupCoordinator.d.ts +311 -9
- package/dist/types/client/coordinators/WaIncomingNodeCoordinator.d.ts +11 -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 +55 -32
- package/dist/types/client/coordinators/WaNewsletterCoordinator.d.ts +13 -0
- package/dist/types/client/coordinators/WaPassiveTasksCoordinator.d.ts +4 -3
- package/dist/types/client/coordinators/WaPresenceCoordinator.d.ts +27 -0
- package/dist/types/client/coordinators/WaPrivacyCoordinator.d.ts +27 -0
- package/dist/types/client/coordinators/WaProfileCoordinator.d.ts +113 -0
- package/dist/types/client/coordinators/WaRetryCoordinator.d.ts +19 -17
- package/dist/types/client/coordinators/WaStatusCoordinator.d.ts +42 -0
- package/dist/types/client/coordinators/WaTrustedContactTokenCoordinator.d.ts +5 -1
- package/dist/types/client/events/abprops.d.ts +2 -1
- 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} +4 -3
- package/dist/types/client/events/group.d.ts +2 -1
- package/dist/types/client/events/identity.d.ts +2 -1
- package/dist/types/client/{incoming.d.ts → events/incoming.d.ts} +27 -4
- 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 +4 -3
- package/dist/types/client/index.d.ts +1 -1
- package/dist/types/client/media.d.ts +35 -1
- 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 +12 -1
- package/dist/types/client/persistence/history-sync.d.ts +29 -0
- package/dist/types/client/{mailbox.d.ts → persistence/mailbox.d.ts} +4 -4
- package/dist/types/client/tokens/cs-token.d.ts +1 -3
- package/dist/types/client/types.d.ts +844 -72
- package/dist/types/crypto/core/hkdf.d.ts +10 -2
- package/dist/types/crypto/core/index.d.ts +2 -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 +6 -0
- package/dist/types/crypto/core/xeddsa.d.ts +9 -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 -3
- package/dist/types/crypto/curves/types.d.ts +0 -5
- 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 +34 -8
- package/dist/types/infra/log/ConsoleLogger.d.ts +18 -1
- package/dist/types/infra/log/PinoLogger.d.ts +55 -1
- package/dist/types/infra/log/types.d.ts +6 -0
- package/dist/types/infra/perf/BackgroundQueue.d.ts +19 -0
- package/dist/types/media/constants.d.ts +7 -2
- package/dist/types/media/crypto/WaMediaCrypto.d.ts +59 -0
- package/dist/types/media/index.d.ts +7 -5
- package/dist/types/media/processor.d.ts +27 -5
- package/dist/types/media/sticker/sticker-pack.d.ts +6 -0
- package/dist/types/media/{WaMediaTransferClient.d.ts → transfer/WaMediaTransferClient.d.ts} +30 -1
- package/dist/types/media/transfer/conn.d.ts +7 -0
- package/dist/types/media/types.d.ts +1 -2
- 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/{addon-crypto.d.ts → crypto/addon-crypto.d.ts} +27 -5
- package/dist/types/message/{icdc.d.ts → crypto/icdc.d.ts} +4 -4
- 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 +209 -11
- package/dist/types/mex.d.ts +2 -0
- package/dist/types/proto.d.ts +2 -2
- package/dist/types/protocol/abprops.d.ts +9 -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 +8 -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 +16 -3
- package/dist/types/protocol/defaults.d.ts +3 -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 +78 -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 +20 -0
- package/dist/types/protocol/notification.d.ts +16 -0
- package/dist/types/protocol/presence.d.ts +16 -0
- package/dist/types/protocol/status.d.ts +7 -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 +5 -0
- 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 +10 -0
- package/dist/types/signal/api/SignalIdentitySyncApi.d.ts +9 -0
- 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 -2
- 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 -68
- package/dist/types/signal/group/SenderKeyChain.d.ts +1 -1
- package/dist/types/signal/group/SenderKeyManager.d.ts +18 -1
- 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 +5 -0
- package/dist/types/signal/session/SignalProtocol.d.ts +55 -0
- package/dist/types/signal/session/SignalRatchet.d.ts +2 -3
- 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 +14 -0
- package/dist/types/signal/types.d.ts +1 -1
- 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/message.store.d.ts +0 -2
- package/dist/types/store/createStore.d.ts +54 -2
- package/dist/types/store/index.d.ts +17 -16
- package/dist/types/store/locks/group-metadata.lock.d.ts +2 -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/{providers/memory → memory}/identity.store.d.ts +2 -2
- package/dist/types/store/{providers/memory → memory}/message-secret.store.d.ts +12 -2
- package/dist/types/store/{providers/memory → memory}/message.store.d.ts +1 -1
- package/dist/types/store/{providers/memory → memory}/pre-key.store.d.ts +2 -2
- 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 +16 -3
- package/dist/types/store/{providers/memory → memory}/sender-key.store.d.ts +2 -2
- package/dist/types/store/{providers/memory → memory}/session.store.d.ts +2 -2
- package/dist/types/store/{providers/memory → memory}/signal.store.d.ts +2 -2
- package/dist/types/store/{providers/memory → memory}/thread.store.d.ts +1 -1
- package/dist/types/store/noop.store.d.ts +2 -2
- package/dist/types/store/types.d.ts +250 -6
- package/dist/types/transport/WaComms.d.ts +5 -0
- package/dist/types/transport/WaWebSocket.d.ts +5 -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 +3 -1
- package/dist/types/transport/keepalive/WaKeepAlive.d.ts +7 -0
- package/dist/types/transport/node/WaMobileTcpSocket.d.ts +6 -0
- package/dist/types/transport/node/WaNodeOrchestrator.d.ts +5 -0
- package/dist/types/transport/node/WaNodeTransport.d.ts +13 -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/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/passive.d.ts +3 -0
- package/dist/types/transport/node/builders/presence.d.ts +8 -1
- 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 +1 -2
- package/dist/types/transport/node/mex/client.d.ts +12 -1
- 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 +6 -1
- package/dist/types/transport/noise/WaNoiseCert.d.ts +5 -0
- package/dist/types/transport/noise/WaNoiseHandshake.d.ts +12 -6
- package/dist/types/transport/noise/WaNoiseSession.d.ts +0 -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/noise/types.d.ts +1 -1
- package/dist/types/transport/proxy.d.ts +5 -0
- package/dist/types/transport/types.d.ts +14 -7
- 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 +32 -8
- 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/client/events/chat.js +0 -227
- package/dist/client/incoming.js +0 -306
- package/dist/client/mailbox.js +0 -66
- package/dist/client/messages.js +0 -305
- package/dist/esm/client/events/chat.js +0 -224
- package/dist/esm/client/incoming.js +0 -296
- package/dist/esm/client/mailbox.js +0 -63
- package/dist/esm/client/messages.js +0 -301
- package/dist/esm/media/WaMediaCrypto.js +0 -499
- package/dist/esm/message/phash.js +0 -47
- 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 -67
- package/dist/esm/transport/node/mex/persist-ids.js +0 -10
- package/dist/media/WaMediaCrypto.js +0 -503
- package/dist/message/phash.js +0 -50
- 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 -71
- package/dist/transport/node/mex/persist-ids.js +0 -13
- package/dist/types/appstate/WaAppStateSyncClient.d.ts +0 -70
- package/dist/types/client/events/chat.d.ts +0 -3
- package/dist/types/client/history-sync.d.ts +0 -20
- package/dist/types/client/messages.d.ts +0 -18
- package/dist/types/client/messaging/participants.d.ts +0 -13
- package/dist/types/media/WaMediaCrypto.d.ts +0 -22
- package/dist/types/media/conn.d.ts +0 -3
- package/dist/types/message/content.d.ts +0 -14
- package/dist/types/message/incoming.d.ts +0 -18
- package/dist/types/signal/crypto/constants.d.ts +0 -4
- 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/transport/node/mex/persist-ids.d.ts +0 -14
- 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/esm/signal/{crypto → attestation}/constants.js +0 -0
- /package/dist/esm/store/{providers/memory → memory}/signal.store.js +0 -0
- /package/dist/message/{device-sent.js → encode/device-sent.js} +0 -0
- /package/dist/signal/{crypto → attestation}/constants.js +0 -0
- /package/dist/store/{providers/memory → memory}/signal.store.js +0 -0
- /package/dist/types/message/{padding.d.ts → encode/padding.d.ts} +0 -0
|
@@ -2,10 +2,16 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.parseSyncResponse = parseSyncResponse;
|
|
4
4
|
exports.parseCollectionState = parseCollectionState;
|
|
5
|
-
const utils_1 = require("
|
|
6
|
-
const _proto_1 = require("
|
|
7
|
-
const constants_1 = require("
|
|
8
|
-
const helpers_1 = require("
|
|
5
|
+
const utils_1 = require("../utils");
|
|
6
|
+
const _proto_1 = require("../../proto");
|
|
7
|
+
const constants_1 = require("../../protocol/constants");
|
|
8
|
+
const helpers_1 = require("../../transport/node/helpers");
|
|
9
|
+
const primitives_1 = require("../../util/primitives");
|
|
10
|
+
/**
|
|
11
|
+
* Parses an app-state `sync` IQ response into one payload per collection,
|
|
12
|
+
* decoding embedded patches and snapshot references. Throws when the IQ is
|
|
13
|
+
* an error envelope or missing the `<sync>` child.
|
|
14
|
+
*/
|
|
9
15
|
function parseSyncResponse(iqNode) {
|
|
10
16
|
if (iqNode.tag !== constants_1.WA_NODE_TAGS.IQ) {
|
|
11
17
|
throw new Error(`invalid sync response tag ${iqNode.tag}`);
|
|
@@ -30,11 +36,10 @@ function parseSyncResponse(iqNode) {
|
|
|
30
36
|
const versionAttr = collectionNode.attrs.version;
|
|
31
37
|
let version;
|
|
32
38
|
if (versionAttr) {
|
|
33
|
-
|
|
34
|
-
if (
|
|
39
|
+
version = (0, primitives_1.parseOptionalInt)(versionAttr);
|
|
40
|
+
if (version === undefined) {
|
|
35
41
|
throw new Error(`invalid app-state collection version "${versionAttr}"`);
|
|
36
42
|
}
|
|
37
|
-
version = parsedVersion;
|
|
38
43
|
}
|
|
39
44
|
const [patchesNode, snapshotNode] = (0, helpers_1.findNodeChildrenByTags)(collectionNode, [
|
|
40
45
|
constants_1.WA_NODE_TAGS.PATCHES,
|
|
@@ -59,6 +64,11 @@ function parseSyncResponse(iqNode) {
|
|
|
59
64
|
}
|
|
60
65
|
return payloads;
|
|
61
66
|
}
|
|
67
|
+
/**
|
|
68
|
+
* Reads a `<collection>` node and returns the right
|
|
69
|
+
* {@link AppStateCollectionState} (success / has-more / conflict / fatal /
|
|
70
|
+
* retryable) based on its `type` attribute and embedded error code.
|
|
71
|
+
*/
|
|
62
72
|
function parseCollectionState(node) {
|
|
63
73
|
const type = node.attrs.type;
|
|
64
74
|
const hasMorePatches = node.attrs.has_more_patches === 'true';
|
|
@@ -75,7 +85,9 @@ function parseCollectionState(node) {
|
|
|
75
85
|
: constants_1.WA_APP_STATE_COLLECTION_STATES.CONFLICT;
|
|
76
86
|
}
|
|
77
87
|
if (code === constants_1.WA_APP_STATE_ERROR_CODES.BAD_REQUEST ||
|
|
78
|
-
code === constants_1.WA_APP_STATE_ERROR_CODES.NOT_FOUND
|
|
88
|
+
code === constants_1.WA_APP_STATE_ERROR_CODES.NOT_FOUND ||
|
|
89
|
+
code === constants_1.WA_APP_STATE_ERROR_CODES.NOT_ALLOWED ||
|
|
90
|
+
code === constants_1.WA_APP_STATE_ERROR_CODES.NOT_ACCEPTABLE) {
|
|
79
91
|
return constants_1.WA_APP_STATE_COLLECTION_STATES.ERROR_FATAL;
|
|
80
92
|
}
|
|
81
93
|
return constants_1.WA_APP_STATE_COLLECTION_STATES.ERROR_RETRY;
|
|
@@ -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
|
|
6
|
-
const
|
|
7
|
-
const _crypto_1 = require("
|
|
8
|
-
const _proto_1 = require("
|
|
9
|
-
const constants_2 = require("
|
|
10
|
-
const jid_1 = require("
|
|
11
|
-
const query_1 = require("
|
|
12
|
-
const bytes_1 = require("
|
|
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");
|
|
8
|
+
const _proto_1 = require("../../proto");
|
|
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,25 +19,33 @@ 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;
|
|
37
|
+
this.isOwnAccountDevice = options.isOwnAccountDevice;
|
|
38
|
+
this.sendKeyShare = options.sendKeyShare;
|
|
39
|
+
this.triggerSync = options.triggerSync;
|
|
32
40
|
this.crypto = new WaAppStateCrypto_1.WaAppStateCrypto(undefined, options.skipMacVerification === true);
|
|
33
41
|
this.mobilePrimary = options.mobilePrimary ?? false;
|
|
34
42
|
this.syncContext = null;
|
|
35
43
|
this.syncPromise = null;
|
|
36
44
|
}
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
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
|
+
*/
|
|
41
49
|
async ensureInitialSyncKey() {
|
|
42
50
|
const existing = await this.store.getActiveSyncKey();
|
|
43
51
|
if (existing) {
|
|
@@ -49,7 +57,7 @@ class WaAppStateSyncClient {
|
|
|
49
57
|
const key = {
|
|
50
58
|
keyId: keyIdBytes,
|
|
51
59
|
keyData,
|
|
52
|
-
timestamp:
|
|
60
|
+
timestamp: this.serverClock.nowMs(),
|
|
53
61
|
fingerprint: { rawId, currentIndex: 0, deviceIndexes: [0] }
|
|
54
62
|
};
|
|
55
63
|
await this.store.upsertSyncKeys([key]);
|
|
@@ -60,6 +68,7 @@ class WaAppStateSyncClient {
|
|
|
60
68
|
});
|
|
61
69
|
return key;
|
|
62
70
|
}
|
|
71
|
+
/** Imports peer-shared sync keys into the store; returns the count actually added. */
|
|
63
72
|
async importSyncKeys(keys) {
|
|
64
73
|
this.logger.debug('app-state importing sync keys', { count: keys.length });
|
|
65
74
|
const inserted = await this.store.upsertSyncKeys(keys);
|
|
@@ -69,6 +78,119 @@ class WaAppStateSyncClient {
|
|
|
69
78
|
}
|
|
70
79
|
return inserted;
|
|
71
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. */
|
|
72
194
|
async importSyncKeyShare(share) {
|
|
73
195
|
const keys = [];
|
|
74
196
|
for (const item of share.keys ?? []) {
|
|
@@ -84,13 +206,19 @@ class WaAppStateSyncClient {
|
|
|
84
206
|
keyId,
|
|
85
207
|
keyData,
|
|
86
208
|
timestamp: item.keyData?.timestamp === null || item.keyData?.timestamp === undefined
|
|
87
|
-
?
|
|
209
|
+
? this.serverClock.nowMs()
|
|
88
210
|
: this.normalizeProtoLong(item.keyData?.timestamp, 'appStateSyncKeyShare.keys[].keyData.timestamp'),
|
|
89
211
|
fingerprint: item.keyData?.fingerprint ?? undefined
|
|
90
212
|
});
|
|
91
213
|
}
|
|
92
214
|
return this.importSyncKeys(keys);
|
|
93
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
|
+
*/
|
|
94
222
|
async sync(options = {}) {
|
|
95
223
|
if (this.syncPromise) {
|
|
96
224
|
this.logger.debug('app-state sync already in flight, joining existing run');
|
|
@@ -122,7 +250,7 @@ class WaAppStateSyncClient {
|
|
|
122
250
|
for (let index = 0; index < collections.length; index += 1) {
|
|
123
251
|
context.collections.set(collections[index], initialCollectionStates[index]);
|
|
124
252
|
}
|
|
125
|
-
this.logger.
|
|
253
|
+
this.logger.debug('app-state sync start', {
|
|
126
254
|
collections: collections.length,
|
|
127
255
|
pendingMutations: options.pendingMutations?.length ?? 0
|
|
128
256
|
});
|
|
@@ -172,13 +300,13 @@ class WaAppStateSyncClient {
|
|
|
172
300
|
}
|
|
173
301
|
if (stateChanged && context.dirtyCollections.size > 0) {
|
|
174
302
|
await this.persistCollectionUpdates();
|
|
175
|
-
this.logger.
|
|
303
|
+
this.logger.debug('app-state sync persisted updated state');
|
|
176
304
|
}
|
|
177
305
|
const orderedResults = collections.map((collection) => resultMap.get(collection) ?? {
|
|
178
306
|
collection,
|
|
179
307
|
state: constants_2.WA_APP_STATE_COLLECTION_STATES.ERROR_RETRY
|
|
180
308
|
});
|
|
181
|
-
this.logger.
|
|
309
|
+
this.logger.debug('app-state sync finished', {
|
|
182
310
|
collections: orderedResults.length,
|
|
183
311
|
stateChanged
|
|
184
312
|
});
|
|
@@ -332,11 +460,12 @@ class WaAppStateSyncClient {
|
|
|
332
460
|
return payloadByCollection;
|
|
333
461
|
}
|
|
334
462
|
async processCollectionRound({ collection, payloadByCollection, pendingByCollection, options, outgoingContexts, skippedUploadCollections }) {
|
|
463
|
+
const collectionLogger = this.logger.child({ collection });
|
|
335
464
|
const payload = payloadByCollection.get(collection);
|
|
336
465
|
let shouldRefetch = false;
|
|
337
466
|
let collectionStateChanged = false;
|
|
338
467
|
if (!payload) {
|
|
339
|
-
|
|
468
|
+
collectionLogger.warn('app-state sync response missing collection payload');
|
|
340
469
|
return this.createCollectionOutcome(collection, constants_2.WA_APP_STATE_COLLECTION_STATES.ERROR_RETRY);
|
|
341
470
|
}
|
|
342
471
|
if (payload.state === constants_2.WA_APP_STATE_COLLECTION_STATES.ERROR_FATAL ||
|
|
@@ -396,8 +525,7 @@ class WaAppStateSyncClient {
|
|
|
396
525
|
payload.state === constants_2.WA_APP_STATE_COLLECTION_STATES.SUCCESS_HAS_MORE ||
|
|
397
526
|
(payload.state === constants_2.WA_APP_STATE_COLLECTION_STATES.SUCCESS &&
|
|
398
527
|
skippedUploadCollections.has(collection));
|
|
399
|
-
|
|
400
|
-
collection: payload.collection,
|
|
528
|
+
collectionLogger.debug('app-state collection processed', {
|
|
401
529
|
state: payload.state,
|
|
402
530
|
version: payload.version,
|
|
403
531
|
appliedMutations: appliedMutations.length
|
|
@@ -406,16 +534,13 @@ class WaAppStateSyncClient {
|
|
|
406
534
|
}
|
|
407
535
|
catch (error) {
|
|
408
536
|
if (error instanceof WaAppStateMissingKeyError) {
|
|
409
|
-
|
|
410
|
-
collection: payload.collection,
|
|
537
|
+
collectionLogger.debug('app-state blocked by missing key', {
|
|
411
538
|
message: error.message
|
|
412
539
|
});
|
|
413
540
|
return this.createCollectionOutcome(collection, constants_2.WA_APP_STATE_COLLECTION_STATES.BLOCKED, payload.version, shouldRefetch, collectionStateChanged, undefined, error.keyId);
|
|
414
541
|
}
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
collection: payload.collection,
|
|
418
|
-
message
|
|
542
|
+
collectionLogger.debug('app-state collection processing failed', {
|
|
543
|
+
message: (0, primitives_1.toError)(error).message
|
|
419
544
|
});
|
|
420
545
|
return this.createCollectionOutcome(collection, constants_2.WA_APP_STATE_COLLECTION_STATES.ERROR_RETRY, payload.version, true, collectionStateChanged);
|
|
421
546
|
}
|
|
@@ -441,11 +566,13 @@ class WaAppStateSyncClient {
|
|
|
441
566
|
return;
|
|
442
567
|
}
|
|
443
568
|
const keyIdsHex = keyIds.map((keyId) => (0, bytes_1.bytesToHex)(keyId));
|
|
444
|
-
this.logger.
|
|
569
|
+
const requestLogger = this.logger.child({
|
|
445
570
|
keys: keyIdsHex.length,
|
|
446
|
-
keyIds: keyIdsHex.join(','),
|
|
447
571
|
collections: collections.join(',')
|
|
448
572
|
});
|
|
573
|
+
requestLogger.debug('app-state requesting missing sync keys', {
|
|
574
|
+
keyIds: keyIdsHex.join(',')
|
|
575
|
+
});
|
|
449
576
|
try {
|
|
450
577
|
await input.onMissingKeys({
|
|
451
578
|
keyIds,
|
|
@@ -453,10 +580,8 @@ class WaAppStateSyncClient {
|
|
|
453
580
|
});
|
|
454
581
|
}
|
|
455
582
|
catch (error) {
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
collections: collections.join(','),
|
|
459
|
-
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
|
|
460
585
|
});
|
|
461
586
|
}
|
|
462
587
|
}
|
|
@@ -479,7 +604,8 @@ class WaAppStateSyncClient {
|
|
|
479
604
|
const decodedMutations = _proto_1.proto.SyncdMutations.decode(patchBytes);
|
|
480
605
|
readyPatch = {
|
|
481
606
|
...readyPatch,
|
|
482
|
-
mutations: decodedMutations.mutations ?? []
|
|
607
|
+
mutations: decodedMutations.mutations ?? [],
|
|
608
|
+
externalMutations: undefined
|
|
483
609
|
};
|
|
484
610
|
}
|
|
485
611
|
return this.validatePatch(payload.collection, readyPatch);
|
|
@@ -569,7 +695,7 @@ class WaAppStateSyncClient {
|
|
|
569
695
|
const ltHash = await this.crypto.ltHashAdd(constants_1.APP_STATE_EMPTY_LT_HASH, ltHashInput);
|
|
570
696
|
if (keyData !== null) {
|
|
571
697
|
const expectedSnapshotMac = await this.crypto.generateSnapshotMac(keyData, ltHash, version, collection);
|
|
572
|
-
if (!(0, bytes_1.
|
|
698
|
+
if (!(0, bytes_1.uint8TimingSafeEqual)(expectedSnapshotMac, snapshot.mac)) {
|
|
573
699
|
throw new Error(`snapshot MAC mismatch for ${collection}`);
|
|
574
700
|
}
|
|
575
701
|
}
|
|
@@ -708,12 +834,16 @@ class WaAppStateSyncClient {
|
|
|
708
834
|
async assertPatchMacsMatch(patch, collection, patchKeyData, patchVersion, nextHash, valueMacs) {
|
|
709
835
|
const snapshotMac = (0, bytes_1.decodeProtoBytes)(patch.snapshotMac, `patch.snapshotMac (${collection})`);
|
|
710
836
|
const expectedSnapshotMac = await this.crypto.generateSnapshotMac(patchKeyData, nextHash, patchVersion, collection);
|
|
711
|
-
|
|
712
|
-
|
|
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
|
+
});
|
|
713
843
|
}
|
|
714
844
|
const patchMac = (0, bytes_1.decodeProtoBytes)(patch.patchMac, `patch.patchMac (${collection})`);
|
|
715
845
|
const expectedPatchMac = await this.crypto.generatePatchMac(patchKeyData, snapshotMac, valueMacs, patchVersion, collection);
|
|
716
|
-
if (!(0, bytes_1.
|
|
846
|
+
if (!(0, bytes_1.uint8TimingSafeEqual)(expectedPatchMac, patchMac)) {
|
|
717
847
|
throw new Error(`patch MAC mismatch for ${collection}`);
|
|
718
848
|
}
|
|
719
849
|
}
|
|
@@ -722,7 +852,7 @@ class WaAppStateSyncClient {
|
|
|
722
852
|
throw new WaAppStateMissingKeyError(`no sync key available to upload ${collection}`, null, collection);
|
|
723
853
|
}
|
|
724
854
|
const encryptedResults = await Promise.all(pendingMutations.map(async (mutation) => {
|
|
725
|
-
const value = mutation.operation === 'set' ? mutation.value :
|
|
855
|
+
const value = mutation.operation === 'set' ? mutation.value : null;
|
|
726
856
|
const operationCode = mutation.operation === 'remove'
|
|
727
857
|
? _proto_1.proto.SyncdMutation.SyncdOperation.REMOVE
|
|
728
858
|
: _proto_1.proto.SyncdMutation.SyncdOperation.SET;
|
|
@@ -761,14 +891,12 @@ class WaAppStateSyncClient {
|
|
|
761
891
|
const snapshotMac = await this.crypto.generateSnapshotMac(activeKey.keyData, nextState.hash, patchVersion, collection);
|
|
762
892
|
const patchMac = await this.crypto.generatePatchMac(activeKey.keyData, snapshotMac, valueMacs, patchVersion, collection);
|
|
763
893
|
const deviceIndex = this.resolveDeviceIndex();
|
|
764
|
-
const clientDebugData = this.buildPatchClientDebugData();
|
|
765
894
|
const encodedPatch = _proto_1.proto.SyncdPatch.encode({
|
|
766
895
|
mutations: encryptedMutations,
|
|
767
896
|
snapshotMac,
|
|
768
897
|
patchMac,
|
|
769
898
|
keyId: { id: activeKey.keyId },
|
|
770
|
-
...(deviceIndex === undefined ? {} : { deviceIndex })
|
|
771
|
-
clientDebugData
|
|
899
|
+
...(deviceIndex === undefined ? {} : { deviceIndex })
|
|
772
900
|
}).finish();
|
|
773
901
|
return {
|
|
774
902
|
encodedPatch,
|
|
@@ -796,12 +924,6 @@ class WaAppStateSyncClient {
|
|
|
796
924
|
return undefined;
|
|
797
925
|
}
|
|
798
926
|
}
|
|
799
|
-
buildPatchClientDebugData() {
|
|
800
|
-
return _proto_1.proto.PatchDebugData.encode({
|
|
801
|
-
isSenderPrimary: false,
|
|
802
|
-
senderPlatform: _proto_1.proto.PatchDebugData.Platform.WEB
|
|
803
|
-
}).finish();
|
|
804
|
-
}
|
|
805
927
|
async computeNextCollectionState(baseHash, baseMap, mutations, collection) {
|
|
806
928
|
const indexValueMap = new Map(baseMap);
|
|
807
929
|
const addValues = [];
|
|
@@ -842,8 +964,7 @@ class WaAppStateSyncClient {
|
|
|
842
964
|
return (0, primitives_1.longToNumber)(value);
|
|
843
965
|
}
|
|
844
966
|
catch (error) {
|
|
845
|
-
|
|
846
|
-
throw new Error(`invalid ${field}: ${reason}`);
|
|
967
|
+
throw new Error(`invalid ${field}: ${(0, primitives_1.toError)(error).message}`);
|
|
847
968
|
}
|
|
848
969
|
}
|
|
849
970
|
groupPendingMutations(pendingMutations) {
|
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');
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.WA_APPSTATE_SCHEMA_BY_ACTION_NAME = exports.WA_APPSTATE_SCHEMAS = exports.WA_APPSTATE_COLLECTIONS = void 0;
|
|
4
|
+
exports.getAppstateSchemaByActionName = getAppstateSchemaByActionName;
|
|
5
|
+
exports.resolveEnumObject = resolveEnumObject;
|
|
6
|
+
exports.encodeEnumValue = encodeEnumValue;
|
|
7
|
+
exports.decodeEnumValue = decodeEnumValue;
|
|
8
|
+
exports.decodeIndexArgsFromSchema = decodeIndexArgsFromSchema;
|
|
9
|
+
const _proto_1 = require("./proto");
|
|
10
|
+
const appstate_1 = require("../spec/appstate");
|
|
11
|
+
var appstate_2 = require("../spec/appstate");
|
|
12
|
+
Object.defineProperty(exports, "WA_APPSTATE_COLLECTIONS", { enumerable: true, get: function () { return appstate_2.WA_APPSTATE_COLLECTIONS; } });
|
|
13
|
+
Object.defineProperty(exports, "WA_APPSTATE_SCHEMAS", { enumerable: true, get: function () { return appstate_2.WA_APPSTATE_SCHEMAS; } });
|
|
14
|
+
const SCHEMA_BY_ACTION_NAME_BUILDER = {};
|
|
15
|
+
for (const key of Object.keys(appstate_1.WA_APPSTATE_SCHEMAS)) {
|
|
16
|
+
SCHEMA_BY_ACTION_NAME_BUILDER[appstate_1.WA_APPSTATE_SCHEMAS[key].name] = key;
|
|
17
|
+
}
|
|
18
|
+
exports.WA_APPSTATE_SCHEMA_BY_ACTION_NAME = Object.freeze(SCHEMA_BY_ACTION_NAME_BUILDER);
|
|
19
|
+
function getAppstateSchemaByActionName(actionName) {
|
|
20
|
+
const key = exports.WA_APPSTATE_SCHEMA_BY_ACTION_NAME[actionName];
|
|
21
|
+
if (!key) {
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
return { key, schema: appstate_1.WA_APPSTATE_SCHEMAS[key] };
|
|
25
|
+
}
|
|
26
|
+
function resolveEnumObject(protoEnumPath) {
|
|
27
|
+
const segments = protoEnumPath.split('.');
|
|
28
|
+
let cursor = _proto_1.proto.SyncActionValue;
|
|
29
|
+
for (const seg of segments) {
|
|
30
|
+
if (cursor === null || cursor === undefined)
|
|
31
|
+
return null;
|
|
32
|
+
if (typeof cursor !== 'object' && typeof cursor !== 'function')
|
|
33
|
+
return null;
|
|
34
|
+
cursor = cursor[seg];
|
|
35
|
+
}
|
|
36
|
+
if (cursor === null || cursor === undefined)
|
|
37
|
+
return null;
|
|
38
|
+
if (typeof cursor !== 'object' && typeof cursor !== 'function')
|
|
39
|
+
return null;
|
|
40
|
+
return cursor;
|
|
41
|
+
}
|
|
42
|
+
function encodeEnumValue(protoEnumPath, name) {
|
|
43
|
+
const enumObj = resolveEnumObject(protoEnumPath);
|
|
44
|
+
if (!enumObj)
|
|
45
|
+
return null;
|
|
46
|
+
const value = enumObj[name];
|
|
47
|
+
return typeof value === 'number' ? value : null;
|
|
48
|
+
}
|
|
49
|
+
function decodeEnumValue(protoEnumPath, value) {
|
|
50
|
+
const enumObj = resolveEnumObject(protoEnumPath);
|
|
51
|
+
if (!enumObj)
|
|
52
|
+
return null;
|
|
53
|
+
for (const key of Object.keys(enumObj)) {
|
|
54
|
+
if (enumObj[key] === value)
|
|
55
|
+
return key;
|
|
56
|
+
}
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
function decodeIndexArgsFromSchema(schema, parts) {
|
|
60
|
+
if (parts.length !== schema.indexParts.length) {
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
const args = {};
|
|
64
|
+
for (let i = 0; i < schema.indexParts.length; i += 1) {
|
|
65
|
+
const part = schema.indexParts[i];
|
|
66
|
+
const raw = parts[i];
|
|
67
|
+
if (part.type === 'literal') {
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
if (part.type === 'boolString') {
|
|
71
|
+
if (raw !== '0' && raw !== '1')
|
|
72
|
+
return null;
|
|
73
|
+
args[part.name] = raw === '1';
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
if (part.type === 'jidOrZero') {
|
|
77
|
+
args[part.name] = raw === '0' ? null : raw;
|
|
78
|
+
continue;
|
|
79
|
+
}
|
|
80
|
+
if (part.type === 'enum') {
|
|
81
|
+
const numeric = Number(raw);
|
|
82
|
+
const name = Number.isFinite(numeric) ? decodeEnumValue(part.protoEnum, numeric) : null;
|
|
83
|
+
args[part.name] = name ?? raw;
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
args[part.name] = raw;
|
|
87
|
+
}
|
|
88
|
+
return args;
|
|
89
|
+
}
|