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
package/dist/retry/replay.js
CHANGED
|
@@ -1,19 +1,31 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.WaRetryReplayService = void 0;
|
|
4
|
-
const
|
|
5
|
-
const
|
|
6
|
-
const
|
|
4
|
+
const icdc_1 = require("../message/crypto/icdc");
|
|
5
|
+
const device_sent_1 = require("../message/encode/device-sent");
|
|
6
|
+
const padding_1 = require("../message/encode/padding");
|
|
7
|
+
const _proto_1 = require("../proto");
|
|
8
|
+
const constants_1 = require("../protocol/constants");
|
|
7
9
|
const jid_1 = require("../protocol/jid");
|
|
8
10
|
const codec_1 = require("./codec");
|
|
9
11
|
const binary_1 = require("../transport/binary");
|
|
10
12
|
const message_1 = require("../transport/node/builders/message");
|
|
11
13
|
const helpers_1 = require("../transport/node/helpers");
|
|
12
14
|
const primitives_1 = require("../util/primitives");
|
|
15
|
+
/**
|
|
16
|
+
* Replays a previously-sent outbound message in response to an incoming
|
|
17
|
+
* retry receipt. Dispatches to plaintext/encrypted/opaque-node handlers
|
|
18
|
+
* based on the stored payload shape.
|
|
19
|
+
*/
|
|
13
20
|
class WaRetryReplayService {
|
|
14
21
|
constructor(options) {
|
|
15
22
|
this.options = options;
|
|
16
23
|
}
|
|
24
|
+
/**
|
|
25
|
+
* Resends `outbound` to `requesterJid`. Returns `'resent'` on a fresh
|
|
26
|
+
* send or `'ineligible'` when the cached payload cannot satisfy the
|
|
27
|
+
* request (e.g. requester not in the original device list).
|
|
28
|
+
*/
|
|
17
29
|
async resendOutboundMessage(outbound, requesterJid, retryCount) {
|
|
18
30
|
const payload = outbound.replayPayload instanceof Uint8Array
|
|
19
31
|
? (0, codec_1.decodeRetryReplayPayload)(outbound.replayPayload)
|
|
@@ -42,43 +54,137 @@ class WaRetryReplayService {
|
|
|
42
54
|
catch {
|
|
43
55
|
return 'ineligible';
|
|
44
56
|
}
|
|
45
|
-
|
|
57
|
+
const requesterIsSelf = this.isRequesterCurrentAccount(requesterJid);
|
|
58
|
+
if (payloadUserJid !== requesterUserJid && !requesterIsSelf) {
|
|
46
59
|
return 'ineligible';
|
|
47
60
|
}
|
|
48
|
-
const
|
|
61
|
+
const plaintext = (await this.refreshRetryPlaintext(payload, {
|
|
62
|
+
wrapAsDeviceSent: requesterIsSelf,
|
|
63
|
+
includeRecipientIcdc: true,
|
|
64
|
+
logContext: 'direct'
|
|
65
|
+
})) ?? payload.plaintext;
|
|
66
|
+
await this.options.sessionResolver.ensureSession(requesterAddress, requesterJid);
|
|
67
|
+
const encrypted = await this.options.signalProtocol.encryptMessage(requesterAddress, plaintext);
|
|
68
|
+
const deviceIdentity = encrypted.type === 'pkmsg' ? this.resolveSignedDeviceIdentity('direct') : undefined;
|
|
69
|
+
const metaNode = (0, jid_1.isHostedDeviceJid)(requesterJid)
|
|
70
|
+
? (0, message_1.buildMetaNode)({ sender_intent: 'hosted' })
|
|
71
|
+
: undefined;
|
|
49
72
|
await this.options.messageClient.sendEncrypted({
|
|
50
73
|
to: requesterJid,
|
|
51
74
|
encType: encrypted.type,
|
|
52
75
|
ciphertext: encrypted.ciphertext,
|
|
53
76
|
encCount: retryCount,
|
|
54
77
|
id: outbound.messageId,
|
|
55
|
-
type: payload.type
|
|
78
|
+
type: payload.type,
|
|
79
|
+
deviceIdentity,
|
|
80
|
+
metaNode
|
|
56
81
|
});
|
|
57
82
|
return 'resent';
|
|
58
83
|
}
|
|
84
|
+
resolveSignedDeviceIdentity(context) {
|
|
85
|
+
const signedIdentity = this.options.getCurrentCredentials()?.signedIdentity;
|
|
86
|
+
if (!signedIdentity) {
|
|
87
|
+
this.options.logger.warn('retry request missing signed identity for pkmsg envelope', {
|
|
88
|
+
context
|
|
89
|
+
});
|
|
90
|
+
return undefined;
|
|
91
|
+
}
|
|
92
|
+
return _proto_1.proto.ADVSignedDeviceIdentity.encode(signedIdentity).finish();
|
|
93
|
+
}
|
|
94
|
+
async refreshRetryPlaintext(payload, options) {
|
|
95
|
+
if (!options.wrapAsDeviceSent && !this.options.resolveUserIcdc) {
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
98
|
+
try {
|
|
99
|
+
const messageBytes = (0, padding_1.unpadPkcs7)(payload.plaintext);
|
|
100
|
+
const decoded = _proto_1.proto.Message.decode(messageBytes);
|
|
101
|
+
let message = decoded;
|
|
102
|
+
let changed = false;
|
|
103
|
+
if (this.options.resolveUserIcdc) {
|
|
104
|
+
const meUserJid = this.safeUserJid(this.options.getCurrentCredentials()?.meJid);
|
|
105
|
+
const recipientUserJid = options.includeRecipientIcdc
|
|
106
|
+
? this.safeUserJid(payload.to)
|
|
107
|
+
: null;
|
|
108
|
+
const [senderIcdc, recipientIcdc] = await Promise.all([
|
|
109
|
+
meUserJid ? this.options.resolveUserIcdc(meUserJid) : Promise.resolve(null),
|
|
110
|
+
recipientUserJid
|
|
111
|
+
? this.options.resolveUserIcdc(recipientUserJid)
|
|
112
|
+
: Promise.resolve(null)
|
|
113
|
+
]);
|
|
114
|
+
const injected = (0, icdc_1.injectDeviceListMetadata)(message, senderIcdc, recipientIcdc);
|
|
115
|
+
if (injected !== message) {
|
|
116
|
+
message = injected;
|
|
117
|
+
changed = true;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
if (options.wrapAsDeviceSent && !message.deviceSentMessage) {
|
|
121
|
+
message = (0, device_sent_1.wrapDeviceSentMessage)(message, payload.to);
|
|
122
|
+
changed = true;
|
|
123
|
+
}
|
|
124
|
+
if (!changed) {
|
|
125
|
+
return null;
|
|
126
|
+
}
|
|
127
|
+
return (0, padding_1.writeRandomPadMax16)(_proto_1.proto.Message.encode(message).finish());
|
|
128
|
+
}
|
|
129
|
+
catch (error) {
|
|
130
|
+
this.options.logger.warn('retry request failed to refresh plaintext', {
|
|
131
|
+
context: options.logContext,
|
|
132
|
+
to: payload.to,
|
|
133
|
+
message: (0, primitives_1.toError)(error).message
|
|
134
|
+
});
|
|
135
|
+
return null;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
safeUserJid(jid) {
|
|
139
|
+
if (!jid)
|
|
140
|
+
return null;
|
|
141
|
+
try {
|
|
142
|
+
return (0, jid_1.toUserJid)(jid);
|
|
143
|
+
}
|
|
144
|
+
catch {
|
|
145
|
+
return null;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
59
148
|
async resendGroupPlaintextPayload(outbound, payload, requesterJid, requesterAddress, retryCount) {
|
|
60
|
-
const plaintext = (await this.
|
|
61
|
-
|
|
149
|
+
const plaintext = (await this.refreshRetryPlaintext(payload, {
|
|
150
|
+
wrapAsDeviceSent: this.isRequesterCurrentAccount(requesterJid),
|
|
151
|
+
includeRecipientIcdc: false,
|
|
152
|
+
logContext: 'group'
|
|
153
|
+
})) ?? payload.plaintext;
|
|
62
154
|
const encrypted = await this.options.signalProtocol.encryptMessage(requesterAddress, plaintext);
|
|
63
155
|
let deviceIdentity;
|
|
64
156
|
if (encrypted.type === 'pkmsg') {
|
|
65
|
-
const signedIdentity = this.options.
|
|
157
|
+
const signedIdentity = this.options.getCurrentCredentials()?.signedIdentity;
|
|
66
158
|
if (!signedIdentity) {
|
|
67
159
|
this.options.logger.warn('retry request rejected: missing signed identity for pkmsg group retry');
|
|
68
160
|
return 'ineligible';
|
|
69
161
|
}
|
|
70
162
|
deviceIdentity = _proto_1.proto.ADVSignedDeviceIdentity.encode(signedIdentity).finish();
|
|
71
163
|
}
|
|
164
|
+
const isStatus = (0, jid_1.isStatusBroadcastJid)(payload.to);
|
|
165
|
+
const metaAttrs = {};
|
|
166
|
+
if (isStatus) {
|
|
167
|
+
metaAttrs.status_setting = payload.statusSetting ?? 'contacts';
|
|
168
|
+
}
|
|
169
|
+
if ((0, jid_1.isHostedDeviceJid)(requesterJid)) {
|
|
170
|
+
metaAttrs.sender_intent = 'hosted';
|
|
171
|
+
}
|
|
172
|
+
const metaNode = Object.keys(metaAttrs).length > 0 ? (0, message_1.buildMetaNode)(metaAttrs) : undefined;
|
|
72
173
|
const retryNode = (0, message_1.buildGroupRetryMessageNode)({
|
|
73
174
|
to: payload.to,
|
|
74
175
|
type: payload.type,
|
|
75
176
|
id: outbound.messageId,
|
|
76
177
|
requesterJid,
|
|
77
|
-
addressingMode:
|
|
178
|
+
addressingMode: isStatus
|
|
179
|
+
? undefined
|
|
180
|
+
: requesterAddress.server === constants_1.WA_DEFAULTS.LID_SERVER
|
|
181
|
+
? 'lid'
|
|
182
|
+
: 'pn',
|
|
78
183
|
encType: encrypted.type,
|
|
79
184
|
ciphertext: encrypted.ciphertext,
|
|
80
185
|
retryCount,
|
|
81
|
-
deviceIdentity
|
|
186
|
+
deviceIdentity,
|
|
187
|
+
metaNode
|
|
82
188
|
});
|
|
83
189
|
await this.options.messageClient.sendMessageNode(retryNode);
|
|
84
190
|
return 'resent';
|
|
@@ -90,6 +196,12 @@ class WaRetryReplayService {
|
|
|
90
196
|
if ((0, jid_1.normalizeDeviceJid)(payload.to) !== normalizedRequesterJid) {
|
|
91
197
|
return 'ineligible';
|
|
92
198
|
}
|
|
199
|
+
const deviceIdentity = payload.encType === 'pkmsg'
|
|
200
|
+
? this.resolveSignedDeviceIdentity('encrypted_replay')
|
|
201
|
+
: undefined;
|
|
202
|
+
const metaNode = (0, jid_1.isHostedDeviceJid)(requesterJid)
|
|
203
|
+
? (0, message_1.buildMetaNode)({ sender_intent: 'hosted' })
|
|
204
|
+
: undefined;
|
|
93
205
|
await this.options.messageClient.sendEncrypted({
|
|
94
206
|
to: requesterJid,
|
|
95
207
|
encType: payload.encType,
|
|
@@ -97,7 +209,9 @@ class WaRetryReplayService {
|
|
|
97
209
|
encCount: retryCount,
|
|
98
210
|
id: outbound.messageId,
|
|
99
211
|
type: payload.type,
|
|
100
|
-
participant: payload.participant
|
|
212
|
+
participant: payload.participant,
|
|
213
|
+
deviceIdentity,
|
|
214
|
+
metaNode
|
|
101
215
|
});
|
|
102
216
|
return 'resent';
|
|
103
217
|
}
|
|
@@ -118,39 +232,19 @@ class WaRetryReplayService {
|
|
|
118
232
|
await this.options.messageClient.sendMessageNode(replayNode);
|
|
119
233
|
return 'resent';
|
|
120
234
|
}
|
|
121
|
-
async maybeWrapGroupRetryPlaintextForSelfDevice(payload, requesterJid) {
|
|
122
|
-
if (!this.isRequesterCurrentAccount(requesterJid)) {
|
|
123
|
-
return null;
|
|
124
|
-
}
|
|
125
|
-
try {
|
|
126
|
-
const messageBytes = (0, padding_1.unpadPkcs7)(payload.plaintext);
|
|
127
|
-
const message = _proto_1.proto.Message.decode(messageBytes);
|
|
128
|
-
const wrapped = (0, device_sent_1.wrapDeviceSentMessage)(message, payload.to);
|
|
129
|
-
return (0, padding_1.writeRandomPadMax16)(_proto_1.proto.Message.encode(wrapped).finish());
|
|
130
|
-
}
|
|
131
|
-
catch (error) {
|
|
132
|
-
this.options.logger.warn('retry request failed to wrap deviceSent payload for self requester', {
|
|
133
|
-
requester: requesterJid,
|
|
134
|
-
to: payload.to,
|
|
135
|
-
message: (0, primitives_1.toError)(error).message
|
|
136
|
-
});
|
|
137
|
-
return null;
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
235
|
isRequesterCurrentAccount(requesterJid) {
|
|
141
236
|
const requesterUser = (0, jid_1.toUserJid)(requesterJid);
|
|
142
|
-
const
|
|
143
|
-
if (meJid && (0, jid_1.toUserJid)(meJid) === requesterUser) {
|
|
237
|
+
const credentials = this.options.getCurrentCredentials();
|
|
238
|
+
if (credentials?.meJid && (0, jid_1.toUserJid)(credentials.meJid) === requesterUser) {
|
|
144
239
|
return true;
|
|
145
240
|
}
|
|
146
|
-
|
|
147
|
-
if (meLid && (0, jid_1.toUserJid)(meLid) === requesterUser) {
|
|
241
|
+
if (credentials?.meLid && (0, jid_1.toUserJid)(credentials.meLid) === requesterUser) {
|
|
148
242
|
return true;
|
|
149
243
|
}
|
|
150
244
|
return false;
|
|
151
245
|
}
|
|
152
246
|
isOpaqueReplayCompatible(node, normalizedRequesterJid) {
|
|
153
|
-
const participantsNode = (0, helpers_1.findNodeChild)(node,
|
|
247
|
+
const participantsNode = (0, helpers_1.findNodeChild)(node, constants_1.WA_NODE_TAGS.PARTICIPANTS);
|
|
154
248
|
if (participantsNode) {
|
|
155
249
|
const participantsContent = Array.isArray(participantsNode.content)
|
|
156
250
|
? participantsNode.content
|
package/dist/retry/tracker.js
CHANGED
|
@@ -5,6 +5,7 @@ const jid_1 = require("../protocol/jid");
|
|
|
5
5
|
const codec_1 = require("./codec");
|
|
6
6
|
const constants_1 = require("./constants");
|
|
7
7
|
const primitives_1 = require("../util/primitives");
|
|
8
|
+
/** Builds an {@link OutboundRetryTracker} backed by a {@link WaRetryStore}. */
|
|
8
9
|
function createOutboundRetryTracker(options) {
|
|
9
10
|
const { retryStore, logger } = options;
|
|
10
11
|
const retryTtlMs = retryStore.getTtlMs?.() ?? constants_1.RETRY_OUTBOUND_TTL_MS;
|
|
@@ -20,7 +21,7 @@ function createOutboundRetryTracker(options) {
|
|
|
20
21
|
continue;
|
|
21
22
|
}
|
|
22
23
|
try {
|
|
23
|
-
deduped.add((0, jid_1.
|
|
24
|
+
deduped.add((0, jid_1.toUserJid)(raw));
|
|
24
25
|
}
|
|
25
26
|
catch {
|
|
26
27
|
continue;
|
|
@@ -48,7 +49,6 @@ function createOutboundRetryTracker(options) {
|
|
|
48
49
|
};
|
|
49
50
|
return {
|
|
50
51
|
track: async (hint, publish) => {
|
|
51
|
-
const nowMs = Date.now();
|
|
52
52
|
const replayMode = hint.replayPayload.mode;
|
|
53
53
|
const resolvedToJid = hint.toJid ?? (replayMode === 'opaque_node' ? '' : hint.replayPayload.to);
|
|
54
54
|
const replayPayload = supportsRawReplayPayload
|
|
@@ -59,7 +59,7 @@ function createOutboundRetryTracker(options) {
|
|
|
59
59
|
resolvedToJid &&
|
|
60
60
|
!(0, jid_1.isGroupOrBroadcastJid)(resolvedToJid)) {
|
|
61
61
|
try {
|
|
62
|
-
eligibleRequesterDeviceJids = [(0, jid_1.
|
|
62
|
+
eligibleRequesterDeviceJids = [(0, jid_1.toUserJid)(resolvedToJid)];
|
|
63
63
|
}
|
|
64
64
|
catch {
|
|
65
65
|
eligibleRequesterDeviceJids = undefined;
|
|
@@ -68,15 +68,11 @@ function createOutboundRetryTracker(options) {
|
|
|
68
68
|
const createRetryOutboundRecord = (messageId, updatedAtMs, expiresAtMs) => ({
|
|
69
69
|
messageId,
|
|
70
70
|
toJid: resolvedToJid,
|
|
71
|
-
participantJid: hint.participantJid,
|
|
72
|
-
recipientJid: hint.recipientJid,
|
|
73
71
|
eligibleRequesterDeviceJids,
|
|
74
72
|
deliveredRequesterDeviceJids: [],
|
|
75
|
-
messageType: hint.type,
|
|
76
73
|
replayMode,
|
|
77
74
|
replayPayload,
|
|
78
75
|
state: 'pending',
|
|
79
|
-
createdAtMs: nowMs,
|
|
80
76
|
updatedAtMs,
|
|
81
77
|
expiresAtMs
|
|
82
78
|
});
|
|
@@ -8,6 +8,10 @@ const usync_1 = require("../../transport/node/builders/usync");
|
|
|
8
8
|
const helpers_1 = require("../../transport/node/helpers");
|
|
9
9
|
const query_1 = require("../../transport/node/query");
|
|
10
10
|
const usync_2 = require("../../transport/node/usync");
|
|
11
|
+
/**
|
|
12
|
+
* Resolves the device list and LID mapping for a set of users via the `usync`
|
|
13
|
+
* protocol. Concurrent calls for the same JIDs are deduplicated.
|
|
14
|
+
*/
|
|
11
15
|
class SignalDeviceSyncApi {
|
|
12
16
|
constructor(options) {
|
|
13
17
|
this.syncDedup = new PromiseDedup_1.PromiseDedup();
|
|
@@ -19,6 +23,10 @@ class SignalDeviceSyncApi {
|
|
|
19
23
|
this.hostDomain = options.hostDomain ?? constants_1.WA_DEFAULTS.HOST_DOMAIN;
|
|
20
24
|
this.generateSid = options.generateSid ?? (0, usync_2.createUsyncSidGenerator)();
|
|
21
25
|
}
|
|
26
|
+
/**
|
|
27
|
+
* Refreshes the device list for every JID in `userJids`. Returns the
|
|
28
|
+
* resolved per-user device JIDs (matches the on-store snapshot).
|
|
29
|
+
*/
|
|
22
30
|
syncDeviceList(userJids, timeoutMs = this.defaultTimeoutMs) {
|
|
23
31
|
const normalizedUsers = this.normalizeUsers(userJids);
|
|
24
32
|
if (normalizedUsers.length === 0) {
|
|
@@ -87,6 +95,10 @@ class SignalDeviceSyncApi {
|
|
|
87
95
|
});
|
|
88
96
|
return merged;
|
|
89
97
|
}
|
|
98
|
+
/**
|
|
99
|
+
* Looks up LIDs for a list of phone JIDs via a `lid` usync query. Returns
|
|
100
|
+
* one entry per input JID with `exists` indicating server-side presence.
|
|
101
|
+
*/
|
|
90
102
|
async queryLidsByPhoneJids(phoneJids, timeoutMs = this.defaultTimeoutMs) {
|
|
91
103
|
const normalizedPhoneJids = this.normalizeUsers(phoneJids);
|
|
92
104
|
if (normalizedPhoneJids.length === 0) {
|
|
@@ -128,8 +140,51 @@ class SignalDeviceSyncApi {
|
|
|
128
140
|
users: result.length,
|
|
129
141
|
found
|
|
130
142
|
});
|
|
143
|
+
await this.propagateAltUserJids(result);
|
|
131
144
|
return result;
|
|
132
145
|
}
|
|
146
|
+
/**
|
|
147
|
+
* Enriches existing device-list snapshots with the resolved LID equivalents
|
|
148
|
+
* so {@link WaDeviceListStore.findByAnyUserJid} can later match a retry
|
|
149
|
+
* receipt arriving in LID form against an eligible list stored in PN form
|
|
150
|
+
* (and vice versa). Skips users with no cached snapshot — the alt gets
|
|
151
|
+
* recorded on the next {@link syncDeviceList} sweep.
|
|
152
|
+
*/
|
|
153
|
+
async propagateAltUserJids(results) {
|
|
154
|
+
if (!this.deviceListStore || results.length === 0)
|
|
155
|
+
return;
|
|
156
|
+
const nowMs = Date.now();
|
|
157
|
+
const lidByPhoneJid = new Map();
|
|
158
|
+
const phoneJids = [];
|
|
159
|
+
for (const entry of results) {
|
|
160
|
+
if (entry.lidJid && entry.phoneJid) {
|
|
161
|
+
lidByPhoneJid.set(entry.phoneJid, entry.lidJid);
|
|
162
|
+
phoneJids.push(entry.phoneJid);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
if (phoneJids.length === 0)
|
|
166
|
+
return;
|
|
167
|
+
const existing = await this.deviceListStore.getUserDevicesBatch(phoneJids, nowMs);
|
|
168
|
+
const updates = [];
|
|
169
|
+
for (let index = 0; index < phoneJids.length; index += 1) {
|
|
170
|
+
const snapshot = existing[index];
|
|
171
|
+
if (!snapshot)
|
|
172
|
+
continue;
|
|
173
|
+
const phoneJid = phoneJids[index];
|
|
174
|
+
const lidJid = lidByPhoneJid.get(phoneJid);
|
|
175
|
+
if (!lidJid || snapshot.altUserJid === lidJid)
|
|
176
|
+
continue;
|
|
177
|
+
updates.push({
|
|
178
|
+
userJid: snapshot.userJid,
|
|
179
|
+
altUserJid: lidJid,
|
|
180
|
+
deviceJids: snapshot.deviceJids,
|
|
181
|
+
updatedAtMs: nowMs
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
if (updates.length > 0) {
|
|
185
|
+
await this.deviceListStore.upsertUserDevicesBatch(updates);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
133
188
|
async collectUsersToQuery(normalizedUsers, nowMs, cachedByUser, store) {
|
|
134
189
|
const records = await store.getUserDevicesBatch(normalizedUsers, nowMs);
|
|
135
190
|
const usersToQuery = new Array(normalizedUsers.length);
|
|
@@ -179,7 +234,9 @@ class SignalDeviceSyncApi {
|
|
|
179
234
|
{
|
|
180
235
|
tag: constants_1.WA_NODE_TAGS.CONTACT,
|
|
181
236
|
attrs: {},
|
|
182
|
-
|
|
237
|
+
// E.164 '+': without it the server normalizes under the
|
|
238
|
+
// account's country and resolves the wrong contact.
|
|
239
|
+
content: `+${(0, jid_1.splitJid)(jid).user}`
|
|
183
240
|
}
|
|
184
241
|
]
|
|
185
242
|
};
|
|
@@ -203,16 +260,12 @@ class SignalDeviceSyncApi {
|
|
|
203
260
|
}
|
|
204
261
|
parseDeviceSyncResponse(node, requestedUsers) {
|
|
205
262
|
(0, query_1.assertIqResult)(node, 'signal device sync');
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
const listNode = (0, helpers_1.findNodeChild)(usyncNode, constants_1.WA_NODE_TAGS.LIST);
|
|
211
|
-
if (!listNode) {
|
|
212
|
-
throw new Error('signal device sync response missing list node');
|
|
263
|
+
(0, usync_2.logUsyncProtocolErrors)((0, usync_1.parseUsyncResultEnvelope)(node), this.logger, 'signal.deviceSync');
|
|
264
|
+
const userNodes = (0, usync_1.iterateUsyncUsers)(node);
|
|
265
|
+
if (!userNodes) {
|
|
266
|
+
throw new Error('signal device sync response missing usync envelope');
|
|
213
267
|
}
|
|
214
268
|
const requestedSet = new Set(requestedUsers);
|
|
215
|
-
const userNodes = (0, helpers_1.getNodeChildrenByTag)(listNode, constants_1.WA_NODE_TAGS.USER);
|
|
216
269
|
const parsed = new Array(userNodes.length);
|
|
217
270
|
let parsedCount = 0;
|
|
218
271
|
for (let index = 0; index < userNodes.length; index += 1) {
|
|
@@ -236,16 +289,12 @@ class SignalDeviceSyncApi {
|
|
|
236
289
|
}
|
|
237
290
|
parseLidSyncResponse(node, requestedUsers) {
|
|
238
291
|
(0, query_1.assertIqResult)(node, 'signal lid sync');
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
const listNode = (0, helpers_1.findNodeChild)(usyncNode, constants_1.WA_NODE_TAGS.LIST);
|
|
244
|
-
if (!listNode) {
|
|
245
|
-
throw new Error('signal lid sync response missing list node');
|
|
292
|
+
(0, usync_2.logUsyncProtocolErrors)((0, usync_1.parseUsyncResultEnvelope)(node), this.logger, 'signal.lidSync');
|
|
293
|
+
const userNodes = (0, usync_1.iterateUsyncUsers)(node);
|
|
294
|
+
if (!userNodes) {
|
|
295
|
+
throw new Error('signal lid sync response missing usync envelope');
|
|
246
296
|
}
|
|
247
297
|
const requestedSet = new Set(requestedUsers);
|
|
248
|
-
const userNodes = (0, helpers_1.getNodeChildrenByTag)(listNode, constants_1.WA_NODE_TAGS.USER);
|
|
249
298
|
const parsed = new Array(userNodes.length);
|
|
250
299
|
let parsedCount = 0;
|
|
251
300
|
for (let index = 0; index < userNodes.length; index += 1) {
|
|
@@ -335,7 +384,7 @@ class SignalDeviceSyncApi {
|
|
|
335
384
|
? rawUserJid.slice(rawAtIndex + 1)
|
|
336
385
|
: parsedNormalizedUser.server;
|
|
337
386
|
const dedup = new Set();
|
|
338
|
-
for (const deviceNode of (0, helpers_1.getNodeChildrenByTag)(deviceListNode,
|
|
387
|
+
for (const deviceNode of (0, helpers_1.getNodeChildrenByTag)(deviceListNode, constants_1.WA_NODE_TAGS.DEVICE)) {
|
|
339
388
|
const parsedId = deviceNode.attrs.id
|
|
340
389
|
? Number.parseInt(deviceNode.attrs.id, 10)
|
|
341
390
|
: Number.NaN;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.SignalDigestSyncApi = void 0;
|
|
4
|
-
const _crypto_1 = require("../../crypto
|
|
4
|
+
const _crypto_1 = require("../../crypto");
|
|
5
5
|
const keys_1 = require("../../crypto/core/keys");
|
|
6
6
|
const constants_1 = require("../../protocol/constants");
|
|
7
7
|
const codec_1 = require("../api/codec");
|
|
@@ -9,6 +9,11 @@ const constants_2 = require("../api/constants");
|
|
|
9
9
|
const helpers_1 = require("../../transport/node/helpers");
|
|
10
10
|
const query_1 = require("../../transport/node/query");
|
|
11
11
|
const bytes_1 = require("../../util/bytes");
|
|
12
|
+
/**
|
|
13
|
+
* Validates the local Signal key bundle (identity, signed prekey, one-time
|
|
14
|
+
* prekey ids) against the server-side digest. Used to detect drift after a
|
|
15
|
+
* crash or partial sync and decide whether to re-upload.
|
|
16
|
+
*/
|
|
12
17
|
class SignalDigestSyncApi {
|
|
13
18
|
constructor(options) {
|
|
14
19
|
this.logger = options.logger;
|
|
@@ -123,7 +128,7 @@ class SignalDigestSyncApi {
|
|
|
123
128
|
}
|
|
124
129
|
bytesToHash.push((0, keys_1.toRawPubKey)(preKey.keyPair.pubKey));
|
|
125
130
|
}
|
|
126
|
-
const localHash = (
|
|
131
|
+
const localHash = (0, _crypto_1.sha1)(bytesToHash).subarray(0, digest.hash.byteLength);
|
|
127
132
|
if (!(0, bytes_1.uint8Equal)(localHash, digest.hash)) {
|
|
128
133
|
return {
|
|
129
134
|
valid: false,
|
|
@@ -9,6 +9,11 @@ const codec_1 = require("../api/codec");
|
|
|
9
9
|
const constants_2 = require("../api/constants");
|
|
10
10
|
const helpers_1 = require("../../transport/node/helpers");
|
|
11
11
|
const query_1 = require("../../transport/node/query");
|
|
12
|
+
/**
|
|
13
|
+
* Fetches identity keys for a list of JIDs from the server and persists them
|
|
14
|
+
* into the identity store. Concurrent calls for the same JID set are
|
|
15
|
+
* deduplicated.
|
|
16
|
+
*/
|
|
12
17
|
class SignalIdentitySyncApi {
|
|
13
18
|
constructor(options) {
|
|
14
19
|
this.syncDedup = new PromiseDedup_1.PromiseDedup();
|
|
@@ -19,6 +24,10 @@ class SignalIdentitySyncApi {
|
|
|
19
24
|
options.defaultTimeoutMs ?? constants_1.WA_DEFAULTS.SIGNAL_FETCH_KEY_BUNDLES_TIMEOUT_MS;
|
|
20
25
|
this.hostDomain = options.hostDomain ?? constants_1.WA_DEFAULTS.HOST_DOMAIN;
|
|
21
26
|
}
|
|
27
|
+
/**
|
|
28
|
+
* Fetches and persists identity keys for `targetJids`. Returns one entry
|
|
29
|
+
* per JID the server resolved; missing/erroring users are skipped.
|
|
30
|
+
*/
|
|
22
31
|
syncIdentityKeys(targetJids, timeoutMs = this.defaultTimeoutMs) {
|
|
23
32
|
const dedupKey = `${timeoutMs}:${targetJids.join(',')}`;
|
|
24
33
|
return this.syncDedup.run(dedupKey, () => this.syncIdentityKeysInternal(targetJids, timeoutMs));
|
|
@@ -12,6 +12,10 @@ const query_1 = require("../../transport/node/query");
|
|
|
12
12
|
function isMissingPreKeysUserResultPreferred(result) {
|
|
13
13
|
return 'devices' in result;
|
|
14
14
|
}
|
|
15
|
+
/**
|
|
16
|
+
* Fetches missing prekey bundles for specific (user, device, registration id)
|
|
17
|
+
* triples – used during message encryption when a Signal session is missing.
|
|
18
|
+
*/
|
|
15
19
|
class SignalMissingPreKeysSyncApi {
|
|
16
20
|
constructor(options) {
|
|
17
21
|
this.logger = options.logger;
|
|
@@ -19,6 +23,10 @@ class SignalMissingPreKeysSyncApi {
|
|
|
19
23
|
this.defaultTimeoutMs =
|
|
20
24
|
options.defaultTimeoutMs ?? constants_1.WA_DEFAULTS.SIGNAL_FETCH_KEY_BUNDLES_TIMEOUT_MS;
|
|
21
25
|
}
|
|
26
|
+
/**
|
|
27
|
+
* Fetches prekey bundles for the requested `targets` in a single IQ.
|
|
28
|
+
* Returns either a per-device bundle list or an error envelope per user.
|
|
29
|
+
*/
|
|
22
30
|
async fetchMissingPreKeys(targets, timeoutMs = this.defaultTimeoutMs) {
|
|
23
31
|
if (targets.length === 0) {
|
|
24
32
|
return [];
|
|
@@ -94,69 +102,22 @@ class SignalMissingPreKeysSyncApi {
|
|
|
94
102
|
if (!Number.isSafeInteger(deviceId) || deviceId < 0) {
|
|
95
103
|
throw new Error(`missing prekeys device[${index}].id is invalid`);
|
|
96
104
|
}
|
|
97
|
-
const
|
|
98
|
-
|
|
99
|
-
constants_1.WA_NODE_TAGS.IDENTITY,
|
|
100
|
-
constants_1.WA_NODE_TAGS.SKEY,
|
|
101
|
-
constants_1.WA_NODE_TAGS.KEY,
|
|
102
|
-
constants_1.WA_NODE_TAGS.DEVICE_IDENTITY
|
|
103
|
-
]);
|
|
104
|
-
if (!registrationNode || !identityNode || !signedKeyNode) {
|
|
105
|
+
const registrationNode = (0, helpers_1.findNodeChild)(deviceNode, constants_1.WA_NODE_TAGS.REGISTRATION);
|
|
106
|
+
if (!registrationNode) {
|
|
105
107
|
throw new Error(`missing prekeys device payload is incomplete for ${userJid}`);
|
|
106
108
|
}
|
|
107
|
-
const
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
}
|
|
115
|
-
let oneTimeIdNode;
|
|
116
|
-
let oneTimeValueNode;
|
|
117
|
-
if (oneTimeNode) {
|
|
118
|
-
const oneTimeNodes = (0, helpers_1.findNodeChildrenByTags)(oneTimeNode, [
|
|
119
|
-
constants_1.WA_NODE_TAGS.ID,
|
|
120
|
-
constants_1.WA_NODE_TAGS.VALUE
|
|
121
|
-
]);
|
|
122
|
-
oneTimeIdNode = oneTimeNodes[0];
|
|
123
|
-
oneTimeValueNode = oneTimeNodes[1];
|
|
124
|
-
}
|
|
125
|
-
if (oneTimeNode && (!oneTimeIdNode || !oneTimeValueNode)) {
|
|
126
|
-
throw new Error(`missing prekeys one-time key is incomplete for ${userJid}`);
|
|
127
|
-
}
|
|
128
|
-
const baseBundle = {
|
|
129
|
-
regId: (0, codec_1.parseUint)((0, codec_1.decodeExactLength)(registrationNode.content, 'missing prekeys device registration', constants_2.SIGNAL_REGISTRATION_ID_LENGTH), 'missing prekeys device registration'),
|
|
130
|
-
identity: (0, codec_1.decodeExactLength)(identityNode.content, 'missing prekeys device identity', constants_2.SIGNAL_KEY_DATA_LENGTH),
|
|
131
|
-
signedKey: {
|
|
132
|
-
id: (0, codec_1.parseUint)((0, codec_1.decodeExactLength)(signedKeyIdNode.content, 'missing prekeys device skey.id', constants_2.SIGNAL_KEY_ID_LENGTH), 'missing prekeys device skey.id'),
|
|
133
|
-
publicKey: (0, codec_1.decodeExactLength)(signedKeyValueNode.content, 'missing prekeys device skey.value', constants_2.SIGNAL_KEY_DATA_LENGTH),
|
|
134
|
-
signature: (0, codec_1.decodeExactLength)(signedKeySignatureNode.content, 'missing prekeys device skey.signature', constants_2.SIGNAL_SIGNATURE_LENGTH)
|
|
135
|
-
}
|
|
109
|
+
const regId = (0, codec_1.parseUint)((0, codec_1.decodeExactLength)(registrationNode.content, 'missing prekeys device registration', constants_2.SIGNAL_REGISTRATION_ID_LENGTH), 'missing prekeys device registration');
|
|
110
|
+
const parsed = (0, codec_1.parseSignalKeyBundleFromNode)(deviceNode, 'missing prekeys device');
|
|
111
|
+
const bundle = {
|
|
112
|
+
regId,
|
|
113
|
+
identity: parsed.identity,
|
|
114
|
+
signedKey: parsed.signedKey,
|
|
115
|
+
...(parsed.oneTimeKey ? { oneTimeKey: parsed.oneTimeKey } : {})
|
|
136
116
|
};
|
|
137
|
-
const
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
id: (0, codec_1.parseUint)((0, codec_1.decodeExactLength)(oneTimeIdNode.content, 'missing prekeys device key.id', constants_2.SIGNAL_KEY_ID_LENGTH), 'missing prekeys device key.id'),
|
|
142
|
-
publicKey: (0, codec_1.decodeExactLength)(oneTimeValueNode.content, 'missing prekeys device key.value', constants_2.SIGNAL_KEY_DATA_LENGTH)
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
: baseBundle;
|
|
146
|
-
let deviceIdentity;
|
|
147
|
-
if (deviceIdentityNode) {
|
|
148
|
-
deviceIdentity = (0, helpers_1.decodeNodeContentBase64OrBytes)(deviceIdentityNode.content, 'missing prekeys device device-identity');
|
|
149
|
-
}
|
|
150
|
-
bundles[index] = deviceIdentity
|
|
151
|
-
? {
|
|
152
|
-
deviceJid: deviceId === 0 ? userJid : `${user}:${deviceId}@${server}`,
|
|
153
|
-
bundle,
|
|
154
|
-
deviceIdentity
|
|
155
|
-
}
|
|
156
|
-
: {
|
|
157
|
-
deviceJid: deviceId === 0 ? userJid : `${user}:${deviceId}@${server}`,
|
|
158
|
-
bundle
|
|
159
|
-
};
|
|
117
|
+
const deviceJid = deviceId === 0 ? userJid : `${user}:${deviceId}@${server}`;
|
|
118
|
+
bundles[index] = parsed.deviceIdentity
|
|
119
|
+
? { deviceJid, bundle, deviceIdentity: parsed.deviceIdentity }
|
|
120
|
+
: { deviceJid, bundle };
|
|
160
121
|
}
|
|
161
122
|
return bundles;
|
|
162
123
|
}
|
|
@@ -5,6 +5,11 @@ const constants_1 = require("../../protocol/constants");
|
|
|
5
5
|
const prekeys_1 = require("../api/prekeys");
|
|
6
6
|
const keygen_1 = require("../registration/keygen");
|
|
7
7
|
const query_1 = require("../../transport/node/query");
|
|
8
|
+
/**
|
|
9
|
+
* Generates a fresh signed prekey and uploads it to the server. Handles the
|
|
10
|
+
* `406`/`409`/`5xx` error codes by signaling whether a digest re-validation
|
|
11
|
+
* is required.
|
|
12
|
+
*/
|
|
8
13
|
class SignalRotateKeyApi {
|
|
9
14
|
constructor(options) {
|
|
10
15
|
this.logger = options.logger;
|
|
@@ -12,6 +17,11 @@ class SignalRotateKeyApi {
|
|
|
12
17
|
this.signalStore = options.signalStore;
|
|
13
18
|
this.defaultTimeoutMs = options.defaultTimeoutMs ?? constants_1.WA_DEFAULTS.IQ_TIMEOUT_MS;
|
|
14
19
|
}
|
|
20
|
+
/**
|
|
21
|
+
* Rotates the signed prekey by generating a new one (next key id) and
|
|
22
|
+
* uploading it. Returns `shouldDigestKey: true` when the caller should
|
|
23
|
+
* re-run a digest validation after the rotation.
|
|
24
|
+
*/
|
|
15
25
|
async rotateSignedPreKey(timeoutMs = this.defaultTimeoutMs) {
|
|
16
26
|
const [registrationInfo, currentSignedPreKey] = await Promise.all([
|
|
17
27
|
this.signalStore.getRegistrationInfo(),
|