zapo-js 0.3.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 +97 -177
- 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 +19 -7
- package/dist/auth/pairing/WaPairingFlow.js +33 -24
- package/dist/auth/pairing/pairing-code-crypto.js +16 -18
- package/dist/client/WaClient.js +342 -473
- package/dist/client/WaClientFactory.js +279 -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 +682 -204
- 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 +256 -125
- package/dist/client/coordinators/WaStatusCoordinator.js +49 -0
- package/dist/client/coordinators/WaStreamControlCoordinator.js +6 -6
- 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 +161 -4
- 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 +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 +280 -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 +6 -6
- 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 +156 -6
- 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 +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 +66 -19
- 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 +6 -0
- 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/{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 +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/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 +129 -35
- package/dist/retry/tracker.js +3 -7
- package/dist/signal/api/SignalDeviceSyncApi.js +64 -17
- package/dist/signal/api/SignalDigestSyncApi.js +6 -1
- 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 +5 -7
- package/dist/signal/constants.js +4 -1
- package/dist/signal/encoding.js +5 -303
- package/dist/signal/group/SenderKeyChain.js +17 -32
- package/dist/signal/group/SenderKeyManager.js +24 -7
- 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 +10 -0
- package/dist/signal/registration/utils.js +6 -0
- package/dist/signal/session/SignalProtocol.js +112 -10
- package/dist/signal/session/SignalRatchet.js +24 -54
- package/dist/signal/session/SignalSession.js +6 -14
- 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/{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 +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/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 +2 -1
- 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 +8 -8
- package/dist/transport/noise/WaMobileClientPayload.js +5 -0
- package/dist/transport/noise/WaNoiseCert.js +5 -0
- package/dist/transport/noise/WaNoiseHandshake.js +25 -23
- package/dist/transport/noise/WaNoiseSession.js +39 -59
- 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} +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/utils.d.ts +17 -1
- 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 +48 -1
- 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 +54 -31
- 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 +843 -71
- 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 +32 -6
- 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 +208 -10
- 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 +17 -0
- 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/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 +5 -0
- 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/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
|
@@ -5,8 +5,18 @@ import { getWaCompanionPlatformId, WA_DEFAULTS } from '../protocol/constants.js'
|
|
|
5
5
|
import { uint8Equal } from '../util/bytes.js';
|
|
6
6
|
import { toError } from '../util/primitives.js';
|
|
7
7
|
import { getRuntimeOsDisplayName } from '../util/runtime.js';
|
|
8
|
+
/**
|
|
9
|
+
* Owns the auth/pairing lifecycle and persistence of {@link WaAuthCredentials}.
|
|
10
|
+
* Exposed as `client.auth` on a {@link WaClient}.
|
|
11
|
+
*
|
|
12
|
+
* Lifecycle: construct with options + dependencies, call
|
|
13
|
+
* {@link loadOrCreateCredentials} to bring credentials online, then either
|
|
14
|
+
* follow the QR flow (`onQr` callback) or call {@link requestPairingCode} for
|
|
15
|
+
* the link-code flow.
|
|
16
|
+
*/
|
|
8
17
|
export class WaAuthClient {
|
|
9
18
|
constructor(options, deps) {
|
|
19
|
+
this.versionOverride = null;
|
|
10
20
|
const deviceBrowser = options.deviceBrowser ?? WA_DEFAULTS.DEVICE_BROWSER;
|
|
11
21
|
const device = Object.freeze({
|
|
12
22
|
browser: deviceBrowser,
|
|
@@ -25,6 +35,7 @@ export class WaAuthClient {
|
|
|
25
35
|
this.authStore = deps.authStore;
|
|
26
36
|
this.signalStore = deps.signalStore;
|
|
27
37
|
this.preKeyStore = deps.preKeyStore;
|
|
38
|
+
this.isConnected = deps.isConnected;
|
|
28
39
|
this.credentials = null;
|
|
29
40
|
this.qrFlow = new WaQrFlow({
|
|
30
41
|
logger: this.logger,
|
|
@@ -49,6 +60,10 @@ export class WaAuthClient {
|
|
|
49
60
|
dangerous: options.dangerous
|
|
50
61
|
});
|
|
51
62
|
}
|
|
63
|
+
/**
|
|
64
|
+
* Returns a snapshot of auth readiness flags (connection, registration,
|
|
65
|
+
* pending QR/pairing prompts).
|
|
66
|
+
*/
|
|
52
67
|
getState(connected = false) {
|
|
53
68
|
return {
|
|
54
69
|
connected,
|
|
@@ -57,9 +72,14 @@ export class WaAuthClient {
|
|
|
57
72
|
hasPairingCode: this.pairingFlow.hasPairingSession()
|
|
58
73
|
};
|
|
59
74
|
}
|
|
75
|
+
/** Returns the currently-loaded credentials, or `null` before initialization. */
|
|
60
76
|
getCurrentCredentials() {
|
|
61
77
|
return this.credentials;
|
|
62
78
|
}
|
|
79
|
+
/**
|
|
80
|
+
* Loads persisted credentials from the auth store, or generates a fresh
|
|
81
|
+
* set when none exist. Must be called before connecting.
|
|
82
|
+
*/
|
|
63
83
|
async loadOrCreateCredentials() {
|
|
64
84
|
return this.runHandled(async () => {
|
|
65
85
|
this.logger.debug('auth client loadOrCreateCredentials start');
|
|
@@ -76,29 +96,56 @@ export class WaAuthClient {
|
|
|
76
96
|
return this.credentials;
|
|
77
97
|
});
|
|
78
98
|
}
|
|
79
|
-
|
|
99
|
+
/**
|
|
100
|
+
* Builds a {@link WaCommsConfig} from the current credentials and the
|
|
101
|
+
* runtime device/transport options – feeds {@link WaComms}.
|
|
102
|
+
*/
|
|
103
|
+
async buildCommsConfig(socketOptions, overrides = {}) {
|
|
80
104
|
this.logger.trace('auth client building comms config');
|
|
105
|
+
const override = this.versionOverride;
|
|
106
|
+
this.versionOverride = null;
|
|
81
107
|
return buildCommsConfig(this.logger, this.requireCredentials(), socketOptions, {
|
|
82
108
|
deviceBrowser: this.options.deviceBrowser,
|
|
83
109
|
deviceOsDisplayName: this.options.deviceOsDisplayName,
|
|
84
110
|
requireFullSync: this.options.requireFullSync,
|
|
85
|
-
version: this.options.version,
|
|
111
|
+
version: override ?? this.options.version,
|
|
86
112
|
mobileTransport: this.options.mobileTransport,
|
|
87
113
|
noiseTrustedRootCa: overrides.noiseTrustedRootCa,
|
|
88
114
|
disableNoiseCertificateChainVerification: overrides.disableNoiseCertificateChainVerification ??
|
|
89
115
|
this.options.dangerous?.disableNoiseCertificateChainVerification
|
|
90
116
|
});
|
|
91
117
|
}
|
|
118
|
+
/**
|
|
119
|
+
* One-shot override for the next {@link buildCommsConfig} call: takes
|
|
120
|
+
* precedence over the user-supplied `version` option, then clears. Used
|
|
121
|
+
* by the `recoverFromClientTooOld` auto-retry to inject a fresh version
|
|
122
|
+
* string fetched from `web.whatsapp.com` without mutating the user's
|
|
123
|
+
* options.
|
|
124
|
+
*/
|
|
125
|
+
setNextConnectVersion(version) {
|
|
126
|
+
this.versionOverride = version;
|
|
127
|
+
}
|
|
128
|
+
/** Clears the in-memory QR and pairing sessions without touching storage. */
|
|
129
|
+
// eslint-disable-next-line @typescript-eslint/require-await
|
|
92
130
|
async clearTransientState() {
|
|
93
131
|
this.logger.trace('auth client clear transient state');
|
|
94
132
|
this.qrFlow.clear();
|
|
95
133
|
this.pairingFlow.clearSession();
|
|
96
134
|
}
|
|
135
|
+
/**
|
|
136
|
+
* Wipes credentials from memory **and** from the auth store. Does
|
|
137
|
+
* **not** touch the other store domains (signal, app-state, ...) -
|
|
138
|
+
* those are cleared separately when {@link WaClient.logout} triggers
|
|
139
|
+
* the server-side logout path, honoring `options.logoutStoreClear`.
|
|
140
|
+
* Call this manually only when you want to force a re-pair without
|
|
141
|
+
* going through the server logout IQ.
|
|
142
|
+
*/
|
|
97
143
|
async clearStoredCredentials() {
|
|
98
144
|
this.logger.warn('auth client clearing stored credentials');
|
|
99
145
|
this.credentials = null;
|
|
100
146
|
await Promise.all([this.authStore.clear(), this.clearTransientState()]);
|
|
101
147
|
}
|
|
148
|
+
/** Stores the server's noise static key for subsequent handshakes. */
|
|
102
149
|
async persistServerStaticKey(serverStaticKey) {
|
|
103
150
|
this.logger.debug('persisting server static key', {
|
|
104
151
|
keyLength: serverStaticKey.byteLength
|
|
@@ -108,6 +155,7 @@ export class WaAuthClient {
|
|
|
108
155
|
serverStaticKey
|
|
109
156
|
}));
|
|
110
157
|
}
|
|
158
|
+
/** Stores the "server holds prekeys" flag; persists only when the value changes. */
|
|
111
159
|
async persistServerHasPreKeys(serverHasPreKeys) {
|
|
112
160
|
await this.patchCredentials((credentials) => ({
|
|
113
161
|
...credentials,
|
|
@@ -121,6 +169,10 @@ export class WaAuthClient {
|
|
|
121
169
|
}
|
|
122
170
|
});
|
|
123
171
|
}
|
|
172
|
+
/**
|
|
173
|
+
* Stores the routing-info blob received from the server. Skips persistence
|
|
174
|
+
* when the value matches the one already on disk.
|
|
175
|
+
*/
|
|
124
176
|
async persistRoutingInfo(routingInfo) {
|
|
125
177
|
this.logger.trace('persisting routing info', {
|
|
126
178
|
byteLength: routingInfo.byteLength
|
|
@@ -138,6 +190,7 @@ export class WaAuthClient {
|
|
|
138
190
|
}
|
|
139
191
|
});
|
|
140
192
|
}
|
|
193
|
+
/** Clears the persisted routing-info blob (used after a routing error). */
|
|
141
194
|
async clearRoutingInfo() {
|
|
142
195
|
return this.patchCredentials((credentials) => ({
|
|
143
196
|
...credentials,
|
|
@@ -149,6 +202,11 @@ export class WaAuthClient {
|
|
|
149
202
|
}
|
|
150
203
|
});
|
|
151
204
|
}
|
|
205
|
+
/**
|
|
206
|
+
* Persists the per-connection success attributes from the server (LID,
|
|
207
|
+
* display name, companion key, last-success ts, props versions, ...). Only
|
|
208
|
+
* persists when at least one attribute actually changed.
|
|
209
|
+
*/
|
|
152
210
|
async persistSuccessAttributes(attributes) {
|
|
153
211
|
let persistDiff;
|
|
154
212
|
const computeDiff = (current, next) => ({
|
|
@@ -185,24 +243,56 @@ export class WaAuthClient {
|
|
|
185
243
|
}
|
|
186
244
|
});
|
|
187
245
|
}
|
|
188
|
-
|
|
246
|
+
/**
|
|
247
|
+
* Requests an 8-character pairing code for `phoneNumber` (link-code flow).
|
|
248
|
+
* Pass `customCode` to suggest a specific code; the server still validates
|
|
249
|
+
* and may return a different one.
|
|
250
|
+
*
|
|
251
|
+
* The client must already be connected – kick off `WaClient.connect()` in
|
|
252
|
+
* parallel, wait for the `auth_pairing_required` event (or any QR), then
|
|
253
|
+
* call this. The user then enters the returned code in WhatsApp on their
|
|
254
|
+
* phone under *Linked Devices → Link with phone number instead*.
|
|
255
|
+
*
|
|
256
|
+
* @example
|
|
257
|
+
* ```ts
|
|
258
|
+
* // Start the handshake; do NOT await – connect() resolves only after pairing
|
|
259
|
+
* void client.connect()
|
|
260
|
+
*
|
|
261
|
+
* // Wait until the pairing screen is ready on the server side
|
|
262
|
+
* await new Promise<void>((resolve) => client.once('auth_pairing_required', () => resolve()))
|
|
263
|
+
*
|
|
264
|
+
* // Phone number in international format, digits only
|
|
265
|
+
* const code = await client.auth.requestPairingCode('5511999999999')
|
|
266
|
+
* console.log(`enter this on your phone: ${code.match(/.{1,4}/g)!.join('-')}`)
|
|
267
|
+
*
|
|
268
|
+
* // The `connect()` promise resolves after the user types the code:
|
|
269
|
+
* await new Promise<void>((resolve) => client.once('auth_paired', () => resolve()))
|
|
270
|
+
* ```
|
|
271
|
+
*/
|
|
272
|
+
async requestPairingCode(phoneNumber, shouldShowPushNotification = true, customCode) {
|
|
273
|
+
this.requireConnected();
|
|
189
274
|
this.requireCredentials();
|
|
190
|
-
this.logger.
|
|
275
|
+
this.logger.debug('auth client requesting pairing code');
|
|
191
276
|
return this.runHandled(() => this.pairingFlow.requestPairingCode(phoneNumber, shouldShowPushNotification, customCode));
|
|
192
277
|
}
|
|
278
|
+
/** Fetches the ISO country code the server resolved for the current account. */
|
|
193
279
|
async fetchPairingCountryCodeIso() {
|
|
280
|
+
this.requireConnected();
|
|
194
281
|
this.requireCredentials();
|
|
195
282
|
this.logger.trace('auth client fetching pairing country code ISO');
|
|
196
283
|
return this.runHandled(() => this.pairingFlow.fetchPairingCountryCodeIso());
|
|
197
284
|
}
|
|
285
|
+
/** Dispatcher: returns `true` when `node` is a pairing-related IQ-set we handled. */
|
|
198
286
|
async handleIncomingIqSet(node) {
|
|
199
287
|
this.logger.trace('auth client handleIncomingIqSet', { id: node.attrs.id });
|
|
200
288
|
return this.runHandled(() => this.pairingFlow.handleIncomingIqSet(node));
|
|
201
289
|
}
|
|
290
|
+
/** Dispatcher: returns `true` when `node` is a link-code companion notification. */
|
|
202
291
|
async handleLinkCodeNotification(node) {
|
|
203
292
|
this.logger.trace('auth client handleLinkCodeNotification', { id: node.attrs.id });
|
|
204
293
|
return this.runHandled(() => this.pairingFlow.handleLinkCodeNotification(node));
|
|
205
294
|
}
|
|
295
|
+
/** Dispatcher: returns `true` when `node` is a companion-registration refresh notification. */
|
|
206
296
|
async handleCompanionRegRefreshNotification(node) {
|
|
207
297
|
this.logger.trace('auth client handleCompanionRegRefreshNotification', {
|
|
208
298
|
id: node.attrs.id
|
|
@@ -230,7 +320,7 @@ export class WaAuthClient {
|
|
|
230
320
|
}
|
|
231
321
|
async updateCredentials(credentials) {
|
|
232
322
|
this.logger.trace('auth client update credentials', {
|
|
233
|
-
registered: credentials?.meJid
|
|
323
|
+
registered: !!credentials?.meJid
|
|
234
324
|
});
|
|
235
325
|
this.credentials = credentials;
|
|
236
326
|
await persistCredentials({
|
|
@@ -240,6 +330,11 @@ export class WaAuthClient {
|
|
|
240
330
|
preKeyStore: this.preKeyStore
|
|
241
331
|
}, credentials);
|
|
242
332
|
}
|
|
333
|
+
requireConnected() {
|
|
334
|
+
if (this.isConnected && !this.isConnected()) {
|
|
335
|
+
throw new Error('client is not connected');
|
|
336
|
+
}
|
|
337
|
+
}
|
|
243
338
|
requireCredentials() {
|
|
244
339
|
if (!this.credentials) {
|
|
245
340
|
throw new Error('credentials are not initialized');
|
|
@@ -2,7 +2,7 @@ import { randomBytesAsync, toRawPubKey, xeddsaVerify } from '../crypto/index.js'
|
|
|
2
2
|
import { toSerializedPubKey } from '../crypto/core/keys.js';
|
|
3
3
|
import { X25519 } from '../crypto/curves/X25519.js';
|
|
4
4
|
import { getLoginIdentity } from '../protocol/jid.js';
|
|
5
|
-
import { createAndStoreInitialKeys } from '../signal/
|
|
5
|
+
import { createAndStoreInitialKeys } from '../signal/index.js';
|
|
6
6
|
import { WaMobileTcpSocketCtor } from '../transport/node/WaMobileTcpSocket.js';
|
|
7
7
|
import { buildMobileLoginPayload } from '../transport/noise/WaMobileClientPayload.js';
|
|
8
8
|
import { toProxyAgent, toProxyDispatcher } from '../transport/proxy.js';
|
|
@@ -48,7 +48,18 @@ function mobileTransportFromCredentials(credentials) {
|
|
|
48
48
|
...(credentials.memClass !== undefined ? { memClass: credentials.memClass } : {})
|
|
49
49
|
};
|
|
50
50
|
}
|
|
51
|
-
|
|
51
|
+
async function resolveVersion(version) {
|
|
52
|
+
if (version === undefined)
|
|
53
|
+
return undefined;
|
|
54
|
+
if (typeof version === 'string')
|
|
55
|
+
return version;
|
|
56
|
+
const resolved = await version();
|
|
57
|
+
if (typeof resolved !== 'string' || resolved.length === 0) {
|
|
58
|
+
throw new Error('version resolver returned a non-string value');
|
|
59
|
+
}
|
|
60
|
+
return resolved;
|
|
61
|
+
}
|
|
62
|
+
export async function buildCommsConfig(logger, credentials, socketOptions, clientOptions) {
|
|
52
63
|
const meJid = credentials.meJid;
|
|
53
64
|
const registered = meJid !== null && meJid !== undefined;
|
|
54
65
|
const loginIdentity = registered ? getLoginIdentity(meJid) : null;
|
|
@@ -70,10 +81,10 @@ export function buildCommsConfig(logger, credentials, socketOptions, clientOptio
|
|
|
70
81
|
});
|
|
71
82
|
if (effectiveMobileTransport) {
|
|
72
83
|
if (wsProxy) {
|
|
73
|
-
throw new Error('mobileTransport does not support socketOptions.proxy.ws
|
|
84
|
+
throw new Error('mobileTransport does not support socketOptions.proxy.ws – remove the proxy option or open an issue to add TCP proxy support');
|
|
74
85
|
}
|
|
75
86
|
if (!loginIdentity) {
|
|
76
|
-
throw new Error('mobileTransport requires registered credentials (meJid)
|
|
87
|
+
throw new Error('mobileTransport requires registered credentials (meJid) – run the mobile bridge flow first');
|
|
77
88
|
}
|
|
78
89
|
const loginPayload = buildMobileLoginPayload({
|
|
79
90
|
username: loginIdentity.username,
|
|
@@ -104,6 +115,7 @@ export function buildCommsConfig(logger, credentials, socketOptions, clientOptio
|
|
|
104
115
|
}
|
|
105
116
|
};
|
|
106
117
|
}
|
|
118
|
+
const versionBase = await resolveVersion(clientOptions.version);
|
|
107
119
|
return {
|
|
108
120
|
url: socketOptions.url,
|
|
109
121
|
urls: socketOptions.urls,
|
|
@@ -129,7 +141,7 @@ export function buildCommsConfig(logger, credentials, socketOptions, clientOptio
|
|
|
129
141
|
device: loginIdentity.device,
|
|
130
142
|
deviceBrowser: clientOptions.deviceBrowser,
|
|
131
143
|
deviceOsDisplayName: clientOptions.deviceOsDisplayName,
|
|
132
|
-
versionBase
|
|
144
|
+
versionBase
|
|
133
145
|
}
|
|
134
146
|
: undefined,
|
|
135
147
|
registrationPayloadConfig: !loginIdentity
|
|
@@ -139,7 +151,7 @@ export function buildCommsConfig(logger, credentials, socketOptions, clientOptio
|
|
|
139
151
|
deviceBrowser: clientOptions.deviceBrowser,
|
|
140
152
|
deviceOsDisplayName: clientOptions.deviceOsDisplayName,
|
|
141
153
|
requireFullSync: clientOptions.requireFullSync,
|
|
142
|
-
versionBase
|
|
154
|
+
versionBase
|
|
143
155
|
}
|
|
144
156
|
: undefined
|
|
145
157
|
}
|
|
@@ -4,11 +4,11 @@ import { proto } from '../../proto.js';
|
|
|
4
4
|
import { getWaBrowserDisplayName } from '../../protocol/browser.js';
|
|
5
5
|
import { WA_DEFAULTS, WA_IQ_TYPES, WA_NODE_TAGS, WA_SIGNALING } from '../../protocol/constants.js';
|
|
6
6
|
import { parsePhoneJid } from '../../protocol/jid.js';
|
|
7
|
-
import { ADV_PREFIX_HOSTED_ACCOUNT_SIGNATURE, computeAdvIdentityHmac, generateDeviceSignature, verifyDeviceIdentityAccountSignature } from '../../signal/
|
|
7
|
+
import { ADV_PREFIX_HOSTED_ACCOUNT_SIGNATURE, computeAdvIdentityHmac, generateDeviceSignature, verifyDeviceIdentityAccountSignature } from '../../signal/attestation/WaAdvSignature.js';
|
|
8
8
|
import { buildAckNode, buildIqResultNode } from '../../transport/node/builders/global.js';
|
|
9
9
|
import { buildCompanionFinishRequestNode, buildCompanionHelloRequestNode, buildGetCountryCodeRequestNode } from '../../transport/node/builders/pairing.js';
|
|
10
10
|
import { decodeNodeContentUtf8OrBytes, findNodeChild, findNodeChildrenByTags, getFirstNodeChild, getNodeChildrenNonEmptyUtf8ByTag, hasNodeChild } from '../../transport/node/helpers.js';
|
|
11
|
-
import { concatBytes, decodeProtoBytes, uint8Equal } from '../../util/bytes.js';
|
|
11
|
+
import { concatBytes, decodeProtoBytes, uint8Equal, uint8TimingSafeEqual } from '../../util/bytes.js';
|
|
12
12
|
export class WaPairingFlow {
|
|
13
13
|
constructor(options) {
|
|
14
14
|
this.opts = options;
|
|
@@ -21,7 +21,7 @@ export class WaPairingFlow {
|
|
|
21
21
|
this.opts.logger.trace('pairing flow session cleared');
|
|
22
22
|
this.pairingSession = null;
|
|
23
23
|
}
|
|
24
|
-
async requestPairingCode(phoneNumber, shouldShowPushNotification =
|
|
24
|
+
async requestPairingCode(phoneNumber, shouldShowPushNotification = true, customCode) {
|
|
25
25
|
this.opts.logger.info('requesting pairing code', {
|
|
26
26
|
shouldShowPushNotification,
|
|
27
27
|
hasCustomCode: customCode !== undefined
|
|
@@ -65,7 +65,7 @@ export class WaPairingFlow {
|
|
|
65
65
|
finished: false
|
|
66
66
|
};
|
|
67
67
|
this.opts.callbacks.emitPairingCode(companionHello.pairingCode);
|
|
68
|
-
this.opts.logger.
|
|
68
|
+
this.opts.logger.debug('pairing code emitted', {
|
|
69
69
|
phoneJid,
|
|
70
70
|
createdAtSeconds: this.pairingSession.createdAtSeconds
|
|
71
71
|
});
|
|
@@ -83,21 +83,19 @@ export class WaPairingFlow {
|
|
|
83
83
|
return iso;
|
|
84
84
|
}
|
|
85
85
|
async handleIncomingIqSet(node) {
|
|
86
|
-
this.opts.logger.
|
|
87
|
-
|
|
88
|
-
from: node.attrs.from
|
|
89
|
-
});
|
|
86
|
+
const iqLogger = this.opts.logger.child({ id: node.attrs.id });
|
|
87
|
+
iqLogger.trace('pairing flow received iq:set', { from: node.attrs.from });
|
|
90
88
|
const firstChild = getFirstNodeChild(node);
|
|
91
89
|
if (!firstChild) {
|
|
92
90
|
return false;
|
|
93
91
|
}
|
|
94
92
|
if (firstChild.tag === WA_NODE_TAGS.PAIR_DEVICE) {
|
|
95
|
-
|
|
93
|
+
iqLogger.debug('handling pair-device stanza');
|
|
96
94
|
await this.handlePairDevice(node, firstChild);
|
|
97
95
|
return true;
|
|
98
96
|
}
|
|
99
97
|
if (firstChild.tag === WA_NODE_TAGS.PAIR_SUCCESS) {
|
|
100
|
-
|
|
98
|
+
iqLogger.debug('handling pair-success stanza');
|
|
101
99
|
await this.handlePairSuccess(node, firstChild);
|
|
102
100
|
return true;
|
|
103
101
|
}
|
|
@@ -124,7 +122,7 @@ export class WaPairingFlow {
|
|
|
124
122
|
}
|
|
125
123
|
const ref = decodeNodeContentUtf8OrBytes(refNode.content, 'refresh_code.link_code_pairing_ref');
|
|
126
124
|
if (uint8Equal(ref, this.pairingSession.ref)) {
|
|
127
|
-
this.opts.logger.
|
|
125
|
+
this.opts.logger.debug('received pairing refresh notification', {
|
|
128
126
|
forceManualRefresh: linkCodeNode.attrs.force_manual_refresh === 'true'
|
|
129
127
|
});
|
|
130
128
|
this.opts.callbacks.emitPairingRefresh(linkCodeNode.attrs.force_manual_refresh === 'true');
|
|
@@ -150,7 +148,7 @@ export class WaPairingFlow {
|
|
|
150
148
|
node,
|
|
151
149
|
typeOverride: WA_SIGNALING.COMPANION_REG_REFRESH_NOTIFICATION
|
|
152
150
|
}));
|
|
153
|
-
this.opts.logger.
|
|
151
|
+
this.opts.logger.debug('handled companion_reg_refresh notification');
|
|
154
152
|
this.opts.qrFlow.refreshCurrentQr();
|
|
155
153
|
return true;
|
|
156
154
|
}
|
|
@@ -160,10 +158,10 @@ export class WaPairingFlow {
|
|
|
160
158
|
await this.rotateAdvSecret(this.requireCredentials());
|
|
161
159
|
await this.opts.socket.sendNode(buildIqResultNode(iqNode));
|
|
162
160
|
this.opts.qrFlow.setRefs(refs);
|
|
163
|
-
this.opts.logger.
|
|
161
|
+
this.opts.logger.debug('pair-device refs updated', { refsCount: refs.length });
|
|
164
162
|
}
|
|
165
163
|
async handlePairSuccess(iqNode, pairSuccessNode) {
|
|
166
|
-
this.opts.logger.
|
|
164
|
+
this.opts.logger.debug('processing pair-success node');
|
|
167
165
|
const credentials = this.requireCredentials();
|
|
168
166
|
const [deviceIdentityNode, deviceNode, platformNode] = findNodeChildrenByTags(pairSuccessNode, [WA_NODE_TAGS.DEVICE_IDENTITY, 'device', WA_NODE_TAGS.PLATFORM]);
|
|
169
167
|
if (!deviceIdentityNode || !deviceNode || !platformNode) {
|
|
@@ -183,13 +181,18 @@ export class WaPairingFlow {
|
|
|
183
181
|
const hmacInput = isHosted
|
|
184
182
|
? concatBytes([ADV_PREFIX_HOSTED_ACCOUNT_SIGNATURE, wrappedDetails])
|
|
185
183
|
: wrappedDetails;
|
|
186
|
-
const expectedHmac =
|
|
187
|
-
if (!
|
|
188
|
-
this.opts.logger.error('pair-success hmac mismatch'
|
|
184
|
+
const expectedHmac = computeAdvIdentityHmac(credentials.advSecretKey, hmacInput);
|
|
185
|
+
if (!uint8TimingSafeEqual(expectedHmac, wrappedHmac)) {
|
|
186
|
+
this.opts.logger.error('pair-success hmac mismatch', {
|
|
187
|
+
meJid: deviceNode.attrs.jid,
|
|
188
|
+
meLid: deviceNode.attrs.lid,
|
|
189
|
+
platform: platformNode.attrs.name,
|
|
190
|
+
isHosted
|
|
191
|
+
});
|
|
189
192
|
throw new Error('pair-success HMAC validation failed');
|
|
190
193
|
}
|
|
191
194
|
}
|
|
192
|
-
const { signedIdentity, keyIndex, responseIdentityBytes } = await this.buildPairSuccessResponseIdentity(credentials, wrappedDetails
|
|
195
|
+
const { signedIdentity, keyIndex, responseIdentityBytes } = await this.buildPairSuccessResponseIdentity(credentials, wrappedDetails);
|
|
193
196
|
const nextCredentials = {
|
|
194
197
|
...credentials,
|
|
195
198
|
signedIdentity,
|
|
@@ -230,21 +233,25 @@ export class WaPairingFlow {
|
|
|
230
233
|
this.opts.callbacks.emitPaired(nextCredentials);
|
|
231
234
|
this.opts.logger.debug('pair-success completed and paired event emitted');
|
|
232
235
|
}
|
|
233
|
-
async buildPairSuccessResponseIdentity(credentials, wrappedDetails
|
|
236
|
+
async buildPairSuccessResponseIdentity(credentials, wrappedDetails) {
|
|
234
237
|
const signedIdentity = proto.ADVSignedDeviceIdentity.decode(wrappedDetails);
|
|
235
238
|
const details = decodeProtoBytes(signedIdentity.details, 'ADVSignedDeviceIdentity.details');
|
|
236
239
|
const accountSignature = decodeProtoBytes(signedIdentity.accountSignature, 'ADVSignedDeviceIdentity.accountSignature');
|
|
237
240
|
const accountSignatureKey = decodeProtoBytes(signedIdentity.accountSignatureKey, 'ADVSignedDeviceIdentity.accountSignatureKey');
|
|
238
241
|
const localIdentity = credentials.registrationInfo.identityKeyPair;
|
|
242
|
+
const advDeviceIdentity = proto.ADVDeviceIdentity.decode(details);
|
|
243
|
+
const isDeviceHosted = advDeviceIdentity.deviceType === proto.ADVEncryptionType.HOSTED;
|
|
239
244
|
if (this.opts.dangerous?.disableAdvSignatureVerification !== true) {
|
|
240
|
-
const validAccountSignature = await verifyDeviceIdentityAccountSignature(details, accountSignature, localIdentity.pubKey, accountSignatureKey,
|
|
245
|
+
const validAccountSignature = await verifyDeviceIdentityAccountSignature(details, accountSignature, localIdentity.pubKey, accountSignatureKey, isDeviceHosted);
|
|
241
246
|
if (!validAccountSignature) {
|
|
242
|
-
this.opts.logger.error('pair-success account signature invalid'
|
|
247
|
+
this.opts.logger.error('pair-success account signature invalid', {
|
|
248
|
+
keyIndex: advDeviceIdentity.keyIndex ?? 0,
|
|
249
|
+
isDeviceHosted
|
|
250
|
+
});
|
|
243
251
|
throw new Error('pair-success account signature validation failed');
|
|
244
252
|
}
|
|
245
253
|
}
|
|
246
|
-
signedIdentity.deviceSignature = await generateDeviceSignature(details, localIdentity, accountSignatureKey,
|
|
247
|
-
const advDeviceIdentity = proto.ADVDeviceIdentity.decode(details);
|
|
254
|
+
signedIdentity.deviceSignature = await generateDeviceSignature(details, localIdentity, accountSignatureKey, false);
|
|
248
255
|
const responseIdentityBytes = proto.ADVSignedDeviceIdentity.encode({
|
|
249
256
|
details: signedIdentity.details,
|
|
250
257
|
accountSignature: signedIdentity.accountSignature,
|
|
@@ -280,7 +287,9 @@ export class WaPairingFlow {
|
|
|
280
287
|
}
|
|
281
288
|
const ref = decodeNodeContentUtf8OrBytes(refNode.content, 'primary_hello.link_code_pairing_ref');
|
|
282
289
|
if (!pairingSession.ref || !uint8Equal(ref, pairingSession.ref)) {
|
|
283
|
-
this.opts.logger.warn('primary_hello ref mismatch ignored'
|
|
290
|
+
this.opts.logger.warn('primary_hello ref mismatch ignored', {
|
|
291
|
+
phoneJid: pairingSession.phoneJid
|
|
292
|
+
});
|
|
284
293
|
return;
|
|
285
294
|
}
|
|
286
295
|
const nowSeconds = Math.floor(Date.now() / 1000);
|
|
@@ -309,7 +318,7 @@ export class WaPairingFlow {
|
|
|
309
318
|
advSecretKey: finish.advSecret
|
|
310
319
|
});
|
|
311
320
|
pairingSession.finished = true;
|
|
312
|
-
this.opts.logger.
|
|
321
|
+
this.opts.logger.debug('primary_hello completed with companion_finish success');
|
|
313
322
|
}
|
|
314
323
|
async rotateAdvSecret(credentials) {
|
|
315
324
|
const nextCredentials = {
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import { aesCtrDecrypt, aesCtrEncrypt, aesGcmEncrypt, hkdf,
|
|
1
|
+
import { aesCtrDecrypt, aesCtrEncrypt, aesGcmEncrypt, hkdf, pbkdf2Sha256, randomBytesAsync } from '../../crypto/index.js';
|
|
2
2
|
import { X25519 } from '../../crypto/curves/X25519.js';
|
|
3
3
|
import { WA_PAIRING_KDF_INFO } from '../../protocol/constants.js';
|
|
4
4
|
import { concatBytes, TEXT_ENCODER } from '../../util/bytes.js';
|
|
5
|
-
|
|
5
|
+
const CROCKFORD_ALPHABET = '123456789ABCDEFGHJKLMNPQRSTVWXYZ';
|
|
6
6
|
export const PBKDF2_ITERATIONS = 2 << 16;
|
|
7
|
+
const PAIRING_AES_KEY_BYTES = 32;
|
|
7
8
|
function bytesToCrockford(bytes) {
|
|
8
9
|
let bitCount = 0;
|
|
9
10
|
let value = 0;
|
|
@@ -42,8 +43,8 @@ export async function createCompanionHello(options = {}) {
|
|
|
42
43
|
normalizedCustomCode !== null ? Promise.resolve(null) : randomBytesAsync(5)
|
|
43
44
|
]);
|
|
44
45
|
const pairingCode = normalizedCustomCode ?? bytesToCrockford(codeBytes);
|
|
45
|
-
const
|
|
46
|
-
const encrypted =
|
|
46
|
+
const cipherKey = await pbkdf2Sha256(TEXT_ENCODER.encode(pairingCode), salt, PBKDF2_ITERATIONS, PAIRING_AES_KEY_BYTES);
|
|
47
|
+
const encrypted = aesCtrEncrypt(cipherKey, counter, companionEphemeralKeyPair.pubKey);
|
|
47
48
|
return {
|
|
48
49
|
pairingCode,
|
|
49
50
|
companionEphemeralKeyPair,
|
|
@@ -54,31 +55,28 @@ export async function completeCompanionFinish(args) {
|
|
|
54
55
|
if (args.wrappedPrimaryEphemeralPub.length <= 48) {
|
|
55
56
|
throw new Error('invalid wrapped primary payload');
|
|
56
57
|
}
|
|
57
|
-
const
|
|
58
|
-
const primaryEphemeralPub =
|
|
58
|
+
const pairingCipherKey = await pbkdf2Sha256(TEXT_ENCODER.encode(args.pairingCode), args.wrappedPrimaryEphemeralPub.subarray(0, 32), PBKDF2_ITERATIONS, PAIRING_AES_KEY_BYTES);
|
|
59
|
+
const primaryEphemeralPub = aesCtrDecrypt(pairingCipherKey, args.wrappedPrimaryEphemeralPub.subarray(32, 48), args.wrappedPrimaryEphemeralPub.subarray(48));
|
|
59
60
|
if (primaryEphemeralPub.length === 0) {
|
|
60
61
|
throw new Error('empty primary ephemeral public key');
|
|
61
62
|
}
|
|
62
|
-
const [sharedEphemeral, bundleSalt, bundleSecret, bundleIv] = await Promise.all([
|
|
63
|
+
const [sharedEphemeral, sharedIdentity, bundleSalt, bundleSecret, bundleIv] = await Promise.all([
|
|
63
64
|
X25519.scalarMult(args.companionEphemeralPrivKey, primaryEphemeralPub),
|
|
65
|
+
X25519.scalarMult(args.registrationIdentityKeyPair.privKey, args.primaryIdentityPub),
|
|
64
66
|
randomBytesAsync(32),
|
|
65
67
|
randomBytesAsync(32),
|
|
66
68
|
randomBytesAsync(12)
|
|
67
69
|
]);
|
|
68
|
-
const
|
|
69
|
-
const bundleEncryptionKey = await importAesGcmKey(bundleEncryptionKeyRaw, ['encrypt']);
|
|
70
|
+
const bundleEncryptionKey = hkdf(sharedEphemeral, bundleSalt, WA_PAIRING_KDF_INFO.LINK_CODE_BUNDLE, 32);
|
|
70
71
|
const plaintextBundle = concatBytes([
|
|
71
72
|
args.registrationIdentityKeyPair.pubKey,
|
|
72
73
|
args.primaryIdentityPub,
|
|
73
74
|
bundleSecret
|
|
74
75
|
]);
|
|
75
|
-
const
|
|
76
|
-
aesGcmEncrypt(bundleEncryptionKey, bundleIv, plaintextBundle),
|
|
77
|
-
X25519.scalarMult(args.registrationIdentityKeyPair.privKey, args.primaryIdentityPub)
|
|
78
|
-
]);
|
|
76
|
+
const encryptedBundle = aesGcmEncrypt(bundleEncryptionKey, bundleIv, plaintextBundle);
|
|
79
77
|
const wrappedKeyBundle = concatBytes([bundleSalt, bundleIv, encryptedBundle]);
|
|
80
78
|
const advMaterial = concatBytes([sharedEphemeral, sharedIdentity, bundleSecret]);
|
|
81
|
-
const advSecret =
|
|
79
|
+
const advSecret = hkdf(advMaterial, null, WA_PAIRING_KDF_INFO.ADV_SECRET, 32);
|
|
82
80
|
return {
|
|
83
81
|
wrappedKeyBundle,
|
|
84
82
|
companionIdentityPublic: args.registrationIdentityKeyPair.pubKey,
|