zapo-js 0.1.0 → 0.1.2
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 -7
- package/dist/appstate/WaAppStateCrypto.js +18 -25
- package/dist/appstate/WaAppStateSyncClient.js +181 -114
- package/dist/appstate/WaAppStateSyncResponseParser.js +16 -5
- package/dist/appstate/constants.js +4 -3
- package/dist/appstate/utils.js +10 -30
- package/dist/auth/WaAuthClient.js +48 -55
- package/dist/auth/flow/WaAuthCredentialsFlow.js +21 -14
- package/dist/auth/index.js +1 -3
- package/dist/auth/pairing/WaPairingFlow.js +21 -23
- package/dist/auth/pairing/WaQrFlow.js +37 -24
- package/dist/client/WaClient.js +103 -276
- package/dist/client/WaClientFactory.js +227 -110
- package/dist/client/connection/WaConnectionManager.js +292 -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/WaGroupCoordinator.js +27 -17
- package/dist/client/coordinators/WaIncomingNodeCoordinator.js +20 -27
- package/dist/client/coordinators/WaMessageDispatchCoordinator.js +231 -686
- package/dist/client/coordinators/WaRetryCoordinator.js +70 -37
- package/dist/client/dirty.js +35 -29
- package/dist/client/events/chat.js +4 -3
- package/dist/client/events/group.js +59 -36
- package/dist/client/history-sync.js +53 -63
- package/dist/client/incoming.js +23 -20
- package/dist/client/mailbox.js +8 -8
- package/dist/client/messages.js +4 -4
- package/dist/client/messaging/fanout.js +189 -0
- package/dist/client/messaging/key-protocol.js +130 -0
- package/dist/client/messaging/participants.js +191 -0
- package/dist/crypto/core/hkdf.js +3 -8
- package/dist/crypto/core/index.js +1 -4
- package/dist/crypto/core/keys.js +2 -3
- package/dist/crypto/core/primitives.js +12 -15
- package/dist/crypto/core/random.js +7 -26
- package/dist/crypto/curves/Ed25519.js +7 -8
- package/dist/crypto/curves/X25519.js +13 -16
- package/dist/crypto/index.js +0 -5
- package/dist/esm/appstate/WaAppStateCrypto.js +6 -13
- package/dist/esm/appstate/WaAppStateSyncClient.js +174 -107
- package/dist/esm/appstate/WaAppStateSyncResponseParser.js +17 -6
- package/dist/esm/appstate/constants.js +3 -2
- package/dist/esm/appstate/utils.js +8 -27
- package/dist/esm/auth/WaAuthClient.js +48 -55
- package/dist/esm/auth/flow/WaAuthCredentialsFlow.js +21 -14
- package/dist/esm/auth/index.js +0 -1
- package/dist/esm/auth/pairing/WaPairingFlow.js +14 -16
- package/dist/esm/auth/pairing/WaQrFlow.js +37 -24
- package/dist/esm/client/WaClient.js +103 -276
- package/dist/esm/client/WaClientFactory.js +227 -110
- package/dist/esm/client/connection/WaConnectionManager.js +288 -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/WaGroupCoordinator.js +20 -10
- package/dist/esm/client/coordinators/WaIncomingNodeCoordinator.js +20 -27
- package/dist/esm/client/coordinators/WaMessageDispatchCoordinator.js +232 -687
- package/dist/esm/client/coordinators/WaRetryCoordinator.js +71 -38
- package/dist/esm/client/dirty.js +30 -24
- package/dist/esm/client/events/chat.js +4 -3
- package/dist/esm/client/events/group.js +50 -28
- package/dist/esm/client/history-sync.js +50 -60
- package/dist/esm/client/incoming.js +23 -20
- package/dist/esm/client/mailbox.js +8 -8
- package/dist/esm/client/messages.js +1 -1
- package/dist/esm/client/messaging/fanout.js +186 -0
- package/dist/esm/client/messaging/key-protocol.js +127 -0
- package/dist/esm/client/messaging/participants.js +188 -0
- package/dist/esm/crypto/core/hkdf.js +3 -8
- package/dist/esm/crypto/core/index.js +0 -1
- package/dist/esm/crypto/core/keys.js +2 -3
- package/dist/esm/crypto/core/primitives.js +12 -15
- package/dist/esm/crypto/core/random.js +6 -25
- package/dist/esm/crypto/curves/Ed25519.js +4 -5
- package/dist/esm/crypto/curves/X25519.js +10 -13
- package/dist/esm/crypto/index.js +0 -2
- 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/BoundedTaskQueue.js +13 -17
- package/dist/esm/media/WaMediaCrypto.js +2 -4
- package/dist/esm/media/WaMediaTransferClient.js +226 -58
- package/dist/esm/media/conn.js +10 -6
- package/dist/esm/media/constants.js +4 -1
- package/dist/esm/message/WaMessageClient.js +4 -13
- package/dist/esm/message/ack.js +6 -6
- package/dist/esm/message/addon-crypto.js +59 -0
- package/dist/esm/message/incoming.js +106 -111
- package/dist/esm/message/index.js +2 -0
- package/dist/esm/message/reporting-token.js +438 -0
- package/dist/esm/message/use-case-secret.js +49 -0
- package/dist/esm/protocol/appstate.js +58 -0
- package/dist/esm/protocol/constants.js +2 -1
- package/dist/esm/protocol/index.js +2 -10
- package/dist/esm/protocol/jid.js +63 -51
- package/dist/esm/protocol/media.js +3 -3
- package/dist/esm/protocol/nodes.js +2 -0
- package/dist/esm/protocol/usync.js +11 -0
- package/dist/esm/retry/index.js +1 -0
- package/dist/esm/retry/outbound.js +4 -5
- package/dist/esm/retry/parse.js +58 -76
- package/dist/esm/retry/replay.js +48 -49
- package/dist/esm/retry/tracker.js +56 -0
- package/dist/esm/signal/api/SignalDeviceSyncApi.js +249 -82
- package/dist/esm/signal/api/SignalDigestSyncApi.js +6 -1
- package/dist/esm/signal/api/SignalIdentitySyncApi.js +49 -34
- package/dist/esm/signal/api/SignalMissingPreKeysSyncApi.js +70 -62
- package/dist/esm/signal/api/SignalSessionSyncApi.js +23 -30
- package/dist/esm/signal/crypto/WaAdvSignature.js +3 -5
- package/dist/esm/signal/group/SenderKeyChain.js +28 -23
- package/dist/esm/signal/group/SenderKeyCodec.js +2 -4
- package/dist/esm/signal/group/SenderKeyManager.js +26 -16
- package/dist/esm/signal/index.js +1 -0
- package/dist/esm/signal/session/SignalProtocol.js +49 -14
- 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 +186 -0
- package/dist/esm/signal/store/sqlite.js +16 -37
- package/dist/esm/store/createStore.js +16 -18
- package/dist/esm/store/noop.store.js +3 -6
- package/dist/esm/store/providers/memory/appstate.store.js +30 -6
- package/dist/esm/store/providers/memory/contact.store.js +5 -0
- package/dist/esm/store/providers/memory/device-list.store.js +3 -30
- 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/sender-key.store.js +5 -7
- package/dist/esm/store/providers/memory/signal.store.js +13 -1
- package/dist/esm/store/providers/memory/thread.store.js +5 -0
- package/dist/esm/store/providers/sqlite/appstate.store.js +82 -1
- package/dist/esm/store/providers/sqlite/connection.js +18 -13
- package/dist/esm/store/providers/sqlite/contact.store.js +31 -18
- package/dist/esm/store/providers/sqlite/device-list.store.js +7 -35
- package/dist/esm/store/providers/sqlite/message.store.js +45 -32
- package/dist/esm/store/providers/sqlite/migrations.js +1 -1
- package/dist/esm/store/providers/sqlite/participants.store.js +1 -9
- package/dist/esm/store/providers/sqlite/retry.store.js +8 -11
- package/dist/esm/store/providers/sqlite/sender-key.store.js +25 -30
- package/dist/esm/store/providers/sqlite/signal.store.js +104 -22
- package/dist/esm/store/providers/sqlite/table-names.js +107 -0
- package/dist/esm/store/providers/sqlite/thread.store.js +35 -22
- package/dist/esm/transport/WaComms.js +25 -23
- package/dist/esm/transport/WaWebSocket.js +115 -12
- package/dist/esm/transport/binary/decoder.js +4 -4
- package/dist/esm/transport/binary/encoder.js +12 -4
- package/dist/esm/transport/index.js +1 -0
- package/dist/esm/transport/keepalive/WaKeepAlive.js +2 -8
- package/dist/esm/transport/node/WaNodeOrchestrator.js +2 -4
- 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/index.js +2 -1
- package/dist/esm/transport/node/builders/message.js +9 -0
- package/dist/esm/transport/node/builders/pairing.js +4 -5
- package/dist/esm/transport/node/builders/usync.js +41 -0
- package/dist/esm/transport/node/helpers.js +107 -5
- package/dist/esm/transport/node/usync.js +35 -0
- package/dist/esm/transport/noise/WaFrameCodec.js +48 -33
- package/dist/esm/transport/noise/WaNoiseCert.js +3 -6
- package/dist/esm/transport/noise/WaNoiseSession.js +17 -10
- package/dist/esm/transport/proxy.js +27 -0
- package/dist/esm/transport/stream/parse.js +13 -48
- package/dist/esm/util/bytes.js +50 -32
- package/dist/esm/util/coercion.js +6 -14
- package/dist/esm/util/primitives.js +39 -14
- 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/BoundedTaskQueue.js +13 -17
- package/dist/media/WaMediaCrypto.js +1 -3
- package/dist/media/WaMediaTransferClient.js +259 -58
- package/dist/media/conn.js +10 -6
- package/dist/media/constants.js +4 -1
- package/dist/message/WaMessageClient.js +5 -14
- package/dist/message/ack.js +6 -6
- package/dist/message/addon-crypto.js +65 -0
- package/dist/message/incoming.js +104 -109
- package/dist/message/index.js +2 -0
- package/dist/message/reporting-token.js +443 -0
- package/dist/message/use-case-secret.js +55 -0
- package/dist/protocol/appstate.js +59 -1
- package/dist/protocol/constants.js +7 -1
- package/dist/protocol/index.js +20 -42
- package/dist/protocol/jid.js +64 -51
- package/dist/protocol/media.js +3 -3
- package/dist/protocol/nodes.js +2 -0
- package/dist/protocol/usync.js +14 -0
- package/dist/retry/index.js +3 -1
- package/dist/retry/outbound.js +6 -7
- package/dist/retry/parse.js +57 -75
- package/dist/retry/replay.js +46 -47
- package/dist/retry/tracker.js +59 -0
- package/dist/signal/api/SignalDeviceSyncApi.js +247 -80
- package/dist/signal/api/SignalDigestSyncApi.js +6 -1
- package/dist/signal/api/SignalIdentitySyncApi.js +49 -34
- package/dist/signal/api/SignalMissingPreKeysSyncApi.js +67 -59
- package/dist/signal/api/SignalSessionSyncApi.js +23 -30
- package/dist/signal/crypto/WaAdvSignature.js +2 -4
- package/dist/signal/group/SenderKeyChain.js +27 -22
- package/dist/signal/group/SenderKeyCodec.js +1 -3
- package/dist/signal/group/SenderKeyManager.js +26 -16
- package/dist/signal/index.js +3 -1
- package/dist/signal/session/SignalProtocol.js +49 -14
- package/dist/signal/session/SignalRatchet.js +24 -15
- package/dist/signal/session/SignalSession.js +14 -9
- package/dist/signal/session/resolver.js +189 -0
- package/dist/signal/store/sqlite.js +16 -37
- package/dist/store/createStore.js +16 -18
- package/dist/store/noop.store.js +3 -6
- package/dist/store/providers/memory/appstate.store.js +28 -4
- package/dist/store/providers/memory/contact.store.js +5 -0
- package/dist/store/providers/memory/device-list.store.js +3 -30
- 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/sender-key.store.js +8 -10
- package/dist/store/providers/memory/signal.store.js +21 -9
- package/dist/store/providers/memory/thread.store.js +5 -0
- package/dist/store/providers/sqlite/appstate.store.js +81 -0
- package/dist/store/providers/sqlite/connection.js +18 -13
- package/dist/store/providers/sqlite/contact.store.js +31 -18
- package/dist/store/providers/sqlite/device-list.store.js +7 -35
- package/dist/store/providers/sqlite/message.store.js +45 -32
- package/dist/store/providers/sqlite/migrations.js +1 -1
- package/dist/store/providers/sqlite/participants.store.js +1 -9
- package/dist/store/providers/sqlite/retry.store.js +8 -11
- package/dist/store/providers/sqlite/sender-key.store.js +24 -29
- package/dist/store/providers/sqlite/signal.store.js +105 -23
- package/dist/store/providers/sqlite/table-names.js +113 -0
- package/dist/store/providers/sqlite/thread.store.js +35 -22
- package/dist/transport/WaComms.js +27 -25
- package/dist/transport/WaWebSocket.js +148 -12
- package/dist/transport/binary/decoder.js +4 -4
- package/dist/transport/binary/encoder.js +12 -4
- package/dist/transport/index.js +7 -1
- package/dist/transport/keepalive/WaKeepAlive.js +1 -7
- package/dist/transport/node/WaNodeOrchestrator.js +2 -4
- 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/index.js +12 -9
- package/dist/transport/node/builders/message.js +9 -0
- package/dist/transport/node/builders/pairing.js +4 -5
- package/dist/transport/node/builders/usync.js +45 -0
- package/dist/transport/node/helpers.js +112 -4
- package/dist/transport/node/usync.js +38 -0
- package/dist/transport/noise/WaFrameCodec.js +47 -32
- package/dist/transport/noise/WaNoiseCert.js +5 -8
- package/dist/transport/noise/WaNoiseSession.js +17 -10
- package/dist/transport/proxy.js +34 -0
- package/dist/transport/stream/parse.js +17 -53
- 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/store/sqlite.d.ts +4 -18
- package/dist/types/appstate/utils.d.ts +0 -1
- package/dist/types/auth/WaAuthClient.d.ts +10 -12
- package/dist/types/auth/index.d.ts +0 -2
- package/dist/types/auth/pairing/WaQrFlow.d.ts +1 -1
- package/dist/types/auth/types.d.ts +6 -9
- package/dist/types/client/WaClient.d.ts +27 -25
- package/dist/types/client/WaClientFactory.d.ts +22 -23
- package/dist/types/client/connection/WaConnectionManager.d.ts +64 -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/WaIncomingNodeCoordinator.d.ts +0 -1
- package/dist/types/client/coordinators/WaMessageDispatchCoordinator.d.ts +18 -41
- package/dist/types/client/coordinators/WaRetryCoordinator.d.ts +2 -0
- package/dist/types/client/dirty.d.ts +1 -0
- package/dist/types/client/events/group.d.ts +2 -1
- package/dist/types/client/index.d.ts +1 -1
- 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/types.d.ts +24 -1
- package/dist/types/crypto/core/hkdf.d.ts +0 -6
- package/dist/types/crypto/core/index.d.ts +0 -1
- package/dist/types/crypto/core/random.d.ts +1 -7
- package/dist/types/crypto/index.d.ts +0 -2
- package/dist/types/index.d.ts +1 -1
- 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/BoundedTaskQueue.d.ts +1 -1
- package/dist/types/media/WaMediaTransferClient.d.ts +13 -3
- package/dist/types/media/types.d.ts +5 -0
- package/dist/types/message/addon-crypto.d.ts +25 -0
- package/dist/types/message/index.d.ts +2 -0
- package/dist/types/message/reporting-token.d.ts +19 -0
- package/dist/types/message/use-case-secret.d.ts +20 -0
- package/dist/types/protocol/appstate.d.ts +58 -0
- package/dist/types/protocol/constants.d.ts +2 -1
- package/dist/types/protocol/index.d.ts +2 -10
- package/dist/types/protocol/jid.d.ts +3 -3
- package/dist/types/protocol/nodes.d.ts +2 -0
- package/dist/types/protocol/usync.d.ts +11 -0
- package/dist/types/retry/index.d.ts +1 -0
- package/dist/types/retry/replay.d.ts +0 -4
- package/dist/types/retry/tracker.d.ts +19 -0
- package/dist/types/retry/types.d.ts +4 -3
- package/dist/types/signal/api/SignalDeviceSyncApi.d.ts +13 -1
- package/dist/types/signal/group/SenderKeyCodec.d.ts +4 -6
- package/dist/types/signal/index.d.ts +1 -0
- package/dist/types/signal/session/SignalProtocol.d.ts +9 -0
- package/dist/types/signal/session/resolver.d.ts +17 -0
- package/dist/types/store/contracts/appstate.store.d.ts +3 -0
- 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/sender-key.store.d.ts +0 -1
- package/dist/types/store/contracts/signal.store.d.ts +6 -0
- package/dist/types/store/contracts/thread.store.d.ts +1 -0
- package/dist/types/store/index.d.ts +1 -1
- package/dist/types/store/providers/memory/appstate.store.d.ts +2 -0
- 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/sender-key.store.d.ts +0 -1
- package/dist/types/store/providers/memory/signal.store.d.ts +6 -0
- package/dist/types/store/providers/memory/thread.store.d.ts +1 -0
- package/dist/types/store/providers/sqlite/appstate.store.d.ts +2 -0
- package/dist/types/store/providers/sqlite/contact.store.d.ts +2 -0
- package/dist/types/store/providers/sqlite/device-list.store.d.ts +0 -3
- package/dist/types/store/providers/sqlite/message.store.d.ts +2 -0
- package/dist/types/store/providers/sqlite/participants.store.d.ts +0 -1
- package/dist/types/store/providers/sqlite/retry.store.d.ts +0 -1
- package/dist/types/store/providers/sqlite/sender-key.store.d.ts +0 -1
- package/dist/types/store/providers/sqlite/signal.store.d.ts +7 -0
- package/dist/types/store/providers/sqlite/table-names.d.ts +5 -0
- package/dist/types/store/providers/sqlite/thread.store.d.ts +2 -0
- package/dist/types/store/types.d.ts +3 -0
- package/dist/types/transport/WaWebSocket.d.ts +3 -0
- package/dist/types/transport/index.d.ts +2 -1
- package/dist/types/transport/keepalive/WaKeepAlive.d.ts +0 -1
- package/dist/types/transport/node/WaNodeTransport.d.ts +0 -9
- package/dist/types/transport/node/builders/group.d.ts +4 -6
- package/dist/types/transport/node/builders/index.d.ts +2 -1
- package/dist/types/transport/node/builders/message.d.ts +14 -25
- package/dist/types/transport/node/builders/retry.d.ts +2 -4
- package/dist/types/transport/node/builders/usync.d.ts +21 -0
- package/dist/types/transport/node/helpers.d.ts +8 -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 +1 -0
- 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/primitives.d.ts +3 -0
- package/dist/util/bytes.js +55 -33
- package/dist/util/coercion.js +6 -14
- package/dist/util/primitives.js +42 -14
- package/package.json +27 -9
- package/proto/index.d.ts +1090 -1048
- package/proto/index.js +1 -1
- package/scripts/check-node-version.cjs +0 -1
- package/dist/crypto/core/encoding.js +0 -29
- package/dist/esm/crypto/core/encoding.js +0 -25
- package/dist/esm/util/base64.js +0 -18
- package/dist/esm/util/signal-address.js +0 -5
- package/dist/types/crypto/core/encoding.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
package/dist/client/WaClient.js
CHANGED
|
@@ -12,9 +12,8 @@ const _proto_1 = require("../proto.js");
|
|
|
12
12
|
const constants_1 = require("../protocol/constants");
|
|
13
13
|
const jid_1 = require("../protocol/jid");
|
|
14
14
|
const query_1 = require("../transport/node/query");
|
|
15
|
-
const WaComms_1 = require("../transport/WaComms");
|
|
16
|
-
const base64_1 = require("../util/base64");
|
|
17
15
|
const bytes_1 = require("../util/bytes");
|
|
16
|
+
const bytes_2 = require("../util/bytes");
|
|
18
17
|
const primitives_1 = require("../util/primitives");
|
|
19
18
|
const SYNC_RELATED_PROTOCOL_TYPES = new Set([
|
|
20
19
|
_proto_1.proto.Message.ProtocolMessage.Type.APP_STATE_SYNC_KEY_REQUEST,
|
|
@@ -27,15 +26,7 @@ const WA_APP_STATE_KEY_SHARE_MAX_RETRIES = 2;
|
|
|
27
26
|
class WaClient extends node_events_1.EventEmitter {
|
|
28
27
|
constructor(options, logger = new ConsoleLogger_1.ConsoleLogger('info')) {
|
|
29
28
|
super();
|
|
30
|
-
this.clockSkewMs = null;
|
|
31
|
-
this.mediaConnCache = null;
|
|
32
|
-
this.comms = null;
|
|
33
|
-
this.pairingReconnectPromise = null;
|
|
34
29
|
this.connectPromise = null;
|
|
35
|
-
this.danglingReceipts = [];
|
|
36
|
-
this.appStateKeyShareWaiters = new Set();
|
|
37
|
-
this.appStateKeyShareVersion = 0;
|
|
38
|
-
this.appStateBootstrapKeyShareWaitDone = false;
|
|
39
30
|
const base = (0, WaClientFactory_1.resolveWaClientBase)(options, logger);
|
|
40
31
|
this.options = base.options;
|
|
41
32
|
this.logger = base.logger;
|
|
@@ -48,31 +39,20 @@ class WaClient extends node_events_1.EventEmitter {
|
|
|
48
39
|
this.signalStore = base.sessionStore.signal;
|
|
49
40
|
this.senderKeyStore = base.sessionStore.senderKey;
|
|
50
41
|
this.threadStore = base.sessionStore.threads;
|
|
51
|
-
const host = {
|
|
52
|
-
sendNode: (node) => this.sendNode(node),
|
|
53
|
-
query: (node, timeoutMs) => this.query(node, timeoutMs),
|
|
54
|
-
queryWithContext: this.queryWithContext.bind(this),
|
|
55
|
-
syncAppState: () => this.syncAppState().then(() => { }),
|
|
56
|
-
emitEvent: this.emit.bind(this),
|
|
57
|
-
handleIncomingMessageEvent: this.handleIncomingMessageEvent.bind(this),
|
|
58
|
-
handleError: this.handleError.bind(this),
|
|
59
|
-
scheduleReconnectAfterPairing: this.scheduleReconnectAfterPairing.bind(this),
|
|
60
|
-
updateClockSkewFromSuccess: this.updateClockSkewFromSuccess.bind(this),
|
|
61
|
-
getComms: () => this.comms,
|
|
62
|
-
getMediaConnCache: () => this.mediaConnCache,
|
|
63
|
-
setMediaConnCache: (mediaConn) => {
|
|
64
|
-
this.mediaConnCache = mediaConn;
|
|
65
|
-
},
|
|
66
|
-
disconnect: this.disconnect.bind(this),
|
|
67
|
-
clearStoredState: this.clearStoredState.bind(this),
|
|
68
|
-
connect: this.connect.bind(this),
|
|
69
|
-
shouldQueueDanglingReceipt: (node, error) => this.shouldQueueDanglingReceipt(node, error),
|
|
70
|
-
enqueueDanglingReceipt: this.enqueueDanglingReceipt.bind(this),
|
|
71
|
-
takeDanglingReceipts: () => this.danglingReceipts.splice(0)
|
|
72
|
-
};
|
|
73
42
|
const dependencies = (0, WaClientFactory_1.buildWaClientDependencies)({
|
|
74
43
|
base,
|
|
75
|
-
|
|
44
|
+
runtime: {
|
|
45
|
+
sendNode: (node) => this.sendNode(node),
|
|
46
|
+
query: (node, timeoutMs) => this.query(node, timeoutMs),
|
|
47
|
+
queryWithContext: this.queryWithContext.bind(this),
|
|
48
|
+
syncAppState: () => this.syncAppState().then(() => { }),
|
|
49
|
+
syncAppStateWithOptions: (syncOptions) => this.syncAppState(syncOptions),
|
|
50
|
+
emitEvent: this.emit.bind(this),
|
|
51
|
+
handleIncomingMessageEvent: this.handleIncomingMessageEvent.bind(this),
|
|
52
|
+
handleError: this.handleError.bind(this),
|
|
53
|
+
handleIncomingFrame: this.handleIncomingFrame.bind(this),
|
|
54
|
+
clearStoredState: this.clearStoredState.bind(this)
|
|
55
|
+
}
|
|
76
56
|
});
|
|
77
57
|
Object.assign(this, dependencies);
|
|
78
58
|
this.bindNodeTransportEvents();
|
|
@@ -90,7 +70,7 @@ class WaClient extends node_events_1.EventEmitter {
|
|
|
90
70
|
return super.emit(event, ...args);
|
|
91
71
|
}
|
|
92
72
|
getState() {
|
|
93
|
-
const connected = this.
|
|
73
|
+
const connected = this.connectionManager.isConnected();
|
|
94
74
|
this.logger.trace('wa client state requested', { connected });
|
|
95
75
|
return this.authClient.getState(connected);
|
|
96
76
|
}
|
|
@@ -98,7 +78,7 @@ class WaClient extends node_events_1.EventEmitter {
|
|
|
98
78
|
return this.authClient.getCurrentCredentials();
|
|
99
79
|
}
|
|
100
80
|
getClockSkewMs() {
|
|
101
|
-
return this.
|
|
81
|
+
return this.connectionManager.getClockSkewMs();
|
|
102
82
|
}
|
|
103
83
|
async sendNode(node) {
|
|
104
84
|
try {
|
|
@@ -106,13 +86,13 @@ class WaClient extends node_events_1.EventEmitter {
|
|
|
106
86
|
}
|
|
107
87
|
catch (error) {
|
|
108
88
|
const normalized = (0, primitives_1.toError)(error);
|
|
109
|
-
if (this.
|
|
110
|
-
this.
|
|
89
|
+
if (this.receiptQueue.shouldQueue(node, normalized)) {
|
|
90
|
+
this.receiptQueue.enqueue(node);
|
|
111
91
|
this.logger.warn('queued dangling receipt after send failure', {
|
|
112
92
|
id: node.attrs.id,
|
|
113
93
|
to: node.attrs.to,
|
|
114
94
|
message: normalized.message,
|
|
115
|
-
queueSize: this.
|
|
95
|
+
queueSize: this.receiptQueue.size()
|
|
116
96
|
});
|
|
117
97
|
return;
|
|
118
98
|
}
|
|
@@ -120,7 +100,7 @@ class WaClient extends node_events_1.EventEmitter {
|
|
|
120
100
|
}
|
|
121
101
|
}
|
|
122
102
|
async query(node, timeoutMs = this.options.iqTimeoutMs ?? constants_1.WA_DEFAULTS.IQ_TIMEOUT_MS) {
|
|
123
|
-
if (!this.
|
|
103
|
+
if (!this.connectionManager.isConnected()) {
|
|
124
104
|
throw new Error('client is not connected');
|
|
125
105
|
}
|
|
126
106
|
this.logger.debug('wa client query', { tag: node.tag, id: node.attrs.id, timeoutMs });
|
|
@@ -142,12 +122,17 @@ class WaClient extends node_events_1.EventEmitter {
|
|
|
142
122
|
this.handleError(error);
|
|
143
123
|
});
|
|
144
124
|
}
|
|
125
|
+
getMailboxPersistenceDeps() {
|
|
126
|
+
return {
|
|
127
|
+
logger: this.logger,
|
|
128
|
+
contactStore: this.contactStore,
|
|
129
|
+
messageStore: this.messageStore
|
|
130
|
+
};
|
|
131
|
+
}
|
|
145
132
|
async handleIncomingMessageEvent(event) {
|
|
146
133
|
this.emit('message', event);
|
|
147
134
|
void (0, mailbox_1.persistIncomingMailboxEntities)({
|
|
148
|
-
|
|
149
|
-
contactStore: this.contactStore,
|
|
150
|
-
messageStore: this.messageStore,
|
|
135
|
+
...this.getMailboxPersistenceDeps(),
|
|
151
136
|
event
|
|
152
137
|
});
|
|
153
138
|
const protocolMessage = event.message?.protocolMessage;
|
|
@@ -212,9 +197,8 @@ class WaClient extends node_events_1.EventEmitter {
|
|
|
212
197
|
imported
|
|
213
198
|
});
|
|
214
199
|
if (imported > 0) {
|
|
215
|
-
const hadWaiters = this.
|
|
216
|
-
this.
|
|
217
|
-
this.notifyAppStateKeyShareWaiters(true);
|
|
200
|
+
const hadWaiters = this.keyShareCoordinator.hasWaiters();
|
|
201
|
+
this.keyShareCoordinator.notifyReceived();
|
|
218
202
|
if (hadWaiters) {
|
|
219
203
|
this.logger.debug('app-state key share imported and waiters released', {
|
|
220
204
|
id: event.stanzaId,
|
|
@@ -311,8 +295,8 @@ class WaClient extends node_events_1.EventEmitter {
|
|
|
311
295
|
const deduped = new Map();
|
|
312
296
|
for (const key of request.keyIds ?? []) {
|
|
313
297
|
try {
|
|
314
|
-
const keyId = (0,
|
|
315
|
-
const keyHex = (0,
|
|
298
|
+
const keyId = (0, bytes_1.decodeProtoBytes)(key.keyId, 'appStateSyncKeyRequest.keyIds[].keyId');
|
|
299
|
+
const keyHex = (0, bytes_2.bytesToHex)(keyId);
|
|
316
300
|
if (deduped.has(keyHex)) {
|
|
317
301
|
continue;
|
|
318
302
|
}
|
|
@@ -340,10 +324,8 @@ class WaClient extends node_events_1.EventEmitter {
|
|
|
340
324
|
async handleHistorySyncNotification(notification) {
|
|
341
325
|
try {
|
|
342
326
|
await (0, history_sync_1.processHistorySyncNotification)({
|
|
343
|
-
|
|
327
|
+
...this.getMailboxPersistenceDeps(),
|
|
344
328
|
mediaTransfer: this.mediaTransfer,
|
|
345
|
-
contactStore: this.contactStore,
|
|
346
|
-
messageStore: this.messageStore,
|
|
347
329
|
threadStore: this.threadStore,
|
|
348
330
|
emitEvent: this.emit.bind(this)
|
|
349
331
|
}, notification);
|
|
@@ -372,144 +354,98 @@ class WaClient extends node_events_1.EventEmitter {
|
|
|
372
354
|
this.logger.trace('wa client connect already in-flight');
|
|
373
355
|
return this.connectPromise;
|
|
374
356
|
}
|
|
375
|
-
this.connectPromise = this.
|
|
357
|
+
this.connectPromise = this.connectionManager
|
|
358
|
+
.connect((frame) => this.handleIncomingFrame(frame))
|
|
359
|
+
.then(() => {
|
|
360
|
+
this.emit('connection_open', {});
|
|
361
|
+
})
|
|
362
|
+
.finally(() => {
|
|
376
363
|
this.connectPromise = null;
|
|
377
364
|
});
|
|
378
365
|
return this.connectPromise;
|
|
379
366
|
}
|
|
380
|
-
async connectInternal() {
|
|
381
|
-
if (this.comms) {
|
|
382
|
-
this.logger.trace('wa client connect skipped: comms already created');
|
|
383
|
-
return;
|
|
384
|
-
}
|
|
385
|
-
this.logger.info('wa client connect start');
|
|
386
|
-
let credentials = await this.authClient.loadOrCreateCredentials();
|
|
387
|
-
try {
|
|
388
|
-
await this.startCommsWithCredentials(credentials);
|
|
389
|
-
}
|
|
390
|
-
catch (error) {
|
|
391
|
-
if (credentials.routingInfo) {
|
|
392
|
-
this.logger.warn('connect failed with routing info, retrying without routing info', {
|
|
393
|
-
message: (0, primitives_1.toError)(error).message
|
|
394
|
-
});
|
|
395
|
-
await this.disconnect();
|
|
396
|
-
credentials = await this.authClient.clearRoutingInfo();
|
|
397
|
-
await this.startCommsWithCredentials(credentials);
|
|
398
|
-
}
|
|
399
|
-
else {
|
|
400
|
-
await this.disconnect();
|
|
401
|
-
throw error;
|
|
402
|
-
}
|
|
403
|
-
}
|
|
404
|
-
this.logger.info('wa client connected');
|
|
405
|
-
this.emit('connection_open', {});
|
|
406
|
-
}
|
|
407
|
-
scheduleReconnectAfterPairing() {
|
|
408
|
-
this.logger.debug('wa client scheduling reconnect after pairing');
|
|
409
|
-
setTimeout(() => {
|
|
410
|
-
void this.reconnectAsRegisteredAfterPairing().catch((error) => {
|
|
411
|
-
this.handleError((0, primitives_1.toError)(error));
|
|
412
|
-
});
|
|
413
|
-
}, 0);
|
|
414
|
-
}
|
|
415
|
-
async reconnectAsRegisteredAfterPairing() {
|
|
416
|
-
if (this.pairingReconnectPromise) {
|
|
417
|
-
this.logger.trace('pairing reconnect already in-flight');
|
|
418
|
-
return this.pairingReconnectPromise;
|
|
419
|
-
}
|
|
420
|
-
this.pairingReconnectPromise = this.reconnectAsRegisteredAfterPairingInternal().finally(() => {
|
|
421
|
-
this.pairingReconnectPromise = null;
|
|
422
|
-
});
|
|
423
|
-
return this.pairingReconnectPromise;
|
|
424
|
-
}
|
|
425
|
-
async reconnectAsRegisteredAfterPairingInternal() {
|
|
426
|
-
const credentials = this.authClient.getCurrentCredentials();
|
|
427
|
-
if (!credentials?.meJid) {
|
|
428
|
-
this.logger.trace('pairing reconnect skipped: still unregistered');
|
|
429
|
-
return;
|
|
430
|
-
}
|
|
431
|
-
const currentComms = this.comms;
|
|
432
|
-
if (!currentComms) {
|
|
433
|
-
this.logger.trace('pairing reconnect skipped: no active comms');
|
|
434
|
-
return;
|
|
435
|
-
}
|
|
436
|
-
this.logger.info('pairing completed, restarting comms as registered');
|
|
437
|
-
this.keepAlive.stop();
|
|
438
|
-
this.nodeOrchestrator.clearPending(new Error('restarting comms after pairing'));
|
|
439
|
-
this.clearCommsBinding();
|
|
440
|
-
try {
|
|
441
|
-
await currentComms.stopComms();
|
|
442
|
-
}
|
|
443
|
-
catch (error) {
|
|
444
|
-
this.logger.warn('failed to stop pre-registration comms', {
|
|
445
|
-
message: (0, primitives_1.toError)(error).message
|
|
446
|
-
});
|
|
447
|
-
}
|
|
448
|
-
try {
|
|
449
|
-
await this.startCommsWithCredentials(credentials);
|
|
450
|
-
}
|
|
451
|
-
catch (error) {
|
|
452
|
-
this.logger.warn('pairing reconnect failed while starting registered comms', {
|
|
453
|
-
message: (0, primitives_1.toError)(error).message
|
|
454
|
-
});
|
|
455
|
-
throw error;
|
|
456
|
-
}
|
|
457
|
-
}
|
|
458
367
|
async disconnect() {
|
|
459
|
-
this.
|
|
460
|
-
this.
|
|
461
|
-
this.
|
|
462
|
-
this.appStateBootstrapKeyShareWaitDone = false;
|
|
463
|
-
await this.authClient.clearTransientState();
|
|
464
|
-
this.nodeOrchestrator.clearPending(new Error('client disconnected'));
|
|
465
|
-
this.clockSkewMs = null;
|
|
466
|
-
this.mediaConnCache = null;
|
|
467
|
-
this.passiveTasks.resetInFlightState();
|
|
468
|
-
const comms = this.comms;
|
|
469
|
-
this.clearCommsBinding();
|
|
470
|
-
if (comms) {
|
|
471
|
-
await comms.stopComms();
|
|
472
|
-
this.logger.info('wa client disconnected');
|
|
473
|
-
this.emit('connection_close', {});
|
|
474
|
-
}
|
|
368
|
+
this.keyShareCoordinator.notifyDisconnected();
|
|
369
|
+
await this.connectionManager.disconnect();
|
|
370
|
+
this.emit('connection_close', {});
|
|
475
371
|
}
|
|
476
372
|
async requestPairingCode(phoneNumber, shouldShowPushNotification = false) {
|
|
477
|
-
if (!this.
|
|
373
|
+
if (!this.connectionManager.isConnected() || !this.authClient.getCurrentCredentials()) {
|
|
478
374
|
throw new Error('client is not connected');
|
|
479
375
|
}
|
|
480
376
|
this.logger.debug('wa client request pairing code');
|
|
481
377
|
return this.authClient.requestPairingCode(phoneNumber, shouldShowPushNotification);
|
|
482
378
|
}
|
|
483
379
|
async fetchPairingCountryCodeIso() {
|
|
484
|
-
if (!this.
|
|
380
|
+
if (!this.connectionManager.isConnected() || !this.authClient.getCurrentCredentials()) {
|
|
485
381
|
throw new Error('client is not connected');
|
|
486
382
|
}
|
|
487
383
|
this.logger.trace('wa client fetch pairing country code iso');
|
|
488
384
|
return this.authClient.fetchPairingCountryCodeIso();
|
|
489
385
|
}
|
|
490
|
-
async
|
|
386
|
+
async getLidsByPhoneNumbers(phoneNumbers) {
|
|
387
|
+
if (!this.connectionManager.isConnected() || !this.authClient.getCurrentCredentials()) {
|
|
388
|
+
throw new Error('client is not connected');
|
|
389
|
+
}
|
|
390
|
+
const normalizedPhoneJids = phoneNumbers.map(jid_1.parsePhoneJid);
|
|
391
|
+
this.logger.trace('wa client query lids by phone numbers', {
|
|
392
|
+
phones: normalizedPhoneJids.length
|
|
393
|
+
});
|
|
394
|
+
return this.signalDeviceSync.queryLidsByPhoneJids(normalizedPhoneJids);
|
|
395
|
+
}
|
|
396
|
+
sendMessage(to, content, options = {}) {
|
|
491
397
|
return this.messageDispatch.sendMessage(to, content, options);
|
|
492
398
|
}
|
|
493
|
-
|
|
494
|
-
|
|
399
|
+
syncSignalSession(jid, reasonIdentity = false) {
|
|
400
|
+
return this.messageDispatch.syncSignalSession(jid, reasonIdentity);
|
|
401
|
+
}
|
|
402
|
+
sendReceipt(input) {
|
|
403
|
+
return this.messageDispatch.sendReceipt(input);
|
|
404
|
+
}
|
|
405
|
+
setChatMute(chatJid, muted, muteEndTimestampMs) {
|
|
406
|
+
return this.appStateMutations.setChatMute(chatJid, muted, muteEndTimestampMs);
|
|
407
|
+
}
|
|
408
|
+
setChatRead(chatJid, read) {
|
|
409
|
+
return this.appStateMutations.setChatRead(chatJid, read);
|
|
410
|
+
}
|
|
411
|
+
setChatPin(chatJid, pinned) {
|
|
412
|
+
return this.appStateMutations.setChatPin(chatJid, pinned);
|
|
413
|
+
}
|
|
414
|
+
setChatArchive(chatJid, archived) {
|
|
415
|
+
return this.appStateMutations.setChatArchive(chatJid, archived);
|
|
495
416
|
}
|
|
496
|
-
|
|
497
|
-
|
|
417
|
+
clearChat(chatJid, options = {}) {
|
|
418
|
+
return this.appStateMutations.clearChat(chatJid, options);
|
|
419
|
+
}
|
|
420
|
+
deleteChat(chatJid, options = {}) {
|
|
421
|
+
return this.appStateMutations.deleteChat(chatJid, options);
|
|
422
|
+
}
|
|
423
|
+
setChatLock(chatJid, locked) {
|
|
424
|
+
return this.appStateMutations.setChatLock(chatJid, locked);
|
|
425
|
+
}
|
|
426
|
+
setMessageStar(message, starred) {
|
|
427
|
+
return this.appStateMutations.setMessageStar(message, starred);
|
|
428
|
+
}
|
|
429
|
+
deleteMessageForMe(message, options = {}) {
|
|
430
|
+
return this.appStateMutations.deleteMessageForMe(message, options);
|
|
431
|
+
}
|
|
432
|
+
flushAppStateMutations() {
|
|
433
|
+
return this.appStateMutations.flushMutations();
|
|
498
434
|
}
|
|
499
435
|
async exportAppState() {
|
|
500
436
|
return this.appStateSync.exportState();
|
|
501
437
|
}
|
|
502
438
|
async syncAppState(options = {}) {
|
|
503
|
-
if (!this.
|
|
439
|
+
if (!this.connectionManager.isConnected()) {
|
|
504
440
|
throw new Error('client is not connected');
|
|
505
441
|
}
|
|
506
442
|
const shouldWaitForKeyShare = (await this.appStateStore.getActiveSyncKey()) === null;
|
|
507
|
-
if (shouldWaitForKeyShare && !this.
|
|
508
|
-
this.
|
|
443
|
+
if (shouldWaitForKeyShare && !this.keyShareCoordinator.isBootstrapDone()) {
|
|
444
|
+
this.keyShareCoordinator.markBootstrapDone();
|
|
509
445
|
this.logger.info('app-state bootstrap pre-sync waiting for key share', {
|
|
510
446
|
timeoutMs: WA_APP_STATE_KEY_SHARE_WAIT_TIMEOUT_MS
|
|
511
447
|
});
|
|
512
|
-
const received = await this.
|
|
448
|
+
const received = await this.keyShareCoordinator.waitForShare(WA_APP_STATE_KEY_SHARE_WAIT_TIMEOUT_MS);
|
|
513
449
|
if (received) {
|
|
514
450
|
this.logger.info('app-state bootstrap pre-sync received key share, continuing sync');
|
|
515
451
|
}
|
|
@@ -526,17 +462,16 @@ class WaClient extends node_events_1.EventEmitter {
|
|
|
526
462
|
return syncResult;
|
|
527
463
|
}
|
|
528
464
|
let retryCount = 0;
|
|
529
|
-
let observedKeyShareVersion = this.
|
|
530
|
-
while (blockedCollections.length > 0 &&
|
|
531
|
-
|
|
532
|
-
const hasFreshShare = this.appStateKeyShareVersion !== observedKeyShareVersion;
|
|
465
|
+
let observedKeyShareVersion = this.keyShareCoordinator.getVersion();
|
|
466
|
+
while (blockedCollections.length > 0 && retryCount < WA_APP_STATE_KEY_SHARE_MAX_RETRIES) {
|
|
467
|
+
const hasFreshShare = this.keyShareCoordinator.getVersion() !== observedKeyShareVersion;
|
|
533
468
|
if (!hasFreshShare) {
|
|
534
469
|
this.logger.info('app-state bootstrap waiting for key share', {
|
|
535
470
|
blockedCollections: blockedCollections.join(','),
|
|
536
471
|
timeoutMs: WA_APP_STATE_KEY_SHARE_WAIT_TIMEOUT_MS,
|
|
537
472
|
retryCount: retryCount + 1
|
|
538
473
|
});
|
|
539
|
-
const received = await this.
|
|
474
|
+
const received = await this.keyShareCoordinator.waitForShare(WA_APP_STATE_KEY_SHARE_WAIT_TIMEOUT_MS);
|
|
540
475
|
if (!received) {
|
|
541
476
|
this.logger.warn('app-state bootstrap key share wait timed out', {
|
|
542
477
|
blockedCollections: blockedCollections.join(','),
|
|
@@ -545,7 +480,7 @@ class WaClient extends node_events_1.EventEmitter {
|
|
|
545
480
|
break;
|
|
546
481
|
}
|
|
547
482
|
}
|
|
548
|
-
observedKeyShareVersion = this.
|
|
483
|
+
observedKeyShareVersion = this.keyShareCoordinator.getVersion();
|
|
549
484
|
retryCount += 1;
|
|
550
485
|
this.logger.info('app-state bootstrap retrying sync after key share', {
|
|
551
486
|
retryCount,
|
|
@@ -576,38 +511,6 @@ class WaClient extends node_events_1.EventEmitter {
|
|
|
576
511
|
.filter((entry) => entry.state === constants_1.WA_APP_STATE_COLLECTION_STATES.BLOCKED)
|
|
577
512
|
.map((entry) => entry.collection);
|
|
578
513
|
}
|
|
579
|
-
async waitForAppStateKeyShare(timeoutMs) {
|
|
580
|
-
return new Promise((resolve) => {
|
|
581
|
-
let settled = false;
|
|
582
|
-
let timeoutHandle = null;
|
|
583
|
-
const waiter = (received) => {
|
|
584
|
-
if (settled) {
|
|
585
|
-
return;
|
|
586
|
-
}
|
|
587
|
-
settled = true;
|
|
588
|
-
if (timeoutHandle) {
|
|
589
|
-
clearTimeout(timeoutHandle);
|
|
590
|
-
timeoutHandle = null;
|
|
591
|
-
}
|
|
592
|
-
this.appStateKeyShareWaiters.delete(waiter);
|
|
593
|
-
resolve(received);
|
|
594
|
-
};
|
|
595
|
-
this.appStateKeyShareWaiters.add(waiter);
|
|
596
|
-
timeoutHandle = setTimeout(() => {
|
|
597
|
-
waiter(false);
|
|
598
|
-
}, timeoutMs);
|
|
599
|
-
});
|
|
600
|
-
}
|
|
601
|
-
notifyAppStateKeyShareWaiters(received) {
|
|
602
|
-
if (this.appStateKeyShareWaiters.size === 0) {
|
|
603
|
-
return;
|
|
604
|
-
}
|
|
605
|
-
const waiters = [...this.appStateKeyShareWaiters.values()];
|
|
606
|
-
this.appStateKeyShareWaiters.clear();
|
|
607
|
-
for (const waiter of waiters) {
|
|
608
|
-
waiter(received);
|
|
609
|
-
}
|
|
610
|
-
}
|
|
611
514
|
emitChatEventsFromAppStateSyncResult(syncResult) {
|
|
612
515
|
const shouldEmitSnapshotMutations = this.options.chatEvents?.emitSnapshotMutations === true;
|
|
613
516
|
for (const collectionResult of syncResult.collections) {
|
|
@@ -647,75 +550,13 @@ class WaClient extends node_events_1.EventEmitter {
|
|
|
647
550
|
}
|
|
648
551
|
}
|
|
649
552
|
}
|
|
650
|
-
async startCommsWithCredentials(credentials) {
|
|
651
|
-
this.logger.debug('starting comms with credentials', {
|
|
652
|
-
registered: credentials.meJid !== null && credentials.meJid !== undefined
|
|
653
|
-
});
|
|
654
|
-
const commsConfig = this.authClient.buildCommsConfig(this.options);
|
|
655
|
-
const comms = new WaComms_1.WaComms(commsConfig, this.logger);
|
|
656
|
-
this.mediaConnCache = null;
|
|
657
|
-
this.nodeTransport.bindComms(comms);
|
|
658
|
-
try {
|
|
659
|
-
comms.startComms(async (frame) => this.handleIncomingFrame(frame));
|
|
660
|
-
await comms.waitForConnection(commsConfig.connectTimeoutMs);
|
|
661
|
-
this.comms = comms;
|
|
662
|
-
this.logger.info('comms connected');
|
|
663
|
-
comms.startHandlingRequests();
|
|
664
|
-
if (credentials.meJid) {
|
|
665
|
-
this.keepAlive.start();
|
|
666
|
-
}
|
|
667
|
-
else {
|
|
668
|
-
this.keepAlive.stop();
|
|
669
|
-
}
|
|
670
|
-
const serverStaticKey = comms.getServerStaticKey();
|
|
671
|
-
if (!serverStaticKey) {
|
|
672
|
-
this.logger.trace('no server static key available to persist');
|
|
673
|
-
}
|
|
674
|
-
else {
|
|
675
|
-
await this.authClient.persistServerStaticKey(serverStaticKey);
|
|
676
|
-
this.logger.debug('persisted server static key after comms connect');
|
|
677
|
-
}
|
|
678
|
-
this.passiveTasks.startPassiveTasksAfterConnect();
|
|
679
|
-
}
|
|
680
|
-
catch (error) {
|
|
681
|
-
this.clearCommsBinding();
|
|
682
|
-
try {
|
|
683
|
-
await comms.stopComms();
|
|
684
|
-
}
|
|
685
|
-
catch (stopError) {
|
|
686
|
-
this.logger.warn('failed to cleanup comms after connection start failure', {
|
|
687
|
-
message: (0, primitives_1.toError)(stopError).message
|
|
688
|
-
});
|
|
689
|
-
}
|
|
690
|
-
throw error;
|
|
691
|
-
}
|
|
692
|
-
}
|
|
693
|
-
shouldQueueDanglingReceipt(node, error) {
|
|
694
|
-
if (node.tag !== constants_1.WA_MESSAGE_TAGS.RECEIPT) {
|
|
695
|
-
return false;
|
|
696
|
-
}
|
|
697
|
-
const normalized = error.message.trim().toLowerCase();
|
|
698
|
-
return (normalized === 'comms is not connected' ||
|
|
699
|
-
normalized === 'websocket is not connected' ||
|
|
700
|
-
normalized === 'noise session socket closed' ||
|
|
701
|
-
normalized.startsWith('socket closed ('));
|
|
702
|
-
}
|
|
703
|
-
enqueueDanglingReceipt(node) {
|
|
704
|
-
if (this.danglingReceipts.length >= constants_1.WA_DEFAULTS.MAX_DANGLING_RECEIPTS) {
|
|
705
|
-
this.danglingReceipts.shift();
|
|
706
|
-
}
|
|
707
|
-
this.danglingReceipts.push(node.content === undefined
|
|
708
|
-
? {
|
|
709
|
-
tag: node.tag,
|
|
710
|
-
attrs: { ...node.attrs }
|
|
711
|
-
}
|
|
712
|
-
: {
|
|
713
|
-
tag: node.tag,
|
|
714
|
-
attrs: { ...node.attrs },
|
|
715
|
-
content: node.content
|
|
716
|
-
});
|
|
717
|
-
}
|
|
718
553
|
async clearStoredState() {
|
|
554
|
+
const danglingReceipts = this.receiptQueue.take();
|
|
555
|
+
if (danglingReceipts.length > 0) {
|
|
556
|
+
this.logger.debug('cleared dangling receipts while clearing stored state', {
|
|
557
|
+
count: danglingReceipts.length
|
|
558
|
+
});
|
|
559
|
+
}
|
|
719
560
|
await this.authClient.clearStoredCredentials();
|
|
720
561
|
await this.appStateStore.clear();
|
|
721
562
|
await this.contactStore.clear();
|
|
@@ -731,19 +572,5 @@ class WaClient extends node_events_1.EventEmitter {
|
|
|
731
572
|
this.logger.error('wa client error', { message: error.message });
|
|
732
573
|
this.emit('client_error', { error });
|
|
733
574
|
}
|
|
734
|
-
clearCommsBinding() {
|
|
735
|
-
this.notifyAppStateKeyShareWaiters(false);
|
|
736
|
-
this.comms = null;
|
|
737
|
-
this.nodeTransport.bindComms(null);
|
|
738
|
-
}
|
|
739
|
-
updateClockSkewFromSuccess(serverUnixSeconds) {
|
|
740
|
-
const serverMs = serverUnixSeconds * 1000;
|
|
741
|
-
const nowMs = Date.now();
|
|
742
|
-
this.clockSkewMs = serverMs - nowMs;
|
|
743
|
-
this.logger.debug('updated clock skew from success', {
|
|
744
|
-
serverUnixSeconds,
|
|
745
|
-
clockSkewMs: this.clockSkewMs
|
|
746
|
-
});
|
|
747
|
-
}
|
|
748
575
|
}
|
|
749
576
|
exports.WaClient = WaClient;
|