zapo-js 0.2.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 +103 -179
- package/dist/appstate/{WaAppStateCrypto.js → crypto/WaAppStateCrypto.js} +79 -62
- package/dist/appstate/index.js +8 -7
- package/dist/appstate/{encoding.js → parsers/encoding.js} +11 -4
- package/dist/appstate/{WaAppStateSyncResponseParser.js → parsers/response-parser.js} +20 -8
- package/dist/appstate/{WaAppStateSyncClient.js → sync/WaAppStateSyncClient.js} +246 -88
- package/dist/appstate/utils.js +16 -0
- package/dist/appstate-spec.js +89 -0
- package/dist/auth/WaAuthClient.js +117 -13
- package/dist/auth/credentials-flow.js +207 -0
- package/dist/auth/pairing/WaPairingFlow.js +53 -47
- package/dist/auth/pairing/pairing-code-crypto.js +91 -0
- package/dist/client/WaClient.js +369 -460
- package/dist/client/WaClientFactory.js +377 -93
- package/dist/client/connection/WaConnectionManager.js +31 -11
- package/dist/client/coordinators/WaAbPropsCoordinator.js +140 -0
- 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 -180
- package/dist/client/coordinators/WaEmailCoordinator.js +64 -0
- package/dist/client/coordinators/WaGroupCoordinator.js +529 -52
- package/dist/client/coordinators/WaIncomingNodeCoordinator.js +130 -20
- package/dist/client/coordinators/WaLowLevelCoordinator.js +41 -0
- package/dist/client/coordinators/WaMessageCoordinator.js +365 -0
- package/dist/client/coordinators/WaMessageDispatchCoordinator.js +724 -216
- package/dist/client/coordinators/WaNewsletterCoordinator.js +18 -0
- package/dist/client/coordinators/WaOfflineResumeCoordinator.js +114 -0
- package/dist/client/coordinators/WaPassiveTasksCoordinator.js +53 -22
- package/dist/client/coordinators/WaPresenceCoordinator.js +21 -0
- package/dist/client/coordinators/WaPrivacyCoordinator.js +7 -5
- package/dist/client/coordinators/WaProfileCoordinator.js +223 -50
- package/dist/client/coordinators/WaRetryCoordinator.js +256 -123
- package/dist/client/coordinators/WaStatusCoordinator.js +49 -0
- package/dist/client/coordinators/WaStreamControlCoordinator.js +6 -6
- package/dist/client/coordinators/WaTrustedContactTokenCoordinator.js +29 -10
- package/dist/client/events/abprops.js +43 -0
- 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} +34 -20
- 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/privacy-token.js +1 -2
- package/dist/client/events/receipt.js +26 -0
- package/dist/client/events/registration.js +42 -0
- package/dist/client/media.js +400 -0
- 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 +9 -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 +9 -9
- package/dist/crypto/core/xeddsa.js +59 -0
- package/dist/crypto/curves/Ed25519.js +32 -21
- package/dist/crypto/curves/X25519.js +71 -17
- package/dist/crypto/curves/constants.js +3 -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} +72 -55
- package/dist/esm/appstate/index.js +5 -5
- package/dist/esm/appstate/{encoding.js → parsers/encoding.js} +11 -4
- package/dist/esm/appstate/{WaAppStateSyncResponseParser.js → parsers/response-parser.js} +20 -8
- package/dist/esm/appstate/{WaAppStateSyncClient.js → sync/WaAppStateSyncClient.js} +235 -76
- package/dist/esm/appstate/utils.js +16 -0
- package/dist/esm/appstate-spec.js +79 -0
- package/dist/esm/auth/WaAuthClient.js +114 -10
- package/dist/esm/auth/credentials-flow.js +202 -0
- package/dist/esm/auth/pairing/WaPairingFlow.js +52 -46
- package/dist/esm/auth/pairing/pairing-code-crypto.js +85 -0
- package/dist/esm/client/WaClient.js +372 -463
- package/dist/esm/client/WaClientFactory.js +380 -96
- package/dist/esm/client/connection/WaConnectionManager.js +31 -11
- package/dist/esm/client/coordinators/WaAbPropsCoordinator.js +136 -0
- 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 +78 -177
- package/dist/esm/client/coordinators/WaEmailCoordinator.js +61 -0
- package/dist/esm/client/coordinators/WaGroupCoordinator.js +532 -55
- package/dist/esm/client/coordinators/WaIncomingNodeCoordinator.js +132 -22
- 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 +719 -211
- package/dist/esm/client/coordinators/WaNewsletterCoordinator.js +13 -0
- package/dist/esm/client/coordinators/WaOfflineResumeCoordinator.js +110 -0
- package/dist/esm/client/coordinators/WaPassiveTasksCoordinator.js +54 -23
- 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 +226 -53
- package/dist/esm/client/coordinators/WaRetryCoordinator.js +258 -125
- 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 +31 -12
- package/dist/esm/client/events/abprops.js +40 -0
- 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} +34 -20
- 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/privacy-token.js +1 -2
- package/dist/esm/client/events/receipt.js +23 -0
- package/dist/esm/client/events/registration.js +39 -0
- package/dist/esm/client/media.js +384 -0
- 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 +3 -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 +8 -7
- package/dist/esm/crypto/core/xeddsa.js +55 -0
- package/dist/esm/crypto/curves/Ed25519.js +35 -24
- package/dist/esm/crypto/curves/X25519.js +74 -20
- package/dist/esm/crypto/curves/constants.js +2 -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/infra/perf/StoreLock.js +7 -4
- package/dist/esm/media/constants.js +35 -2
- package/dist/esm/media/crypto/WaMediaCrypto.js +374 -0
- package/dist/esm/media/index.js +4 -3
- package/dist/esm/media/processor.js +1 -0
- package/dist/esm/media/sticker/sticker-pack.js +133 -0
- package/dist/esm/media/{WaMediaTransferClient.js → transfer/WaMediaTransferClient.js} +84 -196
- 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/crypto/addon-crypto.js +244 -0
- package/dist/esm/message/{icdc.js → crypto/icdc.js} +11 -13
- package/dist/esm/message/crypto/phash.js +133 -0
- package/dist/esm/message/{reporting-token.js → crypto/reporting-token.js} +7 -7
- package/dist/esm/message/{use-case-secret.js → crypto/use-case-secret.js} +21 -4
- package/dist/esm/message/{content.js → encode/content.js} +183 -8
- 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/primitives/incoming.js +511 -0
- package/dist/esm/message/primitives/peer-data-operation.js +93 -0
- package/dist/esm/mex.js +1 -0
- package/dist/esm/protocol/abprops.js +169 -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 +22 -0
- package/dist/esm/protocol/business.js +19 -0
- package/dist/esm/protocol/call.js +48 -0
- package/dist/esm/protocol/constants.js +10 -2
- package/dist/esm/protocol/defaults.js +3 -0
- package/dist/esm/protocol/email.js +30 -0
- package/dist/esm/protocol/index.js +1 -1
- package/dist/esm/protocol/jid.js +142 -11
- 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 +26 -2
- package/dist/esm/protocol/notification.js +24 -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 +6 -1
- package/dist/esm/retry/replay.js +131 -37
- package/dist/esm/retry/tracker.js +4 -8
- package/dist/esm/signal/api/SignalDeviceSyncApi.js +71 -21
- package/dist/esm/signal/api/SignalDigestSyncApi.js +15 -8
- package/dist/esm/signal/api/SignalIdentitySyncApi.js +13 -4
- 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/attestation/WaAdvSignature.js +17 -0
- package/dist/esm/signal/{crypto → attestation}/constants.js +0 -4
- package/dist/esm/signal/constants.js +3 -0
- package/dist/esm/signal/encoding.js +6 -332
- package/dist/esm/signal/group/SenderKeyChain.js +20 -35
- package/dist/esm/signal/group/SenderKeyCodec.js +5 -6
- package/dist/esm/signal/group/SenderKeyManager.js +37 -17
- 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 +12 -3
- package/dist/esm/signal/registration/utils.js +8 -2
- package/dist/esm/signal/session/SignalProtocol.js +129 -26
- package/dist/esm/signal/session/SignalRatchet.js +46 -64
- package/dist/esm/signal/session/SignalSerializer.js +5 -6
- package/dist/esm/signal/session/SignalSession.js +14 -19
- package/dist/esm/signal/session/encoding.js +173 -0
- package/dist/esm/signal/session/resolver.js +144 -35
- 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/contracts/identity.store.js +1 -0
- package/dist/esm/store/contracts/message-secret.store.js +1 -0
- package/dist/esm/store/contracts/pre-key.store.js +1 -0
- package/dist/esm/store/contracts/session.store.js +1 -0
- package/dist/esm/store/createStore.js +129 -39
- package/dist/esm/store/index.js +15 -10
- 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/identity.lock.js +16 -0
- package/dist/esm/store/locks/message-secret.lock.js +17 -0
- package/dist/esm/store/locks/pre-key.lock.js +27 -0
- package/dist/esm/store/locks/session.lock.js +19 -0
- package/dist/esm/store/locks/signal.lock.js +0 -24
- 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} +24 -12
- package/dist/esm/store/memory/identity.store.js +31 -0
- package/dist/esm/store/memory/message-secret.store.js +90 -0
- package/dist/esm/store/{providers/memory → memory}/message.store.js +2 -2
- package/dist/esm/store/memory/pre-key.store.js +97 -0
- package/dist/esm/store/{providers/memory → memory}/privacy-token.store.js +1 -1
- package/dist/esm/store/{providers/memory → memory}/retry.store.js +49 -14
- package/dist/esm/store/{providers/memory → memory}/sender-key.store.js +3 -3
- package/dist/esm/store/memory/session.store.js +45 -0
- package/dist/esm/store/memory/signal.store.js +36 -0
- package/dist/esm/store/{providers/memory → memory}/thread.store.js +2 -2
- package/dist/esm/store/noop.store.js +26 -4
- package/dist/esm/transport/WaComms.js +18 -8
- package/dist/esm/transport/WaWebSocket.js +41 -9
- 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 +7 -0
- package/dist/esm/transport/keepalive/WaKeepAlive.js +35 -12
- package/dist/esm/transport/node/WaMobileTcpSocket.js +120 -0
- package/dist/esm/transport/node/WaNodeOrchestrator.js +26 -13
- package/dist/esm/transport/node/WaNodeTransport.js +13 -0
- package/dist/esm/transport/node/builders/abprops.js +20 -0
- 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 +11 -0
- package/dist/esm/transport/node/builders/email.js +66 -0
- 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/offline.js +14 -0
- package/dist/esm/transport/node/builders/passive.js +7 -0
- package/dist/esm/transport/node/builders/prekeys.js +40 -43
- package/dist/esm/transport/node/builders/presence.js +39 -0
- package/dist/esm/transport/node/builders/privacy-token.js +19 -23
- 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/retry.js +1 -1
- 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 +27 -1
- package/dist/esm/transport/node/mex/argo-decoder.js +152 -0
- package/dist/esm/transport/node/mex/client.js +105 -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 +23 -18
- package/dist/esm/transport/noise/WaFrameCodec.js +2 -2
- package/dist/esm/transport/noise/WaMobileClientPayload.js +58 -0
- package/dist/esm/transport/noise/WaNoiseCert.js +14 -27
- package/dist/esm/transport/noise/WaNoiseHandshake.js +27 -25
- package/dist/esm/transport/noise/WaNoiseSession.js +48 -67
- 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/infra/perf/StoreLock.js +7 -4
- package/dist/media/constants.js +36 -3
- package/dist/media/crypto/WaMediaCrypto.js +378 -0
- package/dist/media/index.js +9 -4
- package/dist/media/processor.js +2 -0
- package/dist/media/sticker/sticker-pack.js +136 -0
- package/dist/media/{WaMediaTransferClient.js → transfer/WaMediaTransferClient.js} +87 -229
- 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/crypto/addon-crypto.js +254 -0
- package/dist/message/{icdc.js → crypto/icdc.js} +11 -13
- package/dist/message/crypto/phash.js +136 -0
- package/dist/message/{reporting-token.js → crypto/reporting-token.js} +7 -7
- package/dist/message/{use-case-secret.js → crypto/use-case-secret.js} +21 -4
- package/dist/message/{content.js → encode/content.js} +200 -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} +225 -38
- 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 +173 -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 +23 -0
- package/dist/protocol/business.js +22 -0
- package/dist/protocol/call.js +51 -0
- package/dist/protocol/constants.js +51 -3
- package/dist/protocol/defaults.js +3 -0
- package/dist/protocol/email.js +33 -0
- package/dist/protocol/index.js +12 -3
- package/dist/protocol/jid.js +148 -11
- 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 +26 -2
- package/dist/protocol/notification.js +25 -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 +6 -1
- package/dist/retry/replay.js +129 -35
- package/dist/retry/tracker.js +3 -7
- package/dist/signal/api/SignalDeviceSyncApi.js +69 -19
- package/dist/signal/api/SignalDigestSyncApi.js +14 -7
- package/dist/signal/api/SignalIdentitySyncApi.js +13 -4
- 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/attestation/WaAdvSignature.js +26 -0
- package/dist/signal/{crypto → attestation}/constants.js +1 -5
- package/dist/signal/constants.js +4 -1
- package/dist/signal/encoding.js +5 -341
- package/dist/signal/group/SenderKeyChain.js +19 -34
- package/dist/signal/group/SenderKeyCodec.js +4 -5
- package/dist/signal/group/SenderKeyManager.js +36 -16
- 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 -2
- package/dist/signal/registration/utils.js +8 -2
- package/dist/signal/session/SignalProtocol.js +128 -25
- package/dist/signal/session/SignalRatchet.js +41 -60
- package/dist/signal/session/SignalSerializer.js +5 -6
- package/dist/signal/session/SignalSession.js +13 -19
- package/dist/signal/session/encoding.js +183 -0
- package/dist/signal/session/resolver.js +144 -35
- 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/contracts/identity.store.js +2 -0
- package/dist/store/contracts/message-secret.store.js +2 -0
- package/dist/store/contracts/pre-key.store.js +2 -0
- package/dist/store/contracts/session.store.js +2 -0
- package/dist/store/createStore.js +128 -38
- package/dist/store/index.js +22 -12
- 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/identity.lock.js +19 -0
- package/dist/store/locks/message-secret.lock.js +20 -0
- package/dist/store/locks/pre-key.lock.js +30 -0
- package/dist/store/locks/session.lock.js +22 -0
- package/dist/store/locks/signal.lock.js +0 -24
- 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} +26 -14
- package/dist/store/memory/identity.store.js +35 -0
- package/dist/store/memory/message-secret.store.js +94 -0
- package/dist/store/{providers/memory → memory}/message.store.js +2 -2
- package/dist/store/memory/pre-key.store.js +101 -0
- package/dist/store/{providers/memory → memory}/privacy-token.store.js +1 -1
- package/dist/store/{providers/memory → memory}/retry.store.js +49 -14
- package/dist/store/{providers/memory → memory}/sender-key.store.js +3 -3
- package/dist/store/memory/session.store.js +49 -0
- package/dist/store/memory/signal.store.js +40 -0
- package/dist/store/{providers/memory → memory}/thread.store.js +2 -2
- package/dist/store/noop.store.js +27 -5
- package/dist/transport/WaComms.js +18 -8
- package/dist/transport/WaWebSocket.js +41 -9
- 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 +19 -1
- package/dist/transport/keepalive/WaKeepAlive.js +35 -12
- package/dist/transport/node/WaMobileTcpSocket.js +124 -0
- package/dist/transport/node/WaNodeOrchestrator.js +25 -12
- package/dist/transport/node/WaNodeTransport.js +13 -0
- package/dist/transport/node/builders/abprops.js +23 -0
- 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 +14 -0
- package/dist/transport/node/builders/email.js +73 -0
- 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/offline.js +17 -0
- package/dist/transport/node/builders/passive.js +10 -0
- package/dist/transport/node/builders/prekeys.js +38 -41
- package/dist/transport/node/builders/presence.js +43 -0
- package/dist/transport/node/builders/privacy-token.js +18 -22
- package/dist/transport/node/builders/privacy.js +5 -5
- package/dist/transport/node/builders/profile.js +30 -7
- package/dist/transport/node/builders/retry.js +1 -1
- package/dist/transport/node/builders/tos.js +63 -0
- package/dist/transport/node/builders/usync.js +52 -1
- package/dist/transport/node/helpers.js +28 -1
- package/dist/transport/node/mex/argo-decoder.js +189 -0
- package/dist/transport/node/mex/client.js +109 -0
- package/dist/transport/node/query.js +17 -0
- package/dist/transport/node/usync.js +13 -0
- package/dist/transport/noise/WaClientPayload.js +22 -17
- package/dist/transport/noise/WaFrameCodec.js +1 -1
- package/dist/transport/noise/WaMobileClientPayload.js +61 -0
- package/dist/transport/noise/WaNoiseCert.js +13 -26
- package/dist/transport/noise/WaNoiseHandshake.js +25 -23
- package/dist/transport/noise/WaNoiseSession.js +47 -66
- 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} +29 -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/{WaAppStateSyncResponseParser.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 +17 -1
- package/dist/types/appstate-spec.d.ts +24 -0
- package/dist/types/auth/WaAuthClient.d.ts +95 -3
- package/dist/types/auth/credentials-flow.d.ts +21 -0
- package/dist/types/auth/pairing/WaPairingFlow.d.ts +3 -2
- package/dist/types/auth/pairing/{WaPairingCodeCrypto.d.ts → pairing-code-crypto.d.ts} +5 -1
- package/dist/types/auth/types.d.ts +88 -1
- package/dist/types/client/WaClient.d.ts +183 -65
- package/dist/types/client/WaClientFactory.d.ts +40 -9
- 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/WaAbPropsCoordinator.d.ts +26 -0
- 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 +45 -44
- package/dist/types/client/coordinators/WaEmailCoordinator.d.ts +40 -0
- package/dist/types/client/coordinators/WaGroupCoordinator.d.ts +311 -9
- package/dist/types/client/coordinators/WaIncomingNodeCoordinator.d.ts +16 -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 +65 -29
- package/dist/types/client/coordinators/WaNewsletterCoordinator.d.ts +13 -0
- package/dist/types/client/coordinators/WaOfflineResumeCoordinator.d.ts +31 -0
- package/dist/types/client/coordinators/WaPassiveTasksCoordinator.d.ts +15 -3
- package/dist/types/client/coordinators/WaPresenceCoordinator.d.ts +27 -0
- package/dist/types/client/coordinators/WaPrivacyCoordinator.d.ts +28 -1
- package/dist/types/client/coordinators/WaProfileCoordinator.d.ts +117 -2
- package/dist/types/client/coordinators/WaRetryCoordinator.d.ts +23 -15
- package/dist/types/client/coordinators/WaStatusCoordinator.d.ts +42 -0
- package/dist/types/client/coordinators/WaTrustedContactTokenCoordinator.d.ts +16 -2
- package/dist/types/client/events/abprops.d.ts +15 -0
- 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} +7 -4
- package/dist/types/client/events/group.d.ts +2 -1
- package/dist/types/client/events/identity.d.ts +2 -1
- package/dist/types/client/events/incoming.d.ts +65 -0
- 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 +18 -0
- package/dist/types/client/index.d.ts +1 -1
- package/dist/types/client/media.d.ts +65 -0
- 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 +13 -2
- package/dist/types/client/persistence/history-sync.d.ts +29 -0
- package/dist/types/client/persistence/mailbox.d.ts +12 -0
- package/dist/types/client/tokens/cs-token.d.ts +1 -3
- package/dist/types/client/types.d.ts +926 -55
- package/dist/types/crypto/core/hkdf.d.ts +10 -2
- package/dist/types/crypto/core/index.d.ts +3 -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 +7 -1
- package/dist/types/crypto/core/xeddsa.d.ts +11 -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 -2
- package/dist/types/crypto/curves/types.d.ts +0 -5
- package/dist/types/crypto/index.d.ts +1 -0
- 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 -5
- package/dist/types/infra/log/ConsoleLogger.d.ts +19 -2
- package/dist/types/infra/log/PinoLogger.d.ts +56 -2
- package/dist/types/infra/log/types.d.ts +6 -0
- package/dist/types/infra/perf/BackgroundQueue.d.ts +19 -0
- package/dist/types/infra/perf/StoreLock.d.ts +1 -0
- package/dist/types/media/constants.d.ts +9 -2
- package/dist/types/media/crypto/WaMediaCrypto.d.ts +59 -0
- package/dist/types/media/index.d.ts +7 -4
- package/dist/types/media/processor.d.ts +50 -0
- package/dist/types/media/sticker/sticker-pack.d.ts +6 -0
- package/dist/types/media/{WaMediaTransferClient.d.ts → transfer/WaMediaTransferClient.d.ts} +33 -12
- package/dist/types/media/transfer/conn.d.ts +7 -0
- package/dist/types/media/types.d.ts +10 -5
- 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/crypto/addon-crypto.d.ts +78 -0
- package/dist/types/message/{icdc.d.ts → crypto/icdc.d.ts} +6 -6
- 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 +218 -28
- package/dist/types/mex.d.ts +2 -0
- package/dist/types/proto.d.ts +2 -2
- package/dist/types/protocol/abprops.d.ts +151 -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 +9 -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 +20 -3
- package/dist/types/protocol/defaults.d.ts +3 -0
- package/dist/types/protocol/email.d.ts +32 -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 +79 -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 +24 -0
- package/dist/types/protocol/notification.d.ts +22 -0
- package/dist/types/protocol/presence.d.ts +16 -0
- package/dist/types/protocol/status.d.ts +7 -0
- package/dist/types/protocol/stream.d.ts +1 -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 +6 -1
- 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 +13 -0
- package/dist/types/signal/api/SignalIdentitySyncApi.d.ts +12 -3
- 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 -4
- 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 -62
- package/dist/types/signal/group/SenderKeyChain.d.ts +2 -2
- package/dist/types/signal/group/SenderKeyManager.d.ts +24 -2
- 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 +7 -1
- package/dist/types/signal/session/SignalProtocol.d.ts +66 -2
- package/dist/types/signal/session/SignalRatchet.d.ts +2 -3
- package/dist/types/signal/session/SignalSerializer.d.ts +2 -1
- 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 +18 -2
- package/dist/types/signal/types.d.ts +16 -4
- 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/identity.store.d.ts +11 -0
- package/dist/types/store/contracts/message-secret.store.d.ts +16 -0
- package/dist/types/store/contracts/message.store.d.ts +0 -2
- package/dist/types/store/contracts/pre-key.store.d.ts +13 -0
- package/dist/types/store/contracts/session.store.d.ts +14 -0
- package/dist/types/store/contracts/signal.store.d.ts +1 -34
- package/dist/types/store/createStore.d.ts +54 -2
- package/dist/types/store/index.d.ts +22 -13
- package/dist/types/store/locks/group-metadata.lock.d.ts +2 -0
- package/dist/types/store/locks/identity.lock.d.ts +3 -0
- package/dist/types/store/locks/message-secret.lock.d.ts +3 -0
- package/dist/types/store/locks/pre-key.lock.d.ts +3 -0
- package/dist/types/store/locks/session.lock.d.ts +3 -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/memory/identity.store.d.ts +18 -0
- package/dist/types/store/memory/message-secret.store.d.ts +31 -0
- package/dist/types/store/{providers/memory → memory}/message.store.d.ts +1 -1
- package/dist/types/store/memory/pre-key.store.d.ts +23 -0
- 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 +23 -4
- package/dist/types/store/{providers/memory → memory}/sender-key.store.d.ts +2 -2
- package/dist/types/store/memory/session.store.d.ts +21 -0
- package/dist/types/store/memory/signal.store.d.ts +16 -0
- package/dist/types/store/{providers/memory → memory}/thread.store.d.ts +1 -1
- package/dist/types/store/noop.store.d.ts +6 -2
- package/dist/types/store/types.d.ts +271 -7
- package/dist/types/transport/WaComms.d.ts +5 -0
- package/dist/types/transport/WaWebSocket.d.ts +6 -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 +9 -0
- package/dist/types/transport/keepalive/WaKeepAlive.d.ts +11 -1
- package/dist/types/transport/node/WaMobileTcpSocket.d.ts +24 -0
- package/dist/types/transport/node/WaNodeOrchestrator.d.ts +11 -2
- package/dist/types/transport/node/WaNodeTransport.d.ts +13 -0
- package/dist/types/transport/node/builders/abprops.d.ts +5 -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/device.d.ts +2 -0
- package/dist/types/transport/node/builders/email.d.ts +11 -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/offline.d.ts +2 -0
- package/dist/types/transport/node/builders/passive.d.ts +3 -0
- package/dist/types/transport/node/builders/prekeys.d.ts +4 -3
- package/dist/types/transport/node/builders/presence.d.ts +13 -0
- 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 +3 -1
- package/dist/types/transport/node/mex/argo-decoder.d.ts +11 -0
- package/dist/types/transport/node/mex/client.d.ts +29 -0
- 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 +34 -0
- package/dist/types/transport/noise/WaNoiseCert.d.ts +12 -1
- package/dist/types/transport/noise/WaNoiseHandshake.d.ts +12 -6
- package/dist/types/transport/noise/WaNoiseSession.d.ts +1 -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 +15 -0
- 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 +37 -11
- 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/auth/flow/WaAuthCredentialsFlow.js +0 -130
- package/dist/auth/pairing/WaPairingCodeCrypto.js +0 -77
- package/dist/auth/pairing/constants.js +0 -5
- package/dist/client/connection/WaKeyShareCoordinator.js +0 -63
- package/dist/client/events/chat.js +0 -227
- package/dist/client/incoming.js +0 -269
- package/dist/client/mailbox.js +0 -50
- package/dist/client/messages.js +0 -228
- package/dist/esm/auth/flow/WaAuthCredentialsFlow.js +0 -125
- package/dist/esm/auth/pairing/WaPairingCodeCrypto.js +0 -73
- package/dist/esm/auth/pairing/constants.js +0 -2
- package/dist/esm/client/connection/WaKeyShareCoordinator.js +0 -59
- package/dist/esm/client/events/chat.js +0 -224
- package/dist/esm/client/incoming.js +0 -260
- package/dist/esm/client/mailbox.js +0 -47
- package/dist/esm/client/messages.js +0 -224
- package/dist/esm/media/WaMediaCrypto.js +0 -304
- package/dist/esm/message/addon-crypto.js +0 -59
- package/dist/esm/message/incoming.js +0 -325
- package/dist/esm/message/phash.js +0 -27
- package/dist/esm/signal/crypto/WaAdvSignature.js +0 -64
- 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 -64
- package/dist/esm/store/providers/memory/signal.store.js +0 -199
- package/dist/esm/transport/node/builders/index.js +0 -11
- package/dist/media/WaMediaCrypto.js +0 -308
- package/dist/message/addon-crypto.js +0 -65
- package/dist/message/phash.js +0 -30
- package/dist/signal/crypto/WaAdvSignature.js +0 -76
- 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 -68
- package/dist/store/providers/memory/signal.store.js +0 -203
- package/dist/transport/node/builders/index.js +0 -51
- package/dist/types/appstate/WaAppStateSyncClient.d.ts +0 -66
- package/dist/types/auth/flow/WaAuthCredentialsFlow.d.ts +0 -14
- package/dist/types/auth/pairing/constants.d.ts +0 -2
- package/dist/types/client/connection/WaKeyShareCoordinator.d.ts +0 -14
- package/dist/types/client/events/chat.d.ts +0 -3
- package/dist/types/client/history-sync.d.ts +0 -20
- package/dist/types/client/incoming.d.ts +0 -37
- package/dist/types/client/mailbox.d.ts +0 -10
- package/dist/types/client/messages.d.ts +0 -16
- package/dist/types/client/messaging/participants.d.ts +0 -13
- package/dist/types/media/WaMediaCrypto.d.ts +0 -13
- package/dist/types/media/conn.d.ts +0 -3
- package/dist/types/message/addon-crypto.d.ts +0 -25
- package/dist/types/message/content.d.ts +0 -12
- package/dist/types/message/incoming.d.ts +0 -18
- package/dist/types/signal/crypto/constants.d.ts +0 -5
- 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/store/providers/memory/signal.store.d.ts +0 -58
- package/dist/types/transport/node/builders/index.d.ts +0 -11
- 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/message/{device-sent.js → encode/device-sent.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
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
<
|
|
1
|
+
<p align="center">
|
|
2
|
+
<img src=".github/assets/logo.png" alt="zapo" width="400" />
|
|
3
|
+
</p>
|
|
2
4
|
|
|
3
5
|
<p align="center">
|
|
4
6
|
<strong>High-performance TypeScript implementation of the WhatsApp Web protocol.</strong><br />
|
|
@@ -14,235 +16,157 @@
|
|
|
14
16
|
<img alt="focus" src="https://img.shields.io/badge/focus-high--scale%20%2B%20multi--session-0A7EA4" />
|
|
15
17
|
</p>
|
|
16
18
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
- [Architecture at a Glance](#architecture-at-a-glance)
|
|
23
|
-
- [Requirements](#requirements)
|
|
24
|
-
- [Quick Start](#quick-start)
|
|
25
|
-
- [Minimal Usage](#minimal-usage)
|
|
26
|
-
- [Useful Scripts](#useful-scripts)
|
|
27
|
-
- [Versioning and Releases](#versioning-and-releases)
|
|
28
|
-
- [GitHub Release Notes](#github-release-notes)
|
|
29
|
-
- [Protobuf Generation](#protobuf-generation)
|
|
30
|
-
- [Support the Project](#support-the-project)
|
|
31
|
-
- [Contribution Notes](#contribution-notes)
|
|
32
|
-
- [Disclaimer](#disclaimer)
|
|
33
|
-
|
|
34
|
-
## Stability Notice
|
|
35
|
-
|
|
36
|
-
> Frequent breaking changes are expected until the first major release.
|
|
37
|
-
> If you run `zapo` in long-lived environments, pin exact versions and validate upgrades carefully.
|
|
38
|
-
|
|
39
|
-
## What Makes This Project Different
|
|
40
|
-
|
|
41
|
-
`zapo` is an independent runtime implementation (not a wrapper/fork of an existing WhatsApp library).
|
|
42
|
-
|
|
43
|
-
- No wrappers around third-party WhatsApp SDKs
|
|
44
|
-
- No forks of existing WhatsApp client libraries
|
|
45
|
-
- No copied protocol abstractions from community libraries
|
|
46
|
-
- `WAProto.proto` is sourced from `wppconnect-team/wa-proto` and compiled locally for runtime/types
|
|
47
|
-
|
|
48
|
-
The protocol source of truth is the deobfuscated WhatsApp Web.
|
|
49
|
-
The target is behavior parity with WhatsApp Web, while improving internal performance and memory efficiency.
|
|
50
|
-
|
|
51
|
-
## Core Principles
|
|
52
|
-
|
|
53
|
-
These principles drive implementation decisions:
|
|
54
|
-
|
|
55
|
-
- `index-first`: validate protocol behavior against WhatsApp Web before implementing anything
|
|
56
|
-
- `performance-first`: optimize for low CPU, low RAM, low allocations, and zero-copy in hot paths
|
|
57
|
-
- `async-first`: I/O, network, and crypto operations are async
|
|
58
|
-
|
|
59
|
-
## Architecture at a Glance
|
|
60
|
-
|
|
61
|
-
### Patterns
|
|
62
|
-
|
|
63
|
-
- Coordinator-first feature design in `src/client/coordinators/`
|
|
64
|
-
- Pure node builders in `src/transport/node/builders/` for reusable protocol stanzas
|
|
65
|
-
- Incoming parsers/normalizers in `src/client/events/`, with coordinators handling orchestration only
|
|
66
|
-
- Typed store contracts in `src/store/contracts/` with `memory` and `sqlite` providers
|
|
67
|
-
- Protocol constants in `src/protocol/` using `Object.freeze({...} as const)`
|
|
68
|
-
|
|
69
|
-
### Engineering conventions
|
|
70
|
-
|
|
71
|
-
- `Uint8Array` everywhere for binary data (`Buffer` is avoided)
|
|
72
|
-
- Zero-copy (`subarray`, byte views) in critical paths
|
|
73
|
-
- Bounded in-memory structures to prevent unbounded growth
|
|
74
|
-
- Path aliases (`@client`, `@crypto`, `@store`, etc.), no relative `../` imports
|
|
75
|
-
- Named exports only, no default exports
|
|
76
|
-
- No enums (`Object.freeze` + `as const` instead)
|
|
77
|
-
|
|
78
|
-
## Requirements
|
|
79
|
-
|
|
80
|
-
- Node.js `>= 20.9.0`
|
|
81
|
-
- npm
|
|
82
|
-
|
|
83
|
-
Runtime dependencies:
|
|
84
|
-
|
|
85
|
-
- 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>
|
|
86
24
|
|
|
87
|
-
|
|
25
|
+
---
|
|
88
26
|
|
|
89
|
-
|
|
90
|
-
- `pino` and `pino-pretty` for structured logging
|
|
27
|
+
## Stability Notice
|
|
91
28
|
|
|
92
|
-
|
|
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.
|
|
93
32
|
|
|
94
|
-
|
|
33
|
+
## Install
|
|
95
34
|
|
|
96
35
|
```bash
|
|
97
|
-
npm install
|
|
36
|
+
npm install zapo-js
|
|
98
37
|
```
|
|
99
38
|
|
|
100
|
-
|
|
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.
|
|
101
42
|
|
|
102
43
|
```bash
|
|
103
|
-
|
|
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
|
|
104
57
|
```
|
|
105
58
|
|
|
106
|
-
|
|
107
|
-
4. Send `ping` to the connected session, the example replies with `pong`.
|
|
108
|
-
|
|
109
|
-
Auth state is persisted in `.auth/state.sqlite`.
|
|
110
|
-
|
|
111
|
-
## Minimal Usage
|
|
59
|
+
## Quick Start
|
|
112
60
|
|
|
113
61
|
```ts
|
|
114
|
-
import {
|
|
62
|
+
import { ConsoleLogger, createStore, WaClient } from 'zapo-js'
|
|
115
63
|
import { createSqliteStore } from '@zapo-js/store-sqlite'
|
|
116
64
|
|
|
117
|
-
const logger = await createPinoLogger({
|
|
118
|
-
level: 'info',
|
|
119
|
-
pretty: true
|
|
120
|
-
})
|
|
121
|
-
|
|
122
65
|
const store = createStore({
|
|
123
66
|
backends: {
|
|
124
|
-
sqlite: createSqliteStore({
|
|
125
|
-
path: '.auth/state.sqlite',
|
|
126
|
-
driver: 'auto'
|
|
127
|
-
})
|
|
67
|
+
sqlite: createSqliteStore({ path: '.auth/state.sqlite' })
|
|
128
68
|
},
|
|
129
69
|
providers: {
|
|
130
70
|
auth: 'sqlite',
|
|
131
71
|
signal: 'sqlite',
|
|
72
|
+
preKey: 'sqlite',
|
|
73
|
+
session: 'sqlite',
|
|
74
|
+
identity: 'sqlite',
|
|
132
75
|
senderKey: 'sqlite',
|
|
133
76
|
appState: 'sqlite',
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
77
|
+
privacyToken: 'sqlite',
|
|
78
|
+
messages: 'sqlite', // 'none' to skip the message archive
|
|
79
|
+
threads: 'sqlite', // 'none' to skip
|
|
80
|
+
contacts: 'sqlite' // 'none' to skip
|
|
138
81
|
}
|
|
139
82
|
})
|
|
140
83
|
|
|
141
|
-
const client = new WaClient(
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
nodeQueryTimeoutMs: 30_000,
|
|
147
|
-
history: {
|
|
148
|
-
enabled: true,
|
|
149
|
-
requireFullSync: true
|
|
150
|
-
}
|
|
151
|
-
},
|
|
152
|
-
logger
|
|
153
|
-
)
|
|
84
|
+
const client = new WaClient({ store, sessionId: 'default' }, new ConsoleLogger('info'))
|
|
85
|
+
|
|
86
|
+
client.on('auth_qr', ({ qr }) => {
|
|
87
|
+
console.log('scan this:', qr)
|
|
88
|
+
})
|
|
154
89
|
|
|
155
|
-
client.on('
|
|
156
|
-
console.log('
|
|
90
|
+
client.on('auth_paired', ({ credentials }) => {
|
|
91
|
+
console.log('paired as', credentials.meJid)
|
|
157
92
|
})
|
|
158
93
|
|
|
159
|
-
client.on('message', (event) => {
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
})
|
|
94
|
+
client.on('message', async (event) => {
|
|
95
|
+
if (event.message?.conversation === 'ping') {
|
|
96
|
+
await client.message.send(event.key.remoteJid, 'pong')
|
|
97
|
+
}
|
|
164
98
|
})
|
|
165
99
|
|
|
166
100
|
await client.connect()
|
|
167
101
|
```
|
|
168
102
|
|
|
169
|
-
|
|
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/)**.
|
|
170
108
|
|
|
171
|
-
|
|
172
|
-
- `npm run test` - run unit tests (non-flow)
|
|
173
|
-
- `npm run test:flow` - run real-flow tests
|
|
174
|
-
- `npm run test:coverage` - run coverage report
|
|
175
|
-
- `npm run typecheck` - type-check project
|
|
176
|
-
- `npm run lint` - lint source files
|
|
177
|
-
- `npm run format` - format codebase
|
|
178
|
-
- `npm run proto:generate` - regenerate protobuf runtime/types from `proto/WAProto.proto`
|
|
179
|
-
- `npm run changeset` - create a versioning entry (`patch`/`minor`/`major`)
|
|
180
|
-
- `npm run changeset:status` - show pending versioning entries
|
|
181
|
-
- `npm run version:packages` - apply pending versions and update `CHANGELOG.md`
|
|
182
|
-
- `npm run release:publish` - build and publish to npm with Changesets
|
|
109
|
+
## Packages
|
|
183
110
|
|
|
184
|
-
|
|
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.
|
|
185
114
|
|
|
186
|
-
|
|
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. |
|
|
187
125
|
|
|
188
|
-
|
|
126
|
+
Each package's README has the install + config + integration notes.
|
|
189
127
|
|
|
190
|
-
|
|
191
|
-
npm run changeset
|
|
192
|
-
npm run changeset:status
|
|
193
|
-
npm run version:packages
|
|
194
|
-
npm run release:publish
|
|
195
|
-
```
|
|
196
|
-
|
|
197
|
-
Notes:
|
|
198
|
-
|
|
199
|
-
- Changesets are stored in `.changeset/*.md`
|
|
200
|
-
- Multiple changesets are merged automatically into the next release
|
|
201
|
-
- SemVer is manual and intentional: `patch`, `minor`, `major`
|
|
128
|
+
## Documentation
|
|
202
129
|
|
|
203
|
-
|
|
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)
|
|
204
139
|
|
|
205
|
-
|
|
140
|
+
## Contributing
|
|
206
141
|
|
|
207
|
-
|
|
208
|
-
|
|
142
|
+
Pull requests are welcome. See [`CONTRIBUTING.md`](CONTRIBUTING.md) for
|
|
143
|
+
setup, repo layout, CI, release flow, and the conventions PRs must follow.
|
|
209
144
|
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
git push origin v0.1.1
|
|
215
|
-
```
|
|
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.
|
|
216
149
|
|
|
217
|
-
|
|
150
|
+
## Security
|
|
218
151
|
|
|
219
|
-
|
|
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).
|
|
220
157
|
|
|
221
|
-
|
|
158
|
+
## License
|
|
222
159
|
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
- Ensures proto tooling dependencies are installed in `proto/`
|
|
226
|
-
- Generates and minifies `proto/index.js`
|
|
227
|
-
- Regenerates compact typings at `proto/index.d.ts`
|
|
160
|
+
[MIT](LICENSE) © vinikjkkj
|
|
228
161
|
|
|
229
162
|
## Support the Project
|
|
230
163
|
|
|
231
|
-
If `zapo` is useful in your production or study setup, you can support
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
## Contribution Notes
|
|
236
|
-
|
|
237
|
-
Before opening a PR:
|
|
238
|
-
|
|
239
|
-
- Validate behavior against WhatsApp Web
|
|
240
|
-
- Keep performance and memory constraints in mind
|
|
241
|
-
- Keep node building/parsing aligned with project patterns
|
|
242
|
-
- Avoid API changes that diverge from observed WhatsApp Web behavior
|
|
243
|
-
- 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).
|
|
244
167
|
|
|
245
168
|
## Disclaimer
|
|
246
169
|
|
|
247
|
-
This project is an independent implementation for engineering and
|
|
248
|
-
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,91 +1,102 @@
|
|
|
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
|
|
12
|
-
const
|
|
13
|
-
const primitives_2 = require("../util/primitives");
|
|
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");
|
|
14
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
|
+
*/
|
|
15
19
|
class WaAppStateCrypto {
|
|
16
|
-
constructor(derivedKeysCacheMaxSize = DEFAULT_DERIVED_KEYS_CACHE_MAX_SIZE) {
|
|
20
|
+
constructor(derivedKeysCacheMaxSize = DEFAULT_DERIVED_KEYS_CACHE_MAX_SIZE, skipMacVerification = false) {
|
|
17
21
|
this.derivedKeysCache = new Map();
|
|
18
22
|
this.derivedKeysCacheMaxSize = (0, primitives_2.normalizeNonNegativeInteger)(derivedKeysCacheMaxSize, DEFAULT_DERIVED_KEYS_CACHE_MAX_SIZE);
|
|
23
|
+
this.skipMacVerification = skipMacVerification;
|
|
19
24
|
}
|
|
25
|
+
get isMacVerificationSkipped() {
|
|
26
|
+
return this.skipMacVerification;
|
|
27
|
+
}
|
|
28
|
+
/** Empties the derived-keys LRU cache (e.g. after a session reset). */
|
|
20
29
|
clearCache() {
|
|
21
30
|
this.derivedKeysCache.clear();
|
|
22
31
|
}
|
|
23
|
-
|
|
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) {
|
|
24
37
|
const cacheKey = (0, bytes_1.bytesToBase64)(keyData);
|
|
25
38
|
const cached = this.derivedKeysCache.get(cacheKey);
|
|
26
39
|
if (cached) {
|
|
27
40
|
this.touchDerivedKeysCacheEntry(cacheKey, cached);
|
|
28
41
|
return cached;
|
|
29
42
|
}
|
|
30
|
-
const derived =
|
|
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);
|
|
31
44
|
const keys = {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
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)
|
|
37
50
|
};
|
|
38
51
|
this.touchDerivedKeysCacheEntry(cacheKey, keys);
|
|
39
52
|
return keys;
|
|
40
53
|
}
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
return (0, primitives_1.
|
|
54
|
+
/** Computes the HMAC-SHA-256 index MAC over `indexBytes`. */
|
|
55
|
+
generateIndexMac(indexHmacKey, indexBytes) {
|
|
56
|
+
return (0, primitives_1.hmacSha256Sign)(indexHmacKey, indexBytes);
|
|
44
57
|
}
|
|
58
|
+
/** Encrypts a single mutation value with AES-CBC + HMAC value-MAC. */
|
|
45
59
|
async encryptMutation(args) {
|
|
46
|
-
const derivedKeys =
|
|
47
|
-
const indexBytes =
|
|
60
|
+
const derivedKeys = this.deriveKeys(args.keyData);
|
|
61
|
+
const indexBytes = bytes_1.TEXT_ENCODER.encode(args.index);
|
|
48
62
|
const encoded = _proto_1.proto.SyncActionData.encode({
|
|
49
63
|
index: indexBytes,
|
|
50
64
|
value: args.value ?? undefined,
|
|
51
|
-
padding:
|
|
65
|
+
padding: bytes_1.EMPTY_BYTES,
|
|
52
66
|
version: args.version
|
|
53
67
|
}).finish();
|
|
54
68
|
const iv = args.iv ?? (await (0, random_1.randomBytesAsync)(constants_1.APP_STATE_IV_LENGTH));
|
|
55
69
|
if (iv.byteLength !== constants_1.APP_STATE_IV_LENGTH) {
|
|
56
70
|
throw new Error(`invalid IV length ${iv.byteLength}`);
|
|
57
71
|
}
|
|
58
|
-
const
|
|
59
|
-
const
|
|
60
|
-
const cipherText = await (0, primitives_1.aesCbcEncrypt)(encryptionKey, iv, encoded);
|
|
61
|
-
const cipherWithIv = (0, bytes_2.concatBytes)([iv, cipherText]);
|
|
72
|
+
const indexMac = this.generateIndexMac(derivedKeys.indexHmacKey, indexBytes);
|
|
73
|
+
const cipherText = (0, primitives_1.aesCbcEncrypt)(derivedKeys.valueEncryptionAesKey, iv, encoded);
|
|
62
74
|
const associatedData = this.generateAssociatedData(args.operation, args.keyId);
|
|
63
|
-
const
|
|
64
|
-
this.generateValueMac(derivedKeys.valueMacKey, associatedData, cipherWithIv),
|
|
65
|
-
indexMacPromise
|
|
66
|
-
]);
|
|
75
|
+
const valueMac = this.generateValueMac(derivedKeys.valueMacHmacKey, associatedData, iv, cipherText);
|
|
67
76
|
return {
|
|
68
77
|
indexMac,
|
|
69
|
-
valueBlob: (0,
|
|
78
|
+
valueBlob: (0, bytes_1.concatBytes)([iv, cipherText, valueMac]),
|
|
70
79
|
valueMac
|
|
71
80
|
};
|
|
72
81
|
}
|
|
82
|
+
/** Verifies and decrypts a single app-state mutation. */
|
|
83
|
+
// eslint-disable-next-line @typescript-eslint/require-await
|
|
73
84
|
async decryptMutation(args) {
|
|
74
85
|
if (args.valueBlob.byteLength < constants_1.APP_STATE_IV_LENGTH + constants_1.APP_STATE_VALUE_MAC_LENGTH) {
|
|
75
86
|
throw new Error('invalid mutation value blob');
|
|
76
87
|
}
|
|
77
|
-
const derivedKeys =
|
|
88
|
+
const derivedKeys = this.deriveKeys(args.keyData);
|
|
78
89
|
const iv = args.valueBlob.subarray(0, constants_1.APP_STATE_IV_LENGTH);
|
|
79
90
|
const mac = args.valueBlob.subarray(args.valueBlob.byteLength - constants_1.APP_STATE_VALUE_MAC_LENGTH);
|
|
80
91
|
const cipherText = args.valueBlob.subarray(constants_1.APP_STATE_IV_LENGTH, args.valueBlob.byteLength - constants_1.APP_STATE_VALUE_MAC_LENGTH);
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
92
|
+
if (!this.skipMacVerification) {
|
|
93
|
+
const associatedData = this.generateAssociatedData(args.operation, args.keyId);
|
|
94
|
+
const expectedMac = this.generateValueMac(derivedKeys.valueMacHmacKey, associatedData, iv, cipherText);
|
|
95
|
+
if (!(0, bytes_1.uint8TimingSafeEqual)(mac, expectedMac)) {
|
|
96
|
+
throw new Error('mutation value MAC mismatch');
|
|
97
|
+
}
|
|
86
98
|
}
|
|
87
|
-
const
|
|
88
|
-
const plaintext = await (0, primitives_1.aesCbcDecrypt)(decryptionKey, iv, cipherText);
|
|
99
|
+
const plaintext = (0, primitives_1.aesCbcDecrypt)(derivedKeys.valueEncryptionAesKey, iv, cipherText);
|
|
89
100
|
const syncActionData = _proto_1.proto.SyncActionData.decode(plaintext);
|
|
90
101
|
if (!syncActionData.index) {
|
|
91
102
|
throw new Error('missing sync action index');
|
|
@@ -93,55 +104,62 @@ class WaAppStateCrypto {
|
|
|
93
104
|
if (syncActionData.version === null || syncActionData.version === undefined) {
|
|
94
105
|
throw new Error('missing sync action version');
|
|
95
106
|
}
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
107
|
+
if (!this.skipMacVerification) {
|
|
108
|
+
const generatedIndexMac = this.generateIndexMac(derivedKeys.indexHmacKey, syncActionData.index);
|
|
109
|
+
if (!(0, bytes_1.uint8TimingSafeEqual)(generatedIndexMac, args.indexMac)) {
|
|
110
|
+
throw new Error('mutation index MAC mismatch');
|
|
111
|
+
}
|
|
99
112
|
}
|
|
100
113
|
return {
|
|
101
|
-
index:
|
|
114
|
+
index: bytes_1.TEXT_DECODER.decode(syncActionData.index),
|
|
102
115
|
value: syncActionData.value ?? null,
|
|
103
116
|
version: syncActionData.version,
|
|
104
117
|
indexMac: args.indexMac,
|
|
105
118
|
valueMac: mac
|
|
106
119
|
};
|
|
107
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
|
|
108
123
|
async generateSnapshotMac(keyData, ltHash, version, collectionName) {
|
|
109
|
-
const derivedKeys =
|
|
110
|
-
|
|
124
|
+
const derivedKeys = this.deriveKeys(keyData);
|
|
125
|
+
return (0, primitives_1.hmacSha256Sign)(derivedKeys.snapshotMacHmacKey, [
|
|
111
126
|
ltHash,
|
|
112
|
-
(0,
|
|
113
|
-
|
|
127
|
+
(0, bytes_1.intToBytes)(8, version),
|
|
128
|
+
bytes_1.TEXT_ENCODER.encode(collectionName)
|
|
114
129
|
]);
|
|
115
|
-
const key = await (0, primitives_1.importHmacKey)(derivedKeys.snapshotMacKey);
|
|
116
|
-
return (0, primitives_1.hmacSign)(key, payload);
|
|
117
130
|
}
|
|
131
|
+
/** Generates the HMAC-SHA-512 patch MAC binding mutations to a collection version. */
|
|
132
|
+
// eslint-disable-next-line @typescript-eslint/require-await
|
|
118
133
|
async generatePatchMac(keyData, snapshotMac, valueMacs, version, collectionName) {
|
|
119
|
-
const derivedKeys =
|
|
120
|
-
|
|
134
|
+
const derivedKeys = this.deriveKeys(keyData);
|
|
135
|
+
return (0, primitives_1.hmacSha256Sign)(derivedKeys.patchMacHmacKey, [
|
|
121
136
|
snapshotMac,
|
|
122
137
|
...valueMacs,
|
|
123
|
-
(0,
|
|
124
|
-
|
|
138
|
+
(0, bytes_1.intToBytes)(8, version),
|
|
139
|
+
bytes_1.TEXT_ENCODER.encode(collectionName)
|
|
125
140
|
]);
|
|
126
|
-
const key = await (0, primitives_1.importHmacKey)(derivedKeys.patchMacKey);
|
|
127
|
-
return (0, primitives_1.hmacSign)(key, payload);
|
|
128
141
|
}
|
|
142
|
+
/** Adds value MACs into the running LT-hash digest for a collection. */
|
|
143
|
+
// eslint-disable-next-line @typescript-eslint/require-await
|
|
129
144
|
async ltHashAdd(base, addValues) {
|
|
130
145
|
return this.ltHashApply(base, addValues, (left, right) => left + right);
|
|
131
146
|
}
|
|
147
|
+
/** Removes value MACs from the running LT-hash digest (for `remove` operations). */
|
|
148
|
+
// eslint-disable-next-line @typescript-eslint/require-await
|
|
132
149
|
async ltHashSubtract(base, removeValues) {
|
|
133
150
|
return this.ltHashApply(base, removeValues, (left, right) => left - right);
|
|
134
151
|
}
|
|
152
|
+
/** Combined subtract+add LT-hash update used when a key's value MAC changes in place. */
|
|
135
153
|
async ltHashSubtractThenAdd(base, addValues, removeValues) {
|
|
136
154
|
const subtractResult = await this.ltHashSubtract(base, removeValues);
|
|
137
155
|
const hash = await this.ltHashAdd(subtractResult, addValues);
|
|
138
156
|
return { hash, subtractResult };
|
|
139
157
|
}
|
|
140
|
-
|
|
158
|
+
ltHashApply(base, values, combine) {
|
|
141
159
|
if (values.length === 0) {
|
|
142
160
|
return base;
|
|
143
161
|
}
|
|
144
|
-
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));
|
|
145
163
|
const out = new Uint8Array(base.byteLength);
|
|
146
164
|
this.pointwiseWithOverflow(base, expandedValues[0], combine, out);
|
|
147
165
|
for (let index = 1; index < expandedValues.length; index += 1) {
|
|
@@ -178,11 +196,10 @@ class WaAppStateCrypto {
|
|
|
178
196
|
out.set(keyId, 1);
|
|
179
197
|
return out;
|
|
180
198
|
}
|
|
181
|
-
|
|
199
|
+
generateValueMac(valueMacHmacKey, associatedData, iv, cipherText) {
|
|
182
200
|
const octetLength = new Uint8Array(constants_1.APP_STATE_MAC_OCTET_LENGTH);
|
|
183
201
|
octetLength[octetLength.length - 1] = associatedData.byteLength & 0xff;
|
|
184
|
-
const
|
|
185
|
-
const full = await (0, primitives_1.hmacSign)(key, (0, bytes_2.concatBytes)([associatedData, cipherWithIv, octetLength]));
|
|
202
|
+
const full = (0, primitives_1.hmacSha512Sign)(valueMacHmacKey, (0, bytes_1.concatBytes)([associatedData, iv, cipherText, octetLength]));
|
|
186
203
|
return full.subarray(0, constants_1.APP_STATE_VALUE_MAC_LENGTH);
|
|
187
204
|
}
|
|
188
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
|
|
28
|
-
Object.defineProperty(exports, "parseSyncResponse", { enumerable: true, get: function () { return
|
|
29
|
-
var WaAppStateSyncClient_1 = require("./WaAppStateSyncClient");
|
|
28
|
+
var response_parser_1 = require("./parsers/response-parser");
|
|
29
|
+
Object.defineProperty(exports, "parseSyncResponse", { enumerable: true, get: function () { return response_parser_1.parseSyncResponse; } });
|
|
30
|
+
var WaAppStateSyncClient_1 = require("./sync/WaAppStateSyncClient");
|
|
30
31
|
Object.defineProperty(exports, "WaAppStateSyncClient", { enumerable: true, get: function () { return WaAppStateSyncClient_1.WaAppStateSyncClient; } });
|