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
|
@@ -1,13 +1,19 @@
|
|
|
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, findNodeChild, getNodeChildrenByTag } from '../transport/node/helpers.js';
|
|
4
|
+
import { decodeNodeContentBase64OrBytes, findNodeChildrenByTags, findNodeChild, 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}`);
|
|
8
8
|
}
|
|
9
9
|
const syncNode = findNodeChild(iqNode, WA_NODE_TAGS.SYNC);
|
|
10
10
|
if (!syncNode) {
|
|
11
|
+
if (iqNode.attrs.type === WA_IQ_TYPES.ERROR) {
|
|
12
|
+
const errorNode = findNodeChild(iqNode, WA_NODE_TAGS.ERROR);
|
|
13
|
+
const code = errorNode?.attrs.code ?? 'unknown';
|
|
14
|
+
const text = errorNode?.attrs.text ?? 'unknown';
|
|
15
|
+
throw new Error(`sync iq failed (${code}: ${text})`);
|
|
16
|
+
}
|
|
11
17
|
throw new Error('sync response is missing <sync> node');
|
|
12
18
|
}
|
|
13
19
|
const payloads = [];
|
|
@@ -26,11 +32,16 @@ export function parseSyncResponse(iqNode) {
|
|
|
26
32
|
}
|
|
27
33
|
version = parsedVersion;
|
|
28
34
|
}
|
|
29
|
-
const patchesNode =
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
const
|
|
35
|
+
const [patchesNode, snapshotNode] = findNodeChildrenByTags(collectionNode, [
|
|
36
|
+
WA_NODE_TAGS.PATCHES,
|
|
37
|
+
WA_NODE_TAGS.SNAPSHOT
|
|
38
|
+
]);
|
|
39
|
+
const patches = [];
|
|
40
|
+
if (patchesNode) {
|
|
41
|
+
for (const patchNode of getNodeChildrenByTag(patchesNode, WA_NODE_TAGS.PATCH)) {
|
|
42
|
+
patches.push(proto.SyncdPatch.decode(decodeNodeContentBase64OrBytes(patchNode.content, 'collection.patches.patch')));
|
|
43
|
+
}
|
|
44
|
+
}
|
|
34
45
|
const snapshotReference = snapshotNode
|
|
35
46
|
? proto.ExternalBlobReference.decode(decodeNodeContentBase64OrBytes(snapshotNode.content, 'collection.snapshot'))
|
|
36
47
|
: undefined;
|
|
@@ -11,10 +11,11 @@ export const APP_STATE_IV_LENGTH = 16;
|
|
|
11
11
|
export const APP_STATE_LT_HASH_SIZE = 128;
|
|
12
12
|
export const APP_STATE_POINT_SIZE = 2;
|
|
13
13
|
export const APP_STATE_EMPTY_LT_HASH = new Uint8Array(APP_STATE_LT_HASH_SIZE);
|
|
14
|
-
export const
|
|
14
|
+
export const APP_STATE_DEFAULT_COLLECTION_VERSION = 0;
|
|
15
|
+
export const APP_STATE_DEFAULT_COLLECTIONS = Object.freeze([
|
|
15
16
|
WA_APP_STATE_COLLECTIONS.CRITICAL_UNBLOCK_LOW,
|
|
16
17
|
WA_APP_STATE_COLLECTIONS.CRITICAL_BLOCK,
|
|
17
18
|
WA_APP_STATE_COLLECTIONS.REGULAR_LOW,
|
|
18
19
|
WA_APP_STATE_COLLECTIONS.REGULAR,
|
|
19
20
|
WA_APP_STATE_COLLECTIONS.REGULAR_HIGH
|
|
20
|
-
];
|
|
21
|
+
]);
|
|
@@ -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 './WaAppStateSyncResponseParser.js';
|
|
6
6
|
export { WaAppStateSyncClient } from './WaAppStateSyncClient.js';
|
|
@@ -1,31 +1,16 @@
|
|
|
1
1
|
import { WA_APP_STATE_COLLECTIONS, WA_APP_STATE_KEY_TYPES } from '../protocol/constants.js';
|
|
2
|
-
import { decodeProtoBytes } from '../util/
|
|
3
|
-
|
|
4
|
-
export function keyIdToHex(keyId) {
|
|
5
|
-
return bytesToHex(keyId);
|
|
6
|
-
}
|
|
2
|
+
import { decodeProtoBytes } from '../util/bytes.js';
|
|
3
|
+
const APP_STATE_COLLECTION_NAMES = new Set(Object.values(WA_APP_STATE_COLLECTIONS));
|
|
7
4
|
export function parseCollectionName(value) {
|
|
8
|
-
|
|
9
|
-
return null;
|
|
10
|
-
}
|
|
11
|
-
for (const collection of Object.values(WA_APP_STATE_COLLECTIONS)) {
|
|
12
|
-
if (collection === value) {
|
|
13
|
-
return collection;
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
return null;
|
|
5
|
+
return value && APP_STATE_COLLECTION_NAMES.has(value) ? value : null;
|
|
17
6
|
}
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
return null;
|
|
21
|
-
}
|
|
22
|
-
return (keyId[0] << 8) | keyId[1];
|
|
7
|
+
function keyDeviceId(keyId) {
|
|
8
|
+
return keyId.byteLength < 6 ? null : (keyId[0] << 8) | keyId[1];
|
|
23
9
|
}
|
|
24
10
|
export function keyEpoch(keyId) {
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
return new DataView(keyId.buffer, keyId.byteOffset, keyId.byteLength).getUint32(2, false);
|
|
11
|
+
return keyId.byteLength < 6
|
|
12
|
+
? -1
|
|
13
|
+
: keyId[2] * 16777216 + keyId[3] * 65536 + keyId[4] * 256 + keyId[5];
|
|
29
14
|
}
|
|
30
15
|
export function pickActiveSyncKey(keys) {
|
|
31
16
|
let active = null;
|
|
@@ -51,13 +36,6 @@ export function pickActiveSyncKey(keys) {
|
|
|
51
36
|
}
|
|
52
37
|
return active;
|
|
53
38
|
}
|
|
54
|
-
export function toNetworkOrder64(value) {
|
|
55
|
-
const out = new Uint8Array(8);
|
|
56
|
-
const view = new DataView(out.buffer);
|
|
57
|
-
view.setUint32(0, Math.floor(value / 4294967296), false);
|
|
58
|
-
view.setUint32(4, value >>> 0, false);
|
|
59
|
-
return out;
|
|
60
|
-
}
|
|
61
39
|
export async function downloadExternalBlobReference(mediaTransfer, reference) {
|
|
62
40
|
if (!reference.directPath) {
|
|
63
41
|
throw new Error('external blob reference is missing directPath');
|
|
@@ -67,7 +67,7 @@ export class WaAuthClient {
|
|
|
67
67
|
signalStore: this.signalStore
|
|
68
68
|
});
|
|
69
69
|
this.logger.info('auth client credentials ready', {
|
|
70
|
-
registered: this.credentials
|
|
70
|
+
registered: this.credentials?.meJid !== null && this.credentials?.meJid !== undefined
|
|
71
71
|
});
|
|
72
72
|
return this.credentials;
|
|
73
73
|
});
|
|
@@ -77,7 +77,8 @@ export class WaAuthClient {
|
|
|
77
77
|
return buildCommsConfig(this.logger, this.requireCredentials(), socketOptions, {
|
|
78
78
|
deviceBrowser: this.options.deviceBrowser,
|
|
79
79
|
deviceOsDisplayName: this.options.deviceOsDisplayName,
|
|
80
|
-
requireFullSync: this.options.requireFullSync
|
|
80
|
+
requireFullSync: this.options.requireFullSync,
|
|
81
|
+
version: this.options.version
|
|
81
82
|
});
|
|
82
83
|
}
|
|
83
84
|
async clearTransientState() {
|
|
@@ -87,9 +88,8 @@ export class WaAuthClient {
|
|
|
87
88
|
}
|
|
88
89
|
async clearStoredCredentials() {
|
|
89
90
|
this.logger.warn('auth client clearing stored credentials');
|
|
90
|
-
await this.authStore.clear();
|
|
91
91
|
this.credentials = null;
|
|
92
|
-
await this.clearTransientState();
|
|
92
|
+
await Promise.all([this.authStore.clear(), this.clearTransientState()]);
|
|
93
93
|
}
|
|
94
94
|
async persistServerStaticKey(serverStaticKey) {
|
|
95
95
|
this.logger.debug('persisting server static key', {
|
|
@@ -141,51 +141,39 @@ export class WaAuthClient {
|
|
|
141
141
|
}
|
|
142
142
|
});
|
|
143
143
|
}
|
|
144
|
-
async persistMeLid(meLid) {
|
|
145
|
-
await this.persistSuccessAttributes({
|
|
146
|
-
meLid
|
|
147
|
-
});
|
|
148
|
-
}
|
|
149
144
|
async persistSuccessAttributes(attributes) {
|
|
150
|
-
let
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
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
|
-
propsVersion: nextPropsVersion,
|
|
181
|
-
abPropsVersion: nextAbPropsVersion,
|
|
182
|
-
connectionLocation: nextConnectionLocation,
|
|
183
|
-
accountCreationTs: nextAccountCreationTs
|
|
184
|
-
};
|
|
185
|
-
}, {
|
|
186
|
-
shouldPersist: () => Object.values(changes).some(Boolean),
|
|
145
|
+
let persistDiff;
|
|
146
|
+
const computeDiff = (current, next) => ({
|
|
147
|
+
lidChanged: next.meLid !== current.meLid,
|
|
148
|
+
displayNameChanged: next.meDisplayName !== current.meDisplayName,
|
|
149
|
+
companionChanged: (current.companionEncStatic === undefined) !==
|
|
150
|
+
(next.companionEncStatic === undefined) ||
|
|
151
|
+
(current.companionEncStatic !== undefined &&
|
|
152
|
+
next.companionEncStatic !== undefined &&
|
|
153
|
+
!uint8Equal(current.companionEncStatic, next.companionEncStatic)),
|
|
154
|
+
lastSuccessTsChanged: next.lastSuccessTs !== current.lastSuccessTs,
|
|
155
|
+
propsVersionChanged: next.propsVersion !== current.propsVersion,
|
|
156
|
+
abPropsVersionChanged: next.abPropsVersion !== current.abPropsVersion,
|
|
157
|
+
connectionLocationChanged: next.connectionLocation !== current.connectionLocation,
|
|
158
|
+
accountCreationTsChanged: next.accountCreationTs !== current.accountCreationTs
|
|
159
|
+
});
|
|
160
|
+
await this.patchCredentials((credentials) => ({
|
|
161
|
+
...credentials,
|
|
162
|
+
meLid: attributes.meLid ?? credentials.meLid,
|
|
163
|
+
meDisplayName: attributes.meDisplayName ?? credentials.meDisplayName,
|
|
164
|
+
companionEncStatic: attributes.companionEncStatic ?? credentials.companionEncStatic,
|
|
165
|
+
lastSuccessTs: attributes.lastSuccessTs ?? credentials.lastSuccessTs,
|
|
166
|
+
propsVersion: attributes.propsVersion ?? credentials.propsVersion,
|
|
167
|
+
abPropsVersion: attributes.abPropsVersion ?? credentials.abPropsVersion,
|
|
168
|
+
connectionLocation: attributes.connectionLocation ?? credentials.connectionLocation,
|
|
169
|
+
accountCreationTs: attributes.accountCreationTs ?? credentials.accountCreationTs
|
|
170
|
+
}), {
|
|
171
|
+
shouldPersist: (current, next) => {
|
|
172
|
+
persistDiff = computeDiff(current, next);
|
|
173
|
+
return Object.values(persistDiff).some(Boolean);
|
|
174
|
+
},
|
|
187
175
|
onPersist: () => {
|
|
188
|
-
this.logger.debug('persisting success attributes',
|
|
176
|
+
this.logger.debug('persisting success attributes', persistDiff);
|
|
189
177
|
}
|
|
190
178
|
});
|
|
191
179
|
}
|
|
@@ -200,24 +188,18 @@ export class WaAuthClient {
|
|
|
200
188
|
return this.runHandled(() => this.pairingFlow.fetchPairingCountryCodeIso());
|
|
201
189
|
}
|
|
202
190
|
async handleIncomingIqSet(node) {
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
return this.pairingFlow.handleIncomingIqSet(node);
|
|
206
|
-
});
|
|
191
|
+
this.logger.trace('auth client handleIncomingIqSet', { id: node.attrs.id });
|
|
192
|
+
return this.runHandled(() => this.pairingFlow.handleIncomingIqSet(node));
|
|
207
193
|
}
|
|
208
194
|
async handleLinkCodeNotification(node) {
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
return this.pairingFlow.handleLinkCodeNotification(node);
|
|
212
|
-
});
|
|
195
|
+
this.logger.trace('auth client handleLinkCodeNotification', { id: node.attrs.id });
|
|
196
|
+
return this.runHandled(() => this.pairingFlow.handleLinkCodeNotification(node));
|
|
213
197
|
}
|
|
214
198
|
async handleCompanionRegRefreshNotification(node) {
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
id: node.attrs.id
|
|
218
|
-
});
|
|
219
|
-
return this.pairingFlow.handleCompanionRegRefreshNotification(node);
|
|
199
|
+
this.logger.trace('auth client handleCompanionRegRefreshNotification', {
|
|
200
|
+
id: node.attrs.id
|
|
220
201
|
});
|
|
202
|
+
return this.runHandled(() => this.pairingFlow.handleCompanionRegRefreshNotification(node));
|
|
221
203
|
}
|
|
222
204
|
async patchCredentials(buildNext, options = {}) {
|
|
223
205
|
const current = this.requireCredentials();
|
|
@@ -240,7 +222,7 @@ export class WaAuthClient {
|
|
|
240
222
|
}
|
|
241
223
|
async updateCredentials(credentials) {
|
|
242
224
|
this.logger.trace('auth client update credentials', {
|
|
243
|
-
registered: credentials
|
|
225
|
+
registered: credentials?.meJid !== null && credentials?.meJid !== undefined
|
|
244
226
|
});
|
|
245
227
|
this.credentials = credentials;
|
|
246
228
|
await persistCredentials({
|
|
@@ -4,12 +4,13 @@ import { X25519 } from '../../crypto/curves/X25519.js';
|
|
|
4
4
|
import { getLoginIdentity } from '../../protocol/jid.js';
|
|
5
5
|
import { verifySignalSignature } from '../../signal/crypto/WaAdvSignature.js';
|
|
6
6
|
import { createAndStoreInitialKeys } from '../../signal/registration/utils.js';
|
|
7
|
+
import { toProxyAgent, toProxyDispatcher } from '../../transport/proxy.js';
|
|
7
8
|
import { toError } from '../../util/primitives.js';
|
|
8
9
|
export async function loadOrCreateCredentials(args) {
|
|
9
10
|
args.logger.trace('auth credentials loadOrCreate start');
|
|
10
11
|
const existing = await args.authStore.load();
|
|
11
12
|
if (!existing) {
|
|
12
|
-
const credentials = await
|
|
13
|
+
const credentials = await createFreshAndPersistCredentials(args);
|
|
13
14
|
args.logger.info('created fresh auth credentials');
|
|
14
15
|
return credentials;
|
|
15
16
|
}
|
|
@@ -19,7 +20,7 @@ export async function loadOrCreateCredentials(args) {
|
|
|
19
20
|
});
|
|
20
21
|
if (!existing.meJid && !(await hasValidSignedPreKey(args.logger, existing))) {
|
|
21
22
|
args.logger.warn('signed pre-key is invalid, regenerating credentials');
|
|
22
|
-
const fresh = await
|
|
23
|
+
const fresh = await createFreshAndPersistCredentials(args);
|
|
23
24
|
args.logger.info('regenerated credentials due to invalid signed pre-key');
|
|
24
25
|
return fresh;
|
|
25
26
|
}
|
|
@@ -34,8 +35,10 @@ export async function persistCredentials(args, credentials) {
|
|
|
34
35
|
await args.authStore.save(credentials);
|
|
35
36
|
}
|
|
36
37
|
export function buildCommsConfig(logger, credentials, socketOptions, clientOptions) {
|
|
37
|
-
const
|
|
38
|
-
const
|
|
38
|
+
const meJid = credentials.meJid;
|
|
39
|
+
const registered = meJid !== null && meJid !== undefined;
|
|
40
|
+
const loginIdentity = registered ? getLoginIdentity(meJid) : null;
|
|
41
|
+
const wsProxy = socketOptions.proxy?.ws;
|
|
39
42
|
logger.debug('building comms config from credentials', {
|
|
40
43
|
registered,
|
|
41
44
|
hasServerStaticKey: credentials.serverStaticKey !== null && credentials.serverStaticKey !== undefined
|
|
@@ -44,6 +47,8 @@ export function buildCommsConfig(logger, credentials, socketOptions, clientOptio
|
|
|
44
47
|
url: socketOptions.url,
|
|
45
48
|
urls: socketOptions.urls,
|
|
46
49
|
protocols: socketOptions.protocols,
|
|
50
|
+
dispatcher: toProxyDispatcher(wsProxy),
|
|
51
|
+
agent: toProxyAgent(wsProxy),
|
|
47
52
|
connectTimeoutMs: socketOptions.connectTimeoutMs,
|
|
48
53
|
reconnectIntervalMs: socketOptions.reconnectIntervalMs,
|
|
49
54
|
timeoutIntervalMs: socketOptions.timeoutIntervalMs,
|
|
@@ -58,7 +63,8 @@ export function buildCommsConfig(logger, credentials, socketOptions, clientOptio
|
|
|
58
63
|
username: loginIdentity.username,
|
|
59
64
|
device: loginIdentity.device,
|
|
60
65
|
deviceBrowser: clientOptions.deviceBrowser,
|
|
61
|
-
deviceOsDisplayName: clientOptions.deviceOsDisplayName
|
|
66
|
+
deviceOsDisplayName: clientOptions.deviceOsDisplayName,
|
|
67
|
+
versionBase: clientOptions.version
|
|
62
68
|
}
|
|
63
69
|
: undefined,
|
|
64
70
|
registrationPayloadConfig: !loginIdentity
|
|
@@ -67,7 +73,8 @@ export function buildCommsConfig(logger, credentials, socketOptions, clientOptio
|
|
|
67
73
|
signedPreKey: credentials.signedPreKey,
|
|
68
74
|
deviceBrowser: clientOptions.deviceBrowser,
|
|
69
75
|
deviceOsDisplayName: clientOptions.deviceOsDisplayName,
|
|
70
|
-
requireFullSync: clientOptions.requireFullSync
|
|
76
|
+
requireFullSync: clientOptions.requireFullSync,
|
|
77
|
+
versionBase: clientOptions.version
|
|
71
78
|
}
|
|
72
79
|
: undefined
|
|
73
80
|
}
|
|
@@ -88,9 +95,11 @@ async function createFreshCredentials(signalStore, logger) {
|
|
|
88
95
|
advSecretKey
|
|
89
96
|
};
|
|
90
97
|
}
|
|
91
|
-
async function
|
|
98
|
+
async function createFreshAndPersistCredentials(args) {
|
|
92
99
|
const credentials = await createFreshCredentials(args.signalStore, args.logger);
|
|
93
|
-
|
|
100
|
+
// Persist credentials first so signal restore never commits state for credentials that failed to save.
|
|
101
|
+
await args.authStore.save(credentials);
|
|
102
|
+
await restoreSignalStore(args.signalStore, credentials);
|
|
94
103
|
return credentials;
|
|
95
104
|
}
|
|
96
105
|
async function hasValidSignedPreKey(logger, credentials) {
|
|
@@ -108,11 +117,9 @@ async function hasValidSignedPreKey(logger, credentials) {
|
|
|
108
117
|
}
|
|
109
118
|
}
|
|
110
119
|
async function restoreSignalStore(signalStore, credentials) {
|
|
111
|
-
await
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
await args.authStore.save(credentials);
|
|
117
|
-
await restoreSignalStore(args.signalStore, credentials);
|
|
120
|
+
await Promise.all([
|
|
121
|
+
signalStore.setRegistrationInfo(credentials.registrationInfo),
|
|
122
|
+
signalStore.setSignedPreKey(credentials.signedPreKey),
|
|
123
|
+
signalStore.setServerHasPreKeys(credentials.serverHasPreKeys === true)
|
|
124
|
+
]);
|
|
118
125
|
}
|
package/dist/esm/auth/index.js
CHANGED
|
@@ -1,5 +1,2 @@
|
|
|
1
1
|
export * from './types.js';
|
|
2
|
-
export { getLoginIdentity } from '../protocol/jid.js';
|
|
3
2
|
export { WaAuthClient } from './WaAuthClient.js';
|
|
4
|
-
export { completeCompanionFinish, createCompanionHello } from './pairing/WaPairingCodeCrypto.js';
|
|
5
|
-
export { WaAuthSqliteStore } from '../store/providers/sqlite/auth.store.js';
|
|
@@ -45,8 +45,8 @@ export async function completeCompanionFinish(args) {
|
|
|
45
45
|
if (primaryEphemeralPub.length === 0) {
|
|
46
46
|
throw new Error('empty primary ephemeral public key');
|
|
47
47
|
}
|
|
48
|
-
const sharedEphemeral = await
|
|
49
|
-
|
|
48
|
+
const [sharedEphemeral, bundleSalt, bundleSecret, bundleIv] = await Promise.all([
|
|
49
|
+
X25519.scalarMult(args.companionEphemeralPrivKey, primaryEphemeralPub),
|
|
50
50
|
randomBytesAsync(32),
|
|
51
51
|
randomBytesAsync(32),
|
|
52
52
|
randomBytesAsync(12)
|
|
@@ -58,9 +58,11 @@ export async function completeCompanionFinish(args) {
|
|
|
58
58
|
args.primaryIdentityPub,
|
|
59
59
|
bundleSecret
|
|
60
60
|
]);
|
|
61
|
-
const encryptedBundle = await
|
|
61
|
+
const [encryptedBundle, sharedIdentity] = await Promise.all([
|
|
62
|
+
aesGcmEncrypt(bundleEncryptionKey, bundleIv, plaintextBundle),
|
|
63
|
+
X25519.scalarMult(args.registrationIdentityKeyPair.privKey, args.primaryIdentityPub)
|
|
64
|
+
]);
|
|
62
65
|
const wrappedKeyBundle = concatBytes([bundleSalt, bundleIv, encryptedBundle]);
|
|
63
|
-
const sharedIdentity = await X25519.scalarMult(args.registrationIdentityKeyPair.privKey, args.primaryIdentityPub);
|
|
64
66
|
const advMaterial = concatBytes([sharedEphemeral, sharedIdentity, bundleSecret]);
|
|
65
67
|
const advSecret = await hkdf(advMaterial, null, WA_PAIRING_KDF_INFO.ADV_SECRET, 32);
|
|
66
68
|
return {
|
|
@@ -4,10 +4,11 @@ import { proto } from '../../proto.js';
|
|
|
4
4
|
import { WA_DEFAULTS, WA_IQ_TYPES, WA_NODE_TAGS, WA_SIGNALING } from '../../protocol/constants.js';
|
|
5
5
|
import { parsePhoneJid } from '../../protocol/jid.js';
|
|
6
6
|
import { ADV_PREFIX_HOSTED_ACCOUNT_SIGNATURE, computeAdvIdentityHmac, generateDeviceSignature, verifyDeviceIdentityAccountSignature } from '../../signal/crypto/WaAdvSignature.js';
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
7
|
+
import { buildAckNode, buildIqResultNode } from '../../transport/node/builders/global.js';
|
|
8
|
+
import { buildCompanionFinishRequestNode, buildCompanionHelloRequestNode, buildGetCountryCodeRequestNode } from '../../transport/node/builders/pairing.js';
|
|
9
|
+
import { decodeNodeContentUtf8OrBytes, findNodeChildrenByTags, findNodeChild, getFirstNodeChild, getNodeChildrenNonEmptyUtf8ByTag, hasNodeChild } from '../../transport/node/helpers.js';
|
|
10
|
+
import { decodeProtoBytes } from '../../util/bytes.js';
|
|
11
|
+
import { concatBytes, uint8Equal } from '../../util/bytes.js';
|
|
11
12
|
export class WaPairingFlow {
|
|
12
13
|
constructor(options) {
|
|
13
14
|
this.opts = options;
|
|
@@ -118,7 +119,10 @@ export class WaPairingFlow {
|
|
|
118
119
|
id: node.attrs.id,
|
|
119
120
|
stage: linkCodeNode.attrs.stage
|
|
120
121
|
});
|
|
121
|
-
await this.opts.socket.sendNode(
|
|
122
|
+
await this.opts.socket.sendNode(buildAckNode({
|
|
123
|
+
kind: 'notification',
|
|
124
|
+
node
|
|
125
|
+
}));
|
|
122
126
|
const stage = linkCodeNode.attrs.stage;
|
|
123
127
|
if (stage === WA_SIGNALING.LINK_CODE_STAGE_REFRESH_CODE) {
|
|
124
128
|
const refNode = findNodeChild(linkCodeNode, WA_NODE_TAGS.LINK_CODE_PAIRING_REF);
|
|
@@ -146,27 +150,29 @@ export class WaPairingFlow {
|
|
|
146
150
|
if (!hasExpectedChild) {
|
|
147
151
|
return false;
|
|
148
152
|
}
|
|
149
|
-
|
|
153
|
+
// Rotate first so we don't ack success before local credential state is durably updated.
|
|
150
154
|
await this.rotateAdvSecret(this.requireCredentials());
|
|
155
|
+
await this.opts.socket.sendNode(buildAckNode({
|
|
156
|
+
kind: 'notification',
|
|
157
|
+
node,
|
|
158
|
+
typeOverride: WA_SIGNALING.COMPANION_REG_REFRESH_NOTIFICATION
|
|
159
|
+
}));
|
|
151
160
|
this.opts.logger.info('handled companion_reg_refresh notification');
|
|
152
161
|
this.opts.qrFlow.refreshCurrentQr();
|
|
153
162
|
return true;
|
|
154
163
|
}
|
|
155
164
|
async handlePairDevice(iqNode, pairDeviceNode) {
|
|
156
|
-
const refs =
|
|
157
|
-
|
|
158
|
-
.filter((ref) => ref.length > 0);
|
|
165
|
+
const refs = getNodeChildrenNonEmptyUtf8ByTag(pairDeviceNode, WA_NODE_TAGS.REF, 'pair-device.ref');
|
|
166
|
+
// Commit adv-secret rotation before sending IQ success to avoid protocol/state divergence.
|
|
159
167
|
await this.rotateAdvSecret(this.requireCredentials());
|
|
168
|
+
await this.opts.socket.sendNode(buildIqResultNode(iqNode));
|
|
160
169
|
this.opts.qrFlow.setRefs(refs);
|
|
161
170
|
this.opts.logger.info('pair-device refs updated', { refsCount: refs.length });
|
|
162
|
-
await this.opts.socket.sendNode(buildIqResultNode(iqNode));
|
|
163
171
|
}
|
|
164
172
|
async handlePairSuccess(iqNode, pairSuccessNode) {
|
|
165
173
|
this.opts.logger.info('processing pair-success node');
|
|
166
174
|
const credentials = this.requireCredentials();
|
|
167
|
-
const deviceIdentityNode =
|
|
168
|
-
const deviceNode = findNodeChild(pairSuccessNode, 'device');
|
|
169
|
-
const platformNode = findNodeChild(pairSuccessNode, WA_NODE_TAGS.PLATFORM);
|
|
175
|
+
const [deviceIdentityNode, deviceNode, platformNode] = findNodeChildrenByTags(pairSuccessNode, [WA_NODE_TAGS.DEVICE_IDENTITY, 'device', WA_NODE_TAGS.PLATFORM]);
|
|
170
176
|
if (!deviceIdentityNode || !deviceNode || !platformNode) {
|
|
171
177
|
this.opts.logger.error('pair-success missing required nodes', {
|
|
172
178
|
hasDeviceIdentity: !!deviceIdentityNode,
|
|
@@ -267,9 +273,11 @@ export class WaPairingFlow {
|
|
|
267
273
|
if (pairingSession.attempts > 3) {
|
|
268
274
|
throw new Error('pairing code exceeded maximum primary hello attempts');
|
|
269
275
|
}
|
|
270
|
-
const refNode =
|
|
271
|
-
|
|
272
|
-
|
|
276
|
+
const [refNode, wrappedPrimaryNode, primaryIdentityNode] = findNodeChildrenByTags(linkCodeNode, [
|
|
277
|
+
WA_NODE_TAGS.LINK_CODE_PAIRING_REF,
|
|
278
|
+
'link_code_pairing_wrapped_primary_ephemeral_pub',
|
|
279
|
+
'primary_identity_pub'
|
|
280
|
+
]);
|
|
273
281
|
if (!refNode || !wrappedPrimaryNode || !primaryIdentityNode) {
|
|
274
282
|
throw new Error('primary_hello notification is missing fields');
|
|
275
283
|
}
|
|
@@ -290,10 +298,6 @@ export class WaPairingFlow {
|
|
|
290
298
|
companionEphemeralPrivKey: pairingSession.companionEphemeralKeyPair.privKey,
|
|
291
299
|
registrationIdentityKeyPair: credentials.registrationInfo.identityKeyPair
|
|
292
300
|
});
|
|
293
|
-
await this.opts.auth.updateCredentials({
|
|
294
|
-
...credentials,
|
|
295
|
-
advSecretKey: finish.advSecret
|
|
296
|
-
});
|
|
297
301
|
const result = await this.opts.socket.query(buildCompanionFinishRequestNode({
|
|
298
302
|
phoneJid: pairingSession.phoneJid,
|
|
299
303
|
wrappedKeyBundle: finish.wrappedKeyBundle,
|
|
@@ -303,6 +307,10 @@ export class WaPairingFlow {
|
|
|
303
307
|
if (result.attrs.type === WA_IQ_TYPES.ERROR) {
|
|
304
308
|
throw new Error('companion_finish returned error');
|
|
305
309
|
}
|
|
310
|
+
await this.opts.auth.updateCredentials({
|
|
311
|
+
...credentials,
|
|
312
|
+
advSecretKey: finish.advSecret
|
|
313
|
+
});
|
|
306
314
|
pairingSession.finished = true;
|
|
307
315
|
this.opts.logger.info('primary_hello completed with companion_finish success');
|
|
308
316
|
}
|