zapo-js 0.3.0 → 1.0.1
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 +98 -178
- 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 +20 -8
- package/dist/auth/pairing/WaPairingFlow.js +35 -26
- package/dist/auth/pairing/pairing-code-crypto.js +17 -19
- package/dist/client/WaClient.js +343 -474
- package/dist/client/WaClientFactory.js +281 -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 +685 -207
- 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 +257 -126
- package/dist/client/coordinators/WaStatusCoordinator.js +49 -0
- package/dist/client/coordinators/WaStreamControlCoordinator.js +8 -9
- 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 +163 -6
- package/dist/client/messaging/fanout.js +9 -10
- package/dist/client/messaging/{participants.js → group-metadata.js} +93 -44
- package/dist/client/messaging/ignore-key.js +132 -0
- package/dist/client/messaging/key-protocol.js +4 -18
- 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 +282 -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 +8 -9
- 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 +158 -8
- package/dist/esm/client/messaging/fanout.js +10 -11
- package/dist/esm/client/messaging/{participants.js → group-metadata.js} +92 -43
- 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 +69 -20
- 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 +8 -1
- 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/locks/pre-key.lock.js +4 -1
- 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 +35 -5
- 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 +130 -36
- package/dist/retry/tracker.js +3 -7
- package/dist/signal/api/SignalDeviceSyncApi.js +67 -18
- package/dist/signal/api/SignalDigestSyncApi.js +7 -2
- 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 +6 -8
- package/dist/signal/constants.js +4 -1
- package/dist/signal/encoding.js +5 -303
- package/dist/signal/group/SenderKeyChain.js +18 -33
- package/dist/signal/group/SenderKeyCodec.js +2 -2
- package/dist/signal/group/SenderKeyManager.js +26 -9
- package/dist/signal/group/encoding.js +101 -0
- package/dist/signal/index.js +13 -10
- package/dist/signal/registration/encoding.js +39 -0
- package/dist/signal/registration/keygen.js +11 -1
- package/dist/signal/registration/utils.js +8 -1
- package/dist/signal/session/SignalProtocol.js +113 -11
- package/dist/signal/session/SignalRatchet.js +26 -56
- package/dist/signal/session/SignalSerializer.js +2 -2
- package/dist/signal/session/SignalSession.js +7 -15
- 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/locks/pre-key.lock.js +4 -1
- 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 +2 -2
- 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 +3 -2
- 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 +9 -9
- package/dist/transport/noise/WaMobileClientPayload.js +6 -1
- package/dist/transport/noise/WaNoiseCert.js +7 -2
- package/dist/transport/noise/WaNoiseHandshake.js +26 -24
- package/dist/transport/noise/WaNoiseSession.js +41 -61
- package/dist/transport/noise/WaNoiseSocket.js +19 -13
- 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/types.d.ts +1 -1
- package/dist/types/appstate/utils.d.ts +18 -2
- 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 +49 -2
- 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 +55 -32
- 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 +844 -72
- 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 +34 -8
- 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 +209 -11
- 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 +18 -1
- 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/signal/types.d.ts +1 -1
- 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 +6 -1
- 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/noise/types.d.ts +1 -1
- 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');
|
|
@@ -57,8 +60,8 @@ export function parseWebpAnimation(data) {
|
|
|
57
60
|
}
|
|
58
61
|
return null;
|
|
59
62
|
}
|
|
60
|
-
const IMAGE_THUMB_MAX_EDGE =
|
|
61
|
-
const VIDEO_THUMB_MAX_EDGE =
|
|
63
|
+
const IMAGE_THUMB_MAX_EDGE = 100;
|
|
64
|
+
const VIDEO_THUMB_MAX_EDGE = 100;
|
|
62
65
|
const STICKER_THUMB_MAX_EDGE = 100;
|
|
63
66
|
const EMPTY_PROCESSED = {};
|
|
64
67
|
export function isReadableStream(value) {
|
|
@@ -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,9 +1,10 @@
|
|
|
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
|
+
const pendingMutations = new Map();
|
|
7
8
|
const sanitizeParticipantUsers = (participants) => {
|
|
8
9
|
const deduped = new Set();
|
|
9
10
|
for (const participant of participants) {
|
|
@@ -33,10 +34,19 @@ export function createGroupParticipantsCache(options) {
|
|
|
33
34
|
}
|
|
34
35
|
return true;
|
|
35
36
|
};
|
|
36
|
-
const
|
|
37
|
+
const upsertParticipants = async (cached, groupJid, participants) => {
|
|
38
|
+
await groupMetadataStore.upsertGroupMetadata({
|
|
39
|
+
groupJid,
|
|
40
|
+
participants,
|
|
41
|
+
ephemeral: cached?.ephemeral,
|
|
42
|
+
updatedAtMs: Date.now()
|
|
43
|
+
});
|
|
44
|
+
};
|
|
45
|
+
const mergeParticipantUsersIntoCache = async (groupJid, cached, participantsToAdd) => {
|
|
37
46
|
if (participantsToAdd.length === 0) {
|
|
38
47
|
return;
|
|
39
48
|
}
|
|
49
|
+
const cachedParticipants = cached.participants;
|
|
40
50
|
const nextParticipants = [...cachedParticipants];
|
|
41
51
|
const existing = new Set(cachedParticipants);
|
|
42
52
|
for (const participant of participantsToAdd) {
|
|
@@ -49,33 +59,27 @@ export function createGroupParticipantsCache(options) {
|
|
|
49
59
|
if (nextParticipants.length === cachedParticipants.length) {
|
|
50
60
|
return;
|
|
51
61
|
}
|
|
52
|
-
await
|
|
53
|
-
groupJid,
|
|
54
|
-
participants: nextParticipants,
|
|
55
|
-
updatedAtMs: Date.now()
|
|
56
|
-
});
|
|
62
|
+
await upsertParticipants(cached, groupJid, nextParticipants);
|
|
57
63
|
};
|
|
58
|
-
const removeParticipantUsersFromCache = async (groupJid,
|
|
64
|
+
const removeParticipantUsersFromCache = async (groupJid, cached, participantsToRemove) => {
|
|
59
65
|
if (participantsToRemove.length === 0) {
|
|
60
66
|
return;
|
|
61
67
|
}
|
|
62
68
|
const removed = new Set(participantsToRemove);
|
|
69
|
+
const cachedParticipants = cached.participants;
|
|
63
70
|
const nextParticipants = cachedParticipants.filter((participant) => !removed.has(participant));
|
|
64
71
|
if (nextParticipants.length === cachedParticipants.length) {
|
|
65
72
|
return;
|
|
66
73
|
}
|
|
67
74
|
if (nextParticipants.length === 0) {
|
|
68
|
-
await
|
|
75
|
+
await groupMetadataStore.deleteGroupMetadata(groupJid);
|
|
69
76
|
return;
|
|
70
77
|
}
|
|
71
|
-
await
|
|
72
|
-
groupJid,
|
|
73
|
-
participants: nextParticipants,
|
|
74
|
-
updatedAtMs: Date.now()
|
|
75
|
-
});
|
|
78
|
+
await upsertParticipants(cached, groupJid, nextParticipants);
|
|
76
79
|
};
|
|
77
|
-
const replaceParticipantUsersInCache = async (groupJid,
|
|
80
|
+
const replaceParticipantUsersInCache = async (groupJid, cached, participantsToReplace, replacementParticipants) => {
|
|
78
81
|
const toReplace = new Set(participantsToReplace);
|
|
82
|
+
const cachedParticipants = cached.participants;
|
|
79
83
|
const nextParticipants = cachedParticipants.filter((participant) => !toReplace.has(participant));
|
|
80
84
|
const existing = new Set(nextParticipants);
|
|
81
85
|
for (const participant of replacementParticipants) {
|
|
@@ -89,16 +93,12 @@ export function createGroupParticipantsCache(options) {
|
|
|
89
93
|
return;
|
|
90
94
|
}
|
|
91
95
|
if (nextParticipants.length === 0) {
|
|
92
|
-
await
|
|
96
|
+
await groupMetadataStore.deleteGroupMetadata(groupJid);
|
|
93
97
|
return;
|
|
94
98
|
}
|
|
95
|
-
await
|
|
96
|
-
groupJid,
|
|
97
|
-
participants: nextParticipants,
|
|
98
|
-
updatedAtMs: Date.now()
|
|
99
|
-
});
|
|
99
|
+
await upsertParticipants(cached, groupJid, nextParticipants);
|
|
100
100
|
};
|
|
101
|
-
const
|
|
101
|
+
const resolveGroupJidForGroupCacheEvent = (event) => {
|
|
102
102
|
if (event.action === 'linked_group_promote' || event.action === 'linked_group_demote') {
|
|
103
103
|
return event.contextGroupJid ?? event.groupJid ?? null;
|
|
104
104
|
}
|
|
@@ -107,42 +107,69 @@ export function createGroupParticipantsCache(options) {
|
|
|
107
107
|
const extractParticipantUsersFromGroupEvent = (event) => {
|
|
108
108
|
const candidates = [];
|
|
109
109
|
for (const participant of event.participants ?? []) {
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
if (participant.lidJid) {
|
|
114
|
-
candidates.push(participant.lidJid);
|
|
115
|
-
}
|
|
116
|
-
if (participant.phoneJid) {
|
|
117
|
-
candidates.push(participant.phoneJid);
|
|
110
|
+
const canonical = participant.jid ?? participant.lidJid ?? participant.phoneJid;
|
|
111
|
+
if (canonical) {
|
|
112
|
+
candidates.push(canonical);
|
|
118
113
|
}
|
|
119
114
|
}
|
|
120
115
|
return sanitizeParticipantUsers(candidates);
|
|
121
116
|
};
|
|
122
117
|
const refreshParticipantUsers = (groupJid) => dedup.run(`refresh:${groupJid}`, async () => {
|
|
123
|
-
const queried = await
|
|
124
|
-
const participants = sanitizeParticipantUsers(queried);
|
|
125
|
-
await
|
|
118
|
+
const queried = await queryGroupMetadata(groupJid);
|
|
119
|
+
const participants = sanitizeParticipantUsers(queried.participants);
|
|
120
|
+
await groupMetadataStore.upsertGroupMetadata({
|
|
126
121
|
groupJid,
|
|
127
122
|
participants,
|
|
123
|
+
ephemeral: queried.ephemeral,
|
|
128
124
|
updatedAtMs: Date.now()
|
|
129
125
|
});
|
|
130
126
|
return participants;
|
|
131
127
|
});
|
|
132
128
|
const resolveParticipantUsers = (groupJid) => dedup.run(`resolve:${groupJid}`, async () => {
|
|
133
|
-
|
|
129
|
+
await pendingMutations.get(groupJid)?.catch(() => undefined);
|
|
130
|
+
const cached = await groupMetadataStore.getGroupMetadata(groupJid);
|
|
134
131
|
if (cached && cached.participants.length > 0) {
|
|
135
132
|
return sanitizeParticipantUsers(cached.participants);
|
|
136
133
|
}
|
|
137
134
|
return refreshParticipantUsers(groupJid);
|
|
138
135
|
});
|
|
139
|
-
const
|
|
140
|
-
const
|
|
136
|
+
const getEphemeral = async (groupJid) => {
|
|
137
|
+
const cached = await groupMetadataStore.getGroupMetadata(groupJid);
|
|
138
|
+
return cached?.ephemeral ?? null;
|
|
139
|
+
};
|
|
140
|
+
const resolveEphemeral = async (groupJid) => {
|
|
141
|
+
const cached = await groupMetadataStore.getGroupMetadata(groupJid);
|
|
142
|
+
if (cached) {
|
|
143
|
+
return cached.ephemeral ?? null;
|
|
144
|
+
}
|
|
145
|
+
await refreshParticipantUsers(groupJid);
|
|
146
|
+
const refreshed = await groupMetadataStore.getGroupMetadata(groupJid);
|
|
147
|
+
return refreshed?.ephemeral ?? null;
|
|
148
|
+
};
|
|
149
|
+
const applyGroupEvent = async (event) => {
|
|
150
|
+
const groupJid = resolveGroupJidForGroupCacheEvent(event);
|
|
141
151
|
if (!groupJid) {
|
|
142
152
|
return;
|
|
143
153
|
}
|
|
144
154
|
if (event.action === 'delete') {
|
|
145
|
-
await
|
|
155
|
+
await groupMetadataStore.deleteGroupMetadata(groupJid);
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
if (event.action === 'ephemeral') {
|
|
159
|
+
const cached = await groupMetadataStore.getGroupMetadata(groupJid);
|
|
160
|
+
if (!cached) {
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
const nextEphemeral = event.expirationSeconds;
|
|
164
|
+
if (cached.ephemeral === nextEphemeral) {
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
await groupMetadataStore.upsertGroupMetadata({
|
|
168
|
+
groupJid,
|
|
169
|
+
participants: cached.participants,
|
|
170
|
+
ephemeral: nextEphemeral,
|
|
171
|
+
updatedAtMs: Date.now()
|
|
172
|
+
});
|
|
146
173
|
return;
|
|
147
174
|
}
|
|
148
175
|
const participantUsers = extractParticipantUsersFromGroupEvent(event);
|
|
@@ -150,14 +177,16 @@ export function createGroupParticipantsCache(options) {
|
|
|
150
177
|
if (participantUsers.length === 0) {
|
|
151
178
|
return;
|
|
152
179
|
}
|
|
153
|
-
await
|
|
180
|
+
const existing = await groupMetadataStore.getGroupMetadata(groupJid);
|
|
181
|
+
await groupMetadataStore.upsertGroupMetadata({
|
|
154
182
|
groupJid,
|
|
155
183
|
participants: participantUsers,
|
|
184
|
+
ephemeral: existing?.ephemeral,
|
|
156
185
|
updatedAtMs: Date.now()
|
|
157
186
|
});
|
|
158
187
|
return;
|
|
159
188
|
}
|
|
160
|
-
const cached = await
|
|
189
|
+
const cached = await groupMetadataStore.getGroupMetadata(groupJid);
|
|
161
190
|
if (!cached || cached.participants.length === 0) {
|
|
162
191
|
return;
|
|
163
192
|
}
|
|
@@ -165,26 +194,46 @@ export function createGroupParticipantsCache(options) {
|
|
|
165
194
|
if (cachedParticipants.length === 0) {
|
|
166
195
|
return;
|
|
167
196
|
}
|
|
197
|
+
const cachedWithSanitized = {
|
|
198
|
+
...cached,
|
|
199
|
+
participants: cachedParticipants
|
|
200
|
+
};
|
|
168
201
|
if (event.action === 'add' ||
|
|
169
202
|
event.action === 'promote' ||
|
|
170
203
|
event.action === 'demote' ||
|
|
171
204
|
event.action === 'linked_group_promote' ||
|
|
172
205
|
event.action === 'linked_group_demote') {
|
|
173
|
-
await mergeParticipantUsersIntoCache(groupJid,
|
|
206
|
+
await mergeParticipantUsersIntoCache(groupJid, cachedWithSanitized, participantUsers);
|
|
174
207
|
return;
|
|
175
208
|
}
|
|
176
209
|
if (event.action === 'remove') {
|
|
177
|
-
await removeParticipantUsersFromCache(groupJid,
|
|
210
|
+
await removeParticipantUsersFromCache(groupJid, cachedWithSanitized, participantUsers);
|
|
178
211
|
return;
|
|
179
212
|
}
|
|
180
213
|
if (event.action === 'modify') {
|
|
181
214
|
const authorUsers = event.authorJid ? sanitizeParticipantUsers([event.authorJid]) : [];
|
|
182
|
-
await replaceParticipantUsersInCache(groupJid,
|
|
215
|
+
await replaceParticipantUsersInCache(groupJid, cachedWithSanitized, authorUsers, participantUsers);
|
|
183
216
|
}
|
|
184
217
|
};
|
|
218
|
+
const mutateFromGroupEvent = (event) => {
|
|
219
|
+
const groupJid = resolveGroupJidForGroupCacheEvent(event);
|
|
220
|
+
if (!groupJid) {
|
|
221
|
+
return applyGroupEvent(event);
|
|
222
|
+
}
|
|
223
|
+
const prev = pendingMutations.get(groupJid) ?? Promise.resolve();
|
|
224
|
+
const next = prev.then(() => applyGroupEvent(event), () => applyGroupEvent(event));
|
|
225
|
+
pendingMutations.set(groupJid, next);
|
|
226
|
+
return next.finally(() => {
|
|
227
|
+
if (pendingMutations.get(groupJid) === next) {
|
|
228
|
+
pendingMutations.delete(groupJid);
|
|
229
|
+
}
|
|
230
|
+
});
|
|
231
|
+
};
|
|
185
232
|
return {
|
|
186
233
|
resolveParticipantUsers,
|
|
187
234
|
refreshParticipantUsers,
|
|
235
|
+
getEphemeral,
|
|
236
|
+
resolveEphemeral,
|
|
188
237
|
mutateFromGroupEvent
|
|
189
238
|
};
|
|
190
239
|
}
|