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