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
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.WaNoiseSession = void 0;
|
|
4
|
+
const _crypto_1 = require("../../crypto/index.js");
|
|
5
|
+
const ConsoleLogger_1 = require("../../infra/log/ConsoleLogger");
|
|
6
|
+
const BoundedTaskQueue_1 = require("../../infra/perf/BoundedTaskQueue");
|
|
7
|
+
const _proto_1 = require("../../proto.js");
|
|
8
|
+
const constants_1 = require("../../protocol/constants");
|
|
9
|
+
const constants_2 = require("../noise/constants");
|
|
10
|
+
const WaClientPayload_1 = require("../noise/WaClientPayload");
|
|
11
|
+
const WaFrameCodec_1 = require("../noise/WaFrameCodec");
|
|
12
|
+
const WaNoiseCert_1 = require("../noise/WaNoiseCert");
|
|
13
|
+
const WaNoiseHandshake_1 = require("../noise/WaNoiseHandshake");
|
|
14
|
+
const bytes_1 = require("../../util/bytes");
|
|
15
|
+
const primitives_1 = require("../../util/primitives");
|
|
16
|
+
function resolvePayload(payload) {
|
|
17
|
+
if (payload instanceof Uint8Array) {
|
|
18
|
+
return Promise.resolve(payload);
|
|
19
|
+
}
|
|
20
|
+
return Promise.resolve(payload()).then((value) => (0, bytes_1.toBytesView)(value));
|
|
21
|
+
}
|
|
22
|
+
async function resolveHandshakePayload(config) {
|
|
23
|
+
if (config.isRegistered) {
|
|
24
|
+
if (config.loginPayload) {
|
|
25
|
+
return resolvePayload(config.loginPayload);
|
|
26
|
+
}
|
|
27
|
+
if (config.loginPayloadConfig) {
|
|
28
|
+
return (0, WaClientPayload_1.buildLoginPayload)(config.loginPayloadConfig);
|
|
29
|
+
}
|
|
30
|
+
throw new Error('noise login payload is missing');
|
|
31
|
+
}
|
|
32
|
+
if (config.registrationPayload) {
|
|
33
|
+
return resolvePayload(config.registrationPayload);
|
|
34
|
+
}
|
|
35
|
+
if (config.registrationPayloadConfig) {
|
|
36
|
+
return (0, WaClientPayload_1.buildRegistrationPayload)(config.registrationPayloadConfig);
|
|
37
|
+
}
|
|
38
|
+
throw new Error('noise registration payload is missing');
|
|
39
|
+
}
|
|
40
|
+
function buildRoutingInfoPrefix(routingInfo) {
|
|
41
|
+
const prefix = new Uint8Array(2 + 2 + 1 + 2 + routingInfo.length);
|
|
42
|
+
prefix[0] = 0x45; // E
|
|
43
|
+
prefix[1] = 0x44; // D
|
|
44
|
+
prefix[2] = 0x00;
|
|
45
|
+
prefix[3] = 0x01;
|
|
46
|
+
prefix[4] = (routingInfo.length >> 16) & 0xff;
|
|
47
|
+
prefix[5] = (routingInfo.length >> 8) & 0xff;
|
|
48
|
+
prefix[6] = routingInfo.length & 0xff;
|
|
49
|
+
prefix.set(routingInfo, 7);
|
|
50
|
+
return prefix;
|
|
51
|
+
}
|
|
52
|
+
class WaNoiseSession {
|
|
53
|
+
constructor(sendWire, logger = new ConsoleLogger_1.ConsoleLogger('info')) {
|
|
54
|
+
this.sendWire = sendWire;
|
|
55
|
+
this.logger = logger;
|
|
56
|
+
this.writeQueue = new BoundedTaskQueue_1.BoundedTaskQueue(4096, 1);
|
|
57
|
+
this.readQueue = new BoundedTaskQueue_1.BoundedTaskQueue(4096, 1);
|
|
58
|
+
this.frameCodec = null;
|
|
59
|
+
this.handshakeInbox = [];
|
|
60
|
+
this.handshakeWaiter = null;
|
|
61
|
+
this.handshakeRejecter = null;
|
|
62
|
+
this.pendingDecryptedFrames = [];
|
|
63
|
+
this.closedError = null;
|
|
64
|
+
this.noiseSocket = null;
|
|
65
|
+
this.serverStaticKey = null;
|
|
66
|
+
this.handshakeFrameTimeoutMs = constants_1.WA_DEFAULTS.CONNECT_TIMEOUT_MS;
|
|
67
|
+
}
|
|
68
|
+
async start(config) {
|
|
69
|
+
this.reset();
|
|
70
|
+
this.logger.debug('noise session start', {
|
|
71
|
+
isRegistered: config.isRegistered,
|
|
72
|
+
hasServerStaticKey: !!config.serverStaticKey
|
|
73
|
+
});
|
|
74
|
+
const protocolHeader = config.protocolHeader
|
|
75
|
+
? (0, bytes_1.toBytesView)(config.protocolHeader)
|
|
76
|
+
: constants_2.WA_PROTO_HEADER;
|
|
77
|
+
const introFrame = config.routingInfo && config.routingInfo.length > 0
|
|
78
|
+
? (0, bytes_1.concatBytes)([buildRoutingInfoPrefix(config.routingInfo), protocolHeader])
|
|
79
|
+
: protocolHeader;
|
|
80
|
+
this.frameCodec = new WaFrameCodec_1.WaFrameCodec(introFrame);
|
|
81
|
+
const [ephemeralKeyPair, payload] = await Promise.all([
|
|
82
|
+
_crypto_1.X25519.generateKeyPair(),
|
|
83
|
+
resolveHandshakePayload(config)
|
|
84
|
+
]);
|
|
85
|
+
const verifyCertificates = config.verifyCertificateChain !== false;
|
|
86
|
+
if (config.serverStaticKey && config.serverStaticKey.length === 32) {
|
|
87
|
+
this.logger.info('noise session attempting resume handshake (IK)');
|
|
88
|
+
this.noiseSocket = await this.resumeHandshake(config.serverStaticKey, config.clientStaticKeyPair, ephemeralKeyPair, payload, protocolHeader, verifyCertificates);
|
|
89
|
+
await this.decodeBufferedPostHandshakeFrames();
|
|
90
|
+
this.logger.info('noise session established via resume/full fallback path');
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
this.logger.info('noise session starting full handshake (XX)');
|
|
94
|
+
this.noiseSocket = await this.fullHandshake(config.clientStaticKeyPair, ephemeralKeyPair, payload, protocolHeader, verifyCertificates);
|
|
95
|
+
await this.decodeBufferedPostHandshakeFrames();
|
|
96
|
+
this.logger.info('noise session established via full handshake');
|
|
97
|
+
}
|
|
98
|
+
async encryptFrame(frame) {
|
|
99
|
+
if (!this.noiseSocket || !this.frameCodec) {
|
|
100
|
+
throw new Error('noise session is not established');
|
|
101
|
+
}
|
|
102
|
+
const encrypted = await this.writeQueue.enqueue(() => this.noiseSocket.encrypt(frame));
|
|
103
|
+
return this.frameCodec.encodeFrame(encrypted);
|
|
104
|
+
}
|
|
105
|
+
async pushWireChunk(chunk) {
|
|
106
|
+
const codec = this.frameCodec;
|
|
107
|
+
if (!codec) {
|
|
108
|
+
return [];
|
|
109
|
+
}
|
|
110
|
+
const out = [];
|
|
111
|
+
if (this.pendingDecryptedFrames.length > 0) {
|
|
112
|
+
out.push(...this.pendingDecryptedFrames);
|
|
113
|
+
this.pendingDecryptedFrames = [];
|
|
114
|
+
}
|
|
115
|
+
const frames = codec.pushWireChunk(chunk);
|
|
116
|
+
if (!this.noiseSocket) {
|
|
117
|
+
for (const frame of frames) {
|
|
118
|
+
const waiter = this.handshakeWaiter;
|
|
119
|
+
const rejecter = this.handshakeRejecter;
|
|
120
|
+
if (waiter && rejecter) {
|
|
121
|
+
this.handshakeWaiter = null;
|
|
122
|
+
this.handshakeRejecter = null;
|
|
123
|
+
waiter(frame);
|
|
124
|
+
continue;
|
|
125
|
+
}
|
|
126
|
+
this.handshakeInbox.push(frame);
|
|
127
|
+
}
|
|
128
|
+
return out;
|
|
129
|
+
}
|
|
130
|
+
for (const frame of frames) {
|
|
131
|
+
const decrypted = await this.readQueue.enqueue(() => this.noiseSocket.decrypt(frame));
|
|
132
|
+
out.push(decrypted);
|
|
133
|
+
}
|
|
134
|
+
return out;
|
|
135
|
+
}
|
|
136
|
+
onSocketClosed(error) {
|
|
137
|
+
const closeError = error ?? new Error('noise session socket closed');
|
|
138
|
+
this.logger.debug('noise session socket closed', { message: closeError.message });
|
|
139
|
+
this.closedError = closeError;
|
|
140
|
+
const rejecter = this.handshakeRejecter;
|
|
141
|
+
if (rejecter) {
|
|
142
|
+
this.handshakeRejecter = null;
|
|
143
|
+
this.handshakeWaiter = null;
|
|
144
|
+
rejecter(closeError);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
reset() {
|
|
148
|
+
this.logger.trace('noise session reset');
|
|
149
|
+
this.frameCodec = null;
|
|
150
|
+
this.handshakeInbox = [];
|
|
151
|
+
this.handshakeWaiter = null;
|
|
152
|
+
this.handshakeRejecter = null;
|
|
153
|
+
this.pendingDecryptedFrames = [];
|
|
154
|
+
this.closedError = null;
|
|
155
|
+
this.noiseSocket = null;
|
|
156
|
+
this.serverStaticKey = null;
|
|
157
|
+
}
|
|
158
|
+
getServerStaticKey() {
|
|
159
|
+
if (!this.serverStaticKey) {
|
|
160
|
+
return null;
|
|
161
|
+
}
|
|
162
|
+
return this.serverStaticKey;
|
|
163
|
+
}
|
|
164
|
+
async fullHandshake(clientStaticKeyPair, ephemeralKeyPair, payload, protocolHeader, verifyCertificates) {
|
|
165
|
+
this.logger.trace('noise full handshake: send client hello');
|
|
166
|
+
const handshake = new WaNoiseHandshake_1.WaNoiseHandshake();
|
|
167
|
+
await handshake.start(constants_2.NOISE_XX_NAME, protocolHeader);
|
|
168
|
+
await handshake.authenticate(ephemeralKeyPair.pubKey);
|
|
169
|
+
const clientHello = _proto_1.proto.HandshakeMessage.encode({
|
|
170
|
+
clientHello: {
|
|
171
|
+
ephemeral: ephemeralKeyPair.pubKey
|
|
172
|
+
}
|
|
173
|
+
}).finish();
|
|
174
|
+
const serverHello = await this.sendAndReceiveHandshakeFrame(clientHello);
|
|
175
|
+
return this.continueFullHandshake(handshake, serverHello, clientStaticKeyPair, ephemeralKeyPair, payload, verifyCertificates);
|
|
176
|
+
}
|
|
177
|
+
async resumeHandshake(serverStaticKey, clientStaticKeyPair, ephemeralKeyPair, payload, protocolHeader, verifyCertificates) {
|
|
178
|
+
const resumeResult = await this.tryResumeHandshakeWithIk(serverStaticKey, clientStaticKeyPair, ephemeralKeyPair, payload, protocolHeader);
|
|
179
|
+
if (resumeResult.socket) {
|
|
180
|
+
return resumeResult.socket;
|
|
181
|
+
}
|
|
182
|
+
this.logger.info('noise resume handshake fallback to XX');
|
|
183
|
+
return this.resumeHandshakeWithFallback(clientStaticKeyPair, ephemeralKeyPair, payload, protocolHeader, resumeResult.serverHelloFrame, verifyCertificates);
|
|
184
|
+
}
|
|
185
|
+
async tryResumeHandshakeWithIk(serverStaticKey, clientStaticKeyPair, ephemeralKeyPair, payload, protocolHeader) {
|
|
186
|
+
this.logger.trace('noise resume handshake: send IK client hello');
|
|
187
|
+
const handshake = new WaNoiseHandshake_1.WaNoiseHandshake();
|
|
188
|
+
await handshake.start(constants_2.NOISE_IK_NAME, protocolHeader);
|
|
189
|
+
await handshake.authenticate(serverStaticKey);
|
|
190
|
+
await handshake.authenticate(ephemeralKeyPair.pubKey);
|
|
191
|
+
const agreement1 = await _crypto_1.X25519.scalarMult(ephemeralKeyPair.privKey, serverStaticKey);
|
|
192
|
+
await handshake.mixIntoKey(agreement1);
|
|
193
|
+
const encryptedClientStatic = await handshake.encrypt(clientStaticKeyPair.pubKey);
|
|
194
|
+
const agreement2 = await _crypto_1.X25519.scalarMult(clientStaticKeyPair.privKey, serverStaticKey);
|
|
195
|
+
await handshake.mixIntoKey(agreement2);
|
|
196
|
+
const encryptedPayload = await handshake.encrypt(payload);
|
|
197
|
+
const clientHello = _proto_1.proto.HandshakeMessage.encode({
|
|
198
|
+
clientHello: {
|
|
199
|
+
ephemeral: ephemeralKeyPair.pubKey,
|
|
200
|
+
payload: encryptedPayload,
|
|
201
|
+
static: encryptedClientStatic
|
|
202
|
+
}
|
|
203
|
+
}).finish();
|
|
204
|
+
const serverHelloFrame = await this.sendAndReceiveHandshakeFrame(clientHello);
|
|
205
|
+
const parsed = _proto_1.proto.HandshakeMessage.decode(serverHelloFrame);
|
|
206
|
+
const serverHello = parsed.serverHello;
|
|
207
|
+
if (!serverHello) {
|
|
208
|
+
throw new Error('noise resume handshake missing serverHello');
|
|
209
|
+
}
|
|
210
|
+
if (serverHello.static) {
|
|
211
|
+
return { socket: null, serverHelloFrame };
|
|
212
|
+
}
|
|
213
|
+
if (!serverHello.ephemeral) {
|
|
214
|
+
throw new Error('noise resume handshake missing server ephemeral');
|
|
215
|
+
}
|
|
216
|
+
if (!serverHello.payload) {
|
|
217
|
+
throw new Error('noise resume handshake missing certificate payload');
|
|
218
|
+
}
|
|
219
|
+
const serverEphemeral = (0, bytes_1.toBytesView)(serverHello.ephemeral);
|
|
220
|
+
await handshake.authenticate(serverEphemeral);
|
|
221
|
+
await handshake.mixIntoKey(await _crypto_1.X25519.scalarMult(ephemeralKeyPair.privKey, serverEphemeral));
|
|
222
|
+
await handshake.mixIntoKey(await _crypto_1.X25519.scalarMult(clientStaticKeyPair.privKey, serverEphemeral));
|
|
223
|
+
await handshake.decrypt((0, bytes_1.toBytesView)(serverHello.payload));
|
|
224
|
+
this.serverStaticKey = serverStaticKey;
|
|
225
|
+
this.logger.info('noise resume handshake successful without fallback');
|
|
226
|
+
return { socket: await handshake.finish(), serverHelloFrame: null };
|
|
227
|
+
}
|
|
228
|
+
async resumeHandshakeWithFallback(clientStaticKeyPair, ephemeralKeyPair, payload, protocolHeader, serverHelloFrame, verifyCertificates) {
|
|
229
|
+
const fallback = new WaNoiseHandshake_1.WaNoiseHandshake();
|
|
230
|
+
await fallback.start(constants_2.NOISE_XX_FALLBACK_NAME, protocolHeader);
|
|
231
|
+
await fallback.authenticate(ephemeralKeyPair.pubKey);
|
|
232
|
+
return this.continueFullHandshake(fallback, serverHelloFrame, clientStaticKeyPair, ephemeralKeyPair, payload, verifyCertificates);
|
|
233
|
+
}
|
|
234
|
+
async continueFullHandshake(handshake, serverHelloFrame, clientStaticKeyPair, ephemeralKeyPair, payload, verifyCertificates) {
|
|
235
|
+
this.logger.trace('noise continue full handshake');
|
|
236
|
+
const parsed = _proto_1.proto.HandshakeMessage.decode(serverHelloFrame);
|
|
237
|
+
const serverHello = parsed.serverHello;
|
|
238
|
+
if (!serverHello?.ephemeral || !serverHello.static || !serverHello.payload) {
|
|
239
|
+
throw new Error('noise full handshake missing server hello fields');
|
|
240
|
+
}
|
|
241
|
+
const serverEphemeral = (0, bytes_1.toBytesView)(serverHello.ephemeral);
|
|
242
|
+
await handshake.authenticate(serverEphemeral);
|
|
243
|
+
await handshake.mixIntoKey(await _crypto_1.X25519.scalarMult(ephemeralKeyPair.privKey, serverEphemeral));
|
|
244
|
+
const serverStatic = await handshake.decrypt((0, bytes_1.toBytesView)(serverHello.static));
|
|
245
|
+
await handshake.mixIntoKey(await _crypto_1.X25519.scalarMult(ephemeralKeyPair.privKey, serverStatic));
|
|
246
|
+
const certificate = await handshake.decrypt((0, bytes_1.toBytesView)(serverHello.payload));
|
|
247
|
+
if (verifyCertificates) {
|
|
248
|
+
await (0, WaNoiseCert_1.verifyNoiseCertificateChain)(certificate, serverStatic);
|
|
249
|
+
this.logger.trace('noise certificate chain verified');
|
|
250
|
+
}
|
|
251
|
+
this.serverStaticKey = serverStatic;
|
|
252
|
+
const encryptedClientStatic = await handshake.encrypt(clientStaticKeyPair.pubKey);
|
|
253
|
+
await handshake.mixIntoKey(await _crypto_1.X25519.scalarMult(clientStaticKeyPair.privKey, serverEphemeral));
|
|
254
|
+
const encryptedPayload = await handshake.encrypt(payload);
|
|
255
|
+
const clientFinish = _proto_1.proto.HandshakeMessage.encode({
|
|
256
|
+
clientFinish: {
|
|
257
|
+
static: encryptedClientStatic,
|
|
258
|
+
payload: encryptedPayload
|
|
259
|
+
}
|
|
260
|
+
}).finish();
|
|
261
|
+
await this.sendHandshakeFrame(clientFinish);
|
|
262
|
+
this.logger.trace('noise full handshake client finish sent');
|
|
263
|
+
return handshake.finish();
|
|
264
|
+
}
|
|
265
|
+
async sendHandshakeFrame(frame) {
|
|
266
|
+
const codec = this.frameCodec;
|
|
267
|
+
if (!codec) {
|
|
268
|
+
throw new Error('noise frame codec is not initialized');
|
|
269
|
+
}
|
|
270
|
+
this.logger.trace('noise send handshake frame', { byteLength: frame.byteLength });
|
|
271
|
+
await this.sendWire(codec.encodeFrame(frame));
|
|
272
|
+
}
|
|
273
|
+
async sendAndReceiveHandshakeFrame(frame) {
|
|
274
|
+
await this.sendHandshakeFrame(frame);
|
|
275
|
+
return this.waitHandshakeFrame();
|
|
276
|
+
}
|
|
277
|
+
async waitHandshakeFrame() {
|
|
278
|
+
if (this.closedError) {
|
|
279
|
+
throw this.closedError;
|
|
280
|
+
}
|
|
281
|
+
const queued = this.handshakeInbox.shift();
|
|
282
|
+
if (queued) {
|
|
283
|
+
this.logger.trace('noise handshake frame consumed from queue');
|
|
284
|
+
return queued;
|
|
285
|
+
}
|
|
286
|
+
this.logger.trace('noise waiting handshake frame');
|
|
287
|
+
return new Promise((resolve, reject) => {
|
|
288
|
+
if (this.closedError) {
|
|
289
|
+
reject(this.closedError);
|
|
290
|
+
return;
|
|
291
|
+
}
|
|
292
|
+
const timeout = setTimeout(() => {
|
|
293
|
+
if (this.handshakeWaiter === resolve) {
|
|
294
|
+
this.handshakeWaiter = null;
|
|
295
|
+
this.handshakeRejecter = null;
|
|
296
|
+
}
|
|
297
|
+
reject(new Error(`noise handshake frame timeout after ${this.handshakeFrameTimeoutMs}ms`));
|
|
298
|
+
}, this.handshakeFrameTimeoutMs);
|
|
299
|
+
timeout.unref?.();
|
|
300
|
+
this.handshakeWaiter = (frame) => {
|
|
301
|
+
clearTimeout(timeout);
|
|
302
|
+
resolve(frame);
|
|
303
|
+
};
|
|
304
|
+
this.handshakeRejecter = (error) => {
|
|
305
|
+
clearTimeout(timeout);
|
|
306
|
+
reject(error);
|
|
307
|
+
};
|
|
308
|
+
}).catch((error) => {
|
|
309
|
+
throw (0, primitives_1.toError)(error);
|
|
310
|
+
});
|
|
311
|
+
}
|
|
312
|
+
async decodeBufferedPostHandshakeFrames() {
|
|
313
|
+
if (!this.noiseSocket || this.handshakeInbox.length === 0) {
|
|
314
|
+
return;
|
|
315
|
+
}
|
|
316
|
+
this.logger.debug('decoding buffered post-handshake frames', {
|
|
317
|
+
count: this.handshakeInbox.length
|
|
318
|
+
});
|
|
319
|
+
const buffered = this.handshakeInbox.splice(0, this.handshakeInbox.length);
|
|
320
|
+
for (const frame of buffered) {
|
|
321
|
+
const decrypted = await this.readQueue.enqueue(() => this.noiseSocket.decrypt(frame));
|
|
322
|
+
this.pendingDecryptedFrames.push(decrypted);
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
exports.WaNoiseSession = WaNoiseSession;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.WaNoiseSocket = void 0;
|
|
4
|
+
const _crypto_1 = require("../../crypto/index.js");
|
|
5
|
+
class WaNoiseSocket {
|
|
6
|
+
constructor(encryptKey, decryptKey) {
|
|
7
|
+
this.encryptKey = encryptKey;
|
|
8
|
+
this.decryptKey = decryptKey;
|
|
9
|
+
this.writeCounter = 0;
|
|
10
|
+
this.readCounter = 0;
|
|
11
|
+
}
|
|
12
|
+
async encrypt(frame, additionalData) {
|
|
13
|
+
const nonce = (0, _crypto_1.buildNonce)(this.writeCounter++);
|
|
14
|
+
return (0, _crypto_1.aesGcmEncrypt)(this.encryptKey, nonce, frame, additionalData);
|
|
15
|
+
}
|
|
16
|
+
async decrypt(frame, additionalData) {
|
|
17
|
+
const nonce = (0, _crypto_1.buildNonce)(this.readCounter++);
|
|
18
|
+
return (0, _crypto_1.aesGcmDecrypt)(this.decryptKey, nonce, frame, additionalData);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
exports.WaNoiseSocket = WaNoiseSocket;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ROOT_CA_PUBLIC_KEY_HEX = exports.ROOT_CA_SERIAL = exports.NOISE_XX_FALLBACK_NAME = exports.NOISE_IK_NAME = exports.NOISE_XX_NAME = exports.WA_PROTO_HEADER = exports.DEFAULT_VERSION_BASE = void 0;
|
|
4
|
+
const bytes_1 = require("../../util/bytes");
|
|
5
|
+
exports.DEFAULT_VERSION_BASE = '2.3000.1034748654';
|
|
6
|
+
exports.WA_PROTO_HEADER = new Uint8Array([87, 65, 6, 3]);
|
|
7
|
+
exports.NOISE_XX_NAME = bytes_1.TEXT_ENCODER.encode('Noise_XX_25519_AESGCM_SHA256\0\0\0\0');
|
|
8
|
+
exports.NOISE_IK_NAME = bytes_1.TEXT_ENCODER.encode('Noise_IK_25519_AESGCM_SHA256\0\0\0\0');
|
|
9
|
+
exports.NOISE_XX_FALLBACK_NAME = bytes_1.TEXT_ENCODER.encode('Noise_XXfallback_25519_AESGCM_SHA256');
|
|
10
|
+
exports.ROOT_CA_SERIAL = 0;
|
|
11
|
+
exports.ROOT_CA_PUBLIC_KEY_HEX = '142375574d0a587166aae71ebe516437c4a28b73e3695c6ce1f7f9545da8ee6b';
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseStreamControlNode = parseStreamControlNode;
|
|
4
|
+
exports.parseOptionalInt = parseOptionalInt;
|
|
5
|
+
exports.parseCompanionEncStatic = parseCompanionEncStatic;
|
|
6
|
+
exports.parseSuccessPersistAttributes = parseSuccessPersistAttributes;
|
|
7
|
+
const constants_1 = require("../../protocol/constants");
|
|
8
|
+
const helpers_1 = require("../node/helpers");
|
|
9
|
+
const base64_1 = require("../../util/base64");
|
|
10
|
+
function parseStrictUnsignedInt(value) {
|
|
11
|
+
if (!/^\d+$/.test(value)) {
|
|
12
|
+
return undefined;
|
|
13
|
+
}
|
|
14
|
+
const parsed = Number(value);
|
|
15
|
+
if (!Number.isSafeInteger(parsed)) {
|
|
16
|
+
return undefined;
|
|
17
|
+
}
|
|
18
|
+
return parsed;
|
|
19
|
+
}
|
|
20
|
+
function parseStreamControlNode(node) {
|
|
21
|
+
if (node.tag === constants_1.WA_STREAM_SIGNALING.XML_STREAM_END_TAG) {
|
|
22
|
+
return {
|
|
23
|
+
kind: 'xmlstreamend'
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
if (node.tag !== constants_1.WA_STREAM_SIGNALING.STREAM_ERROR_TAG) {
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
const conflictNode = (0, helpers_1.findNodeChild)(node, constants_1.WA_STREAM_SIGNALING.CONFLICT_TAG);
|
|
30
|
+
if (conflictNode) {
|
|
31
|
+
if (conflictNode.attrs.type === constants_1.WA_STREAM_SIGNALING.REPLACED_TYPE) {
|
|
32
|
+
return {
|
|
33
|
+
kind: 'stream_error_replaced'
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
return {
|
|
37
|
+
kind: 'stream_error_device_removed'
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
const codeRaw = node.attrs.code;
|
|
41
|
+
if (codeRaw) {
|
|
42
|
+
const code = parseStrictUnsignedInt(codeRaw);
|
|
43
|
+
if (code !== undefined) {
|
|
44
|
+
return {
|
|
45
|
+
kind: 'stream_error_code',
|
|
46
|
+
code
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
const ackNode = (0, helpers_1.findNodeChild)(node, constants_1.WA_STREAM_SIGNALING.ACK_TAG);
|
|
51
|
+
if (ackNode) {
|
|
52
|
+
return {
|
|
53
|
+
kind: 'stream_error_ack',
|
|
54
|
+
id: ackNode.attrs.id
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
if ((0, helpers_1.hasNodeChild)(node, constants_1.WA_STREAM_SIGNALING.XML_NOT_WELL_FORMED_TAG)) {
|
|
58
|
+
return {
|
|
59
|
+
kind: 'stream_error_xml_not_well_formed'
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
return {
|
|
63
|
+
kind: 'stream_error_other'
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
function parseOptionalInt(value) {
|
|
67
|
+
if (!value) {
|
|
68
|
+
return undefined;
|
|
69
|
+
}
|
|
70
|
+
return parseStrictUnsignedInt(value);
|
|
71
|
+
}
|
|
72
|
+
function parseCompanionEncStatic(value, onError) {
|
|
73
|
+
if (!value) {
|
|
74
|
+
return undefined;
|
|
75
|
+
}
|
|
76
|
+
try {
|
|
77
|
+
return (0, base64_1.base64ToBytes)(value, 'success.companion_enc_static');
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
if (error instanceof Error) {
|
|
81
|
+
onError?.(error);
|
|
82
|
+
}
|
|
83
|
+
return undefined;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
function parseSuccessPersistAttributes(node, onCompanionParseError) {
|
|
87
|
+
return {
|
|
88
|
+
meLid: node.attrs.lid,
|
|
89
|
+
meDisplayName: node.attrs.display_name,
|
|
90
|
+
companionEncStatic: parseCompanionEncStatic(node.attrs.companion_enc_static, onCompanionParseError),
|
|
91
|
+
lastSuccessTs: parseOptionalInt(node.attrs.t),
|
|
92
|
+
propsVersion: parseOptionalInt(node.attrs.props),
|
|
93
|
+
abPropsVersion: parseOptionalInt(node.attrs.abprops),
|
|
94
|
+
connectionLocation: node.attrs.location,
|
|
95
|
+
accountCreationTs: parseOptionalInt(node.attrs.creation)
|
|
96
|
+
};
|
|
97
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import type { Proto } from '..';
|
|
2
|
+
interface WaAppStateDerivedKeys {
|
|
3
|
+
readonly indexKey: Uint8Array;
|
|
4
|
+
readonly valueEncryptionKey: Uint8Array;
|
|
5
|
+
readonly valueMacKey: Uint8Array;
|
|
6
|
+
readonly snapshotMacKey: Uint8Array;
|
|
7
|
+
readonly patchMacKey: Uint8Array;
|
|
8
|
+
}
|
|
9
|
+
interface WaAppStateEncryptedMutation {
|
|
10
|
+
readonly indexMac: Uint8Array;
|
|
11
|
+
readonly valueBlob: Uint8Array;
|
|
12
|
+
readonly valueMac: Uint8Array;
|
|
13
|
+
}
|
|
14
|
+
interface WaAppStateDecryptedMutation {
|
|
15
|
+
readonly index: string;
|
|
16
|
+
readonly value: Proto.ISyncActionValue | null;
|
|
17
|
+
readonly version: number;
|
|
18
|
+
readonly indexMac: Uint8Array;
|
|
19
|
+
readonly valueMac: Uint8Array;
|
|
20
|
+
}
|
|
21
|
+
export declare class WaAppStateCrypto {
|
|
22
|
+
private readonly derivedKeysCache;
|
|
23
|
+
private readonly derivedKeysCacheMaxSize;
|
|
24
|
+
constructor(derivedKeysCacheMaxSize?: number);
|
|
25
|
+
clearCache(): void;
|
|
26
|
+
deriveKeys(keyData: Uint8Array): Promise<WaAppStateDerivedKeys>;
|
|
27
|
+
generateIndexMac(indexKey: Uint8Array, indexBytes: Uint8Array): Promise<Uint8Array>;
|
|
28
|
+
encryptMutation(args: {
|
|
29
|
+
readonly operation: number;
|
|
30
|
+
readonly keyId: Uint8Array;
|
|
31
|
+
readonly keyData: Uint8Array;
|
|
32
|
+
readonly index: string;
|
|
33
|
+
readonly value: Proto.ISyncActionValue | null;
|
|
34
|
+
readonly version: number;
|
|
35
|
+
readonly iv?: Uint8Array;
|
|
36
|
+
}): Promise<WaAppStateEncryptedMutation>;
|
|
37
|
+
decryptMutation(args: {
|
|
38
|
+
readonly operation: number;
|
|
39
|
+
readonly keyId: Uint8Array;
|
|
40
|
+
readonly keyData: Uint8Array;
|
|
41
|
+
readonly indexMac: Uint8Array;
|
|
42
|
+
readonly valueBlob: Uint8Array;
|
|
43
|
+
}): Promise<WaAppStateDecryptedMutation>;
|
|
44
|
+
generateSnapshotMac(keyData: Uint8Array, ltHash: Uint8Array, version: number, collectionName: string): Promise<Uint8Array>;
|
|
45
|
+
generatePatchMac(keyData: Uint8Array, snapshotMac: Uint8Array, valueMacs: readonly Uint8Array[], version: number, collectionName: string): Promise<Uint8Array>;
|
|
46
|
+
ltHashAdd(base: Uint8Array, addValues: readonly Uint8Array[]): Promise<Uint8Array>;
|
|
47
|
+
ltHashSubtract(base: Uint8Array, removeValues: readonly Uint8Array[]): Promise<Uint8Array>;
|
|
48
|
+
ltHashSubtractThenAdd(base: Uint8Array, addValues: readonly Uint8Array[], removeValues: readonly Uint8Array[]): Promise<{
|
|
49
|
+
readonly hash: Uint8Array;
|
|
50
|
+
readonly subtractResult: Uint8Array;
|
|
51
|
+
}>;
|
|
52
|
+
private ltHashApply;
|
|
53
|
+
private pointwiseWithOverflow;
|
|
54
|
+
private generateAssociatedData;
|
|
55
|
+
private generateValueMac;
|
|
56
|
+
private normalizeDerivedKeysCacheMaxSize;
|
|
57
|
+
private touchDerivedKeysCacheEntry;
|
|
58
|
+
}
|
|
59
|
+
export {};
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import type { AppStateCollectionName, WaAppStateMissingKeysEvent, WaAppStateSyncOptions, WaAppStateStoreData, WaAppStateSyncResult, WaAppStateSyncKey } from './types';
|
|
2
|
+
import type { Logger } from '../infra/log/types';
|
|
3
|
+
import type { Proto } from '..';
|
|
4
|
+
import type { WaAppStateStore } from '../store/contracts/appstate.store';
|
|
5
|
+
import type { BinaryNode } from '../transport/types';
|
|
6
|
+
interface WaAppStateSyncClientOptions {
|
|
7
|
+
readonly logger: Logger;
|
|
8
|
+
readonly query: (node: BinaryNode, timeoutMs: number) => Promise<BinaryNode>;
|
|
9
|
+
readonly store: WaAppStateStore;
|
|
10
|
+
readonly hostDomain?: string;
|
|
11
|
+
readonly defaultTimeoutMs?: number;
|
|
12
|
+
readonly onMissingKeys?: (event: WaAppStateMissingKeysEvent) => Promise<void>;
|
|
13
|
+
}
|
|
14
|
+
export declare class WaAppStateMissingKeyError extends Error {
|
|
15
|
+
readonly keyId: Uint8Array | null;
|
|
16
|
+
readonly collection: AppStateCollectionName;
|
|
17
|
+
constructor(message: string, keyId: Uint8Array | null, collection: AppStateCollectionName);
|
|
18
|
+
}
|
|
19
|
+
export declare class WaAppStateSyncClient {
|
|
20
|
+
private readonly logger;
|
|
21
|
+
private readonly query;
|
|
22
|
+
private readonly store;
|
|
23
|
+
private readonly hostDomain;
|
|
24
|
+
private readonly defaultTimeoutMs;
|
|
25
|
+
private readonly onMissingKeys?;
|
|
26
|
+
private readonly crypto;
|
|
27
|
+
private syncContext;
|
|
28
|
+
private syncPromise;
|
|
29
|
+
constructor(options: WaAppStateSyncClientOptions);
|
|
30
|
+
exportState(): Promise<WaAppStateStoreData>;
|
|
31
|
+
importSyncKeys(keys: readonly WaAppStateSyncKey[]): Promise<number>;
|
|
32
|
+
importSyncKeyShare(share: Proto.Message.IAppStateSyncKeyShare): Promise<number>;
|
|
33
|
+
sync(options?: WaAppStateSyncOptions): Promise<WaAppStateSyncResult>;
|
|
34
|
+
private syncOnce;
|
|
35
|
+
private syncCollectionsRound;
|
|
36
|
+
private prepareSyncRoundRequest;
|
|
37
|
+
private buildCollectionSyncRequest;
|
|
38
|
+
private buildSyncIqNode;
|
|
39
|
+
private fetchSyncPayloadByCollection;
|
|
40
|
+
private processCollectionRound;
|
|
41
|
+
private createCollectionOutcome;
|
|
42
|
+
private collectDistinctMissingKeyIds;
|
|
43
|
+
private notifyMissingKeys;
|
|
44
|
+
private resolveReadyPatches;
|
|
45
|
+
private validateSnapshot;
|
|
46
|
+
private parseCollectionPatchVersion;
|
|
47
|
+
private validatePatch;
|
|
48
|
+
private applySnapshot;
|
|
49
|
+
private applyPatch;
|
|
50
|
+
private decryptSnapshotRecords;
|
|
51
|
+
private decryptPatchMutations;
|
|
52
|
+
private assertPatchMacsMatch;
|
|
53
|
+
private buildOutgoingPatch;
|
|
54
|
+
private computeNextCollectionState;
|
|
55
|
+
private normalizeProtoLong;
|
|
56
|
+
private groupPendingMutations;
|
|
57
|
+
private getKeyData;
|
|
58
|
+
private getCollectionState;
|
|
59
|
+
private setCollectionState;
|
|
60
|
+
private persistCollectionUpdates;
|
|
61
|
+
private requireSyncContext;
|
|
62
|
+
}
|
|
63
|
+
export {};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { AppStateCollectionName, AppStateCollectionState } from './types';
|
|
2
|
+
import type { Proto } from '..';
|
|
3
|
+
import type { BinaryNode } from '../transport/types';
|
|
4
|
+
export interface CollectionResponsePayload {
|
|
5
|
+
readonly collection: AppStateCollectionName;
|
|
6
|
+
readonly state: AppStateCollectionState;
|
|
7
|
+
readonly version?: number;
|
|
8
|
+
readonly patches: readonly Proto.ISyncdPatch[];
|
|
9
|
+
readonly snapshotReference?: Proto.IExternalBlobReference;
|
|
10
|
+
}
|
|
11
|
+
export declare function parseSyncResponse(iqNode: BinaryNode): readonly CollectionResponsePayload[];
|
|
12
|
+
export declare function parseCollectionState(node: BinaryNode): AppStateCollectionState;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { AppStateCollectionName } from './types';
|
|
2
|
+
export declare const APP_STATE_DERIVED_KEY_LENGTH = 160;
|
|
3
|
+
export declare const APP_STATE_DERIVED_INDEX_KEY_END = 32;
|
|
4
|
+
export declare const APP_STATE_DERIVED_VALUE_ENCRYPTION_KEY_END = 64;
|
|
5
|
+
export declare const APP_STATE_DERIVED_VALUE_MAC_KEY_END = 96;
|
|
6
|
+
export declare const APP_STATE_DERIVED_SNAPSHOT_MAC_KEY_END = 128;
|
|
7
|
+
export declare const APP_STATE_DERIVED_PATCH_MAC_KEY_END = 160;
|
|
8
|
+
export declare const APP_STATE_VALUE_MAC_LENGTH = 32;
|
|
9
|
+
export declare const APP_STATE_MAC_OCTET_LENGTH = 8;
|
|
10
|
+
export declare const APP_STATE_IV_LENGTH = 16;
|
|
11
|
+
export declare const APP_STATE_LT_HASH_SIZE = 128;
|
|
12
|
+
export declare const APP_STATE_POINT_SIZE = 2;
|
|
13
|
+
export declare const APP_STATE_EMPTY_LT_HASH: Uint8Array<ArrayBuffer>;
|
|
14
|
+
export declare const APP_STATE_DEFAULT_COLLECTIONS: readonly AppStateCollectionName[];
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export * from './constants';
|
|
2
|
+
export type { WaAppStateSyncOptions } from './types';
|
|
3
|
+
export * from './utils';
|
|
4
|
+
export { WaAppStateCrypto } from './WaAppStateCrypto';
|
|
5
|
+
export { WaAppStateMissingKeyError } from './WaAppStateSyncClient';
|
|
6
|
+
export { parseCollectionState, parseSyncResponse, type CollectionResponsePayload } from './WaAppStateSyncResponseParser';
|
|
7
|
+
export { WaAppStateSyncClient } from './WaAppStateSyncClient';
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { WaAppStateStoreData, WaAppStateSyncKey } from '../types';
|
|
2
|
+
export interface AppStateSyncKeyRow extends Record<string, unknown> {
|
|
3
|
+
readonly key_id: unknown;
|
|
4
|
+
readonly key_data: unknown;
|
|
5
|
+
readonly timestamp: unknown;
|
|
6
|
+
readonly fingerprint: unknown;
|
|
7
|
+
}
|
|
8
|
+
export interface AppStateCollectionVersionRow extends Record<string, unknown> {
|
|
9
|
+
readonly collection: unknown;
|
|
10
|
+
readonly version: unknown;
|
|
11
|
+
readonly hash: unknown;
|
|
12
|
+
}
|
|
13
|
+
export interface AppStateCollectionValueRow extends Record<string, unknown> {
|
|
14
|
+
readonly collection: unknown;
|
|
15
|
+
readonly index_mac_hex: unknown;
|
|
16
|
+
readonly value_mac: unknown;
|
|
17
|
+
}
|
|
18
|
+
export declare function encodeAppStateFingerprint(fingerprint: WaAppStateSyncKey['fingerprint']): Uint8Array | null;
|
|
19
|
+
export declare function decodeAppStateFingerprint(raw: unknown): WaAppStateSyncKey['fingerprint'] | undefined;
|
|
20
|
+
export declare function decodeAppStateSyncKeys(rows: readonly AppStateSyncKeyRow[]): readonly WaAppStateSyncKey[];
|
|
21
|
+
export declare function decodeAppStateCollections(versionRows: readonly AppStateCollectionVersionRow[], valueRows: readonly AppStateCollectionValueRow[]): WaAppStateStoreData['collections'];
|