zapo-js 0.1.2 → 0.3.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 +16 -4
- package/dist/appstate/WaAppStateCrypto.js +50 -42
- package/dist/appstate/WaAppStateSyncClient.js +215 -133
- package/dist/appstate/{store/sqlite.js → encoding.js} +13 -8
- package/dist/appstate/index.js +9 -7
- package/dist/appstate/utils.js +0 -5
- package/dist/auth/WaAuthClient.js +55 -57
- package/dist/auth/credentials-flow.js +195 -0
- package/dist/auth/index.js +1 -6
- package/dist/auth/pairing/WaPairingFlow.js +39 -32
- package/dist/auth/pairing/{WaPairingCodeCrypto.js → pairing-code-crypto.js} +35 -17
- package/dist/client/WaClient.js +338 -174
- package/dist/client/WaClientFactory.js +399 -66
- package/dist/client/connection/WaConnectionManager.js +23 -11
- package/dist/client/coordinators/WaAbPropsCoordinator.js +141 -0
- package/dist/client/coordinators/WaBusinessCoordinator.js +232 -0
- package/dist/client/coordinators/WaEmailCoordinator.js +63 -0
- package/dist/client/coordinators/WaGroupCoordinator.js +11 -7
- package/dist/client/coordinators/WaIncomingNodeCoordinator.js +34 -8
- package/dist/client/coordinators/WaMessageDispatchCoordinator.js +341 -118
- package/dist/client/coordinators/WaOfflineResumeCoordinator.js +114 -0
- package/dist/client/coordinators/WaPassiveTasksCoordinator.js +97 -36
- package/dist/client/coordinators/WaPrivacyCoordinator.js +134 -0
- package/dist/client/coordinators/WaProfileCoordinator.js +214 -0
- package/dist/client/coordinators/WaRetryCoordinator.js +184 -30
- package/dist/client/coordinators/WaStreamControlCoordinator.js +18 -11
- package/dist/client/coordinators/WaTrustedContactTokenCoordinator.js +184 -0
- package/dist/client/dirty.js +41 -21
- package/dist/client/events/abprops.js +43 -0
- 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 +38 -0
- package/dist/client/events/registration.js +42 -0
- package/dist/client/history-sync.js +50 -9
- package/dist/client/incoming.js +74 -7
- package/dist/client/mailbox.js +40 -23
- package/dist/client/media.js +243 -0
- package/dist/client/messages.js +245 -92
- 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 +5 -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 +24 -8
- package/dist/crypto/core/xeddsa.js +57 -0
- package/dist/crypto/curves/X25519.js +43 -6
- package/dist/crypto/curves/constants.js +2 -1
- 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 +40 -32
- package/dist/esm/appstate/WaAppStateSyncClient.js +206 -124
- package/dist/esm/appstate/{store/sqlite.js → encoding.js} +13 -8
- package/dist/esm/appstate/index.js +2 -2
- package/dist/esm/appstate/{WaAppStateSyncResponseParser.js → response-parser.js} +1 -1
- package/dist/esm/appstate/utils.js +2 -5
- package/dist/esm/auth/WaAuthClient.js +52 -54
- package/dist/esm/auth/credentials-flow.js +190 -0
- package/dist/esm/auth/index.js +0 -2
- package/dist/esm/auth/pairing/WaPairingFlow.js +39 -32
- package/dist/esm/auth/pairing/{WaPairingCodeCrypto.js → pairing-code-crypto.js} +26 -10
- package/dist/esm/client/WaClient.js +339 -175
- package/dist/esm/client/WaClientFactory.js +401 -68
- package/dist/esm/client/connection/WaConnectionManager.js +23 -11
- package/dist/esm/client/coordinators/WaAbPropsCoordinator.js +137 -0
- package/dist/esm/client/coordinators/WaBusinessCoordinator.js +229 -0
- package/dist/esm/client/coordinators/WaEmailCoordinator.js +60 -0
- package/dist/esm/client/coordinators/WaGroupCoordinator.js +11 -7
- package/dist/esm/client/coordinators/WaIncomingNodeCoordinator.js +36 -10
- package/dist/esm/client/coordinators/WaMessageDispatchCoordinator.js +337 -114
- package/dist/esm/client/coordinators/WaOfflineResumeCoordinator.js +110 -0
- package/dist/esm/client/coordinators/WaPassiveTasksCoordinator.js +97 -36
- package/dist/esm/client/coordinators/WaPrivacyCoordinator.js +131 -0
- package/dist/esm/client/coordinators/WaProfileCoordinator.js +211 -0
- package/dist/esm/client/coordinators/WaRetryCoordinator.js +186 -32
- package/dist/esm/client/coordinators/WaStreamControlCoordinator.js +19 -12
- package/dist/esm/client/coordinators/WaTrustedContactTokenCoordinator.js +180 -0
- package/dist/esm/client/dirty.js +41 -21
- package/dist/esm/client/events/abprops.js +40 -0
- 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 +35 -0
- package/dist/esm/client/events/registration.js +39 -0
- package/dist/esm/client/history-sync.js +50 -9
- package/dist/esm/client/incoming.js +74 -8
- package/dist/esm/client/mailbox.js +40 -23
- package/dist/esm/client/media.js +234 -0
- package/dist/esm/client/messages.js +244 -91
- 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 +3 -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 +23 -7
- package/dist/esm/crypto/core/xeddsa.js +53 -0
- package/dist/esm/crypto/curves/X25519.js +45 -8
- package/dist/esm/crypto/curves/constants.js +1 -0
- 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 +80 -0
- package/dist/esm/media/WaMediaCrypto.js +332 -55
- package/dist/esm/media/WaMediaTransferClient.js +69 -220
- package/dist/esm/media/constants.js +4 -1
- package/dist/esm/media/processor.js +1 -0
- package/dist/esm/message/WaMessageClient.js +26 -19
- package/dist/esm/message/addon-crypto.js +130 -3
- package/dist/esm/message/content.js +206 -14
- package/dist/esm/message/icdc.js +76 -0
- package/dist/esm/message/incoming.js +38 -24
- package/dist/esm/message/phash.js +35 -13
- package/dist/esm/message/reporting-token.js +17 -30
- package/dist/esm/message/use-case-secret.js +1 -1
- package/dist/esm/protocol/abprops.js +159 -0
- package/dist/esm/protocol/appstate.js +9 -40
- package/dist/esm/protocol/browser.js +24 -18
- package/dist/esm/protocol/constants.js +8 -4
- package/dist/esm/protocol/defaults.js +6 -0
- package/dist/esm/protocol/email.js +30 -0
- package/dist/esm/protocol/index.js +1 -2
- package/dist/esm/protocol/jid.js +142 -39
- package/dist/esm/protocol/message.js +61 -1
- package/dist/esm/protocol/nodes.js +8 -2
- package/dist/esm/protocol/notification.js +9 -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/reason.js +1 -1
- package/dist/esm/retry/replay.js +11 -7
- package/dist/esm/retry/tracker.js +50 -12
- package/dist/esm/signal/api/SignalDeviceSyncApi.js +52 -32
- package/dist/esm/signal/api/SignalDigestSyncApi.js +21 -15
- package/dist/esm/signal/api/SignalIdentitySyncApi.js +30 -15
- package/dist/esm/signal/api/SignalMissingPreKeysSyncApi.js +19 -8
- package/dist/esm/signal/api/SignalRotateKeyApi.js +4 -2
- package/dist/esm/signal/api/SignalSessionSyncApi.js +17 -8
- 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 +5 -45
- package/dist/esm/signal/crypto/constants.js +0 -4
- package/dist/esm/signal/{store/sqlite.js → encoding.js} +40 -29
- package/dist/esm/signal/group/SenderKeyChain.js +3 -3
- package/dist/esm/signal/group/SenderKeyCodec.js +8 -8
- package/dist/esm/signal/group/SenderKeyManager.js +131 -109
- package/dist/esm/signal/index.js +1 -0
- package/dist/esm/signal/registration/keygen.js +8 -5
- package/dist/esm/signal/registration/utils.js +3 -2
- package/dist/esm/signal/session/SignalProtocol.js +158 -81
- package/dist/esm/signal/session/SignalRatchet.js +21 -10
- package/dist/esm/signal/session/SignalSerializer.js +5 -6
- package/dist/esm/signal/session/SignalSession.js +11 -9
- package/dist/esm/signal/session/resolver.js +140 -105
- package/dist/esm/store/contracts/identity.store.js +1 -0
- package/dist/esm/store/contracts/message-secret.store.js +1 -0
- package/dist/esm/store/contracts/pre-key.store.js +1 -0
- package/dist/esm/store/contracts/privacy-token.store.js +1 -0
- package/dist/esm/store/contracts/session.store.js +1 -0
- package/dist/esm/store/createStore.js +143 -193
- package/dist/esm/store/index.js +5 -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/identity.lock.js +16 -0
- package/dist/esm/store/locks/message-secret.lock.js +17 -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/pre-key.lock.js +27 -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/session.lock.js +19 -0
- package/dist/esm/store/locks/signal.lock.js +39 -0
- package/dist/esm/store/locks/thread.lock.js +21 -0
- package/dist/esm/store/noop.store.js +21 -1
- package/dist/esm/store/providers/memory/appstate.store.js +22 -24
- package/dist/esm/store/providers/memory/device-list.store.js +13 -5
- package/dist/esm/store/providers/memory/identity.store.js +31 -0
- package/dist/esm/store/providers/memory/message-secret.store.js +81 -0
- package/dist/esm/store/providers/memory/participants.store.js +3 -0
- package/dist/esm/store/providers/memory/pre-key.store.js +97 -0
- package/dist/esm/store/providers/memory/privacy-token.store.js +43 -0
- package/dist/esm/store/providers/memory/retry.store.js +99 -10
- package/dist/esm/store/providers/memory/sender-key.store.js +6 -1
- package/dist/esm/store/providers/memory/session.store.js +45 -0
- package/dist/esm/store/providers/memory/signal.store.js +1 -147
- package/dist/esm/transport/WaComms.js +7 -4
- package/dist/esm/transport/WaWebSocket.js +9 -7
- 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/index.js +6 -0
- package/dist/esm/transport/keepalive/WaKeepAlive.js +17 -8
- package/dist/esm/transport/node/WaMobileTcpSocket.js +114 -0
- package/dist/esm/transport/node/WaNodeOrchestrator.js +37 -22
- package/dist/esm/transport/node/builders/abprops.js +20 -0
- package/dist/esm/transport/node/builders/business.js +129 -0
- package/dist/esm/transport/node/builders/device.js +11 -0
- package/dist/esm/transport/node/builders/email.js +65 -0
- package/dist/esm/transport/node/builders/global.js +370 -0
- package/dist/esm/transport/node/builders/message.js +63 -239
- package/dist/esm/transport/node/builders/offline.js +14 -0
- package/dist/esm/transport/node/builders/pairing.js +0 -24
- package/dist/esm/transport/node/builders/prekeys.js +37 -40
- package/dist/esm/transport/node/builders/presence.js +13 -0
- package/dist/esm/transport/node/builders/privacy-token.js +37 -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 +11 -23
- package/dist/esm/transport/node/builders/usync.js +6 -2
- package/dist/esm/transport/node/helpers.js +43 -1
- package/dist/esm/transport/node/mex/argo-decoder.js +152 -0
- package/dist/esm/transport/node/mex/client.js +83 -0
- package/dist/esm/transport/node/mex/persist-ids.js +10 -0
- 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 +24 -19
- package/dist/esm/transport/noise/WaFrameCodec.js +2 -2
- package/dist/esm/transport/noise/WaMobileClientPayload.js +53 -0
- package/dist/esm/transport/noise/WaNoiseCert.js +9 -27
- package/dist/esm/transport/noise/WaNoiseSession.js +76 -34
- 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 +84 -0
- package/dist/media/WaMediaCrypto.js +328 -51
- package/dist/media/WaMediaTransferClient.js +72 -253
- package/dist/media/constants.js +5 -2
- package/dist/media/processor.js +2 -0
- package/dist/message/WaMessageClient.js +26 -19
- package/dist/message/addon-crypto.js +131 -0
- package/dist/message/content.js +211 -14
- package/dist/message/icdc.js +81 -0
- package/dist/message/incoming.js +38 -24
- package/dist/message/phash.js +35 -13
- package/dist/message/reporting-token.js +16 -30
- package/dist/message/use-case-secret.js +1 -1
- package/dist/protocol/abprops.js +163 -0
- package/dist/protocol/appstate.js +10 -41
- package/dist/protocol/browser.js +25 -18
- package/dist/protocol/constants.js +33 -2
- package/dist/protocol/defaults.js +6 -0
- package/dist/protocol/email.js +33 -0
- package/dist/protocol/index.js +8 -5
- package/dist/protocol/jid.js +149 -39
- package/dist/protocol/message.js +62 -2
- package/dist/protocol/nodes.js +8 -2
- package/dist/protocol/notification.js +10 -2
- 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/reason.js +1 -1
- package/dist/retry/replay.js +10 -6
- package/dist/retry/tracker.js +50 -12
- package/dist/signal/api/SignalDeviceSyncApi.js +51 -31
- package/dist/signal/api/SignalDigestSyncApi.js +21 -15
- package/dist/signal/api/SignalIdentitySyncApi.js +29 -14
- 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 +2 -44
- package/dist/signal/crypto/constants.js +1 -5
- package/dist/signal/{store/sqlite.js → encoding.js} +41 -25
- package/dist/signal/group/SenderKeyChain.js +2 -2
- package/dist/signal/group/SenderKeyCodec.js +8 -8
- package/dist/signal/group/SenderKeyManager.js +130 -108
- package/dist/signal/index.js +13 -1
- package/dist/signal/registration/keygen.js +7 -4
- package/dist/signal/registration/utils.js +3 -2
- package/dist/signal/session/SignalProtocol.js +158 -81
- package/dist/signal/session/SignalRatchet.js +19 -8
- package/dist/signal/session/SignalSerializer.js +5 -6
- package/dist/signal/session/SignalSession.js +11 -9
- package/dist/signal/session/resolver.js +138 -103
- package/dist/store/contracts/identity.store.js +2 -0
- package/dist/store/contracts/message-secret.store.js +2 -0
- package/dist/store/contracts/pre-key.store.js +2 -0
- package/dist/store/contracts/privacy-token.store.js +2 -0
- package/dist/store/contracts/session.store.js +2 -0
- package/dist/store/createStore.js +142 -192
- package/dist/store/index.js +23 -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/identity.lock.js +19 -0
- package/dist/store/locks/message-secret.lock.js +20 -0
- package/dist/store/locks/message.lock.js +24 -0
- package/dist/store/locks/participants.lock.js +23 -0
- package/dist/store/locks/pre-key.lock.js +30 -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/session.lock.js +22 -0
- package/dist/store/locks/signal.lock.js +42 -0
- package/dist/store/locks/thread.lock.js +24 -0
- package/dist/store/noop.store.js +22 -2
- package/dist/store/providers/memory/appstate.store.js +22 -24
- package/dist/store/providers/memory/device-list.store.js +13 -5
- package/dist/store/providers/memory/identity.store.js +35 -0
- package/dist/store/providers/memory/message-secret.store.js +85 -0
- package/dist/store/providers/memory/participants.store.js +3 -0
- package/dist/store/providers/memory/pre-key.store.js +101 -0
- package/dist/store/providers/memory/privacy-token.store.js +47 -0
- package/dist/store/providers/memory/retry.store.js +98 -9
- package/dist/store/providers/memory/sender-key.store.js +6 -1
- package/dist/store/providers/memory/session.store.js +49 -0
- package/dist/store/providers/memory/signal.store.js +1 -147
- package/dist/transport/WaComms.js +7 -4
- package/dist/transport/WaWebSocket.js +9 -7
- 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/index.js +17 -1
- package/dist/transport/keepalive/WaKeepAlive.js +17 -8
- package/dist/transport/node/WaMobileTcpSocket.js +118 -0
- package/dist/transport/node/WaNodeOrchestrator.js +36 -21
- package/dist/transport/node/builders/abprops.js +23 -0
- package/dist/transport/node/builders/business.js +137 -0
- package/dist/transport/node/builders/device.js +14 -0
- package/dist/transport/node/builders/email.js +72 -0
- package/dist/transport/node/builders/global.js +375 -0
- package/dist/transport/node/builders/message.js +64 -245
- package/dist/transport/node/builders/offline.js +17 -0
- package/dist/transport/node/builders/pairing.js +0 -26
- package/dist/transport/node/builders/prekeys.js +36 -39
- package/dist/transport/node/builders/presence.js +16 -0
- package/dist/transport/node/builders/privacy-token.js +42 -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 +10 -22
- package/dist/transport/node/builders/usync.js +6 -2
- package/dist/transport/node/helpers.js +46 -1
- package/dist/transport/node/mex/argo-decoder.js +189 -0
- package/dist/transport/node/mex/client.js +86 -0
- package/dist/transport/node/mex/persist-ids.js +13 -0
- package/dist/transport/node/usync.js +2 -32
- package/dist/transport/node/xml.js +35 -14
- package/dist/transport/noise/WaClientPayload.js +26 -21
- package/dist/transport/noise/WaFrameCodec.js +1 -1
- package/dist/transport/noise/WaMobileClientPayload.js +56 -0
- package/dist/transport/noise/WaNoiseCert.js +8 -26
- package/dist/transport/noise/WaNoiseSession.js +75 -33
- package/dist/transport/noise/WaNoiseSocket.js +8 -4
- package/dist/transport/stream/parse.js +7 -3
- package/dist/types/appstate/WaAppStateCrypto.d.ts +11 -8
- package/dist/types/appstate/WaAppStateSyncClient.d.ts +6 -2
- package/dist/types/appstate/encoding.d.ts +7 -0
- package/dist/types/appstate/index.d.ts +3 -3
- package/dist/types/appstate/{WaAppStateSyncResponseParser.d.ts → response-parser.d.ts} +1 -1
- package/dist/types/appstate/types.d.ts +1 -1
- package/dist/types/appstate/utils.d.ts +0 -2
- package/dist/types/auth/WaAuthClient.d.ts +9 -3
- package/dist/types/auth/credentials-flow.d.ts +20 -0
- package/dist/types/auth/index.d.ts +0 -2
- package/dist/types/auth/pairing/WaPairingFlow.d.ts +3 -2
- package/dist/types/auth/pairing/{WaPairingCodeCrypto.d.ts → pairing-code-crypto.d.ts} +6 -1
- package/dist/types/auth/types.d.ts +41 -0
- package/dist/types/client/WaClient.d.ts +44 -18
- package/dist/types/client/WaClientFactory.d.ts +22 -8
- package/dist/types/client/connection/WaConnectionManager.d.ts +2 -0
- package/dist/types/client/coordinators/WaAbPropsCoordinator.d.ts +26 -0
- package/dist/types/client/coordinators/WaBusinessCoordinator.d.ts +57 -0
- package/dist/types/client/coordinators/WaEmailCoordinator.d.ts +24 -0
- package/dist/types/client/coordinators/WaIncomingNodeCoordinator.d.ts +9 -2
- package/dist/types/client/coordinators/WaMessageDispatchCoordinator.d.ts +29 -2
- package/dist/types/client/coordinators/WaOfflineResumeCoordinator.d.ts +31 -0
- package/dist/types/client/coordinators/WaPassiveTasksCoordinator.d.ts +16 -1
- package/dist/types/client/coordinators/WaPrivacyCoordinator.d.ts +26 -0
- package/dist/types/client/coordinators/WaProfileCoordinator.d.ts +38 -0
- package/dist/types/client/coordinators/WaRetryCoordinator.d.ts +12 -0
- package/dist/types/client/coordinators/WaStreamControlCoordinator.d.ts +3 -2
- package/dist/types/client/coordinators/WaTrustedContactTokenCoordinator.d.ts +55 -0
- package/dist/types/client/dirty.d.ts +3 -1
- package/dist/types/client/events/abprops.d.ts +14 -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/events/registration.d.ts +17 -0
- package/dist/types/client/history-sync.d.ts +9 -6
- package/dist/types/client/incoming.d.ts +9 -2
- package/dist/types/client/index.d.ts +1 -1
- package/dist/types/client/mailbox.d.ts +5 -5
- package/dist/types/client/media.d.ts +31 -0
- package/dist/types/client/messages.d.ts +3 -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 +151 -4
- package/dist/types/crypto/core/index.d.ts +3 -2
- package/dist/types/crypto/core/nonce.d.ts +2 -0
- package/dist/types/crypto/core/primitives.d.ts +1 -2
- package/dist/types/crypto/core/random.d.ts +2 -1
- package/dist/types/crypto/core/xeddsa.d.ts +2 -0
- package/dist/types/crypto/curves/constants.d.ts +1 -0
- package/dist/types/crypto/index.d.ts +2 -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 +6 -3
- package/dist/types/infra/log/ConsoleLogger.d.ts +1 -1
- package/dist/types/infra/log/PinoLogger.d.ts +1 -1
- 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 +11 -0
- package/dist/types/media/WaMediaCrypto.d.ts +16 -6
- package/dist/types/media/WaMediaTransferClient.d.ts +6 -23
- package/dist/types/media/constants.d.ts +3 -1
- package/dist/types/media/index.d.ts +2 -1
- package/dist/types/media/processor.d.ts +28 -0
- package/dist/types/media/types.d.ts +19 -5
- package/dist/types/message/addon-crypto.d.ts +34 -3
- package/dist/types/message/content.d.ts +11 -1
- 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 +42 -11
- package/dist/types/protocol/abprops.d.ts +142 -0
- package/dist/types/protocol/appstate.d.ts +0 -11
- package/dist/types/protocol/browser.d.ts +1 -0
- package/dist/types/protocol/constants.d.ts +12 -4
- package/dist/types/protocol/defaults.d.ts +6 -0
- package/dist/types/protocol/email.d.ts +32 -0
- package/dist/types/protocol/index.d.ts +1 -2
- package/dist/types/protocol/jid.d.ts +20 -2
- package/dist/types/protocol/message.d.ts +60 -0
- package/dist/types/protocol/nodes.d.ts +6 -0
- package/dist/types/protocol/notification.d.ts +8 -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 +31 -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/reason.d.ts +1 -1
- 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 +9 -0
- package/dist/types/signal/api/SignalIdentitySyncApi.d.ts +5 -3
- 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/crypto/WaAdvSignature.d.ts +0 -2
- package/dist/types/signal/crypto/constants.d.ts +0 -1
- package/dist/types/signal/{store/sqlite.d.ts → encoding.d.ts} +9 -3
- package/dist/types/signal/group/SenderKeyChain.d.ts +1 -1
- package/dist/types/signal/group/SenderKeyManager.d.ts +17 -7
- package/dist/types/signal/index.d.ts +2 -0
- package/dist/types/signal/registration/utils.d.ts +2 -1
- package/dist/types/signal/session/SignalProtocol.d.ts +21 -6
- package/dist/types/signal/session/SignalSerializer.d.ts +2 -1
- package/dist/types/signal/session/resolver.d.ts +11 -4
- package/dist/types/signal/types.d.ts +16 -4
- package/dist/types/store/contracts/appstate.store.d.ts +1 -1
- package/dist/types/store/contracts/identity.store.d.ts +11 -0
- package/dist/types/store/contracts/message-secret.store.d.ts +16 -0
- package/dist/types/store/contracts/pre-key.store.d.ts +13 -0
- 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/session.store.d.ts +14 -0
- package/dist/types/store/contracts/signal.store.d.ts +1 -27
- package/dist/types/store/createStore.d.ts +1 -1
- package/dist/types/store/index.d.ts +12 -12
- 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/identity.lock.d.ts +3 -0
- package/dist/types/store/locks/message-secret.lock.d.ts +3 -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/pre-key.lock.d.ts +3 -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/session.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/noop.store.d.ts +4 -0
- package/dist/types/store/providers/memory/appstate.store.d.ts +1 -1
- package/dist/types/store/providers/memory/identity.store.d.ts +18 -0
- package/dist/types/store/providers/memory/message-secret.store.d.ts +21 -0
- package/dist/types/store/providers/memory/pre-key.store.d.ts +23 -0
- package/dist/types/store/providers/memory/privacy-token.store.d.ts +13 -0
- package/dist/types/store/providers/memory/retry.store.d.ts +15 -1
- package/dist/types/store/providers/memory/session.store.d.ts +21 -0
- package/dist/types/store/providers/memory/signal.store.d.ts +2 -43
- package/dist/types/store/providers/memory/thread.store.d.ts +1 -1
- package/dist/types/store/types.d.ts +69 -61
- package/dist/types/transport/WaWebSocket.d.ts +1 -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/index.d.ts +8 -1
- package/dist/types/transport/keepalive/WaKeepAlive.d.ts +4 -1
- package/dist/types/transport/node/WaMobileTcpSocket.d.ts +18 -0
- package/dist/types/transport/node/WaNodeOrchestrator.d.ts +9 -6
- package/dist/types/transport/node/builders/abprops.d.ts +5 -0
- package/dist/types/transport/node/builders/business.d.ts +29 -0
- package/dist/types/transport/node/builders/device.d.ts +2 -0
- package/dist/types/transport/node/builders/email.d.ts +11 -0
- package/dist/types/transport/node/builders/global.d.ts +102 -0
- package/dist/types/transport/node/builders/message.d.ts +8 -7
- package/dist/types/transport/node/builders/offline.d.ts +2 -0
- package/dist/types/transport/node/builders/pairing.d.ts +0 -2
- package/dist/types/transport/node/builders/prekeys.d.ts +4 -3
- package/dist/types/transport/node/builders/presence.d.ts +6 -0
- 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 +8 -0
- package/dist/types/transport/node/mex/argo-decoder.d.ts +11 -0
- package/dist/types/transport/node/mex/client.d.ts +18 -0
- package/dist/types/transport/node/mex/persist-ids.d.ts +14 -0
- package/dist/types/transport/noise/WaMobileClientPayload.d.ts +29 -0
- package/dist/types/transport/noise/WaNoiseCert.d.ts +7 -1
- package/dist/types/transport/noise/WaNoiseSession.d.ts +4 -2
- package/dist/types/transport/noise/WaNoiseSocket.d.ts +4 -2
- package/dist/types/transport/types.d.ts +8 -0
- 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 +34 -10
- package/proto/index.js +1 -1
- package/dist/auth/flow/WaAuthCredentialsFlow.js +0 -130
- package/dist/auth/pairing/constants.js +0 -5
- package/dist/client/connection/WaKeyShareCoordinator.js +0 -63
- package/dist/crypto/core/constants.js +0 -4
- package/dist/esm/auth/flow/WaAuthCredentialsFlow.js +0 -125
- package/dist/esm/auth/pairing/constants.js +0 -2
- package/dist/esm/client/connection/WaKeyShareCoordinator.js +0 -59
- 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/esm/transport/node/builders/index.js +0 -8
- 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/transport/node/builders/index.js +0 -42
- package/dist/types/appstate/store/sqlite.d.ts +0 -7
- package/dist/types/auth/flow/WaAuthCredentialsFlow.d.ts +0 -14
- package/dist/types/auth/pairing/constants.d.ts +0 -2
- package/dist/types/client/connection/WaKeyShareCoordinator.d.ts +0 -14
- package/dist/types/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
- package/dist/types/transport/node/builders/index.d.ts +0 -8
- /package/dist/appstate/{WaAppStateSyncResponseParser.js → response-parser.js} +0 -0
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { APP_STATE_DEFAULT_COLLECTION_VERSION, APP_STATE_DEFAULT_COLLECTIONS, APP_STATE_EMPTY_LT_HASH } from './constants.js';
|
|
2
|
+
import { parseSyncResponse } from './response-parser.js';
|
|
2
3
|
import { WaAppStateCrypto } from './WaAppStateCrypto.js';
|
|
3
|
-
import {
|
|
4
|
+
import { randomBytesAsync, randomIntAsync } from '../crypto/index.js';
|
|
4
5
|
import { proto } from '../proto.js';
|
|
5
6
|
import { WA_APP_STATE_COLLECTION_STATES, WA_DEFAULTS, WA_IQ_TYPES, WA_NODE_TAGS, WA_XMLNS } from '../protocol/constants.js';
|
|
6
7
|
import { parseSignalAddressFromJid } from '../protocol/jid.js';
|
|
7
8
|
import { assertIqResult } from '../transport/node/query.js';
|
|
8
|
-
import { decodeProtoBytes } from '../util/bytes.js';
|
|
9
|
-
import { bytesToHex, uint8Equal } from '../util/bytes.js';
|
|
9
|
+
import { bytesToHex, decodeProtoBytes, uint8Equal } from '../util/bytes.js';
|
|
10
10
|
import { longToNumber } from '../util/primitives.js';
|
|
11
11
|
export class WaAppStateMissingKeyError extends Error {
|
|
12
12
|
constructor(message, keyId, collection) {
|
|
@@ -25,7 +25,8 @@ export class WaAppStateSyncClient {
|
|
|
25
25
|
this.hostDomain = options.hostDomain ?? WA_DEFAULTS.HOST_DOMAIN;
|
|
26
26
|
this.defaultTimeoutMs = options.defaultTimeoutMs ?? WA_DEFAULTS.APP_STATE_SYNC_TIMEOUT_MS;
|
|
27
27
|
this.onMissingKeys = options.onMissingKeys;
|
|
28
|
-
this.crypto = new WaAppStateCrypto();
|
|
28
|
+
this.crypto = new WaAppStateCrypto(undefined, options.skipMacVerification === true);
|
|
29
|
+
this.mobilePrimary = options.mobilePrimary ?? false;
|
|
29
30
|
this.syncContext = null;
|
|
30
31
|
this.syncPromise = null;
|
|
31
32
|
}
|
|
@@ -33,6 +34,28 @@ export class WaAppStateSyncClient {
|
|
|
33
34
|
this.logger.trace('app-state export requested');
|
|
34
35
|
return this.store.exportData();
|
|
35
36
|
}
|
|
37
|
+
async ensureInitialSyncKey() {
|
|
38
|
+
const existing = await this.store.getActiveSyncKey();
|
|
39
|
+
if (existing) {
|
|
40
|
+
return existing;
|
|
41
|
+
}
|
|
42
|
+
const keyIdBytes = await randomBytesAsync(2);
|
|
43
|
+
const keyData = await randomBytesAsync(32);
|
|
44
|
+
const rawId = await randomIntAsync(0, 4294967295);
|
|
45
|
+
const key = {
|
|
46
|
+
keyId: keyIdBytes,
|
|
47
|
+
keyData,
|
|
48
|
+
timestamp: Date.now(),
|
|
49
|
+
fingerprint: { rawId, currentIndex: 0, deviceIndexes: [0] }
|
|
50
|
+
};
|
|
51
|
+
await this.store.upsertSyncKeys([key]);
|
|
52
|
+
this.crypto.clearCache();
|
|
53
|
+
this.logger.info('app-state initial sync key generated (mobile primary)', {
|
|
54
|
+
keyId: bytesToHex(keyIdBytes),
|
|
55
|
+
rawId
|
|
56
|
+
});
|
|
57
|
+
return key;
|
|
58
|
+
}
|
|
36
59
|
async importSyncKeys(keys) {
|
|
37
60
|
this.logger.debug('app-state importing sync keys', { count: keys.length });
|
|
38
61
|
const inserted = await this.store.upsertSyncKeys(keys);
|
|
@@ -164,7 +187,12 @@ export class WaAppStateSyncClient {
|
|
|
164
187
|
}
|
|
165
188
|
}
|
|
166
189
|
async syncCollectionsRound(collections, pendingByCollection, options) {
|
|
167
|
-
const
|
|
190
|
+
const activeSyncKey = await this.store.getActiveSyncKey();
|
|
191
|
+
const requestPromises = new Array(collections.length);
|
|
192
|
+
for (let index = 0; index < collections.length; index += 1) {
|
|
193
|
+
requestPromises[index] = this.buildCollectionSyncRequest(collections[index], pendingByCollection, activeSyncKey);
|
|
194
|
+
}
|
|
195
|
+
const requests = await Promise.all(requestPromises);
|
|
168
196
|
const collectionNodes = new Array(requests.length);
|
|
169
197
|
const outgoingContexts = new Map();
|
|
170
198
|
const skippedUploadCollections = new Set();
|
|
@@ -180,21 +208,26 @@ export class WaAppStateSyncClient {
|
|
|
180
208
|
}
|
|
181
209
|
const iqNode = this.buildSyncIqNode(collectionNodes);
|
|
182
210
|
const payloadByCollection = await this.fetchSyncPayloadByCollection(iqNode, options.timeoutMs ?? this.defaultTimeoutMs);
|
|
183
|
-
const
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
211
|
+
const collectionOutcomePromises = new Array(collections.length);
|
|
212
|
+
for (let index = 0; index < collections.length; index += 1) {
|
|
213
|
+
collectionOutcomePromises[index] = this.processCollectionRound({
|
|
214
|
+
collection: collections[index],
|
|
215
|
+
payloadByCollection,
|
|
216
|
+
pendingByCollection,
|
|
217
|
+
options,
|
|
218
|
+
outgoingContexts,
|
|
219
|
+
skippedUploadCollections
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
const collectionOutcomes = await Promise.all(collectionOutcomePromises);
|
|
191
223
|
const results = [];
|
|
192
224
|
const collectionsToRefetch = [];
|
|
193
225
|
const blockedCollections = [];
|
|
194
226
|
const missingKeyIds = [];
|
|
195
227
|
const missingKeyIdHexes = new Set();
|
|
196
228
|
let stateChanged = false;
|
|
197
|
-
for (
|
|
229
|
+
for (let index = 0; index < collectionOutcomes.length; index += 1) {
|
|
230
|
+
const entry = collectionOutcomes[index];
|
|
198
231
|
results.push(entry.result);
|
|
199
232
|
if (entry.shouldRefetch) {
|
|
200
233
|
collectionsToRefetch.push(entry.collection);
|
|
@@ -221,7 +254,7 @@ export class WaAppStateSyncClient {
|
|
|
221
254
|
blockedCollections
|
|
222
255
|
};
|
|
223
256
|
}
|
|
224
|
-
async buildCollectionSyncRequest(collection, pendingByCollection) {
|
|
257
|
+
async buildCollectionSyncRequest(collection, pendingByCollection, activeSyncKey) {
|
|
225
258
|
const collectionState = await this.getCollectionState(collection);
|
|
226
259
|
const hasPersistedState = collectionState.initialized;
|
|
227
260
|
const attrs = {
|
|
@@ -242,7 +275,7 @@ export class WaAppStateSyncClient {
|
|
|
242
275
|
});
|
|
243
276
|
}
|
|
244
277
|
else {
|
|
245
|
-
const outgoing = await this.buildOutgoingPatch(collection, collectionState, pendingMutations);
|
|
278
|
+
const outgoing = await this.buildOutgoingPatch(collection, collectionState, pendingMutations, activeSyncKey);
|
|
246
279
|
outgoingContext = outgoing.context;
|
|
247
280
|
children.push({
|
|
248
281
|
tag: WA_NODE_TAGS.PATCH,
|
|
@@ -273,7 +306,7 @@ export class WaAppStateSyncClient {
|
|
|
273
306
|
content: [
|
|
274
307
|
{
|
|
275
308
|
tag: WA_NODE_TAGS.SYNC,
|
|
276
|
-
attrs: {},
|
|
309
|
+
attrs: this.mobilePrimary ? { data_namespace: '3' } : {},
|
|
277
310
|
content: collectionNodes
|
|
278
311
|
}
|
|
279
312
|
]
|
|
@@ -328,14 +361,14 @@ export class WaAppStateSyncClient {
|
|
|
328
361
|
const snapshotBytes = await downloader(payload.collection, 'snapshot', payload.snapshotReference);
|
|
329
362
|
const snapshot = this.validateSnapshot(payload.collection, proto.SyncdSnapshot.decode(snapshotBytes));
|
|
330
363
|
const snapshotMutations = await this.applySnapshot(payload.collection, snapshot);
|
|
331
|
-
appliedMutations
|
|
364
|
+
appliedMutations.push(...snapshotMutations);
|
|
332
365
|
collectionStateChanged = true;
|
|
333
366
|
}
|
|
334
367
|
if (payload.patches.length > 0) {
|
|
335
368
|
const readyPatches = await this.resolveReadyPatches(payload, options);
|
|
336
369
|
for (const readyPatch of readyPatches) {
|
|
337
370
|
const patchMutations = await this.applyPatch(payload.collection, readyPatch);
|
|
338
|
-
appliedMutations
|
|
371
|
+
appliedMutations.push(...patchMutations);
|
|
339
372
|
collectionStateChanged = true;
|
|
340
373
|
}
|
|
341
374
|
}
|
|
@@ -424,13 +457,12 @@ export class WaAppStateSyncClient {
|
|
|
424
457
|
}
|
|
425
458
|
}
|
|
426
459
|
async resolveReadyPatches(payload, options) {
|
|
427
|
-
const sortedPatches = payload.patches
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
}
|
|
432
|
-
|
|
433
|
-
.map((entry) => entry.patch);
|
|
460
|
+
const sortedPatches = payload.patches.slice();
|
|
461
|
+
const sortVersions = new Map();
|
|
462
|
+
for (const patch of sortedPatches) {
|
|
463
|
+
sortVersions.set(patch, this.parseCollectionPatchVersion(payload.collection, patch));
|
|
464
|
+
}
|
|
465
|
+
sortedPatches.sort((left, right) => sortVersions.get(left) - sortVersions.get(right));
|
|
434
466
|
return Promise.all(sortedPatches.map(async (patch) => {
|
|
435
467
|
let readyPatch = patch;
|
|
436
468
|
if ((!readyPatch.mutations || readyPatch.mutations.length === 0) &&
|
|
@@ -453,11 +485,13 @@ export class WaAppStateSyncClient {
|
|
|
453
485
|
if (!snapshot.version?.version) {
|
|
454
486
|
throw new Error(`snapshot for ${collection} is missing version`);
|
|
455
487
|
}
|
|
456
|
-
if (!
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
488
|
+
if (!this.crypto.isMacVerificationSkipped) {
|
|
489
|
+
if (!snapshot.mac) {
|
|
490
|
+
throw new Error(`snapshot for ${collection} is missing mac`);
|
|
491
|
+
}
|
|
492
|
+
if (!snapshot.keyId?.id) {
|
|
493
|
+
throw new Error(`snapshot for ${collection} is missing keyId`);
|
|
494
|
+
}
|
|
461
495
|
}
|
|
462
496
|
return snapshot;
|
|
463
497
|
}
|
|
@@ -472,14 +506,16 @@ export class WaAppStateSyncClient {
|
|
|
472
506
|
if (!patch.version?.version) {
|
|
473
507
|
throw new Error(`patch for ${collection} is missing version`);
|
|
474
508
|
}
|
|
475
|
-
if (!
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
509
|
+
if (!this.crypto.isMacVerificationSkipped) {
|
|
510
|
+
if (!patch.snapshotMac) {
|
|
511
|
+
throw new Error(`patch for ${collection} is missing snapshotMac`);
|
|
512
|
+
}
|
|
513
|
+
if (!patch.patchMac) {
|
|
514
|
+
throw new Error(`patch for ${collection} is missing patchMac`);
|
|
515
|
+
}
|
|
516
|
+
if (!patch.keyId?.id) {
|
|
517
|
+
throw new Error(`patch for ${collection} is missing keyId`);
|
|
518
|
+
}
|
|
483
519
|
}
|
|
484
520
|
if (patch.mutations && patch.mutations.length > 0 && patch.externalMutations) {
|
|
485
521
|
throw new Error(`patch for ${collection} has inline and external mutations together`);
|
|
@@ -493,10 +529,13 @@ export class WaAppStateSyncClient {
|
|
|
493
529
|
}
|
|
494
530
|
async applySnapshot(collection, snapshot) {
|
|
495
531
|
const version = this.normalizeProtoLong(snapshot.version?.version, `snapshot.version.version (${collection})`);
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
532
|
+
let keyData = null;
|
|
533
|
+
if (!this.crypto.isMacVerificationSkipped) {
|
|
534
|
+
const keyId = decodeProtoBytes(snapshot.keyId?.id, `snapshot.keyId.id (${collection})`);
|
|
535
|
+
keyData = await this.getKeyData(keyId);
|
|
536
|
+
if (!keyData) {
|
|
537
|
+
throw new WaAppStateMissingKeyError(`missing snapshot key ${bytesToHex(keyId)} for ${collection}`, keyId, collection);
|
|
538
|
+
}
|
|
500
539
|
}
|
|
501
540
|
const indexValueMap = new Map();
|
|
502
541
|
const mutations = [];
|
|
@@ -517,10 +556,18 @@ export class WaAppStateSyncClient {
|
|
|
517
556
|
timestamp: this.normalizeProtoLong(decrypted.value?.timestamp, `snapshot.record.value.timestamp (${collection})`)
|
|
518
557
|
});
|
|
519
558
|
}
|
|
520
|
-
const
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
559
|
+
const ltHashInput = new Array(indexValueMap.size);
|
|
560
|
+
let ltHashInputIndex = 0;
|
|
561
|
+
for (const valueMac of indexValueMap.values()) {
|
|
562
|
+
ltHashInput[ltHashInputIndex] = valueMac;
|
|
563
|
+
ltHashInputIndex += 1;
|
|
564
|
+
}
|
|
565
|
+
const ltHash = await this.crypto.ltHashAdd(APP_STATE_EMPTY_LT_HASH, ltHashInput);
|
|
566
|
+
if (keyData !== null) {
|
|
567
|
+
const expectedSnapshotMac = await this.crypto.generateSnapshotMac(keyData, ltHash, version, collection);
|
|
568
|
+
if (!uint8Equal(expectedSnapshotMac, snapshot.mac)) {
|
|
569
|
+
throw new Error(`snapshot MAC mismatch for ${collection}`);
|
|
570
|
+
}
|
|
524
571
|
}
|
|
525
572
|
this.setCollectionState(collection, version, ltHash, indexValueMap);
|
|
526
573
|
return mutations;
|
|
@@ -531,10 +578,13 @@ export class WaAppStateSyncClient {
|
|
|
531
578
|
if (current.version !== patchVersion - 1) {
|
|
532
579
|
throw new Error(`patch version mismatch for ${collection}: local=${current.version}, incoming=${patchVersion}`);
|
|
533
580
|
}
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
581
|
+
let patchKeyData = null;
|
|
582
|
+
if (!this.crypto.isMacVerificationSkipped) {
|
|
583
|
+
const patchKeyId = decodeProtoBytes(patch.keyId?.id, `patch.keyId.id (${collection})`);
|
|
584
|
+
patchKeyData = await this.getKeyData(patchKeyId);
|
|
585
|
+
if (!patchKeyData) {
|
|
586
|
+
throw new WaAppStateMissingKeyError(`missing patch key ${bytesToHex(patchKeyId)} for ${collection}`, patchKeyId, collection);
|
|
587
|
+
}
|
|
538
588
|
}
|
|
539
589
|
const decryptedMutations = await this.decryptPatchMutations(collection, patch);
|
|
540
590
|
const macMutations = new Array(decryptedMutations.length);
|
|
@@ -549,37 +599,56 @@ export class WaAppStateSyncClient {
|
|
|
549
599
|
};
|
|
550
600
|
}
|
|
551
601
|
const nextState = await this.computeNextCollectionState(current.hash, current.indexValueMap, macMutations, collection);
|
|
552
|
-
|
|
602
|
+
if (patchKeyData !== null) {
|
|
603
|
+
await this.assertPatchMacsMatch(patch, collection, patchKeyData, patchVersion, nextState.hash, valueMacs);
|
|
604
|
+
}
|
|
553
605
|
this.setCollectionState(collection, patchVersion, nextState.hash, nextState.indexValueMap);
|
|
554
|
-
return decryptedMutations
|
|
606
|
+
return decryptedMutations;
|
|
555
607
|
}
|
|
556
608
|
async decryptSnapshotRecords(collection, snapshot) {
|
|
557
|
-
const
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
throw new WaAppStateMissingKeyError(`missing snapshot mutation key ${bytesToHex(recordKeyId)} for ${collection}`, recordKeyId, collection);
|
|
567
|
-
}
|
|
568
|
-
const decrypted = await this.crypto.decryptMutation({
|
|
569
|
-
operation: proto.SyncdMutation.SyncdOperation.SET,
|
|
570
|
-
keyId: recordKeyId,
|
|
571
|
-
keyData: recordKeyData,
|
|
572
|
-
indexMac,
|
|
573
|
-
valueBlob
|
|
574
|
-
});
|
|
575
|
-
return {
|
|
576
|
-
decrypted,
|
|
609
|
+
const rawRecords = snapshot.records ?? [];
|
|
610
|
+
const records = new Array(rawRecords.length);
|
|
611
|
+
const recordKeyIds = new Array(rawRecords.length);
|
|
612
|
+
for (let i = 0; i < rawRecords.length; i += 1) {
|
|
613
|
+
const record = rawRecords[i];
|
|
614
|
+
const recordKeyId = decodeProtoBytes(record.keyId?.id, `snapshot.record.keyId.id (${collection})`);
|
|
615
|
+
records[i] = {
|
|
616
|
+
indexMac: decodeProtoBytes(record.index?.blob, `snapshot.record.index.blob (${collection})`),
|
|
617
|
+
valueBlob: decodeProtoBytes(record.value?.blob, `snapshot.record.value.blob (${collection})`),
|
|
577
618
|
recordKeyId
|
|
578
619
|
};
|
|
579
|
-
|
|
620
|
+
recordKeyIds[i] = recordKeyId;
|
|
621
|
+
}
|
|
622
|
+
await this.preloadKeyData(recordKeyIds);
|
|
623
|
+
const decryptTasks = new Array(records.length);
|
|
624
|
+
for (let i = 0; i < records.length; i += 1) {
|
|
625
|
+
const { indexMac, valueBlob, recordKeyId } = records[i];
|
|
626
|
+
decryptTasks[i] = (async () => {
|
|
627
|
+
const recordKeyData = await this.getKeyData(recordKeyId);
|
|
628
|
+
if (!recordKeyData) {
|
|
629
|
+
throw new WaAppStateMissingKeyError(`missing snapshot mutation key ${bytesToHex(recordKeyId)} for ${collection}`, recordKeyId, collection);
|
|
630
|
+
}
|
|
631
|
+
const decrypted = await this.crypto.decryptMutation({
|
|
632
|
+
operation: proto.SyncdMutation.SyncdOperation.SET,
|
|
633
|
+
keyId: recordKeyId,
|
|
634
|
+
keyData: recordKeyData,
|
|
635
|
+
indexMac,
|
|
636
|
+
valueBlob
|
|
637
|
+
});
|
|
638
|
+
return {
|
|
639
|
+
decrypted,
|
|
640
|
+
recordKeyId
|
|
641
|
+
};
|
|
642
|
+
})();
|
|
643
|
+
}
|
|
644
|
+
return Promise.all(decryptTasks);
|
|
580
645
|
}
|
|
581
646
|
async decryptPatchMutations(collection, patch) {
|
|
582
|
-
const
|
|
647
|
+
const rawMutations = patch.mutations ?? [];
|
|
648
|
+
const parsedMutations = new Array(rawMutations.length);
|
|
649
|
+
const mutationKeyIds = new Array(rawMutations.length);
|
|
650
|
+
for (let i = 0; i < rawMutations.length; i += 1) {
|
|
651
|
+
const mutation = rawMutations[i];
|
|
583
652
|
const operationCode = mutation.operation;
|
|
584
653
|
if (operationCode === null || operationCode === undefined) {
|
|
585
654
|
throw new Error(`patch mutation is missing operation (${collection})`);
|
|
@@ -588,42 +657,49 @@ export class WaAppStateSyncClient {
|
|
|
588
657
|
if (!record) {
|
|
589
658
|
throw new Error(`patch mutation is missing record (${collection})`);
|
|
590
659
|
}
|
|
591
|
-
|
|
660
|
+
const recordKeyId = decodeProtoBytes(record.keyId?.id, `patch.record.keyId.id (${collection})`);
|
|
661
|
+
parsedMutations[i] = {
|
|
592
662
|
operationCode,
|
|
593
663
|
indexMac: decodeProtoBytes(record.index?.blob, `patch.record.index.blob (${collection})`),
|
|
594
664
|
valueBlob: decodeProtoBytes(record.value?.blob, `patch.record.value.blob (${collection})`),
|
|
595
|
-
recordKeyId
|
|
596
|
-
};
|
|
597
|
-
});
|
|
598
|
-
await this.preloadKeyData(parsedMutations.map((mutation) => mutation.recordKeyId));
|
|
599
|
-
return Promise.all(parsedMutations.map(async ({ operationCode, indexMac, valueBlob, recordKeyId }) => {
|
|
600
|
-
const recordKeyData = await this.getKeyData(recordKeyId);
|
|
601
|
-
if (!recordKeyData) {
|
|
602
|
-
throw new WaAppStateMissingKeyError(`missing mutation key ${bytesToHex(recordKeyId)} for ${collection}`, recordKeyId, collection);
|
|
603
|
-
}
|
|
604
|
-
const decrypted = await this.crypto.decryptMutation({
|
|
605
|
-
operation: operationCode,
|
|
606
|
-
keyId: recordKeyId,
|
|
607
|
-
keyData: recordKeyData,
|
|
608
|
-
indexMac,
|
|
609
|
-
valueBlob
|
|
610
|
-
});
|
|
611
|
-
return {
|
|
612
|
-
collection,
|
|
613
|
-
operation: operationCode === proto.SyncdMutation.SyncdOperation.REMOVE
|
|
614
|
-
? 'remove'
|
|
615
|
-
: 'set',
|
|
616
|
-
source: 'patch',
|
|
617
|
-
operationCode,
|
|
618
|
-
index: decrypted.index,
|
|
619
|
-
value: decrypted.value,
|
|
620
|
-
version: decrypted.version,
|
|
621
|
-
indexMac: decrypted.indexMac,
|
|
622
|
-
valueMac: decrypted.valueMac,
|
|
623
|
-
keyId: recordKeyId,
|
|
624
|
-
timestamp: this.normalizeProtoLong(decrypted.value?.timestamp, `patch.record.value.timestamp (${collection})`)
|
|
665
|
+
recordKeyId
|
|
625
666
|
};
|
|
626
|
-
|
|
667
|
+
mutationKeyIds[i] = recordKeyId;
|
|
668
|
+
}
|
|
669
|
+
await this.preloadKeyData(mutationKeyIds);
|
|
670
|
+
const decryptTasks = new Array(parsedMutations.length);
|
|
671
|
+
for (let i = 0; i < parsedMutations.length; i += 1) {
|
|
672
|
+
const { operationCode, indexMac, valueBlob, recordKeyId } = parsedMutations[i];
|
|
673
|
+
decryptTasks[i] = (async () => {
|
|
674
|
+
const recordKeyData = await this.getKeyData(recordKeyId);
|
|
675
|
+
if (!recordKeyData) {
|
|
676
|
+
throw new WaAppStateMissingKeyError(`missing mutation key ${bytesToHex(recordKeyId)} for ${collection}`, recordKeyId, collection);
|
|
677
|
+
}
|
|
678
|
+
const decrypted = await this.crypto.decryptMutation({
|
|
679
|
+
operation: operationCode,
|
|
680
|
+
keyId: recordKeyId,
|
|
681
|
+
keyData: recordKeyData,
|
|
682
|
+
indexMac,
|
|
683
|
+
valueBlob
|
|
684
|
+
});
|
|
685
|
+
return {
|
|
686
|
+
collection,
|
|
687
|
+
operation: operationCode === proto.SyncdMutation.SyncdOperation.REMOVE
|
|
688
|
+
? 'remove'
|
|
689
|
+
: 'set',
|
|
690
|
+
source: 'patch',
|
|
691
|
+
operationCode,
|
|
692
|
+
index: decrypted.index,
|
|
693
|
+
value: decrypted.value,
|
|
694
|
+
version: decrypted.version,
|
|
695
|
+
indexMac: decrypted.indexMac,
|
|
696
|
+
valueMac: decrypted.valueMac,
|
|
697
|
+
keyId: recordKeyId,
|
|
698
|
+
timestamp: this.normalizeProtoLong(decrypted.value?.timestamp, `patch.record.value.timestamp (${collection})`)
|
|
699
|
+
};
|
|
700
|
+
})();
|
|
701
|
+
}
|
|
702
|
+
return Promise.all(decryptTasks);
|
|
627
703
|
}
|
|
628
704
|
async assertPatchMacsMatch(patch, collection, patchKeyData, patchVersion, nextHash, valueMacs) {
|
|
629
705
|
const snapshotMac = decodeProtoBytes(patch.snapshotMac, `patch.snapshotMac (${collection})`);
|
|
@@ -637,8 +713,7 @@ export class WaAppStateSyncClient {
|
|
|
637
713
|
throw new Error(`patch MAC mismatch for ${collection}`);
|
|
638
714
|
}
|
|
639
715
|
}
|
|
640
|
-
async buildOutgoingPatch(collection, snapshot, pendingMutations) {
|
|
641
|
-
const activeKey = await this.store.getActiveSyncKey();
|
|
716
|
+
async buildOutgoingPatch(collection, snapshot, pendingMutations, activeKey) {
|
|
642
717
|
if (!activeKey) {
|
|
643
718
|
throw new WaAppStateMissingKeyError(`no sync key available to upload ${collection}`, null, collection);
|
|
644
719
|
}
|
|
@@ -657,23 +732,30 @@ export class WaAppStateSyncClient {
|
|
|
657
732
|
});
|
|
658
733
|
return { operationCode, encrypted };
|
|
659
734
|
}));
|
|
660
|
-
const encryptedMutations = encryptedResults.
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
735
|
+
const encryptedMutations = new Array(encryptedResults.length);
|
|
736
|
+
const macMutations = new Array(encryptedResults.length);
|
|
737
|
+
const valueMacs = new Array(encryptedResults.length);
|
|
738
|
+
for (let i = 0; i < encryptedResults.length; i += 1) {
|
|
739
|
+
const { operationCode, encrypted } = encryptedResults[i];
|
|
740
|
+
encryptedMutations[i] = {
|
|
741
|
+
operation: operationCode,
|
|
742
|
+
record: {
|
|
743
|
+
keyId: { id: activeKey.keyId },
|
|
744
|
+
index: { blob: encrypted.indexMac },
|
|
745
|
+
value: { blob: encrypted.valueBlob }
|
|
746
|
+
}
|
|
747
|
+
};
|
|
748
|
+
macMutations[i] = {
|
|
749
|
+
operation: operationCode,
|
|
750
|
+
indexMac: encrypted.indexMac,
|
|
751
|
+
valueMac: encrypted.valueMac
|
|
752
|
+
};
|
|
753
|
+
valueMacs[i] = encrypted.valueMac;
|
|
754
|
+
}
|
|
673
755
|
const nextState = await this.computeNextCollectionState(snapshot.hash, snapshot.indexValueMap, macMutations, collection);
|
|
674
756
|
const patchVersion = snapshot.version + 1;
|
|
675
757
|
const snapshotMac = await this.crypto.generateSnapshotMac(activeKey.keyData, nextState.hash, patchVersion, collection);
|
|
676
|
-
const patchMac = await this.crypto.generatePatchMac(activeKey.keyData, snapshotMac,
|
|
758
|
+
const patchMac = await this.crypto.generatePatchMac(activeKey.keyData, snapshotMac, valueMacs, patchVersion, collection);
|
|
677
759
|
const deviceIndex = this.resolveDeviceIndex();
|
|
678
760
|
const clientDebugData = this.buildPatchClientDebugData();
|
|
679
761
|
const encodedPatch = proto.SyncdPatch.encode({
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { proto } from '
|
|
2
|
-
import { asBytes, asNumber, asOptionalBytes, asString } from '
|
|
1
|
+
import { proto } from '../proto.js';
|
|
2
|
+
import { asBytes, asNumber, asOptionalBytes, asString } from '../util/coercion.js';
|
|
3
3
|
export function encodeAppStateFingerprint(fingerprint) {
|
|
4
4
|
if (!fingerprint) {
|
|
5
5
|
return null;
|
|
@@ -20,12 +20,17 @@ export function decodeAppStateFingerprint(raw) {
|
|
|
20
20
|
}
|
|
21
21
|
}
|
|
22
22
|
export function decodeAppStateSyncKeys(rows) {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
23
|
+
const decoded = new Array(rows.length);
|
|
24
|
+
for (let i = 0; i < rows.length; i += 1) {
|
|
25
|
+
const row = rows[i];
|
|
26
|
+
decoded[i] = {
|
|
27
|
+
keyId: asBytes(row.key_id, 'appstate_sync_keys.key_id'),
|
|
28
|
+
keyData: asBytes(row.key_data, 'appstate_sync_keys.key_data'),
|
|
29
|
+
timestamp: asNumber(row.timestamp, 'appstate_sync_keys.timestamp'),
|
|
30
|
+
fingerprint: decodeAppStateFingerprint(row.fingerprint)
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
return decoded;
|
|
29
34
|
}
|
|
30
35
|
export function decodeAppStateCollections(versionRows, valueRows) {
|
|
31
36
|
const valueMapByCollection = new Map();
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export * from './constants.js';
|
|
2
|
+
export { encodeAppStateFingerprint, decodeAppStateFingerprint, decodeAppStateCollections, decodeAppStateSyncKeys } from './encoding.js';
|
|
2
3
|
export * from './utils.js';
|
|
3
4
|
export { WaAppStateCrypto } from './WaAppStateCrypto.js';
|
|
4
|
-
export {
|
|
5
|
-
export { parseCollectionState, parseSyncResponse } from './WaAppStateSyncResponseParser.js';
|
|
5
|
+
export { parseSyncResponse } from './response-parser.js';
|
|
6
6
|
export { WaAppStateSyncClient } from './WaAppStateSyncClient.js';
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { parseCollectionName } from './utils.js';
|
|
2
2
|
import { proto } from '../proto.js';
|
|
3
3
|
import { WA_APP_STATE_COLLECTION_STATES, WA_APP_STATE_ERROR_CODES, WA_IQ_TYPES, WA_NODE_TAGS } from '../protocol/constants.js';
|
|
4
|
-
import { decodeNodeContentBase64OrBytes,
|
|
4
|
+
import { decodeNodeContentBase64OrBytes, findNodeChild, findNodeChildrenByTags, getNodeChildrenByTag } from '../transport/node/helpers.js';
|
|
5
5
|
export function parseSyncResponse(iqNode) {
|
|
6
6
|
if (iqNode.tag !== WA_NODE_TAGS.IQ) {
|
|
7
7
|
throw new Error(`invalid sync response tag ${iqNode.tag}`);
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { WA_APP_STATE_COLLECTIONS, WA_APP_STATE_KEY_TYPES } from '../protocol/constants.js';
|
|
2
|
-
import { decodeProtoBytes
|
|
2
|
+
import { decodeProtoBytes } from '../util/bytes.js';
|
|
3
3
|
const APP_STATE_COLLECTION_NAMES = new Set(Object.values(WA_APP_STATE_COLLECTIONS));
|
|
4
4
|
export function parseCollectionName(value) {
|
|
5
5
|
return value && APP_STATE_COLLECTION_NAMES.has(value) ? value : null;
|
|
6
6
|
}
|
|
7
|
-
|
|
7
|
+
function keyDeviceId(keyId) {
|
|
8
8
|
return keyId.byteLength < 6 ? null : (keyId[0] << 8) | keyId[1];
|
|
9
9
|
}
|
|
10
10
|
export function keyEpoch(keyId) {
|
|
@@ -36,9 +36,6 @@ export function pickActiveSyncKey(keys) {
|
|
|
36
36
|
}
|
|
37
37
|
return active;
|
|
38
38
|
}
|
|
39
|
-
export function toNetworkOrder64(value) {
|
|
40
|
-
return intToBytes(8, value);
|
|
41
|
-
}
|
|
42
39
|
export async function downloadExternalBlobReference(mediaTransfer, reference) {
|
|
43
40
|
if (!reference.directPath) {
|
|
44
41
|
throw new Error('external blob reference is missing directPath');
|