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
|
@@ -7,13 +7,13 @@ import { buildLoginPayload, buildRegistrationPayload } from '../noise/WaClientPa
|
|
|
7
7
|
import { WaFrameCodec } from '../noise/WaFrameCodec.js';
|
|
8
8
|
import { verifyNoiseCertificateChain } from '../noise/WaNoiseCert.js';
|
|
9
9
|
import { WaNoiseHandshake } from '../noise/WaNoiseHandshake.js';
|
|
10
|
-
import { concatBytes
|
|
10
|
+
import { concatBytes } from '../../util/bytes.js';
|
|
11
11
|
import { toError } from '../../util/primitives.js';
|
|
12
12
|
function resolvePayload(payload) {
|
|
13
13
|
if (payload instanceof Uint8Array) {
|
|
14
14
|
return Promise.resolve(payload);
|
|
15
15
|
}
|
|
16
|
-
return Promise.resolve(payload())
|
|
16
|
+
return Promise.resolve(payload());
|
|
17
17
|
}
|
|
18
18
|
async function resolveHandshakePayload(config) {
|
|
19
19
|
if (config.isRegistered) {
|
|
@@ -48,7 +48,6 @@ function buildRoutingInfoPrefix(routingInfo) {
|
|
|
48
48
|
export class WaNoiseSession {
|
|
49
49
|
constructor(sendWire, logger = new ConsoleLogger('info')) {
|
|
50
50
|
this.writeChain = Promise.resolve();
|
|
51
|
-
this.readChain = Promise.resolve();
|
|
52
51
|
this.frameCodec = null;
|
|
53
52
|
this.handshakeInbox = [];
|
|
54
53
|
this.handshakeInboxHead = 0;
|
|
@@ -58,6 +57,7 @@ export class WaNoiseSession {
|
|
|
58
57
|
this.closedError = null;
|
|
59
58
|
this.noiseSocket = null;
|
|
60
59
|
this.serverStaticKey = null;
|
|
60
|
+
this.trustedRootCa = undefined;
|
|
61
61
|
this.handshakeFrameTimeoutMs = WA_DEFAULTS.CONNECT_TIMEOUT_MS;
|
|
62
62
|
this.sendWire = sendWire;
|
|
63
63
|
this.logger = logger;
|
|
@@ -68,9 +68,7 @@ export class WaNoiseSession {
|
|
|
68
68
|
isRegistered: config.isRegistered,
|
|
69
69
|
hasServerStaticKey: !!config.serverStaticKey
|
|
70
70
|
});
|
|
71
|
-
const protocolHeader = config.protocolHeader
|
|
72
|
-
? toBytesView(config.protocolHeader)
|
|
73
|
-
: WA_PROTO_HEADER;
|
|
71
|
+
const protocolHeader = config.protocolHeader ?? WA_PROTO_HEADER;
|
|
74
72
|
const introFrame = config.routingInfo && config.routingInfo.length > 0
|
|
75
73
|
? concatBytes([buildRoutingInfoPrefix(config.routingInfo), protocolHeader])
|
|
76
74
|
: protocolHeader;
|
|
@@ -80,17 +78,18 @@ export class WaNoiseSession {
|
|
|
80
78
|
resolveHandshakePayload(config)
|
|
81
79
|
]);
|
|
82
80
|
const verifyCertificates = config.verifyCertificateChain !== false;
|
|
81
|
+
this.trustedRootCa = config.trustedRootCa;
|
|
83
82
|
if (config.serverStaticKey && config.serverStaticKey.length === 32) {
|
|
84
|
-
this.logger.
|
|
83
|
+
this.logger.debug('noise session attempting resume handshake (IK)');
|
|
85
84
|
this.noiseSocket = await this.resumeHandshake(config.serverStaticKey, config.clientStaticKeyPair, ephemeralKeyPair, payload, protocolHeader, verifyCertificates);
|
|
86
85
|
await this.decodeBufferedPostHandshakeFrames();
|
|
87
|
-
this.logger.info('noise session established
|
|
86
|
+
this.logger.info('noise session established', { mode: 'resume_or_fallback' });
|
|
88
87
|
return;
|
|
89
88
|
}
|
|
90
|
-
this.logger.
|
|
89
|
+
this.logger.debug('noise session starting full handshake (XX)');
|
|
91
90
|
this.noiseSocket = await this.fullHandshake(config.clientStaticKeyPair, ephemeralKeyPair, payload, protocolHeader, verifyCertificates);
|
|
92
91
|
await this.decodeBufferedPostHandshakeFrames();
|
|
93
|
-
this.logger.info('noise session established
|
|
92
|
+
this.logger.info('noise session established', { mode: 'full' });
|
|
94
93
|
}
|
|
95
94
|
encryptFrame(frame) {
|
|
96
95
|
const socket = this.noiseSocket;
|
|
@@ -98,19 +97,11 @@ export class WaNoiseSession {
|
|
|
98
97
|
if (!socket || !codec) {
|
|
99
98
|
return Promise.reject(new Error('noise session is not established'));
|
|
100
99
|
}
|
|
101
|
-
|
|
102
|
-
try {
|
|
103
|
-
encryptPromise = socket.encrypt(socket.reserveWriteNonce(), frame);
|
|
104
|
-
}
|
|
105
|
-
catch (error) {
|
|
106
|
-
return Promise.reject(error);
|
|
107
|
-
}
|
|
108
|
-
const result = this.writeChain
|
|
109
|
-
.then(() => encryptPromise)
|
|
110
|
-
.then((encrypted) => codec.encodeFrame(encrypted));
|
|
100
|
+
const result = this.writeChain.then(() => codec.encodeFrame(socket.encrypt(frame)));
|
|
111
101
|
this.writeChain = result.then(() => { }, () => { });
|
|
112
102
|
return result;
|
|
113
103
|
}
|
|
104
|
+
// eslint-disable-next-line @typescript-eslint/require-await
|
|
114
105
|
async pushWireChunk(chunk) {
|
|
115
106
|
const codec = this.frameCodec;
|
|
116
107
|
if (!codec) {
|
|
@@ -139,11 +130,7 @@ export class WaNoiseSession {
|
|
|
139
130
|
return out;
|
|
140
131
|
}
|
|
141
132
|
if (frames.length > 0) {
|
|
142
|
-
const
|
|
143
|
-
this.readChain = this.readChain
|
|
144
|
-
.then(() => decryptBatch)
|
|
145
|
-
.then(() => { }, () => { });
|
|
146
|
-
const decrypted = await decryptBatch;
|
|
133
|
+
const decrypted = this.decryptFramesBatch(this.noiseSocket, frames);
|
|
147
134
|
for (let i = 0; i < decrypted.length; i++) {
|
|
148
135
|
out.push(decrypted[i]);
|
|
149
136
|
}
|
|
@@ -161,15 +148,12 @@ export class WaNoiseSession {
|
|
|
161
148
|
rejecter(closeError);
|
|
162
149
|
}
|
|
163
150
|
}
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
return [await socket.decrypt(socket.reserveReadNonce(), frames[0])];
|
|
167
|
-
}
|
|
168
|
-
const pending = new Array(frames.length);
|
|
151
|
+
decryptFramesBatch(socket, frames) {
|
|
152
|
+
const out = new Array(frames.length);
|
|
169
153
|
for (let i = 0; i < frames.length; i++) {
|
|
170
|
-
|
|
154
|
+
out[i] = socket.decrypt(frames[i]);
|
|
171
155
|
}
|
|
172
|
-
return
|
|
156
|
+
return out;
|
|
173
157
|
}
|
|
174
158
|
reset() {
|
|
175
159
|
this.logger.trace('noise session reset');
|
|
@@ -181,8 +165,8 @@ export class WaNoiseSession {
|
|
|
181
165
|
this.closedError = null;
|
|
182
166
|
this.noiseSocket = null;
|
|
183
167
|
this.serverStaticKey = null;
|
|
168
|
+
this.trustedRootCa = undefined;
|
|
184
169
|
this.writeChain = Promise.resolve();
|
|
185
|
-
this.readChain = Promise.resolve();
|
|
186
170
|
}
|
|
187
171
|
getServerStaticKey() {
|
|
188
172
|
return this.serverStaticKey;
|
|
@@ -190,8 +174,8 @@ export class WaNoiseSession {
|
|
|
190
174
|
async fullHandshake(clientStaticKeyPair, ephemeralKeyPair, payload, protocolHeader, verifyCertificates) {
|
|
191
175
|
this.logger.trace('noise full handshake: send client hello');
|
|
192
176
|
const handshake = new WaNoiseHandshake();
|
|
193
|
-
|
|
194
|
-
|
|
177
|
+
handshake.start(NOISE_XX_NAME, protocolHeader);
|
|
178
|
+
handshake.authenticate(ephemeralKeyPair.pubKey);
|
|
195
179
|
const clientHello = proto.HandshakeMessage.encode({
|
|
196
180
|
clientHello: {
|
|
197
181
|
ephemeral: ephemeralKeyPair.pubKey
|
|
@@ -205,23 +189,23 @@ export class WaNoiseSession {
|
|
|
205
189
|
if (resumeResult.socket) {
|
|
206
190
|
return resumeResult.socket;
|
|
207
191
|
}
|
|
208
|
-
this.logger.
|
|
192
|
+
this.logger.debug('noise resume handshake fallback to XX');
|
|
209
193
|
return this.resumeHandshakeWithFallback(clientStaticKeyPair, ephemeralKeyPair, payload, protocolHeader, resumeResult.serverHelloFrame, verifyCertificates);
|
|
210
194
|
}
|
|
211
195
|
async tryResumeHandshakeWithIk(serverStaticKey, clientStaticKeyPair, ephemeralKeyPair, payload, protocolHeader) {
|
|
212
196
|
this.logger.trace('noise resume handshake: send IK client hello');
|
|
213
197
|
const handshake = new WaNoiseHandshake();
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
198
|
+
handshake.start(NOISE_IK_NAME, protocolHeader);
|
|
199
|
+
handshake.authenticate(serverStaticKey);
|
|
200
|
+
handshake.authenticate(ephemeralKeyPair.pubKey);
|
|
217
201
|
const [agreement1, agreement2] = await Promise.all([
|
|
218
202
|
X25519.scalarMult(ephemeralKeyPair.privKey, serverStaticKey),
|
|
219
203
|
X25519.scalarMult(clientStaticKeyPair.privKey, serverStaticKey)
|
|
220
204
|
]);
|
|
221
|
-
|
|
222
|
-
const encryptedClientStatic =
|
|
223
|
-
|
|
224
|
-
const encryptedPayload =
|
|
205
|
+
handshake.mixIntoKey(agreement1);
|
|
206
|
+
const encryptedClientStatic = handshake.encrypt(clientStaticKeyPair.pubKey);
|
|
207
|
+
handshake.mixIntoKey(agreement2);
|
|
208
|
+
const encryptedPayload = handshake.encrypt(payload);
|
|
225
209
|
const clientHello = proto.HandshakeMessage.encode({
|
|
226
210
|
clientHello: {
|
|
227
211
|
ephemeral: ephemeralKeyPair.pubKey,
|
|
@@ -244,23 +228,23 @@ export class WaNoiseSession {
|
|
|
244
228
|
if (!serverHello.payload) {
|
|
245
229
|
throw new Error('noise resume handshake missing certificate payload');
|
|
246
230
|
}
|
|
247
|
-
const serverEphemeral =
|
|
248
|
-
|
|
231
|
+
const serverEphemeral = serverHello.ephemeral;
|
|
232
|
+
handshake.authenticate(serverEphemeral);
|
|
249
233
|
const [dh1, dh2] = await Promise.all([
|
|
250
234
|
X25519.scalarMult(ephemeralKeyPair.privKey, serverEphemeral),
|
|
251
235
|
X25519.scalarMult(clientStaticKeyPair.privKey, serverEphemeral)
|
|
252
236
|
]);
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
237
|
+
handshake.mixIntoKey(dh1);
|
|
238
|
+
handshake.mixIntoKey(dh2);
|
|
239
|
+
handshake.decrypt(serverHello.payload);
|
|
256
240
|
this.serverStaticKey = serverStaticKey;
|
|
257
|
-
this.logger.
|
|
258
|
-
return { socket:
|
|
241
|
+
this.logger.debug('noise resume handshake successful without fallback');
|
|
242
|
+
return { socket: handshake.finish(), serverHelloFrame: null };
|
|
259
243
|
}
|
|
260
244
|
async resumeHandshakeWithFallback(clientStaticKeyPair, ephemeralKeyPair, payload, protocolHeader, serverHelloFrame, verifyCertificates) {
|
|
261
245
|
const fallback = new WaNoiseHandshake();
|
|
262
|
-
|
|
263
|
-
|
|
246
|
+
fallback.start(NOISE_XX_FALLBACK_NAME, protocolHeader);
|
|
247
|
+
fallback.authenticate(ephemeralKeyPair.pubKey);
|
|
264
248
|
return this.continueFullHandshake(fallback, serverHelloFrame, clientStaticKeyPair, ephemeralKeyPair, payload, verifyCertificates);
|
|
265
249
|
}
|
|
266
250
|
async continueFullHandshake(handshake, serverHelloFrame, clientStaticKeyPair, ephemeralKeyPair, payload, verifyCertificates) {
|
|
@@ -270,20 +254,20 @@ export class WaNoiseSession {
|
|
|
270
254
|
if (!serverHello?.ephemeral || !serverHello.static || !serverHello.payload) {
|
|
271
255
|
throw new Error('noise full handshake missing server hello fields');
|
|
272
256
|
}
|
|
273
|
-
const serverEphemeral =
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
const serverStatic =
|
|
277
|
-
|
|
278
|
-
const certificate =
|
|
257
|
+
const serverEphemeral = serverHello.ephemeral;
|
|
258
|
+
handshake.authenticate(serverEphemeral);
|
|
259
|
+
handshake.mixIntoKey(await X25519.scalarMult(ephemeralKeyPair.privKey, serverEphemeral));
|
|
260
|
+
const serverStatic = handshake.decrypt(serverHello.static);
|
|
261
|
+
handshake.mixIntoKey(await X25519.scalarMult(ephemeralKeyPair.privKey, serverStatic));
|
|
262
|
+
const certificate = handshake.decrypt(serverHello.payload);
|
|
279
263
|
if (verifyCertificates) {
|
|
280
|
-
await verifyNoiseCertificateChain(certificate, serverStatic);
|
|
264
|
+
await verifyNoiseCertificateChain(certificate, serverStatic, this.trustedRootCa);
|
|
281
265
|
this.logger.trace('noise certificate chain verified');
|
|
282
266
|
}
|
|
283
267
|
this.serverStaticKey = serverStatic;
|
|
284
|
-
const encryptedClientStatic =
|
|
285
|
-
|
|
286
|
-
const encryptedPayload =
|
|
268
|
+
const encryptedClientStatic = handshake.encrypt(clientStaticKeyPair.pubKey);
|
|
269
|
+
handshake.mixIntoKey(await X25519.scalarMult(clientStaticKeyPair.privKey, serverEphemeral));
|
|
270
|
+
const encryptedPayload = handshake.encrypt(payload);
|
|
287
271
|
const clientFinish = proto.HandshakeMessage.encode({
|
|
288
272
|
clientFinish: {
|
|
289
273
|
static: encryptedClientStatic,
|
|
@@ -346,6 +330,7 @@ export class WaNoiseSession {
|
|
|
346
330
|
throw toError(error);
|
|
347
331
|
});
|
|
348
332
|
}
|
|
333
|
+
// eslint-disable-next-line @typescript-eslint/require-await
|
|
349
334
|
async decodeBufferedPostHandshakeFrames() {
|
|
350
335
|
if (!this.noiseSocket || this.handshakeInboxHead >= this.handshakeInbox.length) {
|
|
351
336
|
return;
|
|
@@ -356,11 +341,7 @@ export class WaNoiseSession {
|
|
|
356
341
|
const start = this.handshakeInboxHead;
|
|
357
342
|
const frames = this.handshakeInbox.slice(start);
|
|
358
343
|
if (frames.length > 0) {
|
|
359
|
-
const
|
|
360
|
-
this.readChain = this.readChain
|
|
361
|
-
.then(() => decryptBatch)
|
|
362
|
-
.then(() => { }, () => { });
|
|
363
|
-
const decrypted = await decryptBatch;
|
|
344
|
+
const decrypted = this.decryptFramesBatch(this.noiseSocket, frames);
|
|
364
345
|
for (let i = 0; i < decrypted.length; i++) {
|
|
365
346
|
this.pendingDecryptedFrames.push(decrypted[i]);
|
|
366
347
|
}
|
|
@@ -1,21 +1,27 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { createSecretKey } from 'node:crypto';
|
|
2
|
+
import { aesGcmDecrypt, aesGcmEncrypt, writeNonceCounter } from '../../crypto/index.js';
|
|
3
|
+
/**
|
|
4
|
+
* Post-handshake symmetric channel: applies AES-GCM with per-direction
|
|
5
|
+
* 12-byte nonces (counter in the trailing 4 bytes) using a per-instance
|
|
6
|
+
* scratch buffer to avoid allocations on the hot path.
|
|
7
|
+
*/
|
|
2
8
|
export class WaNoiseSocket {
|
|
3
9
|
constructor(encryptKey, decryptKey) {
|
|
4
|
-
this.
|
|
5
|
-
this.
|
|
10
|
+
this.writeNonceScratch = new Uint8Array(12);
|
|
11
|
+
this.readNonceScratch = new Uint8Array(12);
|
|
12
|
+
this.encryptKey = createSecretKey(encryptKey);
|
|
13
|
+
this.decryptKey = createSecretKey(decryptKey);
|
|
6
14
|
this.writeCounter = 0;
|
|
7
15
|
this.readCounter = 0;
|
|
8
16
|
}
|
|
9
|
-
|
|
10
|
-
|
|
17
|
+
/** Encrypts an outgoing `frame` with the next write nonce; advances the write counter. */
|
|
18
|
+
encrypt(frame, additionalData) {
|
|
19
|
+
writeNonceCounter(this.writeNonceScratch, this.writeCounter++);
|
|
20
|
+
return aesGcmEncrypt(this.encryptKey, this.writeNonceScratch, frame, additionalData);
|
|
11
21
|
}
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
return buildNonce(this.readCounter++);
|
|
17
|
-
}
|
|
18
|
-
decrypt(nonce, frame, additionalData) {
|
|
19
|
-
return aesGcmDecrypt(this.decryptKey, nonce, frame, additionalData);
|
|
22
|
+
/** Decrypts an incoming `frame` with the next read nonce; advances the read counter. */
|
|
23
|
+
decrypt(frame, additionalData) {
|
|
24
|
+
writeNonceCounter(this.readNonceScratch, this.readCounter++);
|
|
25
|
+
return aesGcmDecrypt(this.decryptKey, this.readNonceScratch, frame, additionalData);
|
|
20
26
|
}
|
|
21
27
|
}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { TEXT_ENCODER } from '../../util/bytes.js';
|
|
2
|
-
export const DEFAULT_VERSION_BASE = '2.3000.1034748654';
|
|
3
2
|
export const WA_PROTO_HEADER = new Uint8Array([87, 65, 6, 3]);
|
|
4
3
|
export const NOISE_XX_NAME = TEXT_ENCODER.encode('Noise_XX_25519_AESGCM_SHA256\0\0\0\0');
|
|
5
4
|
export const NOISE_IK_NAME = TEXT_ENCODER.encode('Noise_IK_25519_AESGCM_SHA256\0\0\0\0');
|
|
@@ -1,24 +1,29 @@
|
|
|
1
|
+
/** Type guard for an undici-style proxy dispatcher (has `dispatch` method). */
|
|
1
2
|
export function isProxyDispatcher(value) {
|
|
2
3
|
return (typeof value === 'object' &&
|
|
3
4
|
value !== null &&
|
|
4
5
|
'dispatch' in value &&
|
|
5
6
|
typeof value.dispatch === 'function');
|
|
6
7
|
}
|
|
8
|
+
/** Type guard for a Node http.Agent-style proxy (has `addRequest` method). */
|
|
7
9
|
export function isProxyAgent(value) {
|
|
8
10
|
return (typeof value === 'object' &&
|
|
9
11
|
value !== null &&
|
|
10
12
|
'addRequest' in value &&
|
|
11
13
|
typeof value.addRequest === 'function');
|
|
12
14
|
}
|
|
15
|
+
/** Type guard accepting either {@link isProxyDispatcher} or {@link isProxyAgent} shapes. */
|
|
13
16
|
export function isProxyTransport(value) {
|
|
14
17
|
return isProxyDispatcher(value) || isProxyAgent(value);
|
|
15
18
|
}
|
|
19
|
+
/** Narrows `proxy` to {@link WaProxyDispatcher} or returns `undefined`. */
|
|
16
20
|
export function toProxyDispatcher(proxy) {
|
|
17
21
|
if (!proxy || !isProxyDispatcher(proxy)) {
|
|
18
22
|
return undefined;
|
|
19
23
|
}
|
|
20
24
|
return proxy;
|
|
21
25
|
}
|
|
26
|
+
/** Narrows `proxy` to {@link WaProxyAgent} or returns `undefined`. */
|
|
22
27
|
export function toProxyAgent(proxy) {
|
|
23
28
|
if (!proxy || !isProxyAgent(proxy)) {
|
|
24
29
|
return undefined;
|
|
@@ -2,7 +2,6 @@ import { WA_STREAM_SIGNALING } from '../../protocol/constants.js';
|
|
|
2
2
|
import { findNodeChild, hasNodeChild } from '../node/helpers.js';
|
|
3
3
|
import { base64ToBytesChecked } from '../../util/bytes.js';
|
|
4
4
|
import { parseOptionalInt } from '../../util/primitives.js';
|
|
5
|
-
const DIGITS_ONLY_RE = /^\d+$/;
|
|
6
5
|
export function parseStreamControlNode(node) {
|
|
7
6
|
if (node.tag === WA_STREAM_SIGNALING.XML_STREAM_END_TAG) {
|
|
8
7
|
return { kind: 'xmlstreamend' };
|
|
@@ -16,12 +15,9 @@ export function parseStreamControlNode(node) {
|
|
|
16
15
|
? { kind: 'stream_error_replaced' }
|
|
17
16
|
: { kind: 'stream_error_device_removed' };
|
|
18
17
|
}
|
|
19
|
-
const
|
|
20
|
-
if (
|
|
21
|
-
|
|
22
|
-
if (Number.isSafeInteger(code)) {
|
|
23
|
-
return { kind: 'stream_error_code', code };
|
|
24
|
-
}
|
|
18
|
+
const code = parseOptionalInt(node.attrs.code);
|
|
19
|
+
if (code !== undefined) {
|
|
20
|
+
return { kind: 'stream_error_code', code };
|
|
25
21
|
}
|
|
26
22
|
const ackNode = findNodeChild(node, WA_STREAM_SIGNALING.ACK_TAG);
|
|
27
23
|
if (ackNode) {
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { toProxyDispatcher } from './proxy.js';
|
|
2
|
+
import { toError } from '../util/primitives.js';
|
|
3
|
+
const DEFAULT_USER_AGENT = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36';
|
|
4
|
+
const DEFAULT_TIMEOUT_MS = 10000;
|
|
5
|
+
const SW_JS_URL = 'https://web.whatsapp.com/sw.js';
|
|
6
|
+
const CLIENT_REVISION_PATTERN = /\\?"client_revision\\?":\s*(\d+)/;
|
|
7
|
+
/**
|
|
8
|
+
* Fetches the current WhatsApp Web `client_revision` from the public
|
|
9
|
+
* `sw.js` served by the WhatsApp Web frontend and assembles a
|
|
10
|
+
* `2.3000.x` version string suitable for `WaClientOptions.version`.
|
|
11
|
+
*
|
|
12
|
+
* Use this when the library's hardcoded default starts being rejected by
|
|
13
|
+
* the server with HTTP 405 / `failure_client_too_old`, and you need to
|
|
14
|
+
* refresh the version without waiting for a library bump.
|
|
15
|
+
*
|
|
16
|
+
* Network failures and parse errors throw; wrap in a `try`/`catch` and
|
|
17
|
+
* fall back to the hardcoded default.
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* const latest = await fetchLatestWaWebVersion()
|
|
21
|
+
* const client = new WaClient({ store, sessionId, version: latest.version })
|
|
22
|
+
*/
|
|
23
|
+
export async function fetchLatestWaWebVersion(options = {}) {
|
|
24
|
+
const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
25
|
+
const dispatcher = toProxyDispatcher(options.proxy);
|
|
26
|
+
const fetchImpl = options.fetch ?? fetch;
|
|
27
|
+
const controller = new AbortController();
|
|
28
|
+
const timer = setTimeout(() => controller.abort(new Error(`fetch latest wa-web version timed out after ${timeoutMs}ms`)), timeoutMs);
|
|
29
|
+
timer.unref?.();
|
|
30
|
+
let onExternalAbort = null;
|
|
31
|
+
const externalSignal = options.signal;
|
|
32
|
+
if (externalSignal) {
|
|
33
|
+
if (externalSignal.aborted) {
|
|
34
|
+
controller.abort(externalSignal.reason);
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
onExternalAbort = () => controller.abort(externalSignal.reason);
|
|
38
|
+
externalSignal.addEventListener('abort', onExternalAbort, { once: true });
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
try {
|
|
42
|
+
const headers = {
|
|
43
|
+
'sec-fetch-site': 'none',
|
|
44
|
+
'user-agent': options.userAgent ?? DEFAULT_USER_AGENT
|
|
45
|
+
};
|
|
46
|
+
if (options.headers) {
|
|
47
|
+
for (const key in options.headers) {
|
|
48
|
+
headers[key.toLowerCase()] = options.headers[key];
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
const init = {
|
|
52
|
+
method: 'GET',
|
|
53
|
+
headers,
|
|
54
|
+
signal: controller.signal
|
|
55
|
+
};
|
|
56
|
+
if (dispatcher) {
|
|
57
|
+
// dispatcher is a non-standard undici-only extension to RequestInit
|
|
58
|
+
;
|
|
59
|
+
init.dispatcher = dispatcher;
|
|
60
|
+
}
|
|
61
|
+
let response;
|
|
62
|
+
try {
|
|
63
|
+
response = await fetchImpl(SW_JS_URL, init);
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
throw new Error(`failed to fetch sw.js: ${toError(error).message}`);
|
|
67
|
+
}
|
|
68
|
+
if (!response.ok) {
|
|
69
|
+
throw new Error(`failed to fetch sw.js: http ${response.status}`);
|
|
70
|
+
}
|
|
71
|
+
const body = await response.text();
|
|
72
|
+
const match = CLIENT_REVISION_PATTERN.exec(body);
|
|
73
|
+
if (!match?.[1]) {
|
|
74
|
+
throw new Error('client_revision not found in sw.js response');
|
|
75
|
+
}
|
|
76
|
+
const revision = Number.parseInt(match[1], 10);
|
|
77
|
+
if (!Number.isSafeInteger(revision) || revision <= 0) {
|
|
78
|
+
throw new Error(`invalid client_revision in sw.js: ${match[1]}`);
|
|
79
|
+
}
|
|
80
|
+
return {
|
|
81
|
+
version: `2.3000.${revision}`,
|
|
82
|
+
parts: [2, 3000, revision]
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
finally {
|
|
86
|
+
clearTimeout(timer);
|
|
87
|
+
if (externalSignal && onExternalAbort) {
|
|
88
|
+
externalSignal.removeEventListener('abort', onExternalAbort);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
package/dist/esm/util/async.js
CHANGED
package/dist/esm/util/bytes.js
CHANGED
|
@@ -62,9 +62,14 @@ export function hexToBytes(value) {
|
|
|
62
62
|
}
|
|
63
63
|
return out;
|
|
64
64
|
}
|
|
65
|
+
/** Encodes a Uint8Array to a standard padded base64 string. */
|
|
65
66
|
export function bytesToBase64(value) {
|
|
66
67
|
return encodeBase64(value, BASE64_CHARS, true);
|
|
67
68
|
}
|
|
69
|
+
/**
|
|
70
|
+
* Decodes a standard padded base64 string to a Uint8Array. Throws on invalid
|
|
71
|
+
* characters or a length that is not a multiple of 4.
|
|
72
|
+
*/
|
|
68
73
|
export function base64ToBytes(value) {
|
|
69
74
|
const len = value.length;
|
|
70
75
|
if (len === 0)
|
|
@@ -104,12 +109,17 @@ export function base64ToBytes(value) {
|
|
|
104
109
|
}
|
|
105
110
|
return out;
|
|
106
111
|
}
|
|
107
|
-
export function base64ToBytesChecked(value, field
|
|
108
|
-
if (
|
|
112
|
+
export function base64ToBytesChecked(value, field) {
|
|
113
|
+
if (value.length === 0) {
|
|
109
114
|
throw new Error(`invalid base64 payload for ${field}`);
|
|
110
115
|
}
|
|
111
116
|
return base64ToBytes(value);
|
|
112
117
|
}
|
|
118
|
+
/**
|
|
119
|
+
* Decodes a base64url-encoded value to a Uint8Array, restoring padding and
|
|
120
|
+
* the `+`/`/` alphabet first. Throws with a `missing ${field}` message when
|
|
121
|
+
* `value` is empty/undefined.
|
|
122
|
+
*/
|
|
113
123
|
export function decodeBase64Url(value, field) {
|
|
114
124
|
if (!value) {
|
|
115
125
|
throw new Error(`missing ${field}`);
|
|
@@ -189,6 +199,7 @@ function encodeBase64(value, alphabet, pad) {
|
|
|
189
199
|
}
|
|
190
200
|
return out.join('');
|
|
191
201
|
}
|
|
202
|
+
/** Concatenates an array of Uint8Arrays into a single new Uint8Array. */
|
|
192
203
|
export function concatBytes(parts) {
|
|
193
204
|
let total = 0;
|
|
194
205
|
for (let i = 0; i < parts.length; i += 1) {
|
|
@@ -202,6 +213,13 @@ export function concatBytes(parts) {
|
|
|
202
213
|
}
|
|
203
214
|
return out;
|
|
204
215
|
}
|
|
216
|
+
/**
|
|
217
|
+
* Returns a zero-copy `Uint8Array` view over the input. Subclasses of
|
|
218
|
+
* `Uint8Array` (Node `Buffer`) are wrapped in a plain view; `ArrayBuffer`/
|
|
219
|
+
* `ArrayBufferView` get a view over their backing buffer. Use at system
|
|
220
|
+
* boundaries (WebCrypto / Node crypto / WebSocket results) – not on values
|
|
221
|
+
* that are already plain `Uint8Array`.
|
|
222
|
+
*/
|
|
205
223
|
export function toBytesView(value) {
|
|
206
224
|
if (value instanceof Uint8Array) {
|
|
207
225
|
return value.constructor === Uint8Array
|
|
@@ -213,6 +231,10 @@ export function toBytesView(value) {
|
|
|
213
231
|
}
|
|
214
232
|
return new Uint8Array(value.buffer, value.byteOffset, value.byteLength);
|
|
215
233
|
}
|
|
234
|
+
/**
|
|
235
|
+
* Normalizes an arbitrary stream chunk (string / Uint8Array / ArrayBuffer /
|
|
236
|
+
* ArrayBufferView) to a Uint8Array. Throws on unsupported types.
|
|
237
|
+
*/
|
|
216
238
|
export function toChunkBytes(chunk) {
|
|
217
239
|
if (typeof chunk === 'string') {
|
|
218
240
|
return TEXT_ENCODER.encode(chunk);
|
|
@@ -222,12 +244,20 @@ export function toChunkBytes(chunk) {
|
|
|
222
244
|
}
|
|
223
245
|
throw new Error(`unsupported stream chunk type: ${typeof chunk}`);
|
|
224
246
|
}
|
|
247
|
+
/**
|
|
248
|
+
* Constant-time, JIT-resistant equality over `Uint8Array`s. Required for
|
|
249
|
+
* MAC/HMAC/signature comparisons (use {@link uint8Equal} for non-secret data).
|
|
250
|
+
*/
|
|
225
251
|
export function uint8TimingSafeEqual(left, right) {
|
|
226
252
|
if (left.byteLength !== right.byteLength) {
|
|
227
253
|
return false;
|
|
228
254
|
}
|
|
229
255
|
return timingSafeEqual(left, right);
|
|
230
256
|
}
|
|
257
|
+
/**
|
|
258
|
+
* XOR-accumulated equality over `Uint8Array`s. Suitable for non-secret data
|
|
259
|
+
* (e.g. identity key match). Use {@link uint8TimingSafeEqual} for MAC checks.
|
|
260
|
+
*/
|
|
231
261
|
export function uint8Equal(a, b) {
|
|
232
262
|
if (a.length !== b.length) {
|
|
233
263
|
return false;
|
|
@@ -270,6 +300,11 @@ export function intToBytes(byteLength, value) {
|
|
|
270
300
|
}
|
|
271
301
|
return out;
|
|
272
302
|
}
|
|
303
|
+
/**
|
|
304
|
+
* Drains a Node `Readable` stream into a single Uint8Array. When
|
|
305
|
+
* `options.maxBytes` is set, the stream is destroyed and the promise rejects
|
|
306
|
+
* once the limit is exceeded.
|
|
307
|
+
*/
|
|
273
308
|
export async function readAllBytes(stream, options = {}) {
|
|
274
309
|
const maxBytes = options.maxBytes;
|
|
275
310
|
if (maxBytes !== undefined && (!Number.isSafeInteger(maxBytes) || maxBytes < 0)) {
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export function createServerClock(getClockSkewMs) {
|
|
2
|
+
return {
|
|
3
|
+
nowMs() {
|
|
4
|
+
const skewMs = getClockSkewMs();
|
|
5
|
+
const nowMs = Date.now();
|
|
6
|
+
return Number.isFinite(skewMs) ? nowMs + skewMs : nowMs;
|
|
7
|
+
},
|
|
8
|
+
nowSeconds() {
|
|
9
|
+
const skewMs = getClockSkewMs();
|
|
10
|
+
const nowMs = Date.now();
|
|
11
|
+
const correctedMs = Number.isFinite(skewMs) ? nowMs + skewMs : nowMs;
|
|
12
|
+
return Math.floor(correctedMs / 1000);
|
|
13
|
+
}
|
|
14
|
+
};
|
|
15
|
+
}
|
|
@@ -1,44 +1,61 @@
|
|
|
1
1
|
import { toBytesView } from './bytes.js';
|
|
2
2
|
import { toSafeNumber } from './primitives.js';
|
|
3
|
+
/**
|
|
4
|
+
* Coerces `value` to a safe-integer/finite number, accepting `number` and
|
|
5
|
+
* `bigint` inputs. Throws with a `${field}`-suffixed message on any other type.
|
|
6
|
+
*/
|
|
3
7
|
export function asNumber(value, field) {
|
|
4
|
-
if (typeof value === 'bigint') {
|
|
5
|
-
return toSafeNumber(Number(value), field);
|
|
6
|
-
}
|
|
7
8
|
if (typeof value === 'number') {
|
|
8
9
|
return toSafeNumber(value, field);
|
|
9
10
|
}
|
|
11
|
+
if (typeof value === 'bigint') {
|
|
12
|
+
return toSafeNumber(Number(value), field);
|
|
13
|
+
}
|
|
10
14
|
throw new Error(`invalid number value for ${field}`);
|
|
11
15
|
}
|
|
16
|
+
/** Optional variant of {@link asNumber}; returns `undefined` when input is nullish. */
|
|
12
17
|
export function asOptionalNumber(value, field = 'optional number') {
|
|
13
18
|
if (value === null || value === undefined)
|
|
14
19
|
return undefined;
|
|
15
20
|
return asNumber(value, field);
|
|
16
21
|
}
|
|
22
|
+
/** Asserts that `value` is a string. Throws with a `${field}`-suffixed message otherwise. */
|
|
17
23
|
export function asString(value, field) {
|
|
18
24
|
if (typeof value === 'string') {
|
|
19
25
|
return value;
|
|
20
26
|
}
|
|
21
27
|
throw new Error(`invalid string value for ${field}`);
|
|
22
28
|
}
|
|
29
|
+
/** Optional variant of {@link asString}; returns `undefined` when input is nullish. */
|
|
23
30
|
export function asOptionalString(value, field = 'optional string') {
|
|
24
31
|
if (value === null || value === undefined)
|
|
25
32
|
return undefined;
|
|
26
33
|
return asString(value, field);
|
|
27
34
|
}
|
|
35
|
+
/**
|
|
36
|
+
* Coerces `value` to a Uint8Array view, accepting `Uint8Array`, `ArrayBuffer`,
|
|
37
|
+
* and any `ArrayBufferView`. Throws with a `${field}`-suffixed message otherwise.
|
|
38
|
+
*/
|
|
28
39
|
export function asBytes(value, field) {
|
|
29
40
|
if (value instanceof Uint8Array || value instanceof ArrayBuffer || ArrayBuffer.isView(value)) {
|
|
30
41
|
return toBytesView(value);
|
|
31
42
|
}
|
|
32
43
|
throw new Error(`invalid bytes value for ${field}`);
|
|
33
44
|
}
|
|
45
|
+
/** Optional variant of {@link asBytes}; returns `undefined` when input is nullish. */
|
|
34
46
|
export function asOptionalBytes(value, field = 'optional bytes') {
|
|
35
47
|
if (value === null || value === undefined)
|
|
36
48
|
return undefined;
|
|
37
49
|
return asBytes(value, field);
|
|
38
50
|
}
|
|
51
|
+
/** Returns `undefined` when `value` is nullish, otherwise `Boolean(value)`. */
|
|
39
52
|
export function toBoolOrUndef(value) {
|
|
40
53
|
return value === null || value === undefined ? undefined : Boolean(value);
|
|
41
54
|
}
|
|
55
|
+
/**
|
|
56
|
+
* Returns `value` when it is a positive safe-integer, `fallback` when it is
|
|
57
|
+
* undefined, and throws otherwise.
|
|
58
|
+
*/
|
|
42
59
|
export function resolvePositive(value, fallback, name) {
|
|
43
60
|
if (value === undefined)
|
|
44
61
|
return fallback;
|
|
@@ -46,3 +63,28 @@ export function resolvePositive(value, fallback, name) {
|
|
|
46
63
|
return value;
|
|
47
64
|
throw new Error(`${name} must be a positive safe integer`);
|
|
48
65
|
}
|
|
66
|
+
/**
|
|
67
|
+
* Lenient variants for parsing external JSON payloads (GraphQL responses,
|
|
68
|
+
* Mex notifications) where fields may be missing, empty, or arrive as the
|
|
69
|
+
* wrong primitive. Return null instead of throwing.
|
|
70
|
+
*/
|
|
71
|
+
export function tryAsString(value) {
|
|
72
|
+
return typeof value === 'string' && value.length > 0 ? value : null;
|
|
73
|
+
}
|
|
74
|
+
export function tryAsNumber(value) {
|
|
75
|
+
if (typeof value === 'number' && Number.isFinite(value))
|
|
76
|
+
return value;
|
|
77
|
+
if (typeof value === 'string') {
|
|
78
|
+
const normalized = value.trim();
|
|
79
|
+
if (normalized.length === 0)
|
|
80
|
+
return null;
|
|
81
|
+
const parsed = Number(normalized);
|
|
82
|
+
return Number.isFinite(parsed) ? parsed : null;
|
|
83
|
+
}
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
86
|
+
export function tryAsRecord(value) {
|
|
87
|
+
return value !== null && typeof value === 'object' && !Array.isArray(value)
|
|
88
|
+
? value
|
|
89
|
+
: null;
|
|
90
|
+
}
|