zapo-js 0.1.2 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +12 -4
- package/dist/appstate/WaAppStateCrypto.js +1 -1
- package/dist/appstate/WaAppStateSyncClient.js +138 -93
- package/dist/appstate/{store/sqlite.js → encoding.js} +13 -8
- package/dist/appstate/index.js +8 -6
- package/dist/appstate/utils.js +0 -5
- package/dist/auth/WaAuthClient.js +36 -47
- package/dist/auth/flow/WaAuthCredentialsFlow.js +7 -7
- package/dist/auth/index.js +1 -6
- package/dist/auth/pairing/WaPairingCodeCrypto.js +6 -4
- package/dist/auth/pairing/WaPairingFlow.js +13 -3
- package/dist/client/WaClient.js +225 -101
- package/dist/client/WaClientFactory.js +294 -44
- package/dist/client/connection/WaConnectionManager.js +19 -10
- package/dist/client/coordinators/WaBusinessCoordinator.js +241 -0
- package/dist/client/coordinators/WaGroupCoordinator.js +11 -7
- package/dist/client/coordinators/WaIncomingNodeCoordinator.js +1 -0
- package/dist/client/coordinators/WaMessageDispatchCoordinator.js +292 -99
- package/dist/client/coordinators/WaPassiveTasksCoordinator.js +74 -31
- package/dist/client/coordinators/WaPrivacyCoordinator.js +134 -0
- package/dist/client/coordinators/WaProfileCoordinator.js +212 -0
- package/dist/client/coordinators/WaRetryCoordinator.js +179 -27
- package/dist/client/coordinators/WaStreamControlCoordinator.js +18 -11
- package/dist/client/coordinators/WaTrustedContactTokenCoordinator.js +166 -0
- package/dist/client/dirty.js +40 -20
- 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 +39 -0
- package/dist/client/history-sync.js +50 -9
- package/dist/client/incoming.js +37 -7
- package/dist/client/mailbox.js +24 -23
- package/dist/client/messages.js +107 -31
- 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 +2 -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 +22 -0
- package/dist/crypto/curves/X25519.js +25 -6
- 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 +1 -1
- package/dist/esm/appstate/WaAppStateSyncClient.js +138 -93
- package/dist/esm/appstate/{store/sqlite.js → encoding.js} +13 -8
- package/dist/esm/appstate/index.js +2 -2
- package/dist/esm/appstate/utils.js +2 -5
- package/dist/esm/auth/WaAuthClient.js +36 -47
- package/dist/esm/auth/flow/WaAuthCredentialsFlow.js +7 -7
- package/dist/esm/auth/index.js +0 -2
- package/dist/esm/auth/pairing/WaPairingCodeCrypto.js +6 -4
- package/dist/esm/auth/pairing/WaPairingFlow.js +14 -4
- package/dist/esm/client/WaClient.js +225 -101
- package/dist/esm/client/WaClientFactory.js +295 -45
- package/dist/esm/client/connection/WaConnectionManager.js +19 -10
- package/dist/esm/client/coordinators/WaBusinessCoordinator.js +238 -0
- package/dist/esm/client/coordinators/WaGroupCoordinator.js +11 -7
- package/dist/esm/client/coordinators/WaIncomingNodeCoordinator.js +1 -0
- package/dist/esm/client/coordinators/WaMessageDispatchCoordinator.js +295 -102
- package/dist/esm/client/coordinators/WaPassiveTasksCoordinator.js +74 -31
- package/dist/esm/client/coordinators/WaPrivacyCoordinator.js +131 -0
- package/dist/esm/client/coordinators/WaProfileCoordinator.js +209 -0
- package/dist/esm/client/coordinators/WaRetryCoordinator.js +181 -29
- package/dist/esm/client/coordinators/WaStreamControlCoordinator.js +19 -12
- package/dist/esm/client/coordinators/WaTrustedContactTokenCoordinator.js +162 -0
- package/dist/esm/client/dirty.js +40 -20
- 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 +36 -0
- package/dist/esm/client/history-sync.js +50 -9
- package/dist/esm/client/incoming.js +38 -8
- package/dist/esm/client/mailbox.js +24 -23
- package/dist/esm/client/messages.js +108 -32
- 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 +2 -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 +22 -1
- package/dist/esm/crypto/curves/X25519.js +25 -6
- 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 +77 -0
- package/dist/esm/media/WaMediaCrypto.js +95 -13
- package/dist/esm/media/WaMediaTransferClient.js +39 -47
- package/dist/esm/media/constants.js +2 -1
- package/dist/esm/message/WaMessageClient.js +26 -19
- package/dist/esm/message/content.js +195 -9
- package/dist/esm/message/icdc.js +76 -0
- package/dist/esm/message/incoming.js +24 -12
- package/dist/esm/message/phash.js +3 -1
- package/dist/esm/message/reporting-token.js +14 -27
- package/dist/esm/protocol/appstate.js +9 -40
- package/dist/esm/protocol/browser.js +10 -18
- package/dist/esm/protocol/constants.js +5 -3
- package/dist/esm/protocol/defaults.js +6 -0
- package/dist/esm/protocol/index.js +1 -2
- package/dist/esm/protocol/jid.js +105 -36
- package/dist/esm/protocol/message.js +61 -1
- package/dist/esm/protocol/nodes.js +2 -0
- package/dist/esm/protocol/notification.js +3 -1
- package/dist/esm/protocol/privacy-token.js +17 -0
- package/dist/esm/protocol/privacy.js +55 -0
- package/dist/esm/protocol/stream.js +26 -1
- package/dist/esm/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/replay.js +11 -7
- package/dist/esm/retry/tracker.js +50 -12
- package/dist/esm/signal/api/SignalDeviceSyncApi.js +49 -32
- package/dist/esm/signal/api/SignalDigestSyncApi.js +13 -9
- package/dist/esm/signal/api/SignalIdentitySyncApi.js +26 -11
- package/dist/esm/signal/api/SignalMissingPreKeysSyncApi.js +18 -7
- package/dist/esm/signal/api/SignalRotateKeyApi.js +4 -2
- package/dist/esm/signal/api/SignalSessionSyncApi.js +16 -7
- 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 +12 -6
- package/dist/esm/signal/{store/sqlite.js → encoding.js} +78 -24
- package/dist/esm/signal/group/SenderKeyCodec.js +3 -2
- package/dist/esm/signal/group/SenderKeyManager.js +125 -106
- package/dist/esm/signal/index.js +1 -0
- package/dist/esm/signal/registration/keygen.js +6 -2
- package/dist/esm/signal/registration/utils.js +1 -0
- package/dist/esm/signal/session/SignalProtocol.js +150 -74
- package/dist/esm/signal/session/resolver.js +137 -102
- package/dist/esm/store/contracts/privacy-token.store.js +1 -0
- package/dist/esm/store/createStore.js +101 -187
- package/dist/esm/store/index.js +1 -10
- package/dist/esm/store/locks/appstate.lock.js +26 -0
- package/dist/esm/store/locks/auth.lock.js +15 -0
- package/dist/esm/store/locks/contact.lock.js +20 -0
- package/dist/esm/store/locks/device-list.lock.js +20 -0
- package/dist/esm/store/locks/message.lock.js +21 -0
- package/dist/esm/store/locks/participants.lock.js +20 -0
- package/dist/esm/store/locks/privacy-token.lock.js +18 -0
- package/dist/esm/store/locks/retry.lock.js +29 -0
- package/dist/esm/store/locks/sender-key.lock.js +52 -0
- package/dist/esm/store/locks/signal.lock.js +63 -0
- package/dist/esm/store/locks/thread.lock.js +21 -0
- package/dist/esm/store/noop.store.js +1 -1
- package/dist/esm/store/providers/memory/appstate.store.js +22 -24
- package/dist/esm/store/providers/memory/device-list.store.js +10 -5
- package/dist/esm/store/providers/memory/privacy-token.store.js +43 -0
- package/dist/esm/store/providers/memory/retry.store.js +77 -2
- package/dist/esm/store/providers/memory/sender-key.store.js +6 -1
- package/dist/esm/store/providers/memory/signal.store.js +36 -19
- package/dist/esm/transport/WaComms.js +3 -1
- package/dist/esm/transport/WaWebSocket.js +0 -6
- 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/node/WaNodeOrchestrator.js +25 -19
- package/dist/esm/transport/node/builders/business.js +129 -0
- package/dist/esm/transport/node/builders/global.js +370 -0
- package/dist/esm/transport/node/builders/index.js +5 -2
- package/dist/esm/transport/node/builders/message.js +63 -239
- package/dist/esm/transport/node/builders/pairing.js +0 -24
- package/dist/esm/transport/node/builders/privacy-token.js +41 -0
- package/dist/esm/transport/node/builders/privacy.js +48 -0
- package/dist/esm/transport/node/builders/profile.js +70 -0
- package/dist/esm/transport/node/builders/retry.js +10 -22
- package/dist/esm/transport/node/builders/usync.js +6 -2
- package/dist/esm/transport/node/helpers.js +19 -1
- 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 +10 -10
- package/dist/esm/transport/noise/WaNoiseCert.js +3 -3
- package/dist/esm/transport/noise/WaNoiseSession.js +64 -23
- 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 +81 -0
- package/dist/media/WaMediaCrypto.js +94 -12
- package/dist/media/WaMediaTransferClient.js +39 -47
- package/dist/media/constants.js +2 -1
- package/dist/message/WaMessageClient.js +26 -19
- package/dist/message/content.js +198 -9
- package/dist/message/icdc.js +81 -0
- package/dist/message/incoming.js +24 -12
- package/dist/message/phash.js +3 -1
- package/dist/message/reporting-token.js +14 -28
- package/dist/protocol/appstate.js +10 -41
- package/dist/protocol/browser.js +10 -18
- package/dist/protocol/constants.js +21 -2
- package/dist/protocol/defaults.js +6 -0
- package/dist/protocol/index.js +8 -5
- package/dist/protocol/jid.js +111 -36
- package/dist/protocol/message.js +62 -2
- package/dist/protocol/nodes.js +2 -0
- package/dist/protocol/notification.js +3 -1
- package/dist/protocol/privacy-token.js +20 -0
- package/dist/protocol/privacy.js +58 -0
- package/dist/protocol/stream.js +27 -2
- package/dist/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/replay.js +10 -6
- package/dist/retry/tracker.js +50 -12
- package/dist/signal/api/SignalDeviceSyncApi.js +48 -31
- package/dist/signal/api/SignalDigestSyncApi.js +13 -9
- package/dist/signal/api/SignalIdentitySyncApi.js +25 -10
- 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 +11 -5
- package/dist/signal/{store/sqlite.js → encoding.js} +79 -25
- package/dist/signal/group/SenderKeyCodec.js +4 -3
- package/dist/signal/group/SenderKeyManager.js +125 -106
- package/dist/signal/index.js +13 -1
- package/dist/signal/registration/keygen.js +6 -2
- package/dist/signal/registration/utils.js +1 -0
- package/dist/signal/session/SignalProtocol.js +150 -74
- package/dist/signal/session/resolver.js +135 -100
- package/dist/store/contracts/privacy-token.store.js +2 -0
- package/dist/store/createStore.js +101 -187
- package/dist/store/index.js +15 -33
- package/dist/store/locks/appstate.lock.js +29 -0
- package/dist/store/locks/auth.lock.js +18 -0
- package/dist/store/locks/contact.lock.js +23 -0
- package/dist/store/locks/device-list.lock.js +23 -0
- package/dist/store/locks/message.lock.js +24 -0
- package/dist/store/locks/participants.lock.js +23 -0
- package/dist/store/locks/privacy-token.lock.js +21 -0
- package/dist/store/locks/retry.lock.js +32 -0
- package/dist/store/locks/sender-key.lock.js +55 -0
- package/dist/store/locks/signal.lock.js +66 -0
- package/dist/store/locks/thread.lock.js +24 -0
- package/dist/store/noop.store.js +1 -1
- package/dist/store/providers/memory/appstate.store.js +22 -24
- package/dist/store/providers/memory/device-list.store.js +10 -5
- package/dist/store/providers/memory/privacy-token.store.js +47 -0
- package/dist/store/providers/memory/retry.store.js +77 -2
- package/dist/store/providers/memory/sender-key.store.js +6 -1
- package/dist/store/providers/memory/signal.store.js +36 -19
- package/dist/transport/WaComms.js +3 -1
- package/dist/transport/WaWebSocket.js +0 -6
- 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/node/WaNodeOrchestrator.js +24 -18
- package/dist/transport/node/builders/business.js +137 -0
- package/dist/transport/node/builders/global.js +375 -0
- package/dist/transport/node/builders/index.js +18 -9
- package/dist/transport/node/builders/message.js +64 -245
- package/dist/transport/node/builders/pairing.js +0 -26
- package/dist/transport/node/builders/privacy-token.js +46 -0
- package/dist/transport/node/builders/privacy.js +55 -0
- package/dist/transport/node/builders/profile.js +78 -0
- package/dist/transport/node/builders/retry.js +9 -21
- package/dist/transport/node/builders/usync.js +6 -2
- package/dist/transport/node/helpers.js +20 -1
- package/dist/transport/node/usync.js +2 -32
- package/dist/transport/node/xml.js +35 -14
- package/dist/transport/noise/WaClientPayload.js +13 -13
- package/dist/transport/noise/WaNoiseCert.js +2 -2
- package/dist/transport/noise/WaNoiseSession.js +64 -23
- package/dist/transport/noise/WaNoiseSocket.js +8 -4
- package/dist/transport/stream/parse.js +7 -3
- package/dist/types/appstate/encoding.d.ts +7 -0
- package/dist/types/appstate/index.d.ts +3 -3
- package/dist/types/appstate/utils.d.ts +0 -2
- package/dist/types/auth/flow/WaAuthCredentialsFlow.d.ts +1 -1
- package/dist/types/auth/index.d.ts +0 -2
- package/dist/types/auth/types.d.ts +1 -0
- package/dist/types/client/WaClient.d.ts +27 -12
- package/dist/types/client/WaClientFactory.d.ts +12 -4
- package/dist/types/client/connection/WaConnectionManager.d.ts +2 -0
- package/dist/types/client/coordinators/WaBusinessCoordinator.d.ts +57 -0
- package/dist/types/client/coordinators/WaIncomingNodeCoordinator.d.ts +3 -1
- package/dist/types/client/coordinators/WaMessageDispatchCoordinator.d.ts +14 -0
- package/dist/types/client/coordinators/WaPassiveTasksCoordinator.d.ts +4 -0
- package/dist/types/client/coordinators/WaPrivacyCoordinator.d.ts +26 -0
- package/dist/types/client/coordinators/WaProfileCoordinator.d.ts +36 -0
- package/dist/types/client/coordinators/WaRetryCoordinator.d.ts +6 -0
- package/dist/types/client/coordinators/WaStreamControlCoordinator.d.ts +3 -2
- package/dist/types/client/coordinators/WaTrustedContactTokenCoordinator.d.ts +45 -0
- package/dist/types/client/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/history-sync.d.ts +9 -6
- package/dist/types/client/incoming.d.ts +3 -1
- package/dist/types/client/index.d.ts +1 -1
- package/dist/types/client/mailbox.d.ts +3 -5
- package/dist/types/client/messages.d.ts +1 -2
- package/dist/types/client/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 +51 -3
- package/dist/types/crypto/core/index.d.ts +2 -2
- package/dist/types/crypto/core/nonce.d.ts +2 -0
- package/dist/types/crypto/core/primitives.d.ts +0 -1
- package/dist/types/crypto/core/random.d.ts +1 -0
- package/dist/types/crypto/index.d.ts +1 -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 +5 -3
- 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 +10 -0
- package/dist/types/media/WaMediaCrypto.d.ts +3 -2
- package/dist/types/media/WaMediaTransferClient.d.ts +3 -12
- package/dist/types/media/constants.d.ts +1 -1
- package/dist/types/media/index.d.ts +1 -1
- package/dist/types/media/types.d.ts +10 -2
- package/dist/types/message/content.d.ts +8 -0
- 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 +45 -6
- package/dist/types/protocol/appstate.d.ts +0 -11
- package/dist/types/protocol/constants.d.ts +7 -3
- package/dist/types/protocol/defaults.d.ts +6 -0
- package/dist/types/protocol/index.d.ts +1 -2
- package/dist/types/protocol/jid.d.ts +19 -2
- package/dist/types/protocol/message.d.ts +60 -0
- package/dist/types/protocol/nodes.d.ts +2 -0
- package/dist/types/protocol/notification.d.ts +2 -0
- package/dist/types/protocol/privacy-token.d.ts +17 -0
- package/dist/types/protocol/privacy.d.ts +75 -0
- package/dist/types/protocol/stream.d.ts +30 -0
- package/dist/types/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/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 +6 -0
- package/dist/types/signal/api/SignalIdentitySyncApi.d.ts +2 -0
- package/dist/types/signal/api/SignalRotateKeyApi.d.ts +4 -5
- package/dist/types/signal/api/SignalSessionSyncApi.d.ts +8 -6
- package/dist/types/signal/api/result-map.d.ts +1 -0
- package/dist/types/signal/constants.d.ts +0 -3
- package/dist/types/signal/{store/sqlite.d.ts → encoding.d.ts} +3 -3
- package/dist/types/signal/group/SenderKeyManager.d.ts +10 -5
- package/dist/types/signal/index.d.ts +2 -0
- package/dist/types/signal/session/SignalProtocol.d.ts +10 -4
- package/dist/types/signal/session/resolver.d.ts +7 -2
- package/dist/types/store/contracts/appstate.store.d.ts +1 -1
- package/dist/types/store/contracts/privacy-token.store.d.ts +16 -0
- package/dist/types/store/contracts/retry.store.d.ts +7 -0
- package/dist/types/store/contracts/signal.store.d.ts +7 -0
- package/dist/types/store/createStore.d.ts +1 -1
- package/dist/types/store/index.d.ts +5 -13
- package/dist/types/store/locks/appstate.lock.d.ts +3 -0
- package/dist/types/store/locks/auth.lock.d.ts +3 -0
- package/dist/types/store/locks/contact.lock.d.ts +3 -0
- package/dist/types/store/locks/device-list.lock.d.ts +2 -0
- package/dist/types/store/locks/message.lock.d.ts +3 -0
- package/dist/types/store/locks/participants.lock.d.ts +2 -0
- package/dist/types/store/locks/privacy-token.lock.d.ts +2 -0
- package/dist/types/store/locks/retry.lock.d.ts +2 -0
- package/dist/types/store/locks/sender-key.lock.d.ts +3 -0
- package/dist/types/store/locks/signal.lock.d.ts +3 -0
- package/dist/types/store/locks/thread.lock.d.ts +3 -0
- package/dist/types/store/providers/memory/appstate.store.d.ts +1 -1
- package/dist/types/store/providers/memory/privacy-token.store.d.ts +13 -0
- package/dist/types/store/providers/memory/retry.store.d.ts +8 -0
- package/dist/types/store/providers/memory/signal.store.d.ts +2 -1
- package/dist/types/store/types.d.ts +49 -61
- package/dist/types/transport/WaWebSocket.d.ts +0 -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/node/WaNodeOrchestrator.d.ts +3 -4
- package/dist/types/transport/node/builders/business.d.ts +29 -0
- package/dist/types/transport/node/builders/global.d.ts +102 -0
- package/dist/types/transport/node/builders/index.d.ts +5 -2
- package/dist/types/transport/node/builders/message.d.ts +8 -7
- package/dist/types/transport/node/builders/pairing.d.ts +0 -2
- package/dist/types/transport/node/builders/privacy-token.d.ts +9 -0
- package/dist/types/transport/node/builders/privacy.d.ts +7 -0
- package/dist/types/transport/node/builders/profile.d.ts +8 -0
- package/dist/types/transport/node/builders/retry.d.ts +0 -1
- package/dist/types/transport/node/helpers.d.ts +5 -0
- package/dist/types/transport/noise/WaNoiseSession.d.ts +3 -2
- package/dist/types/transport/noise/WaNoiseSocket.d.ts +4 -2
- 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 +29 -7
- package/proto/index.js +1 -1
- package/dist/crypto/core/constants.js +0 -4
- 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/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/types/appstate/store/sqlite.d.ts +0 -7
- 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
|
@@ -8,13 +8,20 @@ const WaConnectionManager_1 = require("./connection/WaConnectionManager");
|
|
|
8
8
|
const WaKeyShareCoordinator_1 = require("./connection/WaKeyShareCoordinator");
|
|
9
9
|
const WaReceiptQueue_1 = require("./connection/WaReceiptQueue");
|
|
10
10
|
const WaAppStateMutationCoordinator_1 = require("./coordinators/WaAppStateMutationCoordinator");
|
|
11
|
+
const WaBusinessCoordinator_1 = require("./coordinators/WaBusinessCoordinator");
|
|
11
12
|
const WaGroupCoordinator_1 = require("./coordinators/WaGroupCoordinator");
|
|
12
13
|
const WaIncomingNodeCoordinator_1 = require("./coordinators/WaIncomingNodeCoordinator");
|
|
13
14
|
const WaMessageDispatchCoordinator_1 = require("./coordinators/WaMessageDispatchCoordinator");
|
|
14
15
|
const WaPassiveTasksCoordinator_1 = require("./coordinators/WaPassiveTasksCoordinator");
|
|
16
|
+
const WaPrivacyCoordinator_1 = require("./coordinators/WaPrivacyCoordinator");
|
|
17
|
+
const WaProfileCoordinator_1 = require("./coordinators/WaProfileCoordinator");
|
|
15
18
|
const WaRetryCoordinator_1 = require("./coordinators/WaRetryCoordinator");
|
|
16
19
|
const WaStreamControlCoordinator_1 = require("./coordinators/WaStreamControlCoordinator");
|
|
20
|
+
const WaTrustedContactTokenCoordinator_1 = require("./coordinators/WaTrustedContactTokenCoordinator");
|
|
17
21
|
const dirty_1 = require("./dirty");
|
|
22
|
+
const devices_1 = require("./events/devices");
|
|
23
|
+
const identity_1 = require("./events/identity");
|
|
24
|
+
const privacy_token_1 = require("./events/privacy-token");
|
|
18
25
|
const messages_1 = require("./messages");
|
|
19
26
|
const fanout_1 = require("./messaging/fanout");
|
|
20
27
|
const key_protocol_1 = require("./messaging/key-protocol");
|
|
@@ -23,6 +30,7 @@ const WaMediaTransferClient_1 = require("../media/WaMediaTransferClient");
|
|
|
23
30
|
const incoming_1 = require("../message/incoming");
|
|
24
31
|
const WaMessageClient_1 = require("../message/WaMessageClient");
|
|
25
32
|
const constants_1 = require("../protocol/constants");
|
|
33
|
+
const jid_1 = require("../protocol/jid");
|
|
26
34
|
const tracker_1 = require("../retry/tracker");
|
|
27
35
|
const SignalDeviceSyncApi_1 = require("../signal/api/SignalDeviceSyncApi");
|
|
28
36
|
const SignalDigestSyncApi_1 = require("../signal/api/SignalDigestSyncApi");
|
|
@@ -34,6 +42,8 @@ const SenderKeyManager_1 = require("../signal/group/SenderKeyManager");
|
|
|
34
42
|
const resolver_1 = require("../signal/session/resolver");
|
|
35
43
|
const SignalProtocol_1 = require("../signal/session/SignalProtocol");
|
|
36
44
|
const WaKeepAlive_1 = require("../transport/keepalive/WaKeepAlive");
|
|
45
|
+
const global_1 = require("../transport/node/builders/global");
|
|
46
|
+
const helpers_1 = require("../transport/node/helpers");
|
|
37
47
|
const usync_1 = require("../transport/node/usync");
|
|
38
48
|
const WaNodeOrchestrator_1 = require("../transport/node/WaNodeOrchestrator");
|
|
39
49
|
const WaNodeTransport_1 = require("../transport/node/WaNodeTransport");
|
|
@@ -94,31 +104,6 @@ function resolveWaClientBase(options, logger) {
|
|
|
94
104
|
sessionStore
|
|
95
105
|
};
|
|
96
106
|
}
|
|
97
|
-
function createIncomingMessageAckOptions(input) {
|
|
98
|
-
const { logger, sendNode, emitEvent, handleIncomingMessageEvent, handleError, getCurrentMeJid, signalProtocol, senderKeyManager, retryCoordinator } = input;
|
|
99
|
-
return {
|
|
100
|
-
logger,
|
|
101
|
-
sendNode,
|
|
102
|
-
getMeJid: getCurrentMeJid,
|
|
103
|
-
signalProtocol,
|
|
104
|
-
senderKeyManager,
|
|
105
|
-
onDecryptFailure: (context, error) => retryCoordinator.onDecryptFailure(context, error),
|
|
106
|
-
emitIncomingMessage: (event) => {
|
|
107
|
-
void handleIncomingMessageEvent(event).catch((err) => handleError((0, primitives_1.toError)(err)));
|
|
108
|
-
},
|
|
109
|
-
emitUnhandledStanza: (event) => emitEvent('stanza_unhandled', event)
|
|
110
|
-
};
|
|
111
|
-
}
|
|
112
|
-
function createHandleClientDirtyBits(input) {
|
|
113
|
-
const { logger, queryWithContext, syncAppState, getCurrentCredentials, generateUsyncSid } = input;
|
|
114
|
-
return (dirtyBits) => (0, dirty_1.handleDirtyBits)({
|
|
115
|
-
logger,
|
|
116
|
-
queryWithContext,
|
|
117
|
-
getCurrentCredentials,
|
|
118
|
-
syncAppState,
|
|
119
|
-
generateUsyncSid
|
|
120
|
-
}, dirtyBits);
|
|
121
|
-
}
|
|
122
107
|
function createIncomingNodeRuntime(input) {
|
|
123
108
|
const { logger, emitEvent, authClient, connectionManager, nodeOrchestrator, streamControl, mediaMessageBuildOptions, retryCoordinator, messageDispatch, sendNode, syncAppState, disconnect, clearStoredCredentials, getCurrentMeJid, handleClientDirtyBits, incomingMessageAckOptions } = input;
|
|
124
109
|
return {
|
|
@@ -160,6 +145,9 @@ function createIncomingNodeRuntime(input) {
|
|
|
160
145
|
},
|
|
161
146
|
emitUnhandledIncomingNode: (event) => emitEvent('stanza_unhandled', event),
|
|
162
147
|
syncAppState,
|
|
148
|
+
stopComms: () => {
|
|
149
|
+
void connectionManager.getComms()?.stopComms();
|
|
150
|
+
},
|
|
163
151
|
disconnect,
|
|
164
152
|
clearStoredCredentials,
|
|
165
153
|
parseDirtyBits: (nodes) => (0, dirty_1.parseDirtyBits)(nodes, logger),
|
|
@@ -276,7 +264,8 @@ function buildWaClientDependencies(input) {
|
|
|
276
264
|
deviceBrowser: options.deviceBrowser,
|
|
277
265
|
deviceOsDisplayName: options.deviceOsDisplayName,
|
|
278
266
|
devicePlatform: options.devicePlatform,
|
|
279
|
-
requireFullSync: options.requireFullSync
|
|
267
|
+
requireFullSync: options.requireFullSync,
|
|
268
|
+
version: options.version
|
|
280
269
|
}, {
|
|
281
270
|
logger,
|
|
282
271
|
authStore: sessionStore.auth,
|
|
@@ -303,6 +292,16 @@ function buildWaClientDependencies(input) {
|
|
|
303
292
|
const groupCoordinator = (0, WaGroupCoordinator_1.createGroupCoordinator)({
|
|
304
293
|
queryWithContext: runtime.queryWithContext
|
|
305
294
|
});
|
|
295
|
+
const privacyCoordinator = (0, WaPrivacyCoordinator_1.createPrivacyCoordinator)({
|
|
296
|
+
queryWithContext: runtime.queryWithContext
|
|
297
|
+
});
|
|
298
|
+
const profileCoordinator = (0, WaProfileCoordinator_1.createProfileCoordinator)({
|
|
299
|
+
queryWithContext: runtime.queryWithContext,
|
|
300
|
+
generateSid: generateUsyncSid
|
|
301
|
+
});
|
|
302
|
+
const businessCoordinator = (0, WaBusinessCoordinator_1.createBusinessCoordinator)({
|
|
303
|
+
queryWithContext: runtime.queryWithContext
|
|
304
|
+
});
|
|
306
305
|
const retryTracker = (0, tracker_1.createOutboundRetryTracker)({
|
|
307
306
|
retryStore: sessionStore.retry,
|
|
308
307
|
logger
|
|
@@ -322,9 +321,30 @@ function buildWaClientDependencies(input) {
|
|
|
322
321
|
});
|
|
323
322
|
const participantsCache = (0, participants_1.createGroupParticipantsCache)({
|
|
324
323
|
participantsStore: sessionStore.participants,
|
|
325
|
-
queryGroupParticipantJids: async (groupJid) =>
|
|
324
|
+
queryGroupParticipantJids: async (groupJid) => {
|
|
325
|
+
const metadata = await groupCoordinator.queryGroupMetadata(groupJid);
|
|
326
|
+
const participantJids = new Array(metadata.participants.length);
|
|
327
|
+
for (let index = 0; index < metadata.participants.length; index += 1) {
|
|
328
|
+
participantJids[index] = metadata.participants[index].jid;
|
|
329
|
+
}
|
|
330
|
+
return participantJids;
|
|
331
|
+
},
|
|
326
332
|
logger
|
|
327
333
|
});
|
|
334
|
+
const trustedContactToken = new WaTrustedContactTokenCoordinator_1.WaTrustedContactTokenCoordinator({
|
|
335
|
+
logger,
|
|
336
|
+
store: sessionStore.privacyToken,
|
|
337
|
+
runtime: {
|
|
338
|
+
queryWithContext: runtime.queryWithContext,
|
|
339
|
+
emitEvent: runtime.emitEvent,
|
|
340
|
+
getCurrentMeLid: () => getCurrentMeLid() ?? null
|
|
341
|
+
},
|
|
342
|
+
durationS: options.privacyToken?.tcTokenDurationS,
|
|
343
|
+
numBuckets: options.privacyToken?.tcTokenNumBuckets,
|
|
344
|
+
senderDurationS: options.privacyToken?.tcTokenSenderDurationS,
|
|
345
|
+
senderNumBuckets: options.privacyToken?.tcTokenSenderNumBuckets,
|
|
346
|
+
maxDurationS: options.privacyToken?.tcTokenMaxDurationS
|
|
347
|
+
});
|
|
328
348
|
let messageDispatch;
|
|
329
349
|
const appStateSyncKeyProtocol = (0, key_protocol_1.createAppStateSyncKeyProtocol)({
|
|
330
350
|
publishSignalMessage: (signalInput, publishOptions) => messageDispatch.publishSignalMessage(signalInput, publishOptions),
|
|
@@ -344,9 +364,18 @@ function buildWaClientDependencies(input) {
|
|
|
344
364
|
buildMessageContent: async (content) => (0, messages_1.buildMediaMessageContent)(mediaMessageBuildOptions, content),
|
|
345
365
|
senderKeyManager,
|
|
346
366
|
signalProtocol,
|
|
367
|
+
signalStore: sessionStore.signal,
|
|
368
|
+
deviceListStore: sessionStore.deviceList,
|
|
347
369
|
getCurrentMeJid,
|
|
348
370
|
getCurrentMeLid,
|
|
349
|
-
getCurrentSignedIdentity
|
|
371
|
+
getCurrentSignedIdentity,
|
|
372
|
+
resolvePrivacyTokenNode: (recipientJid) => trustedContactToken.resolveTokenForMessage(recipientJid),
|
|
373
|
+
onDirectMessageSent: (recipientJid) => {
|
|
374
|
+
trustedContactToken.maybeIssueSenderToken(recipientJid).catch((err) => logger.warn('sender token issue failed', {
|
|
375
|
+
to: recipientJid,
|
|
376
|
+
message: (0, primitives_1.toError)(err).message
|
|
377
|
+
}));
|
|
378
|
+
}
|
|
350
379
|
});
|
|
351
380
|
const retryCoordinator = new WaRetryCoordinator_1.WaRetryCoordinator({
|
|
352
381
|
logger,
|
|
@@ -391,14 +420,27 @@ function buildWaClientDependencies(input) {
|
|
|
391
420
|
connectionManager.setMediaConnCache(mediaConnCacheFallback);
|
|
392
421
|
}
|
|
393
422
|
scheduleReconnectAfterPairing = () => connectionManager?.scheduleReconnectAfterPairing();
|
|
394
|
-
const disconnectWithClientSideEffects = async () => {
|
|
423
|
+
const disconnectWithClientSideEffects = async (reason, isLogout, code) => {
|
|
395
424
|
keyShareCoordinator.notifyDisconnected();
|
|
396
425
|
await connectionManager?.disconnect();
|
|
397
|
-
runtime.emitEvent('
|
|
426
|
+
runtime.emitEvent('connection', {
|
|
427
|
+
status: 'close',
|
|
428
|
+
reason,
|
|
429
|
+
code,
|
|
430
|
+
isLogout,
|
|
431
|
+
isNewLogin: false
|
|
432
|
+
});
|
|
398
433
|
};
|
|
399
|
-
const connectWithClientSideEffects = async () => {
|
|
434
|
+
const connectWithClientSideEffects = async (reason) => {
|
|
435
|
+
runtime.resumeIncomingEvents();
|
|
400
436
|
await connectionManager?.connect(runtime.handleIncomingFrame);
|
|
401
|
-
runtime.emitEvent('
|
|
437
|
+
runtime.emitEvent('connection', {
|
|
438
|
+
status: 'open',
|
|
439
|
+
reason,
|
|
440
|
+
code: null,
|
|
441
|
+
isLogout: false,
|
|
442
|
+
isNewLogin: connectionManager?.wasNewLogin() ?? false
|
|
443
|
+
});
|
|
402
444
|
};
|
|
403
445
|
const clearStoredCredentialsWithClientSideEffects = async () => {
|
|
404
446
|
await connectionManager?.clearStoredCredentials();
|
|
@@ -415,24 +457,27 @@ function buildWaClientDependencies(input) {
|
|
|
415
457
|
clearStoredCredentials: clearStoredCredentialsWithClientSideEffects,
|
|
416
458
|
connect: connectWithClientSideEffects
|
|
417
459
|
});
|
|
418
|
-
const incomingMessageAckOptions =
|
|
460
|
+
const incomingMessageAckOptions = {
|
|
419
461
|
logger,
|
|
420
462
|
sendNode: runtime.sendNode,
|
|
421
|
-
|
|
422
|
-
handleIncomingMessageEvent: runtime.handleIncomingMessageEvent,
|
|
423
|
-
handleError: runtime.handleError,
|
|
424
|
-
getCurrentMeJid,
|
|
463
|
+
getMeJid: getCurrentMeJid,
|
|
425
464
|
signalProtocol,
|
|
426
465
|
senderKeyManager,
|
|
427
|
-
retryCoordinator
|
|
428
|
-
|
|
429
|
-
|
|
466
|
+
onDecryptFailure: (context, error) => retryCoordinator.onDecryptFailure(context, error),
|
|
467
|
+
emitIncomingMessage: (event) => {
|
|
468
|
+
void runtime
|
|
469
|
+
.handleIncomingMessageEvent(event)
|
|
470
|
+
.catch((err) => runtime.handleError((0, primitives_1.toError)(err)));
|
|
471
|
+
},
|
|
472
|
+
emitUnhandledStanza: (event) => runtime.emitEvent('stanza_unhandled', event)
|
|
473
|
+
};
|
|
474
|
+
const handleClientDirtyBits = (dirtyBits) => (0, dirty_1.handleDirtyBits)({
|
|
430
475
|
logger,
|
|
431
476
|
queryWithContext: runtime.queryWithContext,
|
|
432
|
-
syncAppState: runtime.syncAppState,
|
|
433
477
|
getCurrentCredentials,
|
|
478
|
+
syncAppState: runtime.syncAppState,
|
|
434
479
|
generateUsyncSid
|
|
435
|
-
});
|
|
480
|
+
}, dirtyBits);
|
|
436
481
|
const incomingNode = new WaIncomingNodeCoordinator_1.WaIncomingNodeCoordinator({
|
|
437
482
|
logger,
|
|
438
483
|
runtime: createIncomingNodeRuntime({
|
|
@@ -454,6 +499,207 @@ function buildWaClientDependencies(input) {
|
|
|
454
499
|
incomingMessageAckOptions
|
|
455
500
|
})
|
|
456
501
|
});
|
|
502
|
+
incomingNode.registerIncomingHandler({
|
|
503
|
+
tag: constants_1.WA_NODE_TAGS.NOTIFICATION,
|
|
504
|
+
subtype: constants_1.WA_NOTIFICATION_TYPES.ENCRYPT,
|
|
505
|
+
prepend: true,
|
|
506
|
+
handler: async (node) => {
|
|
507
|
+
const firstChild = (0, helpers_1.getFirstNodeChild)(node);
|
|
508
|
+
if (!firstChild) {
|
|
509
|
+
return false;
|
|
510
|
+
}
|
|
511
|
+
const childTag = firstChild.tag;
|
|
512
|
+
// <count value="N"/> — server prekeys running low
|
|
513
|
+
if (childTag === 'count') {
|
|
514
|
+
const ackNode = (0, global_1.buildAckNode)({
|
|
515
|
+
kind: 'notification',
|
|
516
|
+
node,
|
|
517
|
+
includeType: false
|
|
518
|
+
});
|
|
519
|
+
await runtime.sendNode(ackNode);
|
|
520
|
+
const tasks = passiveTasks;
|
|
521
|
+
if (!tasks) {
|
|
522
|
+
logger.warn('encrypt-count: passive tasks not available');
|
|
523
|
+
return true;
|
|
524
|
+
}
|
|
525
|
+
await tasks.handlePreKeyLowNotification().catch((error) => {
|
|
526
|
+
logger.warn('encrypt-count: prekey upload failed', {
|
|
527
|
+
message: (0, primitives_1.toError)(error).message
|
|
528
|
+
});
|
|
529
|
+
});
|
|
530
|
+
return true;
|
|
531
|
+
}
|
|
532
|
+
// <digest/> — digest key sync
|
|
533
|
+
if (childTag === 'digest') {
|
|
534
|
+
const ackNode = (0, global_1.buildAckNode)({
|
|
535
|
+
kind: 'notification',
|
|
536
|
+
node,
|
|
537
|
+
includeType: false
|
|
538
|
+
});
|
|
539
|
+
await runtime.sendNode(ackNode);
|
|
540
|
+
const tasks = passiveTasks;
|
|
541
|
+
if (!tasks) {
|
|
542
|
+
logger.warn('encrypt-digest: passive tasks not available');
|
|
543
|
+
return true;
|
|
544
|
+
}
|
|
545
|
+
await tasks.handleDigestNotification().catch((error) => {
|
|
546
|
+
logger.warn('encrypt-digest: digest sync failed', {
|
|
547
|
+
message: (0, primitives_1.toError)(error).message
|
|
548
|
+
});
|
|
549
|
+
});
|
|
550
|
+
return true;
|
|
551
|
+
}
|
|
552
|
+
// <identity/> — contact identity key changed
|
|
553
|
+
if (childTag === 'identity') {
|
|
554
|
+
const parsed = (0, identity_1.parseIdentityChangeNotification)(node);
|
|
555
|
+
if (!parsed) {
|
|
556
|
+
return false;
|
|
557
|
+
}
|
|
558
|
+
const ackNode = (0, global_1.buildAckNode)({
|
|
559
|
+
kind: 'notification',
|
|
560
|
+
node,
|
|
561
|
+
includeType: false
|
|
562
|
+
});
|
|
563
|
+
await runtime.sendNode(ackNode);
|
|
564
|
+
const address = (0, jid_1.parseSignalAddressFromJid)(parsed.fromJid);
|
|
565
|
+
// ignore companion devices (non-primary)
|
|
566
|
+
if (address.device !== 0) {
|
|
567
|
+
logger.debug('identity-change: ignoring companion device', {
|
|
568
|
+
jid: parsed.fromJid
|
|
569
|
+
});
|
|
570
|
+
return true;
|
|
571
|
+
}
|
|
572
|
+
// self-primary identity change → must disconnect
|
|
573
|
+
const meJid = getCurrentMeJid();
|
|
574
|
+
if (meJid) {
|
|
575
|
+
const meUser = (0, jid_1.toUserJid)(meJid);
|
|
576
|
+
const fromUser = (0, jid_1.toUserJid)(parsed.fromJid);
|
|
577
|
+
if (meUser === fromUser) {
|
|
578
|
+
logger.error('self primary identity changed, disconnecting');
|
|
579
|
+
void connectionManager?.getComms()?.stopComms();
|
|
580
|
+
await disconnectWithClientSideEffects(constants_1.WA_DISCONNECT_REASONS.PRIMARY_IDENTITY_KEY_CHANGE, true, null);
|
|
581
|
+
await clearStoredCredentialsWithClientSideEffects();
|
|
582
|
+
return true;
|
|
583
|
+
}
|
|
584
|
+
}
|
|
585
|
+
const oldIdentity = await sessionStore.signal.getRemoteIdentity(address);
|
|
586
|
+
if (oldIdentity) {
|
|
587
|
+
logger.info('identity-change: clearing session', {
|
|
588
|
+
jid: parsed.fromJid
|
|
589
|
+
});
|
|
590
|
+
await sessionStore.signal.deleteSession(address);
|
|
591
|
+
const userJid = (0, jid_1.toUserJid)(parsed.fromJid);
|
|
592
|
+
await trustedContactToken.reissueOnIdentityChange(userJid).catch((error) => {
|
|
593
|
+
logger.warn('identity-change: reissue tc token failed', {
|
|
594
|
+
message: (0, primitives_1.toError)(error).message
|
|
595
|
+
});
|
|
596
|
+
});
|
|
597
|
+
}
|
|
598
|
+
runtime.emitEvent('notification', {
|
|
599
|
+
rawNode: node,
|
|
600
|
+
stanzaId: parsed.stanzaId,
|
|
601
|
+
chatJid: parsed.fromJid,
|
|
602
|
+
stanzaType: 'encrypt',
|
|
603
|
+
notificationType: 'encrypt',
|
|
604
|
+
classification: 'core',
|
|
605
|
+
details: {
|
|
606
|
+
kind: 'identity_change',
|
|
607
|
+
displayName: parsed.displayName,
|
|
608
|
+
lid: parsed.lid,
|
|
609
|
+
hadPreviousIdentity: !!oldIdentity
|
|
610
|
+
}
|
|
611
|
+
});
|
|
612
|
+
return true;
|
|
613
|
+
}
|
|
614
|
+
return false;
|
|
615
|
+
}
|
|
616
|
+
});
|
|
617
|
+
incomingNode.registerIncomingHandler({
|
|
618
|
+
tag: constants_1.WA_NODE_TAGS.NOTIFICATION,
|
|
619
|
+
subtype: constants_1.WA_NOTIFICATION_TYPES.DEVICES,
|
|
620
|
+
prepend: true,
|
|
621
|
+
handler: async (node) => {
|
|
622
|
+
const parsed = (0, devices_1.parseDeviceNotification)(node);
|
|
623
|
+
if (!parsed) {
|
|
624
|
+
return false;
|
|
625
|
+
}
|
|
626
|
+
const ackNode = (0, global_1.buildAckNode)({
|
|
627
|
+
kind: 'notification',
|
|
628
|
+
node,
|
|
629
|
+
includeType: false
|
|
630
|
+
});
|
|
631
|
+
await runtime.sendNode(ackNode);
|
|
632
|
+
const userJid = (0, jid_1.toUserJid)(parsed.fromJid);
|
|
633
|
+
if (parsed.action === devices_1.DEVICE_NOTIFICATION_ACTIONS.REMOVE) {
|
|
634
|
+
const baseAddress = (0, jid_1.parseSignalAddressFromJid)(parsed.fromJid);
|
|
635
|
+
for (const device of parsed.devices) {
|
|
636
|
+
const address = {
|
|
637
|
+
user: baseAddress.user,
|
|
638
|
+
server: baseAddress.server,
|
|
639
|
+
device: device.deviceId
|
|
640
|
+
};
|
|
641
|
+
await sessionStore.signal.deleteSession(address).catch((error) => {
|
|
642
|
+
logger.warn('devices-notification: delete session failed', {
|
|
643
|
+
message: (0, primitives_1.toError)(error).message
|
|
644
|
+
});
|
|
645
|
+
});
|
|
646
|
+
}
|
|
647
|
+
}
|
|
648
|
+
// invalidate device list cache so next fanout fetches fresh list
|
|
649
|
+
if (sessionStore.deviceList) {
|
|
650
|
+
await sessionStore.deviceList.deleteUserDevices(userJid).catch((error) => {
|
|
651
|
+
logger.warn('devices-notification: invalidate cache failed', {
|
|
652
|
+
message: (0, primitives_1.toError)(error).message
|
|
653
|
+
});
|
|
654
|
+
});
|
|
655
|
+
}
|
|
656
|
+
// for update notifications, re-sync immediately
|
|
657
|
+
if (parsed.action === devices_1.DEVICE_NOTIFICATION_ACTIONS.UPDATE) {
|
|
658
|
+
signalDeviceSync.syncDeviceList([userJid]).catch((error) => {
|
|
659
|
+
logger.warn('devices-notification: sync device list failed', {
|
|
660
|
+
message: (0, primitives_1.toError)(error).message
|
|
661
|
+
});
|
|
662
|
+
});
|
|
663
|
+
}
|
|
664
|
+
runtime.emitEvent('notification', {
|
|
665
|
+
rawNode: node,
|
|
666
|
+
stanzaId: parsed.stanzaId,
|
|
667
|
+
chatJid: parsed.fromJid,
|
|
668
|
+
stanzaType: 'devices',
|
|
669
|
+
notificationType: 'devices',
|
|
670
|
+
classification: 'core',
|
|
671
|
+
details: {
|
|
672
|
+
kind: 'device_list_change',
|
|
673
|
+
action: parsed.action,
|
|
674
|
+
devices: parsed.devices
|
|
675
|
+
}
|
|
676
|
+
});
|
|
677
|
+
return true;
|
|
678
|
+
}
|
|
679
|
+
});
|
|
680
|
+
incomingNode.registerIncomingHandler({
|
|
681
|
+
tag: constants_1.WA_NODE_TAGS.NOTIFICATION,
|
|
682
|
+
subtype: constants_1.WA_PRIVACY_TOKEN_NOTIFICATION_TYPE,
|
|
683
|
+
prepend: true,
|
|
684
|
+
handler: async (node) => {
|
|
685
|
+
const fromJid = node.attrs.from ?? node.attrs.sender_lid;
|
|
686
|
+
if (!fromJid) {
|
|
687
|
+
return false;
|
|
688
|
+
}
|
|
689
|
+
const tokens = (0, privacy_token_1.parsePrivacyTokenNotification)(node);
|
|
690
|
+
if (tokens.length === 0) {
|
|
691
|
+
return false;
|
|
692
|
+
}
|
|
693
|
+
await trustedContactToken.handleIncomingToken(fromJid, tokens);
|
|
694
|
+
const ackNode = (0, global_1.buildAckNode)({
|
|
695
|
+
kind: 'notification',
|
|
696
|
+
node,
|
|
697
|
+
typeOverride: constants_1.WA_PRIVACY_TOKEN_NOTIFICATION_TYPE
|
|
698
|
+
});
|
|
699
|
+
await runtime.sendNode(ackNode);
|
|
700
|
+
return true;
|
|
701
|
+
}
|
|
702
|
+
});
|
|
457
703
|
passiveTasks = new WaPassiveTasksCoordinator_1.WaPassiveTasksCoordinator({
|
|
458
704
|
logger,
|
|
459
705
|
signalStore: sessionStore.signal,
|
|
@@ -486,13 +732,17 @@ function buildWaClientDependencies(input) {
|
|
|
486
732
|
messageDispatch,
|
|
487
733
|
retryCoordinator,
|
|
488
734
|
appStateSync,
|
|
489
|
-
appStateMutations,
|
|
735
|
+
chatCoordinator: appStateMutations,
|
|
490
736
|
streamControl,
|
|
491
737
|
incomingNode,
|
|
492
738
|
passiveTasks,
|
|
493
739
|
groupCoordinator,
|
|
740
|
+
privacyCoordinator,
|
|
741
|
+
profileCoordinator,
|
|
742
|
+
businessCoordinator,
|
|
494
743
|
receiptQueue,
|
|
495
744
|
keyShareCoordinator,
|
|
496
|
-
connectionManager
|
|
745
|
+
connectionManager,
|
|
746
|
+
trustedContactToken
|
|
497
747
|
};
|
|
498
748
|
}
|
|
@@ -5,6 +5,7 @@ const WaComms_1 = require("../../transport/WaComms");
|
|
|
5
5
|
const primitives_1 = require("../../util/primitives");
|
|
6
6
|
class WaConnectionManager {
|
|
7
7
|
constructor(options) {
|
|
8
|
+
this.lastConnectWasNewLogin = false;
|
|
8
9
|
this.logger = options.logger;
|
|
9
10
|
this.options = options.options;
|
|
10
11
|
this.authClient = options.authClient;
|
|
@@ -33,11 +34,12 @@ class WaConnectionManager {
|
|
|
33
34
|
const operation = this.runLifecycleOperation(async () => {
|
|
34
35
|
await this.connectInternal(frameHandler, lifecycleGeneration);
|
|
35
36
|
});
|
|
36
|
-
|
|
37
|
-
if (this.connectPromise ===
|
|
37
|
+
const promise = operation.finally(() => {
|
|
38
|
+
if (this.connectPromise === promise) {
|
|
38
39
|
this.connectPromise = null;
|
|
39
40
|
}
|
|
40
41
|
});
|
|
42
|
+
this.connectPromise = promise;
|
|
41
43
|
return this.connectPromise;
|
|
42
44
|
}
|
|
43
45
|
scheduleReconnectAfterPairing() {
|
|
@@ -67,6 +69,9 @@ class WaConnectionManager {
|
|
|
67
69
|
isConnected() {
|
|
68
70
|
return !!(this.comms && this.comms.getCommsState().connected);
|
|
69
71
|
}
|
|
72
|
+
wasNewLogin() {
|
|
73
|
+
return this.lastConnectWasNewLogin;
|
|
74
|
+
}
|
|
70
75
|
getComms() {
|
|
71
76
|
return this.comms;
|
|
72
77
|
}
|
|
@@ -96,6 +101,7 @@ class WaConnectionManager {
|
|
|
96
101
|
}
|
|
97
102
|
this.logger.info('wa client connect start');
|
|
98
103
|
let credentials = await this.authClient.loadOrCreateCredentials();
|
|
104
|
+
this.lastConnectWasNewLogin = !credentials.meJid;
|
|
99
105
|
this.assertLifecycleCurrent(lifecycleGeneration, 'connect');
|
|
100
106
|
try {
|
|
101
107
|
await this.startCommsWithCredentials(credentials, frameHandler, lifecycleGeneration);
|
|
@@ -130,11 +136,12 @@ class WaConnectionManager {
|
|
|
130
136
|
const operation = this.runLifecycleOperation(async () => {
|
|
131
137
|
await this.reconnectAsRegisteredAfterPairingInternal();
|
|
132
138
|
});
|
|
133
|
-
|
|
134
|
-
if (this.pairingReconnectPromise ===
|
|
139
|
+
const promise = operation.finally(() => {
|
|
140
|
+
if (this.pairingReconnectPromise === promise) {
|
|
135
141
|
this.pairingReconnectPromise = null;
|
|
136
142
|
}
|
|
137
143
|
});
|
|
144
|
+
this.pairingReconnectPromise = promise;
|
|
138
145
|
return this.pairingReconnectPromise;
|
|
139
146
|
}
|
|
140
147
|
async reconnectAsRegisteredAfterPairingInternal() {
|
|
@@ -179,12 +186,14 @@ class WaConnectionManager {
|
|
|
179
186
|
this.pendingComms = null;
|
|
180
187
|
this.clearCommsBinding(currentComms ?? undefined);
|
|
181
188
|
await this.authClient.clearTransientState();
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
189
|
+
await Promise.all([
|
|
190
|
+
pendingComms && pendingComms !== currentComms
|
|
191
|
+
? this.stopCommsQuietly(pendingComms, 'failed to stop pending comms during disconnect')
|
|
192
|
+
: Promise.resolve(),
|
|
193
|
+
currentComms
|
|
194
|
+
? this.stopCommsQuietly(currentComms, 'failed to stop comms during disconnect')
|
|
195
|
+
: Promise.resolve()
|
|
196
|
+
]);
|
|
188
197
|
if (this.isLifecycleCurrent(lifecycleGeneration)) {
|
|
189
198
|
this.logger.info('wa client disconnected');
|
|
190
199
|
}
|