zapo-js 0.1.2 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +16 -4
- package/dist/appstate/WaAppStateCrypto.js +50 -42
- package/dist/appstate/WaAppStateSyncClient.js +215 -133
- package/dist/appstate/{store/sqlite.js → encoding.js} +13 -8
- package/dist/appstate/index.js +9 -7
- package/dist/appstate/utils.js +0 -5
- package/dist/auth/WaAuthClient.js +55 -57
- package/dist/auth/credentials-flow.js +195 -0
- package/dist/auth/index.js +1 -6
- package/dist/auth/pairing/WaPairingFlow.js +39 -32
- package/dist/auth/pairing/{WaPairingCodeCrypto.js → pairing-code-crypto.js} +35 -17
- package/dist/client/WaClient.js +338 -174
- package/dist/client/WaClientFactory.js +399 -66
- package/dist/client/connection/WaConnectionManager.js +23 -11
- package/dist/client/coordinators/WaAbPropsCoordinator.js +141 -0
- package/dist/client/coordinators/WaBusinessCoordinator.js +232 -0
- package/dist/client/coordinators/WaEmailCoordinator.js +63 -0
- package/dist/client/coordinators/WaGroupCoordinator.js +11 -7
- package/dist/client/coordinators/WaIncomingNodeCoordinator.js +34 -8
- package/dist/client/coordinators/WaMessageDispatchCoordinator.js +341 -118
- package/dist/client/coordinators/WaOfflineResumeCoordinator.js +114 -0
- package/dist/client/coordinators/WaPassiveTasksCoordinator.js +97 -36
- package/dist/client/coordinators/WaPrivacyCoordinator.js +134 -0
- package/dist/client/coordinators/WaProfileCoordinator.js +214 -0
- package/dist/client/coordinators/WaRetryCoordinator.js +184 -30
- package/dist/client/coordinators/WaStreamControlCoordinator.js +18 -11
- package/dist/client/coordinators/WaTrustedContactTokenCoordinator.js +184 -0
- package/dist/client/dirty.js +41 -21
- package/dist/client/events/abprops.js +43 -0
- package/dist/client/events/devices.js +72 -0
- package/dist/client/events/group.js +3 -11
- package/dist/client/events/identity.js +22 -0
- package/dist/client/events/privacy-token.js +38 -0
- package/dist/client/events/registration.js +42 -0
- package/dist/client/history-sync.js +50 -9
- package/dist/client/incoming.js +74 -7
- package/dist/client/mailbox.js +40 -23
- package/dist/client/media.js +243 -0
- package/dist/client/messages.js +245 -92
- package/dist/client/messaging/fanout.js +21 -11
- package/dist/client/messaging/participants.js +6 -4
- package/dist/client/persistence/WriteBehindPersistence.js +129 -0
- package/dist/client/tokens/cs-token.js +50 -0
- package/dist/client/tokens/tc-token.js +25 -0
- package/dist/crypto/core/index.js +5 -2
- package/dist/crypto/core/keys.js +4 -4
- package/dist/crypto/core/nonce.js +2 -0
- package/dist/crypto/core/primitives.js +0 -8
- package/dist/crypto/core/random.js +24 -8
- package/dist/crypto/core/xeddsa.js +57 -0
- package/dist/crypto/curves/X25519.js +43 -6
- package/dist/crypto/curves/constants.js +2 -1
- package/dist/crypto/index.js +3 -0
- package/dist/crypto/math/constants.js +13 -36
- package/dist/crypto/math/edwards.js +171 -44
- package/dist/crypto/math/fe.js +706 -0
- package/dist/crypto/math/mod.js +10 -3
- package/dist/esm/appstate/WaAppStateCrypto.js +40 -32
- package/dist/esm/appstate/WaAppStateSyncClient.js +206 -124
- package/dist/esm/appstate/{store/sqlite.js → encoding.js} +13 -8
- package/dist/esm/appstate/index.js +2 -2
- package/dist/esm/appstate/{WaAppStateSyncResponseParser.js → response-parser.js} +1 -1
- package/dist/esm/appstate/utils.js +2 -5
- package/dist/esm/auth/WaAuthClient.js +52 -54
- package/dist/esm/auth/credentials-flow.js +190 -0
- package/dist/esm/auth/index.js +0 -2
- package/dist/esm/auth/pairing/WaPairingFlow.js +39 -32
- package/dist/esm/auth/pairing/{WaPairingCodeCrypto.js → pairing-code-crypto.js} +26 -10
- package/dist/esm/client/WaClient.js +339 -175
- package/dist/esm/client/WaClientFactory.js +401 -68
- package/dist/esm/client/connection/WaConnectionManager.js +23 -11
- package/dist/esm/client/coordinators/WaAbPropsCoordinator.js +137 -0
- package/dist/esm/client/coordinators/WaBusinessCoordinator.js +229 -0
- package/dist/esm/client/coordinators/WaEmailCoordinator.js +60 -0
- package/dist/esm/client/coordinators/WaGroupCoordinator.js +11 -7
- package/dist/esm/client/coordinators/WaIncomingNodeCoordinator.js +36 -10
- package/dist/esm/client/coordinators/WaMessageDispatchCoordinator.js +337 -114
- package/dist/esm/client/coordinators/WaOfflineResumeCoordinator.js +110 -0
- package/dist/esm/client/coordinators/WaPassiveTasksCoordinator.js +97 -36
- package/dist/esm/client/coordinators/WaPrivacyCoordinator.js +131 -0
- package/dist/esm/client/coordinators/WaProfileCoordinator.js +211 -0
- package/dist/esm/client/coordinators/WaRetryCoordinator.js +186 -32
- package/dist/esm/client/coordinators/WaStreamControlCoordinator.js +19 -12
- package/dist/esm/client/coordinators/WaTrustedContactTokenCoordinator.js +180 -0
- package/dist/esm/client/dirty.js +41 -21
- package/dist/esm/client/events/abprops.js +40 -0
- package/dist/esm/client/events/devices.js +68 -0
- package/dist/esm/client/events/group.js +3 -11
- package/dist/esm/client/events/identity.js +19 -0
- package/dist/esm/client/events/privacy-token.js +35 -0
- package/dist/esm/client/events/registration.js +39 -0
- package/dist/esm/client/history-sync.js +50 -9
- package/dist/esm/client/incoming.js +74 -8
- package/dist/esm/client/mailbox.js +40 -23
- package/dist/esm/client/media.js +234 -0
- package/dist/esm/client/messages.js +244 -91
- package/dist/esm/client/messaging/fanout.js +22 -12
- package/dist/esm/client/messaging/participants.js +6 -4
- package/dist/esm/client/persistence/WriteBehindPersistence.js +125 -0
- package/dist/esm/client/tokens/cs-token.js +46 -0
- package/dist/esm/client/tokens/tc-token.js +18 -0
- package/dist/esm/crypto/core/index.js +3 -2
- package/dist/esm/crypto/core/keys.js +1 -1
- package/dist/esm/crypto/core/nonce.js +2 -0
- package/dist/esm/crypto/core/primitives.js +0 -7
- package/dist/esm/crypto/core/random.js +23 -7
- package/dist/esm/crypto/core/xeddsa.js +53 -0
- package/dist/esm/crypto/curves/X25519.js +45 -8
- package/dist/esm/crypto/curves/constants.js +1 -0
- package/dist/esm/crypto/index.js +1 -0
- package/dist/esm/crypto/math/constants.js +12 -35
- package/dist/esm/crypto/math/edwards.js +174 -47
- package/dist/esm/crypto/math/fe.js +691 -0
- package/dist/esm/crypto/math/mod.js +10 -1
- package/dist/esm/index.js +1 -1
- package/dist/esm/infra/perf/BackgroundQueue.js +478 -0
- package/dist/esm/infra/perf/BoundedTaskQueue.js +3 -1
- package/dist/esm/infra/perf/PromiseDedup.js +20 -0
- package/dist/esm/infra/perf/SharedExclusiveGate.js +109 -0
- package/dist/esm/infra/perf/StoreLock.js +80 -0
- package/dist/esm/media/WaMediaCrypto.js +332 -55
- package/dist/esm/media/WaMediaTransferClient.js +69 -220
- package/dist/esm/media/constants.js +4 -1
- package/dist/esm/media/processor.js +1 -0
- package/dist/esm/message/WaMessageClient.js +26 -19
- package/dist/esm/message/addon-crypto.js +130 -3
- package/dist/esm/message/content.js +206 -14
- package/dist/esm/message/icdc.js +76 -0
- package/dist/esm/message/incoming.js +38 -24
- package/dist/esm/message/phash.js +35 -13
- package/dist/esm/message/reporting-token.js +17 -30
- package/dist/esm/message/use-case-secret.js +1 -1
- package/dist/esm/protocol/abprops.js +159 -0
- package/dist/esm/protocol/appstate.js +9 -40
- package/dist/esm/protocol/browser.js +24 -18
- package/dist/esm/protocol/constants.js +8 -4
- package/dist/esm/protocol/defaults.js +6 -0
- package/dist/esm/protocol/email.js +30 -0
- package/dist/esm/protocol/index.js +1 -2
- package/dist/esm/protocol/jid.js +142 -39
- package/dist/esm/protocol/message.js +61 -1
- package/dist/esm/protocol/nodes.js +8 -2
- package/dist/esm/protocol/notification.js +9 -1
- package/dist/esm/protocol/privacy-token.js +17 -0
- package/dist/esm/protocol/privacy.js +55 -0
- package/dist/esm/protocol/stream.js +26 -1
- package/dist/esm/retry/codec.js +216 -0
- package/dist/esm/retry/constants.js +1 -1
- package/dist/esm/retry/index.js +2 -2
- package/dist/esm/retry/parse.js +50 -30
- package/dist/esm/retry/reason.js +1 -1
- package/dist/esm/retry/replay.js +11 -7
- package/dist/esm/retry/tracker.js +50 -12
- package/dist/esm/signal/api/SignalDeviceSyncApi.js +52 -32
- package/dist/esm/signal/api/SignalDigestSyncApi.js +21 -15
- package/dist/esm/signal/api/SignalIdentitySyncApi.js +30 -15
- package/dist/esm/signal/api/SignalMissingPreKeysSyncApi.js +19 -8
- package/dist/esm/signal/api/SignalRotateKeyApi.js +4 -2
- package/dist/esm/signal/api/SignalSessionSyncApi.js +17 -8
- package/dist/esm/signal/api/result-map.js +10 -0
- package/dist/esm/signal/constants.js +0 -4
- package/dist/esm/signal/crypto/WaAdvSignature.js +5 -45
- package/dist/esm/signal/crypto/constants.js +0 -4
- package/dist/esm/signal/{store/sqlite.js → encoding.js} +40 -29
- package/dist/esm/signal/group/SenderKeyChain.js +3 -3
- package/dist/esm/signal/group/SenderKeyCodec.js +8 -8
- package/dist/esm/signal/group/SenderKeyManager.js +131 -109
- package/dist/esm/signal/index.js +1 -0
- package/dist/esm/signal/registration/keygen.js +8 -5
- package/dist/esm/signal/registration/utils.js +3 -2
- package/dist/esm/signal/session/SignalProtocol.js +158 -81
- package/dist/esm/signal/session/SignalRatchet.js +21 -10
- package/dist/esm/signal/session/SignalSerializer.js +5 -6
- package/dist/esm/signal/session/SignalSession.js +11 -9
- package/dist/esm/signal/session/resolver.js +140 -105
- package/dist/esm/store/contracts/identity.store.js +1 -0
- package/dist/esm/store/contracts/message-secret.store.js +1 -0
- package/dist/esm/store/contracts/pre-key.store.js +1 -0
- package/dist/esm/store/contracts/privacy-token.store.js +1 -0
- package/dist/esm/store/contracts/session.store.js +1 -0
- package/dist/esm/store/createStore.js +143 -193
- package/dist/esm/store/index.js +5 -10
- package/dist/esm/store/locks/appstate.lock.js +26 -0
- package/dist/esm/store/locks/auth.lock.js +15 -0
- package/dist/esm/store/locks/contact.lock.js +20 -0
- package/dist/esm/store/locks/device-list.lock.js +20 -0
- package/dist/esm/store/locks/identity.lock.js +16 -0
- package/dist/esm/store/locks/message-secret.lock.js +17 -0
- package/dist/esm/store/locks/message.lock.js +21 -0
- package/dist/esm/store/locks/participants.lock.js +20 -0
- package/dist/esm/store/locks/pre-key.lock.js +27 -0
- package/dist/esm/store/locks/privacy-token.lock.js +18 -0
- package/dist/esm/store/locks/retry.lock.js +29 -0
- package/dist/esm/store/locks/sender-key.lock.js +52 -0
- package/dist/esm/store/locks/session.lock.js +19 -0
- package/dist/esm/store/locks/signal.lock.js +39 -0
- package/dist/esm/store/locks/thread.lock.js +21 -0
- package/dist/esm/store/noop.store.js +21 -1
- package/dist/esm/store/providers/memory/appstate.store.js +22 -24
- package/dist/esm/store/providers/memory/device-list.store.js +13 -5
- package/dist/esm/store/providers/memory/identity.store.js +31 -0
- package/dist/esm/store/providers/memory/message-secret.store.js +81 -0
- package/dist/esm/store/providers/memory/participants.store.js +3 -0
- package/dist/esm/store/providers/memory/pre-key.store.js +97 -0
- package/dist/esm/store/providers/memory/privacy-token.store.js +43 -0
- package/dist/esm/store/providers/memory/retry.store.js +99 -10
- package/dist/esm/store/providers/memory/sender-key.store.js +6 -1
- package/dist/esm/store/providers/memory/session.store.js +45 -0
- package/dist/esm/store/providers/memory/signal.store.js +1 -147
- package/dist/esm/transport/WaComms.js +7 -4
- package/dist/esm/transport/WaWebSocket.js +9 -7
- package/dist/esm/transport/binary/constants.js +0 -30
- package/dist/esm/transport/binary/decoder.js +4 -4
- package/dist/esm/transport/binary/encoder.js +8 -15
- package/dist/esm/transport/binary/index.js +0 -1
- package/dist/esm/transport/index.js +6 -0
- package/dist/esm/transport/keepalive/WaKeepAlive.js +17 -8
- package/dist/esm/transport/node/WaMobileTcpSocket.js +114 -0
- package/dist/esm/transport/node/WaNodeOrchestrator.js +37 -22
- package/dist/esm/transport/node/builders/abprops.js +20 -0
- package/dist/esm/transport/node/builders/business.js +129 -0
- package/dist/esm/transport/node/builders/device.js +11 -0
- package/dist/esm/transport/node/builders/email.js +65 -0
- package/dist/esm/transport/node/builders/global.js +370 -0
- package/dist/esm/transport/node/builders/message.js +63 -239
- package/dist/esm/transport/node/builders/offline.js +14 -0
- package/dist/esm/transport/node/builders/pairing.js +0 -24
- package/dist/esm/transport/node/builders/prekeys.js +37 -40
- package/dist/esm/transport/node/builders/presence.js +13 -0
- package/dist/esm/transport/node/builders/privacy-token.js +37 -0
- package/dist/esm/transport/node/builders/privacy.js +48 -0
- package/dist/esm/transport/node/builders/profile.js +70 -0
- package/dist/esm/transport/node/builders/retry.js +11 -23
- package/dist/esm/transport/node/builders/usync.js +6 -2
- package/dist/esm/transport/node/helpers.js +43 -1
- package/dist/esm/transport/node/mex/argo-decoder.js +152 -0
- package/dist/esm/transport/node/mex/client.js +83 -0
- package/dist/esm/transport/node/mex/persist-ids.js +10 -0
- package/dist/esm/transport/node/usync.js +3 -33
- package/dist/esm/transport/node/xml.js +35 -14
- package/dist/esm/transport/noise/WaClientPayload.js +24 -19
- package/dist/esm/transport/noise/WaFrameCodec.js +2 -2
- package/dist/esm/transport/noise/WaMobileClientPayload.js +53 -0
- package/dist/esm/transport/noise/WaNoiseCert.js +9 -27
- package/dist/esm/transport/noise/WaNoiseSession.js +76 -34
- package/dist/esm/transport/noise/WaNoiseSocket.js +8 -4
- package/dist/esm/transport/stream/parse.js +8 -4
- package/dist/esm/util/bytes.js +22 -18
- package/dist/esm/util/index.js +5 -0
- package/dist/esm/util/primitives.js +3 -2
- package/dist/index.js +7 -1
- package/dist/infra/perf/BackgroundQueue.js +482 -0
- package/dist/infra/perf/BoundedTaskQueue.js +3 -1
- package/dist/infra/perf/PromiseDedup.js +24 -0
- package/dist/infra/perf/SharedExclusiveGate.js +113 -0
- package/dist/infra/perf/StoreLock.js +84 -0
- package/dist/media/WaMediaCrypto.js +328 -51
- package/dist/media/WaMediaTransferClient.js +72 -253
- package/dist/media/constants.js +5 -2
- package/dist/media/processor.js +2 -0
- package/dist/message/WaMessageClient.js +26 -19
- package/dist/message/addon-crypto.js +131 -0
- package/dist/message/content.js +211 -14
- package/dist/message/icdc.js +81 -0
- package/dist/message/incoming.js +38 -24
- package/dist/message/phash.js +35 -13
- package/dist/message/reporting-token.js +16 -30
- package/dist/message/use-case-secret.js +1 -1
- package/dist/protocol/abprops.js +163 -0
- package/dist/protocol/appstate.js +10 -41
- package/dist/protocol/browser.js +25 -18
- package/dist/protocol/constants.js +33 -2
- package/dist/protocol/defaults.js +6 -0
- package/dist/protocol/email.js +33 -0
- package/dist/protocol/index.js +8 -5
- package/dist/protocol/jid.js +149 -39
- package/dist/protocol/message.js +62 -2
- package/dist/protocol/nodes.js +8 -2
- package/dist/protocol/notification.js +10 -2
- package/dist/protocol/privacy-token.js +20 -0
- package/dist/protocol/privacy.js +58 -0
- package/dist/protocol/stream.js +27 -2
- package/dist/retry/codec.js +220 -0
- package/dist/retry/constants.js +1 -1
- package/dist/retry/index.js +5 -5
- package/dist/retry/parse.js +51 -30
- package/dist/retry/reason.js +1 -1
- package/dist/retry/replay.js +10 -6
- package/dist/retry/tracker.js +50 -12
- package/dist/signal/api/SignalDeviceSyncApi.js +51 -31
- package/dist/signal/api/SignalDigestSyncApi.js +21 -15
- package/dist/signal/api/SignalIdentitySyncApi.js +29 -14
- package/dist/signal/api/SignalMissingPreKeysSyncApi.js +17 -6
- package/dist/signal/api/SignalRotateKeyApi.js +4 -2
- package/dist/signal/api/SignalSessionSyncApi.js +16 -7
- package/dist/signal/api/result-map.js +13 -0
- package/dist/signal/constants.js +1 -5
- package/dist/signal/crypto/WaAdvSignature.js +2 -44
- package/dist/signal/crypto/constants.js +1 -5
- package/dist/signal/{store/sqlite.js → encoding.js} +41 -25
- package/dist/signal/group/SenderKeyChain.js +2 -2
- package/dist/signal/group/SenderKeyCodec.js +8 -8
- package/dist/signal/group/SenderKeyManager.js +130 -108
- package/dist/signal/index.js +13 -1
- package/dist/signal/registration/keygen.js +7 -4
- package/dist/signal/registration/utils.js +3 -2
- package/dist/signal/session/SignalProtocol.js +158 -81
- package/dist/signal/session/SignalRatchet.js +19 -8
- package/dist/signal/session/SignalSerializer.js +5 -6
- package/dist/signal/session/SignalSession.js +11 -9
- package/dist/signal/session/resolver.js +138 -103
- package/dist/store/contracts/identity.store.js +2 -0
- package/dist/store/contracts/message-secret.store.js +2 -0
- package/dist/store/contracts/pre-key.store.js +2 -0
- package/dist/store/contracts/privacy-token.store.js +2 -0
- package/dist/store/contracts/session.store.js +2 -0
- package/dist/store/createStore.js +142 -192
- package/dist/store/index.js +23 -33
- package/dist/store/locks/appstate.lock.js +29 -0
- package/dist/store/locks/auth.lock.js +18 -0
- package/dist/store/locks/contact.lock.js +23 -0
- package/dist/store/locks/device-list.lock.js +23 -0
- package/dist/store/locks/identity.lock.js +19 -0
- package/dist/store/locks/message-secret.lock.js +20 -0
- package/dist/store/locks/message.lock.js +24 -0
- package/dist/store/locks/participants.lock.js +23 -0
- package/dist/store/locks/pre-key.lock.js +30 -0
- package/dist/store/locks/privacy-token.lock.js +21 -0
- package/dist/store/locks/retry.lock.js +32 -0
- package/dist/store/locks/sender-key.lock.js +55 -0
- package/dist/store/locks/session.lock.js +22 -0
- package/dist/store/locks/signal.lock.js +42 -0
- package/dist/store/locks/thread.lock.js +24 -0
- package/dist/store/noop.store.js +22 -2
- package/dist/store/providers/memory/appstate.store.js +22 -24
- package/dist/store/providers/memory/device-list.store.js +13 -5
- package/dist/store/providers/memory/identity.store.js +35 -0
- package/dist/store/providers/memory/message-secret.store.js +85 -0
- package/dist/store/providers/memory/participants.store.js +3 -0
- package/dist/store/providers/memory/pre-key.store.js +101 -0
- package/dist/store/providers/memory/privacy-token.store.js +47 -0
- package/dist/store/providers/memory/retry.store.js +98 -9
- package/dist/store/providers/memory/sender-key.store.js +6 -1
- package/dist/store/providers/memory/session.store.js +49 -0
- package/dist/store/providers/memory/signal.store.js +1 -147
- package/dist/transport/WaComms.js +7 -4
- package/dist/transport/WaWebSocket.js +9 -7
- package/dist/transport/binary/constants.js +1 -31
- package/dist/transport/binary/decoder.js +4 -4
- package/dist/transport/binary/encoder.js +8 -15
- package/dist/transport/binary/index.js +0 -4
- package/dist/transport/index.js +17 -1
- package/dist/transport/keepalive/WaKeepAlive.js +17 -8
- package/dist/transport/node/WaMobileTcpSocket.js +118 -0
- package/dist/transport/node/WaNodeOrchestrator.js +36 -21
- package/dist/transport/node/builders/abprops.js +23 -0
- package/dist/transport/node/builders/business.js +137 -0
- package/dist/transport/node/builders/device.js +14 -0
- package/dist/transport/node/builders/email.js +72 -0
- package/dist/transport/node/builders/global.js +375 -0
- package/dist/transport/node/builders/message.js +64 -245
- package/dist/transport/node/builders/offline.js +17 -0
- package/dist/transport/node/builders/pairing.js +0 -26
- package/dist/transport/node/builders/prekeys.js +36 -39
- package/dist/transport/node/builders/presence.js +16 -0
- package/dist/transport/node/builders/privacy-token.js +42 -0
- package/dist/transport/node/builders/privacy.js +55 -0
- package/dist/transport/node/builders/profile.js +78 -0
- package/dist/transport/node/builders/retry.js +10 -22
- package/dist/transport/node/builders/usync.js +6 -2
- package/dist/transport/node/helpers.js +46 -1
- package/dist/transport/node/mex/argo-decoder.js +189 -0
- package/dist/transport/node/mex/client.js +86 -0
- package/dist/transport/node/mex/persist-ids.js +13 -0
- package/dist/transport/node/usync.js +2 -32
- package/dist/transport/node/xml.js +35 -14
- package/dist/transport/noise/WaClientPayload.js +26 -21
- package/dist/transport/noise/WaFrameCodec.js +1 -1
- package/dist/transport/noise/WaMobileClientPayload.js +56 -0
- package/dist/transport/noise/WaNoiseCert.js +8 -26
- package/dist/transport/noise/WaNoiseSession.js +75 -33
- package/dist/transport/noise/WaNoiseSocket.js +8 -4
- package/dist/transport/stream/parse.js +7 -3
- package/dist/types/appstate/WaAppStateCrypto.d.ts +11 -8
- package/dist/types/appstate/WaAppStateSyncClient.d.ts +6 -2
- package/dist/types/appstate/encoding.d.ts +7 -0
- package/dist/types/appstate/index.d.ts +3 -3
- package/dist/types/appstate/{WaAppStateSyncResponseParser.d.ts → response-parser.d.ts} +1 -1
- package/dist/types/appstate/types.d.ts +1 -1
- package/dist/types/appstate/utils.d.ts +0 -2
- package/dist/types/auth/WaAuthClient.d.ts +9 -3
- package/dist/types/auth/credentials-flow.d.ts +20 -0
- package/dist/types/auth/index.d.ts +0 -2
- package/dist/types/auth/pairing/WaPairingFlow.d.ts +3 -2
- package/dist/types/auth/pairing/{WaPairingCodeCrypto.d.ts → pairing-code-crypto.d.ts} +6 -1
- package/dist/types/auth/types.d.ts +41 -0
- package/dist/types/client/WaClient.d.ts +44 -18
- package/dist/types/client/WaClientFactory.d.ts +22 -8
- package/dist/types/client/connection/WaConnectionManager.d.ts +2 -0
- package/dist/types/client/coordinators/WaAbPropsCoordinator.d.ts +26 -0
- package/dist/types/client/coordinators/WaBusinessCoordinator.d.ts +57 -0
- package/dist/types/client/coordinators/WaEmailCoordinator.d.ts +24 -0
- package/dist/types/client/coordinators/WaIncomingNodeCoordinator.d.ts +9 -2
- package/dist/types/client/coordinators/WaMessageDispatchCoordinator.d.ts +29 -2
- package/dist/types/client/coordinators/WaOfflineResumeCoordinator.d.ts +31 -0
- package/dist/types/client/coordinators/WaPassiveTasksCoordinator.d.ts +16 -1
- package/dist/types/client/coordinators/WaPrivacyCoordinator.d.ts +26 -0
- package/dist/types/client/coordinators/WaProfileCoordinator.d.ts +38 -0
- package/dist/types/client/coordinators/WaRetryCoordinator.d.ts +12 -0
- package/dist/types/client/coordinators/WaStreamControlCoordinator.d.ts +3 -2
- package/dist/types/client/coordinators/WaTrustedContactTokenCoordinator.d.ts +55 -0
- package/dist/types/client/dirty.d.ts +3 -1
- package/dist/types/client/events/abprops.d.ts +14 -0
- package/dist/types/client/events/devices.d.ts +20 -0
- package/dist/types/client/events/identity.d.ts +9 -0
- package/dist/types/client/events/privacy-token.d.ts +7 -0
- package/dist/types/client/events/registration.d.ts +17 -0
- package/dist/types/client/history-sync.d.ts +9 -6
- package/dist/types/client/incoming.d.ts +9 -2
- package/dist/types/client/index.d.ts +1 -1
- package/dist/types/client/mailbox.d.ts +5 -5
- package/dist/types/client/media.d.ts +31 -0
- package/dist/types/client/messages.d.ts +3 -2
- package/dist/types/client/persistence/WriteBehindPersistence.d.ts +34 -0
- package/dist/types/client/tokens/cs-token.d.ts +10 -0
- package/dist/types/client/tokens/tc-token.d.ts +5 -0
- package/dist/types/client/types.d.ts +151 -4
- package/dist/types/crypto/core/index.d.ts +3 -2
- package/dist/types/crypto/core/nonce.d.ts +2 -0
- package/dist/types/crypto/core/primitives.d.ts +1 -2
- package/dist/types/crypto/core/random.d.ts +2 -1
- package/dist/types/crypto/core/xeddsa.d.ts +2 -0
- package/dist/types/crypto/curves/constants.d.ts +1 -0
- package/dist/types/crypto/index.d.ts +2 -0
- package/dist/types/crypto/math/constants.d.ts +4 -2
- package/dist/types/crypto/math/fe.d.ts +30 -0
- package/dist/types/crypto/math/mod.d.ts +0 -2
- package/dist/types/crypto/math/types.d.ts +11 -4
- package/dist/types/index.d.ts +6 -3
- package/dist/types/infra/log/ConsoleLogger.d.ts +1 -1
- package/dist/types/infra/log/PinoLogger.d.ts +1 -1
- package/dist/types/infra/perf/BackgroundQueue.d.ts +58 -0
- package/dist/types/infra/perf/PromiseDedup.d.ts +4 -0
- package/dist/types/infra/perf/SharedExclusiveGate.d.ts +17 -0
- package/dist/types/infra/perf/StoreLock.d.ts +11 -0
- package/dist/types/media/WaMediaCrypto.d.ts +16 -6
- package/dist/types/media/WaMediaTransferClient.d.ts +6 -23
- package/dist/types/media/constants.d.ts +3 -1
- package/dist/types/media/index.d.ts +2 -1
- package/dist/types/media/processor.d.ts +28 -0
- package/dist/types/media/types.d.ts +19 -5
- package/dist/types/message/addon-crypto.d.ts +34 -3
- package/dist/types/message/content.d.ts +11 -1
- package/dist/types/message/icdc.d.ts +13 -0
- package/dist/types/message/reporting-token.d.ts +0 -1
- package/dist/types/message/types.d.ts +42 -11
- package/dist/types/protocol/abprops.d.ts +142 -0
- package/dist/types/protocol/appstate.d.ts +0 -11
- package/dist/types/protocol/browser.d.ts +1 -0
- package/dist/types/protocol/constants.d.ts +12 -4
- package/dist/types/protocol/defaults.d.ts +6 -0
- package/dist/types/protocol/email.d.ts +32 -0
- package/dist/types/protocol/index.d.ts +1 -2
- package/dist/types/protocol/jid.d.ts +20 -2
- package/dist/types/protocol/message.d.ts +60 -0
- package/dist/types/protocol/nodes.d.ts +6 -0
- package/dist/types/protocol/notification.d.ts +8 -0
- package/dist/types/protocol/privacy-token.d.ts +17 -0
- package/dist/types/protocol/privacy.d.ts +75 -0
- package/dist/types/protocol/stream.d.ts +31 -0
- package/dist/types/retry/codec.d.ts +3 -0
- package/dist/types/retry/index.d.ts +3 -3
- package/dist/types/retry/parse.d.ts +5 -2
- package/dist/types/retry/reason.d.ts +1 -1
- package/dist/types/retry/tracker.d.ts +1 -0
- package/dist/types/retry/types.d.ts +6 -1
- package/dist/types/signal/api/SignalDeviceSyncApi.d.ts +2 -1
- package/dist/types/signal/api/SignalDigestSyncApi.d.ts +9 -0
- package/dist/types/signal/api/SignalIdentitySyncApi.d.ts +5 -3
- package/dist/types/signal/api/SignalRotateKeyApi.d.ts +4 -5
- package/dist/types/signal/api/SignalSessionSyncApi.d.ts +8 -6
- package/dist/types/signal/api/result-map.d.ts +1 -0
- package/dist/types/signal/constants.d.ts +0 -3
- package/dist/types/signal/crypto/WaAdvSignature.d.ts +0 -2
- package/dist/types/signal/crypto/constants.d.ts +0 -1
- package/dist/types/signal/{store/sqlite.d.ts → encoding.d.ts} +9 -3
- package/dist/types/signal/group/SenderKeyChain.d.ts +1 -1
- package/dist/types/signal/group/SenderKeyManager.d.ts +17 -7
- package/dist/types/signal/index.d.ts +2 -0
- package/dist/types/signal/registration/utils.d.ts +2 -1
- package/dist/types/signal/session/SignalProtocol.d.ts +21 -6
- package/dist/types/signal/session/SignalSerializer.d.ts +2 -1
- package/dist/types/signal/session/resolver.d.ts +11 -4
- package/dist/types/signal/types.d.ts +16 -4
- package/dist/types/store/contracts/appstate.store.d.ts +1 -1
- package/dist/types/store/contracts/identity.store.d.ts +11 -0
- package/dist/types/store/contracts/message-secret.store.d.ts +16 -0
- package/dist/types/store/contracts/pre-key.store.d.ts +13 -0
- package/dist/types/store/contracts/privacy-token.store.d.ts +16 -0
- package/dist/types/store/contracts/retry.store.d.ts +7 -0
- package/dist/types/store/contracts/session.store.d.ts +14 -0
- package/dist/types/store/contracts/signal.store.d.ts +1 -27
- package/dist/types/store/createStore.d.ts +1 -1
- package/dist/types/store/index.d.ts +12 -12
- package/dist/types/store/locks/appstate.lock.d.ts +3 -0
- package/dist/types/store/locks/auth.lock.d.ts +3 -0
- package/dist/types/store/locks/contact.lock.d.ts +3 -0
- package/dist/types/store/locks/device-list.lock.d.ts +2 -0
- package/dist/types/store/locks/identity.lock.d.ts +3 -0
- package/dist/types/store/locks/message-secret.lock.d.ts +3 -0
- package/dist/types/store/locks/message.lock.d.ts +3 -0
- package/dist/types/store/locks/participants.lock.d.ts +2 -0
- package/dist/types/store/locks/pre-key.lock.d.ts +3 -0
- package/dist/types/store/locks/privacy-token.lock.d.ts +2 -0
- package/dist/types/store/locks/retry.lock.d.ts +2 -0
- package/dist/types/store/locks/sender-key.lock.d.ts +3 -0
- package/dist/types/store/locks/session.lock.d.ts +3 -0
- package/dist/types/store/locks/signal.lock.d.ts +3 -0
- package/dist/types/store/locks/thread.lock.d.ts +3 -0
- package/dist/types/store/noop.store.d.ts +4 -0
- package/dist/types/store/providers/memory/appstate.store.d.ts +1 -1
- package/dist/types/store/providers/memory/identity.store.d.ts +18 -0
- package/dist/types/store/providers/memory/message-secret.store.d.ts +21 -0
- package/dist/types/store/providers/memory/pre-key.store.d.ts +23 -0
- package/dist/types/store/providers/memory/privacy-token.store.d.ts +13 -0
- package/dist/types/store/providers/memory/retry.store.d.ts +15 -1
- package/dist/types/store/providers/memory/session.store.d.ts +21 -0
- package/dist/types/store/providers/memory/signal.store.d.ts +2 -43
- package/dist/types/store/providers/memory/thread.store.d.ts +1 -1
- package/dist/types/store/types.d.ts +69 -61
- package/dist/types/transport/WaWebSocket.d.ts +1 -1
- package/dist/types/transport/binary/constants.d.ts +0 -30
- package/dist/types/transport/binary/index.d.ts +0 -1
- package/dist/types/transport/index.d.ts +8 -1
- package/dist/types/transport/keepalive/WaKeepAlive.d.ts +4 -1
- package/dist/types/transport/node/WaMobileTcpSocket.d.ts +18 -0
- package/dist/types/transport/node/WaNodeOrchestrator.d.ts +9 -6
- package/dist/types/transport/node/builders/abprops.d.ts +5 -0
- package/dist/types/transport/node/builders/business.d.ts +29 -0
- package/dist/types/transport/node/builders/device.d.ts +2 -0
- package/dist/types/transport/node/builders/email.d.ts +11 -0
- package/dist/types/transport/node/builders/global.d.ts +102 -0
- package/dist/types/transport/node/builders/message.d.ts +8 -7
- package/dist/types/transport/node/builders/offline.d.ts +2 -0
- package/dist/types/transport/node/builders/pairing.d.ts +0 -2
- package/dist/types/transport/node/builders/prekeys.d.ts +4 -3
- package/dist/types/transport/node/builders/presence.d.ts +6 -0
- package/dist/types/transport/node/builders/privacy-token.d.ts +9 -0
- package/dist/types/transport/node/builders/privacy.d.ts +7 -0
- package/dist/types/transport/node/builders/profile.d.ts +8 -0
- package/dist/types/transport/node/builders/retry.d.ts +0 -1
- package/dist/types/transport/node/helpers.d.ts +8 -0
- package/dist/types/transport/node/mex/argo-decoder.d.ts +11 -0
- package/dist/types/transport/node/mex/client.d.ts +18 -0
- package/dist/types/transport/node/mex/persist-ids.d.ts +14 -0
- package/dist/types/transport/noise/WaMobileClientPayload.d.ts +29 -0
- package/dist/types/transport/noise/WaNoiseCert.d.ts +7 -1
- package/dist/types/transport/noise/WaNoiseSession.d.ts +4 -2
- package/dist/types/transport/noise/WaNoiseSocket.d.ts +4 -2
- package/dist/types/transport/types.d.ts +8 -0
- package/dist/types/util/bytes.d.ts +1 -1
- package/dist/types/util/index.d.ts +5 -0
- package/dist/types/util/primitives.d.ts +0 -1
- package/dist/util/bytes.js +22 -18
- package/dist/util/index.js +23 -0
- package/dist/util/primitives.js +2 -2
- package/package.json +34 -10
- package/proto/index.js +1 -1
- package/dist/auth/flow/WaAuthCredentialsFlow.js +0 -130
- package/dist/auth/pairing/constants.js +0 -5
- package/dist/client/connection/WaKeyShareCoordinator.js +0 -63
- package/dist/crypto/core/constants.js +0 -4
- package/dist/esm/auth/flow/WaAuthCredentialsFlow.js +0 -125
- package/dist/esm/auth/pairing/constants.js +0 -2
- package/dist/esm/client/connection/WaKeyShareCoordinator.js +0 -59
- package/dist/esm/crypto/core/constants.js +0 -1
- package/dist/esm/retry/outbound.js +0 -82
- package/dist/esm/store/providers/sqlite/BaseSqliteStore.js +0 -37
- package/dist/esm/store/providers/sqlite/appstate.store.js +0 -250
- package/dist/esm/store/providers/sqlite/auth.store.js +0 -176
- package/dist/esm/store/providers/sqlite/connection.js +0 -245
- package/dist/esm/store/providers/sqlite/contact.store.js +0 -74
- package/dist/esm/store/providers/sqlite/device-list.store.js +0 -127
- package/dist/esm/store/providers/sqlite/message.store.js +0 -132
- package/dist/esm/store/providers/sqlite/migrations.js +0 -347
- package/dist/esm/store/providers/sqlite/participants.store.js +0 -77
- package/dist/esm/store/providers/sqlite/retry.store.js +0 -141
- package/dist/esm/store/providers/sqlite/sender-key.store.js +0 -198
- package/dist/esm/store/providers/sqlite/signal.store.js +0 -435
- package/dist/esm/store/providers/sqlite/table-names.js +0 -107
- package/dist/esm/store/providers/sqlite/thread.store.js +0 -85
- package/dist/esm/transport/node/builders/index.js +0 -8
- package/dist/retry/outbound.js +0 -87
- package/dist/store/providers/sqlite/BaseSqliteStore.js +0 -41
- package/dist/store/providers/sqlite/appstate.store.js +0 -254
- package/dist/store/providers/sqlite/auth.store.js +0 -180
- package/dist/store/providers/sqlite/connection.js +0 -281
- package/dist/store/providers/sqlite/contact.store.js +0 -78
- package/dist/store/providers/sqlite/device-list.store.js +0 -131
- package/dist/store/providers/sqlite/message.store.js +0 -136
- package/dist/store/providers/sqlite/migrations.js +0 -350
- package/dist/store/providers/sqlite/participants.store.js +0 -81
- package/dist/store/providers/sqlite/retry.store.js +0 -145
- package/dist/store/providers/sqlite/sender-key.store.js +0 -202
- package/dist/store/providers/sqlite/signal.store.js +0 -439
- package/dist/store/providers/sqlite/table-names.js +0 -113
- package/dist/store/providers/sqlite/thread.store.js +0 -89
- package/dist/transport/node/builders/index.js +0 -42
- package/dist/types/appstate/store/sqlite.d.ts +0 -7
- package/dist/types/auth/flow/WaAuthCredentialsFlow.d.ts +0 -14
- package/dist/types/auth/pairing/constants.d.ts +0 -2
- package/dist/types/client/connection/WaKeyShareCoordinator.d.ts +0 -14
- package/dist/types/crypto/core/constants.d.ts +0 -1
- package/dist/types/retry/outbound.d.ts +0 -4
- package/dist/types/store/providers/sqlite/BaseSqliteStore.d.ts +0 -12
- package/dist/types/store/providers/sqlite/appstate.store.d.ts +0 -17
- package/dist/types/store/providers/sqlite/auth.store.d.ts +0 -10
- package/dist/types/store/providers/sqlite/connection.d.ts +0 -10
- package/dist/types/store/providers/sqlite/contact.store.d.ts +0 -12
- package/dist/types/store/providers/sqlite/device-list.store.d.ts +0 -15
- package/dist/types/store/providers/sqlite/message.store.d.ts +0 -13
- package/dist/types/store/providers/sqlite/migrations.d.ts +0 -3
- package/dist/types/store/providers/sqlite/participants.store.d.ts +0 -12
- package/dist/types/store/providers/sqlite/retry.store.d.ts +0 -15
- package/dist/types/store/providers/sqlite/sender-key.store.d.ts +0 -24
- package/dist/types/store/providers/sqlite/signal.store.d.ts +0 -53
- package/dist/types/store/providers/sqlite/table-names.d.ts +0 -5
- package/dist/types/store/providers/sqlite/thread.store.d.ts +0 -13
- package/dist/types/transport/node/builders/index.d.ts +0 -8
- /package/dist/appstate/{WaAppStateSyncResponseParser.js → response-parser.js} +0 -0
|
@@ -5,8 +5,7 @@ exports.buildRegistrationPayload = buildRegistrationPayload;
|
|
|
5
5
|
const node_crypto_1 = require("node:crypto");
|
|
6
6
|
const primitives_1 = require("../../crypto/core/primitives");
|
|
7
7
|
const _proto_1 = require("../../proto.js");
|
|
8
|
-
const constants_1 = require("
|
|
9
|
-
const constants_2 = require("../noise/constants");
|
|
8
|
+
const constants_1 = require("../noise/constants");
|
|
10
9
|
const bytes_1 = require("../../util/bytes");
|
|
11
10
|
function parseVersion(versionBase) {
|
|
12
11
|
const [p = '2', s = '3000', t = '0'] = versionBase.split('.');
|
|
@@ -20,13 +19,20 @@ function parseVersion(versionBase) {
|
|
|
20
19
|
}
|
|
21
20
|
return { primary, secondary, tertiary };
|
|
22
21
|
}
|
|
22
|
+
let cachedLocale = null;
|
|
23
23
|
function resolveLocale() {
|
|
24
|
+
// The first `Intl.DateTimeFormat()` call triggers V8's lazy ICU init
|
|
25
|
+
// (tens of ms). The process locale does not change at runtime, so
|
|
26
|
+
// memoize after the first resolve.
|
|
27
|
+
if (cachedLocale !== null)
|
|
28
|
+
return cachedLocale;
|
|
24
29
|
const locale = Intl.DateTimeFormat().resolvedOptions().locale || 'en-US';
|
|
25
30
|
const [language = 'en', country = 'US'] = locale.split('-');
|
|
26
|
-
|
|
31
|
+
cachedLocale = Object.freeze({
|
|
27
32
|
lg: language.toLowerCase(),
|
|
28
33
|
lc: country.toUpperCase()
|
|
29
|
-
};
|
|
34
|
+
});
|
|
35
|
+
return cachedLocale;
|
|
30
36
|
}
|
|
31
37
|
function defaultWebSubPlatform() {
|
|
32
38
|
return _proto_1.proto.ClientPayload.WebInfo.WebSubPlatform.WEB_BROWSER;
|
|
@@ -64,8 +70,8 @@ function resolveDevicePropsPlatformType(deviceBrowser) {
|
|
|
64
70
|
return _proto_1.proto.DeviceProps.PlatformType.UNKNOWN;
|
|
65
71
|
}
|
|
66
72
|
}
|
|
67
|
-
function defaultUserAgent(versionBase, deviceOsDisplayName) {
|
|
68
|
-
const { primary, secondary, tertiary } = parseVersion(versionBase);
|
|
73
|
+
function defaultUserAgent(versionBase, deviceOsDisplayName, version) {
|
|
74
|
+
const { primary, secondary, tertiary } = version ?? parseVersion(versionBase);
|
|
69
75
|
const locale = resolveLocale();
|
|
70
76
|
return {
|
|
71
77
|
platform: _proto_1.proto.ClientPayload.UserAgent.Platform.WEB,
|
|
@@ -86,8 +92,8 @@ function defaultUserAgent(versionBase, deviceOsDisplayName) {
|
|
|
86
92
|
localeCountryIso31661Alpha2: locale.lc
|
|
87
93
|
};
|
|
88
94
|
}
|
|
89
|
-
function defaultDeviceProps(versionBase, config) {
|
|
90
|
-
const { primary, secondary, tertiary } = parseVersion(versionBase);
|
|
95
|
+
function defaultDeviceProps(versionBase, config, version) {
|
|
96
|
+
const { primary, secondary, tertiary } = version ?? parseVersion(versionBase);
|
|
91
97
|
return _proto_1.proto.DeviceProps.encode({
|
|
92
98
|
os: config.deviceOsDisplayName ?? process.platform,
|
|
93
99
|
version: {
|
|
@@ -109,15 +115,15 @@ function defaultDeviceProps(versionBase, config) {
|
|
|
109
115
|
}
|
|
110
116
|
}).finish();
|
|
111
117
|
}
|
|
112
|
-
function buildCommonPayload(config) {
|
|
113
|
-
const versionBase = config.versionBase ??
|
|
118
|
+
function buildCommonPayload(config, version) {
|
|
119
|
+
const versionBase = config.versionBase ?? constants_1.DEFAULT_VERSION_BASE;
|
|
114
120
|
const pull = config.pull ?? true;
|
|
115
121
|
return {
|
|
116
122
|
passive: config.passive === true,
|
|
117
123
|
pull,
|
|
118
124
|
connectType: _proto_1.proto.ClientPayload.ConnectType.WIFI_UNKNOWN,
|
|
119
125
|
connectReason: _proto_1.proto.ClientPayload.ConnectReason.USER_ACTIVATED,
|
|
120
|
-
userAgent: config.userAgent ?? defaultUserAgent(versionBase, config.deviceOsDisplayName),
|
|
126
|
+
userAgent: config.userAgent ?? defaultUserAgent(versionBase, config.deviceOsDisplayName, version),
|
|
121
127
|
webInfo: config.webInfo ??
|
|
122
128
|
{
|
|
123
129
|
webSubPlatform: defaultWebSubPlatform()
|
|
@@ -145,19 +151,18 @@ function buildRegistrationPayload(config) {
|
|
|
145
151
|
if (!Number.isSafeInteger(signedPreKeyId) || signedPreKeyId <= 0) {
|
|
146
152
|
throw new Error('registration payload requires a valid signedPreKeyId');
|
|
147
153
|
}
|
|
148
|
-
const versionBase = config.versionBase ??
|
|
149
|
-
const
|
|
154
|
+
const versionBase = config.versionBase ?? constants_1.DEFAULT_VERSION_BASE;
|
|
155
|
+
const version = parseVersion(versionBase);
|
|
156
|
+
const common = buildCommonPayload(config, version);
|
|
150
157
|
const devicePairingData = {
|
|
151
|
-
buildHash: config.buildHash
|
|
152
|
-
deviceProps: config.deviceProps
|
|
153
|
-
? (0, bytes_1.toBytesView)(config.deviceProps)
|
|
154
|
-
: defaultDeviceProps(versionBase, config),
|
|
158
|
+
buildHash: config.buildHash ?? (0, primitives_1.md5Bytes)(versionBase),
|
|
159
|
+
deviceProps: config.deviceProps ?? defaultDeviceProps(versionBase, config, version),
|
|
155
160
|
eRegid: (0, bytes_1.intToBytes)(4, registrationId),
|
|
156
|
-
eKeytype: (0, bytes_1.intToBytes)(1,
|
|
157
|
-
eIdent:
|
|
161
|
+
eKeytype: (0, bytes_1.intToBytes)(1, 5),
|
|
162
|
+
eIdent: config.registrationInfo.identityKeyPair.pubKey,
|
|
158
163
|
eSkeyId: (0, bytes_1.intToBytes)(3, signedPreKeyId),
|
|
159
|
-
eSkeyVal:
|
|
160
|
-
eSkeySig:
|
|
164
|
+
eSkeyVal: config.signedPreKey.keyPair.pubKey,
|
|
165
|
+
eSkeySig: config.signedPreKey.signature
|
|
161
166
|
};
|
|
162
167
|
return _proto_1.proto.ClientPayload.encode({
|
|
163
168
|
...common,
|
|
@@ -14,7 +14,7 @@ class WaFrameCodec {
|
|
|
14
14
|
if (maxFrameLength >= 1 << 24) {
|
|
15
15
|
throw new Error('maxFrameLength must be lower than protocol limit (16777216)');
|
|
16
16
|
}
|
|
17
|
-
this.introFrame = introFrame && introFrame.length > 0 ?
|
|
17
|
+
this.introFrame = introFrame && introFrame.length > 0 ? introFrame : null;
|
|
18
18
|
this.maxFrameLength = maxFrameLength;
|
|
19
19
|
this.introSent = false;
|
|
20
20
|
this.buffered = bytes_1.EMPTY_BYTES;
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.buildMobileLoginPayload = buildMobileLoginPayload;
|
|
4
|
+
const node_crypto_1 = require("node:crypto");
|
|
5
|
+
const _proto_1 = require("../../proto.js");
|
|
6
|
+
function parseAppVersion(version) {
|
|
7
|
+
const parts = version.split('.');
|
|
8
|
+
const at = (i) => {
|
|
9
|
+
const n = Number(parts[i]);
|
|
10
|
+
return Number.isFinite(n) ? n : undefined;
|
|
11
|
+
};
|
|
12
|
+
return {
|
|
13
|
+
primary: at(0) ?? 2,
|
|
14
|
+
secondary: at(1) ?? 0,
|
|
15
|
+
tertiary: at(2) ?? 0,
|
|
16
|
+
quaternary: at(3)
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
function buildMobileLoginPayload(config) {
|
|
20
|
+
if (!Number.isSafeInteger(config.username) || config.username <= 0) {
|
|
21
|
+
throw new Error('mobile login payload requires a valid numeric username');
|
|
22
|
+
}
|
|
23
|
+
const info = config.deviceInfo;
|
|
24
|
+
const version = parseAppVersion(info.appVersion);
|
|
25
|
+
const userAgent = {
|
|
26
|
+
platform: _proto_1.proto.ClientPayload.UserAgent.Platform.ANDROID,
|
|
27
|
+
releaseChannel: _proto_1.proto.ClientPayload.UserAgent.ReleaseChannel.RELEASE,
|
|
28
|
+
appVersion: version,
|
|
29
|
+
mcc: info.mcc ?? '000',
|
|
30
|
+
mnc: info.mnc ?? '000',
|
|
31
|
+
osVersion: info.osVersion,
|
|
32
|
+
manufacturer: info.manufacturer,
|
|
33
|
+
device: info.device,
|
|
34
|
+
osBuildNumber: info.osBuildNumber,
|
|
35
|
+
phoneId: info.phoneId ?? (0, node_crypto_1.randomUUID)(),
|
|
36
|
+
localeLanguageIso6391: info.localeLanguageIso6391 ?? 'en',
|
|
37
|
+
localeCountryIso31661Alpha2: info.localeCountryIso31661Alpha2 ?? 'US',
|
|
38
|
+
deviceType: _proto_1.proto.ClientPayload.UserAgent.DeviceType.PHONE,
|
|
39
|
+
deviceBoard: info.deviceBoard,
|
|
40
|
+
deviceModelType: info.deviceModelType
|
|
41
|
+
};
|
|
42
|
+
return _proto_1.proto.ClientPayload.encode({
|
|
43
|
+
passive: config.passive === true,
|
|
44
|
+
pull: config.pull ?? true,
|
|
45
|
+
product: _proto_1.proto.ClientPayload.Product.WHATSAPP,
|
|
46
|
+
connectType: config.connectType ?? _proto_1.proto.ClientPayload.ConnectType.CELLULAR_UNKNOWN,
|
|
47
|
+
connectReason: config.connectReason ?? _proto_1.proto.ClientPayload.ConnectReason.USER_ACTIVATED,
|
|
48
|
+
userAgent,
|
|
49
|
+
username: config.username,
|
|
50
|
+
device: config.device ?? 0,
|
|
51
|
+
lidDbMigrated: config.lidDbMigrated === true,
|
|
52
|
+
pushName: config.pushName,
|
|
53
|
+
yearClass: config.yearClass,
|
|
54
|
+
memClass: config.memClass
|
|
55
|
+
}).finish();
|
|
56
|
+
}
|
|
@@ -2,26 +2,14 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.verifyNoiseCertificateChain = verifyNoiseCertificateChain;
|
|
4
4
|
const _crypto_1 = require("../../crypto/index.js");
|
|
5
|
-
const X25519_1 = require("../../crypto/curves/X25519");
|
|
6
5
|
const _proto_1 = require("../../proto.js");
|
|
7
6
|
const constants_1 = require("../noise/constants");
|
|
8
7
|
const bytes_1 = require("../../util/bytes");
|
|
9
8
|
const primitives_1 = require("../../util/primitives");
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
}
|
|
15
|
-
const signature = new Uint8Array(signatureInput);
|
|
16
|
-
const lastByte = signature[63];
|
|
17
|
-
if ((lastByte & 0x60) !== 0) {
|
|
18
|
-
return false;
|
|
19
|
-
}
|
|
20
|
-
const signBit = lastByte & 0x80;
|
|
21
|
-
signature[63] = lastByte & 0x7f;
|
|
22
|
-
const edwardsPublicKey = (0, X25519_1.montgomeryToEdwardsPublic)(publicKey.subarray(1), signBit);
|
|
23
|
-
return (0, _crypto_1.ed25519VerifyRaw)(edwardsPublicKey, signature, message);
|
|
24
|
-
}
|
|
9
|
+
const PRODUCTION_ROOT_CA = {
|
|
10
|
+
publicKey: (0, bytes_1.hexToBytes)(constants_1.ROOT_CA_PUBLIC_KEY_HEX),
|
|
11
|
+
serial: constants_1.ROOT_CA_SERIAL
|
|
12
|
+
};
|
|
25
13
|
function parseNoiseCertificate(certificate) {
|
|
26
14
|
if (!certificate) {
|
|
27
15
|
throw new Error('missing noise certificate');
|
|
@@ -41,21 +29,16 @@ function parseNoiseCertificate(certificate) {
|
|
|
41
29
|
signature: signatureBytes
|
|
42
30
|
};
|
|
43
31
|
}
|
|
44
|
-
function
|
|
45
|
-
const raw = (0, bytes_1.hexToBytes)(constants_1.ROOT_CA_PUBLIC_KEY_HEX);
|
|
46
|
-
return (0, _crypto_1.toSerializedPubKey)(raw);
|
|
47
|
-
}
|
|
48
|
-
async function verifyNoiseCertificateChain(certificateChain, serverStatic) {
|
|
32
|
+
async function verifyNoiseCertificateChain(certificateChain, serverStatic, rootCa = PRODUCTION_ROOT_CA) {
|
|
49
33
|
const chain = _proto_1.proto.CertChain.decode(certificateChain);
|
|
50
34
|
if (!chain.leaf || !chain.intermediate) {
|
|
51
35
|
throw new Error('noise certificate chain is missing leaf/intermediate');
|
|
52
36
|
}
|
|
53
37
|
const intermediate = parseNoiseCertificate(chain.intermediate);
|
|
54
|
-
if (intermediate.issuerSerial !==
|
|
38
|
+
if (intermediate.issuerSerial !== rootCa.serial) {
|
|
55
39
|
throw new Error('intermediate certificate issuer mismatch');
|
|
56
40
|
}
|
|
57
|
-
const
|
|
58
|
-
const validIntermediate = await verifySignalVariant(rootKey, intermediate.details, intermediate.signature);
|
|
41
|
+
const validIntermediate = await (0, _crypto_1.xeddsaVerify)(rootCa.publicKey, intermediate.details, intermediate.signature);
|
|
59
42
|
if (!validIntermediate) {
|
|
60
43
|
throw new Error('intermediate certificate signature is invalid');
|
|
61
44
|
}
|
|
@@ -63,8 +46,7 @@ async function verifyNoiseCertificateChain(certificateChain, serverStatic) {
|
|
|
63
46
|
if (leaf.issuerSerial !== intermediate.serial) {
|
|
64
47
|
throw new Error('leaf certificate issuer mismatch');
|
|
65
48
|
}
|
|
66
|
-
const
|
|
67
|
-
const validLeaf = await verifySignalVariant(intermediatePublicSerialized, leaf.details, leaf.signature);
|
|
49
|
+
const validLeaf = await (0, _crypto_1.xeddsaVerify)(intermediate.key, leaf.details, leaf.signature);
|
|
68
50
|
if (!validLeaf) {
|
|
69
51
|
throw new Error('leaf certificate signature is invalid');
|
|
70
52
|
}
|
|
@@ -3,7 +3,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.WaNoiseSession = void 0;
|
|
4
4
|
const _crypto_1 = require("../../crypto/index.js");
|
|
5
5
|
const ConsoleLogger_1 = require("../../infra/log/ConsoleLogger");
|
|
6
|
-
const BoundedTaskQueue_1 = require("../../infra/perf/BoundedTaskQueue");
|
|
7
6
|
const _proto_1 = require("../../proto.js");
|
|
8
7
|
const constants_1 = require("../../protocol/constants");
|
|
9
8
|
const constants_2 = require("../noise/constants");
|
|
@@ -17,7 +16,7 @@ function resolvePayload(payload) {
|
|
|
17
16
|
if (payload instanceof Uint8Array) {
|
|
18
17
|
return Promise.resolve(payload);
|
|
19
18
|
}
|
|
20
|
-
return Promise.resolve(payload())
|
|
19
|
+
return Promise.resolve(payload());
|
|
21
20
|
}
|
|
22
21
|
async function resolveHandshakePayload(config) {
|
|
23
22
|
if (config.isRegistered) {
|
|
@@ -51,6 +50,8 @@ function buildRoutingInfoPrefix(routingInfo) {
|
|
|
51
50
|
}
|
|
52
51
|
class WaNoiseSession {
|
|
53
52
|
constructor(sendWire, logger = new ConsoleLogger_1.ConsoleLogger('info')) {
|
|
53
|
+
this.writeChain = Promise.resolve();
|
|
54
|
+
this.readChain = Promise.resolve();
|
|
54
55
|
this.frameCodec = null;
|
|
55
56
|
this.handshakeInbox = [];
|
|
56
57
|
this.handshakeInboxHead = 0;
|
|
@@ -60,11 +61,10 @@ class WaNoiseSession {
|
|
|
60
61
|
this.closedError = null;
|
|
61
62
|
this.noiseSocket = null;
|
|
62
63
|
this.serverStaticKey = null;
|
|
64
|
+
this.trustedRootCa = undefined;
|
|
63
65
|
this.handshakeFrameTimeoutMs = constants_1.WA_DEFAULTS.CONNECT_TIMEOUT_MS;
|
|
64
66
|
this.sendWire = sendWire;
|
|
65
67
|
this.logger = logger;
|
|
66
|
-
this.writeQueue = new BoundedTaskQueue_1.BoundedTaskQueue(4096, 1);
|
|
67
|
-
this.readQueue = new BoundedTaskQueue_1.BoundedTaskQueue(4096, 1);
|
|
68
68
|
}
|
|
69
69
|
async start(config) {
|
|
70
70
|
this.reset();
|
|
@@ -72,9 +72,7 @@ class WaNoiseSession {
|
|
|
72
72
|
isRegistered: config.isRegistered,
|
|
73
73
|
hasServerStaticKey: !!config.serverStaticKey
|
|
74
74
|
});
|
|
75
|
-
const protocolHeader = config.protocolHeader
|
|
76
|
-
? (0, bytes_1.toBytesView)(config.protocolHeader)
|
|
77
|
-
: constants_2.WA_PROTO_HEADER;
|
|
75
|
+
const protocolHeader = config.protocolHeader ?? constants_2.WA_PROTO_HEADER;
|
|
78
76
|
const introFrame = config.routingInfo && config.routingInfo.length > 0
|
|
79
77
|
? (0, bytes_1.concatBytes)([buildRoutingInfoPrefix(config.routingInfo), protocolHeader])
|
|
80
78
|
: protocolHeader;
|
|
@@ -84,6 +82,7 @@ class WaNoiseSession {
|
|
|
84
82
|
resolveHandshakePayload(config)
|
|
85
83
|
]);
|
|
86
84
|
const verifyCertificates = config.verifyCertificateChain !== false;
|
|
85
|
+
this.trustedRootCa = config.trustedRootCa;
|
|
87
86
|
if (config.serverStaticKey && config.serverStaticKey.length === 32) {
|
|
88
87
|
this.logger.info('noise session attempting resume handshake (IK)');
|
|
89
88
|
this.noiseSocket = await this.resumeHandshake(config.serverStaticKey, config.clientStaticKeyPair, ephemeralKeyPair, payload, protocolHeader, verifyCertificates);
|
|
@@ -96,12 +95,24 @@ class WaNoiseSession {
|
|
|
96
95
|
await this.decodeBufferedPostHandshakeFrames();
|
|
97
96
|
this.logger.info('noise session established via full handshake');
|
|
98
97
|
}
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
98
|
+
encryptFrame(frame) {
|
|
99
|
+
const socket = this.noiseSocket;
|
|
100
|
+
const codec = this.frameCodec;
|
|
101
|
+
if (!socket || !codec) {
|
|
102
|
+
return Promise.reject(new Error('noise session is not established'));
|
|
103
|
+
}
|
|
104
|
+
let encryptPromise;
|
|
105
|
+
try {
|
|
106
|
+
encryptPromise = socket.encrypt(socket.reserveWriteNonce(), frame);
|
|
102
107
|
}
|
|
103
|
-
|
|
104
|
-
|
|
108
|
+
catch (error) {
|
|
109
|
+
return Promise.reject(error);
|
|
110
|
+
}
|
|
111
|
+
const result = this.writeChain
|
|
112
|
+
.then(() => encryptPromise)
|
|
113
|
+
.then((encrypted) => codec.encodeFrame(encrypted));
|
|
114
|
+
this.writeChain = result.then(() => { }, () => { });
|
|
115
|
+
return result;
|
|
105
116
|
}
|
|
106
117
|
async pushWireChunk(chunk) {
|
|
107
118
|
const codec = this.frameCodec;
|
|
@@ -110,7 +121,9 @@ class WaNoiseSession {
|
|
|
110
121
|
}
|
|
111
122
|
const out = [];
|
|
112
123
|
if (this.pendingDecryptedFrames.length > 0) {
|
|
113
|
-
|
|
124
|
+
for (let i = 0; i < this.pendingDecryptedFrames.length; i += 1) {
|
|
125
|
+
out.push(this.pendingDecryptedFrames[i]);
|
|
126
|
+
}
|
|
114
127
|
this.pendingDecryptedFrames = [];
|
|
115
128
|
}
|
|
116
129
|
const frames = codec.pushWireChunk(chunk);
|
|
@@ -128,9 +141,15 @@ class WaNoiseSession {
|
|
|
128
141
|
}
|
|
129
142
|
return out;
|
|
130
143
|
}
|
|
131
|
-
|
|
132
|
-
const
|
|
133
|
-
|
|
144
|
+
if (frames.length > 0) {
|
|
145
|
+
const decryptBatch = this.decryptFramesBatch(this.noiseSocket, frames);
|
|
146
|
+
this.readChain = this.readChain
|
|
147
|
+
.then(() => decryptBatch)
|
|
148
|
+
.then(() => { }, () => { });
|
|
149
|
+
const decrypted = await decryptBatch;
|
|
150
|
+
for (let i = 0; i < decrypted.length; i++) {
|
|
151
|
+
out.push(decrypted[i]);
|
|
152
|
+
}
|
|
134
153
|
}
|
|
135
154
|
return out;
|
|
136
155
|
}
|
|
@@ -145,6 +164,16 @@ class WaNoiseSession {
|
|
|
145
164
|
rejecter(closeError);
|
|
146
165
|
}
|
|
147
166
|
}
|
|
167
|
+
async decryptFramesBatch(socket, frames) {
|
|
168
|
+
if (frames.length === 1) {
|
|
169
|
+
return [await socket.decrypt(socket.reserveReadNonce(), frames[0])];
|
|
170
|
+
}
|
|
171
|
+
const pending = new Array(frames.length);
|
|
172
|
+
for (let i = 0; i < frames.length; i++) {
|
|
173
|
+
pending[i] = socket.decrypt(socket.reserveReadNonce(), frames[i]);
|
|
174
|
+
}
|
|
175
|
+
return Promise.all(pending);
|
|
176
|
+
}
|
|
148
177
|
reset() {
|
|
149
178
|
this.logger.trace('noise session reset');
|
|
150
179
|
this.frameCodec = null;
|
|
@@ -155,11 +184,11 @@ class WaNoiseSession {
|
|
|
155
184
|
this.closedError = null;
|
|
156
185
|
this.noiseSocket = null;
|
|
157
186
|
this.serverStaticKey = null;
|
|
187
|
+
this.trustedRootCa = undefined;
|
|
188
|
+
this.writeChain = Promise.resolve();
|
|
189
|
+
this.readChain = Promise.resolve();
|
|
158
190
|
}
|
|
159
191
|
getServerStaticKey() {
|
|
160
|
-
if (!this.serverStaticKey) {
|
|
161
|
-
return null;
|
|
162
|
-
}
|
|
163
192
|
return this.serverStaticKey;
|
|
164
193
|
}
|
|
165
194
|
async fullHandshake(clientStaticKeyPair, ephemeralKeyPair, payload, protocolHeader, verifyCertificates) {
|
|
@@ -189,10 +218,12 @@ class WaNoiseSession {
|
|
|
189
218
|
await handshake.start(constants_2.NOISE_IK_NAME, protocolHeader);
|
|
190
219
|
await handshake.authenticate(serverStaticKey);
|
|
191
220
|
await handshake.authenticate(ephemeralKeyPair.pubKey);
|
|
192
|
-
const agreement1 = await
|
|
221
|
+
const [agreement1, agreement2] = await Promise.all([
|
|
222
|
+
_crypto_1.X25519.scalarMult(ephemeralKeyPair.privKey, serverStaticKey),
|
|
223
|
+
_crypto_1.X25519.scalarMult(clientStaticKeyPair.privKey, serverStaticKey)
|
|
224
|
+
]);
|
|
193
225
|
await handshake.mixIntoKey(agreement1);
|
|
194
226
|
const encryptedClientStatic = await handshake.encrypt(clientStaticKeyPair.pubKey);
|
|
195
|
-
const agreement2 = await _crypto_1.X25519.scalarMult(clientStaticKeyPair.privKey, serverStaticKey);
|
|
196
227
|
await handshake.mixIntoKey(agreement2);
|
|
197
228
|
const encryptedPayload = await handshake.encrypt(payload);
|
|
198
229
|
const clientHello = _proto_1.proto.HandshakeMessage.encode({
|
|
@@ -217,11 +248,15 @@ class WaNoiseSession {
|
|
|
217
248
|
if (!serverHello.payload) {
|
|
218
249
|
throw new Error('noise resume handshake missing certificate payload');
|
|
219
250
|
}
|
|
220
|
-
const serverEphemeral =
|
|
251
|
+
const serverEphemeral = serverHello.ephemeral;
|
|
221
252
|
await handshake.authenticate(serverEphemeral);
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
253
|
+
const [dh1, dh2] = await Promise.all([
|
|
254
|
+
_crypto_1.X25519.scalarMult(ephemeralKeyPair.privKey, serverEphemeral),
|
|
255
|
+
_crypto_1.X25519.scalarMult(clientStaticKeyPair.privKey, serverEphemeral)
|
|
256
|
+
]);
|
|
257
|
+
await handshake.mixIntoKey(dh1);
|
|
258
|
+
await handshake.mixIntoKey(dh2);
|
|
259
|
+
await handshake.decrypt(serverHello.payload);
|
|
225
260
|
this.serverStaticKey = serverStaticKey;
|
|
226
261
|
this.logger.info('noise resume handshake successful without fallback');
|
|
227
262
|
return { socket: await handshake.finish(), serverHelloFrame: null };
|
|
@@ -239,14 +274,14 @@ class WaNoiseSession {
|
|
|
239
274
|
if (!serverHello?.ephemeral || !serverHello.static || !serverHello.payload) {
|
|
240
275
|
throw new Error('noise full handshake missing server hello fields');
|
|
241
276
|
}
|
|
242
|
-
const serverEphemeral =
|
|
277
|
+
const serverEphemeral = serverHello.ephemeral;
|
|
243
278
|
await handshake.authenticate(serverEphemeral);
|
|
244
279
|
await handshake.mixIntoKey(await _crypto_1.X25519.scalarMult(ephemeralKeyPair.privKey, serverEphemeral));
|
|
245
|
-
const serverStatic = await handshake.decrypt(
|
|
280
|
+
const serverStatic = await handshake.decrypt(serverHello.static);
|
|
246
281
|
await handshake.mixIntoKey(await _crypto_1.X25519.scalarMult(ephemeralKeyPair.privKey, serverStatic));
|
|
247
|
-
const certificate = await handshake.decrypt(
|
|
282
|
+
const certificate = await handshake.decrypt(serverHello.payload);
|
|
248
283
|
if (verifyCertificates) {
|
|
249
|
-
await (0, WaNoiseCert_1.verifyNoiseCertificateChain)(certificate, serverStatic);
|
|
284
|
+
await (0, WaNoiseCert_1.verifyNoiseCertificateChain)(certificate, serverStatic, this.trustedRootCa);
|
|
250
285
|
this.logger.trace('noise certificate chain verified');
|
|
251
286
|
}
|
|
252
287
|
this.serverStaticKey = serverStatic;
|
|
@@ -322,10 +357,17 @@ class WaNoiseSession {
|
|
|
322
357
|
this.logger.debug('decoding buffered post-handshake frames', {
|
|
323
358
|
count: this.handshakeInbox.length - this.handshakeInboxHead
|
|
324
359
|
});
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
this.
|
|
360
|
+
const start = this.handshakeInboxHead;
|
|
361
|
+
const frames = this.handshakeInbox.slice(start);
|
|
362
|
+
if (frames.length > 0) {
|
|
363
|
+
const decryptBatch = this.decryptFramesBatch(this.noiseSocket, frames);
|
|
364
|
+
this.readChain = this.readChain
|
|
365
|
+
.then(() => decryptBatch)
|
|
366
|
+
.then(() => { }, () => { });
|
|
367
|
+
const decrypted = await decryptBatch;
|
|
368
|
+
for (let i = 0; i < decrypted.length; i++) {
|
|
369
|
+
this.pendingDecryptedFrames.push(decrypted[i]);
|
|
370
|
+
}
|
|
329
371
|
}
|
|
330
372
|
this.handshakeInbox.length = this.handshakeInboxHead = 0;
|
|
331
373
|
}
|
|
@@ -9,12 +9,16 @@ class WaNoiseSocket {
|
|
|
9
9
|
this.writeCounter = 0;
|
|
10
10
|
this.readCounter = 0;
|
|
11
11
|
}
|
|
12
|
-
|
|
13
|
-
|
|
12
|
+
reserveWriteNonce() {
|
|
13
|
+
return (0, _crypto_1.buildNonce)(this.writeCounter++);
|
|
14
|
+
}
|
|
15
|
+
encrypt(nonce, frame, additionalData) {
|
|
14
16
|
return (0, _crypto_1.aesGcmEncrypt)(this.encryptKey, nonce, frame, additionalData);
|
|
15
17
|
}
|
|
16
|
-
|
|
17
|
-
|
|
18
|
+
reserveReadNonce() {
|
|
19
|
+
return (0, _crypto_1.buildNonce)(this.readCounter++);
|
|
20
|
+
}
|
|
21
|
+
decrypt(nonce, frame, additionalData) {
|
|
18
22
|
return (0, _crypto_1.aesGcmDecrypt)(this.decryptKey, nonce, frame, additionalData);
|
|
19
23
|
}
|
|
20
24
|
}
|
|
@@ -7,6 +7,7 @@ const constants_1 = require("../../protocol/constants");
|
|
|
7
7
|
const helpers_1 = require("../node/helpers");
|
|
8
8
|
const bytes_1 = require("../../util/bytes");
|
|
9
9
|
const primitives_1 = require("../../util/primitives");
|
|
10
|
+
const DIGITS_ONLY_RE = /^\d+$/;
|
|
10
11
|
function parseStreamControlNode(node) {
|
|
11
12
|
if (node.tag === constants_1.WA_STREAM_SIGNALING.XML_STREAM_END_TAG) {
|
|
12
13
|
return { kind: 'xmlstreamend' };
|
|
@@ -20,9 +21,12 @@ function parseStreamControlNode(node) {
|
|
|
20
21
|
? { kind: 'stream_error_replaced' }
|
|
21
22
|
: { kind: 'stream_error_device_removed' };
|
|
22
23
|
}
|
|
23
|
-
const
|
|
24
|
-
if (
|
|
25
|
-
|
|
24
|
+
const codeStr = node.attrs.code;
|
|
25
|
+
if (codeStr && DIGITS_ONLY_RE.test(codeStr)) {
|
|
26
|
+
const code = Number(codeStr);
|
|
27
|
+
if (Number.isSafeInteger(code)) {
|
|
28
|
+
return { kind: 'stream_error_code', code };
|
|
29
|
+
}
|
|
26
30
|
}
|
|
27
31
|
const ackNode = (0, helpers_1.findNodeChild)(node, constants_1.WA_STREAM_SIGNALING.ACK_TAG);
|
|
28
32
|
if (ackNode) {
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type CryptoKey } from '../crypto/core/primitives';
|
|
2
|
+
import { type Proto } from '..';
|
|
2
3
|
interface WaAppStateDerivedKeys {
|
|
3
|
-
readonly
|
|
4
|
-
readonly
|
|
5
|
-
readonly
|
|
6
|
-
readonly
|
|
7
|
-
readonly
|
|
4
|
+
readonly indexHmacKey: CryptoKey;
|
|
5
|
+
readonly valueEncryptionAesKey: CryptoKey;
|
|
6
|
+
readonly valueMacHmacKey: CryptoKey;
|
|
7
|
+
readonly snapshotMacHmacKey: CryptoKey;
|
|
8
|
+
readonly patchMacHmacKey: CryptoKey;
|
|
8
9
|
}
|
|
9
10
|
interface WaAppStateEncryptedMutation {
|
|
10
11
|
readonly indexMac: Uint8Array;
|
|
@@ -21,10 +22,12 @@ interface WaAppStateDecryptedMutation {
|
|
|
21
22
|
export declare class WaAppStateCrypto {
|
|
22
23
|
private readonly derivedKeysCache;
|
|
23
24
|
private readonly derivedKeysCacheMaxSize;
|
|
24
|
-
|
|
25
|
+
private readonly skipMacVerification;
|
|
26
|
+
constructor(derivedKeysCacheMaxSize?: number, skipMacVerification?: boolean);
|
|
27
|
+
get isMacVerificationSkipped(): boolean;
|
|
25
28
|
clearCache(): void;
|
|
26
29
|
deriveKeys(keyData: Uint8Array): Promise<WaAppStateDerivedKeys>;
|
|
27
|
-
generateIndexMac(
|
|
30
|
+
generateIndexMac(indexHmacKey: CryptoKey, indexBytes: Uint8Array): Promise<Uint8Array>;
|
|
28
31
|
encryptMutation(args: {
|
|
29
32
|
readonly operation: number;
|
|
30
33
|
readonly keyId: Uint8Array;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import type { AppStateCollectionName, WaAppStateMissingKeysEvent,
|
|
1
|
+
import type { AppStateCollectionName, WaAppStateMissingKeysEvent, WaAppStateStoreData, WaAppStateSyncKey, WaAppStateSyncOptions, WaAppStateSyncResult } from './types';
|
|
2
2
|
import type { Logger } from '../infra/log/types';
|
|
3
|
-
import type
|
|
3
|
+
import { type Proto } from '..';
|
|
4
4
|
import type { WaAppStateStore } from '../store/contracts/appstate.store';
|
|
5
5
|
import type { BinaryNode } from '../transport/types';
|
|
6
6
|
interface WaAppStateSyncClientOptions {
|
|
@@ -11,6 +11,8 @@ interface WaAppStateSyncClientOptions {
|
|
|
11
11
|
readonly hostDomain?: string;
|
|
12
12
|
readonly defaultTimeoutMs?: number;
|
|
13
13
|
readonly onMissingKeys?: (event: WaAppStateMissingKeysEvent) => Promise<void>;
|
|
14
|
+
readonly skipMacVerification?: boolean;
|
|
15
|
+
readonly mobilePrimary?: boolean;
|
|
14
16
|
}
|
|
15
17
|
export declare class WaAppStateMissingKeyError extends Error {
|
|
16
18
|
readonly keyId: Uint8Array | null;
|
|
@@ -26,10 +28,12 @@ export declare class WaAppStateSyncClient {
|
|
|
26
28
|
private readonly defaultTimeoutMs;
|
|
27
29
|
private readonly onMissingKeys?;
|
|
28
30
|
private readonly crypto;
|
|
31
|
+
private readonly mobilePrimary;
|
|
29
32
|
private syncContext;
|
|
30
33
|
private syncPromise;
|
|
31
34
|
constructor(options: WaAppStateSyncClientOptions);
|
|
32
35
|
exportState(): Promise<WaAppStateStoreData>;
|
|
36
|
+
ensureInitialSyncKey(): Promise<WaAppStateSyncKey>;
|
|
33
37
|
importSyncKeys(keys: readonly WaAppStateSyncKey[]): Promise<number>;
|
|
34
38
|
importSyncKeyShare(share: Proto.Message.IAppStateSyncKeyShare): Promise<number>;
|
|
35
39
|
sync(options?: WaAppStateSyncOptions): Promise<WaAppStateSyncResult>;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { WaAppStateStoreData, WaAppStateSyncKey } from './types';
|
|
2
|
+
type StoreRow = Readonly<Record<string, unknown>>;
|
|
3
|
+
export declare function encodeAppStateFingerprint(fingerprint: WaAppStateSyncKey['fingerprint']): Uint8Array | null;
|
|
4
|
+
export declare function decodeAppStateFingerprint(raw: unknown): WaAppStateSyncKey['fingerprint'] | undefined;
|
|
5
|
+
export declare function decodeAppStateSyncKeys(rows: readonly StoreRow[]): readonly WaAppStateSyncKey[];
|
|
6
|
+
export declare function decodeAppStateCollections(versionRows: readonly StoreRow[], valueRows: readonly StoreRow[]): WaAppStateStoreData['collections'];
|
|
7
|
+
export {};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export * from './constants';
|
|
2
|
-
export type { WaAppStateSyncOptions } from './types';
|
|
2
|
+
export type { AppStateCollectionName, WaAppStateStoreData, WaAppStateSyncKey, WaAppStateSyncOptions } from './types';
|
|
3
|
+
export { encodeAppStateFingerprint, decodeAppStateFingerprint, decodeAppStateCollections, decodeAppStateSyncKeys } from './encoding';
|
|
3
4
|
export * from './utils';
|
|
4
5
|
export { WaAppStateCrypto } from './WaAppStateCrypto';
|
|
5
|
-
export {
|
|
6
|
-
export { parseCollectionState, parseSyncResponse, type CollectionResponsePayload } from './WaAppStateSyncResponseParser';
|
|
6
|
+
export { parseSyncResponse } from './response-parser';
|
|
7
7
|
export { WaAppStateSyncClient } from './WaAppStateSyncClient';
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { AppStateCollectionName, AppStateCollectionState } from './types';
|
|
2
|
-
import type
|
|
2
|
+
import { type Proto } from '..';
|
|
3
3
|
import type { BinaryNode } from '../transport/types';
|
|
4
4
|
export interface CollectionResponsePayload {
|
|
5
5
|
readonly collection: AppStateCollectionName;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Proto } from '..';
|
|
2
|
-
import type {
|
|
2
|
+
import type { WA_APP_STATE_COLLECTION_STATES, WA_APP_STATE_COLLECTIONS } from '../protocol/constants';
|
|
3
3
|
export type AppStateCollectionName = (typeof WA_APP_STATE_COLLECTIONS)[keyof typeof WA_APP_STATE_COLLECTIONS];
|
|
4
4
|
export type AppStateCollectionState = (typeof WA_APP_STATE_COLLECTION_STATES)[keyof typeof WA_APP_STATE_COLLECTION_STATES];
|
|
5
5
|
export interface WaAppStateSyncKey {
|
|
@@ -2,8 +2,6 @@ import type { AppStateCollectionName, WaAppStateSyncKey } from './types';
|
|
|
2
2
|
import type { WaMediaTransferClient } from '../media/WaMediaTransferClient';
|
|
3
3
|
import type { Proto } from '..';
|
|
4
4
|
export declare function parseCollectionName(value: string | undefined): AppStateCollectionName | null;
|
|
5
|
-
export declare function keyDeviceId(keyId: Uint8Array): number | null;
|
|
6
5
|
export declare function keyEpoch(keyId: Uint8Array): number;
|
|
7
6
|
export declare function pickActiveSyncKey(keys: Iterable<WaAppStateSyncKey>): WaAppStateSyncKey | null;
|
|
8
|
-
export declare function toNetworkOrder64(value: number): Uint8Array;
|
|
9
7
|
export declare function downloadExternalBlobReference(mediaTransfer: WaMediaTransferClient, reference: Proto.IExternalBlobReference): Promise<Uint8Array>;
|