zapo-js 0.3.0 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +97 -177
- package/dist/appstate/{WaAppStateCrypto.js → crypto/WaAppStateCrypto.js} +58 -49
- package/dist/appstate/index.js +7 -6
- package/dist/appstate/{encoding.js → parsers/encoding.js} +11 -4
- package/dist/appstate/{response-parser.js → parsers/response-parser.js} +20 -8
- package/dist/appstate/{WaAppStateSyncClient.js → sync/WaAppStateSyncClient.js} +174 -53
- package/dist/appstate/utils.js +16 -0
- package/dist/appstate-spec.js +89 -0
- package/dist/auth/WaAuthClient.js +100 -5
- package/dist/auth/credentials-flow.js +19 -7
- package/dist/auth/pairing/WaPairingFlow.js +33 -24
- package/dist/auth/pairing/pairing-code-crypto.js +16 -18
- package/dist/client/WaClient.js +342 -473
- package/dist/client/WaClientFactory.js +279 -78
- package/dist/client/connection/WaConnectionManager.js +28 -11
- package/dist/client/coordinators/WaAbPropsCoordinator.js +1 -2
- package/dist/client/coordinators/WaAppStateMutationCoordinator.js +663 -143
- package/dist/client/coordinators/WaBotCoordinator.js +345 -0
- package/dist/client/coordinators/WaBroadcastListCoordinator.js +20 -0
- package/dist/client/coordinators/WaBusinessCoordinator.js +81 -171
- package/dist/client/coordinators/WaEmailCoordinator.js +1 -0
- package/dist/client/coordinators/WaGroupCoordinator.js +529 -52
- package/dist/client/coordinators/WaIncomingNodeCoordinator.js +97 -12
- package/dist/client/coordinators/WaLowLevelCoordinator.js +41 -0
- package/dist/client/coordinators/WaMessageCoordinator.js +365 -0
- package/dist/client/coordinators/WaMessageDispatchCoordinator.js +682 -204
- package/dist/client/coordinators/WaNewsletterCoordinator.js +18 -0
- package/dist/client/coordinators/WaPassiveTasksCoordinator.js +17 -4
- package/dist/client/coordinators/WaPresenceCoordinator.js +21 -0
- package/dist/client/coordinators/WaPrivacyCoordinator.js +7 -5
- package/dist/client/coordinators/WaProfileCoordinator.js +220 -49
- package/dist/client/coordinators/WaRetryCoordinator.js +256 -125
- package/dist/client/coordinators/WaStatusCoordinator.js +49 -0
- package/dist/client/coordinators/WaStreamControlCoordinator.js +6 -6
- package/dist/client/coordinators/WaTrustedContactTokenCoordinator.js +7 -6
- package/dist/client/events/appstate-mutation.js +133 -0
- package/dist/client/events/business.js +375 -0
- package/dist/client/events/call.js +58 -0
- package/dist/client/events/chatstate.js +23 -0
- package/dist/client/events/devices.js +15 -16
- package/dist/client/{dirty.js → events/dirty.js} +33 -19
- package/dist/client/events/group.js +13 -24
- package/dist/client/events/identity.js +2 -1
- package/dist/client/events/incoming.js +502 -0
- package/dist/client/events/mex-notification.js +181 -0
- package/dist/client/events/picture.js +33 -0
- package/dist/client/events/presence.js +44 -0
- package/dist/client/events/receipt.js +26 -0
- package/dist/client/media.js +161 -4
- package/dist/client/messaging/fanout.js +9 -10
- package/dist/client/messaging/{participants.js → group-metadata.js} +73 -35
- package/dist/client/messaging/ignore-key.js +132 -0
- package/dist/client/messaging/key-protocol.js +3 -17
- package/dist/client/messaging/link-preview.js +159 -0
- package/dist/client/messaging/messages.js +671 -0
- package/dist/client/newsletter/admin.js +165 -0
- package/dist/client/newsletter/content.js +253 -0
- package/dist/client/newsletter/discovery.js +115 -0
- package/dist/client/newsletter/messaging.js +197 -0
- package/dist/client/newsletter/mex.js +41 -0
- package/dist/client/newsletter/parse.js +217 -0
- package/dist/client/persistence/WriteBehindPersistence.js +31 -4
- package/dist/client/{history-sync.js → persistence/history-sync.js} +125 -18
- package/dist/client/persistence/mailbox.js +104 -0
- package/dist/client/tokens/cs-token.js +11 -17
- package/dist/crypto/core/hkdf.js +12 -12
- package/dist/crypto/core/index.js +6 -8
- package/dist/crypto/core/keys.js +1 -8
- package/dist/crypto/core/nonce.js +12 -12
- package/dist/crypto/core/primitives.js +123 -93
- package/dist/crypto/core/random.js +6 -0
- package/dist/crypto/core/xeddsa.js +11 -9
- package/dist/crypto/curves/Ed25519.js +32 -21
- package/dist/crypto/curves/X25519.js +70 -34
- package/dist/crypto/curves/constants.js +2 -1
- package/dist/crypto/math/constants.js +1 -2
- package/dist/crypto/math/mod.js +0 -33
- package/dist/esm/appstate/{WaAppStateCrypto.js → crypto/WaAppStateCrypto.js} +58 -49
- package/dist/esm/appstate/index.js +5 -5
- package/dist/esm/appstate/{encoding.js → parsers/encoding.js} +11 -4
- package/dist/esm/appstate/{response-parser.js → parsers/response-parser.js} +20 -8
- package/dist/esm/appstate/{WaAppStateSyncClient.js → sync/WaAppStateSyncClient.js} +174 -52
- package/dist/esm/appstate/utils.js +16 -0
- package/dist/esm/appstate-spec.js +79 -0
- package/dist/esm/auth/WaAuthClient.js +100 -5
- package/dist/esm/auth/credentials-flow.js +18 -6
- package/dist/esm/auth/pairing/WaPairingFlow.js +34 -25
- package/dist/esm/auth/pairing/pairing-code-crypto.js +12 -14
- package/dist/esm/client/WaClient.js +345 -476
- package/dist/esm/client/WaClientFactory.js +280 -79
- package/dist/esm/client/connection/WaConnectionManager.js +28 -11
- package/dist/esm/client/coordinators/WaAbPropsCoordinator.js +2 -3
- package/dist/esm/client/coordinators/WaAppStateMutationCoordinator.js +665 -145
- package/dist/esm/client/coordinators/WaBotCoordinator.js +342 -0
- package/dist/esm/client/coordinators/WaBroadcastListCoordinator.js +17 -0
- package/dist/esm/client/coordinators/WaBusinessCoordinator.js +79 -169
- package/dist/esm/client/coordinators/WaEmailCoordinator.js +1 -0
- package/dist/esm/client/coordinators/WaGroupCoordinator.js +532 -55
- package/dist/esm/client/coordinators/WaIncomingNodeCoordinator.js +98 -13
- package/dist/esm/client/coordinators/WaLowLevelCoordinator.js +38 -0
- package/dist/esm/client/coordinators/WaMessageCoordinator.js +361 -0
- package/dist/esm/client/coordinators/WaMessageDispatchCoordinator.js +686 -208
- package/dist/esm/client/coordinators/WaNewsletterCoordinator.js +13 -0
- package/dist/esm/client/coordinators/WaPassiveTasksCoordinator.js +18 -5
- package/dist/esm/client/coordinators/WaPresenceCoordinator.js +18 -0
- package/dist/esm/client/coordinators/WaPrivacyCoordinator.js +7 -5
- package/dist/esm/client/coordinators/WaProfileCoordinator.js +223 -52
- package/dist/esm/client/coordinators/WaRetryCoordinator.js +258 -127
- package/dist/esm/client/coordinators/WaStatusCoordinator.js +46 -0
- package/dist/esm/client/coordinators/WaStreamControlCoordinator.js +6 -6
- package/dist/esm/client/coordinators/WaTrustedContactTokenCoordinator.js +7 -6
- package/dist/esm/client/events/appstate-mutation.js +130 -0
- package/dist/esm/client/events/business.js +370 -0
- package/dist/esm/client/events/call.js +55 -0
- package/dist/esm/client/events/chatstate.js +20 -0
- package/dist/esm/client/events/devices.js +15 -16
- package/dist/esm/client/{dirty.js → events/dirty.js} +33 -19
- package/dist/esm/client/events/group.js +14 -25
- package/dist/esm/client/events/identity.js +2 -1
- package/dist/esm/client/events/incoming.js +487 -0
- package/dist/esm/client/events/mex-notification.js +178 -0
- package/dist/esm/client/events/picture.js +30 -0
- package/dist/esm/client/events/presence.js +41 -0
- package/dist/esm/client/events/receipt.js +23 -0
- package/dist/esm/client/media.js +156 -6
- package/dist/esm/client/messaging/fanout.js +10 -11
- package/dist/esm/client/messaging/{participants.js → group-metadata.js} +72 -34
- package/dist/esm/client/messaging/ignore-key.js +126 -0
- package/dist/esm/client/messaging/key-protocol.js +3 -17
- package/dist/esm/client/messaging/link-preview.js +156 -0
- package/dist/esm/client/messaging/messages.js +667 -0
- package/dist/esm/client/newsletter/admin.js +162 -0
- package/dist/esm/client/newsletter/content.js +249 -0
- package/dist/esm/client/newsletter/discovery.js +112 -0
- package/dist/esm/client/newsletter/messaging.js +194 -0
- package/dist/esm/client/newsletter/mex.js +37 -0
- package/dist/esm/client/newsletter/parse.js +200 -0
- package/dist/esm/client/persistence/WriteBehindPersistence.js +31 -4
- package/dist/esm/client/{history-sync.js → persistence/history-sync.js} +124 -18
- package/dist/esm/client/persistence/mailbox.js +101 -0
- package/dist/esm/client/tokens/cs-token.js +12 -18
- package/dist/esm/crypto/core/hkdf.js +14 -14
- package/dist/esm/crypto/core/index.js +2 -2
- package/dist/esm/crypto/core/keys.js +1 -7
- package/dist/esm/crypto/core/nonce.js +11 -11
- package/dist/esm/crypto/core/primitives.js +121 -88
- package/dist/esm/crypto/core/random.js +6 -0
- package/dist/esm/crypto/core/xeddsa.js +11 -9
- package/dist/esm/crypto/curves/Ed25519.js +35 -24
- package/dist/esm/crypto/curves/X25519.js +72 -36
- package/dist/esm/crypto/curves/constants.js +1 -0
- package/dist/esm/crypto/math/constants.js +1 -2
- package/dist/esm/crypto/math/mod.js +0 -32
- package/dist/esm/index.js +7 -2
- package/dist/esm/infra/log/ConsoleLogger.js +30 -6
- package/dist/esm/infra/log/PinoLogger.js +64 -0
- package/dist/esm/infra/log/types.js +4 -2
- package/dist/esm/infra/perf/BackgroundQueue.js +55 -13
- package/dist/esm/media/constants.js +33 -2
- package/dist/esm/media/crypto/WaMediaCrypto.js +374 -0
- package/dist/esm/media/index.js +4 -3
- package/dist/esm/media/sticker/sticker-pack.js +133 -0
- package/dist/esm/media/{WaMediaTransferClient.js → transfer/WaMediaTransferClient.js} +37 -6
- package/dist/esm/media/{conn.js → transfer/conn.js} +10 -5
- package/dist/esm/message/WaMessageClient.js +46 -15
- package/dist/esm/message/addons/link-preview/builder.js +36 -0
- package/dist/esm/message/addons/link-preview/detect.js +55 -0
- package/dist/esm/message/addons/link-preview/fetcher.js +391 -0
- package/dist/esm/message/addons/link-preview/types.js +1 -0
- package/dist/esm/message/context-info.js +123 -0
- package/dist/esm/message/{addon-crypto.js → crypto/addon-crypto.js} +68 -10
- package/dist/esm/message/{icdc.js → crypto/icdc.js} +5 -7
- package/dist/esm/message/crypto/phash.js +133 -0
- package/dist/esm/message/{reporting-token.js → crypto/reporting-token.js} +6 -6
- package/dist/esm/message/{use-case-secret.js → crypto/use-case-secret.js} +20 -3
- package/dist/esm/message/{content.js → encode/content.js} +176 -7
- package/dist/esm/message/encode/media-payload.js +42 -0
- package/dist/esm/message/{padding.js → encode/padding.js} +9 -3
- package/dist/esm/message/index.js +2 -2
- package/dist/esm/message/kinds/bot.js +111 -0
- package/dist/esm/message/kinds/newsletter.js +244 -0
- package/dist/esm/message/kinds/sticker-pack.js +29 -0
- package/dist/esm/message/{ack.js → primitives/ack.js} +8 -1
- package/dist/esm/message/{incoming.js → primitives/incoming.js} +215 -31
- package/dist/esm/message/primitives/peer-data-operation.js +93 -0
- package/dist/esm/mex.js +1 -0
- package/dist/esm/protocol/abprops.js +10 -0
- package/dist/esm/protocol/appstate.js +6 -30
- package/dist/esm/protocol/auth.js +3 -2
- package/dist/esm/protocol/bot.js +77 -0
- package/dist/esm/protocol/browser.js +8 -0
- package/dist/esm/protocol/business.js +19 -0
- package/dist/esm/protocol/call.js +48 -0
- package/dist/esm/protocol/constants.js +8 -2
- package/dist/esm/protocol/defaults.js +3 -0
- package/dist/esm/protocol/index.js +1 -1
- package/dist/esm/protocol/jid.js +102 -5
- package/dist/esm/protocol/media.js +25 -12
- package/dist/esm/protocol/message.js +4 -1
- package/dist/esm/protocol/newsletter.js +61 -0
- package/dist/esm/protocol/nodes.js +22 -2
- package/dist/esm/protocol/notification.js +18 -2
- package/dist/esm/protocol/presence.js +13 -0
- package/dist/esm/protocol/status.js +6 -0
- package/dist/esm/retry/codec.js +5 -0
- package/dist/esm/retry/parse.js +20 -38
- package/dist/esm/retry/reason.js +5 -0
- package/dist/esm/retry/replay.js +131 -37
- package/dist/esm/retry/tracker.js +4 -8
- package/dist/esm/signal/api/SignalDeviceSyncApi.js +66 -19
- package/dist/esm/signal/api/SignalDigestSyncApi.js +7 -2
- package/dist/esm/signal/api/SignalIdentitySyncApi.js +9 -0
- package/dist/esm/signal/api/SignalMissingPreKeysSyncApi.js +24 -63
- package/dist/esm/signal/api/SignalRotateKeyApi.js +10 -0
- package/dist/esm/signal/api/SignalSessionSyncApi.js +23 -51
- package/dist/esm/signal/api/codec.js +52 -1
- package/dist/esm/signal/api/prekeys.js +4 -0
- package/dist/esm/signal/{crypto → attestation}/WaAdvSignature.js +5 -6
- package/dist/esm/signal/constants.js +3 -0
- package/dist/esm/signal/encoding.js +6 -289
- package/dist/esm/signal/group/SenderKeyChain.js +18 -33
- package/dist/esm/signal/group/SenderKeyManager.js +25 -8
- package/dist/esm/signal/group/encoding.js +96 -0
- package/dist/esm/signal/index.js +4 -1
- package/dist/esm/signal/registration/encoding.js +34 -0
- package/dist/esm/signal/registration/keygen.js +10 -0
- package/dist/esm/signal/registration/utils.js +6 -0
- package/dist/esm/signal/session/SignalProtocol.js +113 -11
- package/dist/esm/signal/session/SignalRatchet.js +29 -58
- package/dist/esm/signal/session/SignalSession.js +7 -14
- package/dist/esm/signal/session/encoding.js +173 -0
- package/dist/esm/signal/session/resolver.js +139 -30
- package/dist/esm/store/cache/identity.cache.js +75 -0
- package/dist/esm/store/cache/privacy-token.cache.js +57 -0
- package/dist/esm/store/cache/sender-key.cache.js +101 -0
- package/dist/esm/store/cache/session.cache.js +92 -0
- package/dist/esm/store/contracts/group-metadata.store.js +1 -0
- package/dist/esm/store/createStore.js +91 -37
- package/dist/esm/store/index.js +15 -14
- package/dist/esm/store/locks/contact.lock.js +1 -0
- package/dist/esm/store/locks/device-list.lock.js +1 -0
- package/dist/esm/store/locks/group-metadata.lock.js +20 -0
- package/dist/esm/store/{providers/memory → memory}/appstate.store.js +5 -5
- package/dist/esm/store/memory/auth.store.js +24 -0
- package/dist/esm/store/memory/contact.store.js +79 -0
- package/dist/esm/store/memory/device-list.store.js +103 -0
- package/dist/esm/store/{providers/memory/participants.store.js → memory/group-metadata.store.js} +22 -13
- package/dist/esm/store/{providers/memory → memory}/identity.store.js +3 -3
- package/dist/esm/store/{providers/memory → memory}/message-secret.store.js +17 -8
- package/dist/esm/store/{providers/memory → memory}/message.store.js +2 -2
- package/dist/esm/store/{providers/memory → memory}/pre-key.store.js +2 -2
- package/dist/esm/store/{providers/memory → memory}/privacy-token.store.js +1 -1
- package/dist/esm/store/{providers/memory → memory}/retry.store.js +28 -7
- package/dist/esm/store/{providers/memory → memory}/sender-key.store.js +3 -3
- package/dist/esm/store/{providers/memory → memory}/session.store.js +3 -3
- package/dist/esm/store/{providers/memory → memory}/thread.store.js +2 -2
- package/dist/esm/store/noop.store.js +6 -4
- package/dist/esm/transport/WaComms.js +14 -5
- package/dist/esm/transport/WaWebSocket.js +32 -8
- package/dist/esm/transport/binary/constants.js +10 -4
- package/dist/esm/transport/binary/decoder.js +21 -15
- package/dist/esm/transport/binary/encoder.js +96 -21
- package/dist/esm/transport/binary/tokens.js +12 -12
- package/dist/esm/transport/index.js +1 -0
- package/dist/esm/transport/keepalive/WaKeepAlive.js +18 -4
- package/dist/esm/transport/node/WaMobileTcpSocket.js +6 -0
- package/dist/esm/transport/node/WaNodeOrchestrator.js +9 -5
- package/dist/esm/transport/node/WaNodeTransport.js +13 -0
- package/dist/esm/transport/node/builders/abprops.js +2 -2
- package/dist/esm/transport/node/builders/account-sync.js +7 -15
- package/dist/esm/transport/node/builders/bot.js +38 -0
- package/dist/esm/transport/node/builders/business.js +30 -30
- package/dist/esm/transport/node/builders/chatstate.js +28 -0
- package/dist/esm/transport/node/builders/community.js +53 -0
- package/dist/esm/transport/node/builders/device.js +2 -2
- package/dist/esm/transport/node/builders/email.js +6 -5
- package/dist/esm/transport/node/builders/global.js +1 -1
- package/dist/esm/transport/node/builders/group.js +114 -4
- package/dist/esm/transport/node/builders/media.js +2 -2
- package/dist/esm/transport/node/builders/message.js +83 -49
- package/dist/esm/transport/node/builders/newsletter.js +176 -0
- package/dist/esm/transport/node/builders/passive.js +7 -0
- package/dist/esm/transport/node/builders/prekeys.js +4 -4
- package/dist/esm/transport/node/builders/presence.js +27 -1
- package/dist/esm/transport/node/builders/privacy-token.js +2 -2
- package/dist/esm/transport/node/builders/privacy.js +6 -6
- package/dist/esm/transport/node/builders/profile.js +28 -8
- package/dist/esm/transport/node/builders/tos.js +58 -0
- package/dist/esm/transport/node/builders/usync.js +51 -2
- package/dist/esm/transport/node/helpers.js +3 -1
- package/dist/esm/transport/node/mex/argo-decoder.js +2 -2
- package/dist/esm/transport/node/mex/client.js +22 -0
- package/dist/esm/transport/node/query.js +17 -0
- package/dist/esm/transport/node/usync.js +12 -0
- package/dist/esm/transport/noise/WaClientPayload.js +8 -8
- package/dist/esm/transport/noise/WaMobileClientPayload.js +5 -0
- package/dist/esm/transport/noise/WaNoiseCert.js +5 -0
- package/dist/esm/transport/noise/WaNoiseHandshake.js +27 -25
- package/dist/esm/transport/noise/WaNoiseSession.js +39 -59
- package/dist/esm/transport/noise/WaNoiseSocket.js +19 -13
- package/dist/esm/transport/noise/constants.js +0 -1
- package/dist/esm/transport/proxy.js +5 -0
- package/dist/esm/transport/stream/parse.js +3 -7
- package/dist/esm/transport/wa-web-version-fetcher.js +91 -0
- package/dist/esm/util/async.js +4 -0
- package/dist/esm/util/bytes.js +37 -2
- package/dist/esm/util/clock.js +15 -0
- package/dist/esm/util/coercion.js +45 -3
- package/dist/esm/util/collections.js +11 -0
- package/dist/esm/util/index.js +2 -2
- package/dist/esm/util/primitives.js +19 -0
- package/dist/esm/util/runtime.js +5 -0
- package/dist/esm/version-spec.js +1 -0
- package/dist/index.js +31 -1
- package/dist/infra/log/ConsoleLogger.js +30 -6
- package/dist/infra/log/PinoLogger.js +64 -0
- package/dist/infra/log/types.js +4 -2
- package/dist/infra/perf/BackgroundQueue.js +55 -13
- package/dist/media/constants.js +34 -3
- package/dist/media/crypto/WaMediaCrypto.js +378 -0
- package/dist/media/index.js +9 -4
- package/dist/media/sticker/sticker-pack.js +136 -0
- package/dist/media/{WaMediaTransferClient.js → transfer/WaMediaTransferClient.js} +37 -6
- package/dist/media/{conn.js → transfer/conn.js} +10 -5
- package/dist/message/WaMessageClient.js +46 -15
- package/dist/message/addons/link-preview/builder.js +39 -0
- package/dist/message/addons/link-preview/detect.js +58 -0
- package/dist/message/addons/link-preview/fetcher.js +394 -0
- package/dist/message/addons/link-preview/types.js +2 -0
- package/dist/message/context-info.js +129 -0
- package/dist/message/{addon-crypto.js → crypto/addon-crypto.js} +68 -10
- package/dist/message/{icdc.js → crypto/icdc.js} +5 -7
- package/dist/message/crypto/phash.js +136 -0
- package/dist/message/{reporting-token.js → crypto/reporting-token.js} +6 -6
- package/dist/message/{use-case-secret.js → crypto/use-case-secret.js} +20 -3
- package/dist/message/{content.js → encode/content.js} +192 -7
- package/dist/message/encode/media-payload.js +45 -0
- package/dist/message/{padding.js → encode/padding.js} +9 -3
- package/dist/message/index.js +2 -2
- package/dist/message/kinds/bot.js +120 -0
- package/dist/message/kinds/newsletter.js +248 -0
- package/dist/message/kinds/sticker-pack.js +34 -0
- package/dist/message/{ack.js → primitives/ack.js} +8 -1
- package/dist/message/{incoming.js → primitives/incoming.js} +216 -31
- package/dist/message/primitives/peer-data-operation.js +96 -0
- package/dist/mex.js +6 -0
- package/dist/proto.js +1 -1
- package/dist/protocol/abprops.js +10 -0
- package/dist/protocol/appstate.js +7 -31
- package/dist/protocol/auth.js +3 -2
- package/dist/protocol/bot.js +81 -0
- package/dist/protocol/browser.js +8 -0
- package/dist/protocol/business.js +22 -0
- package/dist/protocol/call.js +51 -0
- package/dist/protocol/constants.js +39 -3
- package/dist/protocol/defaults.js +3 -0
- package/dist/protocol/index.js +12 -3
- package/dist/protocol/jid.js +107 -5
- package/dist/protocol/media.js +25 -12
- package/dist/protocol/message.js +4 -1
- package/dist/protocol/newsletter.js +64 -0
- package/dist/protocol/nodes.js +22 -2
- package/dist/protocol/notification.js +19 -3
- package/dist/protocol/presence.js +16 -0
- package/dist/protocol/status.js +9 -0
- package/dist/retry/codec.js +5 -0
- package/dist/retry/parse.js +16 -34
- package/dist/retry/reason.js +5 -0
- package/dist/retry/replay.js +129 -35
- package/dist/retry/tracker.js +3 -7
- package/dist/signal/api/SignalDeviceSyncApi.js +64 -17
- package/dist/signal/api/SignalDigestSyncApi.js +6 -1
- package/dist/signal/api/SignalIdentitySyncApi.js +9 -0
- package/dist/signal/api/SignalMissingPreKeysSyncApi.js +21 -60
- package/dist/signal/api/SignalRotateKeyApi.js +10 -0
- package/dist/signal/api/SignalSessionSyncApi.js +20 -48
- package/dist/signal/api/codec.js +52 -0
- package/dist/signal/api/prekeys.js +4 -0
- package/dist/signal/{crypto → attestation}/WaAdvSignature.js +5 -7
- package/dist/signal/constants.js +4 -1
- package/dist/signal/encoding.js +5 -303
- package/dist/signal/group/SenderKeyChain.js +17 -32
- package/dist/signal/group/SenderKeyManager.js +24 -7
- package/dist/signal/group/encoding.js +101 -0
- package/dist/signal/index.js +13 -10
- package/dist/signal/registration/encoding.js +39 -0
- package/dist/signal/registration/keygen.js +10 -0
- package/dist/signal/registration/utils.js +6 -0
- package/dist/signal/session/SignalProtocol.js +112 -10
- package/dist/signal/session/SignalRatchet.js +24 -54
- package/dist/signal/session/SignalSession.js +6 -14
- package/dist/signal/session/encoding.js +183 -0
- package/dist/signal/session/resolver.js +139 -30
- package/dist/store/cache/identity.cache.js +78 -0
- package/dist/store/cache/privacy-token.cache.js +60 -0
- package/dist/store/cache/sender-key.cache.js +104 -0
- package/dist/store/cache/session.cache.js +95 -0
- package/dist/store/contracts/group-metadata.store.js +2 -0
- package/dist/store/createStore.js +90 -36
- package/dist/store/index.js +18 -16
- package/dist/store/locks/contact.lock.js +1 -0
- package/dist/store/locks/device-list.lock.js +1 -0
- package/dist/store/locks/group-metadata.lock.js +23 -0
- package/dist/store/{providers/memory → memory}/appstate.store.js +5 -5
- package/dist/store/memory/auth.store.js +28 -0
- package/dist/store/memory/contact.store.js +83 -0
- package/dist/store/memory/device-list.store.js +107 -0
- package/dist/store/{providers/memory/participants.store.js → memory/group-metadata.store.js} +24 -15
- package/dist/store/{providers/memory → memory}/identity.store.js +3 -3
- package/dist/store/{providers/memory → memory}/message-secret.store.js +17 -8
- package/dist/store/{providers/memory → memory}/message.store.js +2 -2
- package/dist/store/{providers/memory → memory}/pre-key.store.js +2 -2
- package/dist/store/{providers/memory → memory}/privacy-token.store.js +1 -1
- package/dist/store/{providers/memory → memory}/retry.store.js +28 -7
- package/dist/store/{providers/memory → memory}/sender-key.store.js +3 -3
- package/dist/store/{providers/memory → memory}/session.store.js +3 -3
- package/dist/store/{providers/memory → memory}/thread.store.js +2 -2
- package/dist/store/noop.store.js +7 -5
- package/dist/transport/WaComms.js +14 -5
- package/dist/transport/WaWebSocket.js +32 -8
- package/dist/transport/binary/constants.js +11 -5
- package/dist/transport/binary/decoder.js +24 -18
- package/dist/transport/binary/encoder.js +109 -34
- package/dist/transport/binary/tokens.js +12 -12
- package/dist/transport/index.js +3 -1
- package/dist/transport/keepalive/WaKeepAlive.js +18 -4
- package/dist/transport/node/WaMobileTcpSocket.js +6 -0
- package/dist/transport/node/WaNodeOrchestrator.js +9 -5
- package/dist/transport/node/WaNodeTransport.js +13 -0
- package/dist/transport/node/builders/abprops.js +1 -1
- package/dist/transport/node/builders/account-sync.js +7 -16
- package/dist/transport/node/builders/bot.js +43 -0
- package/dist/transport/node/builders/business.js +31 -31
- package/dist/transport/node/builders/chatstate.js +31 -0
- package/dist/transport/node/builders/community.js +59 -0
- package/dist/transport/node/builders/device.js +1 -1
- package/dist/transport/node/builders/email.js +6 -5
- package/dist/transport/node/builders/global.js +1 -1
- package/dist/transport/node/builders/group.js +121 -3
- package/dist/transport/node/builders/media.js +1 -1
- package/dist/transport/node/builders/message.js +84 -49
- package/dist/transport/node/builders/newsletter.js +183 -0
- package/dist/transport/node/builders/passive.js +10 -0
- package/dist/transport/node/builders/prekeys.js +3 -3
- package/dist/transport/node/builders/presence.js +28 -1
- package/dist/transport/node/builders/privacy-token.js +1 -1
- package/dist/transport/node/builders/privacy.js +5 -5
- package/dist/transport/node/builders/profile.js +30 -7
- package/dist/transport/node/builders/tos.js +63 -0
- package/dist/transport/node/builders/usync.js +52 -1
- package/dist/transport/node/helpers.js +2 -1
- package/dist/transport/node/mex/argo-decoder.js +2 -2
- package/dist/transport/node/mex/client.js +23 -0
- package/dist/transport/node/query.js +17 -0
- package/dist/transport/node/usync.js +13 -0
- package/dist/transport/noise/WaClientPayload.js +8 -8
- package/dist/transport/noise/WaMobileClientPayload.js +5 -0
- package/dist/transport/noise/WaNoiseCert.js +5 -0
- package/dist/transport/noise/WaNoiseHandshake.js +25 -23
- package/dist/transport/noise/WaNoiseSession.js +39 -59
- package/dist/transport/noise/WaNoiseSocket.js +18 -12
- package/dist/transport/noise/constants.js +1 -2
- package/dist/transport/proxy.js +5 -0
- package/dist/transport/stream/parse.js +3 -7
- package/dist/transport/wa-web-version-fetcher.js +94 -0
- package/dist/types/appstate/constants.d.ts +1 -1
- package/dist/types/appstate/{WaAppStateCrypto.d.ts → crypto/WaAppStateCrypto.d.ts} +26 -9
- package/dist/types/appstate/index.d.ts +5 -5
- package/dist/types/appstate/{encoding.d.ts → parsers/encoding.d.ts} +8 -1
- package/dist/types/appstate/{response-parser.d.ts → parsers/response-parser.d.ts} +13 -3
- package/dist/types/appstate/sync/WaAppStateSyncClient.d.ts +105 -0
- package/dist/types/appstate/utils.d.ts +17 -1
- package/dist/types/appstate-spec.d.ts +24 -0
- package/dist/types/auth/WaAuthClient.d.ts +89 -3
- package/dist/types/auth/credentials-flow.d.ts +4 -3
- package/dist/types/auth/pairing/pairing-code-crypto.d.ts +0 -1
- package/dist/types/auth/types.d.ts +48 -1
- package/dist/types/client/WaClient.d.ts +178 -71
- package/dist/types/client/WaClientFactory.d.ts +30 -5
- package/dist/types/client/connection/WaConnectionManager.d.ts +4 -2
- package/dist/types/client/connection/WaReceiptQueue.d.ts +1 -1
- package/dist/types/client/coordinators/WaAppStateMutationCoordinator.d.ts +215 -5
- package/dist/types/client/coordinators/WaBotCoordinator.d.ts +117 -0
- package/dist/types/client/coordinators/WaBroadcastListCoordinator.d.ts +39 -0
- package/dist/types/client/coordinators/WaBusinessCoordinator.d.ts +44 -43
- package/dist/types/client/coordinators/WaEmailCoordinator.d.ts +16 -0
- package/dist/types/client/coordinators/WaGroupCoordinator.d.ts +311 -9
- package/dist/types/client/coordinators/WaIncomingNodeCoordinator.d.ts +11 -4
- package/dist/types/client/coordinators/WaLowLevelCoordinator.d.ts +47 -0
- package/dist/types/client/coordinators/WaMessageCoordinator.d.ts +232 -0
- package/dist/types/client/coordinators/WaMessageDispatchCoordinator.d.ts +54 -31
- package/dist/types/client/coordinators/WaNewsletterCoordinator.d.ts +13 -0
- package/dist/types/client/coordinators/WaPassiveTasksCoordinator.d.ts +4 -3
- package/dist/types/client/coordinators/WaPresenceCoordinator.d.ts +27 -0
- package/dist/types/client/coordinators/WaPrivacyCoordinator.d.ts +27 -0
- package/dist/types/client/coordinators/WaProfileCoordinator.d.ts +113 -0
- package/dist/types/client/coordinators/WaRetryCoordinator.d.ts +19 -17
- package/dist/types/client/coordinators/WaStatusCoordinator.d.ts +42 -0
- package/dist/types/client/coordinators/WaTrustedContactTokenCoordinator.d.ts +5 -1
- package/dist/types/client/events/abprops.d.ts +2 -1
- package/dist/types/client/events/appstate-mutation.d.ts +3 -0
- package/dist/types/client/events/business.d.ts +10 -0
- package/dist/types/client/events/call.d.ts +31 -0
- package/dist/types/client/events/chatstate.d.ts +9 -0
- package/dist/types/client/events/devices.d.ts +5 -4
- package/dist/types/client/{dirty.d.ts → events/dirty.d.ts} +4 -3
- package/dist/types/client/events/group.d.ts +2 -1
- package/dist/types/client/events/identity.d.ts +2 -1
- package/dist/types/client/{incoming.d.ts → events/incoming.d.ts} +27 -4
- package/dist/types/client/events/mex-notification.d.ts +6 -0
- package/dist/types/client/events/picture.d.ts +8 -0
- package/dist/types/client/events/presence.d.ts +28 -0
- package/dist/types/client/events/receipt.d.ts +14 -0
- package/dist/types/client/events/registration.d.ts +4 -3
- package/dist/types/client/index.d.ts +1 -1
- package/dist/types/client/media.d.ts +35 -1
- package/dist/types/client/messaging/fanout.d.ts +2 -2
- package/dist/types/client/messaging/group-metadata.d.ts +19 -0
- package/dist/types/client/messaging/ignore-key.d.ts +11 -0
- package/dist/types/client/messaging/key-protocol.d.ts +9 -7
- package/dist/types/client/messaging/link-preview.d.ts +19 -0
- package/dist/types/client/messaging/messages.d.ts +28 -0
- package/dist/types/client/newsletter/admin.d.ts +71 -0
- package/dist/types/client/newsletter/content.d.ts +42 -0
- package/dist/types/client/newsletter/discovery.d.ts +33 -0
- package/dist/types/client/newsletter/messaging.d.ts +66 -0
- package/dist/types/client/newsletter/mex.d.ts +14 -0
- package/dist/types/client/newsletter/parse.d.ts +19 -0
- package/dist/types/client/newsletter/types.d.ts +190 -0
- package/dist/types/client/persistence/WriteBehindPersistence.d.ts +12 -1
- package/dist/types/client/persistence/history-sync.d.ts +29 -0
- package/dist/types/client/{mailbox.d.ts → persistence/mailbox.d.ts} +4 -4
- package/dist/types/client/tokens/cs-token.d.ts +1 -3
- package/dist/types/client/types.d.ts +843 -71
- package/dist/types/crypto/core/hkdf.d.ts +10 -2
- package/dist/types/crypto/core/index.d.ts +2 -2
- package/dist/types/crypto/core/keys.d.ts +0 -4
- package/dist/types/crypto/core/nonce.d.ts +4 -5
- package/dist/types/crypto/core/primitives.d.ts +31 -20
- package/dist/types/crypto/core/random.d.ts +6 -0
- package/dist/types/crypto/core/xeddsa.d.ts +9 -0
- package/dist/types/crypto/curves/Ed25519.d.ts +7 -1
- package/dist/types/crypto/curves/X25519.d.ts +20 -1
- package/dist/types/crypto/curves/constants.d.ts +4 -3
- package/dist/types/crypto/curves/types.d.ts +0 -5
- package/dist/types/crypto/math/constants.d.ts +0 -1
- package/dist/types/crypto/math/mod.d.ts +0 -1
- package/dist/types/index.d.ts +32 -6
- package/dist/types/infra/log/ConsoleLogger.d.ts +18 -1
- package/dist/types/infra/log/PinoLogger.d.ts +55 -1
- package/dist/types/infra/log/types.d.ts +6 -0
- package/dist/types/infra/perf/BackgroundQueue.d.ts +19 -0
- package/dist/types/media/constants.d.ts +7 -2
- package/dist/types/media/crypto/WaMediaCrypto.d.ts +59 -0
- package/dist/types/media/index.d.ts +7 -5
- package/dist/types/media/processor.d.ts +27 -5
- package/dist/types/media/sticker/sticker-pack.d.ts +6 -0
- package/dist/types/media/{WaMediaTransferClient.d.ts → transfer/WaMediaTransferClient.d.ts} +30 -1
- package/dist/types/media/transfer/conn.d.ts +7 -0
- package/dist/types/media/types.d.ts +1 -2
- package/dist/types/message/WaMessageClient.d.ts +14 -0
- package/dist/types/message/addons/link-preview/builder.d.ts +13 -0
- package/dist/types/message/addons/link-preview/detect.d.ts +5 -0
- package/dist/types/message/addons/link-preview/fetcher.d.ts +13 -0
- package/dist/types/message/addons/link-preview/types.d.ts +51 -0
- package/dist/types/message/context-info.d.ts +66 -0
- package/dist/types/message/{addon-crypto.d.ts → crypto/addon-crypto.d.ts} +27 -5
- package/dist/types/message/{icdc.d.ts → crypto/icdc.d.ts} +4 -4
- package/dist/types/message/{phash.d.ts → crypto/phash.d.ts} +1 -1
- package/dist/types/message/{reporting-token.d.ts → crypto/reporting-token.d.ts} +2 -2
- package/dist/types/message/{use-case-secret.d.ts → crypto/use-case-secret.d.ts} +17 -1
- package/dist/types/message/encode/content.d.ts +43 -0
- package/dist/types/message/{device-sent.d.ts → encode/device-sent.d.ts} +1 -1
- package/dist/types/message/encode/media-payload.d.ts +12 -0
- package/dist/types/message/index.d.ts +2 -2
- package/dist/types/message/kinds/bot.d.ts +31 -0
- package/dist/types/message/kinds/newsletter.d.ts +12 -0
- package/dist/types/message/kinds/sticker-pack.d.ts +6 -0
- package/dist/types/message/{ack.d.ts → primitives/ack.d.ts} +1 -1
- package/dist/types/message/primitives/incoming.d.ts +21 -0
- package/dist/types/message/primitives/peer-data-operation.d.ts +23 -0
- package/dist/types/message/types.d.ts +208 -10
- package/dist/types/mex.d.ts +2 -0
- package/dist/types/proto.d.ts +2 -2
- package/dist/types/protocol/abprops.d.ts +9 -0
- package/dist/types/protocol/appstate.d.ts +4 -49
- package/dist/types/protocol/auth.d.ts +2 -2
- package/dist/types/protocol/bot.d.ts +45 -0
- package/dist/types/protocol/browser.d.ts +8 -0
- package/dist/types/protocol/business.d.ts +21 -0
- package/dist/types/protocol/call.d.ts +44 -0
- package/dist/types/protocol/constants.d.ts +16 -3
- package/dist/types/protocol/defaults.d.ts +3 -0
- package/dist/types/protocol/group.d.ts +1 -1
- package/dist/types/protocol/index.d.ts +2 -1
- package/dist/types/protocol/jid.d.ts +78 -0
- package/dist/types/protocol/media.d.ts +21 -13
- package/dist/types/protocol/message.d.ts +4 -0
- package/dist/types/protocol/newsletter.d.ts +65 -0
- package/dist/types/protocol/nodes.d.ts +20 -0
- package/dist/types/protocol/notification.d.ts +16 -0
- package/dist/types/protocol/presence.d.ts +16 -0
- package/dist/types/protocol/status.d.ts +7 -0
- package/dist/types/retry/codec.d.ts +5 -0
- package/dist/types/retry/index.d.ts +1 -1
- package/dist/types/retry/parse.d.ts +9 -0
- package/dist/types/retry/reason.d.ts +5 -0
- package/dist/types/retry/replay.d.ts +19 -5
- package/dist/types/retry/tracker.d.ts +10 -3
- package/dist/types/retry/types.d.ts +3 -8
- package/dist/types/signal/api/SignalDeviceSyncApi.d.ts +20 -0
- package/dist/types/signal/api/SignalDigestSyncApi.d.ts +10 -0
- package/dist/types/signal/api/SignalIdentitySyncApi.d.ts +9 -0
- package/dist/types/signal/api/SignalMissingPreKeysSyncApi.d.ts +8 -0
- package/dist/types/signal/api/SignalRotateKeyApi.d.ts +10 -0
- package/dist/types/signal/api/SignalSessionSyncApi.d.ts +13 -0
- package/dist/types/signal/api/codec.d.ts +20 -0
- package/dist/types/signal/api/constants.d.ts +1 -1
- package/dist/types/signal/api/prekeys.d.ts +4 -0
- package/dist/types/signal/{crypto → attestation}/WaAdvSignature.d.ts +2 -2
- package/dist/types/signal/attestation/constants.d.ts +4 -0
- package/dist/types/signal/constants.d.ts +7 -4
- package/dist/types/signal/encoding.d.ts +6 -68
- package/dist/types/signal/group/SenderKeyChain.d.ts +1 -1
- package/dist/types/signal/group/SenderKeyManager.d.ts +17 -0
- package/dist/types/signal/group/encoding.d.ts +25 -0
- package/dist/types/signal/index.d.ts +4 -1
- package/dist/types/signal/registration/encoding.d.ts +30 -0
- package/dist/types/signal/registration/keygen.d.ts +10 -0
- package/dist/types/signal/registration/utils.d.ts +5 -0
- package/dist/types/signal/session/SignalProtocol.d.ts +55 -0
- package/dist/types/signal/session/SignalRatchet.d.ts +2 -3
- package/dist/types/signal/session/SignalSession.d.ts +0 -1
- package/dist/types/signal/session/encoding.d.ts +28 -0
- package/dist/types/signal/session/resolver.d.ts +14 -0
- package/dist/types/store/cache/identity.cache.d.ts +15 -0
- package/dist/types/store/cache/privacy-token.cache.d.ts +15 -0
- package/dist/types/store/cache/sender-key.cache.d.ts +18 -0
- package/dist/types/store/cache/session.cache.d.ts +23 -0
- package/dist/types/store/contracts/contact.store.d.ts +14 -0
- package/dist/types/store/contracts/device-list.store.d.ts +13 -0
- package/dist/types/store/contracts/group-metadata.store.d.ts +14 -0
- package/dist/types/store/contracts/message.store.d.ts +0 -2
- package/dist/types/store/createStore.d.ts +54 -2
- package/dist/types/store/index.d.ts +17 -16
- package/dist/types/store/locks/group-metadata.lock.d.ts +2 -0
- package/dist/types/store/{providers/memory → memory}/appstate.store.d.ts +2 -2
- package/dist/types/store/memory/auth.store.d.ts +18 -0
- package/dist/types/store/{providers/memory → memory}/contact.store.d.ts +6 -1
- package/dist/types/store/{providers/memory → memory}/device-list.store.d.ts +15 -2
- package/dist/types/store/memory/group-metadata.store.d.ts +27 -0
- package/dist/types/store/{providers/memory → memory}/identity.store.d.ts +2 -2
- package/dist/types/store/{providers/memory → memory}/message-secret.store.d.ts +12 -2
- package/dist/types/store/{providers/memory → memory}/message.store.d.ts +1 -1
- package/dist/types/store/{providers/memory → memory}/pre-key.store.d.ts +2 -2
- package/dist/types/store/{providers/memory → memory}/privacy-token.store.d.ts +1 -1
- package/dist/types/store/{providers/memory → memory}/retry.store.d.ts +16 -3
- package/dist/types/store/{providers/memory → memory}/sender-key.store.d.ts +2 -2
- package/dist/types/store/{providers/memory → memory}/session.store.d.ts +2 -2
- package/dist/types/store/{providers/memory → memory}/signal.store.d.ts +2 -2
- package/dist/types/store/{providers/memory → memory}/thread.store.d.ts +1 -1
- package/dist/types/store/noop.store.d.ts +2 -2
- package/dist/types/store/types.d.ts +250 -6
- package/dist/types/transport/WaComms.d.ts +5 -0
- package/dist/types/transport/WaWebSocket.d.ts +5 -0
- package/dist/types/transport/binary/constants.d.ts +8 -2
- package/dist/types/transport/binary/decoder.d.ts +5 -0
- package/dist/types/transport/binary/encoder.d.ts +5 -0
- package/dist/types/transport/binary/tokens.d.ts +6 -6
- package/dist/types/transport/index.d.ts +3 -1
- package/dist/types/transport/keepalive/WaKeepAlive.d.ts +7 -0
- package/dist/types/transport/node/WaMobileTcpSocket.d.ts +6 -0
- package/dist/types/transport/node/WaNodeOrchestrator.d.ts +5 -0
- package/dist/types/transport/node/WaNodeTransport.d.ts +13 -0
- package/dist/types/transport/node/builders/account-sync.d.ts +1 -2
- package/dist/types/transport/node/builders/bot.d.ts +4 -0
- package/dist/types/transport/node/builders/business.d.ts +21 -4
- package/dist/types/transport/node/builders/chatstate.d.ts +11 -0
- package/dist/types/transport/node/builders/community.d.ts +17 -0
- package/dist/types/transport/node/builders/group.d.ts +44 -2
- package/dist/types/transport/node/builders/message.d.ts +11 -6
- package/dist/types/transport/node/builders/newsletter.d.ts +73 -0
- package/dist/types/transport/node/builders/passive.d.ts +3 -0
- package/dist/types/transport/node/builders/presence.d.ts +8 -1
- package/dist/types/transport/node/builders/profile.d.ts +3 -0
- package/dist/types/transport/node/builders/tos.d.ts +12 -0
- package/dist/types/transport/node/builders/usync.d.ts +16 -0
- package/dist/types/transport/node/helpers.d.ts +1 -2
- package/dist/types/transport/node/mex/client.d.ts +12 -1
- package/dist/types/transport/node/query.d.ts +19 -1
- package/dist/types/transport/node/usync.d.ts +3 -0
- package/dist/types/transport/noise/WaMobileClientPayload.d.ts +5 -0
- package/dist/types/transport/noise/WaNoiseCert.d.ts +5 -0
- package/dist/types/transport/noise/WaNoiseHandshake.d.ts +12 -6
- package/dist/types/transport/noise/WaNoiseSession.d.ts +0 -1
- package/dist/types/transport/noise/WaNoiseSocket.d.ts +12 -6
- package/dist/types/transport/noise/constants.d.ts +4 -5
- package/dist/types/transport/proxy.d.ts +5 -0
- package/dist/types/transport/types.d.ts +14 -7
- package/dist/types/transport/wa-web-version-fetcher.d.ts +44 -0
- package/dist/types/util/async.d.ts +4 -0
- package/dist/types/util/bytes.d.ts +36 -1
- package/dist/types/util/clock.d.ts +6 -0
- package/dist/types/util/coercion.d.ts +25 -0
- package/dist/types/util/collections.d.ts +8 -0
- package/dist/types/util/index.d.ts +2 -2
- package/dist/types/util/primitives.d.ts +11 -0
- package/dist/types/util/runtime.d.ts +5 -0
- package/dist/types/version-spec.d.ts +1 -0
- package/dist/util/async.js +4 -0
- package/dist/util/bytes.js +37 -2
- package/dist/util/clock.js +18 -0
- package/dist/util/coercion.js +48 -3
- package/dist/util/collections.js +12 -0
- package/dist/util/index.js +7 -1
- package/dist/util/primitives.js +20 -0
- package/dist/util/runtime.js +5 -0
- package/dist/version-spec.js +5 -0
- package/package.json +32 -8
- package/spec/appstate/index.d.ts +188 -0
- package/spec/appstate/index.js +850 -0
- package/spec/mex/index.d.ts +4172 -0
- package/spec/mex/index.js +261 -0
- package/spec/proto/index.d.ts +16305 -0
- package/spec/proto/index.js +1 -0
- package/spec/version/index.d.ts +4 -0
- package/spec/version/index.js +9 -0
- package/spec/version/version.json +3 -0
- package/dist/client/events/chat.js +0 -227
- package/dist/client/incoming.js +0 -306
- package/dist/client/mailbox.js +0 -66
- package/dist/client/messages.js +0 -305
- package/dist/esm/client/events/chat.js +0 -224
- package/dist/esm/client/incoming.js +0 -296
- package/dist/esm/client/mailbox.js +0 -63
- package/dist/esm/client/messages.js +0 -301
- package/dist/esm/media/WaMediaCrypto.js +0 -499
- package/dist/esm/message/phash.js +0 -47
- package/dist/esm/store/locks/participants.lock.js +0 -20
- package/dist/esm/store/providers/memory/contact.store.js +0 -28
- package/dist/esm/store/providers/memory/device-list.store.js +0 -67
- package/dist/esm/transport/node/mex/persist-ids.js +0 -10
- package/dist/media/WaMediaCrypto.js +0 -503
- package/dist/message/phash.js +0 -50
- package/dist/store/locks/participants.lock.js +0 -23
- package/dist/store/providers/memory/contact.store.js +0 -32
- package/dist/store/providers/memory/device-list.store.js +0 -71
- package/dist/transport/node/mex/persist-ids.js +0 -13
- package/dist/types/appstate/WaAppStateSyncClient.d.ts +0 -70
- package/dist/types/client/events/chat.d.ts +0 -3
- package/dist/types/client/history-sync.d.ts +0 -20
- package/dist/types/client/messages.d.ts +0 -18
- package/dist/types/client/messaging/participants.d.ts +0 -13
- package/dist/types/media/WaMediaCrypto.d.ts +0 -22
- package/dist/types/media/conn.d.ts +0 -3
- package/dist/types/message/content.d.ts +0 -14
- package/dist/types/message/incoming.d.ts +0 -18
- package/dist/types/signal/crypto/constants.d.ts +0 -4
- package/dist/types/store/contracts/participants.store.d.ts +0 -13
- package/dist/types/store/locks/participants.lock.d.ts +0 -2
- package/dist/types/store/providers/memory/participants.store.d.ts +0 -17
- package/dist/types/transport/node/mex/persist-ids.d.ts +0 -14
- package/proto/index.d.ts +0 -10903
- package/proto/index.js +0 -1
- /package/dist/{store/contracts/participants.store.js → client/newsletter/types.js} +0 -0
- /package/dist/esm/{store/contracts/participants.store.js → client/newsletter/types.js} +0 -0
- /package/dist/esm/message/{device-sent.js → encode/device-sent.js} +0 -0
- /package/dist/esm/signal/{crypto → attestation}/constants.js +0 -0
- /package/dist/esm/store/{providers/memory → memory}/signal.store.js +0 -0
- /package/dist/message/{device-sent.js → encode/device-sent.js} +0 -0
- /package/dist/signal/{crypto → attestation}/constants.js +0 -0
- /package/dist/store/{providers/memory → memory}/signal.store.js +0 -0
- /package/dist/types/message/{padding.d.ts → encode/padding.d.ts} +0 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 vinikjkkj <contact@vinicius.email>
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -16,117 +16,55 @@
|
|
|
16
16
|
<img alt="focus" src="https://img.shields.io/badge/focus-high--scale%20%2B%20multi--session-0A7EA4" />
|
|
17
17
|
</p>
|
|
18
18
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
- [Architecture at a Glance](#architecture-at-a-glance)
|
|
25
|
-
- [Requirements](#requirements)
|
|
26
|
-
- [Quick Start](#quick-start)
|
|
27
|
-
- [Minimal Usage](#minimal-usage)
|
|
28
|
-
- [Useful Scripts](#useful-scripts)
|
|
29
|
-
- [Versioning and Releases](#versioning-and-releases)
|
|
30
|
-
- [GitHub Release Notes](#github-release-notes)
|
|
31
|
-
- [Protobuf Generation](#protobuf-generation)
|
|
32
|
-
- [Support the Project](#support-the-project)
|
|
33
|
-
- [Contribution Notes](#contribution-notes)
|
|
34
|
-
- [Disclaimer](#disclaimer)
|
|
35
|
-
|
|
36
|
-
## Stability Notice
|
|
37
|
-
|
|
38
|
-
> Frequent breaking changes are expected until the first major release.
|
|
39
|
-
> If you run `zapo` in long-lived environments, pin exact versions and validate upgrades carefully.
|
|
40
|
-
|
|
41
|
-
## What Makes This Project Different
|
|
42
|
-
|
|
43
|
-
`zapo` is an independent runtime implementation (not a wrapper/fork of an existing WhatsApp library).
|
|
44
|
-
|
|
45
|
-
- No wrappers around third-party WhatsApp SDKs
|
|
46
|
-
- No forks of existing WhatsApp client libraries
|
|
47
|
-
- No copied protocol abstractions from community libraries
|
|
48
|
-
- `WAProto.proto` is sourced from `wppconnect-team/wa-proto` and compiled locally for runtime/types
|
|
49
|
-
|
|
50
|
-
The protocol source of truth is the deobfuscated WhatsApp Web.
|
|
51
|
-
The target is behavior parity with WhatsApp Web, while improving internal performance and memory efficiency.
|
|
52
|
-
|
|
53
|
-
## Core Principles
|
|
54
|
-
|
|
55
|
-
These principles drive implementation decisions:
|
|
56
|
-
|
|
57
|
-
- `index-first`: validate protocol behavior against WhatsApp Web before implementing anything
|
|
58
|
-
- `performance-first`: optimize for low CPU, low RAM, low allocations, and zero-copy in hot paths
|
|
59
|
-
- `async-first`: I/O, network, and crypto operations are async
|
|
60
|
-
|
|
61
|
-
## Architecture at a Glance
|
|
62
|
-
|
|
63
|
-
### Patterns
|
|
64
|
-
|
|
65
|
-
- Coordinator-first feature design in `src/client/coordinators/`
|
|
66
|
-
- Pure node builders in `src/transport/node/builders/` for reusable protocol stanzas
|
|
67
|
-
- Incoming parsers/normalizers in `src/client/events/`, with coordinators handling orchestration only
|
|
68
|
-
- Typed store contracts in `src/store/contracts/` with `memory` and `sqlite` providers
|
|
69
|
-
- Protocol constants in `src/protocol/` using `Object.freeze({...} as const)`
|
|
70
|
-
|
|
71
|
-
### Engineering conventions
|
|
72
|
-
|
|
73
|
-
- `Uint8Array` everywhere for binary data (`Buffer` is avoided)
|
|
74
|
-
- Zero-copy (`subarray`, byte views) in critical paths
|
|
75
|
-
- Bounded in-memory structures to prevent unbounded growth
|
|
76
|
-
- Path aliases (`@client`, `@crypto`, `@store`, etc.), no relative `../` imports
|
|
77
|
-
- Named exports only, no default exports
|
|
78
|
-
- No enums (`Object.freeze` + `as const` instead)
|
|
79
|
-
|
|
80
|
-
## Requirements
|
|
81
|
-
|
|
82
|
-
- Node.js `>= 20.9.0`
|
|
83
|
-
- npm
|
|
84
|
-
|
|
85
|
-
Runtime dependencies:
|
|
86
|
-
|
|
87
|
-
- Mandatory: none
|
|
19
|
+
<p align="center">
|
|
20
|
+
📚 <strong>Documentation:</strong> <a href="https://zapo.to/">zapo.to</a> ·
|
|
21
|
+
🛠 <strong>Contributing:</strong> <a href="CONTRIBUTING.md">CONTRIBUTING.md</a> ·
|
|
22
|
+
💛 <strong>Sponsor:</strong> <a href="https://github.com/sponsors/vinikjkkj">GitHub Sponsors</a>
|
|
23
|
+
</p>
|
|
88
24
|
|
|
89
|
-
|
|
25
|
+
---
|
|
90
26
|
|
|
91
|
-
|
|
92
|
-
- `pino` and `pino-pretty` for structured logging
|
|
27
|
+
## Stability Notice
|
|
93
28
|
|
|
94
|
-
|
|
29
|
+
> `zapo-js` is stable as of `1.0.0`. The public API follows SemVer:
|
|
30
|
+
> breaking changes ship only in a major release; minors add features,
|
|
31
|
+
> patches fix bugs.
|
|
95
32
|
|
|
96
|
-
|
|
33
|
+
## Install
|
|
97
34
|
|
|
98
35
|
```bash
|
|
99
|
-
npm install
|
|
36
|
+
npm install zapo-js
|
|
100
37
|
```
|
|
101
38
|
|
|
102
|
-
|
|
39
|
+
Zero mandatory runtime dependencies. Pick the optional packages you need
|
|
40
|
+
on top: a persistent store and (optionally) the media processor for
|
|
41
|
+
thumbnails / voice-note metadata.
|
|
103
42
|
|
|
104
43
|
```bash
|
|
105
|
-
|
|
44
|
+
# Persistent store - choose one
|
|
45
|
+
npm install @zapo-js/store-sqlite better-sqlite3
|
|
46
|
+
# or @zapo-js/store-redis ioredis
|
|
47
|
+
# or @zapo-js/store-postgres pg
|
|
48
|
+
# or @zapo-js/store-mysql mysql2
|
|
49
|
+
# or @zapo-js/store-mongo mongodb
|
|
50
|
+
|
|
51
|
+
# Optional - thumbnails + waveforms + voice-note normalization
|
|
52
|
+
npm install @zapo-js/media-utils sharp
|
|
53
|
+
# plus a system `ffmpeg` + `ffprobe` on PATH (see media-utils README)
|
|
54
|
+
|
|
55
|
+
# Optional - structured logging
|
|
56
|
+
npm install pino pino-pretty
|
|
106
57
|
```
|
|
107
58
|
|
|
108
|
-
|
|
109
|
-
4. Send `ping` to the connected session, the example replies with `pong`.
|
|
110
|
-
|
|
111
|
-
Auth state is persisted in `.auth/state.sqlite`.
|
|
112
|
-
|
|
113
|
-
## Minimal Usage
|
|
59
|
+
## Quick Start
|
|
114
60
|
|
|
115
61
|
```ts
|
|
116
|
-
import {
|
|
62
|
+
import { ConsoleLogger, createStore, WaClient } from 'zapo-js'
|
|
117
63
|
import { createSqliteStore } from '@zapo-js/store-sqlite'
|
|
118
64
|
|
|
119
|
-
const logger = await createPinoLogger({
|
|
120
|
-
level: 'info',
|
|
121
|
-
pretty: true
|
|
122
|
-
})
|
|
123
|
-
|
|
124
65
|
const store = createStore({
|
|
125
66
|
backends: {
|
|
126
|
-
sqlite: createSqliteStore({
|
|
127
|
-
path: '.auth/state.sqlite',
|
|
128
|
-
driver: 'auto'
|
|
129
|
-
})
|
|
67
|
+
sqlite: createSqliteStore({ path: '.auth/state.sqlite' })
|
|
130
68
|
},
|
|
131
69
|
providers: {
|
|
132
70
|
auth: 'sqlite',
|
|
@@ -136,117 +74,99 @@ const store = createStore({
|
|
|
136
74
|
identity: 'sqlite',
|
|
137
75
|
senderKey: 'sqlite',
|
|
138
76
|
appState: 'sqlite',
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
77
|
+
privacyToken: 'sqlite',
|
|
78
|
+
messages: 'sqlite', // 'none' to skip the message archive
|
|
79
|
+
threads: 'sqlite', // 'none' to skip
|
|
80
|
+
contacts: 'sqlite' // 'none' to skip
|
|
142
81
|
}
|
|
143
82
|
})
|
|
144
83
|
|
|
145
|
-
const client = new WaClient(
|
|
146
|
-
{
|
|
147
|
-
store,
|
|
148
|
-
sessionId: 'default',
|
|
149
|
-
connectTimeoutMs: 15_000,
|
|
150
|
-
nodeQueryTimeoutMs: 30_000,
|
|
151
|
-
history: {
|
|
152
|
-
enabled: true,
|
|
153
|
-
requireFullSync: true
|
|
154
|
-
}
|
|
155
|
-
},
|
|
156
|
-
logger
|
|
157
|
-
)
|
|
84
|
+
const client = new WaClient({ store, sessionId: 'default' }, new ConsoleLogger('info'))
|
|
158
85
|
|
|
159
|
-
client.on('auth_qr', ({ qr
|
|
160
|
-
console.log('
|
|
86
|
+
client.on('auth_qr', ({ qr }) => {
|
|
87
|
+
console.log('scan this:', qr)
|
|
161
88
|
})
|
|
162
89
|
|
|
163
|
-
client.on('
|
|
164
|
-
console.log('
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
90
|
+
client.on('auth_paired', ({ credentials }) => {
|
|
91
|
+
console.log('paired as', credentials.meJid)
|
|
92
|
+
})
|
|
93
|
+
|
|
94
|
+
client.on('message', async (event) => {
|
|
95
|
+
if (event.message?.conversation === 'ping') {
|
|
96
|
+
await client.message.send(event.key.remoteJid, 'pong')
|
|
97
|
+
}
|
|
168
98
|
})
|
|
169
99
|
|
|
170
100
|
await client.connect()
|
|
171
101
|
```
|
|
172
102
|
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
- `npm run test:coverage` - run coverage report
|
|
179
|
-
- `npm run typecheck` - type-check project
|
|
180
|
-
- `npm run lint` - lint source files
|
|
181
|
-
- `npm run format` - format codebase
|
|
182
|
-
- `npm run proto:generate` - regenerate protobuf runtime/types from `proto/WAProto.proto`
|
|
183
|
-
- `npm run changeset` - create a versioning entry (`patch`/`minor`/`major`)
|
|
184
|
-
- `npm run changeset:status` - show pending versioning entries
|
|
185
|
-
- `npm run version:packages` - apply pending versions and update `CHANGELOG.md`
|
|
186
|
-
- `npm run release:publish` - build and publish to npm with Changesets
|
|
103
|
+
That's the minimum to pair, listen for messages, and reply. For everything
|
|
104
|
+
else - sending media, reactions, polls, groups, newsletters, app-state
|
|
105
|
+
mutations, business profile, events catalog, store providers, the typed
|
|
106
|
+
event map, and the architectural reasoning - read the guides at
|
|
107
|
+
**[zapo.to](https://zapo.to/)**.
|
|
187
108
|
|
|
188
|
-
##
|
|
109
|
+
## Packages
|
|
189
110
|
|
|
190
|
-
|
|
111
|
+
The core lives at the repo root (`zapo-js`). Optional packages live in
|
|
112
|
+
[`packages/`](packages/) and ship under the `@zapo-js/*` scope. Install
|
|
113
|
+
only what you need.
|
|
191
114
|
|
|
192
|
-
|
|
115
|
+
| Package | Peer dependency | Purpose |
|
|
116
|
+
| ---------------------------------------------------- | --------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ |
|
|
117
|
+
| [`@zapo-js/store-sqlite`](packages/store-sqlite) | `better-sqlite3` | SQLite persistent store (single-process bots, dev sessions, small-to-medium prod). |
|
|
118
|
+
| [`@zapo-js/store-redis`](packages/store-redis) | `ioredis` | Redis-backed store with native TTL eviction. |
|
|
119
|
+
| [`@zapo-js/store-mongo`](packages/store-mongo) | `mongodb` | MongoDB-backed store with TTL-index eviction. |
|
|
120
|
+
| [`@zapo-js/store-mysql`](packages/store-mysql) | `mysql2` | MySQL / MariaDB-backed store with background cleanup poller. |
|
|
121
|
+
| [`@zapo-js/store-postgres`](packages/store-postgres) | `pg` | PostgreSQL-backed store with background cleanup poller. |
|
|
122
|
+
| [`@zapo-js/media-utils`](packages/media-utils) | `sharp` + `ffmpeg` | `WaMediaProcessor`: thumbnails, waveforms, voice-note normalization. |
|
|
123
|
+
| [`@zapo-js/fake-server`](packages/fake-server) | (none) | In-process fake WhatsApp Web server for end-to-end testing. |
|
|
124
|
+
| [`@zapo-js/mcp-server`](packages/mcp-server) | `@modelcontextprotocol/sdk` | **Dev-only.** MCP server exposing multi-session `WaClient`s as dynamic tools for an LLM agent (Claude Code / Cursor / etc.). Not for production. |
|
|
193
125
|
|
|
194
|
-
|
|
195
|
-
npm run changeset
|
|
196
|
-
npm run changeset:status
|
|
197
|
-
npm run version:packages
|
|
198
|
-
npm run release:publish
|
|
199
|
-
```
|
|
200
|
-
|
|
201
|
-
Notes:
|
|
126
|
+
Each package's README has the install + config + integration notes.
|
|
202
127
|
|
|
203
|
-
|
|
204
|
-
- Multiple changesets are merged automatically into the next release
|
|
205
|
-
- SemVer is manual and intentional: `patch`, `minor`, `major`
|
|
128
|
+
## Documentation
|
|
206
129
|
|
|
207
|
-
|
|
130
|
+
- **[zapo.to](https://zapo.to/)** - guides, full API reference, examples,
|
|
131
|
+
protocol notes ([llms.txt](https://zapo.to/llms.txt) index or
|
|
132
|
+
[llms-full.txt](https://zapo.to/llms-full.txt) for LLM context)
|
|
133
|
+
- **[`vinikjkkj/zapo-docs`](https://github.com/vinikjkkj/zapo-docs)** -
|
|
134
|
+
source of zapo.to (open issues/PRs there for doc fixes)
|
|
135
|
+
- **Per-package READMEs** under [`packages/`](packages/) - one per
|
|
136
|
+
optional package
|
|
137
|
+
- **[`AGENTS.md`](AGENTS.md)** - architecture spec + coding rules
|
|
138
|
+
(contributor-facing)
|
|
208
139
|
|
|
209
|
-
|
|
140
|
+
## Contributing
|
|
210
141
|
|
|
211
|
-
|
|
212
|
-
|
|
142
|
+
Pull requests are welcome. See [`CONTRIBUTING.md`](CONTRIBUTING.md) for
|
|
143
|
+
setup, repo layout, CI, release flow, and the conventions PRs must follow.
|
|
213
144
|
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
git push origin v0.1.1
|
|
219
|
-
```
|
|
145
|
+
Contributors also agree to the [Code of Conduct](CODE_OF_CONDUCT.md),
|
|
146
|
+
which includes an **AI-Assisted Contributions** policy covering
|
|
147
|
+
disclosure, human ownership, and the rule against bundle-hallucinated
|
|
148
|
+
protocol claims.
|
|
220
149
|
|
|
221
|
-
|
|
150
|
+
## Security
|
|
222
151
|
|
|
223
|
-
|
|
152
|
+
Found a vulnerability in the crypto, auth, or Signal layer? Please
|
|
153
|
+
**do not open a public issue**. Report it privately via
|
|
154
|
+
[GitHub Security Advisories](https://github.com/vinikjkkj/zapo/security/advisories/new)
|
|
155
|
+
or email `contact@vinicius.email`. Scope, response window, and
|
|
156
|
+
disclosure timeline are documented in [`SECURITY.md`](SECURITY.md).
|
|
224
157
|
|
|
225
|
-
|
|
158
|
+
## License
|
|
226
159
|
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
- Ensures proto tooling dependencies are installed in `proto/`
|
|
230
|
-
- Generates and minifies `proto/index.js`
|
|
231
|
-
- Regenerates compact typings at `proto/index.d.ts`
|
|
160
|
+
[MIT](LICENSE) © vinikjkkj
|
|
232
161
|
|
|
233
162
|
## Support the Project
|
|
234
163
|
|
|
235
|
-
If `zapo` is useful in your production or study setup, you can support
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
## Contribution Notes
|
|
240
|
-
|
|
241
|
-
Before opening a PR:
|
|
242
|
-
|
|
243
|
-
- Validate behavior against WhatsApp Web
|
|
244
|
-
- Keep performance and memory constraints in mind
|
|
245
|
-
- Keep node building/parsing aligned with project patterns
|
|
246
|
-
- Avoid API changes that diverge from observed WhatsApp Web behavior
|
|
247
|
-
- Test real flows when touching auth, transport, app state, retry, or signal paths
|
|
164
|
+
If `zapo` is useful in your production or study setup, you can support
|
|
165
|
+
ongoing development on GitHub Sponsors:
|
|
166
|
+
[github.com/sponsors/vinikjkkj](https://github.com/sponsors/vinikjkkj).
|
|
248
167
|
|
|
249
168
|
## Disclaimer
|
|
250
169
|
|
|
251
|
-
This project is an independent implementation for engineering and
|
|
252
|
-
It is not affiliated with or endorsed by
|
|
170
|
+
This project is an independent implementation for engineering and
|
|
171
|
+
interoperability research. It is not affiliated with or endorsed by
|
|
172
|
+
WhatsApp.
|
|
@@ -1,16 +1,21 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.WaAppStateCrypto = void 0;
|
|
4
|
-
const constants_1 = require("
|
|
5
|
-
const hkdf_1 = require("
|
|
6
|
-
const primitives_1 = require("
|
|
7
|
-
const random_1 = require("
|
|
8
|
-
const _proto_1 = require("
|
|
9
|
-
const constants_2 = require("
|
|
10
|
-
const bytes_1 = require("
|
|
11
|
-
const collections_1 = require("
|
|
12
|
-
const primitives_2 = require("
|
|
4
|
+
const constants_1 = require("../constants");
|
|
5
|
+
const hkdf_1 = require("../../crypto/core/hkdf");
|
|
6
|
+
const primitives_1 = require("../../crypto/core/primitives");
|
|
7
|
+
const random_1 = require("../../crypto/core/random");
|
|
8
|
+
const _proto_1 = require("../../proto.js");
|
|
9
|
+
const constants_2 = require("../../protocol/constants");
|
|
10
|
+
const bytes_1 = require("../../util/bytes");
|
|
11
|
+
const collections_1 = require("../../util/collections");
|
|
12
|
+
const primitives_2 = require("../../util/primitives");
|
|
13
13
|
const DEFAULT_DERIVED_KEYS_CACHE_MAX_SIZE = 256;
|
|
14
|
+
/**
|
|
15
|
+
* Implements the app-state mutation cryptography: HKDF key derivation (with
|
|
16
|
+
* a bounded LRU cache), per-mutation encrypt/decrypt, snapshot/patch MAC
|
|
17
|
+
* generation, and the LT-hash arithmetic used to track collection state.
|
|
18
|
+
*/
|
|
14
19
|
class WaAppStateCrypto {
|
|
15
20
|
constructor(derivedKeysCacheMaxSize = DEFAULT_DERIVED_KEYS_CACHE_MAX_SIZE, skipMacVerification = false) {
|
|
16
21
|
this.derivedKeysCache = new Map();
|
|
@@ -20,39 +25,39 @@ class WaAppStateCrypto {
|
|
|
20
25
|
get isMacVerificationSkipped() {
|
|
21
26
|
return this.skipMacVerification;
|
|
22
27
|
}
|
|
28
|
+
/** Empties the derived-keys LRU cache (e.g. after a session reset). */
|
|
23
29
|
clearCache() {
|
|
24
30
|
this.derivedKeysCache.clear();
|
|
25
31
|
}
|
|
26
|
-
|
|
32
|
+
/**
|
|
33
|
+
* Derives the index/value/snapshot/patch keys from an app-state sync key.
|
|
34
|
+
* Cached by base64 of `keyData` (LRU-bounded).
|
|
35
|
+
*/
|
|
36
|
+
deriveKeys(keyData) {
|
|
27
37
|
const cacheKey = (0, bytes_1.bytesToBase64)(keyData);
|
|
28
38
|
const cached = this.derivedKeysCache.get(cacheKey);
|
|
29
39
|
if (cached) {
|
|
30
40
|
this.touchDerivedKeysCacheEntry(cacheKey, cached);
|
|
31
41
|
return cached;
|
|
32
42
|
}
|
|
33
|
-
const derived =
|
|
34
|
-
const [indexHmacKey, valueEncryptionAesKey, valueMacHmacKey, snapshotMacHmacKey, patchMacHmacKey] = await Promise.all([
|
|
35
|
-
(0, primitives_1.importHmacKey)(derived.subarray(0, constants_1.APP_STATE_DERIVED_INDEX_KEY_END)),
|
|
36
|
-
(0, primitives_1.importAesCbcKey)(derived.subarray(constants_1.APP_STATE_DERIVED_INDEX_KEY_END, constants_1.APP_STATE_DERIVED_VALUE_ENCRYPTION_KEY_END)),
|
|
37
|
-
(0, primitives_1.importHmacSha512Key)(derived.subarray(constants_1.APP_STATE_DERIVED_VALUE_ENCRYPTION_KEY_END, constants_1.APP_STATE_DERIVED_VALUE_MAC_KEY_END)),
|
|
38
|
-
(0, primitives_1.importHmacKey)(derived.subarray(constants_1.APP_STATE_DERIVED_VALUE_MAC_KEY_END, constants_1.APP_STATE_DERIVED_SNAPSHOT_MAC_KEY_END)),
|
|
39
|
-
(0, primitives_1.importHmacKey)(derived.subarray(constants_1.APP_STATE_DERIVED_SNAPSHOT_MAC_KEY_END, constants_1.APP_STATE_DERIVED_PATCH_MAC_KEY_END))
|
|
40
|
-
]);
|
|
43
|
+
const derived = (0, hkdf_1.hkdf)(keyData, null, constants_2.WA_APP_STATE_KDF_INFO.MUTATION_KEYS, constants_1.APP_STATE_DERIVED_KEY_LENGTH);
|
|
41
44
|
const keys = {
|
|
42
|
-
indexHmacKey,
|
|
43
|
-
valueEncryptionAesKey,
|
|
44
|
-
valueMacHmacKey,
|
|
45
|
-
snapshotMacHmacKey,
|
|
46
|
-
patchMacHmacKey
|
|
45
|
+
indexHmacKey: derived.subarray(0, constants_1.APP_STATE_DERIVED_INDEX_KEY_END),
|
|
46
|
+
valueEncryptionAesKey: derived.subarray(constants_1.APP_STATE_DERIVED_INDEX_KEY_END, constants_1.APP_STATE_DERIVED_VALUE_ENCRYPTION_KEY_END),
|
|
47
|
+
valueMacHmacKey: derived.subarray(constants_1.APP_STATE_DERIVED_VALUE_ENCRYPTION_KEY_END, constants_1.APP_STATE_DERIVED_VALUE_MAC_KEY_END),
|
|
48
|
+
snapshotMacHmacKey: derived.subarray(constants_1.APP_STATE_DERIVED_VALUE_MAC_KEY_END, constants_1.APP_STATE_DERIVED_SNAPSHOT_MAC_KEY_END),
|
|
49
|
+
patchMacHmacKey: derived.subarray(constants_1.APP_STATE_DERIVED_SNAPSHOT_MAC_KEY_END, constants_1.APP_STATE_DERIVED_PATCH_MAC_KEY_END)
|
|
47
50
|
};
|
|
48
51
|
this.touchDerivedKeysCacheEntry(cacheKey, keys);
|
|
49
52
|
return keys;
|
|
50
53
|
}
|
|
51
|
-
|
|
52
|
-
|
|
54
|
+
/** Computes the HMAC-SHA-256 index MAC over `indexBytes`. */
|
|
55
|
+
generateIndexMac(indexHmacKey, indexBytes) {
|
|
56
|
+
return (0, primitives_1.hmacSha256Sign)(indexHmacKey, indexBytes);
|
|
53
57
|
}
|
|
58
|
+
/** Encrypts a single mutation value with AES-CBC + HMAC value-MAC. */
|
|
54
59
|
async encryptMutation(args) {
|
|
55
|
-
const derivedKeys =
|
|
60
|
+
const derivedKeys = this.deriveKeys(args.keyData);
|
|
56
61
|
const indexBytes = bytes_1.TEXT_ENCODER.encode(args.index);
|
|
57
62
|
const encoded = _proto_1.proto.SyncActionData.encode({
|
|
58
63
|
index: indexBytes,
|
|
@@ -64,37 +69,34 @@ class WaAppStateCrypto {
|
|
|
64
69
|
if (iv.byteLength !== constants_1.APP_STATE_IV_LENGTH) {
|
|
65
70
|
throw new Error(`invalid IV length ${iv.byteLength}`);
|
|
66
71
|
}
|
|
67
|
-
const
|
|
68
|
-
const cipherText =
|
|
69
|
-
const cipherWithIv = (0, bytes_1.concatBytes)([iv, cipherText]);
|
|
72
|
+
const indexMac = this.generateIndexMac(derivedKeys.indexHmacKey, indexBytes);
|
|
73
|
+
const cipherText = (0, primitives_1.aesCbcEncrypt)(derivedKeys.valueEncryptionAesKey, iv, encoded);
|
|
70
74
|
const associatedData = this.generateAssociatedData(args.operation, args.keyId);
|
|
71
|
-
const
|
|
72
|
-
this.generateValueMac(derivedKeys.valueMacHmacKey, associatedData, cipherWithIv),
|
|
73
|
-
indexMacPromise
|
|
74
|
-
]);
|
|
75
|
+
const valueMac = this.generateValueMac(derivedKeys.valueMacHmacKey, associatedData, iv, cipherText);
|
|
75
76
|
return {
|
|
76
77
|
indexMac,
|
|
77
|
-
valueBlob: (0, bytes_1.concatBytes)([
|
|
78
|
+
valueBlob: (0, bytes_1.concatBytes)([iv, cipherText, valueMac]),
|
|
78
79
|
valueMac
|
|
79
80
|
};
|
|
80
81
|
}
|
|
82
|
+
/** Verifies and decrypts a single app-state mutation. */
|
|
83
|
+
// eslint-disable-next-line @typescript-eslint/require-await
|
|
81
84
|
async decryptMutation(args) {
|
|
82
85
|
if (args.valueBlob.byteLength < constants_1.APP_STATE_IV_LENGTH + constants_1.APP_STATE_VALUE_MAC_LENGTH) {
|
|
83
86
|
throw new Error('invalid mutation value blob');
|
|
84
87
|
}
|
|
85
|
-
const derivedKeys =
|
|
88
|
+
const derivedKeys = this.deriveKeys(args.keyData);
|
|
86
89
|
const iv = args.valueBlob.subarray(0, constants_1.APP_STATE_IV_LENGTH);
|
|
87
90
|
const mac = args.valueBlob.subarray(args.valueBlob.byteLength - constants_1.APP_STATE_VALUE_MAC_LENGTH);
|
|
88
91
|
const cipherText = args.valueBlob.subarray(constants_1.APP_STATE_IV_LENGTH, args.valueBlob.byteLength - constants_1.APP_STATE_VALUE_MAC_LENGTH);
|
|
89
|
-
const cipherWithIv = args.valueBlob.subarray(0, args.valueBlob.byteLength - constants_1.APP_STATE_VALUE_MAC_LENGTH);
|
|
90
92
|
if (!this.skipMacVerification) {
|
|
91
93
|
const associatedData = this.generateAssociatedData(args.operation, args.keyId);
|
|
92
|
-
const expectedMac =
|
|
94
|
+
const expectedMac = this.generateValueMac(derivedKeys.valueMacHmacKey, associatedData, iv, cipherText);
|
|
93
95
|
if (!(0, bytes_1.uint8TimingSafeEqual)(mac, expectedMac)) {
|
|
94
96
|
throw new Error('mutation value MAC mismatch');
|
|
95
97
|
}
|
|
96
98
|
}
|
|
97
|
-
const plaintext =
|
|
99
|
+
const plaintext = (0, primitives_1.aesCbcDecrypt)(derivedKeys.valueEncryptionAesKey, iv, cipherText);
|
|
98
100
|
const syncActionData = _proto_1.proto.SyncActionData.decode(plaintext);
|
|
99
101
|
if (!syncActionData.index) {
|
|
100
102
|
throw new Error('missing sync action index');
|
|
@@ -103,7 +105,7 @@ class WaAppStateCrypto {
|
|
|
103
105
|
throw new Error('missing sync action version');
|
|
104
106
|
}
|
|
105
107
|
if (!this.skipMacVerification) {
|
|
106
|
-
const generatedIndexMac =
|
|
108
|
+
const generatedIndexMac = this.generateIndexMac(derivedKeys.indexHmacKey, syncActionData.index);
|
|
107
109
|
if (!(0, bytes_1.uint8TimingSafeEqual)(generatedIndexMac, args.indexMac)) {
|
|
108
110
|
throw new Error('mutation index MAC mismatch');
|
|
109
111
|
}
|
|
@@ -116,41 +118,48 @@ class WaAppStateCrypto {
|
|
|
116
118
|
valueMac: mac
|
|
117
119
|
};
|
|
118
120
|
}
|
|
121
|
+
/** Generates the HMAC-SHA-512 snapshot MAC over the LT-hash + version + collection name. */
|
|
122
|
+
// eslint-disable-next-line @typescript-eslint/require-await
|
|
119
123
|
async generateSnapshotMac(keyData, ltHash, version, collectionName) {
|
|
120
|
-
const derivedKeys =
|
|
121
|
-
|
|
124
|
+
const derivedKeys = this.deriveKeys(keyData);
|
|
125
|
+
return (0, primitives_1.hmacSha256Sign)(derivedKeys.snapshotMacHmacKey, [
|
|
122
126
|
ltHash,
|
|
123
127
|
(0, bytes_1.intToBytes)(8, version),
|
|
124
128
|
bytes_1.TEXT_ENCODER.encode(collectionName)
|
|
125
129
|
]);
|
|
126
|
-
return (0, primitives_1.hmacSign)(derivedKeys.snapshotMacHmacKey, payload);
|
|
127
130
|
}
|
|
131
|
+
/** Generates the HMAC-SHA-512 patch MAC binding mutations to a collection version. */
|
|
132
|
+
// eslint-disable-next-line @typescript-eslint/require-await
|
|
128
133
|
async generatePatchMac(keyData, snapshotMac, valueMacs, version, collectionName) {
|
|
129
|
-
const derivedKeys =
|
|
130
|
-
|
|
134
|
+
const derivedKeys = this.deriveKeys(keyData);
|
|
135
|
+
return (0, primitives_1.hmacSha256Sign)(derivedKeys.patchMacHmacKey, [
|
|
131
136
|
snapshotMac,
|
|
132
137
|
...valueMacs,
|
|
133
138
|
(0, bytes_1.intToBytes)(8, version),
|
|
134
139
|
bytes_1.TEXT_ENCODER.encode(collectionName)
|
|
135
140
|
]);
|
|
136
|
-
return (0, primitives_1.hmacSign)(derivedKeys.patchMacHmacKey, payload);
|
|
137
141
|
}
|
|
142
|
+
/** Adds value MACs into the running LT-hash digest for a collection. */
|
|
143
|
+
// eslint-disable-next-line @typescript-eslint/require-await
|
|
138
144
|
async ltHashAdd(base, addValues) {
|
|
139
145
|
return this.ltHashApply(base, addValues, (left, right) => left + right);
|
|
140
146
|
}
|
|
147
|
+
/** Removes value MACs from the running LT-hash digest (for `remove` operations). */
|
|
148
|
+
// eslint-disable-next-line @typescript-eslint/require-await
|
|
141
149
|
async ltHashSubtract(base, removeValues) {
|
|
142
150
|
return this.ltHashApply(base, removeValues, (left, right) => left - right);
|
|
143
151
|
}
|
|
152
|
+
/** Combined subtract+add LT-hash update used when a key's value MAC changes in place. */
|
|
144
153
|
async ltHashSubtractThenAdd(base, addValues, removeValues) {
|
|
145
154
|
const subtractResult = await this.ltHashSubtract(base, removeValues);
|
|
146
155
|
const hash = await this.ltHashAdd(subtractResult, addValues);
|
|
147
156
|
return { hash, subtractResult };
|
|
148
157
|
}
|
|
149
|
-
|
|
158
|
+
ltHashApply(base, values, combine) {
|
|
150
159
|
if (values.length === 0) {
|
|
151
160
|
return base;
|
|
152
161
|
}
|
|
153
|
-
const expandedValues =
|
|
162
|
+
const expandedValues = values.map((value) => (0, hkdf_1.hkdf)(value, null, constants_2.WA_APP_STATE_KDF_INFO.PATCH_INTEGRITY, constants_1.APP_STATE_EMPTY_LT_HASH.byteLength));
|
|
154
163
|
const out = new Uint8Array(base.byteLength);
|
|
155
164
|
this.pointwiseWithOverflow(base, expandedValues[0], combine, out);
|
|
156
165
|
for (let index = 1; index < expandedValues.length; index += 1) {
|
|
@@ -187,10 +196,10 @@ class WaAppStateCrypto {
|
|
|
187
196
|
out.set(keyId, 1);
|
|
188
197
|
return out;
|
|
189
198
|
}
|
|
190
|
-
|
|
199
|
+
generateValueMac(valueMacHmacKey, associatedData, iv, cipherText) {
|
|
191
200
|
const octetLength = new Uint8Array(constants_1.APP_STATE_MAC_OCTET_LENGTH);
|
|
192
201
|
octetLength[octetLength.length - 1] = associatedData.byteLength & 0xff;
|
|
193
|
-
const full =
|
|
202
|
+
const full = (0, primitives_1.hmacSha512Sign)(valueMacHmacKey, (0, bytes_1.concatBytes)([associatedData, iv, cipherText, octetLength]));
|
|
194
203
|
return full.subarray(0, constants_1.APP_STATE_VALUE_MAC_LENGTH);
|
|
195
204
|
}
|
|
196
205
|
touchDerivedKeysCacheEntry(cacheKey, keys) {
|
package/dist/appstate/index.js
CHANGED
|
@@ -14,17 +14,18 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
14
14
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
exports.WaAppStateSyncClient = exports.parseSyncResponse = exports.WaAppStateCrypto = exports.decodeAppStateSyncKeys = exports.decodeAppStateCollections = exports.decodeAppStateFingerprint = exports.encodeAppStateFingerprint = void 0;
|
|
18
|
-
|
|
19
|
-
|
|
17
|
+
exports.WaAppStateSyncClient = exports.parseSyncResponse = exports.WaAppStateCrypto = exports.decodeAppStateSyncKeys = exports.decodeAppStateCollections = exports.decodeAppStateFingerprint = exports.encodeAppStateFingerprint = exports.APP_STATE_EMPTY_LT_HASH = void 0;
|
|
18
|
+
var constants_1 = require("./constants");
|
|
19
|
+
Object.defineProperty(exports, "APP_STATE_EMPTY_LT_HASH", { enumerable: true, get: function () { return constants_1.APP_STATE_EMPTY_LT_HASH; } });
|
|
20
|
+
var encoding_1 = require("./parsers/encoding");
|
|
20
21
|
Object.defineProperty(exports, "encodeAppStateFingerprint", { enumerable: true, get: function () { return encoding_1.encodeAppStateFingerprint; } });
|
|
21
22
|
Object.defineProperty(exports, "decodeAppStateFingerprint", { enumerable: true, get: function () { return encoding_1.decodeAppStateFingerprint; } });
|
|
22
23
|
Object.defineProperty(exports, "decodeAppStateCollections", { enumerable: true, get: function () { return encoding_1.decodeAppStateCollections; } });
|
|
23
24
|
Object.defineProperty(exports, "decodeAppStateSyncKeys", { enumerable: true, get: function () { return encoding_1.decodeAppStateSyncKeys; } });
|
|
24
25
|
__exportStar(require("./utils"), exports);
|
|
25
|
-
var WaAppStateCrypto_1 = require("./WaAppStateCrypto");
|
|
26
|
+
var WaAppStateCrypto_1 = require("./crypto/WaAppStateCrypto");
|
|
26
27
|
Object.defineProperty(exports, "WaAppStateCrypto", { enumerable: true, get: function () { return WaAppStateCrypto_1.WaAppStateCrypto; } });
|
|
27
|
-
var response_parser_1 = require("./response-parser");
|
|
28
|
+
var response_parser_1 = require("./parsers/response-parser");
|
|
28
29
|
Object.defineProperty(exports, "parseSyncResponse", { enumerable: true, get: function () { return response_parser_1.parseSyncResponse; } });
|
|
29
|
-
var WaAppStateSyncClient_1 = require("./WaAppStateSyncClient");
|
|
30
|
+
var WaAppStateSyncClient_1 = require("./sync/WaAppStateSyncClient");
|
|
30
31
|
Object.defineProperty(exports, "WaAppStateSyncClient", { enumerable: true, get: function () { return WaAppStateSyncClient_1.WaAppStateSyncClient; } });
|
|
@@ -4,14 +4,17 @@ exports.encodeAppStateFingerprint = encodeAppStateFingerprint;
|
|
|
4
4
|
exports.decodeAppStateFingerprint = decodeAppStateFingerprint;
|
|
5
5
|
exports.decodeAppStateSyncKeys = decodeAppStateSyncKeys;
|
|
6
6
|
exports.decodeAppStateCollections = decodeAppStateCollections;
|
|
7
|
-
const _proto_1 = require("
|
|
8
|
-
const coercion_1 = require("
|
|
7
|
+
const _proto_1 = require("../../proto.js");
|
|
8
|
+
const coercion_1 = require("../../util/coercion");
|
|
9
|
+
const primitives_1 = require("../../util/primitives");
|
|
10
|
+
/** Serializes an app-state sync key fingerprint to its protobuf bytes, or `null` when absent. */
|
|
9
11
|
function encodeAppStateFingerprint(fingerprint) {
|
|
10
12
|
if (!fingerprint) {
|
|
11
13
|
return null;
|
|
12
14
|
}
|
|
13
15
|
return _proto_1.proto.Message.AppStateSyncKeyFingerprint.encode(fingerprint).finish();
|
|
14
16
|
}
|
|
17
|
+
/** Inverse of {@link encodeAppStateFingerprint}; throws on malformed input. */
|
|
15
18
|
function decodeAppStateFingerprint(raw) {
|
|
16
19
|
const bytes = (0, coercion_1.asOptionalBytes)(raw, 'appstate_sync_keys.fingerprint');
|
|
17
20
|
if (!bytes) {
|
|
@@ -21,10 +24,10 @@ function decodeAppStateFingerprint(raw) {
|
|
|
21
24
|
return _proto_1.proto.Message.AppStateSyncKeyFingerprint.decode(bytes);
|
|
22
25
|
}
|
|
23
26
|
catch (error) {
|
|
24
|
-
|
|
25
|
-
throw new Error(`invalid appstate_sync_keys.fingerprint protobuf payload: ${reason}`);
|
|
27
|
+
throw new Error(`invalid appstate_sync_keys.fingerprint protobuf payload: ${(0, primitives_1.toError)(error).message}`);
|
|
26
28
|
}
|
|
27
29
|
}
|
|
30
|
+
/** Decodes app-state sync-key SQL rows into {@link WaAppStateSyncKey} records. */
|
|
28
31
|
function decodeAppStateSyncKeys(rows) {
|
|
29
32
|
const decoded = new Array(rows.length);
|
|
30
33
|
for (let i = 0; i < rows.length; i += 1) {
|
|
@@ -38,6 +41,10 @@ function decodeAppStateSyncKeys(rows) {
|
|
|
38
41
|
}
|
|
39
42
|
return decoded;
|
|
40
43
|
}
|
|
44
|
+
/**
|
|
45
|
+
* Joins app-state collection-version and index-value SQL rows into the
|
|
46
|
+
* `collections` shape used by the in-memory app-state store.
|
|
47
|
+
*/
|
|
41
48
|
function decodeAppStateCollections(versionRows, valueRows) {
|
|
42
49
|
const valueMapByCollection = new Map();
|
|
43
50
|
for (const row of valueRows) {
|