zapo-js 0.1.1 → 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 +8 -0
- 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 +26 -5
- 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
|
@@ -85,18 +85,6 @@ class SenderKeySqliteStore extends BaseSqliteStore_1.BaseSqliteStore {
|
|
|
85
85
|
device: (0, coercion_1.asNumber)(row.sender_device, 'sender_keys.sender_device')
|
|
86
86
|
});
|
|
87
87
|
}
|
|
88
|
-
async getDeviceSenderKeyDistribution(groupId, sender) {
|
|
89
|
-
const db = await this.getConnection();
|
|
90
|
-
const target = (0, sqlite_1.toSignalAddressParts)(sender);
|
|
91
|
-
const row = db.get(`SELECT group_id, sender_user, sender_server, sender_device, key_id, timestamp_ms
|
|
92
|
-
FROM sender_key_distribution
|
|
93
|
-
WHERE session_id = ?
|
|
94
|
-
AND group_id = ?
|
|
95
|
-
AND sender_user = ?
|
|
96
|
-
AND sender_server = ?
|
|
97
|
-
AND sender_device = ?`, [this.options.sessionId, groupId, target.user, target.server, target.device]);
|
|
98
|
-
return row ? (0, sqlite_1.decodeSenderKeyDistributionRow)(row) : null;
|
|
99
|
-
}
|
|
100
88
|
async getDeviceSenderKeyDistributions(groupId, senders) {
|
|
101
89
|
if (senders.length === 0) {
|
|
102
90
|
return [];
|
|
@@ -139,14 +127,29 @@ class SenderKeySqliteStore extends BaseSqliteStore_1.BaseSqliteStore {
|
|
|
139
127
|
if (participants.length === 0) {
|
|
140
128
|
return 0;
|
|
141
129
|
}
|
|
142
|
-
return this.withTransaction(
|
|
143
|
-
let
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
130
|
+
return this.withTransaction((db) => {
|
|
131
|
+
let filters = '';
|
|
132
|
+
const params = [this.options.sessionId, groupId];
|
|
133
|
+
for (let index = 0; index < participants.length; index += 1) {
|
|
134
|
+
if (index > 0) {
|
|
135
|
+
filters += ' OR ';
|
|
136
|
+
}
|
|
137
|
+
filters += '(sender_user = ? AND sender_server = ? AND sender_device = ?)';
|
|
138
|
+
const sender = (0, sqlite_1.toSignalAddressParts)(participants[index]);
|
|
139
|
+
params.push(sender.user, sender.server, sender.device);
|
|
148
140
|
}
|
|
149
|
-
|
|
141
|
+
const where = `session_id = ? AND group_id = ? AND (${filters})`;
|
|
142
|
+
db.run(`DELETE FROM sender_keys WHERE ${where}`, params);
|
|
143
|
+
const senderCountRow = db.get('SELECT changes() AS total', []);
|
|
144
|
+
const senderCount = senderCountRow
|
|
145
|
+
? (0, coercion_1.asNumber)(senderCountRow.total, 'sender_keys.changes')
|
|
146
|
+
: 0;
|
|
147
|
+
db.run(`DELETE FROM sender_key_distribution WHERE ${where}`, params);
|
|
148
|
+
const distributionCountRow = db.get('SELECT changes() AS total', []);
|
|
149
|
+
const distributionCount = distributionCountRow
|
|
150
|
+
? (0, coercion_1.asNumber)(distributionCountRow.total, 'sender_key_distribution.changes')
|
|
151
|
+
: 0;
|
|
152
|
+
return senderCount + distributionCount;
|
|
150
153
|
});
|
|
151
154
|
}
|
|
152
155
|
async clear() {
|
|
@@ -160,20 +163,12 @@ class SenderKeySqliteStore extends BaseSqliteStore_1.BaseSqliteStore {
|
|
|
160
163
|
countDelete(db, table, target, groupId) {
|
|
161
164
|
const whereWithGroup = 'session_id = ? AND sender_user = ? AND sender_server = ? AND sender_device = ? AND group_id = ?';
|
|
162
165
|
const whereAllGroups = 'session_id = ? AND sender_user = ? AND sender_server = ? AND sender_device = ?';
|
|
163
|
-
const countRow = db.get(`SELECT COUNT(*) AS count
|
|
164
|
-
FROM ${table}
|
|
165
|
-
WHERE ${groupId ? whereWithGroup : whereAllGroups}`, groupId
|
|
166
|
-
? [this.options.sessionId, target.user, target.server, target.device, groupId]
|
|
167
|
-
: [this.options.sessionId, target.user, target.server, target.device]);
|
|
168
|
-
const count = (0, sqlite_1.decodeSqliteCount)(countRow, `${table}.count`);
|
|
169
|
-
if (count === 0) {
|
|
170
|
-
return 0;
|
|
171
|
-
}
|
|
172
166
|
db.run(`DELETE FROM ${table}
|
|
173
167
|
WHERE ${groupId ? whereWithGroup : whereAllGroups}`, groupId
|
|
174
168
|
? [this.options.sessionId, target.user, target.server, target.device, groupId]
|
|
175
169
|
: [this.options.sessionId, target.user, target.server, target.device]);
|
|
176
|
-
|
|
170
|
+
const row = db.get('SELECT changes() AS total', []);
|
|
171
|
+
return row ? (0, coercion_1.asNumber)(row.total, `${table}.changes`) : 0;
|
|
177
172
|
}
|
|
178
173
|
upsertSenderKeyDistributionRow(db, record, sender) {
|
|
179
174
|
db.run(`INSERT INTO sender_key_distribution (
|
|
@@ -1,14 +1,24 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.WaSignalSqliteStore = void 0;
|
|
4
|
+
const jid_1 = require("../../../protocol/jid");
|
|
4
5
|
const sqlite_1 = require("../../../signal/store/sqlite");
|
|
5
6
|
const BaseSqliteStore_1 = require("../../providers/sqlite/BaseSqliteStore");
|
|
6
7
|
const coercion_1 = require("../../../util/coercion");
|
|
7
|
-
const signal_address_1 = require("../../../util/signal-address");
|
|
8
8
|
const DEFAULTS = Object.freeze({
|
|
9
9
|
preKeyBatchSize: 500,
|
|
10
10
|
hasSessionBatchSize: 250
|
|
11
11
|
});
|
|
12
|
+
function repeatSqlToken(token, count, separator) {
|
|
13
|
+
if (count <= 1) {
|
|
14
|
+
return token;
|
|
15
|
+
}
|
|
16
|
+
let out = token;
|
|
17
|
+
for (let index = 1; index < count; index += 1) {
|
|
18
|
+
out += separator + token;
|
|
19
|
+
}
|
|
20
|
+
return out;
|
|
21
|
+
}
|
|
12
22
|
class WaSignalSqliteStore extends BaseSqliteStore_1.BaseSqliteStore {
|
|
13
23
|
constructor(options, storeOptions = {}) {
|
|
14
24
|
super(options, ['signal']);
|
|
@@ -144,7 +154,7 @@ class WaSignalSqliteStore extends BaseSqliteStore_1.BaseSqliteStore {
|
|
|
144
154
|
for (let start = 0; start < uniqueKeyIds.length; start += this.preKeyBatchSize) {
|
|
145
155
|
const end = Math.min(start + this.preKeyBatchSize, uniqueKeyIds.length);
|
|
146
156
|
const batchLength = end - start;
|
|
147
|
-
const placeholders =
|
|
157
|
+
const placeholders = repeatSqlToken('?', batchLength, ', ');
|
|
148
158
|
const params = [this.options.sessionId];
|
|
149
159
|
for (let index = start; index < end; index += 1) {
|
|
150
160
|
params.push(uniqueKeyIds[index]);
|
|
@@ -216,9 +226,7 @@ class WaSignalSqliteStore extends BaseSqliteStore_1.BaseSqliteStore {
|
|
|
216
226
|
for (let start = 0; start < targets.length; start += this.hasSessionBatchSize) {
|
|
217
227
|
const end = Math.min(start + this.hasSessionBatchSize, targets.length);
|
|
218
228
|
const batchLength = end - start;
|
|
219
|
-
const filters =
|
|
220
|
-
.fill('(user = ? AND server = ? AND device = ?)')
|
|
221
|
-
.join(' OR ');
|
|
229
|
+
const filters = repeatSqlToken('(user = ? AND server = ? AND device = ?)', batchLength, ' OR ');
|
|
222
230
|
const params = [this.options.sessionId];
|
|
223
231
|
for (let index = start; index < end; index += 1) {
|
|
224
232
|
const target = targets[index];
|
|
@@ -228,14 +236,14 @@ class WaSignalSqliteStore extends BaseSqliteStore_1.BaseSqliteStore {
|
|
|
228
236
|
FROM signal_session
|
|
229
237
|
WHERE session_id = ? AND (${filters})`, params);
|
|
230
238
|
for (const row of rows) {
|
|
231
|
-
existingKeys.add((0,
|
|
239
|
+
existingKeys.add((0, jid_1.signalAddressKey)({
|
|
232
240
|
user: (0, coercion_1.asString)(row.user, 'signal_session.user'),
|
|
233
241
|
server: (0, coercion_1.asString)(row.server, 'signal_session.server'),
|
|
234
242
|
device: (0, coercion_1.asNumber)(row.device, 'signal_session.device')
|
|
235
243
|
}));
|
|
236
244
|
}
|
|
237
245
|
}
|
|
238
|
-
return
|
|
246
|
+
return targets.map((target) => existingKeys.has((0, jid_1.signalAddressKey)(target)));
|
|
239
247
|
}
|
|
240
248
|
async getSession(address) {
|
|
241
249
|
const db = await this.getConnection();
|
|
@@ -245,24 +253,50 @@ class WaSignalSqliteStore extends BaseSqliteStore_1.BaseSqliteStore {
|
|
|
245
253
|
WHERE session_id = ? AND user = ? AND server = ? AND device = ?`, [this.options.sessionId, target.user, target.server, target.device]);
|
|
246
254
|
return row ? (0, sqlite_1.decodeSignalSessionRecord)(row.record) : null;
|
|
247
255
|
}
|
|
256
|
+
async getSessionsBatch(addresses) {
|
|
257
|
+
if (addresses.length === 0) {
|
|
258
|
+
return [];
|
|
259
|
+
}
|
|
260
|
+
const db = await this.getConnection();
|
|
261
|
+
const targets = addresses.map((address) => (0, sqlite_1.toSignalAddressParts)(address));
|
|
262
|
+
const byAddressKey = new Map();
|
|
263
|
+
for (let start = 0; start < targets.length; start += this.hasSessionBatchSize) {
|
|
264
|
+
const end = Math.min(start + this.hasSessionBatchSize, targets.length);
|
|
265
|
+
const batchLength = end - start;
|
|
266
|
+
const filters = repeatSqlToken('(user = ? AND server = ? AND device = ?)', batchLength, ' OR ');
|
|
267
|
+
const params = [this.options.sessionId];
|
|
268
|
+
for (let index = start; index < end; index += 1) {
|
|
269
|
+
const target = targets[index];
|
|
270
|
+
params.push(target.user, target.server, target.device);
|
|
271
|
+
}
|
|
272
|
+
const rows = db.all(`SELECT user, server, device, record
|
|
273
|
+
FROM signal_session
|
|
274
|
+
WHERE session_id = ? AND (${filters})`, params);
|
|
275
|
+
for (const row of rows) {
|
|
276
|
+
byAddressKey.set((0, jid_1.signalAddressKey)({
|
|
277
|
+
user: (0, coercion_1.asString)(row.user, 'signal_session.user'),
|
|
278
|
+
server: (0, coercion_1.asString)(row.server, 'signal_session.server'),
|
|
279
|
+
device: (0, coercion_1.asNumber)(row.device, 'signal_session.device')
|
|
280
|
+
}), (0, sqlite_1.decodeSignalSessionRecord)(row.record));
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
return targets.map((target) => byAddressKey.get((0, jid_1.signalAddressKey)(target)) ?? null);
|
|
284
|
+
}
|
|
248
285
|
async setSession(address, session) {
|
|
249
286
|
const db = await this.getConnection();
|
|
250
287
|
const target = (0, sqlite_1.toSignalAddressParts)(address);
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
target.device,
|
|
264
|
-
(0, sqlite_1.encodeSignalSessionRecord)(session)
|
|
265
|
-
]);
|
|
288
|
+
this.upsertSession(db, target, session);
|
|
289
|
+
}
|
|
290
|
+
async setSessionsBatch(entries) {
|
|
291
|
+
if (entries.length === 0) {
|
|
292
|
+
return;
|
|
293
|
+
}
|
|
294
|
+
await this.withTransaction((db) => {
|
|
295
|
+
for (let index = 0; index < entries.length; index += 1) {
|
|
296
|
+
const entry = entries[index];
|
|
297
|
+
this.upsertSession(db, (0, sqlite_1.toSignalAddressParts)(entry.address), entry.session);
|
|
298
|
+
}
|
|
299
|
+
});
|
|
266
300
|
}
|
|
267
301
|
async deleteSession(address) {
|
|
268
302
|
const db = await this.getConnection();
|
|
@@ -278,6 +312,35 @@ class WaSignalSqliteStore extends BaseSqliteStore_1.BaseSqliteStore {
|
|
|
278
312
|
WHERE session_id = ? AND user = ? AND server = ? AND device = ?`, [this.options.sessionId, target.user, target.server, target.device]);
|
|
279
313
|
return row ? (0, sqlite_1.decodeSignalRemoteIdentity)(row.identity_key) : null;
|
|
280
314
|
}
|
|
315
|
+
async getRemoteIdentities(addresses) {
|
|
316
|
+
if (addresses.length === 0) {
|
|
317
|
+
return [];
|
|
318
|
+
}
|
|
319
|
+
const db = await this.getConnection();
|
|
320
|
+
const targets = addresses.map((address) => (0, sqlite_1.toSignalAddressParts)(address));
|
|
321
|
+
const byAddressKey = new Map();
|
|
322
|
+
for (let start = 0; start < targets.length; start += this.hasSessionBatchSize) {
|
|
323
|
+
const end = Math.min(start + this.hasSessionBatchSize, targets.length);
|
|
324
|
+
const batchLength = end - start;
|
|
325
|
+
const filters = repeatSqlToken('(user = ? AND server = ? AND device = ?)', batchLength, ' OR ');
|
|
326
|
+
const params = [this.options.sessionId];
|
|
327
|
+
for (let index = start; index < end; index += 1) {
|
|
328
|
+
const target = targets[index];
|
|
329
|
+
params.push(target.user, target.server, target.device);
|
|
330
|
+
}
|
|
331
|
+
const rows = db.all(`SELECT user, server, device, identity_key
|
|
332
|
+
FROM signal_identity
|
|
333
|
+
WHERE session_id = ? AND (${filters})`, params);
|
|
334
|
+
for (const row of rows) {
|
|
335
|
+
byAddressKey.set((0, jid_1.signalAddressKey)({
|
|
336
|
+
user: (0, coercion_1.asString)(row.user, 'signal_identity.user'),
|
|
337
|
+
server: (0, coercion_1.asString)(row.server, 'signal_identity.server'),
|
|
338
|
+
device: (0, coercion_1.asNumber)(row.device, 'signal_identity.device')
|
|
339
|
+
}), (0, sqlite_1.decodeSignalRemoteIdentity)(row.identity_key));
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
return targets.map((target) => byAddressKey.get((0, jid_1.signalAddressKey)(target)) ?? null);
|
|
343
|
+
}
|
|
281
344
|
async setRemoteIdentity(address, identityKey) {
|
|
282
345
|
const db = await this.getConnection();
|
|
283
346
|
const target = (0, sqlite_1.toSignalAddressParts)(address);
|
|
@@ -297,7 +360,9 @@ class WaSignalSqliteStore extends BaseSqliteStore_1.BaseSqliteStore {
|
|
|
297
360
|
async clear() {
|
|
298
361
|
await this.withTransaction((db) => {
|
|
299
362
|
db.run('DELETE FROM signal_registration WHERE session_id = ?', [this.options.sessionId]);
|
|
300
|
-
db.run('DELETE FROM signal_signed_prekey WHERE session_id = ?', [
|
|
363
|
+
db.run('DELETE FROM signal_signed_prekey WHERE session_id = ?', [
|
|
364
|
+
this.options.sessionId
|
|
365
|
+
]);
|
|
301
366
|
db.run('DELETE FROM signal_prekey WHERE session_id = ?', [this.options.sessionId]);
|
|
302
367
|
db.run('DELETE FROM signal_session WHERE session_id = ?', [this.options.sessionId]);
|
|
303
368
|
db.run('DELETE FROM signal_identity WHERE session_id = ?', [this.options.sessionId]);
|
|
@@ -323,6 +388,23 @@ class WaSignalSqliteStore extends BaseSqliteStore_1.BaseSqliteStore {
|
|
|
323
388
|
record.uploaded === true ? 1 : 0
|
|
324
389
|
]);
|
|
325
390
|
}
|
|
391
|
+
upsertSession(db, target, session) {
|
|
392
|
+
db.run(`INSERT INTO signal_session (
|
|
393
|
+
session_id,
|
|
394
|
+
user,
|
|
395
|
+
server,
|
|
396
|
+
device,
|
|
397
|
+
record
|
|
398
|
+
) VALUES (?, ?, ?, ?, ?)
|
|
399
|
+
ON CONFLICT(session_id, user, server, device) DO UPDATE SET
|
|
400
|
+
record=excluded.record`, [
|
|
401
|
+
this.options.sessionId,
|
|
402
|
+
target.user,
|
|
403
|
+
target.server,
|
|
404
|
+
target.device,
|
|
405
|
+
(0, sqlite_1.encodeSignalSessionRecord)(session)
|
|
406
|
+
]);
|
|
407
|
+
}
|
|
326
408
|
ensureMetaRow(db) {
|
|
327
409
|
db.run(`INSERT INTO signal_meta (
|
|
328
410
|
session_id,
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.WA_SQLITE_DEFAULT_TABLE_NAMES = void 0;
|
|
4
|
+
exports.resolveSqliteTableNames = resolveSqliteTableNames;
|
|
5
|
+
exports.serializeSqliteTableNames = serializeSqliteTableNames;
|
|
6
|
+
exports.createSqliteTableNameSqlResolver = createSqliteTableNameSqlResolver;
|
|
7
|
+
const SQLITE_TABLE_NAME_PATTERN = /^[A-Za-z_][A-Za-z0-9_]*$/;
|
|
8
|
+
const WA_SQLITE_TABLE_NAME_ORDER = Object.freeze([
|
|
9
|
+
'wa_migrations',
|
|
10
|
+
'auth_credentials',
|
|
11
|
+
'signal_meta',
|
|
12
|
+
'signal_registration',
|
|
13
|
+
'signal_signed_prekey',
|
|
14
|
+
'signal_prekey',
|
|
15
|
+
'signal_session',
|
|
16
|
+
'signal_identity',
|
|
17
|
+
'sender_keys',
|
|
18
|
+
'sender_key_distribution',
|
|
19
|
+
'appstate_sync_keys',
|
|
20
|
+
'appstate_collection_versions',
|
|
21
|
+
'appstate_collection_index_values',
|
|
22
|
+
'retry_outbound_messages',
|
|
23
|
+
'retry_inbound_counters',
|
|
24
|
+
'mailbox_messages',
|
|
25
|
+
'mailbox_threads',
|
|
26
|
+
'mailbox_contacts',
|
|
27
|
+
'group_participants_cache',
|
|
28
|
+
'device_list_cache'
|
|
29
|
+
]);
|
|
30
|
+
const WA_SQLITE_ALLOWED_TABLE_NAME_SET = new Set(WA_SQLITE_TABLE_NAME_ORDER);
|
|
31
|
+
const WA_SQLITE_ALLOWED_TABLE_NAME_LIST = WA_SQLITE_TABLE_NAME_ORDER.join(', ');
|
|
32
|
+
exports.WA_SQLITE_DEFAULT_TABLE_NAMES = Object.freeze({
|
|
33
|
+
wa_migrations: 'wa_migrations',
|
|
34
|
+
auth_credentials: 'auth_credentials',
|
|
35
|
+
signal_meta: 'signal_meta',
|
|
36
|
+
signal_registration: 'signal_registration',
|
|
37
|
+
signal_signed_prekey: 'signal_signed_prekey',
|
|
38
|
+
signal_prekey: 'signal_prekey',
|
|
39
|
+
signal_session: 'signal_session',
|
|
40
|
+
signal_identity: 'signal_identity',
|
|
41
|
+
sender_keys: 'sender_keys',
|
|
42
|
+
sender_key_distribution: 'sender_key_distribution',
|
|
43
|
+
appstate_sync_keys: 'appstate_sync_keys',
|
|
44
|
+
appstate_collection_versions: 'appstate_collection_versions',
|
|
45
|
+
appstate_collection_index_values: 'appstate_collection_index_values',
|
|
46
|
+
retry_outbound_messages: 'retry_outbound_messages',
|
|
47
|
+
retry_inbound_counters: 'retry_inbound_counters',
|
|
48
|
+
mailbox_messages: 'mailbox_messages',
|
|
49
|
+
mailbox_threads: 'mailbox_threads',
|
|
50
|
+
mailbox_contacts: 'mailbox_contacts',
|
|
51
|
+
group_participants_cache: 'group_participants_cache',
|
|
52
|
+
device_list_cache: 'device_list_cache'
|
|
53
|
+
});
|
|
54
|
+
const DEFAULT_SQLITE_TABLE_NAME_SERIALIZATION = serializeSqliteTableNames(exports.WA_SQLITE_DEFAULT_TABLE_NAMES);
|
|
55
|
+
function normalizeTableName(table, rawValue) {
|
|
56
|
+
const value = rawValue.trim();
|
|
57
|
+
if (value.length === 0) {
|
|
58
|
+
throw new Error(`sqlite tableNames.${table} must be a non-empty string`);
|
|
59
|
+
}
|
|
60
|
+
if (!SQLITE_TABLE_NAME_PATTERN.test(value)) {
|
|
61
|
+
throw new Error(`sqlite tableNames.${table} must match ${SQLITE_TABLE_NAME_PATTERN.toString()}`);
|
|
62
|
+
}
|
|
63
|
+
return value;
|
|
64
|
+
}
|
|
65
|
+
function assertNoDuplicateTableNames(tableNames) {
|
|
66
|
+
const seen = new Set();
|
|
67
|
+
for (const table of WA_SQLITE_TABLE_NAME_ORDER) {
|
|
68
|
+
const mapped = tableNames[table];
|
|
69
|
+
const normalizedMapped = mapped.toLowerCase();
|
|
70
|
+
if (seen.has(normalizedMapped)) {
|
|
71
|
+
throw new Error(`sqlite tableNames contains duplicate target "${mapped}"`);
|
|
72
|
+
}
|
|
73
|
+
seen.add(normalizedMapped);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
function resolveSqliteTableNames(overrides) {
|
|
77
|
+
if (!overrides) {
|
|
78
|
+
return exports.WA_SQLITE_DEFAULT_TABLE_NAMES;
|
|
79
|
+
}
|
|
80
|
+
const entries = Object.entries(overrides);
|
|
81
|
+
if (entries.length === 0) {
|
|
82
|
+
return exports.WA_SQLITE_DEFAULT_TABLE_NAMES;
|
|
83
|
+
}
|
|
84
|
+
const resolved = {
|
|
85
|
+
...exports.WA_SQLITE_DEFAULT_TABLE_NAMES
|
|
86
|
+
};
|
|
87
|
+
for (const [table, rawName] of entries) {
|
|
88
|
+
if (!WA_SQLITE_ALLOWED_TABLE_NAME_SET.has(table)) {
|
|
89
|
+
throw new Error(`unsupported sqlite tableNames key "${table}". Allowed table names: ${WA_SQLITE_ALLOWED_TABLE_NAME_LIST}`);
|
|
90
|
+
}
|
|
91
|
+
if (typeof rawName !== 'string') {
|
|
92
|
+
throw new Error(`sqlite tableNames.${table} must be a string`);
|
|
93
|
+
}
|
|
94
|
+
const tableName = table;
|
|
95
|
+
resolved[tableName] = normalizeTableName(tableName, rawName);
|
|
96
|
+
}
|
|
97
|
+
assertNoDuplicateTableNames(resolved);
|
|
98
|
+
return Object.freeze(resolved);
|
|
99
|
+
}
|
|
100
|
+
function serializeSqliteTableNames(tableNames) {
|
|
101
|
+
return WA_SQLITE_TABLE_NAME_ORDER.map((table) => `${table}=${tableNames[table]}`).join(';');
|
|
102
|
+
}
|
|
103
|
+
function escapeRegexToken(value) {
|
|
104
|
+
return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
105
|
+
}
|
|
106
|
+
function createSqliteTableNameSqlResolver(tableNames) {
|
|
107
|
+
const serialized = serializeSqliteTableNames(tableNames);
|
|
108
|
+
if (serialized === DEFAULT_SQLITE_TABLE_NAME_SERIALIZATION) {
|
|
109
|
+
return (sql) => sql;
|
|
110
|
+
}
|
|
111
|
+
const pattern = new RegExp(`\\b(?:${WA_SQLITE_TABLE_NAME_ORDER.map(escapeRegexToken).join('|')})\\b`, 'g');
|
|
112
|
+
return (sql) => sql.replace(pattern, (token) => tableNames[token] ?? token);
|
|
113
|
+
}
|
|
@@ -23,28 +23,17 @@ class WaThreadSqliteStore extends BaseSqliteStore_1.BaseSqliteStore {
|
|
|
23
23
|
}
|
|
24
24
|
async upsert(record) {
|
|
25
25
|
const db = await this.getConnection();
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
ephemeral_expiration=COALESCE(excluded.ephemeral_expiration, mailbox_threads.ephemeral_expiration)`, [
|
|
38
|
-
this.options.sessionId,
|
|
39
|
-
record.jid,
|
|
40
|
-
record.name ?? null,
|
|
41
|
-
record.unreadCount ?? null,
|
|
42
|
-
record.archived === undefined ? null : record.archived ? 1 : 0,
|
|
43
|
-
record.pinned ?? null,
|
|
44
|
-
record.muteEndMs ?? null,
|
|
45
|
-
record.markedAsUnread === undefined ? null : record.markedAsUnread ? 1 : 0,
|
|
46
|
-
record.ephemeralExpiration ?? null
|
|
47
|
-
]);
|
|
26
|
+
this.upsertThreadRow(db, record);
|
|
27
|
+
}
|
|
28
|
+
async upsertBatch(records) {
|
|
29
|
+
if (records.length === 0) {
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
await this.withTransaction((db) => {
|
|
33
|
+
for (const record of records) {
|
|
34
|
+
this.upsertThreadRow(db, record);
|
|
35
|
+
}
|
|
36
|
+
});
|
|
48
37
|
}
|
|
49
38
|
async getByJid(jid) {
|
|
50
39
|
const db = await this.getConnection();
|
|
@@ -72,5 +61,29 @@ class WaThreadSqliteStore extends BaseSqliteStore_1.BaseSqliteStore {
|
|
|
72
61
|
const db = await this.getConnection();
|
|
73
62
|
db.run('DELETE FROM mailbox_threads WHERE session_id = ?', [this.options.sessionId]);
|
|
74
63
|
}
|
|
64
|
+
upsertThreadRow(db, record) {
|
|
65
|
+
db.run(`INSERT INTO mailbox_threads (
|
|
66
|
+
session_id, jid, name, unread_count, archived, pinned,
|
|
67
|
+
mute_end_ms, marked_as_unread, ephemeral_expiration
|
|
68
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
69
|
+
ON CONFLICT(session_id, jid) DO UPDATE SET
|
|
70
|
+
name=COALESCE(excluded.name, mailbox_threads.name),
|
|
71
|
+
unread_count=COALESCE(excluded.unread_count, mailbox_threads.unread_count),
|
|
72
|
+
archived=COALESCE(excluded.archived, mailbox_threads.archived),
|
|
73
|
+
pinned=COALESCE(excluded.pinned, mailbox_threads.pinned),
|
|
74
|
+
mute_end_ms=COALESCE(excluded.mute_end_ms, mailbox_threads.mute_end_ms),
|
|
75
|
+
marked_as_unread=COALESCE(excluded.marked_as_unread, mailbox_threads.marked_as_unread),
|
|
76
|
+
ephemeral_expiration=COALESCE(excluded.ephemeral_expiration, mailbox_threads.ephemeral_expiration)`, [
|
|
77
|
+
this.options.sessionId,
|
|
78
|
+
record.jid,
|
|
79
|
+
record.name ?? null,
|
|
80
|
+
record.unreadCount ?? null,
|
|
81
|
+
record.archived === undefined ? null : record.archived ? 1 : 0,
|
|
82
|
+
record.pinned ?? null,
|
|
83
|
+
record.muteEndMs ?? null,
|
|
84
|
+
record.markedAsUnread === undefined ? null : record.markedAsUnread ? 1 : 0,
|
|
85
|
+
record.ephemeralExpiration ?? null
|
|
86
|
+
]);
|
|
87
|
+
}
|
|
75
88
|
}
|
|
76
89
|
exports.WaThreadSqliteStore = WaThreadSqliteStore;
|
|
@@ -6,8 +6,8 @@ const BoundedTaskQueue_1 = require("../infra/perf/BoundedTaskQueue");
|
|
|
6
6
|
const constants_1 = require("../protocol/constants");
|
|
7
7
|
const WaNoiseSession_1 = require("./noise/WaNoiseSession");
|
|
8
8
|
const WaWebSocket_1 = require("./WaWebSocket");
|
|
9
|
-
const base64_1 = require("../util/base64");
|
|
10
9
|
const bytes_1 = require("../util/bytes");
|
|
10
|
+
const bytes_2 = require("../util/bytes");
|
|
11
11
|
const primitives_1 = require("../util/primitives");
|
|
12
12
|
const WA_FRAME_HANDLER_QUEUE_MAX_SIZE = 4096;
|
|
13
13
|
const WA_FRAME_HANDLER_MAX_CONCURRENCY = 8;
|
|
@@ -30,6 +30,8 @@ class WaComms {
|
|
|
30
30
|
url: this.config.url,
|
|
31
31
|
urls: this.config.urls,
|
|
32
32
|
protocols: this.config.protocols,
|
|
33
|
+
dispatcher: this.config.dispatcher,
|
|
34
|
+
agent: this.config.agent,
|
|
33
35
|
timeoutIntervalMs: this.config.timeoutIntervalMs
|
|
34
36
|
}, logger);
|
|
35
37
|
this.socket.setHandlers({
|
|
@@ -80,7 +82,7 @@ class WaComms {
|
|
|
80
82
|
if (!routingInfo || routingInfo.byteLength === 0) {
|
|
81
83
|
return config;
|
|
82
84
|
}
|
|
83
|
-
const edValue = (0,
|
|
85
|
+
const edValue = (0, bytes_1.bytesToBase64UrlSafe)(routingInfo);
|
|
84
86
|
const appendEd = (url) => {
|
|
85
87
|
try {
|
|
86
88
|
const parsed = new URL(url);
|
|
@@ -147,9 +149,7 @@ class WaComms {
|
|
|
147
149
|
startHandlingRequests() {
|
|
148
150
|
this.handlingRequests = true;
|
|
149
151
|
this.logger.debug('comms request handling enabled');
|
|
150
|
-
this.frameProcessingQueue = this.frameProcessingQueue
|
|
151
|
-
.catch(() => undefined)
|
|
152
|
-
.then(async () => this.flushPendingFrames());
|
|
152
|
+
this.frameProcessingQueue = this.frameProcessingQueue.then(() => this.flushPendingFrames(), () => this.flushPendingFrames());
|
|
153
153
|
}
|
|
154
154
|
async stopComms() {
|
|
155
155
|
this.logger.info('comms stop requested');
|
|
@@ -275,9 +275,7 @@ class WaComms {
|
|
|
275
275
|
});
|
|
276
276
|
}
|
|
277
277
|
onSocketMessage(payload) {
|
|
278
|
-
this.frameProcessingQueue = this.frameProcessingQueue
|
|
279
|
-
.catch(() => undefined)
|
|
280
|
-
.then(async () => this.processSocketPayload(payload));
|
|
278
|
+
this.frameProcessingQueue = this.frameProcessingQueue.then(() => this.processSocketPayload(payload), () => this.processSocketPayload(payload));
|
|
281
279
|
}
|
|
282
280
|
async processSocketPayload(payload) {
|
|
283
281
|
if (!this.noiseSession) {
|
|
@@ -342,7 +340,7 @@ class WaComms {
|
|
|
342
340
|
this.noiseSession = null;
|
|
343
341
|
throw error;
|
|
344
342
|
}
|
|
345
|
-
const buffered = await session.pushWireChunk(
|
|
343
|
+
const buffered = await session.pushWireChunk(bytes_2.EMPTY_BYTES);
|
|
346
344
|
this.routeDecodedFrames(buffered);
|
|
347
345
|
this.resumeHandshakeFailures = 0;
|
|
348
346
|
this.lastServerStaticKey = session.getServerStaticKey();
|
|
@@ -426,20 +424,19 @@ class WaComms {
|
|
|
426
424
|
}
|
|
427
425
|
scheduleDecodedFrame(frame) {
|
|
428
426
|
void this.frameHandlerQueue
|
|
429
|
-
.enqueue(
|
|
427
|
+
.enqueue(() => this.onDecodedFrame(frame))
|
|
430
428
|
.catch((error) => {
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
429
|
+
if (error instanceof BoundedTaskQueue_1.BoundedTaskQueueFullError) {
|
|
430
|
+
this.logger.warn('frame handler queue is full, resuming socket to preserve bounds', {
|
|
431
|
+
pending: this.frameHandlerQueue.pending(),
|
|
432
|
+
inFlight: this.frameHandlerQueue.inFlight()
|
|
433
|
+
});
|
|
434
|
+
void this.closeSocketAndResume();
|
|
436
435
|
return;
|
|
437
436
|
}
|
|
438
|
-
this.logger.
|
|
439
|
-
|
|
440
|
-
inFlight: this.frameHandlerQueue.inFlight()
|
|
437
|
+
this.logger.error('failed to enqueue decoded frame handler', {
|
|
438
|
+
message: (0, primitives_1.toError)(error).message
|
|
441
439
|
});
|
|
442
|
-
void this.onDecodedFrame(frame);
|
|
443
440
|
});
|
|
444
441
|
}
|
|
445
442
|
scheduleReconnect() {
|
|
@@ -463,12 +460,16 @@ class WaComms {
|
|
|
463
460
|
this.reconnectTimer = null;
|
|
464
461
|
}
|
|
465
462
|
removeWaiter(reject) {
|
|
466
|
-
|
|
467
|
-
|
|
463
|
+
for (let index = 0; index < this.waiters.length; index += 1) {
|
|
464
|
+
const waiter = this.waiters[index];
|
|
465
|
+
if (waiter.reject !== reject) {
|
|
466
|
+
continue;
|
|
467
|
+
}
|
|
468
|
+
clearTimeout(waiter.timer);
|
|
469
|
+
this.waiters[index] = this.waiters[this.waiters.length - 1];
|
|
470
|
+
this.waiters.pop();
|
|
468
471
|
return;
|
|
469
472
|
}
|
|
470
|
-
const [waiter] = this.waiters.splice(index, 1);
|
|
471
|
-
clearTimeout(waiter.timer);
|
|
472
473
|
}
|
|
473
474
|
withStickyRoutingCookie(headers) {
|
|
474
475
|
const out = headers ? { ...headers } : {};
|
|
@@ -521,11 +522,12 @@ class WaComms {
|
|
|
521
522
|
}
|
|
522
523
|
}
|
|
523
524
|
drainWaiters(drain) {
|
|
524
|
-
|
|
525
|
-
|
|
525
|
+
for (let index = this.waiters.length - 1; index >= 0; index -= 1) {
|
|
526
|
+
const waiter = this.waiters[index];
|
|
526
527
|
clearTimeout(waiter.timer);
|
|
527
528
|
drain(waiter);
|
|
528
529
|
}
|
|
530
|
+
this.waiters.length = 0;
|
|
529
531
|
}
|
|
530
532
|
}
|
|
531
533
|
exports.WaComms = WaComms;
|