zapo-js 0.1.0 → 0.1.2
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 +12 -7
- package/dist/appstate/WaAppStateCrypto.js +18 -25
- package/dist/appstate/WaAppStateSyncClient.js +181 -114
- package/dist/appstate/WaAppStateSyncResponseParser.js +16 -5
- package/dist/appstate/constants.js +4 -3
- package/dist/appstate/utils.js +10 -30
- package/dist/auth/WaAuthClient.js +48 -55
- package/dist/auth/flow/WaAuthCredentialsFlow.js +21 -14
- package/dist/auth/index.js +1 -3
- package/dist/auth/pairing/WaPairingFlow.js +21 -23
- package/dist/auth/pairing/WaQrFlow.js +37 -24
- package/dist/client/WaClient.js +103 -276
- package/dist/client/WaClientFactory.js +227 -110
- package/dist/client/connection/WaConnectionManager.js +292 -0
- package/dist/client/connection/WaKeyShareCoordinator.js +63 -0
- package/dist/client/connection/WaReceiptQueue.js +51 -0
- package/dist/client/coordinators/WaAppStateMutationCoordinator.js +471 -0
- package/dist/client/coordinators/WaGroupCoordinator.js +27 -17
- package/dist/client/coordinators/WaIncomingNodeCoordinator.js +20 -27
- package/dist/client/coordinators/WaMessageDispatchCoordinator.js +231 -686
- package/dist/client/coordinators/WaRetryCoordinator.js +70 -37
- package/dist/client/dirty.js +35 -29
- package/dist/client/events/chat.js +4 -3
- package/dist/client/events/group.js +59 -36
- package/dist/client/history-sync.js +53 -63
- package/dist/client/incoming.js +23 -20
- package/dist/client/mailbox.js +8 -8
- package/dist/client/messages.js +4 -4
- package/dist/client/messaging/fanout.js +189 -0
- package/dist/client/messaging/key-protocol.js +130 -0
- package/dist/client/messaging/participants.js +191 -0
- package/dist/crypto/core/hkdf.js +3 -8
- package/dist/crypto/core/index.js +1 -4
- package/dist/crypto/core/keys.js +2 -3
- package/dist/crypto/core/primitives.js +12 -15
- package/dist/crypto/core/random.js +7 -26
- package/dist/crypto/curves/Ed25519.js +7 -8
- package/dist/crypto/curves/X25519.js +13 -16
- package/dist/crypto/index.js +0 -5
- package/dist/esm/appstate/WaAppStateCrypto.js +6 -13
- package/dist/esm/appstate/WaAppStateSyncClient.js +174 -107
- package/dist/esm/appstate/WaAppStateSyncResponseParser.js +17 -6
- package/dist/esm/appstate/constants.js +3 -2
- package/dist/esm/appstate/utils.js +8 -27
- package/dist/esm/auth/WaAuthClient.js +48 -55
- package/dist/esm/auth/flow/WaAuthCredentialsFlow.js +21 -14
- package/dist/esm/auth/index.js +0 -1
- package/dist/esm/auth/pairing/WaPairingFlow.js +14 -16
- package/dist/esm/auth/pairing/WaQrFlow.js +37 -24
- package/dist/esm/client/WaClient.js +103 -276
- package/dist/esm/client/WaClientFactory.js +227 -110
- package/dist/esm/client/connection/WaConnectionManager.js +288 -0
- package/dist/esm/client/connection/WaKeyShareCoordinator.js +59 -0
- package/dist/esm/client/connection/WaReceiptQueue.js +47 -0
- package/dist/esm/client/coordinators/WaAppStateMutationCoordinator.js +467 -0
- package/dist/esm/client/coordinators/WaGroupCoordinator.js +20 -10
- package/dist/esm/client/coordinators/WaIncomingNodeCoordinator.js +20 -27
- package/dist/esm/client/coordinators/WaMessageDispatchCoordinator.js +232 -687
- package/dist/esm/client/coordinators/WaRetryCoordinator.js +71 -38
- package/dist/esm/client/dirty.js +30 -24
- package/dist/esm/client/events/chat.js +4 -3
- package/dist/esm/client/events/group.js +50 -28
- package/dist/esm/client/history-sync.js +50 -60
- package/dist/esm/client/incoming.js +23 -20
- package/dist/esm/client/mailbox.js +8 -8
- package/dist/esm/client/messages.js +1 -1
- package/dist/esm/client/messaging/fanout.js +186 -0
- package/dist/esm/client/messaging/key-protocol.js +127 -0
- package/dist/esm/client/messaging/participants.js +188 -0
- package/dist/esm/crypto/core/hkdf.js +3 -8
- package/dist/esm/crypto/core/index.js +0 -1
- package/dist/esm/crypto/core/keys.js +2 -3
- package/dist/esm/crypto/core/primitives.js +12 -15
- package/dist/esm/crypto/core/random.js +6 -25
- package/dist/esm/crypto/curves/Ed25519.js +4 -5
- package/dist/esm/crypto/curves/X25519.js +10 -13
- package/dist/esm/crypto/index.js +0 -2
- package/dist/esm/infra/log/ConsoleLogger.js +18 -17
- package/dist/esm/infra/log/PinoLogger.js +15 -9
- package/dist/esm/infra/log/types.js +11 -1
- package/dist/esm/infra/perf/BoundedTaskQueue.js +13 -17
- package/dist/esm/media/WaMediaCrypto.js +2 -4
- package/dist/esm/media/WaMediaTransferClient.js +226 -58
- package/dist/esm/media/conn.js +10 -6
- package/dist/esm/media/constants.js +4 -1
- package/dist/esm/message/WaMessageClient.js +4 -13
- package/dist/esm/message/ack.js +6 -6
- package/dist/esm/message/addon-crypto.js +59 -0
- package/dist/esm/message/incoming.js +106 -111
- package/dist/esm/message/index.js +2 -0
- package/dist/esm/message/reporting-token.js +438 -0
- package/dist/esm/message/use-case-secret.js +49 -0
- package/dist/esm/protocol/appstate.js +58 -0
- package/dist/esm/protocol/constants.js +2 -1
- package/dist/esm/protocol/index.js +2 -10
- package/dist/esm/protocol/jid.js +63 -51
- package/dist/esm/protocol/media.js +3 -3
- package/dist/esm/protocol/nodes.js +2 -0
- package/dist/esm/protocol/usync.js +11 -0
- package/dist/esm/retry/index.js +1 -0
- package/dist/esm/retry/outbound.js +4 -5
- package/dist/esm/retry/parse.js +58 -76
- package/dist/esm/retry/replay.js +48 -49
- package/dist/esm/retry/tracker.js +56 -0
- package/dist/esm/signal/api/SignalDeviceSyncApi.js +249 -82
- package/dist/esm/signal/api/SignalDigestSyncApi.js +6 -1
- package/dist/esm/signal/api/SignalIdentitySyncApi.js +49 -34
- package/dist/esm/signal/api/SignalMissingPreKeysSyncApi.js +70 -62
- package/dist/esm/signal/api/SignalSessionSyncApi.js +23 -30
- package/dist/esm/signal/crypto/WaAdvSignature.js +3 -5
- package/dist/esm/signal/group/SenderKeyChain.js +28 -23
- package/dist/esm/signal/group/SenderKeyCodec.js +2 -4
- package/dist/esm/signal/group/SenderKeyManager.js +26 -16
- package/dist/esm/signal/index.js +1 -0
- package/dist/esm/signal/session/SignalProtocol.js +49 -14
- package/dist/esm/signal/session/SignalRatchet.js +24 -15
- package/dist/esm/signal/session/SignalSession.js +14 -9
- package/dist/esm/signal/session/resolver.js +186 -0
- package/dist/esm/signal/store/sqlite.js +16 -37
- package/dist/esm/store/createStore.js +16 -18
- package/dist/esm/store/noop.store.js +3 -6
- package/dist/esm/store/providers/memory/appstate.store.js +30 -6
- package/dist/esm/store/providers/memory/contact.store.js +5 -0
- package/dist/esm/store/providers/memory/device-list.store.js +3 -30
- package/dist/esm/store/providers/memory/message.store.js +11 -5
- package/dist/esm/store/providers/memory/participants.store.js +1 -8
- package/dist/esm/store/providers/memory/sender-key.store.js +5 -7
- package/dist/esm/store/providers/memory/signal.store.js +13 -1
- package/dist/esm/store/providers/memory/thread.store.js +5 -0
- package/dist/esm/store/providers/sqlite/appstate.store.js +82 -1
- package/dist/esm/store/providers/sqlite/connection.js +18 -13
- package/dist/esm/store/providers/sqlite/contact.store.js +31 -18
- package/dist/esm/store/providers/sqlite/device-list.store.js +7 -35
- package/dist/esm/store/providers/sqlite/message.store.js +45 -32
- package/dist/esm/store/providers/sqlite/migrations.js +1 -1
- package/dist/esm/store/providers/sqlite/participants.store.js +1 -9
- package/dist/esm/store/providers/sqlite/retry.store.js +8 -11
- package/dist/esm/store/providers/sqlite/sender-key.store.js +25 -30
- package/dist/esm/store/providers/sqlite/signal.store.js +104 -22
- package/dist/esm/store/providers/sqlite/table-names.js +107 -0
- package/dist/esm/store/providers/sqlite/thread.store.js +35 -22
- package/dist/esm/transport/WaComms.js +25 -23
- package/dist/esm/transport/WaWebSocket.js +115 -12
- package/dist/esm/transport/binary/decoder.js +4 -4
- package/dist/esm/transport/binary/encoder.js +12 -4
- package/dist/esm/transport/index.js +1 -0
- package/dist/esm/transport/keepalive/WaKeepAlive.js +2 -8
- package/dist/esm/transport/node/WaNodeOrchestrator.js +2 -4
- package/dist/esm/transport/node/WaNodeTransport.js +0 -3
- package/dist/esm/transport/node/builders/{accountSync.js → account-sync.js} +16 -36
- package/dist/esm/transport/node/builders/index.js +2 -1
- package/dist/esm/transport/node/builders/message.js +9 -0
- package/dist/esm/transport/node/builders/pairing.js +4 -5
- package/dist/esm/transport/node/builders/usync.js +41 -0
- package/dist/esm/transport/node/helpers.js +107 -5
- package/dist/esm/transport/node/usync.js +35 -0
- package/dist/esm/transport/noise/WaFrameCodec.js +48 -33
- package/dist/esm/transport/noise/WaNoiseCert.js +3 -6
- package/dist/esm/transport/noise/WaNoiseSession.js +17 -10
- package/dist/esm/transport/proxy.js +27 -0
- package/dist/esm/transport/stream/parse.js +13 -48
- package/dist/esm/util/bytes.js +50 -32
- package/dist/esm/util/coercion.js +6 -14
- package/dist/esm/util/primitives.js +39 -14
- package/dist/infra/log/ConsoleLogger.js +18 -17
- package/dist/infra/log/PinoLogger.js +15 -9
- package/dist/infra/log/types.js +12 -0
- package/dist/infra/perf/BoundedTaskQueue.js +13 -17
- package/dist/media/WaMediaCrypto.js +1 -3
- package/dist/media/WaMediaTransferClient.js +259 -58
- package/dist/media/conn.js +10 -6
- package/dist/media/constants.js +4 -1
- package/dist/message/WaMessageClient.js +5 -14
- package/dist/message/ack.js +6 -6
- package/dist/message/addon-crypto.js +65 -0
- package/dist/message/incoming.js +104 -109
- package/dist/message/index.js +2 -0
- package/dist/message/reporting-token.js +443 -0
- package/dist/message/use-case-secret.js +55 -0
- package/dist/protocol/appstate.js +59 -1
- package/dist/protocol/constants.js +7 -1
- package/dist/protocol/index.js +20 -42
- package/dist/protocol/jid.js +64 -51
- package/dist/protocol/media.js +3 -3
- package/dist/protocol/nodes.js +2 -0
- package/dist/protocol/usync.js +14 -0
- package/dist/retry/index.js +3 -1
- package/dist/retry/outbound.js +6 -7
- package/dist/retry/parse.js +57 -75
- package/dist/retry/replay.js +46 -47
- package/dist/retry/tracker.js +59 -0
- package/dist/signal/api/SignalDeviceSyncApi.js +247 -80
- package/dist/signal/api/SignalDigestSyncApi.js +6 -1
- package/dist/signal/api/SignalIdentitySyncApi.js +49 -34
- package/dist/signal/api/SignalMissingPreKeysSyncApi.js +67 -59
- package/dist/signal/api/SignalSessionSyncApi.js +23 -30
- package/dist/signal/crypto/WaAdvSignature.js +2 -4
- package/dist/signal/group/SenderKeyChain.js +27 -22
- package/dist/signal/group/SenderKeyCodec.js +1 -3
- package/dist/signal/group/SenderKeyManager.js +26 -16
- package/dist/signal/index.js +3 -1
- package/dist/signal/session/SignalProtocol.js +49 -14
- package/dist/signal/session/SignalRatchet.js +24 -15
- package/dist/signal/session/SignalSession.js +14 -9
- package/dist/signal/session/resolver.js +189 -0
- package/dist/signal/store/sqlite.js +16 -37
- package/dist/store/createStore.js +16 -18
- package/dist/store/noop.store.js +3 -6
- package/dist/store/providers/memory/appstate.store.js +28 -4
- package/dist/store/providers/memory/contact.store.js +5 -0
- package/dist/store/providers/memory/device-list.store.js +3 -30
- package/dist/store/providers/memory/message.store.js +11 -5
- package/dist/store/providers/memory/participants.store.js +1 -8
- package/dist/store/providers/memory/sender-key.store.js +8 -10
- package/dist/store/providers/memory/signal.store.js +21 -9
- package/dist/store/providers/memory/thread.store.js +5 -0
- package/dist/store/providers/sqlite/appstate.store.js +81 -0
- package/dist/store/providers/sqlite/connection.js +18 -13
- package/dist/store/providers/sqlite/contact.store.js +31 -18
- package/dist/store/providers/sqlite/device-list.store.js +7 -35
- package/dist/store/providers/sqlite/message.store.js +45 -32
- package/dist/store/providers/sqlite/migrations.js +1 -1
- package/dist/store/providers/sqlite/participants.store.js +1 -9
- package/dist/store/providers/sqlite/retry.store.js +8 -11
- package/dist/store/providers/sqlite/sender-key.store.js +24 -29
- package/dist/store/providers/sqlite/signal.store.js +105 -23
- package/dist/store/providers/sqlite/table-names.js +113 -0
- package/dist/store/providers/sqlite/thread.store.js +35 -22
- package/dist/transport/WaComms.js +27 -25
- package/dist/transport/WaWebSocket.js +148 -12
- package/dist/transport/binary/decoder.js +4 -4
- package/dist/transport/binary/encoder.js +12 -4
- package/dist/transport/index.js +7 -1
- package/dist/transport/keepalive/WaKeepAlive.js +1 -7
- package/dist/transport/node/WaNodeOrchestrator.js +2 -4
- package/dist/transport/node/WaNodeTransport.js +0 -3
- package/dist/transport/node/builders/{accountSync.js → account-sync.js} +15 -35
- package/dist/transport/node/builders/index.js +12 -9
- package/dist/transport/node/builders/message.js +9 -0
- package/dist/transport/node/builders/pairing.js +4 -5
- package/dist/transport/node/builders/usync.js +45 -0
- package/dist/transport/node/helpers.js +112 -4
- package/dist/transport/node/usync.js +38 -0
- package/dist/transport/noise/WaFrameCodec.js +47 -32
- package/dist/transport/noise/WaNoiseCert.js +5 -8
- package/dist/transport/noise/WaNoiseSession.js +17 -10
- package/dist/transport/proxy.js +34 -0
- package/dist/transport/stream/parse.js +17 -53
- package/dist/types/appstate/WaAppStateCrypto.d.ts +0 -1
- package/dist/types/appstate/WaAppStateSyncClient.d.ts +5 -2
- package/dist/types/appstate/constants.d.ts +1 -0
- package/dist/types/appstate/store/sqlite.d.ts +4 -18
- package/dist/types/appstate/utils.d.ts +0 -1
- package/dist/types/auth/WaAuthClient.d.ts +10 -12
- package/dist/types/auth/index.d.ts +0 -2
- package/dist/types/auth/pairing/WaQrFlow.d.ts +1 -1
- package/dist/types/auth/types.d.ts +6 -9
- package/dist/types/client/WaClient.d.ts +27 -25
- package/dist/types/client/WaClientFactory.d.ts +22 -23
- package/dist/types/client/connection/WaConnectionManager.d.ts +64 -0
- package/dist/types/client/connection/WaKeyShareCoordinator.d.ts +14 -0
- package/dist/types/client/connection/WaReceiptQueue.d.ts +13 -0
- package/dist/types/client/coordinators/WaAppStateMutationCoordinator.d.ts +46 -0
- package/dist/types/client/coordinators/WaIncomingNodeCoordinator.d.ts +0 -1
- package/dist/types/client/coordinators/WaMessageDispatchCoordinator.d.ts +18 -41
- package/dist/types/client/coordinators/WaRetryCoordinator.d.ts +2 -0
- package/dist/types/client/dirty.d.ts +1 -0
- package/dist/types/client/events/group.d.ts +2 -1
- package/dist/types/client/index.d.ts +1 -1
- package/dist/types/client/messaging/fanout.d.ts +14 -0
- package/dist/types/client/messaging/key-protocol.d.ts +18 -0
- package/dist/types/client/messaging/participants.d.ts +13 -0
- package/dist/types/client/types.d.ts +24 -1
- package/dist/types/crypto/core/hkdf.d.ts +0 -6
- package/dist/types/crypto/core/index.d.ts +0 -1
- package/dist/types/crypto/core/random.d.ts +1 -7
- package/dist/types/crypto/index.d.ts +0 -2
- package/dist/types/index.d.ts +1 -1
- package/dist/types/infra/log/ConsoleLogger.d.ts +2 -1
- package/dist/types/infra/log/PinoLogger.d.ts +1 -1
- package/dist/types/infra/log/types.d.ts +1 -0
- package/dist/types/infra/perf/BoundedTaskQueue.d.ts +1 -1
- package/dist/types/media/WaMediaTransferClient.d.ts +13 -3
- package/dist/types/media/types.d.ts +5 -0
- package/dist/types/message/addon-crypto.d.ts +25 -0
- package/dist/types/message/index.d.ts +2 -0
- package/dist/types/message/reporting-token.d.ts +19 -0
- package/dist/types/message/use-case-secret.d.ts +20 -0
- package/dist/types/protocol/appstate.d.ts +58 -0
- package/dist/types/protocol/constants.d.ts +2 -1
- package/dist/types/protocol/index.d.ts +2 -10
- package/dist/types/protocol/jid.d.ts +3 -3
- package/dist/types/protocol/nodes.d.ts +2 -0
- package/dist/types/protocol/usync.d.ts +11 -0
- package/dist/types/retry/index.d.ts +1 -0
- package/dist/types/retry/replay.d.ts +0 -4
- package/dist/types/retry/tracker.d.ts +19 -0
- package/dist/types/retry/types.d.ts +4 -3
- package/dist/types/signal/api/SignalDeviceSyncApi.d.ts +13 -1
- package/dist/types/signal/group/SenderKeyCodec.d.ts +4 -6
- package/dist/types/signal/index.d.ts +1 -0
- package/dist/types/signal/session/SignalProtocol.d.ts +9 -0
- package/dist/types/signal/session/resolver.d.ts +17 -0
- package/dist/types/store/contracts/appstate.store.d.ts +3 -0
- package/dist/types/store/contracts/contact.store.d.ts +1 -0
- package/dist/types/store/contracts/device-list.store.d.ts +0 -3
- package/dist/types/store/contracts/message.store.d.ts +1 -0
- package/dist/types/store/contracts/participants.store.d.ts +0 -1
- package/dist/types/store/contracts/sender-key.store.d.ts +0 -1
- package/dist/types/store/contracts/signal.store.d.ts +6 -0
- package/dist/types/store/contracts/thread.store.d.ts +1 -0
- package/dist/types/store/index.d.ts +1 -1
- package/dist/types/store/providers/memory/appstate.store.d.ts +2 -0
- package/dist/types/store/providers/memory/contact.store.d.ts +1 -0
- package/dist/types/store/providers/memory/device-list.store.d.ts +0 -3
- package/dist/types/store/providers/memory/message.store.d.ts +1 -0
- package/dist/types/store/providers/memory/participants.store.d.ts +0 -1
- package/dist/types/store/providers/memory/sender-key.store.d.ts +0 -1
- package/dist/types/store/providers/memory/signal.store.d.ts +6 -0
- package/dist/types/store/providers/memory/thread.store.d.ts +1 -0
- package/dist/types/store/providers/sqlite/appstate.store.d.ts +2 -0
- package/dist/types/store/providers/sqlite/contact.store.d.ts +2 -0
- package/dist/types/store/providers/sqlite/device-list.store.d.ts +0 -3
- package/dist/types/store/providers/sqlite/message.store.d.ts +2 -0
- package/dist/types/store/providers/sqlite/participants.store.d.ts +0 -1
- package/dist/types/store/providers/sqlite/retry.store.d.ts +0 -1
- package/dist/types/store/providers/sqlite/sender-key.store.d.ts +0 -1
- package/dist/types/store/providers/sqlite/signal.store.d.ts +7 -0
- package/dist/types/store/providers/sqlite/table-names.d.ts +5 -0
- package/dist/types/store/providers/sqlite/thread.store.d.ts +2 -0
- package/dist/types/store/types.d.ts +3 -0
- package/dist/types/transport/WaWebSocket.d.ts +3 -0
- package/dist/types/transport/index.d.ts +2 -1
- package/dist/types/transport/keepalive/WaKeepAlive.d.ts +0 -1
- package/dist/types/transport/node/WaNodeTransport.d.ts +0 -9
- package/dist/types/transport/node/builders/group.d.ts +4 -6
- package/dist/types/transport/node/builders/index.d.ts +2 -1
- package/dist/types/transport/node/builders/message.d.ts +14 -25
- package/dist/types/transport/node/builders/retry.d.ts +2 -4
- package/dist/types/transport/node/builders/usync.d.ts +21 -0
- package/dist/types/transport/node/helpers.d.ts +8 -0
- package/dist/types/transport/node/usync.d.ts +2 -0
- package/dist/types/transport/noise/WaFrameCodec.d.ts +3 -0
- package/dist/types/transport/noise/WaNoiseSession.d.ts +1 -0
- package/dist/types/transport/proxy.d.ts +6 -0
- package/dist/types/transport/stream/parse.d.ts +0 -1
- package/dist/types/transport/types.d.ts +18 -1
- package/dist/types/util/bytes.d.ts +5 -0
- package/dist/types/util/primitives.d.ts +3 -0
- package/dist/util/bytes.js +55 -33
- package/dist/util/coercion.js +6 -14
- package/dist/util/primitives.js +42 -14
- package/package.json +27 -9
- package/proto/index.d.ts +1090 -1048
- package/proto/index.js +1 -1
- package/scripts/check-node-version.cjs +0 -1
- package/dist/crypto/core/encoding.js +0 -29
- package/dist/esm/crypto/core/encoding.js +0 -25
- package/dist/esm/util/base64.js +0 -18
- package/dist/esm/util/signal-address.js +0 -5
- package/dist/types/crypto/core/encoding.d.ts +0 -11
- package/dist/types/util/base64.d.ts +0 -4
- package/dist/types/util/signal-address.d.ts +0 -2
- package/dist/util/base64.js +0 -24
- package/dist/util/signal-address.js +0 -8
- /package/dist/types/transport/node/builders/{accountSync.d.ts → account-sync.d.ts} +0 -0
|
@@ -4,21 +4,124 @@ exports.getNodeChildren = getNodeChildren;
|
|
|
4
4
|
exports.findNodeChild = findNodeChild;
|
|
5
5
|
exports.getFirstNodeChild = getFirstNodeChild;
|
|
6
6
|
exports.getNodeChildrenByTag = getNodeChildrenByTag;
|
|
7
|
+
exports.getNodeChildrenByTagFromChildren = getNodeChildrenByTagFromChildren;
|
|
8
|
+
exports.getNodeChildrenTags = getNodeChildrenTags;
|
|
9
|
+
exports.getNodeChildrenNonEmptyAttrValuesByTag = getNodeChildrenNonEmptyAttrValuesByTag;
|
|
10
|
+
exports.getNodeChildrenNonEmptyUtf8ByTag = getNodeChildrenNonEmptyUtf8ByTag;
|
|
11
|
+
exports.findNodeChildrenByTags = findNodeChildrenByTags;
|
|
7
12
|
exports.hasNodeChild = hasNodeChild;
|
|
8
13
|
exports.decodeNodeContentUtf8OrBytes = decodeNodeContentUtf8OrBytes;
|
|
9
14
|
exports.decodeNodeContentBase64OrBytes = decodeNodeContentBase64OrBytes;
|
|
15
|
+
exports.formatNodeIdPrefixFromSeed = formatNodeIdPrefixFromSeed;
|
|
10
16
|
const bytes_1 = require("../../util/bytes");
|
|
17
|
+
const EMPTY_NODE_CHILDREN = Object.freeze([]);
|
|
18
|
+
const EMPTY_NODE_TAGS = Object.freeze([]);
|
|
19
|
+
const EMPTY_NODE_VALUES = Object.freeze([]);
|
|
11
20
|
function getNodeChildren(node) {
|
|
12
|
-
return Array.isArray(node.content) ? node.content :
|
|
21
|
+
return Array.isArray(node.content) ? node.content : EMPTY_NODE_CHILDREN;
|
|
13
22
|
}
|
|
14
23
|
function findNodeChild(node, tag) {
|
|
15
|
-
|
|
24
|
+
const content = node.content;
|
|
25
|
+
if (!Array.isArray(content))
|
|
26
|
+
return undefined;
|
|
27
|
+
for (let i = 0; i < content.length; i++) {
|
|
28
|
+
if (content[i].tag === tag)
|
|
29
|
+
return content[i];
|
|
30
|
+
}
|
|
16
31
|
}
|
|
17
32
|
function getFirstNodeChild(node) {
|
|
18
33
|
return getNodeChildren(node)[0];
|
|
19
34
|
}
|
|
20
35
|
function getNodeChildrenByTag(node, tag) {
|
|
21
|
-
|
|
36
|
+
const content = node.content;
|
|
37
|
+
if (!Array.isArray(content))
|
|
38
|
+
return EMPTY_NODE_CHILDREN;
|
|
39
|
+
let tagged = null;
|
|
40
|
+
for (let i = 0; i < content.length; i++) {
|
|
41
|
+
if (content[i].tag !== tag)
|
|
42
|
+
continue;
|
|
43
|
+
if (!tagged)
|
|
44
|
+
tagged = [];
|
|
45
|
+
tagged.push(content[i]);
|
|
46
|
+
}
|
|
47
|
+
return tagged ?? EMPTY_NODE_CHILDREN;
|
|
48
|
+
}
|
|
49
|
+
function getNodeChildrenByTagFromChildren(node, tag) {
|
|
50
|
+
let tagged = null;
|
|
51
|
+
const content = node.content;
|
|
52
|
+
if (!Array.isArray(content))
|
|
53
|
+
return EMPTY_NODE_CHILDREN;
|
|
54
|
+
for (let i = 0; i < content.length; i += 1) {
|
|
55
|
+
const nested = content[i].content;
|
|
56
|
+
if (!Array.isArray(nested))
|
|
57
|
+
continue;
|
|
58
|
+
for (let j = 0; j < nested.length; j += 1) {
|
|
59
|
+
if (nested[j].tag !== tag)
|
|
60
|
+
continue;
|
|
61
|
+
if (!tagged)
|
|
62
|
+
tagged = [];
|
|
63
|
+
tagged.push(nested[j]);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return tagged ?? EMPTY_NODE_CHILDREN;
|
|
67
|
+
}
|
|
68
|
+
function getNodeChildrenTags(node) {
|
|
69
|
+
const content = node.content;
|
|
70
|
+
if (!Array.isArray(content) || content.length === 0)
|
|
71
|
+
return EMPTY_NODE_TAGS;
|
|
72
|
+
return content.map((c) => c.tag);
|
|
73
|
+
}
|
|
74
|
+
function getNodeChildrenNonEmptyAttrValuesByTag(node, tag, attr) {
|
|
75
|
+
let values = null;
|
|
76
|
+
const children = getNodeChildren(node);
|
|
77
|
+
for (let index = 0; index < children.length; index += 1) {
|
|
78
|
+
const child = children[index];
|
|
79
|
+
if (child.tag !== tag) {
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
const value = child.attrs[attr];
|
|
83
|
+
if (!value) {
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
if (!values) {
|
|
87
|
+
values = [];
|
|
88
|
+
}
|
|
89
|
+
values.push(value);
|
|
90
|
+
}
|
|
91
|
+
return values ?? EMPTY_NODE_VALUES;
|
|
92
|
+
}
|
|
93
|
+
function getNodeChildrenNonEmptyUtf8ByTag(node, tag, field) {
|
|
94
|
+
let values = null;
|
|
95
|
+
const children = getNodeChildren(node);
|
|
96
|
+
for (let index = 0; index < children.length; index += 1) {
|
|
97
|
+
const child = children[index];
|
|
98
|
+
if (child.tag !== tag) {
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
const raw = child.content;
|
|
102
|
+
if (raw === null || raw === undefined) {
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
if (raw instanceof Uint8Array && raw.length === 0) {
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
const value = bytes_1.TEXT_DECODER.decode(decodeNodeContentUtf8OrBytes(raw, field));
|
|
109
|
+
if (value.length === 0) {
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
if (!values) {
|
|
113
|
+
values = [];
|
|
114
|
+
}
|
|
115
|
+
values.push(value);
|
|
116
|
+
}
|
|
117
|
+
return values ?? EMPTY_NODE_VALUES;
|
|
118
|
+
}
|
|
119
|
+
function findNodeChildrenByTags(node, tags) {
|
|
120
|
+
const out = new Array(tags.length);
|
|
121
|
+
for (let index = 0; index < tags.length; index += 1) {
|
|
122
|
+
out[index] = findNodeChild(node, tags[index]);
|
|
123
|
+
}
|
|
124
|
+
return out;
|
|
22
125
|
}
|
|
23
126
|
function hasNodeChild(node, tag) {
|
|
24
127
|
return findNodeChild(node, tag) !== undefined;
|
|
@@ -37,10 +140,15 @@ function decodeNodeContentBase64OrBytes(value, field) {
|
|
|
37
140
|
throw new Error(`missing binary node content for ${field}`);
|
|
38
141
|
}
|
|
39
142
|
if (typeof value === 'string') {
|
|
40
|
-
return (0, bytes_1.
|
|
143
|
+
return (0, bytes_1.base64ToBytesChecked)(value, field);
|
|
41
144
|
}
|
|
42
145
|
if (value instanceof Uint8Array) {
|
|
43
146
|
return value;
|
|
44
147
|
}
|
|
45
148
|
throw new Error(`missing binary node content for ${field}`);
|
|
46
149
|
}
|
|
150
|
+
function formatNodeIdPrefixFromSeed(seed) {
|
|
151
|
+
const left = ((seed[0] << 8) | seed[1]) >>> 0;
|
|
152
|
+
const right = ((seed[2] << 8) | seed[3]) >>> 0;
|
|
153
|
+
return `${left}.${right}-`;
|
|
154
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createUsyncSidGenerator = createUsyncSidGenerator;
|
|
4
|
+
const _crypto_1 = require("../../crypto/index.js");
|
|
5
|
+
const helpers_1 = require("./helpers");
|
|
6
|
+
function createUsyncSidGenerator() {
|
|
7
|
+
const state = {
|
|
8
|
+
prefix: null,
|
|
9
|
+
prefixPromise: null,
|
|
10
|
+
counter: 1
|
|
11
|
+
};
|
|
12
|
+
return async () => {
|
|
13
|
+
const prefix = await getUsyncPrefix(state);
|
|
14
|
+
const sid = `${prefix}${state.counter}`;
|
|
15
|
+
state.counter += 1;
|
|
16
|
+
return sid;
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
async function getUsyncPrefix(state) {
|
|
20
|
+
if (state.prefix) {
|
|
21
|
+
return state.prefix;
|
|
22
|
+
}
|
|
23
|
+
if (!state.prefixPromise) {
|
|
24
|
+
state.prefixPromise = buildUsyncPrefix()
|
|
25
|
+
.then((prefix) => {
|
|
26
|
+
state.prefix = prefix;
|
|
27
|
+
return prefix;
|
|
28
|
+
})
|
|
29
|
+
.finally(() => {
|
|
30
|
+
state.prefixPromise = null;
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
return state.prefixPromise;
|
|
34
|
+
}
|
|
35
|
+
async function buildUsyncPrefix() {
|
|
36
|
+
const seed = await (0, _crypto_1.randomBytesAsync)(4);
|
|
37
|
+
return (0, helpers_1.formatNodeIdPrefixFromSeed)(seed);
|
|
38
|
+
}
|
|
@@ -18,6 +18,31 @@ class WaFrameCodec {
|
|
|
18
18
|
this.maxFrameLength = maxFrameLength;
|
|
19
19
|
this.introSent = false;
|
|
20
20
|
this.buffered = bytes_1.EMPTY_BYTES;
|
|
21
|
+
this.bufferedLength = 0;
|
|
22
|
+
}
|
|
23
|
+
assertFrameLength(length) {
|
|
24
|
+
if (length <= this.maxFrameLength) {
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
throw new Error(`incoming frame is too large: ${length} bytes (max allowed: ${this.maxFrameLength})`);
|
|
28
|
+
}
|
|
29
|
+
appendBuffered(chunk) {
|
|
30
|
+
if (chunk.length === 0) {
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
if (this.bufferedLength === 0) {
|
|
34
|
+
this.buffered = chunk;
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
const nextLength = this.bufferedLength + chunk.length;
|
|
38
|
+
if (this.buffered.length < nextLength) {
|
|
39
|
+
const nextBuffered = new Uint8Array(Math.max(nextLength, this.bufferedLength * 2));
|
|
40
|
+
nextBuffered.set(this.buffered.subarray(0, this.bufferedLength));
|
|
41
|
+
this.buffered = nextBuffered;
|
|
42
|
+
}
|
|
43
|
+
this.buffered.set(chunk, this.bufferedLength);
|
|
44
|
+
}
|
|
45
|
+
this.bufferedLength += chunk.length;
|
|
21
46
|
}
|
|
22
47
|
encodeFrame(frame) {
|
|
23
48
|
if (frame.length > this.maxFrameLength) {
|
|
@@ -48,67 +73,56 @@ class WaFrameCodec {
|
|
|
48
73
|
}
|
|
49
74
|
const frames = [];
|
|
50
75
|
let chunkOffset = 0;
|
|
51
|
-
if (this.
|
|
52
|
-
if (this.
|
|
53
|
-
const missingHeaderBytes = 3 - this.
|
|
76
|
+
if (this.bufferedLength > 0) {
|
|
77
|
+
if (this.bufferedLength < 3) {
|
|
78
|
+
const missingHeaderBytes = 3 - this.bufferedLength;
|
|
54
79
|
if (chunk.length < missingHeaderBytes) {
|
|
55
|
-
this.
|
|
80
|
+
this.appendBuffered(chunk);
|
|
56
81
|
return frames;
|
|
57
82
|
}
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
const length = frameLength(header);
|
|
62
|
-
if (length > this.maxFrameLength) {
|
|
63
|
-
throw new Error(`incoming frame is too large: ${length} bytes (max allowed: ${this.maxFrameLength})`);
|
|
64
|
-
}
|
|
83
|
+
this.appendBuffered(chunk.subarray(0, missingHeaderBytes));
|
|
84
|
+
const length = frameLength(this.buffered);
|
|
85
|
+
this.assertFrameLength(length);
|
|
65
86
|
const remainingAfterHeader = chunk.length - missingHeaderBytes;
|
|
66
87
|
if (remainingAfterHeader < length) {
|
|
67
|
-
|
|
68
|
-
nextBuffered.set(header, 0);
|
|
69
|
-
nextBuffered.set(chunk.subarray(missingHeaderBytes), 3);
|
|
70
|
-
this.buffered = nextBuffered;
|
|
88
|
+
this.appendBuffered(chunk.subarray(missingHeaderBytes));
|
|
71
89
|
return frames;
|
|
72
90
|
}
|
|
73
91
|
frames.push(chunk.subarray(missingHeaderBytes, missingHeaderBytes + length));
|
|
74
92
|
chunkOffset = missingHeaderBytes + length;
|
|
75
|
-
this.buffered = bytes_1.EMPTY_BYTES;
|
|
76
93
|
}
|
|
77
94
|
else {
|
|
78
|
-
const
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
throw new Error(`incoming frame is too large: ${length} bytes (max allowed: ${this.maxFrameLength})`);
|
|
82
|
-
}
|
|
83
|
-
const bufferedPayloadLength = this.buffered.length - 3;
|
|
95
|
+
const length = frameLength(this.buffered);
|
|
96
|
+
this.assertFrameLength(length);
|
|
97
|
+
const bufferedPayloadLength = this.bufferedLength - 3;
|
|
84
98
|
const missingPayloadBytes = length - bufferedPayloadLength;
|
|
85
99
|
if (missingPayloadBytes > chunk.length) {
|
|
86
|
-
this.
|
|
100
|
+
this.appendBuffered(chunk);
|
|
87
101
|
return frames;
|
|
88
102
|
}
|
|
89
|
-
if (
|
|
103
|
+
if (missingPayloadBytes === 0) {
|
|
104
|
+
frames.push(this.buffered.subarray(3, 3 + length));
|
|
105
|
+
}
|
|
106
|
+
else if (bufferedPayloadLength === 0) {
|
|
90
107
|
frames.push(chunk.subarray(0, missingPayloadBytes));
|
|
91
108
|
}
|
|
92
109
|
else {
|
|
93
110
|
const frame = new Uint8Array(length);
|
|
94
|
-
frame.set(this.buffered.subarray(3
|
|
95
|
-
|
|
96
|
-
frame.set(chunk.subarray(0, missingPayloadBytes), bufferedPayloadLength);
|
|
97
|
-
}
|
|
111
|
+
frame.set(this.buffered.subarray(3, this.bufferedLength));
|
|
112
|
+
frame.set(chunk.subarray(0, missingPayloadBytes), bufferedPayloadLength);
|
|
98
113
|
frames.push(frame);
|
|
99
114
|
}
|
|
100
115
|
chunkOffset = missingPayloadBytes;
|
|
101
|
-
this.buffered = bytes_1.EMPTY_BYTES;
|
|
102
116
|
}
|
|
117
|
+
this.buffered = bytes_1.EMPTY_BYTES;
|
|
118
|
+
this.bufferedLength = 0;
|
|
103
119
|
}
|
|
104
120
|
const remainingChunk = chunk.subarray(chunkOffset);
|
|
105
121
|
let offset = 0;
|
|
106
122
|
while (remainingChunk.length - offset >= 3) {
|
|
107
123
|
const header = remainingChunk.subarray(offset, offset + 3);
|
|
108
124
|
const length = frameLength(header);
|
|
109
|
-
|
|
110
|
-
throw new Error(`incoming frame is too large: ${length} bytes (max allowed: ${this.maxFrameLength})`);
|
|
111
|
-
}
|
|
125
|
+
this.assertFrameLength(length);
|
|
112
126
|
if (remainingChunk.length - offset - 3 < length) {
|
|
113
127
|
break;
|
|
114
128
|
}
|
|
@@ -119,6 +133,7 @@ class WaFrameCodec {
|
|
|
119
133
|
}
|
|
120
134
|
this.buffered =
|
|
121
135
|
offset >= remainingChunk.length ? bytes_1.EMPTY_BYTES : remainingChunk.subarray(offset);
|
|
136
|
+
this.bufferedLength = this.buffered.length;
|
|
122
137
|
return frames;
|
|
123
138
|
}
|
|
124
139
|
}
|
|
@@ -5,12 +5,11 @@ const _crypto_1 = require("../../crypto/index.js");
|
|
|
5
5
|
const X25519_1 = require("../../crypto/curves/X25519");
|
|
6
6
|
const _proto_1 = require("../../proto.js");
|
|
7
7
|
const constants_1 = require("../noise/constants");
|
|
8
|
-
const base64_1 = require("../../util/base64");
|
|
9
8
|
const bytes_1 = require("../../util/bytes");
|
|
10
9
|
const primitives_1 = require("../../util/primitives");
|
|
11
10
|
async function verifySignalVariant(serializedPublicKey, message, signatureInput) {
|
|
12
11
|
const publicKey = (0, _crypto_1.toSerializedPubKey)(serializedPublicKey);
|
|
13
|
-
if (signatureInput
|
|
12
|
+
if (!(0, bytes_1.assertByteLength)(signatureInput, 64, 'invalid certificate signature size', false)) {
|
|
14
13
|
return false;
|
|
15
14
|
}
|
|
16
15
|
const signature = new Uint8Array(signatureInput);
|
|
@@ -27,15 +26,13 @@ function parseNoiseCertificate(certificate) {
|
|
|
27
26
|
if (!certificate) {
|
|
28
27
|
throw new Error('missing noise certificate');
|
|
29
28
|
}
|
|
30
|
-
const detailsBytes = (0,
|
|
31
|
-
const signatureBytes = (0,
|
|
32
|
-
|
|
33
|
-
throw new Error('invalid certificate signature size');
|
|
34
|
-
}
|
|
29
|
+
const detailsBytes = (0, bytes_1.decodeProtoBytes)(certificate.details, 'certificate.details');
|
|
30
|
+
const signatureBytes = (0, bytes_1.decodeProtoBytes)(certificate.signature, 'certificate.signature');
|
|
31
|
+
(0, bytes_1.assertByteLength)(signatureBytes, 64, 'invalid certificate signature size');
|
|
35
32
|
const details = _proto_1.proto.CertChain.NoiseCertificate.Details.decode(detailsBytes);
|
|
36
33
|
const serial = (0, primitives_1.toSafeNumber)(details.serial, 'certificate.serial');
|
|
37
34
|
const issuerSerial = (0, primitives_1.toSafeNumber)(details.issuerSerial, 'certificate.issuerSerial');
|
|
38
|
-
const key = (0,
|
|
35
|
+
const key = (0, bytes_1.decodeProtoBytes)(details.key, 'certificate.key');
|
|
39
36
|
return {
|
|
40
37
|
serial,
|
|
41
38
|
issuerSerial,
|
|
@@ -51,12 +51,9 @@ function buildRoutingInfoPrefix(routingInfo) {
|
|
|
51
51
|
}
|
|
52
52
|
class WaNoiseSession {
|
|
53
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
54
|
this.frameCodec = null;
|
|
59
55
|
this.handshakeInbox = [];
|
|
56
|
+
this.handshakeInboxHead = 0;
|
|
60
57
|
this.handshakeWaiter = null;
|
|
61
58
|
this.handshakeRejecter = null;
|
|
62
59
|
this.pendingDecryptedFrames = [];
|
|
@@ -64,6 +61,10 @@ class WaNoiseSession {
|
|
|
64
61
|
this.noiseSocket = null;
|
|
65
62
|
this.serverStaticKey = null;
|
|
66
63
|
this.handshakeFrameTimeoutMs = constants_1.WA_DEFAULTS.CONNECT_TIMEOUT_MS;
|
|
64
|
+
this.sendWire = sendWire;
|
|
65
|
+
this.logger = logger;
|
|
66
|
+
this.writeQueue = new BoundedTaskQueue_1.BoundedTaskQueue(4096, 1);
|
|
67
|
+
this.readQueue = new BoundedTaskQueue_1.BoundedTaskQueue(4096, 1);
|
|
67
68
|
}
|
|
68
69
|
async start(config) {
|
|
69
70
|
this.reset();
|
|
@@ -147,7 +148,7 @@ class WaNoiseSession {
|
|
|
147
148
|
reset() {
|
|
148
149
|
this.logger.trace('noise session reset');
|
|
149
150
|
this.frameCodec = null;
|
|
150
|
-
this.handshakeInbox =
|
|
151
|
+
this.handshakeInbox.length = this.handshakeInboxHead = 0;
|
|
151
152
|
this.handshakeWaiter = null;
|
|
152
153
|
this.handshakeRejecter = null;
|
|
153
154
|
this.pendingDecryptedFrames = [];
|
|
@@ -278,8 +279,13 @@ class WaNoiseSession {
|
|
|
278
279
|
if (this.closedError) {
|
|
279
280
|
throw this.closedError;
|
|
280
281
|
}
|
|
281
|
-
const queued = this.handshakeInbox.
|
|
282
|
+
const queued = this.handshakeInboxHead < this.handshakeInbox.length
|
|
283
|
+
? this.handshakeInbox[this.handshakeInboxHead++]
|
|
284
|
+
: undefined;
|
|
282
285
|
if (queued) {
|
|
286
|
+
if (this.handshakeInboxHead === this.handshakeInbox.length) {
|
|
287
|
+
this.handshakeInbox.length = this.handshakeInboxHead = 0;
|
|
288
|
+
}
|
|
283
289
|
this.logger.trace('noise handshake frame consumed from queue');
|
|
284
290
|
return queued;
|
|
285
291
|
}
|
|
@@ -310,17 +316,18 @@ class WaNoiseSession {
|
|
|
310
316
|
});
|
|
311
317
|
}
|
|
312
318
|
async decodeBufferedPostHandshakeFrames() {
|
|
313
|
-
if (!this.noiseSocket || this.handshakeInbox.length
|
|
319
|
+
if (!this.noiseSocket || this.handshakeInboxHead >= this.handshakeInbox.length) {
|
|
314
320
|
return;
|
|
315
321
|
}
|
|
316
322
|
this.logger.debug('decoding buffered post-handshake frames', {
|
|
317
|
-
count: this.handshakeInbox.length
|
|
323
|
+
count: this.handshakeInbox.length - this.handshakeInboxHead
|
|
318
324
|
});
|
|
319
|
-
|
|
320
|
-
|
|
325
|
+
for (let index = this.handshakeInboxHead; index < this.handshakeInbox.length; index += 1) {
|
|
326
|
+
const frame = this.handshakeInbox[index];
|
|
321
327
|
const decrypted = await this.readQueue.enqueue(() => this.noiseSocket.decrypt(frame));
|
|
322
328
|
this.pendingDecryptedFrames.push(decrypted);
|
|
323
329
|
}
|
|
330
|
+
this.handshakeInbox.length = this.handshakeInboxHead = 0;
|
|
324
331
|
}
|
|
325
332
|
}
|
|
326
333
|
exports.WaNoiseSession = WaNoiseSession;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isProxyDispatcher = isProxyDispatcher;
|
|
4
|
+
exports.isProxyAgent = isProxyAgent;
|
|
5
|
+
exports.isProxyTransport = isProxyTransport;
|
|
6
|
+
exports.toProxyDispatcher = toProxyDispatcher;
|
|
7
|
+
exports.toProxyAgent = toProxyAgent;
|
|
8
|
+
function isProxyDispatcher(value) {
|
|
9
|
+
return (typeof value === 'object' &&
|
|
10
|
+
value !== null &&
|
|
11
|
+
'dispatch' in value &&
|
|
12
|
+
typeof value.dispatch === 'function');
|
|
13
|
+
}
|
|
14
|
+
function isProxyAgent(value) {
|
|
15
|
+
return (typeof value === 'object' &&
|
|
16
|
+
value !== null &&
|
|
17
|
+
'addRequest' in value &&
|
|
18
|
+
typeof value.addRequest === 'function');
|
|
19
|
+
}
|
|
20
|
+
function isProxyTransport(value) {
|
|
21
|
+
return isProxyDispatcher(value) || isProxyAgent(value);
|
|
22
|
+
}
|
|
23
|
+
function toProxyDispatcher(proxy) {
|
|
24
|
+
if (!proxy || !isProxyDispatcher(proxy)) {
|
|
25
|
+
return undefined;
|
|
26
|
+
}
|
|
27
|
+
return proxy;
|
|
28
|
+
}
|
|
29
|
+
function toProxyAgent(proxy) {
|
|
30
|
+
if (!proxy || !isProxyAgent(proxy)) {
|
|
31
|
+
return undefined;
|
|
32
|
+
}
|
|
33
|
+
return proxy;
|
|
34
|
+
}
|
|
@@ -1,80 +1,44 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.parseStreamControlNode = parseStreamControlNode;
|
|
4
|
-
exports.parseOptionalInt = parseOptionalInt;
|
|
5
4
|
exports.parseCompanionEncStatic = parseCompanionEncStatic;
|
|
6
5
|
exports.parseSuccessPersistAttributes = parseSuccessPersistAttributes;
|
|
7
6
|
const constants_1 = require("../../protocol/constants");
|
|
8
7
|
const helpers_1 = require("../node/helpers");
|
|
9
|
-
const
|
|
10
|
-
|
|
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
|
-
}
|
|
8
|
+
const bytes_1 = require("../../util/bytes");
|
|
9
|
+
const primitives_1 = require("../../util/primitives");
|
|
20
10
|
function parseStreamControlNode(node) {
|
|
21
11
|
if (node.tag === constants_1.WA_STREAM_SIGNALING.XML_STREAM_END_TAG) {
|
|
22
|
-
return {
|
|
23
|
-
kind: 'xmlstreamend'
|
|
24
|
-
};
|
|
12
|
+
return { kind: 'xmlstreamend' };
|
|
25
13
|
}
|
|
26
14
|
if (node.tag !== constants_1.WA_STREAM_SIGNALING.STREAM_ERROR_TAG) {
|
|
27
15
|
return null;
|
|
28
16
|
}
|
|
29
17
|
const conflictNode = (0, helpers_1.findNodeChild)(node, constants_1.WA_STREAM_SIGNALING.CONFLICT_TAG);
|
|
30
18
|
if (conflictNode) {
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
};
|
|
35
|
-
}
|
|
36
|
-
return {
|
|
37
|
-
kind: 'stream_error_device_removed'
|
|
38
|
-
};
|
|
19
|
+
return conflictNode.attrs.type === constants_1.WA_STREAM_SIGNALING.REPLACED_TYPE
|
|
20
|
+
? { kind: 'stream_error_replaced' }
|
|
21
|
+
: { kind: 'stream_error_device_removed' };
|
|
39
22
|
}
|
|
40
|
-
const
|
|
41
|
-
if (
|
|
42
|
-
|
|
43
|
-
if (code !== undefined) {
|
|
44
|
-
return {
|
|
45
|
-
kind: 'stream_error_code',
|
|
46
|
-
code
|
|
47
|
-
};
|
|
48
|
-
}
|
|
23
|
+
const code = node.attrs.code ? (0, primitives_1.parseStrictUnsignedInt)(node.attrs.code) : undefined;
|
|
24
|
+
if (code !== undefined) {
|
|
25
|
+
return { kind: 'stream_error_code', code };
|
|
49
26
|
}
|
|
50
27
|
const ackNode = (0, helpers_1.findNodeChild)(node, constants_1.WA_STREAM_SIGNALING.ACK_TAG);
|
|
51
28
|
if (ackNode) {
|
|
52
|
-
return {
|
|
53
|
-
kind: 'stream_error_ack',
|
|
54
|
-
id: ackNode.attrs.id
|
|
55
|
-
};
|
|
29
|
+
return { kind: 'stream_error_ack', id: ackNode.attrs.id };
|
|
56
30
|
}
|
|
57
31
|
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;
|
|
32
|
+
return { kind: 'stream_error_xml_not_well_formed' };
|
|
69
33
|
}
|
|
70
|
-
return
|
|
34
|
+
return { kind: 'stream_error_other' };
|
|
71
35
|
}
|
|
72
36
|
function parseCompanionEncStatic(value, onError) {
|
|
73
37
|
if (!value) {
|
|
74
38
|
return undefined;
|
|
75
39
|
}
|
|
76
40
|
try {
|
|
77
|
-
return (0,
|
|
41
|
+
return (0, bytes_1.base64ToBytesChecked)(value, 'success.companion_enc_static');
|
|
78
42
|
}
|
|
79
43
|
catch (error) {
|
|
80
44
|
if (error instanceof Error) {
|
|
@@ -88,10 +52,10 @@ function parseSuccessPersistAttributes(node, onCompanionParseError) {
|
|
|
88
52
|
meLid: node.attrs.lid,
|
|
89
53
|
meDisplayName: node.attrs.display_name,
|
|
90
54
|
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),
|
|
55
|
+
lastSuccessTs: (0, primitives_1.parseOptionalInt)(node.attrs.t),
|
|
56
|
+
propsVersion: (0, primitives_1.parseOptionalInt)(node.attrs.props),
|
|
57
|
+
abPropsVersion: (0, primitives_1.parseOptionalInt)(node.attrs.abprops),
|
|
94
58
|
connectionLocation: node.attrs.location,
|
|
95
|
-
accountCreationTs: parseOptionalInt(node.attrs.creation)
|
|
59
|
+
accountCreationTs: (0, primitives_1.parseOptionalInt)(node.attrs.creation)
|
|
96
60
|
};
|
|
97
61
|
}
|
|
@@ -7,6 +7,7 @@ interface WaAppStateSyncClientOptions {
|
|
|
7
7
|
readonly logger: Logger;
|
|
8
8
|
readonly query: (node: BinaryNode, timeoutMs: number) => Promise<BinaryNode>;
|
|
9
9
|
readonly store: WaAppStateStore;
|
|
10
|
+
readonly getCurrentMeJid?: () => string | null | undefined;
|
|
10
11
|
readonly hostDomain?: string;
|
|
11
12
|
readonly defaultTimeoutMs?: number;
|
|
12
13
|
readonly onMissingKeys?: (event: WaAppStateMissingKeysEvent) => Promise<void>;
|
|
@@ -20,6 +21,7 @@ export declare class WaAppStateSyncClient {
|
|
|
20
21
|
private readonly logger;
|
|
21
22
|
private readonly query;
|
|
22
23
|
private readonly store;
|
|
24
|
+
private readonly getCurrentMeJid?;
|
|
23
25
|
private readonly hostDomain;
|
|
24
26
|
private readonly defaultTimeoutMs;
|
|
25
27
|
private readonly onMissingKeys?;
|
|
@@ -33,13 +35,11 @@ export declare class WaAppStateSyncClient {
|
|
|
33
35
|
sync(options?: WaAppStateSyncOptions): Promise<WaAppStateSyncResult>;
|
|
34
36
|
private syncOnce;
|
|
35
37
|
private syncCollectionsRound;
|
|
36
|
-
private prepareSyncRoundRequest;
|
|
37
38
|
private buildCollectionSyncRequest;
|
|
38
39
|
private buildSyncIqNode;
|
|
39
40
|
private fetchSyncPayloadByCollection;
|
|
40
41
|
private processCollectionRound;
|
|
41
42
|
private createCollectionOutcome;
|
|
42
|
-
private collectDistinctMissingKeyIds;
|
|
43
43
|
private notifyMissingKeys;
|
|
44
44
|
private resolveReadyPatches;
|
|
45
45
|
private validateSnapshot;
|
|
@@ -51,9 +51,12 @@ export declare class WaAppStateSyncClient {
|
|
|
51
51
|
private decryptPatchMutations;
|
|
52
52
|
private assertPatchMacsMatch;
|
|
53
53
|
private buildOutgoingPatch;
|
|
54
|
+
private resolveDeviceIndex;
|
|
55
|
+
private buildPatchClientDebugData;
|
|
54
56
|
private computeNextCollectionState;
|
|
55
57
|
private normalizeProtoLong;
|
|
56
58
|
private groupPendingMutations;
|
|
59
|
+
private preloadKeyData;
|
|
57
60
|
private getKeyData;
|
|
58
61
|
private getCollectionState;
|
|
59
62
|
private setCollectionState;
|
|
@@ -11,4 +11,5 @@ export declare const APP_STATE_IV_LENGTH = 16;
|
|
|
11
11
|
export declare const APP_STATE_LT_HASH_SIZE = 128;
|
|
12
12
|
export declare const APP_STATE_POINT_SIZE = 2;
|
|
13
13
|
export declare const APP_STATE_EMPTY_LT_HASH: Uint8Array<ArrayBuffer>;
|
|
14
|
+
export declare const APP_STATE_DEFAULT_COLLECTION_VERSION = 0;
|
|
14
15
|
export declare const APP_STATE_DEFAULT_COLLECTIONS: readonly AppStateCollectionName[];
|
|
@@ -1,21 +1,7 @@
|
|
|
1
1
|
import type { WaAppStateStoreData, WaAppStateSyncKey } from '../types';
|
|
2
|
-
|
|
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
|
-
}
|
|
2
|
+
type SqliteRow = Readonly<Record<string, unknown>>;
|
|
18
3
|
export declare function encodeAppStateFingerprint(fingerprint: WaAppStateSyncKey['fingerprint']): Uint8Array | null;
|
|
19
4
|
export declare function decodeAppStateFingerprint(raw: unknown): WaAppStateSyncKey['fingerprint'] | undefined;
|
|
20
|
-
export declare function decodeAppStateSyncKeys(rows: readonly
|
|
21
|
-
export declare function decodeAppStateCollections(versionRows: readonly
|
|
5
|
+
export declare function decodeAppStateSyncKeys(rows: readonly SqliteRow[]): readonly WaAppStateSyncKey[];
|
|
6
|
+
export declare function decodeAppStateCollections(versionRows: readonly SqliteRow[], valueRows: readonly SqliteRow[]): WaAppStateStoreData['collections'];
|
|
7
|
+
export {};
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import type { AppStateCollectionName, WaAppStateSyncKey } from './types';
|
|
2
2
|
import type { WaMediaTransferClient } from '../media/WaMediaTransferClient';
|
|
3
3
|
import type { Proto } from '..';
|
|
4
|
-
export declare function keyIdToHex(keyId: Uint8Array): string;
|
|
5
4
|
export declare function parseCollectionName(value: string | undefined): AppStateCollectionName | null;
|
|
6
5
|
export declare function keyDeviceId(keyId: Uint8Array): number | null;
|
|
7
6
|
export declare function keyEpoch(keyId: Uint8Array): number;
|