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
|
@@ -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;
|
|
@@ -81,16 +80,16 @@ export class WaNoiseSession {
|
|
|
81
80
|
const verifyCertificates = config.verifyCertificateChain !== false;
|
|
82
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');
|
|
@@ -183,7 +167,6 @@ export class WaNoiseSession {
|
|
|
183
167
|
this.serverStaticKey = null;
|
|
184
168
|
this.trustedRootCa = undefined;
|
|
185
169
|
this.writeChain = Promise.resolve();
|
|
186
|
-
this.readChain = Promise.resolve();
|
|
187
170
|
}
|
|
188
171
|
getServerStaticKey() {
|
|
189
172
|
return this.serverStaticKey;
|
|
@@ -191,8 +174,8 @@ export class WaNoiseSession {
|
|
|
191
174
|
async fullHandshake(clientStaticKeyPair, ephemeralKeyPair, payload, protocolHeader, verifyCertificates) {
|
|
192
175
|
this.logger.trace('noise full handshake: send client hello');
|
|
193
176
|
const handshake = new WaNoiseHandshake();
|
|
194
|
-
|
|
195
|
-
|
|
177
|
+
handshake.start(NOISE_XX_NAME, protocolHeader);
|
|
178
|
+
handshake.authenticate(ephemeralKeyPair.pubKey);
|
|
196
179
|
const clientHello = proto.HandshakeMessage.encode({
|
|
197
180
|
clientHello: {
|
|
198
181
|
ephemeral: ephemeralKeyPair.pubKey
|
|
@@ -206,23 +189,23 @@ export class WaNoiseSession {
|
|
|
206
189
|
if (resumeResult.socket) {
|
|
207
190
|
return resumeResult.socket;
|
|
208
191
|
}
|
|
209
|
-
this.logger.
|
|
192
|
+
this.logger.debug('noise resume handshake fallback to XX');
|
|
210
193
|
return this.resumeHandshakeWithFallback(clientStaticKeyPair, ephemeralKeyPair, payload, protocolHeader, resumeResult.serverHelloFrame, verifyCertificates);
|
|
211
194
|
}
|
|
212
195
|
async tryResumeHandshakeWithIk(serverStaticKey, clientStaticKeyPair, ephemeralKeyPair, payload, protocolHeader) {
|
|
213
196
|
this.logger.trace('noise resume handshake: send IK client hello');
|
|
214
197
|
const handshake = new WaNoiseHandshake();
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
198
|
+
handshake.start(NOISE_IK_NAME, protocolHeader);
|
|
199
|
+
handshake.authenticate(serverStaticKey);
|
|
200
|
+
handshake.authenticate(ephemeralKeyPair.pubKey);
|
|
218
201
|
const [agreement1, agreement2] = await Promise.all([
|
|
219
202
|
X25519.scalarMult(ephemeralKeyPair.privKey, serverStaticKey),
|
|
220
203
|
X25519.scalarMult(clientStaticKeyPair.privKey, serverStaticKey)
|
|
221
204
|
]);
|
|
222
|
-
|
|
223
|
-
const encryptedClientStatic =
|
|
224
|
-
|
|
225
|
-
const encryptedPayload =
|
|
205
|
+
handshake.mixIntoKey(agreement1);
|
|
206
|
+
const encryptedClientStatic = handshake.encrypt(clientStaticKeyPair.pubKey);
|
|
207
|
+
handshake.mixIntoKey(agreement2);
|
|
208
|
+
const encryptedPayload = handshake.encrypt(payload);
|
|
226
209
|
const clientHello = proto.HandshakeMessage.encode({
|
|
227
210
|
clientHello: {
|
|
228
211
|
ephemeral: ephemeralKeyPair.pubKey,
|
|
@@ -246,22 +229,22 @@ export class WaNoiseSession {
|
|
|
246
229
|
throw new Error('noise resume handshake missing certificate payload');
|
|
247
230
|
}
|
|
248
231
|
const serverEphemeral = serverHello.ephemeral;
|
|
249
|
-
|
|
232
|
+
handshake.authenticate(serverEphemeral);
|
|
250
233
|
const [dh1, dh2] = await Promise.all([
|
|
251
234
|
X25519.scalarMult(ephemeralKeyPair.privKey, serverEphemeral),
|
|
252
235
|
X25519.scalarMult(clientStaticKeyPair.privKey, serverEphemeral)
|
|
253
236
|
]);
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
237
|
+
handshake.mixIntoKey(dh1);
|
|
238
|
+
handshake.mixIntoKey(dh2);
|
|
239
|
+
handshake.decrypt(serverHello.payload);
|
|
257
240
|
this.serverStaticKey = serverStaticKey;
|
|
258
|
-
this.logger.
|
|
259
|
-
return { socket:
|
|
241
|
+
this.logger.debug('noise resume handshake successful without fallback');
|
|
242
|
+
return { socket: handshake.finish(), serverHelloFrame: null };
|
|
260
243
|
}
|
|
261
244
|
async resumeHandshakeWithFallback(clientStaticKeyPair, ephemeralKeyPair, payload, protocolHeader, serverHelloFrame, verifyCertificates) {
|
|
262
245
|
const fallback = new WaNoiseHandshake();
|
|
263
|
-
|
|
264
|
-
|
|
246
|
+
fallback.start(NOISE_XX_FALLBACK_NAME, protocolHeader);
|
|
247
|
+
fallback.authenticate(ephemeralKeyPair.pubKey);
|
|
265
248
|
return this.continueFullHandshake(fallback, serverHelloFrame, clientStaticKeyPair, ephemeralKeyPair, payload, verifyCertificates);
|
|
266
249
|
}
|
|
267
250
|
async continueFullHandshake(handshake, serverHelloFrame, clientStaticKeyPair, ephemeralKeyPair, payload, verifyCertificates) {
|
|
@@ -272,19 +255,19 @@ export class WaNoiseSession {
|
|
|
272
255
|
throw new Error('noise full handshake missing server hello fields');
|
|
273
256
|
}
|
|
274
257
|
const serverEphemeral = serverHello.ephemeral;
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
const serverStatic =
|
|
278
|
-
|
|
279
|
-
const certificate =
|
|
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);
|
|
280
263
|
if (verifyCertificates) {
|
|
281
264
|
await verifyNoiseCertificateChain(certificate, serverStatic, this.trustedRootCa);
|
|
282
265
|
this.logger.trace('noise certificate chain verified');
|
|
283
266
|
}
|
|
284
267
|
this.serverStaticKey = serverStatic;
|
|
285
|
-
const encryptedClientStatic =
|
|
286
|
-
|
|
287
|
-
const encryptedPayload =
|
|
268
|
+
const encryptedClientStatic = handshake.encrypt(clientStaticKeyPair.pubKey);
|
|
269
|
+
handshake.mixIntoKey(await X25519.scalarMult(clientStaticKeyPair.privKey, serverEphemeral));
|
|
270
|
+
const encryptedPayload = handshake.encrypt(payload);
|
|
288
271
|
const clientFinish = proto.HandshakeMessage.encode({
|
|
289
272
|
clientFinish: {
|
|
290
273
|
static: encryptedClientStatic,
|
|
@@ -347,6 +330,7 @@ export class WaNoiseSession {
|
|
|
347
330
|
throw toError(error);
|
|
348
331
|
});
|
|
349
332
|
}
|
|
333
|
+
// eslint-disable-next-line @typescript-eslint/require-await
|
|
350
334
|
async decodeBufferedPostHandshakeFrames() {
|
|
351
335
|
if (!this.noiseSocket || this.handshakeInboxHead >= this.handshakeInbox.length) {
|
|
352
336
|
return;
|
|
@@ -357,11 +341,7 @@ export class WaNoiseSession {
|
|
|
357
341
|
const start = this.handshakeInboxHead;
|
|
358
342
|
const frames = this.handshakeInbox.slice(start);
|
|
359
343
|
if (frames.length > 0) {
|
|
360
|
-
const
|
|
361
|
-
this.readChain = this.readChain
|
|
362
|
-
.then(() => decryptBatch)
|
|
363
|
-
.then(() => { }, () => { });
|
|
364
|
-
const decrypted = await decryptBatch;
|
|
344
|
+
const decrypted = this.decryptFramesBatch(this.noiseSocket, frames);
|
|
365
345
|
for (let i = 0; i < decrypted.length; i++) {
|
|
366
346
|
this.pendingDecryptedFrames.push(decrypted[i]);
|
|
367
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
|
+
}
|
|
@@ -4,6 +4,17 @@ export function resolveCleanupIntervalMs(ttlMs, maxIntervalMs = 60000) {
|
|
|
4
4
|
}
|
|
5
5
|
return Math.min(maxIntervalMs, Math.floor(ttlMs / 2));
|
|
6
6
|
}
|
|
7
|
+
export function createPeriodicCleanup(ttlMs, run) {
|
|
8
|
+
const timer = setInterval(run, resolveCleanupIntervalMs(ttlMs));
|
|
9
|
+
timer.unref?.();
|
|
10
|
+
return {
|
|
11
|
+
destroy: () => clearInterval(timer)
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Returns a validated positive-safe-integer query limit, falling back to
|
|
16
|
+
* `defaultLimit` when `limit` is undefined. Throws on invalid input.
|
|
17
|
+
*/
|
|
7
18
|
export function normalizeQueryLimit(limit, defaultLimit) {
|
|
8
19
|
if (limit === undefined) {
|
|
9
20
|
return defaultLimit;
|
package/dist/esm/util/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export { bytesToHex, hexToBytes, toBytesView, uint8Equal } from './bytes.js';
|
|
1
|
+
export { base64ToBytes, bytesToBase64, bytesToBase64UrlSafe, bytesToHex, decodeBase64Url, hexToBytes, TEXT_DECODER, toBytesView, uint8Equal } from './bytes.js';
|
|
2
2
|
export { asBytes, asNumber, asOptionalBytes, asOptionalNumber, asOptionalString, asString, resolvePositive, toBoolOrUndef } from './coercion.js';
|
|
3
3
|
export { normalizeQueryLimit } from './collections.js';
|
|
4
|
-
export { toSafeNumber } from './primitives.js';
|
|
4
|
+
export { toError, toSafeNumber } from './primitives.js';
|
|
5
5
|
export { isBunRuntime } from './runtime.js';
|