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