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