zapo-js 0.3.0 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +98 -178
- package/dist/appstate/{WaAppStateCrypto.js → crypto/WaAppStateCrypto.js} +58 -49
- package/dist/appstate/index.js +7 -6
- package/dist/appstate/{encoding.js → parsers/encoding.js} +11 -4
- package/dist/appstate/{response-parser.js → parsers/response-parser.js} +20 -8
- package/dist/appstate/{WaAppStateSyncClient.js → sync/WaAppStateSyncClient.js} +174 -53
- package/dist/appstate/utils.js +16 -0
- package/dist/appstate-spec.js +89 -0
- package/dist/auth/WaAuthClient.js +100 -5
- package/dist/auth/credentials-flow.js +20 -8
- package/dist/auth/pairing/WaPairingFlow.js +35 -26
- package/dist/auth/pairing/pairing-code-crypto.js +17 -19
- package/dist/client/WaClient.js +343 -474
- package/dist/client/WaClientFactory.js +281 -78
- package/dist/client/connection/WaConnectionManager.js +28 -11
- package/dist/client/coordinators/WaAbPropsCoordinator.js +1 -2
- package/dist/client/coordinators/WaAppStateMutationCoordinator.js +663 -143
- package/dist/client/coordinators/WaBotCoordinator.js +345 -0
- package/dist/client/coordinators/WaBroadcastListCoordinator.js +20 -0
- package/dist/client/coordinators/WaBusinessCoordinator.js +81 -171
- package/dist/client/coordinators/WaEmailCoordinator.js +1 -0
- package/dist/client/coordinators/WaGroupCoordinator.js +529 -52
- package/dist/client/coordinators/WaIncomingNodeCoordinator.js +97 -12
- package/dist/client/coordinators/WaLowLevelCoordinator.js +41 -0
- package/dist/client/coordinators/WaMessageCoordinator.js +365 -0
- package/dist/client/coordinators/WaMessageDispatchCoordinator.js +685 -207
- package/dist/client/coordinators/WaNewsletterCoordinator.js +18 -0
- package/dist/client/coordinators/WaPassiveTasksCoordinator.js +17 -4
- package/dist/client/coordinators/WaPresenceCoordinator.js +21 -0
- package/dist/client/coordinators/WaPrivacyCoordinator.js +7 -5
- package/dist/client/coordinators/WaProfileCoordinator.js +220 -49
- package/dist/client/coordinators/WaRetryCoordinator.js +257 -126
- package/dist/client/coordinators/WaStatusCoordinator.js +49 -0
- package/dist/client/coordinators/WaStreamControlCoordinator.js +8 -9
- package/dist/client/coordinators/WaTrustedContactTokenCoordinator.js +7 -6
- package/dist/client/events/appstate-mutation.js +133 -0
- package/dist/client/events/business.js +375 -0
- package/dist/client/events/call.js +58 -0
- package/dist/client/events/chatstate.js +23 -0
- package/dist/client/events/devices.js +15 -16
- package/dist/client/{dirty.js → events/dirty.js} +33 -19
- package/dist/client/events/group.js +13 -24
- package/dist/client/events/identity.js +2 -1
- package/dist/client/events/incoming.js +502 -0
- package/dist/client/events/mex-notification.js +181 -0
- package/dist/client/events/picture.js +33 -0
- package/dist/client/events/presence.js +44 -0
- package/dist/client/events/receipt.js +26 -0
- package/dist/client/media.js +163 -6
- package/dist/client/messaging/fanout.js +9 -10
- package/dist/client/messaging/{participants.js → group-metadata.js} +93 -44
- package/dist/client/messaging/ignore-key.js +132 -0
- package/dist/client/messaging/key-protocol.js +4 -18
- package/dist/client/messaging/link-preview.js +159 -0
- package/dist/client/messaging/messages.js +671 -0
- package/dist/client/newsletter/admin.js +165 -0
- package/dist/client/newsletter/content.js +253 -0
- package/dist/client/newsletter/discovery.js +115 -0
- package/dist/client/newsletter/messaging.js +197 -0
- package/dist/client/newsletter/mex.js +41 -0
- package/dist/client/newsletter/parse.js +217 -0
- package/dist/client/persistence/WriteBehindPersistence.js +31 -4
- package/dist/client/{history-sync.js → persistence/history-sync.js} +125 -18
- package/dist/client/persistence/mailbox.js +104 -0
- package/dist/client/tokens/cs-token.js +11 -17
- package/dist/crypto/core/hkdf.js +12 -12
- package/dist/crypto/core/index.js +6 -8
- package/dist/crypto/core/keys.js +1 -8
- package/dist/crypto/core/nonce.js +12 -12
- package/dist/crypto/core/primitives.js +123 -93
- package/dist/crypto/core/random.js +6 -0
- package/dist/crypto/core/xeddsa.js +11 -9
- package/dist/crypto/curves/Ed25519.js +32 -21
- package/dist/crypto/curves/X25519.js +70 -34
- package/dist/crypto/curves/constants.js +2 -1
- package/dist/crypto/math/constants.js +1 -2
- package/dist/crypto/math/mod.js +0 -33
- package/dist/esm/appstate/{WaAppStateCrypto.js → crypto/WaAppStateCrypto.js} +58 -49
- package/dist/esm/appstate/index.js +5 -5
- package/dist/esm/appstate/{encoding.js → parsers/encoding.js} +11 -4
- package/dist/esm/appstate/{response-parser.js → parsers/response-parser.js} +20 -8
- package/dist/esm/appstate/{WaAppStateSyncClient.js → sync/WaAppStateSyncClient.js} +174 -52
- package/dist/esm/appstate/utils.js +16 -0
- package/dist/esm/appstate-spec.js +79 -0
- package/dist/esm/auth/WaAuthClient.js +100 -5
- package/dist/esm/auth/credentials-flow.js +18 -6
- package/dist/esm/auth/pairing/WaPairingFlow.js +34 -25
- package/dist/esm/auth/pairing/pairing-code-crypto.js +12 -14
- package/dist/esm/client/WaClient.js +345 -476
- package/dist/esm/client/WaClientFactory.js +282 -79
- package/dist/esm/client/connection/WaConnectionManager.js +28 -11
- package/dist/esm/client/coordinators/WaAbPropsCoordinator.js +2 -3
- package/dist/esm/client/coordinators/WaAppStateMutationCoordinator.js +665 -145
- package/dist/esm/client/coordinators/WaBotCoordinator.js +342 -0
- package/dist/esm/client/coordinators/WaBroadcastListCoordinator.js +17 -0
- package/dist/esm/client/coordinators/WaBusinessCoordinator.js +79 -169
- package/dist/esm/client/coordinators/WaEmailCoordinator.js +1 -0
- package/dist/esm/client/coordinators/WaGroupCoordinator.js +532 -55
- package/dist/esm/client/coordinators/WaIncomingNodeCoordinator.js +98 -13
- package/dist/esm/client/coordinators/WaLowLevelCoordinator.js +38 -0
- package/dist/esm/client/coordinators/WaMessageCoordinator.js +361 -0
- package/dist/esm/client/coordinators/WaMessageDispatchCoordinator.js +686 -208
- package/dist/esm/client/coordinators/WaNewsletterCoordinator.js +13 -0
- package/dist/esm/client/coordinators/WaPassiveTasksCoordinator.js +18 -5
- package/dist/esm/client/coordinators/WaPresenceCoordinator.js +18 -0
- package/dist/esm/client/coordinators/WaPrivacyCoordinator.js +7 -5
- package/dist/esm/client/coordinators/WaProfileCoordinator.js +223 -52
- package/dist/esm/client/coordinators/WaRetryCoordinator.js +258 -127
- package/dist/esm/client/coordinators/WaStatusCoordinator.js +46 -0
- package/dist/esm/client/coordinators/WaStreamControlCoordinator.js +8 -9
- package/dist/esm/client/coordinators/WaTrustedContactTokenCoordinator.js +7 -6
- package/dist/esm/client/events/appstate-mutation.js +130 -0
- package/dist/esm/client/events/business.js +370 -0
- package/dist/esm/client/events/call.js +55 -0
- package/dist/esm/client/events/chatstate.js +20 -0
- package/dist/esm/client/events/devices.js +15 -16
- package/dist/esm/client/{dirty.js → events/dirty.js} +33 -19
- package/dist/esm/client/events/group.js +14 -25
- package/dist/esm/client/events/identity.js +2 -1
- package/dist/esm/client/events/incoming.js +487 -0
- package/dist/esm/client/events/mex-notification.js +178 -0
- package/dist/esm/client/events/picture.js +30 -0
- package/dist/esm/client/events/presence.js +41 -0
- package/dist/esm/client/events/receipt.js +23 -0
- package/dist/esm/client/media.js +158 -8
- package/dist/esm/client/messaging/fanout.js +10 -11
- package/dist/esm/client/messaging/{participants.js → group-metadata.js} +92 -43
- package/dist/esm/client/messaging/ignore-key.js +126 -0
- package/dist/esm/client/messaging/key-protocol.js +3 -17
- package/dist/esm/client/messaging/link-preview.js +156 -0
- package/dist/esm/client/messaging/messages.js +667 -0
- package/dist/esm/client/newsletter/admin.js +162 -0
- package/dist/esm/client/newsletter/content.js +249 -0
- package/dist/esm/client/newsletter/discovery.js +112 -0
- package/dist/esm/client/newsletter/messaging.js +194 -0
- package/dist/esm/client/newsletter/mex.js +37 -0
- package/dist/esm/client/newsletter/parse.js +200 -0
- package/dist/esm/client/persistence/WriteBehindPersistence.js +31 -4
- package/dist/esm/client/{history-sync.js → persistence/history-sync.js} +124 -18
- package/dist/esm/client/persistence/mailbox.js +101 -0
- package/dist/esm/client/tokens/cs-token.js +12 -18
- package/dist/esm/crypto/core/hkdf.js +14 -14
- package/dist/esm/crypto/core/index.js +2 -2
- package/dist/esm/crypto/core/keys.js +1 -7
- package/dist/esm/crypto/core/nonce.js +11 -11
- package/dist/esm/crypto/core/primitives.js +121 -88
- package/dist/esm/crypto/core/random.js +6 -0
- package/dist/esm/crypto/core/xeddsa.js +11 -9
- package/dist/esm/crypto/curves/Ed25519.js +35 -24
- package/dist/esm/crypto/curves/X25519.js +72 -36
- package/dist/esm/crypto/curves/constants.js +1 -0
- package/dist/esm/crypto/math/constants.js +1 -2
- package/dist/esm/crypto/math/mod.js +0 -32
- package/dist/esm/index.js +7 -2
- package/dist/esm/infra/log/ConsoleLogger.js +30 -6
- package/dist/esm/infra/log/PinoLogger.js +64 -0
- package/dist/esm/infra/log/types.js +4 -2
- package/dist/esm/infra/perf/BackgroundQueue.js +55 -13
- package/dist/esm/media/constants.js +33 -2
- package/dist/esm/media/crypto/WaMediaCrypto.js +374 -0
- package/dist/esm/media/index.js +4 -3
- package/dist/esm/media/sticker/sticker-pack.js +133 -0
- package/dist/esm/media/{WaMediaTransferClient.js → transfer/WaMediaTransferClient.js} +37 -6
- package/dist/esm/media/{conn.js → transfer/conn.js} +10 -5
- package/dist/esm/message/WaMessageClient.js +46 -15
- package/dist/esm/message/addons/link-preview/builder.js +36 -0
- package/dist/esm/message/addons/link-preview/detect.js +55 -0
- package/dist/esm/message/addons/link-preview/fetcher.js +391 -0
- package/dist/esm/message/addons/link-preview/types.js +1 -0
- package/dist/esm/message/context-info.js +123 -0
- package/dist/esm/message/{addon-crypto.js → crypto/addon-crypto.js} +68 -10
- package/dist/esm/message/{icdc.js → crypto/icdc.js} +5 -7
- package/dist/esm/message/crypto/phash.js +133 -0
- package/dist/esm/message/{reporting-token.js → crypto/reporting-token.js} +6 -6
- package/dist/esm/message/{use-case-secret.js → crypto/use-case-secret.js} +20 -3
- package/dist/esm/message/{content.js → encode/content.js} +176 -7
- package/dist/esm/message/encode/media-payload.js +42 -0
- package/dist/esm/message/{padding.js → encode/padding.js} +9 -3
- package/dist/esm/message/index.js +2 -2
- package/dist/esm/message/kinds/bot.js +111 -0
- package/dist/esm/message/kinds/newsletter.js +244 -0
- package/dist/esm/message/kinds/sticker-pack.js +29 -0
- package/dist/esm/message/{ack.js → primitives/ack.js} +8 -1
- package/dist/esm/message/{incoming.js → primitives/incoming.js} +215 -31
- package/dist/esm/message/primitives/peer-data-operation.js +93 -0
- package/dist/esm/mex.js +1 -0
- package/dist/esm/protocol/abprops.js +10 -0
- package/dist/esm/protocol/appstate.js +6 -30
- package/dist/esm/protocol/auth.js +3 -2
- package/dist/esm/protocol/bot.js +77 -0
- package/dist/esm/protocol/browser.js +8 -0
- package/dist/esm/protocol/business.js +19 -0
- package/dist/esm/protocol/call.js +48 -0
- package/dist/esm/protocol/constants.js +8 -2
- package/dist/esm/protocol/defaults.js +3 -0
- package/dist/esm/protocol/index.js +1 -1
- package/dist/esm/protocol/jid.js +102 -5
- package/dist/esm/protocol/media.js +25 -12
- package/dist/esm/protocol/message.js +4 -1
- package/dist/esm/protocol/newsletter.js +61 -0
- package/dist/esm/protocol/nodes.js +22 -2
- package/dist/esm/protocol/notification.js +18 -2
- package/dist/esm/protocol/presence.js +13 -0
- package/dist/esm/protocol/status.js +6 -0
- package/dist/esm/retry/codec.js +5 -0
- package/dist/esm/retry/parse.js +20 -38
- package/dist/esm/retry/reason.js +5 -0
- package/dist/esm/retry/replay.js +131 -37
- package/dist/esm/retry/tracker.js +4 -8
- package/dist/esm/signal/api/SignalDeviceSyncApi.js +69 -20
- package/dist/esm/signal/api/SignalDigestSyncApi.js +7 -2
- package/dist/esm/signal/api/SignalIdentitySyncApi.js +9 -0
- package/dist/esm/signal/api/SignalMissingPreKeysSyncApi.js +24 -63
- package/dist/esm/signal/api/SignalRotateKeyApi.js +10 -0
- package/dist/esm/signal/api/SignalSessionSyncApi.js +23 -51
- package/dist/esm/signal/api/codec.js +52 -1
- package/dist/esm/signal/api/prekeys.js +4 -0
- package/dist/esm/signal/{crypto → attestation}/WaAdvSignature.js +5 -6
- package/dist/esm/signal/constants.js +3 -0
- package/dist/esm/signal/encoding.js +6 -289
- package/dist/esm/signal/group/SenderKeyChain.js +18 -33
- package/dist/esm/signal/group/SenderKeyManager.js +25 -8
- package/dist/esm/signal/group/encoding.js +96 -0
- package/dist/esm/signal/index.js +4 -1
- package/dist/esm/signal/registration/encoding.js +34 -0
- package/dist/esm/signal/registration/keygen.js +10 -0
- package/dist/esm/signal/registration/utils.js +8 -1
- package/dist/esm/signal/session/SignalProtocol.js +113 -11
- package/dist/esm/signal/session/SignalRatchet.js +29 -58
- package/dist/esm/signal/session/SignalSession.js +7 -14
- package/dist/esm/signal/session/encoding.js +173 -0
- package/dist/esm/signal/session/resolver.js +139 -30
- package/dist/esm/store/cache/identity.cache.js +75 -0
- package/dist/esm/store/cache/privacy-token.cache.js +57 -0
- package/dist/esm/store/cache/sender-key.cache.js +101 -0
- package/dist/esm/store/cache/session.cache.js +92 -0
- package/dist/esm/store/contracts/group-metadata.store.js +1 -0
- package/dist/esm/store/createStore.js +91 -37
- package/dist/esm/store/index.js +15 -14
- package/dist/esm/store/locks/contact.lock.js +1 -0
- package/dist/esm/store/locks/device-list.lock.js +1 -0
- package/dist/esm/store/locks/group-metadata.lock.js +20 -0
- package/dist/esm/store/locks/pre-key.lock.js +4 -1
- package/dist/esm/store/{providers/memory → memory}/appstate.store.js +5 -5
- package/dist/esm/store/memory/auth.store.js +24 -0
- package/dist/esm/store/memory/contact.store.js +79 -0
- package/dist/esm/store/memory/device-list.store.js +103 -0
- package/dist/esm/store/{providers/memory/participants.store.js → memory/group-metadata.store.js} +22 -13
- package/dist/esm/store/{providers/memory → memory}/identity.store.js +3 -3
- package/dist/esm/store/{providers/memory → memory}/message-secret.store.js +17 -8
- package/dist/esm/store/{providers/memory → memory}/message.store.js +2 -2
- package/dist/esm/store/{providers/memory → memory}/pre-key.store.js +2 -2
- package/dist/esm/store/{providers/memory → memory}/privacy-token.store.js +1 -1
- package/dist/esm/store/{providers/memory → memory}/retry.store.js +28 -7
- package/dist/esm/store/{providers/memory → memory}/sender-key.store.js +3 -3
- package/dist/esm/store/{providers/memory → memory}/session.store.js +3 -3
- package/dist/esm/store/{providers/memory → memory}/thread.store.js +2 -2
- package/dist/esm/store/noop.store.js +6 -4
- package/dist/esm/transport/WaComms.js +14 -5
- package/dist/esm/transport/WaWebSocket.js +32 -8
- package/dist/esm/transport/binary/constants.js +10 -4
- package/dist/esm/transport/binary/decoder.js +21 -15
- package/dist/esm/transport/binary/encoder.js +96 -21
- package/dist/esm/transport/binary/tokens.js +12 -12
- package/dist/esm/transport/index.js +1 -0
- package/dist/esm/transport/keepalive/WaKeepAlive.js +18 -4
- package/dist/esm/transport/node/WaMobileTcpSocket.js +6 -0
- package/dist/esm/transport/node/WaNodeOrchestrator.js +9 -5
- package/dist/esm/transport/node/WaNodeTransport.js +13 -0
- package/dist/esm/transport/node/builders/abprops.js +2 -2
- package/dist/esm/transport/node/builders/account-sync.js +7 -15
- package/dist/esm/transport/node/builders/bot.js +38 -0
- package/dist/esm/transport/node/builders/business.js +30 -30
- package/dist/esm/transport/node/builders/chatstate.js +28 -0
- package/dist/esm/transport/node/builders/community.js +53 -0
- package/dist/esm/transport/node/builders/device.js +2 -2
- package/dist/esm/transport/node/builders/email.js +6 -5
- package/dist/esm/transport/node/builders/global.js +1 -1
- package/dist/esm/transport/node/builders/group.js +114 -4
- package/dist/esm/transport/node/builders/media.js +2 -2
- package/dist/esm/transport/node/builders/message.js +83 -49
- package/dist/esm/transport/node/builders/newsletter.js +176 -0
- package/dist/esm/transport/node/builders/passive.js +7 -0
- package/dist/esm/transport/node/builders/prekeys.js +4 -4
- package/dist/esm/transport/node/builders/presence.js +27 -1
- package/dist/esm/transport/node/builders/privacy-token.js +2 -2
- package/dist/esm/transport/node/builders/privacy.js +6 -6
- package/dist/esm/transport/node/builders/profile.js +28 -8
- package/dist/esm/transport/node/builders/tos.js +58 -0
- package/dist/esm/transport/node/builders/usync.js +51 -2
- package/dist/esm/transport/node/helpers.js +3 -1
- package/dist/esm/transport/node/mex/argo-decoder.js +2 -2
- package/dist/esm/transport/node/mex/client.js +22 -0
- package/dist/esm/transport/node/query.js +17 -0
- package/dist/esm/transport/node/usync.js +12 -0
- package/dist/esm/transport/noise/WaClientPayload.js +8 -8
- package/dist/esm/transport/noise/WaMobileClientPayload.js +5 -0
- package/dist/esm/transport/noise/WaNoiseCert.js +5 -0
- package/dist/esm/transport/noise/WaNoiseHandshake.js +27 -25
- package/dist/esm/transport/noise/WaNoiseSession.js +39 -59
- package/dist/esm/transport/noise/WaNoiseSocket.js +19 -13
- package/dist/esm/transport/noise/constants.js +0 -1
- package/dist/esm/transport/proxy.js +5 -0
- package/dist/esm/transport/stream/parse.js +3 -7
- package/dist/esm/transport/wa-web-version-fetcher.js +91 -0
- package/dist/esm/util/async.js +4 -0
- package/dist/esm/util/bytes.js +37 -2
- package/dist/esm/util/clock.js +15 -0
- package/dist/esm/util/coercion.js +45 -3
- package/dist/esm/util/collections.js +11 -0
- package/dist/esm/util/index.js +2 -2
- package/dist/esm/util/primitives.js +19 -0
- package/dist/esm/util/runtime.js +5 -0
- package/dist/esm/version-spec.js +1 -0
- package/dist/index.js +35 -5
- package/dist/infra/log/ConsoleLogger.js +30 -6
- package/dist/infra/log/PinoLogger.js +64 -0
- package/dist/infra/log/types.js +4 -2
- package/dist/infra/perf/BackgroundQueue.js +55 -13
- package/dist/media/constants.js +34 -3
- package/dist/media/crypto/WaMediaCrypto.js +378 -0
- package/dist/media/index.js +9 -4
- package/dist/media/sticker/sticker-pack.js +136 -0
- package/dist/media/{WaMediaTransferClient.js → transfer/WaMediaTransferClient.js} +37 -6
- package/dist/media/{conn.js → transfer/conn.js} +10 -5
- package/dist/message/WaMessageClient.js +46 -15
- package/dist/message/addons/link-preview/builder.js +39 -0
- package/dist/message/addons/link-preview/detect.js +58 -0
- package/dist/message/addons/link-preview/fetcher.js +394 -0
- package/dist/message/addons/link-preview/types.js +2 -0
- package/dist/message/context-info.js +129 -0
- package/dist/message/{addon-crypto.js → crypto/addon-crypto.js} +68 -10
- package/dist/message/{icdc.js → crypto/icdc.js} +5 -7
- package/dist/message/crypto/phash.js +136 -0
- package/dist/message/{reporting-token.js → crypto/reporting-token.js} +6 -6
- package/dist/message/{use-case-secret.js → crypto/use-case-secret.js} +20 -3
- package/dist/message/{content.js → encode/content.js} +192 -7
- package/dist/message/encode/media-payload.js +45 -0
- package/dist/message/{padding.js → encode/padding.js} +9 -3
- package/dist/message/index.js +2 -2
- package/dist/message/kinds/bot.js +120 -0
- package/dist/message/kinds/newsletter.js +248 -0
- package/dist/message/kinds/sticker-pack.js +34 -0
- package/dist/message/{ack.js → primitives/ack.js} +8 -1
- package/dist/message/{incoming.js → primitives/incoming.js} +216 -31
- package/dist/message/primitives/peer-data-operation.js +96 -0
- package/dist/mex.js +6 -0
- package/dist/proto.js +1 -1
- package/dist/protocol/abprops.js +10 -0
- package/dist/protocol/appstate.js +7 -31
- package/dist/protocol/auth.js +3 -2
- package/dist/protocol/bot.js +81 -0
- package/dist/protocol/browser.js +8 -0
- package/dist/protocol/business.js +22 -0
- package/dist/protocol/call.js +51 -0
- package/dist/protocol/constants.js +39 -3
- package/dist/protocol/defaults.js +3 -0
- package/dist/protocol/index.js +12 -3
- package/dist/protocol/jid.js +107 -5
- package/dist/protocol/media.js +25 -12
- package/dist/protocol/message.js +4 -1
- package/dist/protocol/newsletter.js +64 -0
- package/dist/protocol/nodes.js +22 -2
- package/dist/protocol/notification.js +19 -3
- package/dist/protocol/presence.js +16 -0
- package/dist/protocol/status.js +9 -0
- package/dist/retry/codec.js +5 -0
- package/dist/retry/parse.js +16 -34
- package/dist/retry/reason.js +5 -0
- package/dist/retry/replay.js +130 -36
- package/dist/retry/tracker.js +3 -7
- package/dist/signal/api/SignalDeviceSyncApi.js +67 -18
- package/dist/signal/api/SignalDigestSyncApi.js +7 -2
- package/dist/signal/api/SignalIdentitySyncApi.js +9 -0
- package/dist/signal/api/SignalMissingPreKeysSyncApi.js +21 -60
- package/dist/signal/api/SignalRotateKeyApi.js +10 -0
- package/dist/signal/api/SignalSessionSyncApi.js +20 -48
- package/dist/signal/api/codec.js +52 -0
- package/dist/signal/api/prekeys.js +4 -0
- package/dist/signal/{crypto → attestation}/WaAdvSignature.js +6 -8
- package/dist/signal/constants.js +4 -1
- package/dist/signal/encoding.js +5 -303
- package/dist/signal/group/SenderKeyChain.js +18 -33
- package/dist/signal/group/SenderKeyCodec.js +2 -2
- package/dist/signal/group/SenderKeyManager.js +26 -9
- package/dist/signal/group/encoding.js +101 -0
- package/dist/signal/index.js +13 -10
- package/dist/signal/registration/encoding.js +39 -0
- package/dist/signal/registration/keygen.js +11 -1
- package/dist/signal/registration/utils.js +8 -1
- package/dist/signal/session/SignalProtocol.js +113 -11
- package/dist/signal/session/SignalRatchet.js +26 -56
- package/dist/signal/session/SignalSerializer.js +2 -2
- package/dist/signal/session/SignalSession.js +7 -15
- package/dist/signal/session/encoding.js +183 -0
- package/dist/signal/session/resolver.js +139 -30
- package/dist/store/cache/identity.cache.js +78 -0
- package/dist/store/cache/privacy-token.cache.js +60 -0
- package/dist/store/cache/sender-key.cache.js +104 -0
- package/dist/store/cache/session.cache.js +95 -0
- package/dist/store/contracts/group-metadata.store.js +2 -0
- package/dist/store/createStore.js +90 -36
- package/dist/store/index.js +18 -16
- package/dist/store/locks/contact.lock.js +1 -0
- package/dist/store/locks/device-list.lock.js +1 -0
- package/dist/store/locks/group-metadata.lock.js +23 -0
- package/dist/store/locks/pre-key.lock.js +4 -1
- package/dist/store/{providers/memory → memory}/appstate.store.js +5 -5
- package/dist/store/memory/auth.store.js +28 -0
- package/dist/store/memory/contact.store.js +83 -0
- package/dist/store/memory/device-list.store.js +107 -0
- package/dist/store/{providers/memory/participants.store.js → memory/group-metadata.store.js} +24 -15
- package/dist/store/{providers/memory → memory}/identity.store.js +3 -3
- package/dist/store/{providers/memory → memory}/message-secret.store.js +17 -8
- package/dist/store/{providers/memory → memory}/message.store.js +2 -2
- package/dist/store/{providers/memory → memory}/pre-key.store.js +2 -2
- package/dist/store/{providers/memory → memory}/privacy-token.store.js +1 -1
- package/dist/store/{providers/memory → memory}/retry.store.js +28 -7
- package/dist/store/{providers/memory → memory}/sender-key.store.js +3 -3
- package/dist/store/{providers/memory → memory}/session.store.js +3 -3
- package/dist/store/{providers/memory → memory}/thread.store.js +2 -2
- package/dist/store/noop.store.js +7 -5
- package/dist/transport/WaComms.js +14 -5
- package/dist/transport/WaWebSocket.js +32 -8
- package/dist/transport/binary/constants.js +11 -5
- package/dist/transport/binary/decoder.js +24 -18
- package/dist/transport/binary/encoder.js +109 -34
- package/dist/transport/binary/tokens.js +12 -12
- package/dist/transport/index.js +3 -1
- package/dist/transport/keepalive/WaKeepAlive.js +18 -4
- package/dist/transport/node/WaMobileTcpSocket.js +6 -0
- package/dist/transport/node/WaNodeOrchestrator.js +9 -5
- package/dist/transport/node/WaNodeTransport.js +13 -0
- package/dist/transport/node/builders/abprops.js +1 -1
- package/dist/transport/node/builders/account-sync.js +7 -16
- package/dist/transport/node/builders/bot.js +43 -0
- package/dist/transport/node/builders/business.js +31 -31
- package/dist/transport/node/builders/chatstate.js +31 -0
- package/dist/transport/node/builders/community.js +59 -0
- package/dist/transport/node/builders/device.js +1 -1
- package/dist/transport/node/builders/email.js +6 -5
- package/dist/transport/node/builders/global.js +2 -2
- package/dist/transport/node/builders/group.js +121 -3
- package/dist/transport/node/builders/media.js +1 -1
- package/dist/transport/node/builders/message.js +84 -49
- package/dist/transport/node/builders/newsletter.js +183 -0
- package/dist/transport/node/builders/passive.js +10 -0
- package/dist/transport/node/builders/prekeys.js +3 -3
- package/dist/transport/node/builders/presence.js +28 -1
- package/dist/transport/node/builders/privacy-token.js +1 -1
- package/dist/transport/node/builders/privacy.js +5 -5
- package/dist/transport/node/builders/profile.js +30 -7
- package/dist/transport/node/builders/tos.js +63 -0
- package/dist/transport/node/builders/usync.js +52 -1
- package/dist/transport/node/helpers.js +3 -2
- package/dist/transport/node/mex/argo-decoder.js +2 -2
- package/dist/transport/node/mex/client.js +23 -0
- package/dist/transport/node/query.js +17 -0
- package/dist/transport/node/usync.js +13 -0
- package/dist/transport/noise/WaClientPayload.js +9 -9
- package/dist/transport/noise/WaMobileClientPayload.js +6 -1
- package/dist/transport/noise/WaNoiseCert.js +7 -2
- package/dist/transport/noise/WaNoiseHandshake.js +26 -24
- package/dist/transport/noise/WaNoiseSession.js +41 -61
- package/dist/transport/noise/WaNoiseSocket.js +19 -13
- package/dist/transport/noise/constants.js +1 -2
- package/dist/transport/proxy.js +5 -0
- package/dist/transport/stream/parse.js +3 -7
- package/dist/transport/wa-web-version-fetcher.js +94 -0
- package/dist/types/appstate/constants.d.ts +1 -1
- package/dist/types/appstate/{WaAppStateCrypto.d.ts → crypto/WaAppStateCrypto.d.ts} +26 -9
- package/dist/types/appstate/index.d.ts +5 -5
- package/dist/types/appstate/{encoding.d.ts → parsers/encoding.d.ts} +8 -1
- package/dist/types/appstate/{response-parser.d.ts → parsers/response-parser.d.ts} +13 -3
- package/dist/types/appstate/sync/WaAppStateSyncClient.d.ts +105 -0
- package/dist/types/appstate/types.d.ts +1 -1
- package/dist/types/appstate/utils.d.ts +18 -2
- package/dist/types/appstate-spec.d.ts +24 -0
- package/dist/types/auth/WaAuthClient.d.ts +89 -3
- package/dist/types/auth/credentials-flow.d.ts +4 -3
- package/dist/types/auth/pairing/pairing-code-crypto.d.ts +0 -1
- package/dist/types/auth/types.d.ts +49 -2
- package/dist/types/client/WaClient.d.ts +178 -71
- package/dist/types/client/WaClientFactory.d.ts +30 -5
- package/dist/types/client/connection/WaConnectionManager.d.ts +4 -2
- package/dist/types/client/connection/WaReceiptQueue.d.ts +1 -1
- package/dist/types/client/coordinators/WaAppStateMutationCoordinator.d.ts +215 -5
- package/dist/types/client/coordinators/WaBotCoordinator.d.ts +117 -0
- package/dist/types/client/coordinators/WaBroadcastListCoordinator.d.ts +39 -0
- package/dist/types/client/coordinators/WaBusinessCoordinator.d.ts +44 -43
- package/dist/types/client/coordinators/WaEmailCoordinator.d.ts +16 -0
- package/dist/types/client/coordinators/WaGroupCoordinator.d.ts +311 -9
- package/dist/types/client/coordinators/WaIncomingNodeCoordinator.d.ts +11 -4
- package/dist/types/client/coordinators/WaLowLevelCoordinator.d.ts +47 -0
- package/dist/types/client/coordinators/WaMessageCoordinator.d.ts +232 -0
- package/dist/types/client/coordinators/WaMessageDispatchCoordinator.d.ts +55 -32
- package/dist/types/client/coordinators/WaNewsletterCoordinator.d.ts +13 -0
- package/dist/types/client/coordinators/WaPassiveTasksCoordinator.d.ts +4 -3
- package/dist/types/client/coordinators/WaPresenceCoordinator.d.ts +27 -0
- package/dist/types/client/coordinators/WaPrivacyCoordinator.d.ts +27 -0
- package/dist/types/client/coordinators/WaProfileCoordinator.d.ts +113 -0
- package/dist/types/client/coordinators/WaRetryCoordinator.d.ts +19 -17
- package/dist/types/client/coordinators/WaStatusCoordinator.d.ts +42 -0
- package/dist/types/client/coordinators/WaTrustedContactTokenCoordinator.d.ts +5 -1
- package/dist/types/client/events/abprops.d.ts +2 -1
- package/dist/types/client/events/appstate-mutation.d.ts +3 -0
- package/dist/types/client/events/business.d.ts +10 -0
- package/dist/types/client/events/call.d.ts +31 -0
- package/dist/types/client/events/chatstate.d.ts +9 -0
- package/dist/types/client/events/devices.d.ts +5 -4
- package/dist/types/client/{dirty.d.ts → events/dirty.d.ts} +4 -3
- package/dist/types/client/events/group.d.ts +2 -1
- package/dist/types/client/events/identity.d.ts +2 -1
- package/dist/types/client/{incoming.d.ts → events/incoming.d.ts} +27 -4
- package/dist/types/client/events/mex-notification.d.ts +6 -0
- package/dist/types/client/events/picture.d.ts +8 -0
- package/dist/types/client/events/presence.d.ts +28 -0
- package/dist/types/client/events/receipt.d.ts +14 -0
- package/dist/types/client/events/registration.d.ts +4 -3
- package/dist/types/client/index.d.ts +1 -1
- package/dist/types/client/media.d.ts +35 -1
- package/dist/types/client/messaging/fanout.d.ts +2 -2
- package/dist/types/client/messaging/group-metadata.d.ts +19 -0
- package/dist/types/client/messaging/ignore-key.d.ts +11 -0
- package/dist/types/client/messaging/key-protocol.d.ts +9 -7
- package/dist/types/client/messaging/link-preview.d.ts +19 -0
- package/dist/types/client/messaging/messages.d.ts +28 -0
- package/dist/types/client/newsletter/admin.d.ts +71 -0
- package/dist/types/client/newsletter/content.d.ts +42 -0
- package/dist/types/client/newsletter/discovery.d.ts +33 -0
- package/dist/types/client/newsletter/messaging.d.ts +66 -0
- package/dist/types/client/newsletter/mex.d.ts +14 -0
- package/dist/types/client/newsletter/parse.d.ts +19 -0
- package/dist/types/client/newsletter/types.d.ts +190 -0
- package/dist/types/client/persistence/WriteBehindPersistence.d.ts +12 -1
- package/dist/types/client/persistence/history-sync.d.ts +29 -0
- package/dist/types/client/{mailbox.d.ts → persistence/mailbox.d.ts} +4 -4
- package/dist/types/client/tokens/cs-token.d.ts +1 -3
- package/dist/types/client/types.d.ts +844 -72
- package/dist/types/crypto/core/hkdf.d.ts +10 -2
- package/dist/types/crypto/core/index.d.ts +2 -2
- package/dist/types/crypto/core/keys.d.ts +0 -4
- package/dist/types/crypto/core/nonce.d.ts +4 -5
- package/dist/types/crypto/core/primitives.d.ts +31 -20
- package/dist/types/crypto/core/random.d.ts +6 -0
- package/dist/types/crypto/core/xeddsa.d.ts +9 -0
- package/dist/types/crypto/curves/Ed25519.d.ts +7 -1
- package/dist/types/crypto/curves/X25519.d.ts +20 -1
- package/dist/types/crypto/curves/constants.d.ts +4 -3
- package/dist/types/crypto/curves/types.d.ts +0 -5
- package/dist/types/crypto/math/constants.d.ts +0 -1
- package/dist/types/crypto/math/mod.d.ts +0 -1
- package/dist/types/index.d.ts +34 -8
- package/dist/types/infra/log/ConsoleLogger.d.ts +18 -1
- package/dist/types/infra/log/PinoLogger.d.ts +55 -1
- package/dist/types/infra/log/types.d.ts +6 -0
- package/dist/types/infra/perf/BackgroundQueue.d.ts +19 -0
- package/dist/types/media/constants.d.ts +7 -2
- package/dist/types/media/crypto/WaMediaCrypto.d.ts +59 -0
- package/dist/types/media/index.d.ts +7 -5
- package/dist/types/media/processor.d.ts +27 -5
- package/dist/types/media/sticker/sticker-pack.d.ts +6 -0
- package/dist/types/media/{WaMediaTransferClient.d.ts → transfer/WaMediaTransferClient.d.ts} +30 -1
- package/dist/types/media/transfer/conn.d.ts +7 -0
- package/dist/types/media/types.d.ts +1 -2
- package/dist/types/message/WaMessageClient.d.ts +14 -0
- package/dist/types/message/addons/link-preview/builder.d.ts +13 -0
- package/dist/types/message/addons/link-preview/detect.d.ts +5 -0
- package/dist/types/message/addons/link-preview/fetcher.d.ts +13 -0
- package/dist/types/message/addons/link-preview/types.d.ts +51 -0
- package/dist/types/message/context-info.d.ts +66 -0
- package/dist/types/message/{addon-crypto.d.ts → crypto/addon-crypto.d.ts} +27 -5
- package/dist/types/message/{icdc.d.ts → crypto/icdc.d.ts} +4 -4
- package/dist/types/message/{phash.d.ts → crypto/phash.d.ts} +1 -1
- package/dist/types/message/{reporting-token.d.ts → crypto/reporting-token.d.ts} +2 -2
- package/dist/types/message/{use-case-secret.d.ts → crypto/use-case-secret.d.ts} +17 -1
- package/dist/types/message/encode/content.d.ts +43 -0
- package/dist/types/message/{device-sent.d.ts → encode/device-sent.d.ts} +1 -1
- package/dist/types/message/encode/media-payload.d.ts +12 -0
- package/dist/types/message/index.d.ts +2 -2
- package/dist/types/message/kinds/bot.d.ts +31 -0
- package/dist/types/message/kinds/newsletter.d.ts +12 -0
- package/dist/types/message/kinds/sticker-pack.d.ts +6 -0
- package/dist/types/message/{ack.d.ts → primitives/ack.d.ts} +1 -1
- package/dist/types/message/primitives/incoming.d.ts +21 -0
- package/dist/types/message/primitives/peer-data-operation.d.ts +23 -0
- package/dist/types/message/types.d.ts +209 -11
- package/dist/types/mex.d.ts +2 -0
- package/dist/types/proto.d.ts +2 -2
- package/dist/types/protocol/abprops.d.ts +9 -0
- package/dist/types/protocol/appstate.d.ts +4 -49
- package/dist/types/protocol/auth.d.ts +2 -2
- package/dist/types/protocol/bot.d.ts +45 -0
- package/dist/types/protocol/browser.d.ts +8 -0
- package/dist/types/protocol/business.d.ts +21 -0
- package/dist/types/protocol/call.d.ts +44 -0
- package/dist/types/protocol/constants.d.ts +16 -3
- package/dist/types/protocol/defaults.d.ts +3 -0
- package/dist/types/protocol/group.d.ts +1 -1
- package/dist/types/protocol/index.d.ts +2 -1
- package/dist/types/protocol/jid.d.ts +78 -0
- package/dist/types/protocol/media.d.ts +21 -13
- package/dist/types/protocol/message.d.ts +4 -0
- package/dist/types/protocol/newsletter.d.ts +65 -0
- package/dist/types/protocol/nodes.d.ts +20 -0
- package/dist/types/protocol/notification.d.ts +16 -0
- package/dist/types/protocol/presence.d.ts +16 -0
- package/dist/types/protocol/status.d.ts +7 -0
- package/dist/types/retry/codec.d.ts +5 -0
- package/dist/types/retry/index.d.ts +1 -1
- package/dist/types/retry/parse.d.ts +9 -0
- package/dist/types/retry/reason.d.ts +5 -0
- package/dist/types/retry/replay.d.ts +19 -5
- package/dist/types/retry/tracker.d.ts +10 -3
- package/dist/types/retry/types.d.ts +3 -8
- package/dist/types/signal/api/SignalDeviceSyncApi.d.ts +20 -0
- package/dist/types/signal/api/SignalDigestSyncApi.d.ts +10 -0
- package/dist/types/signal/api/SignalIdentitySyncApi.d.ts +9 -0
- package/dist/types/signal/api/SignalMissingPreKeysSyncApi.d.ts +8 -0
- package/dist/types/signal/api/SignalRotateKeyApi.d.ts +10 -0
- package/dist/types/signal/api/SignalSessionSyncApi.d.ts +13 -0
- package/dist/types/signal/api/codec.d.ts +20 -0
- package/dist/types/signal/api/constants.d.ts +1 -1
- package/dist/types/signal/api/prekeys.d.ts +4 -0
- package/dist/types/signal/{crypto → attestation}/WaAdvSignature.d.ts +2 -2
- package/dist/types/signal/attestation/constants.d.ts +4 -0
- package/dist/types/signal/constants.d.ts +7 -4
- package/dist/types/signal/encoding.d.ts +6 -68
- package/dist/types/signal/group/SenderKeyChain.d.ts +1 -1
- package/dist/types/signal/group/SenderKeyManager.d.ts +18 -1
- package/dist/types/signal/group/encoding.d.ts +25 -0
- package/dist/types/signal/index.d.ts +4 -1
- package/dist/types/signal/registration/encoding.d.ts +30 -0
- package/dist/types/signal/registration/keygen.d.ts +10 -0
- package/dist/types/signal/registration/utils.d.ts +5 -0
- package/dist/types/signal/session/SignalProtocol.d.ts +55 -0
- package/dist/types/signal/session/SignalRatchet.d.ts +2 -3
- package/dist/types/signal/session/SignalSession.d.ts +0 -1
- package/dist/types/signal/session/encoding.d.ts +28 -0
- package/dist/types/signal/session/resolver.d.ts +14 -0
- package/dist/types/signal/types.d.ts +1 -1
- package/dist/types/store/cache/identity.cache.d.ts +15 -0
- package/dist/types/store/cache/privacy-token.cache.d.ts +15 -0
- package/dist/types/store/cache/sender-key.cache.d.ts +18 -0
- package/dist/types/store/cache/session.cache.d.ts +23 -0
- package/dist/types/store/contracts/contact.store.d.ts +14 -0
- package/dist/types/store/contracts/device-list.store.d.ts +13 -0
- package/dist/types/store/contracts/group-metadata.store.d.ts +14 -0
- package/dist/types/store/contracts/message.store.d.ts +0 -2
- package/dist/types/store/createStore.d.ts +54 -2
- package/dist/types/store/index.d.ts +17 -16
- package/dist/types/store/locks/group-metadata.lock.d.ts +2 -0
- package/dist/types/store/{providers/memory → memory}/appstate.store.d.ts +2 -2
- package/dist/types/store/memory/auth.store.d.ts +18 -0
- package/dist/types/store/{providers/memory → memory}/contact.store.d.ts +6 -1
- package/dist/types/store/{providers/memory → memory}/device-list.store.d.ts +15 -2
- package/dist/types/store/memory/group-metadata.store.d.ts +27 -0
- package/dist/types/store/{providers/memory → memory}/identity.store.d.ts +2 -2
- package/dist/types/store/{providers/memory → memory}/message-secret.store.d.ts +12 -2
- package/dist/types/store/{providers/memory → memory}/message.store.d.ts +1 -1
- package/dist/types/store/{providers/memory → memory}/pre-key.store.d.ts +2 -2
- package/dist/types/store/{providers/memory → memory}/privacy-token.store.d.ts +1 -1
- package/dist/types/store/{providers/memory → memory}/retry.store.d.ts +16 -3
- package/dist/types/store/{providers/memory → memory}/sender-key.store.d.ts +2 -2
- package/dist/types/store/{providers/memory → memory}/session.store.d.ts +2 -2
- package/dist/types/store/{providers/memory → memory}/signal.store.d.ts +2 -2
- package/dist/types/store/{providers/memory → memory}/thread.store.d.ts +1 -1
- package/dist/types/store/noop.store.d.ts +2 -2
- package/dist/types/store/types.d.ts +250 -6
- package/dist/types/transport/WaComms.d.ts +5 -0
- package/dist/types/transport/WaWebSocket.d.ts +5 -0
- package/dist/types/transport/binary/constants.d.ts +8 -2
- package/dist/types/transport/binary/decoder.d.ts +5 -0
- package/dist/types/transport/binary/encoder.d.ts +5 -0
- package/dist/types/transport/binary/tokens.d.ts +6 -6
- package/dist/types/transport/index.d.ts +3 -1
- package/dist/types/transport/keepalive/WaKeepAlive.d.ts +7 -0
- package/dist/types/transport/node/WaMobileTcpSocket.d.ts +6 -0
- package/dist/types/transport/node/WaNodeOrchestrator.d.ts +5 -0
- package/dist/types/transport/node/WaNodeTransport.d.ts +13 -0
- package/dist/types/transport/node/builders/account-sync.d.ts +1 -2
- package/dist/types/transport/node/builders/bot.d.ts +4 -0
- package/dist/types/transport/node/builders/business.d.ts +21 -4
- package/dist/types/transport/node/builders/chatstate.d.ts +11 -0
- package/dist/types/transport/node/builders/community.d.ts +17 -0
- package/dist/types/transport/node/builders/group.d.ts +44 -2
- package/dist/types/transport/node/builders/message.d.ts +11 -6
- package/dist/types/transport/node/builders/newsletter.d.ts +73 -0
- package/dist/types/transport/node/builders/passive.d.ts +3 -0
- package/dist/types/transport/node/builders/presence.d.ts +8 -1
- package/dist/types/transport/node/builders/profile.d.ts +3 -0
- package/dist/types/transport/node/builders/tos.d.ts +12 -0
- package/dist/types/transport/node/builders/usync.d.ts +16 -0
- package/dist/types/transport/node/helpers.d.ts +1 -2
- package/dist/types/transport/node/mex/client.d.ts +12 -1
- package/dist/types/transport/node/query.d.ts +19 -1
- package/dist/types/transport/node/usync.d.ts +3 -0
- package/dist/types/transport/noise/WaMobileClientPayload.d.ts +6 -1
- package/dist/types/transport/noise/WaNoiseCert.d.ts +5 -0
- package/dist/types/transport/noise/WaNoiseHandshake.d.ts +12 -6
- package/dist/types/transport/noise/WaNoiseSession.d.ts +0 -1
- package/dist/types/transport/noise/WaNoiseSocket.d.ts +12 -6
- package/dist/types/transport/noise/constants.d.ts +4 -5
- package/dist/types/transport/noise/types.d.ts +1 -1
- package/dist/types/transport/proxy.d.ts +5 -0
- package/dist/types/transport/types.d.ts +14 -7
- package/dist/types/transport/wa-web-version-fetcher.d.ts +44 -0
- package/dist/types/util/async.d.ts +4 -0
- package/dist/types/util/bytes.d.ts +36 -1
- package/dist/types/util/clock.d.ts +6 -0
- package/dist/types/util/coercion.d.ts +25 -0
- package/dist/types/util/collections.d.ts +8 -0
- package/dist/types/util/index.d.ts +2 -2
- package/dist/types/util/primitives.d.ts +11 -0
- package/dist/types/util/runtime.d.ts +5 -0
- package/dist/types/version-spec.d.ts +1 -0
- package/dist/util/async.js +4 -0
- package/dist/util/bytes.js +37 -2
- package/dist/util/clock.js +18 -0
- package/dist/util/coercion.js +48 -3
- package/dist/util/collections.js +12 -0
- package/dist/util/index.js +7 -1
- package/dist/util/primitives.js +20 -0
- package/dist/util/runtime.js +5 -0
- package/dist/version-spec.js +5 -0
- package/package.json +32 -8
- package/spec/appstate/index.d.ts +188 -0
- package/spec/appstate/index.js +850 -0
- package/spec/mex/index.d.ts +4172 -0
- package/spec/mex/index.js +261 -0
- package/spec/proto/index.d.ts +16305 -0
- package/spec/proto/index.js +1 -0
- package/spec/version/index.d.ts +4 -0
- package/spec/version/index.js +9 -0
- package/spec/version/version.json +3 -0
- package/dist/client/events/chat.js +0 -227
- package/dist/client/incoming.js +0 -306
- package/dist/client/mailbox.js +0 -66
- package/dist/client/messages.js +0 -305
- package/dist/esm/client/events/chat.js +0 -224
- package/dist/esm/client/incoming.js +0 -296
- package/dist/esm/client/mailbox.js +0 -63
- package/dist/esm/client/messages.js +0 -301
- package/dist/esm/media/WaMediaCrypto.js +0 -499
- package/dist/esm/message/phash.js +0 -47
- package/dist/esm/store/locks/participants.lock.js +0 -20
- package/dist/esm/store/providers/memory/contact.store.js +0 -28
- package/dist/esm/store/providers/memory/device-list.store.js +0 -67
- package/dist/esm/transport/node/mex/persist-ids.js +0 -10
- package/dist/media/WaMediaCrypto.js +0 -503
- package/dist/message/phash.js +0 -50
- package/dist/store/locks/participants.lock.js +0 -23
- package/dist/store/providers/memory/contact.store.js +0 -32
- package/dist/store/providers/memory/device-list.store.js +0 -71
- package/dist/transport/node/mex/persist-ids.js +0 -13
- package/dist/types/appstate/WaAppStateSyncClient.d.ts +0 -70
- package/dist/types/client/events/chat.d.ts +0 -3
- package/dist/types/client/history-sync.d.ts +0 -20
- package/dist/types/client/messages.d.ts +0 -18
- package/dist/types/client/messaging/participants.d.ts +0 -13
- package/dist/types/media/WaMediaCrypto.d.ts +0 -22
- package/dist/types/media/conn.d.ts +0 -3
- package/dist/types/message/content.d.ts +0 -14
- package/dist/types/message/incoming.d.ts +0 -18
- package/dist/types/signal/crypto/constants.d.ts +0 -4
- package/dist/types/store/contracts/participants.store.d.ts +0 -13
- package/dist/types/store/locks/participants.lock.d.ts +0 -2
- package/dist/types/store/providers/memory/participants.store.d.ts +0 -17
- package/dist/types/transport/node/mex/persist-ids.d.ts +0 -14
- package/proto/index.d.ts +0 -10903
- package/proto/index.js +0 -1
- /package/dist/{store/contracts/participants.store.js → client/newsletter/types.js} +0 -0
- /package/dist/esm/{store/contracts/participants.store.js → client/newsletter/types.js} +0 -0
- /package/dist/esm/message/{device-sent.js → encode/device-sent.js} +0 -0
- /package/dist/esm/signal/{crypto → attestation}/constants.js +0 -0
- /package/dist/esm/store/{providers/memory → memory}/signal.store.js +0 -0
- /package/dist/message/{device-sent.js → encode/device-sent.js} +0 -0
- /package/dist/signal/{crypto → attestation}/constants.js +0 -0
- /package/dist/store/{providers/memory → memory}/signal.store.js +0 -0
- /package/dist/types/message/{padding.d.ts → encode/padding.d.ts} +0 -0
|
@@ -4,9 +4,9 @@ exports.buildLoginPayload = buildLoginPayload;
|
|
|
4
4
|
exports.buildRegistrationPayload = buildRegistrationPayload;
|
|
5
5
|
const node_crypto_1 = require("node:crypto");
|
|
6
6
|
const primitives_1 = require("../../crypto/core/primitives");
|
|
7
|
-
const _proto_1 = require("../../proto
|
|
8
|
-
const constants_1 = require("../noise/constants");
|
|
7
|
+
const _proto_1 = require("../../proto");
|
|
9
8
|
const bytes_1 = require("../../util/bytes");
|
|
9
|
+
const _version_spec_1 = require("../../version-spec");
|
|
10
10
|
function parseVersion(versionBase) {
|
|
11
11
|
const [p = '2', s = '3000', t = '0'] = versionBase.split('.');
|
|
12
12
|
const primary = Number.parseInt(p, 10);
|
|
@@ -111,12 +111,13 @@ function defaultDeviceProps(versionBase, config, version) {
|
|
|
111
111
|
supportHostedGroupMsg: true,
|
|
112
112
|
supportBizHostedMsg: true,
|
|
113
113
|
supportFbidBotChatHistory: true,
|
|
114
|
-
supportMessageAssociation: true
|
|
114
|
+
supportMessageAssociation: true,
|
|
115
|
+
supportInlineContacts: true
|
|
115
116
|
}
|
|
116
117
|
}).finish();
|
|
117
118
|
}
|
|
118
119
|
function buildCommonPayload(config, version) {
|
|
119
|
-
const versionBase = config.versionBase ??
|
|
120
|
+
const versionBase = config.versionBase ?? _version_spec_1.WA_VERSION;
|
|
120
121
|
const pull = config.pull ?? true;
|
|
121
122
|
return {
|
|
122
123
|
passive: config.passive === true,
|
|
@@ -124,10 +125,9 @@ function buildCommonPayload(config, version) {
|
|
|
124
125
|
connectType: _proto_1.proto.ClientPayload.ConnectType.WIFI_UNKNOWN,
|
|
125
126
|
connectReason: _proto_1.proto.ClientPayload.ConnectReason.USER_ACTIVATED,
|
|
126
127
|
userAgent: config.userAgent ?? defaultUserAgent(versionBase, config.deviceOsDisplayName, version),
|
|
127
|
-
webInfo: config.webInfo ??
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
}
|
|
128
|
+
webInfo: config.webInfo ?? {
|
|
129
|
+
webSubPlatform: defaultWebSubPlatform()
|
|
130
|
+
}
|
|
131
131
|
};
|
|
132
132
|
}
|
|
133
133
|
function buildLoginPayload(config) {
|
|
@@ -151,7 +151,7 @@ function buildRegistrationPayload(config) {
|
|
|
151
151
|
if (!Number.isSafeInteger(signedPreKeyId) || signedPreKeyId <= 0) {
|
|
152
152
|
throw new Error('registration payload requires a valid signedPreKeyId');
|
|
153
153
|
}
|
|
154
|
-
const versionBase = config.versionBase ??
|
|
154
|
+
const versionBase = config.versionBase ?? _version_spec_1.WA_VERSION;
|
|
155
155
|
const version = parseVersion(versionBase);
|
|
156
156
|
const common = buildCommonPayload(config, version);
|
|
157
157
|
const devicePairingData = {
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.buildMobileLoginPayload = buildMobileLoginPayload;
|
|
4
4
|
const node_crypto_1 = require("node:crypto");
|
|
5
|
-
const _proto_1 = require("../../proto
|
|
5
|
+
const _proto_1 = require("../../proto");
|
|
6
6
|
function parseAppVersion(version) {
|
|
7
7
|
const parts = version.split('.');
|
|
8
8
|
const at = (i) => {
|
|
@@ -16,6 +16,11 @@ function parseAppVersion(version) {
|
|
|
16
16
|
quaternary: at(3)
|
|
17
17
|
};
|
|
18
18
|
}
|
|
19
|
+
/**
|
|
20
|
+
* Builds the encoded {@link Proto.ClientPayload} bytes the WhatsApp Mobile
|
|
21
|
+
* transport sends after the noise login handshake. Throws when
|
|
22
|
+
* `username`/`appVersion` are missing/invalid.
|
|
23
|
+
*/
|
|
19
24
|
function buildMobileLoginPayload(config) {
|
|
20
25
|
if (!Number.isSafeInteger(config.username) || config.username <= 0) {
|
|
21
26
|
throw new Error('mobile login payload requires a valid numeric username');
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.verifyNoiseCertificateChain = verifyNoiseCertificateChain;
|
|
4
|
-
const _crypto_1 = require("../../crypto
|
|
5
|
-
const _proto_1 = require("../../proto
|
|
4
|
+
const _crypto_1 = require("../../crypto");
|
|
5
|
+
const _proto_1 = require("../../proto");
|
|
6
6
|
const constants_1 = require("../noise/constants");
|
|
7
7
|
const bytes_1 = require("../../util/bytes");
|
|
8
8
|
const primitives_1 = require("../../util/primitives");
|
|
@@ -29,6 +29,11 @@ function parseNoiseCertificate(certificate) {
|
|
|
29
29
|
signature: signatureBytes
|
|
30
30
|
};
|
|
31
31
|
}
|
|
32
|
+
/**
|
|
33
|
+
* Validates a WhatsApp noise certificate chain against `rootCa` (defaults to
|
|
34
|
+
* the production root) and confirms the leaf binds `serverStatic`. Throws on
|
|
35
|
+
* any structural mismatch, bad signature, or unexpected issuer serial.
|
|
36
|
+
*/
|
|
32
37
|
async function verifyNoiseCertificateChain(certificateChain, serverStatic, rootCa = PRODUCTION_ROOT_CA) {
|
|
33
38
|
const chain = _proto_1.proto.CertChain.decode(certificateChain);
|
|
34
39
|
if (!chain.leaf || !chain.intermediate) {
|
|
@@ -1,56 +1,58 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.WaNoiseHandshake = void 0;
|
|
4
|
-
const _crypto_1 = require("../../crypto
|
|
4
|
+
const _crypto_1 = require("../../crypto");
|
|
5
5
|
const WaNoiseSocket_1 = require("../noise/WaNoiseSocket");
|
|
6
6
|
const bytes_1 = require("../../util/bytes");
|
|
7
|
+
/**
|
|
8
|
+
* Implements the Noise XX-style handshake state used by WaComms: tracks the
|
|
9
|
+
* handshake hash, chaining key, derived cipher key, and nonce counter. Calls
|
|
10
|
+
* {@link finish} to produce the post-handshake {@link WaNoiseSocket}.
|
|
11
|
+
*/
|
|
7
12
|
class WaNoiseHandshake {
|
|
8
13
|
constructor() {
|
|
14
|
+
this.nonceScratch = new Uint8Array(12);
|
|
9
15
|
this.handshakeHash = bytes_1.EMPTY_BYTES;
|
|
10
16
|
this.chainingKey = bytes_1.EMPTY_BYTES;
|
|
11
17
|
this.cipherKey = null;
|
|
12
18
|
this.nonce = 0;
|
|
13
19
|
}
|
|
14
|
-
|
|
15
|
-
const hashInput = protocolName.length === 32 ? protocolName :
|
|
20
|
+
start(protocolName, prologue) {
|
|
21
|
+
const hashInput = protocolName.length === 32 ? protocolName : (0, _crypto_1.sha256)(protocolName);
|
|
16
22
|
this.handshakeHash = hashInput;
|
|
17
23
|
this.chainingKey = hashInput;
|
|
18
|
-
this.cipherKey =
|
|
19
|
-
|
|
24
|
+
this.cipherKey = this.handshakeHash;
|
|
25
|
+
this.authenticate(prologue);
|
|
20
26
|
}
|
|
21
|
-
|
|
22
|
-
this.handshakeHash =
|
|
27
|
+
authenticate(data) {
|
|
28
|
+
this.handshakeHash = (0, _crypto_1.sha256)([this.handshakeHash, data]);
|
|
23
29
|
}
|
|
24
|
-
|
|
30
|
+
mixIntoKey(keyMaterial) {
|
|
25
31
|
this.nonce = 0;
|
|
26
|
-
const [newChainingKey, nextCipherKey] =
|
|
32
|
+
const [newChainingKey, nextCipherKey] = (0, _crypto_1.hkdfSplit)(keyMaterial, this.chainingKey, bytes_1.EMPTY_BYTES);
|
|
27
33
|
this.chainingKey = newChainingKey;
|
|
28
|
-
this.cipherKey =
|
|
34
|
+
this.cipherKey = nextCipherKey;
|
|
29
35
|
}
|
|
30
|
-
|
|
36
|
+
encrypt(plaintext) {
|
|
31
37
|
if (!this.cipherKey) {
|
|
32
38
|
throw new Error('noise handshake cipher key is not initialized');
|
|
33
39
|
}
|
|
34
|
-
|
|
35
|
-
const ciphertext =
|
|
36
|
-
|
|
40
|
+
(0, _crypto_1.writeNonceCounter)(this.nonceScratch, this.nonce++);
|
|
41
|
+
const ciphertext = (0, _crypto_1.aesGcmEncrypt)(this.cipherKey, this.nonceScratch, plaintext, this.handshakeHash);
|
|
42
|
+
this.authenticate(ciphertext);
|
|
37
43
|
return ciphertext;
|
|
38
44
|
}
|
|
39
|
-
|
|
45
|
+
decrypt(ciphertext) {
|
|
40
46
|
if (!this.cipherKey) {
|
|
41
47
|
throw new Error('noise handshake cipher key is not initialized');
|
|
42
48
|
}
|
|
43
|
-
|
|
44
|
-
const plaintext =
|
|
45
|
-
|
|
49
|
+
(0, _crypto_1.writeNonceCounter)(this.nonceScratch, this.nonce++);
|
|
50
|
+
const plaintext = (0, _crypto_1.aesGcmDecrypt)(this.cipherKey, this.nonceScratch, ciphertext, this.handshakeHash);
|
|
51
|
+
this.authenticate(ciphertext);
|
|
46
52
|
return plaintext;
|
|
47
53
|
}
|
|
48
|
-
|
|
49
|
-
const [
|
|
50
|
-
const [writeKey, readKey] = await Promise.all([
|
|
51
|
-
(0, _crypto_1.importAesGcmKey)(writeKeyRaw, ['encrypt']),
|
|
52
|
-
(0, _crypto_1.importAesGcmKey)(readKeyRaw, ['decrypt'])
|
|
53
|
-
]);
|
|
54
|
+
finish() {
|
|
55
|
+
const [writeKey, readKey] = (0, _crypto_1.hkdfSplit)(bytes_1.EMPTY_BYTES, this.chainingKey, bytes_1.EMPTY_BYTES);
|
|
54
56
|
this.handshakeHash = bytes_1.EMPTY_BYTES;
|
|
55
57
|
this.chainingKey = bytes_1.EMPTY_BYTES;
|
|
56
58
|
this.cipherKey = null;
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.WaNoiseSession = void 0;
|
|
4
|
-
const _crypto_1 = require("../../crypto
|
|
4
|
+
const _crypto_1 = require("../../crypto");
|
|
5
5
|
const ConsoleLogger_1 = require("../../infra/log/ConsoleLogger");
|
|
6
|
-
const _proto_1 = require("../../proto
|
|
6
|
+
const _proto_1 = require("../../proto");
|
|
7
7
|
const constants_1 = require("../../protocol/constants");
|
|
8
8
|
const constants_2 = require("../noise/constants");
|
|
9
9
|
const WaClientPayload_1 = require("../noise/WaClientPayload");
|
|
@@ -51,7 +51,6 @@ function buildRoutingInfoPrefix(routingInfo) {
|
|
|
51
51
|
class WaNoiseSession {
|
|
52
52
|
constructor(sendWire, logger = new ConsoleLogger_1.ConsoleLogger('info')) {
|
|
53
53
|
this.writeChain = Promise.resolve();
|
|
54
|
-
this.readChain = Promise.resolve();
|
|
55
54
|
this.frameCodec = null;
|
|
56
55
|
this.handshakeInbox = [];
|
|
57
56
|
this.handshakeInboxHead = 0;
|
|
@@ -84,16 +83,16 @@ class WaNoiseSession {
|
|
|
84
83
|
const verifyCertificates = config.verifyCertificateChain !== false;
|
|
85
84
|
this.trustedRootCa = config.trustedRootCa;
|
|
86
85
|
if (config.serverStaticKey && config.serverStaticKey.length === 32) {
|
|
87
|
-
this.logger.
|
|
86
|
+
this.logger.debug('noise session attempting resume handshake (IK)');
|
|
88
87
|
this.noiseSocket = await this.resumeHandshake(config.serverStaticKey, config.clientStaticKeyPair, ephemeralKeyPair, payload, protocolHeader, verifyCertificates);
|
|
89
88
|
await this.decodeBufferedPostHandshakeFrames();
|
|
90
|
-
this.logger.info('noise session established
|
|
89
|
+
this.logger.info('noise session established', { mode: 'resume_or_fallback' });
|
|
91
90
|
return;
|
|
92
91
|
}
|
|
93
|
-
this.logger.
|
|
92
|
+
this.logger.debug('noise session starting full handshake (XX)');
|
|
94
93
|
this.noiseSocket = await this.fullHandshake(config.clientStaticKeyPair, ephemeralKeyPair, payload, protocolHeader, verifyCertificates);
|
|
95
94
|
await this.decodeBufferedPostHandshakeFrames();
|
|
96
|
-
this.logger.info('noise session established
|
|
95
|
+
this.logger.info('noise session established', { mode: 'full' });
|
|
97
96
|
}
|
|
98
97
|
encryptFrame(frame) {
|
|
99
98
|
const socket = this.noiseSocket;
|
|
@@ -101,19 +100,11 @@ class WaNoiseSession {
|
|
|
101
100
|
if (!socket || !codec) {
|
|
102
101
|
return Promise.reject(new Error('noise session is not established'));
|
|
103
102
|
}
|
|
104
|
-
|
|
105
|
-
try {
|
|
106
|
-
encryptPromise = socket.encrypt(socket.reserveWriteNonce(), frame);
|
|
107
|
-
}
|
|
108
|
-
catch (error) {
|
|
109
|
-
return Promise.reject(error);
|
|
110
|
-
}
|
|
111
|
-
const result = this.writeChain
|
|
112
|
-
.then(() => encryptPromise)
|
|
113
|
-
.then((encrypted) => codec.encodeFrame(encrypted));
|
|
103
|
+
const result = this.writeChain.then(() => codec.encodeFrame(socket.encrypt(frame)));
|
|
114
104
|
this.writeChain = result.then(() => { }, () => { });
|
|
115
105
|
return result;
|
|
116
106
|
}
|
|
107
|
+
// eslint-disable-next-line @typescript-eslint/require-await
|
|
117
108
|
async pushWireChunk(chunk) {
|
|
118
109
|
const codec = this.frameCodec;
|
|
119
110
|
if (!codec) {
|
|
@@ -142,11 +133,7 @@ class WaNoiseSession {
|
|
|
142
133
|
return out;
|
|
143
134
|
}
|
|
144
135
|
if (frames.length > 0) {
|
|
145
|
-
const
|
|
146
|
-
this.readChain = this.readChain
|
|
147
|
-
.then(() => decryptBatch)
|
|
148
|
-
.then(() => { }, () => { });
|
|
149
|
-
const decrypted = await decryptBatch;
|
|
136
|
+
const decrypted = this.decryptFramesBatch(this.noiseSocket, frames);
|
|
150
137
|
for (let i = 0; i < decrypted.length; i++) {
|
|
151
138
|
out.push(decrypted[i]);
|
|
152
139
|
}
|
|
@@ -164,15 +151,12 @@ class WaNoiseSession {
|
|
|
164
151
|
rejecter(closeError);
|
|
165
152
|
}
|
|
166
153
|
}
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
return [await socket.decrypt(socket.reserveReadNonce(), frames[0])];
|
|
170
|
-
}
|
|
171
|
-
const pending = new Array(frames.length);
|
|
154
|
+
decryptFramesBatch(socket, frames) {
|
|
155
|
+
const out = new Array(frames.length);
|
|
172
156
|
for (let i = 0; i < frames.length; i++) {
|
|
173
|
-
|
|
157
|
+
out[i] = socket.decrypt(frames[i]);
|
|
174
158
|
}
|
|
175
|
-
return
|
|
159
|
+
return out;
|
|
176
160
|
}
|
|
177
161
|
reset() {
|
|
178
162
|
this.logger.trace('noise session reset');
|
|
@@ -186,7 +170,6 @@ class WaNoiseSession {
|
|
|
186
170
|
this.serverStaticKey = null;
|
|
187
171
|
this.trustedRootCa = undefined;
|
|
188
172
|
this.writeChain = Promise.resolve();
|
|
189
|
-
this.readChain = Promise.resolve();
|
|
190
173
|
}
|
|
191
174
|
getServerStaticKey() {
|
|
192
175
|
return this.serverStaticKey;
|
|
@@ -194,8 +177,8 @@ class WaNoiseSession {
|
|
|
194
177
|
async fullHandshake(clientStaticKeyPair, ephemeralKeyPair, payload, protocolHeader, verifyCertificates) {
|
|
195
178
|
this.logger.trace('noise full handshake: send client hello');
|
|
196
179
|
const handshake = new WaNoiseHandshake_1.WaNoiseHandshake();
|
|
197
|
-
|
|
198
|
-
|
|
180
|
+
handshake.start(constants_2.NOISE_XX_NAME, protocolHeader);
|
|
181
|
+
handshake.authenticate(ephemeralKeyPair.pubKey);
|
|
199
182
|
const clientHello = _proto_1.proto.HandshakeMessage.encode({
|
|
200
183
|
clientHello: {
|
|
201
184
|
ephemeral: ephemeralKeyPair.pubKey
|
|
@@ -209,23 +192,23 @@ class WaNoiseSession {
|
|
|
209
192
|
if (resumeResult.socket) {
|
|
210
193
|
return resumeResult.socket;
|
|
211
194
|
}
|
|
212
|
-
this.logger.
|
|
195
|
+
this.logger.debug('noise resume handshake fallback to XX');
|
|
213
196
|
return this.resumeHandshakeWithFallback(clientStaticKeyPair, ephemeralKeyPair, payload, protocolHeader, resumeResult.serverHelloFrame, verifyCertificates);
|
|
214
197
|
}
|
|
215
198
|
async tryResumeHandshakeWithIk(serverStaticKey, clientStaticKeyPair, ephemeralKeyPair, payload, protocolHeader) {
|
|
216
199
|
this.logger.trace('noise resume handshake: send IK client hello');
|
|
217
200
|
const handshake = new WaNoiseHandshake_1.WaNoiseHandshake();
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
201
|
+
handshake.start(constants_2.NOISE_IK_NAME, protocolHeader);
|
|
202
|
+
handshake.authenticate(serverStaticKey);
|
|
203
|
+
handshake.authenticate(ephemeralKeyPair.pubKey);
|
|
221
204
|
const [agreement1, agreement2] = await Promise.all([
|
|
222
205
|
_crypto_1.X25519.scalarMult(ephemeralKeyPair.privKey, serverStaticKey),
|
|
223
206
|
_crypto_1.X25519.scalarMult(clientStaticKeyPair.privKey, serverStaticKey)
|
|
224
207
|
]);
|
|
225
|
-
|
|
226
|
-
const encryptedClientStatic =
|
|
227
|
-
|
|
228
|
-
const encryptedPayload =
|
|
208
|
+
handshake.mixIntoKey(agreement1);
|
|
209
|
+
const encryptedClientStatic = handshake.encrypt(clientStaticKeyPair.pubKey);
|
|
210
|
+
handshake.mixIntoKey(agreement2);
|
|
211
|
+
const encryptedPayload = handshake.encrypt(payload);
|
|
229
212
|
const clientHello = _proto_1.proto.HandshakeMessage.encode({
|
|
230
213
|
clientHello: {
|
|
231
214
|
ephemeral: ephemeralKeyPair.pubKey,
|
|
@@ -249,22 +232,22 @@ class WaNoiseSession {
|
|
|
249
232
|
throw new Error('noise resume handshake missing certificate payload');
|
|
250
233
|
}
|
|
251
234
|
const serverEphemeral = serverHello.ephemeral;
|
|
252
|
-
|
|
235
|
+
handshake.authenticate(serverEphemeral);
|
|
253
236
|
const [dh1, dh2] = await Promise.all([
|
|
254
237
|
_crypto_1.X25519.scalarMult(ephemeralKeyPair.privKey, serverEphemeral),
|
|
255
238
|
_crypto_1.X25519.scalarMult(clientStaticKeyPair.privKey, serverEphemeral)
|
|
256
239
|
]);
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
240
|
+
handshake.mixIntoKey(dh1);
|
|
241
|
+
handshake.mixIntoKey(dh2);
|
|
242
|
+
handshake.decrypt(serverHello.payload);
|
|
260
243
|
this.serverStaticKey = serverStaticKey;
|
|
261
|
-
this.logger.
|
|
262
|
-
return { socket:
|
|
244
|
+
this.logger.debug('noise resume handshake successful without fallback');
|
|
245
|
+
return { socket: handshake.finish(), serverHelloFrame: null };
|
|
263
246
|
}
|
|
264
247
|
async resumeHandshakeWithFallback(clientStaticKeyPair, ephemeralKeyPair, payload, protocolHeader, serverHelloFrame, verifyCertificates) {
|
|
265
248
|
const fallback = new WaNoiseHandshake_1.WaNoiseHandshake();
|
|
266
|
-
|
|
267
|
-
|
|
249
|
+
fallback.start(constants_2.NOISE_XX_FALLBACK_NAME, protocolHeader);
|
|
250
|
+
fallback.authenticate(ephemeralKeyPair.pubKey);
|
|
268
251
|
return this.continueFullHandshake(fallback, serverHelloFrame, clientStaticKeyPair, ephemeralKeyPair, payload, verifyCertificates);
|
|
269
252
|
}
|
|
270
253
|
async continueFullHandshake(handshake, serverHelloFrame, clientStaticKeyPair, ephemeralKeyPair, payload, verifyCertificates) {
|
|
@@ -275,19 +258,19 @@ class WaNoiseSession {
|
|
|
275
258
|
throw new Error('noise full handshake missing server hello fields');
|
|
276
259
|
}
|
|
277
260
|
const serverEphemeral = serverHello.ephemeral;
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
const serverStatic =
|
|
281
|
-
|
|
282
|
-
const certificate =
|
|
261
|
+
handshake.authenticate(serverEphemeral);
|
|
262
|
+
handshake.mixIntoKey(await _crypto_1.X25519.scalarMult(ephemeralKeyPair.privKey, serverEphemeral));
|
|
263
|
+
const serverStatic = handshake.decrypt(serverHello.static);
|
|
264
|
+
handshake.mixIntoKey(await _crypto_1.X25519.scalarMult(ephemeralKeyPair.privKey, serverStatic));
|
|
265
|
+
const certificate = handshake.decrypt(serverHello.payload);
|
|
283
266
|
if (verifyCertificates) {
|
|
284
267
|
await (0, WaNoiseCert_1.verifyNoiseCertificateChain)(certificate, serverStatic, this.trustedRootCa);
|
|
285
268
|
this.logger.trace('noise certificate chain verified');
|
|
286
269
|
}
|
|
287
270
|
this.serverStaticKey = serverStatic;
|
|
288
|
-
const encryptedClientStatic =
|
|
289
|
-
|
|
290
|
-
const encryptedPayload =
|
|
271
|
+
const encryptedClientStatic = handshake.encrypt(clientStaticKeyPair.pubKey);
|
|
272
|
+
handshake.mixIntoKey(await _crypto_1.X25519.scalarMult(clientStaticKeyPair.privKey, serverEphemeral));
|
|
273
|
+
const encryptedPayload = handshake.encrypt(payload);
|
|
291
274
|
const clientFinish = _proto_1.proto.HandshakeMessage.encode({
|
|
292
275
|
clientFinish: {
|
|
293
276
|
static: encryptedClientStatic,
|
|
@@ -350,6 +333,7 @@ class WaNoiseSession {
|
|
|
350
333
|
throw (0, primitives_1.toError)(error);
|
|
351
334
|
});
|
|
352
335
|
}
|
|
336
|
+
// eslint-disable-next-line @typescript-eslint/require-await
|
|
353
337
|
async decodeBufferedPostHandshakeFrames() {
|
|
354
338
|
if (!this.noiseSocket || this.handshakeInboxHead >= this.handshakeInbox.length) {
|
|
355
339
|
return;
|
|
@@ -360,11 +344,7 @@ class WaNoiseSession {
|
|
|
360
344
|
const start = this.handshakeInboxHead;
|
|
361
345
|
const frames = this.handshakeInbox.slice(start);
|
|
362
346
|
if (frames.length > 0) {
|
|
363
|
-
const
|
|
364
|
-
this.readChain = this.readChain
|
|
365
|
-
.then(() => decryptBatch)
|
|
366
|
-
.then(() => { }, () => { });
|
|
367
|
-
const decrypted = await decryptBatch;
|
|
347
|
+
const decrypted = this.decryptFramesBatch(this.noiseSocket, frames);
|
|
368
348
|
for (let i = 0; i < decrypted.length; i++) {
|
|
369
349
|
this.pendingDecryptedFrames.push(decrypted[i]);
|
|
370
350
|
}
|
|
@@ -1,25 +1,31 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.WaNoiseSocket = void 0;
|
|
4
|
-
const
|
|
4
|
+
const node_crypto_1 = require("node:crypto");
|
|
5
|
+
const _crypto_1 = require("../../crypto");
|
|
6
|
+
/**
|
|
7
|
+
* Post-handshake symmetric channel: applies AES-GCM with per-direction
|
|
8
|
+
* 12-byte nonces (counter in the trailing 4 bytes) using a per-instance
|
|
9
|
+
* scratch buffer to avoid allocations on the hot path.
|
|
10
|
+
*/
|
|
5
11
|
class WaNoiseSocket {
|
|
6
12
|
constructor(encryptKey, decryptKey) {
|
|
7
|
-
this.
|
|
8
|
-
this.
|
|
13
|
+
this.writeNonceScratch = new Uint8Array(12);
|
|
14
|
+
this.readNonceScratch = new Uint8Array(12);
|
|
15
|
+
this.encryptKey = (0, node_crypto_1.createSecretKey)(encryptKey);
|
|
16
|
+
this.decryptKey = (0, node_crypto_1.createSecretKey)(decryptKey);
|
|
9
17
|
this.writeCounter = 0;
|
|
10
18
|
this.readCounter = 0;
|
|
11
19
|
}
|
|
12
|
-
|
|
13
|
-
|
|
20
|
+
/** Encrypts an outgoing `frame` with the next write nonce; advances the write counter. */
|
|
21
|
+
encrypt(frame, additionalData) {
|
|
22
|
+
(0, _crypto_1.writeNonceCounter)(this.writeNonceScratch, this.writeCounter++);
|
|
23
|
+
return (0, _crypto_1.aesGcmEncrypt)(this.encryptKey, this.writeNonceScratch, frame, additionalData);
|
|
14
24
|
}
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
return (0, _crypto_1.buildNonce)(this.readCounter++);
|
|
20
|
-
}
|
|
21
|
-
decrypt(nonce, frame, additionalData) {
|
|
22
|
-
return (0, _crypto_1.aesGcmDecrypt)(this.decryptKey, nonce, frame, additionalData);
|
|
25
|
+
/** Decrypts an incoming `frame` with the next read nonce; advances the read counter. */
|
|
26
|
+
decrypt(frame, additionalData) {
|
|
27
|
+
(0, _crypto_1.writeNonceCounter)(this.readNonceScratch, this.readCounter++);
|
|
28
|
+
return (0, _crypto_1.aesGcmDecrypt)(this.decryptKey, this.readNonceScratch, frame, additionalData);
|
|
23
29
|
}
|
|
24
30
|
}
|
|
25
31
|
exports.WaNoiseSocket = WaNoiseSocket;
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.ROOT_CA_PUBLIC_KEY_HEX = exports.ROOT_CA_SERIAL = exports.NOISE_XX_FALLBACK_NAME = exports.NOISE_IK_NAME = exports.NOISE_XX_NAME = exports.WA_PROTO_HEADER =
|
|
3
|
+
exports.ROOT_CA_PUBLIC_KEY_HEX = exports.ROOT_CA_SERIAL = exports.NOISE_XX_FALLBACK_NAME = exports.NOISE_IK_NAME = exports.NOISE_XX_NAME = exports.WA_PROTO_HEADER = void 0;
|
|
4
4
|
const bytes_1 = require("../../util/bytes");
|
|
5
|
-
exports.DEFAULT_VERSION_BASE = '2.3000.1034748654';
|
|
6
5
|
exports.WA_PROTO_HEADER = new Uint8Array([87, 65, 6, 3]);
|
|
7
6
|
exports.NOISE_XX_NAME = bytes_1.TEXT_ENCODER.encode('Noise_XX_25519_AESGCM_SHA256\0\0\0\0');
|
|
8
7
|
exports.NOISE_IK_NAME = bytes_1.TEXT_ENCODER.encode('Noise_IK_25519_AESGCM_SHA256\0\0\0\0');
|
package/dist/transport/proxy.js
CHANGED
|
@@ -5,27 +5,32 @@ exports.isProxyAgent = isProxyAgent;
|
|
|
5
5
|
exports.isProxyTransport = isProxyTransport;
|
|
6
6
|
exports.toProxyDispatcher = toProxyDispatcher;
|
|
7
7
|
exports.toProxyAgent = toProxyAgent;
|
|
8
|
+
/** Type guard for an undici-style proxy dispatcher (has `dispatch` method). */
|
|
8
9
|
function isProxyDispatcher(value) {
|
|
9
10
|
return (typeof value === 'object' &&
|
|
10
11
|
value !== null &&
|
|
11
12
|
'dispatch' in value &&
|
|
12
13
|
typeof value.dispatch === 'function');
|
|
13
14
|
}
|
|
15
|
+
/** Type guard for a Node http.Agent-style proxy (has `addRequest` method). */
|
|
14
16
|
function isProxyAgent(value) {
|
|
15
17
|
return (typeof value === 'object' &&
|
|
16
18
|
value !== null &&
|
|
17
19
|
'addRequest' in value &&
|
|
18
20
|
typeof value.addRequest === 'function');
|
|
19
21
|
}
|
|
22
|
+
/** Type guard accepting either {@link isProxyDispatcher} or {@link isProxyAgent} shapes. */
|
|
20
23
|
function isProxyTransport(value) {
|
|
21
24
|
return isProxyDispatcher(value) || isProxyAgent(value);
|
|
22
25
|
}
|
|
26
|
+
/** Narrows `proxy` to {@link WaProxyDispatcher} or returns `undefined`. */
|
|
23
27
|
function toProxyDispatcher(proxy) {
|
|
24
28
|
if (!proxy || !isProxyDispatcher(proxy)) {
|
|
25
29
|
return undefined;
|
|
26
30
|
}
|
|
27
31
|
return proxy;
|
|
28
32
|
}
|
|
33
|
+
/** Narrows `proxy` to {@link WaProxyAgent} or returns `undefined`. */
|
|
29
34
|
function toProxyAgent(proxy) {
|
|
30
35
|
if (!proxy || !isProxyAgent(proxy)) {
|
|
31
36
|
return undefined;
|
|
@@ -7,7 +7,6 @@ const constants_1 = require("../../protocol/constants");
|
|
|
7
7
|
const helpers_1 = require("../node/helpers");
|
|
8
8
|
const bytes_1 = require("../../util/bytes");
|
|
9
9
|
const primitives_1 = require("../../util/primitives");
|
|
10
|
-
const DIGITS_ONLY_RE = /^\d+$/;
|
|
11
10
|
function parseStreamControlNode(node) {
|
|
12
11
|
if (node.tag === constants_1.WA_STREAM_SIGNALING.XML_STREAM_END_TAG) {
|
|
13
12
|
return { kind: 'xmlstreamend' };
|
|
@@ -21,12 +20,9 @@ function parseStreamControlNode(node) {
|
|
|
21
20
|
? { kind: 'stream_error_replaced' }
|
|
22
21
|
: { kind: 'stream_error_device_removed' };
|
|
23
22
|
}
|
|
24
|
-
const
|
|
25
|
-
if (
|
|
26
|
-
|
|
27
|
-
if (Number.isSafeInteger(code)) {
|
|
28
|
-
return { kind: 'stream_error_code', code };
|
|
29
|
-
}
|
|
23
|
+
const code = (0, primitives_1.parseOptionalInt)(node.attrs.code);
|
|
24
|
+
if (code !== undefined) {
|
|
25
|
+
return { kind: 'stream_error_code', code };
|
|
30
26
|
}
|
|
31
27
|
const ackNode = (0, helpers_1.findNodeChild)(node, constants_1.WA_STREAM_SIGNALING.ACK_TAG);
|
|
32
28
|
if (ackNode) {
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.fetchLatestWaWebVersion = fetchLatestWaWebVersion;
|
|
4
|
+
const proxy_1 = require("./proxy");
|
|
5
|
+
const primitives_1 = require("../util/primitives");
|
|
6
|
+
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';
|
|
7
|
+
const DEFAULT_TIMEOUT_MS = 10000;
|
|
8
|
+
const SW_JS_URL = 'https://web.whatsapp.com/sw.js';
|
|
9
|
+
const CLIENT_REVISION_PATTERN = /\\?"client_revision\\?":\s*(\d+)/;
|
|
10
|
+
/**
|
|
11
|
+
* Fetches the current WhatsApp Web `client_revision` from the public
|
|
12
|
+
* `sw.js` served by the WhatsApp Web frontend and assembles a
|
|
13
|
+
* `2.3000.x` version string suitable for `WaClientOptions.version`.
|
|
14
|
+
*
|
|
15
|
+
* Use this when the library's hardcoded default starts being rejected by
|
|
16
|
+
* the server with HTTP 405 / `failure_client_too_old`, and you need to
|
|
17
|
+
* refresh the version without waiting for a library bump.
|
|
18
|
+
*
|
|
19
|
+
* Network failures and parse errors throw; wrap in a `try`/`catch` and
|
|
20
|
+
* fall back to the hardcoded default.
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* const latest = await fetchLatestWaWebVersion()
|
|
24
|
+
* const client = new WaClient({ store, sessionId, version: latest.version })
|
|
25
|
+
*/
|
|
26
|
+
async function fetchLatestWaWebVersion(options = {}) {
|
|
27
|
+
const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
28
|
+
const dispatcher = (0, proxy_1.toProxyDispatcher)(options.proxy);
|
|
29
|
+
const fetchImpl = options.fetch ?? fetch;
|
|
30
|
+
const controller = new AbortController();
|
|
31
|
+
const timer = setTimeout(() => controller.abort(new Error(`fetch latest wa-web version timed out after ${timeoutMs}ms`)), timeoutMs);
|
|
32
|
+
timer.unref?.();
|
|
33
|
+
let onExternalAbort = null;
|
|
34
|
+
const externalSignal = options.signal;
|
|
35
|
+
if (externalSignal) {
|
|
36
|
+
if (externalSignal.aborted) {
|
|
37
|
+
controller.abort(externalSignal.reason);
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
onExternalAbort = () => controller.abort(externalSignal.reason);
|
|
41
|
+
externalSignal.addEventListener('abort', onExternalAbort, { once: true });
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
try {
|
|
45
|
+
const headers = {
|
|
46
|
+
'sec-fetch-site': 'none',
|
|
47
|
+
'user-agent': options.userAgent ?? DEFAULT_USER_AGENT
|
|
48
|
+
};
|
|
49
|
+
if (options.headers) {
|
|
50
|
+
for (const key in options.headers) {
|
|
51
|
+
headers[key.toLowerCase()] = options.headers[key];
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
const init = {
|
|
55
|
+
method: 'GET',
|
|
56
|
+
headers,
|
|
57
|
+
signal: controller.signal
|
|
58
|
+
};
|
|
59
|
+
if (dispatcher) {
|
|
60
|
+
// dispatcher is a non-standard undici-only extension to RequestInit
|
|
61
|
+
;
|
|
62
|
+
init.dispatcher = dispatcher;
|
|
63
|
+
}
|
|
64
|
+
let response;
|
|
65
|
+
try {
|
|
66
|
+
response = await fetchImpl(SW_JS_URL, init);
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
throw new Error(`failed to fetch sw.js: ${(0, primitives_1.toError)(error).message}`);
|
|
70
|
+
}
|
|
71
|
+
if (!response.ok) {
|
|
72
|
+
throw new Error(`failed to fetch sw.js: http ${response.status}`);
|
|
73
|
+
}
|
|
74
|
+
const body = await response.text();
|
|
75
|
+
const match = CLIENT_REVISION_PATTERN.exec(body);
|
|
76
|
+
if (!match?.[1]) {
|
|
77
|
+
throw new Error('client_revision not found in sw.js response');
|
|
78
|
+
}
|
|
79
|
+
const revision = Number.parseInt(match[1], 10);
|
|
80
|
+
if (!Number.isSafeInteger(revision) || revision <= 0) {
|
|
81
|
+
throw new Error(`invalid client_revision in sw.js: ${match[1]}`);
|
|
82
|
+
}
|
|
83
|
+
return {
|
|
84
|
+
version: `2.3000.${revision}`,
|
|
85
|
+
parts: [2, 3000, revision]
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
finally {
|
|
89
|
+
clearTimeout(timer);
|
|
90
|
+
if (externalSignal && onExternalAbort) {
|
|
91
|
+
externalSignal.removeEventListener('abort', onExternalAbort);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
@@ -10,6 +10,6 @@ export declare const APP_STATE_MAC_OCTET_LENGTH = 8;
|
|
|
10
10
|
export declare const APP_STATE_IV_LENGTH = 16;
|
|
11
11
|
export declare const APP_STATE_LT_HASH_SIZE = 128;
|
|
12
12
|
export declare const APP_STATE_POINT_SIZE = 2;
|
|
13
|
-
export declare const APP_STATE_EMPTY_LT_HASH: Uint8Array
|
|
13
|
+
export declare const APP_STATE_EMPTY_LT_HASH: Readonly<Uint8Array>;
|
|
14
14
|
export declare const APP_STATE_DEFAULT_COLLECTION_VERSION = 0;
|
|
15
15
|
export declare const APP_STATE_DEFAULT_COLLECTIONS: readonly AppStateCollectionName[];
|