zapo-js 0.1.1 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +20 -4
- package/dist/appstate/WaAppStateCrypto.js +19 -26
- package/dist/appstate/WaAppStateSyncClient.js +293 -181
- package/dist/appstate/WaAppStateSyncResponseParser.js +16 -5
- package/dist/appstate/constants.js +4 -3
- package/dist/appstate/{store/sqlite.js → encoding.js} +13 -8
- package/dist/appstate/index.js +8 -6
- package/dist/appstate/utils.js +9 -34
- package/dist/auth/WaAuthClient.js +43 -61
- package/dist/auth/flow/WaAuthCredentialsFlow.js +22 -15
- package/dist/auth/index.js +1 -8
- package/dist/auth/pairing/WaPairingCodeCrypto.js +6 -4
- package/dist/auth/pairing/WaPairingFlow.js +34 -26
- package/dist/auth/pairing/WaQrFlow.js +37 -24
- package/dist/client/WaClient.js +275 -324
- package/dist/client/WaClientFactory.js +500 -133
- package/dist/client/connection/WaConnectionManager.js +301 -0
- package/dist/client/connection/WaKeyShareCoordinator.js +63 -0
- package/dist/client/connection/WaReceiptQueue.js +51 -0
- package/dist/client/coordinators/WaAppStateMutationCoordinator.js +471 -0
- package/dist/client/coordinators/WaBusinessCoordinator.js +241 -0
- package/dist/client/coordinators/WaGroupCoordinator.js +30 -16
- package/dist/client/coordinators/WaIncomingNodeCoordinator.js +21 -27
- package/dist/client/coordinators/WaMessageDispatchCoordinator.js +439 -701
- package/dist/client/coordinators/WaPassiveTasksCoordinator.js +74 -31
- package/dist/client/coordinators/WaPrivacyCoordinator.js +134 -0
- package/dist/client/coordinators/WaProfileCoordinator.js +212 -0
- package/dist/client/coordinators/WaRetryCoordinator.js +242 -57
- package/dist/client/coordinators/WaStreamControlCoordinator.js +18 -11
- package/dist/client/coordinators/WaTrustedContactTokenCoordinator.js +166 -0
- package/dist/client/dirty.js +74 -48
- package/dist/client/events/chat.js +4 -3
- package/dist/client/events/devices.js +72 -0
- package/dist/client/events/group.js +62 -47
- package/dist/client/events/identity.js +22 -0
- package/dist/client/events/privacy-token.js +39 -0
- package/dist/client/history-sync.js +94 -63
- package/dist/client/incoming.js +60 -27
- package/dist/client/mailbox.js +24 -23
- package/dist/client/messages.js +107 -31
- package/dist/client/messaging/fanout.js +199 -0
- package/dist/client/messaging/key-protocol.js +130 -0
- package/dist/client/messaging/participants.js +193 -0
- package/dist/client/persistence/WriteBehindPersistence.js +129 -0
- package/dist/client/tokens/cs-token.js +50 -0
- package/dist/client/tokens/tc-token.js +25 -0
- package/dist/crypto/core/hkdf.js +3 -8
- package/dist/crypto/core/index.js +2 -5
- package/dist/crypto/core/keys.js +6 -7
- package/dist/crypto/core/nonce.js +2 -0
- package/dist/crypto/core/primitives.js +12 -23
- package/dist/crypto/core/random.js +26 -23
- package/dist/crypto/curves/Ed25519.js +7 -8
- package/dist/crypto/curves/X25519.js +38 -22
- package/dist/crypto/index.js +1 -3
- package/dist/crypto/math/constants.js +13 -36
- package/dist/crypto/math/edwards.js +171 -44
- package/dist/crypto/math/fe.js +706 -0
- package/dist/crypto/math/mod.js +10 -3
- package/dist/esm/appstate/WaAppStateCrypto.js +7 -14
- package/dist/esm/appstate/WaAppStateSyncClient.js +284 -172
- package/dist/esm/appstate/WaAppStateSyncResponseParser.js +17 -6
- package/dist/esm/appstate/constants.js +3 -2
- package/dist/esm/appstate/{store/sqlite.js → encoding.js} +13 -8
- package/dist/esm/appstate/index.js +2 -2
- package/dist/esm/appstate/utils.js +8 -30
- package/dist/esm/auth/WaAuthClient.js +43 -61
- package/dist/esm/auth/flow/WaAuthCredentialsFlow.js +22 -15
- package/dist/esm/auth/index.js +0 -3
- package/dist/esm/auth/pairing/WaPairingCodeCrypto.js +6 -4
- package/dist/esm/auth/pairing/WaPairingFlow.js +28 -20
- package/dist/esm/auth/pairing/WaQrFlow.js +37 -24
- package/dist/esm/client/WaClient.js +275 -324
- package/dist/esm/client/WaClientFactory.js +501 -134
- package/dist/esm/client/connection/WaConnectionManager.js +297 -0
- package/dist/esm/client/connection/WaKeyShareCoordinator.js +59 -0
- package/dist/esm/client/connection/WaReceiptQueue.js +47 -0
- package/dist/esm/client/coordinators/WaAppStateMutationCoordinator.js +467 -0
- package/dist/esm/client/coordinators/WaBusinessCoordinator.js +238 -0
- package/dist/esm/client/coordinators/WaGroupCoordinator.js +23 -9
- package/dist/esm/client/coordinators/WaIncomingNodeCoordinator.js +21 -27
- package/dist/esm/client/coordinators/WaMessageDispatchCoordinator.js +443 -705
- package/dist/esm/client/coordinators/WaPassiveTasksCoordinator.js +74 -31
- package/dist/esm/client/coordinators/WaPrivacyCoordinator.js +131 -0
- package/dist/esm/client/coordinators/WaProfileCoordinator.js +209 -0
- package/dist/esm/client/coordinators/WaRetryCoordinator.js +244 -59
- package/dist/esm/client/coordinators/WaStreamControlCoordinator.js +19 -12
- package/dist/esm/client/coordinators/WaTrustedContactTokenCoordinator.js +162 -0
- package/dist/esm/client/dirty.js +69 -43
- package/dist/esm/client/events/chat.js +4 -3
- package/dist/esm/client/events/devices.js +68 -0
- package/dist/esm/client/events/group.js +53 -39
- package/dist/esm/client/events/identity.js +19 -0
- package/dist/esm/client/events/privacy-token.js +36 -0
- package/dist/esm/client/history-sync.js +91 -60
- package/dist/esm/client/incoming.js +61 -28
- package/dist/esm/client/mailbox.js +24 -23
- package/dist/esm/client/messages.js +108 -32
- package/dist/esm/client/messaging/fanout.js +196 -0
- package/dist/esm/client/messaging/key-protocol.js +127 -0
- package/dist/esm/client/messaging/participants.js +190 -0
- package/dist/esm/client/persistence/WriteBehindPersistence.js +125 -0
- package/dist/esm/client/tokens/cs-token.js +46 -0
- package/dist/esm/client/tokens/tc-token.js +18 -0
- package/dist/esm/crypto/core/hkdf.js +3 -8
- package/dist/esm/crypto/core/index.js +2 -3
- package/dist/esm/crypto/core/keys.js +3 -4
- package/dist/esm/crypto/core/nonce.js +2 -0
- package/dist/esm/crypto/core/primitives.js +12 -22
- package/dist/esm/crypto/core/random.js +25 -23
- package/dist/esm/crypto/curves/Ed25519.js +4 -5
- package/dist/esm/crypto/curves/X25519.js +35 -19
- package/dist/esm/crypto/index.js +0 -1
- package/dist/esm/crypto/math/constants.js +12 -35
- package/dist/esm/crypto/math/edwards.js +174 -47
- package/dist/esm/crypto/math/fe.js +691 -0
- package/dist/esm/crypto/math/mod.js +10 -1
- package/dist/esm/index.js +1 -1
- package/dist/esm/infra/log/ConsoleLogger.js +18 -17
- package/dist/esm/infra/log/PinoLogger.js +15 -9
- package/dist/esm/infra/log/types.js +11 -1
- package/dist/esm/infra/perf/BackgroundQueue.js +478 -0
- package/dist/esm/infra/perf/BoundedTaskQueue.js +16 -18
- package/dist/esm/infra/perf/PromiseDedup.js +20 -0
- package/dist/esm/infra/perf/SharedExclusiveGate.js +109 -0
- package/dist/esm/infra/perf/StoreLock.js +77 -0
- package/dist/esm/media/WaMediaCrypto.js +96 -16
- package/dist/esm/media/WaMediaTransferClient.js +251 -91
- package/dist/esm/media/conn.js +10 -6
- package/dist/esm/media/constants.js +6 -2
- package/dist/esm/message/WaMessageClient.js +30 -32
- package/dist/esm/message/ack.js +6 -6
- package/dist/esm/message/addon-crypto.js +59 -0
- package/dist/esm/message/content.js +195 -9
- package/dist/esm/message/icdc.js +76 -0
- package/dist/esm/message/incoming.js +129 -122
- package/dist/esm/message/index.js +2 -0
- package/dist/esm/message/phash.js +3 -1
- package/dist/esm/message/reporting-token.js +425 -0
- package/dist/esm/message/use-case-secret.js +49 -0
- package/dist/esm/protocol/appstate.js +27 -0
- package/dist/esm/protocol/browser.js +10 -18
- package/dist/esm/protocol/constants.js +6 -3
- package/dist/esm/protocol/defaults.js +6 -0
- package/dist/esm/protocol/index.js +2 -11
- package/dist/esm/protocol/jid.js +133 -52
- package/dist/esm/protocol/media.js +3 -3
- package/dist/esm/protocol/message.js +61 -1
- package/dist/esm/protocol/nodes.js +4 -0
- package/dist/esm/protocol/notification.js +3 -1
- package/dist/esm/protocol/privacy-token.js +17 -0
- package/dist/esm/protocol/privacy.js +55 -0
- package/dist/esm/protocol/stream.js +26 -1
- package/dist/esm/protocol/usync.js +11 -0
- package/dist/esm/retry/codec.js +216 -0
- package/dist/esm/retry/constants.js +1 -1
- package/dist/esm/retry/index.js +3 -2
- package/dist/esm/retry/parse.js +88 -86
- package/dist/esm/retry/replay.js +54 -51
- package/dist/esm/retry/tracker.js +94 -0
- package/dist/esm/signal/api/SignalDeviceSyncApi.js +276 -92
- package/dist/esm/signal/api/SignalDigestSyncApi.js +17 -8
- package/dist/esm/signal/api/SignalIdentitySyncApi.js +67 -37
- package/dist/esm/signal/api/SignalMissingPreKeysSyncApi.js +86 -67
- package/dist/esm/signal/api/SignalRotateKeyApi.js +4 -2
- package/dist/esm/signal/api/SignalSessionSyncApi.js +36 -34
- package/dist/esm/signal/api/result-map.js +10 -0
- package/dist/esm/signal/constants.js +0 -4
- package/dist/esm/signal/crypto/WaAdvSignature.js +13 -9
- package/dist/esm/signal/{store/sqlite.js → encoding.js} +93 -60
- package/dist/esm/signal/group/SenderKeyChain.js +28 -23
- package/dist/esm/signal/group/SenderKeyCodec.js +5 -6
- package/dist/esm/signal/group/SenderKeyManager.js +144 -115
- package/dist/esm/signal/index.js +2 -0
- package/dist/esm/signal/registration/keygen.js +6 -2
- package/dist/esm/signal/registration/utils.js +1 -0
- package/dist/esm/signal/session/SignalProtocol.js +164 -53
- package/dist/esm/signal/session/SignalRatchet.js +24 -15
- package/dist/esm/signal/session/SignalSession.js +14 -9
- package/dist/esm/signal/session/resolver.js +221 -0
- package/dist/esm/store/contracts/privacy-token.store.js +1 -0
- package/dist/esm/store/createStore.js +100 -188
- package/dist/esm/store/index.js +1 -10
- package/dist/esm/store/locks/appstate.lock.js +26 -0
- package/dist/esm/store/locks/auth.lock.js +15 -0
- package/dist/esm/store/locks/contact.lock.js +20 -0
- package/dist/esm/store/locks/device-list.lock.js +20 -0
- package/dist/esm/store/locks/message.lock.js +21 -0
- package/dist/esm/store/locks/participants.lock.js +20 -0
- package/dist/esm/store/locks/privacy-token.lock.js +18 -0
- package/dist/esm/store/locks/retry.lock.js +29 -0
- package/dist/esm/store/locks/sender-key.lock.js +52 -0
- package/dist/esm/store/locks/signal.lock.js +63 -0
- package/dist/esm/store/locks/thread.lock.js +21 -0
- package/dist/esm/store/noop.store.js +4 -7
- package/dist/esm/store/providers/memory/appstate.store.js +38 -16
- package/dist/esm/store/providers/memory/contact.store.js +5 -0
- package/dist/esm/store/providers/memory/device-list.store.js +12 -34
- package/dist/esm/store/providers/memory/message.store.js +11 -5
- package/dist/esm/store/providers/memory/participants.store.js +1 -8
- package/dist/esm/store/providers/memory/privacy-token.store.js +43 -0
- package/dist/esm/store/providers/memory/retry.store.js +77 -2
- package/dist/esm/store/providers/memory/sender-key.store.js +11 -8
- package/dist/esm/store/providers/memory/signal.store.js +47 -18
- package/dist/esm/store/providers/memory/thread.store.js +5 -0
- package/dist/esm/transport/WaComms.js +28 -24
- package/dist/esm/transport/WaWebSocket.js +115 -18
- package/dist/esm/transport/binary/constants.js +0 -30
- package/dist/esm/transport/binary/decoder.js +8 -8
- package/dist/esm/transport/binary/encoder.js +10 -9
- package/dist/esm/transport/binary/index.js +0 -1
- package/dist/esm/transport/index.js +1 -0
- package/dist/esm/transport/keepalive/WaKeepAlive.js +2 -8
- package/dist/esm/transport/node/WaNodeOrchestrator.js +25 -21
- package/dist/esm/transport/node/WaNodeTransport.js +0 -3
- package/dist/esm/transport/node/builders/{accountSync.js → account-sync.js} +16 -36
- package/dist/esm/transport/node/builders/business.js +129 -0
- package/dist/esm/transport/node/builders/global.js +370 -0
- package/dist/esm/transport/node/builders/index.js +7 -3
- package/dist/esm/transport/node/builders/message.js +63 -230
- package/dist/esm/transport/node/builders/pairing.js +2 -27
- package/dist/esm/transport/node/builders/privacy-token.js +41 -0
- package/dist/esm/transport/node/builders/privacy.js +48 -0
- package/dist/esm/transport/node/builders/profile.js +70 -0
- package/dist/esm/transport/node/builders/retry.js +10 -22
- package/dist/esm/transport/node/builders/usync.js +45 -0
- package/dist/esm/transport/node/helpers.js +125 -5
- package/dist/esm/transport/node/usync.js +5 -0
- package/dist/esm/transport/node/xml.js +35 -14
- package/dist/esm/transport/noise/WaClientPayload.js +10 -10
- package/dist/esm/transport/noise/WaFrameCodec.js +48 -33
- package/dist/esm/transport/noise/WaNoiseCert.js +4 -7
- package/dist/esm/transport/noise/WaNoiseSession.js +77 -29
- package/dist/esm/transport/noise/WaNoiseSocket.js +8 -4
- package/dist/esm/transport/proxy.js +27 -0
- package/dist/esm/transport/stream/parse.js +17 -48
- package/dist/esm/util/bytes.js +67 -45
- package/dist/esm/util/coercion.js +6 -14
- package/dist/esm/util/index.js +5 -0
- package/dist/esm/util/primitives.js +40 -14
- package/dist/index.js +7 -1
- package/dist/infra/log/ConsoleLogger.js +18 -17
- package/dist/infra/log/PinoLogger.js +15 -9
- package/dist/infra/log/types.js +12 -0
- package/dist/infra/perf/BackgroundQueue.js +482 -0
- package/dist/infra/perf/BoundedTaskQueue.js +16 -18
- package/dist/infra/perf/PromiseDedup.js +24 -0
- package/dist/infra/perf/SharedExclusiveGate.js +113 -0
- package/dist/infra/perf/StoreLock.js +81 -0
- package/dist/media/WaMediaCrypto.js +95 -15
- package/dist/media/WaMediaTransferClient.js +284 -91
- package/dist/media/conn.js +10 -6
- package/dist/media/constants.js +6 -2
- package/dist/message/WaMessageClient.js +31 -33
- package/dist/message/ack.js +6 -6
- package/dist/message/addon-crypto.js +65 -0
- package/dist/message/content.js +198 -9
- package/dist/message/icdc.js +81 -0
- package/dist/message/incoming.js +127 -120
- package/dist/message/index.js +2 -0
- package/dist/message/phash.js +3 -1
- package/dist/message/reporting-token.js +429 -0
- package/dist/message/use-case-secret.js +55 -0
- package/dist/protocol/appstate.js +28 -1
- package/dist/protocol/browser.js +10 -18
- package/dist/protocol/constants.js +26 -1
- package/dist/protocol/defaults.js +6 -0
- package/dist/protocol/index.js +23 -42
- package/dist/protocol/jid.js +140 -52
- package/dist/protocol/media.js +3 -3
- package/dist/protocol/message.js +62 -2
- package/dist/protocol/nodes.js +4 -0
- package/dist/protocol/notification.js +3 -1
- package/dist/protocol/privacy-token.js +20 -0
- package/dist/protocol/privacy.js +58 -0
- package/dist/protocol/stream.js +27 -2
- package/dist/protocol/usync.js +14 -0
- package/dist/retry/codec.js +220 -0
- package/dist/retry/constants.js +1 -1
- package/dist/retry/index.js +7 -5
- package/dist/retry/parse.js +88 -85
- package/dist/retry/replay.js +52 -49
- package/dist/retry/tracker.js +97 -0
- package/dist/signal/api/SignalDeviceSyncApi.js +273 -89
- package/dist/signal/api/SignalDigestSyncApi.js +17 -8
- package/dist/signal/api/SignalIdentitySyncApi.js +66 -36
- package/dist/signal/api/SignalMissingPreKeysSyncApi.js +82 -63
- package/dist/signal/api/SignalRotateKeyApi.js +4 -2
- package/dist/signal/api/SignalSessionSyncApi.js +36 -34
- package/dist/signal/api/result-map.js +13 -0
- package/dist/signal/constants.js +1 -5
- package/dist/signal/crypto/WaAdvSignature.js +11 -7
- package/dist/signal/{store/sqlite.js → encoding.js} +94 -61
- package/dist/signal/group/SenderKeyChain.js +27 -22
- package/dist/signal/group/SenderKeyCodec.js +5 -6
- package/dist/signal/group/SenderKeyManager.js +144 -115
- package/dist/signal/index.js +15 -1
- package/dist/signal/registration/keygen.js +6 -2
- package/dist/signal/registration/utils.js +1 -0
- package/dist/signal/session/SignalProtocol.js +164 -53
- package/dist/signal/session/SignalRatchet.js +24 -15
- package/dist/signal/session/SignalSession.js +14 -9
- package/dist/signal/session/resolver.js +224 -0
- package/dist/store/contracts/privacy-token.store.js +2 -0
- package/dist/store/createStore.js +100 -188
- package/dist/store/index.js +15 -33
- package/dist/store/locks/appstate.lock.js +29 -0
- package/dist/store/locks/auth.lock.js +18 -0
- package/dist/store/locks/contact.lock.js +23 -0
- package/dist/store/locks/device-list.lock.js +23 -0
- package/dist/store/locks/message.lock.js +24 -0
- package/dist/store/locks/participants.lock.js +23 -0
- package/dist/store/locks/privacy-token.lock.js +21 -0
- package/dist/store/locks/retry.lock.js +32 -0
- package/dist/store/locks/sender-key.lock.js +55 -0
- package/dist/store/locks/signal.lock.js +66 -0
- package/dist/store/locks/thread.lock.js +24 -0
- package/dist/store/noop.store.js +4 -7
- package/dist/store/providers/memory/appstate.store.js +36 -14
- package/dist/store/providers/memory/contact.store.js +5 -0
- package/dist/store/providers/memory/device-list.store.js +12 -34
- package/dist/store/providers/memory/message.store.js +11 -5
- package/dist/store/providers/memory/participants.store.js +1 -8
- package/dist/store/providers/memory/privacy-token.store.js +47 -0
- package/dist/store/providers/memory/retry.store.js +77 -2
- package/dist/store/providers/memory/sender-key.store.js +14 -11
- package/dist/store/providers/memory/signal.store.js +54 -25
- package/dist/store/providers/memory/thread.store.js +5 -0
- package/dist/transport/WaComms.js +30 -26
- package/dist/transport/WaWebSocket.js +148 -18
- package/dist/transport/binary/constants.js +1 -31
- package/dist/transport/binary/decoder.js +8 -8
- package/dist/transport/binary/encoder.js +10 -9
- package/dist/transport/binary/index.js +0 -4
- package/dist/transport/index.js +7 -1
- package/dist/transport/keepalive/WaKeepAlive.js +1 -7
- package/dist/transport/node/WaNodeOrchestrator.js +25 -21
- package/dist/transport/node/WaNodeTransport.js +0 -3
- package/dist/transport/node/builders/{accountSync.js → account-sync.js} +15 -35
- package/dist/transport/node/builders/business.js +137 -0
- package/dist/transport/node/builders/global.js +375 -0
- package/dist/transport/node/builders/index.js +29 -17
- package/dist/transport/node/builders/message.js +64 -236
- package/dist/transport/node/builders/pairing.js +2 -29
- package/dist/transport/node/builders/privacy-token.js +46 -0
- package/dist/transport/node/builders/privacy.js +55 -0
- package/dist/transport/node/builders/profile.js +78 -0
- package/dist/transport/node/builders/retry.js +9 -21
- package/dist/transport/node/builders/usync.js +49 -0
- package/dist/transport/node/helpers.js +131 -4
- package/dist/transport/node/usync.js +8 -0
- package/dist/transport/node/xml.js +35 -14
- package/dist/transport/noise/WaClientPayload.js +13 -13
- package/dist/transport/noise/WaFrameCodec.js +47 -32
- package/dist/transport/noise/WaNoiseCert.js +5 -8
- package/dist/transport/noise/WaNoiseSession.js +77 -29
- package/dist/transport/noise/WaNoiseSocket.js +8 -4
- package/dist/transport/proxy.js +34 -0
- package/dist/transport/stream/parse.js +20 -52
- package/dist/types/appstate/WaAppStateCrypto.d.ts +0 -1
- package/dist/types/appstate/WaAppStateSyncClient.d.ts +5 -2
- package/dist/types/appstate/constants.d.ts +1 -0
- package/dist/types/appstate/encoding.d.ts +7 -0
- package/dist/types/appstate/index.d.ts +3 -3
- package/dist/types/appstate/utils.d.ts +0 -3
- package/dist/types/auth/WaAuthClient.d.ts +10 -12
- package/dist/types/auth/flow/WaAuthCredentialsFlow.d.ts +1 -1
- package/dist/types/auth/index.d.ts +0 -4
- package/dist/types/auth/pairing/WaQrFlow.d.ts +1 -1
- package/dist/types/auth/types.d.ts +7 -9
- package/dist/types/client/WaClient.d.ts +42 -25
- package/dist/types/client/WaClientFactory.d.ts +33 -26
- package/dist/types/client/connection/WaConnectionManager.d.ts +66 -0
- package/dist/types/client/connection/WaKeyShareCoordinator.d.ts +14 -0
- package/dist/types/client/connection/WaReceiptQueue.d.ts +13 -0
- package/dist/types/client/coordinators/WaAppStateMutationCoordinator.d.ts +46 -0
- package/dist/types/client/coordinators/WaBusinessCoordinator.d.ts +57 -0
- package/dist/types/client/coordinators/WaIncomingNodeCoordinator.d.ts +3 -2
- package/dist/types/client/coordinators/WaMessageDispatchCoordinator.d.ts +29 -38
- package/dist/types/client/coordinators/WaPassiveTasksCoordinator.d.ts +4 -0
- package/dist/types/client/coordinators/WaPrivacyCoordinator.d.ts +26 -0
- package/dist/types/client/coordinators/WaProfileCoordinator.d.ts +36 -0
- package/dist/types/client/coordinators/WaRetryCoordinator.d.ts +8 -0
- package/dist/types/client/coordinators/WaStreamControlCoordinator.d.ts +3 -2
- package/dist/types/client/coordinators/WaTrustedContactTokenCoordinator.d.ts +45 -0
- package/dist/types/client/dirty.d.ts +1 -0
- package/dist/types/client/events/devices.d.ts +20 -0
- package/dist/types/client/events/group.d.ts +2 -1
- package/dist/types/client/events/identity.d.ts +9 -0
- package/dist/types/client/events/privacy-token.d.ts +7 -0
- package/dist/types/client/history-sync.d.ts +9 -6
- package/dist/types/client/incoming.d.ts +3 -1
- package/dist/types/client/index.d.ts +1 -1
- package/dist/types/client/mailbox.d.ts +3 -5
- package/dist/types/client/messages.d.ts +1 -2
- package/dist/types/client/messaging/fanout.d.ts +14 -0
- package/dist/types/client/messaging/key-protocol.d.ts +18 -0
- package/dist/types/client/messaging/participants.d.ts +13 -0
- package/dist/types/client/persistence/WriteBehindPersistence.d.ts +34 -0
- package/dist/types/client/tokens/cs-token.d.ts +10 -0
- package/dist/types/client/tokens/tc-token.d.ts +5 -0
- package/dist/types/client/types.d.ts +75 -4
- package/dist/types/crypto/core/hkdf.d.ts +0 -6
- package/dist/types/crypto/core/index.d.ts +2 -3
- package/dist/types/crypto/core/nonce.d.ts +2 -0
- package/dist/types/crypto/core/primitives.d.ts +0 -1
- package/dist/types/crypto/core/random.d.ts +2 -7
- package/dist/types/crypto/index.d.ts +0 -1
- package/dist/types/crypto/math/constants.d.ts +4 -2
- package/dist/types/crypto/math/fe.d.ts +30 -0
- package/dist/types/crypto/math/mod.d.ts +0 -2
- package/dist/types/crypto/math/types.d.ts +11 -4
- package/dist/types/index.d.ts +5 -3
- package/dist/types/infra/log/ConsoleLogger.d.ts +2 -1
- package/dist/types/infra/log/PinoLogger.d.ts +1 -1
- package/dist/types/infra/log/types.d.ts +1 -0
- package/dist/types/infra/perf/BackgroundQueue.d.ts +58 -0
- package/dist/types/infra/perf/BoundedTaskQueue.d.ts +1 -1
- package/dist/types/infra/perf/PromiseDedup.d.ts +4 -0
- package/dist/types/infra/perf/SharedExclusiveGate.d.ts +17 -0
- package/dist/types/infra/perf/StoreLock.d.ts +10 -0
- package/dist/types/media/WaMediaCrypto.d.ts +3 -2
- package/dist/types/media/WaMediaTransferClient.d.ts +16 -15
- package/dist/types/media/constants.d.ts +1 -1
- package/dist/types/media/index.d.ts +1 -1
- package/dist/types/media/types.d.ts +15 -2
- package/dist/types/message/addon-crypto.d.ts +25 -0
- package/dist/types/message/content.d.ts +8 -0
- package/dist/types/message/icdc.d.ts +13 -0
- package/dist/types/message/index.d.ts +2 -0
- package/dist/types/message/reporting-token.d.ts +18 -0
- package/dist/types/message/types.d.ts +45 -6
- package/dist/types/message/use-case-secret.d.ts +20 -0
- package/dist/types/protocol/appstate.d.ts +47 -0
- package/dist/types/protocol/constants.d.ts +8 -3
- package/dist/types/protocol/defaults.d.ts +6 -0
- package/dist/types/protocol/index.d.ts +2 -11
- package/dist/types/protocol/jid.d.ts +22 -5
- package/dist/types/protocol/message.d.ts +60 -0
- package/dist/types/protocol/nodes.d.ts +4 -0
- package/dist/types/protocol/notification.d.ts +2 -0
- package/dist/types/protocol/privacy-token.d.ts +17 -0
- package/dist/types/protocol/privacy.d.ts +75 -0
- package/dist/types/protocol/stream.d.ts +30 -0
- package/dist/types/protocol/usync.d.ts +11 -0
- package/dist/types/retry/codec.d.ts +3 -0
- package/dist/types/retry/index.d.ts +4 -3
- package/dist/types/retry/parse.d.ts +5 -2
- package/dist/types/retry/replay.d.ts +0 -4
- package/dist/types/retry/tracker.d.ts +20 -0
- package/dist/types/retry/types.d.ts +10 -4
- package/dist/types/signal/api/SignalDeviceSyncApi.d.ts +15 -2
- package/dist/types/signal/api/SignalDigestSyncApi.d.ts +6 -0
- package/dist/types/signal/api/SignalIdentitySyncApi.d.ts +2 -0
- package/dist/types/signal/api/SignalRotateKeyApi.d.ts +4 -5
- package/dist/types/signal/api/SignalSessionSyncApi.d.ts +8 -6
- package/dist/types/signal/api/result-map.d.ts +1 -0
- package/dist/types/signal/constants.d.ts +0 -3
- package/dist/types/signal/{store/sqlite.d.ts → encoding.d.ts} +3 -3
- package/dist/types/signal/group/SenderKeyCodec.d.ts +4 -6
- package/dist/types/signal/group/SenderKeyManager.d.ts +10 -5
- package/dist/types/signal/index.d.ts +3 -0
- package/dist/types/signal/session/SignalProtocol.d.ts +19 -4
- package/dist/types/signal/session/resolver.d.ts +22 -0
- package/dist/types/store/contracts/appstate.store.d.ts +4 -1
- package/dist/types/store/contracts/contact.store.d.ts +1 -0
- package/dist/types/store/contracts/device-list.store.d.ts +0 -3
- package/dist/types/store/contracts/message.store.d.ts +1 -0
- package/dist/types/store/contracts/participants.store.d.ts +0 -1
- package/dist/types/store/contracts/privacy-token.store.d.ts +16 -0
- package/dist/types/store/contracts/retry.store.d.ts +7 -0
- package/dist/types/store/contracts/sender-key.store.d.ts +0 -1
- package/dist/types/store/contracts/signal.store.d.ts +13 -0
- package/dist/types/store/contracts/thread.store.d.ts +1 -0
- package/dist/types/store/createStore.d.ts +1 -1
- package/dist/types/store/index.d.ts +5 -13
- package/dist/types/store/locks/appstate.lock.d.ts +3 -0
- package/dist/types/store/locks/auth.lock.d.ts +3 -0
- package/dist/types/store/locks/contact.lock.d.ts +3 -0
- package/dist/types/store/locks/device-list.lock.d.ts +2 -0
- package/dist/types/store/locks/message.lock.d.ts +3 -0
- package/dist/types/store/locks/participants.lock.d.ts +2 -0
- package/dist/types/store/locks/privacy-token.lock.d.ts +2 -0
- package/dist/types/store/locks/retry.lock.d.ts +2 -0
- package/dist/types/store/locks/sender-key.lock.d.ts +3 -0
- package/dist/types/store/locks/signal.lock.d.ts +3 -0
- package/dist/types/store/locks/thread.lock.d.ts +3 -0
- package/dist/types/store/providers/memory/appstate.store.d.ts +3 -1
- package/dist/types/store/providers/memory/contact.store.d.ts +1 -0
- package/dist/types/store/providers/memory/device-list.store.d.ts +0 -3
- package/dist/types/store/providers/memory/message.store.d.ts +1 -0
- package/dist/types/store/providers/memory/participants.store.d.ts +0 -1
- package/dist/types/store/providers/memory/privacy-token.store.d.ts +13 -0
- package/dist/types/store/providers/memory/retry.store.d.ts +8 -0
- package/dist/types/store/providers/memory/sender-key.store.d.ts +0 -1
- package/dist/types/store/providers/memory/signal.store.d.ts +8 -1
- package/dist/types/store/providers/memory/thread.store.d.ts +1 -0
- package/dist/types/store/types.d.ts +49 -58
- package/dist/types/transport/WaWebSocket.d.ts +3 -1
- package/dist/types/transport/binary/constants.d.ts +0 -30
- package/dist/types/transport/binary/index.d.ts +0 -1
- package/dist/types/transport/index.d.ts +2 -1
- package/dist/types/transport/keepalive/WaKeepAlive.d.ts +0 -1
- package/dist/types/transport/node/WaNodeOrchestrator.d.ts +3 -4
- package/dist/types/transport/node/WaNodeTransport.d.ts +0 -9
- package/dist/types/transport/node/builders/business.d.ts +29 -0
- package/dist/types/transport/node/builders/global.d.ts +102 -0
- package/dist/types/transport/node/builders/group.d.ts +4 -6
- package/dist/types/transport/node/builders/index.d.ts +7 -3
- package/dist/types/transport/node/builders/message.d.ts +20 -30
- package/dist/types/transport/node/builders/pairing.d.ts +0 -2
- package/dist/types/transport/node/builders/privacy-token.d.ts +9 -0
- package/dist/types/transport/node/builders/privacy.d.ts +7 -0
- package/dist/types/transport/node/builders/profile.d.ts +8 -0
- package/dist/types/transport/node/builders/retry.d.ts +2 -5
- package/dist/types/transport/node/builders/usync.d.ts +21 -0
- package/dist/types/transport/node/helpers.d.ts +13 -0
- package/dist/types/transport/node/usync.d.ts +2 -0
- package/dist/types/transport/noise/WaFrameCodec.d.ts +3 -0
- package/dist/types/transport/noise/WaNoiseSession.d.ts +4 -2
- package/dist/types/transport/noise/WaNoiseSocket.d.ts +4 -2
- package/dist/types/transport/proxy.d.ts +6 -0
- package/dist/types/transport/stream/parse.d.ts +0 -1
- package/dist/types/transport/types.d.ts +18 -1
- package/dist/types/util/bytes.d.ts +5 -0
- package/dist/types/util/index.d.ts +5 -0
- package/dist/types/util/primitives.d.ts +2 -0
- package/dist/util/bytes.js +72 -46
- package/dist/util/coercion.js +6 -14
- package/dist/util/index.js +23 -0
- package/dist/util/primitives.js +42 -14
- package/package.json +52 -9
- package/proto/index.js +1 -1
- package/dist/crypto/core/constants.js +0 -4
- package/dist/crypto/core/encoding.js +0 -29
- package/dist/esm/crypto/core/constants.js +0 -1
- package/dist/esm/crypto/core/encoding.js +0 -25
- package/dist/esm/retry/outbound.js +0 -83
- package/dist/esm/store/providers/sqlite/BaseSqliteStore.js +0 -37
- package/dist/esm/store/providers/sqlite/appstate.store.js +0 -169
- package/dist/esm/store/providers/sqlite/auth.store.js +0 -176
- package/dist/esm/store/providers/sqlite/connection.js +0 -240
- package/dist/esm/store/providers/sqlite/contact.store.js +0 -61
- package/dist/esm/store/providers/sqlite/device-list.store.js +0 -155
- package/dist/esm/store/providers/sqlite/message.store.js +0 -119
- package/dist/esm/store/providers/sqlite/migrations.js +0 -347
- package/dist/esm/store/providers/sqlite/participants.store.js +0 -85
- package/dist/esm/store/providers/sqlite/retry.store.js +0 -144
- package/dist/esm/store/providers/sqlite/sender-key.store.js +0 -203
- package/dist/esm/store/providers/sqlite/signal.store.js +0 -353
- package/dist/esm/store/providers/sqlite/thread.store.js +0 -72
- package/dist/esm/util/base64.js +0 -18
- package/dist/esm/util/signal-address.js +0 -5
- package/dist/retry/outbound.js +0 -88
- package/dist/store/providers/sqlite/BaseSqliteStore.js +0 -41
- package/dist/store/providers/sqlite/appstate.store.js +0 -173
- package/dist/store/providers/sqlite/auth.store.js +0 -180
- package/dist/store/providers/sqlite/connection.js +0 -276
- package/dist/store/providers/sqlite/contact.store.js +0 -65
- package/dist/store/providers/sqlite/device-list.store.js +0 -159
- package/dist/store/providers/sqlite/message.store.js +0 -123
- package/dist/store/providers/sqlite/migrations.js +0 -350
- package/dist/store/providers/sqlite/participants.store.js +0 -89
- package/dist/store/providers/sqlite/retry.store.js +0 -148
- package/dist/store/providers/sqlite/sender-key.store.js +0 -207
- package/dist/store/providers/sqlite/signal.store.js +0 -357
- package/dist/store/providers/sqlite/thread.store.js +0 -76
- package/dist/types/appstate/store/sqlite.d.ts +0 -21
- package/dist/types/crypto/core/constants.d.ts +0 -1
- package/dist/types/crypto/core/encoding.d.ts +0 -11
- package/dist/types/retry/outbound.d.ts +0 -4
- package/dist/types/store/providers/sqlite/BaseSqliteStore.d.ts +0 -12
- package/dist/types/store/providers/sqlite/appstate.store.d.ts +0 -15
- package/dist/types/store/providers/sqlite/auth.store.d.ts +0 -10
- package/dist/types/store/providers/sqlite/connection.d.ts +0 -10
- package/dist/types/store/providers/sqlite/contact.store.d.ts +0 -10
- package/dist/types/store/providers/sqlite/device-list.store.d.ts +0 -18
- package/dist/types/store/providers/sqlite/message.store.d.ts +0 -11
- package/dist/types/store/providers/sqlite/migrations.d.ts +0 -3
- package/dist/types/store/providers/sqlite/participants.store.d.ts +0 -13
- package/dist/types/store/providers/sqlite/retry.store.d.ts +0 -16
- package/dist/types/store/providers/sqlite/sender-key.store.d.ts +0 -25
- package/dist/types/store/providers/sqlite/signal.store.d.ts +0 -46
- package/dist/types/store/providers/sqlite/thread.store.d.ts +0 -11
- package/dist/types/util/base64.d.ts +0 -4
- package/dist/types/util/signal-address.d.ts +0 -2
- package/dist/util/base64.js +0 -24
- package/dist/util/signal-address.js +0 -8
- /package/dist/types/transport/node/builders/{accountSync.d.ts → account-sync.d.ts} +0 -0
|
@@ -4,18 +4,34 @@ exports.resolveWaClientBase = resolveWaClientBase;
|
|
|
4
4
|
exports.buildWaClientDependencies = buildWaClientDependencies;
|
|
5
5
|
const WaAppStateSyncClient_1 = require("../appstate/WaAppStateSyncClient");
|
|
6
6
|
const WaAuthClient_1 = require("../auth/WaAuthClient");
|
|
7
|
+
const WaConnectionManager_1 = require("./connection/WaConnectionManager");
|
|
8
|
+
const WaKeyShareCoordinator_1 = require("./connection/WaKeyShareCoordinator");
|
|
9
|
+
const WaReceiptQueue_1 = require("./connection/WaReceiptQueue");
|
|
10
|
+
const WaAppStateMutationCoordinator_1 = require("./coordinators/WaAppStateMutationCoordinator");
|
|
11
|
+
const WaBusinessCoordinator_1 = require("./coordinators/WaBusinessCoordinator");
|
|
7
12
|
const WaGroupCoordinator_1 = require("./coordinators/WaGroupCoordinator");
|
|
8
13
|
const WaIncomingNodeCoordinator_1 = require("./coordinators/WaIncomingNodeCoordinator");
|
|
9
14
|
const WaMessageDispatchCoordinator_1 = require("./coordinators/WaMessageDispatchCoordinator");
|
|
10
15
|
const WaPassiveTasksCoordinator_1 = require("./coordinators/WaPassiveTasksCoordinator");
|
|
16
|
+
const WaPrivacyCoordinator_1 = require("./coordinators/WaPrivacyCoordinator");
|
|
17
|
+
const WaProfileCoordinator_1 = require("./coordinators/WaProfileCoordinator");
|
|
11
18
|
const WaRetryCoordinator_1 = require("./coordinators/WaRetryCoordinator");
|
|
12
19
|
const WaStreamControlCoordinator_1 = require("./coordinators/WaStreamControlCoordinator");
|
|
20
|
+
const WaTrustedContactTokenCoordinator_1 = require("./coordinators/WaTrustedContactTokenCoordinator");
|
|
13
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");
|
|
14
25
|
const messages_1 = require("./messages");
|
|
26
|
+
const fanout_1 = require("./messaging/fanout");
|
|
27
|
+
const key_protocol_1 = require("./messaging/key-protocol");
|
|
28
|
+
const participants_1 = require("./messaging/participants");
|
|
15
29
|
const WaMediaTransferClient_1 = require("../media/WaMediaTransferClient");
|
|
16
30
|
const incoming_1 = require("../message/incoming");
|
|
17
31
|
const WaMessageClient_1 = require("../message/WaMessageClient");
|
|
18
32
|
const constants_1 = require("../protocol/constants");
|
|
33
|
+
const jid_1 = require("../protocol/jid");
|
|
34
|
+
const tracker_1 = require("../retry/tracker");
|
|
19
35
|
const SignalDeviceSyncApi_1 = require("../signal/api/SignalDeviceSyncApi");
|
|
20
36
|
const SignalDigestSyncApi_1 = require("../signal/api/SignalDigestSyncApi");
|
|
21
37
|
const SignalIdentitySyncApi_1 = require("../signal/api/SignalIdentitySyncApi");
|
|
@@ -23,13 +39,40 @@ const SignalMissingPreKeysSyncApi_1 = require("../signal/api/SignalMissingPreKey
|
|
|
23
39
|
const SignalRotateKeyApi_1 = require("../signal/api/SignalRotateKeyApi");
|
|
24
40
|
const SignalSessionSyncApi_1 = require("../signal/api/SignalSessionSyncApi");
|
|
25
41
|
const SenderKeyManager_1 = require("../signal/group/SenderKeyManager");
|
|
42
|
+
const resolver_1 = require("../signal/session/resolver");
|
|
26
43
|
const SignalProtocol_1 = require("../signal/session/SignalProtocol");
|
|
27
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");
|
|
47
|
+
const usync_1 = require("../transport/node/usync");
|
|
28
48
|
const WaNodeOrchestrator_1 = require("../transport/node/WaNodeOrchestrator");
|
|
29
49
|
const WaNodeTransport_1 = require("../transport/node/WaNodeTransport");
|
|
50
|
+
const proxy_1 = require("../transport/proxy");
|
|
30
51
|
const primitives_1 = require("../util/primitives");
|
|
31
52
|
const runtime_1 = require("../util/runtime");
|
|
53
|
+
function assertProxyTransport(value, path) {
|
|
54
|
+
if (value === undefined) {
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
if (!(0, proxy_1.isProxyTransport)(value)) {
|
|
58
|
+
throw new Error(`${path} must be a proxy transport instance (dispatcher with dispatch(...) or agent with addRequest(...))`);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
function validateProxyOptions(options) {
|
|
62
|
+
const rawProxy = options.proxy;
|
|
63
|
+
if (rawProxy === undefined) {
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
if (typeof rawProxy !== 'object' || rawProxy === null || Array.isArray(rawProxy)) {
|
|
67
|
+
throw new Error('proxy must be an object with optional ws/mediaUpload/mediaDownload');
|
|
68
|
+
}
|
|
69
|
+
const proxy = rawProxy;
|
|
70
|
+
assertProxyTransport(proxy?.ws, 'proxy.ws');
|
|
71
|
+
assertProxyTransport(proxy?.mediaUpload, 'proxy.mediaUpload');
|
|
72
|
+
assertProxyTransport(proxy?.mediaDownload, 'proxy.mediaDownload');
|
|
73
|
+
}
|
|
32
74
|
function resolveWaClientBase(options, logger) {
|
|
75
|
+
validateProxyOptions(options);
|
|
33
76
|
const deviceBrowser = options.deviceBrowser ?? constants_1.WA_DEFAULTS.DEVICE_BROWSER;
|
|
34
77
|
const sessionId = options.sessionId.trim();
|
|
35
78
|
if (sessionId.length === 0) {
|
|
@@ -61,79 +104,14 @@ function resolveWaClientBase(options, logger) {
|
|
|
61
104
|
sessionStore
|
|
62
105
|
};
|
|
63
106
|
}
|
|
64
|
-
function createAuthClient(input) {
|
|
65
|
-
const { options, logger, sessionStore, host } = input;
|
|
66
|
-
return new WaAuthClient_1.WaAuthClient({
|
|
67
|
-
deviceBrowser: options.deviceBrowser,
|
|
68
|
-
deviceOsDisplayName: options.deviceOsDisplayName,
|
|
69
|
-
devicePlatform: options.devicePlatform,
|
|
70
|
-
requireFullSync: options.requireFullSync
|
|
71
|
-
}, {
|
|
72
|
-
logger,
|
|
73
|
-
authStore: sessionStore.auth,
|
|
74
|
-
signalStore: sessionStore.signal,
|
|
75
|
-
socket: {
|
|
76
|
-
sendNode: host.sendNode,
|
|
77
|
-
query: host.query
|
|
78
|
-
},
|
|
79
|
-
callbacks: {
|
|
80
|
-
onQr: (qr, ttlMs) => host.emitEvent('auth_qr', { qr, ttlMs }),
|
|
81
|
-
onPairingCode: (code) => host.emitEvent('auth_pairing_code', { code }),
|
|
82
|
-
onPairingRefresh: (forceManual) => host.emitEvent('auth_pairing_refresh', { forceManual }),
|
|
83
|
-
onPaired: (credentials) => {
|
|
84
|
-
host.emitEvent('auth_paired', { credentials });
|
|
85
|
-
host.scheduleReconnectAfterPairing();
|
|
86
|
-
},
|
|
87
|
-
onError: (error) => host.handleError(error)
|
|
88
|
-
}
|
|
89
|
-
});
|
|
90
|
-
}
|
|
91
|
-
function createCurrentAuthGetters(authClient) {
|
|
92
|
-
const getCurrentCredentials = () => authClient.getCurrentCredentials();
|
|
93
|
-
return {
|
|
94
|
-
getCurrentCredentials,
|
|
95
|
-
getCurrentMeJid: () => getCurrentCredentials()?.meJid,
|
|
96
|
-
getCurrentMeLid: () => getCurrentCredentials()?.meLid,
|
|
97
|
-
getCurrentSignedIdentity: () => getCurrentCredentials()?.signedIdentity
|
|
98
|
-
};
|
|
99
|
-
}
|
|
100
|
-
function createIncomingMessageAckOptions(input) {
|
|
101
|
-
const { logger, host, getCurrentMeJid, signalProtocol, senderKeyManager, retryCoordinator } = input;
|
|
102
|
-
return {
|
|
103
|
-
logger,
|
|
104
|
-
sendNode: host.sendNode,
|
|
105
|
-
getMeJid: getCurrentMeJid,
|
|
106
|
-
signalProtocol,
|
|
107
|
-
senderKeyManager,
|
|
108
|
-
onDecryptFailure: (context, error) => retryCoordinator.onDecryptFailure(context, error),
|
|
109
|
-
emitIncomingMessage: (event) => {
|
|
110
|
-
void host
|
|
111
|
-
.handleIncomingMessageEvent(event)
|
|
112
|
-
.catch((err) => host.handleError((0, primitives_1.toError)(err)));
|
|
113
|
-
},
|
|
114
|
-
emitUnhandledStanza: (event) => host.emitEvent('stanza_unhandled', event)
|
|
115
|
-
};
|
|
116
|
-
}
|
|
117
|
-
function createHandleClientDirtyBits(input) {
|
|
118
|
-
const { logger, host, getCurrentCredentials } = input;
|
|
119
|
-
return (dirtyBits) => (0, dirty_1.handleDirtyBits)({
|
|
120
|
-
logger,
|
|
121
|
-
queryWithContext: host.queryWithContext,
|
|
122
|
-
getCurrentCredentials,
|
|
123
|
-
syncAppState: host.syncAppState
|
|
124
|
-
}, dirtyBits);
|
|
125
|
-
}
|
|
126
107
|
function createIncomingNodeRuntime(input) {
|
|
127
|
-
const { logger,
|
|
108
|
+
const { logger, emitEvent, authClient, connectionManager, nodeOrchestrator, streamControl, mediaMessageBuildOptions, retryCoordinator, messageDispatch, sendNode, syncAppState, disconnect, clearStoredCredentials, getCurrentMeJid, handleClientDirtyBits, incomingMessageAckOptions } = input;
|
|
128
109
|
return {
|
|
129
110
|
handleStreamControlResult: streamControl.handleStreamControlResult,
|
|
130
111
|
persistSuccessAttributes: (attributes) => authClient.persistSuccessAttributes(attributes),
|
|
131
|
-
emitSuccessNode: (node) =>
|
|
132
|
-
updateClockSkewFromSuccess:
|
|
133
|
-
shouldWarmupMediaConn: () =>
|
|
134
|
-
const comms = host.getComms();
|
|
135
|
-
return !!(getCurrentMeJid() && comms && comms.getCommsState().connected);
|
|
136
|
-
},
|
|
112
|
+
emitSuccessNode: (node) => emitEvent('connection_success', { node }),
|
|
113
|
+
updateClockSkewFromSuccess: (serverUnixSeconds) => connectionManager.updateClockSkewFromSuccess(serverUnixSeconds),
|
|
114
|
+
shouldWarmupMediaConn: () => !!(getCurrentMeJid() && connectionManager.isConnected()),
|
|
137
115
|
warmupMediaConn: async () => {
|
|
138
116
|
await (0, messages_1.getMediaConn)(mediaMessageBuildOptions, true);
|
|
139
117
|
},
|
|
@@ -144,18 +122,18 @@ function createIncomingNodeRuntime(input) {
|
|
|
144
122
|
handleLinkCodeNotificationNode: (node) => authClient.handleLinkCodeNotification(node),
|
|
145
123
|
handleCompanionRegRefreshNotificationNode: (node) => authClient.handleCompanionRegRefreshNotification(node),
|
|
146
124
|
handleIncomingMessageNode: (node) => (0, incoming_1.handleIncomingMessageAck)(node, incomingMessageAckOptions),
|
|
147
|
-
sendNode
|
|
125
|
+
sendNode,
|
|
148
126
|
handleIncomingRetryReceipt: (node) => retryCoordinator.handleIncomingRetryReceipt(node),
|
|
149
127
|
trackOutboundReceipt: (node) => retryCoordinator.trackOutboundReceipt(node),
|
|
150
|
-
emitIncomingReceipt: (event) =>
|
|
151
|
-
emitIncomingPresence: (event) =>
|
|
152
|
-
emitIncomingChatstate: (event) =>
|
|
153
|
-
emitIncomingCall: (event) =>
|
|
154
|
-
emitIncomingFailure: (event) =>
|
|
155
|
-
emitIncomingErrorStanza: (event) =>
|
|
156
|
-
emitIncomingNotification: (event) =>
|
|
128
|
+
emitIncomingReceipt: (event) => emitEvent('message_receipt', event),
|
|
129
|
+
emitIncomingPresence: (event) => emitEvent('presence', event),
|
|
130
|
+
emitIncomingChatstate: (event) => emitEvent('chatstate', event),
|
|
131
|
+
emitIncomingCall: (event) => emitEvent('call', event),
|
|
132
|
+
emitIncomingFailure: (event) => emitEvent('failure', event),
|
|
133
|
+
emitIncomingErrorStanza: (event) => emitEvent('stanza_error', event),
|
|
134
|
+
emitIncomingNotification: (event) => emitEvent('notification', event),
|
|
157
135
|
emitGroupEvent: (event) => {
|
|
158
|
-
|
|
136
|
+
emitEvent('group_event', event);
|
|
159
137
|
void messageDispatch.mutateParticipantsCacheFromGroupEvent(event).catch((error) => {
|
|
160
138
|
logger.warn('failed to mutate participants cache from group event', {
|
|
161
139
|
action: event.action,
|
|
@@ -165,29 +143,38 @@ function createIncomingNodeRuntime(input) {
|
|
|
165
143
|
});
|
|
166
144
|
});
|
|
167
145
|
},
|
|
168
|
-
emitUnhandledIncomingNode: (event) =>
|
|
169
|
-
syncAppState
|
|
170
|
-
|
|
171
|
-
|
|
146
|
+
emitUnhandledIncomingNode: (event) => emitEvent('stanza_unhandled', event),
|
|
147
|
+
syncAppState,
|
|
148
|
+
stopComms: () => {
|
|
149
|
+
void connectionManager.getComms()?.stopComms();
|
|
150
|
+
},
|
|
151
|
+
disconnect,
|
|
152
|
+
clearStoredCredentials,
|
|
172
153
|
parseDirtyBits: (nodes) => (0, dirty_1.parseDirtyBits)(nodes, logger),
|
|
173
154
|
handleDirtyBits: (dirtyBits) => handleClientDirtyBits(dirtyBits)
|
|
174
155
|
};
|
|
175
156
|
}
|
|
176
157
|
function createPassiveTasksRuntime(input) {
|
|
177
|
-
const {
|
|
158
|
+
const { queryWithContext, authClient, nodeOrchestrator, receiptQueue, getCurrentCredentials } = input;
|
|
178
159
|
return {
|
|
179
|
-
queryWithContext
|
|
160
|
+
queryWithContext,
|
|
180
161
|
getCurrentCredentials,
|
|
181
162
|
persistServerHasPreKeys: (serverHasPreKeys) => authClient.persistServerHasPreKeys(serverHasPreKeys),
|
|
182
163
|
sendNodeDirect: (node) => nodeOrchestrator.sendNode(node),
|
|
183
|
-
takeDanglingReceipts:
|
|
184
|
-
requeueDanglingReceipt:
|
|
185
|
-
shouldQueueDanglingReceipt:
|
|
164
|
+
takeDanglingReceipts: () => receiptQueue.take(),
|
|
165
|
+
requeueDanglingReceipt: (node) => receiptQueue.enqueue(node),
|
|
166
|
+
shouldQueueDanglingReceipt: (node, error) => receiptQueue.shouldQueue(node, error)
|
|
186
167
|
};
|
|
187
168
|
}
|
|
188
169
|
function buildWaClientDependencies(input) {
|
|
189
|
-
const { base,
|
|
170
|
+
const { base, runtime } = input;
|
|
190
171
|
const { options, logger, sessionStore } = base;
|
|
172
|
+
const receiptQueue = new WaReceiptQueue_1.WaReceiptQueue();
|
|
173
|
+
const keyShareCoordinator = new WaKeyShareCoordinator_1.WaKeyShareCoordinator();
|
|
174
|
+
let connectionManager = null;
|
|
175
|
+
let passiveTasks = null;
|
|
176
|
+
let mediaConnCacheFallback = null;
|
|
177
|
+
let scheduleReconnectAfterPairing = () => undefined;
|
|
191
178
|
const nodeTransport = new WaNodeTransport_1.WaNodeTransport(logger);
|
|
192
179
|
const nodeOrchestrator = new WaNodeOrchestrator_1.WaNodeOrchestrator({
|
|
193
180
|
sendNode: async (node) => nodeTransport.sendNode(node),
|
|
@@ -198,27 +185,39 @@ function buildWaClientDependencies(input) {
|
|
|
198
185
|
const keepAlive = new WaKeepAlive_1.WaKeepAlive({
|
|
199
186
|
logger,
|
|
200
187
|
nodeOrchestrator,
|
|
201
|
-
getComms:
|
|
188
|
+
getComms: () => connectionManager?.getComms() ?? null,
|
|
202
189
|
intervalMs: options.keepAliveIntervalMs,
|
|
203
190
|
timeoutMs: options.deadSocketTimeoutMs,
|
|
204
191
|
hostDomain: constants_1.WA_DEFAULTS.HOST_DOMAIN
|
|
205
192
|
});
|
|
206
193
|
const mediaTransfer = new WaMediaTransferClient_1.WaMediaTransferClient({
|
|
207
194
|
logger,
|
|
208
|
-
defaultTimeoutMs: options.mediaTimeoutMs
|
|
195
|
+
defaultTimeoutMs: options.mediaTimeoutMs,
|
|
196
|
+
defaultUploadDispatcher: (0, proxy_1.toProxyDispatcher)(options.proxy?.mediaUpload),
|
|
197
|
+
defaultDownloadDispatcher: (0, proxy_1.toProxyDispatcher)(options.proxy?.mediaDownload),
|
|
198
|
+
defaultUploadAgent: (0, proxy_1.toProxyAgent)(options.proxy?.mediaUpload),
|
|
199
|
+
defaultDownloadAgent: (0, proxy_1.toProxyAgent)(options.proxy?.mediaDownload)
|
|
209
200
|
});
|
|
210
201
|
const mediaMessageBuildOptions = {
|
|
211
202
|
logger,
|
|
212
203
|
mediaTransfer,
|
|
213
204
|
iqTimeoutMs: options.iqTimeoutMs,
|
|
214
|
-
queryWithContext:
|
|
215
|
-
getMediaConnCache:
|
|
216
|
-
|
|
205
|
+
queryWithContext: runtime.queryWithContext,
|
|
206
|
+
getMediaConnCache: () => {
|
|
207
|
+
if (connectionManager) {
|
|
208
|
+
return connectionManager.getMediaConnCache();
|
|
209
|
+
}
|
|
210
|
+
return mediaConnCacheFallback;
|
|
211
|
+
},
|
|
212
|
+
setMediaConnCache: (mediaConn) => {
|
|
213
|
+
mediaConnCacheFallback = mediaConn;
|
|
214
|
+
connectionManager?.setMediaConnCache(mediaConn);
|
|
215
|
+
}
|
|
217
216
|
};
|
|
218
217
|
const messageClient = new WaMessageClient_1.WaMessageClient({
|
|
219
218
|
logger,
|
|
220
|
-
sendNode:
|
|
221
|
-
query:
|
|
219
|
+
sendNode: runtime.sendNode,
|
|
220
|
+
query: runtime.query,
|
|
222
221
|
defaultAckTimeoutMs: options.messageAckTimeoutMs,
|
|
223
222
|
defaultMaxAttempts: options.messageMaxAttempts,
|
|
224
223
|
defaultRetryDelayMs: options.messageRetryDelayMs
|
|
@@ -227,59 +226,156 @@ function buildWaClientDependencies(input) {
|
|
|
227
226
|
const signalProtocol = new SignalProtocol_1.SignalProtocol(sessionStore.signal, logger);
|
|
228
227
|
const signalDigestSync = new SignalDigestSyncApi_1.SignalDigestSyncApi({
|
|
229
228
|
logger,
|
|
230
|
-
query:
|
|
229
|
+
query: runtime.query,
|
|
231
230
|
signalStore: sessionStore.signal,
|
|
232
231
|
defaultTimeoutMs: options.signalFetchKeyBundlesTimeoutMs
|
|
233
232
|
});
|
|
233
|
+
const generateUsyncSid = (0, usync_1.createUsyncSidGenerator)();
|
|
234
234
|
const signalDeviceSync = new SignalDeviceSyncApi_1.SignalDeviceSyncApi({
|
|
235
235
|
logger,
|
|
236
|
-
query:
|
|
236
|
+
query: runtime.query,
|
|
237
237
|
deviceListStore: sessionStore.deviceList,
|
|
238
|
-
defaultTimeoutMs: options.signalFetchKeyBundlesTimeoutMs
|
|
238
|
+
defaultTimeoutMs: options.signalFetchKeyBundlesTimeoutMs,
|
|
239
|
+
generateSid: generateUsyncSid
|
|
239
240
|
});
|
|
240
241
|
const signalIdentitySync = new SignalIdentitySyncApi_1.SignalIdentitySyncApi({
|
|
241
242
|
logger,
|
|
242
|
-
query:
|
|
243
|
+
query: runtime.query,
|
|
243
244
|
signalStore: sessionStore.signal,
|
|
244
245
|
defaultTimeoutMs: options.signalFetchKeyBundlesTimeoutMs
|
|
245
246
|
});
|
|
246
247
|
const signalMissingPreKeysSync = new SignalMissingPreKeysSyncApi_1.SignalMissingPreKeysSyncApi({
|
|
247
248
|
logger,
|
|
248
|
-
query:
|
|
249
|
+
query: runtime.query,
|
|
249
250
|
defaultTimeoutMs: options.signalFetchKeyBundlesTimeoutMs
|
|
250
251
|
});
|
|
251
252
|
const signalRotateKey = new SignalRotateKeyApi_1.SignalRotateKeyApi({
|
|
252
253
|
logger,
|
|
253
|
-
query:
|
|
254
|
+
query: runtime.query,
|
|
254
255
|
signalStore: sessionStore.signal,
|
|
255
256
|
defaultTimeoutMs: options.signalFetchKeyBundlesTimeoutMs
|
|
256
257
|
});
|
|
257
258
|
const signalSessionSync = new SignalSessionSyncApi_1.SignalSessionSyncApi({
|
|
258
259
|
logger,
|
|
259
|
-
query:
|
|
260
|
+
query: runtime.query,
|
|
260
261
|
defaultTimeoutMs: options.signalFetchKeyBundlesTimeoutMs
|
|
261
262
|
});
|
|
262
|
-
const authClient =
|
|
263
|
-
|
|
263
|
+
const authClient = new WaAuthClient_1.WaAuthClient({
|
|
264
|
+
deviceBrowser: options.deviceBrowser,
|
|
265
|
+
deviceOsDisplayName: options.deviceOsDisplayName,
|
|
266
|
+
devicePlatform: options.devicePlatform,
|
|
267
|
+
requireFullSync: options.requireFullSync,
|
|
268
|
+
version: options.version
|
|
269
|
+
}, {
|
|
270
|
+
logger,
|
|
271
|
+
authStore: sessionStore.auth,
|
|
272
|
+
signalStore: sessionStore.signal,
|
|
273
|
+
socket: {
|
|
274
|
+
sendNode: runtime.sendNode,
|
|
275
|
+
query: runtime.query
|
|
276
|
+
},
|
|
277
|
+
callbacks: {
|
|
278
|
+
onQr: (qr, ttlMs) => runtime.emitEvent('auth_qr', { qr, ttlMs }),
|
|
279
|
+
onPairingCode: (code) => runtime.emitEvent('auth_pairing_code', { code }),
|
|
280
|
+
onPairingRefresh: (forceManual) => runtime.emitEvent('auth_pairing_refresh', { forceManual }),
|
|
281
|
+
onPaired: (credentials) => {
|
|
282
|
+
runtime.emitEvent('auth_paired', { credentials });
|
|
283
|
+
scheduleReconnectAfterPairing();
|
|
284
|
+
},
|
|
285
|
+
onError: (error) => runtime.handleError(error)
|
|
286
|
+
}
|
|
287
|
+
});
|
|
288
|
+
const getCurrentCredentials = authClient.getCurrentCredentials.bind(authClient);
|
|
289
|
+
const getCurrentMeJid = () => getCurrentCredentials()?.meJid;
|
|
290
|
+
const getCurrentMeLid = () => getCurrentCredentials()?.meLid;
|
|
291
|
+
const getCurrentSignedIdentity = () => getCurrentCredentials()?.signedIdentity;
|
|
264
292
|
const groupCoordinator = (0, WaGroupCoordinator_1.createGroupCoordinator)({
|
|
265
|
-
queryWithContext:
|
|
293
|
+
queryWithContext: runtime.queryWithContext
|
|
266
294
|
});
|
|
267
|
-
const
|
|
268
|
-
|
|
269
|
-
|
|
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
|
+
});
|
|
305
|
+
const retryTracker = (0, tracker_1.createOutboundRetryTracker)({
|
|
270
306
|
retryStore: sessionStore.retry,
|
|
307
|
+
logger
|
|
308
|
+
});
|
|
309
|
+
const sessionResolver = (0, resolver_1.createSignalSessionResolver)({
|
|
310
|
+
signalProtocol,
|
|
311
|
+
signalStore: sessionStore.signal,
|
|
312
|
+
signalIdentitySync,
|
|
313
|
+
signalSessionSync,
|
|
314
|
+
logger
|
|
315
|
+
});
|
|
316
|
+
const fanoutResolver = (0, fanout_1.createDeviceFanoutResolver)({
|
|
317
|
+
signalDeviceSync,
|
|
318
|
+
getCurrentMeJid,
|
|
319
|
+
getCurrentMeLid,
|
|
320
|
+
logger
|
|
321
|
+
});
|
|
322
|
+
const participantsCache = (0, participants_1.createGroupParticipantsCache)({
|
|
271
323
|
participantsStore: sessionStore.participants,
|
|
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
|
+
},
|
|
332
|
+
logger
|
|
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
|
+
});
|
|
348
|
+
let messageDispatch;
|
|
349
|
+
const appStateSyncKeyProtocol = (0, key_protocol_1.createAppStateSyncKeyProtocol)({
|
|
350
|
+
publishSignalMessage: (signalInput, publishOptions) => messageDispatch.publishSignalMessage(signalInput, publishOptions),
|
|
351
|
+
fanoutResolver,
|
|
352
|
+
getCurrentMeJid,
|
|
353
|
+
getCurrentMeLid,
|
|
354
|
+
logger
|
|
355
|
+
});
|
|
356
|
+
messageDispatch = new WaMessageDispatchCoordinator_1.WaMessageDispatchCoordinator({
|
|
357
|
+
logger,
|
|
358
|
+
messageClient,
|
|
359
|
+
retryTracker,
|
|
360
|
+
sessionResolver,
|
|
361
|
+
fanoutResolver,
|
|
362
|
+
participantsCache,
|
|
363
|
+
appStateSyncKeyProtocol,
|
|
272
364
|
buildMessageContent: async (content) => (0, messages_1.buildMediaMessageContent)(mediaMessageBuildOptions, content),
|
|
273
|
-
queryGroupParticipantJids: async (groupJid) => (await groupCoordinator.queryGroupMetadata(groupJid)).participants.map((participant) => participant.jid),
|
|
274
365
|
senderKeyManager,
|
|
275
366
|
signalProtocol,
|
|
276
367
|
signalStore: sessionStore.signal,
|
|
277
|
-
|
|
278
|
-
signalIdentitySync,
|
|
279
|
-
signalSessionSync,
|
|
368
|
+
deviceListStore: sessionStore.deviceList,
|
|
280
369
|
getCurrentMeJid,
|
|
281
370
|
getCurrentMeLid,
|
|
282
|
-
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
|
+
}
|
|
283
379
|
});
|
|
284
380
|
const retryCoordinator = new WaRetryCoordinator_1.WaRetryCoordinator({
|
|
285
381
|
logger,
|
|
@@ -290,67 +386,330 @@ function buildWaClientDependencies(input) {
|
|
|
290
386
|
signalDeviceSync,
|
|
291
387
|
signalMissingPreKeysSync,
|
|
292
388
|
messageClient,
|
|
293
|
-
sendNode:
|
|
389
|
+
sendNode: runtime.sendNode,
|
|
294
390
|
getCurrentMeJid,
|
|
295
391
|
getCurrentMeLid,
|
|
296
392
|
getCurrentSignedIdentity
|
|
297
393
|
});
|
|
298
394
|
const appStateSync = new WaAppStateSyncClient_1.WaAppStateSyncClient({
|
|
299
395
|
logger,
|
|
300
|
-
query:
|
|
396
|
+
query: runtime.query,
|
|
397
|
+
getCurrentMeJid,
|
|
301
398
|
defaultTimeoutMs: options.appStateSyncTimeoutMs,
|
|
302
399
|
store: sessionStore.appState,
|
|
303
400
|
onMissingKeys: async ({ keyIds }) => {
|
|
304
401
|
await messageDispatch.requestAppStateSyncKeys(keyIds);
|
|
305
402
|
}
|
|
306
403
|
});
|
|
404
|
+
const appStateMutations = new WaAppStateMutationCoordinator_1.WaAppStateMutationCoordinator({
|
|
405
|
+
logger,
|
|
406
|
+
messageStore: sessionStore.messages,
|
|
407
|
+
syncAppState: runtime.syncAppStateWithOptions
|
|
408
|
+
});
|
|
409
|
+
connectionManager = new WaConnectionManager_1.WaConnectionManager({
|
|
410
|
+
logger,
|
|
411
|
+
options,
|
|
412
|
+
authClient,
|
|
413
|
+
keepAlive,
|
|
414
|
+
nodeOrchestrator,
|
|
415
|
+
nodeTransport,
|
|
416
|
+
getPassiveTasks: () => passiveTasks,
|
|
417
|
+
clearStoredCredentials: runtime.clearStoredState
|
|
418
|
+
});
|
|
419
|
+
if (mediaConnCacheFallback !== null) {
|
|
420
|
+
connectionManager.setMediaConnCache(mediaConnCacheFallback);
|
|
421
|
+
}
|
|
422
|
+
scheduleReconnectAfterPairing = () => connectionManager?.scheduleReconnectAfterPairing();
|
|
423
|
+
const disconnectWithClientSideEffects = async (reason, isLogout, code) => {
|
|
424
|
+
keyShareCoordinator.notifyDisconnected();
|
|
425
|
+
await connectionManager?.disconnect();
|
|
426
|
+
runtime.emitEvent('connection', {
|
|
427
|
+
status: 'close',
|
|
428
|
+
reason,
|
|
429
|
+
code,
|
|
430
|
+
isLogout,
|
|
431
|
+
isNewLogin: false
|
|
432
|
+
});
|
|
433
|
+
};
|
|
434
|
+
const connectWithClientSideEffects = async (reason) => {
|
|
435
|
+
runtime.resumeIncomingEvents();
|
|
436
|
+
await connectionManager?.connect(runtime.handleIncomingFrame);
|
|
437
|
+
runtime.emitEvent('connection', {
|
|
438
|
+
status: 'open',
|
|
439
|
+
reason,
|
|
440
|
+
code: null,
|
|
441
|
+
isLogout: false,
|
|
442
|
+
isNewLogin: connectionManager?.wasNewLogin() ?? false
|
|
443
|
+
});
|
|
444
|
+
};
|
|
445
|
+
const clearStoredCredentialsWithClientSideEffects = async () => {
|
|
446
|
+
await connectionManager?.clearStoredCredentials();
|
|
447
|
+
};
|
|
307
448
|
const streamControl = (0, WaStreamControlCoordinator_1.createStreamControlHandler)({
|
|
308
449
|
logger,
|
|
309
|
-
getComms:
|
|
450
|
+
getComms: () => connectionManager?.getComms() ?? null,
|
|
310
451
|
clearPendingQueries: (error) => nodeOrchestrator.clearPending(error),
|
|
311
|
-
clearMediaConnCache: () =>
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
452
|
+
clearMediaConnCache: () => {
|
|
453
|
+
mediaConnCacheFallback = null;
|
|
454
|
+
connectionManager?.setMediaConnCache(null);
|
|
455
|
+
},
|
|
456
|
+
disconnect: disconnectWithClientSideEffects,
|
|
457
|
+
clearStoredCredentials: clearStoredCredentialsWithClientSideEffects,
|
|
458
|
+
connect: connectWithClientSideEffects
|
|
315
459
|
});
|
|
316
|
-
const incomingMessageAckOptions =
|
|
460
|
+
const incomingMessageAckOptions = {
|
|
317
461
|
logger,
|
|
318
|
-
|
|
319
|
-
getCurrentMeJid,
|
|
462
|
+
sendNode: runtime.sendNode,
|
|
463
|
+
getMeJid: getCurrentMeJid,
|
|
320
464
|
signalProtocol,
|
|
321
465
|
senderKeyManager,
|
|
322
|
-
retryCoordinator
|
|
323
|
-
|
|
324
|
-
|
|
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)({
|
|
325
475
|
logger,
|
|
326
|
-
|
|
327
|
-
getCurrentCredentials
|
|
328
|
-
|
|
476
|
+
queryWithContext: runtime.queryWithContext,
|
|
477
|
+
getCurrentCredentials,
|
|
478
|
+
syncAppState: runtime.syncAppState,
|
|
479
|
+
generateUsyncSid
|
|
480
|
+
}, dirtyBits);
|
|
329
481
|
const incomingNode = new WaIncomingNodeCoordinator_1.WaIncomingNodeCoordinator({
|
|
330
482
|
logger,
|
|
331
483
|
runtime: createIncomingNodeRuntime({
|
|
332
484
|
logger,
|
|
333
|
-
|
|
485
|
+
emitEvent: runtime.emitEvent,
|
|
334
486
|
authClient,
|
|
487
|
+
connectionManager,
|
|
335
488
|
nodeOrchestrator,
|
|
336
489
|
streamControl,
|
|
337
490
|
mediaMessageBuildOptions,
|
|
338
491
|
retryCoordinator,
|
|
339
492
|
messageDispatch,
|
|
493
|
+
sendNode: runtime.sendNode,
|
|
494
|
+
syncAppState: runtime.syncAppState,
|
|
495
|
+
disconnect: disconnectWithClientSideEffects,
|
|
496
|
+
clearStoredCredentials: clearStoredCredentialsWithClientSideEffects,
|
|
340
497
|
getCurrentMeJid,
|
|
341
498
|
handleClientDirtyBits,
|
|
342
499
|
incomingMessageAckOptions
|
|
343
500
|
})
|
|
344
501
|
});
|
|
345
|
-
|
|
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
|
+
});
|
|
703
|
+
passiveTasks = new WaPassiveTasksCoordinator_1.WaPassiveTasksCoordinator({
|
|
346
704
|
logger,
|
|
347
705
|
signalStore: sessionStore.signal,
|
|
348
706
|
signalDigestSync,
|
|
349
707
|
signalRotateKey,
|
|
350
708
|
runtime: createPassiveTasksRuntime({
|
|
351
|
-
|
|
709
|
+
queryWithContext: runtime.queryWithContext,
|
|
352
710
|
authClient,
|
|
353
711
|
nodeOrchestrator,
|
|
712
|
+
receiptQueue,
|
|
354
713
|
getCurrentCredentials
|
|
355
714
|
})
|
|
356
715
|
});
|
|
@@ -373,9 +732,17 @@ function buildWaClientDependencies(input) {
|
|
|
373
732
|
messageDispatch,
|
|
374
733
|
retryCoordinator,
|
|
375
734
|
appStateSync,
|
|
735
|
+
chatCoordinator: appStateMutations,
|
|
376
736
|
streamControl,
|
|
377
737
|
incomingNode,
|
|
378
738
|
passiveTasks,
|
|
379
|
-
groupCoordinator
|
|
739
|
+
groupCoordinator,
|
|
740
|
+
privacyCoordinator,
|
|
741
|
+
profileCoordinator,
|
|
742
|
+
businessCoordinator,
|
|
743
|
+
receiptQueue,
|
|
744
|
+
keyShareCoordinator,
|
|
745
|
+
connectionManager,
|
|
746
|
+
trustedContactToken
|
|
380
747
|
};
|
|
381
748
|
}
|