zapo-js 0.2.0 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +103 -179
- package/dist/appstate/{WaAppStateCrypto.js → crypto/WaAppStateCrypto.js} +79 -62
- package/dist/appstate/index.js +8 -7
- package/dist/appstate/{encoding.js → parsers/encoding.js} +11 -4
- package/dist/appstate/{WaAppStateSyncResponseParser.js → parsers/response-parser.js} +20 -8
- package/dist/appstate/{WaAppStateSyncClient.js → sync/WaAppStateSyncClient.js} +246 -88
- package/dist/appstate/utils.js +16 -0
- package/dist/appstate-spec.js +89 -0
- package/dist/auth/WaAuthClient.js +117 -13
- package/dist/auth/credentials-flow.js +207 -0
- package/dist/auth/pairing/WaPairingFlow.js +53 -47
- package/dist/auth/pairing/pairing-code-crypto.js +91 -0
- package/dist/client/WaClient.js +369 -460
- package/dist/client/WaClientFactory.js +377 -93
- package/dist/client/connection/WaConnectionManager.js +31 -11
- package/dist/client/coordinators/WaAbPropsCoordinator.js +140 -0
- package/dist/client/coordinators/WaAppStateMutationCoordinator.js +663 -143
- package/dist/client/coordinators/WaBotCoordinator.js +345 -0
- package/dist/client/coordinators/WaBroadcastListCoordinator.js +20 -0
- package/dist/client/coordinators/WaBusinessCoordinator.js +81 -180
- package/dist/client/coordinators/WaEmailCoordinator.js +64 -0
- package/dist/client/coordinators/WaGroupCoordinator.js +529 -52
- package/dist/client/coordinators/WaIncomingNodeCoordinator.js +130 -20
- package/dist/client/coordinators/WaLowLevelCoordinator.js +41 -0
- package/dist/client/coordinators/WaMessageCoordinator.js +365 -0
- package/dist/client/coordinators/WaMessageDispatchCoordinator.js +724 -216
- package/dist/client/coordinators/WaNewsletterCoordinator.js +18 -0
- package/dist/client/coordinators/WaOfflineResumeCoordinator.js +114 -0
- package/dist/client/coordinators/WaPassiveTasksCoordinator.js +53 -22
- package/dist/client/coordinators/WaPresenceCoordinator.js +21 -0
- package/dist/client/coordinators/WaPrivacyCoordinator.js +7 -5
- package/dist/client/coordinators/WaProfileCoordinator.js +223 -50
- package/dist/client/coordinators/WaRetryCoordinator.js +256 -123
- package/dist/client/coordinators/WaStatusCoordinator.js +49 -0
- package/dist/client/coordinators/WaStreamControlCoordinator.js +6 -6
- package/dist/client/coordinators/WaTrustedContactTokenCoordinator.js +29 -10
- package/dist/client/events/abprops.js +43 -0
- package/dist/client/events/appstate-mutation.js +133 -0
- package/dist/client/events/business.js +375 -0
- package/dist/client/events/call.js +58 -0
- package/dist/client/events/chatstate.js +23 -0
- package/dist/client/events/devices.js +15 -16
- package/dist/client/{dirty.js → events/dirty.js} +34 -20
- package/dist/client/events/group.js +13 -24
- package/dist/client/events/identity.js +2 -1
- package/dist/client/events/incoming.js +502 -0
- package/dist/client/events/mex-notification.js +181 -0
- package/dist/client/events/picture.js +33 -0
- package/dist/client/events/presence.js +44 -0
- package/dist/client/events/privacy-token.js +1 -2
- package/dist/client/events/receipt.js +26 -0
- package/dist/client/events/registration.js +42 -0
- package/dist/client/media.js +400 -0
- package/dist/client/messaging/fanout.js +9 -10
- package/dist/client/messaging/{participants.js → group-metadata.js} +73 -35
- package/dist/client/messaging/ignore-key.js +132 -0
- package/dist/client/messaging/key-protocol.js +3 -17
- package/dist/client/messaging/link-preview.js +159 -0
- package/dist/client/messaging/messages.js +671 -0
- package/dist/client/newsletter/admin.js +165 -0
- package/dist/client/newsletter/content.js +253 -0
- package/dist/client/newsletter/discovery.js +115 -0
- package/dist/client/newsletter/messaging.js +197 -0
- package/dist/client/newsletter/mex.js +41 -0
- package/dist/client/newsletter/parse.js +217 -0
- package/dist/client/persistence/WriteBehindPersistence.js +31 -4
- package/dist/client/{history-sync.js → persistence/history-sync.js} +125 -18
- package/dist/client/persistence/mailbox.js +104 -0
- package/dist/client/tokens/cs-token.js +11 -17
- package/dist/crypto/core/hkdf.js +12 -12
- package/dist/crypto/core/index.js +9 -8
- package/dist/crypto/core/keys.js +1 -8
- package/dist/crypto/core/nonce.js +12 -12
- package/dist/crypto/core/primitives.js +123 -93
- package/dist/crypto/core/random.js +9 -9
- package/dist/crypto/core/xeddsa.js +59 -0
- package/dist/crypto/curves/Ed25519.js +32 -21
- package/dist/crypto/curves/X25519.js +71 -17
- package/dist/crypto/curves/constants.js +3 -1
- package/dist/crypto/math/constants.js +1 -2
- package/dist/crypto/math/mod.js +0 -33
- package/dist/esm/appstate/{WaAppStateCrypto.js → crypto/WaAppStateCrypto.js} +72 -55
- package/dist/esm/appstate/index.js +5 -5
- package/dist/esm/appstate/{encoding.js → parsers/encoding.js} +11 -4
- package/dist/esm/appstate/{WaAppStateSyncResponseParser.js → parsers/response-parser.js} +20 -8
- package/dist/esm/appstate/{WaAppStateSyncClient.js → sync/WaAppStateSyncClient.js} +235 -76
- package/dist/esm/appstate/utils.js +16 -0
- package/dist/esm/appstate-spec.js +79 -0
- package/dist/esm/auth/WaAuthClient.js +114 -10
- package/dist/esm/auth/credentials-flow.js +202 -0
- package/dist/esm/auth/pairing/WaPairingFlow.js +52 -46
- package/dist/esm/auth/pairing/pairing-code-crypto.js +85 -0
- package/dist/esm/client/WaClient.js +372 -463
- package/dist/esm/client/WaClientFactory.js +380 -96
- package/dist/esm/client/connection/WaConnectionManager.js +31 -11
- package/dist/esm/client/coordinators/WaAbPropsCoordinator.js +136 -0
- package/dist/esm/client/coordinators/WaAppStateMutationCoordinator.js +665 -145
- package/dist/esm/client/coordinators/WaBotCoordinator.js +342 -0
- package/dist/esm/client/coordinators/WaBroadcastListCoordinator.js +17 -0
- package/dist/esm/client/coordinators/WaBusinessCoordinator.js +78 -177
- package/dist/esm/client/coordinators/WaEmailCoordinator.js +61 -0
- package/dist/esm/client/coordinators/WaGroupCoordinator.js +532 -55
- package/dist/esm/client/coordinators/WaIncomingNodeCoordinator.js +132 -22
- package/dist/esm/client/coordinators/WaLowLevelCoordinator.js +38 -0
- package/dist/esm/client/coordinators/WaMessageCoordinator.js +361 -0
- package/dist/esm/client/coordinators/WaMessageDispatchCoordinator.js +719 -211
- package/dist/esm/client/coordinators/WaNewsletterCoordinator.js +13 -0
- package/dist/esm/client/coordinators/WaOfflineResumeCoordinator.js +110 -0
- package/dist/esm/client/coordinators/WaPassiveTasksCoordinator.js +54 -23
- package/dist/esm/client/coordinators/WaPresenceCoordinator.js +18 -0
- package/dist/esm/client/coordinators/WaPrivacyCoordinator.js +7 -5
- package/dist/esm/client/coordinators/WaProfileCoordinator.js +226 -53
- package/dist/esm/client/coordinators/WaRetryCoordinator.js +258 -125
- package/dist/esm/client/coordinators/WaStatusCoordinator.js +46 -0
- package/dist/esm/client/coordinators/WaStreamControlCoordinator.js +6 -6
- package/dist/esm/client/coordinators/WaTrustedContactTokenCoordinator.js +31 -12
- package/dist/esm/client/events/abprops.js +40 -0
- package/dist/esm/client/events/appstate-mutation.js +130 -0
- package/dist/esm/client/events/business.js +370 -0
- package/dist/esm/client/events/call.js +55 -0
- package/dist/esm/client/events/chatstate.js +20 -0
- package/dist/esm/client/events/devices.js +15 -16
- package/dist/esm/client/{dirty.js → events/dirty.js} +34 -20
- package/dist/esm/client/events/group.js +14 -25
- package/dist/esm/client/events/identity.js +2 -1
- package/dist/esm/client/events/incoming.js +487 -0
- package/dist/esm/client/events/mex-notification.js +178 -0
- package/dist/esm/client/events/picture.js +30 -0
- package/dist/esm/client/events/presence.js +41 -0
- package/dist/esm/client/events/privacy-token.js +1 -2
- package/dist/esm/client/events/receipt.js +23 -0
- package/dist/esm/client/events/registration.js +39 -0
- package/dist/esm/client/media.js +384 -0
- package/dist/esm/client/messaging/fanout.js +10 -11
- package/dist/esm/client/messaging/{participants.js → group-metadata.js} +72 -34
- package/dist/esm/client/messaging/ignore-key.js +126 -0
- package/dist/esm/client/messaging/key-protocol.js +3 -17
- package/dist/esm/client/messaging/link-preview.js +156 -0
- package/dist/esm/client/messaging/messages.js +667 -0
- package/dist/esm/client/newsletter/admin.js +162 -0
- package/dist/esm/client/newsletter/content.js +249 -0
- package/dist/esm/client/newsletter/discovery.js +112 -0
- package/dist/esm/client/newsletter/messaging.js +194 -0
- package/dist/esm/client/newsletter/mex.js +37 -0
- package/dist/esm/client/newsletter/parse.js +200 -0
- package/dist/esm/client/persistence/WriteBehindPersistence.js +31 -4
- package/dist/esm/client/{history-sync.js → persistence/history-sync.js} +124 -18
- package/dist/esm/client/persistence/mailbox.js +101 -0
- package/dist/esm/client/tokens/cs-token.js +12 -18
- package/dist/esm/crypto/core/hkdf.js +14 -14
- package/dist/esm/crypto/core/index.js +3 -2
- package/dist/esm/crypto/core/keys.js +1 -7
- package/dist/esm/crypto/core/nonce.js +11 -11
- package/dist/esm/crypto/core/primitives.js +121 -88
- package/dist/esm/crypto/core/random.js +8 -7
- package/dist/esm/crypto/core/xeddsa.js +55 -0
- package/dist/esm/crypto/curves/Ed25519.js +35 -24
- package/dist/esm/crypto/curves/X25519.js +74 -20
- package/dist/esm/crypto/curves/constants.js +2 -0
- package/dist/esm/crypto/math/constants.js +1 -2
- package/dist/esm/crypto/math/mod.js +0 -32
- package/dist/esm/index.js +7 -2
- package/dist/esm/infra/log/ConsoleLogger.js +30 -6
- package/dist/esm/infra/log/PinoLogger.js +64 -0
- package/dist/esm/infra/log/types.js +4 -2
- package/dist/esm/infra/perf/BackgroundQueue.js +55 -13
- package/dist/esm/infra/perf/StoreLock.js +7 -4
- package/dist/esm/media/constants.js +35 -2
- package/dist/esm/media/crypto/WaMediaCrypto.js +374 -0
- package/dist/esm/media/index.js +4 -3
- package/dist/esm/media/processor.js +1 -0
- package/dist/esm/media/sticker/sticker-pack.js +133 -0
- package/dist/esm/media/{WaMediaTransferClient.js → transfer/WaMediaTransferClient.js} +84 -196
- package/dist/esm/media/{conn.js → transfer/conn.js} +10 -5
- package/dist/esm/message/WaMessageClient.js +46 -15
- package/dist/esm/message/addons/link-preview/builder.js +36 -0
- package/dist/esm/message/addons/link-preview/detect.js +55 -0
- package/dist/esm/message/addons/link-preview/fetcher.js +391 -0
- package/dist/esm/message/addons/link-preview/types.js +1 -0
- package/dist/esm/message/context-info.js +123 -0
- package/dist/esm/message/crypto/addon-crypto.js +244 -0
- package/dist/esm/message/{icdc.js → crypto/icdc.js} +11 -13
- package/dist/esm/message/crypto/phash.js +133 -0
- package/dist/esm/message/{reporting-token.js → crypto/reporting-token.js} +7 -7
- package/dist/esm/message/{use-case-secret.js → crypto/use-case-secret.js} +21 -4
- package/dist/esm/message/{content.js → encode/content.js} +183 -8
- package/dist/esm/message/encode/media-payload.js +42 -0
- package/dist/esm/message/{padding.js → encode/padding.js} +9 -3
- package/dist/esm/message/index.js +2 -2
- package/dist/esm/message/kinds/bot.js +111 -0
- package/dist/esm/message/kinds/newsletter.js +244 -0
- package/dist/esm/message/kinds/sticker-pack.js +29 -0
- package/dist/esm/message/{ack.js → primitives/ack.js} +8 -1
- package/dist/esm/message/primitives/incoming.js +511 -0
- package/dist/esm/message/primitives/peer-data-operation.js +93 -0
- package/dist/esm/mex.js +1 -0
- package/dist/esm/protocol/abprops.js +169 -0
- package/dist/esm/protocol/appstate.js +6 -30
- package/dist/esm/protocol/auth.js +3 -2
- package/dist/esm/protocol/bot.js +77 -0
- package/dist/esm/protocol/browser.js +22 -0
- package/dist/esm/protocol/business.js +19 -0
- package/dist/esm/protocol/call.js +48 -0
- package/dist/esm/protocol/constants.js +10 -2
- package/dist/esm/protocol/defaults.js +3 -0
- package/dist/esm/protocol/email.js +30 -0
- package/dist/esm/protocol/index.js +1 -1
- package/dist/esm/protocol/jid.js +142 -11
- package/dist/esm/protocol/media.js +25 -12
- package/dist/esm/protocol/message.js +4 -1
- package/dist/esm/protocol/newsletter.js +61 -0
- package/dist/esm/protocol/nodes.js +26 -2
- package/dist/esm/protocol/notification.js +24 -2
- package/dist/esm/protocol/presence.js +13 -0
- package/dist/esm/protocol/status.js +6 -0
- package/dist/esm/retry/codec.js +5 -0
- package/dist/esm/retry/parse.js +20 -38
- package/dist/esm/retry/reason.js +6 -1
- package/dist/esm/retry/replay.js +131 -37
- package/dist/esm/retry/tracker.js +4 -8
- package/dist/esm/signal/api/SignalDeviceSyncApi.js +71 -21
- package/dist/esm/signal/api/SignalDigestSyncApi.js +15 -8
- package/dist/esm/signal/api/SignalIdentitySyncApi.js +13 -4
- package/dist/esm/signal/api/SignalMissingPreKeysSyncApi.js +24 -63
- package/dist/esm/signal/api/SignalRotateKeyApi.js +10 -0
- package/dist/esm/signal/api/SignalSessionSyncApi.js +23 -51
- package/dist/esm/signal/api/codec.js +52 -1
- package/dist/esm/signal/api/prekeys.js +4 -0
- package/dist/esm/signal/attestation/WaAdvSignature.js +17 -0
- package/dist/esm/signal/{crypto → attestation}/constants.js +0 -4
- package/dist/esm/signal/constants.js +3 -0
- package/dist/esm/signal/encoding.js +6 -332
- package/dist/esm/signal/group/SenderKeyChain.js +20 -35
- package/dist/esm/signal/group/SenderKeyCodec.js +5 -6
- package/dist/esm/signal/group/SenderKeyManager.js +37 -17
- package/dist/esm/signal/group/encoding.js +96 -0
- package/dist/esm/signal/index.js +4 -1
- package/dist/esm/signal/registration/encoding.js +34 -0
- package/dist/esm/signal/registration/keygen.js +12 -3
- package/dist/esm/signal/registration/utils.js +8 -2
- package/dist/esm/signal/session/SignalProtocol.js +129 -26
- package/dist/esm/signal/session/SignalRatchet.js +46 -64
- package/dist/esm/signal/session/SignalSerializer.js +5 -6
- package/dist/esm/signal/session/SignalSession.js +14 -19
- package/dist/esm/signal/session/encoding.js +173 -0
- package/dist/esm/signal/session/resolver.js +144 -35
- package/dist/esm/store/cache/identity.cache.js +75 -0
- package/dist/esm/store/cache/privacy-token.cache.js +57 -0
- package/dist/esm/store/cache/sender-key.cache.js +101 -0
- package/dist/esm/store/cache/session.cache.js +92 -0
- package/dist/esm/store/contracts/group-metadata.store.js +1 -0
- package/dist/esm/store/contracts/identity.store.js +1 -0
- package/dist/esm/store/contracts/message-secret.store.js +1 -0
- package/dist/esm/store/contracts/pre-key.store.js +1 -0
- package/dist/esm/store/contracts/session.store.js +1 -0
- package/dist/esm/store/createStore.js +129 -39
- package/dist/esm/store/index.js +15 -10
- package/dist/esm/store/locks/contact.lock.js +1 -0
- package/dist/esm/store/locks/device-list.lock.js +1 -0
- package/dist/esm/store/locks/group-metadata.lock.js +20 -0
- package/dist/esm/store/locks/identity.lock.js +16 -0
- package/dist/esm/store/locks/message-secret.lock.js +17 -0
- package/dist/esm/store/locks/pre-key.lock.js +27 -0
- package/dist/esm/store/locks/session.lock.js +19 -0
- package/dist/esm/store/locks/signal.lock.js +0 -24
- package/dist/esm/store/{providers/memory → memory}/appstate.store.js +5 -5
- package/dist/esm/store/memory/auth.store.js +24 -0
- package/dist/esm/store/memory/contact.store.js +79 -0
- package/dist/esm/store/memory/device-list.store.js +103 -0
- package/dist/esm/store/{providers/memory/participants.store.js → memory/group-metadata.store.js} +24 -12
- package/dist/esm/store/memory/identity.store.js +31 -0
- package/dist/esm/store/memory/message-secret.store.js +90 -0
- package/dist/esm/store/{providers/memory → memory}/message.store.js +2 -2
- package/dist/esm/store/memory/pre-key.store.js +97 -0
- package/dist/esm/store/{providers/memory → memory}/privacy-token.store.js +1 -1
- package/dist/esm/store/{providers/memory → memory}/retry.store.js +49 -14
- package/dist/esm/store/{providers/memory → memory}/sender-key.store.js +3 -3
- package/dist/esm/store/memory/session.store.js +45 -0
- package/dist/esm/store/memory/signal.store.js +36 -0
- package/dist/esm/store/{providers/memory → memory}/thread.store.js +2 -2
- package/dist/esm/store/noop.store.js +26 -4
- package/dist/esm/transport/WaComms.js +18 -8
- package/dist/esm/transport/WaWebSocket.js +41 -9
- package/dist/esm/transport/binary/constants.js +10 -4
- package/dist/esm/transport/binary/decoder.js +21 -15
- package/dist/esm/transport/binary/encoder.js +96 -21
- package/dist/esm/transport/binary/tokens.js +12 -12
- package/dist/esm/transport/index.js +7 -0
- package/dist/esm/transport/keepalive/WaKeepAlive.js +35 -12
- package/dist/esm/transport/node/WaMobileTcpSocket.js +120 -0
- package/dist/esm/transport/node/WaNodeOrchestrator.js +26 -13
- package/dist/esm/transport/node/WaNodeTransport.js +13 -0
- package/dist/esm/transport/node/builders/abprops.js +20 -0
- package/dist/esm/transport/node/builders/account-sync.js +7 -15
- package/dist/esm/transport/node/builders/bot.js +38 -0
- package/dist/esm/transport/node/builders/business.js +30 -30
- package/dist/esm/transport/node/builders/chatstate.js +28 -0
- package/dist/esm/transport/node/builders/community.js +53 -0
- package/dist/esm/transport/node/builders/device.js +11 -0
- package/dist/esm/transport/node/builders/email.js +66 -0
- package/dist/esm/transport/node/builders/global.js +1 -1
- package/dist/esm/transport/node/builders/group.js +114 -4
- package/dist/esm/transport/node/builders/media.js +2 -2
- package/dist/esm/transport/node/builders/message.js +83 -49
- package/dist/esm/transport/node/builders/newsletter.js +176 -0
- package/dist/esm/transport/node/builders/offline.js +14 -0
- package/dist/esm/transport/node/builders/passive.js +7 -0
- package/dist/esm/transport/node/builders/prekeys.js +40 -43
- package/dist/esm/transport/node/builders/presence.js +39 -0
- package/dist/esm/transport/node/builders/privacy-token.js +19 -23
- package/dist/esm/transport/node/builders/privacy.js +6 -6
- package/dist/esm/transport/node/builders/profile.js +28 -8
- package/dist/esm/transport/node/builders/retry.js +1 -1
- package/dist/esm/transport/node/builders/tos.js +58 -0
- package/dist/esm/transport/node/builders/usync.js +51 -2
- package/dist/esm/transport/node/helpers.js +27 -1
- package/dist/esm/transport/node/mex/argo-decoder.js +152 -0
- package/dist/esm/transport/node/mex/client.js +105 -0
- package/dist/esm/transport/node/query.js +17 -0
- package/dist/esm/transport/node/usync.js +12 -0
- package/dist/esm/transport/noise/WaClientPayload.js +23 -18
- package/dist/esm/transport/noise/WaFrameCodec.js +2 -2
- package/dist/esm/transport/noise/WaMobileClientPayload.js +58 -0
- package/dist/esm/transport/noise/WaNoiseCert.js +14 -27
- package/dist/esm/transport/noise/WaNoiseHandshake.js +27 -25
- package/dist/esm/transport/noise/WaNoiseSession.js +48 -67
- package/dist/esm/transport/noise/WaNoiseSocket.js +19 -13
- package/dist/esm/transport/noise/constants.js +0 -1
- package/dist/esm/transport/proxy.js +5 -0
- package/dist/esm/transport/stream/parse.js +3 -7
- package/dist/esm/transport/wa-web-version-fetcher.js +91 -0
- package/dist/esm/util/async.js +4 -0
- package/dist/esm/util/bytes.js +37 -2
- package/dist/esm/util/clock.js +15 -0
- package/dist/esm/util/coercion.js +45 -3
- package/dist/esm/util/collections.js +11 -0
- package/dist/esm/util/index.js +2 -2
- package/dist/esm/util/primitives.js +19 -0
- package/dist/esm/util/runtime.js +5 -0
- package/dist/esm/version-spec.js +1 -0
- package/dist/index.js +31 -1
- package/dist/infra/log/ConsoleLogger.js +30 -6
- package/dist/infra/log/PinoLogger.js +64 -0
- package/dist/infra/log/types.js +4 -2
- package/dist/infra/perf/BackgroundQueue.js +55 -13
- package/dist/infra/perf/StoreLock.js +7 -4
- package/dist/media/constants.js +36 -3
- package/dist/media/crypto/WaMediaCrypto.js +378 -0
- package/dist/media/index.js +9 -4
- package/dist/media/processor.js +2 -0
- package/dist/media/sticker/sticker-pack.js +136 -0
- package/dist/media/{WaMediaTransferClient.js → transfer/WaMediaTransferClient.js} +87 -229
- package/dist/media/{conn.js → transfer/conn.js} +10 -5
- package/dist/message/WaMessageClient.js +46 -15
- package/dist/message/addons/link-preview/builder.js +39 -0
- package/dist/message/addons/link-preview/detect.js +58 -0
- package/dist/message/addons/link-preview/fetcher.js +394 -0
- package/dist/message/addons/link-preview/types.js +2 -0
- package/dist/message/context-info.js +129 -0
- package/dist/message/crypto/addon-crypto.js +254 -0
- package/dist/message/{icdc.js → crypto/icdc.js} +11 -13
- package/dist/message/crypto/phash.js +136 -0
- package/dist/message/{reporting-token.js → crypto/reporting-token.js} +7 -7
- package/dist/message/{use-case-secret.js → crypto/use-case-secret.js} +21 -4
- package/dist/message/{content.js → encode/content.js} +200 -7
- package/dist/message/encode/media-payload.js +45 -0
- package/dist/message/{padding.js → encode/padding.js} +9 -3
- package/dist/message/index.js +2 -2
- package/dist/message/kinds/bot.js +120 -0
- package/dist/message/kinds/newsletter.js +248 -0
- package/dist/message/kinds/sticker-pack.js +34 -0
- package/dist/message/{ack.js → primitives/ack.js} +8 -1
- package/dist/message/{incoming.js → primitives/incoming.js} +225 -38
- package/dist/message/primitives/peer-data-operation.js +96 -0
- package/dist/mex.js +6 -0
- package/dist/proto.js +1 -1
- package/dist/protocol/abprops.js +173 -0
- package/dist/protocol/appstate.js +7 -31
- package/dist/protocol/auth.js +3 -2
- package/dist/protocol/bot.js +81 -0
- package/dist/protocol/browser.js +23 -0
- package/dist/protocol/business.js +22 -0
- package/dist/protocol/call.js +51 -0
- package/dist/protocol/constants.js +51 -3
- package/dist/protocol/defaults.js +3 -0
- package/dist/protocol/email.js +33 -0
- package/dist/protocol/index.js +12 -3
- package/dist/protocol/jid.js +148 -11
- package/dist/protocol/media.js +25 -12
- package/dist/protocol/message.js +4 -1
- package/dist/protocol/newsletter.js +64 -0
- package/dist/protocol/nodes.js +26 -2
- package/dist/protocol/notification.js +25 -3
- package/dist/protocol/presence.js +16 -0
- package/dist/protocol/status.js +9 -0
- package/dist/retry/codec.js +5 -0
- package/dist/retry/parse.js +16 -34
- package/dist/retry/reason.js +6 -1
- package/dist/retry/replay.js +129 -35
- package/dist/retry/tracker.js +3 -7
- package/dist/signal/api/SignalDeviceSyncApi.js +69 -19
- package/dist/signal/api/SignalDigestSyncApi.js +14 -7
- package/dist/signal/api/SignalIdentitySyncApi.js +13 -4
- package/dist/signal/api/SignalMissingPreKeysSyncApi.js +21 -60
- package/dist/signal/api/SignalRotateKeyApi.js +10 -0
- package/dist/signal/api/SignalSessionSyncApi.js +20 -48
- package/dist/signal/api/codec.js +52 -0
- package/dist/signal/api/prekeys.js +4 -0
- package/dist/signal/attestation/WaAdvSignature.js +26 -0
- package/dist/signal/{crypto → attestation}/constants.js +1 -5
- package/dist/signal/constants.js +4 -1
- package/dist/signal/encoding.js +5 -341
- package/dist/signal/group/SenderKeyChain.js +19 -34
- package/dist/signal/group/SenderKeyCodec.js +4 -5
- package/dist/signal/group/SenderKeyManager.js +36 -16
- package/dist/signal/group/encoding.js +101 -0
- package/dist/signal/index.js +13 -10
- package/dist/signal/registration/encoding.js +39 -0
- package/dist/signal/registration/keygen.js +11 -2
- package/dist/signal/registration/utils.js +8 -2
- package/dist/signal/session/SignalProtocol.js +128 -25
- package/dist/signal/session/SignalRatchet.js +41 -60
- package/dist/signal/session/SignalSerializer.js +5 -6
- package/dist/signal/session/SignalSession.js +13 -19
- package/dist/signal/session/encoding.js +183 -0
- package/dist/signal/session/resolver.js +144 -35
- package/dist/store/cache/identity.cache.js +78 -0
- package/dist/store/cache/privacy-token.cache.js +60 -0
- package/dist/store/cache/sender-key.cache.js +104 -0
- package/dist/store/cache/session.cache.js +95 -0
- package/dist/store/contracts/group-metadata.store.js +2 -0
- package/dist/store/contracts/identity.store.js +2 -0
- package/dist/store/contracts/message-secret.store.js +2 -0
- package/dist/store/contracts/pre-key.store.js +2 -0
- package/dist/store/contracts/session.store.js +2 -0
- package/dist/store/createStore.js +128 -38
- package/dist/store/index.js +22 -12
- package/dist/store/locks/contact.lock.js +1 -0
- package/dist/store/locks/device-list.lock.js +1 -0
- package/dist/store/locks/group-metadata.lock.js +23 -0
- package/dist/store/locks/identity.lock.js +19 -0
- package/dist/store/locks/message-secret.lock.js +20 -0
- package/dist/store/locks/pre-key.lock.js +30 -0
- package/dist/store/locks/session.lock.js +22 -0
- package/dist/store/locks/signal.lock.js +0 -24
- package/dist/store/{providers/memory → memory}/appstate.store.js +5 -5
- package/dist/store/memory/auth.store.js +28 -0
- package/dist/store/memory/contact.store.js +83 -0
- package/dist/store/memory/device-list.store.js +107 -0
- package/dist/store/{providers/memory/participants.store.js → memory/group-metadata.store.js} +26 -14
- package/dist/store/memory/identity.store.js +35 -0
- package/dist/store/memory/message-secret.store.js +94 -0
- package/dist/store/{providers/memory → memory}/message.store.js +2 -2
- package/dist/store/memory/pre-key.store.js +101 -0
- package/dist/store/{providers/memory → memory}/privacy-token.store.js +1 -1
- package/dist/store/{providers/memory → memory}/retry.store.js +49 -14
- package/dist/store/{providers/memory → memory}/sender-key.store.js +3 -3
- package/dist/store/memory/session.store.js +49 -0
- package/dist/store/memory/signal.store.js +40 -0
- package/dist/store/{providers/memory → memory}/thread.store.js +2 -2
- package/dist/store/noop.store.js +27 -5
- package/dist/transport/WaComms.js +18 -8
- package/dist/transport/WaWebSocket.js +41 -9
- package/dist/transport/binary/constants.js +11 -5
- package/dist/transport/binary/decoder.js +24 -18
- package/dist/transport/binary/encoder.js +109 -34
- package/dist/transport/binary/tokens.js +12 -12
- package/dist/transport/index.js +19 -1
- package/dist/transport/keepalive/WaKeepAlive.js +35 -12
- package/dist/transport/node/WaMobileTcpSocket.js +124 -0
- package/dist/transport/node/WaNodeOrchestrator.js +25 -12
- package/dist/transport/node/WaNodeTransport.js +13 -0
- package/dist/transport/node/builders/abprops.js +23 -0
- package/dist/transport/node/builders/account-sync.js +7 -16
- package/dist/transport/node/builders/bot.js +43 -0
- package/dist/transport/node/builders/business.js +31 -31
- package/dist/transport/node/builders/chatstate.js +31 -0
- package/dist/transport/node/builders/community.js +59 -0
- package/dist/transport/node/builders/device.js +14 -0
- package/dist/transport/node/builders/email.js +73 -0
- package/dist/transport/node/builders/global.js +1 -1
- package/dist/transport/node/builders/group.js +121 -3
- package/dist/transport/node/builders/media.js +1 -1
- package/dist/transport/node/builders/message.js +84 -49
- package/dist/transport/node/builders/newsletter.js +183 -0
- package/dist/transport/node/builders/offline.js +17 -0
- package/dist/transport/node/builders/passive.js +10 -0
- package/dist/transport/node/builders/prekeys.js +38 -41
- package/dist/transport/node/builders/presence.js +43 -0
- package/dist/transport/node/builders/privacy-token.js +18 -22
- package/dist/transport/node/builders/privacy.js +5 -5
- package/dist/transport/node/builders/profile.js +30 -7
- package/dist/transport/node/builders/retry.js +1 -1
- package/dist/transport/node/builders/tos.js +63 -0
- package/dist/transport/node/builders/usync.js +52 -1
- package/dist/transport/node/helpers.js +28 -1
- package/dist/transport/node/mex/argo-decoder.js +189 -0
- package/dist/transport/node/mex/client.js +109 -0
- package/dist/transport/node/query.js +17 -0
- package/dist/transport/node/usync.js +13 -0
- package/dist/transport/noise/WaClientPayload.js +22 -17
- package/dist/transport/noise/WaFrameCodec.js +1 -1
- package/dist/transport/noise/WaMobileClientPayload.js +61 -0
- package/dist/transport/noise/WaNoiseCert.js +13 -26
- package/dist/transport/noise/WaNoiseHandshake.js +25 -23
- package/dist/transport/noise/WaNoiseSession.js +47 -66
- package/dist/transport/noise/WaNoiseSocket.js +18 -12
- package/dist/transport/noise/constants.js +1 -2
- package/dist/transport/proxy.js +5 -0
- package/dist/transport/stream/parse.js +3 -7
- package/dist/transport/wa-web-version-fetcher.js +94 -0
- package/dist/types/appstate/constants.d.ts +1 -1
- package/dist/types/appstate/{WaAppStateCrypto.d.ts → crypto/WaAppStateCrypto.d.ts} +29 -9
- package/dist/types/appstate/index.d.ts +5 -5
- package/dist/types/appstate/{encoding.d.ts → parsers/encoding.d.ts} +8 -1
- package/dist/types/appstate/{WaAppStateSyncResponseParser.d.ts → parsers/response-parser.d.ts} +13 -3
- package/dist/types/appstate/sync/WaAppStateSyncClient.d.ts +105 -0
- package/dist/types/appstate/types.d.ts +1 -1
- package/dist/types/appstate/utils.d.ts +17 -1
- package/dist/types/appstate-spec.d.ts +24 -0
- package/dist/types/auth/WaAuthClient.d.ts +95 -3
- package/dist/types/auth/credentials-flow.d.ts +21 -0
- package/dist/types/auth/pairing/WaPairingFlow.d.ts +3 -2
- package/dist/types/auth/pairing/{WaPairingCodeCrypto.d.ts → pairing-code-crypto.d.ts} +5 -1
- package/dist/types/auth/types.d.ts +88 -1
- package/dist/types/client/WaClient.d.ts +183 -65
- package/dist/types/client/WaClientFactory.d.ts +40 -9
- package/dist/types/client/connection/WaConnectionManager.d.ts +4 -2
- package/dist/types/client/connection/WaReceiptQueue.d.ts +1 -1
- package/dist/types/client/coordinators/WaAbPropsCoordinator.d.ts +26 -0
- package/dist/types/client/coordinators/WaAppStateMutationCoordinator.d.ts +215 -5
- package/dist/types/client/coordinators/WaBotCoordinator.d.ts +117 -0
- package/dist/types/client/coordinators/WaBroadcastListCoordinator.d.ts +39 -0
- package/dist/types/client/coordinators/WaBusinessCoordinator.d.ts +45 -44
- package/dist/types/client/coordinators/WaEmailCoordinator.d.ts +40 -0
- package/dist/types/client/coordinators/WaGroupCoordinator.d.ts +311 -9
- package/dist/types/client/coordinators/WaIncomingNodeCoordinator.d.ts +16 -4
- package/dist/types/client/coordinators/WaLowLevelCoordinator.d.ts +47 -0
- package/dist/types/client/coordinators/WaMessageCoordinator.d.ts +232 -0
- package/dist/types/client/coordinators/WaMessageDispatchCoordinator.d.ts +65 -29
- package/dist/types/client/coordinators/WaNewsletterCoordinator.d.ts +13 -0
- package/dist/types/client/coordinators/WaOfflineResumeCoordinator.d.ts +31 -0
- package/dist/types/client/coordinators/WaPassiveTasksCoordinator.d.ts +15 -3
- package/dist/types/client/coordinators/WaPresenceCoordinator.d.ts +27 -0
- package/dist/types/client/coordinators/WaPrivacyCoordinator.d.ts +28 -1
- package/dist/types/client/coordinators/WaProfileCoordinator.d.ts +117 -2
- package/dist/types/client/coordinators/WaRetryCoordinator.d.ts +23 -15
- package/dist/types/client/coordinators/WaStatusCoordinator.d.ts +42 -0
- package/dist/types/client/coordinators/WaTrustedContactTokenCoordinator.d.ts +16 -2
- package/dist/types/client/events/abprops.d.ts +15 -0
- package/dist/types/client/events/appstate-mutation.d.ts +3 -0
- package/dist/types/client/events/business.d.ts +10 -0
- package/dist/types/client/events/call.d.ts +31 -0
- package/dist/types/client/events/chatstate.d.ts +9 -0
- package/dist/types/client/events/devices.d.ts +5 -4
- package/dist/types/client/{dirty.d.ts → events/dirty.d.ts} +7 -4
- package/dist/types/client/events/group.d.ts +2 -1
- package/dist/types/client/events/identity.d.ts +2 -1
- package/dist/types/client/events/incoming.d.ts +65 -0
- package/dist/types/client/events/mex-notification.d.ts +6 -0
- package/dist/types/client/events/picture.d.ts +8 -0
- package/dist/types/client/events/presence.d.ts +28 -0
- package/dist/types/client/events/receipt.d.ts +14 -0
- package/dist/types/client/events/registration.d.ts +18 -0
- package/dist/types/client/index.d.ts +1 -1
- package/dist/types/client/media.d.ts +65 -0
- package/dist/types/client/messaging/fanout.d.ts +2 -2
- package/dist/types/client/messaging/group-metadata.d.ts +19 -0
- package/dist/types/client/messaging/ignore-key.d.ts +11 -0
- package/dist/types/client/messaging/key-protocol.d.ts +9 -7
- package/dist/types/client/messaging/link-preview.d.ts +19 -0
- package/dist/types/client/messaging/messages.d.ts +28 -0
- package/dist/types/client/newsletter/admin.d.ts +71 -0
- package/dist/types/client/newsletter/content.d.ts +42 -0
- package/dist/types/client/newsletter/discovery.d.ts +33 -0
- package/dist/types/client/newsletter/messaging.d.ts +66 -0
- package/dist/types/client/newsletter/mex.d.ts +14 -0
- package/dist/types/client/newsletter/parse.d.ts +19 -0
- package/dist/types/client/newsletter/types.d.ts +190 -0
- package/dist/types/client/persistence/WriteBehindPersistence.d.ts +13 -2
- package/dist/types/client/persistence/history-sync.d.ts +29 -0
- package/dist/types/client/persistence/mailbox.d.ts +12 -0
- package/dist/types/client/tokens/cs-token.d.ts +1 -3
- package/dist/types/client/types.d.ts +926 -55
- package/dist/types/crypto/core/hkdf.d.ts +10 -2
- package/dist/types/crypto/core/index.d.ts +3 -2
- package/dist/types/crypto/core/keys.d.ts +0 -4
- package/dist/types/crypto/core/nonce.d.ts +4 -5
- package/dist/types/crypto/core/primitives.d.ts +31 -20
- package/dist/types/crypto/core/random.d.ts +7 -1
- package/dist/types/crypto/core/xeddsa.d.ts +11 -0
- package/dist/types/crypto/curves/Ed25519.d.ts +7 -1
- package/dist/types/crypto/curves/X25519.d.ts +20 -1
- package/dist/types/crypto/curves/constants.d.ts +4 -2
- package/dist/types/crypto/curves/types.d.ts +0 -5
- package/dist/types/crypto/index.d.ts +1 -0
- package/dist/types/crypto/math/constants.d.ts +0 -1
- package/dist/types/crypto/math/mod.d.ts +0 -1
- package/dist/types/index.d.ts +32 -5
- package/dist/types/infra/log/ConsoleLogger.d.ts +19 -2
- package/dist/types/infra/log/PinoLogger.d.ts +56 -2
- package/dist/types/infra/log/types.d.ts +6 -0
- package/dist/types/infra/perf/BackgroundQueue.d.ts +19 -0
- package/dist/types/infra/perf/StoreLock.d.ts +1 -0
- package/dist/types/media/constants.d.ts +9 -2
- package/dist/types/media/crypto/WaMediaCrypto.d.ts +59 -0
- package/dist/types/media/index.d.ts +7 -4
- package/dist/types/media/processor.d.ts +50 -0
- package/dist/types/media/sticker/sticker-pack.d.ts +6 -0
- package/dist/types/media/{WaMediaTransferClient.d.ts → transfer/WaMediaTransferClient.d.ts} +33 -12
- package/dist/types/media/transfer/conn.d.ts +7 -0
- package/dist/types/media/types.d.ts +10 -5
- package/dist/types/message/WaMessageClient.d.ts +14 -0
- package/dist/types/message/addons/link-preview/builder.d.ts +13 -0
- package/dist/types/message/addons/link-preview/detect.d.ts +5 -0
- package/dist/types/message/addons/link-preview/fetcher.d.ts +13 -0
- package/dist/types/message/addons/link-preview/types.d.ts +51 -0
- package/dist/types/message/context-info.d.ts +66 -0
- package/dist/types/message/crypto/addon-crypto.d.ts +78 -0
- package/dist/types/message/{icdc.d.ts → crypto/icdc.d.ts} +6 -6
- package/dist/types/message/{phash.d.ts → crypto/phash.d.ts} +1 -1
- package/dist/types/message/{reporting-token.d.ts → crypto/reporting-token.d.ts} +2 -2
- package/dist/types/message/{use-case-secret.d.ts → crypto/use-case-secret.d.ts} +17 -1
- package/dist/types/message/encode/content.d.ts +43 -0
- package/dist/types/message/{device-sent.d.ts → encode/device-sent.d.ts} +1 -1
- package/dist/types/message/encode/media-payload.d.ts +12 -0
- package/dist/types/message/index.d.ts +2 -2
- package/dist/types/message/kinds/bot.d.ts +31 -0
- package/dist/types/message/kinds/newsletter.d.ts +12 -0
- package/dist/types/message/kinds/sticker-pack.d.ts +6 -0
- package/dist/types/message/{ack.d.ts → primitives/ack.d.ts} +1 -1
- package/dist/types/message/primitives/incoming.d.ts +21 -0
- package/dist/types/message/primitives/peer-data-operation.d.ts +23 -0
- package/dist/types/message/types.d.ts +218 -28
- package/dist/types/mex.d.ts +2 -0
- package/dist/types/proto.d.ts +2 -2
- package/dist/types/protocol/abprops.d.ts +151 -0
- package/dist/types/protocol/appstate.d.ts +4 -49
- package/dist/types/protocol/auth.d.ts +2 -2
- package/dist/types/protocol/bot.d.ts +45 -0
- package/dist/types/protocol/browser.d.ts +9 -0
- package/dist/types/protocol/business.d.ts +21 -0
- package/dist/types/protocol/call.d.ts +44 -0
- package/dist/types/protocol/constants.d.ts +20 -3
- package/dist/types/protocol/defaults.d.ts +3 -0
- package/dist/types/protocol/email.d.ts +32 -0
- package/dist/types/protocol/group.d.ts +1 -1
- package/dist/types/protocol/index.d.ts +2 -1
- package/dist/types/protocol/jid.d.ts +79 -0
- package/dist/types/protocol/media.d.ts +21 -13
- package/dist/types/protocol/message.d.ts +4 -0
- package/dist/types/protocol/newsletter.d.ts +65 -0
- package/dist/types/protocol/nodes.d.ts +24 -0
- package/dist/types/protocol/notification.d.ts +22 -0
- package/dist/types/protocol/presence.d.ts +16 -0
- package/dist/types/protocol/status.d.ts +7 -0
- package/dist/types/protocol/stream.d.ts +1 -0
- package/dist/types/retry/codec.d.ts +5 -0
- package/dist/types/retry/index.d.ts +1 -1
- package/dist/types/retry/parse.d.ts +9 -0
- package/dist/types/retry/reason.d.ts +6 -1
- package/dist/types/retry/replay.d.ts +19 -5
- package/dist/types/retry/tracker.d.ts +10 -3
- package/dist/types/retry/types.d.ts +3 -8
- package/dist/types/signal/api/SignalDeviceSyncApi.d.ts +20 -0
- package/dist/types/signal/api/SignalDigestSyncApi.d.ts +13 -0
- package/dist/types/signal/api/SignalIdentitySyncApi.d.ts +12 -3
- package/dist/types/signal/api/SignalMissingPreKeysSyncApi.d.ts +8 -0
- package/dist/types/signal/api/SignalRotateKeyApi.d.ts +10 -0
- package/dist/types/signal/api/SignalSessionSyncApi.d.ts +13 -0
- package/dist/types/signal/api/codec.d.ts +20 -0
- package/dist/types/signal/api/constants.d.ts +1 -1
- package/dist/types/signal/api/prekeys.d.ts +4 -0
- package/dist/types/signal/{crypto → attestation}/WaAdvSignature.d.ts +2 -4
- package/dist/types/signal/attestation/constants.d.ts +4 -0
- package/dist/types/signal/constants.d.ts +7 -4
- package/dist/types/signal/encoding.d.ts +6 -62
- package/dist/types/signal/group/SenderKeyChain.d.ts +2 -2
- package/dist/types/signal/group/SenderKeyManager.d.ts +24 -2
- package/dist/types/signal/group/encoding.d.ts +25 -0
- package/dist/types/signal/index.d.ts +4 -1
- package/dist/types/signal/registration/encoding.d.ts +30 -0
- package/dist/types/signal/registration/keygen.d.ts +10 -0
- package/dist/types/signal/registration/utils.d.ts +7 -1
- package/dist/types/signal/session/SignalProtocol.d.ts +66 -2
- package/dist/types/signal/session/SignalRatchet.d.ts +2 -3
- package/dist/types/signal/session/SignalSerializer.d.ts +2 -1
- package/dist/types/signal/session/SignalSession.d.ts +0 -1
- package/dist/types/signal/session/encoding.d.ts +28 -0
- package/dist/types/signal/session/resolver.d.ts +18 -2
- package/dist/types/signal/types.d.ts +16 -4
- package/dist/types/store/cache/identity.cache.d.ts +15 -0
- package/dist/types/store/cache/privacy-token.cache.d.ts +15 -0
- package/dist/types/store/cache/sender-key.cache.d.ts +18 -0
- package/dist/types/store/cache/session.cache.d.ts +23 -0
- package/dist/types/store/contracts/contact.store.d.ts +14 -0
- package/dist/types/store/contracts/device-list.store.d.ts +13 -0
- package/dist/types/store/contracts/group-metadata.store.d.ts +14 -0
- package/dist/types/store/contracts/identity.store.d.ts +11 -0
- package/dist/types/store/contracts/message-secret.store.d.ts +16 -0
- package/dist/types/store/contracts/message.store.d.ts +0 -2
- package/dist/types/store/contracts/pre-key.store.d.ts +13 -0
- package/dist/types/store/contracts/session.store.d.ts +14 -0
- package/dist/types/store/contracts/signal.store.d.ts +1 -34
- package/dist/types/store/createStore.d.ts +54 -2
- package/dist/types/store/index.d.ts +22 -13
- package/dist/types/store/locks/group-metadata.lock.d.ts +2 -0
- package/dist/types/store/locks/identity.lock.d.ts +3 -0
- package/dist/types/store/locks/message-secret.lock.d.ts +3 -0
- package/dist/types/store/locks/pre-key.lock.d.ts +3 -0
- package/dist/types/store/locks/session.lock.d.ts +3 -0
- package/dist/types/store/{providers/memory → memory}/appstate.store.d.ts +2 -2
- package/dist/types/store/memory/auth.store.d.ts +18 -0
- package/dist/types/store/{providers/memory → memory}/contact.store.d.ts +6 -1
- package/dist/types/store/{providers/memory → memory}/device-list.store.d.ts +15 -2
- package/dist/types/store/memory/group-metadata.store.d.ts +27 -0
- package/dist/types/store/memory/identity.store.d.ts +18 -0
- package/dist/types/store/memory/message-secret.store.d.ts +31 -0
- package/dist/types/store/{providers/memory → memory}/message.store.d.ts +1 -1
- package/dist/types/store/memory/pre-key.store.d.ts +23 -0
- package/dist/types/store/{providers/memory → memory}/privacy-token.store.d.ts +1 -1
- package/dist/types/store/{providers/memory → memory}/retry.store.d.ts +23 -4
- package/dist/types/store/{providers/memory → memory}/sender-key.store.d.ts +2 -2
- package/dist/types/store/memory/session.store.d.ts +21 -0
- package/dist/types/store/memory/signal.store.d.ts +16 -0
- package/dist/types/store/{providers/memory → memory}/thread.store.d.ts +1 -1
- package/dist/types/store/noop.store.d.ts +6 -2
- package/dist/types/store/types.d.ts +271 -7
- package/dist/types/transport/WaComms.d.ts +5 -0
- package/dist/types/transport/WaWebSocket.d.ts +6 -0
- package/dist/types/transport/binary/constants.d.ts +8 -2
- package/dist/types/transport/binary/decoder.d.ts +5 -0
- package/dist/types/transport/binary/encoder.d.ts +5 -0
- package/dist/types/transport/binary/tokens.d.ts +6 -6
- package/dist/types/transport/index.d.ts +9 -0
- package/dist/types/transport/keepalive/WaKeepAlive.d.ts +11 -1
- package/dist/types/transport/node/WaMobileTcpSocket.d.ts +24 -0
- package/dist/types/transport/node/WaNodeOrchestrator.d.ts +11 -2
- package/dist/types/transport/node/WaNodeTransport.d.ts +13 -0
- package/dist/types/transport/node/builders/abprops.d.ts +5 -0
- package/dist/types/transport/node/builders/account-sync.d.ts +1 -2
- package/dist/types/transport/node/builders/bot.d.ts +4 -0
- package/dist/types/transport/node/builders/business.d.ts +21 -4
- package/dist/types/transport/node/builders/chatstate.d.ts +11 -0
- package/dist/types/transport/node/builders/community.d.ts +17 -0
- package/dist/types/transport/node/builders/device.d.ts +2 -0
- package/dist/types/transport/node/builders/email.d.ts +11 -0
- package/dist/types/transport/node/builders/group.d.ts +44 -2
- package/dist/types/transport/node/builders/message.d.ts +11 -6
- package/dist/types/transport/node/builders/newsletter.d.ts +73 -0
- package/dist/types/transport/node/builders/offline.d.ts +2 -0
- package/dist/types/transport/node/builders/passive.d.ts +3 -0
- package/dist/types/transport/node/builders/prekeys.d.ts +4 -3
- package/dist/types/transport/node/builders/presence.d.ts +13 -0
- package/dist/types/transport/node/builders/profile.d.ts +3 -0
- package/dist/types/transport/node/builders/tos.d.ts +12 -0
- package/dist/types/transport/node/builders/usync.d.ts +16 -0
- package/dist/types/transport/node/helpers.d.ts +3 -1
- package/dist/types/transport/node/mex/argo-decoder.d.ts +11 -0
- package/dist/types/transport/node/mex/client.d.ts +29 -0
- package/dist/types/transport/node/query.d.ts +19 -1
- package/dist/types/transport/node/usync.d.ts +3 -0
- package/dist/types/transport/noise/WaMobileClientPayload.d.ts +34 -0
- package/dist/types/transport/noise/WaNoiseCert.d.ts +12 -1
- package/dist/types/transport/noise/WaNoiseHandshake.d.ts +12 -6
- package/dist/types/transport/noise/WaNoiseSession.d.ts +1 -1
- package/dist/types/transport/noise/WaNoiseSocket.d.ts +12 -6
- package/dist/types/transport/noise/constants.d.ts +4 -5
- package/dist/types/transport/proxy.d.ts +5 -0
- package/dist/types/transport/types.d.ts +15 -0
- package/dist/types/transport/wa-web-version-fetcher.d.ts +44 -0
- package/dist/types/util/async.d.ts +4 -0
- package/dist/types/util/bytes.d.ts +36 -1
- package/dist/types/util/clock.d.ts +6 -0
- package/dist/types/util/coercion.d.ts +25 -0
- package/dist/types/util/collections.d.ts +8 -0
- package/dist/types/util/index.d.ts +2 -2
- package/dist/types/util/primitives.d.ts +11 -0
- package/dist/types/util/runtime.d.ts +5 -0
- package/dist/types/version-spec.d.ts +1 -0
- package/dist/util/async.js +4 -0
- package/dist/util/bytes.js +37 -2
- package/dist/util/clock.js +18 -0
- package/dist/util/coercion.js +48 -3
- package/dist/util/collections.js +12 -0
- package/dist/util/index.js +7 -1
- package/dist/util/primitives.js +20 -0
- package/dist/util/runtime.js +5 -0
- package/dist/version-spec.js +5 -0
- package/package.json +37 -11
- package/spec/appstate/index.d.ts +188 -0
- package/spec/appstate/index.js +850 -0
- package/spec/mex/index.d.ts +4172 -0
- package/spec/mex/index.js +261 -0
- package/spec/proto/index.d.ts +16305 -0
- package/spec/proto/index.js +1 -0
- package/spec/version/index.d.ts +4 -0
- package/spec/version/index.js +9 -0
- package/spec/version/version.json +3 -0
- package/dist/auth/flow/WaAuthCredentialsFlow.js +0 -130
- package/dist/auth/pairing/WaPairingCodeCrypto.js +0 -77
- package/dist/auth/pairing/constants.js +0 -5
- package/dist/client/connection/WaKeyShareCoordinator.js +0 -63
- package/dist/client/events/chat.js +0 -227
- package/dist/client/incoming.js +0 -269
- package/dist/client/mailbox.js +0 -50
- package/dist/client/messages.js +0 -228
- package/dist/esm/auth/flow/WaAuthCredentialsFlow.js +0 -125
- package/dist/esm/auth/pairing/WaPairingCodeCrypto.js +0 -73
- package/dist/esm/auth/pairing/constants.js +0 -2
- package/dist/esm/client/connection/WaKeyShareCoordinator.js +0 -59
- package/dist/esm/client/events/chat.js +0 -224
- package/dist/esm/client/incoming.js +0 -260
- package/dist/esm/client/mailbox.js +0 -47
- package/dist/esm/client/messages.js +0 -224
- package/dist/esm/media/WaMediaCrypto.js +0 -304
- package/dist/esm/message/addon-crypto.js +0 -59
- package/dist/esm/message/incoming.js +0 -325
- package/dist/esm/message/phash.js +0 -27
- package/dist/esm/signal/crypto/WaAdvSignature.js +0 -64
- package/dist/esm/store/locks/participants.lock.js +0 -20
- package/dist/esm/store/providers/memory/contact.store.js +0 -28
- package/dist/esm/store/providers/memory/device-list.store.js +0 -64
- package/dist/esm/store/providers/memory/signal.store.js +0 -199
- package/dist/esm/transport/node/builders/index.js +0 -11
- package/dist/media/WaMediaCrypto.js +0 -308
- package/dist/message/addon-crypto.js +0 -65
- package/dist/message/phash.js +0 -30
- package/dist/signal/crypto/WaAdvSignature.js +0 -76
- package/dist/store/locks/participants.lock.js +0 -23
- package/dist/store/providers/memory/contact.store.js +0 -32
- package/dist/store/providers/memory/device-list.store.js +0 -68
- package/dist/store/providers/memory/signal.store.js +0 -203
- package/dist/transport/node/builders/index.js +0 -51
- package/dist/types/appstate/WaAppStateSyncClient.d.ts +0 -66
- package/dist/types/auth/flow/WaAuthCredentialsFlow.d.ts +0 -14
- package/dist/types/auth/pairing/constants.d.ts +0 -2
- package/dist/types/client/connection/WaKeyShareCoordinator.d.ts +0 -14
- package/dist/types/client/events/chat.d.ts +0 -3
- package/dist/types/client/history-sync.d.ts +0 -20
- package/dist/types/client/incoming.d.ts +0 -37
- package/dist/types/client/mailbox.d.ts +0 -10
- package/dist/types/client/messages.d.ts +0 -16
- package/dist/types/client/messaging/participants.d.ts +0 -13
- package/dist/types/media/WaMediaCrypto.d.ts +0 -13
- package/dist/types/media/conn.d.ts +0 -3
- package/dist/types/message/addon-crypto.d.ts +0 -25
- package/dist/types/message/content.d.ts +0 -12
- package/dist/types/message/incoming.d.ts +0 -18
- package/dist/types/signal/crypto/constants.d.ts +0 -5
- package/dist/types/store/contracts/participants.store.d.ts +0 -13
- package/dist/types/store/locks/participants.lock.d.ts +0 -2
- package/dist/types/store/providers/memory/participants.store.d.ts +0 -17
- package/dist/types/store/providers/memory/signal.store.d.ts +0 -58
- package/dist/types/transport/node/builders/index.d.ts +0 -11
- package/proto/index.d.ts +0 -10903
- package/proto/index.js +0 -1
- /package/dist/{store/contracts/participants.store.js → client/newsletter/types.js} +0 -0
- /package/dist/esm/{store/contracts/participants.store.js → client/newsletter/types.js} +0 -0
- /package/dist/esm/message/{device-sent.js → encode/device-sent.js} +0 -0
- /package/dist/message/{device-sent.js → encode/device-sent.js} +0 -0
- /package/dist/types/message/{padding.d.ts → encode/padding.d.ts} +0 -0
|
@@ -1,12 +1,22 @@
|
|
|
1
|
-
import { buildCommsConfig, loadOrCreateCredentials, persistCredentials } from './flow
|
|
1
|
+
import { buildCommsConfig, loadOrCreateCredentials, persistCredentials } from './credentials-flow.js';
|
|
2
2
|
import { WaPairingFlow } from './pairing/WaPairingFlow.js';
|
|
3
3
|
import { WaQrFlow } from './pairing/WaQrFlow.js';
|
|
4
4
|
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,
|
|
@@ -24,6 +34,8 @@ export class WaAuthClient {
|
|
|
24
34
|
this.callbacks = deps.callbacks ?? {};
|
|
25
35
|
this.authStore = deps.authStore;
|
|
26
36
|
this.signalStore = deps.signalStore;
|
|
37
|
+
this.preKeyStore = deps.preKeyStore;
|
|
38
|
+
this.isConnected = deps.isConnected;
|
|
27
39
|
this.credentials = null;
|
|
28
40
|
this.qrFlow = new WaQrFlow({
|
|
29
41
|
logger: this.logger,
|
|
@@ -44,9 +56,14 @@ export class WaAuthClient {
|
|
|
44
56
|
emitPairingCode: (code) => this.callbacks.onPairingCode?.(code),
|
|
45
57
|
emitPairingRefresh: (forceManual) => this.callbacks.onPairingRefresh?.(forceManual),
|
|
46
58
|
emitPaired: (credentials) => this.callbacks.onPaired?.(credentials)
|
|
47
|
-
}
|
|
59
|
+
},
|
|
60
|
+
dangerous: options.dangerous
|
|
48
61
|
});
|
|
49
62
|
}
|
|
63
|
+
/**
|
|
64
|
+
* Returns a snapshot of auth readiness flags (connection, registration,
|
|
65
|
+
* pending QR/pairing prompts).
|
|
66
|
+
*/
|
|
50
67
|
getState(connected = false) {
|
|
51
68
|
return {
|
|
52
69
|
connected,
|
|
@@ -55,16 +72,23 @@ export class WaAuthClient {
|
|
|
55
72
|
hasPairingCode: this.pairingFlow.hasPairingSession()
|
|
56
73
|
};
|
|
57
74
|
}
|
|
75
|
+
/** Returns the currently-loaded credentials, or `null` before initialization. */
|
|
58
76
|
getCurrentCredentials() {
|
|
59
77
|
return this.credentials;
|
|
60
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
|
+
*/
|
|
61
83
|
async loadOrCreateCredentials() {
|
|
62
84
|
return this.runHandled(async () => {
|
|
63
85
|
this.logger.debug('auth client loadOrCreateCredentials start');
|
|
64
86
|
this.credentials = await loadOrCreateCredentials({
|
|
65
87
|
logger: this.logger,
|
|
66
88
|
authStore: this.authStore,
|
|
67
|
-
signalStore: this.signalStore
|
|
89
|
+
signalStore: this.signalStore,
|
|
90
|
+
preKeyStore: this.preKeyStore,
|
|
91
|
+
skipSignedPreKeySignatureVerification: this.options.dangerous?.disableSignedPreKeySignatureVerification
|
|
68
92
|
});
|
|
69
93
|
this.logger.info('auth client credentials ready', {
|
|
70
94
|
registered: this.credentials?.meJid !== null && this.credentials?.meJid !== undefined
|
|
@@ -72,25 +96,56 @@ export class WaAuthClient {
|
|
|
72
96
|
return this.credentials;
|
|
73
97
|
});
|
|
74
98
|
}
|
|
75
|
-
|
|
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 = {}) {
|
|
76
104
|
this.logger.trace('auth client building comms config');
|
|
105
|
+
const override = this.versionOverride;
|
|
106
|
+
this.versionOverride = null;
|
|
77
107
|
return buildCommsConfig(this.logger, this.requireCredentials(), socketOptions, {
|
|
78
108
|
deviceBrowser: this.options.deviceBrowser,
|
|
79
109
|
deviceOsDisplayName: this.options.deviceOsDisplayName,
|
|
80
110
|
requireFullSync: this.options.requireFullSync,
|
|
81
|
-
version: this.options.version
|
|
111
|
+
version: override ?? this.options.version,
|
|
112
|
+
mobileTransport: this.options.mobileTransport,
|
|
113
|
+
noiseTrustedRootCa: overrides.noiseTrustedRootCa,
|
|
114
|
+
disableNoiseCertificateChainVerification: overrides.disableNoiseCertificateChainVerification ??
|
|
115
|
+
this.options.dangerous?.disableNoiseCertificateChainVerification
|
|
82
116
|
});
|
|
83
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
|
|
84
130
|
async clearTransientState() {
|
|
85
131
|
this.logger.trace('auth client clear transient state');
|
|
86
132
|
this.qrFlow.clear();
|
|
87
133
|
this.pairingFlow.clearSession();
|
|
88
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
|
+
*/
|
|
89
143
|
async clearStoredCredentials() {
|
|
90
144
|
this.logger.warn('auth client clearing stored credentials');
|
|
91
145
|
this.credentials = null;
|
|
92
146
|
await Promise.all([this.authStore.clear(), this.clearTransientState()]);
|
|
93
147
|
}
|
|
148
|
+
/** Stores the server's noise static key for subsequent handshakes. */
|
|
94
149
|
async persistServerStaticKey(serverStaticKey) {
|
|
95
150
|
this.logger.debug('persisting server static key', {
|
|
96
151
|
keyLength: serverStaticKey.byteLength
|
|
@@ -100,6 +155,7 @@ export class WaAuthClient {
|
|
|
100
155
|
serverStaticKey
|
|
101
156
|
}));
|
|
102
157
|
}
|
|
158
|
+
/** Stores the "server holds prekeys" flag; persists only when the value changes. */
|
|
103
159
|
async persistServerHasPreKeys(serverHasPreKeys) {
|
|
104
160
|
await this.patchCredentials((credentials) => ({
|
|
105
161
|
...credentials,
|
|
@@ -113,6 +169,10 @@ export class WaAuthClient {
|
|
|
113
169
|
}
|
|
114
170
|
});
|
|
115
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
|
+
*/
|
|
116
176
|
async persistRoutingInfo(routingInfo) {
|
|
117
177
|
this.logger.trace('persisting routing info', {
|
|
118
178
|
byteLength: routingInfo.byteLength
|
|
@@ -130,6 +190,7 @@ export class WaAuthClient {
|
|
|
130
190
|
}
|
|
131
191
|
});
|
|
132
192
|
}
|
|
193
|
+
/** Clears the persisted routing-info blob (used after a routing error). */
|
|
133
194
|
async clearRoutingInfo() {
|
|
134
195
|
return this.patchCredentials((credentials) => ({
|
|
135
196
|
...credentials,
|
|
@@ -141,6 +202,11 @@ export class WaAuthClient {
|
|
|
141
202
|
}
|
|
142
203
|
});
|
|
143
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
|
+
*/
|
|
144
210
|
async persistSuccessAttributes(attributes) {
|
|
145
211
|
let persistDiff;
|
|
146
212
|
const computeDiff = (current, next) => ({
|
|
@@ -177,24 +243,56 @@ export class WaAuthClient {
|
|
|
177
243
|
}
|
|
178
244
|
});
|
|
179
245
|
}
|
|
180
|
-
|
|
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();
|
|
181
274
|
this.requireCredentials();
|
|
182
|
-
this.logger.
|
|
183
|
-
return this.runHandled(() => this.pairingFlow.requestPairingCode(phoneNumber, shouldShowPushNotification));
|
|
275
|
+
this.logger.debug('auth client requesting pairing code');
|
|
276
|
+
return this.runHandled(() => this.pairingFlow.requestPairingCode(phoneNumber, shouldShowPushNotification, customCode));
|
|
184
277
|
}
|
|
278
|
+
/** Fetches the ISO country code the server resolved for the current account. */
|
|
185
279
|
async fetchPairingCountryCodeIso() {
|
|
280
|
+
this.requireConnected();
|
|
186
281
|
this.requireCredentials();
|
|
187
282
|
this.logger.trace('auth client fetching pairing country code ISO');
|
|
188
283
|
return this.runHandled(() => this.pairingFlow.fetchPairingCountryCodeIso());
|
|
189
284
|
}
|
|
285
|
+
/** Dispatcher: returns `true` when `node` is a pairing-related IQ-set we handled. */
|
|
190
286
|
async handleIncomingIqSet(node) {
|
|
191
287
|
this.logger.trace('auth client handleIncomingIqSet', { id: node.attrs.id });
|
|
192
288
|
return this.runHandled(() => this.pairingFlow.handleIncomingIqSet(node));
|
|
193
289
|
}
|
|
290
|
+
/** Dispatcher: returns `true` when `node` is a link-code companion notification. */
|
|
194
291
|
async handleLinkCodeNotification(node) {
|
|
195
292
|
this.logger.trace('auth client handleLinkCodeNotification', { id: node.attrs.id });
|
|
196
293
|
return this.runHandled(() => this.pairingFlow.handleLinkCodeNotification(node));
|
|
197
294
|
}
|
|
295
|
+
/** Dispatcher: returns `true` when `node` is a companion-registration refresh notification. */
|
|
198
296
|
async handleCompanionRegRefreshNotification(node) {
|
|
199
297
|
this.logger.trace('auth client handleCompanionRegRefreshNotification', {
|
|
200
298
|
id: node.attrs.id
|
|
@@ -222,15 +320,21 @@ export class WaAuthClient {
|
|
|
222
320
|
}
|
|
223
321
|
async updateCredentials(credentials) {
|
|
224
322
|
this.logger.trace('auth client update credentials', {
|
|
225
|
-
registered: credentials?.meJid
|
|
323
|
+
registered: !!credentials?.meJid
|
|
226
324
|
});
|
|
227
325
|
this.credentials = credentials;
|
|
228
326
|
await persistCredentials({
|
|
229
327
|
logger: this.logger,
|
|
230
328
|
authStore: this.authStore,
|
|
231
|
-
signalStore: this.signalStore
|
|
329
|
+
signalStore: this.signalStore,
|
|
330
|
+
preKeyStore: this.preKeyStore
|
|
232
331
|
}, credentials);
|
|
233
332
|
}
|
|
333
|
+
requireConnected() {
|
|
334
|
+
if (this.isConnected && !this.isConnected()) {
|
|
335
|
+
throw new Error('client is not connected');
|
|
336
|
+
}
|
|
337
|
+
}
|
|
234
338
|
requireCredentials() {
|
|
235
339
|
if (!this.credentials) {
|
|
236
340
|
throw new Error('credentials are not initialized');
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
import { randomBytesAsync, toRawPubKey, xeddsaVerify } from '../crypto/index.js';
|
|
2
|
+
import { toSerializedPubKey } from '../crypto/core/keys.js';
|
|
3
|
+
import { X25519 } from '../crypto/curves/X25519.js';
|
|
4
|
+
import { getLoginIdentity } from '../protocol/jid.js';
|
|
5
|
+
import { createAndStoreInitialKeys } from '../signal/index.js';
|
|
6
|
+
import { WaMobileTcpSocketCtor } from '../transport/node/WaMobileTcpSocket.js';
|
|
7
|
+
import { buildMobileLoginPayload } from '../transport/noise/WaMobileClientPayload.js';
|
|
8
|
+
import { toProxyAgent, toProxyDispatcher } from '../transport/proxy.js';
|
|
9
|
+
import { toError } from '../util/primitives.js';
|
|
10
|
+
export async function loadOrCreateCredentials(args) {
|
|
11
|
+
args.logger.trace('auth credentials loadOrCreate start');
|
|
12
|
+
const existing = await args.authStore.load();
|
|
13
|
+
if (!existing) {
|
|
14
|
+
const credentials = await createFreshAndPersistCredentials(args);
|
|
15
|
+
args.logger.info('created fresh auth credentials');
|
|
16
|
+
return credentials;
|
|
17
|
+
}
|
|
18
|
+
args.logger.debug('auth credentials loaded from store', {
|
|
19
|
+
registered: existing.meJid !== null && existing.meJid !== undefined,
|
|
20
|
+
hasServerStaticKey: existing.serverStaticKey !== null && existing.serverStaticKey !== undefined
|
|
21
|
+
});
|
|
22
|
+
const skipSignedPreKeyCheck = args.skipSignedPreKeySignatureVerification === true;
|
|
23
|
+
if (!existing.meJid &&
|
|
24
|
+
!skipSignedPreKeyCheck &&
|
|
25
|
+
!(await hasValidSignedPreKey(args.logger, existing))) {
|
|
26
|
+
args.logger.warn('signed pre-key is invalid, regenerating credentials');
|
|
27
|
+
const fresh = await createFreshAndPersistCredentials(args);
|
|
28
|
+
args.logger.info('regenerated credentials due to invalid signed pre-key');
|
|
29
|
+
return fresh;
|
|
30
|
+
}
|
|
31
|
+
await restoreSignalStore(args.signalStore, args.preKeyStore, existing);
|
|
32
|
+
args.logger.trace('auth credentials restored into signal store');
|
|
33
|
+
return existing;
|
|
34
|
+
}
|
|
35
|
+
export async function persistCredentials(args, credentials) {
|
|
36
|
+
args.logger.trace('persisting auth credentials', {
|
|
37
|
+
registered: credentials.meJid !== null && credentials.meJid !== undefined
|
|
38
|
+
});
|
|
39
|
+
await args.authStore.save(credentials);
|
|
40
|
+
}
|
|
41
|
+
function mobileTransportFromCredentials(credentials) {
|
|
42
|
+
if (!credentials.deviceInfo)
|
|
43
|
+
return undefined;
|
|
44
|
+
return {
|
|
45
|
+
deviceInfo: credentials.deviceInfo,
|
|
46
|
+
...(credentials.pushName !== undefined ? { pushName: credentials.pushName } : {}),
|
|
47
|
+
...(credentials.yearClass !== undefined ? { yearClass: credentials.yearClass } : {}),
|
|
48
|
+
...(credentials.memClass !== undefined ? { memClass: credentials.memClass } : {})
|
|
49
|
+
};
|
|
50
|
+
}
|
|
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) {
|
|
63
|
+
const meJid = credentials.meJid;
|
|
64
|
+
const registered = meJid !== null && meJid !== undefined;
|
|
65
|
+
const loginIdentity = registered ? getLoginIdentity(meJid) : null;
|
|
66
|
+
const wsProxy = socketOptions.proxy?.ws;
|
|
67
|
+
// Resolve the effective mobile transport: explicit option wins, otherwise
|
|
68
|
+
// synthesize one from persisted credentials.deviceInfo so a registered
|
|
69
|
+
// mobile session boots in mobile mode without the caller re-passing
|
|
70
|
+
// deviceInfo on every `new WaClient(...)` call.
|
|
71
|
+
const effectiveMobileTransport = clientOptions.mobileTransport ?? mobileTransportFromCredentials(credentials);
|
|
72
|
+
logger.debug('building comms config from credentials', {
|
|
73
|
+
registered,
|
|
74
|
+
hasServerStaticKey: credentials.serverStaticKey !== null && credentials.serverStaticKey !== undefined,
|
|
75
|
+
mobile: Boolean(effectiveMobileTransport),
|
|
76
|
+
mobileSource: clientOptions.mobileTransport
|
|
77
|
+
? 'option'
|
|
78
|
+
: effectiveMobileTransport
|
|
79
|
+
? 'credentials'
|
|
80
|
+
: 'none'
|
|
81
|
+
});
|
|
82
|
+
if (effectiveMobileTransport) {
|
|
83
|
+
if (wsProxy) {
|
|
84
|
+
throw new Error('mobileTransport does not support socketOptions.proxy.ws – remove the proxy option or open an issue to add TCP proxy support');
|
|
85
|
+
}
|
|
86
|
+
if (!loginIdentity) {
|
|
87
|
+
throw new Error('mobileTransport requires registered credentials (meJid) – run the mobile bridge flow first');
|
|
88
|
+
}
|
|
89
|
+
const loginPayload = buildMobileLoginPayload({
|
|
90
|
+
username: loginIdentity.username,
|
|
91
|
+
device: loginIdentity.device,
|
|
92
|
+
passive: effectiveMobileTransport.passive ?? false,
|
|
93
|
+
deviceInfo: effectiveMobileTransport.deviceInfo,
|
|
94
|
+
pushName: effectiveMobileTransport.pushName,
|
|
95
|
+
yearClass: effectiveMobileTransport.yearClass,
|
|
96
|
+
memClass: effectiveMobileTransport.memClass
|
|
97
|
+
});
|
|
98
|
+
return {
|
|
99
|
+
url: effectiveMobileTransport.tcpUrl ?? 'tcp://g.whatsapp.net:443',
|
|
100
|
+
rawWebSocketConstructor: WaMobileTcpSocketCtor,
|
|
101
|
+
connectTimeoutMs: socketOptions.connectTimeoutMs,
|
|
102
|
+
reconnectIntervalMs: socketOptions.reconnectIntervalMs,
|
|
103
|
+
timeoutIntervalMs: socketOptions.timeoutIntervalMs,
|
|
104
|
+
maxReconnectAttempts: socketOptions.maxReconnectAttempts,
|
|
105
|
+
noise: {
|
|
106
|
+
clientStaticKeyPair: credentials.noiseKeyPair,
|
|
107
|
+
isRegistered: true,
|
|
108
|
+
serverStaticKey: credentials.serverStaticKey,
|
|
109
|
+
routingInfo: credentials.routingInfo,
|
|
110
|
+
trustedRootCa: clientOptions.noiseTrustedRootCa,
|
|
111
|
+
verifyCertificateChain: clientOptions.disableNoiseCertificateChainVerification
|
|
112
|
+
? false
|
|
113
|
+
: undefined,
|
|
114
|
+
loginPayload
|
|
115
|
+
}
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
const versionBase = await resolveVersion(clientOptions.version);
|
|
119
|
+
return {
|
|
120
|
+
url: socketOptions.url,
|
|
121
|
+
urls: socketOptions.urls,
|
|
122
|
+
protocols: socketOptions.protocols,
|
|
123
|
+
dispatcher: toProxyDispatcher(wsProxy),
|
|
124
|
+
agent: toProxyAgent(wsProxy),
|
|
125
|
+
connectTimeoutMs: socketOptions.connectTimeoutMs,
|
|
126
|
+
reconnectIntervalMs: socketOptions.reconnectIntervalMs,
|
|
127
|
+
timeoutIntervalMs: socketOptions.timeoutIntervalMs,
|
|
128
|
+
maxReconnectAttempts: socketOptions.maxReconnectAttempts,
|
|
129
|
+
noise: {
|
|
130
|
+
clientStaticKeyPair: credentials.noiseKeyPair,
|
|
131
|
+
isRegistered: registered,
|
|
132
|
+
serverStaticKey: credentials.serverStaticKey,
|
|
133
|
+
routingInfo: credentials.routingInfo,
|
|
134
|
+
trustedRootCa: clientOptions.noiseTrustedRootCa,
|
|
135
|
+
verifyCertificateChain: clientOptions.disableNoiseCertificateChainVerification
|
|
136
|
+
? false
|
|
137
|
+
: undefined,
|
|
138
|
+
loginPayloadConfig: loginIdentity
|
|
139
|
+
? {
|
|
140
|
+
username: loginIdentity.username,
|
|
141
|
+
device: loginIdentity.device,
|
|
142
|
+
deviceBrowser: clientOptions.deviceBrowser,
|
|
143
|
+
deviceOsDisplayName: clientOptions.deviceOsDisplayName,
|
|
144
|
+
versionBase
|
|
145
|
+
}
|
|
146
|
+
: undefined,
|
|
147
|
+
registrationPayloadConfig: !loginIdentity
|
|
148
|
+
? {
|
|
149
|
+
registrationInfo: credentials.registrationInfo,
|
|
150
|
+
signedPreKey: credentials.signedPreKey,
|
|
151
|
+
deviceBrowser: clientOptions.deviceBrowser,
|
|
152
|
+
deviceOsDisplayName: clientOptions.deviceOsDisplayName,
|
|
153
|
+
requireFullSync: clientOptions.requireFullSync,
|
|
154
|
+
versionBase
|
|
155
|
+
}
|
|
156
|
+
: undefined
|
|
157
|
+
}
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
async function createFreshCredentials(signalStore, preKeyStore, logger) {
|
|
161
|
+
logger.trace('creating fresh credentials');
|
|
162
|
+
const [noiseKeyPair, registrationBundle, advSecretKey] = await Promise.all([
|
|
163
|
+
X25519.generateKeyPair(),
|
|
164
|
+
createAndStoreInitialKeys(signalStore, preKeyStore),
|
|
165
|
+
randomBytesAsync(32)
|
|
166
|
+
]);
|
|
167
|
+
return {
|
|
168
|
+
noiseKeyPair,
|
|
169
|
+
registrationInfo: registrationBundle.registrationInfo,
|
|
170
|
+
signedPreKey: registrationBundle.signedPreKey,
|
|
171
|
+
serverHasPreKeys: false,
|
|
172
|
+
advSecretKey
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
async function createFreshAndPersistCredentials(args) {
|
|
176
|
+
const credentials = await createFreshCredentials(args.signalStore, args.preKeyStore, args.logger);
|
|
177
|
+
// Persist credentials first so signal restore never commits state for credentials that failed to save.
|
|
178
|
+
await args.authStore.save(credentials);
|
|
179
|
+
await restoreSignalStore(args.signalStore, args.preKeyStore, credentials);
|
|
180
|
+
return credentials;
|
|
181
|
+
}
|
|
182
|
+
async function hasValidSignedPreKey(logger, credentials) {
|
|
183
|
+
try {
|
|
184
|
+
const serializedPubKey = toSerializedPubKey(credentials.signedPreKey.keyPair.pubKey);
|
|
185
|
+
const valid = await xeddsaVerify(toRawPubKey(credentials.registrationInfo.identityKeyPair.pubKey), serializedPubKey, credentials.signedPreKey.signature);
|
|
186
|
+
logger.trace('signed pre-key validation completed', { valid });
|
|
187
|
+
return valid;
|
|
188
|
+
}
|
|
189
|
+
catch (error) {
|
|
190
|
+
logger.warn('signed pre-key validation failed with exception', {
|
|
191
|
+
message: toError(error).message
|
|
192
|
+
});
|
|
193
|
+
return false;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
async function restoreSignalStore(signalStore, preKeyStore, credentials) {
|
|
197
|
+
await Promise.all([
|
|
198
|
+
signalStore.setRegistrationInfo(credentials.registrationInfo),
|
|
199
|
+
signalStore.setSignedPreKey(credentials.signedPreKey),
|
|
200
|
+
preKeyStore.setServerHasPreKeys(credentials.serverHasPreKeys === true)
|
|
201
|
+
]);
|
|
202
|
+
}
|
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
import { completeCompanionFinish, createCompanionHello } from '../pairing/
|
|
1
|
+
import { completeCompanionFinish, createCompanionHello, normalizeCustomPairingCode } from '../pairing/pairing-code-crypto.js';
|
|
2
2
|
import { randomBytesAsync } from '../../crypto/index.js';
|
|
3
3
|
import { proto } from '../../proto.js';
|
|
4
|
+
import { getWaBrowserDisplayName } from '../../protocol/browser.js';
|
|
4
5
|
import { WA_DEFAULTS, WA_IQ_TYPES, WA_NODE_TAGS, WA_SIGNALING } from '../../protocol/constants.js';
|
|
5
6
|
import { parsePhoneJid } from '../../protocol/jid.js';
|
|
6
|
-
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';
|
|
7
8
|
import { buildAckNode, buildIqResultNode } from '../../transport/node/builders/global.js';
|
|
8
9
|
import { buildCompanionFinishRequestNode, buildCompanionHelloRequestNode, buildGetCountryCodeRequestNode } from '../../transport/node/builders/pairing.js';
|
|
9
|
-
import { decodeNodeContentUtf8OrBytes,
|
|
10
|
-
import { decodeProtoBytes } from '../../util/bytes.js';
|
|
11
|
-
import { concatBytes, uint8Equal } from '../../util/bytes.js';
|
|
10
|
+
import { decodeNodeContentUtf8OrBytes, findNodeChild, findNodeChildrenByTags, getFirstNodeChild, getNodeChildrenNonEmptyUtf8ByTag, hasNodeChild } from '../../transport/node/helpers.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,26 +21,19 @@ 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
|
-
shouldShowPushNotification
|
|
26
|
+
shouldShowPushNotification,
|
|
27
|
+
hasCustomCode: customCode !== undefined
|
|
27
28
|
});
|
|
29
|
+
const normalizedCustomCode = customCode !== undefined ? normalizeCustomPairingCode(customCode) : undefined;
|
|
28
30
|
const credentials = this.requireCredentials();
|
|
29
31
|
const phoneJid = parsePhoneJid(phoneNumber);
|
|
30
32
|
const [companionHello, refreshedCredentials] = await Promise.all([
|
|
31
|
-
createCompanionHello(),
|
|
33
|
+
createCompanionHello({ customCode: normalizedCustomCode }),
|
|
32
34
|
this.rotateAdvSecret(credentials)
|
|
33
35
|
]);
|
|
34
|
-
const
|
|
35
|
-
const browserDisplayName = {
|
|
36
|
-
chrome: 'Chrome',
|
|
37
|
-
firefox: 'Firefox',
|
|
38
|
-
ie: 'IE',
|
|
39
|
-
opera: 'Opera',
|
|
40
|
-
safari: 'Safari',
|
|
41
|
-
edge: 'Edge',
|
|
42
|
-
chromium: 'Chromium'
|
|
43
|
-
}[browser.trim().toLowerCase()] ?? browser;
|
|
36
|
+
const browserDisplayName = getWaBrowserDisplayName(this.opts.device.browser);
|
|
44
37
|
const response = await this.opts.socket.query(buildCompanionHelloRequestNode({
|
|
45
38
|
phoneJid,
|
|
46
39
|
shouldShowPushNotification,
|
|
@@ -72,7 +65,7 @@ export class WaPairingFlow {
|
|
|
72
65
|
finished: false
|
|
73
66
|
};
|
|
74
67
|
this.opts.callbacks.emitPairingCode(companionHello.pairingCode);
|
|
75
|
-
this.opts.logger.
|
|
68
|
+
this.opts.logger.debug('pairing code emitted', {
|
|
76
69
|
phoneJid,
|
|
77
70
|
createdAtSeconds: this.pairingSession.createdAtSeconds
|
|
78
71
|
});
|
|
@@ -90,21 +83,19 @@ export class WaPairingFlow {
|
|
|
90
83
|
return iso;
|
|
91
84
|
}
|
|
92
85
|
async handleIncomingIqSet(node) {
|
|
93
|
-
this.opts.logger.
|
|
94
|
-
|
|
95
|
-
from: node.attrs.from
|
|
96
|
-
});
|
|
86
|
+
const iqLogger = this.opts.logger.child({ id: node.attrs.id });
|
|
87
|
+
iqLogger.trace('pairing flow received iq:set', { from: node.attrs.from });
|
|
97
88
|
const firstChild = getFirstNodeChild(node);
|
|
98
89
|
if (!firstChild) {
|
|
99
90
|
return false;
|
|
100
91
|
}
|
|
101
92
|
if (firstChild.tag === WA_NODE_TAGS.PAIR_DEVICE) {
|
|
102
|
-
|
|
93
|
+
iqLogger.debug('handling pair-device stanza');
|
|
103
94
|
await this.handlePairDevice(node, firstChild);
|
|
104
95
|
return true;
|
|
105
96
|
}
|
|
106
97
|
if (firstChild.tag === WA_NODE_TAGS.PAIR_SUCCESS) {
|
|
107
|
-
|
|
98
|
+
iqLogger.debug('handling pair-success stanza');
|
|
108
99
|
await this.handlePairSuccess(node, firstChild);
|
|
109
100
|
return true;
|
|
110
101
|
}
|
|
@@ -131,7 +122,7 @@ export class WaPairingFlow {
|
|
|
131
122
|
}
|
|
132
123
|
const ref = decodeNodeContentUtf8OrBytes(refNode.content, 'refresh_code.link_code_pairing_ref');
|
|
133
124
|
if (uint8Equal(ref, this.pairingSession.ref)) {
|
|
134
|
-
this.opts.logger.
|
|
125
|
+
this.opts.logger.debug('received pairing refresh notification', {
|
|
135
126
|
forceManualRefresh: linkCodeNode.attrs.force_manual_refresh === 'true'
|
|
136
127
|
});
|
|
137
128
|
this.opts.callbacks.emitPairingRefresh(linkCodeNode.attrs.force_manual_refresh === 'true');
|
|
@@ -157,7 +148,7 @@ export class WaPairingFlow {
|
|
|
157
148
|
node,
|
|
158
149
|
typeOverride: WA_SIGNALING.COMPANION_REG_REFRESH_NOTIFICATION
|
|
159
150
|
}));
|
|
160
|
-
this.opts.logger.
|
|
151
|
+
this.opts.logger.debug('handled companion_reg_refresh notification');
|
|
161
152
|
this.opts.qrFlow.refreshCurrentQr();
|
|
162
153
|
return true;
|
|
163
154
|
}
|
|
@@ -167,10 +158,10 @@ export class WaPairingFlow {
|
|
|
167
158
|
await this.rotateAdvSecret(this.requireCredentials());
|
|
168
159
|
await this.opts.socket.sendNode(buildIqResultNode(iqNode));
|
|
169
160
|
this.opts.qrFlow.setRefs(refs);
|
|
170
|
-
this.opts.logger.
|
|
161
|
+
this.opts.logger.debug('pair-device refs updated', { refsCount: refs.length });
|
|
171
162
|
}
|
|
172
163
|
async handlePairSuccess(iqNode, pairSuccessNode) {
|
|
173
|
-
this.opts.logger.
|
|
164
|
+
this.opts.logger.debug('processing pair-success node');
|
|
174
165
|
const credentials = this.requireCredentials();
|
|
175
166
|
const [deviceIdentityNode, deviceNode, platformNode] = findNodeChildrenByTags(pairSuccessNode, [WA_NODE_TAGS.DEVICE_IDENTITY, 'device', WA_NODE_TAGS.PLATFORM]);
|
|
176
167
|
if (!deviceIdentityNode || !deviceNode || !platformNode) {
|
|
@@ -186,15 +177,22 @@ export class WaPairingFlow {
|
|
|
186
177
|
const wrappedHmac = decodeProtoBytes(wrappedIdentity.hmac, 'ADVSignedDeviceIdentityHMAC.hmac');
|
|
187
178
|
const accountType = wrappedIdentity.accountType ?? proto.ADVEncryptionType.E2EE;
|
|
188
179
|
const isHosted = accountType === proto.ADVEncryptionType.HOSTED;
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
180
|
+
if (this.opts.dangerous?.disablePairSuccessHmacVerification !== true) {
|
|
181
|
+
const hmacInput = isHosted
|
|
182
|
+
? concatBytes([ADV_PREFIX_HOSTED_ACCOUNT_SIGNATURE, wrappedDetails])
|
|
183
|
+
: wrappedDetails;
|
|
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
|
+
});
|
|
192
|
+
throw new Error('pair-success HMAC validation failed');
|
|
193
|
+
}
|
|
196
194
|
}
|
|
197
|
-
const { signedIdentity, keyIndex, responseIdentityBytes } = await this.buildPairSuccessResponseIdentity(credentials, wrappedDetails
|
|
195
|
+
const { signedIdentity, keyIndex, responseIdentityBytes } = await this.buildPairSuccessResponseIdentity(credentials, wrappedDetails);
|
|
198
196
|
const nextCredentials = {
|
|
199
197
|
...credentials,
|
|
200
198
|
signedIdentity,
|
|
@@ -235,19 +233,25 @@ export class WaPairingFlow {
|
|
|
235
233
|
this.opts.callbacks.emitPaired(nextCredentials);
|
|
236
234
|
this.opts.logger.debug('pair-success completed and paired event emitted');
|
|
237
235
|
}
|
|
238
|
-
async buildPairSuccessResponseIdentity(credentials, wrappedDetails
|
|
236
|
+
async buildPairSuccessResponseIdentity(credentials, wrappedDetails) {
|
|
239
237
|
const signedIdentity = proto.ADVSignedDeviceIdentity.decode(wrappedDetails);
|
|
240
238
|
const details = decodeProtoBytes(signedIdentity.details, 'ADVSignedDeviceIdentity.details');
|
|
241
239
|
const accountSignature = decodeProtoBytes(signedIdentity.accountSignature, 'ADVSignedDeviceIdentity.accountSignature');
|
|
242
240
|
const accountSignatureKey = decodeProtoBytes(signedIdentity.accountSignatureKey, 'ADVSignedDeviceIdentity.accountSignatureKey');
|
|
243
241
|
const localIdentity = credentials.registrationInfo.identityKeyPair;
|
|
244
|
-
const validAccountSignature = await verifyDeviceIdentityAccountSignature(details, accountSignature, localIdentity.pubKey, accountSignatureKey, isHosted);
|
|
245
|
-
if (!validAccountSignature) {
|
|
246
|
-
this.opts.logger.error('pair-success account signature invalid');
|
|
247
|
-
throw new Error('pair-success account signature validation failed');
|
|
248
|
-
}
|
|
249
|
-
signedIdentity.deviceSignature = await generateDeviceSignature(details, localIdentity, accountSignatureKey, isHosted);
|
|
250
242
|
const advDeviceIdentity = proto.ADVDeviceIdentity.decode(details);
|
|
243
|
+
const isDeviceHosted = advDeviceIdentity.deviceType === proto.ADVEncryptionType.HOSTED;
|
|
244
|
+
if (this.opts.dangerous?.disableAdvSignatureVerification !== true) {
|
|
245
|
+
const validAccountSignature = await verifyDeviceIdentityAccountSignature(details, accountSignature, localIdentity.pubKey, accountSignatureKey, isDeviceHosted);
|
|
246
|
+
if (!validAccountSignature) {
|
|
247
|
+
this.opts.logger.error('pair-success account signature invalid', {
|
|
248
|
+
keyIndex: advDeviceIdentity.keyIndex ?? 0,
|
|
249
|
+
isDeviceHosted
|
|
250
|
+
});
|
|
251
|
+
throw new Error('pair-success account signature validation failed');
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
signedIdentity.deviceSignature = await generateDeviceSignature(details, localIdentity, accountSignatureKey, false);
|
|
251
255
|
const responseIdentityBytes = proto.ADVSignedDeviceIdentity.encode({
|
|
252
256
|
details: signedIdentity.details,
|
|
253
257
|
accountSignature: signedIdentity.accountSignature,
|
|
@@ -283,7 +287,9 @@ export class WaPairingFlow {
|
|
|
283
287
|
}
|
|
284
288
|
const ref = decodeNodeContentUtf8OrBytes(refNode.content, 'primary_hello.link_code_pairing_ref');
|
|
285
289
|
if (!pairingSession.ref || !uint8Equal(ref, pairingSession.ref)) {
|
|
286
|
-
this.opts.logger.warn('primary_hello ref mismatch ignored'
|
|
290
|
+
this.opts.logger.warn('primary_hello ref mismatch ignored', {
|
|
291
|
+
phoneJid: pairingSession.phoneJid
|
|
292
|
+
});
|
|
287
293
|
return;
|
|
288
294
|
}
|
|
289
295
|
const nowSeconds = Math.floor(Date.now() / 1000);
|
|
@@ -312,7 +318,7 @@ export class WaPairingFlow {
|
|
|
312
318
|
advSecretKey: finish.advSecret
|
|
313
319
|
});
|
|
314
320
|
pairingSession.finished = true;
|
|
315
|
-
this.opts.logger.
|
|
321
|
+
this.opts.logger.debug('primary_hello completed with companion_finish success');
|
|
316
322
|
}
|
|
317
323
|
async rotateAdvSecret(credentials) {
|
|
318
324
|
const nextCredentials = {
|