zapo-js 0.3.0 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +97 -177
- package/dist/appstate/{WaAppStateCrypto.js → crypto/WaAppStateCrypto.js} +58 -49
- package/dist/appstate/index.js +7 -6
- package/dist/appstate/{encoding.js → parsers/encoding.js} +11 -4
- package/dist/appstate/{response-parser.js → parsers/response-parser.js} +20 -8
- package/dist/appstate/{WaAppStateSyncClient.js → sync/WaAppStateSyncClient.js} +174 -53
- package/dist/appstate/utils.js +16 -0
- package/dist/appstate-spec.js +89 -0
- package/dist/auth/WaAuthClient.js +100 -5
- package/dist/auth/credentials-flow.js +19 -7
- package/dist/auth/pairing/WaPairingFlow.js +33 -24
- package/dist/auth/pairing/pairing-code-crypto.js +16 -18
- package/dist/client/WaClient.js +342 -473
- package/dist/client/WaClientFactory.js +279 -78
- package/dist/client/connection/WaConnectionManager.js +28 -11
- package/dist/client/coordinators/WaAbPropsCoordinator.js +1 -2
- package/dist/client/coordinators/WaAppStateMutationCoordinator.js +663 -143
- package/dist/client/coordinators/WaBotCoordinator.js +345 -0
- package/dist/client/coordinators/WaBroadcastListCoordinator.js +20 -0
- package/dist/client/coordinators/WaBusinessCoordinator.js +81 -171
- package/dist/client/coordinators/WaEmailCoordinator.js +1 -0
- package/dist/client/coordinators/WaGroupCoordinator.js +529 -52
- package/dist/client/coordinators/WaIncomingNodeCoordinator.js +97 -12
- package/dist/client/coordinators/WaLowLevelCoordinator.js +41 -0
- package/dist/client/coordinators/WaMessageCoordinator.js +365 -0
- package/dist/client/coordinators/WaMessageDispatchCoordinator.js +682 -204
- package/dist/client/coordinators/WaNewsletterCoordinator.js +18 -0
- package/dist/client/coordinators/WaPassiveTasksCoordinator.js +17 -4
- package/dist/client/coordinators/WaPresenceCoordinator.js +21 -0
- package/dist/client/coordinators/WaPrivacyCoordinator.js +7 -5
- package/dist/client/coordinators/WaProfileCoordinator.js +220 -49
- package/dist/client/coordinators/WaRetryCoordinator.js +256 -125
- package/dist/client/coordinators/WaStatusCoordinator.js +49 -0
- package/dist/client/coordinators/WaStreamControlCoordinator.js +6 -6
- package/dist/client/coordinators/WaTrustedContactTokenCoordinator.js +7 -6
- package/dist/client/events/appstate-mutation.js +133 -0
- package/dist/client/events/business.js +375 -0
- package/dist/client/events/call.js +58 -0
- package/dist/client/events/chatstate.js +23 -0
- package/dist/client/events/devices.js +15 -16
- package/dist/client/{dirty.js → events/dirty.js} +33 -19
- package/dist/client/events/group.js +13 -24
- package/dist/client/events/identity.js +2 -1
- package/dist/client/events/incoming.js +502 -0
- package/dist/client/events/mex-notification.js +181 -0
- package/dist/client/events/picture.js +33 -0
- package/dist/client/events/presence.js +44 -0
- package/dist/client/events/receipt.js +26 -0
- package/dist/client/media.js +161 -4
- package/dist/client/messaging/fanout.js +9 -10
- package/dist/client/messaging/{participants.js → group-metadata.js} +73 -35
- package/dist/client/messaging/ignore-key.js +132 -0
- package/dist/client/messaging/key-protocol.js +3 -17
- package/dist/client/messaging/link-preview.js +159 -0
- package/dist/client/messaging/messages.js +671 -0
- package/dist/client/newsletter/admin.js +165 -0
- package/dist/client/newsletter/content.js +253 -0
- package/dist/client/newsletter/discovery.js +115 -0
- package/dist/client/newsletter/messaging.js +197 -0
- package/dist/client/newsletter/mex.js +41 -0
- package/dist/client/newsletter/parse.js +217 -0
- package/dist/client/persistence/WriteBehindPersistence.js +31 -4
- package/dist/client/{history-sync.js → persistence/history-sync.js} +125 -18
- package/dist/client/persistence/mailbox.js +104 -0
- package/dist/client/tokens/cs-token.js +11 -17
- package/dist/crypto/core/hkdf.js +12 -12
- package/dist/crypto/core/index.js +6 -8
- package/dist/crypto/core/keys.js +1 -8
- package/dist/crypto/core/nonce.js +12 -12
- package/dist/crypto/core/primitives.js +123 -93
- package/dist/crypto/core/random.js +6 -0
- package/dist/crypto/core/xeddsa.js +11 -9
- package/dist/crypto/curves/Ed25519.js +32 -21
- package/dist/crypto/curves/X25519.js +70 -34
- package/dist/crypto/curves/constants.js +2 -1
- package/dist/crypto/math/constants.js +1 -2
- package/dist/crypto/math/mod.js +0 -33
- package/dist/esm/appstate/{WaAppStateCrypto.js → crypto/WaAppStateCrypto.js} +58 -49
- package/dist/esm/appstate/index.js +5 -5
- package/dist/esm/appstate/{encoding.js → parsers/encoding.js} +11 -4
- package/dist/esm/appstate/{response-parser.js → parsers/response-parser.js} +20 -8
- package/dist/esm/appstate/{WaAppStateSyncClient.js → sync/WaAppStateSyncClient.js} +174 -52
- package/dist/esm/appstate/utils.js +16 -0
- package/dist/esm/appstate-spec.js +79 -0
- package/dist/esm/auth/WaAuthClient.js +100 -5
- package/dist/esm/auth/credentials-flow.js +18 -6
- package/dist/esm/auth/pairing/WaPairingFlow.js +34 -25
- package/dist/esm/auth/pairing/pairing-code-crypto.js +12 -14
- package/dist/esm/client/WaClient.js +345 -476
- package/dist/esm/client/WaClientFactory.js +280 -79
- package/dist/esm/client/connection/WaConnectionManager.js +28 -11
- package/dist/esm/client/coordinators/WaAbPropsCoordinator.js +2 -3
- package/dist/esm/client/coordinators/WaAppStateMutationCoordinator.js +665 -145
- package/dist/esm/client/coordinators/WaBotCoordinator.js +342 -0
- package/dist/esm/client/coordinators/WaBroadcastListCoordinator.js +17 -0
- package/dist/esm/client/coordinators/WaBusinessCoordinator.js +79 -169
- package/dist/esm/client/coordinators/WaEmailCoordinator.js +1 -0
- package/dist/esm/client/coordinators/WaGroupCoordinator.js +532 -55
- package/dist/esm/client/coordinators/WaIncomingNodeCoordinator.js +98 -13
- package/dist/esm/client/coordinators/WaLowLevelCoordinator.js +38 -0
- package/dist/esm/client/coordinators/WaMessageCoordinator.js +361 -0
- package/dist/esm/client/coordinators/WaMessageDispatchCoordinator.js +686 -208
- package/dist/esm/client/coordinators/WaNewsletterCoordinator.js +13 -0
- package/dist/esm/client/coordinators/WaPassiveTasksCoordinator.js +18 -5
- package/dist/esm/client/coordinators/WaPresenceCoordinator.js +18 -0
- package/dist/esm/client/coordinators/WaPrivacyCoordinator.js +7 -5
- package/dist/esm/client/coordinators/WaProfileCoordinator.js +223 -52
- package/dist/esm/client/coordinators/WaRetryCoordinator.js +258 -127
- package/dist/esm/client/coordinators/WaStatusCoordinator.js +46 -0
- package/dist/esm/client/coordinators/WaStreamControlCoordinator.js +6 -6
- package/dist/esm/client/coordinators/WaTrustedContactTokenCoordinator.js +7 -6
- package/dist/esm/client/events/appstate-mutation.js +130 -0
- package/dist/esm/client/events/business.js +370 -0
- package/dist/esm/client/events/call.js +55 -0
- package/dist/esm/client/events/chatstate.js +20 -0
- package/dist/esm/client/events/devices.js +15 -16
- package/dist/esm/client/{dirty.js → events/dirty.js} +33 -19
- package/dist/esm/client/events/group.js +14 -25
- package/dist/esm/client/events/identity.js +2 -1
- package/dist/esm/client/events/incoming.js +487 -0
- package/dist/esm/client/events/mex-notification.js +178 -0
- package/dist/esm/client/events/picture.js +30 -0
- package/dist/esm/client/events/presence.js +41 -0
- package/dist/esm/client/events/receipt.js +23 -0
- package/dist/esm/client/media.js +156 -6
- package/dist/esm/client/messaging/fanout.js +10 -11
- package/dist/esm/client/messaging/{participants.js → group-metadata.js} +72 -34
- package/dist/esm/client/messaging/ignore-key.js +126 -0
- package/dist/esm/client/messaging/key-protocol.js +3 -17
- package/dist/esm/client/messaging/link-preview.js +156 -0
- package/dist/esm/client/messaging/messages.js +667 -0
- package/dist/esm/client/newsletter/admin.js +162 -0
- package/dist/esm/client/newsletter/content.js +249 -0
- package/dist/esm/client/newsletter/discovery.js +112 -0
- package/dist/esm/client/newsletter/messaging.js +194 -0
- package/dist/esm/client/newsletter/mex.js +37 -0
- package/dist/esm/client/newsletter/parse.js +200 -0
- package/dist/esm/client/persistence/WriteBehindPersistence.js +31 -4
- package/dist/esm/client/{history-sync.js → persistence/history-sync.js} +124 -18
- package/dist/esm/client/persistence/mailbox.js +101 -0
- package/dist/esm/client/tokens/cs-token.js +12 -18
- package/dist/esm/crypto/core/hkdf.js +14 -14
- package/dist/esm/crypto/core/index.js +2 -2
- package/dist/esm/crypto/core/keys.js +1 -7
- package/dist/esm/crypto/core/nonce.js +11 -11
- package/dist/esm/crypto/core/primitives.js +121 -88
- package/dist/esm/crypto/core/random.js +6 -0
- package/dist/esm/crypto/core/xeddsa.js +11 -9
- package/dist/esm/crypto/curves/Ed25519.js +35 -24
- package/dist/esm/crypto/curves/X25519.js +72 -36
- package/dist/esm/crypto/curves/constants.js +1 -0
- package/dist/esm/crypto/math/constants.js +1 -2
- package/dist/esm/crypto/math/mod.js +0 -32
- package/dist/esm/index.js +7 -2
- package/dist/esm/infra/log/ConsoleLogger.js +30 -6
- package/dist/esm/infra/log/PinoLogger.js +64 -0
- package/dist/esm/infra/log/types.js +4 -2
- package/dist/esm/infra/perf/BackgroundQueue.js +55 -13
- package/dist/esm/media/constants.js +33 -2
- package/dist/esm/media/crypto/WaMediaCrypto.js +374 -0
- package/dist/esm/media/index.js +4 -3
- package/dist/esm/media/sticker/sticker-pack.js +133 -0
- package/dist/esm/media/{WaMediaTransferClient.js → transfer/WaMediaTransferClient.js} +37 -6
- package/dist/esm/media/{conn.js → transfer/conn.js} +10 -5
- package/dist/esm/message/WaMessageClient.js +46 -15
- package/dist/esm/message/addons/link-preview/builder.js +36 -0
- package/dist/esm/message/addons/link-preview/detect.js +55 -0
- package/dist/esm/message/addons/link-preview/fetcher.js +391 -0
- package/dist/esm/message/addons/link-preview/types.js +1 -0
- package/dist/esm/message/context-info.js +123 -0
- package/dist/esm/message/{addon-crypto.js → crypto/addon-crypto.js} +68 -10
- package/dist/esm/message/{icdc.js → crypto/icdc.js} +5 -7
- package/dist/esm/message/crypto/phash.js +133 -0
- package/dist/esm/message/{reporting-token.js → crypto/reporting-token.js} +6 -6
- package/dist/esm/message/{use-case-secret.js → crypto/use-case-secret.js} +20 -3
- package/dist/esm/message/{content.js → encode/content.js} +176 -7
- package/dist/esm/message/encode/media-payload.js +42 -0
- package/dist/esm/message/{padding.js → encode/padding.js} +9 -3
- package/dist/esm/message/index.js +2 -2
- package/dist/esm/message/kinds/bot.js +111 -0
- package/dist/esm/message/kinds/newsletter.js +244 -0
- package/dist/esm/message/kinds/sticker-pack.js +29 -0
- package/dist/esm/message/{ack.js → primitives/ack.js} +8 -1
- package/dist/esm/message/{incoming.js → primitives/incoming.js} +215 -31
- package/dist/esm/message/primitives/peer-data-operation.js +93 -0
- package/dist/esm/mex.js +1 -0
- package/dist/esm/protocol/abprops.js +10 -0
- package/dist/esm/protocol/appstate.js +6 -30
- package/dist/esm/protocol/auth.js +3 -2
- package/dist/esm/protocol/bot.js +77 -0
- package/dist/esm/protocol/browser.js +8 -0
- package/dist/esm/protocol/business.js +19 -0
- package/dist/esm/protocol/call.js +48 -0
- package/dist/esm/protocol/constants.js +8 -2
- package/dist/esm/protocol/defaults.js +3 -0
- package/dist/esm/protocol/index.js +1 -1
- package/dist/esm/protocol/jid.js +102 -5
- package/dist/esm/protocol/media.js +25 -12
- package/dist/esm/protocol/message.js +4 -1
- package/dist/esm/protocol/newsletter.js +61 -0
- package/dist/esm/protocol/nodes.js +22 -2
- package/dist/esm/protocol/notification.js +18 -2
- package/dist/esm/protocol/presence.js +13 -0
- package/dist/esm/protocol/status.js +6 -0
- package/dist/esm/retry/codec.js +5 -0
- package/dist/esm/retry/parse.js +20 -38
- package/dist/esm/retry/reason.js +5 -0
- package/dist/esm/retry/replay.js +131 -37
- package/dist/esm/retry/tracker.js +4 -8
- package/dist/esm/signal/api/SignalDeviceSyncApi.js +66 -19
- package/dist/esm/signal/api/SignalDigestSyncApi.js +7 -2
- package/dist/esm/signal/api/SignalIdentitySyncApi.js +9 -0
- package/dist/esm/signal/api/SignalMissingPreKeysSyncApi.js +24 -63
- package/dist/esm/signal/api/SignalRotateKeyApi.js +10 -0
- package/dist/esm/signal/api/SignalSessionSyncApi.js +23 -51
- package/dist/esm/signal/api/codec.js +52 -1
- package/dist/esm/signal/api/prekeys.js +4 -0
- package/dist/esm/signal/{crypto → attestation}/WaAdvSignature.js +5 -6
- package/dist/esm/signal/constants.js +3 -0
- package/dist/esm/signal/encoding.js +6 -289
- package/dist/esm/signal/group/SenderKeyChain.js +18 -33
- package/dist/esm/signal/group/SenderKeyManager.js +25 -8
- package/dist/esm/signal/group/encoding.js +96 -0
- package/dist/esm/signal/index.js +4 -1
- package/dist/esm/signal/registration/encoding.js +34 -0
- package/dist/esm/signal/registration/keygen.js +10 -0
- package/dist/esm/signal/registration/utils.js +6 -0
- package/dist/esm/signal/session/SignalProtocol.js +113 -11
- package/dist/esm/signal/session/SignalRatchet.js +29 -58
- package/dist/esm/signal/session/SignalSession.js +7 -14
- package/dist/esm/signal/session/encoding.js +173 -0
- package/dist/esm/signal/session/resolver.js +139 -30
- package/dist/esm/store/cache/identity.cache.js +75 -0
- package/dist/esm/store/cache/privacy-token.cache.js +57 -0
- package/dist/esm/store/cache/sender-key.cache.js +101 -0
- package/dist/esm/store/cache/session.cache.js +92 -0
- package/dist/esm/store/contracts/group-metadata.store.js +1 -0
- package/dist/esm/store/createStore.js +91 -37
- package/dist/esm/store/index.js +15 -14
- package/dist/esm/store/locks/contact.lock.js +1 -0
- package/dist/esm/store/locks/device-list.lock.js +1 -0
- package/dist/esm/store/locks/group-metadata.lock.js +20 -0
- package/dist/esm/store/{providers/memory → memory}/appstate.store.js +5 -5
- package/dist/esm/store/memory/auth.store.js +24 -0
- package/dist/esm/store/memory/contact.store.js +79 -0
- package/dist/esm/store/memory/device-list.store.js +103 -0
- package/dist/esm/store/{providers/memory/participants.store.js → memory/group-metadata.store.js} +22 -13
- package/dist/esm/store/{providers/memory → memory}/identity.store.js +3 -3
- package/dist/esm/store/{providers/memory → memory}/message-secret.store.js +17 -8
- package/dist/esm/store/{providers/memory → memory}/message.store.js +2 -2
- package/dist/esm/store/{providers/memory → memory}/pre-key.store.js +2 -2
- package/dist/esm/store/{providers/memory → memory}/privacy-token.store.js +1 -1
- package/dist/esm/store/{providers/memory → memory}/retry.store.js +28 -7
- package/dist/esm/store/{providers/memory → memory}/sender-key.store.js +3 -3
- package/dist/esm/store/{providers/memory → memory}/session.store.js +3 -3
- package/dist/esm/store/{providers/memory → memory}/thread.store.js +2 -2
- package/dist/esm/store/noop.store.js +6 -4
- package/dist/esm/transport/WaComms.js +14 -5
- package/dist/esm/transport/WaWebSocket.js +32 -8
- package/dist/esm/transport/binary/constants.js +10 -4
- package/dist/esm/transport/binary/decoder.js +21 -15
- package/dist/esm/transport/binary/encoder.js +96 -21
- package/dist/esm/transport/binary/tokens.js +12 -12
- package/dist/esm/transport/index.js +1 -0
- package/dist/esm/transport/keepalive/WaKeepAlive.js +18 -4
- package/dist/esm/transport/node/WaMobileTcpSocket.js +6 -0
- package/dist/esm/transport/node/WaNodeOrchestrator.js +9 -5
- package/dist/esm/transport/node/WaNodeTransport.js +13 -0
- package/dist/esm/transport/node/builders/abprops.js +2 -2
- package/dist/esm/transport/node/builders/account-sync.js +7 -15
- package/dist/esm/transport/node/builders/bot.js +38 -0
- package/dist/esm/transport/node/builders/business.js +30 -30
- package/dist/esm/transport/node/builders/chatstate.js +28 -0
- package/dist/esm/transport/node/builders/community.js +53 -0
- package/dist/esm/transport/node/builders/device.js +2 -2
- package/dist/esm/transport/node/builders/email.js +6 -5
- package/dist/esm/transport/node/builders/global.js +1 -1
- package/dist/esm/transport/node/builders/group.js +114 -4
- package/dist/esm/transport/node/builders/media.js +2 -2
- package/dist/esm/transport/node/builders/message.js +83 -49
- package/dist/esm/transport/node/builders/newsletter.js +176 -0
- package/dist/esm/transport/node/builders/passive.js +7 -0
- package/dist/esm/transport/node/builders/prekeys.js +4 -4
- package/dist/esm/transport/node/builders/presence.js +27 -1
- package/dist/esm/transport/node/builders/privacy-token.js +2 -2
- package/dist/esm/transport/node/builders/privacy.js +6 -6
- package/dist/esm/transport/node/builders/profile.js +28 -8
- package/dist/esm/transport/node/builders/tos.js +58 -0
- package/dist/esm/transport/node/builders/usync.js +51 -2
- package/dist/esm/transport/node/helpers.js +3 -1
- package/dist/esm/transport/node/mex/argo-decoder.js +2 -2
- package/dist/esm/transport/node/mex/client.js +22 -0
- package/dist/esm/transport/node/query.js +17 -0
- package/dist/esm/transport/node/usync.js +12 -0
- package/dist/esm/transport/noise/WaClientPayload.js +8 -8
- package/dist/esm/transport/noise/WaMobileClientPayload.js +5 -0
- package/dist/esm/transport/noise/WaNoiseCert.js +5 -0
- package/dist/esm/transport/noise/WaNoiseHandshake.js +27 -25
- package/dist/esm/transport/noise/WaNoiseSession.js +39 -59
- package/dist/esm/transport/noise/WaNoiseSocket.js +19 -13
- package/dist/esm/transport/noise/constants.js +0 -1
- package/dist/esm/transport/proxy.js +5 -0
- package/dist/esm/transport/stream/parse.js +3 -7
- package/dist/esm/transport/wa-web-version-fetcher.js +91 -0
- package/dist/esm/util/async.js +4 -0
- package/dist/esm/util/bytes.js +37 -2
- package/dist/esm/util/clock.js +15 -0
- package/dist/esm/util/coercion.js +45 -3
- package/dist/esm/util/collections.js +11 -0
- package/dist/esm/util/index.js +2 -2
- package/dist/esm/util/primitives.js +19 -0
- package/dist/esm/util/runtime.js +5 -0
- package/dist/esm/version-spec.js +1 -0
- package/dist/index.js +31 -1
- package/dist/infra/log/ConsoleLogger.js +30 -6
- package/dist/infra/log/PinoLogger.js +64 -0
- package/dist/infra/log/types.js +4 -2
- package/dist/infra/perf/BackgroundQueue.js +55 -13
- package/dist/media/constants.js +34 -3
- package/dist/media/crypto/WaMediaCrypto.js +378 -0
- package/dist/media/index.js +9 -4
- package/dist/media/sticker/sticker-pack.js +136 -0
- package/dist/media/{WaMediaTransferClient.js → transfer/WaMediaTransferClient.js} +37 -6
- package/dist/media/{conn.js → transfer/conn.js} +10 -5
- package/dist/message/WaMessageClient.js +46 -15
- package/dist/message/addons/link-preview/builder.js +39 -0
- package/dist/message/addons/link-preview/detect.js +58 -0
- package/dist/message/addons/link-preview/fetcher.js +394 -0
- package/dist/message/addons/link-preview/types.js +2 -0
- package/dist/message/context-info.js +129 -0
- package/dist/message/{addon-crypto.js → crypto/addon-crypto.js} +68 -10
- package/dist/message/{icdc.js → crypto/icdc.js} +5 -7
- package/dist/message/crypto/phash.js +136 -0
- package/dist/message/{reporting-token.js → crypto/reporting-token.js} +6 -6
- package/dist/message/{use-case-secret.js → crypto/use-case-secret.js} +20 -3
- package/dist/message/{content.js → encode/content.js} +192 -7
- package/dist/message/encode/media-payload.js +45 -0
- package/dist/message/{padding.js → encode/padding.js} +9 -3
- package/dist/message/index.js +2 -2
- package/dist/message/kinds/bot.js +120 -0
- package/dist/message/kinds/newsletter.js +248 -0
- package/dist/message/kinds/sticker-pack.js +34 -0
- package/dist/message/{ack.js → primitives/ack.js} +8 -1
- package/dist/message/{incoming.js → primitives/incoming.js} +216 -31
- package/dist/message/primitives/peer-data-operation.js +96 -0
- package/dist/mex.js +6 -0
- package/dist/proto.js +1 -1
- package/dist/protocol/abprops.js +10 -0
- package/dist/protocol/appstate.js +7 -31
- package/dist/protocol/auth.js +3 -2
- package/dist/protocol/bot.js +81 -0
- package/dist/protocol/browser.js +8 -0
- package/dist/protocol/business.js +22 -0
- package/dist/protocol/call.js +51 -0
- package/dist/protocol/constants.js +39 -3
- package/dist/protocol/defaults.js +3 -0
- package/dist/protocol/index.js +12 -3
- package/dist/protocol/jid.js +107 -5
- package/dist/protocol/media.js +25 -12
- package/dist/protocol/message.js +4 -1
- package/dist/protocol/newsletter.js +64 -0
- package/dist/protocol/nodes.js +22 -2
- package/dist/protocol/notification.js +19 -3
- package/dist/protocol/presence.js +16 -0
- package/dist/protocol/status.js +9 -0
- package/dist/retry/codec.js +5 -0
- package/dist/retry/parse.js +16 -34
- package/dist/retry/reason.js +5 -0
- package/dist/retry/replay.js +129 -35
- package/dist/retry/tracker.js +3 -7
- package/dist/signal/api/SignalDeviceSyncApi.js +64 -17
- package/dist/signal/api/SignalDigestSyncApi.js +6 -1
- package/dist/signal/api/SignalIdentitySyncApi.js +9 -0
- package/dist/signal/api/SignalMissingPreKeysSyncApi.js +21 -60
- package/dist/signal/api/SignalRotateKeyApi.js +10 -0
- package/dist/signal/api/SignalSessionSyncApi.js +20 -48
- package/dist/signal/api/codec.js +52 -0
- package/dist/signal/api/prekeys.js +4 -0
- package/dist/signal/{crypto → attestation}/WaAdvSignature.js +5 -7
- package/dist/signal/constants.js +4 -1
- package/dist/signal/encoding.js +5 -303
- package/dist/signal/group/SenderKeyChain.js +17 -32
- package/dist/signal/group/SenderKeyManager.js +24 -7
- package/dist/signal/group/encoding.js +101 -0
- package/dist/signal/index.js +13 -10
- package/dist/signal/registration/encoding.js +39 -0
- package/dist/signal/registration/keygen.js +10 -0
- package/dist/signal/registration/utils.js +6 -0
- package/dist/signal/session/SignalProtocol.js +112 -10
- package/dist/signal/session/SignalRatchet.js +24 -54
- package/dist/signal/session/SignalSession.js +6 -14
- package/dist/signal/session/encoding.js +183 -0
- package/dist/signal/session/resolver.js +139 -30
- package/dist/store/cache/identity.cache.js +78 -0
- package/dist/store/cache/privacy-token.cache.js +60 -0
- package/dist/store/cache/sender-key.cache.js +104 -0
- package/dist/store/cache/session.cache.js +95 -0
- package/dist/store/contracts/group-metadata.store.js +2 -0
- package/dist/store/createStore.js +90 -36
- package/dist/store/index.js +18 -16
- package/dist/store/locks/contact.lock.js +1 -0
- package/dist/store/locks/device-list.lock.js +1 -0
- package/dist/store/locks/group-metadata.lock.js +23 -0
- package/dist/store/{providers/memory → memory}/appstate.store.js +5 -5
- package/dist/store/memory/auth.store.js +28 -0
- package/dist/store/memory/contact.store.js +83 -0
- package/dist/store/memory/device-list.store.js +107 -0
- package/dist/store/{providers/memory/participants.store.js → memory/group-metadata.store.js} +24 -15
- package/dist/store/{providers/memory → memory}/identity.store.js +3 -3
- package/dist/store/{providers/memory → memory}/message-secret.store.js +17 -8
- package/dist/store/{providers/memory → memory}/message.store.js +2 -2
- package/dist/store/{providers/memory → memory}/pre-key.store.js +2 -2
- package/dist/store/{providers/memory → memory}/privacy-token.store.js +1 -1
- package/dist/store/{providers/memory → memory}/retry.store.js +28 -7
- package/dist/store/{providers/memory → memory}/sender-key.store.js +3 -3
- package/dist/store/{providers/memory → memory}/session.store.js +3 -3
- package/dist/store/{providers/memory → memory}/thread.store.js +2 -2
- package/dist/store/noop.store.js +7 -5
- package/dist/transport/WaComms.js +14 -5
- package/dist/transport/WaWebSocket.js +32 -8
- package/dist/transport/binary/constants.js +11 -5
- package/dist/transport/binary/decoder.js +24 -18
- package/dist/transport/binary/encoder.js +109 -34
- package/dist/transport/binary/tokens.js +12 -12
- package/dist/transport/index.js +3 -1
- package/dist/transport/keepalive/WaKeepAlive.js +18 -4
- package/dist/transport/node/WaMobileTcpSocket.js +6 -0
- package/dist/transport/node/WaNodeOrchestrator.js +9 -5
- package/dist/transport/node/WaNodeTransport.js +13 -0
- package/dist/transport/node/builders/abprops.js +1 -1
- package/dist/transport/node/builders/account-sync.js +7 -16
- package/dist/transport/node/builders/bot.js +43 -0
- package/dist/transport/node/builders/business.js +31 -31
- package/dist/transport/node/builders/chatstate.js +31 -0
- package/dist/transport/node/builders/community.js +59 -0
- package/dist/transport/node/builders/device.js +1 -1
- package/dist/transport/node/builders/email.js +6 -5
- package/dist/transport/node/builders/global.js +1 -1
- package/dist/transport/node/builders/group.js +121 -3
- package/dist/transport/node/builders/media.js +1 -1
- package/dist/transport/node/builders/message.js +84 -49
- package/dist/transport/node/builders/newsletter.js +183 -0
- package/dist/transport/node/builders/passive.js +10 -0
- package/dist/transport/node/builders/prekeys.js +3 -3
- package/dist/transport/node/builders/presence.js +28 -1
- package/dist/transport/node/builders/privacy-token.js +1 -1
- package/dist/transport/node/builders/privacy.js +5 -5
- package/dist/transport/node/builders/profile.js +30 -7
- package/dist/transport/node/builders/tos.js +63 -0
- package/dist/transport/node/builders/usync.js +52 -1
- package/dist/transport/node/helpers.js +2 -1
- package/dist/transport/node/mex/argo-decoder.js +2 -2
- package/dist/transport/node/mex/client.js +23 -0
- package/dist/transport/node/query.js +17 -0
- package/dist/transport/node/usync.js +13 -0
- package/dist/transport/noise/WaClientPayload.js +8 -8
- package/dist/transport/noise/WaMobileClientPayload.js +5 -0
- package/dist/transport/noise/WaNoiseCert.js +5 -0
- package/dist/transport/noise/WaNoiseHandshake.js +25 -23
- package/dist/transport/noise/WaNoiseSession.js +39 -59
- package/dist/transport/noise/WaNoiseSocket.js +18 -12
- package/dist/transport/noise/constants.js +1 -2
- package/dist/transport/proxy.js +5 -0
- package/dist/transport/stream/parse.js +3 -7
- package/dist/transport/wa-web-version-fetcher.js +94 -0
- package/dist/types/appstate/constants.d.ts +1 -1
- package/dist/types/appstate/{WaAppStateCrypto.d.ts → crypto/WaAppStateCrypto.d.ts} +26 -9
- package/dist/types/appstate/index.d.ts +5 -5
- package/dist/types/appstate/{encoding.d.ts → parsers/encoding.d.ts} +8 -1
- package/dist/types/appstate/{response-parser.d.ts → parsers/response-parser.d.ts} +13 -3
- package/dist/types/appstate/sync/WaAppStateSyncClient.d.ts +105 -0
- package/dist/types/appstate/utils.d.ts +17 -1
- package/dist/types/appstate-spec.d.ts +24 -0
- package/dist/types/auth/WaAuthClient.d.ts +89 -3
- package/dist/types/auth/credentials-flow.d.ts +4 -3
- package/dist/types/auth/pairing/pairing-code-crypto.d.ts +0 -1
- package/dist/types/auth/types.d.ts +48 -1
- package/dist/types/client/WaClient.d.ts +178 -71
- package/dist/types/client/WaClientFactory.d.ts +30 -5
- package/dist/types/client/connection/WaConnectionManager.d.ts +4 -2
- package/dist/types/client/connection/WaReceiptQueue.d.ts +1 -1
- package/dist/types/client/coordinators/WaAppStateMutationCoordinator.d.ts +215 -5
- package/dist/types/client/coordinators/WaBotCoordinator.d.ts +117 -0
- package/dist/types/client/coordinators/WaBroadcastListCoordinator.d.ts +39 -0
- package/dist/types/client/coordinators/WaBusinessCoordinator.d.ts +44 -43
- package/dist/types/client/coordinators/WaEmailCoordinator.d.ts +16 -0
- package/dist/types/client/coordinators/WaGroupCoordinator.d.ts +311 -9
- package/dist/types/client/coordinators/WaIncomingNodeCoordinator.d.ts +11 -4
- package/dist/types/client/coordinators/WaLowLevelCoordinator.d.ts +47 -0
- package/dist/types/client/coordinators/WaMessageCoordinator.d.ts +232 -0
- package/dist/types/client/coordinators/WaMessageDispatchCoordinator.d.ts +54 -31
- package/dist/types/client/coordinators/WaNewsletterCoordinator.d.ts +13 -0
- package/dist/types/client/coordinators/WaPassiveTasksCoordinator.d.ts +4 -3
- package/dist/types/client/coordinators/WaPresenceCoordinator.d.ts +27 -0
- package/dist/types/client/coordinators/WaPrivacyCoordinator.d.ts +27 -0
- package/dist/types/client/coordinators/WaProfileCoordinator.d.ts +113 -0
- package/dist/types/client/coordinators/WaRetryCoordinator.d.ts +19 -17
- package/dist/types/client/coordinators/WaStatusCoordinator.d.ts +42 -0
- package/dist/types/client/coordinators/WaTrustedContactTokenCoordinator.d.ts +5 -1
- package/dist/types/client/events/abprops.d.ts +2 -1
- package/dist/types/client/events/appstate-mutation.d.ts +3 -0
- package/dist/types/client/events/business.d.ts +10 -0
- package/dist/types/client/events/call.d.ts +31 -0
- package/dist/types/client/events/chatstate.d.ts +9 -0
- package/dist/types/client/events/devices.d.ts +5 -4
- package/dist/types/client/{dirty.d.ts → events/dirty.d.ts} +4 -3
- package/dist/types/client/events/group.d.ts +2 -1
- package/dist/types/client/events/identity.d.ts +2 -1
- package/dist/types/client/{incoming.d.ts → events/incoming.d.ts} +27 -4
- package/dist/types/client/events/mex-notification.d.ts +6 -0
- package/dist/types/client/events/picture.d.ts +8 -0
- package/dist/types/client/events/presence.d.ts +28 -0
- package/dist/types/client/events/receipt.d.ts +14 -0
- package/dist/types/client/events/registration.d.ts +4 -3
- package/dist/types/client/index.d.ts +1 -1
- package/dist/types/client/media.d.ts +35 -1
- package/dist/types/client/messaging/fanout.d.ts +2 -2
- package/dist/types/client/messaging/group-metadata.d.ts +19 -0
- package/dist/types/client/messaging/ignore-key.d.ts +11 -0
- package/dist/types/client/messaging/key-protocol.d.ts +9 -7
- package/dist/types/client/messaging/link-preview.d.ts +19 -0
- package/dist/types/client/messaging/messages.d.ts +28 -0
- package/dist/types/client/newsletter/admin.d.ts +71 -0
- package/dist/types/client/newsletter/content.d.ts +42 -0
- package/dist/types/client/newsletter/discovery.d.ts +33 -0
- package/dist/types/client/newsletter/messaging.d.ts +66 -0
- package/dist/types/client/newsletter/mex.d.ts +14 -0
- package/dist/types/client/newsletter/parse.d.ts +19 -0
- package/dist/types/client/newsletter/types.d.ts +190 -0
- package/dist/types/client/persistence/WriteBehindPersistence.d.ts +12 -1
- package/dist/types/client/persistence/history-sync.d.ts +29 -0
- package/dist/types/client/{mailbox.d.ts → persistence/mailbox.d.ts} +4 -4
- package/dist/types/client/tokens/cs-token.d.ts +1 -3
- package/dist/types/client/types.d.ts +843 -71
- package/dist/types/crypto/core/hkdf.d.ts +10 -2
- package/dist/types/crypto/core/index.d.ts +2 -2
- package/dist/types/crypto/core/keys.d.ts +0 -4
- package/dist/types/crypto/core/nonce.d.ts +4 -5
- package/dist/types/crypto/core/primitives.d.ts +31 -20
- package/dist/types/crypto/core/random.d.ts +6 -0
- package/dist/types/crypto/core/xeddsa.d.ts +9 -0
- package/dist/types/crypto/curves/Ed25519.d.ts +7 -1
- package/dist/types/crypto/curves/X25519.d.ts +20 -1
- package/dist/types/crypto/curves/constants.d.ts +4 -3
- package/dist/types/crypto/curves/types.d.ts +0 -5
- package/dist/types/crypto/math/constants.d.ts +0 -1
- package/dist/types/crypto/math/mod.d.ts +0 -1
- package/dist/types/index.d.ts +32 -6
- package/dist/types/infra/log/ConsoleLogger.d.ts +18 -1
- package/dist/types/infra/log/PinoLogger.d.ts +55 -1
- package/dist/types/infra/log/types.d.ts +6 -0
- package/dist/types/infra/perf/BackgroundQueue.d.ts +19 -0
- package/dist/types/media/constants.d.ts +7 -2
- package/dist/types/media/crypto/WaMediaCrypto.d.ts +59 -0
- package/dist/types/media/index.d.ts +7 -5
- package/dist/types/media/processor.d.ts +27 -5
- package/dist/types/media/sticker/sticker-pack.d.ts +6 -0
- package/dist/types/media/{WaMediaTransferClient.d.ts → transfer/WaMediaTransferClient.d.ts} +30 -1
- package/dist/types/media/transfer/conn.d.ts +7 -0
- package/dist/types/media/types.d.ts +1 -2
- package/dist/types/message/WaMessageClient.d.ts +14 -0
- package/dist/types/message/addons/link-preview/builder.d.ts +13 -0
- package/dist/types/message/addons/link-preview/detect.d.ts +5 -0
- package/dist/types/message/addons/link-preview/fetcher.d.ts +13 -0
- package/dist/types/message/addons/link-preview/types.d.ts +51 -0
- package/dist/types/message/context-info.d.ts +66 -0
- package/dist/types/message/{addon-crypto.d.ts → crypto/addon-crypto.d.ts} +27 -5
- package/dist/types/message/{icdc.d.ts → crypto/icdc.d.ts} +4 -4
- package/dist/types/message/{phash.d.ts → crypto/phash.d.ts} +1 -1
- package/dist/types/message/{reporting-token.d.ts → crypto/reporting-token.d.ts} +2 -2
- package/dist/types/message/{use-case-secret.d.ts → crypto/use-case-secret.d.ts} +17 -1
- package/dist/types/message/encode/content.d.ts +43 -0
- package/dist/types/message/{device-sent.d.ts → encode/device-sent.d.ts} +1 -1
- package/dist/types/message/encode/media-payload.d.ts +12 -0
- package/dist/types/message/index.d.ts +2 -2
- package/dist/types/message/kinds/bot.d.ts +31 -0
- package/dist/types/message/kinds/newsletter.d.ts +12 -0
- package/dist/types/message/kinds/sticker-pack.d.ts +6 -0
- package/dist/types/message/{ack.d.ts → primitives/ack.d.ts} +1 -1
- package/dist/types/message/primitives/incoming.d.ts +21 -0
- package/dist/types/message/primitives/peer-data-operation.d.ts +23 -0
- package/dist/types/message/types.d.ts +208 -10
- package/dist/types/mex.d.ts +2 -0
- package/dist/types/proto.d.ts +2 -2
- package/dist/types/protocol/abprops.d.ts +9 -0
- package/dist/types/protocol/appstate.d.ts +4 -49
- package/dist/types/protocol/auth.d.ts +2 -2
- package/dist/types/protocol/bot.d.ts +45 -0
- package/dist/types/protocol/browser.d.ts +8 -0
- package/dist/types/protocol/business.d.ts +21 -0
- package/dist/types/protocol/call.d.ts +44 -0
- package/dist/types/protocol/constants.d.ts +16 -3
- package/dist/types/protocol/defaults.d.ts +3 -0
- package/dist/types/protocol/group.d.ts +1 -1
- package/dist/types/protocol/index.d.ts +2 -1
- package/dist/types/protocol/jid.d.ts +78 -0
- package/dist/types/protocol/media.d.ts +21 -13
- package/dist/types/protocol/message.d.ts +4 -0
- package/dist/types/protocol/newsletter.d.ts +65 -0
- package/dist/types/protocol/nodes.d.ts +20 -0
- package/dist/types/protocol/notification.d.ts +16 -0
- package/dist/types/protocol/presence.d.ts +16 -0
- package/dist/types/protocol/status.d.ts +7 -0
- package/dist/types/retry/codec.d.ts +5 -0
- package/dist/types/retry/index.d.ts +1 -1
- package/dist/types/retry/parse.d.ts +9 -0
- package/dist/types/retry/reason.d.ts +5 -0
- package/dist/types/retry/replay.d.ts +19 -5
- package/dist/types/retry/tracker.d.ts +10 -3
- package/dist/types/retry/types.d.ts +3 -8
- package/dist/types/signal/api/SignalDeviceSyncApi.d.ts +20 -0
- package/dist/types/signal/api/SignalDigestSyncApi.d.ts +10 -0
- package/dist/types/signal/api/SignalIdentitySyncApi.d.ts +9 -0
- package/dist/types/signal/api/SignalMissingPreKeysSyncApi.d.ts +8 -0
- package/dist/types/signal/api/SignalRotateKeyApi.d.ts +10 -0
- package/dist/types/signal/api/SignalSessionSyncApi.d.ts +13 -0
- package/dist/types/signal/api/codec.d.ts +20 -0
- package/dist/types/signal/api/constants.d.ts +1 -1
- package/dist/types/signal/api/prekeys.d.ts +4 -0
- package/dist/types/signal/{crypto → attestation}/WaAdvSignature.d.ts +2 -2
- package/dist/types/signal/attestation/constants.d.ts +4 -0
- package/dist/types/signal/constants.d.ts +7 -4
- package/dist/types/signal/encoding.d.ts +6 -68
- package/dist/types/signal/group/SenderKeyChain.d.ts +1 -1
- package/dist/types/signal/group/SenderKeyManager.d.ts +17 -0
- package/dist/types/signal/group/encoding.d.ts +25 -0
- package/dist/types/signal/index.d.ts +4 -1
- package/dist/types/signal/registration/encoding.d.ts +30 -0
- package/dist/types/signal/registration/keygen.d.ts +10 -0
- package/dist/types/signal/registration/utils.d.ts +5 -0
- package/dist/types/signal/session/SignalProtocol.d.ts +55 -0
- package/dist/types/signal/session/SignalRatchet.d.ts +2 -3
- package/dist/types/signal/session/SignalSession.d.ts +0 -1
- package/dist/types/signal/session/encoding.d.ts +28 -0
- package/dist/types/signal/session/resolver.d.ts +14 -0
- package/dist/types/store/cache/identity.cache.d.ts +15 -0
- package/dist/types/store/cache/privacy-token.cache.d.ts +15 -0
- package/dist/types/store/cache/sender-key.cache.d.ts +18 -0
- package/dist/types/store/cache/session.cache.d.ts +23 -0
- package/dist/types/store/contracts/contact.store.d.ts +14 -0
- package/dist/types/store/contracts/device-list.store.d.ts +13 -0
- package/dist/types/store/contracts/group-metadata.store.d.ts +14 -0
- package/dist/types/store/contracts/message.store.d.ts +0 -2
- package/dist/types/store/createStore.d.ts +54 -2
- package/dist/types/store/index.d.ts +17 -16
- package/dist/types/store/locks/group-metadata.lock.d.ts +2 -0
- package/dist/types/store/{providers/memory → memory}/appstate.store.d.ts +2 -2
- package/dist/types/store/memory/auth.store.d.ts +18 -0
- package/dist/types/store/{providers/memory → memory}/contact.store.d.ts +6 -1
- package/dist/types/store/{providers/memory → memory}/device-list.store.d.ts +15 -2
- package/dist/types/store/memory/group-metadata.store.d.ts +27 -0
- package/dist/types/store/{providers/memory → memory}/identity.store.d.ts +2 -2
- package/dist/types/store/{providers/memory → memory}/message-secret.store.d.ts +12 -2
- package/dist/types/store/{providers/memory → memory}/message.store.d.ts +1 -1
- package/dist/types/store/{providers/memory → memory}/pre-key.store.d.ts +2 -2
- package/dist/types/store/{providers/memory → memory}/privacy-token.store.d.ts +1 -1
- package/dist/types/store/{providers/memory → memory}/retry.store.d.ts +16 -3
- package/dist/types/store/{providers/memory → memory}/sender-key.store.d.ts +2 -2
- package/dist/types/store/{providers/memory → memory}/session.store.d.ts +2 -2
- package/dist/types/store/{providers/memory → memory}/signal.store.d.ts +2 -2
- package/dist/types/store/{providers/memory → memory}/thread.store.d.ts +1 -1
- package/dist/types/store/noop.store.d.ts +2 -2
- package/dist/types/store/types.d.ts +250 -6
- package/dist/types/transport/WaComms.d.ts +5 -0
- package/dist/types/transport/WaWebSocket.d.ts +5 -0
- package/dist/types/transport/binary/constants.d.ts +8 -2
- package/dist/types/transport/binary/decoder.d.ts +5 -0
- package/dist/types/transport/binary/encoder.d.ts +5 -0
- package/dist/types/transport/binary/tokens.d.ts +6 -6
- package/dist/types/transport/index.d.ts +3 -1
- package/dist/types/transport/keepalive/WaKeepAlive.d.ts +7 -0
- package/dist/types/transport/node/WaMobileTcpSocket.d.ts +6 -0
- package/dist/types/transport/node/WaNodeOrchestrator.d.ts +5 -0
- package/dist/types/transport/node/WaNodeTransport.d.ts +13 -0
- package/dist/types/transport/node/builders/account-sync.d.ts +1 -2
- package/dist/types/transport/node/builders/bot.d.ts +4 -0
- package/dist/types/transport/node/builders/business.d.ts +21 -4
- package/dist/types/transport/node/builders/chatstate.d.ts +11 -0
- package/dist/types/transport/node/builders/community.d.ts +17 -0
- package/dist/types/transport/node/builders/group.d.ts +44 -2
- package/dist/types/transport/node/builders/message.d.ts +11 -6
- package/dist/types/transport/node/builders/newsletter.d.ts +73 -0
- package/dist/types/transport/node/builders/passive.d.ts +3 -0
- package/dist/types/transport/node/builders/presence.d.ts +8 -1
- package/dist/types/transport/node/builders/profile.d.ts +3 -0
- package/dist/types/transport/node/builders/tos.d.ts +12 -0
- package/dist/types/transport/node/builders/usync.d.ts +16 -0
- package/dist/types/transport/node/helpers.d.ts +1 -2
- package/dist/types/transport/node/mex/client.d.ts +12 -1
- package/dist/types/transport/node/query.d.ts +19 -1
- package/dist/types/transport/node/usync.d.ts +3 -0
- package/dist/types/transport/noise/WaMobileClientPayload.d.ts +5 -0
- package/dist/types/transport/noise/WaNoiseCert.d.ts +5 -0
- package/dist/types/transport/noise/WaNoiseHandshake.d.ts +12 -6
- package/dist/types/transport/noise/WaNoiseSession.d.ts +0 -1
- package/dist/types/transport/noise/WaNoiseSocket.d.ts +12 -6
- package/dist/types/transport/noise/constants.d.ts +4 -5
- package/dist/types/transport/proxy.d.ts +5 -0
- package/dist/types/transport/types.d.ts +14 -7
- package/dist/types/transport/wa-web-version-fetcher.d.ts +44 -0
- package/dist/types/util/async.d.ts +4 -0
- package/dist/types/util/bytes.d.ts +36 -1
- package/dist/types/util/clock.d.ts +6 -0
- package/dist/types/util/coercion.d.ts +25 -0
- package/dist/types/util/collections.d.ts +8 -0
- package/dist/types/util/index.d.ts +2 -2
- package/dist/types/util/primitives.d.ts +11 -0
- package/dist/types/util/runtime.d.ts +5 -0
- package/dist/types/version-spec.d.ts +1 -0
- package/dist/util/async.js +4 -0
- package/dist/util/bytes.js +37 -2
- package/dist/util/clock.js +18 -0
- package/dist/util/coercion.js +48 -3
- package/dist/util/collections.js +12 -0
- package/dist/util/index.js +7 -1
- package/dist/util/primitives.js +20 -0
- package/dist/util/runtime.js +5 -0
- package/dist/version-spec.js +5 -0
- package/package.json +32 -8
- package/spec/appstate/index.d.ts +188 -0
- package/spec/appstate/index.js +850 -0
- package/spec/mex/index.d.ts +4172 -0
- package/spec/mex/index.js +261 -0
- package/spec/proto/index.d.ts +16305 -0
- package/spec/proto/index.js +1 -0
- package/spec/version/index.d.ts +4 -0
- package/spec/version/index.js +9 -0
- package/spec/version/version.json +3 -0
- package/dist/client/events/chat.js +0 -227
- package/dist/client/incoming.js +0 -306
- package/dist/client/mailbox.js +0 -66
- package/dist/client/messages.js +0 -305
- package/dist/esm/client/events/chat.js +0 -224
- package/dist/esm/client/incoming.js +0 -296
- package/dist/esm/client/mailbox.js +0 -63
- package/dist/esm/client/messages.js +0 -301
- package/dist/esm/media/WaMediaCrypto.js +0 -499
- package/dist/esm/message/phash.js +0 -47
- package/dist/esm/store/locks/participants.lock.js +0 -20
- package/dist/esm/store/providers/memory/contact.store.js +0 -28
- package/dist/esm/store/providers/memory/device-list.store.js +0 -67
- package/dist/esm/transport/node/mex/persist-ids.js +0 -10
- package/dist/media/WaMediaCrypto.js +0 -503
- package/dist/message/phash.js +0 -50
- package/dist/store/locks/participants.lock.js +0 -23
- package/dist/store/providers/memory/contact.store.js +0 -32
- package/dist/store/providers/memory/device-list.store.js +0 -71
- package/dist/transport/node/mex/persist-ids.js +0 -13
- package/dist/types/appstate/WaAppStateSyncClient.d.ts +0 -70
- package/dist/types/client/events/chat.d.ts +0 -3
- package/dist/types/client/history-sync.d.ts +0 -20
- package/dist/types/client/messages.d.ts +0 -18
- package/dist/types/client/messaging/participants.d.ts +0 -13
- package/dist/types/media/WaMediaCrypto.d.ts +0 -22
- package/dist/types/media/conn.d.ts +0 -3
- package/dist/types/message/content.d.ts +0 -14
- package/dist/types/message/incoming.d.ts +0 -18
- package/dist/types/signal/crypto/constants.d.ts +0 -4
- package/dist/types/store/contracts/participants.store.d.ts +0 -13
- package/dist/types/store/locks/participants.lock.d.ts +0 -2
- package/dist/types/store/providers/memory/participants.store.d.ts +0 -17
- package/dist/types/transport/node/mex/persist-ids.d.ts +0 -14
- package/proto/index.d.ts +0 -10903
- package/proto/index.js +0 -1
- /package/dist/{store/contracts/participants.store.js → client/newsletter/types.js} +0 -0
- /package/dist/esm/{store/contracts/participants.store.js → client/newsletter/types.js} +0 -0
- /package/dist/esm/message/{device-sent.js → encode/device-sent.js} +0 -0
- /package/dist/esm/signal/{crypto → attestation}/constants.js +0 -0
- /package/dist/esm/store/{providers/memory → memory}/signal.store.js +0 -0
- /package/dist/message/{device-sent.js → encode/device-sent.js} +0 -0
- /package/dist/signal/{crypto → attestation}/constants.js +0 -0
- /package/dist/store/{providers/memory → memory}/signal.store.js +0 -0
- /package/dist/types/message/{padding.d.ts → encode/padding.d.ts} +0 -0
|
@@ -1,10 +1,14 @@
|
|
|
1
1
|
import { PromiseDedup } from '../../infra/perf/PromiseDedup.js';
|
|
2
2
|
import { WA_DEFAULTS, WA_NODE_TAGS, WA_USYNC_CONTEXTS } from '../../protocol/constants.js';
|
|
3
3
|
import { buildDeviceJid, isHostedDeviceId, splitJid, toUserJid } from '../../protocol/jid.js';
|
|
4
|
-
import { buildUsyncIq } from '../../transport/node/builders/usync.js';
|
|
4
|
+
import { buildUsyncIq, iterateUsyncUsers, parseUsyncResultEnvelope } from '../../transport/node/builders/usync.js';
|
|
5
5
|
import { findNodeChild, getNodeChildrenByTag } from '../../transport/node/helpers.js';
|
|
6
6
|
import { assertIqResult } from '../../transport/node/query.js';
|
|
7
|
-
import { createUsyncSidGenerator } from '../../transport/node/usync.js';
|
|
7
|
+
import { createUsyncSidGenerator, logUsyncProtocolErrors } from '../../transport/node/usync.js';
|
|
8
|
+
/**
|
|
9
|
+
* Resolves the device list and LID mapping for a set of users via the `usync`
|
|
10
|
+
* protocol. Concurrent calls for the same JIDs are deduplicated.
|
|
11
|
+
*/
|
|
8
12
|
export class SignalDeviceSyncApi {
|
|
9
13
|
constructor(options) {
|
|
10
14
|
this.syncDedup = new PromiseDedup();
|
|
@@ -16,6 +20,10 @@ export class SignalDeviceSyncApi {
|
|
|
16
20
|
this.hostDomain = options.hostDomain ?? WA_DEFAULTS.HOST_DOMAIN;
|
|
17
21
|
this.generateSid = options.generateSid ?? createUsyncSidGenerator();
|
|
18
22
|
}
|
|
23
|
+
/**
|
|
24
|
+
* Refreshes the device list for every JID in `userJids`. Returns the
|
|
25
|
+
* resolved per-user device JIDs (matches the on-store snapshot).
|
|
26
|
+
*/
|
|
19
27
|
syncDeviceList(userJids, timeoutMs = this.defaultTimeoutMs) {
|
|
20
28
|
const normalizedUsers = this.normalizeUsers(userJids);
|
|
21
29
|
if (normalizedUsers.length === 0) {
|
|
@@ -84,6 +92,10 @@ export class SignalDeviceSyncApi {
|
|
|
84
92
|
});
|
|
85
93
|
return merged;
|
|
86
94
|
}
|
|
95
|
+
/**
|
|
96
|
+
* Looks up LIDs for a list of phone JIDs via a `lid` usync query. Returns
|
|
97
|
+
* one entry per input JID with `exists` indicating server-side presence.
|
|
98
|
+
*/
|
|
87
99
|
async queryLidsByPhoneJids(phoneJids, timeoutMs = this.defaultTimeoutMs) {
|
|
88
100
|
const normalizedPhoneJids = this.normalizeUsers(phoneJids);
|
|
89
101
|
if (normalizedPhoneJids.length === 0) {
|
|
@@ -125,8 +137,51 @@ export class SignalDeviceSyncApi {
|
|
|
125
137
|
users: result.length,
|
|
126
138
|
found
|
|
127
139
|
});
|
|
140
|
+
await this.propagateAltUserJids(result);
|
|
128
141
|
return result;
|
|
129
142
|
}
|
|
143
|
+
/**
|
|
144
|
+
* Enriches existing device-list snapshots with the resolved LID equivalents
|
|
145
|
+
* so {@link WaDeviceListStore.findByAnyUserJid} can later match a retry
|
|
146
|
+
* receipt arriving in LID form against an eligible list stored in PN form
|
|
147
|
+
* (and vice versa). Skips users with no cached snapshot — the alt gets
|
|
148
|
+
* recorded on the next {@link syncDeviceList} sweep.
|
|
149
|
+
*/
|
|
150
|
+
async propagateAltUserJids(results) {
|
|
151
|
+
if (!this.deviceListStore || results.length === 0)
|
|
152
|
+
return;
|
|
153
|
+
const nowMs = Date.now();
|
|
154
|
+
const lidByPhoneJid = new Map();
|
|
155
|
+
const phoneJids = [];
|
|
156
|
+
for (const entry of results) {
|
|
157
|
+
if (entry.lidJid && entry.phoneJid) {
|
|
158
|
+
lidByPhoneJid.set(entry.phoneJid, entry.lidJid);
|
|
159
|
+
phoneJids.push(entry.phoneJid);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
if (phoneJids.length === 0)
|
|
163
|
+
return;
|
|
164
|
+
const existing = await this.deviceListStore.getUserDevicesBatch(phoneJids, nowMs);
|
|
165
|
+
const updates = [];
|
|
166
|
+
for (let index = 0; index < phoneJids.length; index += 1) {
|
|
167
|
+
const snapshot = existing[index];
|
|
168
|
+
if (!snapshot)
|
|
169
|
+
continue;
|
|
170
|
+
const phoneJid = phoneJids[index];
|
|
171
|
+
const lidJid = lidByPhoneJid.get(phoneJid);
|
|
172
|
+
if (!lidJid || snapshot.altUserJid === lidJid)
|
|
173
|
+
continue;
|
|
174
|
+
updates.push({
|
|
175
|
+
userJid: snapshot.userJid,
|
|
176
|
+
altUserJid: lidJid,
|
|
177
|
+
deviceJids: snapshot.deviceJids,
|
|
178
|
+
updatedAtMs: nowMs
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
if (updates.length > 0) {
|
|
182
|
+
await this.deviceListStore.upsertUserDevicesBatch(updates);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
130
185
|
async collectUsersToQuery(normalizedUsers, nowMs, cachedByUser, store) {
|
|
131
186
|
const records = await store.getUserDevicesBatch(normalizedUsers, nowMs);
|
|
132
187
|
const usersToQuery = new Array(normalizedUsers.length);
|
|
@@ -200,16 +255,12 @@ export class SignalDeviceSyncApi {
|
|
|
200
255
|
}
|
|
201
256
|
parseDeviceSyncResponse(node, requestedUsers) {
|
|
202
257
|
assertIqResult(node, 'signal device sync');
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
const listNode = findNodeChild(usyncNode, WA_NODE_TAGS.LIST);
|
|
208
|
-
if (!listNode) {
|
|
209
|
-
throw new Error('signal device sync response missing list node');
|
|
258
|
+
logUsyncProtocolErrors(parseUsyncResultEnvelope(node), this.logger, 'signal.deviceSync');
|
|
259
|
+
const userNodes = iterateUsyncUsers(node);
|
|
260
|
+
if (!userNodes) {
|
|
261
|
+
throw new Error('signal device sync response missing usync envelope');
|
|
210
262
|
}
|
|
211
263
|
const requestedSet = new Set(requestedUsers);
|
|
212
|
-
const userNodes = getNodeChildrenByTag(listNode, WA_NODE_TAGS.USER);
|
|
213
264
|
const parsed = new Array(userNodes.length);
|
|
214
265
|
let parsedCount = 0;
|
|
215
266
|
for (let index = 0; index < userNodes.length; index += 1) {
|
|
@@ -233,16 +284,12 @@ export class SignalDeviceSyncApi {
|
|
|
233
284
|
}
|
|
234
285
|
parseLidSyncResponse(node, requestedUsers) {
|
|
235
286
|
assertIqResult(node, 'signal lid sync');
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
const listNode = findNodeChild(usyncNode, WA_NODE_TAGS.LIST);
|
|
241
|
-
if (!listNode) {
|
|
242
|
-
throw new Error('signal lid sync response missing list node');
|
|
287
|
+
logUsyncProtocolErrors(parseUsyncResultEnvelope(node), this.logger, 'signal.lidSync');
|
|
288
|
+
const userNodes = iterateUsyncUsers(node);
|
|
289
|
+
if (!userNodes) {
|
|
290
|
+
throw new Error('signal lid sync response missing usync envelope');
|
|
243
291
|
}
|
|
244
292
|
const requestedSet = new Set(requestedUsers);
|
|
245
|
-
const userNodes = getNodeChildrenByTag(listNode, WA_NODE_TAGS.USER);
|
|
246
293
|
const parsed = new Array(userNodes.length);
|
|
247
294
|
let parsedCount = 0;
|
|
248
295
|
for (let index = 0; index < userNodes.length; index += 1) {
|
|
@@ -332,7 +379,7 @@ export class SignalDeviceSyncApi {
|
|
|
332
379
|
? rawUserJid.slice(rawAtIndex + 1)
|
|
333
380
|
: parsedNormalizedUser.server;
|
|
334
381
|
const dedup = new Set();
|
|
335
|
-
for (const deviceNode of getNodeChildrenByTag(deviceListNode,
|
|
382
|
+
for (const deviceNode of getNodeChildrenByTag(deviceListNode, WA_NODE_TAGS.DEVICE)) {
|
|
336
383
|
const parsedId = deviceNode.attrs.id
|
|
337
384
|
? Number.parseInt(deviceNode.attrs.id, 10)
|
|
338
385
|
: Number.NaN;
|
|
@@ -5,7 +5,12 @@ import { decodeExactLength, parseUint } from '../api/codec.js';
|
|
|
5
5
|
import { SIGNAL_KEY_BUNDLE_TYPE_BYTES, SIGNAL_KEY_BUNDLE_TYPE_LENGTH, SIGNAL_KEY_DATA_LENGTH, SIGNAL_KEY_ID_LENGTH, SIGNAL_REGISTRATION_ID_LENGTH, SIGNAL_SIGNATURE_LENGTH } from '../api/constants.js';
|
|
6
6
|
import { decodeNodeContentBase64OrBytes, findNodeChild, getNodeChildren } from '../../transport/node/helpers.js';
|
|
7
7
|
import { parseIqError } from '../../transport/node/query.js';
|
|
8
|
-
import {
|
|
8
|
+
import { uint8Equal } from '../../util/bytes.js';
|
|
9
|
+
/**
|
|
10
|
+
* Validates the local Signal key bundle (identity, signed prekey, one-time
|
|
11
|
+
* prekey ids) against the server-side digest. Used to detect drift after a
|
|
12
|
+
* crash or partial sync and decide whether to re-upload.
|
|
13
|
+
*/
|
|
9
14
|
export class SignalDigestSyncApi {
|
|
10
15
|
constructor(options) {
|
|
11
16
|
this.logger = options.logger;
|
|
@@ -120,7 +125,7 @@ export class SignalDigestSyncApi {
|
|
|
120
125
|
}
|
|
121
126
|
bytesToHash.push(toRawPubKey(preKey.keyPair.pubKey));
|
|
122
127
|
}
|
|
123
|
-
const localHash =
|
|
128
|
+
const localHash = sha1(bytesToHash).subarray(0, digest.hash.byteLength);
|
|
124
129
|
if (!uint8Equal(localHash, digest.hash)) {
|
|
125
130
|
return {
|
|
126
131
|
valid: false,
|
|
@@ -6,6 +6,11 @@ import { decodeExactLength, parseUint } from '../api/codec.js';
|
|
|
6
6
|
import { SIGNAL_KEY_BUNDLE_TYPE_LENGTH, SIGNAL_KEY_DATA_LENGTH } from '../api/constants.js';
|
|
7
7
|
import { findNodeChild, getNodeChildrenByTag } from '../../transport/node/helpers.js';
|
|
8
8
|
import { assertIqResult } from '../../transport/node/query.js';
|
|
9
|
+
/**
|
|
10
|
+
* Fetches identity keys for a list of JIDs from the server and persists them
|
|
11
|
+
* into the identity store. Concurrent calls for the same JID set are
|
|
12
|
+
* deduplicated.
|
|
13
|
+
*/
|
|
9
14
|
export class SignalIdentitySyncApi {
|
|
10
15
|
constructor(options) {
|
|
11
16
|
this.syncDedup = new PromiseDedup();
|
|
@@ -16,6 +21,10 @@ export class SignalIdentitySyncApi {
|
|
|
16
21
|
options.defaultTimeoutMs ?? WA_DEFAULTS.SIGNAL_FETCH_KEY_BUNDLES_TIMEOUT_MS;
|
|
17
22
|
this.hostDomain = options.hostDomain ?? WA_DEFAULTS.HOST_DOMAIN;
|
|
18
23
|
}
|
|
24
|
+
/**
|
|
25
|
+
* Fetches and persists identity keys for `targetJids`. Returns one entry
|
|
26
|
+
* per JID the server resolved; missing/erroring users are skipped.
|
|
27
|
+
*/
|
|
19
28
|
syncIdentityKeys(targetJids, timeoutMs = this.defaultTimeoutMs) {
|
|
20
29
|
const dedupKey = `${timeoutMs}:${targetJids.join(',')}`;
|
|
21
30
|
return this.syncDedup.run(dedupKey, () => this.syncIdentityKeysInternal(targetJids, timeoutMs));
|
|
@@ -1,14 +1,18 @@
|
|
|
1
1
|
import { WA_DEFAULTS, WA_NODE_TAGS } from '../../protocol/constants.js';
|
|
2
2
|
import { splitJid, toUserJid } from '../../protocol/jid.js';
|
|
3
|
-
import { decodeExactLength, parseUint } from '../api/codec.js';
|
|
4
|
-
import {
|
|
3
|
+
import { decodeExactLength, parseSignalKeyBundleFromNode, parseUint } from '../api/codec.js';
|
|
4
|
+
import { SIGNAL_REGISTRATION_ID_LENGTH } from '../api/constants.js';
|
|
5
5
|
import { buildMissingPreKeysFetchIq } from '../api/prekeys.js';
|
|
6
6
|
import { registerParsedResultByRawAndCanonicalKey } from '../api/result-map.js';
|
|
7
|
-
import {
|
|
7
|
+
import { findNodeChild, getNodeChildrenByTag } from '../../transport/node/helpers.js';
|
|
8
8
|
import { assertIqResult } from '../../transport/node/query.js';
|
|
9
9
|
function isMissingPreKeysUserResultPreferred(result) {
|
|
10
10
|
return 'devices' in result;
|
|
11
11
|
}
|
|
12
|
+
/**
|
|
13
|
+
* Fetches missing prekey bundles for specific (user, device, registration id)
|
|
14
|
+
* triples – used during message encryption when a Signal session is missing.
|
|
15
|
+
*/
|
|
12
16
|
export class SignalMissingPreKeysSyncApi {
|
|
13
17
|
constructor(options) {
|
|
14
18
|
this.logger = options.logger;
|
|
@@ -16,6 +20,10 @@ export class SignalMissingPreKeysSyncApi {
|
|
|
16
20
|
this.defaultTimeoutMs =
|
|
17
21
|
options.defaultTimeoutMs ?? WA_DEFAULTS.SIGNAL_FETCH_KEY_BUNDLES_TIMEOUT_MS;
|
|
18
22
|
}
|
|
23
|
+
/**
|
|
24
|
+
* Fetches prekey bundles for the requested `targets` in a single IQ.
|
|
25
|
+
* Returns either a per-device bundle list or an error envelope per user.
|
|
26
|
+
*/
|
|
19
27
|
async fetchMissingPreKeys(targets, timeoutMs = this.defaultTimeoutMs) {
|
|
20
28
|
if (targets.length === 0) {
|
|
21
29
|
return [];
|
|
@@ -91,69 +99,22 @@ export class SignalMissingPreKeysSyncApi {
|
|
|
91
99
|
if (!Number.isSafeInteger(deviceId) || deviceId < 0) {
|
|
92
100
|
throw new Error(`missing prekeys device[${index}].id is invalid`);
|
|
93
101
|
}
|
|
94
|
-
const
|
|
95
|
-
|
|
96
|
-
WA_NODE_TAGS.IDENTITY,
|
|
97
|
-
WA_NODE_TAGS.SKEY,
|
|
98
|
-
WA_NODE_TAGS.KEY,
|
|
99
|
-
WA_NODE_TAGS.DEVICE_IDENTITY
|
|
100
|
-
]);
|
|
101
|
-
if (!registrationNode || !identityNode || !signedKeyNode) {
|
|
102
|
+
const registrationNode = findNodeChild(deviceNode, WA_NODE_TAGS.REGISTRATION);
|
|
103
|
+
if (!registrationNode) {
|
|
102
104
|
throw new Error(`missing prekeys device payload is incomplete for ${userJid}`);
|
|
103
105
|
}
|
|
104
|
-
const
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
}
|
|
112
|
-
let oneTimeIdNode;
|
|
113
|
-
let oneTimeValueNode;
|
|
114
|
-
if (oneTimeNode) {
|
|
115
|
-
const oneTimeNodes = findNodeChildrenByTags(oneTimeNode, [
|
|
116
|
-
WA_NODE_TAGS.ID,
|
|
117
|
-
WA_NODE_TAGS.VALUE
|
|
118
|
-
]);
|
|
119
|
-
oneTimeIdNode = oneTimeNodes[0];
|
|
120
|
-
oneTimeValueNode = oneTimeNodes[1];
|
|
121
|
-
}
|
|
122
|
-
if (oneTimeNode && (!oneTimeIdNode || !oneTimeValueNode)) {
|
|
123
|
-
throw new Error(`missing prekeys one-time key is incomplete for ${userJid}`);
|
|
124
|
-
}
|
|
125
|
-
const baseBundle = {
|
|
126
|
-
regId: parseUint(decodeExactLength(registrationNode.content, 'missing prekeys device registration', SIGNAL_REGISTRATION_ID_LENGTH), 'missing prekeys device registration'),
|
|
127
|
-
identity: decodeExactLength(identityNode.content, 'missing prekeys device identity', SIGNAL_KEY_DATA_LENGTH),
|
|
128
|
-
signedKey: {
|
|
129
|
-
id: parseUint(decodeExactLength(signedKeyIdNode.content, 'missing prekeys device skey.id', SIGNAL_KEY_ID_LENGTH), 'missing prekeys device skey.id'),
|
|
130
|
-
publicKey: decodeExactLength(signedKeyValueNode.content, 'missing prekeys device skey.value', SIGNAL_KEY_DATA_LENGTH),
|
|
131
|
-
signature: decodeExactLength(signedKeySignatureNode.content, 'missing prekeys device skey.signature', SIGNAL_SIGNATURE_LENGTH)
|
|
132
|
-
}
|
|
106
|
+
const regId = parseUint(decodeExactLength(registrationNode.content, 'missing prekeys device registration', SIGNAL_REGISTRATION_ID_LENGTH), 'missing prekeys device registration');
|
|
107
|
+
const parsed = parseSignalKeyBundleFromNode(deviceNode, 'missing prekeys device');
|
|
108
|
+
const bundle = {
|
|
109
|
+
regId,
|
|
110
|
+
identity: parsed.identity,
|
|
111
|
+
signedKey: parsed.signedKey,
|
|
112
|
+
...(parsed.oneTimeKey ? { oneTimeKey: parsed.oneTimeKey } : {})
|
|
133
113
|
};
|
|
134
|
-
const
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
id: parseUint(decodeExactLength(oneTimeIdNode.content, 'missing prekeys device key.id', SIGNAL_KEY_ID_LENGTH), 'missing prekeys device key.id'),
|
|
139
|
-
publicKey: decodeExactLength(oneTimeValueNode.content, 'missing prekeys device key.value', SIGNAL_KEY_DATA_LENGTH)
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
: baseBundle;
|
|
143
|
-
let deviceIdentity;
|
|
144
|
-
if (deviceIdentityNode) {
|
|
145
|
-
deviceIdentity = decodeNodeContentBase64OrBytes(deviceIdentityNode.content, 'missing prekeys device device-identity');
|
|
146
|
-
}
|
|
147
|
-
bundles[index] = deviceIdentity
|
|
148
|
-
? {
|
|
149
|
-
deviceJid: deviceId === 0 ? userJid : `${user}:${deviceId}@${server}`,
|
|
150
|
-
bundle,
|
|
151
|
-
deviceIdentity
|
|
152
|
-
}
|
|
153
|
-
: {
|
|
154
|
-
deviceJid: deviceId === 0 ? userJid : `${user}:${deviceId}@${server}`,
|
|
155
|
-
bundle
|
|
156
|
-
};
|
|
114
|
+
const deviceJid = deviceId === 0 ? userJid : `${user}:${deviceId}@${server}`;
|
|
115
|
+
bundles[index] = parsed.deviceIdentity
|
|
116
|
+
? { deviceJid, bundle, deviceIdentity: parsed.deviceIdentity }
|
|
117
|
+
: { deviceJid, bundle };
|
|
157
118
|
}
|
|
158
119
|
return bundles;
|
|
159
120
|
}
|
|
@@ -2,6 +2,11 @@ import { WA_DEFAULTS, WA_IQ_TYPES, WA_NODE_TAGS } from '../../protocol/constants
|
|
|
2
2
|
import { buildSignedPreKeyRotateIq } from '../api/prekeys.js';
|
|
3
3
|
import { generateSignedPreKey } from '../registration/keygen.js';
|
|
4
4
|
import { parseIqError } from '../../transport/node/query.js';
|
|
5
|
+
/**
|
|
6
|
+
* Generates a fresh signed prekey and uploads it to the server. Handles the
|
|
7
|
+
* `406`/`409`/`5xx` error codes by signaling whether a digest re-validation
|
|
8
|
+
* is required.
|
|
9
|
+
*/
|
|
5
10
|
export class SignalRotateKeyApi {
|
|
6
11
|
constructor(options) {
|
|
7
12
|
this.logger = options.logger;
|
|
@@ -9,6 +14,11 @@ export class SignalRotateKeyApi {
|
|
|
9
14
|
this.signalStore = options.signalStore;
|
|
10
15
|
this.defaultTimeoutMs = options.defaultTimeoutMs ?? WA_DEFAULTS.IQ_TIMEOUT_MS;
|
|
11
16
|
}
|
|
17
|
+
/**
|
|
18
|
+
* Rotates the signed prekey by generating a new one (next key id) and
|
|
19
|
+
* uploading it. Returns `shouldDigestKey: true` when the caller should
|
|
20
|
+
* re-run a digest validation after the rotation.
|
|
21
|
+
*/
|
|
12
22
|
async rotateSignedPreKey(timeoutMs = this.defaultTimeoutMs) {
|
|
13
23
|
const [registrationInfo, currentSignedPreKey] = await Promise.all([
|
|
14
24
|
this.signalStore.getRegistrationInfo(),
|
|
@@ -1,13 +1,18 @@
|
|
|
1
1
|
import { WA_DEFAULTS, WA_IQ_TYPES, WA_NODE_TAGS, WA_XMLNS } from '../../protocol/constants.js';
|
|
2
2
|
import { canonicalizeSignalJid } from '../../protocol/jid.js';
|
|
3
|
-
import { decodeExactLength, parseUint } from '../api/codec.js';
|
|
4
|
-
import {
|
|
3
|
+
import { decodeExactLength, parseSignalKeyBundleFromNode, parseUint } from '../api/codec.js';
|
|
4
|
+
import { SIGNAL_REGISTRATION_ID_LENGTH } from '../api/constants.js';
|
|
5
5
|
import { registerParsedResultByRawAndCanonicalKey } from '../api/result-map.js';
|
|
6
|
-
import {
|
|
6
|
+
import { findNodeChild, getNodeChildrenByTag } from '../../transport/node/helpers.js';
|
|
7
7
|
import { assertIqResult } from '../../transport/node/query.js';
|
|
8
8
|
function isKeyBundleResultPreferred(result) {
|
|
9
9
|
return 'bundle' in result;
|
|
10
10
|
}
|
|
11
|
+
/**
|
|
12
|
+
* Fetches per-device prekey bundles required to start a Signal session.
|
|
13
|
+
* Use {@link fetchKeyBundle} for single-JID calls or {@link fetchKeyBundles}
|
|
14
|
+
* for batched encryption.
|
|
15
|
+
*/
|
|
11
16
|
export class SignalSessionSyncApi {
|
|
12
17
|
constructor(options) {
|
|
13
18
|
this.logger = options.logger;
|
|
@@ -16,6 +21,10 @@ export class SignalSessionSyncApi {
|
|
|
16
21
|
options.defaultTimeoutMs ?? WA_DEFAULTS.SIGNAL_FETCH_KEY_BUNDLES_TIMEOUT_MS;
|
|
17
22
|
this.hostDomain = options.hostDomain ?? WA_DEFAULTS.HOST_DOMAIN;
|
|
18
23
|
}
|
|
24
|
+
/**
|
|
25
|
+
* Convenience wrapper for {@link fetchKeyBundles} that fetches a single
|
|
26
|
+
* bundle and throws on server error envelopes.
|
|
27
|
+
*/
|
|
19
28
|
async fetchKeyBundle(target, timeoutMs = this.defaultTimeoutMs) {
|
|
20
29
|
const results = await this.fetchKeyBundles([target], timeoutMs);
|
|
21
30
|
const first = results[0];
|
|
@@ -33,6 +42,10 @@ export class SignalSessionSyncApi {
|
|
|
33
42
|
});
|
|
34
43
|
return parsed;
|
|
35
44
|
}
|
|
45
|
+
/**
|
|
46
|
+
* Batched key-bundle fetch. Returns one entry per JID – either a bundle
|
|
47
|
+
* (success) or an error envelope. Duplicate JIDs are coalesced.
|
|
48
|
+
*/
|
|
36
49
|
async fetchKeyBundles(targets, timeoutMs = this.defaultTimeoutMs) {
|
|
37
50
|
if (targets.length === 0) {
|
|
38
51
|
return [];
|
|
@@ -133,57 +146,16 @@ export class SignalSessionSyncApi {
|
|
|
133
146
|
if (!registrationNode) {
|
|
134
147
|
throw new Error('key bundle user missing registration node');
|
|
135
148
|
}
|
|
136
|
-
const
|
|
137
|
-
|
|
138
|
-
throw new Error('key bundle user missing identity node');
|
|
139
|
-
}
|
|
140
|
-
const signedPreKeyNode = findNodeChild(node, WA_NODE_TAGS.SKEY);
|
|
141
|
-
if (!signedPreKeyNode) {
|
|
142
|
-
throw new Error('key bundle user missing signed pre-key node');
|
|
143
|
-
}
|
|
144
|
-
const registrationBytes = decodeExactLength(registrationNode.content, 'key bundle registration', SIGNAL_REGISTRATION_ID_LENGTH);
|
|
145
|
-
const registrationId = parseUint(registrationBytes, 'key bundle registration');
|
|
146
|
-
const identity = decodeExactLength(identityNode.content, 'key bundle identity', SIGNAL_KEY_DATA_LENGTH);
|
|
147
|
-
const signedIdNode = findNodeChild(signedPreKeyNode, WA_NODE_TAGS.ID);
|
|
148
|
-
const signedValueNode = findNodeChild(signedPreKeyNode, WA_NODE_TAGS.VALUE);
|
|
149
|
-
const signedSignatureNode = findNodeChild(signedPreKeyNode, WA_NODE_TAGS.SIGNATURE);
|
|
150
|
-
if (!signedIdNode || !signedValueNode || !signedSignatureNode) {
|
|
151
|
-
throw new Error('key bundle signed pre-key is incomplete');
|
|
152
|
-
}
|
|
153
|
-
const signedIdBytes = decodeExactLength(signedIdNode.content, 'key bundle skey.id', SIGNAL_KEY_ID_LENGTH);
|
|
154
|
-
const signedValue = decodeExactLength(signedValueNode.content, 'key bundle skey.value', SIGNAL_KEY_DATA_LENGTH);
|
|
155
|
-
const signedSignature = decodeExactLength(signedSignatureNode.content, 'key bundle skey.signature', SIGNAL_SIGNATURE_LENGTH);
|
|
156
|
-
const preKeyNode = findNodeChild(node, WA_NODE_TAGS.KEY);
|
|
157
|
-
let oneTimeKey;
|
|
158
|
-
if (preKeyNode) {
|
|
159
|
-
const preKeyIdNode = findNodeChild(preKeyNode, WA_NODE_TAGS.ID);
|
|
160
|
-
const preKeyValueNode = findNodeChild(preKeyNode, WA_NODE_TAGS.VALUE);
|
|
161
|
-
if (!preKeyIdNode || !preKeyValueNode) {
|
|
162
|
-
throw new Error('key bundle one-time pre-key is incomplete');
|
|
163
|
-
}
|
|
164
|
-
const preKeyIdBytes = decodeExactLength(preKeyIdNode.content, 'key bundle key.id', SIGNAL_KEY_ID_LENGTH);
|
|
165
|
-
const preKeyValue = decodeExactLength(preKeyValueNode.content, 'key bundle key.value', SIGNAL_KEY_DATA_LENGTH);
|
|
166
|
-
oneTimeKey = {
|
|
167
|
-
id: parseUint(preKeyIdBytes, 'key bundle key.id'),
|
|
168
|
-
publicKey: preKeyValue
|
|
169
|
-
};
|
|
170
|
-
}
|
|
171
|
-
const deviceIdentityNode = findNodeChild(node, WA_NODE_TAGS.DEVICE_IDENTITY);
|
|
172
|
-
const deviceIdentity = deviceIdentityNode
|
|
173
|
-
? decodeNodeContentBase64OrBytes(deviceIdentityNode.content, 'key bundle device-identity')
|
|
174
|
-
: undefined;
|
|
149
|
+
const regId = parseUint(decodeExactLength(registrationNode.content, 'key bundle registration', SIGNAL_REGISTRATION_ID_LENGTH), 'key bundle registration');
|
|
150
|
+
const parsed = parseSignalKeyBundleFromNode(node, 'key bundle');
|
|
175
151
|
return {
|
|
176
152
|
bundle: {
|
|
177
|
-
regId
|
|
178
|
-
identity,
|
|
179
|
-
signedKey:
|
|
180
|
-
|
|
181
|
-
publicKey: signedValue,
|
|
182
|
-
signature: signedSignature
|
|
183
|
-
},
|
|
184
|
-
...(oneTimeKey ? { oneTimeKey } : {})
|
|
153
|
+
regId,
|
|
154
|
+
identity: parsed.identity,
|
|
155
|
+
signedKey: parsed.signedKey,
|
|
156
|
+
...(parsed.oneTimeKey ? { oneTimeKey: parsed.oneTimeKey } : {})
|
|
185
157
|
},
|
|
186
|
-
...(deviceIdentity ? { deviceIdentity } : {})
|
|
158
|
+
...(parsed.deviceIdentity ? { deviceIdentity: parsed.deviceIdentity } : {})
|
|
187
159
|
};
|
|
188
160
|
}
|
|
189
161
|
}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { WA_NODE_TAGS } from '../../protocol/constants.js';
|
|
2
|
+
import { SIGNAL_KEY_DATA_LENGTH, SIGNAL_KEY_ID_LENGTH, SIGNAL_SIGNATURE_LENGTH } from '../api/constants.js';
|
|
3
|
+
import { decodeNodeContentBase64OrBytes, findNodeChildrenByTags } from '../../transport/node/helpers.js';
|
|
2
4
|
export function decodeExactLength(value, field, expectedLength) {
|
|
3
5
|
const bytes = decodeNodeContentBase64OrBytes(value, field);
|
|
4
6
|
if (bytes.byteLength !== expectedLength) {
|
|
@@ -21,3 +23,52 @@ export function parseUint(bytes, field) {
|
|
|
21
23
|
}
|
|
22
24
|
throw new Error(`${field} has invalid byte length`);
|
|
23
25
|
}
|
|
26
|
+
/**
|
|
27
|
+
* Parses the shared `<identity><skey id|value|signature><key id|value><device-identity>`
|
|
28
|
+
* shape used by session pre-key bundles, missing pre-key device bundles, and retry
|
|
29
|
+
* receipt key bundles. Caller is responsible for parsing the `<registration>` node
|
|
30
|
+
* separately when it lives at the same level (it's omitted from retry bundles).
|
|
31
|
+
*/
|
|
32
|
+
export function parseSignalKeyBundleFromNode(node, fieldPrefix) {
|
|
33
|
+
const [identityNode, signedKeyNode, oneTimeKeyNode, deviceIdentityNode] = findNodeChildrenByTags(node, [
|
|
34
|
+
WA_NODE_TAGS.IDENTITY,
|
|
35
|
+
WA_NODE_TAGS.SKEY,
|
|
36
|
+
WA_NODE_TAGS.KEY,
|
|
37
|
+
WA_NODE_TAGS.DEVICE_IDENTITY
|
|
38
|
+
]);
|
|
39
|
+
if (!identityNode) {
|
|
40
|
+
throw new Error(`${fieldPrefix} missing identity node`);
|
|
41
|
+
}
|
|
42
|
+
if (!signedKeyNode) {
|
|
43
|
+
throw new Error(`${fieldPrefix} missing signed pre-key node`);
|
|
44
|
+
}
|
|
45
|
+
const identity = decodeExactLength(identityNode.content, `${fieldPrefix}.identity`, SIGNAL_KEY_DATA_LENGTH);
|
|
46
|
+
const [signedKeyIdNode, signedKeyValueNode, signedKeySignatureNode] = findNodeChildrenByTags(signedKeyNode, [WA_NODE_TAGS.ID, WA_NODE_TAGS.VALUE, WA_NODE_TAGS.SIGNATURE]);
|
|
47
|
+
if (!signedKeyIdNode || !signedKeyValueNode || !signedKeySignatureNode) {
|
|
48
|
+
throw new Error(`${fieldPrefix} signed pre-key is incomplete`);
|
|
49
|
+
}
|
|
50
|
+
const signedKey = {
|
|
51
|
+
id: parseUint(decodeExactLength(signedKeyIdNode.content, `${fieldPrefix}.skey.id`, SIGNAL_KEY_ID_LENGTH), `${fieldPrefix}.skey.id`),
|
|
52
|
+
publicKey: decodeExactLength(signedKeyValueNode.content, `${fieldPrefix}.skey.value`, SIGNAL_KEY_DATA_LENGTH),
|
|
53
|
+
signature: decodeExactLength(signedKeySignatureNode.content, `${fieldPrefix}.skey.signature`, SIGNAL_SIGNATURE_LENGTH)
|
|
54
|
+
};
|
|
55
|
+
let oneTimeKey;
|
|
56
|
+
if (oneTimeKeyNode) {
|
|
57
|
+
const [oneTimeKeyIdNode, oneTimeKeyValueNode] = findNodeChildrenByTags(oneTimeKeyNode, [
|
|
58
|
+
WA_NODE_TAGS.ID,
|
|
59
|
+
WA_NODE_TAGS.VALUE
|
|
60
|
+
]);
|
|
61
|
+
if (!oneTimeKeyIdNode || !oneTimeKeyValueNode) {
|
|
62
|
+
throw new Error(`${fieldPrefix} one-time pre-key is incomplete`);
|
|
63
|
+
}
|
|
64
|
+
oneTimeKey = {
|
|
65
|
+
id: parseUint(decodeExactLength(oneTimeKeyIdNode.content, `${fieldPrefix}.key.id`, SIGNAL_KEY_ID_LENGTH), `${fieldPrefix}.key.id`),
|
|
66
|
+
publicKey: decodeExactLength(oneTimeKeyValueNode.content, `${fieldPrefix}.key.value`, SIGNAL_KEY_DATA_LENGTH)
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
let deviceIdentity;
|
|
70
|
+
if (deviceIdentityNode) {
|
|
71
|
+
deviceIdentity = decodeNodeContentBase64OrBytes(deviceIdentityNode.content, `${fieldPrefix}.device-identity`);
|
|
72
|
+
}
|
|
73
|
+
return { identity, signedKey, oneTimeKey, deviceIdentity };
|
|
74
|
+
}
|
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
import { parseIqError } from '../../transport/node/query.js';
|
|
2
2
|
export { buildMissingPreKeysFetchIq, buildPreKeyUploadIq, buildSignedPreKeyRotateIq } from '../../transport/node/builders/prekeys.js';
|
|
3
|
+
/**
|
|
4
|
+
* Extracts the numeric error code and text from a failed `prekey` upload IQ
|
|
5
|
+
* response. Use after a non-success status to decide whether to retry.
|
|
6
|
+
*/
|
|
3
7
|
export function parsePreKeyUploadFailure(node) {
|
|
4
8
|
const error = parseIqError(node);
|
|
5
9
|
return {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { ADV_PREFIX_ACCOUNT_SIGNATURE, ADV_PREFIX_DEVICE_SIGNATURE, ADV_PREFIX_HOSTED_ACCOUNT_SIGNATURE, ADV_PREFIX_HOSTED_DEVICE_SIGNATURE } from '../
|
|
1
|
+
import { hmacSha256Sign, toRawPubKey, xeddsaSign, xeddsaVerify } from '../../crypto/index.js';
|
|
2
|
+
import { ADV_PREFIX_ACCOUNT_SIGNATURE, ADV_PREFIX_DEVICE_SIGNATURE, ADV_PREFIX_HOSTED_ACCOUNT_SIGNATURE, ADV_PREFIX_HOSTED_DEVICE_SIGNATURE } from '../attestation/constants.js';
|
|
3
3
|
import { concatBytes } from '../../util/bytes.js';
|
|
4
|
-
export { ADV_PREFIX_ACCOUNT_SIGNATURE, ADV_PREFIX_DEVICE_SIGNATURE, ADV_PREFIX_HOSTED_ACCOUNT_SIGNATURE
|
|
4
|
+
export { ADV_PREFIX_ACCOUNT_SIGNATURE, ADV_PREFIX_DEVICE_SIGNATURE, ADV_PREFIX_HOSTED_ACCOUNT_SIGNATURE } from '../attestation/constants.js';
|
|
5
5
|
export async function verifyDeviceIdentityAccountSignature(details, accountSignature, identityPublicKey, accountSignatureKey, isHosted = false) {
|
|
6
6
|
const prefix = isHosted ? ADV_PREFIX_HOSTED_ACCOUNT_SIGNATURE : ADV_PREFIX_ACCOUNT_SIGNATURE;
|
|
7
7
|
const message = concatBytes([prefix, details, identityPublicKey]);
|
|
@@ -12,7 +12,6 @@ export async function generateDeviceSignature(details, identityKeyPair, accountS
|
|
|
12
12
|
const message = concatBytes([prefix, details, identityKeyPair.pubKey, accountSignatureKey]);
|
|
13
13
|
return xeddsaSign(identityKeyPair.privKey, message);
|
|
14
14
|
}
|
|
15
|
-
export
|
|
16
|
-
|
|
17
|
-
return hmacSign(key, details);
|
|
15
|
+
export function computeAdvIdentityHmac(secretKey, details) {
|
|
16
|
+
return hmacSha256Sign(secretKey, details);
|
|
18
17
|
}
|
|
@@ -9,4 +9,7 @@ export const SENDER_KEY_FUTURE_MESSAGES_MAX = 20000;
|
|
|
9
9
|
export const MESSAGE_KEY_LABEL = new Uint8Array([1]);
|
|
10
10
|
export const CHAIN_KEY_LABEL = new Uint8Array([2]);
|
|
11
11
|
export const WHISPER_GROUP_INFO = TEXT_ENCODER.encode('WhisperGroup');
|
|
12
|
+
export const WHISPER_MESSAGE_KEYS_INFO = TEXT_ENCODER.encode('WhisperMessageKeys');
|
|
13
|
+
export const WHISPER_TEXT_INFO = TEXT_ENCODER.encode('WhisperText');
|
|
14
|
+
export const WHISPER_RATCHET_INFO = TEXT_ENCODER.encode('WhisperRatchet');
|
|
12
15
|
export const SIGNAL_PREFIX = new Uint8Array(32).fill(0xff);
|