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,15 +5,17 @@ const _proto_1 = require("../../proto.js");
|
|
|
5
5
|
const constants_1 = require("../../protocol/constants");
|
|
6
6
|
const jid_1 = require("../../protocol/jid");
|
|
7
7
|
const constants_2 = require("../../retry/constants");
|
|
8
|
-
const outbound_1 = require("../../retry/outbound");
|
|
9
8
|
const parse_1 = require("../../retry/parse");
|
|
10
9
|
const reason_1 = require("../../retry/reason");
|
|
11
10
|
const replay_1 = require("../../retry/replay");
|
|
12
11
|
const keygen_1 = require("../../signal/registration/keygen");
|
|
13
|
-
const
|
|
12
|
+
const global_1 = require("../../transport/node/builders/global");
|
|
14
13
|
const retry_1 = require("../../transport/node/builders/retry");
|
|
14
|
+
const bytes_1 = require("../../util/bytes");
|
|
15
|
+
const collections_1 = require("../../util/collections");
|
|
15
16
|
const primitives_1 = require("../../util/primitives");
|
|
16
17
|
const RETRY_CLEANUP_INTERVAL_MS = 30000;
|
|
18
|
+
const RETRY_SESSION_BASE_KEY_CACHE_MAX_ENTRIES = 8192;
|
|
17
19
|
function getRetryReasonName(code) {
|
|
18
20
|
if (code === undefined) {
|
|
19
21
|
return undefined;
|
|
@@ -38,6 +40,8 @@ class WaRetryCoordinator {
|
|
|
38
40
|
this.retryStore = options.retryStore;
|
|
39
41
|
this.retryTtlMs = this.retryStore.getTtlMs?.() ?? constants_2.RETRY_OUTBOUND_TTL_MS;
|
|
40
42
|
this.signalStore = options.signalStore;
|
|
43
|
+
this.preKeyStore = options.preKeyStore;
|
|
44
|
+
this.sessionStore = options.sessionStore;
|
|
41
45
|
this.senderKeyStore = options.senderKeyStore;
|
|
42
46
|
this.signalProtocol = options.signalProtocol;
|
|
43
47
|
this.signalDeviceSync = options.signalDeviceSync;
|
|
@@ -55,6 +59,7 @@ class WaRetryCoordinator {
|
|
|
55
59
|
getCurrentSignedIdentity: this.getCurrentSignedIdentity
|
|
56
60
|
});
|
|
57
61
|
this.retryProcessingByMessageId = new Map();
|
|
62
|
+
this.retrySessionBaseKeys = new Map();
|
|
58
63
|
}
|
|
59
64
|
async onDecryptFailure(context, error) {
|
|
60
65
|
try {
|
|
@@ -79,12 +84,23 @@ class WaRetryCoordinator {
|
|
|
79
84
|
if (!this.isRetryReceiptNode(receiptNode)) {
|
|
80
85
|
return;
|
|
81
86
|
}
|
|
87
|
+
let shouldAck = false;
|
|
82
88
|
try {
|
|
83
89
|
await this.maybeCleanupRetryStore(Date.now());
|
|
84
|
-
const
|
|
90
|
+
const expectedToJids = [];
|
|
91
|
+
const meJid = this.getCurrentMeJid()?.trim();
|
|
92
|
+
const meLid = this.getCurrentMeLid()?.trim();
|
|
93
|
+
if (meJid) {
|
|
94
|
+
expectedToJids.push(meJid);
|
|
95
|
+
}
|
|
96
|
+
if (meLid) {
|
|
97
|
+
expectedToJids.push(meLid);
|
|
98
|
+
}
|
|
99
|
+
const request = (0, parse_1.parseRetryReceiptRequest)(receiptNode, expectedToJids.length > 0 ? { expectedToJids } : undefined);
|
|
85
100
|
if (!request) {
|
|
86
101
|
return;
|
|
87
102
|
}
|
|
103
|
+
shouldAck = true;
|
|
88
104
|
await this.handleParsedRetryRequest(receiptNode, request);
|
|
89
105
|
}
|
|
90
106
|
catch (error) {
|
|
@@ -96,7 +112,9 @@ class WaRetryCoordinator {
|
|
|
96
112
|
});
|
|
97
113
|
}
|
|
98
114
|
finally {
|
|
99
|
-
|
|
115
|
+
if (shouldAck) {
|
|
116
|
+
await this.sendRetryAckSafe(receiptNode);
|
|
117
|
+
}
|
|
100
118
|
}
|
|
101
119
|
}
|
|
102
120
|
isRetryReceiptNode(node) {
|
|
@@ -132,7 +150,6 @@ class WaRetryCoordinator {
|
|
|
132
150
|
to: context.from,
|
|
133
151
|
participant: context.participant,
|
|
134
152
|
recipient: context.recipient,
|
|
135
|
-
from: this.getCurrentMeJid() ?? undefined,
|
|
136
153
|
originalMsgId: context.stanzaId,
|
|
137
154
|
retryCount: prepared.retryCount,
|
|
138
155
|
t: prepared.timestamp,
|
|
@@ -203,8 +220,9 @@ class WaRetryCoordinator {
|
|
|
203
220
|
let requesterAddress;
|
|
204
221
|
let requesterNormalizedDeviceJid;
|
|
205
222
|
try {
|
|
206
|
-
|
|
207
|
-
|
|
223
|
+
const requesterParsed = (0, jid_1.parseJidFull)(requesterJid);
|
|
224
|
+
requesterAddress = requesterParsed.address;
|
|
225
|
+
requesterNormalizedDeviceJid = requesterParsed.normalizedJid;
|
|
208
226
|
}
|
|
209
227
|
catch (error) {
|
|
210
228
|
this.logger.info('retry request rejected: invalid requester jid', {
|
|
@@ -280,20 +298,36 @@ class WaRetryCoordinator {
|
|
|
280
298
|
if (!nextState) {
|
|
281
299
|
return;
|
|
282
300
|
}
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
301
|
+
await this.runRetryTaskSerialized(messageId, async () => {
|
|
302
|
+
const current = await this.retryStore.getOutboundMessage(messageId);
|
|
303
|
+
if (!current) {
|
|
304
|
+
return;
|
|
305
|
+
}
|
|
306
|
+
const nowMs = Date.now();
|
|
307
|
+
const expiresAtMs = nowMs + this.retryTtlMs;
|
|
308
|
+
const merged = (0, parse_1.pickRetryStateMax)(current.state, nextState);
|
|
309
|
+
if (merged !== current.state) {
|
|
310
|
+
await this.retryStore.updateOutboundMessageState(messageId, merged, nowMs, expiresAtMs);
|
|
311
|
+
}
|
|
312
|
+
const requesterJid = receiptNode.attrs.participant ?? receiptNode.attrs.from;
|
|
313
|
+
if (!requesterJid) {
|
|
314
|
+
return;
|
|
315
|
+
}
|
|
316
|
+
try {
|
|
317
|
+
await this.retryStore.markOutboundRequesterDelivered(messageId, (0, jid_1.normalizeDeviceJid)(requesterJid), nowMs, expiresAtMs);
|
|
318
|
+
}
|
|
319
|
+
catch (error) {
|
|
320
|
+
this.logger.warn('failed to update outbound requester delivery state', {
|
|
321
|
+
id: messageId,
|
|
322
|
+
requester: requesterJid,
|
|
323
|
+
message: (0, primitives_1.toError)(error).message
|
|
324
|
+
});
|
|
325
|
+
}
|
|
326
|
+
});
|
|
293
327
|
}
|
|
294
328
|
async runRetryTaskSerialized(messageId, task) {
|
|
295
329
|
const previous = this.retryProcessingByMessageId.get(messageId) ?? Promise.resolve();
|
|
296
|
-
const current = previous.then(task
|
|
330
|
+
const current = previous.then(task);
|
|
297
331
|
const tracker = current.then(() => undefined, () => undefined);
|
|
298
332
|
this.retryProcessingByMessageId.set(messageId, tracker);
|
|
299
333
|
try {
|
|
@@ -309,13 +343,13 @@ class WaRetryCoordinator {
|
|
|
309
343
|
async buildRetryKeysSection(identity) {
|
|
310
344
|
const [signedPreKey, preKey] = await Promise.all([
|
|
311
345
|
this.signalStore.getSignedPreKey(),
|
|
312
|
-
this.
|
|
346
|
+
this.preKeyStore.getOrGenSinglePreKey(keygen_1.generatePreKeyPair)
|
|
313
347
|
]);
|
|
314
348
|
if (!signedPreKey) {
|
|
315
349
|
this.logger.warn('retry keys section skipped: signed prekey unavailable');
|
|
316
350
|
return undefined;
|
|
317
351
|
}
|
|
318
|
-
await this.
|
|
352
|
+
await this.preKeyStore.markKeyAsUploaded(preKey.keyId);
|
|
319
353
|
const signedIdentity = this.getCurrentSignedIdentity();
|
|
320
354
|
return {
|
|
321
355
|
identity,
|
|
@@ -334,15 +368,45 @@ class WaRetryCoordinator {
|
|
|
334
368
|
};
|
|
335
369
|
}
|
|
336
370
|
async updateLocalSessionFromRetryRequest(request, requesterJid, requesterAddress, requesterNormalizedDeviceJid) {
|
|
337
|
-
await
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
371
|
+
const [, currentSession] = await Promise.all([
|
|
372
|
+
this.markRetryRequesterSenderKeyAsStale(request, requesterJid, requesterAddress),
|
|
373
|
+
this.sessionStore.getSession(requesterAddress)
|
|
374
|
+
]);
|
|
375
|
+
const regIdMismatch = !!currentSession && request.regId > 0 && currentSession.remote.regId !== request.regId;
|
|
376
|
+
if (regIdMismatch && !request.keyBundle) {
|
|
377
|
+
await this.sessionStore.deleteSession(requesterAddress);
|
|
341
378
|
}
|
|
342
379
|
if (request.keyBundle) {
|
|
343
380
|
if (!request.keyBundle.key || !request.keyBundle.skey.signature) {
|
|
344
381
|
return false;
|
|
345
382
|
}
|
|
383
|
+
if (request.offline) {
|
|
384
|
+
if (!currentSession) {
|
|
385
|
+
this.logger.info('retry request rejected: offline retry missing existing session', {
|
|
386
|
+
id: request.stanzaId,
|
|
387
|
+
originalMsgId: request.originalMsgId,
|
|
388
|
+
requester: requesterJid,
|
|
389
|
+
remoteRetryCount: request.retryCount,
|
|
390
|
+
...getRemoteRetryReasonLogFields(request.retryReason)
|
|
391
|
+
});
|
|
392
|
+
await this.sessionStore.deleteSession(requesterAddress);
|
|
393
|
+
return false;
|
|
394
|
+
}
|
|
395
|
+
if (regIdMismatch) {
|
|
396
|
+
this.logger.info('retry request rejected: offline retry registration id mismatch', {
|
|
397
|
+
id: request.stanzaId,
|
|
398
|
+
originalMsgId: request.originalMsgId,
|
|
399
|
+
requester: requesterJid,
|
|
400
|
+
remoteRetryCount: request.retryCount,
|
|
401
|
+
...getRemoteRetryReasonLogFields(request.retryReason)
|
|
402
|
+
});
|
|
403
|
+
await this.sessionStore.deleteSession(requesterAddress);
|
|
404
|
+
return false;
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
else if (regIdMismatch) {
|
|
408
|
+
await this.sessionStore.deleteSession(requesterAddress);
|
|
409
|
+
}
|
|
346
410
|
await this.signalProtocol.establishOutgoingSession(requesterAddress, {
|
|
347
411
|
regId: request.regId,
|
|
348
412
|
identity: request.keyBundle.identity,
|
|
@@ -356,12 +420,45 @@ class WaRetryCoordinator {
|
|
|
356
420
|
publicKey: request.keyBundle.key.publicKey
|
|
357
421
|
}
|
|
358
422
|
});
|
|
423
|
+
return this.applySessionBaseKeyPolicy(request, requesterJid, requesterAddress, requesterNormalizedDeviceJid);
|
|
424
|
+
}
|
|
425
|
+
const sessionStillExists = currentSession !== null && !regIdMismatch;
|
|
426
|
+
if (sessionStillExists) {
|
|
427
|
+
return this.applySessionBaseKeyPolicy(request, requesterJid, requesterAddress, requesterNormalizedDeviceJid);
|
|
428
|
+
}
|
|
429
|
+
const fetched = await this.fetchMissingPreKeysSession(requesterJid, requesterAddress, requesterNormalizedDeviceJid, request.regId);
|
|
430
|
+
if (!fetched) {
|
|
431
|
+
return false;
|
|
432
|
+
}
|
|
433
|
+
await this.signalProtocol.establishOutgoingSession(requesterAddress, fetched);
|
|
434
|
+
return this.applySessionBaseKeyPolicy(request, requesterJid, requesterAddress, requesterNormalizedDeviceJid);
|
|
435
|
+
}
|
|
436
|
+
async applySessionBaseKeyPolicy(request, requesterJid, requesterAddress, requesterNormalizedDeviceJid) {
|
|
437
|
+
if (request.retryCount < 2) {
|
|
359
438
|
return true;
|
|
360
439
|
}
|
|
361
|
-
const
|
|
362
|
-
|
|
440
|
+
const currentSession = await this.sessionStore.getSession(requesterAddress);
|
|
441
|
+
const sessionBaseKey = currentSession?.aliceBaseKey ?? null;
|
|
442
|
+
if (!sessionBaseKey) {
|
|
363
443
|
return true;
|
|
364
444
|
}
|
|
445
|
+
const expiresAtMs = Date.now() + this.retryTtlMs;
|
|
446
|
+
if (request.retryCount === 2) {
|
|
447
|
+
this.setRetrySessionBaseKey(request.originalMsgId, requesterNormalizedDeviceJid, sessionBaseKey, expiresAtMs);
|
|
448
|
+
return true;
|
|
449
|
+
}
|
|
450
|
+
const saved = this.getRetrySessionBaseKey(request.originalMsgId, requesterNormalizedDeviceJid);
|
|
451
|
+
if (!saved || !(0, bytes_1.uint8Equal)(saved.baseKey, sessionBaseKey)) {
|
|
452
|
+
return true;
|
|
453
|
+
}
|
|
454
|
+
await this.sessionStore.deleteSession(requesterAddress);
|
|
455
|
+
this.logger.info('retry request forcing session refresh due to repeated base key', {
|
|
456
|
+
id: request.stanzaId,
|
|
457
|
+
originalMsgId: request.originalMsgId,
|
|
458
|
+
requester: requesterJid,
|
|
459
|
+
remoteRetryCount: request.retryCount,
|
|
460
|
+
...getRemoteRetryReasonLogFields(request.retryReason)
|
|
461
|
+
});
|
|
365
462
|
const fetched = await this.fetchMissingPreKeysSession(requesterJid, requesterAddress, requesterNormalizedDeviceJid, request.regId);
|
|
366
463
|
if (!fetched) {
|
|
367
464
|
return false;
|
|
@@ -434,13 +531,35 @@ class WaRetryCoordinator {
|
|
|
434
531
|
if (outbound.state === 'ineligible') {
|
|
435
532
|
return { authorized: false, reason: `state_${outbound.state}` };
|
|
436
533
|
}
|
|
534
|
+
let requesterStatus = null;
|
|
535
|
+
try {
|
|
536
|
+
requesterStatus = await this.retryStore.getOutboundRequesterStatus(outbound.messageId, requesterNormalizedDeviceJid);
|
|
537
|
+
}
|
|
538
|
+
catch (error) {
|
|
539
|
+
this.logger.warn('failed to resolve outbound requester status from retry store', {
|
|
540
|
+
id: request.stanzaId,
|
|
541
|
+
originalMsgId: request.originalMsgId,
|
|
542
|
+
requester: requesterJid,
|
|
543
|
+
message: (0, primitives_1.toError)(error).message
|
|
544
|
+
});
|
|
545
|
+
}
|
|
546
|
+
if (requesterStatus) {
|
|
547
|
+
if (!requesterStatus.eligible) {
|
|
548
|
+
return { authorized: false, reason: 'requester_device_not_eligible' };
|
|
549
|
+
}
|
|
550
|
+
if (requesterStatus.delivered) {
|
|
551
|
+
return { authorized: false, reason: 'requester_already_delivered' };
|
|
552
|
+
}
|
|
553
|
+
}
|
|
437
554
|
const isGroupOutbound = (0, jid_1.isGroupOrBroadcastJid)(outbound.toJid);
|
|
438
555
|
if (!isGroupOutbound && (outbound.state === 'read' || outbound.state === 'played')) {
|
|
439
556
|
return { authorized: false, reason: `state_${outbound.state}` };
|
|
440
557
|
}
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
558
|
+
if (!requesterStatus) {
|
|
559
|
+
const requesterAuthorized = await this.isRequesterAuthorizedDevice(requesterJid, requesterAddress, requesterNormalizedDeviceJid);
|
|
560
|
+
if (!requesterAuthorized) {
|
|
561
|
+
return { authorized: false, reason: 'requester_device_not_authorized' };
|
|
562
|
+
}
|
|
444
563
|
}
|
|
445
564
|
return { authorized: true };
|
|
446
565
|
}
|
|
@@ -498,7 +617,11 @@ class WaRetryCoordinator {
|
|
|
498
617
|
return;
|
|
499
618
|
}
|
|
500
619
|
try {
|
|
501
|
-
await this.sendNode((0,
|
|
620
|
+
await this.sendNode((0, global_1.buildAckNode)({
|
|
621
|
+
kind: 'receipt',
|
|
622
|
+
node: receiptNode,
|
|
623
|
+
retryType: true
|
|
624
|
+
}));
|
|
502
625
|
}
|
|
503
626
|
catch (error) {
|
|
504
627
|
this.logger.warn('failed to send retry ack', {
|
|
@@ -514,6 +637,7 @@ class WaRetryCoordinator {
|
|
|
514
637
|
return;
|
|
515
638
|
}
|
|
516
639
|
this.nextRetryCleanupAtMs = nowMs + RETRY_CLEANUP_INTERVAL_MS;
|
|
640
|
+
this.cleanupRetrySessionBaseKeys(nowMs);
|
|
517
641
|
try {
|
|
518
642
|
await this.retryStore.cleanupExpired(nowMs);
|
|
519
643
|
}
|
|
@@ -523,5 +647,35 @@ class WaRetryCoordinator {
|
|
|
523
647
|
});
|
|
524
648
|
}
|
|
525
649
|
}
|
|
650
|
+
retrySessionBaseKeyMapKey(originalMsgId, requesterNormalizedDeviceJid) {
|
|
651
|
+
return `${originalMsgId}|${requesterNormalizedDeviceJid}`;
|
|
652
|
+
}
|
|
653
|
+
setRetrySessionBaseKey(originalMsgId, requesterNormalizedDeviceJid, baseKey, expiresAtMs) {
|
|
654
|
+
const key = this.retrySessionBaseKeyMapKey(originalMsgId, requesterNormalizedDeviceJid);
|
|
655
|
+
(0, collections_1.setBoundedMapEntry)(this.retrySessionBaseKeys, key, {
|
|
656
|
+
baseKey: Uint8Array.from(baseKey),
|
|
657
|
+
expiresAtMs
|
|
658
|
+
}, RETRY_SESSION_BASE_KEY_CACHE_MAX_ENTRIES);
|
|
659
|
+
}
|
|
660
|
+
getRetrySessionBaseKey(originalMsgId, requesterNormalizedDeviceJid) {
|
|
661
|
+
const key = this.retrySessionBaseKeyMapKey(originalMsgId, requesterNormalizedDeviceJid);
|
|
662
|
+
const entry = this.retrySessionBaseKeys.get(key);
|
|
663
|
+
if (!entry) {
|
|
664
|
+
return null;
|
|
665
|
+
}
|
|
666
|
+
if (entry.expiresAtMs <= Date.now()) {
|
|
667
|
+
this.retrySessionBaseKeys.delete(key);
|
|
668
|
+
return null;
|
|
669
|
+
}
|
|
670
|
+
return entry;
|
|
671
|
+
}
|
|
672
|
+
cleanupRetrySessionBaseKeys(nowMs) {
|
|
673
|
+
for (const [key, entry] of this.retrySessionBaseKeys) {
|
|
674
|
+
if (entry.expiresAtMs > nowMs) {
|
|
675
|
+
continue;
|
|
676
|
+
}
|
|
677
|
+
this.retrySessionBaseKeys.delete(key);
|
|
678
|
+
}
|
|
679
|
+
}
|
|
526
680
|
}
|
|
527
681
|
exports.WaRetryCoordinator = WaRetryCoordinator;
|
|
@@ -19,7 +19,7 @@ function createStreamControlHandler(options) {
|
|
|
19
19
|
const restartBackendAfterStreamControl = async (reason) => {
|
|
20
20
|
logger.info('restarting backend after stream control', { reason });
|
|
21
21
|
try {
|
|
22
|
-
await connect();
|
|
22
|
+
await connect(constants_1.WA_CONNECTION_REASONS.RECONNECTED);
|
|
23
23
|
}
|
|
24
24
|
catch (error) {
|
|
25
25
|
logger.warn('failed to restart backend after stream control', {
|
|
@@ -46,29 +46,36 @@ function createStreamControlHandler(options) {
|
|
|
46
46
|
});
|
|
47
47
|
}
|
|
48
48
|
};
|
|
49
|
+
const stopCommsImmediately = () => {
|
|
50
|
+
void getComms()?.stopComms();
|
|
51
|
+
};
|
|
49
52
|
const forceLoginDueToStreamError = async (code) => {
|
|
50
|
-
|
|
53
|
+
const reason = constants_1.WA_DISCONNECT_REASONS.STREAM_ERROR_FORCE_LOGIN;
|
|
54
|
+
stopCommsImmediately();
|
|
55
|
+
await runStreamControlLifecycle(reason, async () => {
|
|
51
56
|
logger.warn('received forced login stream error; starting login lifecycle', {
|
|
52
57
|
code
|
|
53
58
|
});
|
|
54
|
-
await disconnect();
|
|
59
|
+
await disconnect(reason, true, code);
|
|
55
60
|
await clearStoredCredentials();
|
|
56
|
-
await restartBackendAfterStreamControl(
|
|
61
|
+
await restartBackendAfterStreamControl(reason);
|
|
57
62
|
});
|
|
58
63
|
};
|
|
59
|
-
const disconnectDueToStreamError = async (reason) => {
|
|
64
|
+
const disconnectDueToStreamError = async (reason, code) => {
|
|
65
|
+
stopCommsImmediately();
|
|
60
66
|
await runStreamControlLifecycle(reason, async () => {
|
|
61
67
|
logger.warn('disconnecting due to stream control node', { reason });
|
|
62
|
-
await disconnect();
|
|
68
|
+
await disconnect(reason, false, code);
|
|
63
69
|
});
|
|
64
70
|
};
|
|
65
|
-
const logoutDueToStreamError = async (reason, shouldRestartBackend) => {
|
|
71
|
+
const logoutDueToStreamError = async (reason, code, shouldRestartBackend) => {
|
|
72
|
+
stopCommsImmediately();
|
|
66
73
|
await runStreamControlLifecycle(reason, async () => {
|
|
67
74
|
logger.warn('logging out due to stream control node', {
|
|
68
75
|
reason,
|
|
69
76
|
shouldRestartBackend
|
|
70
77
|
});
|
|
71
|
-
await disconnect();
|
|
78
|
+
await disconnect(reason, true, code);
|
|
72
79
|
await clearStoredCredentials();
|
|
73
80
|
if (shouldRestartBackend) {
|
|
74
81
|
await restartBackendAfterStreamControl(reason);
|
|
@@ -89,7 +96,7 @@ function createStreamControlHandler(options) {
|
|
|
89
96
|
return;
|
|
90
97
|
}
|
|
91
98
|
if (result.code === constants_1.WA_STREAM_SIGNALING.FORCE_LOGOUT_CODE) {
|
|
92
|
-
await logoutDueToStreamError(
|
|
99
|
+
await logoutDueToStreamError(constants_1.WA_DISCONNECT_REASONS.STREAM_ERROR_FORCE_LOGOUT, result.code, true);
|
|
93
100
|
return;
|
|
94
101
|
}
|
|
95
102
|
}
|
|
@@ -97,11 +104,11 @@ function createStreamControlHandler(options) {
|
|
|
97
104
|
return;
|
|
98
105
|
case 'stream_error_replaced':
|
|
99
106
|
logger.warn('received stream:error replaced, stopping client');
|
|
100
|
-
await disconnectDueToStreamError(constants_1.WA_DISCONNECT_REASONS.STREAM_ERROR_REPLACED);
|
|
107
|
+
await disconnectDueToStreamError(constants_1.WA_DISCONNECT_REASONS.STREAM_ERROR_REPLACED, null);
|
|
101
108
|
return;
|
|
102
109
|
case 'stream_error_device_removed':
|
|
103
110
|
logger.warn('received stream:error device removed, logging out');
|
|
104
|
-
await logoutDueToStreamError(constants_1.WA_DISCONNECT_REASONS.STREAM_ERROR_DEVICE_REMOVED, false);
|
|
111
|
+
await logoutDueToStreamError(constants_1.WA_DISCONNECT_REASONS.STREAM_ERROR_DEVICE_REMOVED, null, false);
|
|
105
112
|
return;
|
|
106
113
|
case 'stream_error_ack':
|
|
107
114
|
logger.warn('received stream:error ack', { id: result.id });
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.WaTrustedContactTokenCoordinator = void 0;
|
|
4
|
+
const cs_token_1 = require("../tokens/cs-token");
|
|
5
|
+
const tc_token_1 = require("../tokens/tc-token");
|
|
6
|
+
const PromiseDedup_1 = require("../../infra/perf/PromiseDedup");
|
|
7
|
+
const privacy_token_1 = require("../../protocol/privacy-token");
|
|
8
|
+
const privacy_token_2 = require("../../transport/node/builders/privacy-token");
|
|
9
|
+
const primitives_1 = require("../../util/primitives");
|
|
10
|
+
const NCT_SALT_SENTINEL_JID = '__nct_salt__';
|
|
11
|
+
class WaTrustedContactTokenCoordinator {
|
|
12
|
+
constructor(options) {
|
|
13
|
+
this.logger = options.logger;
|
|
14
|
+
this.store = options.store;
|
|
15
|
+
this.runtime = options.runtime;
|
|
16
|
+
const maxDurationS = options.maxDurationS ?? privacy_token_1.WA_TC_TOKEN_DEFAULTS.MAX_DURATION_S;
|
|
17
|
+
this.baseConfig = {
|
|
18
|
+
durationS: (0, tc_token_1.clampDuration)(options.durationS ?? privacy_token_1.WA_TC_TOKEN_DEFAULTS.DURATION_S, maxDurationS),
|
|
19
|
+
numBuckets: options.numBuckets ?? privacy_token_1.WA_TC_TOKEN_DEFAULTS.NUM_BUCKETS,
|
|
20
|
+
senderDurationS: (0, tc_token_1.clampDuration)(options.senderDurationS ?? privacy_token_1.WA_TC_TOKEN_DEFAULTS.SENDER_DURATION_S, maxDurationS),
|
|
21
|
+
senderNumBuckets: options.senderNumBuckets ?? privacy_token_1.WA_TC_TOKEN_DEFAULTS.SENDER_NUM_BUCKETS,
|
|
22
|
+
maxDurationS
|
|
23
|
+
};
|
|
24
|
+
this.getConfigOverrides = options.getConfigOverrides;
|
|
25
|
+
this.csTokenGenerator = new cs_token_1.CsTokenGenerator();
|
|
26
|
+
this.senderTokenDedup = new PromiseDedup_1.PromiseDedup();
|
|
27
|
+
this.cachedNctSalt = null;
|
|
28
|
+
this.nctSaltHydrated = false;
|
|
29
|
+
}
|
|
30
|
+
resolveConfig() {
|
|
31
|
+
const overrides = this.getConfigOverrides?.();
|
|
32
|
+
if (!overrides) {
|
|
33
|
+
return this.baseConfig;
|
|
34
|
+
}
|
|
35
|
+
const maxDurationS = overrides.maxDurationS ?? this.baseConfig.maxDurationS;
|
|
36
|
+
return {
|
|
37
|
+
durationS: (0, tc_token_1.clampDuration)(overrides.durationS ?? this.baseConfig.durationS, maxDurationS),
|
|
38
|
+
numBuckets: overrides.numBuckets ?? this.baseConfig.numBuckets,
|
|
39
|
+
senderDurationS: (0, tc_token_1.clampDuration)(overrides.senderDurationS ?? this.baseConfig.senderDurationS, maxDurationS),
|
|
40
|
+
senderNumBuckets: overrides.senderNumBuckets ?? this.baseConfig.senderNumBuckets,
|
|
41
|
+
maxDurationS
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
async resolveTokenForMessage(recipientJid) {
|
|
45
|
+
const record = await this.store.getByJid(recipientJid);
|
|
46
|
+
const nowS = Math.floor(Date.now() / 1000);
|
|
47
|
+
const config = this.resolveConfig();
|
|
48
|
+
if (record?.tcToken &&
|
|
49
|
+
record.tcTokenTimestamp !== undefined &&
|
|
50
|
+
!(0, tc_token_1.isTokenExpired)(record.tcTokenTimestamp, nowS, config.durationS, config.numBuckets)) {
|
|
51
|
+
return (0, privacy_token_2.buildTcTokenMessageNode)(record.tcToken);
|
|
52
|
+
}
|
|
53
|
+
const nctSalt = await this.getNctSalt();
|
|
54
|
+
if (!nctSalt) {
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
const meLid = this.runtime.getCurrentMeLid();
|
|
58
|
+
if (!meLid) {
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
const hash = await this.csTokenGenerator.generate(nctSalt, meLid);
|
|
62
|
+
return (0, privacy_token_2.buildCsTokenMessageNode)(hash);
|
|
63
|
+
}
|
|
64
|
+
async handleIncomingToken(fromJid, tokens) {
|
|
65
|
+
const nowMs = Date.now();
|
|
66
|
+
for (let i = 0; i < tokens.length; i += 1) {
|
|
67
|
+
const token = tokens[i];
|
|
68
|
+
if (token.type !== privacy_token_1.WA_PRIVACY_TOKEN_TYPES.TRUSTED_CONTACT) {
|
|
69
|
+
this.logger.warn('ignoring unknown privacy token type', { type: token.type });
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
await this.store.upsert({
|
|
73
|
+
jid: fromJid,
|
|
74
|
+
tcToken: token.tokenBytes,
|
|
75
|
+
tcTokenTimestamp: token.timestampS,
|
|
76
|
+
updatedAtMs: nowMs
|
|
77
|
+
});
|
|
78
|
+
this.runtime.emitEvent('privacy_token_update', {
|
|
79
|
+
jid: fromJid,
|
|
80
|
+
timestampS: token.timestampS,
|
|
81
|
+
type: token.type,
|
|
82
|
+
source: 'notification'
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
async maybeIssueSenderToken(recipientJid) {
|
|
87
|
+
return this.senderTokenDedup.run(recipientJid, async () => {
|
|
88
|
+
const nowS = Math.floor(Date.now() / 1000);
|
|
89
|
+
const record = await this.store.getByJid(recipientJid);
|
|
90
|
+
const senderTimestampS = record?.tcTokenSenderTimestamp;
|
|
91
|
+
const config = this.resolveConfig();
|
|
92
|
+
if (senderTimestampS !== undefined && senderTimestampS > 0) {
|
|
93
|
+
if (!(0, tc_token_1.shouldSendNewToken)(senderTimestampS, nowS, config.senderDurationS)) {
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
await this.issuePrivacyToken(recipientJid, nowS);
|
|
98
|
+
await this.store.upsert({
|
|
99
|
+
jid: recipientJid,
|
|
100
|
+
tcTokenSenderTimestamp: nowS,
|
|
101
|
+
updatedAtMs: Date.now()
|
|
102
|
+
});
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
async reissueOnIdentityChange(jid) {
|
|
106
|
+
const record = await this.store.getByJid(jid);
|
|
107
|
+
if (!record?.tcTokenSenderTimestamp) {
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
const nowS = Math.floor(Date.now() / 1000);
|
|
111
|
+
const config = this.resolveConfig();
|
|
112
|
+
if ((0, tc_token_1.isTokenExpired)(record.tcTokenSenderTimestamp, nowS, config.senderDurationS, config.senderNumBuckets)) {
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
try {
|
|
116
|
+
await this.issuePrivacyToken(jid, record.tcTokenSenderTimestamp);
|
|
117
|
+
}
|
|
118
|
+
catch (error) {
|
|
119
|
+
this.logger.warn('send-tc-token-device-identity-change-failed', {
|
|
120
|
+
jid,
|
|
121
|
+
message: (0, primitives_1.toError)(error).message
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
async hydrateFromHistorySync(conversations) {
|
|
126
|
+
const nowMs = Date.now();
|
|
127
|
+
const records = [];
|
|
128
|
+
for (let i = 0; i < conversations.length; i += 1) {
|
|
129
|
+
const conv = conversations[i];
|
|
130
|
+
if (!conv.tcToken && !conv.tcTokenTimestamp && !conv.tcTokenSenderTimestamp) {
|
|
131
|
+
continue;
|
|
132
|
+
}
|
|
133
|
+
records[records.length] = {
|
|
134
|
+
jid: conv.jid,
|
|
135
|
+
tcToken: conv.tcToken ?? undefined,
|
|
136
|
+
tcTokenTimestamp: conv.tcTokenTimestamp ?? undefined,
|
|
137
|
+
tcTokenSenderTimestamp: conv.tcTokenSenderTimestamp ?? undefined,
|
|
138
|
+
updatedAtMs: nowMs
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
if (records.length > 0) {
|
|
142
|
+
await this.store.upsertBatch(records);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
async handleNctSaltSync(salt) {
|
|
146
|
+
if (salt) {
|
|
147
|
+
await this.store.upsert({
|
|
148
|
+
jid: NCT_SALT_SENTINEL_JID,
|
|
149
|
+
nctSalt: salt,
|
|
150
|
+
updatedAtMs: Date.now()
|
|
151
|
+
});
|
|
152
|
+
this.cachedNctSalt = salt;
|
|
153
|
+
}
|
|
154
|
+
else {
|
|
155
|
+
await this.store.deleteByJid(NCT_SALT_SENTINEL_JID);
|
|
156
|
+
this.cachedNctSalt = null;
|
|
157
|
+
}
|
|
158
|
+
this.nctSaltHydrated = true;
|
|
159
|
+
this.csTokenGenerator.invalidate();
|
|
160
|
+
}
|
|
161
|
+
async hydrateNctSaltFromHistorySync(salt) {
|
|
162
|
+
await this.store.upsert({
|
|
163
|
+
jid: NCT_SALT_SENTINEL_JID,
|
|
164
|
+
nctSalt: salt,
|
|
165
|
+
updatedAtMs: Date.now()
|
|
166
|
+
});
|
|
167
|
+
this.cachedNctSalt = salt;
|
|
168
|
+
this.nctSaltHydrated = true;
|
|
169
|
+
}
|
|
170
|
+
async getNctSalt() {
|
|
171
|
+
if (this.nctSaltHydrated) {
|
|
172
|
+
return this.cachedNctSalt;
|
|
173
|
+
}
|
|
174
|
+
const record = await this.store.getByJid(NCT_SALT_SENTINEL_JID);
|
|
175
|
+
this.cachedNctSalt = record?.nctSalt ?? null;
|
|
176
|
+
this.nctSaltHydrated = true;
|
|
177
|
+
return this.cachedNctSalt;
|
|
178
|
+
}
|
|
179
|
+
async issuePrivacyToken(jid, timestampS) {
|
|
180
|
+
const node = (0, privacy_token_2.buildPrivacyTokenIqNode)({ jid, timestampS });
|
|
181
|
+
await this.runtime.queryWithContext('issue-privacy-token', node);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
exports.WaTrustedContactTokenCoordinator = WaTrustedContactTokenCoordinator;
|