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
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parsePictureNotificationEvents = parsePictureNotificationEvents;
|
|
4
|
+
const helpers_1 = require("../../transport/node/helpers");
|
|
5
|
+
const primitives_1 = require("../../util/primitives");
|
|
6
|
+
const PICTURE_ACTION_TAGS = [
|
|
7
|
+
'set',
|
|
8
|
+
'delete',
|
|
9
|
+
'request',
|
|
10
|
+
'set_avatar'
|
|
11
|
+
];
|
|
12
|
+
function parsePictureNotificationEvents(node) {
|
|
13
|
+
for (const action of PICTURE_ACTION_TAGS) {
|
|
14
|
+
const actionNode = (0, helpers_1.findNodeChild)(node, action);
|
|
15
|
+
if (!actionNode)
|
|
16
|
+
continue;
|
|
17
|
+
const event = {
|
|
18
|
+
rawNode: node,
|
|
19
|
+
stanzaId: node.attrs.id,
|
|
20
|
+
chatJid: node.attrs.from,
|
|
21
|
+
stanzaType: node.attrs.type,
|
|
22
|
+
offline: node.attrs.offline !== undefined,
|
|
23
|
+
action,
|
|
24
|
+
targetJid: actionNode.attrs.jid,
|
|
25
|
+
authorJid: actionNode.attrs.author,
|
|
26
|
+
timestampSeconds: (0, primitives_1.parseOptionalInt)(node.attrs.t),
|
|
27
|
+
pictureId: action === 'set' ? (0, primitives_1.parseOptionalInt)(actionNode.attrs.id) : undefined,
|
|
28
|
+
contactHash: actionNode.attrs.hash
|
|
29
|
+
};
|
|
30
|
+
return { events: [event], unhandled: [] };
|
|
31
|
+
}
|
|
32
|
+
return { events: [], unhandled: [] };
|
|
33
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parsePresenceNode = parsePresenceNode;
|
|
4
|
+
const jid_1 = require("../../protocol/jid");
|
|
5
|
+
const presence_1 = require("../../protocol/presence");
|
|
6
|
+
const primitives_1 = require("../../util/primitives");
|
|
7
|
+
function parseLastSeen(value) {
|
|
8
|
+
if (value === presence_1.WA_PRESENCE_LAST_SENTINELS.DENY) {
|
|
9
|
+
return { kind: 'privacy_denied' };
|
|
10
|
+
}
|
|
11
|
+
if (value === presence_1.WA_PRESENCE_LAST_SENTINELS.NONE) {
|
|
12
|
+
return { kind: 'never_online' };
|
|
13
|
+
}
|
|
14
|
+
if (value === presence_1.WA_PRESENCE_LAST_SENTINELS.ERROR) {
|
|
15
|
+
return { kind: 'unknown' };
|
|
16
|
+
}
|
|
17
|
+
const unixSeconds = (0, primitives_1.parseOptionalInt)(value);
|
|
18
|
+
if (unixSeconds === undefined) {
|
|
19
|
+
return { kind: 'unknown' };
|
|
20
|
+
}
|
|
21
|
+
return { kind: 'timestamp', unixSeconds };
|
|
22
|
+
}
|
|
23
|
+
function parsePresenceNode(node) {
|
|
24
|
+
const from = node.attrs.from;
|
|
25
|
+
const isGroup = from !== undefined && (0, jid_1.isGroupJid)(from);
|
|
26
|
+
const type = node.attrs.type === presence_1.WA_PRESENCE_TYPES.UNAVAILABLE
|
|
27
|
+
? presence_1.WA_PRESENCE_TYPES.UNAVAILABLE
|
|
28
|
+
: presence_1.WA_PRESENCE_TYPES.AVAILABLE;
|
|
29
|
+
const result = { type };
|
|
30
|
+
if (isGroup) {
|
|
31
|
+
const count = (0, primitives_1.parseOptionalInt)(node.attrs.count);
|
|
32
|
+
if (count !== undefined) {
|
|
33
|
+
result.groupOnlineCount = count;
|
|
34
|
+
}
|
|
35
|
+
else if (type === presence_1.WA_PRESENCE_TYPES.UNAVAILABLE) {
|
|
36
|
+
result.groupOnlineCount = 0;
|
|
37
|
+
}
|
|
38
|
+
return result;
|
|
39
|
+
}
|
|
40
|
+
if (type === presence_1.WA_PRESENCE_TYPES.UNAVAILABLE && node.attrs.last !== undefined) {
|
|
41
|
+
result.lastSeen = parseLastSeen(node.attrs.last);
|
|
42
|
+
}
|
|
43
|
+
return result;
|
|
44
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.aggregateReceiptTargets = aggregateReceiptTargets;
|
|
4
|
+
const jid_1 = require("../../protocol/jid");
|
|
5
|
+
function needsParticipant(target) {
|
|
6
|
+
if (target.isGroupChat !== undefined || target.isBroadcastChat !== undefined) {
|
|
7
|
+
return target.isGroupChat === true || target.isBroadcastChat === true;
|
|
8
|
+
}
|
|
9
|
+
return (0, jid_1.isGroupOrBroadcastJid)(target.chatJid);
|
|
10
|
+
}
|
|
11
|
+
function aggregateReceiptTargets(targets) {
|
|
12
|
+
const groups = new Map();
|
|
13
|
+
for (const target of targets) {
|
|
14
|
+
const participant = needsParticipant(target) && target.senderJid && target.senderJid !== target.chatJid
|
|
15
|
+
? target.senderJid
|
|
16
|
+
: undefined;
|
|
17
|
+
const key = `${target.chatJid}|${participant ?? ''}`;
|
|
18
|
+
let group = groups.get(key);
|
|
19
|
+
if (!group) {
|
|
20
|
+
group = { jid: target.chatJid, participant, ids: [] };
|
|
21
|
+
groups.set(key, group);
|
|
22
|
+
}
|
|
23
|
+
group.ids.push(target.id);
|
|
24
|
+
}
|
|
25
|
+
return [...groups.values()];
|
|
26
|
+
}
|
package/dist/client/media.js
CHANGED
|
@@ -4,14 +4,24 @@ exports.readFileHead = readFileHead;
|
|
|
4
4
|
exports.parseWebpAnimation = parseWebpAnimation;
|
|
5
5
|
exports.isReadableStream = isReadableStream;
|
|
6
6
|
exports.cleanupTempFile = cleanupTempFile;
|
|
7
|
+
exports.selectMediaUploadHost = selectMediaUploadHost;
|
|
8
|
+
exports.buildMediaUploadUrl = buildMediaUploadUrl;
|
|
9
|
+
exports.assertMediaUploadStatus = assertMediaUploadStatus;
|
|
10
|
+
exports.parseMediaUploadJsonBody = parseMediaUploadJsonBody;
|
|
11
|
+
exports.performPlaintextMediaUpload = performPlaintextMediaUpload;
|
|
7
12
|
exports.resolveMediaInputs = resolveMediaInputs;
|
|
13
|
+
exports.shouldNormalizeVoiceNote = shouldNormalizeVoiceNote;
|
|
8
14
|
exports.hasMediaProcessingTasks = hasMediaProcessingTasks;
|
|
15
|
+
exports.getScopedMediaLogger = getScopedMediaLogger;
|
|
9
16
|
exports.runMediaProcessor = runMediaProcessor;
|
|
17
|
+
const node_crypto_1 = require("node:crypto");
|
|
10
18
|
const node_fs_1 = require("node:fs");
|
|
11
19
|
const promises_1 = require("node:fs/promises");
|
|
12
20
|
const node_os_1 = require("node:os");
|
|
13
21
|
const node_path_1 = require("node:path");
|
|
22
|
+
const node_stream_1 = require("node:stream");
|
|
14
23
|
const promises_2 = require("node:stream/promises");
|
|
24
|
+
const core_1 = require("../crypto/core");
|
|
15
25
|
const bytes_1 = require("../util/bytes");
|
|
16
26
|
const primitives_1 = require("../util/primitives");
|
|
17
27
|
async function readFileHead(filePath, bytes) {
|
|
@@ -90,8 +100,135 @@ async function streamToTempFile(source) {
|
|
|
90
100
|
async function cleanupTempFile(filePath) {
|
|
91
101
|
await (0, promises_1.unlink)(filePath).catch(() => undefined);
|
|
92
102
|
}
|
|
103
|
+
function createSha256SizeMeter() {
|
|
104
|
+
const hash = (0, node_crypto_1.createHash)('sha256');
|
|
105
|
+
let byteLength = 0;
|
|
106
|
+
const transform = new node_stream_1.Transform({
|
|
107
|
+
transform(chunk, _enc, cb) {
|
|
108
|
+
const bytes = chunk instanceof Uint8Array ? chunk : (0, bytes_1.toChunkBytes)(chunk);
|
|
109
|
+
hash.update(bytes);
|
|
110
|
+
byteLength += bytes.byteLength;
|
|
111
|
+
cb(null, bytes);
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
return {
|
|
115
|
+
transform,
|
|
116
|
+
finalize: () => ({ fileSha256: (0, bytes_1.toBytesView)(hash.digest()), byteLength })
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
async function streamToTempFileWithSha256(source) {
|
|
120
|
+
const filePath = (0, node_path_1.join)((0, node_os_1.tmpdir)(), `zapo-media-${Date.now()}-${Math.random().toString(36).slice(2)}`);
|
|
121
|
+
const meter = createSha256SizeMeter();
|
|
122
|
+
try {
|
|
123
|
+
await (0, promises_2.pipeline)(source, meter.transform, (0, node_fs_1.createWriteStream)(filePath));
|
|
124
|
+
}
|
|
125
|
+
catch (error) {
|
|
126
|
+
await (0, promises_1.unlink)(filePath).catch(() => undefined);
|
|
127
|
+
throw error;
|
|
128
|
+
}
|
|
129
|
+
return { filePath, ...meter.finalize() };
|
|
130
|
+
}
|
|
131
|
+
async function preparePlaintextUploadSource(media) {
|
|
132
|
+
if (media instanceof Uint8Array) {
|
|
133
|
+
return { fileSha256: (0, core_1.sha256)(media), byteLength: media.byteLength, body: media };
|
|
134
|
+
}
|
|
135
|
+
if (typeof media === 'string') {
|
|
136
|
+
await assertReadableFile(media);
|
|
137
|
+
const result = await streamToTempFileWithSha256((0, node_fs_1.createReadStream)(media));
|
|
138
|
+
return {
|
|
139
|
+
fileSha256: result.fileSha256,
|
|
140
|
+
byteLength: result.byteLength,
|
|
141
|
+
body: (0, node_fs_1.createReadStream)(result.filePath),
|
|
142
|
+
cleanup: () => cleanupTempFile(result.filePath)
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
if (isReadableStream(media)) {
|
|
146
|
+
const result = await streamToTempFileWithSha256(media);
|
|
147
|
+
return {
|
|
148
|
+
fileSha256: result.fileSha256,
|
|
149
|
+
byteLength: result.byteLength,
|
|
150
|
+
body: (0, node_fs_1.createReadStream)(result.filePath),
|
|
151
|
+
cleanup: () => cleanupTempFile(result.filePath)
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
throw new Error('media upload received unsupported source type');
|
|
155
|
+
}
|
|
156
|
+
// node:crypto randomInt caps max at 2**48 - 1; well within JS safe integer range.
|
|
157
|
+
const MEDIA_UPLOAD_ID_MAX = 281474976710655;
|
|
158
|
+
async function generateMediaUploadId() {
|
|
159
|
+
const value = await (0, core_1.randomIntAsync)(0, MEDIA_UPLOAD_ID_MAX);
|
|
160
|
+
return value.toString(10);
|
|
161
|
+
}
|
|
162
|
+
function selectMediaUploadHost(mediaConn) {
|
|
163
|
+
return mediaConn.hosts.find((host) => !host.isFallback)?.hostname ?? mediaConn.hosts[0].hostname;
|
|
164
|
+
}
|
|
165
|
+
function buildMediaUploadUrl(host, path, auth, fileSha256, mediaId) {
|
|
166
|
+
const hashToken = (0, bytes_1.bytesToBase64UrlSafe)(fileSha256);
|
|
167
|
+
const base = `https://${host}${path}/${hashToken}?auth=${encodeURIComponent(auth)}&token=${encodeURIComponent(hashToken)}`;
|
|
168
|
+
return mediaId !== undefined ? `${base}&media_id=${mediaId}` : base;
|
|
169
|
+
}
|
|
170
|
+
function assertMediaUploadStatus(status, label) {
|
|
171
|
+
if (status < 200 || status >= 300) {
|
|
172
|
+
throw new Error(`${label} failed with status ${status}`);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
function parseMediaUploadJsonBody(body, label) {
|
|
176
|
+
try {
|
|
177
|
+
return JSON.parse(bytes_1.TEXT_DECODER.decode(body));
|
|
178
|
+
}
|
|
179
|
+
catch (error) {
|
|
180
|
+
throw new Error(`${label} returned invalid json: ${(0, primitives_1.toError)(error).message}`);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
async function performPlaintextMediaUpload(deps, input) {
|
|
184
|
+
const prepared = await preparePlaintextUploadSource(input.source);
|
|
185
|
+
try {
|
|
186
|
+
const host = selectMediaUploadHost(deps.mediaConn);
|
|
187
|
+
const mediaId = await generateMediaUploadId();
|
|
188
|
+
const url = buildMediaUploadUrl(host, input.path, deps.mediaConn.auth, prepared.fileSha256, mediaId);
|
|
189
|
+
deps.logger.debug(input.logLabel ?? 'sending media upload', {
|
|
190
|
+
host,
|
|
191
|
+
path: input.path,
|
|
192
|
+
size: prepared.byteLength
|
|
193
|
+
});
|
|
194
|
+
const response = await deps.mediaTransfer.uploadStream({
|
|
195
|
+
url,
|
|
196
|
+
method: 'POST',
|
|
197
|
+
body: prepared.body,
|
|
198
|
+
contentLength: prepared.byteLength,
|
|
199
|
+
contentType: input.mimetype
|
|
200
|
+
});
|
|
201
|
+
const responseBytes = await deps.mediaTransfer.readResponseBytes(response);
|
|
202
|
+
return {
|
|
203
|
+
responseBytes,
|
|
204
|
+
status: response.status,
|
|
205
|
+
fileSha256: prepared.fileSha256,
|
|
206
|
+
byteLength: prepared.byteLength,
|
|
207
|
+
mediaId
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
finally {
|
|
211
|
+
await prepared.cleanup?.();
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
async function assertReadableFile(filePath) {
|
|
215
|
+
try {
|
|
216
|
+
const stats = await (0, promises_1.stat)(filePath);
|
|
217
|
+
if (!stats.isFile()) {
|
|
218
|
+
throw new Error(`media path is not a regular file: ${filePath}`);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
catch (error) {
|
|
222
|
+
const err = (0, primitives_1.toError)(error);
|
|
223
|
+
if (err.code === 'ENOENT') {
|
|
224
|
+
throw new Error(`media file not found: ${filePath}`);
|
|
225
|
+
}
|
|
226
|
+
throw err;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
93
229
|
async function resolveMediaInputs(shouldProcess, raw) {
|
|
94
230
|
if (typeof raw === 'string') {
|
|
231
|
+
await assertReadableFile(raw);
|
|
95
232
|
return {
|
|
96
233
|
processorInput: raw,
|
|
97
234
|
uploadMedia: (0, node_fs_1.createReadStream)(raw)
|
|
@@ -149,6 +286,12 @@ function shouldGenerateWaveform(media, content) {
|
|
|
149
286
|
content.type === 'audio' &&
|
|
150
287
|
content.waveform === undefined);
|
|
151
288
|
}
|
|
289
|
+
function shouldNormalizeVoiceNote(media, content) {
|
|
290
|
+
return (!!media?.processor?.normalizeVoiceNote &&
|
|
291
|
+
media.normalizeVoiceNote === true &&
|
|
292
|
+
content.type === 'audio' &&
|
|
293
|
+
content.ptt === true);
|
|
294
|
+
}
|
|
152
295
|
function shouldGenerateStickerThumbnail(media, content) {
|
|
153
296
|
return (!!media?.processor?.generateStickerThumbnail &&
|
|
154
297
|
media.generateStickerThumbnail !== false &&
|
|
@@ -174,19 +317,33 @@ async function runProcessorStep(step, content, logger, fn) {
|
|
|
174
317
|
return null;
|
|
175
318
|
}
|
|
176
319
|
}
|
|
320
|
+
// Reuse one scoped child logger per parent. The processor is allowed to be
|
|
321
|
+
// shared across WaClient sessions; without this cache, each call would mint
|
|
322
|
+
// a fresh child logger and any package-side dedup keyed by Logger identity
|
|
323
|
+
// (e.g. ffmpeg's missing-binary warn) would reset on every send.
|
|
324
|
+
const SCOPED_MEDIA_LOGGER_CACHE = new WeakMap();
|
|
325
|
+
function getScopedMediaLogger(parent) {
|
|
326
|
+
let scoped = SCOPED_MEDIA_LOGGER_CACHE.get(parent);
|
|
327
|
+
if (!scoped) {
|
|
328
|
+
scoped = parent.child({ scope: 'media-utils' });
|
|
329
|
+
SCOPED_MEDIA_LOGGER_CACHE.set(parent, scoped);
|
|
330
|
+
}
|
|
331
|
+
return scoped;
|
|
332
|
+
}
|
|
177
333
|
async function runMediaProcessor(media, input, content, logger) {
|
|
178
334
|
const processor = media?.processor;
|
|
179
335
|
if (!processor || !hasMediaProcessingTasks(media, content) || !input)
|
|
180
336
|
return EMPTY_PROCESSED;
|
|
181
337
|
const result = {};
|
|
338
|
+
const ctx = { logger: getScopedMediaLogger(logger) };
|
|
182
339
|
const isVideo = content.type === 'video' || content.type === 'ptv';
|
|
183
340
|
const thumbFn = isVideo ? processor.generateVideoThumbnail : processor.generateImageThumbnail;
|
|
184
341
|
const thumbMaxEdge = isVideo ? VIDEO_THUMB_MAX_EDGE : IMAGE_THUMB_MAX_EDGE;
|
|
185
342
|
const thumbTask = shouldGenerateThumbnail(media, content)
|
|
186
|
-
? runProcessorStep('thumbnail', content, logger, () => thumbFn(input, thumbMaxEdge))
|
|
343
|
+
? runProcessorStep('thumbnail', content, logger, () => thumbFn(input, thumbMaxEdge, ctx))
|
|
187
344
|
: null;
|
|
188
345
|
const probeTask = shouldProbeMedia(media, content)
|
|
189
|
-
? runProcessorStep('probe', content, logger, () => processor.probeMedia(input))
|
|
346
|
+
? runProcessorStep('probe', content, logger, () => processor.probeMedia(input, ctx))
|
|
190
347
|
: null;
|
|
191
348
|
const [thumb, probe] = await Promise.all([thumbTask, probeTask]);
|
|
192
349
|
if (thumb) {
|
|
@@ -209,7 +366,7 @@ async function runMediaProcessor(media, input, content, logger) {
|
|
|
209
366
|
}
|
|
210
367
|
}
|
|
211
368
|
if (shouldGenerateWaveform(media, content)) {
|
|
212
|
-
const waveformResult = await runProcessorStep('waveform', content, logger, () => processor.computeWaveform(input));
|
|
369
|
+
const waveformResult = await runProcessorStep('waveform', content, logger, () => processor.computeWaveform(input, ctx));
|
|
213
370
|
if (waveformResult) {
|
|
214
371
|
result.waveform = waveformResult.waveform;
|
|
215
372
|
if (result.seconds === undefined &&
|
|
@@ -220,7 +377,7 @@ async function runMediaProcessor(media, input, content, logger) {
|
|
|
220
377
|
}
|
|
221
378
|
if (content.type === 'sticker') {
|
|
222
379
|
if (shouldGenerateStickerThumbnail(media, content)) {
|
|
223
|
-
const stickerThumb = await runProcessorStep('stickerThumbnail', content, logger, () => processor.generateStickerThumbnail(input, STICKER_THUMB_MAX_EDGE));
|
|
380
|
+
const stickerThumb = await runProcessorStep('stickerThumbnail', content, logger, () => processor.generateStickerThumbnail(input, STICKER_THUMB_MAX_EDGE, ctx));
|
|
224
381
|
if (stickerThumb) {
|
|
225
382
|
result.pngThumbnail = stickerThumb.pngThumbnail;
|
|
226
383
|
result.width = stickerThumb.width;
|
|
@@ -5,7 +5,7 @@ const PromiseDedup_1 = require("../../infra/perf/PromiseDedup");
|
|
|
5
5
|
const jid_1 = require("../../protocol/jid");
|
|
6
6
|
const primitives_1 = require("../../util/primitives");
|
|
7
7
|
function createDeviceFanoutResolver(options) {
|
|
8
|
-
const { signalDeviceSync,
|
|
8
|
+
const { signalDeviceSync, getCurrentCredentials, logger } = options;
|
|
9
9
|
const dedup = new PromiseDedup_1.PromiseDedup();
|
|
10
10
|
const resolveDirectFanoutDeviceJids = async (recipientJid, selfDeviceJidForRecipient) => {
|
|
11
11
|
const recipientUserJid = (0, jid_1.toUserJid)(recipientJid);
|
|
@@ -40,7 +40,7 @@ function createDeviceFanoutResolver(options) {
|
|
|
40
40
|
return [...fanout];
|
|
41
41
|
}
|
|
42
42
|
catch (error) {
|
|
43
|
-
logger.
|
|
43
|
+
logger.debug('signal device fanout sync failed, falling back to direct recipient', {
|
|
44
44
|
to: recipientJid,
|
|
45
45
|
message: (0, primitives_1.toError)(error).message
|
|
46
46
|
});
|
|
@@ -49,7 +49,8 @@ function createDeviceFanoutResolver(options) {
|
|
|
49
49
|
};
|
|
50
50
|
const resolveGroupParticipantDeviceJidsInternal = async (participantUserJids) => {
|
|
51
51
|
const meDeviceJids = new Set();
|
|
52
|
-
const
|
|
52
|
+
const credentials = getCurrentCredentials();
|
|
53
|
+
const meJid = credentials?.meJid;
|
|
53
54
|
if (meJid) {
|
|
54
55
|
try {
|
|
55
56
|
meDeviceJids.add((0, jid_1.normalizeDeviceJid)(meJid));
|
|
@@ -61,7 +62,7 @@ function createDeviceFanoutResolver(options) {
|
|
|
61
62
|
});
|
|
62
63
|
}
|
|
63
64
|
}
|
|
64
|
-
const meLid =
|
|
65
|
+
const meLid = credentials?.meLid;
|
|
65
66
|
if (meLid && meLid.includes('@')) {
|
|
66
67
|
try {
|
|
67
68
|
meDeviceJids.add((0, jid_1.normalizeDeviceJid)(meLid));
|
|
@@ -95,9 +96,6 @@ function createDeviceFanoutResolver(options) {
|
|
|
95
96
|
}
|
|
96
97
|
for (const deviceJid of entry.deviceJids) {
|
|
97
98
|
const normalizedDeviceJid = (0, jid_1.normalizeDeviceJid)(deviceJid);
|
|
98
|
-
if ((0, jid_1.isHostedDeviceJid)(normalizedDeviceJid)) {
|
|
99
|
-
continue;
|
|
100
|
-
}
|
|
101
99
|
if (meDeviceJids.has(normalizedDeviceJid)) {
|
|
102
100
|
continue;
|
|
103
101
|
}
|
|
@@ -107,7 +105,7 @@ function createDeviceFanoutResolver(options) {
|
|
|
107
105
|
return [...fanout];
|
|
108
106
|
}
|
|
109
107
|
catch (error) {
|
|
110
|
-
logger.
|
|
108
|
+
logger.debug('group participant device sync failed, falling back to participant user jids', {
|
|
111
109
|
participants: candidateUsers.length,
|
|
112
110
|
message: (0, primitives_1.toError)(error).message
|
|
113
111
|
});
|
|
@@ -131,14 +129,15 @@ function createDeviceFanoutResolver(options) {
|
|
|
131
129
|
}
|
|
132
130
|
};
|
|
133
131
|
const resolveOwnPeerDeviceJids = async () => {
|
|
134
|
-
const
|
|
132
|
+
const credentials = getCurrentCredentials();
|
|
133
|
+
const meJid = credentials?.meJid;
|
|
135
134
|
if (!meJid) {
|
|
136
135
|
throw new Error('resolveOwnPeerDeviceJids requires registered meJid');
|
|
137
136
|
}
|
|
138
137
|
const meUserJid = (0, jid_1.toUserJid)(meJid);
|
|
139
138
|
const meDevices = new Set();
|
|
140
139
|
meDevices.add((0, jid_1.normalizeDeviceJid)(meJid));
|
|
141
|
-
const meLid =
|
|
140
|
+
const meLid = credentials?.meLid;
|
|
142
141
|
if (meLid && meLid.includes('@')) {
|
|
143
142
|
try {
|
|
144
143
|
meDevices.add((0, jid_1.normalizeDeviceJid)(meLid));
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.createGroupMetadataCache = createGroupMetadataCache;
|
|
4
4
|
const PromiseDedup_1 = require("../../infra/perf/PromiseDedup");
|
|
5
5
|
const jid_1 = require("../../protocol/jid");
|
|
6
6
|
const primitives_1 = require("../../util/primitives");
|
|
7
|
-
function
|
|
8
|
-
const {
|
|
7
|
+
function createGroupMetadataCache(options) {
|
|
8
|
+
const { groupMetadataStore, queryGroupMetadata, logger } = options;
|
|
9
9
|
const dedup = new PromiseDedup_1.PromiseDedup();
|
|
10
10
|
const sanitizeParticipantUsers = (participants) => {
|
|
11
11
|
const deduped = new Set();
|
|
@@ -36,10 +36,19 @@ function createGroupParticipantsCache(options) {
|
|
|
36
36
|
}
|
|
37
37
|
return true;
|
|
38
38
|
};
|
|
39
|
-
const
|
|
39
|
+
const upsertParticipants = async (cached, groupJid, participants) => {
|
|
40
|
+
await groupMetadataStore.upsertGroupMetadata({
|
|
41
|
+
groupJid,
|
|
42
|
+
participants,
|
|
43
|
+
ephemeral: cached?.ephemeral,
|
|
44
|
+
updatedAtMs: Date.now()
|
|
45
|
+
});
|
|
46
|
+
};
|
|
47
|
+
const mergeParticipantUsersIntoCache = async (groupJid, cached, participantsToAdd) => {
|
|
40
48
|
if (participantsToAdd.length === 0) {
|
|
41
49
|
return;
|
|
42
50
|
}
|
|
51
|
+
const cachedParticipants = cached.participants;
|
|
43
52
|
const nextParticipants = [...cachedParticipants];
|
|
44
53
|
const existing = new Set(cachedParticipants);
|
|
45
54
|
for (const participant of participantsToAdd) {
|
|
@@ -52,33 +61,27 @@ function createGroupParticipantsCache(options) {
|
|
|
52
61
|
if (nextParticipants.length === cachedParticipants.length) {
|
|
53
62
|
return;
|
|
54
63
|
}
|
|
55
|
-
await
|
|
56
|
-
groupJid,
|
|
57
|
-
participants: nextParticipants,
|
|
58
|
-
updatedAtMs: Date.now()
|
|
59
|
-
});
|
|
64
|
+
await upsertParticipants(cached, groupJid, nextParticipants);
|
|
60
65
|
};
|
|
61
|
-
const removeParticipantUsersFromCache = async (groupJid,
|
|
66
|
+
const removeParticipantUsersFromCache = async (groupJid, cached, participantsToRemove) => {
|
|
62
67
|
if (participantsToRemove.length === 0) {
|
|
63
68
|
return;
|
|
64
69
|
}
|
|
65
70
|
const removed = new Set(participantsToRemove);
|
|
71
|
+
const cachedParticipants = cached.participants;
|
|
66
72
|
const nextParticipants = cachedParticipants.filter((participant) => !removed.has(participant));
|
|
67
73
|
if (nextParticipants.length === cachedParticipants.length) {
|
|
68
74
|
return;
|
|
69
75
|
}
|
|
70
76
|
if (nextParticipants.length === 0) {
|
|
71
|
-
await
|
|
77
|
+
await groupMetadataStore.deleteGroupMetadata(groupJid);
|
|
72
78
|
return;
|
|
73
79
|
}
|
|
74
|
-
await
|
|
75
|
-
groupJid,
|
|
76
|
-
participants: nextParticipants,
|
|
77
|
-
updatedAtMs: Date.now()
|
|
78
|
-
});
|
|
80
|
+
await upsertParticipants(cached, groupJid, nextParticipants);
|
|
79
81
|
};
|
|
80
|
-
const replaceParticipantUsersInCache = async (groupJid,
|
|
82
|
+
const replaceParticipantUsersInCache = async (groupJid, cached, participantsToReplace, replacementParticipants) => {
|
|
81
83
|
const toReplace = new Set(participantsToReplace);
|
|
84
|
+
const cachedParticipants = cached.participants;
|
|
82
85
|
const nextParticipants = cachedParticipants.filter((participant) => !toReplace.has(participant));
|
|
83
86
|
const existing = new Set(nextParticipants);
|
|
84
87
|
for (const participant of replacementParticipants) {
|
|
@@ -92,16 +95,12 @@ function createGroupParticipantsCache(options) {
|
|
|
92
95
|
return;
|
|
93
96
|
}
|
|
94
97
|
if (nextParticipants.length === 0) {
|
|
95
|
-
await
|
|
98
|
+
await groupMetadataStore.deleteGroupMetadata(groupJid);
|
|
96
99
|
return;
|
|
97
100
|
}
|
|
98
|
-
await
|
|
99
|
-
groupJid,
|
|
100
|
-
participants: nextParticipants,
|
|
101
|
-
updatedAtMs: Date.now()
|
|
102
|
-
});
|
|
101
|
+
await upsertParticipants(cached, groupJid, nextParticipants);
|
|
103
102
|
};
|
|
104
|
-
const
|
|
103
|
+
const resolveGroupJidForGroupCacheEvent = (event) => {
|
|
105
104
|
if (event.action === 'linked_group_promote' || event.action === 'linked_group_demote') {
|
|
106
105
|
return event.contextGroupJid ?? event.groupJid ?? null;
|
|
107
106
|
}
|
|
@@ -123,29 +122,60 @@ function createGroupParticipantsCache(options) {
|
|
|
123
122
|
return sanitizeParticipantUsers(candidates);
|
|
124
123
|
};
|
|
125
124
|
const refreshParticipantUsers = (groupJid) => dedup.run(`refresh:${groupJid}`, async () => {
|
|
126
|
-
const queried = await
|
|
127
|
-
const participants = sanitizeParticipantUsers(queried);
|
|
128
|
-
await
|
|
125
|
+
const queried = await queryGroupMetadata(groupJid);
|
|
126
|
+
const participants = sanitizeParticipantUsers(queried.participants);
|
|
127
|
+
await groupMetadataStore.upsertGroupMetadata({
|
|
129
128
|
groupJid,
|
|
130
129
|
participants,
|
|
130
|
+
ephemeral: queried.ephemeral,
|
|
131
131
|
updatedAtMs: Date.now()
|
|
132
132
|
});
|
|
133
133
|
return participants;
|
|
134
134
|
});
|
|
135
135
|
const resolveParticipantUsers = (groupJid) => dedup.run(`resolve:${groupJid}`, async () => {
|
|
136
|
-
const cached = await
|
|
136
|
+
const cached = await groupMetadataStore.getGroupMetadata(groupJid);
|
|
137
137
|
if (cached && cached.participants.length > 0) {
|
|
138
138
|
return sanitizeParticipantUsers(cached.participants);
|
|
139
139
|
}
|
|
140
140
|
return refreshParticipantUsers(groupJid);
|
|
141
141
|
});
|
|
142
|
+
const getEphemeral = async (groupJid) => {
|
|
143
|
+
const cached = await groupMetadataStore.getGroupMetadata(groupJid);
|
|
144
|
+
return cached?.ephemeral ?? null;
|
|
145
|
+
};
|
|
146
|
+
const resolveEphemeral = async (groupJid) => {
|
|
147
|
+
const cached = await groupMetadataStore.getGroupMetadata(groupJid);
|
|
148
|
+
if (cached) {
|
|
149
|
+
return cached.ephemeral ?? null;
|
|
150
|
+
}
|
|
151
|
+
await refreshParticipantUsers(groupJid);
|
|
152
|
+
const refreshed = await groupMetadataStore.getGroupMetadata(groupJid);
|
|
153
|
+
return refreshed?.ephemeral ?? null;
|
|
154
|
+
};
|
|
142
155
|
const mutateFromGroupEvent = async (event) => {
|
|
143
|
-
const groupJid =
|
|
156
|
+
const groupJid = resolveGroupJidForGroupCacheEvent(event);
|
|
144
157
|
if (!groupJid) {
|
|
145
158
|
return;
|
|
146
159
|
}
|
|
147
160
|
if (event.action === 'delete') {
|
|
148
|
-
await
|
|
161
|
+
await groupMetadataStore.deleteGroupMetadata(groupJid);
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
if (event.action === 'ephemeral') {
|
|
165
|
+
const cached = await groupMetadataStore.getGroupMetadata(groupJid);
|
|
166
|
+
if (!cached) {
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
const nextEphemeral = event.expirationSeconds;
|
|
170
|
+
if (cached.ephemeral === nextEphemeral) {
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
await groupMetadataStore.upsertGroupMetadata({
|
|
174
|
+
groupJid,
|
|
175
|
+
participants: cached.participants,
|
|
176
|
+
ephemeral: nextEphemeral,
|
|
177
|
+
updatedAtMs: Date.now()
|
|
178
|
+
});
|
|
149
179
|
return;
|
|
150
180
|
}
|
|
151
181
|
const participantUsers = extractParticipantUsersFromGroupEvent(event);
|
|
@@ -153,14 +183,16 @@ function createGroupParticipantsCache(options) {
|
|
|
153
183
|
if (participantUsers.length === 0) {
|
|
154
184
|
return;
|
|
155
185
|
}
|
|
156
|
-
await
|
|
186
|
+
const existing = await groupMetadataStore.getGroupMetadata(groupJid);
|
|
187
|
+
await groupMetadataStore.upsertGroupMetadata({
|
|
157
188
|
groupJid,
|
|
158
189
|
participants: participantUsers,
|
|
190
|
+
ephemeral: existing?.ephemeral,
|
|
159
191
|
updatedAtMs: Date.now()
|
|
160
192
|
});
|
|
161
193
|
return;
|
|
162
194
|
}
|
|
163
|
-
const cached = await
|
|
195
|
+
const cached = await groupMetadataStore.getGroupMetadata(groupJid);
|
|
164
196
|
if (!cached || cached.participants.length === 0) {
|
|
165
197
|
return;
|
|
166
198
|
}
|
|
@@ -168,26 +200,32 @@ function createGroupParticipantsCache(options) {
|
|
|
168
200
|
if (cachedParticipants.length === 0) {
|
|
169
201
|
return;
|
|
170
202
|
}
|
|
203
|
+
const cachedWithSanitized = {
|
|
204
|
+
...cached,
|
|
205
|
+
participants: cachedParticipants
|
|
206
|
+
};
|
|
171
207
|
if (event.action === 'add' ||
|
|
172
208
|
event.action === 'promote' ||
|
|
173
209
|
event.action === 'demote' ||
|
|
174
210
|
event.action === 'linked_group_promote' ||
|
|
175
211
|
event.action === 'linked_group_demote') {
|
|
176
|
-
await mergeParticipantUsersIntoCache(groupJid,
|
|
212
|
+
await mergeParticipantUsersIntoCache(groupJid, cachedWithSanitized, participantUsers);
|
|
177
213
|
return;
|
|
178
214
|
}
|
|
179
215
|
if (event.action === 'remove') {
|
|
180
|
-
await removeParticipantUsersFromCache(groupJid,
|
|
216
|
+
await removeParticipantUsersFromCache(groupJid, cachedWithSanitized, participantUsers);
|
|
181
217
|
return;
|
|
182
218
|
}
|
|
183
219
|
if (event.action === 'modify') {
|
|
184
220
|
const authorUsers = event.authorJid ? sanitizeParticipantUsers([event.authorJid]) : [];
|
|
185
|
-
await replaceParticipantUsersInCache(groupJid,
|
|
221
|
+
await replaceParticipantUsersInCache(groupJid, cachedWithSanitized, authorUsers, participantUsers);
|
|
186
222
|
}
|
|
187
223
|
};
|
|
188
224
|
return {
|
|
189
225
|
resolveParticipantUsers,
|
|
190
226
|
refreshParticipantUsers,
|
|
227
|
+
getEphemeral,
|
|
228
|
+
resolveEphemeral,
|
|
191
229
|
mutateFromGroupEvent
|
|
192
230
|
};
|
|
193
231
|
}
|