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