zapo-js 0.2.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 +103 -179
- package/dist/appstate/{WaAppStateCrypto.js → crypto/WaAppStateCrypto.js} +79 -62
- package/dist/appstate/index.js +8 -7
- package/dist/appstate/{encoding.js → parsers/encoding.js} +11 -4
- package/dist/appstate/{WaAppStateSyncResponseParser.js → parsers/response-parser.js} +20 -8
- package/dist/appstate/{WaAppStateSyncClient.js → sync/WaAppStateSyncClient.js} +246 -88
- package/dist/appstate/utils.js +16 -0
- package/dist/appstate-spec.js +89 -0
- package/dist/auth/WaAuthClient.js +117 -13
- package/dist/auth/credentials-flow.js +207 -0
- package/dist/auth/pairing/WaPairingFlow.js +53 -47
- package/dist/auth/pairing/pairing-code-crypto.js +91 -0
- package/dist/client/WaClient.js +369 -460
- package/dist/client/WaClientFactory.js +377 -93
- package/dist/client/connection/WaConnectionManager.js +31 -11
- package/dist/client/coordinators/WaAbPropsCoordinator.js +140 -0
- 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 -180
- package/dist/client/coordinators/WaEmailCoordinator.js +64 -0
- package/dist/client/coordinators/WaGroupCoordinator.js +529 -52
- package/dist/client/coordinators/WaIncomingNodeCoordinator.js +130 -20
- package/dist/client/coordinators/WaLowLevelCoordinator.js +41 -0
- package/dist/client/coordinators/WaMessageCoordinator.js +365 -0
- package/dist/client/coordinators/WaMessageDispatchCoordinator.js +724 -216
- package/dist/client/coordinators/WaNewsletterCoordinator.js +18 -0
- package/dist/client/coordinators/WaOfflineResumeCoordinator.js +114 -0
- package/dist/client/coordinators/WaPassiveTasksCoordinator.js +53 -22
- package/dist/client/coordinators/WaPresenceCoordinator.js +21 -0
- package/dist/client/coordinators/WaPrivacyCoordinator.js +7 -5
- package/dist/client/coordinators/WaProfileCoordinator.js +223 -50
- package/dist/client/coordinators/WaRetryCoordinator.js +256 -123
- package/dist/client/coordinators/WaStatusCoordinator.js +49 -0
- package/dist/client/coordinators/WaStreamControlCoordinator.js +6 -6
- package/dist/client/coordinators/WaTrustedContactTokenCoordinator.js +29 -10
- package/dist/client/events/abprops.js +43 -0
- 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} +34 -20
- 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/privacy-token.js +1 -2
- package/dist/client/events/receipt.js +26 -0
- package/dist/client/events/registration.js +42 -0
- package/dist/client/media.js +400 -0
- 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 +9 -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 +9 -9
- package/dist/crypto/core/xeddsa.js +59 -0
- package/dist/crypto/curves/Ed25519.js +32 -21
- package/dist/crypto/curves/X25519.js +71 -17
- package/dist/crypto/curves/constants.js +3 -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} +72 -55
- package/dist/esm/appstate/index.js +5 -5
- package/dist/esm/appstate/{encoding.js → parsers/encoding.js} +11 -4
- package/dist/esm/appstate/{WaAppStateSyncResponseParser.js → parsers/response-parser.js} +20 -8
- package/dist/esm/appstate/{WaAppStateSyncClient.js → sync/WaAppStateSyncClient.js} +235 -76
- package/dist/esm/appstate/utils.js +16 -0
- package/dist/esm/appstate-spec.js +79 -0
- package/dist/esm/auth/WaAuthClient.js +114 -10
- package/dist/esm/auth/credentials-flow.js +202 -0
- package/dist/esm/auth/pairing/WaPairingFlow.js +52 -46
- package/dist/esm/auth/pairing/pairing-code-crypto.js +85 -0
- package/dist/esm/client/WaClient.js +372 -463
- package/dist/esm/client/WaClientFactory.js +380 -96
- package/dist/esm/client/connection/WaConnectionManager.js +31 -11
- package/dist/esm/client/coordinators/WaAbPropsCoordinator.js +136 -0
- 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 +78 -177
- package/dist/esm/client/coordinators/WaEmailCoordinator.js +61 -0
- package/dist/esm/client/coordinators/WaGroupCoordinator.js +532 -55
- package/dist/esm/client/coordinators/WaIncomingNodeCoordinator.js +132 -22
- 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 +719 -211
- package/dist/esm/client/coordinators/WaNewsletterCoordinator.js +13 -0
- package/dist/esm/client/coordinators/WaOfflineResumeCoordinator.js +110 -0
- package/dist/esm/client/coordinators/WaPassiveTasksCoordinator.js +54 -23
- 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 +226 -53
- package/dist/esm/client/coordinators/WaRetryCoordinator.js +258 -125
- 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 +31 -12
- package/dist/esm/client/events/abprops.js +40 -0
- 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} +34 -20
- 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/privacy-token.js +1 -2
- package/dist/esm/client/events/receipt.js +23 -0
- package/dist/esm/client/events/registration.js +39 -0
- package/dist/esm/client/media.js +384 -0
- 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 +3 -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 +8 -7
- package/dist/esm/crypto/core/xeddsa.js +55 -0
- package/dist/esm/crypto/curves/Ed25519.js +35 -24
- package/dist/esm/crypto/curves/X25519.js +74 -20
- package/dist/esm/crypto/curves/constants.js +2 -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/infra/perf/StoreLock.js +7 -4
- package/dist/esm/media/constants.js +35 -2
- package/dist/esm/media/crypto/WaMediaCrypto.js +374 -0
- package/dist/esm/media/index.js +4 -3
- package/dist/esm/media/processor.js +1 -0
- package/dist/esm/media/sticker/sticker-pack.js +133 -0
- package/dist/esm/media/{WaMediaTransferClient.js → transfer/WaMediaTransferClient.js} +84 -196
- 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/crypto/addon-crypto.js +244 -0
- package/dist/esm/message/{icdc.js → crypto/icdc.js} +11 -13
- package/dist/esm/message/crypto/phash.js +133 -0
- package/dist/esm/message/{reporting-token.js → crypto/reporting-token.js} +7 -7
- package/dist/esm/message/{use-case-secret.js → crypto/use-case-secret.js} +21 -4
- package/dist/esm/message/{content.js → encode/content.js} +183 -8
- 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/primitives/incoming.js +511 -0
- package/dist/esm/message/primitives/peer-data-operation.js +93 -0
- package/dist/esm/mex.js +1 -0
- package/dist/esm/protocol/abprops.js +169 -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 +22 -0
- package/dist/esm/protocol/business.js +19 -0
- package/dist/esm/protocol/call.js +48 -0
- package/dist/esm/protocol/constants.js +10 -2
- package/dist/esm/protocol/defaults.js +3 -0
- package/dist/esm/protocol/email.js +30 -0
- package/dist/esm/protocol/index.js +1 -1
- package/dist/esm/protocol/jid.js +142 -11
- 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 +26 -2
- package/dist/esm/protocol/notification.js +24 -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 +6 -1
- package/dist/esm/retry/replay.js +131 -37
- package/dist/esm/retry/tracker.js +4 -8
- package/dist/esm/signal/api/SignalDeviceSyncApi.js +71 -21
- package/dist/esm/signal/api/SignalDigestSyncApi.js +15 -8
- package/dist/esm/signal/api/SignalIdentitySyncApi.js +13 -4
- 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/attestation/WaAdvSignature.js +17 -0
- package/dist/esm/signal/{crypto → attestation}/constants.js +0 -4
- package/dist/esm/signal/constants.js +3 -0
- package/dist/esm/signal/encoding.js +6 -332
- package/dist/esm/signal/group/SenderKeyChain.js +20 -35
- package/dist/esm/signal/group/SenderKeyCodec.js +5 -6
- package/dist/esm/signal/group/SenderKeyManager.js +37 -17
- 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 +12 -3
- package/dist/esm/signal/registration/utils.js +8 -2
- package/dist/esm/signal/session/SignalProtocol.js +129 -26
- package/dist/esm/signal/session/SignalRatchet.js +46 -64
- package/dist/esm/signal/session/SignalSerializer.js +5 -6
- package/dist/esm/signal/session/SignalSession.js +14 -19
- package/dist/esm/signal/session/encoding.js +173 -0
- package/dist/esm/signal/session/resolver.js +144 -35
- 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/contracts/identity.store.js +1 -0
- package/dist/esm/store/contracts/message-secret.store.js +1 -0
- package/dist/esm/store/contracts/pre-key.store.js +1 -0
- package/dist/esm/store/contracts/session.store.js +1 -0
- package/dist/esm/store/createStore.js +129 -39
- package/dist/esm/store/index.js +15 -10
- package/dist/esm/store/locks/contact.lock.js +1 -0
- package/dist/esm/store/locks/device-list.lock.js +1 -0
- package/dist/esm/store/locks/group-metadata.lock.js +20 -0
- package/dist/esm/store/locks/identity.lock.js +16 -0
- package/dist/esm/store/locks/message-secret.lock.js +17 -0
- package/dist/esm/store/locks/pre-key.lock.js +27 -0
- package/dist/esm/store/locks/session.lock.js +19 -0
- package/dist/esm/store/locks/signal.lock.js +0 -24
- 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} +24 -12
- package/dist/esm/store/memory/identity.store.js +31 -0
- package/dist/esm/store/memory/message-secret.store.js +90 -0
- package/dist/esm/store/{providers/memory → memory}/message.store.js +2 -2
- package/dist/esm/store/memory/pre-key.store.js +97 -0
- package/dist/esm/store/{providers/memory → memory}/privacy-token.store.js +1 -1
- package/dist/esm/store/{providers/memory → memory}/retry.store.js +49 -14
- package/dist/esm/store/{providers/memory → memory}/sender-key.store.js +3 -3
- package/dist/esm/store/memory/session.store.js +45 -0
- package/dist/esm/store/memory/signal.store.js +36 -0
- package/dist/esm/store/{providers/memory → memory}/thread.store.js +2 -2
- package/dist/esm/store/noop.store.js +26 -4
- package/dist/esm/transport/WaComms.js +18 -8
- package/dist/esm/transport/WaWebSocket.js +41 -9
- 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 +7 -0
- package/dist/esm/transport/keepalive/WaKeepAlive.js +35 -12
- package/dist/esm/transport/node/WaMobileTcpSocket.js +120 -0
- package/dist/esm/transport/node/WaNodeOrchestrator.js +26 -13
- package/dist/esm/transport/node/WaNodeTransport.js +13 -0
- package/dist/esm/transport/node/builders/abprops.js +20 -0
- 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 +11 -0
- package/dist/esm/transport/node/builders/email.js +66 -0
- 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/offline.js +14 -0
- package/dist/esm/transport/node/builders/passive.js +7 -0
- package/dist/esm/transport/node/builders/prekeys.js +40 -43
- package/dist/esm/transport/node/builders/presence.js +39 -0
- package/dist/esm/transport/node/builders/privacy-token.js +19 -23
- 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/retry.js +1 -1
- 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 +27 -1
- package/dist/esm/transport/node/mex/argo-decoder.js +152 -0
- package/dist/esm/transport/node/mex/client.js +105 -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 +23 -18
- package/dist/esm/transport/noise/WaFrameCodec.js +2 -2
- package/dist/esm/transport/noise/WaMobileClientPayload.js +58 -0
- package/dist/esm/transport/noise/WaNoiseCert.js +14 -27
- package/dist/esm/transport/noise/WaNoiseHandshake.js +27 -25
- package/dist/esm/transport/noise/WaNoiseSession.js +48 -67
- 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/infra/perf/StoreLock.js +7 -4
- package/dist/media/constants.js +36 -3
- package/dist/media/crypto/WaMediaCrypto.js +378 -0
- package/dist/media/index.js +9 -4
- package/dist/media/processor.js +2 -0
- package/dist/media/sticker/sticker-pack.js +136 -0
- package/dist/media/{WaMediaTransferClient.js → transfer/WaMediaTransferClient.js} +87 -229
- 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/crypto/addon-crypto.js +254 -0
- package/dist/message/{icdc.js → crypto/icdc.js} +11 -13
- package/dist/message/crypto/phash.js +136 -0
- package/dist/message/{reporting-token.js → crypto/reporting-token.js} +7 -7
- package/dist/message/{use-case-secret.js → crypto/use-case-secret.js} +21 -4
- package/dist/message/{content.js → encode/content.js} +200 -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} +225 -38
- 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 +173 -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 +23 -0
- package/dist/protocol/business.js +22 -0
- package/dist/protocol/call.js +51 -0
- package/dist/protocol/constants.js +51 -3
- package/dist/protocol/defaults.js +3 -0
- package/dist/protocol/email.js +33 -0
- package/dist/protocol/index.js +12 -3
- package/dist/protocol/jid.js +148 -11
- 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 +26 -2
- package/dist/protocol/notification.js +25 -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 +6 -1
- package/dist/retry/replay.js +129 -35
- package/dist/retry/tracker.js +3 -7
- package/dist/signal/api/SignalDeviceSyncApi.js +69 -19
- package/dist/signal/api/SignalDigestSyncApi.js +14 -7
- package/dist/signal/api/SignalIdentitySyncApi.js +13 -4
- 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/attestation/WaAdvSignature.js +26 -0
- package/dist/signal/{crypto → attestation}/constants.js +1 -5
- package/dist/signal/constants.js +4 -1
- package/dist/signal/encoding.js +5 -341
- package/dist/signal/group/SenderKeyChain.js +19 -34
- package/dist/signal/group/SenderKeyCodec.js +4 -5
- package/dist/signal/group/SenderKeyManager.js +36 -16
- package/dist/signal/group/encoding.js +101 -0
- package/dist/signal/index.js +13 -10
- package/dist/signal/registration/encoding.js +39 -0
- package/dist/signal/registration/keygen.js +11 -2
- package/dist/signal/registration/utils.js +8 -2
- package/dist/signal/session/SignalProtocol.js +128 -25
- package/dist/signal/session/SignalRatchet.js +41 -60
- package/dist/signal/session/SignalSerializer.js +5 -6
- package/dist/signal/session/SignalSession.js +13 -19
- package/dist/signal/session/encoding.js +183 -0
- package/dist/signal/session/resolver.js +144 -35
- 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/contracts/identity.store.js +2 -0
- package/dist/store/contracts/message-secret.store.js +2 -0
- package/dist/store/contracts/pre-key.store.js +2 -0
- package/dist/store/contracts/session.store.js +2 -0
- package/dist/store/createStore.js +128 -38
- package/dist/store/index.js +22 -12
- package/dist/store/locks/contact.lock.js +1 -0
- package/dist/store/locks/device-list.lock.js +1 -0
- package/dist/store/locks/group-metadata.lock.js +23 -0
- package/dist/store/locks/identity.lock.js +19 -0
- package/dist/store/locks/message-secret.lock.js +20 -0
- package/dist/store/locks/pre-key.lock.js +30 -0
- package/dist/store/locks/session.lock.js +22 -0
- package/dist/store/locks/signal.lock.js +0 -24
- 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} +26 -14
- package/dist/store/memory/identity.store.js +35 -0
- package/dist/store/memory/message-secret.store.js +94 -0
- package/dist/store/{providers/memory → memory}/message.store.js +2 -2
- package/dist/store/memory/pre-key.store.js +101 -0
- package/dist/store/{providers/memory → memory}/privacy-token.store.js +1 -1
- package/dist/store/{providers/memory → memory}/retry.store.js +49 -14
- package/dist/store/{providers/memory → memory}/sender-key.store.js +3 -3
- package/dist/store/memory/session.store.js +49 -0
- package/dist/store/memory/signal.store.js +40 -0
- package/dist/store/{providers/memory → memory}/thread.store.js +2 -2
- package/dist/store/noop.store.js +27 -5
- package/dist/transport/WaComms.js +18 -8
- package/dist/transport/WaWebSocket.js +41 -9
- 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 +19 -1
- package/dist/transport/keepalive/WaKeepAlive.js +35 -12
- package/dist/transport/node/WaMobileTcpSocket.js +124 -0
- package/dist/transport/node/WaNodeOrchestrator.js +25 -12
- package/dist/transport/node/WaNodeTransport.js +13 -0
- package/dist/transport/node/builders/abprops.js +23 -0
- 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 +14 -0
- package/dist/transport/node/builders/email.js +73 -0
- 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/offline.js +17 -0
- package/dist/transport/node/builders/passive.js +10 -0
- package/dist/transport/node/builders/prekeys.js +38 -41
- package/dist/transport/node/builders/presence.js +43 -0
- package/dist/transport/node/builders/privacy-token.js +18 -22
- package/dist/transport/node/builders/privacy.js +5 -5
- package/dist/transport/node/builders/profile.js +30 -7
- package/dist/transport/node/builders/retry.js +1 -1
- package/dist/transport/node/builders/tos.js +63 -0
- package/dist/transport/node/builders/usync.js +52 -1
- package/dist/transport/node/helpers.js +28 -1
- package/dist/transport/node/mex/argo-decoder.js +189 -0
- package/dist/transport/node/mex/client.js +109 -0
- package/dist/transport/node/query.js +17 -0
- package/dist/transport/node/usync.js +13 -0
- package/dist/transport/noise/WaClientPayload.js +22 -17
- package/dist/transport/noise/WaFrameCodec.js +1 -1
- package/dist/transport/noise/WaMobileClientPayload.js +61 -0
- package/dist/transport/noise/WaNoiseCert.js +13 -26
- package/dist/transport/noise/WaNoiseHandshake.js +25 -23
- package/dist/transport/noise/WaNoiseSession.js +47 -66
- 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} +29 -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/{WaAppStateSyncResponseParser.d.ts → parsers/response-parser.d.ts} +13 -3
- package/dist/types/appstate/sync/WaAppStateSyncClient.d.ts +105 -0
- package/dist/types/appstate/types.d.ts +1 -1
- package/dist/types/appstate/utils.d.ts +17 -1
- package/dist/types/appstate-spec.d.ts +24 -0
- package/dist/types/auth/WaAuthClient.d.ts +95 -3
- package/dist/types/auth/credentials-flow.d.ts +21 -0
- package/dist/types/auth/pairing/WaPairingFlow.d.ts +3 -2
- package/dist/types/auth/pairing/{WaPairingCodeCrypto.d.ts → pairing-code-crypto.d.ts} +5 -1
- package/dist/types/auth/types.d.ts +88 -1
- package/dist/types/client/WaClient.d.ts +183 -65
- package/dist/types/client/WaClientFactory.d.ts +40 -9
- 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/WaAbPropsCoordinator.d.ts +26 -0
- 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 +45 -44
- package/dist/types/client/coordinators/WaEmailCoordinator.d.ts +40 -0
- package/dist/types/client/coordinators/WaGroupCoordinator.d.ts +311 -9
- package/dist/types/client/coordinators/WaIncomingNodeCoordinator.d.ts +16 -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 +65 -29
- package/dist/types/client/coordinators/WaNewsletterCoordinator.d.ts +13 -0
- package/dist/types/client/coordinators/WaOfflineResumeCoordinator.d.ts +31 -0
- package/dist/types/client/coordinators/WaPassiveTasksCoordinator.d.ts +15 -3
- package/dist/types/client/coordinators/WaPresenceCoordinator.d.ts +27 -0
- package/dist/types/client/coordinators/WaPrivacyCoordinator.d.ts +28 -1
- package/dist/types/client/coordinators/WaProfileCoordinator.d.ts +117 -2
- package/dist/types/client/coordinators/WaRetryCoordinator.d.ts +23 -15
- package/dist/types/client/coordinators/WaStatusCoordinator.d.ts +42 -0
- package/dist/types/client/coordinators/WaTrustedContactTokenCoordinator.d.ts +16 -2
- package/dist/types/client/events/abprops.d.ts +15 -0
- 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} +7 -4
- package/dist/types/client/events/group.d.ts +2 -1
- package/dist/types/client/events/identity.d.ts +2 -1
- package/dist/types/client/events/incoming.d.ts +65 -0
- 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 +18 -0
- package/dist/types/client/index.d.ts +1 -1
- package/dist/types/client/media.d.ts +65 -0
- 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 +13 -2
- package/dist/types/client/persistence/history-sync.d.ts +29 -0
- package/dist/types/client/persistence/mailbox.d.ts +12 -0
- package/dist/types/client/tokens/cs-token.d.ts +1 -3
- package/dist/types/client/types.d.ts +926 -55
- package/dist/types/crypto/core/hkdf.d.ts +10 -2
- package/dist/types/crypto/core/index.d.ts +3 -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 +7 -1
- package/dist/types/crypto/core/xeddsa.d.ts +11 -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 -2
- package/dist/types/crypto/curves/types.d.ts +0 -5
- package/dist/types/crypto/index.d.ts +1 -0
- 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 -5
- package/dist/types/infra/log/ConsoleLogger.d.ts +19 -2
- package/dist/types/infra/log/PinoLogger.d.ts +56 -2
- package/dist/types/infra/log/types.d.ts +6 -0
- package/dist/types/infra/perf/BackgroundQueue.d.ts +19 -0
- package/dist/types/infra/perf/StoreLock.d.ts +1 -0
- package/dist/types/media/constants.d.ts +9 -2
- package/dist/types/media/crypto/WaMediaCrypto.d.ts +59 -0
- package/dist/types/media/index.d.ts +7 -4
- package/dist/types/media/processor.d.ts +50 -0
- package/dist/types/media/sticker/sticker-pack.d.ts +6 -0
- package/dist/types/media/{WaMediaTransferClient.d.ts → transfer/WaMediaTransferClient.d.ts} +33 -12
- package/dist/types/media/transfer/conn.d.ts +7 -0
- package/dist/types/media/types.d.ts +10 -5
- 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/crypto/addon-crypto.d.ts +78 -0
- package/dist/types/message/{icdc.d.ts → crypto/icdc.d.ts} +6 -6
- 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 +218 -28
- package/dist/types/mex.d.ts +2 -0
- package/dist/types/proto.d.ts +2 -2
- package/dist/types/protocol/abprops.d.ts +151 -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 +9 -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 +20 -3
- package/dist/types/protocol/defaults.d.ts +3 -0
- package/dist/types/protocol/email.d.ts +32 -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 +79 -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 +24 -0
- package/dist/types/protocol/notification.d.ts +22 -0
- package/dist/types/protocol/presence.d.ts +16 -0
- package/dist/types/protocol/status.d.ts +7 -0
- package/dist/types/protocol/stream.d.ts +1 -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 +6 -1
- 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 +13 -0
- package/dist/types/signal/api/SignalIdentitySyncApi.d.ts +12 -3
- 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 -4
- 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 -62
- package/dist/types/signal/group/SenderKeyChain.d.ts +2 -2
- package/dist/types/signal/group/SenderKeyManager.d.ts +24 -2
- 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 +7 -1
- package/dist/types/signal/session/SignalProtocol.d.ts +66 -2
- package/dist/types/signal/session/SignalRatchet.d.ts +2 -3
- package/dist/types/signal/session/SignalSerializer.d.ts +2 -1
- 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 +18 -2
- package/dist/types/signal/types.d.ts +16 -4
- 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/identity.store.d.ts +11 -0
- package/dist/types/store/contracts/message-secret.store.d.ts +16 -0
- package/dist/types/store/contracts/message.store.d.ts +0 -2
- package/dist/types/store/contracts/pre-key.store.d.ts +13 -0
- package/dist/types/store/contracts/session.store.d.ts +14 -0
- package/dist/types/store/contracts/signal.store.d.ts +1 -34
- package/dist/types/store/createStore.d.ts +54 -2
- package/dist/types/store/index.d.ts +22 -13
- package/dist/types/store/locks/group-metadata.lock.d.ts +2 -0
- package/dist/types/store/locks/identity.lock.d.ts +3 -0
- package/dist/types/store/locks/message-secret.lock.d.ts +3 -0
- package/dist/types/store/locks/pre-key.lock.d.ts +3 -0
- package/dist/types/store/locks/session.lock.d.ts +3 -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/memory/identity.store.d.ts +18 -0
- package/dist/types/store/memory/message-secret.store.d.ts +31 -0
- package/dist/types/store/{providers/memory → memory}/message.store.d.ts +1 -1
- package/dist/types/store/memory/pre-key.store.d.ts +23 -0
- 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 +23 -4
- package/dist/types/store/{providers/memory → memory}/sender-key.store.d.ts +2 -2
- package/dist/types/store/memory/session.store.d.ts +21 -0
- package/dist/types/store/memory/signal.store.d.ts +16 -0
- package/dist/types/store/{providers/memory → memory}/thread.store.d.ts +1 -1
- package/dist/types/store/noop.store.d.ts +6 -2
- package/dist/types/store/types.d.ts +271 -7
- package/dist/types/transport/WaComms.d.ts +5 -0
- package/dist/types/transport/WaWebSocket.d.ts +6 -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 +9 -0
- package/dist/types/transport/keepalive/WaKeepAlive.d.ts +11 -1
- package/dist/types/transport/node/WaMobileTcpSocket.d.ts +24 -0
- package/dist/types/transport/node/WaNodeOrchestrator.d.ts +11 -2
- package/dist/types/transport/node/WaNodeTransport.d.ts +13 -0
- package/dist/types/transport/node/builders/abprops.d.ts +5 -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/device.d.ts +2 -0
- package/dist/types/transport/node/builders/email.d.ts +11 -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/offline.d.ts +2 -0
- package/dist/types/transport/node/builders/passive.d.ts +3 -0
- package/dist/types/transport/node/builders/prekeys.d.ts +4 -3
- package/dist/types/transport/node/builders/presence.d.ts +13 -0
- 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 +3 -1
- package/dist/types/transport/node/mex/argo-decoder.d.ts +11 -0
- package/dist/types/transport/node/mex/client.d.ts +29 -0
- 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 +34 -0
- package/dist/types/transport/noise/WaNoiseCert.d.ts +12 -1
- package/dist/types/transport/noise/WaNoiseHandshake.d.ts +12 -6
- package/dist/types/transport/noise/WaNoiseSession.d.ts +1 -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 +15 -0
- 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 +37 -11
- 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/auth/flow/WaAuthCredentialsFlow.js +0 -130
- package/dist/auth/pairing/WaPairingCodeCrypto.js +0 -77
- package/dist/auth/pairing/constants.js +0 -5
- package/dist/client/connection/WaKeyShareCoordinator.js +0 -63
- package/dist/client/events/chat.js +0 -227
- package/dist/client/incoming.js +0 -269
- package/dist/client/mailbox.js +0 -50
- package/dist/client/messages.js +0 -228
- package/dist/esm/auth/flow/WaAuthCredentialsFlow.js +0 -125
- package/dist/esm/auth/pairing/WaPairingCodeCrypto.js +0 -73
- package/dist/esm/auth/pairing/constants.js +0 -2
- package/dist/esm/client/connection/WaKeyShareCoordinator.js +0 -59
- package/dist/esm/client/events/chat.js +0 -224
- package/dist/esm/client/incoming.js +0 -260
- package/dist/esm/client/mailbox.js +0 -47
- package/dist/esm/client/messages.js +0 -224
- package/dist/esm/media/WaMediaCrypto.js +0 -304
- package/dist/esm/message/addon-crypto.js +0 -59
- package/dist/esm/message/incoming.js +0 -325
- package/dist/esm/message/phash.js +0 -27
- package/dist/esm/signal/crypto/WaAdvSignature.js +0 -64
- 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 -64
- package/dist/esm/store/providers/memory/signal.store.js +0 -199
- package/dist/esm/transport/node/builders/index.js +0 -11
- package/dist/media/WaMediaCrypto.js +0 -308
- package/dist/message/addon-crypto.js +0 -65
- package/dist/message/phash.js +0 -30
- package/dist/signal/crypto/WaAdvSignature.js +0 -76
- 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 -68
- package/dist/store/providers/memory/signal.store.js +0 -203
- package/dist/transport/node/builders/index.js +0 -51
- package/dist/types/appstate/WaAppStateSyncClient.d.ts +0 -66
- package/dist/types/auth/flow/WaAuthCredentialsFlow.d.ts +0 -14
- package/dist/types/auth/pairing/constants.d.ts +0 -2
- package/dist/types/client/connection/WaKeyShareCoordinator.d.ts +0 -14
- package/dist/types/client/events/chat.d.ts +0 -3
- package/dist/types/client/history-sync.d.ts +0 -20
- package/dist/types/client/incoming.d.ts +0 -37
- package/dist/types/client/mailbox.d.ts +0 -10
- package/dist/types/client/messages.d.ts +0 -16
- package/dist/types/client/messaging/participants.d.ts +0 -13
- package/dist/types/media/WaMediaCrypto.d.ts +0 -13
- package/dist/types/media/conn.d.ts +0 -3
- package/dist/types/message/addon-crypto.d.ts +0 -25
- package/dist/types/message/content.d.ts +0 -12
- package/dist/types/message/incoming.d.ts +0 -18
- package/dist/types/signal/crypto/constants.d.ts +0 -5
- 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/store/providers/memory/signal.store.d.ts +0 -58
- package/dist/types/transport/node/builders/index.d.ts +0 -11
- 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/message/{device-sent.js → encode/device-sent.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,25 +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.signalProtocol = options.signalProtocol;
|
|
42
|
-
this.signalDeviceSync = options.signalDeviceSync;
|
|
43
|
-
this.signalMissingPreKeysSync = options.signalMissingPreKeysSync;
|
|
44
|
-
this.sendNode = options.sendNode;
|
|
45
|
-
this.getCurrentMeJid = options.getCurrentMeJid;
|
|
46
|
-
this.getCurrentMeLid = options.getCurrentMeLid;
|
|
47
|
-
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;
|
|
48
52
|
this.retryReplayService = new WaRetryReplayService({
|
|
49
|
-
logger:
|
|
53
|
+
logger: options.logger,
|
|
50
54
|
messageClient: options.messageClient,
|
|
51
|
-
signalProtocol:
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
+
signalProtocol: options.signalProtocol,
|
|
56
|
+
sessionResolver: options.sessionResolver,
|
|
57
|
+
getCurrentCredentials: options.getCurrentCredentials,
|
|
58
|
+
resolveUserIcdc: options.resolveUserIcdc
|
|
55
59
|
});
|
|
56
60
|
this.retryProcessingByMessageId = new Map();
|
|
57
61
|
this.retrySessionBaseKeys = new Map();
|
|
@@ -62,11 +66,14 @@ export class WaRetryCoordinator {
|
|
|
62
66
|
if (!prepared) {
|
|
63
67
|
return false;
|
|
64
68
|
}
|
|
69
|
+
if (prepared.delegatedToPlaceholderResend) {
|
|
70
|
+
return true;
|
|
71
|
+
}
|
|
65
72
|
await this.sendDecryptFailureRetryReceipt(context, prepared);
|
|
66
73
|
return true;
|
|
67
74
|
}
|
|
68
75
|
catch (sendError) {
|
|
69
|
-
this.logger.warn('failed to send retry receipt for decrypt failure', {
|
|
76
|
+
this.deps.logger.warn('failed to send retry receipt for decrypt failure', {
|
|
70
77
|
id: context.stanzaId,
|
|
71
78
|
from: context.from,
|
|
72
79
|
participant: context.participant,
|
|
@@ -83,8 +90,9 @@ export class WaRetryCoordinator {
|
|
|
83
90
|
try {
|
|
84
91
|
await this.maybeCleanupRetryStore(Date.now());
|
|
85
92
|
const expectedToJids = [];
|
|
86
|
-
const
|
|
87
|
-
const
|
|
93
|
+
const credentials = this.deps.getCurrentCredentials();
|
|
94
|
+
const meJid = credentials?.meJid?.trim();
|
|
95
|
+
const meLid = credentials?.meLid?.trim();
|
|
88
96
|
if (meJid) {
|
|
89
97
|
expectedToJids.push(meJid);
|
|
90
98
|
}
|
|
@@ -99,7 +107,7 @@ export class WaRetryCoordinator {
|
|
|
99
107
|
await this.handleParsedRetryRequest(receiptNode, request);
|
|
100
108
|
}
|
|
101
109
|
catch (error) {
|
|
102
|
-
this.logger.warn('failed handling incoming retry request', {
|
|
110
|
+
this.deps.logger.warn('failed handling incoming retry request', {
|
|
103
111
|
id: receiptNode.attrs.id,
|
|
104
112
|
from: receiptNode.attrs.from,
|
|
105
113
|
participant: receiptNode.attrs.participant,
|
|
@@ -114,13 +122,14 @@ export class WaRetryCoordinator {
|
|
|
114
122
|
}
|
|
115
123
|
isRetryReceiptNode(node) {
|
|
116
124
|
return (node.tag === WA_MESSAGE_TAGS.RECEIPT &&
|
|
117
|
-
(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));
|
|
118
127
|
}
|
|
119
128
|
async prepareDecryptFailureRetry(context, error) {
|
|
120
129
|
const nowMs = Date.now();
|
|
121
|
-
const registrationInfo = await this.signalStore.getRegistrationInfo();
|
|
130
|
+
const registrationInfo = await this.deps.signalStore.getRegistrationInfo();
|
|
122
131
|
if (!registrationInfo) {
|
|
123
|
-
this.logger.warn('retry receipt skipped: missing local registration info', {
|
|
132
|
+
this.deps.logger.warn('retry receipt skipped: missing local registration info', {
|
|
124
133
|
id: context.stanzaId,
|
|
125
134
|
from: context.from
|
|
126
135
|
});
|
|
@@ -128,23 +137,41 @@ export class WaRetryCoordinator {
|
|
|
128
137
|
}
|
|
129
138
|
const requester = context.participant ?? context.from;
|
|
130
139
|
const expiresAtMs = nowMs + this.retryTtlMs;
|
|
131
|
-
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;
|
|
132
154
|
return {
|
|
133
155
|
registrationId: registrationInfo.registrationId,
|
|
134
156
|
retryCount,
|
|
135
|
-
retryKeys: retryCount >= RETRY_KEYS_MIN_COUNT
|
|
136
|
-
? 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)
|
|
137
162
|
: undefined,
|
|
138
163
|
retryReason: mapRetryReasonFromError(error),
|
|
139
|
-
timestamp: context.t ?? String(Math.trunc(nowMs / 1000))
|
|
164
|
+
timestamp: context.t ?? String(Math.trunc(nowMs / 1000)),
|
|
165
|
+
delegatedToPlaceholderResend: false
|
|
140
166
|
};
|
|
141
167
|
}
|
|
142
168
|
async sendDecryptFailureRetryReceipt(context, prepared) {
|
|
169
|
+
const recipient = context.recipient ?? this.resolvePeerRetryRecipient(context);
|
|
143
170
|
const retryReceiptNode = buildRetryReceiptNode({
|
|
144
171
|
stanzaId: context.stanzaId,
|
|
145
172
|
to: context.from,
|
|
146
173
|
participant: context.participant,
|
|
147
|
-
recipient
|
|
174
|
+
recipient,
|
|
148
175
|
originalMsgId: context.stanzaId,
|
|
149
176
|
retryCount: prepared.retryCount,
|
|
150
177
|
t: prepared.timestamp,
|
|
@@ -153,19 +180,40 @@ export class WaRetryCoordinator {
|
|
|
153
180
|
categoryPeer: context.messageNode.attrs.category === 'peer',
|
|
154
181
|
keys: prepared.retryKeys
|
|
155
182
|
});
|
|
156
|
-
await this.sendNode(retryReceiptNode);
|
|
157
|
-
this.logger.
|
|
183
|
+
await this.deps.sendNode(retryReceiptNode);
|
|
184
|
+
this.deps.logger.trace('sent retry receipt for decrypt failure', {
|
|
158
185
|
id: context.stanzaId,
|
|
159
186
|
to: context.from,
|
|
160
187
|
participant: context.participant,
|
|
188
|
+
recipient,
|
|
161
189
|
retryCount: prepared.retryCount,
|
|
162
190
|
reason: prepared.retryReason,
|
|
163
191
|
withKeys: prepared.retryKeys !== undefined
|
|
164
192
|
});
|
|
165
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
|
+
}
|
|
166
214
|
async handleParsedRetryRequest(receiptNode, request) {
|
|
167
|
-
if (request.type ===
|
|
168
|
-
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)', {
|
|
169
217
|
id: request.stanzaId,
|
|
170
218
|
originalMsgId: request.originalMsgId,
|
|
171
219
|
from: request.from,
|
|
@@ -184,34 +232,35 @@ export class WaRetryCoordinator {
|
|
|
184
232
|
if (!prepared) {
|
|
185
233
|
return;
|
|
186
234
|
}
|
|
235
|
+
const requestLogger = this.deps.logger.child({
|
|
236
|
+
id: request.stanzaId,
|
|
237
|
+
originalMsgId: request.originalMsgId,
|
|
238
|
+
requester: prepared.requesterJid
|
|
239
|
+
});
|
|
187
240
|
const resendResult = await this.retryReplayService.resendOutboundMessage(prepared.outbound, prepared.requesterJid, request.retryCount);
|
|
188
241
|
if (resendResult === 'ineligible') {
|
|
189
|
-
|
|
190
|
-
id: request.stanzaId,
|
|
191
|
-
originalMsgId: request.originalMsgId,
|
|
192
|
-
requester: prepared.requesterJid,
|
|
242
|
+
requestLogger.debug('retry request marked ineligible for resend', {
|
|
193
243
|
mode: prepared.outbound.replayMode
|
|
194
244
|
});
|
|
195
245
|
return;
|
|
196
246
|
}
|
|
197
|
-
|
|
198
|
-
id: request.stanzaId,
|
|
199
|
-
originalMsgId: request.originalMsgId,
|
|
200
|
-
requester: prepared.requesterJid,
|
|
247
|
+
requestLogger.debug('retry request processed and resent', {
|
|
201
248
|
mode: prepared.outbound.replayMode,
|
|
202
249
|
remoteRetryCount: request.retryCount,
|
|
203
250
|
...getRemoteRetryReasonLogFields(request.retryReason)
|
|
204
251
|
});
|
|
205
252
|
}
|
|
206
253
|
async prepareRetryResend(request) {
|
|
254
|
+
const requestLogger = this.deps.logger.child({
|
|
255
|
+
id: request.stanzaId,
|
|
256
|
+
originalMsgId: request.originalMsgId
|
|
257
|
+
});
|
|
207
258
|
const requesterJid = request.participant ?? request.from ?? null;
|
|
208
259
|
if (!requesterJid) {
|
|
209
|
-
|
|
210
|
-
id: request.stanzaId,
|
|
211
|
-
originalMsgId: request.originalMsgId
|
|
212
|
-
});
|
|
260
|
+
requestLogger.warn('retry request ignored: missing requester jid');
|
|
213
261
|
return null;
|
|
214
262
|
}
|
|
263
|
+
const requesterLogger = requestLogger.child({ requester: requesterJid });
|
|
215
264
|
let requesterAddress;
|
|
216
265
|
let requesterNormalizedDeviceJid;
|
|
217
266
|
try {
|
|
@@ -220,39 +269,26 @@ export class WaRetryCoordinator {
|
|
|
220
269
|
requesterNormalizedDeviceJid = requesterParsed.normalizedJid;
|
|
221
270
|
}
|
|
222
271
|
catch (error) {
|
|
223
|
-
|
|
224
|
-
id: request.stanzaId,
|
|
225
|
-
originalMsgId: request.originalMsgId,
|
|
226
|
-
requester: requesterJid,
|
|
272
|
+
requesterLogger.debug('retry request rejected: invalid requester jid', {
|
|
227
273
|
message: toError(error).message
|
|
228
274
|
});
|
|
229
275
|
return null;
|
|
230
276
|
}
|
|
231
277
|
if (request.retryCount >= MAX_RETRY_ATTEMPTS) {
|
|
232
|
-
|
|
233
|
-
id: request.stanzaId,
|
|
234
|
-
originalMsgId: request.originalMsgId,
|
|
235
|
-
requester: requesterJid,
|
|
278
|
+
requesterLogger.debug('retry request rejected: retry count exceeded', {
|
|
236
279
|
remoteRetryCount: request.retryCount,
|
|
237
280
|
...getRemoteRetryReasonLogFields(request.retryReason)
|
|
238
281
|
});
|
|
239
282
|
return null;
|
|
240
283
|
}
|
|
241
|
-
const outbound = await this.retryStore.getOutboundMessage(request.originalMsgId);
|
|
284
|
+
const outbound = await this.deps.retryStore.getOutboundMessage(request.originalMsgId);
|
|
242
285
|
if (!outbound) {
|
|
243
|
-
|
|
244
|
-
id: request.stanzaId,
|
|
245
|
-
originalMsgId: request.originalMsgId,
|
|
246
|
-
requester: requesterJid
|
|
247
|
-
});
|
|
286
|
+
requesterLogger.debug('retry request ignored: outbound message not found');
|
|
248
287
|
return null;
|
|
249
288
|
}
|
|
250
289
|
const sessionReady = await this.updateLocalSessionFromRetryRequest(request, requesterJid, requesterAddress, requesterNormalizedDeviceJid);
|
|
251
290
|
if (!sessionReady) {
|
|
252
|
-
|
|
253
|
-
id: request.stanzaId,
|
|
254
|
-
originalMsgId: request.originalMsgId,
|
|
255
|
-
requester: requesterJid,
|
|
291
|
+
requesterLogger.debug('retry request rejected: missing compatible session', {
|
|
256
292
|
remoteRetryCount: request.retryCount,
|
|
257
293
|
...getRemoteRetryReasonLogFields(request.retryReason)
|
|
258
294
|
});
|
|
@@ -260,10 +296,7 @@ export class WaRetryCoordinator {
|
|
|
260
296
|
}
|
|
261
297
|
const authorization = await this.authorizeRetryRequest(request, outbound, requesterJid, requesterAddress, requesterNormalizedDeviceJid);
|
|
262
298
|
if (!authorization.authorized) {
|
|
263
|
-
|
|
264
|
-
id: request.stanzaId,
|
|
265
|
-
originalMsgId: request.originalMsgId,
|
|
266
|
-
requester: requesterJid,
|
|
299
|
+
requesterLogger.debug('retry request rejected', {
|
|
267
300
|
reason: authorization.reason,
|
|
268
301
|
remoteRetryCount: request.retryCount,
|
|
269
302
|
...getRemoteRetryReasonLogFields(request.retryReason)
|
|
@@ -286,7 +319,8 @@ export class WaRetryCoordinator {
|
|
|
286
319
|
return;
|
|
287
320
|
}
|
|
288
321
|
const receiptType = receiptNode.attrs.type;
|
|
289
|
-
if (receiptType ===
|
|
322
|
+
if (receiptType === WA_MESSAGE_TYPES.RECEIPT_TYPE_RETRY ||
|
|
323
|
+
receiptType === WA_MESSAGE_TYPES.RECEIPT_TYPE_ENC_REKEY_RETRY) {
|
|
290
324
|
return;
|
|
291
325
|
}
|
|
292
326
|
const nextState = this.mapOutboundStateFromReceiptType(receiptType);
|
|
@@ -294,7 +328,7 @@ export class WaRetryCoordinator {
|
|
|
294
328
|
return;
|
|
295
329
|
}
|
|
296
330
|
await this.runRetryTaskSerialized(messageId, async () => {
|
|
297
|
-
const current = await this.retryStore.getOutboundMessage(messageId);
|
|
331
|
+
const current = await this.deps.retryStore.getOutboundMessage(messageId);
|
|
298
332
|
if (!current) {
|
|
299
333
|
return;
|
|
300
334
|
}
|
|
@@ -302,17 +336,17 @@ export class WaRetryCoordinator {
|
|
|
302
336
|
const expiresAtMs = nowMs + this.retryTtlMs;
|
|
303
337
|
const merged = pickRetryStateMax(current.state, nextState);
|
|
304
338
|
if (merged !== current.state) {
|
|
305
|
-
await this.retryStore.updateOutboundMessageState(messageId, merged, nowMs, expiresAtMs);
|
|
339
|
+
await this.deps.retryStore.updateOutboundMessageState(messageId, merged, nowMs, expiresAtMs);
|
|
306
340
|
}
|
|
307
341
|
const requesterJid = receiptNode.attrs.participant ?? receiptNode.attrs.from;
|
|
308
342
|
if (!requesterJid) {
|
|
309
343
|
return;
|
|
310
344
|
}
|
|
311
345
|
try {
|
|
312
|
-
await this.retryStore.markOutboundRequesterDelivered(messageId, normalizeDeviceJid(requesterJid), nowMs, expiresAtMs);
|
|
346
|
+
await this.deps.retryStore.markOutboundRequesterDelivered(messageId, normalizeDeviceJid(requesterJid), nowMs, expiresAtMs);
|
|
313
347
|
}
|
|
314
348
|
catch (error) {
|
|
315
|
-
this.logger.warn('failed to update outbound requester delivery state', {
|
|
349
|
+
this.deps.logger.warn('failed to update outbound requester delivery state', {
|
|
316
350
|
id: messageId,
|
|
317
351
|
requester: requesterJid,
|
|
318
352
|
message: toError(error).message
|
|
@@ -335,17 +369,20 @@ export class WaRetryCoordinator {
|
|
|
335
369
|
}
|
|
336
370
|
}
|
|
337
371
|
}
|
|
338
|
-
async buildRetryKeysSection(identity) {
|
|
372
|
+
async buildRetryKeysSection(identity, logContext) {
|
|
339
373
|
const [signedPreKey, preKey] = await Promise.all([
|
|
340
|
-
this.signalStore.getSignedPreKey(),
|
|
341
|
-
this.
|
|
374
|
+
this.deps.signalStore.getSignedPreKey(),
|
|
375
|
+
this.deps.preKeyStore.getOrGenSinglePreKey(generatePreKeyPair)
|
|
342
376
|
]);
|
|
343
377
|
if (!signedPreKey) {
|
|
344
|
-
this.logger.warn('retry keys section skipped: signed prekey unavailable'
|
|
345
|
-
|
|
378
|
+
this.deps.logger.warn('retry keys section skipped: signed prekey unavailable', {
|
|
379
|
+
id: logContext.stanzaId,
|
|
380
|
+
from: logContext.from
|
|
381
|
+
});
|
|
382
|
+
return null;
|
|
346
383
|
}
|
|
347
|
-
await this.
|
|
348
|
-
const signedIdentity = this.
|
|
384
|
+
await this.deps.preKeyStore.markKeyAsUploaded(preKey.keyId);
|
|
385
|
+
const signedIdentity = this.deps.getCurrentCredentials()?.signedIdentity;
|
|
349
386
|
return {
|
|
350
387
|
identity,
|
|
351
388
|
key: {
|
|
@@ -363,13 +400,18 @@ export class WaRetryCoordinator {
|
|
|
363
400
|
};
|
|
364
401
|
}
|
|
365
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
|
+
});
|
|
366
408
|
const [, currentSession] = await Promise.all([
|
|
367
409
|
this.markRetryRequesterSenderKeyAsStale(request, requesterJid, requesterAddress),
|
|
368
|
-
this.
|
|
410
|
+
this.deps.sessionStore.getSession(requesterAddress)
|
|
369
411
|
]);
|
|
370
412
|
const regIdMismatch = !!currentSession && request.regId > 0 && currentSession.remote.regId !== request.regId;
|
|
371
413
|
if (regIdMismatch && !request.keyBundle) {
|
|
372
|
-
await this.
|
|
414
|
+
await this.deps.sessionStore.deleteSession(requesterAddress);
|
|
373
415
|
}
|
|
374
416
|
if (request.keyBundle) {
|
|
375
417
|
if (!request.keyBundle.key || !request.keyBundle.skey.signature) {
|
|
@@ -377,32 +419,26 @@ export class WaRetryCoordinator {
|
|
|
377
419
|
}
|
|
378
420
|
if (request.offline) {
|
|
379
421
|
if (!currentSession) {
|
|
380
|
-
|
|
381
|
-
id: request.stanzaId,
|
|
382
|
-
originalMsgId: request.originalMsgId,
|
|
383
|
-
requester: requesterJid,
|
|
422
|
+
requestLogger.debug('retry request rejected: offline retry missing existing session', {
|
|
384
423
|
remoteRetryCount: request.retryCount,
|
|
385
424
|
...getRemoteRetryReasonLogFields(request.retryReason)
|
|
386
425
|
});
|
|
387
|
-
await this.
|
|
426
|
+
await this.deps.sessionStore.deleteSession(requesterAddress);
|
|
388
427
|
return false;
|
|
389
428
|
}
|
|
390
429
|
if (regIdMismatch) {
|
|
391
|
-
|
|
392
|
-
id: request.stanzaId,
|
|
393
|
-
originalMsgId: request.originalMsgId,
|
|
394
|
-
requester: requesterJid,
|
|
430
|
+
requestLogger.debug('retry request rejected: offline retry registration id mismatch', {
|
|
395
431
|
remoteRetryCount: request.retryCount,
|
|
396
432
|
...getRemoteRetryReasonLogFields(request.retryReason)
|
|
397
433
|
});
|
|
398
|
-
await this.
|
|
434
|
+
await this.deps.sessionStore.deleteSession(requesterAddress);
|
|
399
435
|
return false;
|
|
400
436
|
}
|
|
401
437
|
}
|
|
402
438
|
else if (regIdMismatch) {
|
|
403
|
-
await this.
|
|
439
|
+
await this.deps.sessionStore.deleteSession(requesterAddress);
|
|
404
440
|
}
|
|
405
|
-
await this.signalProtocol.establishOutgoingSession(requesterAddress, {
|
|
441
|
+
await this.deps.signalProtocol.establishOutgoingSession(requesterAddress, {
|
|
406
442
|
regId: request.regId,
|
|
407
443
|
identity: request.keyBundle.identity,
|
|
408
444
|
signedKey: {
|
|
@@ -425,14 +461,14 @@ export class WaRetryCoordinator {
|
|
|
425
461
|
if (!fetched) {
|
|
426
462
|
return false;
|
|
427
463
|
}
|
|
428
|
-
await this.signalProtocol.establishOutgoingSession(requesterAddress, fetched);
|
|
464
|
+
await this.deps.signalProtocol.establishOutgoingSession(requesterAddress, fetched);
|
|
429
465
|
return this.applySessionBaseKeyPolicy(request, requesterJid, requesterAddress, requesterNormalizedDeviceJid);
|
|
430
466
|
}
|
|
431
467
|
async applySessionBaseKeyPolicy(request, requesterJid, requesterAddress, requesterNormalizedDeviceJid) {
|
|
432
468
|
if (request.retryCount < 2) {
|
|
433
469
|
return true;
|
|
434
470
|
}
|
|
435
|
-
const currentSession = await this.
|
|
471
|
+
const currentSession = await this.deps.sessionStore.getSession(requesterAddress);
|
|
436
472
|
const sessionBaseKey = currentSession?.aliceBaseKey ?? null;
|
|
437
473
|
if (!sessionBaseKey) {
|
|
438
474
|
return true;
|
|
@@ -446,8 +482,8 @@ export class WaRetryCoordinator {
|
|
|
446
482
|
if (!saved || !uint8Equal(saved.baseKey, sessionBaseKey)) {
|
|
447
483
|
return true;
|
|
448
484
|
}
|
|
449
|
-
await this.
|
|
450
|
-
this.logger.
|
|
485
|
+
await this.deps.sessionStore.deleteSession(requesterAddress);
|
|
486
|
+
this.deps.logger.debug('retry request forcing session refresh due to repeated base key', {
|
|
451
487
|
id: request.stanzaId,
|
|
452
488
|
originalMsgId: request.originalMsgId,
|
|
453
489
|
requester: requesterJid,
|
|
@@ -458,7 +494,7 @@ export class WaRetryCoordinator {
|
|
|
458
494
|
if (!fetched) {
|
|
459
495
|
return false;
|
|
460
496
|
}
|
|
461
|
-
await this.signalProtocol.establishOutgoingSession(requesterAddress, fetched);
|
|
497
|
+
await this.deps.signalProtocol.establishOutgoingSession(requesterAddress, fetched);
|
|
462
498
|
return true;
|
|
463
499
|
}
|
|
464
500
|
async markRetryRequesterSenderKeyAsStale(request, requesterJid, requesterAddress) {
|
|
@@ -466,17 +502,17 @@ export class WaRetryCoordinator {
|
|
|
466
502
|
return;
|
|
467
503
|
}
|
|
468
504
|
try {
|
|
469
|
-
const deleted = await this.senderKeyStore.markForgetSenderKey(request.from, [
|
|
505
|
+
const deleted = await this.deps.senderKeyStore.markForgetSenderKey(request.from, [
|
|
470
506
|
requesterAddress
|
|
471
507
|
]);
|
|
472
|
-
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', {
|
|
473
509
|
groupJid: request.from,
|
|
474
510
|
requester: requesterJid,
|
|
475
511
|
deleted
|
|
476
512
|
});
|
|
477
513
|
}
|
|
478
514
|
catch (error) {
|
|
479
|
-
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', {
|
|
480
516
|
groupJid: request.from,
|
|
481
517
|
requester: requesterJid,
|
|
482
518
|
message: toError(error).message
|
|
@@ -484,8 +520,9 @@ export class WaRetryCoordinator {
|
|
|
484
520
|
}
|
|
485
521
|
}
|
|
486
522
|
async fetchMissingPreKeysSession(requesterJid, requesterAddress, requesterNormalizedDeviceJid, requesterRegistrationId) {
|
|
523
|
+
const requesterLogger = this.deps.logger.child({ requester: requesterJid });
|
|
487
524
|
try {
|
|
488
|
-
const results = await this.signalMissingPreKeysSync.fetchMissingPreKeys([
|
|
525
|
+
const results = await this.deps.signalMissingPreKeysSync.fetchMissingPreKeys([
|
|
489
526
|
{
|
|
490
527
|
userJid: `${requesterAddress.user}@${requesterAddress.server}`,
|
|
491
528
|
devices: [
|
|
@@ -498,16 +535,14 @@ export class WaRetryCoordinator {
|
|
|
498
535
|
]);
|
|
499
536
|
const first = results[0];
|
|
500
537
|
if (!first || !('devices' in first)) {
|
|
501
|
-
|
|
502
|
-
requester: requesterJid,
|
|
538
|
+
requesterLogger.debug('missing prekeys fetch returned user error', {
|
|
503
539
|
errorText: first && 'errorText' in first ? first.errorText : 'unknown'
|
|
504
540
|
});
|
|
505
541
|
return null;
|
|
506
542
|
}
|
|
507
543
|
const matched = first.devices.find((device) => normalizeDeviceJid(device.deviceJid) === requesterNormalizedDeviceJid);
|
|
508
544
|
if (!matched) {
|
|
509
|
-
|
|
510
|
-
requester: requesterJid,
|
|
545
|
+
requesterLogger.debug('missing prekeys fetch did not return requested device', {
|
|
511
546
|
devices: first.devices.length
|
|
512
547
|
});
|
|
513
548
|
return null;
|
|
@@ -515,8 +550,7 @@ export class WaRetryCoordinator {
|
|
|
515
550
|
return matched.bundle;
|
|
516
551
|
}
|
|
517
552
|
catch (error) {
|
|
518
|
-
|
|
519
|
-
requester: requesterJid,
|
|
553
|
+
requesterLogger.debug('failed to fetch missing prekeys for retry requester', {
|
|
520
554
|
message: toError(error).message
|
|
521
555
|
});
|
|
522
556
|
return null;
|
|
@@ -528,10 +562,10 @@ export class WaRetryCoordinator {
|
|
|
528
562
|
}
|
|
529
563
|
let requesterStatus = null;
|
|
530
564
|
try {
|
|
531
|
-
requesterStatus = await this.retryStore.getOutboundRequesterStatus(outbound.messageId, requesterNormalizedDeviceJid);
|
|
565
|
+
requesterStatus = await this.deps.retryStore.getOutboundRequesterStatus(outbound.messageId, toUserJid(requesterNormalizedDeviceJid));
|
|
532
566
|
}
|
|
533
567
|
catch (error) {
|
|
534
|
-
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', {
|
|
535
569
|
id: request.stanzaId,
|
|
536
570
|
originalMsgId: request.originalMsgId,
|
|
537
571
|
requester: requesterJid,
|
|
@@ -564,7 +598,7 @@ export class WaRetryCoordinator {
|
|
|
564
598
|
if (requesterNormalizedDeviceJid === normalizeDeviceJid(requesterUser)) {
|
|
565
599
|
return true;
|
|
566
600
|
}
|
|
567
|
-
const synced = await this.signalDeviceSync.syncDeviceList([requesterUser]);
|
|
601
|
+
const synced = await this.deps.signalDeviceSync.syncDeviceList([requesterUser]);
|
|
568
602
|
const target = synced.find((entry) => entry.jid === requesterUser);
|
|
569
603
|
if (!target) {
|
|
570
604
|
return false;
|
|
@@ -577,7 +611,7 @@ export class WaRetryCoordinator {
|
|
|
577
611
|
return false;
|
|
578
612
|
}
|
|
579
613
|
catch (error) {
|
|
580
|
-
this.logger.warn('retry authorization failed while syncing requester device list', {
|
|
614
|
+
this.deps.logger.warn('retry authorization failed while syncing requester device list', {
|
|
581
615
|
requester: requesterJid,
|
|
582
616
|
message: toError(error).message
|
|
583
617
|
});
|
|
@@ -585,25 +619,25 @@ export class WaRetryCoordinator {
|
|
|
585
619
|
}
|
|
586
620
|
}
|
|
587
621
|
mapOutboundStateFromReceiptType(type) {
|
|
588
|
-
if (type ===
|
|
622
|
+
if (type === WA_MESSAGE_TYPES.RECEIPT_TYPE_READ) {
|
|
589
623
|
return 'read';
|
|
590
624
|
}
|
|
591
|
-
if (type ===
|
|
625
|
+
if (type === WA_MESSAGE_TYPES.RECEIPT_TYPE_PLAYED) {
|
|
592
626
|
return 'played';
|
|
593
627
|
}
|
|
594
628
|
if (type === undefined ||
|
|
595
629
|
type === '' ||
|
|
596
|
-
type ===
|
|
597
|
-
type ===
|
|
598
|
-
type ===
|
|
599
|
-
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) {
|
|
600
634
|
return 'delivered';
|
|
601
635
|
}
|
|
602
636
|
return null;
|
|
603
637
|
}
|
|
604
638
|
async sendRetryAckSafe(receiptNode) {
|
|
605
639
|
if (!receiptNode.attrs.id || !receiptNode.attrs.from) {
|
|
606
|
-
this.logger.warn('retry ack skipped: missing receipt id/from', {
|
|
640
|
+
this.deps.logger.warn('retry ack skipped: missing receipt id/from', {
|
|
607
641
|
hasId: receiptNode.attrs.id !== undefined,
|
|
608
642
|
hasFrom: receiptNode.attrs.from !== undefined,
|
|
609
643
|
participant: receiptNode.attrs.participant,
|
|
@@ -612,14 +646,14 @@ export class WaRetryCoordinator {
|
|
|
612
646
|
return;
|
|
613
647
|
}
|
|
614
648
|
try {
|
|
615
|
-
await this.sendNode(buildAckNode({
|
|
649
|
+
await this.deps.sendNode(buildAckNode({
|
|
616
650
|
kind: 'receipt',
|
|
617
651
|
node: receiptNode,
|
|
618
652
|
retryType: true
|
|
619
653
|
}));
|
|
620
654
|
}
|
|
621
655
|
catch (error) {
|
|
622
|
-
this.logger.warn('failed to send retry ack', {
|
|
656
|
+
this.deps.logger.warn('failed to send retry ack', {
|
|
623
657
|
id: receiptNode.attrs.id,
|
|
624
658
|
from: receiptNode.attrs.from,
|
|
625
659
|
participant: receiptNode.attrs.participant,
|
|
@@ -634,10 +668,10 @@ export class WaRetryCoordinator {
|
|
|
634
668
|
this.nextRetryCleanupAtMs = nowMs + RETRY_CLEANUP_INTERVAL_MS;
|
|
635
669
|
this.cleanupRetrySessionBaseKeys(nowMs);
|
|
636
670
|
try {
|
|
637
|
-
await this.retryStore.cleanupExpired(nowMs);
|
|
671
|
+
await this.deps.retryStore.cleanupExpired(nowMs);
|
|
638
672
|
}
|
|
639
673
|
catch (error) {
|
|
640
|
-
this.logger.warn('retry store cleanup failed', {
|
|
674
|
+
this.deps.logger.warn('retry store cleanup failed', {
|
|
641
675
|
message: toError(error).message
|
|
642
676
|
});
|
|
643
677
|
}
|
|
@@ -672,4 +706,103 @@ export class WaRetryCoordinator {
|
|
|
672
706
|
this.retrySessionBaseKeys.delete(key);
|
|
673
707
|
}
|
|
674
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
|
+
}
|
|
675
808
|
}
|