zapo-js 0.1.2 → 0.2.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 +12 -4
- package/dist/appstate/WaAppStateCrypto.js +1 -1
- package/dist/appstate/WaAppStateSyncClient.js +138 -93
- package/dist/appstate/{store/sqlite.js → encoding.js} +13 -8
- package/dist/appstate/index.js +8 -6
- package/dist/appstate/utils.js +0 -5
- package/dist/auth/WaAuthClient.js +36 -47
- package/dist/auth/flow/WaAuthCredentialsFlow.js +7 -7
- package/dist/auth/index.js +1 -6
- package/dist/auth/pairing/WaPairingCodeCrypto.js +6 -4
- package/dist/auth/pairing/WaPairingFlow.js +13 -3
- package/dist/client/WaClient.js +225 -101
- package/dist/client/WaClientFactory.js +294 -44
- package/dist/client/connection/WaConnectionManager.js +19 -10
- package/dist/client/coordinators/WaBusinessCoordinator.js +241 -0
- package/dist/client/coordinators/WaGroupCoordinator.js +11 -7
- package/dist/client/coordinators/WaIncomingNodeCoordinator.js +1 -0
- package/dist/client/coordinators/WaMessageDispatchCoordinator.js +292 -99
- package/dist/client/coordinators/WaPassiveTasksCoordinator.js +74 -31
- package/dist/client/coordinators/WaPrivacyCoordinator.js +134 -0
- package/dist/client/coordinators/WaProfileCoordinator.js +212 -0
- package/dist/client/coordinators/WaRetryCoordinator.js +179 -27
- package/dist/client/coordinators/WaStreamControlCoordinator.js +18 -11
- package/dist/client/coordinators/WaTrustedContactTokenCoordinator.js +166 -0
- package/dist/client/dirty.js +40 -20
- package/dist/client/events/devices.js +72 -0
- package/dist/client/events/group.js +3 -11
- package/dist/client/events/identity.js +22 -0
- package/dist/client/events/privacy-token.js +39 -0
- package/dist/client/history-sync.js +50 -9
- package/dist/client/incoming.js +37 -7
- package/dist/client/mailbox.js +24 -23
- package/dist/client/messages.js +107 -31
- package/dist/client/messaging/fanout.js +21 -11
- package/dist/client/messaging/participants.js +6 -4
- package/dist/client/persistence/WriteBehindPersistence.js +129 -0
- package/dist/client/tokens/cs-token.js +50 -0
- package/dist/client/tokens/tc-token.js +25 -0
- package/dist/crypto/core/index.js +2 -2
- package/dist/crypto/core/keys.js +4 -4
- package/dist/crypto/core/nonce.js +2 -0
- package/dist/crypto/core/primitives.js +0 -8
- package/dist/crypto/core/random.js +22 -0
- package/dist/crypto/curves/X25519.js +25 -6
- package/dist/crypto/index.js +3 -0
- package/dist/crypto/math/constants.js +13 -36
- package/dist/crypto/math/edwards.js +171 -44
- package/dist/crypto/math/fe.js +706 -0
- package/dist/crypto/math/mod.js +10 -3
- package/dist/esm/appstate/WaAppStateCrypto.js +1 -1
- package/dist/esm/appstate/WaAppStateSyncClient.js +138 -93
- package/dist/esm/appstate/{store/sqlite.js → encoding.js} +13 -8
- package/dist/esm/appstate/index.js +2 -2
- package/dist/esm/appstate/utils.js +2 -5
- package/dist/esm/auth/WaAuthClient.js +36 -47
- package/dist/esm/auth/flow/WaAuthCredentialsFlow.js +7 -7
- package/dist/esm/auth/index.js +0 -2
- package/dist/esm/auth/pairing/WaPairingCodeCrypto.js +6 -4
- package/dist/esm/auth/pairing/WaPairingFlow.js +14 -4
- package/dist/esm/client/WaClient.js +225 -101
- package/dist/esm/client/WaClientFactory.js +295 -45
- package/dist/esm/client/connection/WaConnectionManager.js +19 -10
- package/dist/esm/client/coordinators/WaBusinessCoordinator.js +238 -0
- package/dist/esm/client/coordinators/WaGroupCoordinator.js +11 -7
- package/dist/esm/client/coordinators/WaIncomingNodeCoordinator.js +1 -0
- package/dist/esm/client/coordinators/WaMessageDispatchCoordinator.js +295 -102
- package/dist/esm/client/coordinators/WaPassiveTasksCoordinator.js +74 -31
- package/dist/esm/client/coordinators/WaPrivacyCoordinator.js +131 -0
- package/dist/esm/client/coordinators/WaProfileCoordinator.js +209 -0
- package/dist/esm/client/coordinators/WaRetryCoordinator.js +181 -29
- package/dist/esm/client/coordinators/WaStreamControlCoordinator.js +19 -12
- package/dist/esm/client/coordinators/WaTrustedContactTokenCoordinator.js +162 -0
- package/dist/esm/client/dirty.js +40 -20
- package/dist/esm/client/events/devices.js +68 -0
- package/dist/esm/client/events/group.js +3 -11
- package/dist/esm/client/events/identity.js +19 -0
- package/dist/esm/client/events/privacy-token.js +36 -0
- package/dist/esm/client/history-sync.js +50 -9
- package/dist/esm/client/incoming.js +38 -8
- package/dist/esm/client/mailbox.js +24 -23
- package/dist/esm/client/messages.js +108 -32
- package/dist/esm/client/messaging/fanout.js +22 -12
- package/dist/esm/client/messaging/participants.js +6 -4
- package/dist/esm/client/persistence/WriteBehindPersistence.js +125 -0
- package/dist/esm/client/tokens/cs-token.js +46 -0
- package/dist/esm/client/tokens/tc-token.js +18 -0
- package/dist/esm/crypto/core/index.js +2 -2
- package/dist/esm/crypto/core/keys.js +1 -1
- package/dist/esm/crypto/core/nonce.js +2 -0
- package/dist/esm/crypto/core/primitives.js +0 -7
- package/dist/esm/crypto/core/random.js +22 -1
- package/dist/esm/crypto/curves/X25519.js +25 -6
- package/dist/esm/crypto/index.js +1 -0
- package/dist/esm/crypto/math/constants.js +12 -35
- package/dist/esm/crypto/math/edwards.js +174 -47
- package/dist/esm/crypto/math/fe.js +691 -0
- package/dist/esm/crypto/math/mod.js +10 -1
- package/dist/esm/index.js +1 -1
- package/dist/esm/infra/perf/BackgroundQueue.js +478 -0
- package/dist/esm/infra/perf/BoundedTaskQueue.js +3 -1
- package/dist/esm/infra/perf/PromiseDedup.js +20 -0
- package/dist/esm/infra/perf/SharedExclusiveGate.js +109 -0
- package/dist/esm/infra/perf/StoreLock.js +77 -0
- package/dist/esm/media/WaMediaCrypto.js +95 -13
- package/dist/esm/media/WaMediaTransferClient.js +39 -47
- package/dist/esm/media/constants.js +2 -1
- package/dist/esm/message/WaMessageClient.js +26 -19
- package/dist/esm/message/content.js +195 -9
- package/dist/esm/message/icdc.js +76 -0
- package/dist/esm/message/incoming.js +24 -12
- package/dist/esm/message/phash.js +3 -1
- package/dist/esm/message/reporting-token.js +14 -27
- package/dist/esm/protocol/appstate.js +9 -40
- package/dist/esm/protocol/browser.js +10 -18
- package/dist/esm/protocol/constants.js +5 -3
- package/dist/esm/protocol/defaults.js +6 -0
- package/dist/esm/protocol/index.js +1 -2
- package/dist/esm/protocol/jid.js +105 -36
- package/dist/esm/protocol/message.js +61 -1
- package/dist/esm/protocol/nodes.js +2 -0
- package/dist/esm/protocol/notification.js +3 -1
- package/dist/esm/protocol/privacy-token.js +17 -0
- package/dist/esm/protocol/privacy.js +55 -0
- package/dist/esm/protocol/stream.js +26 -1
- package/dist/esm/retry/codec.js +216 -0
- package/dist/esm/retry/constants.js +1 -1
- package/dist/esm/retry/index.js +2 -2
- package/dist/esm/retry/parse.js +50 -30
- package/dist/esm/retry/replay.js +11 -7
- package/dist/esm/retry/tracker.js +50 -12
- package/dist/esm/signal/api/SignalDeviceSyncApi.js +49 -32
- package/dist/esm/signal/api/SignalDigestSyncApi.js +13 -9
- package/dist/esm/signal/api/SignalIdentitySyncApi.js +26 -11
- package/dist/esm/signal/api/SignalMissingPreKeysSyncApi.js +18 -7
- package/dist/esm/signal/api/SignalRotateKeyApi.js +4 -2
- package/dist/esm/signal/api/SignalSessionSyncApi.js +16 -7
- package/dist/esm/signal/api/result-map.js +10 -0
- package/dist/esm/signal/constants.js +0 -4
- package/dist/esm/signal/crypto/WaAdvSignature.js +12 -6
- package/dist/esm/signal/{store/sqlite.js → encoding.js} +78 -24
- package/dist/esm/signal/group/SenderKeyCodec.js +3 -2
- package/dist/esm/signal/group/SenderKeyManager.js +125 -106
- package/dist/esm/signal/index.js +1 -0
- package/dist/esm/signal/registration/keygen.js +6 -2
- package/dist/esm/signal/registration/utils.js +1 -0
- package/dist/esm/signal/session/SignalProtocol.js +150 -74
- package/dist/esm/signal/session/resolver.js +137 -102
- package/dist/esm/store/contracts/privacy-token.store.js +1 -0
- package/dist/esm/store/createStore.js +101 -187
- package/dist/esm/store/index.js +1 -10
- package/dist/esm/store/locks/appstate.lock.js +26 -0
- package/dist/esm/store/locks/auth.lock.js +15 -0
- package/dist/esm/store/locks/contact.lock.js +20 -0
- package/dist/esm/store/locks/device-list.lock.js +20 -0
- package/dist/esm/store/locks/message.lock.js +21 -0
- package/dist/esm/store/locks/participants.lock.js +20 -0
- package/dist/esm/store/locks/privacy-token.lock.js +18 -0
- package/dist/esm/store/locks/retry.lock.js +29 -0
- package/dist/esm/store/locks/sender-key.lock.js +52 -0
- package/dist/esm/store/locks/signal.lock.js +63 -0
- package/dist/esm/store/locks/thread.lock.js +21 -0
- package/dist/esm/store/noop.store.js +1 -1
- package/dist/esm/store/providers/memory/appstate.store.js +22 -24
- package/dist/esm/store/providers/memory/device-list.store.js +10 -5
- package/dist/esm/store/providers/memory/privacy-token.store.js +43 -0
- package/dist/esm/store/providers/memory/retry.store.js +77 -2
- package/dist/esm/store/providers/memory/sender-key.store.js +6 -1
- package/dist/esm/store/providers/memory/signal.store.js +36 -19
- package/dist/esm/transport/WaComms.js +3 -1
- package/dist/esm/transport/WaWebSocket.js +0 -6
- package/dist/esm/transport/binary/constants.js +0 -30
- package/dist/esm/transport/binary/decoder.js +4 -4
- package/dist/esm/transport/binary/encoder.js +8 -15
- package/dist/esm/transport/binary/index.js +0 -1
- package/dist/esm/transport/node/WaNodeOrchestrator.js +25 -19
- package/dist/esm/transport/node/builders/business.js +129 -0
- package/dist/esm/transport/node/builders/global.js +370 -0
- package/dist/esm/transport/node/builders/index.js +5 -2
- package/dist/esm/transport/node/builders/message.js +63 -239
- package/dist/esm/transport/node/builders/pairing.js +0 -24
- package/dist/esm/transport/node/builders/privacy-token.js +41 -0
- package/dist/esm/transport/node/builders/privacy.js +48 -0
- package/dist/esm/transport/node/builders/profile.js +70 -0
- package/dist/esm/transport/node/builders/retry.js +10 -22
- package/dist/esm/transport/node/builders/usync.js +6 -2
- package/dist/esm/transport/node/helpers.js +19 -1
- package/dist/esm/transport/node/usync.js +3 -33
- package/dist/esm/transport/node/xml.js +35 -14
- package/dist/esm/transport/noise/WaClientPayload.js +10 -10
- package/dist/esm/transport/noise/WaNoiseCert.js +3 -3
- package/dist/esm/transport/noise/WaNoiseSession.js +64 -23
- package/dist/esm/transport/noise/WaNoiseSocket.js +8 -4
- package/dist/esm/transport/stream/parse.js +8 -4
- package/dist/esm/util/bytes.js +22 -18
- package/dist/esm/util/index.js +5 -0
- package/dist/esm/util/primitives.js +3 -2
- package/dist/index.js +7 -1
- package/dist/infra/perf/BackgroundQueue.js +482 -0
- package/dist/infra/perf/BoundedTaskQueue.js +3 -1
- package/dist/infra/perf/PromiseDedup.js +24 -0
- package/dist/infra/perf/SharedExclusiveGate.js +113 -0
- package/dist/infra/perf/StoreLock.js +81 -0
- package/dist/media/WaMediaCrypto.js +94 -12
- package/dist/media/WaMediaTransferClient.js +39 -47
- package/dist/media/constants.js +2 -1
- package/dist/message/WaMessageClient.js +26 -19
- package/dist/message/content.js +198 -9
- package/dist/message/icdc.js +81 -0
- package/dist/message/incoming.js +24 -12
- package/dist/message/phash.js +3 -1
- package/dist/message/reporting-token.js +14 -28
- package/dist/protocol/appstate.js +10 -41
- package/dist/protocol/browser.js +10 -18
- package/dist/protocol/constants.js +21 -2
- package/dist/protocol/defaults.js +6 -0
- package/dist/protocol/index.js +8 -5
- package/dist/protocol/jid.js +111 -36
- package/dist/protocol/message.js +62 -2
- package/dist/protocol/nodes.js +2 -0
- package/dist/protocol/notification.js +3 -1
- package/dist/protocol/privacy-token.js +20 -0
- package/dist/protocol/privacy.js +58 -0
- package/dist/protocol/stream.js +27 -2
- package/dist/retry/codec.js +220 -0
- package/dist/retry/constants.js +1 -1
- package/dist/retry/index.js +5 -5
- package/dist/retry/parse.js +51 -30
- package/dist/retry/replay.js +10 -6
- package/dist/retry/tracker.js +50 -12
- package/dist/signal/api/SignalDeviceSyncApi.js +48 -31
- package/dist/signal/api/SignalDigestSyncApi.js +13 -9
- package/dist/signal/api/SignalIdentitySyncApi.js +25 -10
- package/dist/signal/api/SignalMissingPreKeysSyncApi.js +17 -6
- package/dist/signal/api/SignalRotateKeyApi.js +4 -2
- package/dist/signal/api/SignalSessionSyncApi.js +16 -7
- package/dist/signal/api/result-map.js +13 -0
- package/dist/signal/constants.js +1 -5
- package/dist/signal/crypto/WaAdvSignature.js +11 -5
- package/dist/signal/{store/sqlite.js → encoding.js} +79 -25
- package/dist/signal/group/SenderKeyCodec.js +4 -3
- package/dist/signal/group/SenderKeyManager.js +125 -106
- package/dist/signal/index.js +13 -1
- package/dist/signal/registration/keygen.js +6 -2
- package/dist/signal/registration/utils.js +1 -0
- package/dist/signal/session/SignalProtocol.js +150 -74
- package/dist/signal/session/resolver.js +135 -100
- package/dist/store/contracts/privacy-token.store.js +2 -0
- package/dist/store/createStore.js +101 -187
- package/dist/store/index.js +15 -33
- package/dist/store/locks/appstate.lock.js +29 -0
- package/dist/store/locks/auth.lock.js +18 -0
- package/dist/store/locks/contact.lock.js +23 -0
- package/dist/store/locks/device-list.lock.js +23 -0
- package/dist/store/locks/message.lock.js +24 -0
- package/dist/store/locks/participants.lock.js +23 -0
- package/dist/store/locks/privacy-token.lock.js +21 -0
- package/dist/store/locks/retry.lock.js +32 -0
- package/dist/store/locks/sender-key.lock.js +55 -0
- package/dist/store/locks/signal.lock.js +66 -0
- package/dist/store/locks/thread.lock.js +24 -0
- package/dist/store/noop.store.js +1 -1
- package/dist/store/providers/memory/appstate.store.js +22 -24
- package/dist/store/providers/memory/device-list.store.js +10 -5
- package/dist/store/providers/memory/privacy-token.store.js +47 -0
- package/dist/store/providers/memory/retry.store.js +77 -2
- package/dist/store/providers/memory/sender-key.store.js +6 -1
- package/dist/store/providers/memory/signal.store.js +36 -19
- package/dist/transport/WaComms.js +3 -1
- package/dist/transport/WaWebSocket.js +0 -6
- package/dist/transport/binary/constants.js +1 -31
- package/dist/transport/binary/decoder.js +4 -4
- package/dist/transport/binary/encoder.js +8 -15
- package/dist/transport/binary/index.js +0 -4
- package/dist/transport/node/WaNodeOrchestrator.js +24 -18
- package/dist/transport/node/builders/business.js +137 -0
- package/dist/transport/node/builders/global.js +375 -0
- package/dist/transport/node/builders/index.js +18 -9
- package/dist/transport/node/builders/message.js +64 -245
- package/dist/transport/node/builders/pairing.js +0 -26
- package/dist/transport/node/builders/privacy-token.js +46 -0
- package/dist/transport/node/builders/privacy.js +55 -0
- package/dist/transport/node/builders/profile.js +78 -0
- package/dist/transport/node/builders/retry.js +9 -21
- package/dist/transport/node/builders/usync.js +6 -2
- package/dist/transport/node/helpers.js +20 -1
- package/dist/transport/node/usync.js +2 -32
- package/dist/transport/node/xml.js +35 -14
- package/dist/transport/noise/WaClientPayload.js +13 -13
- package/dist/transport/noise/WaNoiseCert.js +2 -2
- package/dist/transport/noise/WaNoiseSession.js +64 -23
- package/dist/transport/noise/WaNoiseSocket.js +8 -4
- package/dist/transport/stream/parse.js +7 -3
- package/dist/types/appstate/encoding.d.ts +7 -0
- package/dist/types/appstate/index.d.ts +3 -3
- package/dist/types/appstate/utils.d.ts +0 -2
- package/dist/types/auth/flow/WaAuthCredentialsFlow.d.ts +1 -1
- package/dist/types/auth/index.d.ts +0 -2
- package/dist/types/auth/types.d.ts +1 -0
- package/dist/types/client/WaClient.d.ts +27 -12
- package/dist/types/client/WaClientFactory.d.ts +12 -4
- package/dist/types/client/connection/WaConnectionManager.d.ts +2 -0
- package/dist/types/client/coordinators/WaBusinessCoordinator.d.ts +57 -0
- package/dist/types/client/coordinators/WaIncomingNodeCoordinator.d.ts +3 -1
- package/dist/types/client/coordinators/WaMessageDispatchCoordinator.d.ts +14 -0
- package/dist/types/client/coordinators/WaPassiveTasksCoordinator.d.ts +4 -0
- package/dist/types/client/coordinators/WaPrivacyCoordinator.d.ts +26 -0
- package/dist/types/client/coordinators/WaProfileCoordinator.d.ts +36 -0
- package/dist/types/client/coordinators/WaRetryCoordinator.d.ts +6 -0
- package/dist/types/client/coordinators/WaStreamControlCoordinator.d.ts +3 -2
- package/dist/types/client/coordinators/WaTrustedContactTokenCoordinator.d.ts +45 -0
- package/dist/types/client/events/devices.d.ts +20 -0
- package/dist/types/client/events/identity.d.ts +9 -0
- package/dist/types/client/events/privacy-token.d.ts +7 -0
- package/dist/types/client/history-sync.d.ts +9 -6
- package/dist/types/client/incoming.d.ts +3 -1
- package/dist/types/client/index.d.ts +1 -1
- package/dist/types/client/mailbox.d.ts +3 -5
- package/dist/types/client/messages.d.ts +1 -2
- package/dist/types/client/persistence/WriteBehindPersistence.d.ts +34 -0
- package/dist/types/client/tokens/cs-token.d.ts +10 -0
- package/dist/types/client/tokens/tc-token.d.ts +5 -0
- package/dist/types/client/types.d.ts +51 -3
- package/dist/types/crypto/core/index.d.ts +2 -2
- package/dist/types/crypto/core/nonce.d.ts +2 -0
- package/dist/types/crypto/core/primitives.d.ts +0 -1
- package/dist/types/crypto/core/random.d.ts +1 -0
- package/dist/types/crypto/index.d.ts +1 -0
- package/dist/types/crypto/math/constants.d.ts +4 -2
- package/dist/types/crypto/math/fe.d.ts +30 -0
- package/dist/types/crypto/math/mod.d.ts +0 -2
- package/dist/types/crypto/math/types.d.ts +11 -4
- package/dist/types/index.d.ts +5 -3
- package/dist/types/infra/perf/BackgroundQueue.d.ts +58 -0
- package/dist/types/infra/perf/PromiseDedup.d.ts +4 -0
- package/dist/types/infra/perf/SharedExclusiveGate.d.ts +17 -0
- package/dist/types/infra/perf/StoreLock.d.ts +10 -0
- package/dist/types/media/WaMediaCrypto.d.ts +3 -2
- package/dist/types/media/WaMediaTransferClient.d.ts +3 -12
- package/dist/types/media/constants.d.ts +1 -1
- package/dist/types/media/index.d.ts +1 -1
- package/dist/types/media/types.d.ts +10 -2
- package/dist/types/message/content.d.ts +8 -0
- package/dist/types/message/icdc.d.ts +13 -0
- package/dist/types/message/reporting-token.d.ts +0 -1
- package/dist/types/message/types.d.ts +45 -6
- package/dist/types/protocol/appstate.d.ts +0 -11
- package/dist/types/protocol/constants.d.ts +7 -3
- package/dist/types/protocol/defaults.d.ts +6 -0
- package/dist/types/protocol/index.d.ts +1 -2
- package/dist/types/protocol/jid.d.ts +19 -2
- package/dist/types/protocol/message.d.ts +60 -0
- package/dist/types/protocol/nodes.d.ts +2 -0
- package/dist/types/protocol/notification.d.ts +2 -0
- package/dist/types/protocol/privacy-token.d.ts +17 -0
- package/dist/types/protocol/privacy.d.ts +75 -0
- package/dist/types/protocol/stream.d.ts +30 -0
- package/dist/types/retry/codec.d.ts +3 -0
- package/dist/types/retry/index.d.ts +3 -3
- package/dist/types/retry/parse.d.ts +5 -2
- package/dist/types/retry/tracker.d.ts +1 -0
- package/dist/types/retry/types.d.ts +6 -1
- package/dist/types/signal/api/SignalDeviceSyncApi.d.ts +2 -1
- package/dist/types/signal/api/SignalDigestSyncApi.d.ts +6 -0
- package/dist/types/signal/api/SignalIdentitySyncApi.d.ts +2 -0
- package/dist/types/signal/api/SignalRotateKeyApi.d.ts +4 -5
- package/dist/types/signal/api/SignalSessionSyncApi.d.ts +8 -6
- package/dist/types/signal/api/result-map.d.ts +1 -0
- package/dist/types/signal/constants.d.ts +0 -3
- package/dist/types/signal/{store/sqlite.d.ts → encoding.d.ts} +3 -3
- package/dist/types/signal/group/SenderKeyManager.d.ts +10 -5
- package/dist/types/signal/index.d.ts +2 -0
- package/dist/types/signal/session/SignalProtocol.d.ts +10 -4
- package/dist/types/signal/session/resolver.d.ts +7 -2
- package/dist/types/store/contracts/appstate.store.d.ts +1 -1
- package/dist/types/store/contracts/privacy-token.store.d.ts +16 -0
- package/dist/types/store/contracts/retry.store.d.ts +7 -0
- package/dist/types/store/contracts/signal.store.d.ts +7 -0
- package/dist/types/store/createStore.d.ts +1 -1
- package/dist/types/store/index.d.ts +5 -13
- package/dist/types/store/locks/appstate.lock.d.ts +3 -0
- package/dist/types/store/locks/auth.lock.d.ts +3 -0
- package/dist/types/store/locks/contact.lock.d.ts +3 -0
- package/dist/types/store/locks/device-list.lock.d.ts +2 -0
- package/dist/types/store/locks/message.lock.d.ts +3 -0
- package/dist/types/store/locks/participants.lock.d.ts +2 -0
- package/dist/types/store/locks/privacy-token.lock.d.ts +2 -0
- package/dist/types/store/locks/retry.lock.d.ts +2 -0
- package/dist/types/store/locks/sender-key.lock.d.ts +3 -0
- package/dist/types/store/locks/signal.lock.d.ts +3 -0
- package/dist/types/store/locks/thread.lock.d.ts +3 -0
- package/dist/types/store/providers/memory/appstate.store.d.ts +1 -1
- package/dist/types/store/providers/memory/privacy-token.store.d.ts +13 -0
- package/dist/types/store/providers/memory/retry.store.d.ts +8 -0
- package/dist/types/store/providers/memory/signal.store.d.ts +2 -1
- package/dist/types/store/types.d.ts +49 -61
- package/dist/types/transport/WaWebSocket.d.ts +0 -1
- package/dist/types/transport/binary/constants.d.ts +0 -30
- package/dist/types/transport/binary/index.d.ts +0 -1
- package/dist/types/transport/node/WaNodeOrchestrator.d.ts +3 -4
- package/dist/types/transport/node/builders/business.d.ts +29 -0
- package/dist/types/transport/node/builders/global.d.ts +102 -0
- package/dist/types/transport/node/builders/index.d.ts +5 -2
- package/dist/types/transport/node/builders/message.d.ts +8 -7
- package/dist/types/transport/node/builders/pairing.d.ts +0 -2
- package/dist/types/transport/node/builders/privacy-token.d.ts +9 -0
- package/dist/types/transport/node/builders/privacy.d.ts +7 -0
- package/dist/types/transport/node/builders/profile.d.ts +8 -0
- package/dist/types/transport/node/builders/retry.d.ts +0 -1
- package/dist/types/transport/node/helpers.d.ts +5 -0
- package/dist/types/transport/noise/WaNoiseSession.d.ts +3 -2
- package/dist/types/transport/noise/WaNoiseSocket.d.ts +4 -2
- package/dist/types/util/bytes.d.ts +1 -1
- package/dist/types/util/index.d.ts +5 -0
- package/dist/types/util/primitives.d.ts +0 -1
- package/dist/util/bytes.js +22 -18
- package/dist/util/index.js +23 -0
- package/dist/util/primitives.js +2 -2
- package/package.json +29 -7
- package/proto/index.js +1 -1
- package/dist/crypto/core/constants.js +0 -4
- package/dist/esm/crypto/core/constants.js +0 -1
- package/dist/esm/retry/outbound.js +0 -82
- package/dist/esm/store/providers/sqlite/BaseSqliteStore.js +0 -37
- package/dist/esm/store/providers/sqlite/appstate.store.js +0 -250
- package/dist/esm/store/providers/sqlite/auth.store.js +0 -176
- package/dist/esm/store/providers/sqlite/connection.js +0 -245
- package/dist/esm/store/providers/sqlite/contact.store.js +0 -74
- package/dist/esm/store/providers/sqlite/device-list.store.js +0 -127
- package/dist/esm/store/providers/sqlite/message.store.js +0 -132
- package/dist/esm/store/providers/sqlite/migrations.js +0 -347
- package/dist/esm/store/providers/sqlite/participants.store.js +0 -77
- package/dist/esm/store/providers/sqlite/retry.store.js +0 -141
- package/dist/esm/store/providers/sqlite/sender-key.store.js +0 -198
- package/dist/esm/store/providers/sqlite/signal.store.js +0 -435
- package/dist/esm/store/providers/sqlite/table-names.js +0 -107
- package/dist/esm/store/providers/sqlite/thread.store.js +0 -85
- package/dist/retry/outbound.js +0 -87
- package/dist/store/providers/sqlite/BaseSqliteStore.js +0 -41
- package/dist/store/providers/sqlite/appstate.store.js +0 -254
- package/dist/store/providers/sqlite/auth.store.js +0 -180
- package/dist/store/providers/sqlite/connection.js +0 -281
- package/dist/store/providers/sqlite/contact.store.js +0 -78
- package/dist/store/providers/sqlite/device-list.store.js +0 -131
- package/dist/store/providers/sqlite/message.store.js +0 -136
- package/dist/store/providers/sqlite/migrations.js +0 -350
- package/dist/store/providers/sqlite/participants.store.js +0 -81
- package/dist/store/providers/sqlite/retry.store.js +0 -145
- package/dist/store/providers/sqlite/sender-key.store.js +0 -202
- package/dist/store/providers/sqlite/signal.store.js +0 -439
- package/dist/store/providers/sqlite/table-names.js +0 -113
- package/dist/store/providers/sqlite/thread.store.js +0 -89
- package/dist/types/appstate/store/sqlite.d.ts +0 -7
- package/dist/types/crypto/core/constants.d.ts +0 -1
- package/dist/types/retry/outbound.d.ts +0 -4
- package/dist/types/store/providers/sqlite/BaseSqliteStore.d.ts +0 -12
- package/dist/types/store/providers/sqlite/appstate.store.d.ts +0 -17
- package/dist/types/store/providers/sqlite/auth.store.d.ts +0 -10
- package/dist/types/store/providers/sqlite/connection.d.ts +0 -10
- package/dist/types/store/providers/sqlite/contact.store.d.ts +0 -12
- package/dist/types/store/providers/sqlite/device-list.store.d.ts +0 -15
- package/dist/types/store/providers/sqlite/message.store.d.ts +0 -13
- package/dist/types/store/providers/sqlite/migrations.d.ts +0 -3
- package/dist/types/store/providers/sqlite/participants.store.d.ts +0 -12
- package/dist/types/store/providers/sqlite/retry.store.d.ts +0 -15
- package/dist/types/store/providers/sqlite/sender-key.store.d.ts +0 -24
- package/dist/types/store/providers/sqlite/signal.store.d.ts +0 -53
- package/dist/types/store/providers/sqlite/table-names.d.ts +0 -5
- package/dist/types/store/providers/sqlite/thread.store.d.ts +0 -13
|
@@ -4,6 +4,7 @@ exports.buildRetryReceiptNode = buildRetryReceiptNode;
|
|
|
4
4
|
const constants_1 = require("../../../protocol/constants");
|
|
5
5
|
const constants_2 = require("../../../retry/constants");
|
|
6
6
|
const constants_3 = require("../../../signal/api/constants");
|
|
7
|
+
const global_1 = require("../../node/builders/global");
|
|
7
8
|
const bytes_1 = require("../../../util/bytes");
|
|
8
9
|
function buildRetryKeysNode(keys) {
|
|
9
10
|
const content = [
|
|
@@ -71,23 +72,6 @@ function buildRetryKeysNode(keys) {
|
|
|
71
72
|
};
|
|
72
73
|
}
|
|
73
74
|
function buildRetryReceiptNode(input) {
|
|
74
|
-
const attrs = {
|
|
75
|
-
id: input.stanzaId,
|
|
76
|
-
to: input.to,
|
|
77
|
-
type: 'retry'
|
|
78
|
-
};
|
|
79
|
-
if (input.participant) {
|
|
80
|
-
attrs.participant = input.participant;
|
|
81
|
-
}
|
|
82
|
-
if (input.recipient) {
|
|
83
|
-
attrs.recipient = input.recipient;
|
|
84
|
-
}
|
|
85
|
-
if (input.from) {
|
|
86
|
-
attrs.from = input.from;
|
|
87
|
-
}
|
|
88
|
-
if (input.categoryPeer) {
|
|
89
|
-
attrs.category = 'peer';
|
|
90
|
-
}
|
|
91
75
|
const retryAttrs = {
|
|
92
76
|
v: constants_2.RETRY_RECEIPT_VERSION,
|
|
93
77
|
count: String(input.retryCount),
|
|
@@ -111,9 +95,13 @@ function buildRetryReceiptNode(input) {
|
|
|
111
95
|
if (input.keys) {
|
|
112
96
|
content.push(buildRetryKeysNode(input.keys));
|
|
113
97
|
}
|
|
114
|
-
return {
|
|
115
|
-
|
|
116
|
-
|
|
98
|
+
return (0, global_1.buildReceiptNode)({
|
|
99
|
+
kind: 'retry_custom',
|
|
100
|
+
id: input.stanzaId,
|
|
101
|
+
to: input.to,
|
|
102
|
+
participant: input.participant,
|
|
103
|
+
recipient: input.recipient,
|
|
104
|
+
categoryPeer: input.categoryPeer,
|
|
117
105
|
content
|
|
118
|
-
};
|
|
106
|
+
});
|
|
119
107
|
}
|
|
@@ -18,6 +18,10 @@ function buildUsyncIq(input) {
|
|
|
18
18
|
if (input.queryProtocolNodes.length === 0) {
|
|
19
19
|
throw new Error('usync query must include at least one protocol node');
|
|
20
20
|
}
|
|
21
|
+
const users = new Array(input.users.length);
|
|
22
|
+
for (let index = 0; index < input.users.length; index += 1) {
|
|
23
|
+
users[index] = buildUsyncUserNode(input.users[index]);
|
|
24
|
+
}
|
|
21
25
|
return (0, query_1.buildIqNode)('get', input.hostDomain ?? constants_1.WA_DEFAULTS.HOST_DOMAIN, constants_1.WA_XMLNS.USYNC, [
|
|
22
26
|
{
|
|
23
27
|
tag: constants_1.WA_NODE_TAGS.USYNC,
|
|
@@ -32,12 +36,12 @@ function buildUsyncIq(input) {
|
|
|
32
36
|
{
|
|
33
37
|
tag: constants_1.WA_NODE_TAGS.QUERY,
|
|
34
38
|
attrs: {},
|
|
35
|
-
content:
|
|
39
|
+
content: input.queryProtocolNodes
|
|
36
40
|
},
|
|
37
41
|
{
|
|
38
42
|
tag: constants_1.WA_NODE_TAGS.LIST,
|
|
39
43
|
attrs: {},
|
|
40
|
-
content:
|
|
44
|
+
content: users
|
|
41
45
|
}
|
|
42
46
|
]
|
|
43
47
|
}
|
|
@@ -13,10 +13,13 @@ exports.hasNodeChild = hasNodeChild;
|
|
|
13
13
|
exports.decodeNodeContentUtf8OrBytes = decodeNodeContentUtf8OrBytes;
|
|
14
14
|
exports.decodeNodeContentBase64OrBytes = decodeNodeContentBase64OrBytes;
|
|
15
15
|
exports.formatNodeIdPrefixFromSeed = formatNodeIdPrefixFromSeed;
|
|
16
|
+
exports.createNodeIdGenerator = createNodeIdGenerator;
|
|
17
|
+
const _crypto_1 = require("../../crypto/index.js");
|
|
16
18
|
const bytes_1 = require("../../util/bytes");
|
|
17
19
|
const EMPTY_NODE_CHILDREN = Object.freeze([]);
|
|
18
20
|
const EMPTY_NODE_TAGS = Object.freeze([]);
|
|
19
21
|
const EMPTY_NODE_VALUES = Object.freeze([]);
|
|
22
|
+
const NODE_ID_PREFIX_SEED = new Uint8Array(4);
|
|
20
23
|
function getNodeChildren(node) {
|
|
21
24
|
return Array.isArray(node.content) ? node.content : EMPTY_NODE_CHILDREN;
|
|
22
25
|
}
|
|
@@ -69,7 +72,11 @@ function getNodeChildrenTags(node) {
|
|
|
69
72
|
const content = node.content;
|
|
70
73
|
if (!Array.isArray(content) || content.length === 0)
|
|
71
74
|
return EMPTY_NODE_TAGS;
|
|
72
|
-
|
|
75
|
+
const tags = new Array(content.length);
|
|
76
|
+
for (let i = 0; i < content.length; i += 1) {
|
|
77
|
+
tags[i] = content[i].tag;
|
|
78
|
+
}
|
|
79
|
+
return tags;
|
|
73
80
|
}
|
|
74
81
|
function getNodeChildrenNonEmptyAttrValuesByTag(node, tag, attr) {
|
|
75
82
|
let values = null;
|
|
@@ -152,3 +159,15 @@ function formatNodeIdPrefixFromSeed(seed) {
|
|
|
152
159
|
const right = ((seed[2] << 8) | seed[3]) >>> 0;
|
|
153
160
|
return `${left}.${right}-`;
|
|
154
161
|
}
|
|
162
|
+
async function createNodeIdGenerator() {
|
|
163
|
+
await (0, _crypto_1.randomFillAsync)(NODE_ID_PREFIX_SEED);
|
|
164
|
+
const prefix = formatNodeIdPrefixFromSeed(NODE_ID_PREFIX_SEED);
|
|
165
|
+
let counter = 0;
|
|
166
|
+
return {
|
|
167
|
+
prefix,
|
|
168
|
+
next() {
|
|
169
|
+
counter += 1;
|
|
170
|
+
return `${prefix}${counter}`;
|
|
171
|
+
}
|
|
172
|
+
};
|
|
173
|
+
}
|
|
@@ -1,38 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.createUsyncSidGenerator = createUsyncSidGenerator;
|
|
4
|
-
const _crypto_1 = require("../../crypto/index.js");
|
|
5
4
|
const helpers_1 = require("./helpers");
|
|
6
5
|
function createUsyncSidGenerator() {
|
|
7
|
-
const
|
|
8
|
-
|
|
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);
|
|
6
|
+
const generatorPromise = (0, helpers_1.createNodeIdGenerator)();
|
|
7
|
+
return async () => (await generatorPromise).next();
|
|
38
8
|
}
|
|
@@ -4,23 +4,41 @@ exports.formatBinaryNodeAsXml = formatBinaryNodeAsXml;
|
|
|
4
4
|
const bytes_1 = require("../../util/bytes");
|
|
5
5
|
const XML_INDENT = ' ';
|
|
6
6
|
function escapeXml(value) {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
.
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
7
|
+
let out = '';
|
|
8
|
+
let last = 0;
|
|
9
|
+
for (let i = 0; i < value.length; i++) {
|
|
10
|
+
let esc;
|
|
11
|
+
switch (value.charCodeAt(i)) {
|
|
12
|
+
case 38:
|
|
13
|
+
esc = '&';
|
|
14
|
+
break;
|
|
15
|
+
case 60:
|
|
16
|
+
esc = '<';
|
|
17
|
+
break;
|
|
18
|
+
case 62:
|
|
19
|
+
esc = '>';
|
|
20
|
+
break;
|
|
21
|
+
case 34:
|
|
22
|
+
esc = '"';
|
|
23
|
+
break;
|
|
24
|
+
case 39:
|
|
25
|
+
esc = ''';
|
|
26
|
+
break;
|
|
27
|
+
}
|
|
28
|
+
if (esc) {
|
|
29
|
+
out += value.slice(last, i) + esc;
|
|
30
|
+
last = i + 1;
|
|
31
|
+
}
|
|
18
32
|
}
|
|
19
|
-
return
|
|
33
|
+
return last === 0 ? value : out + value.slice(last);
|
|
20
34
|
}
|
|
21
35
|
function renderNode(node, depth) {
|
|
22
36
|
const indent = XML_INDENT.repeat(depth);
|
|
23
|
-
const
|
|
37
|
+
const keys = Object.keys(node.attrs);
|
|
38
|
+
let attrs = '';
|
|
39
|
+
for (let i = 0; i < keys.length; i++) {
|
|
40
|
+
attrs += ` ${keys[i]}='${escapeXml(node.attrs[keys[i]])}'`;
|
|
41
|
+
}
|
|
24
42
|
const content = node.content;
|
|
25
43
|
if (content === undefined) {
|
|
26
44
|
return `${indent}<${node.tag}${attrs}/>`;
|
|
@@ -34,7 +52,10 @@ function renderNode(node, depth) {
|
|
|
34
52
|
if (content.length === 0) {
|
|
35
53
|
return `${indent}<${node.tag}${attrs}/>`;
|
|
36
54
|
}
|
|
37
|
-
|
|
55
|
+
let children = renderNode(content[0], depth + 1);
|
|
56
|
+
for (let i = 1; i < content.length; i++) {
|
|
57
|
+
children += '\n' + renderNode(content[i], depth + 1);
|
|
58
|
+
}
|
|
38
59
|
return `${indent}<${node.tag}${attrs}>\n${children}\n${indent}</${node.tag}>`;
|
|
39
60
|
}
|
|
40
61
|
function formatBinaryNodeAsXml(node) {
|
|
@@ -5,8 +5,7 @@ exports.buildRegistrationPayload = buildRegistrationPayload;
|
|
|
5
5
|
const node_crypto_1 = require("node:crypto");
|
|
6
6
|
const primitives_1 = require("../../crypto/core/primitives");
|
|
7
7
|
const _proto_1 = require("../../proto.js");
|
|
8
|
-
const constants_1 = require("
|
|
9
|
-
const constants_2 = require("../noise/constants");
|
|
8
|
+
const constants_1 = require("../noise/constants");
|
|
10
9
|
const bytes_1 = require("../../util/bytes");
|
|
11
10
|
function parseVersion(versionBase) {
|
|
12
11
|
const [p = '2', s = '3000', t = '0'] = versionBase.split('.');
|
|
@@ -64,8 +63,8 @@ function resolveDevicePropsPlatformType(deviceBrowser) {
|
|
|
64
63
|
return _proto_1.proto.DeviceProps.PlatformType.UNKNOWN;
|
|
65
64
|
}
|
|
66
65
|
}
|
|
67
|
-
function defaultUserAgent(versionBase, deviceOsDisplayName) {
|
|
68
|
-
const { primary, secondary, tertiary } = parseVersion(versionBase);
|
|
66
|
+
function defaultUserAgent(versionBase, deviceOsDisplayName, version) {
|
|
67
|
+
const { primary, secondary, tertiary } = version ?? parseVersion(versionBase);
|
|
69
68
|
const locale = resolveLocale();
|
|
70
69
|
return {
|
|
71
70
|
platform: _proto_1.proto.ClientPayload.UserAgent.Platform.WEB,
|
|
@@ -86,8 +85,8 @@ function defaultUserAgent(versionBase, deviceOsDisplayName) {
|
|
|
86
85
|
localeCountryIso31661Alpha2: locale.lc
|
|
87
86
|
};
|
|
88
87
|
}
|
|
89
|
-
function defaultDeviceProps(versionBase, config) {
|
|
90
|
-
const { primary, secondary, tertiary } = parseVersion(versionBase);
|
|
88
|
+
function defaultDeviceProps(versionBase, config, version) {
|
|
89
|
+
const { primary, secondary, tertiary } = version ?? parseVersion(versionBase);
|
|
91
90
|
return _proto_1.proto.DeviceProps.encode({
|
|
92
91
|
os: config.deviceOsDisplayName ?? process.platform,
|
|
93
92
|
version: {
|
|
@@ -109,15 +108,15 @@ function defaultDeviceProps(versionBase, config) {
|
|
|
109
108
|
}
|
|
110
109
|
}).finish();
|
|
111
110
|
}
|
|
112
|
-
function buildCommonPayload(config) {
|
|
113
|
-
const versionBase = config.versionBase ??
|
|
111
|
+
function buildCommonPayload(config, version) {
|
|
112
|
+
const versionBase = config.versionBase ?? constants_1.DEFAULT_VERSION_BASE;
|
|
114
113
|
const pull = config.pull ?? true;
|
|
115
114
|
return {
|
|
116
115
|
passive: config.passive === true,
|
|
117
116
|
pull,
|
|
118
117
|
connectType: _proto_1.proto.ClientPayload.ConnectType.WIFI_UNKNOWN,
|
|
119
118
|
connectReason: _proto_1.proto.ClientPayload.ConnectReason.USER_ACTIVATED,
|
|
120
|
-
userAgent: config.userAgent ?? defaultUserAgent(versionBase, config.deviceOsDisplayName),
|
|
119
|
+
userAgent: config.userAgent ?? defaultUserAgent(versionBase, config.deviceOsDisplayName, version),
|
|
121
120
|
webInfo: config.webInfo ??
|
|
122
121
|
{
|
|
123
122
|
webSubPlatform: defaultWebSubPlatform()
|
|
@@ -145,15 +144,16 @@ function buildRegistrationPayload(config) {
|
|
|
145
144
|
if (!Number.isSafeInteger(signedPreKeyId) || signedPreKeyId <= 0) {
|
|
146
145
|
throw new Error('registration payload requires a valid signedPreKeyId');
|
|
147
146
|
}
|
|
148
|
-
const versionBase = config.versionBase ??
|
|
149
|
-
const
|
|
147
|
+
const versionBase = config.versionBase ?? constants_1.DEFAULT_VERSION_BASE;
|
|
148
|
+
const version = parseVersion(versionBase);
|
|
149
|
+
const common = buildCommonPayload(config, version);
|
|
150
150
|
const devicePairingData = {
|
|
151
151
|
buildHash: config.buildHash ? (0, bytes_1.toBytesView)(config.buildHash) : (0, primitives_1.md5Bytes)(versionBase),
|
|
152
152
|
deviceProps: config.deviceProps
|
|
153
153
|
? (0, bytes_1.toBytesView)(config.deviceProps)
|
|
154
|
-
: defaultDeviceProps(versionBase, config),
|
|
154
|
+
: defaultDeviceProps(versionBase, config, version),
|
|
155
155
|
eRegid: (0, bytes_1.intToBytes)(4, registrationId),
|
|
156
|
-
eKeytype: (0, bytes_1.intToBytes)(1,
|
|
156
|
+
eKeytype: (0, bytes_1.intToBytes)(1, 5),
|
|
157
157
|
eIdent: (0, bytes_1.toBytesView)(config.registrationInfo.identityKeyPair.pubKey),
|
|
158
158
|
eSkeyId: (0, bytes_1.intToBytes)(3, signedPreKeyId),
|
|
159
159
|
eSkeyVal: (0, bytes_1.toBytesView)(config.signedPreKey.keyPair.pubKey),
|
|
@@ -9,7 +9,7 @@ const bytes_1 = require("../../util/bytes");
|
|
|
9
9
|
const primitives_1 = require("../../util/primitives");
|
|
10
10
|
async function verifySignalVariant(serializedPublicKey, message, signatureInput) {
|
|
11
11
|
const publicKey = (0, _crypto_1.toSerializedPubKey)(serializedPublicKey);
|
|
12
|
-
if (
|
|
12
|
+
if (signatureInput.length !== 64) {
|
|
13
13
|
return false;
|
|
14
14
|
}
|
|
15
15
|
const signature = new Uint8Array(signatureInput);
|
|
@@ -20,7 +20,7 @@ async function verifySignalVariant(serializedPublicKey, message, signatureInput)
|
|
|
20
20
|
const signBit = lastByte & 0x80;
|
|
21
21
|
signature[63] = lastByte & 0x7f;
|
|
22
22
|
const edwardsPublicKey = (0, X25519_1.montgomeryToEdwardsPublic)(publicKey.subarray(1), signBit);
|
|
23
|
-
return
|
|
23
|
+
return _crypto_1.Ed25519.verify(message, signature, edwardsPublicKey);
|
|
24
24
|
}
|
|
25
25
|
function parseNoiseCertificate(certificate) {
|
|
26
26
|
if (!certificate) {
|
|
@@ -3,7 +3,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.WaNoiseSession = void 0;
|
|
4
4
|
const _crypto_1 = require("../../crypto/index.js");
|
|
5
5
|
const ConsoleLogger_1 = require("../../infra/log/ConsoleLogger");
|
|
6
|
-
const BoundedTaskQueue_1 = require("../../infra/perf/BoundedTaskQueue");
|
|
7
6
|
const _proto_1 = require("../../proto.js");
|
|
8
7
|
const constants_1 = require("../../protocol/constants");
|
|
9
8
|
const constants_2 = require("../noise/constants");
|
|
@@ -51,6 +50,8 @@ function buildRoutingInfoPrefix(routingInfo) {
|
|
|
51
50
|
}
|
|
52
51
|
class WaNoiseSession {
|
|
53
52
|
constructor(sendWire, logger = new ConsoleLogger_1.ConsoleLogger('info')) {
|
|
53
|
+
this.writeChain = Promise.resolve();
|
|
54
|
+
this.readChain = Promise.resolve();
|
|
54
55
|
this.frameCodec = null;
|
|
55
56
|
this.handshakeInbox = [];
|
|
56
57
|
this.handshakeInboxHead = 0;
|
|
@@ -63,8 +64,6 @@ class WaNoiseSession {
|
|
|
63
64
|
this.handshakeFrameTimeoutMs = constants_1.WA_DEFAULTS.CONNECT_TIMEOUT_MS;
|
|
64
65
|
this.sendWire = sendWire;
|
|
65
66
|
this.logger = logger;
|
|
66
|
-
this.writeQueue = new BoundedTaskQueue_1.BoundedTaskQueue(4096, 1);
|
|
67
|
-
this.readQueue = new BoundedTaskQueue_1.BoundedTaskQueue(4096, 1);
|
|
68
67
|
}
|
|
69
68
|
async start(config) {
|
|
70
69
|
this.reset();
|
|
@@ -96,12 +95,24 @@ class WaNoiseSession {
|
|
|
96
95
|
await this.decodeBufferedPostHandshakeFrames();
|
|
97
96
|
this.logger.info('noise session established via full handshake');
|
|
98
97
|
}
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
98
|
+
encryptFrame(frame) {
|
|
99
|
+
const socket = this.noiseSocket;
|
|
100
|
+
const codec = this.frameCodec;
|
|
101
|
+
if (!socket || !codec) {
|
|
102
|
+
return Promise.reject(new Error('noise session is not established'));
|
|
103
|
+
}
|
|
104
|
+
let encryptPromise;
|
|
105
|
+
try {
|
|
106
|
+
encryptPromise = socket.encrypt(socket.reserveWriteNonce(), frame);
|
|
102
107
|
}
|
|
103
|
-
|
|
104
|
-
|
|
108
|
+
catch (error) {
|
|
109
|
+
return Promise.reject(error);
|
|
110
|
+
}
|
|
111
|
+
const result = this.writeChain
|
|
112
|
+
.then(() => encryptPromise)
|
|
113
|
+
.then((encrypted) => codec.encodeFrame(encrypted));
|
|
114
|
+
this.writeChain = result.then(() => { }, () => { });
|
|
115
|
+
return result;
|
|
105
116
|
}
|
|
106
117
|
async pushWireChunk(chunk) {
|
|
107
118
|
const codec = this.frameCodec;
|
|
@@ -110,7 +121,9 @@ class WaNoiseSession {
|
|
|
110
121
|
}
|
|
111
122
|
const out = [];
|
|
112
123
|
if (this.pendingDecryptedFrames.length > 0) {
|
|
113
|
-
|
|
124
|
+
for (let i = 0; i < this.pendingDecryptedFrames.length; i += 1) {
|
|
125
|
+
out.push(this.pendingDecryptedFrames[i]);
|
|
126
|
+
}
|
|
114
127
|
this.pendingDecryptedFrames = [];
|
|
115
128
|
}
|
|
116
129
|
const frames = codec.pushWireChunk(chunk);
|
|
@@ -128,9 +141,15 @@ class WaNoiseSession {
|
|
|
128
141
|
}
|
|
129
142
|
return out;
|
|
130
143
|
}
|
|
131
|
-
|
|
132
|
-
const
|
|
133
|
-
|
|
144
|
+
if (frames.length > 0) {
|
|
145
|
+
const decryptBatch = this.decryptFramesBatch(this.noiseSocket, frames);
|
|
146
|
+
this.readChain = this.readChain
|
|
147
|
+
.then(() => decryptBatch)
|
|
148
|
+
.then(() => { }, () => { });
|
|
149
|
+
const decrypted = await decryptBatch;
|
|
150
|
+
for (let i = 0; i < decrypted.length; i++) {
|
|
151
|
+
out.push(decrypted[i]);
|
|
152
|
+
}
|
|
134
153
|
}
|
|
135
154
|
return out;
|
|
136
155
|
}
|
|
@@ -145,6 +164,16 @@ class WaNoiseSession {
|
|
|
145
164
|
rejecter(closeError);
|
|
146
165
|
}
|
|
147
166
|
}
|
|
167
|
+
async decryptFramesBatch(socket, frames) {
|
|
168
|
+
if (frames.length === 1) {
|
|
169
|
+
return [await socket.decrypt(socket.reserveReadNonce(), frames[0])];
|
|
170
|
+
}
|
|
171
|
+
const pending = new Array(frames.length);
|
|
172
|
+
for (let i = 0; i < frames.length; i++) {
|
|
173
|
+
pending[i] = socket.decrypt(socket.reserveReadNonce(), frames[i]);
|
|
174
|
+
}
|
|
175
|
+
return Promise.all(pending);
|
|
176
|
+
}
|
|
148
177
|
reset() {
|
|
149
178
|
this.logger.trace('noise session reset');
|
|
150
179
|
this.frameCodec = null;
|
|
@@ -155,11 +184,10 @@ class WaNoiseSession {
|
|
|
155
184
|
this.closedError = null;
|
|
156
185
|
this.noiseSocket = null;
|
|
157
186
|
this.serverStaticKey = null;
|
|
187
|
+
this.writeChain = Promise.resolve();
|
|
188
|
+
this.readChain = Promise.resolve();
|
|
158
189
|
}
|
|
159
190
|
getServerStaticKey() {
|
|
160
|
-
if (!this.serverStaticKey) {
|
|
161
|
-
return null;
|
|
162
|
-
}
|
|
163
191
|
return this.serverStaticKey;
|
|
164
192
|
}
|
|
165
193
|
async fullHandshake(clientStaticKeyPair, ephemeralKeyPair, payload, protocolHeader, verifyCertificates) {
|
|
@@ -189,10 +217,12 @@ class WaNoiseSession {
|
|
|
189
217
|
await handshake.start(constants_2.NOISE_IK_NAME, protocolHeader);
|
|
190
218
|
await handshake.authenticate(serverStaticKey);
|
|
191
219
|
await handshake.authenticate(ephemeralKeyPair.pubKey);
|
|
192
|
-
const agreement1 = await
|
|
220
|
+
const [agreement1, agreement2] = await Promise.all([
|
|
221
|
+
_crypto_1.X25519.scalarMult(ephemeralKeyPair.privKey, serverStaticKey),
|
|
222
|
+
_crypto_1.X25519.scalarMult(clientStaticKeyPair.privKey, serverStaticKey)
|
|
223
|
+
]);
|
|
193
224
|
await handshake.mixIntoKey(agreement1);
|
|
194
225
|
const encryptedClientStatic = await handshake.encrypt(clientStaticKeyPair.pubKey);
|
|
195
|
-
const agreement2 = await _crypto_1.X25519.scalarMult(clientStaticKeyPair.privKey, serverStaticKey);
|
|
196
226
|
await handshake.mixIntoKey(agreement2);
|
|
197
227
|
const encryptedPayload = await handshake.encrypt(payload);
|
|
198
228
|
const clientHello = _proto_1.proto.HandshakeMessage.encode({
|
|
@@ -219,8 +249,12 @@ class WaNoiseSession {
|
|
|
219
249
|
}
|
|
220
250
|
const serverEphemeral = (0, bytes_1.toBytesView)(serverHello.ephemeral);
|
|
221
251
|
await handshake.authenticate(serverEphemeral);
|
|
222
|
-
|
|
223
|
-
|
|
252
|
+
const [dh1, dh2] = await Promise.all([
|
|
253
|
+
_crypto_1.X25519.scalarMult(ephemeralKeyPair.privKey, serverEphemeral),
|
|
254
|
+
_crypto_1.X25519.scalarMult(clientStaticKeyPair.privKey, serverEphemeral)
|
|
255
|
+
]);
|
|
256
|
+
await handshake.mixIntoKey(dh1);
|
|
257
|
+
await handshake.mixIntoKey(dh2);
|
|
224
258
|
await handshake.decrypt((0, bytes_1.toBytesView)(serverHello.payload));
|
|
225
259
|
this.serverStaticKey = serverStaticKey;
|
|
226
260
|
this.logger.info('noise resume handshake successful without fallback');
|
|
@@ -322,10 +356,17 @@ class WaNoiseSession {
|
|
|
322
356
|
this.logger.debug('decoding buffered post-handshake frames', {
|
|
323
357
|
count: this.handshakeInbox.length - this.handshakeInboxHead
|
|
324
358
|
});
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
this.
|
|
359
|
+
const start = this.handshakeInboxHead;
|
|
360
|
+
const frames = this.handshakeInbox.slice(start);
|
|
361
|
+
if (frames.length > 0) {
|
|
362
|
+
const decryptBatch = this.decryptFramesBatch(this.noiseSocket, frames);
|
|
363
|
+
this.readChain = this.readChain
|
|
364
|
+
.then(() => decryptBatch)
|
|
365
|
+
.then(() => { }, () => { });
|
|
366
|
+
const decrypted = await decryptBatch;
|
|
367
|
+
for (let i = 0; i < decrypted.length; i++) {
|
|
368
|
+
this.pendingDecryptedFrames.push(decrypted[i]);
|
|
369
|
+
}
|
|
329
370
|
}
|
|
330
371
|
this.handshakeInbox.length = this.handshakeInboxHead = 0;
|
|
331
372
|
}
|
|
@@ -9,12 +9,16 @@ class WaNoiseSocket {
|
|
|
9
9
|
this.writeCounter = 0;
|
|
10
10
|
this.readCounter = 0;
|
|
11
11
|
}
|
|
12
|
-
|
|
13
|
-
|
|
12
|
+
reserveWriteNonce() {
|
|
13
|
+
return (0, _crypto_1.buildNonce)(this.writeCounter++);
|
|
14
|
+
}
|
|
15
|
+
encrypt(nonce, frame, additionalData) {
|
|
14
16
|
return (0, _crypto_1.aesGcmEncrypt)(this.encryptKey, nonce, frame, additionalData);
|
|
15
17
|
}
|
|
16
|
-
|
|
17
|
-
|
|
18
|
+
reserveReadNonce() {
|
|
19
|
+
return (0, _crypto_1.buildNonce)(this.readCounter++);
|
|
20
|
+
}
|
|
21
|
+
decrypt(nonce, frame, additionalData) {
|
|
18
22
|
return (0, _crypto_1.aesGcmDecrypt)(this.decryptKey, nonce, frame, additionalData);
|
|
19
23
|
}
|
|
20
24
|
}
|
|
@@ -7,6 +7,7 @@ const constants_1 = require("../../protocol/constants");
|
|
|
7
7
|
const helpers_1 = require("../node/helpers");
|
|
8
8
|
const bytes_1 = require("../../util/bytes");
|
|
9
9
|
const primitives_1 = require("../../util/primitives");
|
|
10
|
+
const DIGITS_ONLY_RE = /^\d+$/;
|
|
10
11
|
function parseStreamControlNode(node) {
|
|
11
12
|
if (node.tag === constants_1.WA_STREAM_SIGNALING.XML_STREAM_END_TAG) {
|
|
12
13
|
return { kind: 'xmlstreamend' };
|
|
@@ -20,9 +21,12 @@ function parseStreamControlNode(node) {
|
|
|
20
21
|
? { kind: 'stream_error_replaced' }
|
|
21
22
|
: { kind: 'stream_error_device_removed' };
|
|
22
23
|
}
|
|
23
|
-
const
|
|
24
|
-
if (
|
|
25
|
-
|
|
24
|
+
const codeStr = node.attrs.code;
|
|
25
|
+
if (codeStr && DIGITS_ONLY_RE.test(codeStr)) {
|
|
26
|
+
const code = Number(codeStr);
|
|
27
|
+
if (Number.isSafeInteger(code)) {
|
|
28
|
+
return { kind: 'stream_error_code', code };
|
|
29
|
+
}
|
|
26
30
|
}
|
|
27
31
|
const ackNode = (0, helpers_1.findNodeChild)(node, constants_1.WA_STREAM_SIGNALING.ACK_TAG);
|
|
28
32
|
if (ackNode) {
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { WaAppStateStoreData, WaAppStateSyncKey } from './types';
|
|
2
|
+
type StoreRow = Readonly<Record<string, unknown>>;
|
|
3
|
+
export declare function encodeAppStateFingerprint(fingerprint: WaAppStateSyncKey['fingerprint']): Uint8Array | null;
|
|
4
|
+
export declare function decodeAppStateFingerprint(raw: unknown): WaAppStateSyncKey['fingerprint'] | undefined;
|
|
5
|
+
export declare function decodeAppStateSyncKeys(rows: readonly StoreRow[]): readonly WaAppStateSyncKey[];
|
|
6
|
+
export declare function decodeAppStateCollections(versionRows: readonly StoreRow[], valueRows: readonly StoreRow[]): WaAppStateStoreData['collections'];
|
|
7
|
+
export {};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export * from './constants';
|
|
2
|
-
export type { WaAppStateSyncOptions } from './types';
|
|
2
|
+
export type { AppStateCollectionName, WaAppStateStoreData, WaAppStateSyncKey, WaAppStateSyncOptions } from './types';
|
|
3
|
+
export { encodeAppStateFingerprint, decodeAppStateFingerprint, decodeAppStateCollections, decodeAppStateSyncKeys } from './encoding';
|
|
3
4
|
export * from './utils';
|
|
4
5
|
export { WaAppStateCrypto } from './WaAppStateCrypto';
|
|
5
|
-
export {
|
|
6
|
-
export { parseCollectionState, parseSyncResponse, type CollectionResponsePayload } from './WaAppStateSyncResponseParser';
|
|
6
|
+
export { parseSyncResponse } from './WaAppStateSyncResponseParser';
|
|
7
7
|
export { WaAppStateSyncClient } from './WaAppStateSyncClient';
|
|
@@ -2,8 +2,6 @@ import type { AppStateCollectionName, WaAppStateSyncKey } from './types';
|
|
|
2
2
|
import type { WaMediaTransferClient } from '../media/WaMediaTransferClient';
|
|
3
3
|
import type { Proto } from '..';
|
|
4
4
|
export declare function parseCollectionName(value: string | undefined): AppStateCollectionName | null;
|
|
5
|
-
export declare function keyDeviceId(keyId: Uint8Array): number | null;
|
|
6
5
|
export declare function keyEpoch(keyId: Uint8Array): number;
|
|
7
6
|
export declare function pickActiveSyncKey(keys: Iterable<WaAppStateSyncKey>): WaAppStateSyncKey | null;
|
|
8
|
-
export declare function toNetworkOrder64(value: number): Uint8Array;
|
|
9
7
|
export declare function downloadExternalBlobReference(mediaTransfer: WaMediaTransferClient, reference: Proto.IExternalBlobReference): Promise<Uint8Array>;
|
|
@@ -10,5 +10,5 @@ interface WaAuthCredentialsFlowArgs {
|
|
|
10
10
|
}
|
|
11
11
|
export declare function loadOrCreateCredentials(args: WaAuthCredentialsFlowArgs): Promise<WaAuthCredentials>;
|
|
12
12
|
export declare function persistCredentials(args: WaAuthCredentialsFlowArgs, credentials: WaAuthCredentials): Promise<void>;
|
|
13
|
-
export declare function buildCommsConfig(logger: Logger, credentials: WaAuthCredentials, socketOptions: WaAuthSocketOptions, clientOptions: Pick<WaAuthClientOptions, 'deviceBrowser' | 'deviceOsDisplayName' | 'requireFullSync'>): WaCommsConfig;
|
|
13
|
+
export declare function buildCommsConfig(logger: Logger, credentials: WaAuthCredentials, socketOptions: WaAuthSocketOptions, clientOptions: Pick<WaAuthClientOptions, 'deviceBrowser' | 'deviceOsDisplayName' | 'requireFullSync' | 'version'>): WaCommsConfig;
|
|
14
14
|
export {};
|
|
@@ -32,6 +32,7 @@ export interface WaAuthClientOptions {
|
|
|
32
32
|
readonly devicePlatform?: string;
|
|
33
33
|
readonly deviceOsDisplayName?: string;
|
|
34
34
|
readonly requireFullSync?: boolean;
|
|
35
|
+
readonly version?: string;
|
|
35
36
|
}
|
|
36
37
|
export interface WaSuccessPersistAttributes {
|
|
37
38
|
readonly meLid?: string;
|