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