zapo-js 0.1.1 → 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 +20 -4
- package/dist/appstate/WaAppStateCrypto.js +19 -26
- package/dist/appstate/WaAppStateSyncClient.js +293 -181
- package/dist/appstate/WaAppStateSyncResponseParser.js +16 -5
- package/dist/appstate/constants.js +4 -3
- package/dist/appstate/{store/sqlite.js → encoding.js} +13 -8
- package/dist/appstate/index.js +8 -6
- package/dist/appstate/utils.js +9 -34
- package/dist/auth/WaAuthClient.js +43 -61
- package/dist/auth/flow/WaAuthCredentialsFlow.js +22 -15
- package/dist/auth/index.js +1 -8
- package/dist/auth/pairing/WaPairingCodeCrypto.js +6 -4
- package/dist/auth/pairing/WaPairingFlow.js +34 -26
- package/dist/auth/pairing/WaQrFlow.js +37 -24
- package/dist/client/WaClient.js +275 -324
- package/dist/client/WaClientFactory.js +500 -133
- package/dist/client/connection/WaConnectionManager.js +301 -0
- package/dist/client/connection/WaKeyShareCoordinator.js +63 -0
- package/dist/client/connection/WaReceiptQueue.js +51 -0
- package/dist/client/coordinators/WaAppStateMutationCoordinator.js +471 -0
- package/dist/client/coordinators/WaBusinessCoordinator.js +241 -0
- package/dist/client/coordinators/WaGroupCoordinator.js +30 -16
- package/dist/client/coordinators/WaIncomingNodeCoordinator.js +21 -27
- package/dist/client/coordinators/WaMessageDispatchCoordinator.js +439 -701
- 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 +242 -57
- package/dist/client/coordinators/WaStreamControlCoordinator.js +18 -11
- package/dist/client/coordinators/WaTrustedContactTokenCoordinator.js +166 -0
- package/dist/client/dirty.js +74 -48
- package/dist/client/events/chat.js +4 -3
- package/dist/client/events/devices.js +72 -0
- package/dist/client/events/group.js +62 -47
- package/dist/client/events/identity.js +22 -0
- package/dist/client/events/privacy-token.js +39 -0
- package/dist/client/history-sync.js +94 -63
- package/dist/client/incoming.js +60 -27
- package/dist/client/mailbox.js +24 -23
- package/dist/client/messages.js +107 -31
- package/dist/client/messaging/fanout.js +199 -0
- package/dist/client/messaging/key-protocol.js +130 -0
- package/dist/client/messaging/participants.js +193 -0
- 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/hkdf.js +3 -8
- package/dist/crypto/core/index.js +2 -5
- package/dist/crypto/core/keys.js +6 -7
- package/dist/crypto/core/nonce.js +2 -0
- package/dist/crypto/core/primitives.js +12 -23
- package/dist/crypto/core/random.js +26 -23
- package/dist/crypto/curves/Ed25519.js +7 -8
- package/dist/crypto/curves/X25519.js +38 -22
- package/dist/crypto/index.js +1 -3
- 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 +7 -14
- package/dist/esm/appstate/WaAppStateSyncClient.js +284 -172
- package/dist/esm/appstate/WaAppStateSyncResponseParser.js +17 -6
- package/dist/esm/appstate/constants.js +3 -2
- 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 +8 -30
- package/dist/esm/auth/WaAuthClient.js +43 -61
- package/dist/esm/auth/flow/WaAuthCredentialsFlow.js +22 -15
- package/dist/esm/auth/index.js +0 -3
- package/dist/esm/auth/pairing/WaPairingCodeCrypto.js +6 -4
- package/dist/esm/auth/pairing/WaPairingFlow.js +28 -20
- package/dist/esm/auth/pairing/WaQrFlow.js +37 -24
- package/dist/esm/client/WaClient.js +275 -324
- package/dist/esm/client/WaClientFactory.js +501 -134
- package/dist/esm/client/connection/WaConnectionManager.js +297 -0
- package/dist/esm/client/connection/WaKeyShareCoordinator.js +59 -0
- package/dist/esm/client/connection/WaReceiptQueue.js +47 -0
- package/dist/esm/client/coordinators/WaAppStateMutationCoordinator.js +467 -0
- package/dist/esm/client/coordinators/WaBusinessCoordinator.js +238 -0
- package/dist/esm/client/coordinators/WaGroupCoordinator.js +23 -9
- package/dist/esm/client/coordinators/WaIncomingNodeCoordinator.js +21 -27
- package/dist/esm/client/coordinators/WaMessageDispatchCoordinator.js +443 -705
- 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 +244 -59
- package/dist/esm/client/coordinators/WaStreamControlCoordinator.js +19 -12
- package/dist/esm/client/coordinators/WaTrustedContactTokenCoordinator.js +162 -0
- package/dist/esm/client/dirty.js +69 -43
- package/dist/esm/client/events/chat.js +4 -3
- package/dist/esm/client/events/devices.js +68 -0
- package/dist/esm/client/events/group.js +53 -39
- 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 +91 -60
- package/dist/esm/client/incoming.js +61 -28
- package/dist/esm/client/mailbox.js +24 -23
- package/dist/esm/client/messages.js +108 -32
- package/dist/esm/client/messaging/fanout.js +196 -0
- package/dist/esm/client/messaging/key-protocol.js +127 -0
- package/dist/esm/client/messaging/participants.js +190 -0
- 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/hkdf.js +3 -8
- package/dist/esm/crypto/core/index.js +2 -3
- package/dist/esm/crypto/core/keys.js +3 -4
- package/dist/esm/crypto/core/nonce.js +2 -0
- package/dist/esm/crypto/core/primitives.js +12 -22
- package/dist/esm/crypto/core/random.js +25 -23
- package/dist/esm/crypto/curves/Ed25519.js +4 -5
- package/dist/esm/crypto/curves/X25519.js +35 -19
- package/dist/esm/crypto/index.js +0 -1
- 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/log/ConsoleLogger.js +18 -17
- package/dist/esm/infra/log/PinoLogger.js +15 -9
- package/dist/esm/infra/log/types.js +11 -1
- package/dist/esm/infra/perf/BackgroundQueue.js +478 -0
- package/dist/esm/infra/perf/BoundedTaskQueue.js +16 -18
- 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 +96 -16
- package/dist/esm/media/WaMediaTransferClient.js +251 -91
- package/dist/esm/media/conn.js +10 -6
- package/dist/esm/media/constants.js +6 -2
- package/dist/esm/message/WaMessageClient.js +30 -32
- package/dist/esm/message/ack.js +6 -6
- package/dist/esm/message/addon-crypto.js +59 -0
- package/dist/esm/message/content.js +195 -9
- package/dist/esm/message/icdc.js +76 -0
- package/dist/esm/message/incoming.js +129 -122
- package/dist/esm/message/index.js +2 -0
- package/dist/esm/message/phash.js +3 -1
- package/dist/esm/message/reporting-token.js +425 -0
- package/dist/esm/message/use-case-secret.js +49 -0
- package/dist/esm/protocol/appstate.js +27 -0
- package/dist/esm/protocol/browser.js +10 -18
- package/dist/esm/protocol/constants.js +6 -3
- package/dist/esm/protocol/defaults.js +6 -0
- package/dist/esm/protocol/index.js +2 -11
- package/dist/esm/protocol/jid.js +133 -52
- package/dist/esm/protocol/media.js +3 -3
- package/dist/esm/protocol/message.js +61 -1
- package/dist/esm/protocol/nodes.js +4 -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/protocol/usync.js +11 -0
- package/dist/esm/retry/codec.js +216 -0
- package/dist/esm/retry/constants.js +1 -1
- package/dist/esm/retry/index.js +3 -2
- package/dist/esm/retry/parse.js +88 -86
- package/dist/esm/retry/replay.js +54 -51
- package/dist/esm/retry/tracker.js +94 -0
- package/dist/esm/signal/api/SignalDeviceSyncApi.js +276 -92
- package/dist/esm/signal/api/SignalDigestSyncApi.js +17 -8
- package/dist/esm/signal/api/SignalIdentitySyncApi.js +67 -37
- package/dist/esm/signal/api/SignalMissingPreKeysSyncApi.js +86 -67
- package/dist/esm/signal/api/SignalRotateKeyApi.js +4 -2
- package/dist/esm/signal/api/SignalSessionSyncApi.js +36 -34
- 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 +13 -9
- package/dist/esm/signal/{store/sqlite.js → encoding.js} +93 -60
- package/dist/esm/signal/group/SenderKeyChain.js +28 -23
- package/dist/esm/signal/group/SenderKeyCodec.js +5 -6
- package/dist/esm/signal/group/SenderKeyManager.js +144 -115
- package/dist/esm/signal/index.js +2 -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 +164 -53
- package/dist/esm/signal/session/SignalRatchet.js +24 -15
- package/dist/esm/signal/session/SignalSession.js +14 -9
- package/dist/esm/signal/session/resolver.js +221 -0
- package/dist/esm/store/contracts/privacy-token.store.js +1 -0
- package/dist/esm/store/createStore.js +100 -188
- 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 +4 -7
- package/dist/esm/store/providers/memory/appstate.store.js +38 -16
- package/dist/esm/store/providers/memory/contact.store.js +5 -0
- package/dist/esm/store/providers/memory/device-list.store.js +12 -34
- package/dist/esm/store/providers/memory/message.store.js +11 -5
- package/dist/esm/store/providers/memory/participants.store.js +1 -8
- package/dist/esm/store/providers/memory/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 +11 -8
- package/dist/esm/store/providers/memory/signal.store.js +47 -18
- package/dist/esm/store/providers/memory/thread.store.js +5 -0
- package/dist/esm/transport/WaComms.js +28 -24
- package/dist/esm/transport/WaWebSocket.js +115 -18
- package/dist/esm/transport/binary/constants.js +0 -30
- package/dist/esm/transport/binary/decoder.js +8 -8
- package/dist/esm/transport/binary/encoder.js +10 -9
- package/dist/esm/transport/binary/index.js +0 -1
- package/dist/esm/transport/index.js +1 -0
- package/dist/esm/transport/keepalive/WaKeepAlive.js +2 -8
- package/dist/esm/transport/node/WaNodeOrchestrator.js +25 -21
- package/dist/esm/transport/node/WaNodeTransport.js +0 -3
- package/dist/esm/transport/node/builders/{accountSync.js → account-sync.js} +16 -36
- package/dist/esm/transport/node/builders/business.js +129 -0
- package/dist/esm/transport/node/builders/global.js +370 -0
- package/dist/esm/transport/node/builders/index.js +7 -3
- package/dist/esm/transport/node/builders/message.js +63 -230
- package/dist/esm/transport/node/builders/pairing.js +2 -27
- 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 +45 -0
- package/dist/esm/transport/node/helpers.js +125 -5
- package/dist/esm/transport/node/usync.js +5 -0
- package/dist/esm/transport/node/xml.js +35 -14
- package/dist/esm/transport/noise/WaClientPayload.js +10 -10
- package/dist/esm/transport/noise/WaFrameCodec.js +48 -33
- package/dist/esm/transport/noise/WaNoiseCert.js +4 -7
- package/dist/esm/transport/noise/WaNoiseSession.js +77 -29
- package/dist/esm/transport/noise/WaNoiseSocket.js +8 -4
- package/dist/esm/transport/proxy.js +27 -0
- package/dist/esm/transport/stream/parse.js +17 -48
- package/dist/esm/util/bytes.js +67 -45
- package/dist/esm/util/coercion.js +6 -14
- package/dist/esm/util/index.js +5 -0
- package/dist/esm/util/primitives.js +40 -14
- package/dist/index.js +7 -1
- package/dist/infra/log/ConsoleLogger.js +18 -17
- package/dist/infra/log/PinoLogger.js +15 -9
- package/dist/infra/log/types.js +12 -0
- package/dist/infra/perf/BackgroundQueue.js +482 -0
- package/dist/infra/perf/BoundedTaskQueue.js +16 -18
- 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 +95 -15
- package/dist/media/WaMediaTransferClient.js +284 -91
- package/dist/media/conn.js +10 -6
- package/dist/media/constants.js +6 -2
- package/dist/message/WaMessageClient.js +31 -33
- package/dist/message/ack.js +6 -6
- package/dist/message/addon-crypto.js +65 -0
- package/dist/message/content.js +198 -9
- package/dist/message/icdc.js +81 -0
- package/dist/message/incoming.js +127 -120
- package/dist/message/index.js +2 -0
- package/dist/message/phash.js +3 -1
- package/dist/message/reporting-token.js +429 -0
- package/dist/message/use-case-secret.js +55 -0
- package/dist/protocol/appstate.js +28 -1
- package/dist/protocol/browser.js +10 -18
- package/dist/protocol/constants.js +26 -1
- package/dist/protocol/defaults.js +6 -0
- package/dist/protocol/index.js +23 -42
- package/dist/protocol/jid.js +140 -52
- package/dist/protocol/media.js +3 -3
- package/dist/protocol/message.js +62 -2
- package/dist/protocol/nodes.js +4 -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/protocol/usync.js +14 -0
- package/dist/retry/codec.js +220 -0
- package/dist/retry/constants.js +1 -1
- package/dist/retry/index.js +7 -5
- package/dist/retry/parse.js +88 -85
- package/dist/retry/replay.js +52 -49
- package/dist/retry/tracker.js +97 -0
- package/dist/signal/api/SignalDeviceSyncApi.js +273 -89
- package/dist/signal/api/SignalDigestSyncApi.js +17 -8
- package/dist/signal/api/SignalIdentitySyncApi.js +66 -36
- package/dist/signal/api/SignalMissingPreKeysSyncApi.js +82 -63
- package/dist/signal/api/SignalRotateKeyApi.js +4 -2
- package/dist/signal/api/SignalSessionSyncApi.js +36 -34
- package/dist/signal/api/result-map.js +13 -0
- package/dist/signal/constants.js +1 -5
- package/dist/signal/crypto/WaAdvSignature.js +11 -7
- package/dist/signal/{store/sqlite.js → encoding.js} +94 -61
- package/dist/signal/group/SenderKeyChain.js +27 -22
- package/dist/signal/group/SenderKeyCodec.js +5 -6
- package/dist/signal/group/SenderKeyManager.js +144 -115
- package/dist/signal/index.js +15 -1
- package/dist/signal/registration/keygen.js +6 -2
- package/dist/signal/registration/utils.js +1 -0
- package/dist/signal/session/SignalProtocol.js +164 -53
- package/dist/signal/session/SignalRatchet.js +24 -15
- package/dist/signal/session/SignalSession.js +14 -9
- package/dist/signal/session/resolver.js +224 -0
- package/dist/store/contracts/privacy-token.store.js +2 -0
- package/dist/store/createStore.js +100 -188
- 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 +4 -7
- package/dist/store/providers/memory/appstate.store.js +36 -14
- package/dist/store/providers/memory/contact.store.js +5 -0
- package/dist/store/providers/memory/device-list.store.js +12 -34
- package/dist/store/providers/memory/message.store.js +11 -5
- package/dist/store/providers/memory/participants.store.js +1 -8
- package/dist/store/providers/memory/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 +14 -11
- package/dist/store/providers/memory/signal.store.js +54 -25
- package/dist/store/providers/memory/thread.store.js +5 -0
- package/dist/transport/WaComms.js +30 -26
- package/dist/transport/WaWebSocket.js +148 -18
- package/dist/transport/binary/constants.js +1 -31
- package/dist/transport/binary/decoder.js +8 -8
- package/dist/transport/binary/encoder.js +10 -9
- package/dist/transport/binary/index.js +0 -4
- package/dist/transport/index.js +7 -1
- package/dist/transport/keepalive/WaKeepAlive.js +1 -7
- package/dist/transport/node/WaNodeOrchestrator.js +25 -21
- package/dist/transport/node/WaNodeTransport.js +0 -3
- package/dist/transport/node/builders/{accountSync.js → account-sync.js} +15 -35
- package/dist/transport/node/builders/business.js +137 -0
- package/dist/transport/node/builders/global.js +375 -0
- package/dist/transport/node/builders/index.js +29 -17
- package/dist/transport/node/builders/message.js +64 -236
- package/dist/transport/node/builders/pairing.js +2 -29
- 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 +49 -0
- package/dist/transport/node/helpers.js +131 -4
- package/dist/transport/node/usync.js +8 -0
- package/dist/transport/node/xml.js +35 -14
- package/dist/transport/noise/WaClientPayload.js +13 -13
- package/dist/transport/noise/WaFrameCodec.js +47 -32
- package/dist/transport/noise/WaNoiseCert.js +5 -8
- package/dist/transport/noise/WaNoiseSession.js +77 -29
- package/dist/transport/noise/WaNoiseSocket.js +8 -4
- package/dist/transport/proxy.js +34 -0
- package/dist/transport/stream/parse.js +20 -52
- package/dist/types/appstate/WaAppStateCrypto.d.ts +0 -1
- package/dist/types/appstate/WaAppStateSyncClient.d.ts +5 -2
- package/dist/types/appstate/constants.d.ts +1 -0
- package/dist/types/appstate/encoding.d.ts +7 -0
- package/dist/types/appstate/index.d.ts +3 -3
- package/dist/types/appstate/utils.d.ts +0 -3
- package/dist/types/auth/WaAuthClient.d.ts +10 -12
- package/dist/types/auth/flow/WaAuthCredentialsFlow.d.ts +1 -1
- package/dist/types/auth/index.d.ts +0 -4
- package/dist/types/auth/pairing/WaQrFlow.d.ts +1 -1
- package/dist/types/auth/types.d.ts +7 -9
- package/dist/types/client/WaClient.d.ts +42 -25
- package/dist/types/client/WaClientFactory.d.ts +33 -26
- package/dist/types/client/connection/WaConnectionManager.d.ts +66 -0
- package/dist/types/client/connection/WaKeyShareCoordinator.d.ts +14 -0
- package/dist/types/client/connection/WaReceiptQueue.d.ts +13 -0
- package/dist/types/client/coordinators/WaAppStateMutationCoordinator.d.ts +46 -0
- package/dist/types/client/coordinators/WaBusinessCoordinator.d.ts +57 -0
- package/dist/types/client/coordinators/WaIncomingNodeCoordinator.d.ts +3 -2
- package/dist/types/client/coordinators/WaMessageDispatchCoordinator.d.ts +29 -38
- 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 +8 -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/dirty.d.ts +1 -0
- package/dist/types/client/events/devices.d.ts +20 -0
- package/dist/types/client/events/group.d.ts +2 -1
- 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/messaging/fanout.d.ts +14 -0
- package/dist/types/client/messaging/key-protocol.d.ts +18 -0
- package/dist/types/client/messaging/participants.d.ts +13 -0
- package/dist/types/client/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 +75 -4
- package/dist/types/crypto/core/hkdf.d.ts +0 -6
- package/dist/types/crypto/core/index.d.ts +2 -3
- 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 +2 -7
- package/dist/types/crypto/index.d.ts +0 -1
- 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/log/ConsoleLogger.d.ts +2 -1
- package/dist/types/infra/log/PinoLogger.d.ts +1 -1
- package/dist/types/infra/log/types.d.ts +1 -0
- package/dist/types/infra/perf/BackgroundQueue.d.ts +58 -0
- package/dist/types/infra/perf/BoundedTaskQueue.d.ts +1 -1
- 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 +16 -15
- 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 +15 -2
- package/dist/types/message/addon-crypto.d.ts +25 -0
- package/dist/types/message/content.d.ts +8 -0
- package/dist/types/message/icdc.d.ts +13 -0
- package/dist/types/message/index.d.ts +2 -0
- package/dist/types/message/reporting-token.d.ts +18 -0
- package/dist/types/message/types.d.ts +45 -6
- package/dist/types/message/use-case-secret.d.ts +20 -0
- package/dist/types/protocol/appstate.d.ts +47 -0
- package/dist/types/protocol/constants.d.ts +8 -3
- package/dist/types/protocol/defaults.d.ts +6 -0
- package/dist/types/protocol/index.d.ts +2 -11
- package/dist/types/protocol/jid.d.ts +22 -5
- package/dist/types/protocol/message.d.ts +60 -0
- package/dist/types/protocol/nodes.d.ts +4 -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/protocol/usync.d.ts +11 -0
- package/dist/types/retry/codec.d.ts +3 -0
- package/dist/types/retry/index.d.ts +4 -3
- package/dist/types/retry/parse.d.ts +5 -2
- package/dist/types/retry/replay.d.ts +0 -4
- package/dist/types/retry/tracker.d.ts +20 -0
- package/dist/types/retry/types.d.ts +10 -4
- package/dist/types/signal/api/SignalDeviceSyncApi.d.ts +15 -2
- 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/SenderKeyCodec.d.ts +4 -6
- package/dist/types/signal/group/SenderKeyManager.d.ts +10 -5
- package/dist/types/signal/index.d.ts +3 -0
- package/dist/types/signal/session/SignalProtocol.d.ts +19 -4
- package/dist/types/signal/session/resolver.d.ts +22 -0
- package/dist/types/store/contracts/appstate.store.d.ts +4 -1
- package/dist/types/store/contracts/contact.store.d.ts +1 -0
- package/dist/types/store/contracts/device-list.store.d.ts +0 -3
- package/dist/types/store/contracts/message.store.d.ts +1 -0
- package/dist/types/store/contracts/participants.store.d.ts +0 -1
- package/dist/types/store/contracts/privacy-token.store.d.ts +16 -0
- package/dist/types/store/contracts/retry.store.d.ts +7 -0
- package/dist/types/store/contracts/sender-key.store.d.ts +0 -1
- package/dist/types/store/contracts/signal.store.d.ts +13 -0
- package/dist/types/store/contracts/thread.store.d.ts +1 -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 +3 -1
- package/dist/types/store/providers/memory/contact.store.d.ts +1 -0
- package/dist/types/store/providers/memory/device-list.store.d.ts +0 -3
- package/dist/types/store/providers/memory/message.store.d.ts +1 -0
- package/dist/types/store/providers/memory/participants.store.d.ts +0 -1
- package/dist/types/store/providers/memory/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/sender-key.store.d.ts +0 -1
- package/dist/types/store/providers/memory/signal.store.d.ts +8 -1
- package/dist/types/store/providers/memory/thread.store.d.ts +1 -0
- package/dist/types/store/types.d.ts +49 -58
- package/dist/types/transport/WaWebSocket.d.ts +3 -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 +2 -1
- package/dist/types/transport/keepalive/WaKeepAlive.d.ts +0 -1
- package/dist/types/transport/node/WaNodeOrchestrator.d.ts +3 -4
- package/dist/types/transport/node/WaNodeTransport.d.ts +0 -9
- 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/group.d.ts +4 -6
- package/dist/types/transport/node/builders/index.d.ts +7 -3
- package/dist/types/transport/node/builders/message.d.ts +20 -30
- 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 +2 -5
- package/dist/types/transport/node/builders/usync.d.ts +21 -0
- package/dist/types/transport/node/helpers.d.ts +13 -0
- package/dist/types/transport/node/usync.d.ts +2 -0
- package/dist/types/transport/noise/WaFrameCodec.d.ts +3 -0
- package/dist/types/transport/noise/WaNoiseSession.d.ts +4 -2
- package/dist/types/transport/noise/WaNoiseSocket.d.ts +4 -2
- package/dist/types/transport/proxy.d.ts +6 -0
- package/dist/types/transport/stream/parse.d.ts +0 -1
- package/dist/types/transport/types.d.ts +18 -1
- package/dist/types/util/bytes.d.ts +5 -0
- package/dist/types/util/index.d.ts +5 -0
- package/dist/types/util/primitives.d.ts +2 -0
- package/dist/util/bytes.js +72 -46
- package/dist/util/coercion.js +6 -14
- package/dist/util/index.js +23 -0
- package/dist/util/primitives.js +42 -14
- package/package.json +52 -9
- package/proto/index.js +1 -1
- package/dist/crypto/core/constants.js +0 -4
- package/dist/crypto/core/encoding.js +0 -29
- package/dist/esm/crypto/core/constants.js +0 -1
- package/dist/esm/crypto/core/encoding.js +0 -25
- package/dist/esm/retry/outbound.js +0 -83
- package/dist/esm/store/providers/sqlite/BaseSqliteStore.js +0 -37
- package/dist/esm/store/providers/sqlite/appstate.store.js +0 -169
- package/dist/esm/store/providers/sqlite/auth.store.js +0 -176
- package/dist/esm/store/providers/sqlite/connection.js +0 -240
- package/dist/esm/store/providers/sqlite/contact.store.js +0 -61
- package/dist/esm/store/providers/sqlite/device-list.store.js +0 -155
- package/dist/esm/store/providers/sqlite/message.store.js +0 -119
- package/dist/esm/store/providers/sqlite/migrations.js +0 -347
- package/dist/esm/store/providers/sqlite/participants.store.js +0 -85
- package/dist/esm/store/providers/sqlite/retry.store.js +0 -144
- package/dist/esm/store/providers/sqlite/sender-key.store.js +0 -203
- package/dist/esm/store/providers/sqlite/signal.store.js +0 -353
- package/dist/esm/store/providers/sqlite/thread.store.js +0 -72
- package/dist/esm/util/base64.js +0 -18
- package/dist/esm/util/signal-address.js +0 -5
- package/dist/retry/outbound.js +0 -88
- package/dist/store/providers/sqlite/BaseSqliteStore.js +0 -41
- package/dist/store/providers/sqlite/appstate.store.js +0 -173
- package/dist/store/providers/sqlite/auth.store.js +0 -180
- package/dist/store/providers/sqlite/connection.js +0 -276
- package/dist/store/providers/sqlite/contact.store.js +0 -65
- package/dist/store/providers/sqlite/device-list.store.js +0 -159
- package/dist/store/providers/sqlite/message.store.js +0 -123
- package/dist/store/providers/sqlite/migrations.js +0 -350
- package/dist/store/providers/sqlite/participants.store.js +0 -89
- package/dist/store/providers/sqlite/retry.store.js +0 -148
- package/dist/store/providers/sqlite/sender-key.store.js +0 -207
- package/dist/store/providers/sqlite/signal.store.js +0 -357
- package/dist/store/providers/sqlite/thread.store.js +0 -76
- package/dist/types/appstate/store/sqlite.d.ts +0 -21
- package/dist/types/crypto/core/constants.d.ts +0 -1
- package/dist/types/crypto/core/encoding.d.ts +0 -11
- 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 -15
- 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 -10
- package/dist/types/store/providers/sqlite/device-list.store.d.ts +0 -18
- package/dist/types/store/providers/sqlite/message.store.d.ts +0 -11
- package/dist/types/store/providers/sqlite/migrations.d.ts +0 -3
- package/dist/types/store/providers/sqlite/participants.store.d.ts +0 -13
- package/dist/types/store/providers/sqlite/retry.store.d.ts +0 -16
- package/dist/types/store/providers/sqlite/sender-key.store.d.ts +0 -25
- package/dist/types/store/providers/sqlite/signal.store.d.ts +0 -46
- package/dist/types/store/providers/sqlite/thread.store.d.ts +0 -11
- package/dist/types/util/base64.d.ts +0 -4
- package/dist/types/util/signal-address.d.ts +0 -2
- package/dist/util/base64.js +0 -24
- package/dist/util/signal-address.js +0 -8
- /package/dist/types/transport/node/builders/{accountSync.d.ts → account-sync.d.ts} +0 -0
|
@@ -12,6 +12,12 @@ function parseSyncResponse(iqNode) {
|
|
|
12
12
|
}
|
|
13
13
|
const syncNode = (0, helpers_1.findNodeChild)(iqNode, constants_1.WA_NODE_TAGS.SYNC);
|
|
14
14
|
if (!syncNode) {
|
|
15
|
+
if (iqNode.attrs.type === constants_1.WA_IQ_TYPES.ERROR) {
|
|
16
|
+
const errorNode = (0, helpers_1.findNodeChild)(iqNode, constants_1.WA_NODE_TAGS.ERROR);
|
|
17
|
+
const code = errorNode?.attrs.code ?? 'unknown';
|
|
18
|
+
const text = errorNode?.attrs.text ?? 'unknown';
|
|
19
|
+
throw new Error(`sync iq failed (${code}: ${text})`);
|
|
20
|
+
}
|
|
15
21
|
throw new Error('sync response is missing <sync> node');
|
|
16
22
|
}
|
|
17
23
|
const payloads = [];
|
|
@@ -30,11 +36,16 @@ function parseSyncResponse(iqNode) {
|
|
|
30
36
|
}
|
|
31
37
|
version = parsedVersion;
|
|
32
38
|
}
|
|
33
|
-
const patchesNode = (0, helpers_1.
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
const
|
|
39
|
+
const [patchesNode, snapshotNode] = (0, helpers_1.findNodeChildrenByTags)(collectionNode, [
|
|
40
|
+
constants_1.WA_NODE_TAGS.PATCHES,
|
|
41
|
+
constants_1.WA_NODE_TAGS.SNAPSHOT
|
|
42
|
+
]);
|
|
43
|
+
const patches = [];
|
|
44
|
+
if (patchesNode) {
|
|
45
|
+
for (const patchNode of (0, helpers_1.getNodeChildrenByTag)(patchesNode, constants_1.WA_NODE_TAGS.PATCH)) {
|
|
46
|
+
patches.push(_proto_1.proto.SyncdPatch.decode((0, helpers_1.decodeNodeContentBase64OrBytes)(patchNode.content, 'collection.patches.patch')));
|
|
47
|
+
}
|
|
48
|
+
}
|
|
38
49
|
const snapshotReference = snapshotNode
|
|
39
50
|
? _proto_1.proto.ExternalBlobReference.decode((0, helpers_1.decodeNodeContentBase64OrBytes)(snapshotNode.content, 'collection.snapshot'))
|
|
40
51
|
: undefined;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.APP_STATE_DEFAULT_COLLECTIONS = exports.APP_STATE_EMPTY_LT_HASH = exports.APP_STATE_POINT_SIZE = exports.APP_STATE_LT_HASH_SIZE = exports.APP_STATE_IV_LENGTH = exports.APP_STATE_MAC_OCTET_LENGTH = exports.APP_STATE_VALUE_MAC_LENGTH = exports.APP_STATE_DERIVED_PATCH_MAC_KEY_END = exports.APP_STATE_DERIVED_SNAPSHOT_MAC_KEY_END = exports.APP_STATE_DERIVED_VALUE_MAC_KEY_END = exports.APP_STATE_DERIVED_VALUE_ENCRYPTION_KEY_END = exports.APP_STATE_DERIVED_INDEX_KEY_END = exports.APP_STATE_DERIVED_KEY_LENGTH = void 0;
|
|
3
|
+
exports.APP_STATE_DEFAULT_COLLECTIONS = exports.APP_STATE_DEFAULT_COLLECTION_VERSION = exports.APP_STATE_EMPTY_LT_HASH = exports.APP_STATE_POINT_SIZE = exports.APP_STATE_LT_HASH_SIZE = exports.APP_STATE_IV_LENGTH = exports.APP_STATE_MAC_OCTET_LENGTH = exports.APP_STATE_VALUE_MAC_LENGTH = exports.APP_STATE_DERIVED_PATCH_MAC_KEY_END = exports.APP_STATE_DERIVED_SNAPSHOT_MAC_KEY_END = exports.APP_STATE_DERIVED_VALUE_MAC_KEY_END = exports.APP_STATE_DERIVED_VALUE_ENCRYPTION_KEY_END = exports.APP_STATE_DERIVED_INDEX_KEY_END = exports.APP_STATE_DERIVED_KEY_LENGTH = void 0;
|
|
4
4
|
const constants_1 = require("../protocol/constants");
|
|
5
5
|
exports.APP_STATE_DERIVED_KEY_LENGTH = 160;
|
|
6
6
|
exports.APP_STATE_DERIVED_INDEX_KEY_END = 32;
|
|
@@ -14,10 +14,11 @@ exports.APP_STATE_IV_LENGTH = 16;
|
|
|
14
14
|
exports.APP_STATE_LT_HASH_SIZE = 128;
|
|
15
15
|
exports.APP_STATE_POINT_SIZE = 2;
|
|
16
16
|
exports.APP_STATE_EMPTY_LT_HASH = new Uint8Array(exports.APP_STATE_LT_HASH_SIZE);
|
|
17
|
-
exports.
|
|
17
|
+
exports.APP_STATE_DEFAULT_COLLECTION_VERSION = 0;
|
|
18
|
+
exports.APP_STATE_DEFAULT_COLLECTIONS = Object.freeze([
|
|
18
19
|
constants_1.WA_APP_STATE_COLLECTIONS.CRITICAL_UNBLOCK_LOW,
|
|
19
20
|
constants_1.WA_APP_STATE_COLLECTIONS.CRITICAL_BLOCK,
|
|
20
21
|
constants_1.WA_APP_STATE_COLLECTIONS.REGULAR_LOW,
|
|
21
22
|
constants_1.WA_APP_STATE_COLLECTIONS.REGULAR,
|
|
22
23
|
constants_1.WA_APP_STATE_COLLECTIONS.REGULAR_HIGH
|
|
23
|
-
];
|
|
24
|
+
]);
|
|
@@ -4,8 +4,8 @@ exports.encodeAppStateFingerprint = encodeAppStateFingerprint;
|
|
|
4
4
|
exports.decodeAppStateFingerprint = decodeAppStateFingerprint;
|
|
5
5
|
exports.decodeAppStateSyncKeys = decodeAppStateSyncKeys;
|
|
6
6
|
exports.decodeAppStateCollections = decodeAppStateCollections;
|
|
7
|
-
const _proto_1 = require("
|
|
8
|
-
const coercion_1 = require("
|
|
7
|
+
const _proto_1 = require("../proto.js");
|
|
8
|
+
const coercion_1 = require("../util/coercion");
|
|
9
9
|
function encodeAppStateFingerprint(fingerprint) {
|
|
10
10
|
if (!fingerprint) {
|
|
11
11
|
return null;
|
|
@@ -26,12 +26,17 @@ function decodeAppStateFingerprint(raw) {
|
|
|
26
26
|
}
|
|
27
27
|
}
|
|
28
28
|
function decodeAppStateSyncKeys(rows) {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
29
|
+
const decoded = new Array(rows.length);
|
|
30
|
+
for (let i = 0; i < rows.length; i += 1) {
|
|
31
|
+
const row = rows[i];
|
|
32
|
+
decoded[i] = {
|
|
33
|
+
keyId: (0, coercion_1.asBytes)(row.key_id, 'appstate_sync_keys.key_id'),
|
|
34
|
+
keyData: (0, coercion_1.asBytes)(row.key_data, 'appstate_sync_keys.key_data'),
|
|
35
|
+
timestamp: (0, coercion_1.asNumber)(row.timestamp, 'appstate_sync_keys.timestamp'),
|
|
36
|
+
fingerprint: decodeAppStateFingerprint(row.fingerprint)
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
return decoded;
|
|
35
40
|
}
|
|
36
41
|
function decodeAppStateCollections(versionRows, valueRows) {
|
|
37
42
|
const valueMapByCollection = new Map();
|
package/dist/appstate/index.js
CHANGED
|
@@ -14,15 +14,17 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
14
14
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
exports.WaAppStateSyncClient = exports.parseSyncResponse = exports.
|
|
17
|
+
exports.WaAppStateSyncClient = exports.parseSyncResponse = exports.WaAppStateCrypto = exports.decodeAppStateSyncKeys = exports.decodeAppStateCollections = exports.decodeAppStateFingerprint = exports.encodeAppStateFingerprint = void 0;
|
|
18
18
|
__exportStar(require("./constants"), exports);
|
|
19
|
+
var encoding_1 = require("./encoding");
|
|
20
|
+
Object.defineProperty(exports, "encodeAppStateFingerprint", { enumerable: true, get: function () { return encoding_1.encodeAppStateFingerprint; } });
|
|
21
|
+
Object.defineProperty(exports, "decodeAppStateFingerprint", { enumerable: true, get: function () { return encoding_1.decodeAppStateFingerprint; } });
|
|
22
|
+
Object.defineProperty(exports, "decodeAppStateCollections", { enumerable: true, get: function () { return encoding_1.decodeAppStateCollections; } });
|
|
23
|
+
Object.defineProperty(exports, "decodeAppStateSyncKeys", { enumerable: true, get: function () { return encoding_1.decodeAppStateSyncKeys; } });
|
|
19
24
|
__exportStar(require("./utils"), exports);
|
|
20
25
|
var WaAppStateCrypto_1 = require("./WaAppStateCrypto");
|
|
21
26
|
Object.defineProperty(exports, "WaAppStateCrypto", { enumerable: true, get: function () { return WaAppStateCrypto_1.WaAppStateCrypto; } });
|
|
22
|
-
var WaAppStateSyncClient_1 = require("./WaAppStateSyncClient");
|
|
23
|
-
Object.defineProperty(exports, "WaAppStateMissingKeyError", { enumerable: true, get: function () { return WaAppStateSyncClient_1.WaAppStateMissingKeyError; } });
|
|
24
27
|
var WaAppStateSyncResponseParser_1 = require("./WaAppStateSyncResponseParser");
|
|
25
|
-
Object.defineProperty(exports, "parseCollectionState", { enumerable: true, get: function () { return WaAppStateSyncResponseParser_1.parseCollectionState; } });
|
|
26
28
|
Object.defineProperty(exports, "parseSyncResponse", { enumerable: true, get: function () { return WaAppStateSyncResponseParser_1.parseSyncResponse; } });
|
|
27
|
-
var
|
|
28
|
-
Object.defineProperty(exports, "WaAppStateSyncClient", { enumerable: true, get: function () { return
|
|
29
|
+
var WaAppStateSyncClient_1 = require("./WaAppStateSyncClient");
|
|
30
|
+
Object.defineProperty(exports, "WaAppStateSyncClient", { enumerable: true, get: function () { return WaAppStateSyncClient_1.WaAppStateSyncClient; } });
|
package/dist/appstate/utils.js
CHANGED
|
@@ -1,40 +1,22 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.keyIdToHex = keyIdToHex;
|
|
4
3
|
exports.parseCollectionName = parseCollectionName;
|
|
5
|
-
exports.keyDeviceId = keyDeviceId;
|
|
6
4
|
exports.keyEpoch = keyEpoch;
|
|
7
5
|
exports.pickActiveSyncKey = pickActiveSyncKey;
|
|
8
|
-
exports.toNetworkOrder64 = toNetworkOrder64;
|
|
9
6
|
exports.downloadExternalBlobReference = downloadExternalBlobReference;
|
|
10
7
|
const constants_1 = require("../protocol/constants");
|
|
11
|
-
const base64_1 = require("../util/base64");
|
|
12
8
|
const bytes_1 = require("../util/bytes");
|
|
13
|
-
|
|
14
|
-
return (0, bytes_1.bytesToHex)(keyId);
|
|
15
|
-
}
|
|
9
|
+
const APP_STATE_COLLECTION_NAMES = new Set(Object.values(constants_1.WA_APP_STATE_COLLECTIONS));
|
|
16
10
|
function parseCollectionName(value) {
|
|
17
|
-
|
|
18
|
-
return null;
|
|
19
|
-
}
|
|
20
|
-
for (const collection of Object.values(constants_1.WA_APP_STATE_COLLECTIONS)) {
|
|
21
|
-
if (collection === value) {
|
|
22
|
-
return collection;
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
return null;
|
|
11
|
+
return value && APP_STATE_COLLECTION_NAMES.has(value) ? value : null;
|
|
26
12
|
}
|
|
27
13
|
function keyDeviceId(keyId) {
|
|
28
|
-
|
|
29
|
-
return null;
|
|
30
|
-
}
|
|
31
|
-
return (keyId[0] << 8) | keyId[1];
|
|
14
|
+
return keyId.byteLength < 6 ? null : (keyId[0] << 8) | keyId[1];
|
|
32
15
|
}
|
|
33
16
|
function keyEpoch(keyId) {
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
return new DataView(keyId.buffer, keyId.byteOffset, keyId.byteLength).getUint32(2, false);
|
|
17
|
+
return keyId.byteLength < 6
|
|
18
|
+
? -1
|
|
19
|
+
: keyId[2] * 16777216 + keyId[3] * 65536 + keyId[4] * 256 + keyId[5];
|
|
38
20
|
}
|
|
39
21
|
function pickActiveSyncKey(keys) {
|
|
40
22
|
let active = null;
|
|
@@ -60,20 +42,13 @@ function pickActiveSyncKey(keys) {
|
|
|
60
42
|
}
|
|
61
43
|
return active;
|
|
62
44
|
}
|
|
63
|
-
function toNetworkOrder64(value) {
|
|
64
|
-
const out = new Uint8Array(8);
|
|
65
|
-
const view = new DataView(out.buffer);
|
|
66
|
-
view.setUint32(0, Math.floor(value / 4294967296), false);
|
|
67
|
-
view.setUint32(4, value >>> 0, false);
|
|
68
|
-
return out;
|
|
69
|
-
}
|
|
70
45
|
async function downloadExternalBlobReference(mediaTransfer, reference) {
|
|
71
46
|
if (!reference.directPath) {
|
|
72
47
|
throw new Error('external blob reference is missing directPath');
|
|
73
48
|
}
|
|
74
|
-
const mediaKey = (0,
|
|
75
|
-
const fileSha256 = (0,
|
|
76
|
-
const fileEncSha256 = (0,
|
|
49
|
+
const mediaKey = (0, bytes_1.decodeProtoBytes)(reference.mediaKey, 'external blob mediaKey');
|
|
50
|
+
const fileSha256 = (0, bytes_1.decodeProtoBytes)(reference.fileSha256, 'external blob fileSha256');
|
|
51
|
+
const fileEncSha256 = (0, bytes_1.decodeProtoBytes)(reference.fileEncSha256, 'external blob fileEncSha256');
|
|
77
52
|
return mediaTransfer.downloadAndDecrypt({
|
|
78
53
|
directPath: reference.directPath,
|
|
79
54
|
mediaType: constants_1.WA_APP_STATE_KEY_TYPES.MD_APP_STATE,
|
|
@@ -70,7 +70,7 @@ class WaAuthClient {
|
|
|
70
70
|
signalStore: this.signalStore
|
|
71
71
|
});
|
|
72
72
|
this.logger.info('auth client credentials ready', {
|
|
73
|
-
registered: this.credentials
|
|
73
|
+
registered: this.credentials?.meJid !== null && this.credentials?.meJid !== undefined
|
|
74
74
|
});
|
|
75
75
|
return this.credentials;
|
|
76
76
|
});
|
|
@@ -80,7 +80,8 @@ class WaAuthClient {
|
|
|
80
80
|
return (0, WaAuthCredentialsFlow_1.buildCommsConfig)(this.logger, this.requireCredentials(), socketOptions, {
|
|
81
81
|
deviceBrowser: this.options.deviceBrowser,
|
|
82
82
|
deviceOsDisplayName: this.options.deviceOsDisplayName,
|
|
83
|
-
requireFullSync: this.options.requireFullSync
|
|
83
|
+
requireFullSync: this.options.requireFullSync,
|
|
84
|
+
version: this.options.version
|
|
84
85
|
});
|
|
85
86
|
}
|
|
86
87
|
async clearTransientState() {
|
|
@@ -90,9 +91,8 @@ class WaAuthClient {
|
|
|
90
91
|
}
|
|
91
92
|
async clearStoredCredentials() {
|
|
92
93
|
this.logger.warn('auth client clearing stored credentials');
|
|
93
|
-
await this.authStore.clear();
|
|
94
94
|
this.credentials = null;
|
|
95
|
-
await this.clearTransientState();
|
|
95
|
+
await Promise.all([this.authStore.clear(), this.clearTransientState()]);
|
|
96
96
|
}
|
|
97
97
|
async persistServerStaticKey(serverStaticKey) {
|
|
98
98
|
this.logger.debug('persisting server static key', {
|
|
@@ -144,51 +144,39 @@ class WaAuthClient {
|
|
|
144
144
|
}
|
|
145
145
|
});
|
|
146
146
|
}
|
|
147
|
-
async persistMeLid(meLid) {
|
|
148
|
-
await this.persistSuccessAttributes({
|
|
149
|
-
meLid
|
|
150
|
-
});
|
|
151
|
-
}
|
|
152
147
|
async persistSuccessAttributes(attributes) {
|
|
153
|
-
let
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
propsVersion: nextPropsVersion,
|
|
184
|
-
abPropsVersion: nextAbPropsVersion,
|
|
185
|
-
connectionLocation: nextConnectionLocation,
|
|
186
|
-
accountCreationTs: nextAccountCreationTs
|
|
187
|
-
};
|
|
188
|
-
}, {
|
|
189
|
-
shouldPersist: () => Object.values(changes).some(Boolean),
|
|
148
|
+
let persistDiff;
|
|
149
|
+
const computeDiff = (current, next) => ({
|
|
150
|
+
lidChanged: next.meLid !== current.meLid,
|
|
151
|
+
displayNameChanged: next.meDisplayName !== current.meDisplayName,
|
|
152
|
+
companionChanged: (current.companionEncStatic === undefined) !==
|
|
153
|
+
(next.companionEncStatic === undefined) ||
|
|
154
|
+
(current.companionEncStatic !== undefined &&
|
|
155
|
+
next.companionEncStatic !== undefined &&
|
|
156
|
+
!(0, bytes_1.uint8Equal)(current.companionEncStatic, next.companionEncStatic)),
|
|
157
|
+
lastSuccessTsChanged: next.lastSuccessTs !== current.lastSuccessTs,
|
|
158
|
+
propsVersionChanged: next.propsVersion !== current.propsVersion,
|
|
159
|
+
abPropsVersionChanged: next.abPropsVersion !== current.abPropsVersion,
|
|
160
|
+
connectionLocationChanged: next.connectionLocation !== current.connectionLocation,
|
|
161
|
+
accountCreationTsChanged: next.accountCreationTs !== current.accountCreationTs
|
|
162
|
+
});
|
|
163
|
+
await this.patchCredentials((credentials) => ({
|
|
164
|
+
...credentials,
|
|
165
|
+
meLid: attributes.meLid ?? credentials.meLid,
|
|
166
|
+
meDisplayName: attributes.meDisplayName ?? credentials.meDisplayName,
|
|
167
|
+
companionEncStatic: attributes.companionEncStatic ?? credentials.companionEncStatic,
|
|
168
|
+
lastSuccessTs: attributes.lastSuccessTs ?? credentials.lastSuccessTs,
|
|
169
|
+
propsVersion: attributes.propsVersion ?? credentials.propsVersion,
|
|
170
|
+
abPropsVersion: attributes.abPropsVersion ?? credentials.abPropsVersion,
|
|
171
|
+
connectionLocation: attributes.connectionLocation ?? credentials.connectionLocation,
|
|
172
|
+
accountCreationTs: attributes.accountCreationTs ?? credentials.accountCreationTs
|
|
173
|
+
}), {
|
|
174
|
+
shouldPersist: (current, next) => {
|
|
175
|
+
persistDiff = computeDiff(current, next);
|
|
176
|
+
return Object.values(persistDiff).some(Boolean);
|
|
177
|
+
},
|
|
190
178
|
onPersist: () => {
|
|
191
|
-
this.logger.debug('persisting success attributes',
|
|
179
|
+
this.logger.debug('persisting success attributes', persistDiff);
|
|
192
180
|
}
|
|
193
181
|
});
|
|
194
182
|
}
|
|
@@ -203,24 +191,18 @@ class WaAuthClient {
|
|
|
203
191
|
return this.runHandled(() => this.pairingFlow.fetchPairingCountryCodeIso());
|
|
204
192
|
}
|
|
205
193
|
async handleIncomingIqSet(node) {
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
return this.pairingFlow.handleIncomingIqSet(node);
|
|
209
|
-
});
|
|
194
|
+
this.logger.trace('auth client handleIncomingIqSet', { id: node.attrs.id });
|
|
195
|
+
return this.runHandled(() => this.pairingFlow.handleIncomingIqSet(node));
|
|
210
196
|
}
|
|
211
197
|
async handleLinkCodeNotification(node) {
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
return this.pairingFlow.handleLinkCodeNotification(node);
|
|
215
|
-
});
|
|
198
|
+
this.logger.trace('auth client handleLinkCodeNotification', { id: node.attrs.id });
|
|
199
|
+
return this.runHandled(() => this.pairingFlow.handleLinkCodeNotification(node));
|
|
216
200
|
}
|
|
217
201
|
async handleCompanionRegRefreshNotification(node) {
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
id: node.attrs.id
|
|
221
|
-
});
|
|
222
|
-
return this.pairingFlow.handleCompanionRegRefreshNotification(node);
|
|
202
|
+
this.logger.trace('auth client handleCompanionRegRefreshNotification', {
|
|
203
|
+
id: node.attrs.id
|
|
223
204
|
});
|
|
205
|
+
return this.runHandled(() => this.pairingFlow.handleCompanionRegRefreshNotification(node));
|
|
224
206
|
}
|
|
225
207
|
async patchCredentials(buildNext, options = {}) {
|
|
226
208
|
const current = this.requireCredentials();
|
|
@@ -243,7 +225,7 @@ class WaAuthClient {
|
|
|
243
225
|
}
|
|
244
226
|
async updateCredentials(credentials) {
|
|
245
227
|
this.logger.trace('auth client update credentials', {
|
|
246
|
-
registered: credentials
|
|
228
|
+
registered: credentials?.meJid !== null && credentials?.meJid !== undefined
|
|
247
229
|
});
|
|
248
230
|
this.credentials = credentials;
|
|
249
231
|
await (0, WaAuthCredentialsFlow_1.persistCredentials)({
|
|
@@ -9,12 +9,13 @@ const X25519_1 = require("../../crypto/curves/X25519");
|
|
|
9
9
|
const jid_1 = require("../../protocol/jid");
|
|
10
10
|
const WaAdvSignature_1 = require("../../signal/crypto/WaAdvSignature");
|
|
11
11
|
const utils_1 = require("../../signal/registration/utils");
|
|
12
|
+
const proxy_1 = require("../../transport/proxy");
|
|
12
13
|
const primitives_1 = require("../../util/primitives");
|
|
13
14
|
async function loadOrCreateCredentials(args) {
|
|
14
15
|
args.logger.trace('auth credentials loadOrCreate start');
|
|
15
16
|
const existing = await args.authStore.load();
|
|
16
17
|
if (!existing) {
|
|
17
|
-
const credentials = await
|
|
18
|
+
const credentials = await createFreshAndPersistCredentials(args);
|
|
18
19
|
args.logger.info('created fresh auth credentials');
|
|
19
20
|
return credentials;
|
|
20
21
|
}
|
|
@@ -24,7 +25,7 @@ async function loadOrCreateCredentials(args) {
|
|
|
24
25
|
});
|
|
25
26
|
if (!existing.meJid && !(await hasValidSignedPreKey(args.logger, existing))) {
|
|
26
27
|
args.logger.warn('signed pre-key is invalid, regenerating credentials');
|
|
27
|
-
const fresh = await
|
|
28
|
+
const fresh = await createFreshAndPersistCredentials(args);
|
|
28
29
|
args.logger.info('regenerated credentials due to invalid signed pre-key');
|
|
29
30
|
return fresh;
|
|
30
31
|
}
|
|
@@ -39,8 +40,10 @@ async function persistCredentials(args, credentials) {
|
|
|
39
40
|
await args.authStore.save(credentials);
|
|
40
41
|
}
|
|
41
42
|
function buildCommsConfig(logger, credentials, socketOptions, clientOptions) {
|
|
42
|
-
const
|
|
43
|
-
const
|
|
43
|
+
const meJid = credentials.meJid;
|
|
44
|
+
const registered = meJid !== null && meJid !== undefined;
|
|
45
|
+
const loginIdentity = registered ? (0, jid_1.getLoginIdentity)(meJid) : null;
|
|
46
|
+
const wsProxy = socketOptions.proxy?.ws;
|
|
44
47
|
logger.debug('building comms config from credentials', {
|
|
45
48
|
registered,
|
|
46
49
|
hasServerStaticKey: credentials.serverStaticKey !== null && credentials.serverStaticKey !== undefined
|
|
@@ -49,6 +52,8 @@ function buildCommsConfig(logger, credentials, socketOptions, clientOptions) {
|
|
|
49
52
|
url: socketOptions.url,
|
|
50
53
|
urls: socketOptions.urls,
|
|
51
54
|
protocols: socketOptions.protocols,
|
|
55
|
+
dispatcher: (0, proxy_1.toProxyDispatcher)(wsProxy),
|
|
56
|
+
agent: (0, proxy_1.toProxyAgent)(wsProxy),
|
|
52
57
|
connectTimeoutMs: socketOptions.connectTimeoutMs,
|
|
53
58
|
reconnectIntervalMs: socketOptions.reconnectIntervalMs,
|
|
54
59
|
timeoutIntervalMs: socketOptions.timeoutIntervalMs,
|
|
@@ -63,7 +68,8 @@ function buildCommsConfig(logger, credentials, socketOptions, clientOptions) {
|
|
|
63
68
|
username: loginIdentity.username,
|
|
64
69
|
device: loginIdentity.device,
|
|
65
70
|
deviceBrowser: clientOptions.deviceBrowser,
|
|
66
|
-
deviceOsDisplayName: clientOptions.deviceOsDisplayName
|
|
71
|
+
deviceOsDisplayName: clientOptions.deviceOsDisplayName,
|
|
72
|
+
versionBase: clientOptions.version
|
|
67
73
|
}
|
|
68
74
|
: undefined,
|
|
69
75
|
registrationPayloadConfig: !loginIdentity
|
|
@@ -72,7 +78,8 @@ function buildCommsConfig(logger, credentials, socketOptions, clientOptions) {
|
|
|
72
78
|
signedPreKey: credentials.signedPreKey,
|
|
73
79
|
deviceBrowser: clientOptions.deviceBrowser,
|
|
74
80
|
deviceOsDisplayName: clientOptions.deviceOsDisplayName,
|
|
75
|
-
requireFullSync: clientOptions.requireFullSync
|
|
81
|
+
requireFullSync: clientOptions.requireFullSync,
|
|
82
|
+
versionBase: clientOptions.version
|
|
76
83
|
}
|
|
77
84
|
: undefined
|
|
78
85
|
}
|
|
@@ -93,9 +100,11 @@ async function createFreshCredentials(signalStore, logger) {
|
|
|
93
100
|
advSecretKey
|
|
94
101
|
};
|
|
95
102
|
}
|
|
96
|
-
async function
|
|
103
|
+
async function createFreshAndPersistCredentials(args) {
|
|
97
104
|
const credentials = await createFreshCredentials(args.signalStore, args.logger);
|
|
98
|
-
|
|
105
|
+
// Persist credentials first so signal restore never commits state for credentials that failed to save.
|
|
106
|
+
await args.authStore.save(credentials);
|
|
107
|
+
await restoreSignalStore(args.signalStore, credentials);
|
|
99
108
|
return credentials;
|
|
100
109
|
}
|
|
101
110
|
async function hasValidSignedPreKey(logger, credentials) {
|
|
@@ -113,11 +122,9 @@ async function hasValidSignedPreKey(logger, credentials) {
|
|
|
113
122
|
}
|
|
114
123
|
}
|
|
115
124
|
async function restoreSignalStore(signalStore, credentials) {
|
|
116
|
-
await
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
await args.authStore.save(credentials);
|
|
122
|
-
await restoreSignalStore(args.signalStore, credentials);
|
|
125
|
+
await Promise.all([
|
|
126
|
+
signalStore.setRegistrationInfo(credentials.registrationInfo),
|
|
127
|
+
signalStore.setSignedPreKey(credentials.signedPreKey),
|
|
128
|
+
signalStore.setServerHasPreKeys(credentials.serverHasPreKeys === true)
|
|
129
|
+
]);
|
|
123
130
|
}
|
package/dist/auth/index.js
CHANGED
|
@@ -14,14 +14,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
14
14
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
exports.
|
|
17
|
+
exports.WaAuthClient = void 0;
|
|
18
18
|
__exportStar(require("./types"), exports);
|
|
19
|
-
var jid_1 = require("../protocol/jid");
|
|
20
|
-
Object.defineProperty(exports, "getLoginIdentity", { enumerable: true, get: function () { return jid_1.getLoginIdentity; } });
|
|
21
19
|
var WaAuthClient_1 = require("./WaAuthClient");
|
|
22
20
|
Object.defineProperty(exports, "WaAuthClient", { enumerable: true, get: function () { return WaAuthClient_1.WaAuthClient; } });
|
|
23
|
-
var WaPairingCodeCrypto_1 = require("./pairing/WaPairingCodeCrypto");
|
|
24
|
-
Object.defineProperty(exports, "completeCompanionFinish", { enumerable: true, get: function () { return WaPairingCodeCrypto_1.completeCompanionFinish; } });
|
|
25
|
-
Object.defineProperty(exports, "createCompanionHello", { enumerable: true, get: function () { return WaPairingCodeCrypto_1.createCompanionHello; } });
|
|
26
|
-
var auth_store_1 = require("../store/providers/sqlite/auth.store");
|
|
27
|
-
Object.defineProperty(exports, "WaAuthSqliteStore", { enumerable: true, get: function () { return auth_store_1.WaAuthSqliteStore; } });
|
|
@@ -49,8 +49,8 @@ async function completeCompanionFinish(args) {
|
|
|
49
49
|
if (primaryEphemeralPub.length === 0) {
|
|
50
50
|
throw new Error('empty primary ephemeral public key');
|
|
51
51
|
}
|
|
52
|
-
const sharedEphemeral = await
|
|
53
|
-
|
|
52
|
+
const [sharedEphemeral, bundleSalt, bundleSecret, bundleIv] = await Promise.all([
|
|
53
|
+
X25519_1.X25519.scalarMult(args.companionEphemeralPrivKey, primaryEphemeralPub),
|
|
54
54
|
(0, _crypto_1.randomBytesAsync)(32),
|
|
55
55
|
(0, _crypto_1.randomBytesAsync)(32),
|
|
56
56
|
(0, _crypto_1.randomBytesAsync)(12)
|
|
@@ -62,9 +62,11 @@ async function completeCompanionFinish(args) {
|
|
|
62
62
|
args.primaryIdentityPub,
|
|
63
63
|
bundleSecret
|
|
64
64
|
]);
|
|
65
|
-
const encryptedBundle = await
|
|
65
|
+
const [encryptedBundle, sharedIdentity] = await Promise.all([
|
|
66
|
+
(0, _crypto_1.aesGcmEncrypt)(bundleEncryptionKey, bundleIv, plaintextBundle),
|
|
67
|
+
X25519_1.X25519.scalarMult(args.registrationIdentityKeyPair.privKey, args.primaryIdentityPub)
|
|
68
|
+
]);
|
|
66
69
|
const wrappedKeyBundle = (0, bytes_1.concatBytes)([bundleSalt, bundleIv, encryptedBundle]);
|
|
67
|
-
const sharedIdentity = await X25519_1.X25519.scalarMult(args.registrationIdentityKeyPair.privKey, args.primaryIdentityPub);
|
|
68
70
|
const advMaterial = (0, bytes_1.concatBytes)([sharedEphemeral, sharedIdentity, bundleSecret]);
|
|
69
71
|
const advSecret = await (0, _crypto_1.hkdf)(advMaterial, null, constants_2.WA_PAIRING_KDF_INFO.ADV_SECRET, 32);
|
|
70
72
|
return {
|
|
@@ -7,10 +7,11 @@ const _proto_1 = require("../../proto.js");
|
|
|
7
7
|
const constants_1 = require("../../protocol/constants");
|
|
8
8
|
const jid_1 = require("../../protocol/jid");
|
|
9
9
|
const WaAdvSignature_1 = require("../../signal/crypto/WaAdvSignature");
|
|
10
|
+
const global_1 = require("../../transport/node/builders/global");
|
|
10
11
|
const pairing_1 = require("../../transport/node/builders/pairing");
|
|
11
12
|
const helpers_1 = require("../../transport/node/helpers");
|
|
12
|
-
const base64_1 = require("../../util/base64");
|
|
13
13
|
const bytes_1 = require("../../util/bytes");
|
|
14
|
+
const bytes_2 = require("../../util/bytes");
|
|
14
15
|
class WaPairingFlow {
|
|
15
16
|
constructor(options) {
|
|
16
17
|
this.opts = options;
|
|
@@ -121,7 +122,10 @@ class WaPairingFlow {
|
|
|
121
122
|
id: node.attrs.id,
|
|
122
123
|
stage: linkCodeNode.attrs.stage
|
|
123
124
|
});
|
|
124
|
-
await this.opts.socket.sendNode((0,
|
|
125
|
+
await this.opts.socket.sendNode((0, global_1.buildAckNode)({
|
|
126
|
+
kind: 'notification',
|
|
127
|
+
node
|
|
128
|
+
}));
|
|
125
129
|
const stage = linkCodeNode.attrs.stage;
|
|
126
130
|
if (stage === constants_1.WA_SIGNALING.LINK_CODE_STAGE_REFRESH_CODE) {
|
|
127
131
|
const refNode = (0, helpers_1.findNodeChild)(linkCodeNode, constants_1.WA_NODE_TAGS.LINK_CODE_PAIRING_REF);
|
|
@@ -129,7 +133,7 @@ class WaPairingFlow {
|
|
|
129
133
|
return true;
|
|
130
134
|
}
|
|
131
135
|
const ref = (0, helpers_1.decodeNodeContentUtf8OrBytes)(refNode.content, 'refresh_code.link_code_pairing_ref');
|
|
132
|
-
if ((0,
|
|
136
|
+
if ((0, bytes_2.uint8Equal)(ref, this.pairingSession.ref)) {
|
|
133
137
|
this.opts.logger.info('received pairing refresh notification', {
|
|
134
138
|
forceManualRefresh: linkCodeNode.attrs.force_manual_refresh === 'true'
|
|
135
139
|
});
|
|
@@ -149,27 +153,29 @@ class WaPairingFlow {
|
|
|
149
153
|
if (!hasExpectedChild) {
|
|
150
154
|
return false;
|
|
151
155
|
}
|
|
152
|
-
|
|
156
|
+
// Rotate first so we don't ack success before local credential state is durably updated.
|
|
153
157
|
await this.rotateAdvSecret(this.requireCredentials());
|
|
158
|
+
await this.opts.socket.sendNode((0, global_1.buildAckNode)({
|
|
159
|
+
kind: 'notification',
|
|
160
|
+
node,
|
|
161
|
+
typeOverride: constants_1.WA_SIGNALING.COMPANION_REG_REFRESH_NOTIFICATION
|
|
162
|
+
}));
|
|
154
163
|
this.opts.logger.info('handled companion_reg_refresh notification');
|
|
155
164
|
this.opts.qrFlow.refreshCurrentQr();
|
|
156
165
|
return true;
|
|
157
166
|
}
|
|
158
167
|
async handlePairDevice(iqNode, pairDeviceNode) {
|
|
159
|
-
const refs = (0, helpers_1.
|
|
160
|
-
|
|
161
|
-
.filter((ref) => ref.length > 0);
|
|
168
|
+
const refs = (0, helpers_1.getNodeChildrenNonEmptyUtf8ByTag)(pairDeviceNode, constants_1.WA_NODE_TAGS.REF, 'pair-device.ref');
|
|
169
|
+
// Commit adv-secret rotation before sending IQ success to avoid protocol/state divergence.
|
|
162
170
|
await this.rotateAdvSecret(this.requireCredentials());
|
|
171
|
+
await this.opts.socket.sendNode((0, global_1.buildIqResultNode)(iqNode));
|
|
163
172
|
this.opts.qrFlow.setRefs(refs);
|
|
164
173
|
this.opts.logger.info('pair-device refs updated', { refsCount: refs.length });
|
|
165
|
-
await this.opts.socket.sendNode((0, pairing_1.buildIqResultNode)(iqNode));
|
|
166
174
|
}
|
|
167
175
|
async handlePairSuccess(iqNode, pairSuccessNode) {
|
|
168
176
|
this.opts.logger.info('processing pair-success node');
|
|
169
177
|
const credentials = this.requireCredentials();
|
|
170
|
-
const deviceIdentityNode = (0, helpers_1.
|
|
171
|
-
const deviceNode = (0, helpers_1.findNodeChild)(pairSuccessNode, 'device');
|
|
172
|
-
const platformNode = (0, helpers_1.findNodeChild)(pairSuccessNode, constants_1.WA_NODE_TAGS.PLATFORM);
|
|
178
|
+
const [deviceIdentityNode, deviceNode, platformNode] = (0, helpers_1.findNodeChildrenByTags)(pairSuccessNode, [constants_1.WA_NODE_TAGS.DEVICE_IDENTITY, 'device', constants_1.WA_NODE_TAGS.PLATFORM]);
|
|
173
179
|
if (!deviceIdentityNode || !deviceNode || !platformNode) {
|
|
174
180
|
this.opts.logger.error('pair-success missing required nodes', {
|
|
175
181
|
hasDeviceIdentity: !!deviceIdentityNode,
|
|
@@ -179,15 +185,15 @@ class WaPairingFlow {
|
|
|
179
185
|
throw new Error('pair-success stanza is missing required nodes');
|
|
180
186
|
}
|
|
181
187
|
const wrappedIdentity = _proto_1.proto.ADVSignedDeviceIdentityHMAC.decode((0, helpers_1.decodeNodeContentUtf8OrBytes)(deviceIdentityNode.content, 'pair-success.device-identity'));
|
|
182
|
-
const wrappedDetails = (0,
|
|
183
|
-
const wrappedHmac = (0,
|
|
188
|
+
const wrappedDetails = (0, bytes_1.decodeProtoBytes)(wrappedIdentity.details, 'ADVSignedDeviceIdentityHMAC.details');
|
|
189
|
+
const wrappedHmac = (0, bytes_1.decodeProtoBytes)(wrappedIdentity.hmac, 'ADVSignedDeviceIdentityHMAC.hmac');
|
|
184
190
|
const accountType = wrappedIdentity.accountType ?? _proto_1.proto.ADVEncryptionType.E2EE;
|
|
185
191
|
const isHosted = accountType === _proto_1.proto.ADVEncryptionType.HOSTED;
|
|
186
192
|
const hmacInput = isHosted
|
|
187
|
-
? (0,
|
|
193
|
+
? (0, bytes_2.concatBytes)([WaAdvSignature_1.ADV_PREFIX_HOSTED_ACCOUNT_SIGNATURE, wrappedDetails])
|
|
188
194
|
: wrappedDetails;
|
|
189
195
|
const expectedHmac = await (0, WaAdvSignature_1.computeAdvIdentityHmac)(credentials.advSecretKey, hmacInput);
|
|
190
|
-
if (!(0,
|
|
196
|
+
if (!(0, bytes_2.uint8Equal)(expectedHmac, wrappedHmac)) {
|
|
191
197
|
this.opts.logger.error('pair-success hmac mismatch');
|
|
192
198
|
throw new Error('pair-success HMAC validation failed');
|
|
193
199
|
}
|
|
@@ -234,9 +240,9 @@ class WaPairingFlow {
|
|
|
234
240
|
}
|
|
235
241
|
async buildPairSuccessResponseIdentity(credentials, wrappedDetails, isHosted) {
|
|
236
242
|
const signedIdentity = _proto_1.proto.ADVSignedDeviceIdentity.decode(wrappedDetails);
|
|
237
|
-
const details = (0,
|
|
238
|
-
const accountSignature = (0,
|
|
239
|
-
const accountSignatureKey = (0,
|
|
243
|
+
const details = (0, bytes_1.decodeProtoBytes)(signedIdentity.details, 'ADVSignedDeviceIdentity.details');
|
|
244
|
+
const accountSignature = (0, bytes_1.decodeProtoBytes)(signedIdentity.accountSignature, 'ADVSignedDeviceIdentity.accountSignature');
|
|
245
|
+
const accountSignatureKey = (0, bytes_1.decodeProtoBytes)(signedIdentity.accountSignatureKey, 'ADVSignedDeviceIdentity.accountSignatureKey');
|
|
240
246
|
const localIdentity = credentials.registrationInfo.identityKeyPair;
|
|
241
247
|
const validAccountSignature = await (0, WaAdvSignature_1.verifyDeviceIdentityAccountSignature)(details, accountSignature, localIdentity.pubKey, accountSignatureKey, isHosted);
|
|
242
248
|
if (!validAccountSignature) {
|
|
@@ -270,14 +276,16 @@ class WaPairingFlow {
|
|
|
270
276
|
if (pairingSession.attempts > 3) {
|
|
271
277
|
throw new Error('pairing code exceeded maximum primary hello attempts');
|
|
272
278
|
}
|
|
273
|
-
const refNode = (0, helpers_1.
|
|
274
|
-
|
|
275
|
-
|
|
279
|
+
const [refNode, wrappedPrimaryNode, primaryIdentityNode] = (0, helpers_1.findNodeChildrenByTags)(linkCodeNode, [
|
|
280
|
+
constants_1.WA_NODE_TAGS.LINK_CODE_PAIRING_REF,
|
|
281
|
+
'link_code_pairing_wrapped_primary_ephemeral_pub',
|
|
282
|
+
'primary_identity_pub'
|
|
283
|
+
]);
|
|
276
284
|
if (!refNode || !wrappedPrimaryNode || !primaryIdentityNode) {
|
|
277
285
|
throw new Error('primary_hello notification is missing fields');
|
|
278
286
|
}
|
|
279
287
|
const ref = (0, helpers_1.decodeNodeContentUtf8OrBytes)(refNode.content, 'primary_hello.link_code_pairing_ref');
|
|
280
|
-
if (!pairingSession.ref || !(0,
|
|
288
|
+
if (!pairingSession.ref || !(0, bytes_2.uint8Equal)(ref, pairingSession.ref)) {
|
|
281
289
|
this.opts.logger.warn('primary_hello ref mismatch ignored');
|
|
282
290
|
return;
|
|
283
291
|
}
|
|
@@ -293,10 +301,6 @@ class WaPairingFlow {
|
|
|
293
301
|
companionEphemeralPrivKey: pairingSession.companionEphemeralKeyPair.privKey,
|
|
294
302
|
registrationIdentityKeyPair: credentials.registrationInfo.identityKeyPair
|
|
295
303
|
});
|
|
296
|
-
await this.opts.auth.updateCredentials({
|
|
297
|
-
...credentials,
|
|
298
|
-
advSecretKey: finish.advSecret
|
|
299
|
-
});
|
|
300
304
|
const result = await this.opts.socket.query((0, pairing_1.buildCompanionFinishRequestNode)({
|
|
301
305
|
phoneJid: pairingSession.phoneJid,
|
|
302
306
|
wrappedKeyBundle: finish.wrappedKeyBundle,
|
|
@@ -306,6 +310,10 @@ class WaPairingFlow {
|
|
|
306
310
|
if (result.attrs.type === constants_1.WA_IQ_TYPES.ERROR) {
|
|
307
311
|
throw new Error('companion_finish returned error');
|
|
308
312
|
}
|
|
313
|
+
await this.opts.auth.updateCredentials({
|
|
314
|
+
...credentials,
|
|
315
|
+
advSecretKey: finish.advSecret
|
|
316
|
+
});
|
|
309
317
|
pairingSession.finished = true;
|
|
310
318
|
this.opts.logger.info('primary_hello completed with companion_finish success');
|
|
311
319
|
}
|