zapo-js 0.1.2 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +12 -4
- package/dist/appstate/WaAppStateCrypto.js +1 -1
- package/dist/appstate/WaAppStateSyncClient.js +138 -93
- package/dist/appstate/{store/sqlite.js → encoding.js} +13 -8
- package/dist/appstate/index.js +8 -6
- package/dist/appstate/utils.js +0 -5
- package/dist/auth/WaAuthClient.js +36 -47
- package/dist/auth/flow/WaAuthCredentialsFlow.js +7 -7
- package/dist/auth/index.js +1 -6
- package/dist/auth/pairing/WaPairingCodeCrypto.js +6 -4
- package/dist/auth/pairing/WaPairingFlow.js +13 -3
- package/dist/client/WaClient.js +225 -101
- package/dist/client/WaClientFactory.js +294 -44
- package/dist/client/connection/WaConnectionManager.js +19 -10
- package/dist/client/coordinators/WaBusinessCoordinator.js +241 -0
- package/dist/client/coordinators/WaGroupCoordinator.js +11 -7
- package/dist/client/coordinators/WaIncomingNodeCoordinator.js +1 -0
- package/dist/client/coordinators/WaMessageDispatchCoordinator.js +292 -99
- package/dist/client/coordinators/WaPassiveTasksCoordinator.js +74 -31
- package/dist/client/coordinators/WaPrivacyCoordinator.js +134 -0
- package/dist/client/coordinators/WaProfileCoordinator.js +212 -0
- package/dist/client/coordinators/WaRetryCoordinator.js +179 -27
- package/dist/client/coordinators/WaStreamControlCoordinator.js +18 -11
- package/dist/client/coordinators/WaTrustedContactTokenCoordinator.js +166 -0
- package/dist/client/dirty.js +40 -20
- package/dist/client/events/devices.js +72 -0
- package/dist/client/events/group.js +3 -11
- package/dist/client/events/identity.js +22 -0
- package/dist/client/events/privacy-token.js +39 -0
- package/dist/client/history-sync.js +50 -9
- package/dist/client/incoming.js +37 -7
- package/dist/client/mailbox.js +24 -23
- package/dist/client/messages.js +107 -31
- package/dist/client/messaging/fanout.js +21 -11
- package/dist/client/messaging/participants.js +6 -4
- package/dist/client/persistence/WriteBehindPersistence.js +129 -0
- package/dist/client/tokens/cs-token.js +50 -0
- package/dist/client/tokens/tc-token.js +25 -0
- package/dist/crypto/core/index.js +2 -2
- package/dist/crypto/core/keys.js +4 -4
- package/dist/crypto/core/nonce.js +2 -0
- package/dist/crypto/core/primitives.js +0 -8
- package/dist/crypto/core/random.js +22 -0
- package/dist/crypto/curves/X25519.js +25 -6
- package/dist/crypto/index.js +3 -0
- package/dist/crypto/math/constants.js +13 -36
- package/dist/crypto/math/edwards.js +171 -44
- package/dist/crypto/math/fe.js +706 -0
- package/dist/crypto/math/mod.js +10 -3
- package/dist/esm/appstate/WaAppStateCrypto.js +1 -1
- package/dist/esm/appstate/WaAppStateSyncClient.js +138 -93
- package/dist/esm/appstate/{store/sqlite.js → encoding.js} +13 -8
- package/dist/esm/appstate/index.js +2 -2
- package/dist/esm/appstate/utils.js +2 -5
- package/dist/esm/auth/WaAuthClient.js +36 -47
- package/dist/esm/auth/flow/WaAuthCredentialsFlow.js +7 -7
- package/dist/esm/auth/index.js +0 -2
- package/dist/esm/auth/pairing/WaPairingCodeCrypto.js +6 -4
- package/dist/esm/auth/pairing/WaPairingFlow.js +14 -4
- package/dist/esm/client/WaClient.js +225 -101
- package/dist/esm/client/WaClientFactory.js +295 -45
- package/dist/esm/client/connection/WaConnectionManager.js +19 -10
- package/dist/esm/client/coordinators/WaBusinessCoordinator.js +238 -0
- package/dist/esm/client/coordinators/WaGroupCoordinator.js +11 -7
- package/dist/esm/client/coordinators/WaIncomingNodeCoordinator.js +1 -0
- package/dist/esm/client/coordinators/WaMessageDispatchCoordinator.js +295 -102
- package/dist/esm/client/coordinators/WaPassiveTasksCoordinator.js +74 -31
- package/dist/esm/client/coordinators/WaPrivacyCoordinator.js +131 -0
- package/dist/esm/client/coordinators/WaProfileCoordinator.js +209 -0
- package/dist/esm/client/coordinators/WaRetryCoordinator.js +181 -29
- package/dist/esm/client/coordinators/WaStreamControlCoordinator.js +19 -12
- package/dist/esm/client/coordinators/WaTrustedContactTokenCoordinator.js +162 -0
- package/dist/esm/client/dirty.js +40 -20
- package/dist/esm/client/events/devices.js +68 -0
- package/dist/esm/client/events/group.js +3 -11
- package/dist/esm/client/events/identity.js +19 -0
- package/dist/esm/client/events/privacy-token.js +36 -0
- package/dist/esm/client/history-sync.js +50 -9
- package/dist/esm/client/incoming.js +38 -8
- package/dist/esm/client/mailbox.js +24 -23
- package/dist/esm/client/messages.js +108 -32
- package/dist/esm/client/messaging/fanout.js +22 -12
- package/dist/esm/client/messaging/participants.js +6 -4
- package/dist/esm/client/persistence/WriteBehindPersistence.js +125 -0
- package/dist/esm/client/tokens/cs-token.js +46 -0
- package/dist/esm/client/tokens/tc-token.js +18 -0
- package/dist/esm/crypto/core/index.js +2 -2
- package/dist/esm/crypto/core/keys.js +1 -1
- package/dist/esm/crypto/core/nonce.js +2 -0
- package/dist/esm/crypto/core/primitives.js +0 -7
- package/dist/esm/crypto/core/random.js +22 -1
- package/dist/esm/crypto/curves/X25519.js +25 -6
- package/dist/esm/crypto/index.js +1 -0
- package/dist/esm/crypto/math/constants.js +12 -35
- package/dist/esm/crypto/math/edwards.js +174 -47
- package/dist/esm/crypto/math/fe.js +691 -0
- package/dist/esm/crypto/math/mod.js +10 -1
- package/dist/esm/index.js +1 -1
- package/dist/esm/infra/perf/BackgroundQueue.js +478 -0
- package/dist/esm/infra/perf/BoundedTaskQueue.js +3 -1
- package/dist/esm/infra/perf/PromiseDedup.js +20 -0
- package/dist/esm/infra/perf/SharedExclusiveGate.js +109 -0
- package/dist/esm/infra/perf/StoreLock.js +77 -0
- package/dist/esm/media/WaMediaCrypto.js +95 -13
- package/dist/esm/media/WaMediaTransferClient.js +39 -47
- package/dist/esm/media/constants.js +2 -1
- package/dist/esm/message/WaMessageClient.js +26 -19
- package/dist/esm/message/content.js +195 -9
- package/dist/esm/message/icdc.js +76 -0
- package/dist/esm/message/incoming.js +24 -12
- package/dist/esm/message/phash.js +3 -1
- package/dist/esm/message/reporting-token.js +14 -27
- package/dist/esm/protocol/appstate.js +9 -40
- package/dist/esm/protocol/browser.js +10 -18
- package/dist/esm/protocol/constants.js +5 -3
- package/dist/esm/protocol/defaults.js +6 -0
- package/dist/esm/protocol/index.js +1 -2
- package/dist/esm/protocol/jid.js +105 -36
- package/dist/esm/protocol/message.js +61 -1
- package/dist/esm/protocol/nodes.js +2 -0
- package/dist/esm/protocol/notification.js +3 -1
- package/dist/esm/protocol/privacy-token.js +17 -0
- package/dist/esm/protocol/privacy.js +55 -0
- package/dist/esm/protocol/stream.js +26 -1
- package/dist/esm/retry/codec.js +216 -0
- package/dist/esm/retry/constants.js +1 -1
- package/dist/esm/retry/index.js +2 -2
- package/dist/esm/retry/parse.js +50 -30
- package/dist/esm/retry/replay.js +11 -7
- package/dist/esm/retry/tracker.js +50 -12
- package/dist/esm/signal/api/SignalDeviceSyncApi.js +49 -32
- package/dist/esm/signal/api/SignalDigestSyncApi.js +13 -9
- package/dist/esm/signal/api/SignalIdentitySyncApi.js +26 -11
- package/dist/esm/signal/api/SignalMissingPreKeysSyncApi.js +18 -7
- package/dist/esm/signal/api/SignalRotateKeyApi.js +4 -2
- package/dist/esm/signal/api/SignalSessionSyncApi.js +16 -7
- package/dist/esm/signal/api/result-map.js +10 -0
- package/dist/esm/signal/constants.js +0 -4
- package/dist/esm/signal/crypto/WaAdvSignature.js +12 -6
- package/dist/esm/signal/{store/sqlite.js → encoding.js} +78 -24
- package/dist/esm/signal/group/SenderKeyCodec.js +3 -2
- package/dist/esm/signal/group/SenderKeyManager.js +125 -106
- package/dist/esm/signal/index.js +1 -0
- package/dist/esm/signal/registration/keygen.js +6 -2
- package/dist/esm/signal/registration/utils.js +1 -0
- package/dist/esm/signal/session/SignalProtocol.js +150 -74
- package/dist/esm/signal/session/resolver.js +137 -102
- package/dist/esm/store/contracts/privacy-token.store.js +1 -0
- package/dist/esm/store/createStore.js +101 -187
- package/dist/esm/store/index.js +1 -10
- package/dist/esm/store/locks/appstate.lock.js +26 -0
- package/dist/esm/store/locks/auth.lock.js +15 -0
- package/dist/esm/store/locks/contact.lock.js +20 -0
- package/dist/esm/store/locks/device-list.lock.js +20 -0
- package/dist/esm/store/locks/message.lock.js +21 -0
- package/dist/esm/store/locks/participants.lock.js +20 -0
- package/dist/esm/store/locks/privacy-token.lock.js +18 -0
- package/dist/esm/store/locks/retry.lock.js +29 -0
- package/dist/esm/store/locks/sender-key.lock.js +52 -0
- package/dist/esm/store/locks/signal.lock.js +63 -0
- package/dist/esm/store/locks/thread.lock.js +21 -0
- package/dist/esm/store/noop.store.js +1 -1
- package/dist/esm/store/providers/memory/appstate.store.js +22 -24
- package/dist/esm/store/providers/memory/device-list.store.js +10 -5
- package/dist/esm/store/providers/memory/privacy-token.store.js +43 -0
- package/dist/esm/store/providers/memory/retry.store.js +77 -2
- package/dist/esm/store/providers/memory/sender-key.store.js +6 -1
- package/dist/esm/store/providers/memory/signal.store.js +36 -19
- package/dist/esm/transport/WaComms.js +3 -1
- package/dist/esm/transport/WaWebSocket.js +0 -6
- package/dist/esm/transport/binary/constants.js +0 -30
- package/dist/esm/transport/binary/decoder.js +4 -4
- package/dist/esm/transport/binary/encoder.js +8 -15
- package/dist/esm/transport/binary/index.js +0 -1
- package/dist/esm/transport/node/WaNodeOrchestrator.js +25 -19
- package/dist/esm/transport/node/builders/business.js +129 -0
- package/dist/esm/transport/node/builders/global.js +370 -0
- package/dist/esm/transport/node/builders/index.js +5 -2
- package/dist/esm/transport/node/builders/message.js +63 -239
- package/dist/esm/transport/node/builders/pairing.js +0 -24
- package/dist/esm/transport/node/builders/privacy-token.js +41 -0
- package/dist/esm/transport/node/builders/privacy.js +48 -0
- package/dist/esm/transport/node/builders/profile.js +70 -0
- package/dist/esm/transport/node/builders/retry.js +10 -22
- package/dist/esm/transport/node/builders/usync.js +6 -2
- package/dist/esm/transport/node/helpers.js +19 -1
- package/dist/esm/transport/node/usync.js +3 -33
- package/dist/esm/transport/node/xml.js +35 -14
- package/dist/esm/transport/noise/WaClientPayload.js +10 -10
- package/dist/esm/transport/noise/WaNoiseCert.js +3 -3
- package/dist/esm/transport/noise/WaNoiseSession.js +64 -23
- package/dist/esm/transport/noise/WaNoiseSocket.js +8 -4
- package/dist/esm/transport/stream/parse.js +8 -4
- package/dist/esm/util/bytes.js +22 -18
- package/dist/esm/util/index.js +5 -0
- package/dist/esm/util/primitives.js +3 -2
- package/dist/index.js +7 -1
- package/dist/infra/perf/BackgroundQueue.js +482 -0
- package/dist/infra/perf/BoundedTaskQueue.js +3 -1
- package/dist/infra/perf/PromiseDedup.js +24 -0
- package/dist/infra/perf/SharedExclusiveGate.js +113 -0
- package/dist/infra/perf/StoreLock.js +81 -0
- package/dist/media/WaMediaCrypto.js +94 -12
- package/dist/media/WaMediaTransferClient.js +39 -47
- package/dist/media/constants.js +2 -1
- package/dist/message/WaMessageClient.js +26 -19
- package/dist/message/content.js +198 -9
- package/dist/message/icdc.js +81 -0
- package/dist/message/incoming.js +24 -12
- package/dist/message/phash.js +3 -1
- package/dist/message/reporting-token.js +14 -28
- package/dist/protocol/appstate.js +10 -41
- package/dist/protocol/browser.js +10 -18
- package/dist/protocol/constants.js +21 -2
- package/dist/protocol/defaults.js +6 -0
- package/dist/protocol/index.js +8 -5
- package/dist/protocol/jid.js +111 -36
- package/dist/protocol/message.js +62 -2
- package/dist/protocol/nodes.js +2 -0
- package/dist/protocol/notification.js +3 -1
- package/dist/protocol/privacy-token.js +20 -0
- package/dist/protocol/privacy.js +58 -0
- package/dist/protocol/stream.js +27 -2
- package/dist/retry/codec.js +220 -0
- package/dist/retry/constants.js +1 -1
- package/dist/retry/index.js +5 -5
- package/dist/retry/parse.js +51 -30
- package/dist/retry/replay.js +10 -6
- package/dist/retry/tracker.js +50 -12
- package/dist/signal/api/SignalDeviceSyncApi.js +48 -31
- package/dist/signal/api/SignalDigestSyncApi.js +13 -9
- package/dist/signal/api/SignalIdentitySyncApi.js +25 -10
- package/dist/signal/api/SignalMissingPreKeysSyncApi.js +17 -6
- package/dist/signal/api/SignalRotateKeyApi.js +4 -2
- package/dist/signal/api/SignalSessionSyncApi.js +16 -7
- package/dist/signal/api/result-map.js +13 -0
- package/dist/signal/constants.js +1 -5
- package/dist/signal/crypto/WaAdvSignature.js +11 -5
- package/dist/signal/{store/sqlite.js → encoding.js} +79 -25
- package/dist/signal/group/SenderKeyCodec.js +4 -3
- package/dist/signal/group/SenderKeyManager.js +125 -106
- package/dist/signal/index.js +13 -1
- package/dist/signal/registration/keygen.js +6 -2
- package/dist/signal/registration/utils.js +1 -0
- package/dist/signal/session/SignalProtocol.js +150 -74
- package/dist/signal/session/resolver.js +135 -100
- package/dist/store/contracts/privacy-token.store.js +2 -0
- package/dist/store/createStore.js +101 -187
- package/dist/store/index.js +15 -33
- package/dist/store/locks/appstate.lock.js +29 -0
- package/dist/store/locks/auth.lock.js +18 -0
- package/dist/store/locks/contact.lock.js +23 -0
- package/dist/store/locks/device-list.lock.js +23 -0
- package/dist/store/locks/message.lock.js +24 -0
- package/dist/store/locks/participants.lock.js +23 -0
- package/dist/store/locks/privacy-token.lock.js +21 -0
- package/dist/store/locks/retry.lock.js +32 -0
- package/dist/store/locks/sender-key.lock.js +55 -0
- package/dist/store/locks/signal.lock.js +66 -0
- package/dist/store/locks/thread.lock.js +24 -0
- package/dist/store/noop.store.js +1 -1
- package/dist/store/providers/memory/appstate.store.js +22 -24
- package/dist/store/providers/memory/device-list.store.js +10 -5
- package/dist/store/providers/memory/privacy-token.store.js +47 -0
- package/dist/store/providers/memory/retry.store.js +77 -2
- package/dist/store/providers/memory/sender-key.store.js +6 -1
- package/dist/store/providers/memory/signal.store.js +36 -19
- package/dist/transport/WaComms.js +3 -1
- package/dist/transport/WaWebSocket.js +0 -6
- package/dist/transport/binary/constants.js +1 -31
- package/dist/transport/binary/decoder.js +4 -4
- package/dist/transport/binary/encoder.js +8 -15
- package/dist/transport/binary/index.js +0 -4
- package/dist/transport/node/WaNodeOrchestrator.js +24 -18
- package/dist/transport/node/builders/business.js +137 -0
- package/dist/transport/node/builders/global.js +375 -0
- package/dist/transport/node/builders/index.js +18 -9
- package/dist/transport/node/builders/message.js +64 -245
- package/dist/transport/node/builders/pairing.js +0 -26
- package/dist/transport/node/builders/privacy-token.js +46 -0
- package/dist/transport/node/builders/privacy.js +55 -0
- package/dist/transport/node/builders/profile.js +78 -0
- package/dist/transport/node/builders/retry.js +9 -21
- package/dist/transport/node/builders/usync.js +6 -2
- package/dist/transport/node/helpers.js +20 -1
- package/dist/transport/node/usync.js +2 -32
- package/dist/transport/node/xml.js +35 -14
- package/dist/transport/noise/WaClientPayload.js +13 -13
- package/dist/transport/noise/WaNoiseCert.js +2 -2
- package/dist/transport/noise/WaNoiseSession.js +64 -23
- package/dist/transport/noise/WaNoiseSocket.js +8 -4
- package/dist/transport/stream/parse.js +7 -3
- package/dist/types/appstate/encoding.d.ts +7 -0
- package/dist/types/appstate/index.d.ts +3 -3
- package/dist/types/appstate/utils.d.ts +0 -2
- package/dist/types/auth/flow/WaAuthCredentialsFlow.d.ts +1 -1
- package/dist/types/auth/index.d.ts +0 -2
- package/dist/types/auth/types.d.ts +1 -0
- package/dist/types/client/WaClient.d.ts +27 -12
- package/dist/types/client/WaClientFactory.d.ts +12 -4
- package/dist/types/client/connection/WaConnectionManager.d.ts +2 -0
- package/dist/types/client/coordinators/WaBusinessCoordinator.d.ts +57 -0
- package/dist/types/client/coordinators/WaIncomingNodeCoordinator.d.ts +3 -1
- package/dist/types/client/coordinators/WaMessageDispatchCoordinator.d.ts +14 -0
- package/dist/types/client/coordinators/WaPassiveTasksCoordinator.d.ts +4 -0
- package/dist/types/client/coordinators/WaPrivacyCoordinator.d.ts +26 -0
- package/dist/types/client/coordinators/WaProfileCoordinator.d.ts +36 -0
- package/dist/types/client/coordinators/WaRetryCoordinator.d.ts +6 -0
- package/dist/types/client/coordinators/WaStreamControlCoordinator.d.ts +3 -2
- package/dist/types/client/coordinators/WaTrustedContactTokenCoordinator.d.ts +45 -0
- package/dist/types/client/events/devices.d.ts +20 -0
- package/dist/types/client/events/identity.d.ts +9 -0
- package/dist/types/client/events/privacy-token.d.ts +7 -0
- package/dist/types/client/history-sync.d.ts +9 -6
- package/dist/types/client/incoming.d.ts +3 -1
- package/dist/types/client/index.d.ts +1 -1
- package/dist/types/client/mailbox.d.ts +3 -5
- package/dist/types/client/messages.d.ts +1 -2
- package/dist/types/client/persistence/WriteBehindPersistence.d.ts +34 -0
- package/dist/types/client/tokens/cs-token.d.ts +10 -0
- package/dist/types/client/tokens/tc-token.d.ts +5 -0
- package/dist/types/client/types.d.ts +51 -3
- package/dist/types/crypto/core/index.d.ts +2 -2
- package/dist/types/crypto/core/nonce.d.ts +2 -0
- package/dist/types/crypto/core/primitives.d.ts +0 -1
- package/dist/types/crypto/core/random.d.ts +1 -0
- package/dist/types/crypto/index.d.ts +1 -0
- package/dist/types/crypto/math/constants.d.ts +4 -2
- package/dist/types/crypto/math/fe.d.ts +30 -0
- package/dist/types/crypto/math/mod.d.ts +0 -2
- package/dist/types/crypto/math/types.d.ts +11 -4
- package/dist/types/index.d.ts +5 -3
- package/dist/types/infra/perf/BackgroundQueue.d.ts +58 -0
- package/dist/types/infra/perf/PromiseDedup.d.ts +4 -0
- package/dist/types/infra/perf/SharedExclusiveGate.d.ts +17 -0
- package/dist/types/infra/perf/StoreLock.d.ts +10 -0
- package/dist/types/media/WaMediaCrypto.d.ts +3 -2
- package/dist/types/media/WaMediaTransferClient.d.ts +3 -12
- package/dist/types/media/constants.d.ts +1 -1
- package/dist/types/media/index.d.ts +1 -1
- package/dist/types/media/types.d.ts +10 -2
- package/dist/types/message/content.d.ts +8 -0
- package/dist/types/message/icdc.d.ts +13 -0
- package/dist/types/message/reporting-token.d.ts +0 -1
- package/dist/types/message/types.d.ts +45 -6
- package/dist/types/protocol/appstate.d.ts +0 -11
- package/dist/types/protocol/constants.d.ts +7 -3
- package/dist/types/protocol/defaults.d.ts +6 -0
- package/dist/types/protocol/index.d.ts +1 -2
- package/dist/types/protocol/jid.d.ts +19 -2
- package/dist/types/protocol/message.d.ts +60 -0
- package/dist/types/protocol/nodes.d.ts +2 -0
- package/dist/types/protocol/notification.d.ts +2 -0
- package/dist/types/protocol/privacy-token.d.ts +17 -0
- package/dist/types/protocol/privacy.d.ts +75 -0
- package/dist/types/protocol/stream.d.ts +30 -0
- package/dist/types/retry/codec.d.ts +3 -0
- package/dist/types/retry/index.d.ts +3 -3
- package/dist/types/retry/parse.d.ts +5 -2
- package/dist/types/retry/tracker.d.ts +1 -0
- package/dist/types/retry/types.d.ts +6 -1
- package/dist/types/signal/api/SignalDeviceSyncApi.d.ts +2 -1
- package/dist/types/signal/api/SignalDigestSyncApi.d.ts +6 -0
- package/dist/types/signal/api/SignalIdentitySyncApi.d.ts +2 -0
- package/dist/types/signal/api/SignalRotateKeyApi.d.ts +4 -5
- package/dist/types/signal/api/SignalSessionSyncApi.d.ts +8 -6
- package/dist/types/signal/api/result-map.d.ts +1 -0
- package/dist/types/signal/constants.d.ts +0 -3
- package/dist/types/signal/{store/sqlite.d.ts → encoding.d.ts} +3 -3
- package/dist/types/signal/group/SenderKeyManager.d.ts +10 -5
- package/dist/types/signal/index.d.ts +2 -0
- package/dist/types/signal/session/SignalProtocol.d.ts +10 -4
- package/dist/types/signal/session/resolver.d.ts +7 -2
- package/dist/types/store/contracts/appstate.store.d.ts +1 -1
- package/dist/types/store/contracts/privacy-token.store.d.ts +16 -0
- package/dist/types/store/contracts/retry.store.d.ts +7 -0
- package/dist/types/store/contracts/signal.store.d.ts +7 -0
- package/dist/types/store/createStore.d.ts +1 -1
- package/dist/types/store/index.d.ts +5 -13
- package/dist/types/store/locks/appstate.lock.d.ts +3 -0
- package/dist/types/store/locks/auth.lock.d.ts +3 -0
- package/dist/types/store/locks/contact.lock.d.ts +3 -0
- package/dist/types/store/locks/device-list.lock.d.ts +2 -0
- package/dist/types/store/locks/message.lock.d.ts +3 -0
- package/dist/types/store/locks/participants.lock.d.ts +2 -0
- package/dist/types/store/locks/privacy-token.lock.d.ts +2 -0
- package/dist/types/store/locks/retry.lock.d.ts +2 -0
- package/dist/types/store/locks/sender-key.lock.d.ts +3 -0
- package/dist/types/store/locks/signal.lock.d.ts +3 -0
- package/dist/types/store/locks/thread.lock.d.ts +3 -0
- package/dist/types/store/providers/memory/appstate.store.d.ts +1 -1
- package/dist/types/store/providers/memory/privacy-token.store.d.ts +13 -0
- package/dist/types/store/providers/memory/retry.store.d.ts +8 -0
- package/dist/types/store/providers/memory/signal.store.d.ts +2 -1
- package/dist/types/store/types.d.ts +49 -61
- package/dist/types/transport/WaWebSocket.d.ts +0 -1
- package/dist/types/transport/binary/constants.d.ts +0 -30
- package/dist/types/transport/binary/index.d.ts +0 -1
- package/dist/types/transport/node/WaNodeOrchestrator.d.ts +3 -4
- package/dist/types/transport/node/builders/business.d.ts +29 -0
- package/dist/types/transport/node/builders/global.d.ts +102 -0
- package/dist/types/transport/node/builders/index.d.ts +5 -2
- package/dist/types/transport/node/builders/message.d.ts +8 -7
- package/dist/types/transport/node/builders/pairing.d.ts +0 -2
- package/dist/types/transport/node/builders/privacy-token.d.ts +9 -0
- package/dist/types/transport/node/builders/privacy.d.ts +7 -0
- package/dist/types/transport/node/builders/profile.d.ts +8 -0
- package/dist/types/transport/node/builders/retry.d.ts +0 -1
- package/dist/types/transport/node/helpers.d.ts +5 -0
- package/dist/types/transport/noise/WaNoiseSession.d.ts +3 -2
- package/dist/types/transport/noise/WaNoiseSocket.d.ts +4 -2
- package/dist/types/util/bytes.d.ts +1 -1
- package/dist/types/util/index.d.ts +5 -0
- package/dist/types/util/primitives.d.ts +0 -1
- package/dist/util/bytes.js +22 -18
- package/dist/util/index.js +23 -0
- package/dist/util/primitives.js +2 -2
- package/package.json +29 -7
- package/proto/index.js +1 -1
- package/dist/crypto/core/constants.js +0 -4
- package/dist/esm/crypto/core/constants.js +0 -1
- package/dist/esm/retry/outbound.js +0 -82
- package/dist/esm/store/providers/sqlite/BaseSqliteStore.js +0 -37
- package/dist/esm/store/providers/sqlite/appstate.store.js +0 -250
- package/dist/esm/store/providers/sqlite/auth.store.js +0 -176
- package/dist/esm/store/providers/sqlite/connection.js +0 -245
- package/dist/esm/store/providers/sqlite/contact.store.js +0 -74
- package/dist/esm/store/providers/sqlite/device-list.store.js +0 -127
- package/dist/esm/store/providers/sqlite/message.store.js +0 -132
- package/dist/esm/store/providers/sqlite/migrations.js +0 -347
- package/dist/esm/store/providers/sqlite/participants.store.js +0 -77
- package/dist/esm/store/providers/sqlite/retry.store.js +0 -141
- package/dist/esm/store/providers/sqlite/sender-key.store.js +0 -198
- package/dist/esm/store/providers/sqlite/signal.store.js +0 -435
- package/dist/esm/store/providers/sqlite/table-names.js +0 -107
- package/dist/esm/store/providers/sqlite/thread.store.js +0 -85
- package/dist/retry/outbound.js +0 -87
- package/dist/store/providers/sqlite/BaseSqliteStore.js +0 -41
- package/dist/store/providers/sqlite/appstate.store.js +0 -254
- package/dist/store/providers/sqlite/auth.store.js +0 -180
- package/dist/store/providers/sqlite/connection.js +0 -281
- package/dist/store/providers/sqlite/contact.store.js +0 -78
- package/dist/store/providers/sqlite/device-list.store.js +0 -131
- package/dist/store/providers/sqlite/message.store.js +0 -136
- package/dist/store/providers/sqlite/migrations.js +0 -350
- package/dist/store/providers/sqlite/participants.store.js +0 -81
- package/dist/store/providers/sqlite/retry.store.js +0 -145
- package/dist/store/providers/sqlite/sender-key.store.js +0 -202
- package/dist/store/providers/sqlite/signal.store.js +0 -439
- package/dist/store/providers/sqlite/table-names.js +0 -113
- package/dist/store/providers/sqlite/thread.store.js +0 -89
- package/dist/types/appstate/store/sqlite.d.ts +0 -7
- package/dist/types/crypto/core/constants.d.ts +0 -1
- package/dist/types/retry/outbound.d.ts +0 -4
- package/dist/types/store/providers/sqlite/BaseSqliteStore.d.ts +0 -12
- package/dist/types/store/providers/sqlite/appstate.store.d.ts +0 -17
- package/dist/types/store/providers/sqlite/auth.store.d.ts +0 -10
- package/dist/types/store/providers/sqlite/connection.d.ts +0 -10
- package/dist/types/store/providers/sqlite/contact.store.d.ts +0 -12
- package/dist/types/store/providers/sqlite/device-list.store.d.ts +0 -15
- package/dist/types/store/providers/sqlite/message.store.d.ts +0 -13
- package/dist/types/store/providers/sqlite/migrations.d.ts +0 -3
- package/dist/types/store/providers/sqlite/participants.store.d.ts +0 -12
- package/dist/types/store/providers/sqlite/retry.store.d.ts +0 -15
- package/dist/types/store/providers/sqlite/sender-key.store.d.ts +0 -24
- package/dist/types/store/providers/sqlite/signal.store.d.ts +0 -53
- package/dist/types/store/providers/sqlite/table-names.d.ts +0 -5
- package/dist/types/store/providers/sqlite/thread.store.d.ts +0 -13
|
@@ -1,62 +1,34 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.createStore = createStore;
|
|
4
|
+
const appstate_lock_1 = require("./locks/appstate.lock");
|
|
5
|
+
const auth_lock_1 = require("./locks/auth.lock");
|
|
6
|
+
const contact_lock_1 = require("./locks/contact.lock");
|
|
7
|
+
const device_list_lock_1 = require("./locks/device-list.lock");
|
|
8
|
+
const message_lock_1 = require("./locks/message.lock");
|
|
9
|
+
const participants_lock_1 = require("./locks/participants.lock");
|
|
10
|
+
const privacy_token_lock_1 = require("./locks/privacy-token.lock");
|
|
11
|
+
const retry_lock_1 = require("./locks/retry.lock");
|
|
12
|
+
const sender_key_lock_1 = require("./locks/sender-key.lock");
|
|
13
|
+
const signal_lock_1 = require("./locks/signal.lock");
|
|
14
|
+
const thread_lock_1 = require("./locks/thread.lock");
|
|
4
15
|
const noop_store_1 = require("./noop.store");
|
|
5
16
|
const appstate_store_1 = require("./providers/memory/appstate.store");
|
|
6
17
|
const contact_store_1 = require("./providers/memory/contact.store");
|
|
7
18
|
const device_list_store_1 = require("./providers/memory/device-list.store");
|
|
8
19
|
const message_store_1 = require("./providers/memory/message.store");
|
|
9
20
|
const participants_store_1 = require("./providers/memory/participants.store");
|
|
21
|
+
const privacy_token_store_1 = require("./providers/memory/privacy-token.store");
|
|
10
22
|
const retry_store_1 = require("./providers/memory/retry.store");
|
|
11
23
|
const sender_key_store_1 = require("./providers/memory/sender-key.store");
|
|
12
24
|
const signal_store_1 = require("./providers/memory/signal.store");
|
|
13
25
|
const thread_store_1 = require("./providers/memory/thread.store");
|
|
14
|
-
const appstate_store_2 = require("./providers/sqlite/appstate.store");
|
|
15
|
-
const auth_store_1 = require("./providers/sqlite/auth.store");
|
|
16
|
-
const contact_store_2 = require("./providers/sqlite/contact.store");
|
|
17
|
-
const device_list_store_2 = require("./providers/sqlite/device-list.store");
|
|
18
|
-
const message_store_2 = require("./providers/sqlite/message.store");
|
|
19
|
-
const participants_store_2 = require("./providers/sqlite/participants.store");
|
|
20
|
-
const retry_store_2 = require("./providers/sqlite/retry.store");
|
|
21
|
-
const sender_key_store_2 = require("./providers/sqlite/sender-key.store");
|
|
22
|
-
const signal_store_2 = require("./providers/sqlite/signal.store");
|
|
23
|
-
const thread_store_2 = require("./providers/sqlite/thread.store");
|
|
24
26
|
const coercion_1 = require("../util/coercion");
|
|
25
|
-
const
|
|
26
|
-
|
|
27
|
-
signal: 'sqlite',
|
|
28
|
-
senderKey: 'sqlite',
|
|
29
|
-
appState: 'sqlite',
|
|
30
|
-
messages: 'none',
|
|
31
|
-
threads: 'none',
|
|
32
|
-
contacts: 'none'
|
|
33
|
-
};
|
|
34
|
-
const DEFAULT_CACHE_PROVIDERS = {
|
|
35
|
-
retry: 'memory',
|
|
36
|
-
participants: 'memory',
|
|
37
|
-
deviceList: 'memory'
|
|
38
|
-
};
|
|
39
|
-
const DEFAULT_CACHE_TTLS_MS = {
|
|
40
|
-
retryMs: 7 * 24 * 60 * 60 * 1000,
|
|
27
|
+
const DEFAULT_CACHE_TTLS_MS = Object.freeze({
|
|
28
|
+
retryMs: 60 * 1000,
|
|
41
29
|
participantsMs: 5 * 60 * 1000,
|
|
42
30
|
deviceListMs: 5 * 60 * 1000
|
|
43
|
-
};
|
|
44
|
-
const DEFAULT_SQLITE_BATCH_SIZES = {
|
|
45
|
-
deviceList: 500,
|
|
46
|
-
senderKeyDistribution: 250,
|
|
47
|
-
signalPreKey: 500,
|
|
48
|
-
signalHasSession: 250
|
|
49
|
-
};
|
|
50
|
-
function resolveStoreValue(sessionId, value, domainPath) {
|
|
51
|
-
if (!value) {
|
|
52
|
-
return null;
|
|
53
|
-
}
|
|
54
|
-
const resolved = typeof value === 'function' ? value(sessionId) : value;
|
|
55
|
-
if (!resolved) {
|
|
56
|
-
throw new Error(`${domainPath} must resolve to a store instance`);
|
|
57
|
-
}
|
|
58
|
-
return resolved;
|
|
59
|
-
}
|
|
31
|
+
});
|
|
60
32
|
function hasDestroy(value) {
|
|
61
33
|
return (!!value &&
|
|
62
34
|
typeof value === 'object' &&
|
|
@@ -64,30 +36,32 @@ function hasDestroy(value) {
|
|
|
64
36
|
typeof value.destroy === 'function');
|
|
65
37
|
}
|
|
66
38
|
async function destroyIfSupported(value) {
|
|
67
|
-
if (!hasDestroy(value))
|
|
39
|
+
if (!hasDestroy(value))
|
|
68
40
|
return;
|
|
69
|
-
}
|
|
70
41
|
await value.destroy();
|
|
71
42
|
}
|
|
43
|
+
function resolveStore(sessionId, backends, provider, domain, kind, fallback) {
|
|
44
|
+
if (!provider || provider === 'memory' || provider === 'none') {
|
|
45
|
+
return fallback();
|
|
46
|
+
}
|
|
47
|
+
const backend = backends[provider];
|
|
48
|
+
if (!backend) {
|
|
49
|
+
throw new Error(`unknown backend '${provider}' for ${domain}`);
|
|
50
|
+
}
|
|
51
|
+
const factory = backend[kind][domain];
|
|
52
|
+
if (!factory) {
|
|
53
|
+
throw new Error(`backend '${provider}' does not provide ${kind}.${domain}`);
|
|
54
|
+
}
|
|
55
|
+
return factory(sessionId);
|
|
56
|
+
}
|
|
72
57
|
function createStore(options) {
|
|
73
|
-
const
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
};
|
|
77
|
-
const cacheProviders = {
|
|
78
|
-
...DEFAULT_CACHE_PROVIDERS,
|
|
79
|
-
...(options.cacheProviders ?? {})
|
|
80
|
-
};
|
|
58
|
+
const backends = (options.backends ?? {});
|
|
59
|
+
const providers = options.providers ?? {};
|
|
60
|
+
const cacheProviders = options.cacheProviders ?? {};
|
|
81
61
|
const cacheTtlsMs = Object.freeze({
|
|
82
|
-
retry: (0, coercion_1.resolvePositive)(options.cacheTtlMs?.retryMs, DEFAULT_CACHE_TTLS_MS.retryMs, 'cacheTtlMs.retryMs'),
|
|
83
|
-
participants: (0, coercion_1.resolvePositive)(options.cacheTtlMs?.participantsMs, DEFAULT_CACHE_TTLS_MS.participantsMs, 'cacheTtlMs.participantsMs'),
|
|
84
|
-
deviceList: (0, coercion_1.resolvePositive)(options.cacheTtlMs?.deviceListMs, DEFAULT_CACHE_TTLS_MS.deviceListMs, 'cacheTtlMs.deviceListMs')
|
|
85
|
-
});
|
|
86
|
-
const sqliteBatchSizes = Object.freeze({
|
|
87
|
-
deviceList: (0, coercion_1.resolvePositive)(options.sqlite?.batchSizes?.deviceList, DEFAULT_SQLITE_BATCH_SIZES.deviceList, 'sqlite.batchSizes.deviceList'),
|
|
88
|
-
senderKeyDistribution: (0, coercion_1.resolvePositive)(options.sqlite?.batchSizes?.senderKeyDistribution, DEFAULT_SQLITE_BATCH_SIZES.senderKeyDistribution, 'sqlite.batchSizes.senderKeyDistribution'),
|
|
89
|
-
signalPreKey: (0, coercion_1.resolvePositive)(options.sqlite?.batchSizes?.signalPreKey, DEFAULT_SQLITE_BATCH_SIZES.signalPreKey, 'sqlite.batchSizes.signalPreKey'),
|
|
90
|
-
signalHasSession: (0, coercion_1.resolvePositive)(options.sqlite?.batchSizes?.signalHasSession, DEFAULT_SQLITE_BATCH_SIZES.signalHasSession, 'sqlite.batchSizes.signalHasSession')
|
|
62
|
+
retry: (0, coercion_1.resolvePositive)(options.memory?.cacheTtlMs?.retryMs, DEFAULT_CACHE_TTLS_MS.retryMs, 'memory.cacheTtlMs.retryMs'),
|
|
63
|
+
participants: (0, coercion_1.resolvePositive)(options.memory?.cacheTtlMs?.participantsMs, DEFAULT_CACHE_TTLS_MS.participantsMs, 'memory.cacheTtlMs.participantsMs'),
|
|
64
|
+
deviceList: (0, coercion_1.resolvePositive)(options.memory?.cacheTtlMs?.deviceListMs, DEFAULT_CACHE_TTLS_MS.deviceListMs, 'memory.cacheTtlMs.deviceListMs')
|
|
91
65
|
});
|
|
92
66
|
const sessions = new Map();
|
|
93
67
|
let storeDestroyed = false;
|
|
@@ -96,125 +70,67 @@ function createStore(options) {
|
|
|
96
70
|
if (storeDestroyed) {
|
|
97
71
|
throw new Error('store has been destroyed');
|
|
98
72
|
}
|
|
99
|
-
const
|
|
100
|
-
if (
|
|
73
|
+
const id = sessionId.trim();
|
|
74
|
+
if (id.length === 0) {
|
|
101
75
|
throw new Error('sessionId must be a non-empty string');
|
|
102
76
|
}
|
|
103
|
-
const cached = sessions.get(
|
|
104
|
-
if (cached)
|
|
77
|
+
const cached = sessions.get(id);
|
|
78
|
+
if (cached)
|
|
105
79
|
return cached;
|
|
106
|
-
}
|
|
107
|
-
const
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
const
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
const
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
const
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
(
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
(
|
|
128
|
-
|
|
129
|
-
const
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
const
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
const
|
|
155
|
-
(providers.senderKey === 'memory'
|
|
156
|
-
? new sender_key_store_1.SenderKeyMemoryStore({
|
|
157
|
-
maxSenderKeys: memoryLimits.senderKeys,
|
|
158
|
-
maxSenderDistributions: memoryLimits.senderDistributions
|
|
159
|
-
})
|
|
160
|
-
: new sender_key_store_2.SenderKeySqliteStore(sqliteOptions, sqliteBatchSizes.senderKeyDistribution));
|
|
161
|
-
const appStateStore = customAppState ??
|
|
162
|
-
(providers.appState === 'memory'
|
|
163
|
-
? new appstate_store_1.WaAppStateMemoryStore(undefined, {
|
|
164
|
-
maxSyncKeys: memoryLimits.appStateSyncKeys,
|
|
165
|
-
maxCollectionEntries: memoryLimits.appStateCollectionEntries
|
|
166
|
-
})
|
|
167
|
-
: new appstate_store_2.WaAppStateSqliteStore(sqliteOptions));
|
|
168
|
-
const retryStore = customRetry ??
|
|
169
|
-
(cacheProviders.retry === 'memory'
|
|
170
|
-
? new retry_store_1.WaRetryMemoryStore(cacheTtlsMs.retry)
|
|
171
|
-
: new retry_store_2.WaRetrySqliteStore(sqliteOptions, cacheTtlsMs.retry));
|
|
172
|
-
const participantsStore = customParticipants ??
|
|
173
|
-
(cacheProviders.participants === 'sqlite'
|
|
174
|
-
? new participants_store_2.WaParticipantsSqliteStore(sqliteOptions, cacheTtlsMs.participants)
|
|
175
|
-
: cacheProviders.participants === 'memory'
|
|
176
|
-
? new participants_store_1.WaParticipantsMemoryStore(cacheTtlsMs.participants, {
|
|
177
|
-
maxGroups: memoryLimits.participantsGroups
|
|
178
|
-
})
|
|
179
|
-
: noop_store_1.NOOP_PARTICIPANTS_STORE);
|
|
180
|
-
const deviceListStore = customDeviceList ??
|
|
181
|
-
(cacheProviders.deviceList === 'sqlite'
|
|
182
|
-
? new device_list_store_2.WaDeviceListSqliteStore(sqliteOptions, cacheTtlsMs.deviceList, sqliteBatchSizes.deviceList)
|
|
183
|
-
: cacheProviders.deviceList === 'memory'
|
|
184
|
-
? new device_list_store_1.WaDeviceListMemoryStore(cacheTtlsMs.deviceList, {
|
|
185
|
-
maxUsers: memoryLimits.deviceListUsers
|
|
186
|
-
})
|
|
187
|
-
: noop_store_1.NOOP_DEVICE_LIST_STORE);
|
|
188
|
-
const messageStore = customMessages ??
|
|
189
|
-
(providers.messages === 'sqlite'
|
|
190
|
-
? new message_store_2.WaMessageSqliteStore(sqliteOptions)
|
|
191
|
-
: providers.messages === 'memory'
|
|
192
|
-
? new message_store_1.WaMessageMemoryStore({
|
|
193
|
-
maxMessages: memoryLimits.messages
|
|
194
|
-
})
|
|
195
|
-
: noop_store_1.NOOP_MESSAGE_STORE);
|
|
196
|
-
const threadStore = customThreads ??
|
|
197
|
-
(providers.threads === 'sqlite'
|
|
198
|
-
? new thread_store_2.WaThreadSqliteStore(sqliteOptions)
|
|
199
|
-
: providers.threads === 'memory'
|
|
200
|
-
? new thread_store_1.WaThreadMemoryStore({
|
|
201
|
-
maxThreads: memoryLimits.threads
|
|
202
|
-
})
|
|
203
|
-
: noop_store_1.NOOP_THREAD_STORE);
|
|
204
|
-
const contactStore = customContacts ??
|
|
205
|
-
(providers.contacts === 'sqlite'
|
|
206
|
-
? new contact_store_2.WaContactSqliteStore(sqliteOptions)
|
|
207
|
-
: providers.contacts === 'memory'
|
|
208
|
-
? new contact_store_1.WaContactMemoryStore({
|
|
209
|
-
maxContacts: memoryLimits.contacts
|
|
210
|
-
})
|
|
211
|
-
: noop_store_1.NOOP_CONTACT_STORE);
|
|
80
|
+
const ml = options.memory?.limits ?? {};
|
|
81
|
+
const rawAuth = resolveStore(id, backends, providers.auth, 'auth', 'stores', () => {
|
|
82
|
+
throw new Error('providers.auth is required — register a backend or set providers.auth');
|
|
83
|
+
});
|
|
84
|
+
const rawSignal = resolveStore(id, backends, providers.signal ?? 'memory', 'signal', 'stores', () => new signal_store_1.WaSignalMemoryStore({
|
|
85
|
+
maxPreKeys: ml.signalPreKeys,
|
|
86
|
+
maxSessions: ml.signalSessions,
|
|
87
|
+
maxRemoteIdentities: ml.signalRemoteIdentities
|
|
88
|
+
}));
|
|
89
|
+
const rawSenderKey = resolveStore(id, backends, providers.senderKey ?? 'memory', 'senderKey', 'stores', () => new sender_key_store_1.SenderKeyMemoryStore({
|
|
90
|
+
maxSenderKeys: ml.senderKeys,
|
|
91
|
+
maxSenderDistributions: ml.senderDistributions
|
|
92
|
+
}));
|
|
93
|
+
const rawAppState = resolveStore(id, backends, providers.appState ?? 'memory', 'appState', 'stores', () => new appstate_store_1.WaAppStateMemoryStore(undefined, {
|
|
94
|
+
maxSyncKeys: ml.appStateSyncKeys,
|
|
95
|
+
maxCollectionEntries: ml.appStateCollectionEntries
|
|
96
|
+
}));
|
|
97
|
+
const rawMessages = resolveStore(id, backends, providers.messages ?? 'none', 'messages', 'stores', () => providers.messages === 'memory'
|
|
98
|
+
? new message_store_1.WaMessageMemoryStore({ maxMessages: ml.messages })
|
|
99
|
+
: noop_store_1.NOOP_MESSAGE_STORE);
|
|
100
|
+
const rawThreads = resolveStore(id, backends, providers.threads ?? 'none', 'threads', 'stores', () => providers.threads === 'memory'
|
|
101
|
+
? new thread_store_1.WaThreadMemoryStore({ maxThreads: ml.threads })
|
|
102
|
+
: noop_store_1.NOOP_THREAD_STORE);
|
|
103
|
+
const rawContacts = resolveStore(id, backends, providers.contacts ?? 'none', 'contacts', 'stores', () => providers.contacts === 'memory'
|
|
104
|
+
? new contact_store_1.WaContactMemoryStore({ maxContacts: ml.contacts })
|
|
105
|
+
: noop_store_1.NOOP_CONTACT_STORE);
|
|
106
|
+
const rawPrivacyToken = resolveStore(id, backends, providers.privacyToken ?? 'memory', 'privacyToken', 'stores', () => new privacy_token_store_1.WaPrivacyTokenMemoryStore(ml.privacyTokens));
|
|
107
|
+
const rawRetry = resolveStore(id, backends, cacheProviders.retry ?? 'memory', 'retry', 'caches', () => new retry_store_1.WaRetryMemoryStore(cacheTtlsMs.retry));
|
|
108
|
+
const rawParticipants = resolveStore(id, backends, cacheProviders.participants ?? 'memory', 'participants', 'caches', () => cacheProviders.participants === 'memory'
|
|
109
|
+
? new participants_store_1.WaParticipantsMemoryStore(cacheTtlsMs.participants, {
|
|
110
|
+
maxGroups: ml.participantsGroups
|
|
111
|
+
})
|
|
112
|
+
: noop_store_1.NOOP_PARTICIPANTS_STORE);
|
|
113
|
+
const rawDeviceList = resolveStore(id, backends, cacheProviders.deviceList ?? 'memory', 'deviceList', 'caches', () => cacheProviders.deviceList === 'memory'
|
|
114
|
+
? new device_list_store_1.WaDeviceListMemoryStore(cacheTtlsMs.deviceList, {
|
|
115
|
+
maxUsers: ml.deviceListUsers
|
|
116
|
+
})
|
|
117
|
+
: noop_store_1.NOOP_DEVICE_LIST_STORE);
|
|
118
|
+
const authStore = (0, auth_lock_1.withAuthLock)(rawAuth);
|
|
119
|
+
const signalStore = (0, signal_lock_1.withSignalLock)(rawSignal);
|
|
120
|
+
const senderKeyStore = (0, sender_key_lock_1.withSenderKeyLock)(rawSenderKey);
|
|
121
|
+
const appStateStore = (0, appstate_lock_1.withAppStateLock)(rawAppState);
|
|
122
|
+
const retryStore = (0, retry_lock_1.withRetryLock)(rawRetry);
|
|
123
|
+
const participantsStore = (0, participants_lock_1.withParticipantsLock)(rawParticipants);
|
|
124
|
+
const deviceListStore = (0, device_list_lock_1.withDeviceListLock)(rawDeviceList);
|
|
125
|
+
const messageStore = (0, message_lock_1.withMessageLock)(rawMessages);
|
|
126
|
+
const threadStore = (0, thread_lock_1.withThreadLock)(rawThreads);
|
|
127
|
+
const contactStore = (0, contact_lock_1.withContactLock)(rawContacts);
|
|
128
|
+
const privacyTokenStore = (0, privacy_token_lock_1.withPrivacyTokenLock)(rawPrivacyToken);
|
|
212
129
|
let cachesDestroyed = false;
|
|
213
130
|
let sessionDestroyed = false;
|
|
214
131
|
const destroyCaches = async () => {
|
|
215
|
-
if (cachesDestroyed)
|
|
132
|
+
if (cachesDestroyed)
|
|
216
133
|
return;
|
|
217
|
-
}
|
|
218
134
|
cachesDestroyed = true;
|
|
219
135
|
await Promise.all([
|
|
220
136
|
retryStore.clear(),
|
|
@@ -228,9 +144,8 @@ function createStore(options) {
|
|
|
228
144
|
]);
|
|
229
145
|
};
|
|
230
146
|
const destroy = async () => {
|
|
231
|
-
if (sessionDestroyed)
|
|
147
|
+
if (sessionDestroyed)
|
|
232
148
|
return;
|
|
233
|
-
}
|
|
234
149
|
sessionDestroyed = true;
|
|
235
150
|
await destroyCaches();
|
|
236
151
|
await Promise.all([
|
|
@@ -240,7 +155,8 @@ function createStore(options) {
|
|
|
240
155
|
destroyIfSupported(appStateStore),
|
|
241
156
|
destroyIfSupported(messageStore),
|
|
242
157
|
destroyIfSupported(threadStore),
|
|
243
|
-
destroyIfSupported(contactStore)
|
|
158
|
+
destroyIfSupported(contactStore),
|
|
159
|
+
destroyIfSupported(privacyTokenStore)
|
|
244
160
|
]);
|
|
245
161
|
};
|
|
246
162
|
const session = {
|
|
@@ -254,26 +170,24 @@ function createStore(options) {
|
|
|
254
170
|
messages: messageStore,
|
|
255
171
|
threads: threadStore,
|
|
256
172
|
contacts: contactStore,
|
|
173
|
+
privacyToken: privacyTokenStore,
|
|
257
174
|
destroyCaches,
|
|
258
175
|
destroy
|
|
259
176
|
};
|
|
260
|
-
sessions.set(
|
|
177
|
+
sessions.set(id, session);
|
|
261
178
|
return session;
|
|
262
179
|
},
|
|
263
180
|
async destroyCaches() {
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
}
|
|
181
|
+
const list = Array.from(sessions.values());
|
|
182
|
+
await Promise.all(list.map((s) => s.destroyCaches()));
|
|
267
183
|
},
|
|
268
184
|
async destroy() {
|
|
269
|
-
if (storeDestroyed)
|
|
185
|
+
if (storeDestroyed)
|
|
270
186
|
return;
|
|
271
|
-
}
|
|
272
187
|
storeDestroyed = true;
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
}
|
|
188
|
+
const list = Array.from(sessions.values());
|
|
189
|
+
sessions.clear();
|
|
190
|
+
await Promise.all(list.map((s) => s.destroy()));
|
|
277
191
|
}
|
|
278
192
|
};
|
|
279
193
|
}
|
package/dist/store/index.js
CHANGED
|
@@ -1,43 +1,25 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
4
|
-
var auth_store_1 = require("./providers/sqlite/auth.store");
|
|
5
|
-
Object.defineProperty(exports, "WaAuthSqliteStore", { enumerable: true, get: function () { return auth_store_1.WaAuthSqliteStore; } });
|
|
6
|
-
var appstate_store_1 = require("./providers/sqlite/appstate.store");
|
|
7
|
-
Object.defineProperty(exports, "WaAppStateSqliteStore", { enumerable: true, get: function () { return appstate_store_1.WaAppStateSqliteStore; } });
|
|
3
|
+
exports.WaPrivacyTokenMemoryStore = exports.WaThreadMemoryStore = exports.WaMessageMemoryStore = exports.WaContactMemoryStore = exports.WaDeviceListMemoryStore = exports.WaParticipantsMemoryStore = exports.WaRetryMemoryStore = exports.SenderKeyMemoryStore = exports.WaSignalMemoryStore = exports.WaAppStateMemoryStore = exports.createStore = void 0;
|
|
8
4
|
var createStore_1 = require("./createStore");
|
|
9
5
|
Object.defineProperty(exports, "createStore", { enumerable: true, get: function () { return createStore_1.createStore; } });
|
|
10
|
-
var
|
|
11
|
-
Object.defineProperty(exports, "
|
|
12
|
-
var
|
|
13
|
-
Object.defineProperty(exports, "
|
|
14
|
-
var
|
|
15
|
-
Object.defineProperty(exports, "
|
|
16
|
-
var
|
|
17
|
-
Object.defineProperty(exports, "
|
|
18
|
-
var
|
|
19
|
-
Object.defineProperty(exports, "
|
|
20
|
-
var
|
|
21
|
-
Object.defineProperty(exports, "
|
|
22
|
-
var signal_store_2 = require("./providers/memory/signal.store");
|
|
23
|
-
Object.defineProperty(exports, "WaSignalMemoryStore", { enumerable: true, get: function () { return signal_store_2.WaSignalMemoryStore; } });
|
|
24
|
-
var sender_key_store_2 = require("./providers/memory/sender-key.store");
|
|
25
|
-
Object.defineProperty(exports, "SenderKeyMemoryStore", { enumerable: true, get: function () { return sender_key_store_2.SenderKeyMemoryStore; } });
|
|
26
|
-
var retry_store_2 = require("./providers/memory/retry.store");
|
|
27
|
-
Object.defineProperty(exports, "WaRetryMemoryStore", { enumerable: true, get: function () { return retry_store_2.WaRetryMemoryStore; } });
|
|
28
|
-
var participants_store_2 = require("./providers/memory/participants.store");
|
|
29
|
-
Object.defineProperty(exports, "WaParticipantsMemoryStore", { enumerable: true, get: function () { return participants_store_2.WaParticipantsMemoryStore; } });
|
|
30
|
-
var device_list_store_2 = require("./providers/memory/device-list.store");
|
|
31
|
-
Object.defineProperty(exports, "WaDeviceListMemoryStore", { enumerable: true, get: function () { return device_list_store_2.WaDeviceListMemoryStore; } });
|
|
6
|
+
var appstate_store_1 = require("./providers/memory/appstate.store");
|
|
7
|
+
Object.defineProperty(exports, "WaAppStateMemoryStore", { enumerable: true, get: function () { return appstate_store_1.WaAppStateMemoryStore; } });
|
|
8
|
+
var signal_store_1 = require("./providers/memory/signal.store");
|
|
9
|
+
Object.defineProperty(exports, "WaSignalMemoryStore", { enumerable: true, get: function () { return signal_store_1.WaSignalMemoryStore; } });
|
|
10
|
+
var sender_key_store_1 = require("./providers/memory/sender-key.store");
|
|
11
|
+
Object.defineProperty(exports, "SenderKeyMemoryStore", { enumerable: true, get: function () { return sender_key_store_1.SenderKeyMemoryStore; } });
|
|
12
|
+
var retry_store_1 = require("./providers/memory/retry.store");
|
|
13
|
+
Object.defineProperty(exports, "WaRetryMemoryStore", { enumerable: true, get: function () { return retry_store_1.WaRetryMemoryStore; } });
|
|
14
|
+
var participants_store_1 = require("./providers/memory/participants.store");
|
|
15
|
+
Object.defineProperty(exports, "WaParticipantsMemoryStore", { enumerable: true, get: function () { return participants_store_1.WaParticipantsMemoryStore; } });
|
|
16
|
+
var device_list_store_1 = require("./providers/memory/device-list.store");
|
|
17
|
+
Object.defineProperty(exports, "WaDeviceListMemoryStore", { enumerable: true, get: function () { return device_list_store_1.WaDeviceListMemoryStore; } });
|
|
32
18
|
var contact_store_1 = require("./providers/memory/contact.store");
|
|
33
19
|
Object.defineProperty(exports, "WaContactMemoryStore", { enumerable: true, get: function () { return contact_store_1.WaContactMemoryStore; } });
|
|
34
20
|
var message_store_1 = require("./providers/memory/message.store");
|
|
35
21
|
Object.defineProperty(exports, "WaMessageMemoryStore", { enumerable: true, get: function () { return message_store_1.WaMessageMemoryStore; } });
|
|
36
22
|
var thread_store_1 = require("./providers/memory/thread.store");
|
|
37
23
|
Object.defineProperty(exports, "WaThreadMemoryStore", { enumerable: true, get: function () { return thread_store_1.WaThreadMemoryStore; } });
|
|
38
|
-
var
|
|
39
|
-
Object.defineProperty(exports, "
|
|
40
|
-
var message_store_2 = require("./providers/sqlite/message.store");
|
|
41
|
-
Object.defineProperty(exports, "WaMessageSqliteStore", { enumerable: true, get: function () { return message_store_2.WaMessageSqliteStore; } });
|
|
42
|
-
var thread_store_2 = require("./providers/sqlite/thread.store");
|
|
43
|
-
Object.defineProperty(exports, "WaThreadSqliteStore", { enumerable: true, get: function () { return thread_store_2.WaThreadSqliteStore; } });
|
|
24
|
+
var privacy_token_store_1 = require("./providers/memory/privacy-token.store");
|
|
25
|
+
Object.defineProperty(exports, "WaPrivacyTokenMemoryStore", { enumerable: true, get: function () { return privacy_token_store_1.WaPrivacyTokenMemoryStore; } });
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.withAppStateLock = withAppStateLock;
|
|
4
|
+
const SharedExclusiveGate_1 = require("../../infra/perf/SharedExclusiveGate");
|
|
5
|
+
const StoreLock_1 = require("../../infra/perf/StoreLock");
|
|
6
|
+
const bytes_1 = require("../../util/bytes");
|
|
7
|
+
const WA_APPSTATE_CLEAR_KEY = 'appstate:clear';
|
|
8
|
+
function withAppStateLock(store) {
|
|
9
|
+
const lock = new StoreLock_1.StoreLock();
|
|
10
|
+
const gate = new SharedExclusiveGate_1.SharedExclusiveGate();
|
|
11
|
+
const destroyStore = store;
|
|
12
|
+
return {
|
|
13
|
+
exportData: () => gate.runShared(() => store.exportData()),
|
|
14
|
+
upsertSyncKeys: (keys) => gate.runShared(() => lock.runMany(keys.map((key) => `appstate:syncKey:${(0, bytes_1.bytesToHex)(key.keyId)}`), () => store.upsertSyncKeys(keys))),
|
|
15
|
+
getSyncKeysBatch: (keyIds) => gate.runShared(() => store.getSyncKeysBatch(keyIds)),
|
|
16
|
+
getSyncKeyData: (keyId) => gate.runShared(() => store.getSyncKeyData(keyId)),
|
|
17
|
+
getSyncKeyDataBatch: (keyIds) => gate.runShared(() => store.getSyncKeyDataBatch(keyIds)),
|
|
18
|
+
getActiveSyncKey: () => gate.runShared(() => store.getActiveSyncKey()),
|
|
19
|
+
getCollectionState: (collection) => gate.runShared(() => store.getCollectionState(collection)),
|
|
20
|
+
getCollectionStates: (collections) => gate.runShared(() => store.getCollectionStates(collections)),
|
|
21
|
+
setCollectionStates: (updates) => gate.runShared(() => lock.runMany(updates.map((update) => `appstate:collection:${update.collection}`), () => store.setCollectionStates(updates))),
|
|
22
|
+
clear: () => gate.runExclusive(() => lock.run(WA_APPSTATE_CLEAR_KEY, () => store.clear())),
|
|
23
|
+
destroy: async () => {
|
|
24
|
+
await gate.close();
|
|
25
|
+
await lock.shutdown();
|
|
26
|
+
await destroyStore.destroy?.();
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.withAuthLock = withAuthLock;
|
|
4
|
+
const StoreLock_1 = require("../../infra/perf/StoreLock");
|
|
5
|
+
const WA_AUTH_KEY = 'credentials';
|
|
6
|
+
function withAuthLock(store) {
|
|
7
|
+
const lock = new StoreLock_1.StoreLock();
|
|
8
|
+
const destroyStore = store;
|
|
9
|
+
return {
|
|
10
|
+
load: () => lock.run(WA_AUTH_KEY, () => store.load()),
|
|
11
|
+
save: (credentials) => lock.run(WA_AUTH_KEY, () => store.save(credentials)),
|
|
12
|
+
clear: () => lock.run(WA_AUTH_KEY, () => store.clear()),
|
|
13
|
+
destroy: async () => {
|
|
14
|
+
await lock.shutdown();
|
|
15
|
+
await destroyStore.destroy?.();
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.withContactLock = withContactLock;
|
|
4
|
+
const SharedExclusiveGate_1 = require("../../infra/perf/SharedExclusiveGate");
|
|
5
|
+
const StoreLock_1 = require("../../infra/perf/StoreLock");
|
|
6
|
+
const WA_CONTACT_CLEAR_KEY = 'contact:clear';
|
|
7
|
+
function withContactLock(store) {
|
|
8
|
+
const lock = new StoreLock_1.StoreLock();
|
|
9
|
+
const gate = new SharedExclusiveGate_1.SharedExclusiveGate();
|
|
10
|
+
const destroyStore = store;
|
|
11
|
+
return {
|
|
12
|
+
upsert: (record) => gate.runShared(() => lock.run(`contact:${record.jid}`, () => store.upsert(record))),
|
|
13
|
+
upsertBatch: (records) => gate.runShared(() => lock.runMany(records.map((record) => `contact:${record.jid}`), () => store.upsertBatch(records))),
|
|
14
|
+
getByJid: (jid) => gate.runShared(() => store.getByJid(jid)),
|
|
15
|
+
deleteByJid: (jid) => gate.runShared(() => lock.run(`contact:${jid}`, () => store.deleteByJid(jid))),
|
|
16
|
+
clear: () => gate.runExclusive(() => lock.run(WA_CONTACT_CLEAR_KEY, () => store.clear())),
|
|
17
|
+
destroy: async () => {
|
|
18
|
+
await gate.close();
|
|
19
|
+
await lock.shutdown();
|
|
20
|
+
await destroyStore.destroy?.();
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.withDeviceListLock = withDeviceListLock;
|
|
4
|
+
const SharedExclusiveGate_1 = require("../../infra/perf/SharedExclusiveGate");
|
|
5
|
+
const StoreLock_1 = require("../../infra/perf/StoreLock");
|
|
6
|
+
const WA_DEVICE_LIST_CLEAR_KEY = 'deviceList:clear';
|
|
7
|
+
const WA_DEVICE_LIST_CLEANUP_KEY = 'deviceList:cleanup';
|
|
8
|
+
function withDeviceListLock(store) {
|
|
9
|
+
const lock = new StoreLock_1.StoreLock();
|
|
10
|
+
const gate = new SharedExclusiveGate_1.SharedExclusiveGate();
|
|
11
|
+
return {
|
|
12
|
+
destroy: async () => {
|
|
13
|
+
await gate.close();
|
|
14
|
+
await lock.shutdown();
|
|
15
|
+
await store.destroy?.();
|
|
16
|
+
},
|
|
17
|
+
upsertUserDevicesBatch: (snapshots) => gate.runShared(() => lock.runMany(snapshots.map((snapshot) => `deviceList:user:${snapshot.userJid}`), () => store.upsertUserDevicesBatch(snapshots))),
|
|
18
|
+
getUserDevicesBatch: (userJids, nowMs) => gate.runShared(() => store.getUserDevicesBatch(userJids, nowMs)),
|
|
19
|
+
deleteUserDevices: (userJid) => gate.runShared(() => lock.run(`deviceList:user:${userJid}`, () => store.deleteUserDevices(userJid))),
|
|
20
|
+
cleanupExpired: (nowMs) => gate.runExclusive(() => lock.run(WA_DEVICE_LIST_CLEANUP_KEY, () => store.cleanupExpired(nowMs))),
|
|
21
|
+
clear: () => gate.runExclusive(() => lock.run(WA_DEVICE_LIST_CLEAR_KEY, () => store.clear()))
|
|
22
|
+
};
|
|
23
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.withMessageLock = withMessageLock;
|
|
4
|
+
const SharedExclusiveGate_1 = require("../../infra/perf/SharedExclusiveGate");
|
|
5
|
+
const StoreLock_1 = require("../../infra/perf/StoreLock");
|
|
6
|
+
const WA_MESSAGE_CLEAR_KEY = 'message:clear';
|
|
7
|
+
function withMessageLock(store) {
|
|
8
|
+
const lock = new StoreLock_1.StoreLock();
|
|
9
|
+
const gate = new SharedExclusiveGate_1.SharedExclusiveGate();
|
|
10
|
+
const destroyStore = store;
|
|
11
|
+
return {
|
|
12
|
+
upsert: (record) => gate.runShared(() => lock.run(`message:${record.id}`, () => store.upsert(record))),
|
|
13
|
+
upsertBatch: (records) => gate.runShared(() => lock.runMany(records.map((record) => `message:${record.id}`), () => store.upsertBatch(records))),
|
|
14
|
+
getById: (id) => gate.runShared(() => store.getById(id)),
|
|
15
|
+
listByThread: (threadJid, limit, beforeTimestampMs) => gate.runShared(() => store.listByThread(threadJid, limit, beforeTimestampMs)),
|
|
16
|
+
deleteById: (id) => gate.runShared(() => lock.run(`message:${id}`, () => store.deleteById(id))),
|
|
17
|
+
clear: () => gate.runExclusive(() => lock.run(WA_MESSAGE_CLEAR_KEY, () => store.clear())),
|
|
18
|
+
destroy: async () => {
|
|
19
|
+
await gate.close();
|
|
20
|
+
await lock.shutdown();
|
|
21
|
+
await destroyStore.destroy?.();
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.withParticipantsLock = withParticipantsLock;
|
|
4
|
+
const SharedExclusiveGate_1 = require("../../infra/perf/SharedExclusiveGate");
|
|
5
|
+
const StoreLock_1 = require("../../infra/perf/StoreLock");
|
|
6
|
+
const WA_PARTICIPANTS_CLEAR_KEY = 'participants:clear';
|
|
7
|
+
const WA_PARTICIPANTS_CLEANUP_KEY = 'participants:cleanup';
|
|
8
|
+
function withParticipantsLock(store) {
|
|
9
|
+
const lock = new StoreLock_1.StoreLock();
|
|
10
|
+
const gate = new SharedExclusiveGate_1.SharedExclusiveGate();
|
|
11
|
+
return {
|
|
12
|
+
destroy: async () => {
|
|
13
|
+
await gate.close();
|
|
14
|
+
await lock.shutdown();
|
|
15
|
+
await store.destroy?.();
|
|
16
|
+
},
|
|
17
|
+
upsertGroupParticipants: (snapshot) => gate.runShared(() => lock.run(`participants:group:${snapshot.groupJid}`, () => store.upsertGroupParticipants(snapshot))),
|
|
18
|
+
getGroupParticipants: (groupJid, nowMs) => gate.runShared(() => store.getGroupParticipants(groupJid, nowMs)),
|
|
19
|
+
deleteGroupParticipants: (groupJid) => gate.runShared(() => lock.run(`participants:group:${groupJid}`, () => store.deleteGroupParticipants(groupJid))),
|
|
20
|
+
cleanupExpired: (nowMs) => gate.runExclusive(() => lock.run(WA_PARTICIPANTS_CLEANUP_KEY, () => store.cleanupExpired(nowMs))),
|
|
21
|
+
clear: () => gate.runExclusive(() => lock.run(WA_PARTICIPANTS_CLEAR_KEY, () => store.clear()))
|
|
22
|
+
};
|
|
23
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.withPrivacyTokenLock = withPrivacyTokenLock;
|
|
4
|
+
const SharedExclusiveGate_1 = require("../../infra/perf/SharedExclusiveGate");
|
|
5
|
+
const StoreLock_1 = require("../../infra/perf/StoreLock");
|
|
6
|
+
function withPrivacyTokenLock(store) {
|
|
7
|
+
const lock = new StoreLock_1.StoreLock();
|
|
8
|
+
const gate = new SharedExclusiveGate_1.SharedExclusiveGate();
|
|
9
|
+
return {
|
|
10
|
+
destroy: async () => {
|
|
11
|
+
await gate.close();
|
|
12
|
+
await lock.shutdown();
|
|
13
|
+
await store.destroy?.();
|
|
14
|
+
},
|
|
15
|
+
upsert: (record) => gate.runShared(() => lock.run(`pt:${record.jid}`, () => store.upsert(record))),
|
|
16
|
+
upsertBatch: (records) => gate.runExclusive(() => store.upsertBatch(records)),
|
|
17
|
+
getByJid: (jid) => gate.runShared(() => store.getByJid(jid)),
|
|
18
|
+
deleteByJid: (jid) => gate.runShared(() => lock.run(`pt:${jid}`, () => store.deleteByJid(jid))),
|
|
19
|
+
clear: () => gate.runExclusive(() => store.clear())
|
|
20
|
+
};
|
|
21
|
+
}
|