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,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.WaRetryCoordinator = void 0;
|
|
4
|
+
const incoming_1 = require("../../message/primitives/incoming");
|
|
4
5
|
const _proto_1 = require("../../proto.js");
|
|
5
6
|
const constants_1 = require("../../protocol/constants");
|
|
6
7
|
const jid_1 = require("../../protocol/jid");
|
|
@@ -16,6 +17,16 @@ const collections_1 = require("../../util/collections");
|
|
|
16
17
|
const primitives_1 = require("../../util/primitives");
|
|
17
18
|
const RETRY_CLEANUP_INTERVAL_MS = 30000;
|
|
18
19
|
const RETRY_SESSION_BASE_KEY_CACHE_MAX_ENTRIES = 8192;
|
|
20
|
+
const PLACEHOLDER_RESEND_RETRY_THRESHOLD = 3;
|
|
21
|
+
const PLACEHOLDER_RESEND_BATCH_SIZE = 32;
|
|
22
|
+
const PLACEHOLDER_RESEND_DEBOUNCE_MS = 200;
|
|
23
|
+
const PLACEHOLDER_RESEND_MAX_AGE_SECONDS = 30 * 24 * 60 * 60;
|
|
24
|
+
const PLACEHOLDER_RESEND_IN_FLIGHT_MAX = 256;
|
|
25
|
+
const PLACEHOLDER_RESEND_SKIP_SUBTYPES = new Set([
|
|
26
|
+
'bot_unavailable_fanout',
|
|
27
|
+
'hosted_unavailable_fanout',
|
|
28
|
+
'view_once_unavailable_fanout'
|
|
29
|
+
]);
|
|
19
30
|
function getRetryReasonName(code) {
|
|
20
31
|
if (code === undefined) {
|
|
21
32
|
return undefined;
|
|
@@ -36,27 +47,18 @@ function getRemoteRetryReasonLogFields(reason) {
|
|
|
36
47
|
class WaRetryCoordinator {
|
|
37
48
|
constructor(options) {
|
|
38
49
|
this.nextRetryCleanupAtMs = 0;
|
|
39
|
-
this.
|
|
40
|
-
this.
|
|
41
|
-
this.
|
|
42
|
-
this.
|
|
43
|
-
this.
|
|
44
|
-
this.sessionStore = options.sessionStore;
|
|
45
|
-
this.senderKeyStore = options.senderKeyStore;
|
|
46
|
-
this.signalProtocol = options.signalProtocol;
|
|
47
|
-
this.signalDeviceSync = options.signalDeviceSync;
|
|
48
|
-
this.signalMissingPreKeysSync = options.signalMissingPreKeysSync;
|
|
49
|
-
this.sendNode = options.sendNode;
|
|
50
|
-
this.getCurrentMeJid = options.getCurrentMeJid;
|
|
51
|
-
this.getCurrentMeLid = options.getCurrentMeLid;
|
|
52
|
-
this.getCurrentSignedIdentity = options.getCurrentSignedIdentity;
|
|
50
|
+
this.placeholderInFlight = new Set();
|
|
51
|
+
this.placeholderQueue = [];
|
|
52
|
+
this.placeholderTimer = null;
|
|
53
|
+
this.deps = options;
|
|
54
|
+
this.retryTtlMs = options.retryStore.getTtlMs?.() ?? constants_2.RETRY_OUTBOUND_TTL_MS;
|
|
53
55
|
this.retryReplayService = new replay_1.WaRetryReplayService({
|
|
54
|
-
logger:
|
|
56
|
+
logger: options.logger,
|
|
55
57
|
messageClient: options.messageClient,
|
|
56
|
-
signalProtocol:
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
58
|
+
signalProtocol: options.signalProtocol,
|
|
59
|
+
sessionResolver: options.sessionResolver,
|
|
60
|
+
getCurrentCredentials: options.getCurrentCredentials,
|
|
61
|
+
resolveUserIcdc: options.resolveUserIcdc
|
|
60
62
|
});
|
|
61
63
|
this.retryProcessingByMessageId = new Map();
|
|
62
64
|
this.retrySessionBaseKeys = new Map();
|
|
@@ -67,11 +69,14 @@ class WaRetryCoordinator {
|
|
|
67
69
|
if (!prepared) {
|
|
68
70
|
return false;
|
|
69
71
|
}
|
|
72
|
+
if (prepared.delegatedToPlaceholderResend) {
|
|
73
|
+
return true;
|
|
74
|
+
}
|
|
70
75
|
await this.sendDecryptFailureRetryReceipt(context, prepared);
|
|
71
76
|
return true;
|
|
72
77
|
}
|
|
73
78
|
catch (sendError) {
|
|
74
|
-
this.logger.warn('failed to send retry receipt for decrypt failure', {
|
|
79
|
+
this.deps.logger.warn('failed to send retry receipt for decrypt failure', {
|
|
75
80
|
id: context.stanzaId,
|
|
76
81
|
from: context.from,
|
|
77
82
|
participant: context.participant,
|
|
@@ -88,8 +93,9 @@ class WaRetryCoordinator {
|
|
|
88
93
|
try {
|
|
89
94
|
await this.maybeCleanupRetryStore(Date.now());
|
|
90
95
|
const expectedToJids = [];
|
|
91
|
-
const
|
|
92
|
-
const
|
|
96
|
+
const credentials = this.deps.getCurrentCredentials();
|
|
97
|
+
const meJid = credentials?.meJid?.trim();
|
|
98
|
+
const meLid = credentials?.meLid?.trim();
|
|
93
99
|
if (meJid) {
|
|
94
100
|
expectedToJids.push(meJid);
|
|
95
101
|
}
|
|
@@ -104,7 +110,7 @@ class WaRetryCoordinator {
|
|
|
104
110
|
await this.handleParsedRetryRequest(receiptNode, request);
|
|
105
111
|
}
|
|
106
112
|
catch (error) {
|
|
107
|
-
this.logger.warn('failed handling incoming retry request', {
|
|
113
|
+
this.deps.logger.warn('failed handling incoming retry request', {
|
|
108
114
|
id: receiptNode.attrs.id,
|
|
109
115
|
from: receiptNode.attrs.from,
|
|
110
116
|
participant: receiptNode.attrs.participant,
|
|
@@ -119,13 +125,14 @@ class WaRetryCoordinator {
|
|
|
119
125
|
}
|
|
120
126
|
isRetryReceiptNode(node) {
|
|
121
127
|
return (node.tag === constants_1.WA_MESSAGE_TAGS.RECEIPT &&
|
|
122
|
-
(node.attrs.type ===
|
|
128
|
+
(node.attrs.type === constants_1.WA_MESSAGE_TYPES.RECEIPT_TYPE_RETRY ||
|
|
129
|
+
node.attrs.type === constants_1.WA_MESSAGE_TYPES.RECEIPT_TYPE_ENC_REKEY_RETRY));
|
|
123
130
|
}
|
|
124
131
|
async prepareDecryptFailureRetry(context, error) {
|
|
125
132
|
const nowMs = Date.now();
|
|
126
|
-
const registrationInfo = await this.signalStore.getRegistrationInfo();
|
|
133
|
+
const registrationInfo = await this.deps.signalStore.getRegistrationInfo();
|
|
127
134
|
if (!registrationInfo) {
|
|
128
|
-
this.logger.warn('retry receipt skipped: missing local registration info', {
|
|
135
|
+
this.deps.logger.warn('retry receipt skipped: missing local registration info', {
|
|
129
136
|
id: context.stanzaId,
|
|
130
137
|
from: context.from
|
|
131
138
|
});
|
|
@@ -133,23 +140,41 @@ class WaRetryCoordinator {
|
|
|
133
140
|
}
|
|
134
141
|
const requester = context.participant ?? context.from;
|
|
135
142
|
const expiresAtMs = nowMs + this.retryTtlMs;
|
|
136
|
-
const retryCount = await this.retryStore.incrementInboundCounter(context.stanzaId, requester, nowMs, expiresAtMs);
|
|
143
|
+
const retryCount = await this.deps.retryStore.incrementInboundCounter(context.stanzaId, requester, nowMs, expiresAtMs);
|
|
144
|
+
const delegatedToPlaceholderResend = retryCount >= PLACEHOLDER_RESEND_RETRY_THRESHOLD &&
|
|
145
|
+
this.enqueuePlaceholderResend(context);
|
|
146
|
+
if (delegatedToPlaceholderResend) {
|
|
147
|
+
return {
|
|
148
|
+
registrationId: registrationInfo.registrationId,
|
|
149
|
+
retryCount,
|
|
150
|
+
retryReason: (0, reason_1.mapRetryReasonFromError)(error),
|
|
151
|
+
timestamp: context.t ?? String(Math.trunc(nowMs / 1000)),
|
|
152
|
+
delegatedToPlaceholderResend: true
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
const senderDeviceJid = context.participant ?? context.from;
|
|
156
|
+
const forceKeysForHosted = senderDeviceJid ? (0, jid_1.isHostedDeviceJid)(senderDeviceJid) : false;
|
|
137
157
|
return {
|
|
138
158
|
registrationId: registrationInfo.registrationId,
|
|
139
159
|
retryCount,
|
|
140
|
-
retryKeys: retryCount >= constants_2.RETRY_KEYS_MIN_COUNT
|
|
141
|
-
? await this.buildRetryKeysSection(registrationInfo.identityKeyPair.pubKey
|
|
160
|
+
retryKeys: forceKeysForHosted || retryCount >= constants_2.RETRY_KEYS_MIN_COUNT
|
|
161
|
+
? ((await this.buildRetryKeysSection(registrationInfo.identityKeyPair.pubKey, {
|
|
162
|
+
stanzaId: context.stanzaId,
|
|
163
|
+
from: context.from
|
|
164
|
+
})) ?? undefined)
|
|
142
165
|
: undefined,
|
|
143
166
|
retryReason: (0, reason_1.mapRetryReasonFromError)(error),
|
|
144
|
-
timestamp: context.t ?? String(Math.trunc(nowMs / 1000))
|
|
167
|
+
timestamp: context.t ?? String(Math.trunc(nowMs / 1000)),
|
|
168
|
+
delegatedToPlaceholderResend: false
|
|
145
169
|
};
|
|
146
170
|
}
|
|
147
171
|
async sendDecryptFailureRetryReceipt(context, prepared) {
|
|
172
|
+
const recipient = context.recipient ?? this.resolvePeerRetryRecipient(context);
|
|
148
173
|
const retryReceiptNode = (0, retry_1.buildRetryReceiptNode)({
|
|
149
174
|
stanzaId: context.stanzaId,
|
|
150
175
|
to: context.from,
|
|
151
176
|
participant: context.participant,
|
|
152
|
-
recipient
|
|
177
|
+
recipient,
|
|
153
178
|
originalMsgId: context.stanzaId,
|
|
154
179
|
retryCount: prepared.retryCount,
|
|
155
180
|
t: prepared.timestamp,
|
|
@@ -158,19 +183,40 @@ class WaRetryCoordinator {
|
|
|
158
183
|
categoryPeer: context.messageNode.attrs.category === 'peer',
|
|
159
184
|
keys: prepared.retryKeys
|
|
160
185
|
});
|
|
161
|
-
await this.sendNode(retryReceiptNode);
|
|
162
|
-
this.logger.
|
|
186
|
+
await this.deps.sendNode(retryReceiptNode);
|
|
187
|
+
this.deps.logger.trace('sent retry receipt for decrypt failure', {
|
|
163
188
|
id: context.stanzaId,
|
|
164
189
|
to: context.from,
|
|
165
190
|
participant: context.participant,
|
|
191
|
+
recipient,
|
|
166
192
|
retryCount: prepared.retryCount,
|
|
167
193
|
reason: prepared.retryReason,
|
|
168
194
|
withKeys: prepared.retryKeys !== undefined
|
|
169
195
|
});
|
|
170
196
|
}
|
|
197
|
+
resolvePeerRetryRecipient(context) {
|
|
198
|
+
if (!context.participant) {
|
|
199
|
+
return undefined;
|
|
200
|
+
}
|
|
201
|
+
const meLid = this.deps.getCurrentCredentials()?.meLid;
|
|
202
|
+
if (!meLid) {
|
|
203
|
+
return undefined;
|
|
204
|
+
}
|
|
205
|
+
try {
|
|
206
|
+
const participantUser = (0, jid_1.toUserJid)(context.participant);
|
|
207
|
+
const meUserLid = (0, jid_1.toUserJid)(meLid);
|
|
208
|
+
if (participantUser !== meUserLid) {
|
|
209
|
+
return undefined;
|
|
210
|
+
}
|
|
211
|
+
return meUserLid;
|
|
212
|
+
}
|
|
213
|
+
catch {
|
|
214
|
+
return undefined;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
171
217
|
async handleParsedRetryRequest(receiptNode, request) {
|
|
172
|
-
if (request.type ===
|
|
173
|
-
this.logger.
|
|
218
|
+
if (request.type === constants_1.WA_MESSAGE_TYPES.RECEIPT_TYPE_ENC_REKEY_RETRY) {
|
|
219
|
+
this.deps.logger.debug('received enc_rekey_retry request (voip path deferred)', {
|
|
174
220
|
id: request.stanzaId,
|
|
175
221
|
originalMsgId: request.originalMsgId,
|
|
176
222
|
from: request.from,
|
|
@@ -189,34 +235,35 @@ class WaRetryCoordinator {
|
|
|
189
235
|
if (!prepared) {
|
|
190
236
|
return;
|
|
191
237
|
}
|
|
238
|
+
const requestLogger = this.deps.logger.child({
|
|
239
|
+
id: request.stanzaId,
|
|
240
|
+
originalMsgId: request.originalMsgId,
|
|
241
|
+
requester: prepared.requesterJid
|
|
242
|
+
});
|
|
192
243
|
const resendResult = await this.retryReplayService.resendOutboundMessage(prepared.outbound, prepared.requesterJid, request.retryCount);
|
|
193
244
|
if (resendResult === 'ineligible') {
|
|
194
|
-
|
|
195
|
-
id: request.stanzaId,
|
|
196
|
-
originalMsgId: request.originalMsgId,
|
|
197
|
-
requester: prepared.requesterJid,
|
|
245
|
+
requestLogger.debug('retry request marked ineligible for resend', {
|
|
198
246
|
mode: prepared.outbound.replayMode
|
|
199
247
|
});
|
|
200
248
|
return;
|
|
201
249
|
}
|
|
202
|
-
|
|
203
|
-
id: request.stanzaId,
|
|
204
|
-
originalMsgId: request.originalMsgId,
|
|
205
|
-
requester: prepared.requesterJid,
|
|
250
|
+
requestLogger.debug('retry request processed and resent', {
|
|
206
251
|
mode: prepared.outbound.replayMode,
|
|
207
252
|
remoteRetryCount: request.retryCount,
|
|
208
253
|
...getRemoteRetryReasonLogFields(request.retryReason)
|
|
209
254
|
});
|
|
210
255
|
}
|
|
211
256
|
async prepareRetryResend(request) {
|
|
257
|
+
const requestLogger = this.deps.logger.child({
|
|
258
|
+
id: request.stanzaId,
|
|
259
|
+
originalMsgId: request.originalMsgId
|
|
260
|
+
});
|
|
212
261
|
const requesterJid = request.participant ?? request.from ?? null;
|
|
213
262
|
if (!requesterJid) {
|
|
214
|
-
|
|
215
|
-
id: request.stanzaId,
|
|
216
|
-
originalMsgId: request.originalMsgId
|
|
217
|
-
});
|
|
263
|
+
requestLogger.warn('retry request ignored: missing requester jid');
|
|
218
264
|
return null;
|
|
219
265
|
}
|
|
266
|
+
const requesterLogger = requestLogger.child({ requester: requesterJid });
|
|
220
267
|
let requesterAddress;
|
|
221
268
|
let requesterNormalizedDeviceJid;
|
|
222
269
|
try {
|
|
@@ -225,39 +272,26 @@ class WaRetryCoordinator {
|
|
|
225
272
|
requesterNormalizedDeviceJid = requesterParsed.normalizedJid;
|
|
226
273
|
}
|
|
227
274
|
catch (error) {
|
|
228
|
-
|
|
229
|
-
id: request.stanzaId,
|
|
230
|
-
originalMsgId: request.originalMsgId,
|
|
231
|
-
requester: requesterJid,
|
|
275
|
+
requesterLogger.debug('retry request rejected: invalid requester jid', {
|
|
232
276
|
message: (0, primitives_1.toError)(error).message
|
|
233
277
|
});
|
|
234
278
|
return null;
|
|
235
279
|
}
|
|
236
280
|
if (request.retryCount >= constants_2.MAX_RETRY_ATTEMPTS) {
|
|
237
|
-
|
|
238
|
-
id: request.stanzaId,
|
|
239
|
-
originalMsgId: request.originalMsgId,
|
|
240
|
-
requester: requesterJid,
|
|
281
|
+
requesterLogger.debug('retry request rejected: retry count exceeded', {
|
|
241
282
|
remoteRetryCount: request.retryCount,
|
|
242
283
|
...getRemoteRetryReasonLogFields(request.retryReason)
|
|
243
284
|
});
|
|
244
285
|
return null;
|
|
245
286
|
}
|
|
246
|
-
const outbound = await this.retryStore.getOutboundMessage(request.originalMsgId);
|
|
287
|
+
const outbound = await this.deps.retryStore.getOutboundMessage(request.originalMsgId);
|
|
247
288
|
if (!outbound) {
|
|
248
|
-
|
|
249
|
-
id: request.stanzaId,
|
|
250
|
-
originalMsgId: request.originalMsgId,
|
|
251
|
-
requester: requesterJid
|
|
252
|
-
});
|
|
289
|
+
requesterLogger.debug('retry request ignored: outbound message not found');
|
|
253
290
|
return null;
|
|
254
291
|
}
|
|
255
292
|
const sessionReady = await this.updateLocalSessionFromRetryRequest(request, requesterJid, requesterAddress, requesterNormalizedDeviceJid);
|
|
256
293
|
if (!sessionReady) {
|
|
257
|
-
|
|
258
|
-
id: request.stanzaId,
|
|
259
|
-
originalMsgId: request.originalMsgId,
|
|
260
|
-
requester: requesterJid,
|
|
294
|
+
requesterLogger.debug('retry request rejected: missing compatible session', {
|
|
261
295
|
remoteRetryCount: request.retryCount,
|
|
262
296
|
...getRemoteRetryReasonLogFields(request.retryReason)
|
|
263
297
|
});
|
|
@@ -265,10 +299,7 @@ class WaRetryCoordinator {
|
|
|
265
299
|
}
|
|
266
300
|
const authorization = await this.authorizeRetryRequest(request, outbound, requesterJid, requesterAddress, requesterNormalizedDeviceJid);
|
|
267
301
|
if (!authorization.authorized) {
|
|
268
|
-
|
|
269
|
-
id: request.stanzaId,
|
|
270
|
-
originalMsgId: request.originalMsgId,
|
|
271
|
-
requester: requesterJid,
|
|
302
|
+
requesterLogger.debug('retry request rejected', {
|
|
272
303
|
reason: authorization.reason,
|
|
273
304
|
remoteRetryCount: request.retryCount,
|
|
274
305
|
...getRemoteRetryReasonLogFields(request.retryReason)
|
|
@@ -291,7 +322,8 @@ class WaRetryCoordinator {
|
|
|
291
322
|
return;
|
|
292
323
|
}
|
|
293
324
|
const receiptType = receiptNode.attrs.type;
|
|
294
|
-
if (receiptType ===
|
|
325
|
+
if (receiptType === constants_1.WA_MESSAGE_TYPES.RECEIPT_TYPE_RETRY ||
|
|
326
|
+
receiptType === constants_1.WA_MESSAGE_TYPES.RECEIPT_TYPE_ENC_REKEY_RETRY) {
|
|
295
327
|
return;
|
|
296
328
|
}
|
|
297
329
|
const nextState = this.mapOutboundStateFromReceiptType(receiptType);
|
|
@@ -299,7 +331,7 @@ class WaRetryCoordinator {
|
|
|
299
331
|
return;
|
|
300
332
|
}
|
|
301
333
|
await this.runRetryTaskSerialized(messageId, async () => {
|
|
302
|
-
const current = await this.retryStore.getOutboundMessage(messageId);
|
|
334
|
+
const current = await this.deps.retryStore.getOutboundMessage(messageId);
|
|
303
335
|
if (!current) {
|
|
304
336
|
return;
|
|
305
337
|
}
|
|
@@ -307,17 +339,17 @@ class WaRetryCoordinator {
|
|
|
307
339
|
const expiresAtMs = nowMs + this.retryTtlMs;
|
|
308
340
|
const merged = (0, parse_1.pickRetryStateMax)(current.state, nextState);
|
|
309
341
|
if (merged !== current.state) {
|
|
310
|
-
await this.retryStore.updateOutboundMessageState(messageId, merged, nowMs, expiresAtMs);
|
|
342
|
+
await this.deps.retryStore.updateOutboundMessageState(messageId, merged, nowMs, expiresAtMs);
|
|
311
343
|
}
|
|
312
344
|
const requesterJid = receiptNode.attrs.participant ?? receiptNode.attrs.from;
|
|
313
345
|
if (!requesterJid) {
|
|
314
346
|
return;
|
|
315
347
|
}
|
|
316
348
|
try {
|
|
317
|
-
await this.retryStore.markOutboundRequesterDelivered(messageId, (0, jid_1.normalizeDeviceJid)(requesterJid), nowMs, expiresAtMs);
|
|
349
|
+
await this.deps.retryStore.markOutboundRequesterDelivered(messageId, (0, jid_1.normalizeDeviceJid)(requesterJid), nowMs, expiresAtMs);
|
|
318
350
|
}
|
|
319
351
|
catch (error) {
|
|
320
|
-
this.logger.warn('failed to update outbound requester delivery state', {
|
|
352
|
+
this.deps.logger.warn('failed to update outbound requester delivery state', {
|
|
321
353
|
id: messageId,
|
|
322
354
|
requester: requesterJid,
|
|
323
355
|
message: (0, primitives_1.toError)(error).message
|
|
@@ -340,17 +372,20 @@ class WaRetryCoordinator {
|
|
|
340
372
|
}
|
|
341
373
|
}
|
|
342
374
|
}
|
|
343
|
-
async buildRetryKeysSection(identity) {
|
|
375
|
+
async buildRetryKeysSection(identity, logContext) {
|
|
344
376
|
const [signedPreKey, preKey] = await Promise.all([
|
|
345
|
-
this.signalStore.getSignedPreKey(),
|
|
346
|
-
this.preKeyStore.getOrGenSinglePreKey(keygen_1.generatePreKeyPair)
|
|
377
|
+
this.deps.signalStore.getSignedPreKey(),
|
|
378
|
+
this.deps.preKeyStore.getOrGenSinglePreKey(keygen_1.generatePreKeyPair)
|
|
347
379
|
]);
|
|
348
380
|
if (!signedPreKey) {
|
|
349
|
-
this.logger.warn('retry keys section skipped: signed prekey unavailable'
|
|
350
|
-
|
|
381
|
+
this.deps.logger.warn('retry keys section skipped: signed prekey unavailable', {
|
|
382
|
+
id: logContext.stanzaId,
|
|
383
|
+
from: logContext.from
|
|
384
|
+
});
|
|
385
|
+
return null;
|
|
351
386
|
}
|
|
352
|
-
await this.preKeyStore.markKeyAsUploaded(preKey.keyId);
|
|
353
|
-
const signedIdentity = this.
|
|
387
|
+
await this.deps.preKeyStore.markKeyAsUploaded(preKey.keyId);
|
|
388
|
+
const signedIdentity = this.deps.getCurrentCredentials()?.signedIdentity;
|
|
354
389
|
return {
|
|
355
390
|
identity,
|
|
356
391
|
key: {
|
|
@@ -368,13 +403,18 @@ class WaRetryCoordinator {
|
|
|
368
403
|
};
|
|
369
404
|
}
|
|
370
405
|
async updateLocalSessionFromRetryRequest(request, requesterJid, requesterAddress, requesterNormalizedDeviceJid) {
|
|
406
|
+
const requestLogger = this.deps.logger.child({
|
|
407
|
+
id: request.stanzaId,
|
|
408
|
+
originalMsgId: request.originalMsgId,
|
|
409
|
+
requester: requesterJid
|
|
410
|
+
});
|
|
371
411
|
const [, currentSession] = await Promise.all([
|
|
372
412
|
this.markRetryRequesterSenderKeyAsStale(request, requesterJid, requesterAddress),
|
|
373
|
-
this.sessionStore.getSession(requesterAddress)
|
|
413
|
+
this.deps.sessionStore.getSession(requesterAddress)
|
|
374
414
|
]);
|
|
375
415
|
const regIdMismatch = !!currentSession && request.regId > 0 && currentSession.remote.regId !== request.regId;
|
|
376
416
|
if (regIdMismatch && !request.keyBundle) {
|
|
377
|
-
await this.sessionStore.deleteSession(requesterAddress);
|
|
417
|
+
await this.deps.sessionStore.deleteSession(requesterAddress);
|
|
378
418
|
}
|
|
379
419
|
if (request.keyBundle) {
|
|
380
420
|
if (!request.keyBundle.key || !request.keyBundle.skey.signature) {
|
|
@@ -382,32 +422,26 @@ class WaRetryCoordinator {
|
|
|
382
422
|
}
|
|
383
423
|
if (request.offline) {
|
|
384
424
|
if (!currentSession) {
|
|
385
|
-
|
|
386
|
-
id: request.stanzaId,
|
|
387
|
-
originalMsgId: request.originalMsgId,
|
|
388
|
-
requester: requesterJid,
|
|
425
|
+
requestLogger.debug('retry request rejected: offline retry missing existing session', {
|
|
389
426
|
remoteRetryCount: request.retryCount,
|
|
390
427
|
...getRemoteRetryReasonLogFields(request.retryReason)
|
|
391
428
|
});
|
|
392
|
-
await this.sessionStore.deleteSession(requesterAddress);
|
|
429
|
+
await this.deps.sessionStore.deleteSession(requesterAddress);
|
|
393
430
|
return false;
|
|
394
431
|
}
|
|
395
432
|
if (regIdMismatch) {
|
|
396
|
-
|
|
397
|
-
id: request.stanzaId,
|
|
398
|
-
originalMsgId: request.originalMsgId,
|
|
399
|
-
requester: requesterJid,
|
|
433
|
+
requestLogger.debug('retry request rejected: offline retry registration id mismatch', {
|
|
400
434
|
remoteRetryCount: request.retryCount,
|
|
401
435
|
...getRemoteRetryReasonLogFields(request.retryReason)
|
|
402
436
|
});
|
|
403
|
-
await this.sessionStore.deleteSession(requesterAddress);
|
|
437
|
+
await this.deps.sessionStore.deleteSession(requesterAddress);
|
|
404
438
|
return false;
|
|
405
439
|
}
|
|
406
440
|
}
|
|
407
441
|
else if (regIdMismatch) {
|
|
408
|
-
await this.sessionStore.deleteSession(requesterAddress);
|
|
442
|
+
await this.deps.sessionStore.deleteSession(requesterAddress);
|
|
409
443
|
}
|
|
410
|
-
await this.signalProtocol.establishOutgoingSession(requesterAddress, {
|
|
444
|
+
await this.deps.signalProtocol.establishOutgoingSession(requesterAddress, {
|
|
411
445
|
regId: request.regId,
|
|
412
446
|
identity: request.keyBundle.identity,
|
|
413
447
|
signedKey: {
|
|
@@ -430,14 +464,14 @@ class WaRetryCoordinator {
|
|
|
430
464
|
if (!fetched) {
|
|
431
465
|
return false;
|
|
432
466
|
}
|
|
433
|
-
await this.signalProtocol.establishOutgoingSession(requesterAddress, fetched);
|
|
467
|
+
await this.deps.signalProtocol.establishOutgoingSession(requesterAddress, fetched);
|
|
434
468
|
return this.applySessionBaseKeyPolicy(request, requesterJid, requesterAddress, requesterNormalizedDeviceJid);
|
|
435
469
|
}
|
|
436
470
|
async applySessionBaseKeyPolicy(request, requesterJid, requesterAddress, requesterNormalizedDeviceJid) {
|
|
437
471
|
if (request.retryCount < 2) {
|
|
438
472
|
return true;
|
|
439
473
|
}
|
|
440
|
-
const currentSession = await this.sessionStore.getSession(requesterAddress);
|
|
474
|
+
const currentSession = await this.deps.sessionStore.getSession(requesterAddress);
|
|
441
475
|
const sessionBaseKey = currentSession?.aliceBaseKey ?? null;
|
|
442
476
|
if (!sessionBaseKey) {
|
|
443
477
|
return true;
|
|
@@ -451,8 +485,8 @@ class WaRetryCoordinator {
|
|
|
451
485
|
if (!saved || !(0, bytes_1.uint8Equal)(saved.baseKey, sessionBaseKey)) {
|
|
452
486
|
return true;
|
|
453
487
|
}
|
|
454
|
-
await this.sessionStore.deleteSession(requesterAddress);
|
|
455
|
-
this.logger.
|
|
488
|
+
await this.deps.sessionStore.deleteSession(requesterAddress);
|
|
489
|
+
this.deps.logger.debug('retry request forcing session refresh due to repeated base key', {
|
|
456
490
|
id: request.stanzaId,
|
|
457
491
|
originalMsgId: request.originalMsgId,
|
|
458
492
|
requester: requesterJid,
|
|
@@ -463,7 +497,7 @@ class WaRetryCoordinator {
|
|
|
463
497
|
if (!fetched) {
|
|
464
498
|
return false;
|
|
465
499
|
}
|
|
466
|
-
await this.signalProtocol.establishOutgoingSession(requesterAddress, fetched);
|
|
500
|
+
await this.deps.signalProtocol.establishOutgoingSession(requesterAddress, fetched);
|
|
467
501
|
return true;
|
|
468
502
|
}
|
|
469
503
|
async markRetryRequesterSenderKeyAsStale(request, requesterJid, requesterAddress) {
|
|
@@ -471,17 +505,17 @@ class WaRetryCoordinator {
|
|
|
471
505
|
return;
|
|
472
506
|
}
|
|
473
507
|
try {
|
|
474
|
-
const deleted = await this.senderKeyStore.markForgetSenderKey(request.from, [
|
|
508
|
+
const deleted = await this.deps.senderKeyStore.markForgetSenderKey(request.from, [
|
|
475
509
|
requesterAddress
|
|
476
510
|
]);
|
|
477
|
-
this.logger.debug('marked sender key as stale for group retry requester', {
|
|
511
|
+
this.deps.logger.debug('marked sender key as stale for group retry requester', {
|
|
478
512
|
groupJid: request.from,
|
|
479
513
|
requester: requesterJid,
|
|
480
514
|
deleted
|
|
481
515
|
});
|
|
482
516
|
}
|
|
483
517
|
catch (error) {
|
|
484
|
-
this.logger.warn('failed to mark sender key as stale for group retry requester', {
|
|
518
|
+
this.deps.logger.warn('failed to mark sender key as stale for group retry requester', {
|
|
485
519
|
groupJid: request.from,
|
|
486
520
|
requester: requesterJid,
|
|
487
521
|
message: (0, primitives_1.toError)(error).message
|
|
@@ -489,8 +523,9 @@ class WaRetryCoordinator {
|
|
|
489
523
|
}
|
|
490
524
|
}
|
|
491
525
|
async fetchMissingPreKeysSession(requesterJid, requesterAddress, requesterNormalizedDeviceJid, requesterRegistrationId) {
|
|
526
|
+
const requesterLogger = this.deps.logger.child({ requester: requesterJid });
|
|
492
527
|
try {
|
|
493
|
-
const results = await this.signalMissingPreKeysSync.fetchMissingPreKeys([
|
|
528
|
+
const results = await this.deps.signalMissingPreKeysSync.fetchMissingPreKeys([
|
|
494
529
|
{
|
|
495
530
|
userJid: `${requesterAddress.user}@${requesterAddress.server}`,
|
|
496
531
|
devices: [
|
|
@@ -503,16 +538,14 @@ class WaRetryCoordinator {
|
|
|
503
538
|
]);
|
|
504
539
|
const first = results[0];
|
|
505
540
|
if (!first || !('devices' in first)) {
|
|
506
|
-
|
|
507
|
-
requester: requesterJid,
|
|
541
|
+
requesterLogger.debug('missing prekeys fetch returned user error', {
|
|
508
542
|
errorText: first && 'errorText' in first ? first.errorText : 'unknown'
|
|
509
543
|
});
|
|
510
544
|
return null;
|
|
511
545
|
}
|
|
512
546
|
const matched = first.devices.find((device) => (0, jid_1.normalizeDeviceJid)(device.deviceJid) === requesterNormalizedDeviceJid);
|
|
513
547
|
if (!matched) {
|
|
514
|
-
|
|
515
|
-
requester: requesterJid,
|
|
548
|
+
requesterLogger.debug('missing prekeys fetch did not return requested device', {
|
|
516
549
|
devices: first.devices.length
|
|
517
550
|
});
|
|
518
551
|
return null;
|
|
@@ -520,8 +553,7 @@ class WaRetryCoordinator {
|
|
|
520
553
|
return matched.bundle;
|
|
521
554
|
}
|
|
522
555
|
catch (error) {
|
|
523
|
-
|
|
524
|
-
requester: requesterJid,
|
|
556
|
+
requesterLogger.debug('failed to fetch missing prekeys for retry requester', {
|
|
525
557
|
message: (0, primitives_1.toError)(error).message
|
|
526
558
|
});
|
|
527
559
|
return null;
|
|
@@ -533,10 +565,10 @@ class WaRetryCoordinator {
|
|
|
533
565
|
}
|
|
534
566
|
let requesterStatus = null;
|
|
535
567
|
try {
|
|
536
|
-
requesterStatus = await this.retryStore.getOutboundRequesterStatus(outbound.messageId, requesterNormalizedDeviceJid);
|
|
568
|
+
requesterStatus = await this.deps.retryStore.getOutboundRequesterStatus(outbound.messageId, (0, jid_1.toUserJid)(requesterNormalizedDeviceJid));
|
|
537
569
|
}
|
|
538
570
|
catch (error) {
|
|
539
|
-
this.logger.warn('failed to resolve outbound requester status from retry store', {
|
|
571
|
+
this.deps.logger.warn('failed to resolve outbound requester status from retry store', {
|
|
540
572
|
id: request.stanzaId,
|
|
541
573
|
originalMsgId: request.originalMsgId,
|
|
542
574
|
requester: requesterJid,
|
|
@@ -569,7 +601,7 @@ class WaRetryCoordinator {
|
|
|
569
601
|
if (requesterNormalizedDeviceJid === (0, jid_1.normalizeDeviceJid)(requesterUser)) {
|
|
570
602
|
return true;
|
|
571
603
|
}
|
|
572
|
-
const synced = await this.signalDeviceSync.syncDeviceList([requesterUser]);
|
|
604
|
+
const synced = await this.deps.signalDeviceSync.syncDeviceList([requesterUser]);
|
|
573
605
|
const target = synced.find((entry) => entry.jid === requesterUser);
|
|
574
606
|
if (!target) {
|
|
575
607
|
return false;
|
|
@@ -582,7 +614,7 @@ class WaRetryCoordinator {
|
|
|
582
614
|
return false;
|
|
583
615
|
}
|
|
584
616
|
catch (error) {
|
|
585
|
-
this.logger.warn('retry authorization failed while syncing requester device list', {
|
|
617
|
+
this.deps.logger.warn('retry authorization failed while syncing requester device list', {
|
|
586
618
|
requester: requesterJid,
|
|
587
619
|
message: (0, primitives_1.toError)(error).message
|
|
588
620
|
});
|
|
@@ -590,25 +622,25 @@ class WaRetryCoordinator {
|
|
|
590
622
|
}
|
|
591
623
|
}
|
|
592
624
|
mapOutboundStateFromReceiptType(type) {
|
|
593
|
-
if (type ===
|
|
625
|
+
if (type === constants_1.WA_MESSAGE_TYPES.RECEIPT_TYPE_READ) {
|
|
594
626
|
return 'read';
|
|
595
627
|
}
|
|
596
|
-
if (type ===
|
|
628
|
+
if (type === constants_1.WA_MESSAGE_TYPES.RECEIPT_TYPE_PLAYED) {
|
|
597
629
|
return 'played';
|
|
598
630
|
}
|
|
599
631
|
if (type === undefined ||
|
|
600
632
|
type === '' ||
|
|
601
|
-
type ===
|
|
602
|
-
type ===
|
|
603
|
-
type ===
|
|
604
|
-
type ===
|
|
633
|
+
type === constants_1.WA_MESSAGE_TYPES.RECEIPT_TYPE_DELIVERY ||
|
|
634
|
+
type === constants_1.WA_MESSAGE_TYPES.RECEIPT_TYPE_SENDER ||
|
|
635
|
+
type === constants_1.WA_MESSAGE_TYPES.RECEIPT_TYPE_INACTIVE ||
|
|
636
|
+
type === constants_1.WA_MESSAGE_TYPES.RECEIPT_TYPE_PEER) {
|
|
605
637
|
return 'delivered';
|
|
606
638
|
}
|
|
607
639
|
return null;
|
|
608
640
|
}
|
|
609
641
|
async sendRetryAckSafe(receiptNode) {
|
|
610
642
|
if (!receiptNode.attrs.id || !receiptNode.attrs.from) {
|
|
611
|
-
this.logger.warn('retry ack skipped: missing receipt id/from', {
|
|
643
|
+
this.deps.logger.warn('retry ack skipped: missing receipt id/from', {
|
|
612
644
|
hasId: receiptNode.attrs.id !== undefined,
|
|
613
645
|
hasFrom: receiptNode.attrs.from !== undefined,
|
|
614
646
|
participant: receiptNode.attrs.participant,
|
|
@@ -617,14 +649,14 @@ class WaRetryCoordinator {
|
|
|
617
649
|
return;
|
|
618
650
|
}
|
|
619
651
|
try {
|
|
620
|
-
await this.sendNode((0, global_1.buildAckNode)({
|
|
652
|
+
await this.deps.sendNode((0, global_1.buildAckNode)({
|
|
621
653
|
kind: 'receipt',
|
|
622
654
|
node: receiptNode,
|
|
623
655
|
retryType: true
|
|
624
656
|
}));
|
|
625
657
|
}
|
|
626
658
|
catch (error) {
|
|
627
|
-
this.logger.warn('failed to send retry ack', {
|
|
659
|
+
this.deps.logger.warn('failed to send retry ack', {
|
|
628
660
|
id: receiptNode.attrs.id,
|
|
629
661
|
from: receiptNode.attrs.from,
|
|
630
662
|
participant: receiptNode.attrs.participant,
|
|
@@ -639,10 +671,10 @@ class WaRetryCoordinator {
|
|
|
639
671
|
this.nextRetryCleanupAtMs = nowMs + RETRY_CLEANUP_INTERVAL_MS;
|
|
640
672
|
this.cleanupRetrySessionBaseKeys(nowMs);
|
|
641
673
|
try {
|
|
642
|
-
await this.retryStore.cleanupExpired(nowMs);
|
|
674
|
+
await this.deps.retryStore.cleanupExpired(nowMs);
|
|
643
675
|
}
|
|
644
676
|
catch (error) {
|
|
645
|
-
this.logger.warn('retry store cleanup failed', {
|
|
677
|
+
this.deps.logger.warn('retry store cleanup failed', {
|
|
646
678
|
message: (0, primitives_1.toError)(error).message
|
|
647
679
|
});
|
|
648
680
|
}
|
|
@@ -677,5 +709,104 @@ class WaRetryCoordinator {
|
|
|
677
709
|
this.retrySessionBaseKeys.delete(key);
|
|
678
710
|
}
|
|
679
711
|
}
|
|
712
|
+
isSenderFromOwnAccount(context) {
|
|
713
|
+
const senderUser = (0, jid_1.parseSignalAddressFromJid)(context.participant ?? context.from).user;
|
|
714
|
+
const credentials = this.deps.getCurrentCredentials();
|
|
715
|
+
const meLid = credentials?.meLid;
|
|
716
|
+
if (meLid && (0, jid_1.parseSignalAddressFromJid)(meLid).user === senderUser)
|
|
717
|
+
return true;
|
|
718
|
+
const meJid = credentials?.meJid;
|
|
719
|
+
return !!meJid && (0, jid_1.parseSignalAddressFromJid)(meJid).user === senderUser;
|
|
720
|
+
}
|
|
721
|
+
enqueuePlaceholderResend(context) {
|
|
722
|
+
if (!this.deps.peerDataOperation || !this.deps.emitIncomingMessage) {
|
|
723
|
+
return false;
|
|
724
|
+
}
|
|
725
|
+
const subtype = context.messageNode.attrs.subtype;
|
|
726
|
+
if (typeof subtype === 'string' && PLACEHOLDER_RESEND_SKIP_SUBTYPES.has(subtype)) {
|
|
727
|
+
return false;
|
|
728
|
+
}
|
|
729
|
+
const timestampSeconds = context.t ? Number(context.t) : Date.now() / 1000;
|
|
730
|
+
if (Number.isFinite(timestampSeconds)) {
|
|
731
|
+
const ageSeconds = Date.now() / 1000 - timestampSeconds;
|
|
732
|
+
if (ageSeconds > PLACEHOLDER_RESEND_MAX_AGE_SECONDS) {
|
|
733
|
+
return false;
|
|
734
|
+
}
|
|
735
|
+
}
|
|
736
|
+
if (this.placeholderInFlight.has(context.stanzaId)) {
|
|
737
|
+
return true;
|
|
738
|
+
}
|
|
739
|
+
if (this.placeholderInFlight.size >= PLACEHOLDER_RESEND_IN_FLIGHT_MAX) {
|
|
740
|
+
this.deps.logger.warn('placeholder resend: in-flight set saturated, dropping enqueue', {
|
|
741
|
+
id: context.stanzaId,
|
|
742
|
+
maxInFlight: PLACEHOLDER_RESEND_IN_FLIGHT_MAX
|
|
743
|
+
});
|
|
744
|
+
return false;
|
|
745
|
+
}
|
|
746
|
+
this.placeholderInFlight.add(context.stanzaId);
|
|
747
|
+
this.placeholderQueue.push({
|
|
748
|
+
remoteJid: context.from,
|
|
749
|
+
id: context.stanzaId,
|
|
750
|
+
fromMe: this.isSenderFromOwnAccount(context),
|
|
751
|
+
participant: context.participant
|
|
752
|
+
});
|
|
753
|
+
if (this.placeholderTimer === null) {
|
|
754
|
+
this.placeholderTimer = setTimeout(() => {
|
|
755
|
+
this.placeholderTimer = null;
|
|
756
|
+
void this.flushPlaceholderBatch();
|
|
757
|
+
}, PLACEHOLDER_RESEND_DEBOUNCE_MS);
|
|
758
|
+
}
|
|
759
|
+
return true;
|
|
760
|
+
}
|
|
761
|
+
async flushPlaceholderBatch() {
|
|
762
|
+
const peerDataOperation = this.deps.peerDataOperation;
|
|
763
|
+
const emitIncomingMessage = this.deps.emitIncomingMessage;
|
|
764
|
+
if (!peerDataOperation || !emitIncomingMessage) {
|
|
765
|
+
this.placeholderQueue = [];
|
|
766
|
+
this.placeholderInFlight.clear();
|
|
767
|
+
return;
|
|
768
|
+
}
|
|
769
|
+
while (this.placeholderQueue.length > 0) {
|
|
770
|
+
const batch = this.placeholderQueue.splice(0, PLACEHOLDER_RESEND_BATCH_SIZE);
|
|
771
|
+
try {
|
|
772
|
+
const results = await peerDataOperation.request(_proto_1.proto.Message.PeerDataOperationRequestType.PLACEHOLDER_MESSAGE_RESEND, {
|
|
773
|
+
placeholderMessageResendRequest: batch.map((item) => ({
|
|
774
|
+
messageKey: {
|
|
775
|
+
remoteJid: item.remoteJid,
|
|
776
|
+
id: item.id,
|
|
777
|
+
fromMe: item.fromMe,
|
|
778
|
+
participant: item.participant
|
|
779
|
+
}
|
|
780
|
+
}))
|
|
781
|
+
});
|
|
782
|
+
for (const result of results) {
|
|
783
|
+
const bytes = result.placeholderMessageResendResponse?.webMessageInfoBytes;
|
|
784
|
+
if (!bytes) {
|
|
785
|
+
continue;
|
|
786
|
+
}
|
|
787
|
+
try {
|
|
788
|
+
const recovered = _proto_1.proto.WebMessageInfo.decode(bytes);
|
|
789
|
+
emitIncomingMessage((0, incoming_1.buildRecoveredIncomingEvent)(recovered));
|
|
790
|
+
}
|
|
791
|
+
catch (error) {
|
|
792
|
+
this.deps.logger.warn('placeholder resend: failed to decode WebMessageInfo', {
|
|
793
|
+
message: (0, primitives_1.toError)(error).message
|
|
794
|
+
});
|
|
795
|
+
}
|
|
796
|
+
}
|
|
797
|
+
}
|
|
798
|
+
catch (error) {
|
|
799
|
+
this.deps.logger.warn('placeholder resend: request failed', {
|
|
800
|
+
batchSize: batch.length,
|
|
801
|
+
message: (0, primitives_1.toError)(error).message
|
|
802
|
+
});
|
|
803
|
+
}
|
|
804
|
+
finally {
|
|
805
|
+
for (const item of batch) {
|
|
806
|
+
this.placeholderInFlight.delete(item.id);
|
|
807
|
+
}
|
|
808
|
+
}
|
|
809
|
+
}
|
|
810
|
+
}
|
|
680
811
|
}
|
|
681
812
|
exports.WaRetryCoordinator = WaRetryCoordinator;
|