zapo-js 0.3.0 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +97 -177
- package/dist/appstate/{WaAppStateCrypto.js → crypto/WaAppStateCrypto.js} +58 -49
- package/dist/appstate/index.js +7 -6
- package/dist/appstate/{encoding.js → parsers/encoding.js} +11 -4
- package/dist/appstate/{response-parser.js → parsers/response-parser.js} +20 -8
- package/dist/appstate/{WaAppStateSyncClient.js → sync/WaAppStateSyncClient.js} +174 -53
- package/dist/appstate/utils.js +16 -0
- package/dist/appstate-spec.js +89 -0
- package/dist/auth/WaAuthClient.js +100 -5
- package/dist/auth/credentials-flow.js +19 -7
- package/dist/auth/pairing/WaPairingFlow.js +33 -24
- package/dist/auth/pairing/pairing-code-crypto.js +16 -18
- package/dist/client/WaClient.js +342 -473
- package/dist/client/WaClientFactory.js +279 -78
- package/dist/client/connection/WaConnectionManager.js +28 -11
- package/dist/client/coordinators/WaAbPropsCoordinator.js +1 -2
- package/dist/client/coordinators/WaAppStateMutationCoordinator.js +663 -143
- package/dist/client/coordinators/WaBotCoordinator.js +345 -0
- package/dist/client/coordinators/WaBroadcastListCoordinator.js +20 -0
- package/dist/client/coordinators/WaBusinessCoordinator.js +81 -171
- package/dist/client/coordinators/WaEmailCoordinator.js +1 -0
- package/dist/client/coordinators/WaGroupCoordinator.js +529 -52
- package/dist/client/coordinators/WaIncomingNodeCoordinator.js +97 -12
- package/dist/client/coordinators/WaLowLevelCoordinator.js +41 -0
- package/dist/client/coordinators/WaMessageCoordinator.js +365 -0
- package/dist/client/coordinators/WaMessageDispatchCoordinator.js +682 -204
- package/dist/client/coordinators/WaNewsletterCoordinator.js +18 -0
- package/dist/client/coordinators/WaPassiveTasksCoordinator.js +17 -4
- package/dist/client/coordinators/WaPresenceCoordinator.js +21 -0
- package/dist/client/coordinators/WaPrivacyCoordinator.js +7 -5
- package/dist/client/coordinators/WaProfileCoordinator.js +220 -49
- package/dist/client/coordinators/WaRetryCoordinator.js +256 -125
- package/dist/client/coordinators/WaStatusCoordinator.js +49 -0
- package/dist/client/coordinators/WaStreamControlCoordinator.js +6 -6
- package/dist/client/coordinators/WaTrustedContactTokenCoordinator.js +7 -6
- package/dist/client/events/appstate-mutation.js +133 -0
- package/dist/client/events/business.js +375 -0
- package/dist/client/events/call.js +58 -0
- package/dist/client/events/chatstate.js +23 -0
- package/dist/client/events/devices.js +15 -16
- package/dist/client/{dirty.js → events/dirty.js} +33 -19
- package/dist/client/events/group.js +13 -24
- package/dist/client/events/identity.js +2 -1
- package/dist/client/events/incoming.js +502 -0
- package/dist/client/events/mex-notification.js +181 -0
- package/dist/client/events/picture.js +33 -0
- package/dist/client/events/presence.js +44 -0
- package/dist/client/events/receipt.js +26 -0
- package/dist/client/media.js +161 -4
- package/dist/client/messaging/fanout.js +9 -10
- package/dist/client/messaging/{participants.js → group-metadata.js} +73 -35
- package/dist/client/messaging/ignore-key.js +132 -0
- package/dist/client/messaging/key-protocol.js +3 -17
- package/dist/client/messaging/link-preview.js +159 -0
- package/dist/client/messaging/messages.js +671 -0
- package/dist/client/newsletter/admin.js +165 -0
- package/dist/client/newsletter/content.js +253 -0
- package/dist/client/newsletter/discovery.js +115 -0
- package/dist/client/newsletter/messaging.js +197 -0
- package/dist/client/newsletter/mex.js +41 -0
- package/dist/client/newsletter/parse.js +217 -0
- package/dist/client/persistence/WriteBehindPersistence.js +31 -4
- package/dist/client/{history-sync.js → persistence/history-sync.js} +125 -18
- package/dist/client/persistence/mailbox.js +104 -0
- package/dist/client/tokens/cs-token.js +11 -17
- package/dist/crypto/core/hkdf.js +12 -12
- package/dist/crypto/core/index.js +6 -8
- package/dist/crypto/core/keys.js +1 -8
- package/dist/crypto/core/nonce.js +12 -12
- package/dist/crypto/core/primitives.js +123 -93
- package/dist/crypto/core/random.js +6 -0
- package/dist/crypto/core/xeddsa.js +11 -9
- package/dist/crypto/curves/Ed25519.js +32 -21
- package/dist/crypto/curves/X25519.js +70 -34
- package/dist/crypto/curves/constants.js +2 -1
- package/dist/crypto/math/constants.js +1 -2
- package/dist/crypto/math/mod.js +0 -33
- package/dist/esm/appstate/{WaAppStateCrypto.js → crypto/WaAppStateCrypto.js} +58 -49
- package/dist/esm/appstate/index.js +5 -5
- package/dist/esm/appstate/{encoding.js → parsers/encoding.js} +11 -4
- package/dist/esm/appstate/{response-parser.js → parsers/response-parser.js} +20 -8
- package/dist/esm/appstate/{WaAppStateSyncClient.js → sync/WaAppStateSyncClient.js} +174 -52
- package/dist/esm/appstate/utils.js +16 -0
- package/dist/esm/appstate-spec.js +79 -0
- package/dist/esm/auth/WaAuthClient.js +100 -5
- package/dist/esm/auth/credentials-flow.js +18 -6
- package/dist/esm/auth/pairing/WaPairingFlow.js +34 -25
- package/dist/esm/auth/pairing/pairing-code-crypto.js +12 -14
- package/dist/esm/client/WaClient.js +345 -476
- package/dist/esm/client/WaClientFactory.js +280 -79
- package/dist/esm/client/connection/WaConnectionManager.js +28 -11
- package/dist/esm/client/coordinators/WaAbPropsCoordinator.js +2 -3
- package/dist/esm/client/coordinators/WaAppStateMutationCoordinator.js +665 -145
- package/dist/esm/client/coordinators/WaBotCoordinator.js +342 -0
- package/dist/esm/client/coordinators/WaBroadcastListCoordinator.js +17 -0
- package/dist/esm/client/coordinators/WaBusinessCoordinator.js +79 -169
- package/dist/esm/client/coordinators/WaEmailCoordinator.js +1 -0
- package/dist/esm/client/coordinators/WaGroupCoordinator.js +532 -55
- package/dist/esm/client/coordinators/WaIncomingNodeCoordinator.js +98 -13
- package/dist/esm/client/coordinators/WaLowLevelCoordinator.js +38 -0
- package/dist/esm/client/coordinators/WaMessageCoordinator.js +361 -0
- package/dist/esm/client/coordinators/WaMessageDispatchCoordinator.js +686 -208
- package/dist/esm/client/coordinators/WaNewsletterCoordinator.js +13 -0
- package/dist/esm/client/coordinators/WaPassiveTasksCoordinator.js +18 -5
- package/dist/esm/client/coordinators/WaPresenceCoordinator.js +18 -0
- package/dist/esm/client/coordinators/WaPrivacyCoordinator.js +7 -5
- package/dist/esm/client/coordinators/WaProfileCoordinator.js +223 -52
- package/dist/esm/client/coordinators/WaRetryCoordinator.js +258 -127
- package/dist/esm/client/coordinators/WaStatusCoordinator.js +46 -0
- package/dist/esm/client/coordinators/WaStreamControlCoordinator.js +6 -6
- package/dist/esm/client/coordinators/WaTrustedContactTokenCoordinator.js +7 -6
- package/dist/esm/client/events/appstate-mutation.js +130 -0
- package/dist/esm/client/events/business.js +370 -0
- package/dist/esm/client/events/call.js +55 -0
- package/dist/esm/client/events/chatstate.js +20 -0
- package/dist/esm/client/events/devices.js +15 -16
- package/dist/esm/client/{dirty.js → events/dirty.js} +33 -19
- package/dist/esm/client/events/group.js +14 -25
- package/dist/esm/client/events/identity.js +2 -1
- package/dist/esm/client/events/incoming.js +487 -0
- package/dist/esm/client/events/mex-notification.js +178 -0
- package/dist/esm/client/events/picture.js +30 -0
- package/dist/esm/client/events/presence.js +41 -0
- package/dist/esm/client/events/receipt.js +23 -0
- package/dist/esm/client/media.js +156 -6
- package/dist/esm/client/messaging/fanout.js +10 -11
- package/dist/esm/client/messaging/{participants.js → group-metadata.js} +72 -34
- package/dist/esm/client/messaging/ignore-key.js +126 -0
- package/dist/esm/client/messaging/key-protocol.js +3 -17
- package/dist/esm/client/messaging/link-preview.js +156 -0
- package/dist/esm/client/messaging/messages.js +667 -0
- package/dist/esm/client/newsletter/admin.js +162 -0
- package/dist/esm/client/newsletter/content.js +249 -0
- package/dist/esm/client/newsletter/discovery.js +112 -0
- package/dist/esm/client/newsletter/messaging.js +194 -0
- package/dist/esm/client/newsletter/mex.js +37 -0
- package/dist/esm/client/newsletter/parse.js +200 -0
- package/dist/esm/client/persistence/WriteBehindPersistence.js +31 -4
- package/dist/esm/client/{history-sync.js → persistence/history-sync.js} +124 -18
- package/dist/esm/client/persistence/mailbox.js +101 -0
- package/dist/esm/client/tokens/cs-token.js +12 -18
- package/dist/esm/crypto/core/hkdf.js +14 -14
- package/dist/esm/crypto/core/index.js +2 -2
- package/dist/esm/crypto/core/keys.js +1 -7
- package/dist/esm/crypto/core/nonce.js +11 -11
- package/dist/esm/crypto/core/primitives.js +121 -88
- package/dist/esm/crypto/core/random.js +6 -0
- package/dist/esm/crypto/core/xeddsa.js +11 -9
- package/dist/esm/crypto/curves/Ed25519.js +35 -24
- package/dist/esm/crypto/curves/X25519.js +72 -36
- package/dist/esm/crypto/curves/constants.js +1 -0
- package/dist/esm/crypto/math/constants.js +1 -2
- package/dist/esm/crypto/math/mod.js +0 -32
- package/dist/esm/index.js +7 -2
- package/dist/esm/infra/log/ConsoleLogger.js +30 -6
- package/dist/esm/infra/log/PinoLogger.js +64 -0
- package/dist/esm/infra/log/types.js +4 -2
- package/dist/esm/infra/perf/BackgroundQueue.js +55 -13
- package/dist/esm/media/constants.js +33 -2
- package/dist/esm/media/crypto/WaMediaCrypto.js +374 -0
- package/dist/esm/media/index.js +4 -3
- package/dist/esm/media/sticker/sticker-pack.js +133 -0
- package/dist/esm/media/{WaMediaTransferClient.js → transfer/WaMediaTransferClient.js} +37 -6
- package/dist/esm/media/{conn.js → transfer/conn.js} +10 -5
- package/dist/esm/message/WaMessageClient.js +46 -15
- package/dist/esm/message/addons/link-preview/builder.js +36 -0
- package/dist/esm/message/addons/link-preview/detect.js +55 -0
- package/dist/esm/message/addons/link-preview/fetcher.js +391 -0
- package/dist/esm/message/addons/link-preview/types.js +1 -0
- package/dist/esm/message/context-info.js +123 -0
- package/dist/esm/message/{addon-crypto.js → crypto/addon-crypto.js} +68 -10
- package/dist/esm/message/{icdc.js → crypto/icdc.js} +5 -7
- package/dist/esm/message/crypto/phash.js +133 -0
- package/dist/esm/message/{reporting-token.js → crypto/reporting-token.js} +6 -6
- package/dist/esm/message/{use-case-secret.js → crypto/use-case-secret.js} +20 -3
- package/dist/esm/message/{content.js → encode/content.js} +176 -7
- package/dist/esm/message/encode/media-payload.js +42 -0
- package/dist/esm/message/{padding.js → encode/padding.js} +9 -3
- package/dist/esm/message/index.js +2 -2
- package/dist/esm/message/kinds/bot.js +111 -0
- package/dist/esm/message/kinds/newsletter.js +244 -0
- package/dist/esm/message/kinds/sticker-pack.js +29 -0
- package/dist/esm/message/{ack.js → primitives/ack.js} +8 -1
- package/dist/esm/message/{incoming.js → primitives/incoming.js} +215 -31
- package/dist/esm/message/primitives/peer-data-operation.js +93 -0
- package/dist/esm/mex.js +1 -0
- package/dist/esm/protocol/abprops.js +10 -0
- package/dist/esm/protocol/appstate.js +6 -30
- package/dist/esm/protocol/auth.js +3 -2
- package/dist/esm/protocol/bot.js +77 -0
- package/dist/esm/protocol/browser.js +8 -0
- package/dist/esm/protocol/business.js +19 -0
- package/dist/esm/protocol/call.js +48 -0
- package/dist/esm/protocol/constants.js +8 -2
- package/dist/esm/protocol/defaults.js +3 -0
- package/dist/esm/protocol/index.js +1 -1
- package/dist/esm/protocol/jid.js +102 -5
- package/dist/esm/protocol/media.js +25 -12
- package/dist/esm/protocol/message.js +4 -1
- package/dist/esm/protocol/newsletter.js +61 -0
- package/dist/esm/protocol/nodes.js +22 -2
- package/dist/esm/protocol/notification.js +18 -2
- package/dist/esm/protocol/presence.js +13 -0
- package/dist/esm/protocol/status.js +6 -0
- package/dist/esm/retry/codec.js +5 -0
- package/dist/esm/retry/parse.js +20 -38
- package/dist/esm/retry/reason.js +5 -0
- package/dist/esm/retry/replay.js +131 -37
- package/dist/esm/retry/tracker.js +4 -8
- package/dist/esm/signal/api/SignalDeviceSyncApi.js +66 -19
- package/dist/esm/signal/api/SignalDigestSyncApi.js +7 -2
- package/dist/esm/signal/api/SignalIdentitySyncApi.js +9 -0
- package/dist/esm/signal/api/SignalMissingPreKeysSyncApi.js +24 -63
- package/dist/esm/signal/api/SignalRotateKeyApi.js +10 -0
- package/dist/esm/signal/api/SignalSessionSyncApi.js +23 -51
- package/dist/esm/signal/api/codec.js +52 -1
- package/dist/esm/signal/api/prekeys.js +4 -0
- package/dist/esm/signal/{crypto → attestation}/WaAdvSignature.js +5 -6
- package/dist/esm/signal/constants.js +3 -0
- package/dist/esm/signal/encoding.js +6 -289
- package/dist/esm/signal/group/SenderKeyChain.js +18 -33
- package/dist/esm/signal/group/SenderKeyManager.js +25 -8
- package/dist/esm/signal/group/encoding.js +96 -0
- package/dist/esm/signal/index.js +4 -1
- package/dist/esm/signal/registration/encoding.js +34 -0
- package/dist/esm/signal/registration/keygen.js +10 -0
- package/dist/esm/signal/registration/utils.js +6 -0
- package/dist/esm/signal/session/SignalProtocol.js +113 -11
- package/dist/esm/signal/session/SignalRatchet.js +29 -58
- package/dist/esm/signal/session/SignalSession.js +7 -14
- package/dist/esm/signal/session/encoding.js +173 -0
- package/dist/esm/signal/session/resolver.js +139 -30
- package/dist/esm/store/cache/identity.cache.js +75 -0
- package/dist/esm/store/cache/privacy-token.cache.js +57 -0
- package/dist/esm/store/cache/sender-key.cache.js +101 -0
- package/dist/esm/store/cache/session.cache.js +92 -0
- package/dist/esm/store/contracts/group-metadata.store.js +1 -0
- package/dist/esm/store/createStore.js +91 -37
- package/dist/esm/store/index.js +15 -14
- package/dist/esm/store/locks/contact.lock.js +1 -0
- package/dist/esm/store/locks/device-list.lock.js +1 -0
- package/dist/esm/store/locks/group-metadata.lock.js +20 -0
- package/dist/esm/store/{providers/memory → memory}/appstate.store.js +5 -5
- package/dist/esm/store/memory/auth.store.js +24 -0
- package/dist/esm/store/memory/contact.store.js +79 -0
- package/dist/esm/store/memory/device-list.store.js +103 -0
- package/dist/esm/store/{providers/memory/participants.store.js → memory/group-metadata.store.js} +22 -13
- package/dist/esm/store/{providers/memory → memory}/identity.store.js +3 -3
- package/dist/esm/store/{providers/memory → memory}/message-secret.store.js +17 -8
- package/dist/esm/store/{providers/memory → memory}/message.store.js +2 -2
- package/dist/esm/store/{providers/memory → memory}/pre-key.store.js +2 -2
- package/dist/esm/store/{providers/memory → memory}/privacy-token.store.js +1 -1
- package/dist/esm/store/{providers/memory → memory}/retry.store.js +28 -7
- package/dist/esm/store/{providers/memory → memory}/sender-key.store.js +3 -3
- package/dist/esm/store/{providers/memory → memory}/session.store.js +3 -3
- package/dist/esm/store/{providers/memory → memory}/thread.store.js +2 -2
- package/dist/esm/store/noop.store.js +6 -4
- package/dist/esm/transport/WaComms.js +14 -5
- package/dist/esm/transport/WaWebSocket.js +32 -8
- package/dist/esm/transport/binary/constants.js +10 -4
- package/dist/esm/transport/binary/decoder.js +21 -15
- package/dist/esm/transport/binary/encoder.js +96 -21
- package/dist/esm/transport/binary/tokens.js +12 -12
- package/dist/esm/transport/index.js +1 -0
- package/dist/esm/transport/keepalive/WaKeepAlive.js +18 -4
- package/dist/esm/transport/node/WaMobileTcpSocket.js +6 -0
- package/dist/esm/transport/node/WaNodeOrchestrator.js +9 -5
- package/dist/esm/transport/node/WaNodeTransport.js +13 -0
- package/dist/esm/transport/node/builders/abprops.js +2 -2
- package/dist/esm/transport/node/builders/account-sync.js +7 -15
- package/dist/esm/transport/node/builders/bot.js +38 -0
- package/dist/esm/transport/node/builders/business.js +30 -30
- package/dist/esm/transport/node/builders/chatstate.js +28 -0
- package/dist/esm/transport/node/builders/community.js +53 -0
- package/dist/esm/transport/node/builders/device.js +2 -2
- package/dist/esm/transport/node/builders/email.js +6 -5
- package/dist/esm/transport/node/builders/global.js +1 -1
- package/dist/esm/transport/node/builders/group.js +114 -4
- package/dist/esm/transport/node/builders/media.js +2 -2
- package/dist/esm/transport/node/builders/message.js +83 -49
- package/dist/esm/transport/node/builders/newsletter.js +176 -0
- package/dist/esm/transport/node/builders/passive.js +7 -0
- package/dist/esm/transport/node/builders/prekeys.js +4 -4
- package/dist/esm/transport/node/builders/presence.js +27 -1
- package/dist/esm/transport/node/builders/privacy-token.js +2 -2
- package/dist/esm/transport/node/builders/privacy.js +6 -6
- package/dist/esm/transport/node/builders/profile.js +28 -8
- package/dist/esm/transport/node/builders/tos.js +58 -0
- package/dist/esm/transport/node/builders/usync.js +51 -2
- package/dist/esm/transport/node/helpers.js +3 -1
- package/dist/esm/transport/node/mex/argo-decoder.js +2 -2
- package/dist/esm/transport/node/mex/client.js +22 -0
- package/dist/esm/transport/node/query.js +17 -0
- package/dist/esm/transport/node/usync.js +12 -0
- package/dist/esm/transport/noise/WaClientPayload.js +8 -8
- package/dist/esm/transport/noise/WaMobileClientPayload.js +5 -0
- package/dist/esm/transport/noise/WaNoiseCert.js +5 -0
- package/dist/esm/transport/noise/WaNoiseHandshake.js +27 -25
- package/dist/esm/transport/noise/WaNoiseSession.js +39 -59
- package/dist/esm/transport/noise/WaNoiseSocket.js +19 -13
- package/dist/esm/transport/noise/constants.js +0 -1
- package/dist/esm/transport/proxy.js +5 -0
- package/dist/esm/transport/stream/parse.js +3 -7
- package/dist/esm/transport/wa-web-version-fetcher.js +91 -0
- package/dist/esm/util/async.js +4 -0
- package/dist/esm/util/bytes.js +37 -2
- package/dist/esm/util/clock.js +15 -0
- package/dist/esm/util/coercion.js +45 -3
- package/dist/esm/util/collections.js +11 -0
- package/dist/esm/util/index.js +2 -2
- package/dist/esm/util/primitives.js +19 -0
- package/dist/esm/util/runtime.js +5 -0
- package/dist/esm/version-spec.js +1 -0
- package/dist/index.js +31 -1
- package/dist/infra/log/ConsoleLogger.js +30 -6
- package/dist/infra/log/PinoLogger.js +64 -0
- package/dist/infra/log/types.js +4 -2
- package/dist/infra/perf/BackgroundQueue.js +55 -13
- package/dist/media/constants.js +34 -3
- package/dist/media/crypto/WaMediaCrypto.js +378 -0
- package/dist/media/index.js +9 -4
- package/dist/media/sticker/sticker-pack.js +136 -0
- package/dist/media/{WaMediaTransferClient.js → transfer/WaMediaTransferClient.js} +37 -6
- package/dist/media/{conn.js → transfer/conn.js} +10 -5
- package/dist/message/WaMessageClient.js +46 -15
- package/dist/message/addons/link-preview/builder.js +39 -0
- package/dist/message/addons/link-preview/detect.js +58 -0
- package/dist/message/addons/link-preview/fetcher.js +394 -0
- package/dist/message/addons/link-preview/types.js +2 -0
- package/dist/message/context-info.js +129 -0
- package/dist/message/{addon-crypto.js → crypto/addon-crypto.js} +68 -10
- package/dist/message/{icdc.js → crypto/icdc.js} +5 -7
- package/dist/message/crypto/phash.js +136 -0
- package/dist/message/{reporting-token.js → crypto/reporting-token.js} +6 -6
- package/dist/message/{use-case-secret.js → crypto/use-case-secret.js} +20 -3
- package/dist/message/{content.js → encode/content.js} +192 -7
- package/dist/message/encode/media-payload.js +45 -0
- package/dist/message/{padding.js → encode/padding.js} +9 -3
- package/dist/message/index.js +2 -2
- package/dist/message/kinds/bot.js +120 -0
- package/dist/message/kinds/newsletter.js +248 -0
- package/dist/message/kinds/sticker-pack.js +34 -0
- package/dist/message/{ack.js → primitives/ack.js} +8 -1
- package/dist/message/{incoming.js → primitives/incoming.js} +216 -31
- package/dist/message/primitives/peer-data-operation.js +96 -0
- package/dist/mex.js +6 -0
- package/dist/proto.js +1 -1
- package/dist/protocol/abprops.js +10 -0
- package/dist/protocol/appstate.js +7 -31
- package/dist/protocol/auth.js +3 -2
- package/dist/protocol/bot.js +81 -0
- package/dist/protocol/browser.js +8 -0
- package/dist/protocol/business.js +22 -0
- package/dist/protocol/call.js +51 -0
- package/dist/protocol/constants.js +39 -3
- package/dist/protocol/defaults.js +3 -0
- package/dist/protocol/index.js +12 -3
- package/dist/protocol/jid.js +107 -5
- package/dist/protocol/media.js +25 -12
- package/dist/protocol/message.js +4 -1
- package/dist/protocol/newsletter.js +64 -0
- package/dist/protocol/nodes.js +22 -2
- package/dist/protocol/notification.js +19 -3
- package/dist/protocol/presence.js +16 -0
- package/dist/protocol/status.js +9 -0
- package/dist/retry/codec.js +5 -0
- package/dist/retry/parse.js +16 -34
- package/dist/retry/reason.js +5 -0
- package/dist/retry/replay.js +129 -35
- package/dist/retry/tracker.js +3 -7
- package/dist/signal/api/SignalDeviceSyncApi.js +64 -17
- package/dist/signal/api/SignalDigestSyncApi.js +6 -1
- package/dist/signal/api/SignalIdentitySyncApi.js +9 -0
- package/dist/signal/api/SignalMissingPreKeysSyncApi.js +21 -60
- package/dist/signal/api/SignalRotateKeyApi.js +10 -0
- package/dist/signal/api/SignalSessionSyncApi.js +20 -48
- package/dist/signal/api/codec.js +52 -0
- package/dist/signal/api/prekeys.js +4 -0
- package/dist/signal/{crypto → attestation}/WaAdvSignature.js +5 -7
- package/dist/signal/constants.js +4 -1
- package/dist/signal/encoding.js +5 -303
- package/dist/signal/group/SenderKeyChain.js +17 -32
- package/dist/signal/group/SenderKeyManager.js +24 -7
- package/dist/signal/group/encoding.js +101 -0
- package/dist/signal/index.js +13 -10
- package/dist/signal/registration/encoding.js +39 -0
- package/dist/signal/registration/keygen.js +10 -0
- package/dist/signal/registration/utils.js +6 -0
- package/dist/signal/session/SignalProtocol.js +112 -10
- package/dist/signal/session/SignalRatchet.js +24 -54
- package/dist/signal/session/SignalSession.js +6 -14
- package/dist/signal/session/encoding.js +183 -0
- package/dist/signal/session/resolver.js +139 -30
- package/dist/store/cache/identity.cache.js +78 -0
- package/dist/store/cache/privacy-token.cache.js +60 -0
- package/dist/store/cache/sender-key.cache.js +104 -0
- package/dist/store/cache/session.cache.js +95 -0
- package/dist/store/contracts/group-metadata.store.js +2 -0
- package/dist/store/createStore.js +90 -36
- package/dist/store/index.js +18 -16
- package/dist/store/locks/contact.lock.js +1 -0
- package/dist/store/locks/device-list.lock.js +1 -0
- package/dist/store/locks/group-metadata.lock.js +23 -0
- package/dist/store/{providers/memory → memory}/appstate.store.js +5 -5
- package/dist/store/memory/auth.store.js +28 -0
- package/dist/store/memory/contact.store.js +83 -0
- package/dist/store/memory/device-list.store.js +107 -0
- package/dist/store/{providers/memory/participants.store.js → memory/group-metadata.store.js} +24 -15
- package/dist/store/{providers/memory → memory}/identity.store.js +3 -3
- package/dist/store/{providers/memory → memory}/message-secret.store.js +17 -8
- package/dist/store/{providers/memory → memory}/message.store.js +2 -2
- package/dist/store/{providers/memory → memory}/pre-key.store.js +2 -2
- package/dist/store/{providers/memory → memory}/privacy-token.store.js +1 -1
- package/dist/store/{providers/memory → memory}/retry.store.js +28 -7
- package/dist/store/{providers/memory → memory}/sender-key.store.js +3 -3
- package/dist/store/{providers/memory → memory}/session.store.js +3 -3
- package/dist/store/{providers/memory → memory}/thread.store.js +2 -2
- package/dist/store/noop.store.js +7 -5
- package/dist/transport/WaComms.js +14 -5
- package/dist/transport/WaWebSocket.js +32 -8
- package/dist/transport/binary/constants.js +11 -5
- package/dist/transport/binary/decoder.js +24 -18
- package/dist/transport/binary/encoder.js +109 -34
- package/dist/transport/binary/tokens.js +12 -12
- package/dist/transport/index.js +3 -1
- package/dist/transport/keepalive/WaKeepAlive.js +18 -4
- package/dist/transport/node/WaMobileTcpSocket.js +6 -0
- package/dist/transport/node/WaNodeOrchestrator.js +9 -5
- package/dist/transport/node/WaNodeTransport.js +13 -0
- package/dist/transport/node/builders/abprops.js +1 -1
- package/dist/transport/node/builders/account-sync.js +7 -16
- package/dist/transport/node/builders/bot.js +43 -0
- package/dist/transport/node/builders/business.js +31 -31
- package/dist/transport/node/builders/chatstate.js +31 -0
- package/dist/transport/node/builders/community.js +59 -0
- package/dist/transport/node/builders/device.js +1 -1
- package/dist/transport/node/builders/email.js +6 -5
- package/dist/transport/node/builders/global.js +1 -1
- package/dist/transport/node/builders/group.js +121 -3
- package/dist/transport/node/builders/media.js +1 -1
- package/dist/transport/node/builders/message.js +84 -49
- package/dist/transport/node/builders/newsletter.js +183 -0
- package/dist/transport/node/builders/passive.js +10 -0
- package/dist/transport/node/builders/prekeys.js +3 -3
- package/dist/transport/node/builders/presence.js +28 -1
- package/dist/transport/node/builders/privacy-token.js +1 -1
- package/dist/transport/node/builders/privacy.js +5 -5
- package/dist/transport/node/builders/profile.js +30 -7
- package/dist/transport/node/builders/tos.js +63 -0
- package/dist/transport/node/builders/usync.js +52 -1
- package/dist/transport/node/helpers.js +2 -1
- package/dist/transport/node/mex/argo-decoder.js +2 -2
- package/dist/transport/node/mex/client.js +23 -0
- package/dist/transport/node/query.js +17 -0
- package/dist/transport/node/usync.js +13 -0
- package/dist/transport/noise/WaClientPayload.js +8 -8
- package/dist/transport/noise/WaMobileClientPayload.js +5 -0
- package/dist/transport/noise/WaNoiseCert.js +5 -0
- package/dist/transport/noise/WaNoiseHandshake.js +25 -23
- package/dist/transport/noise/WaNoiseSession.js +39 -59
- package/dist/transport/noise/WaNoiseSocket.js +18 -12
- package/dist/transport/noise/constants.js +1 -2
- package/dist/transport/proxy.js +5 -0
- package/dist/transport/stream/parse.js +3 -7
- package/dist/transport/wa-web-version-fetcher.js +94 -0
- package/dist/types/appstate/constants.d.ts +1 -1
- package/dist/types/appstate/{WaAppStateCrypto.d.ts → crypto/WaAppStateCrypto.d.ts} +26 -9
- package/dist/types/appstate/index.d.ts +5 -5
- package/dist/types/appstate/{encoding.d.ts → parsers/encoding.d.ts} +8 -1
- package/dist/types/appstate/{response-parser.d.ts → parsers/response-parser.d.ts} +13 -3
- package/dist/types/appstate/sync/WaAppStateSyncClient.d.ts +105 -0
- package/dist/types/appstate/utils.d.ts +17 -1
- package/dist/types/appstate-spec.d.ts +24 -0
- package/dist/types/auth/WaAuthClient.d.ts +89 -3
- package/dist/types/auth/credentials-flow.d.ts +4 -3
- package/dist/types/auth/pairing/pairing-code-crypto.d.ts +0 -1
- package/dist/types/auth/types.d.ts +48 -1
- package/dist/types/client/WaClient.d.ts +178 -71
- package/dist/types/client/WaClientFactory.d.ts +30 -5
- package/dist/types/client/connection/WaConnectionManager.d.ts +4 -2
- package/dist/types/client/connection/WaReceiptQueue.d.ts +1 -1
- package/dist/types/client/coordinators/WaAppStateMutationCoordinator.d.ts +215 -5
- package/dist/types/client/coordinators/WaBotCoordinator.d.ts +117 -0
- package/dist/types/client/coordinators/WaBroadcastListCoordinator.d.ts +39 -0
- package/dist/types/client/coordinators/WaBusinessCoordinator.d.ts +44 -43
- package/dist/types/client/coordinators/WaEmailCoordinator.d.ts +16 -0
- package/dist/types/client/coordinators/WaGroupCoordinator.d.ts +311 -9
- package/dist/types/client/coordinators/WaIncomingNodeCoordinator.d.ts +11 -4
- package/dist/types/client/coordinators/WaLowLevelCoordinator.d.ts +47 -0
- package/dist/types/client/coordinators/WaMessageCoordinator.d.ts +232 -0
- package/dist/types/client/coordinators/WaMessageDispatchCoordinator.d.ts +54 -31
- package/dist/types/client/coordinators/WaNewsletterCoordinator.d.ts +13 -0
- package/dist/types/client/coordinators/WaPassiveTasksCoordinator.d.ts +4 -3
- package/dist/types/client/coordinators/WaPresenceCoordinator.d.ts +27 -0
- package/dist/types/client/coordinators/WaPrivacyCoordinator.d.ts +27 -0
- package/dist/types/client/coordinators/WaProfileCoordinator.d.ts +113 -0
- package/dist/types/client/coordinators/WaRetryCoordinator.d.ts +19 -17
- package/dist/types/client/coordinators/WaStatusCoordinator.d.ts +42 -0
- package/dist/types/client/coordinators/WaTrustedContactTokenCoordinator.d.ts +5 -1
- package/dist/types/client/events/abprops.d.ts +2 -1
- package/dist/types/client/events/appstate-mutation.d.ts +3 -0
- package/dist/types/client/events/business.d.ts +10 -0
- package/dist/types/client/events/call.d.ts +31 -0
- package/dist/types/client/events/chatstate.d.ts +9 -0
- package/dist/types/client/events/devices.d.ts +5 -4
- package/dist/types/client/{dirty.d.ts → events/dirty.d.ts} +4 -3
- package/dist/types/client/events/group.d.ts +2 -1
- package/dist/types/client/events/identity.d.ts +2 -1
- package/dist/types/client/{incoming.d.ts → events/incoming.d.ts} +27 -4
- package/dist/types/client/events/mex-notification.d.ts +6 -0
- package/dist/types/client/events/picture.d.ts +8 -0
- package/dist/types/client/events/presence.d.ts +28 -0
- package/dist/types/client/events/receipt.d.ts +14 -0
- package/dist/types/client/events/registration.d.ts +4 -3
- package/dist/types/client/index.d.ts +1 -1
- package/dist/types/client/media.d.ts +35 -1
- package/dist/types/client/messaging/fanout.d.ts +2 -2
- package/dist/types/client/messaging/group-metadata.d.ts +19 -0
- package/dist/types/client/messaging/ignore-key.d.ts +11 -0
- package/dist/types/client/messaging/key-protocol.d.ts +9 -7
- package/dist/types/client/messaging/link-preview.d.ts +19 -0
- package/dist/types/client/messaging/messages.d.ts +28 -0
- package/dist/types/client/newsletter/admin.d.ts +71 -0
- package/dist/types/client/newsletter/content.d.ts +42 -0
- package/dist/types/client/newsletter/discovery.d.ts +33 -0
- package/dist/types/client/newsletter/messaging.d.ts +66 -0
- package/dist/types/client/newsletter/mex.d.ts +14 -0
- package/dist/types/client/newsletter/parse.d.ts +19 -0
- package/dist/types/client/newsletter/types.d.ts +190 -0
- package/dist/types/client/persistence/WriteBehindPersistence.d.ts +12 -1
- package/dist/types/client/persistence/history-sync.d.ts +29 -0
- package/dist/types/client/{mailbox.d.ts → persistence/mailbox.d.ts} +4 -4
- package/dist/types/client/tokens/cs-token.d.ts +1 -3
- package/dist/types/client/types.d.ts +843 -71
- package/dist/types/crypto/core/hkdf.d.ts +10 -2
- package/dist/types/crypto/core/index.d.ts +2 -2
- package/dist/types/crypto/core/keys.d.ts +0 -4
- package/dist/types/crypto/core/nonce.d.ts +4 -5
- package/dist/types/crypto/core/primitives.d.ts +31 -20
- package/dist/types/crypto/core/random.d.ts +6 -0
- package/dist/types/crypto/core/xeddsa.d.ts +9 -0
- package/dist/types/crypto/curves/Ed25519.d.ts +7 -1
- package/dist/types/crypto/curves/X25519.d.ts +20 -1
- package/dist/types/crypto/curves/constants.d.ts +4 -3
- package/dist/types/crypto/curves/types.d.ts +0 -5
- package/dist/types/crypto/math/constants.d.ts +0 -1
- package/dist/types/crypto/math/mod.d.ts +0 -1
- package/dist/types/index.d.ts +32 -6
- package/dist/types/infra/log/ConsoleLogger.d.ts +18 -1
- package/dist/types/infra/log/PinoLogger.d.ts +55 -1
- package/dist/types/infra/log/types.d.ts +6 -0
- package/dist/types/infra/perf/BackgroundQueue.d.ts +19 -0
- package/dist/types/media/constants.d.ts +7 -2
- package/dist/types/media/crypto/WaMediaCrypto.d.ts +59 -0
- package/dist/types/media/index.d.ts +7 -5
- package/dist/types/media/processor.d.ts +27 -5
- package/dist/types/media/sticker/sticker-pack.d.ts +6 -0
- package/dist/types/media/{WaMediaTransferClient.d.ts → transfer/WaMediaTransferClient.d.ts} +30 -1
- package/dist/types/media/transfer/conn.d.ts +7 -0
- package/dist/types/media/types.d.ts +1 -2
- package/dist/types/message/WaMessageClient.d.ts +14 -0
- package/dist/types/message/addons/link-preview/builder.d.ts +13 -0
- package/dist/types/message/addons/link-preview/detect.d.ts +5 -0
- package/dist/types/message/addons/link-preview/fetcher.d.ts +13 -0
- package/dist/types/message/addons/link-preview/types.d.ts +51 -0
- package/dist/types/message/context-info.d.ts +66 -0
- package/dist/types/message/{addon-crypto.d.ts → crypto/addon-crypto.d.ts} +27 -5
- package/dist/types/message/{icdc.d.ts → crypto/icdc.d.ts} +4 -4
- package/dist/types/message/{phash.d.ts → crypto/phash.d.ts} +1 -1
- package/dist/types/message/{reporting-token.d.ts → crypto/reporting-token.d.ts} +2 -2
- package/dist/types/message/{use-case-secret.d.ts → crypto/use-case-secret.d.ts} +17 -1
- package/dist/types/message/encode/content.d.ts +43 -0
- package/dist/types/message/{device-sent.d.ts → encode/device-sent.d.ts} +1 -1
- package/dist/types/message/encode/media-payload.d.ts +12 -0
- package/dist/types/message/index.d.ts +2 -2
- package/dist/types/message/kinds/bot.d.ts +31 -0
- package/dist/types/message/kinds/newsletter.d.ts +12 -0
- package/dist/types/message/kinds/sticker-pack.d.ts +6 -0
- package/dist/types/message/{ack.d.ts → primitives/ack.d.ts} +1 -1
- package/dist/types/message/primitives/incoming.d.ts +21 -0
- package/dist/types/message/primitives/peer-data-operation.d.ts +23 -0
- package/dist/types/message/types.d.ts +208 -10
- package/dist/types/mex.d.ts +2 -0
- package/dist/types/proto.d.ts +2 -2
- package/dist/types/protocol/abprops.d.ts +9 -0
- package/dist/types/protocol/appstate.d.ts +4 -49
- package/dist/types/protocol/auth.d.ts +2 -2
- package/dist/types/protocol/bot.d.ts +45 -0
- package/dist/types/protocol/browser.d.ts +8 -0
- package/dist/types/protocol/business.d.ts +21 -0
- package/dist/types/protocol/call.d.ts +44 -0
- package/dist/types/protocol/constants.d.ts +16 -3
- package/dist/types/protocol/defaults.d.ts +3 -0
- package/dist/types/protocol/group.d.ts +1 -1
- package/dist/types/protocol/index.d.ts +2 -1
- package/dist/types/protocol/jid.d.ts +78 -0
- package/dist/types/protocol/media.d.ts +21 -13
- package/dist/types/protocol/message.d.ts +4 -0
- package/dist/types/protocol/newsletter.d.ts +65 -0
- package/dist/types/protocol/nodes.d.ts +20 -0
- package/dist/types/protocol/notification.d.ts +16 -0
- package/dist/types/protocol/presence.d.ts +16 -0
- package/dist/types/protocol/status.d.ts +7 -0
- package/dist/types/retry/codec.d.ts +5 -0
- package/dist/types/retry/index.d.ts +1 -1
- package/dist/types/retry/parse.d.ts +9 -0
- package/dist/types/retry/reason.d.ts +5 -0
- package/dist/types/retry/replay.d.ts +19 -5
- package/dist/types/retry/tracker.d.ts +10 -3
- package/dist/types/retry/types.d.ts +3 -8
- package/dist/types/signal/api/SignalDeviceSyncApi.d.ts +20 -0
- package/dist/types/signal/api/SignalDigestSyncApi.d.ts +10 -0
- package/dist/types/signal/api/SignalIdentitySyncApi.d.ts +9 -0
- package/dist/types/signal/api/SignalMissingPreKeysSyncApi.d.ts +8 -0
- package/dist/types/signal/api/SignalRotateKeyApi.d.ts +10 -0
- package/dist/types/signal/api/SignalSessionSyncApi.d.ts +13 -0
- package/dist/types/signal/api/codec.d.ts +20 -0
- package/dist/types/signal/api/constants.d.ts +1 -1
- package/dist/types/signal/api/prekeys.d.ts +4 -0
- package/dist/types/signal/{crypto → attestation}/WaAdvSignature.d.ts +2 -2
- package/dist/types/signal/attestation/constants.d.ts +4 -0
- package/dist/types/signal/constants.d.ts +7 -4
- package/dist/types/signal/encoding.d.ts +6 -68
- package/dist/types/signal/group/SenderKeyChain.d.ts +1 -1
- package/dist/types/signal/group/SenderKeyManager.d.ts +17 -0
- package/dist/types/signal/group/encoding.d.ts +25 -0
- package/dist/types/signal/index.d.ts +4 -1
- package/dist/types/signal/registration/encoding.d.ts +30 -0
- package/dist/types/signal/registration/keygen.d.ts +10 -0
- package/dist/types/signal/registration/utils.d.ts +5 -0
- package/dist/types/signal/session/SignalProtocol.d.ts +55 -0
- package/dist/types/signal/session/SignalRatchet.d.ts +2 -3
- package/dist/types/signal/session/SignalSession.d.ts +0 -1
- package/dist/types/signal/session/encoding.d.ts +28 -0
- package/dist/types/signal/session/resolver.d.ts +14 -0
- package/dist/types/store/cache/identity.cache.d.ts +15 -0
- package/dist/types/store/cache/privacy-token.cache.d.ts +15 -0
- package/dist/types/store/cache/sender-key.cache.d.ts +18 -0
- package/dist/types/store/cache/session.cache.d.ts +23 -0
- package/dist/types/store/contracts/contact.store.d.ts +14 -0
- package/dist/types/store/contracts/device-list.store.d.ts +13 -0
- package/dist/types/store/contracts/group-metadata.store.d.ts +14 -0
- package/dist/types/store/contracts/message.store.d.ts +0 -2
- package/dist/types/store/createStore.d.ts +54 -2
- package/dist/types/store/index.d.ts +17 -16
- package/dist/types/store/locks/group-metadata.lock.d.ts +2 -0
- package/dist/types/store/{providers/memory → memory}/appstate.store.d.ts +2 -2
- package/dist/types/store/memory/auth.store.d.ts +18 -0
- package/dist/types/store/{providers/memory → memory}/contact.store.d.ts +6 -1
- package/dist/types/store/{providers/memory → memory}/device-list.store.d.ts +15 -2
- package/dist/types/store/memory/group-metadata.store.d.ts +27 -0
- package/dist/types/store/{providers/memory → memory}/identity.store.d.ts +2 -2
- package/dist/types/store/{providers/memory → memory}/message-secret.store.d.ts +12 -2
- package/dist/types/store/{providers/memory → memory}/message.store.d.ts +1 -1
- package/dist/types/store/{providers/memory → memory}/pre-key.store.d.ts +2 -2
- package/dist/types/store/{providers/memory → memory}/privacy-token.store.d.ts +1 -1
- package/dist/types/store/{providers/memory → memory}/retry.store.d.ts +16 -3
- package/dist/types/store/{providers/memory → memory}/sender-key.store.d.ts +2 -2
- package/dist/types/store/{providers/memory → memory}/session.store.d.ts +2 -2
- package/dist/types/store/{providers/memory → memory}/signal.store.d.ts +2 -2
- package/dist/types/store/{providers/memory → memory}/thread.store.d.ts +1 -1
- package/dist/types/store/noop.store.d.ts +2 -2
- package/dist/types/store/types.d.ts +250 -6
- package/dist/types/transport/WaComms.d.ts +5 -0
- package/dist/types/transport/WaWebSocket.d.ts +5 -0
- package/dist/types/transport/binary/constants.d.ts +8 -2
- package/dist/types/transport/binary/decoder.d.ts +5 -0
- package/dist/types/transport/binary/encoder.d.ts +5 -0
- package/dist/types/transport/binary/tokens.d.ts +6 -6
- package/dist/types/transport/index.d.ts +3 -1
- package/dist/types/transport/keepalive/WaKeepAlive.d.ts +7 -0
- package/dist/types/transport/node/WaMobileTcpSocket.d.ts +6 -0
- package/dist/types/transport/node/WaNodeOrchestrator.d.ts +5 -0
- package/dist/types/transport/node/WaNodeTransport.d.ts +13 -0
- package/dist/types/transport/node/builders/account-sync.d.ts +1 -2
- package/dist/types/transport/node/builders/bot.d.ts +4 -0
- package/dist/types/transport/node/builders/business.d.ts +21 -4
- package/dist/types/transport/node/builders/chatstate.d.ts +11 -0
- package/dist/types/transport/node/builders/community.d.ts +17 -0
- package/dist/types/transport/node/builders/group.d.ts +44 -2
- package/dist/types/transport/node/builders/message.d.ts +11 -6
- package/dist/types/transport/node/builders/newsletter.d.ts +73 -0
- package/dist/types/transport/node/builders/passive.d.ts +3 -0
- package/dist/types/transport/node/builders/presence.d.ts +8 -1
- package/dist/types/transport/node/builders/profile.d.ts +3 -0
- package/dist/types/transport/node/builders/tos.d.ts +12 -0
- package/dist/types/transport/node/builders/usync.d.ts +16 -0
- package/dist/types/transport/node/helpers.d.ts +1 -2
- package/dist/types/transport/node/mex/client.d.ts +12 -1
- package/dist/types/transport/node/query.d.ts +19 -1
- package/dist/types/transport/node/usync.d.ts +3 -0
- package/dist/types/transport/noise/WaMobileClientPayload.d.ts +5 -0
- package/dist/types/transport/noise/WaNoiseCert.d.ts +5 -0
- package/dist/types/transport/noise/WaNoiseHandshake.d.ts +12 -6
- package/dist/types/transport/noise/WaNoiseSession.d.ts +0 -1
- package/dist/types/transport/noise/WaNoiseSocket.d.ts +12 -6
- package/dist/types/transport/noise/constants.d.ts +4 -5
- package/dist/types/transport/proxy.d.ts +5 -0
- package/dist/types/transport/types.d.ts +14 -7
- package/dist/types/transport/wa-web-version-fetcher.d.ts +44 -0
- package/dist/types/util/async.d.ts +4 -0
- package/dist/types/util/bytes.d.ts +36 -1
- package/dist/types/util/clock.d.ts +6 -0
- package/dist/types/util/coercion.d.ts +25 -0
- package/dist/types/util/collections.d.ts +8 -0
- package/dist/types/util/index.d.ts +2 -2
- package/dist/types/util/primitives.d.ts +11 -0
- package/dist/types/util/runtime.d.ts +5 -0
- package/dist/types/version-spec.d.ts +1 -0
- package/dist/util/async.js +4 -0
- package/dist/util/bytes.js +37 -2
- package/dist/util/clock.js +18 -0
- package/dist/util/coercion.js +48 -3
- package/dist/util/collections.js +12 -0
- package/dist/util/index.js +7 -1
- package/dist/util/primitives.js +20 -0
- package/dist/util/runtime.js +5 -0
- package/dist/version-spec.js +5 -0
- package/package.json +32 -8
- package/spec/appstate/index.d.ts +188 -0
- package/spec/appstate/index.js +850 -0
- package/spec/mex/index.d.ts +4172 -0
- package/spec/mex/index.js +261 -0
- package/spec/proto/index.d.ts +16305 -0
- package/spec/proto/index.js +1 -0
- package/spec/version/index.d.ts +4 -0
- package/spec/version/index.js +9 -0
- package/spec/version/version.json +3 -0
- package/dist/client/events/chat.js +0 -227
- package/dist/client/incoming.js +0 -306
- package/dist/client/mailbox.js +0 -66
- package/dist/client/messages.js +0 -305
- package/dist/esm/client/events/chat.js +0 -224
- package/dist/esm/client/incoming.js +0 -296
- package/dist/esm/client/mailbox.js +0 -63
- package/dist/esm/client/messages.js +0 -301
- package/dist/esm/media/WaMediaCrypto.js +0 -499
- package/dist/esm/message/phash.js +0 -47
- package/dist/esm/store/locks/participants.lock.js +0 -20
- package/dist/esm/store/providers/memory/contact.store.js +0 -28
- package/dist/esm/store/providers/memory/device-list.store.js +0 -67
- package/dist/esm/transport/node/mex/persist-ids.js +0 -10
- package/dist/media/WaMediaCrypto.js +0 -503
- package/dist/message/phash.js +0 -50
- package/dist/store/locks/participants.lock.js +0 -23
- package/dist/store/providers/memory/contact.store.js +0 -32
- package/dist/store/providers/memory/device-list.store.js +0 -71
- package/dist/transport/node/mex/persist-ids.js +0 -13
- package/dist/types/appstate/WaAppStateSyncClient.d.ts +0 -70
- package/dist/types/client/events/chat.d.ts +0 -3
- package/dist/types/client/history-sync.d.ts +0 -20
- package/dist/types/client/messages.d.ts +0 -18
- package/dist/types/client/messaging/participants.d.ts +0 -13
- package/dist/types/media/WaMediaCrypto.d.ts +0 -22
- package/dist/types/media/conn.d.ts +0 -3
- package/dist/types/message/content.d.ts +0 -14
- package/dist/types/message/incoming.d.ts +0 -18
- package/dist/types/signal/crypto/constants.d.ts +0 -4
- package/dist/types/store/contracts/participants.store.d.ts +0 -13
- package/dist/types/store/locks/participants.lock.d.ts +0 -2
- package/dist/types/store/providers/memory/participants.store.d.ts +0 -17
- package/dist/types/transport/node/mex/persist-ids.d.ts +0 -14
- package/proto/index.d.ts +0 -10903
- package/proto/index.js +0 -1
- /package/dist/{store/contracts/participants.store.js → client/newsletter/types.js} +0 -0
- /package/dist/esm/{store/contracts/participants.store.js → client/newsletter/types.js} +0 -0
- /package/dist/esm/message/{device-sent.js → encode/device-sent.js} +0 -0
- /package/dist/esm/signal/{crypto → attestation}/constants.js +0 -0
- /package/dist/esm/store/{providers/memory → memory}/signal.store.js +0 -0
- /package/dist/message/{device-sent.js → encode/device-sent.js} +0 -0
- /package/dist/signal/{crypto → attestation}/constants.js +0 -0
- /package/dist/store/{providers/memory → memory}/signal.store.js +0 -0
- /package/dist/types/message/{padding.d.ts → encode/padding.d.ts} +0 -0
|
@@ -6,20 +6,27 @@ const PromiseDedup_1 = require("../../infra/perf/PromiseDedup");
|
|
|
6
6
|
const jid_1 = require("../../protocol/jid");
|
|
7
7
|
const bytes_1 = require("../../util/bytes");
|
|
8
8
|
const primitives_1 = require("../../util/primitives");
|
|
9
|
+
/** Builds a {@link SignalSessionResolver} backed by the given Signal APIs and stores. */
|
|
9
10
|
function createSignalSessionResolver(options) {
|
|
10
11
|
const { signalProtocol, sessionStore, identityStore, signalIdentitySync, signalSessionSync, logger } = options;
|
|
11
12
|
const dedup = new PromiseDedup_1.PromiseDedup();
|
|
12
|
-
const ensureSessionInternal = async (address, jid, expectedIdentity, reasonIdentity = false, prefetchedBundle) => {
|
|
13
|
+
const ensureSessionInternal = async (address, jid, expectedIdentity, reasonIdentity = false, prefetchedBundle, knownAbsent = false) => {
|
|
14
|
+
const jidLogger = logger.child({ jid });
|
|
13
15
|
const expectedSerializedIdentity = expectedIdentity
|
|
14
16
|
? (0, keys_1.toSerializedPubKey)(expectedIdentity)
|
|
15
17
|
: null;
|
|
16
18
|
if (reasonIdentity) {
|
|
17
19
|
await signalIdentitySync.syncIdentityKeys([jid]);
|
|
18
20
|
}
|
|
19
|
-
if (await sessionStore.hasSession(address)) {
|
|
21
|
+
if (!knownAbsent && (await sessionStore.hasSession(address))) {
|
|
20
22
|
if (expectedSerializedIdentity) {
|
|
21
23
|
const storedIdentity = await identityStore.getRemoteIdentity(address);
|
|
22
24
|
if (!storedIdentity || !(0, bytes_1.uint8Equal)(storedIdentity, expectedSerializedIdentity)) {
|
|
25
|
+
jidLogger.warn('signal identity mismatch on stored identity', {
|
|
26
|
+
source: 'stored_vs_expected',
|
|
27
|
+
expected: (0, bytes_1.bytesToHex)(expectedSerializedIdentity),
|
|
28
|
+
stored: storedIdentity ? (0, bytes_1.bytesToHex)(storedIdentity) : null
|
|
29
|
+
});
|
|
23
30
|
throw new Error('identity mismatch');
|
|
24
31
|
}
|
|
25
32
|
}
|
|
@@ -33,7 +40,7 @@ function createSignalSessionResolver(options) {
|
|
|
33
40
|
};
|
|
34
41
|
}
|
|
35
42
|
else {
|
|
36
|
-
|
|
43
|
+
jidLogger.debug('signal session missing, fetching remote key bundle');
|
|
37
44
|
fetched = await signalSessionSync.fetchKeyBundle({
|
|
38
45
|
jid,
|
|
39
46
|
reasonIdentity
|
|
@@ -43,26 +50,40 @@ function createSignalSessionResolver(options) {
|
|
|
43
50
|
if (reasonIdentity) {
|
|
44
51
|
const storedIdentity = await identityStore.getRemoteIdentity(address);
|
|
45
52
|
if (storedIdentity && !(0, bytes_1.uint8Equal)(remoteIdentity, storedIdentity)) {
|
|
53
|
+
jidLogger.warn('signal identity mismatch on fetched bundle vs stored', {
|
|
54
|
+
source: 'remote_vs_stored',
|
|
55
|
+
remote: (0, bytes_1.bytesToHex)(remoteIdentity),
|
|
56
|
+
stored: (0, bytes_1.bytesToHex)(storedIdentity)
|
|
57
|
+
});
|
|
46
58
|
throw new Error('identity mismatch');
|
|
47
59
|
}
|
|
48
60
|
}
|
|
49
61
|
if (expectedSerializedIdentity && !(0, bytes_1.uint8Equal)(remoteIdentity, expectedSerializedIdentity)) {
|
|
62
|
+
jidLogger.warn('signal identity mismatch on fetched bundle vs expected', {
|
|
63
|
+
source: 'remote_vs_expected',
|
|
64
|
+
remote: (0, bytes_1.bytesToHex)(remoteIdentity),
|
|
65
|
+
expected: (0, bytes_1.bytesToHex)(expectedSerializedIdentity)
|
|
66
|
+
});
|
|
50
67
|
throw new Error('identity mismatch');
|
|
51
68
|
}
|
|
52
69
|
const session = await signalProtocol.establishOutgoingSession(address, fetched.bundle, {
|
|
53
|
-
reuseExisting: true
|
|
70
|
+
reuseExisting: true,
|
|
71
|
+
knownAbsent
|
|
54
72
|
});
|
|
55
|
-
|
|
56
|
-
jid,
|
|
73
|
+
jidLogger.debug('signal session synchronized', {
|
|
57
74
|
regId: fetched.bundle.regId,
|
|
58
75
|
hasOneTimeKey: fetched.bundle.oneTimeKey !== undefined
|
|
59
76
|
});
|
|
60
77
|
return session;
|
|
61
78
|
};
|
|
62
|
-
const ensureSessionWithDedup = (address, jid, expectedIdentity, reasonIdentity = false, prefetchedBundle) => {
|
|
79
|
+
const ensureSessionWithDedup = (address, jid, expectedIdentity, reasonIdentity = false, prefetchedBundle, knownAbsent = false) => {
|
|
63
80
|
const expectedIdentityKey = expectedIdentity ? (0, bytes_1.bytesToHex)(expectedIdentity) : 'none';
|
|
64
|
-
|
|
65
|
-
|
|
81
|
+
// knownAbsent is part of the dedup key: single-caller (false) and
|
|
82
|
+
// batch (true) must NOT share a Promise, or the unsafe variant
|
|
83
|
+
// could leak to the safe caller. Per-address lock + the recheck
|
|
84
|
+
// inside persistOutgoingSessionsBatch resolves any race.
|
|
85
|
+
const dedupKey = `signalSession:${(0, jid_1.signalAddressKey)(address)}:${reasonIdentity ? '1' : '0'}:${expectedIdentityKey}:${knownAbsent ? '1' : '0'}`;
|
|
86
|
+
return dedup.run(dedupKey, () => ensureSessionInternal(address, jid, expectedIdentity, reasonIdentity, prefetchedBundle, knownAbsent));
|
|
66
87
|
};
|
|
67
88
|
const ensureSession = (address, jid, expectedIdentity, reasonIdentity = false) => ensureSessionWithDedup(address, jid, expectedIdentity, reasonIdentity).then(() => { });
|
|
68
89
|
const ensureSessionsBatch = async (targetJids, expectedIdentityByJid) => {
|
|
@@ -123,7 +144,14 @@ function createSignalSessionResolver(options) {
|
|
|
123
144
|
const session = resolvedByIndex[index];
|
|
124
145
|
const expectedIdentity = normalizedExpectedIdentityByJid?.get(normalizedTargetJids[index]);
|
|
125
146
|
if (session && expectedIdentity) {
|
|
126
|
-
|
|
147
|
+
const expectedSerialized = (0, keys_1.toSerializedPubKey)(expectedIdentity);
|
|
148
|
+
if (!(0, bytes_1.uint8Equal)(session.remote.pubKey, expectedSerialized)) {
|
|
149
|
+
logger.warn('signal identity mismatch on existing session vs expected', {
|
|
150
|
+
jid: normalizedTargetJids[index],
|
|
151
|
+
source: 'session_vs_expected',
|
|
152
|
+
session: (0, bytes_1.bytesToHex)(session.remote.pubKey),
|
|
153
|
+
expected: (0, bytes_1.bytesToHex)(expectedSerialized)
|
|
154
|
+
});
|
|
127
155
|
throw new Error('identity mismatch');
|
|
128
156
|
}
|
|
129
157
|
}
|
|
@@ -149,51 +177,132 @@ function createSignalSessionResolver(options) {
|
|
|
149
177
|
});
|
|
150
178
|
return collectResolvedTargets();
|
|
151
179
|
}
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
180
|
+
// Prepare under per-address locks (no persist). Bulk persist below
|
|
181
|
+
// holds every per-address lock at once via persistOutgoingSessionsBatch.
|
|
182
|
+
const prepareTargetIndices = new Array(missingIndices.length);
|
|
183
|
+
const preparePromises = new Array(missingIndices.length);
|
|
184
|
+
let prepareCount = 0;
|
|
185
|
+
const missingBundleTargets = [];
|
|
155
186
|
for (let index = 0; index < missingIndices.length; index += 1) {
|
|
156
187
|
const targetIndex = missingIndices[index];
|
|
157
188
|
const targetJid = normalizedTargetJids[targetIndex];
|
|
158
189
|
const batchResult = batchResults[index];
|
|
159
190
|
if (!batchResult?.bundle) {
|
|
160
|
-
|
|
191
|
+
missingBundleTargets.push({
|
|
161
192
|
jid: targetJid,
|
|
162
|
-
|
|
193
|
+
reason: batchResult?.errorText ?? 'missing key bundle user in response'
|
|
163
194
|
});
|
|
164
195
|
continue;
|
|
165
196
|
}
|
|
166
197
|
const expectedIdentity = normalizedExpectedIdentityByJid?.get(targetJid);
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
198
|
+
const expectedSerializedIdentity = expectedIdentity
|
|
199
|
+
? (0, keys_1.toSerializedPubKey)(expectedIdentity)
|
|
200
|
+
: null;
|
|
201
|
+
const bundleIdentity = (0, keys_1.toSerializedPubKey)(batchResult.bundle.identity);
|
|
202
|
+
if (expectedSerializedIdentity &&
|
|
203
|
+
!(0, bytes_1.uint8Equal)(bundleIdentity, expectedSerializedIdentity)) {
|
|
204
|
+
logger.warn('signal identity mismatch on fetched batch bundle vs expected', {
|
|
205
|
+
jid: targetJid,
|
|
206
|
+
source: 'bundle_vs_expected',
|
|
207
|
+
bundle: (0, bytes_1.bytesToHex)(bundleIdentity),
|
|
208
|
+
expected: (0, bytes_1.bytesToHex)(expectedSerializedIdentity)
|
|
209
|
+
});
|
|
210
|
+
throw new Error('identity mismatch');
|
|
211
|
+
}
|
|
212
|
+
const targetAddress = normalizedTargetAddresses[targetIndex];
|
|
213
|
+
const bundle = batchResult.bundle;
|
|
214
|
+
prepareTargetIndices[prepareCount] = targetIndex;
|
|
215
|
+
preparePromises[prepareCount] = signalProtocol
|
|
216
|
+
.prepareOutgoingSession(targetAddress, bundle, {
|
|
217
|
+
reuseExisting: true,
|
|
218
|
+
knownAbsent: true
|
|
219
|
+
})
|
|
220
|
+
.then((prep) => ({
|
|
221
|
+
session: prep.session,
|
|
222
|
+
remoteIdentity: prep.remoteIdentity
|
|
223
|
+
}));
|
|
224
|
+
prepareCount += 1;
|
|
225
|
+
}
|
|
226
|
+
if (missingBundleTargets.length > 0) {
|
|
227
|
+
logger.warn('signal batch key fetch returned targets without bundle', {
|
|
228
|
+
droppedCount: missingBundleTargets.length,
|
|
229
|
+
totalRequested: missingIndices.length,
|
|
230
|
+
sample: missingBundleTargets.slice(0, 3)
|
|
231
|
+
});
|
|
170
232
|
}
|
|
171
|
-
if (
|
|
233
|
+
if (prepareCount === 0) {
|
|
172
234
|
return collectResolvedTargets();
|
|
173
235
|
}
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
const
|
|
236
|
+
prepareTargetIndices.length = prepareCount;
|
|
237
|
+
preparePromises.length = prepareCount;
|
|
238
|
+
const prepareResults = await Promise.allSettled(preparePromises);
|
|
239
|
+
const batchEntries = [];
|
|
240
|
+
const entryToTargetIndex = [];
|
|
177
241
|
const fallbackIndices = [];
|
|
178
|
-
for (let
|
|
179
|
-
const targetIndex =
|
|
180
|
-
const
|
|
181
|
-
if (
|
|
182
|
-
const normalized = (0, primitives_1.toError)(
|
|
242
|
+
for (let i = 0; i < prepareTargetIndices.length; i += 1) {
|
|
243
|
+
const targetIndex = prepareTargetIndices[i];
|
|
244
|
+
const result = prepareResults[i];
|
|
245
|
+
if (result.status === 'rejected') {
|
|
246
|
+
const normalized = (0, primitives_1.toError)(result.reason);
|
|
183
247
|
if (normalized.message === 'identity mismatch') {
|
|
184
248
|
throw normalized;
|
|
185
249
|
}
|
|
186
|
-
logger.warn('signal session
|
|
250
|
+
logger.warn('signal session prepare failed during batch resolution', {
|
|
187
251
|
jid: normalizedTargetJids[targetIndex],
|
|
188
252
|
message: normalized.message
|
|
189
253
|
});
|
|
190
254
|
continue;
|
|
191
255
|
}
|
|
192
|
-
|
|
256
|
+
batchEntries.push({
|
|
257
|
+
address: normalizedTargetAddresses[targetIndex],
|
|
258
|
+
session: result.value.session,
|
|
259
|
+
remoteIdentity: result.value.remoteIdentity
|
|
260
|
+
});
|
|
261
|
+
entryToTargetIndex.push(targetIndex);
|
|
262
|
+
}
|
|
263
|
+
if (batchEntries.length === 0) {
|
|
264
|
+
return collectResolvedTargets();
|
|
265
|
+
}
|
|
266
|
+
let persistResult;
|
|
267
|
+
try {
|
|
268
|
+
persistResult = await signalProtocol.persistOutgoingSessionsBatch(batchEntries);
|
|
269
|
+
}
|
|
270
|
+
catch (error) {
|
|
271
|
+
const normalized = (0, primitives_1.toError)(error);
|
|
272
|
+
logger.warn('signal batched session persist failed', {
|
|
273
|
+
requested: batchEntries.length,
|
|
274
|
+
message: normalized.message
|
|
275
|
+
});
|
|
276
|
+
for (let i = 0; i < entryToTargetIndex.length; i += 1) {
|
|
277
|
+
fallbackIndices.push(entryToTargetIndex[i]);
|
|
278
|
+
}
|
|
279
|
+
persistResult = { resolved: [], skipped: [] };
|
|
280
|
+
}
|
|
281
|
+
const sessionByAddressKey = new Map();
|
|
282
|
+
for (const r of persistResult.resolved) {
|
|
283
|
+
sessionByAddressKey.set((0, jid_1.signalAddressKey)(r.address), r.session);
|
|
284
|
+
}
|
|
285
|
+
const skippedByAddressKey = new Set();
|
|
286
|
+
for (const s of persistResult.skipped) {
|
|
287
|
+
skippedByAddressKey.add((0, jid_1.signalAddressKey)(s.address));
|
|
288
|
+
logger.warn('signal session persist skipped due to identity conflict', {
|
|
289
|
+
user: s.address.user,
|
|
290
|
+
server: s.address.server,
|
|
291
|
+
device: s.address.device
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
for (let i = 0; i < entryToTargetIndex.length; i += 1) {
|
|
295
|
+
const targetIndex = entryToTargetIndex[i];
|
|
296
|
+
const addrKey = (0, jid_1.signalAddressKey)(normalizedTargetAddresses[targetIndex]);
|
|
297
|
+
const session = sessionByAddressKey.get(addrKey);
|
|
193
298
|
if (session) {
|
|
194
299
|
resolvedByIndex[targetIndex] = session;
|
|
300
|
+
continue;
|
|
301
|
+
}
|
|
302
|
+
if (skippedByAddressKey.has(addrKey)) {
|
|
303
|
+
continue;
|
|
195
304
|
}
|
|
196
|
-
|
|
305
|
+
if (!fallbackIndices.includes(targetIndex)) {
|
|
197
306
|
fallbackIndices.push(targetIndex);
|
|
198
307
|
}
|
|
199
308
|
}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.withIdentityCache = withIdentityCache;
|
|
4
|
+
const identity_store_1 = require("../memory/identity.store");
|
|
5
|
+
/**
|
|
6
|
+
* Read-through / write-through in-process cache for a persistent remote
|
|
7
|
+
* identity backend. Reuses {@link WaIdentityMemoryStore} as the bounded-LRU
|
|
8
|
+
* L1. Remote identities are read alongside sessions on the send path (the
|
|
9
|
+
* identity-mismatch guard), so caching them complements
|
|
10
|
+
* {@link withSessionCache}.
|
|
11
|
+
*
|
|
12
|
+
* The identity store has no per-key delete: identities are overwritten on
|
|
13
|
+
* re-establishment, so a peer's key change propagates through the
|
|
14
|
+
* write-through `setRemoteIdentity`. See {@link withSessionCache} for the
|
|
15
|
+
* shared coherence model and the single-writer-per-session assumption.
|
|
16
|
+
*/
|
|
17
|
+
function withIdentityCache(backend, maxEntries) {
|
|
18
|
+
const l1 = new identity_store_1.WaIdentityMemoryStore({ maxRemoteIdentities: maxEntries });
|
|
19
|
+
let generation = 0;
|
|
20
|
+
return {
|
|
21
|
+
getRemoteIdentity: async (address) => {
|
|
22
|
+
const cached = await l1.getRemoteIdentity(address);
|
|
23
|
+
if (cached !== null)
|
|
24
|
+
return cached;
|
|
25
|
+
const gen = generation;
|
|
26
|
+
const fetched = await backend.getRemoteIdentity(address);
|
|
27
|
+
if (fetched !== null &&
|
|
28
|
+
gen === generation &&
|
|
29
|
+
(await l1.getRemoteIdentity(address)) === null) {
|
|
30
|
+
await l1.setRemoteIdentity(address, fetched);
|
|
31
|
+
}
|
|
32
|
+
return fetched;
|
|
33
|
+
},
|
|
34
|
+
getRemoteIdentities: async (addresses) => {
|
|
35
|
+
const cached = await l1.getRemoteIdentities(addresses);
|
|
36
|
+
const missing = [];
|
|
37
|
+
for (let i = 0; i < addresses.length; i += 1) {
|
|
38
|
+
if (cached[i] === null)
|
|
39
|
+
missing.push(i);
|
|
40
|
+
}
|
|
41
|
+
if (missing.length === 0)
|
|
42
|
+
return cached;
|
|
43
|
+
const gen = generation;
|
|
44
|
+
const fetched = await backend.getRemoteIdentities(missing.map((i) => addresses[i]));
|
|
45
|
+
const coherent = gen === generation;
|
|
46
|
+
const result = cached.slice();
|
|
47
|
+
for (let j = 0; j < missing.length; j += 1) {
|
|
48
|
+
const key = fetched[j];
|
|
49
|
+
result[missing[j]] = key;
|
|
50
|
+
if (key !== null &&
|
|
51
|
+
coherent &&
|
|
52
|
+
(await l1.getRemoteIdentity(addresses[missing[j]])) === null) {
|
|
53
|
+
await l1.setRemoteIdentity(addresses[missing[j]], key);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return result;
|
|
57
|
+
},
|
|
58
|
+
setRemoteIdentity: async (address, identityKey) => {
|
|
59
|
+
generation += 1;
|
|
60
|
+
await backend.setRemoteIdentity(address, identityKey);
|
|
61
|
+
await l1.setRemoteIdentity(address, identityKey);
|
|
62
|
+
},
|
|
63
|
+
setRemoteIdentities: async (entries) => {
|
|
64
|
+
generation += 1;
|
|
65
|
+
await backend.setRemoteIdentities(entries);
|
|
66
|
+
await l1.setRemoteIdentities(entries);
|
|
67
|
+
},
|
|
68
|
+
clear: async () => {
|
|
69
|
+
generation += 1;
|
|
70
|
+
await backend.clear();
|
|
71
|
+
await l1.clear();
|
|
72
|
+
},
|
|
73
|
+
destroy: async () => {
|
|
74
|
+
await l1.clear();
|
|
75
|
+
await backend.destroy?.();
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.withPrivacyTokenCache = withPrivacyTokenCache;
|
|
4
|
+
const privacy_token_store_1 = require("../memory/privacy-token.store");
|
|
5
|
+
/**
|
|
6
|
+
* Read-through cache for a persistent privacy-token backend. Reuses
|
|
7
|
+
* {@link WaPrivacyTokenMemoryStore} as the bounded-LRU L1.
|
|
8
|
+
*
|
|
9
|
+
* Unlike the signal caches this is **invalidate-on-write, not
|
|
10
|
+
* write-through**: `upsert` merges partial fields into the existing row on
|
|
11
|
+
* the backend, so caching the partial incoming record would diverge from the
|
|
12
|
+
* backend's merged result. Instead each upsert drops the L1 entry and the
|
|
13
|
+
* next read re-populates from the merged backend truth. See
|
|
14
|
+
* {@link withSessionCache} for the shared coherence model and the
|
|
15
|
+
* single-writer-per-session assumption.
|
|
16
|
+
*/
|
|
17
|
+
function withPrivacyTokenCache(backend, maxEntries) {
|
|
18
|
+
const l1 = new privacy_token_store_1.WaPrivacyTokenMemoryStore(maxEntries);
|
|
19
|
+
let generation = 0;
|
|
20
|
+
return {
|
|
21
|
+
upsert: async (record) => {
|
|
22
|
+
generation += 1;
|
|
23
|
+
await backend.upsert(record);
|
|
24
|
+
await l1.deleteByJid(record.jid);
|
|
25
|
+
},
|
|
26
|
+
upsertBatch: async (records) => {
|
|
27
|
+
generation += 1;
|
|
28
|
+
await backend.upsertBatch(records);
|
|
29
|
+
for (let i = 0; i < records.length; i += 1) {
|
|
30
|
+
await l1.deleteByJid(records[i].jid);
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
getByJid: async (jid) => {
|
|
34
|
+
const cached = await l1.getByJid(jid);
|
|
35
|
+
if (cached !== null)
|
|
36
|
+
return cached;
|
|
37
|
+
const gen = generation;
|
|
38
|
+
const fetched = await backend.getByJid(jid);
|
|
39
|
+
if (fetched !== null && gen === generation && (await l1.getByJid(jid)) === null) {
|
|
40
|
+
await l1.upsert(fetched);
|
|
41
|
+
}
|
|
42
|
+
return fetched;
|
|
43
|
+
},
|
|
44
|
+
deleteByJid: async (jid) => {
|
|
45
|
+
generation += 1;
|
|
46
|
+
const deleted = await backend.deleteByJid(jid);
|
|
47
|
+
await l1.deleteByJid(jid);
|
|
48
|
+
return deleted;
|
|
49
|
+
},
|
|
50
|
+
clear: async () => {
|
|
51
|
+
generation += 1;
|
|
52
|
+
await backend.clear();
|
|
53
|
+
await l1.clear();
|
|
54
|
+
},
|
|
55
|
+
destroy: async () => {
|
|
56
|
+
await l1.clear();
|
|
57
|
+
await backend.destroy?.();
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.withSenderKeyCache = withSenderKeyCache;
|
|
4
|
+
const sender_key_store_1 = require("../memory/sender-key.store");
|
|
5
|
+
/**
|
|
6
|
+
* Read-through / write-through in-process cache for a persistent sender-key
|
|
7
|
+
* backend. Reuses {@link SenderKeyMemoryStore} as the bounded-LRU L1 so the
|
|
8
|
+
* per-(group, sender) lookups repeated across a group fan-out skip the
|
|
9
|
+
* backend round-trip.
|
|
10
|
+
*
|
|
11
|
+
* Only the point reads are cached. `getGroupSenderKeyList` returns the
|
|
12
|
+
* *complete* set for a group, which a partial point cache would under-report,
|
|
13
|
+
* so it goes straight to the backend. Upserts replace the whole record (no
|
|
14
|
+
* merge), so they are write-through; the sweep deletes
|
|
15
|
+
* (`deleteDeviceSenderKey`/`markForgetSenderKey`) run on the backend for the
|
|
16
|
+
* authoritative count and then invalidate the matching L1 entries via the
|
|
17
|
+
* memory store's own sweep. See {@link withSessionCache} for the shared
|
|
18
|
+
* coherence model and the single-writer-per-session assumption.
|
|
19
|
+
*/
|
|
20
|
+
function withSenderKeyCache(backend, maxEntries) {
|
|
21
|
+
const l1 = new sender_key_store_1.SenderKeyMemoryStore({
|
|
22
|
+
maxSenderKeys: maxEntries,
|
|
23
|
+
maxSenderDistributions: maxEntries
|
|
24
|
+
});
|
|
25
|
+
let generation = 0;
|
|
26
|
+
return {
|
|
27
|
+
upsertSenderKey: async (record) => {
|
|
28
|
+
generation += 1;
|
|
29
|
+
await backend.upsertSenderKey(record);
|
|
30
|
+
await l1.upsertSenderKey(record);
|
|
31
|
+
},
|
|
32
|
+
upsertSenderKeyDistribution: async (record) => {
|
|
33
|
+
generation += 1;
|
|
34
|
+
await backend.upsertSenderKeyDistribution(record);
|
|
35
|
+
await l1.upsertSenderKeyDistribution(record);
|
|
36
|
+
},
|
|
37
|
+
upsertSenderKeyDistributions: async (records) => {
|
|
38
|
+
generation += 1;
|
|
39
|
+
await backend.upsertSenderKeyDistributions(records);
|
|
40
|
+
await l1.upsertSenderKeyDistributions(records);
|
|
41
|
+
},
|
|
42
|
+
getGroupSenderKeyList: (groupId) => backend.getGroupSenderKeyList(groupId),
|
|
43
|
+
getDeviceSenderKey: async (groupId, sender) => {
|
|
44
|
+
const cached = await l1.getDeviceSenderKey(groupId, sender);
|
|
45
|
+
if (cached !== null)
|
|
46
|
+
return cached;
|
|
47
|
+
const gen = generation;
|
|
48
|
+
const fetched = await backend.getDeviceSenderKey(groupId, sender);
|
|
49
|
+
if (fetched !== null &&
|
|
50
|
+
gen === generation &&
|
|
51
|
+
(await l1.getDeviceSenderKey(groupId, sender)) === null) {
|
|
52
|
+
await l1.upsertSenderKey(fetched);
|
|
53
|
+
}
|
|
54
|
+
return fetched;
|
|
55
|
+
},
|
|
56
|
+
getDeviceSenderKeyDistributions: async (groupId, senders) => {
|
|
57
|
+
const cached = await l1.getDeviceSenderKeyDistributions(groupId, senders);
|
|
58
|
+
const missing = [];
|
|
59
|
+
for (let i = 0; i < senders.length; i += 1) {
|
|
60
|
+
if (cached[i] === null)
|
|
61
|
+
missing.push(i);
|
|
62
|
+
}
|
|
63
|
+
if (missing.length === 0)
|
|
64
|
+
return cached;
|
|
65
|
+
const gen = generation;
|
|
66
|
+
const fetched = await backend.getDeviceSenderKeyDistributions(groupId, missing.map((i) => senders[i]));
|
|
67
|
+
const coherent = gen === generation;
|
|
68
|
+
const result = cached.slice();
|
|
69
|
+
for (let j = 0; j < missing.length; j += 1) {
|
|
70
|
+
const record = fetched[j];
|
|
71
|
+
result[missing[j]] = record;
|
|
72
|
+
if (record !== null && coherent) {
|
|
73
|
+
const [current] = await l1.getDeviceSenderKeyDistributions(groupId, [
|
|
74
|
+
senders[missing[j]]
|
|
75
|
+
]);
|
|
76
|
+
if (current === null)
|
|
77
|
+
await l1.upsertSenderKeyDistribution(record);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return result;
|
|
81
|
+
},
|
|
82
|
+
deleteDeviceSenderKey: async (target, groupId) => {
|
|
83
|
+
generation += 1;
|
|
84
|
+
const deleted = await backend.deleteDeviceSenderKey(target, groupId);
|
|
85
|
+
await l1.deleteDeviceSenderKey(target, groupId);
|
|
86
|
+
return deleted;
|
|
87
|
+
},
|
|
88
|
+
markForgetSenderKey: async (groupId, participants) => {
|
|
89
|
+
generation += 1;
|
|
90
|
+
const deleted = await backend.markForgetSenderKey(groupId, participants);
|
|
91
|
+
await l1.markForgetSenderKey(groupId, participants);
|
|
92
|
+
return deleted;
|
|
93
|
+
},
|
|
94
|
+
clear: async () => {
|
|
95
|
+
generation += 1;
|
|
96
|
+
await backend.clear();
|
|
97
|
+
await l1.clear();
|
|
98
|
+
},
|
|
99
|
+
destroy: async () => {
|
|
100
|
+
await l1.clear();
|
|
101
|
+
await backend.destroy?.();
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.withSessionCache = withSessionCache;
|
|
4
|
+
const session_store_1 = require("../memory/session.store");
|
|
5
|
+
/**
|
|
6
|
+
* Read-through / write-through in-process cache for a persistent session
|
|
7
|
+
* backend. Reuses {@link WaSessionMemoryStore} as the bounded-LRU L1 so that
|
|
8
|
+
* repeated reads of the same peer on the send/recv path skip the backend
|
|
9
|
+
* round-trip.
|
|
10
|
+
*
|
|
11
|
+
* Coherence model (single process):
|
|
12
|
+
* - every mutation (set/delete/clear) writes the backend then the L1 in
|
|
13
|
+
* lock-step and bumps a generation counter;
|
|
14
|
+
* - a read only populates the L1 when no mutation interleaved its backend
|
|
15
|
+
* fetch (generation unchanged) and the slot is still empty, so an in-flight
|
|
16
|
+
* read can never resurrect a concurrently deleted entry nor overwrite a
|
|
17
|
+
* fresher concurrent write;
|
|
18
|
+
* - there is no negative caching: a miss always re-hits the backend.
|
|
19
|
+
*
|
|
20
|
+
* This cache assumes a single writer per `sessionId` (the library's
|
|
21
|
+
* connection model). Do not share one backend across processes for the same
|
|
22
|
+
* session with the cache enabled - there is no cross-process invalidation
|
|
23
|
+
* channel, so another process's writes would leave this L1 stale.
|
|
24
|
+
*/
|
|
25
|
+
function withSessionCache(backend, maxEntries) {
|
|
26
|
+
const l1 = new session_store_1.WaSessionMemoryStore({ maxSessions: maxEntries });
|
|
27
|
+
let generation = 0;
|
|
28
|
+
return {
|
|
29
|
+
hasSession: async (address) => {
|
|
30
|
+
if (await l1.hasSession(address))
|
|
31
|
+
return true;
|
|
32
|
+
return backend.hasSession(address);
|
|
33
|
+
},
|
|
34
|
+
hasSessions: (addresses) => backend.hasSessions(addresses),
|
|
35
|
+
getSession: async (address) => {
|
|
36
|
+
const cached = await l1.getSession(address);
|
|
37
|
+
if (cached !== null)
|
|
38
|
+
return cached;
|
|
39
|
+
const gen = generation;
|
|
40
|
+
const fetched = await backend.getSession(address);
|
|
41
|
+
if (fetched !== null && gen === generation && (await l1.getSession(address)) === null) {
|
|
42
|
+
await l1.setSession(address, fetched);
|
|
43
|
+
}
|
|
44
|
+
return fetched;
|
|
45
|
+
},
|
|
46
|
+
getSessionsBatch: async (addresses) => {
|
|
47
|
+
const cached = await l1.getSessionsBatch(addresses);
|
|
48
|
+
const missing = [];
|
|
49
|
+
for (let i = 0; i < addresses.length; i += 1) {
|
|
50
|
+
if (cached[i] === null)
|
|
51
|
+
missing.push(i);
|
|
52
|
+
}
|
|
53
|
+
if (missing.length === 0)
|
|
54
|
+
return cached;
|
|
55
|
+
const gen = generation;
|
|
56
|
+
const fetched = await backend.getSessionsBatch(missing.map((i) => addresses[i]));
|
|
57
|
+
const coherent = gen === generation;
|
|
58
|
+
const result = cached.slice();
|
|
59
|
+
for (let j = 0; j < missing.length; j += 1) {
|
|
60
|
+
const record = fetched[j];
|
|
61
|
+
result[missing[j]] = record;
|
|
62
|
+
if (record !== null &&
|
|
63
|
+
coherent &&
|
|
64
|
+
(await l1.getSession(addresses[missing[j]])) === null) {
|
|
65
|
+
await l1.setSession(addresses[missing[j]], record);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return result;
|
|
69
|
+
},
|
|
70
|
+
setSession: async (address, session) => {
|
|
71
|
+
generation += 1;
|
|
72
|
+
await backend.setSession(address, session);
|
|
73
|
+
await l1.setSession(address, session);
|
|
74
|
+
},
|
|
75
|
+
setSessionsBatch: async (entries) => {
|
|
76
|
+
generation += 1;
|
|
77
|
+
await backend.setSessionsBatch(entries);
|
|
78
|
+
await l1.setSessionsBatch(entries);
|
|
79
|
+
},
|
|
80
|
+
deleteSession: async (address) => {
|
|
81
|
+
generation += 1;
|
|
82
|
+
await backend.deleteSession(address);
|
|
83
|
+
await l1.deleteSession(address);
|
|
84
|
+
},
|
|
85
|
+
clear: async () => {
|
|
86
|
+
generation += 1;
|
|
87
|
+
await backend.clear();
|
|
88
|
+
await l1.clear();
|
|
89
|
+
},
|
|
90
|
+
destroy: async () => {
|
|
91
|
+
await l1.clear();
|
|
92
|
+
await backend.destroy?.();
|
|
93
|
+
}
|
|
94
|
+
};
|
|
95
|
+
}
|