zapo-js 0.1.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/README.md +235 -0
- package/dist/appstate/WaAppStateCrypto.js +202 -0
- package/dist/appstate/WaAppStateSyncClient.js +808 -0
- package/dist/appstate/WaAppStateSyncResponseParser.js +71 -0
- package/dist/appstate/constants.js +23 -0
- package/dist/appstate/index.js +28 -0
- package/dist/appstate/store/sqlite.js +55 -0
- package/dist/appstate/types.js +2 -0
- package/dist/appstate/utils.js +84 -0
- package/dist/auth/WaAuthClient.js +266 -0
- package/dist/auth/flow/WaAuthCredentialsFlow.js +123 -0
- package/dist/auth/index.js +27 -0
- package/dist/auth/pairing/WaPairingCodeCrypto.js +75 -0
- package/dist/auth/pairing/WaPairingFlow.js +328 -0
- package/dist/auth/pairing/WaQrFlow.js +86 -0
- package/dist/auth/pairing/constants.js +5 -0
- package/dist/auth/types.js +2 -0
- package/dist/client/WaClient.js +749 -0
- package/dist/client/WaClientFactory.js +381 -0
- package/dist/client/coordinators/WaGroupCoordinator.js +191 -0
- package/dist/client/coordinators/WaIncomingNodeCoordinator.js +315 -0
- package/dist/client/coordinators/WaMessageDispatchCoordinator.js +1061 -0
- package/dist/client/coordinators/WaPassiveTasksCoordinator.js +200 -0
- package/dist/client/coordinators/WaRetryCoordinator.js +494 -0
- package/dist/client/coordinators/WaStreamControlCoordinator.js +123 -0
- package/dist/client/dirty.js +254 -0
- package/dist/client/events/chat.js +226 -0
- package/dist/client/events/group.js +410 -0
- package/dist/client/history-sync.js +122 -0
- package/dist/client/incoming.js +236 -0
- package/dist/client/index.js +5 -0
- package/dist/client/mailbox.js +49 -0
- package/dist/client/messages.js +152 -0
- package/dist/client/types.js +2 -0
- package/dist/crypto/core/constants.js +4 -0
- package/dist/crypto/core/encoding.js +29 -0
- package/dist/crypto/core/hkdf.js +26 -0
- package/dist/crypto/core/index.js +43 -0
- package/dist/crypto/core/keys.js +73 -0
- package/dist/crypto/core/nonce.js +18 -0
- package/dist/crypto/core/primitives.js +121 -0
- package/dist/crypto/core/random.js +32 -0
- package/dist/crypto/curves/Ed25519.js +42 -0
- package/dist/crypto/curves/X25519.js +64 -0
- package/dist/crypto/curves/constants.js +6 -0
- package/dist/crypto/curves/types.js +9 -0
- package/dist/crypto/index.js +22 -0
- package/dist/crypto/math/constants.js +44 -0
- package/dist/crypto/math/edwards.js +64 -0
- package/dist/crypto/math/le.js +20 -0
- package/dist/crypto/math/mod.js +38 -0
- package/dist/crypto/math/types.js +2 -0
- package/dist/esm/appstate/WaAppStateCrypto.js +198 -0
- package/dist/esm/appstate/WaAppStateSyncClient.js +803 -0
- package/dist/esm/appstate/WaAppStateSyncResponseParser.js +67 -0
- package/dist/esm/appstate/constants.js +20 -0
- package/dist/esm/appstate/index.js +6 -0
- package/dist/esm/appstate/store/sqlite.js +49 -0
- package/dist/esm/appstate/types.js +1 -0
- package/dist/esm/appstate/utils.js +75 -0
- package/dist/esm/auth/WaAuthClient.js +262 -0
- package/dist/esm/auth/flow/WaAuthCredentialsFlow.js +118 -0
- package/dist/esm/auth/index.js +5 -0
- package/dist/esm/auth/pairing/WaPairingCodeCrypto.js +71 -0
- package/dist/esm/auth/pairing/WaPairingFlow.js +324 -0
- package/dist/esm/auth/pairing/WaQrFlow.js +82 -0
- package/dist/esm/auth/pairing/constants.js +2 -0
- package/dist/esm/auth/types.js +1 -0
- package/dist/esm/client/WaClient.js +745 -0
- package/dist/esm/client/WaClientFactory.js +377 -0
- package/dist/esm/client/coordinators/WaGroupCoordinator.js +188 -0
- package/dist/esm/client/coordinators/WaIncomingNodeCoordinator.js +311 -0
- package/dist/esm/client/coordinators/WaMessageDispatchCoordinator.js +1057 -0
- package/dist/esm/client/coordinators/WaPassiveTasksCoordinator.js +196 -0
- package/dist/esm/client/coordinators/WaRetryCoordinator.js +490 -0
- package/dist/esm/client/coordinators/WaStreamControlCoordinator.js +120 -0
- package/dist/esm/client/dirty.js +250 -0
- package/dist/esm/client/events/chat.js +223 -0
- package/dist/esm/client/events/group.js +407 -0
- package/dist/esm/client/history-sync.js +119 -0
- package/dist/esm/client/incoming.js +227 -0
- package/dist/esm/client/index.js +1 -0
- package/dist/esm/client/mailbox.js +46 -0
- package/dist/esm/client/messages.js +148 -0
- package/dist/esm/client/types.js +1 -0
- package/dist/esm/crypto/core/constants.js +1 -0
- package/dist/esm/crypto/core/encoding.js +25 -0
- package/dist/esm/crypto/core/hkdf.js +22 -0
- package/dist/esm/crypto/core/index.js +11 -0
- package/dist/esm/crypto/core/keys.js +66 -0
- package/dist/esm/crypto/core/nonce.js +15 -0
- package/dist/esm/crypto/core/primitives.js +102 -0
- package/dist/esm/crypto/core/random.js +28 -0
- package/dist/esm/crypto/curves/Ed25519.js +38 -0
- package/dist/esm/crypto/curves/X25519.js +58 -0
- package/dist/esm/crypto/curves/constants.js +3 -0
- package/dist/esm/crypto/curves/types.js +6 -0
- package/dist/esm/crypto/index.js +3 -0
- package/dist/esm/crypto/math/constants.js +41 -0
- package/dist/esm/crypto/math/edwards.js +60 -0
- package/dist/esm/crypto/math/le.js +16 -0
- package/dist/esm/crypto/math/mod.js +31 -0
- package/dist/esm/crypto/math/types.js +1 -0
- package/dist/esm/index.js +6 -0
- package/dist/esm/infra/log/ConsoleLogger.js +40 -0
- package/dist/esm/infra/log/PinoLogger.js +73 -0
- package/dist/esm/infra/log/types.js +1 -0
- package/dist/esm/infra/perf/BoundedTaskQueue.js +62 -0
- package/dist/esm/media/WaMediaCrypto.js +224 -0
- package/dist/esm/media/WaMediaTransferClient.js +361 -0
- package/dist/esm/media/conn.js +33 -0
- package/dist/esm/media/constants.js +18 -0
- package/dist/esm/media/index.js +3 -0
- package/dist/esm/media/types.js +1 -0
- package/dist/esm/message/WaMessageClient.js +210 -0
- package/dist/esm/message/ack.js +46 -0
- package/dist/esm/message/content.js +20 -0
- package/dist/esm/message/device-sent.js +49 -0
- package/dist/esm/message/incoming.js +318 -0
- package/dist/esm/message/index.js +2 -0
- package/dist/esm/message/padding.js +20 -0
- package/dist/esm/message/phash.js +25 -0
- package/dist/esm/message/types.js +1 -0
- package/dist/esm/package.json +3 -0
- package/dist/esm/proto.js +3 -0
- package/dist/esm/protocol/appstate.js +34 -0
- package/dist/esm/protocol/auth.js +12 -0
- package/dist/esm/protocol/browser.js +41 -0
- package/dist/esm/protocol/constants.js +11 -0
- package/dist/esm/protocol/defaults.js +27 -0
- package/dist/esm/protocol/dirty.js +26 -0
- package/dist/esm/protocol/group.js +5 -0
- package/dist/esm/protocol/index.js +11 -0
- package/dist/esm/protocol/jid.js +94 -0
- package/dist/esm/protocol/media.js +20 -0
- package/dist/esm/protocol/message.js +16 -0
- package/dist/esm/protocol/nodes.js +83 -0
- package/dist/esm/protocol/notification.js +50 -0
- package/dist/esm/protocol/stream.js +60 -0
- package/dist/esm/retry/constants.js +20 -0
- package/dist/esm/retry/index.js +5 -0
- package/dist/esm/retry/outbound.js +83 -0
- package/dist/esm/retry/parse.js +130 -0
- package/dist/esm/retry/reason.js +50 -0
- package/dist/esm/retry/replay.js +177 -0
- package/dist/esm/retry/types.js +1 -0
- package/dist/esm/signal/api/SignalDeviceSyncApi.js +185 -0
- package/dist/esm/signal/api/SignalDigestSyncApi.js +179 -0
- package/dist/esm/signal/api/SignalIdentitySyncApi.js +111 -0
- package/dist/esm/signal/api/SignalMissingPreKeysSyncApi.js +141 -0
- package/dist/esm/signal/api/SignalRotateKeyApi.js +59 -0
- package/dist/esm/signal/api/SignalSessionSyncApi.js +187 -0
- package/dist/esm/signal/api/codec.js +23 -0
- package/dist/esm/signal/api/constants.js +9 -0
- package/dist/esm/signal/api/prekeys.js +9 -0
- package/dist/esm/signal/constants.js +16 -0
- package/dist/esm/signal/crypto/WaAdvSignature.js +60 -0
- package/dist/esm/signal/crypto/constants.js +8 -0
- package/dist/esm/signal/group/SenderKeyChain.js +97 -0
- package/dist/esm/signal/group/SenderKeyCodec.js +46 -0
- package/dist/esm/signal/group/SenderKeyManager.js +176 -0
- package/dist/esm/signal/index.js +11 -0
- package/dist/esm/signal/registration/keygen.js +31 -0
- package/dist/esm/signal/registration/utils.js +16 -0
- package/dist/esm/signal/session/SignalProtocol.js +122 -0
- package/dist/esm/signal/session/SignalRatchet.js +260 -0
- package/dist/esm/signal/session/SignalSerializer.js +63 -0
- package/dist/esm/signal/session/SignalSession.js +153 -0
- package/dist/esm/signal/store/sqlite.js +310 -0
- package/dist/esm/signal/types.js +1 -0
- package/dist/esm/store/contracts/appstate.store.js +1 -0
- package/dist/esm/store/contracts/auth.store.js +1 -0
- package/dist/esm/store/contracts/contact.store.js +1 -0
- package/dist/esm/store/contracts/device-list.store.js +1 -0
- package/dist/esm/store/contracts/message.store.js +1 -0
- package/dist/esm/store/contracts/participants.store.js +1 -0
- package/dist/esm/store/contracts/retry.store.js +1 -0
- package/dist/esm/store/contracts/sender-key.store.js +1 -0
- package/dist/esm/store/contracts/signal.store.js +1 -0
- package/dist/esm/store/contracts/thread.store.js +1 -0
- package/dist/esm/store/createStore.js +278 -0
- package/dist/esm/store/index.js +20 -0
- package/dist/esm/store/noop.store.js +43 -0
- package/dist/esm/store/providers/memory/appstate.store.js +101 -0
- package/dist/esm/store/providers/memory/contact.store.js +23 -0
- package/dist/esm/store/providers/memory/device-list.store.js +86 -0
- package/dist/esm/store/providers/memory/message.store.js +40 -0
- package/dist/esm/store/providers/memory/participants.store.js +61 -0
- package/dist/esm/store/providers/memory/retry.store.js +71 -0
- package/dist/esm/store/providers/memory/sender-key.store.js +88 -0
- package/dist/esm/store/providers/memory/signal.store.js +170 -0
- package/dist/esm/store/providers/memory/thread.store.js +34 -0
- package/dist/esm/store/providers/sqlite/BaseSqliteStore.js +37 -0
- package/dist/esm/store/providers/sqlite/appstate.store.js +169 -0
- package/dist/esm/store/providers/sqlite/auth.store.js +176 -0
- package/dist/esm/store/providers/sqlite/connection.js +240 -0
- package/dist/esm/store/providers/sqlite/contact.store.js +61 -0
- package/dist/esm/store/providers/sqlite/device-list.store.js +155 -0
- package/dist/esm/store/providers/sqlite/message.store.js +119 -0
- package/dist/esm/store/providers/sqlite/migrations.js +347 -0
- package/dist/esm/store/providers/sqlite/participants.store.js +85 -0
- package/dist/esm/store/providers/sqlite/retry.store.js +144 -0
- package/dist/esm/store/providers/sqlite/sender-key.store.js +203 -0
- package/dist/esm/store/providers/sqlite/signal.store.js +353 -0
- package/dist/esm/store/providers/sqlite/thread.store.js +72 -0
- package/dist/esm/store/types.js +1 -0
- package/dist/esm/transport/WaComms.js +527 -0
- package/dist/esm/transport/WaWebSocket.js +361 -0
- package/dist/esm/transport/binary/constants.js +96 -0
- package/dist/esm/transport/binary/decoder.js +275 -0
- package/dist/esm/transport/binary/encoder.js +210 -0
- package/dist/esm/transport/binary/index.js +4 -0
- package/dist/esm/transport/binary/tokens.js +1280 -0
- package/dist/esm/transport/index.js +6 -0
- package/dist/esm/transport/keepalive/WaKeepAlive.js +141 -0
- package/dist/esm/transport/node/WaNodeOrchestrator.js +143 -0
- package/dist/esm/transport/node/WaNodeTransport.js +64 -0
- package/dist/esm/transport/node/builders/accountSync.js +101 -0
- package/dist/esm/transport/node/builders/group.js +47 -0
- package/dist/esm/transport/node/builders/index.js +7 -0
- package/dist/esm/transport/node/builders/media.js +10 -0
- package/dist/esm/transport/node/builders/message.js +317 -0
- package/dist/esm/transport/node/builders/pairing.js +130 -0
- package/dist/esm/transport/node/builders/prekeys.js +102 -0
- package/dist/esm/transport/node/builders/retry.js +116 -0
- package/dist/esm/transport/node/helpers.js +37 -0
- package/dist/esm/transport/node/query.js +53 -0
- package/dist/esm/transport/node/xml.js +39 -0
- package/dist/esm/transport/noise/WaClientPayload.js +162 -0
- package/dist/esm/transport/noise/WaFrameCodec.js +121 -0
- package/dist/esm/transport/noise/WaNoiseCert.js +74 -0
- package/dist/esm/transport/noise/WaNoiseHandshake.js +57 -0
- package/dist/esm/transport/noise/WaNoiseSession.js +322 -0
- package/dist/esm/transport/noise/WaNoiseSocket.js +17 -0
- package/dist/esm/transport/noise/constants.js +8 -0
- package/dist/esm/transport/noise/types.js +1 -0
- package/dist/esm/transport/stream/parse.js +91 -0
- package/dist/esm/transport/types.js +1 -0
- package/dist/esm/util/async.js +5 -0
- package/dist/esm/util/base64.js +18 -0
- package/dist/esm/util/bytes.js +275 -0
- package/dist/esm/util/coercion.js +56 -0
- package/dist/esm/util/collections.js +27 -0
- package/dist/esm/util/primitives.js +32 -0
- package/dist/esm/util/runtime.js +15 -0
- package/dist/esm/util/signal-address.js +5 -0
- package/dist/index.js +52 -0
- package/dist/infra/log/ConsoleLogger.js +44 -0
- package/dist/infra/log/PinoLogger.js +111 -0
- package/dist/infra/log/types.js +2 -0
- package/dist/infra/perf/BoundedTaskQueue.js +67 -0
- package/dist/media/WaMediaCrypto.js +228 -0
- package/dist/media/WaMediaTransferClient.js +365 -0
- package/dist/media/conn.js +36 -0
- package/dist/media/constants.js +21 -0
- package/dist/media/index.js +9 -0
- package/dist/media/types.js +2 -0
- package/dist/message/WaMessageClient.js +214 -0
- package/dist/message/ack.js +52 -0
- package/dist/message/content.js +24 -0
- package/dist/message/device-sent.js +53 -0
- package/dist/message/incoming.js +321 -0
- package/dist/message/index.js +20 -0
- package/dist/message/padding.js +24 -0
- package/dist/message/phash.js +28 -0
- package/dist/message/types.js +2 -0
- package/dist/proto.js +5 -0
- package/dist/protocol/appstate.js +37 -0
- package/dist/protocol/auth.js +15 -0
- package/dist/protocol/browser.js +45 -0
- package/dist/protocol/constants.js +46 -0
- package/dist/protocol/defaults.js +30 -0
- package/dist/protocol/dirty.js +29 -0
- package/dist/protocol/group.js +8 -0
- package/dist/protocol/index.js +53 -0
- package/dist/protocol/jid.js +107 -0
- package/dist/protocol/media.js +24 -0
- package/dist/protocol/message.js +19 -0
- package/dist/protocol/nodes.js +86 -0
- package/dist/protocol/notification.js +53 -0
- package/dist/protocol/stream.js +63 -0
- package/dist/retry/constants.js +23 -0
- package/dist/retry/index.js +19 -0
- package/dist/retry/outbound.js +88 -0
- package/dist/retry/parse.js +133 -0
- package/dist/retry/reason.js +53 -0
- package/dist/retry/replay.js +181 -0
- package/dist/retry/types.js +2 -0
- package/dist/signal/api/SignalDeviceSyncApi.js +189 -0
- package/dist/signal/api/SignalDigestSyncApi.js +183 -0
- package/dist/signal/api/SignalIdentitySyncApi.js +115 -0
- package/dist/signal/api/SignalMissingPreKeysSyncApi.js +145 -0
- package/dist/signal/api/SignalRotateKeyApi.js +63 -0
- package/dist/signal/api/SignalSessionSyncApi.js +191 -0
- package/dist/signal/api/codec.js +27 -0
- package/dist/signal/api/constants.js +12 -0
- package/dist/signal/api/prekeys.js +16 -0
- package/dist/signal/constants.js +19 -0
- package/dist/signal/crypto/WaAdvSignature.js +72 -0
- package/dist/signal/crypto/constants.js +11 -0
- package/dist/signal/group/SenderKeyChain.js +101 -0
- package/dist/signal/group/SenderKeyCodec.js +50 -0
- package/dist/signal/group/SenderKeyManager.js +180 -0
- package/dist/signal/index.js +29 -0
- package/dist/signal/registration/keygen.js +37 -0
- package/dist/signal/registration/utils.js +19 -0
- package/dist/signal/session/SignalProtocol.js +126 -0
- package/dist/signal/session/SignalRatchet.js +268 -0
- package/dist/signal/session/SignalSerializer.js +69 -0
- package/dist/signal/session/SignalSession.js +165 -0
- package/dist/signal/store/sqlite.js +324 -0
- package/dist/signal/types.js +2 -0
- package/dist/store/contracts/appstate.store.js +2 -0
- package/dist/store/contracts/auth.store.js +2 -0
- package/dist/store/contracts/contact.store.js +2 -0
- package/dist/store/contracts/device-list.store.js +2 -0
- package/dist/store/contracts/message.store.js +2 -0
- package/dist/store/contracts/participants.store.js +2 -0
- package/dist/store/contracts/retry.store.js +2 -0
- package/dist/store/contracts/sender-key.store.js +2 -0
- package/dist/store/contracts/signal.store.js +2 -0
- package/dist/store/contracts/thread.store.js +2 -0
- package/dist/store/createStore.js +281 -0
- package/dist/store/index.js +43 -0
- package/dist/store/noop.store.js +46 -0
- package/dist/store/providers/memory/appstate.store.js +105 -0
- package/dist/store/providers/memory/contact.store.js +27 -0
- package/dist/store/providers/memory/device-list.store.js +90 -0
- package/dist/store/providers/memory/message.store.js +44 -0
- package/dist/store/providers/memory/participants.store.js +65 -0
- package/dist/store/providers/memory/retry.store.js +75 -0
- package/dist/store/providers/memory/sender-key.store.js +92 -0
- package/dist/store/providers/memory/signal.store.js +174 -0
- package/dist/store/providers/memory/thread.store.js +38 -0
- package/dist/store/providers/sqlite/BaseSqliteStore.js +41 -0
- package/dist/store/providers/sqlite/appstate.store.js +173 -0
- package/dist/store/providers/sqlite/auth.store.js +180 -0
- package/dist/store/providers/sqlite/connection.js +276 -0
- package/dist/store/providers/sqlite/contact.store.js +65 -0
- package/dist/store/providers/sqlite/device-list.store.js +159 -0
- package/dist/store/providers/sqlite/message.store.js +123 -0
- package/dist/store/providers/sqlite/migrations.js +350 -0
- package/dist/store/providers/sqlite/participants.store.js +89 -0
- package/dist/store/providers/sqlite/retry.store.js +148 -0
- package/dist/store/providers/sqlite/sender-key.store.js +207 -0
- package/dist/store/providers/sqlite/signal.store.js +357 -0
- package/dist/store/providers/sqlite/thread.store.js +76 -0
- package/dist/store/types.js +2 -0
- package/dist/transport/WaComms.js +531 -0
- package/dist/transport/WaWebSocket.js +365 -0
- package/dist/transport/binary/constants.js +99 -0
- package/dist/transport/binary/decoder.js +279 -0
- package/dist/transport/binary/encoder.js +214 -0
- package/dist/transport/binary/index.js +23 -0
- package/dist/transport/binary/tokens.js +1283 -0
- package/dist/transport/index.js +18 -0
- package/dist/transport/keepalive/WaKeepAlive.js +145 -0
- package/dist/transport/node/WaNodeOrchestrator.js +147 -0
- package/dist/transport/node/WaNodeTransport.js +68 -0
- package/dist/transport/node/builders/accountSync.js +110 -0
- package/dist/transport/node/builders/group.js +52 -0
- package/dist/transport/node/builders/index.js +39 -0
- package/dist/transport/node/builders/media.js +13 -0
- package/dist/transport/node/builders/message.js +328 -0
- package/dist/transport/node/builders/pairing.js +137 -0
- package/dist/transport/node/builders/prekeys.js +107 -0
- package/dist/transport/node/builders/retry.js +119 -0
- package/dist/transport/node/helpers.js +46 -0
- package/dist/transport/node/query.js +59 -0
- package/dist/transport/node/xml.js +42 -0
- package/dist/transport/noise/WaClientPayload.js +166 -0
- package/dist/transport/noise/WaFrameCodec.js +125 -0
- package/dist/transport/noise/WaNoiseCert.js +77 -0
- package/dist/transport/noise/WaNoiseHandshake.js +61 -0
- package/dist/transport/noise/WaNoiseSession.js +326 -0
- package/dist/transport/noise/WaNoiseSocket.js +21 -0
- package/dist/transport/noise/constants.js +11 -0
- package/dist/transport/noise/types.js +2 -0
- package/dist/transport/stream/parse.js +97 -0
- package/dist/transport/types.js +2 -0
- package/dist/types/appstate/WaAppStateCrypto.d.ts +59 -0
- package/dist/types/appstate/WaAppStateSyncClient.d.ts +63 -0
- package/dist/types/appstate/WaAppStateSyncResponseParser.d.ts +12 -0
- package/dist/types/appstate/constants.d.ts +14 -0
- package/dist/types/appstate/index.d.ts +7 -0
- package/dist/types/appstate/store/sqlite.d.ts +21 -0
- package/dist/types/appstate/types.d.ts +66 -0
- package/dist/types/appstate/utils.d.ts +10 -0
- package/dist/types/auth/WaAuthClient.d.ts +61 -0
- package/dist/types/auth/flow/WaAuthCredentialsFlow.d.ts +14 -0
- package/dist/types/auth/index.d.ts +6 -0
- package/dist/types/auth/pairing/WaPairingCodeCrypto.d.ts +17 -0
- package/dist/types/auth/pairing/WaPairingFlow.d.ts +48 -0
- package/dist/types/auth/pairing/WaQrFlow.d.ts +23 -0
- package/dist/types/auth/pairing/constants.d.ts +2 -0
- package/dist/types/auth/types.d.ts +48 -0
- package/dist/types/client/WaClient.d.ts +97 -0
- package/dist/types/client/WaClientFactory.d.ts +83 -0
- package/dist/types/client/coordinators/WaGroupCoordinator.d.ts +48 -0
- package/dist/types/client/coordinators/WaIncomingNodeCoordinator.d.ts +60 -0
- package/dist/types/client/coordinators/WaMessageDispatchCoordinator.d.ts +90 -0
- package/dist/types/client/coordinators/WaPassiveTasksCoordinator.d.ts +43 -0
- package/dist/types/client/coordinators/WaRetryCoordinator.d.ts +61 -0
- package/dist/types/client/coordinators/WaStreamControlCoordinator.d.ts +17 -0
- package/dist/types/client/dirty.d.ts +17 -0
- package/dist/types/client/events/chat.d.ts +3 -0
- package/dist/types/client/events/group.d.ts +7 -0
- package/dist/types/client/history-sync.d.ts +17 -0
- package/dist/types/client/incoming.d.ts +35 -0
- package/dist/types/client/index.d.ts +2 -0
- package/dist/types/client/mailbox.d.ts +12 -0
- package/dist/types/client/messages.d.ts +17 -0
- package/dist/types/client/types.d.ts +235 -0
- package/dist/types/crypto/core/constants.d.ts +1 -0
- package/dist/types/crypto/core/encoding.d.ts +11 -0
- package/dist/types/crypto/core/hkdf.d.ts +8 -0
- package/dist/types/crypto/core/index.d.ts +11 -0
- package/dist/types/crypto/core/keys.d.ts +20 -0
- package/dist/types/crypto/core/nonce.d.ts +5 -0
- package/dist/types/crypto/core/primitives.d.ts +25 -0
- package/dist/types/crypto/core/random.d.ts +8 -0
- package/dist/types/crypto/curves/Ed25519.d.ts +7 -0
- package/dist/types/crypto/curves/X25519.d.ts +8 -0
- package/dist/types/crypto/curves/constants.d.ts +2 -0
- package/dist/types/crypto/curves/types.d.ts +10 -0
- package/dist/types/crypto/index.d.ts +3 -0
- package/dist/types/crypto/math/constants.d.ts +7 -0
- package/dist/types/crypto/math/edwards.d.ts +3 -0
- package/dist/types/crypto/math/le.d.ts +2 -0
- package/dist/types/crypto/math/mod.d.ts +5 -0
- package/dist/types/crypto/math/types.d.ts +6 -0
- package/dist/types/index.d.ts +10 -0
- package/dist/types/infra/log/ConsoleLogger.d.ts +11 -0
- package/dist/types/infra/log/PinoLogger.d.ts +30 -0
- package/dist/types/infra/log/types.d.ts +9 -0
- package/dist/types/infra/perf/BoundedTaskQueue.d.ts +19 -0
- package/dist/types/media/WaMediaCrypto.d.ts +12 -0
- package/dist/types/media/WaMediaTransferClient.d.ts +81 -0
- package/dist/types/media/conn.d.ts +3 -0
- package/dist/types/media/constants.d.ts +10 -0
- package/dist/types/media/index.d.ts +4 -0
- package/dist/types/media/types.d.ts +56 -0
- package/dist/types/message/WaMessageClient.d.ts +29 -0
- package/dist/types/message/ack.d.ts +5 -0
- package/dist/types/message/content.d.ts +4 -0
- package/dist/types/message/device-sent.d.ts +3 -0
- package/dist/types/message/incoming.d.ts +18 -0
- package/dist/types/message/index.d.ts +2 -0
- package/dist/types/message/padding.d.ts +2 -0
- package/dist/types/message/phash.d.ts +1 -0
- package/dist/types/message/types.d.ts +58 -0
- package/dist/types/proto.d.ts +2 -0
- package/dist/types/protocol/appstate.d.ts +34 -0
- package/dist/types/protocol/auth.d.ts +12 -0
- package/dist/types/protocol/browser.d.ts +22 -0
- package/dist/types/protocol/constants.d.ts +11 -0
- package/dist/types/protocol/defaults.d.ts +26 -0
- package/dist/types/protocol/dirty.d.ts +15 -0
- package/dist/types/protocol/group.d.ts +6 -0
- package/dist/types/protocol/index.d.ts +11 -0
- package/dist/types/protocol/jid.d.ts +19 -0
- package/dist/types/protocol/media.d.ts +15 -0
- package/dist/types/protocol/message.d.ts +16 -0
- package/dist/types/protocol/nodes.d.ts +83 -0
- package/dist/types/protocol/notification.d.ts +50 -0
- package/dist/types/protocol/stream.d.ts +60 -0
- package/dist/types/retry/constants.d.ts +21 -0
- package/dist/types/retry/index.d.ts +7 -0
- package/dist/types/retry/outbound.d.ts +4 -0
- package/dist/types/retry/parse.d.ts +3 -0
- package/dist/types/retry/reason.d.ts +2 -0
- package/dist/types/retry/replay.d.ts +30 -0
- package/dist/types/retry/types.d.ts +70 -0
- package/dist/types/signal/api/SignalDeviceSyncApi.d.ts +31 -0
- package/dist/types/signal/api/SignalDigestSyncApi.d.ts +27 -0
- package/dist/types/signal/api/SignalIdentitySyncApi.d.ts +26 -0
- package/dist/types/signal/api/SignalMissingPreKeysSyncApi.d.ts +39 -0
- package/dist/types/signal/api/SignalRotateKeyApi.d.ts +22 -0
- package/dist/types/signal/api/SignalSessionSyncApi.d.ts +38 -0
- package/dist/types/signal/api/codec.d.ts +3 -0
- package/dist/types/signal/api/constants.d.ts +9 -0
- package/dist/types/signal/api/prekeys.d.ts +6 -0
- package/dist/types/signal/constants.d.ts +14 -0
- package/dist/types/signal/crypto/WaAdvSignature.d.ts +7 -0
- package/dist/types/signal/crypto/constants.d.ts +5 -0
- package/dist/types/signal/group/SenderKeyChain.d.ts +11 -0
- package/dist/types/signal/group/SenderKeyCodec.d.ts +14 -0
- package/dist/types/signal/group/SenderKeyManager.d.ts +22 -0
- package/dist/types/signal/index.d.ts +12 -0
- package/dist/types/signal/registration/keygen.d.ts +5 -0
- package/dist/types/signal/registration/utils.d.ts +9 -0
- package/dist/types/signal/session/SignalProtocol.d.ts +22 -0
- package/dist/types/signal/session/SignalRatchet.d.ts +25 -0
- package/dist/types/signal/session/SignalSerializer.d.ts +6 -0
- package/dist/types/signal/session/SignalSession.d.ts +43 -0
- package/dist/types/signal/store/sqlite.d.ts +72 -0
- package/dist/types/signal/types.d.ts +110 -0
- package/dist/types/store/contracts/appstate.store.d.ts +22 -0
- package/dist/types/store/contracts/auth.store.d.ts +6 -0
- package/dist/types/store/contracts/contact.store.d.ts +14 -0
- package/dist/types/store/contracts/device-list.store.d.ts +16 -0
- package/dist/types/store/contracts/message.store.d.ts +18 -0
- package/dist/types/store/contracts/participants.store.d.ts +14 -0
- package/dist/types/store/contracts/retry.store.d.ts +11 -0
- package/dist/types/store/contracts/sender-key.store.d.ts +16 -0
- package/dist/types/store/contracts/signal.store.d.ts +31 -0
- package/dist/types/store/contracts/thread.store.d.ts +17 -0
- package/dist/types/store/createStore.d.ts +2 -0
- package/dist/types/store/index.d.ts +31 -0
- package/dist/types/store/noop.store.d.ts +10 -0
- package/dist/types/store/providers/memory/appstate.store.d.ts +21 -0
- package/dist/types/store/providers/memory/contact.store.d.ts +13 -0
- package/dist/types/store/providers/memory/device-list.store.d.ts +20 -0
- package/dist/types/store/providers/memory/message.store.d.ts +14 -0
- package/dist/types/store/providers/memory/participants.store.d.ts +18 -0
- package/dist/types/store/providers/memory/retry.store.d.ts +18 -0
- package/dist/types/store/providers/memory/sender-key.store.d.ts +28 -0
- package/dist/types/store/providers/memory/signal.store.d.ts +51 -0
- package/dist/types/store/providers/memory/thread.store.d.ts +14 -0
- package/dist/types/store/providers/sqlite/BaseSqliteStore.d.ts +12 -0
- package/dist/types/store/providers/sqlite/appstate.store.d.ts +15 -0
- package/dist/types/store/providers/sqlite/auth.store.d.ts +10 -0
- package/dist/types/store/providers/sqlite/connection.d.ts +10 -0
- package/dist/types/store/providers/sqlite/contact.store.d.ts +10 -0
- package/dist/types/store/providers/sqlite/device-list.store.d.ts +18 -0
- package/dist/types/store/providers/sqlite/message.store.d.ts +11 -0
- package/dist/types/store/providers/sqlite/migrations.d.ts +3 -0
- package/dist/types/store/providers/sqlite/participants.store.d.ts +13 -0
- package/dist/types/store/providers/sqlite/retry.store.d.ts +16 -0
- package/dist/types/store/providers/sqlite/sender-key.store.d.ts +25 -0
- package/dist/types/store/providers/sqlite/signal.store.d.ts +46 -0
- package/dist/types/store/providers/sqlite/thread.store.d.ts +11 -0
- package/dist/types/store/types.d.ts +103 -0
- package/dist/types/transport/WaComms.d.ts +61 -0
- package/dist/types/transport/WaWebSocket.d.ts +36 -0
- package/dist/types/transport/binary/constants.d.ts +49 -0
- package/dist/types/transport/binary/decoder.d.ts +3 -0
- package/dist/types/transport/binary/encoder.d.ts +3 -0
- package/dist/types/transport/binary/index.d.ts +4 -0
- package/dist/types/transport/binary/tokens.d.ts +11 -0
- package/dist/types/transport/index.d.ts +7 -0
- package/dist/types/transport/keepalive/WaKeepAlive.d.ts +39 -0
- package/dist/types/transport/node/WaNodeOrchestrator.d.ts +28 -0
- package/dist/types/transport/node/WaNodeTransport.d.ts +22 -0
- package/dist/types/transport/node/builders/accountSync.d.ts +11 -0
- package/dist/types/transport/node/builders/group.d.ts +16 -0
- package/dist/types/transport/node/builders/index.d.ts +7 -0
- package/dist/types/transport/node/builders/media.d.ts +2 -0
- package/dist/types/transport/node/builders/message.d.ts +52 -0
- package/dist/types/transport/node/builders/pairing.d.ts +18 -0
- package/dist/types/transport/node/builders/prekeys.d.ts +5 -0
- package/dist/types/transport/node/builders/retry.d.ts +18 -0
- package/dist/types/transport/node/helpers.d.ts +8 -0
- package/dist/types/transport/node/query.d.ts +10 -0
- package/dist/types/transport/node/xml.d.ts +2 -0
- package/dist/types/transport/noise/WaClientPayload.d.ts +3 -0
- package/dist/types/transport/noise/WaFrameCodec.d.ts +9 -0
- package/dist/types/transport/noise/WaNoiseCert.d.ts +1 -0
- package/dist/types/transport/noise/WaNoiseHandshake.d.ts +14 -0
- package/dist/types/transport/noise/WaNoiseSession.d.ts +33 -0
- package/dist/types/transport/noise/WaNoiseSocket.d.ts +10 -0
- package/dist/types/transport/noise/constants.d.ts +7 -0
- package/dist/types/transport/noise/types.d.ts +23 -0
- package/dist/types/transport/stream/parse.d.ts +23 -0
- package/dist/types/transport/types.d.ts +71 -0
- package/dist/types/util/async.d.ts +1 -0
- package/dist/types/util/base64.d.ts +4 -0
- package/dist/types/util/bytes.d.ts +28 -0
- package/dist/types/util/coercion.d.ts +8 -0
- package/dist/types/util/collections.d.ts +3 -0
- package/dist/types/util/primitives.d.ts +7 -0
- package/dist/types/util/runtime.d.ts +2 -0
- package/dist/types/util/signal-address.d.ts +2 -0
- package/dist/util/async.js +8 -0
- package/dist/util/base64.js +24 -0
- package/dist/util/bytes.js +291 -0
- package/dist/util/coercion.js +66 -0
- package/dist/util/collections.js +32 -0
- package/dist/util/primitives.js +37 -0
- package/dist/util/runtime.js +19 -0
- package/dist/util/signal-address.js +8 -0
- package/package.json +150 -0
- package/proto/index.d.ts +10861 -0
- package/proto/index.js +1 -0
- package/scripts/check-node-version.cjs +55 -0
package/README.md
ADDED
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
# zapo
|
|
2
|
+
|
|
3
|
+
<p align="center">
|
|
4
|
+
<strong>High-performance TypeScript implementation of the WhatsApp Web protocol.</strong><br />
|
|
5
|
+
Built for high-scalability workloads, multi-session operation, and full user configurability.
|
|
6
|
+
</p>
|
|
7
|
+
|
|
8
|
+
<p align="center">
|
|
9
|
+
<a href="https://www.npmjs.com/package/zapo-js">
|
|
10
|
+
<img alt="npm version" src="https://img.shields.io/npm/v/zapo-js?color=CB3837" />
|
|
11
|
+
</a>
|
|
12
|
+
<img alt="npm package size" src="https://img.shields.io/npm/unpacked-size/zapo-js?label=package%20size&color=2F855A" />
|
|
13
|
+
<img alt="node version" src="https://img.shields.io/badge/node-%3E%3D20.9.0-339933" />
|
|
14
|
+
<img alt="language" src="https://img.shields.io/badge/language-TypeScript-3178C6" />
|
|
15
|
+
<img alt="focus" src="https://img.shields.io/badge/focus-high--scale%20%2B%20multi--session-0A7EA4" />
|
|
16
|
+
</p>
|
|
17
|
+
|
|
18
|
+
## Table of Contents
|
|
19
|
+
|
|
20
|
+
- [Stability Notice](#stability-notice)
|
|
21
|
+
- [What Makes This Project Different](#what-makes-this-project-different)
|
|
22
|
+
- [Core Principles](#core-principles)
|
|
23
|
+
- [Architecture at a Glance](#architecture-at-a-glance)
|
|
24
|
+
- [Requirements](#requirements)
|
|
25
|
+
- [Quick Start](#quick-start)
|
|
26
|
+
- [Minimal Usage](#minimal-usage)
|
|
27
|
+
- [Useful Scripts](#useful-scripts)
|
|
28
|
+
- [Versioning and Releases](#versioning-and-releases)
|
|
29
|
+
- [GitHub Release Notes](#github-release-notes)
|
|
30
|
+
- [Protobuf Generation](#protobuf-generation)
|
|
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: `protobufjs`
|
|
86
|
+
|
|
87
|
+
Optional peer dependencies:
|
|
88
|
+
|
|
89
|
+
- `better-sqlite3` for SQLite-backed stores
|
|
90
|
+
- `pino` and `pino-pretty` for structured logging
|
|
91
|
+
|
|
92
|
+
## Quick Start
|
|
93
|
+
|
|
94
|
+
1. Install dependencies.
|
|
95
|
+
|
|
96
|
+
```bash
|
|
97
|
+
npm install
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
2. Run the real-flow example.
|
|
101
|
+
|
|
102
|
+
```bash
|
|
103
|
+
npm run example
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
3. Scan the QR code emitted by `auth_qr`.
|
|
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
|
|
112
|
+
|
|
113
|
+
```ts
|
|
114
|
+
import { createPinoLogger, createStore, WaClient } from 'zapo-js'
|
|
115
|
+
|
|
116
|
+
const logger = await createPinoLogger({
|
|
117
|
+
level: 'info',
|
|
118
|
+
pretty: true
|
|
119
|
+
})
|
|
120
|
+
|
|
121
|
+
const store = createStore({
|
|
122
|
+
sqlite: {
|
|
123
|
+
path: '.auth/state.sqlite',
|
|
124
|
+
driver: 'auto'
|
|
125
|
+
},
|
|
126
|
+
providers: {
|
|
127
|
+
messages: 'sqlite',
|
|
128
|
+
threads: 'sqlite',
|
|
129
|
+
contacts: 'sqlite'
|
|
130
|
+
}
|
|
131
|
+
})
|
|
132
|
+
|
|
133
|
+
const client = new WaClient(
|
|
134
|
+
{
|
|
135
|
+
store,
|
|
136
|
+
sessionId: 'default',
|
|
137
|
+
connectTimeoutMs: 15_000,
|
|
138
|
+
nodeQueryTimeoutMs: 30_000,
|
|
139
|
+
history: {
|
|
140
|
+
enabled: true,
|
|
141
|
+
requireFullSync: true
|
|
142
|
+
}
|
|
143
|
+
},
|
|
144
|
+
logger
|
|
145
|
+
)
|
|
146
|
+
|
|
147
|
+
client.on('auth_qr', ({ qr, ttlMs }) => {
|
|
148
|
+
console.log('qr', { qr, ttlMs })
|
|
149
|
+
})
|
|
150
|
+
|
|
151
|
+
client.on('message', (event) => {
|
|
152
|
+
console.log('incoming', {
|
|
153
|
+
chatJid: event.chatJid,
|
|
154
|
+
senderJid: event.senderJid
|
|
155
|
+
})
|
|
156
|
+
})
|
|
157
|
+
|
|
158
|
+
await client.connect()
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
## Useful Scripts
|
|
162
|
+
|
|
163
|
+
- `npm run build` - build CJS, ESM, and types
|
|
164
|
+
- `npm run test` - run unit tests (non-flow)
|
|
165
|
+
- `npm run test:flow` - run real-flow tests
|
|
166
|
+
- `npm run test:coverage` - run coverage report
|
|
167
|
+
- `npm run typecheck` - type-check project
|
|
168
|
+
- `npm run lint` - lint source files
|
|
169
|
+
- `npm run format` - format codebase
|
|
170
|
+
- `npm run proto:generate` - regenerate protobuf runtime/types from `proto/WAProto.proto`
|
|
171
|
+
- `npm run changeset` - create a versioning entry (`patch`/`minor`/`major`)
|
|
172
|
+
- `npm run changeset:status` - show pending versioning entries
|
|
173
|
+
- `npm run version:packages` - apply pending versions and update `CHANGELOG.md`
|
|
174
|
+
- `npm run release:publish` - build and publish to npm with Changesets
|
|
175
|
+
|
|
176
|
+
## Versioning and Releases
|
|
177
|
+
|
|
178
|
+
Versioning is managed with [Changesets](https://github.com/changesets/changesets).
|
|
179
|
+
|
|
180
|
+
Release flow:
|
|
181
|
+
|
|
182
|
+
```bash
|
|
183
|
+
npm run changeset
|
|
184
|
+
npm run changeset:status
|
|
185
|
+
npm run version:packages
|
|
186
|
+
npm run release:publish
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
Notes:
|
|
190
|
+
|
|
191
|
+
- Changesets are stored in `.changeset/*.md`
|
|
192
|
+
- Multiple changesets are merged automatically into the next release
|
|
193
|
+
- SemVer is manual and intentional: `patch`, `minor`, `major`
|
|
194
|
+
|
|
195
|
+
## GitHub Release Notes
|
|
196
|
+
|
|
197
|
+
Release notes are generated automatically (including grouped changes and contributors) when a version tag is pushed.
|
|
198
|
+
|
|
199
|
+
- Workflow: `.github/workflows/github-release.yml`
|
|
200
|
+
- Categories config: `.github/release.yml`
|
|
201
|
+
|
|
202
|
+
Trigger example:
|
|
203
|
+
|
|
204
|
+
```bash
|
|
205
|
+
git tag v0.1.1
|
|
206
|
+
git push origin v0.1.1
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
If the tag contains `-` (example: `v0.2.0-rc.1`), the release is marked as prerelease.
|
|
210
|
+
|
|
211
|
+
## Protobuf Generation
|
|
212
|
+
|
|
213
|
+
`WAProto.proto` source: https://github.com/wppconnect-team/wa-proto
|
|
214
|
+
|
|
215
|
+
`npm run proto:generate` runs `scripts/generate-proto.cjs`, which:
|
|
216
|
+
|
|
217
|
+
- Ensures proto tooling dependencies are installed in `proto/`
|
|
218
|
+
- Generates and minifies `proto/index.js`
|
|
219
|
+
- Regenerates compact typings at `proto/index.d.ts`
|
|
220
|
+
|
|
221
|
+
## Contribution Notes
|
|
222
|
+
|
|
223
|
+
Before opening a PR:
|
|
224
|
+
|
|
225
|
+
- Validate behavior against WhatsApp Web
|
|
226
|
+
- Keep performance and memory constraints in mind
|
|
227
|
+
- Keep node building/parsing aligned with project patterns
|
|
228
|
+
- Avoid API changes that diverge from observed WhatsApp Web behavior
|
|
229
|
+
- Test real flows when touching auth, transport, app state, retry, or signal paths
|
|
230
|
+
|
|
231
|
+
## Disclaimer
|
|
232
|
+
|
|
233
|
+
This project is an independent implementation for engineering and interoperability research.
|
|
234
|
+
It is not affiliated with or endorsed by WhatsApp.
|
|
235
|
+
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.WaAppStateCrypto = void 0;
|
|
4
|
+
const constants_1 = require("./constants");
|
|
5
|
+
const utils_1 = require("./utils");
|
|
6
|
+
const hkdf_1 = require("../crypto/core/hkdf");
|
|
7
|
+
const primitives_1 = require("../crypto/core/primitives");
|
|
8
|
+
const random_1 = require("../crypto/core/random");
|
|
9
|
+
const _proto_1 = require("../proto.js");
|
|
10
|
+
const constants_2 = require("../protocol/constants");
|
|
11
|
+
const base64_1 = require("../util/base64");
|
|
12
|
+
const bytes_1 = require("../util/bytes");
|
|
13
|
+
const collections_1 = require("../util/collections");
|
|
14
|
+
const DEFAULT_DERIVED_KEYS_CACHE_MAX_SIZE = 256;
|
|
15
|
+
class WaAppStateCrypto {
|
|
16
|
+
constructor(derivedKeysCacheMaxSize = DEFAULT_DERIVED_KEYS_CACHE_MAX_SIZE) {
|
|
17
|
+
this.derivedKeysCache = new Map();
|
|
18
|
+
this.derivedKeysCacheMaxSize =
|
|
19
|
+
this.normalizeDerivedKeysCacheMaxSize(derivedKeysCacheMaxSize);
|
|
20
|
+
}
|
|
21
|
+
clearCache() {
|
|
22
|
+
this.derivedKeysCache.clear();
|
|
23
|
+
}
|
|
24
|
+
async deriveKeys(keyData) {
|
|
25
|
+
const cacheKey = (0, base64_1.bytesToBase64)(keyData);
|
|
26
|
+
const cached = this.derivedKeysCache.get(cacheKey);
|
|
27
|
+
if (cached) {
|
|
28
|
+
this.touchDerivedKeysCacheEntry(cacheKey, cached);
|
|
29
|
+
return cached;
|
|
30
|
+
}
|
|
31
|
+
const derived = await (0, hkdf_1.hkdf)(keyData, null, constants_2.WA_APP_STATE_KDF_INFO.MUTATION_KEYS, constants_1.APP_STATE_DERIVED_KEY_LENGTH);
|
|
32
|
+
const keys = {
|
|
33
|
+
indexKey: derived.subarray(0, constants_1.APP_STATE_DERIVED_INDEX_KEY_END),
|
|
34
|
+
valueEncryptionKey: derived.subarray(constants_1.APP_STATE_DERIVED_INDEX_KEY_END, constants_1.APP_STATE_DERIVED_VALUE_ENCRYPTION_KEY_END),
|
|
35
|
+
valueMacKey: derived.subarray(constants_1.APP_STATE_DERIVED_VALUE_ENCRYPTION_KEY_END, constants_1.APP_STATE_DERIVED_VALUE_MAC_KEY_END),
|
|
36
|
+
snapshotMacKey: derived.subarray(constants_1.APP_STATE_DERIVED_VALUE_MAC_KEY_END, constants_1.APP_STATE_DERIVED_SNAPSHOT_MAC_KEY_END),
|
|
37
|
+
patchMacKey: derived.subarray(constants_1.APP_STATE_DERIVED_SNAPSHOT_MAC_KEY_END, constants_1.APP_STATE_DERIVED_PATCH_MAC_KEY_END)
|
|
38
|
+
};
|
|
39
|
+
this.touchDerivedKeysCacheEntry(cacheKey, keys);
|
|
40
|
+
return keys;
|
|
41
|
+
}
|
|
42
|
+
async generateIndexMac(indexKey, indexBytes) {
|
|
43
|
+
const key = await (0, primitives_1.importHmacKey)(indexKey);
|
|
44
|
+
return (0, primitives_1.hmacSign)(key, indexBytes);
|
|
45
|
+
}
|
|
46
|
+
async encryptMutation(args) {
|
|
47
|
+
const derivedKeys = await this.deriveKeys(args.keyData);
|
|
48
|
+
const indexBytes = bytes_1.TEXT_ENCODER.encode(args.index);
|
|
49
|
+
const encoded = _proto_1.proto.SyncActionData.encode({
|
|
50
|
+
index: indexBytes,
|
|
51
|
+
value: args.value ?? undefined,
|
|
52
|
+
padding: bytes_1.EMPTY_BYTES,
|
|
53
|
+
version: args.version
|
|
54
|
+
}).finish();
|
|
55
|
+
const iv = args.iv ?? (await (0, random_1.randomBytesAsync)(constants_1.APP_STATE_IV_LENGTH));
|
|
56
|
+
if (iv.byteLength !== constants_1.APP_STATE_IV_LENGTH) {
|
|
57
|
+
throw new Error(`invalid IV length ${iv.byteLength}`);
|
|
58
|
+
}
|
|
59
|
+
const indexMacPromise = this.generateIndexMac(derivedKeys.indexKey, indexBytes);
|
|
60
|
+
const encryptionKey = await (0, primitives_1.importAesCbcKey)(derivedKeys.valueEncryptionKey);
|
|
61
|
+
const cipherText = await (0, primitives_1.aesCbcEncrypt)(encryptionKey, iv, encoded);
|
|
62
|
+
const cipherWithIv = (0, bytes_1.concatBytes)([iv, cipherText]);
|
|
63
|
+
const associatedData = this.generateAssociatedData(args.operation, args.keyId);
|
|
64
|
+
const [valueMac, indexMac] = await Promise.all([
|
|
65
|
+
this.generateValueMac(derivedKeys.valueMacKey, associatedData, cipherWithIv),
|
|
66
|
+
indexMacPromise
|
|
67
|
+
]);
|
|
68
|
+
return {
|
|
69
|
+
indexMac,
|
|
70
|
+
valueBlob: (0, bytes_1.concatBytes)([cipherWithIv, valueMac]),
|
|
71
|
+
valueMac
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
async decryptMutation(args) {
|
|
75
|
+
if (args.valueBlob.byteLength < constants_1.APP_STATE_IV_LENGTH + constants_1.APP_STATE_VALUE_MAC_LENGTH) {
|
|
76
|
+
throw new Error('invalid mutation value blob');
|
|
77
|
+
}
|
|
78
|
+
const derivedKeys = await this.deriveKeys(args.keyData);
|
|
79
|
+
const iv = args.valueBlob.subarray(0, constants_1.APP_STATE_IV_LENGTH);
|
|
80
|
+
const mac = args.valueBlob.subarray(args.valueBlob.byteLength - constants_1.APP_STATE_VALUE_MAC_LENGTH);
|
|
81
|
+
const cipherText = args.valueBlob.subarray(constants_1.APP_STATE_IV_LENGTH, args.valueBlob.byteLength - constants_1.APP_STATE_VALUE_MAC_LENGTH);
|
|
82
|
+
const cipherWithIv = args.valueBlob.subarray(0, args.valueBlob.byteLength - constants_1.APP_STATE_VALUE_MAC_LENGTH);
|
|
83
|
+
const associatedData = this.generateAssociatedData(args.operation, args.keyId);
|
|
84
|
+
const expectedMac = await this.generateValueMac(derivedKeys.valueMacKey, associatedData, cipherWithIv);
|
|
85
|
+
if (!(0, bytes_1.uint8Equal)(mac, expectedMac)) {
|
|
86
|
+
throw new Error('mutation value MAC mismatch');
|
|
87
|
+
}
|
|
88
|
+
const decryptionKey = await (0, primitives_1.importAesCbcKey)(derivedKeys.valueEncryptionKey);
|
|
89
|
+
const plaintext = await (0, primitives_1.aesCbcDecrypt)(decryptionKey, iv, cipherText);
|
|
90
|
+
const syncActionData = _proto_1.proto.SyncActionData.decode(plaintext);
|
|
91
|
+
if (!syncActionData.index) {
|
|
92
|
+
throw new Error('missing sync action index');
|
|
93
|
+
}
|
|
94
|
+
if (syncActionData.version === null || syncActionData.version === undefined) {
|
|
95
|
+
throw new Error('missing sync action version');
|
|
96
|
+
}
|
|
97
|
+
const generatedIndexMac = await this.generateIndexMac(derivedKeys.indexKey, syncActionData.index);
|
|
98
|
+
if (!(0, bytes_1.uint8Equal)(generatedIndexMac, args.indexMac)) {
|
|
99
|
+
throw new Error('mutation index MAC mismatch');
|
|
100
|
+
}
|
|
101
|
+
return {
|
|
102
|
+
index: bytes_1.TEXT_DECODER.decode(syncActionData.index),
|
|
103
|
+
value: syncActionData.value ?? null,
|
|
104
|
+
version: syncActionData.version,
|
|
105
|
+
indexMac: args.indexMac,
|
|
106
|
+
valueMac: mac
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
async generateSnapshotMac(keyData, ltHash, version, collectionName) {
|
|
110
|
+
const derivedKeys = await this.deriveKeys(keyData);
|
|
111
|
+
const payload = (0, bytes_1.concatBytes)([
|
|
112
|
+
ltHash,
|
|
113
|
+
(0, utils_1.toNetworkOrder64)(version),
|
|
114
|
+
bytes_1.TEXT_ENCODER.encode(collectionName)
|
|
115
|
+
]);
|
|
116
|
+
const key = await (0, primitives_1.importHmacKey)(derivedKeys.snapshotMacKey);
|
|
117
|
+
return (0, primitives_1.hmacSign)(key, payload);
|
|
118
|
+
}
|
|
119
|
+
async generatePatchMac(keyData, snapshotMac, valueMacs, version, collectionName) {
|
|
120
|
+
const derivedKeys = await this.deriveKeys(keyData);
|
|
121
|
+
const payload = (0, bytes_1.concatBytes)([
|
|
122
|
+
snapshotMac,
|
|
123
|
+
...valueMacs,
|
|
124
|
+
(0, utils_1.toNetworkOrder64)(version),
|
|
125
|
+
bytes_1.TEXT_ENCODER.encode(collectionName)
|
|
126
|
+
]);
|
|
127
|
+
const key = await (0, primitives_1.importHmacKey)(derivedKeys.patchMacKey);
|
|
128
|
+
return (0, primitives_1.hmacSign)(key, payload);
|
|
129
|
+
}
|
|
130
|
+
async ltHashAdd(base, addValues) {
|
|
131
|
+
return this.ltHashApply(base, addValues, (left, right) => left + right);
|
|
132
|
+
}
|
|
133
|
+
async ltHashSubtract(base, removeValues) {
|
|
134
|
+
return this.ltHashApply(base, removeValues, (left, right) => left - right);
|
|
135
|
+
}
|
|
136
|
+
async ltHashSubtractThenAdd(base, addValues, removeValues) {
|
|
137
|
+
const subtractResult = await this.ltHashSubtract(base, removeValues);
|
|
138
|
+
const hash = await this.ltHashAdd(subtractResult, addValues);
|
|
139
|
+
return { hash, subtractResult };
|
|
140
|
+
}
|
|
141
|
+
async ltHashApply(base, values, combine) {
|
|
142
|
+
if (values.length === 0) {
|
|
143
|
+
return base;
|
|
144
|
+
}
|
|
145
|
+
const expandedValues = await Promise.all(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)));
|
|
146
|
+
const out = new Uint8Array(base.byteLength);
|
|
147
|
+
this.pointwiseWithOverflow(base, expandedValues[0], combine, out);
|
|
148
|
+
for (let index = 1; index < expandedValues.length; index += 1) {
|
|
149
|
+
this.pointwiseWithOverflow(out, expandedValues[index], combine, out);
|
|
150
|
+
}
|
|
151
|
+
return out;
|
|
152
|
+
}
|
|
153
|
+
pointwiseWithOverflow(left, right, combine, out = new Uint8Array(left.byteLength)) {
|
|
154
|
+
if (left.byteLength !== right.byteLength) {
|
|
155
|
+
throw new Error('lt hash input length mismatch');
|
|
156
|
+
}
|
|
157
|
+
if (left.byteLength % constants_1.APP_STATE_POINT_SIZE !== 0) {
|
|
158
|
+
throw new Error('lt hash input alignment mismatch');
|
|
159
|
+
}
|
|
160
|
+
if (out.byteLength !== left.byteLength) {
|
|
161
|
+
throw new Error('lt hash output length mismatch');
|
|
162
|
+
}
|
|
163
|
+
const leftView = new DataView(left.buffer, left.byteOffset, left.byteLength);
|
|
164
|
+
const rightView = new DataView(right.buffer, right.byteOffset, right.byteLength);
|
|
165
|
+
const outView = new DataView(out.buffer, out.byteOffset, out.byteLength);
|
|
166
|
+
for (let offset = 0; offset < left.byteLength; offset += constants_1.APP_STATE_POINT_SIZE) {
|
|
167
|
+
const value = combine(leftView.getUint16(offset, true), rightView.getUint16(offset, true));
|
|
168
|
+
outView.setUint16(offset, value & 0xffff, true);
|
|
169
|
+
}
|
|
170
|
+
return out;
|
|
171
|
+
}
|
|
172
|
+
generateAssociatedData(operation, keyId) {
|
|
173
|
+
if (operation !== _proto_1.proto.SyncdMutation.SyncdOperation.SET &&
|
|
174
|
+
operation !== _proto_1.proto.SyncdMutation.SyncdOperation.REMOVE) {
|
|
175
|
+
throw new Error(`unsupported syncd operation ${operation}`);
|
|
176
|
+
}
|
|
177
|
+
const out = new Uint8Array(1 + keyId.byteLength);
|
|
178
|
+
out[0] = operation + 1;
|
|
179
|
+
out.set(keyId, 1);
|
|
180
|
+
return out;
|
|
181
|
+
}
|
|
182
|
+
async generateValueMac(valueMacKey, associatedData, cipherWithIv) {
|
|
183
|
+
const octetLength = new Uint8Array(constants_1.APP_STATE_MAC_OCTET_LENGTH);
|
|
184
|
+
octetLength[octetLength.length - 1] = associatedData.byteLength & 0xff;
|
|
185
|
+
const key = await (0, primitives_1.importHmacSha512Key)(valueMacKey);
|
|
186
|
+
const full = await (0, primitives_1.hmacSign)(key, (0, bytes_1.concatBytes)([associatedData, cipherWithIv, octetLength]));
|
|
187
|
+
return full.slice(0, constants_1.APP_STATE_VALUE_MAC_LENGTH);
|
|
188
|
+
}
|
|
189
|
+
normalizeDerivedKeysCacheMaxSize(value) {
|
|
190
|
+
if (!Number.isFinite(value)) {
|
|
191
|
+
return DEFAULT_DERIVED_KEYS_CACHE_MAX_SIZE;
|
|
192
|
+
}
|
|
193
|
+
return Math.max(0, Math.trunc(value));
|
|
194
|
+
}
|
|
195
|
+
touchDerivedKeysCacheEntry(cacheKey, keys) {
|
|
196
|
+
if (this.derivedKeysCacheMaxSize <= 0) {
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
199
|
+
(0, collections_1.setBoundedMapEntry)(this.derivedKeysCache, cacheKey, keys, this.derivedKeysCacheMaxSize);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
exports.WaAppStateCrypto = WaAppStateCrypto;
|