@vrtmrz/livesync-commonlib 0.1.0-rc.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/LICENSE +21 -0
- package/README.md +49 -0
- package/dist/API/DirectFileManipulator.d.ts +2 -0
- package/dist/API/DirectFileManipulator.js +4 -0
- package/dist/API/DirectFileManipulatorV2.d.ts +150 -0
- package/dist/API/DirectFileManipulatorV2.js +424 -0
- package/dist/API/processSetting.d.ts +41 -0
- package/dist/API/processSetting.js +140 -0
- package/dist/ContentSplitter/ContentSplitter.d.ts +28 -0
- package/dist/ContentSplitter/ContentSplitter.js +5 -0
- package/dist/ContentSplitter/ContentSplitterBase.d.ts +51 -0
- package/dist/ContentSplitter/ContentSplitterBase.js +83 -0
- package/dist/ContentSplitter/ContentSplitterRabinKarp.d.ts +9 -0
- package/dist/ContentSplitter/ContentSplitterRabinKarp.js +32 -0
- package/dist/ContentSplitter/ContentSplitterV1.d.ts +9 -0
- package/dist/ContentSplitter/ContentSplitterV1.js +34 -0
- package/dist/ContentSplitter/ContentSplitterV2.d.ts +9 -0
- package/dist/ContentSplitter/ContentSplitterV2.js +34 -0
- package/dist/ContentSplitter/ContentSplitters.d.ts +12 -0
- package/dist/ContentSplitter/ContentSplitters.js +29 -0
- package/dist/bureau/bureau.d.ts +7 -0
- package/dist/bureau/bureau.js +5 -0
- package/dist/common/ConnectionString.d.ts +30 -0
- package/dist/common/ConnectionString.js +179 -0
- package/dist/common/LSError.d.ts +48 -0
- package/dist/common/LSError.js +112 -0
- package/dist/common/configForDoc.d.ts +79 -0
- package/dist/common/configForDoc.js +312 -0
- package/dist/common/coreEnvFunctions.d.ts +21 -0
- package/dist/common/coreEnvFunctions.js +22 -0
- package/dist/common/coreEnvVars.d.ts +3 -0
- package/dist/common/coreEnvVars.js +6 -0
- package/dist/common/i18n.d.ts +18 -0
- package/dist/common/i18n.js +7193 -0
- package/dist/common/logger.d.ts +2 -0
- package/dist/common/logger.js +1 -0
- package/dist/common/messages/combinedMessages.dev.d.ts +7 -0
- package/dist/common/messages/combinedMessages.dev.js +44 -0
- package/dist/common/messages/combinedMessages.prod.d.ts +9264 -0
- package/dist/common/messages/combinedMessages.prod.js +9271 -0
- package/dist/common/messages/de.d.ts +297 -0
- package/dist/common/messages/de.js +7 -0
- package/dist/common/messages/def.d.ts +1119 -0
- package/dist/common/messages/def.js +7 -0
- package/dist/common/messages/es.d.ts +689 -0
- package/dist/common/messages/es.js +7 -0
- package/dist/common/messages/fr.d.ts +582 -0
- package/dist/common/messages/fr.js +7 -0
- package/dist/common/messages/he.d.ts +583 -0
- package/dist/common/messages/he.js +7 -0
- package/dist/common/messages/ja.d.ts +838 -0
- package/dist/common/messages/ja.js +7 -0
- package/dist/common/messages/ko.d.ts +800 -0
- package/dist/common/messages/ko.js +7 -0
- package/dist/common/messages/ru.d.ts +858 -0
- package/dist/common/messages/ru.js +7 -0
- package/dist/common/messages/zh-tw.d.ts +384 -0
- package/dist/common/messages/zh-tw.js +7 -0
- package/dist/common/messages/zh.d.ts +1093 -0
- package/dist/common/messages/zh.js +7 -0
- package/dist/common/messagesJson/de.json +295 -0
- package/dist/common/messagesJson/en.json +1117 -0
- package/dist/common/messagesJson/es.json +687 -0
- package/dist/common/messagesJson/fr.json +580 -0
- package/dist/common/messagesJson/he.json +581 -0
- package/dist/common/messagesJson/ja.json +836 -0
- package/dist/common/messagesJson/ko.json +798 -0
- package/dist/common/messagesJson/ru.json +856 -0
- package/dist/common/messagesJson/zh-tw.json +382 -0
- package/dist/common/messagesJson/zh.json +1091 -0
- package/dist/common/models/auth.type.d.ts +41 -0
- package/dist/common/models/auth.type.js +0 -0
- package/dist/common/models/db.const.d.ts +20 -0
- package/dist/common/models/db.const.js +28 -0
- package/dist/common/models/db.definition.d.ts +56 -0
- package/dist/common/models/db.definition.js +6 -0
- package/dist/common/models/db.type.d.ts +142 -0
- package/dist/common/models/db.type.js +0 -0
- package/dist/common/models/diff.definition.d.ts +16 -0
- package/dist/common/models/diff.definition.js +0 -0
- package/dist/common/models/fileaccess.const.d.ts +7 -0
- package/dist/common/models/fileaccess.const.js +16 -0
- package/dist/common/models/fileaccess.type.d.ts +72 -0
- package/dist/common/models/fileaccess.type.js +0 -0
- package/dist/common/models/redflag.const.d.ts +32 -0
- package/dist/common/models/redflag.const.js +27 -0
- package/dist/common/models/setting.const.d.ts +49 -0
- package/dist/common/models/setting.const.defaults.d.ts +3 -0
- package/dist/common/models/setting.const.defaults.js +185 -0
- package/dist/common/models/setting.const.js +68 -0
- package/dist/common/models/setting.const.preferred.d.ts +5 -0
- package/dist/common/models/setting.const.preferred.js +35 -0
- package/dist/common/models/setting.const.qr.d.ts +2 -0
- package/dist/common/models/setting.const.qr.js +174 -0
- package/dist/common/models/setting.type.d.ts +900 -0
- package/dist/common/models/setting.type.js +8 -0
- package/dist/common/models/shared.const.behabiour.d.ts +28 -0
- package/dist/common/models/shared.const.behabiour.js +36 -0
- package/dist/common/models/shared.const.d.ts +5 -0
- package/dist/common/models/shared.const.js +12 -0
- package/dist/common/models/shared.const.symbols.d.ts +9 -0
- package/dist/common/models/shared.const.symbols.js +20 -0
- package/dist/common/models/shared.definition.configNames.d.ts +36 -0
- package/dist/common/models/shared.definition.configNames.js +203 -0
- package/dist/common/models/shared.definition.d.ts +22 -0
- package/dist/common/models/shared.definition.js +24 -0
- package/dist/common/models/shared.type.util.d.ts +8 -0
- package/dist/common/models/shared.type.util.js +0 -0
- package/dist/common/models/sync.definition.d.ts +18 -0
- package/dist/common/models/sync.definition.js +20 -0
- package/dist/common/models/tweak.definition.d.ts +191 -0
- package/dist/common/models/tweak.definition.js +77 -0
- package/dist/common/rosetta.d.ts +42 -0
- package/dist/common/rosetta.js +57 -0
- package/dist/common/settingConstants.d.ts +216 -0
- package/dist/common/settingConstants.js +434 -0
- package/dist/common/typeUtils.d.ts +17 -0
- package/dist/common/typeUtils.js +51 -0
- package/dist/common/types.d.ts +107 -0
- package/dist/common/types.js +212 -0
- package/dist/common/utils.d.ts +129 -0
- package/dist/common/utils.doc.d.ts +11 -0
- package/dist/common/utils.doc.js +35 -0
- package/dist/common/utils.js +583 -0
- package/dist/common/utils.object.d.ts +2 -0
- package/dist/common/utils.object.js +14 -0
- package/dist/common/utils.patch.d.ts +8 -0
- package/dist/common/utils.patch.js +178 -0
- package/dist/common/utils.type.d.ts +1 -0
- package/dist/common/utils.type.js +0 -0
- package/dist/context.d.ts +8 -0
- package/dist/context.js +14 -0
- package/dist/databases/IndexedDBKeyValueDatabase.d.ts +26 -0
- package/dist/databases/IndexedDBKeyValueDatabase.js +130 -0
- package/dist/dataobject/StoredMap.d.ts +12 -0
- package/dist/dataobject/StoredMap.js +47 -0
- package/dist/dev/checks.d.ts +5 -0
- package/dist/dev/checks.js +38 -0
- package/dist/encryption/encryptHKDF.d.ts +3 -0
- package/dist/encryption/encryptHKDF.js +7 -0
- package/dist/encryption/stringEncryption.d.ts +27 -0
- package/dist/encryption/stringEncryption.js +59 -0
- package/dist/events/coreEvents.d.ts +54 -0
- package/dist/events/coreEvents.js +46 -0
- package/dist/hub/hub.d.ts +11 -0
- package/dist/hub/hub.js +7 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +4 -0
- package/dist/interfaces/AsyncActivityRunner.d.ts +18 -0
- package/dist/interfaces/AsyncActivityRunner.js +7 -0
- package/dist/interfaces/Confirm.d.ts +17 -0
- package/dist/interfaces/Confirm.js +0 -0
- package/dist/interfaces/DatabaseFileAccess.d.ts +14 -0
- package/dist/interfaces/DatabaseFileAccess.js +0 -0
- package/dist/interfaces/DatabaseRebuilder.d.ts +13 -0
- package/dist/interfaces/DatabaseRebuilder.js +0 -0
- package/dist/interfaces/FileHandler.d.ts +13 -0
- package/dist/interfaces/FileHandler.js +0 -0
- package/dist/interfaces/KeyValueDatabase.d.ts +11 -0
- package/dist/interfaces/KeyValueDatabase.js +0 -0
- package/dist/interfaces/ServiceModule.d.ts +59 -0
- package/dist/interfaces/ServiceModule.js +19 -0
- package/dist/interfaces/StorageAccess.d.ts +44 -0
- package/dist/interfaces/StorageAccess.js +0 -0
- package/dist/interfaces/StorageEventManager.d.ts +16 -0
- package/dist/interfaces/StorageEventManager.js +5 -0
- package/dist/managers/ChangeManager.d.ts +61 -0
- package/dist/managers/ChangeManager.js +104 -0
- package/dist/managers/ChunkDeliveryCoordinator.d.ts +51 -0
- package/dist/managers/ChunkDeliveryCoordinator.js +136 -0
- package/dist/managers/ChunkFetcher.d.ts +44 -0
- package/dist/managers/ChunkFetcher.js +251 -0
- package/dist/managers/ChunkManager.d.ts +2 -0
- package/dist/managers/ChunkManager.js +4 -0
- package/dist/managers/ConflictManager.d.ts +37 -0
- package/dist/managers/ConflictManager.js +322 -0
- package/dist/managers/EntryManager/EntryManager.d.ts +37 -0
- package/dist/managers/EntryManager/EntryManager.js +73 -0
- package/dist/managers/EntryManager/EntryManagerImpls.d.ts +74 -0
- package/dist/managers/EntryManager/EntryManagerImpls.js +499 -0
- package/dist/managers/HashManager/HashManager.d.ts +60 -0
- package/dist/managers/HashManager/HashManager.js +97 -0
- package/dist/managers/HashManager/HashManagerCore.d.ts +114 -0
- package/dist/managers/HashManager/HashManagerCore.js +99 -0
- package/dist/managers/HashManager/PureJSHashManager.d.ts +77 -0
- package/dist/managers/HashManager/PureJSHashManager.js +84 -0
- package/dist/managers/HashManager/XXHashHashManager.d.ts +96 -0
- package/dist/managers/HashManager/XXHashHashManager.js +111 -0
- package/dist/managers/LayeredChunkManager/ArrivalWaitLayer.d.ts +30 -0
- package/dist/managers/LayeredChunkManager/ArrivalWaitLayer.js +115 -0
- package/dist/managers/LayeredChunkManager/CacheLayer.d.ts +59 -0
- package/dist/managers/LayeredChunkManager/CacheLayer.js +161 -0
- package/dist/managers/LayeredChunkManager/ChunkLayerInterfaces.d.ts +37 -0
- package/dist/managers/LayeredChunkManager/ChunkLayerInterfaces.js +0 -0
- package/dist/managers/LayeredChunkManager/DatabaseReadLayer.d.ts +14 -0
- package/dist/managers/LayeredChunkManager/DatabaseReadLayer.js +78 -0
- package/dist/managers/LayeredChunkManager/DatabaseWriteLayer.d.ts +11 -0
- package/dist/managers/LayeredChunkManager/DatabaseWriteLayer.js +43 -0
- package/dist/managers/LayeredChunkManager/HotPackLayer.d.ts +9 -0
- package/dist/managers/LayeredChunkManager/HotPackLayer.js +8 -0
- package/dist/managers/LayeredChunkManager/types.d.ts +39 -0
- package/dist/managers/LayeredChunkManager/types.js +0 -0
- package/dist/managers/LayeredChunkManager.d.ts +53 -0
- package/dist/managers/LayeredChunkManager.js +240 -0
- package/dist/managers/LiveSyncManagers.d.ts +48 -0
- package/dist/managers/LiveSyncManagers.js +136 -0
- package/dist/managers/StorageEventManager.d.ts +135 -0
- package/dist/managers/StorageEventManager.js +564 -0
- package/dist/managers/StorageProcessingManager.d.ts +14 -0
- package/dist/managers/StorageProcessingManager.js +48 -0
- package/dist/managers/adapters/IStorageEventConverterAdapter.d.ts +16 -0
- package/dist/managers/adapters/IStorageEventConverterAdapter.js +0 -0
- package/dist/managers/adapters/IStorageEventManagerAdapter.d.ts +18 -0
- package/dist/managers/adapters/IStorageEventManagerAdapter.js +0 -0
- package/dist/managers/adapters/IStorageEventPersistenceAdapter.d.ts +15 -0
- package/dist/managers/adapters/IStorageEventPersistenceAdapter.js +0 -0
- package/dist/managers/adapters/IStorageEventStatusAdapter.d.ts +13 -0
- package/dist/managers/adapters/IStorageEventStatusAdapter.js +0 -0
- package/dist/managers/adapters/IStorageEventTypeGuardAdapter.d.ts +16 -0
- package/dist/managers/adapters/IStorageEventTypeGuardAdapter.js +0 -0
- package/dist/managers/adapters/IStorageEventWatchAdapter.d.ts +21 -0
- package/dist/managers/adapters/IStorageEventWatchAdapter.js +0 -0
- package/dist/managers/adapters/index.d.ts +6 -0
- package/dist/managers/adapters/index.js +0 -0
- package/dist/mock_and_interop/stores.d.ts +21 -0
- package/dist/mock_and_interop/stores.js +15 -0
- package/dist/mock_and_interop/wrapper.d.ts +7 -0
- package/dist/mock_and_interop/wrapper.js +37 -0
- package/dist/mods.d.ts +1 -0
- package/dist/mods.js +18 -0
- package/dist/platform/browser/index.d.ts +1 -0
- package/dist/platform/browser/index.js +10 -0
- package/dist/platform/browser/storage.d.ts +35 -0
- package/dist/platform/browser/storage.js +139 -0
- package/dist/platform/node/index.d.ts +23 -0
- package/dist/platform/node/index.js +33 -0
- package/dist/platform/node/storage.d.ts +31 -0
- package/dist/platform/node/storage.js +104 -0
- package/dist/platform/storagePath.d.ts +7 -0
- package/dist/platform/storagePath.js +20 -0
- package/dist/pouchdb/LiveSyncDBFunctions.d.ts +14 -0
- package/dist/pouchdb/LiveSyncDBFunctions.js +129 -0
- package/dist/pouchdb/LiveSyncLocalDB.d.ts +196 -0
- package/dist/pouchdb/LiveSyncLocalDB.js +381 -0
- package/dist/pouchdb/PouchDBConstructor.d.ts +3 -0
- package/dist/pouchdb/PouchDBConstructor.js +0 -0
- package/dist/pouchdb/ReplicatorShim.d.ts +51 -0
- package/dist/pouchdb/ReplicatorShim.js +109 -0
- package/dist/pouchdb/StreamingFetch.d.ts +19 -0
- package/dist/pouchdb/StreamingFetch.js +263 -0
- package/dist/pouchdb/chunks.d.ts +38 -0
- package/dist/pouchdb/chunks.js +314 -0
- package/dist/pouchdb/compress.d.ts +11 -0
- package/dist/pouchdb/compress.js +99 -0
- package/dist/pouchdb/encryption.d.ts +20 -0
- package/dist/pouchdb/encryption.js +458 -0
- package/dist/pouchdb/negotiation.d.ts +9 -0
- package/dist/pouchdb/negotiation.js +109 -0
- package/dist/pouchdb/pouchdb-browser.d.ts +2 -0
- package/dist/pouchdb/pouchdb-browser.js +96 -0
- package/dist/pouchdb/pouchdb-http.d.ts +2 -0
- package/dist/pouchdb/pouchdb-http.js +94 -0
- package/dist/pouchdb/pouchdb-test.d.ts +2 -0
- package/dist/pouchdb/pouchdb-test.js +12 -0
- package/dist/pouchdb/utils_couchdb.d.ts +4 -0
- package/dist/pouchdb/utils_couchdb.js +38 -0
- package/dist/replication/LiveSyncAbstractReplicator.d.ts +69 -0
- package/dist/replication/LiveSyncAbstractReplicator.js +92 -0
- package/dist/replication/SyncParamsHandler.d.ts +35 -0
- package/dist/replication/SyncParamsHandler.js +118 -0
- package/dist/replication/couchdb/LiveSyncReplicator.d.ts +85 -0
- package/dist/replication/couchdb/LiveSyncReplicator.js +1132 -0
- package/dist/replication/httplib.d.ts +75 -0
- package/dist/replication/httplib.js +187 -0
- package/dist/replication/journal/JournalSyncCore.d.ts +70 -0
- package/dist/replication/journal/JournalSyncCore.js +737 -0
- package/dist/replication/journal/JournalSyncTypes.d.ts +9 -0
- package/dist/replication/journal/JournalSyncTypes.js +11 -0
- package/dist/replication/journal/LiveSyncJournalReplicator.d.ts +40 -0
- package/dist/replication/journal/LiveSyncJournalReplicator.js +294 -0
- package/dist/replication/journal/LiveSyncJournalReplicatorEnv.d.ts +3 -0
- package/dist/replication/journal/LiveSyncJournalReplicatorEnv.js +0 -0
- package/dist/replication/journal/objectstore/JournalStorageAdapter.d.ts +15 -0
- package/dist/replication/journal/objectstore/JournalStorageAdapter.js +0 -0
- package/dist/replication/journal/objectstore/MinioStorageAdapter.d.ts +21 -0
- package/dist/replication/journal/objectstore/MinioStorageAdapter.js +204 -0
- package/dist/replication/trystero/LiveSyncTrysteroReplicator.d.ts +90 -0
- package/dist/replication/trystero/LiveSyncTrysteroReplicator.js +380 -0
- package/dist/replication/trystero/P2PLogCollector.d.ts +8 -0
- package/dist/replication/trystero/P2PLogCollector.js +91 -0
- package/dist/replication/trystero/P2PReplicatorBase.d.ts +19 -0
- package/dist/replication/trystero/P2PReplicatorBase.js +0 -0
- package/dist/replication/trystero/P2PReplicatorCore.d.ts +12 -0
- package/dist/replication/trystero/P2PReplicatorCore.js +126 -0
- package/dist/replication/trystero/P2PReplicatorPaneCommon.d.ts +41 -0
- package/dist/replication/trystero/P2PReplicatorPaneCommon.js +20 -0
- package/dist/replication/trystero/ProxiedDB.d.ts +13 -0
- package/dist/replication/trystero/ProxiedDB.js +20 -0
- package/dist/replication/trystero/TrysteroReplicator.d.ts +152 -0
- package/dist/replication/trystero/TrysteroReplicator.js +683 -0
- package/dist/replication/trystero/TrysteroReplicatorP2PClient.d.ts +19 -0
- package/dist/replication/trystero/TrysteroReplicatorP2PClient.js +80 -0
- package/dist/replication/trystero/TrysteroReplicatorP2PConnection.d.ts +2 -0
- package/dist/replication/trystero/TrysteroReplicatorP2PConnection.js +4 -0
- package/dist/replication/trystero/TrysteroReplicatorP2PServer.d.ts +117 -0
- package/dist/replication/trystero/TrysteroReplicatorP2PServer.js +540 -0
- package/dist/replication/trystero/UseP2PReplicatorResult.d.ts +11 -0
- package/dist/replication/trystero/UseP2PReplicatorResult.js +0 -0
- package/dist/replication/trystero/addP2PEventHandlers.d.ts +35 -0
- package/dist/replication/trystero/addP2PEventHandlers.js +43 -0
- package/dist/replication/trystero/rpcCompat.d.ts +1 -0
- package/dist/replication/trystero/rpcCompat.js +9 -0
- package/dist/replication/trystero/types.d.ts +95 -0
- package/dist/replication/trystero/types.js +27 -0
- package/dist/replication/trystero/useP2PReplicatorCommands.d.ts +7 -0
- package/dist/replication/trystero/useP2PReplicatorCommands.js +25 -0
- package/dist/replication/trystero/useP2PReplicatorFeature.d.ts +17 -0
- package/dist/replication/trystero/useP2PReplicatorFeature.js +82 -0
- package/dist/rpc/RpcRoom.d.ts +24 -0
- package/dist/rpc/RpcRoom.js +300 -0
- package/dist/rpc/RpcSession.d.ts +9 -0
- package/dist/rpc/RpcSession.js +32 -0
- package/dist/rpc/chunking.d.ts +11 -0
- package/dist/rpc/chunking.js +58 -0
- package/dist/rpc/errors.d.ts +8 -0
- package/dist/rpc/errors.js +26 -0
- package/dist/rpc/index.d.ts +6 -0
- package/dist/rpc/index.js +12 -0
- package/dist/rpc/pouchdb/RpcPouchDBProxy.d.ts +75 -0
- package/dist/rpc/pouchdb/RpcPouchDBProxy.js +115 -0
- package/dist/rpc/pouchdb/RpcPouchDBServer.d.ts +16 -0
- package/dist/rpc/pouchdb/RpcPouchDBServer.js +55 -0
- package/dist/rpc/transports/DiagRTCPeerConnections.d.ts +24 -0
- package/dist/rpc/transports/DiagRTCPeerConnections.js +208 -0
- package/dist/rpc/transports/DiagRTCPeerConnections.types.d.ts +64 -0
- package/dist/rpc/transports/DiagRTCPeerConnections.types.js +12 -0
- package/dist/rpc/transports/DiagRTCPeerConnections.utils.d.ts +33 -0
- package/dist/rpc/transports/DiagRTCPeerConnections.utils.js +217 -0
- package/dist/rpc/transports/TrysteroTransport.d.ts +216 -0
- package/dist/rpc/transports/TrysteroTransport.js +134 -0
- package/dist/rpc/transports/trysteroUtils.d.ts +3 -0
- package/dist/rpc/transports/trysteroUtils.js +37 -0
- package/dist/rpc/types.d.ts +75 -0
- package/dist/rpc/types.js +6 -0
- package/dist/serviceFeatures/checkRemoteSize.d.ts +28 -0
- package/dist/serviceFeatures/checkRemoteSize.js +178 -0
- package/dist/serviceFeatures/offlineScanner.d.ts +128 -0
- package/dist/serviceFeatures/offlineScanner.js +553 -0
- package/dist/serviceFeatures/prepareDatabaseForUse.d.ts +20 -0
- package/dist/serviceFeatures/prepareDatabaseForUse.js +39 -0
- package/dist/serviceFeatures/remoteConfig.d.ts +46 -0
- package/dist/serviceFeatures/remoteConfig.js +247 -0
- package/dist/serviceFeatures/setupObsidian/qrCode.d.ts +4 -0
- package/dist/serviceFeatures/setupObsidian/qrCode.js +67 -0
- package/dist/serviceFeatures/setupObsidian/setupUri.d.ts +7 -0
- package/dist/serviceFeatures/setupObsidian/setupUri.js +70 -0
- package/dist/serviceFeatures/setupObsidian/types.d.ts +2 -0
- package/dist/serviceFeatures/setupObsidian/types.js +0 -0
- package/dist/serviceFeatures/targetFilter.d.ts +24 -0
- package/dist/serviceFeatures/targetFilter.js +178 -0
- package/dist/serviceModules/FileAccessBase.d.ts +93 -0
- package/dist/serviceModules/FileAccessBase.js +219 -0
- package/dist/serviceModules/Rebuilder.d.ts +92 -0
- package/dist/serviceModules/Rebuilder.js +449 -0
- package/dist/serviceModules/ServiceDatabaseFileAccessBase.d.ts +40 -0
- package/dist/serviceModules/ServiceDatabaseFileAccessBase.js +306 -0
- package/dist/serviceModules/ServiceFileAccessBase.d.ts +64 -0
- package/dist/serviceModules/ServiceFileAccessBase.js +312 -0
- package/dist/serviceModules/ServiceFileHandlerBase.d.ts +52 -0
- package/dist/serviceModules/ServiceFileHandlerBase.js +493 -0
- package/dist/serviceModules/ServiceModuleBase.d.ts +10 -0
- package/dist/serviceModules/ServiceModuleBase.js +13 -0
- package/dist/serviceModules/adapters/IConversionAdapter.d.ts +15 -0
- package/dist/serviceModules/adapters/IConversionAdapter.js +0 -0
- package/dist/serviceModules/adapters/IFileSystemAdapter.d.ts +47 -0
- package/dist/serviceModules/adapters/IFileSystemAdapter.js +0 -0
- package/dist/serviceModules/adapters/IPathAdapter.d.ts +15 -0
- package/dist/serviceModules/adapters/IPathAdapter.js +0 -0
- package/dist/serviceModules/adapters/IStorageAdapter.d.ts +56 -0
- package/dist/serviceModules/adapters/IStorageAdapter.js +0 -0
- package/dist/serviceModules/adapters/ITypeGuardAdapter.d.ts +14 -0
- package/dist/serviceModules/adapters/ITypeGuardAdapter.js +0 -0
- package/dist/serviceModules/adapters/IVaultAdapter.d.ts +51 -0
- package/dist/serviceModules/adapters/IVaultAdapter.js +0 -0
- package/dist/serviceModules/adapters/index.d.ts +6 -0
- package/dist/serviceModules/adapters/index.js +0 -0
- package/dist/services/BrowserServices.d.ts +36 -0
- package/dist/services/BrowserServices.js +123 -0
- package/dist/services/HeadlessServices.d.ts +14 -0
- package/dist/services/HeadlessServices.js +144 -0
- package/dist/services/InjectableServices.d.ts +1 -0
- package/dist/services/InjectableServices.js +4 -0
- package/dist/services/ServiceHub.d.ts +82 -0
- package/dist/services/ServiceHub.js +66 -0
- package/dist/services/base/APIService.d.ts +93 -0
- package/dist/services/base/APIService.js +44 -0
- package/dist/services/base/AppLifecycleService.d.ts +132 -0
- package/dist/services/base/AppLifecycleService.js +123 -0
- package/dist/services/base/ConfigService.d.ts +7 -0
- package/dist/services/base/ConfigService.js +6 -0
- package/dist/services/base/ConflictService.d.ts +54 -0
- package/dist/services/base/ConflictService.js +22 -0
- package/dist/services/base/ControlService.d.ts +54 -0
- package/dist/services/base/ControlService.js +103 -0
- package/dist/services/base/DatabaseEventService.d.ts +38 -0
- package/dist/services/base/DatabaseEventService.js +38 -0
- package/dist/services/base/DatabaseService.d.ts +40 -0
- package/dist/services/base/DatabaseService.js +79 -0
- package/dist/services/base/FileProcessingService.d.ts +25 -0
- package/dist/services/base/FileProcessingService.js +28 -0
- package/dist/services/base/IService.d.ts +284 -0
- package/dist/services/base/IService.js +1 -0
- package/dist/services/base/KeyValueDBService.d.ts +42 -0
- package/dist/services/base/KeyValueDBService.js +133 -0
- package/dist/services/base/MessageTranslator.d.ts +6 -0
- package/dist/services/base/MessageTranslator.js +4 -0
- package/dist/services/base/PathService.d.ts +38 -0
- package/dist/services/base/PathService.js +66 -0
- package/dist/services/base/RemoteService.d.ts +61 -0
- package/dist/services/base/RemoteService.js +212 -0
- package/dist/services/base/ReplicationService.d.ts +92 -0
- package/dist/services/base/ReplicationService.js +261 -0
- package/dist/services/base/ReplicatorService.d.ts +66 -0
- package/dist/services/base/ReplicatorService.js +164 -0
- package/dist/services/base/ServiceBase.d.ts +33 -0
- package/dist/services/base/ServiceBase.js +27 -0
- package/dist/services/base/SettingService.d.ts +112 -0
- package/dist/services/base/SettingService.js +543 -0
- package/dist/services/base/TestService.d.ts +28 -0
- package/dist/services/base/TestService.js +19 -0
- package/dist/services/base/TweakValueService.d.ts +40 -0
- package/dist/services/base/TweakValueService.js +6 -0
- package/dist/services/base/UnresolvedErrorManager.d.ts +15 -0
- package/dist/services/base/UnresolvedErrorManager.js +44 -0
- package/dist/services/base/VaultService.d.ts +69 -0
- package/dist/services/base/VaultService.js +70 -0
- package/dist/services/implements/base/SvelteDialog.d.ts +79 -0
- package/dist/services/implements/base/SvelteDialog.js +134 -0
- package/dist/services/implements/base/UIService.d.ts +24 -0
- package/dist/services/implements/base/UIService.js +37 -0
- package/dist/services/implements/browser/BrowserAPIService.d.ts +54 -0
- package/dist/services/implements/browser/BrowserAPIService.js +298 -0
- package/dist/services/implements/browser/BrowserDatabaseService.d.ts +7 -0
- package/dist/services/implements/browser/BrowserDatabaseService.js +10 -0
- package/dist/services/implements/browser/ConfigServiceBrowserCompat.d.ts +16 -0
- package/dist/services/implements/browser/ConfigServiceBrowserCompat.js +23 -0
- package/dist/services/implements/headless/HeadlessAPIService.d.ts +52 -0
- package/dist/services/implements/headless/HeadlessAPIService.js +127 -0
- package/dist/services/implements/headless/HeadlessDatabaseService.d.ts +7 -0
- package/dist/services/implements/headless/HeadlessDatabaseService.js +10 -0
- package/dist/services/implements/injectable/InjectableAPIService.d.ts +7 -0
- package/dist/services/implements/injectable/InjectableAPIService.js +18 -0
- package/dist/services/implements/injectable/InjectableAppLifecycleService.d.ts +11 -0
- package/dist/services/implements/injectable/InjectableAppLifecycleService.js +14 -0
- package/dist/services/implements/injectable/InjectableConflictService.d.ts +11 -0
- package/dist/services/implements/injectable/InjectableConflictService.js +14 -0
- package/dist/services/implements/injectable/InjectableDatabaseEventService.d.ts +4 -0
- package/dist/services/implements/injectable/InjectableDatabaseEventService.js +7 -0
- package/dist/services/implements/injectable/InjectableFileProcessingService.d.ts +4 -0
- package/dist/services/implements/injectable/InjectableFileProcessingService.js +6 -0
- package/dist/services/implements/injectable/InjectablePathService.d.ts +12 -0
- package/dist/services/implements/injectable/InjectablePathService.js +36 -0
- package/dist/services/implements/injectable/InjectableRemoteService.d.ts +4 -0
- package/dist/services/implements/injectable/InjectableRemoteService.js +7 -0
- package/dist/services/implements/injectable/InjectableReplicationService.d.ts +4 -0
- package/dist/services/implements/injectable/InjectableReplicationService.js +6 -0
- package/dist/services/implements/injectable/InjectableReplicatorService.d.ts +4 -0
- package/dist/services/implements/injectable/InjectableReplicatorService.js +7 -0
- package/dist/services/implements/injectable/InjectableServiceHub.d.ts +72 -0
- package/dist/services/implements/injectable/InjectableServiceHub.js +125 -0
- package/dist/services/implements/injectable/InjectableServices.d.ts +36 -0
- package/dist/services/implements/injectable/InjectableServices.js +1 -0
- package/dist/services/implements/injectable/InjectableSettingService.d.ts +11 -0
- package/dist/services/implements/injectable/InjectableSettingService.js +33 -0
- package/dist/services/implements/injectable/InjectableTestService.d.ts +5 -0
- package/dist/services/implements/injectable/InjectableTestService.js +8 -0
- package/dist/services/implements/injectable/InjectableTweakValueService.d.ts +15 -0
- package/dist/services/implements/injectable/InjectableTweakValueService.js +12 -0
- package/dist/services/implements/injectable/InjectableVaultService.d.ts +9 -0
- package/dist/services/implements/injectable/InjectableVaultService.js +20 -0
- package/dist/services/lib/HandlerUtils.d.ts +374 -0
- package/dist/services/lib/HandlerUtils.js +412 -0
- package/dist/services/lib/logUtils.d.ts +13 -0
- package/dist/services/lib/logUtils.js +28 -0
- package/dist/services/lib/remoteActivity.d.ts +13 -0
- package/dist/services/lib/remoteActivity.js +11 -0
- package/dist/string_and_binary/chunks.d.ts +10 -0
- package/dist/string_and_binary/chunks.js +561 -0
- package/dist/string_and_binary/convert.d.ts +8 -0
- package/dist/string_and_binary/convert.js +46 -0
- package/dist/string_and_binary/hash.d.ts +2 -0
- package/dist/string_and_binary/hash.js +1 -0
- package/dist/string_and_binary/path.d.ts +35 -0
- package/dist/string_and_binary/path.js +240 -0
- package/dist/worker/bg.common.d.ts +2 -0
- package/dist/worker/bg.common.js +6 -0
- package/dist/worker/bg.worker.d.ts +1 -0
- package/dist/worker/bg.worker.encryption.d.ts +7 -0
- package/dist/worker/bg.worker.encryption.js +30 -0
- package/dist/worker/bg.worker.js +14 -0
- package/dist/worker/bg.worker.splitting.d.ts +6 -0
- package/dist/worker/bg.worker.splitting.js +36 -0
- package/dist/worker/bgWorker.d.ts +25 -0
- package/dist/worker/bgWorker.direct.d.ts +40 -0
- package/dist/worker/bgWorker.direct.js +65 -0
- package/dist/worker/bgWorker.encryption.d.ts +22 -0
- package/dist/worker/bgWorker.encryption.js +40 -0
- package/dist/worker/bgWorker.js +348 -0
- package/dist/worker/bgWorker.splitting.d.ts +27 -0
- package/dist/worker/bgWorker.splitting.js +123 -0
- package/dist/worker/universalTypes.d.ts +63 -0
- package/dist/worker/universalTypes.js +4 -0
- package/docs/development.md +51 -0
- package/docs/platform-storage.md +60 -0
- package/docs/releasing.md +69 -0
- package/package.json +693 -0
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
import { _fetch } from "../common/coreEnvFunctions.js";
|
|
2
|
+
import { LOG_LEVEL_VERBOSE, Logger } from "octagonal-wheels/common/logger";
|
|
3
|
+
function generatePouchDBWriteStream(downloadToDB, decryptFunction, onCheckpoint) {
|
|
4
|
+
let batchBuffer = [];
|
|
5
|
+
let currentBatchSizeBytes = 0;
|
|
6
|
+
let batchLastSequence;
|
|
7
|
+
const BATCH_ITEM_LIMIT = 100;
|
|
8
|
+
const BATCH_SIZE_LIMIT = 2 * 1024 * 1024;
|
|
9
|
+
let flushPromise = null;
|
|
10
|
+
const flushToDB = async () => {
|
|
11
|
+
if (batchBuffer.length === 0) return;
|
|
12
|
+
if (flushPromise) {
|
|
13
|
+
await flushPromise;
|
|
14
|
+
}
|
|
15
|
+
try {
|
|
16
|
+
flushPromise = downloadToDB.bulkDocs(batchBuffer, { new_edits: false });
|
|
17
|
+
await flushPromise;
|
|
18
|
+
if (batchLastSequence !== void 0) {
|
|
19
|
+
await onCheckpoint?.(batchLastSequence);
|
|
20
|
+
}
|
|
21
|
+
} catch (error) {
|
|
22
|
+
Logger("Error bulk writing to PouchDB:", LOG_LEVEL_VERBOSE);
|
|
23
|
+
Logger(error, LOG_LEVEL_VERBOSE);
|
|
24
|
+
throw error;
|
|
25
|
+
} finally {
|
|
26
|
+
batchBuffer = [];
|
|
27
|
+
currentBatchSizeBytes = 0;
|
|
28
|
+
batchLastSequence = void 0;
|
|
29
|
+
flushPromise = null;
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
return new WritableStream({
|
|
33
|
+
async write(chunk) {
|
|
34
|
+
try {
|
|
35
|
+
const decryptedDoc = await decryptFunction(chunk.doc);
|
|
36
|
+
batchBuffer.push(decryptedDoc);
|
|
37
|
+
currentBatchSizeBytes += JSON.stringify(decryptedDoc).length;
|
|
38
|
+
batchLastSequence = chunk.seq;
|
|
39
|
+
if (batchBuffer.length >= BATCH_ITEM_LIMIT || currentBatchSizeBytes >= BATCH_SIZE_LIMIT) {
|
|
40
|
+
await flushToDB();
|
|
41
|
+
}
|
|
42
|
+
} catch (error) {
|
|
43
|
+
Logger("Error processing document stream:", LOG_LEVEL_VERBOSE);
|
|
44
|
+
throw error;
|
|
45
|
+
}
|
|
46
|
+
},
|
|
47
|
+
async close() {
|
|
48
|
+
await flushToDB();
|
|
49
|
+
},
|
|
50
|
+
abort(reason) {
|
|
51
|
+
Logger(`Stream aborted: ${reason}`, LOG_LEVEL_VERBOSE);
|
|
52
|
+
batchBuffer = [];
|
|
53
|
+
currentBatchSizeBytes = 0;
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
function setParamsToURL(url, params) {
|
|
58
|
+
for (const [key, value] of Object.entries(params)) {
|
|
59
|
+
url.searchParams.set(key, value);
|
|
60
|
+
}
|
|
61
|
+
return url;
|
|
62
|
+
}
|
|
63
|
+
function reachedTargetSequence(seq, targetSeq) {
|
|
64
|
+
if (seq === void 0 || targetSeq === void 0) return false;
|
|
65
|
+
const seqStr = seq.toString();
|
|
66
|
+
const targetSeqStr = targetSeq.toString();
|
|
67
|
+
if (seqStr === targetSeqStr) return true;
|
|
68
|
+
const seqNum = parseInt(seqStr.split("-")[0], 10);
|
|
69
|
+
const targetSeqNum = parseInt(targetSeqStr.split("-")[0], 10);
|
|
70
|
+
if (!isNaN(seqNum) && !isNaN(targetSeqNum)) {
|
|
71
|
+
return seqNum >= targetSeqNum;
|
|
72
|
+
}
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
async function fetchChangesForInitialSync(downloadToDB, remoteDbUrl, authHeader, decryptFunction, since = "0", onProgress, onCheckpoint) {
|
|
76
|
+
let totalFetched = 0;
|
|
77
|
+
let totalValidFetched = 0;
|
|
78
|
+
const changesBaseParams = {
|
|
79
|
+
feed: "continuous",
|
|
80
|
+
include_docs: "true",
|
|
81
|
+
style: "all_docs",
|
|
82
|
+
conflicts: "true",
|
|
83
|
+
revs: "true",
|
|
84
|
+
since: since.toString(),
|
|
85
|
+
heartbeat: "30000"
|
|
86
|
+
};
|
|
87
|
+
const fetchHeaders = {
|
|
88
|
+
Accept: "application/json",
|
|
89
|
+
Authorization: authHeader
|
|
90
|
+
};
|
|
91
|
+
let targetSeq = void 0;
|
|
92
|
+
try {
|
|
93
|
+
const dbInfoRes = await _fetch(remoteDbUrl, {
|
|
94
|
+
headers: fetchHeaders
|
|
95
|
+
});
|
|
96
|
+
if (dbInfoRes.ok) {
|
|
97
|
+
const dbInfo = await dbInfoRes.json();
|
|
98
|
+
targetSeq = dbInfo.update_seq;
|
|
99
|
+
}
|
|
100
|
+
} catch (e) {
|
|
101
|
+
Logger("Failed to fetch database info for target sequence:", LOG_LEVEL_VERBOSE);
|
|
102
|
+
Logger(e, LOG_LEVEL_VERBOSE);
|
|
103
|
+
}
|
|
104
|
+
const fetchURL = setParamsToURL(new URL(`${remoteDbUrl}/_changes`), {
|
|
105
|
+
...changesBaseParams,
|
|
106
|
+
feed: "normal",
|
|
107
|
+
limit: "1"
|
|
108
|
+
});
|
|
109
|
+
const infoRes = await _fetch(fetchURL.toString(), {
|
|
110
|
+
headers: fetchHeaders
|
|
111
|
+
});
|
|
112
|
+
const infoSource = await infoRes.text();
|
|
113
|
+
const infoSourceTrimmed = infoSource.trim();
|
|
114
|
+
if (!infoSourceTrimmed) {
|
|
115
|
+
throw new Error("Failed to fetch changes from CouchDB. No data received.");
|
|
116
|
+
}
|
|
117
|
+
let info;
|
|
118
|
+
if (infoSourceTrimmed.startsWith("{") && infoSourceTrimmed.endsWith("}")) {
|
|
119
|
+
try {
|
|
120
|
+
info = JSON.parse(infoSourceTrimmed);
|
|
121
|
+
} catch {
|
|
122
|
+
const infoLines = infoSourceTrimmed.split("\n").filter((line) => line.trim() !== "");
|
|
123
|
+
const lastLine = infoLines[infoLines.length - 1];
|
|
124
|
+
info = JSON.parse(lastLine);
|
|
125
|
+
}
|
|
126
|
+
} else {
|
|
127
|
+
const infoLines = infoSourceTrimmed.split("\n").filter((line) => line.trim() !== "");
|
|
128
|
+
const lastLine = infoLines[infoLines.length - 1];
|
|
129
|
+
info = JSON.parse(lastLine);
|
|
130
|
+
}
|
|
131
|
+
const pendingDocs = info.pending || 0;
|
|
132
|
+
const docsToFetch = pendingDocs + 1;
|
|
133
|
+
if (targetSeq === void 0) {
|
|
134
|
+
targetSeq = info.last_seq || info.update_seq || info.seq;
|
|
135
|
+
}
|
|
136
|
+
const finalTargetSeq = targetSeq ?? "";
|
|
137
|
+
if (reachedTargetSequence(since, finalTargetSeq)) {
|
|
138
|
+
Logger("Already at the target sequence. Initial data synchronisation is complete.");
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
Logger(
|
|
142
|
+
`Starting initial synchronisation. Current sequence: ${since}, Target sequence: ${finalTargetSeq}, Total documents to fetch: ${docsToFetch}.`
|
|
143
|
+
);
|
|
144
|
+
const controller = new AbortController();
|
|
145
|
+
const url = setParamsToURL(new URL(`${remoteDbUrl}/_changes`), {
|
|
146
|
+
...changesBaseParams
|
|
147
|
+
});
|
|
148
|
+
const response = await _fetch(url.toString(), {
|
|
149
|
+
method: "GET",
|
|
150
|
+
headers: fetchHeaders,
|
|
151
|
+
signal: controller.signal
|
|
152
|
+
});
|
|
153
|
+
if (!response.body) {
|
|
154
|
+
throw new Error("ReadableStream is not supported by this browser.");
|
|
155
|
+
}
|
|
156
|
+
const sizeCaptureStream = new TransformStream({
|
|
157
|
+
transform(chunk, controller2) {
|
|
158
|
+
const chunkSize = chunk.length || chunk.byteLength || 0;
|
|
159
|
+
totalBytes += chunkSize;
|
|
160
|
+
controller2.enqueue(chunk);
|
|
161
|
+
}
|
|
162
|
+
});
|
|
163
|
+
const reader = response.body.pipeThrough(sizeCaptureStream).pipeThrough(new TextDecoderStream()).getReader();
|
|
164
|
+
const writeDocStream = generatePouchDBWriteStream(downloadToDB, decryptFunction, onCheckpoint);
|
|
165
|
+
const writer = writeDocStream.getWriter();
|
|
166
|
+
let buffer = "";
|
|
167
|
+
let lastProgress = 0;
|
|
168
|
+
let lastReportTime = Date.now();
|
|
169
|
+
let totalBytes = 0;
|
|
170
|
+
let abortedAfterTargetReached = false;
|
|
171
|
+
const reportProgress = () => {
|
|
172
|
+
if (totalFetched - lastProgress < 25) {
|
|
173
|
+
if (Date.now() - lastReportTime < 2e3) {
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
lastProgress = totalFetched;
|
|
178
|
+
lastReportTime = Date.now();
|
|
179
|
+
onProgress?.({
|
|
180
|
+
totalFetched,
|
|
181
|
+
totalValidFetched,
|
|
182
|
+
targetSeq: finalTargetSeq,
|
|
183
|
+
docsToFetch,
|
|
184
|
+
totalBytes
|
|
185
|
+
});
|
|
186
|
+
};
|
|
187
|
+
try {
|
|
188
|
+
while (true) {
|
|
189
|
+
reportProgress();
|
|
190
|
+
const { value, done } = await reader.read();
|
|
191
|
+
if (value) {
|
|
192
|
+
totalBytes += value.length;
|
|
193
|
+
}
|
|
194
|
+
if (done) {
|
|
195
|
+
if (buffer.trim()) {
|
|
196
|
+
try {
|
|
197
|
+
totalFetched++;
|
|
198
|
+
const parsed = JSON.parse(buffer);
|
|
199
|
+
if (parsed.doc) {
|
|
200
|
+
await writer.write({ doc: parsed.doc, seq: parsed.seq });
|
|
201
|
+
totalValidFetched++;
|
|
202
|
+
} else {
|
|
203
|
+
await onCheckpoint?.(parsed.seq);
|
|
204
|
+
}
|
|
205
|
+
reportProgress();
|
|
206
|
+
} catch (e) {
|
|
207
|
+
Logger(`Failed to parse the final line: ${buffer}. Skipping it.`);
|
|
208
|
+
Logger(e, LOG_LEVEL_VERBOSE);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
await writer.close();
|
|
212
|
+
break;
|
|
213
|
+
}
|
|
214
|
+
buffer += value;
|
|
215
|
+
const lines = buffer.split("\n");
|
|
216
|
+
buffer = lines.pop() || "";
|
|
217
|
+
for (const line of lines) {
|
|
218
|
+
if (!line.trim()) continue;
|
|
219
|
+
try {
|
|
220
|
+
const parsed = JSON.parse(line);
|
|
221
|
+
totalFetched++;
|
|
222
|
+
if (parsed.doc) {
|
|
223
|
+
await writer.write({ doc: parsed.doc, seq: parsed.seq });
|
|
224
|
+
totalValidFetched++;
|
|
225
|
+
} else {
|
|
226
|
+
await onCheckpoint?.(parsed.seq);
|
|
227
|
+
}
|
|
228
|
+
reportProgress();
|
|
229
|
+
if (totalFetched >= docsToFetch || reachedTargetSequence(parsed.seq, finalTargetSeq)) {
|
|
230
|
+
Logger(
|
|
231
|
+
`All documents fetched. Stopping the stream and writing remaining documents to PouchDB...`
|
|
232
|
+
);
|
|
233
|
+
await writer.close();
|
|
234
|
+
abortedAfterTargetReached = true;
|
|
235
|
+
controller.abort();
|
|
236
|
+
reportProgress();
|
|
237
|
+
return;
|
|
238
|
+
}
|
|
239
|
+
} catch (e) {
|
|
240
|
+
Logger(`JSON parsing failed. Skipping line: ${line}`, LOG_LEVEL_VERBOSE);
|
|
241
|
+
Logger(e, LOG_LEVEL_VERBOSE);
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
Logger("Initial data synchronisation via stream has completed.");
|
|
246
|
+
reportProgress();
|
|
247
|
+
} catch (error) {
|
|
248
|
+
if (abortedAfterTargetReached && error instanceof DOMException && error.name === "AbortError") {
|
|
249
|
+
Logger(
|
|
250
|
+
"Stream has been aborted as the target sequence has been reached. Finalising the synchronising process..."
|
|
251
|
+
);
|
|
252
|
+
return;
|
|
253
|
+
}
|
|
254
|
+
Logger("An error occurred during synchronisation:", LOG_LEVEL_VERBOSE);
|
|
255
|
+
Logger(error, LOG_LEVEL_VERBOSE);
|
|
256
|
+
throw error;
|
|
257
|
+
} finally {
|
|
258
|
+
reader.releaseLock();
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
export {
|
|
262
|
+
fetchChangesForInitialSync
|
|
263
|
+
};
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { CouchDBConnection } from "../common/types.js";
|
|
2
|
+
export declare function purgeUnreferencedChunks(db: PouchDB.Database, dryRun: boolean, connSetting?: CouchDBConnection, performCompact?: boolean): Promise<number>;
|
|
3
|
+
export declare function transferChunks(key: string, label: string, dbFrom: PouchDB.Database, dbTo: PouchDB.Database, items: {
|
|
4
|
+
id: string;
|
|
5
|
+
rev: string;
|
|
6
|
+
}[]): Promise<boolean>;
|
|
7
|
+
export declare function balanceChunkPurgedDBs(local: PouchDB.Database, remote: PouchDB.Database): Promise<void>;
|
|
8
|
+
export declare function fetchAllUsedChunks(local: PouchDB.Database, remote: PouchDB.Database): Promise<void>;
|
|
9
|
+
export declare function purgeChunksLocal(db: PouchDB.Database, docs: {
|
|
10
|
+
id: string;
|
|
11
|
+
rev: string;
|
|
12
|
+
}[]): Promise<void>;
|
|
13
|
+
export declare function collectUnbalancedChunkIDs(local: PouchDB.Database, remote: PouchDB.Database): Promise<{
|
|
14
|
+
onlyOnLocal: {
|
|
15
|
+
id: string;
|
|
16
|
+
rev: string;
|
|
17
|
+
}[];
|
|
18
|
+
onlyOnRemote: {
|
|
19
|
+
id: string;
|
|
20
|
+
rev: string;
|
|
21
|
+
}[];
|
|
22
|
+
}>;
|
|
23
|
+
export declare function collectChunks(db: PouchDB.Database, type: "INUSE" | "DANGLING" | "ALL"): Promise<{
|
|
24
|
+
id: string;
|
|
25
|
+
rev: string;
|
|
26
|
+
}[]>;
|
|
27
|
+
export declare function collectChunksUsage(db: PouchDB.Database): Promise<{
|
|
28
|
+
value: number;
|
|
29
|
+
key: string[];
|
|
30
|
+
}[]>;
|
|
31
|
+
export declare function collectUnreferencedChunks(db: PouchDB.Database): Promise<{
|
|
32
|
+
id: string;
|
|
33
|
+
rev: string;
|
|
34
|
+
}[]>;
|
|
35
|
+
export declare function purgeChunksRemote(setting: CouchDBConnection, docs: {
|
|
36
|
+
id: string;
|
|
37
|
+
rev: string;
|
|
38
|
+
}[]): Promise<void>;
|
|
@@ -0,0 +1,314 @@
|
|
|
1
|
+
import { Logger, LOG_LEVEL_NOTICE, LOG_LEVEL_VERBOSE } from "../common/logger.js";
|
|
2
|
+
import { QueueProcessor } from "octagonal-wheels/concurrency/processor";
|
|
3
|
+
import { arrayToChunkedArray, sizeToHumanReadable } from "../common/utils.js";
|
|
4
|
+
import { serialized } from "octagonal-wheels/concurrency/lock";
|
|
5
|
+
import { _requestToCouchDBFetch } from "./utils_couchdb.js";
|
|
6
|
+
import { isNotFoundError } from "../common/utils.doc.js";
|
|
7
|
+
async function purgeUnreferencedChunks(db, dryRun, connSetting, performCompact = false) {
|
|
8
|
+
const info = await db.info();
|
|
9
|
+
let resultCount = 0;
|
|
10
|
+
const getSize = function(info2, key) {
|
|
11
|
+
return Number.parseInt(info2?.sizes?.[key] ?? "0", 10);
|
|
12
|
+
};
|
|
13
|
+
const keySuffix = connSetting ? "-remote" : "-local";
|
|
14
|
+
Logger(`${dryRun ? "Counting" : "Cleaning"} ${connSetting ? "remote" : "local"} database`, LOG_LEVEL_NOTICE);
|
|
15
|
+
if (connSetting) {
|
|
16
|
+
Logger(
|
|
17
|
+
`Database active-size: ${sizeToHumanReadable(getSize(info, "active"))}, external-size:${sizeToHumanReadable(
|
|
18
|
+
getSize(info, "external")
|
|
19
|
+
)}, file-size: ${sizeToHumanReadable(getSize(info, "file"))}`,
|
|
20
|
+
LOG_LEVEL_NOTICE
|
|
21
|
+
);
|
|
22
|
+
}
|
|
23
|
+
Logger(`Collecting unreferenced chunks on ${info.db_name}`, LOG_LEVEL_NOTICE, "gc-count-chunk" + keySuffix);
|
|
24
|
+
const chunks = await collectUnreferencedChunks(db);
|
|
25
|
+
resultCount = chunks.length;
|
|
26
|
+
if (chunks.length == 0) {
|
|
27
|
+
Logger(`No unreferenced chunks! ${info.db_name}`, LOG_LEVEL_NOTICE, "gc-count-chunk" + keySuffix);
|
|
28
|
+
} else {
|
|
29
|
+
Logger(
|
|
30
|
+
`Number of unreferenced chunks on ${info.db_name}: ${chunks.length}`,
|
|
31
|
+
LOG_LEVEL_NOTICE,
|
|
32
|
+
"gc-count-chunk" + keySuffix
|
|
33
|
+
);
|
|
34
|
+
if (dryRun) {
|
|
35
|
+
Logger(`DryRun of cleaning ${connSetting ? "remote" : "local"} database up: Done`, LOG_LEVEL_NOTICE);
|
|
36
|
+
return resultCount;
|
|
37
|
+
}
|
|
38
|
+
if (connSetting) {
|
|
39
|
+
Logger(`Cleaning unreferenced chunks on remote`, LOG_LEVEL_NOTICE, "gc-purge" + keySuffix);
|
|
40
|
+
await purgeChunksRemote(connSetting, chunks);
|
|
41
|
+
} else {
|
|
42
|
+
Logger(`Cleaning unreferenced chunks on local`, LOG_LEVEL_NOTICE, "gc-purge" + keySuffix);
|
|
43
|
+
await purgeChunksLocal(db, chunks);
|
|
44
|
+
}
|
|
45
|
+
Logger(`Cleaning unreferenced chunks done!`, LOG_LEVEL_NOTICE, "gc-purge" + keySuffix);
|
|
46
|
+
}
|
|
47
|
+
if (performCompact) {
|
|
48
|
+
Logger(`Compacting database...`, LOG_LEVEL_NOTICE, "gc-compact" + keySuffix);
|
|
49
|
+
await db.compact();
|
|
50
|
+
Logger(`Compacting database done`, LOG_LEVEL_NOTICE, "gc-compact" + keySuffix);
|
|
51
|
+
}
|
|
52
|
+
if (connSetting) {
|
|
53
|
+
const endInfo = await db.info();
|
|
54
|
+
Logger(
|
|
55
|
+
`Processed database active-size: ${sizeToHumanReadable(
|
|
56
|
+
getSize(endInfo, "active")
|
|
57
|
+
)}, external-size:${sizeToHumanReadable(
|
|
58
|
+
getSize(endInfo, "external")
|
|
59
|
+
)}, file-size: ${sizeToHumanReadable(getSize(endInfo, "file"))}`,
|
|
60
|
+
LOG_LEVEL_NOTICE
|
|
61
|
+
);
|
|
62
|
+
Logger(
|
|
63
|
+
`Reduced sizes: active-size: ${sizeToHumanReadable(
|
|
64
|
+
getSize(info, "active") - getSize(endInfo, "active")
|
|
65
|
+
)}, external-size:${sizeToHumanReadable(
|
|
66
|
+
getSize(info, "external") - getSize(endInfo, "external")
|
|
67
|
+
)}, file-size: ${sizeToHumanReadable(getSize(info, "file") - getSize(endInfo, "file"))}`,
|
|
68
|
+
LOG_LEVEL_NOTICE
|
|
69
|
+
);
|
|
70
|
+
}
|
|
71
|
+
Logger(`Cleaning ${connSetting ? "remote" : "local"} database up: Done`, LOG_LEVEL_NOTICE);
|
|
72
|
+
return resultCount;
|
|
73
|
+
}
|
|
74
|
+
function transferChunks(key, label, dbFrom, dbTo, items) {
|
|
75
|
+
let totalProcessed = 0;
|
|
76
|
+
const total = items.length;
|
|
77
|
+
return new QueueProcessor(
|
|
78
|
+
async (batched) => {
|
|
79
|
+
const requestItems = batched.map((e) => e.id);
|
|
80
|
+
const local = await dbTo.allDocs({ keys: requestItems });
|
|
81
|
+
const batch = local.rows.filter((e) => "error" in e && e.error == "not_found").map((e) => e.key);
|
|
82
|
+
return batch;
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
batchSize: 50,
|
|
86
|
+
concurrentLimit: 5,
|
|
87
|
+
suspended: true,
|
|
88
|
+
delay: 100
|
|
89
|
+
},
|
|
90
|
+
items
|
|
91
|
+
).pipeTo(
|
|
92
|
+
new QueueProcessor(
|
|
93
|
+
async (chunkIds) => {
|
|
94
|
+
const docs = await dbFrom.allDocs({
|
|
95
|
+
keys: chunkIds,
|
|
96
|
+
include_docs: true
|
|
97
|
+
});
|
|
98
|
+
const filteredDocs = docs.rows.filter((e) => !("error" in e)).map((e) => e.doc);
|
|
99
|
+
return filteredDocs;
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
batchSize: 25,
|
|
103
|
+
concurrentLimit: 1,
|
|
104
|
+
suspended: true,
|
|
105
|
+
delay: 100
|
|
106
|
+
}
|
|
107
|
+
)
|
|
108
|
+
).pipeTo(
|
|
109
|
+
new QueueProcessor(
|
|
110
|
+
async (docs) => {
|
|
111
|
+
try {
|
|
112
|
+
await dbTo.bulkDocs(docs, { new_edits: false });
|
|
113
|
+
} catch (ex) {
|
|
114
|
+
Logger(`${label}: Something went wrong on balancing`, LOG_LEVEL_NOTICE);
|
|
115
|
+
Logger(ex, LOG_LEVEL_VERBOSE);
|
|
116
|
+
} finally {
|
|
117
|
+
totalProcessed += docs.length;
|
|
118
|
+
Logger(`${label}: ${totalProcessed} / ${total}`, LOG_LEVEL_NOTICE, "balance-" + key);
|
|
119
|
+
}
|
|
120
|
+
return;
|
|
121
|
+
},
|
|
122
|
+
{ batchSize: 100, delay: 100, concurrentLimit: 2, suspended: false }
|
|
123
|
+
)
|
|
124
|
+
).startPipeline().waitForAllDoneAndTerminate();
|
|
125
|
+
}
|
|
126
|
+
async function balanceChunkPurgedDBs(local, remote) {
|
|
127
|
+
Logger(`Complement missing chunks between databases`, LOG_LEVEL_NOTICE);
|
|
128
|
+
try {
|
|
129
|
+
const { onlyOnLocal, onlyOnRemote } = await collectUnbalancedChunkIDs(local, remote);
|
|
130
|
+
const localToRemote = transferChunks("l2r", "local -> remote", local, remote, onlyOnLocal);
|
|
131
|
+
const remoteToLocal = transferChunks("r2l", "remote -> local", remote, local, onlyOnRemote);
|
|
132
|
+
await Promise.all([localToRemote, remoteToLocal]);
|
|
133
|
+
Logger(`local -> remote: Done`, LOG_LEVEL_NOTICE, "balance-l2r");
|
|
134
|
+
Logger(`remote -> local: Done`, LOG_LEVEL_NOTICE, "balance-r2l");
|
|
135
|
+
} catch (ex) {
|
|
136
|
+
Logger("Something went wrong on balancing!", LOG_LEVEL_NOTICE);
|
|
137
|
+
Logger(ex, LOG_LEVEL_VERBOSE);
|
|
138
|
+
}
|
|
139
|
+
Logger("Complement completed!", LOG_LEVEL_NOTICE);
|
|
140
|
+
}
|
|
141
|
+
async function fetchAllUsedChunks(local, remote) {
|
|
142
|
+
try {
|
|
143
|
+
const chunksOnRemote = await collectChunks(remote, "INUSE");
|
|
144
|
+
await transferChunks("r2l", "remote -> local", remote, local, chunksOnRemote);
|
|
145
|
+
Logger(`remote -> local: Done`, LOG_LEVEL_NOTICE, "balance-r2l");
|
|
146
|
+
} catch (ex) {
|
|
147
|
+
Logger("Something went wrong on balancing!", LOG_LEVEL_NOTICE);
|
|
148
|
+
Logger(ex, LOG_LEVEL_VERBOSE);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
async function purgeChunksLocal(db, docs) {
|
|
152
|
+
await serialized("purge-local", async () => {
|
|
153
|
+
try {
|
|
154
|
+
Logger(`Purging unused ${docs.length} chunks `, LOG_LEVEL_NOTICE, "purge-local-backup");
|
|
155
|
+
const batchDocsBackup = arrayToChunkedArray(docs, 100);
|
|
156
|
+
let total = { ok: 0, exist: 0, error: 0 };
|
|
157
|
+
for (const docsInBatch of batchDocsBackup) {
|
|
158
|
+
const backupDocsFrom = await db.allDocs({
|
|
159
|
+
keys: docsInBatch.map((e) => e.id),
|
|
160
|
+
include_docs: true
|
|
161
|
+
});
|
|
162
|
+
const backupDocs = backupDocsFrom.rows.filter((e) => "doc" in e).map((e) => {
|
|
163
|
+
const chunk = { ...e.doc };
|
|
164
|
+
delete chunk._rev;
|
|
165
|
+
chunk._id = `_local/${chunk._id}`;
|
|
166
|
+
return chunk;
|
|
167
|
+
});
|
|
168
|
+
const ret = await db.bulkDocs(backupDocs);
|
|
169
|
+
total = ret.map((e) => ({
|
|
170
|
+
ok: "ok" in e ? 1 : 0,
|
|
171
|
+
exist: "status" in e && e.status == 409 ? 1 : 0,
|
|
172
|
+
error: "status" in e && e.status != 409 ? 1 : 0
|
|
173
|
+
})).reduce((p, c) => ({ ok: p.ok + c.ok, exist: p.exist + c.exist, error: p.error + c.error }), total);
|
|
174
|
+
Logger(
|
|
175
|
+
`Local chunk backed up: new:${total.ok} ,exist:${total.exist}, error:${total.error}`,
|
|
176
|
+
LOG_LEVEL_NOTICE,
|
|
177
|
+
"purge-local-backup"
|
|
178
|
+
);
|
|
179
|
+
const erroredItems = ret.filter((e) => "error" in e && e.status != 409);
|
|
180
|
+
for (const item of erroredItems) {
|
|
181
|
+
Logger(`Failed to back up: ${item.id} / ${item.rev}`, LOG_LEVEL_VERBOSE);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
} catch (ex) {
|
|
185
|
+
Logger(`Could not back up chunks`);
|
|
186
|
+
Logger(ex, LOG_LEVEL_VERBOSE);
|
|
187
|
+
}
|
|
188
|
+
Logger(`Purging unused ${docs.length} chunks... `, LOG_LEVEL_NOTICE, "purge-local");
|
|
189
|
+
const batchDocs = arrayToChunkedArray(docs, 100);
|
|
190
|
+
let totalRemoved = 0;
|
|
191
|
+
for (const docsInBatch of batchDocs) {
|
|
192
|
+
const removed = await db.purgeMulti(docsInBatch.map((e) => [e.id, e.rev]));
|
|
193
|
+
const removedCount = Object.values(removed).filter((e) => "ok" in e).length;
|
|
194
|
+
totalRemoved += removedCount;
|
|
195
|
+
Logger(`Purging: ${totalRemoved} / ${docs.length}`, LOG_LEVEL_NOTICE, "purge-local");
|
|
196
|
+
}
|
|
197
|
+
Logger(
|
|
198
|
+
`Purging unused chunks done!: ${totalRemoved} chunks has been deleted.`,
|
|
199
|
+
LOG_LEVEL_NOTICE,
|
|
200
|
+
"purge-local"
|
|
201
|
+
);
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
async function collectUnbalancedChunkIDs(local, remote) {
|
|
205
|
+
const chunksOnLocal = await collectChunks(local, "INUSE");
|
|
206
|
+
const chunksOnRemote = await collectChunks(remote, "INUSE");
|
|
207
|
+
const onlyOnLocal = chunksOnLocal.filter((e) => !chunksOnRemote.some((ee) => ee.id == e.id));
|
|
208
|
+
const onlyOnRemote = chunksOnRemote.filter((e) => !chunksOnLocal.some((ee) => ee.id == e.id));
|
|
209
|
+
return { onlyOnLocal, onlyOnRemote };
|
|
210
|
+
}
|
|
211
|
+
async function collectChunks(db, type) {
|
|
212
|
+
const rows = await collectChunksUsage(db);
|
|
213
|
+
const rowF = type == "ALL" ? rows : rows.filter((e) => type == "DANGLING" ? e.value == 0 : e.value != 0);
|
|
214
|
+
const ids = rowF.flatMap((e) => e.key);
|
|
215
|
+
const docs = (await db.allDocs({ keys: ids })).rows;
|
|
216
|
+
const items = docs.filter((e) => !("error" in e)).map((e) => ({ id: e.id, rev: e.value.rev }));
|
|
217
|
+
return items;
|
|
218
|
+
}
|
|
219
|
+
async function prepareChunkDesignDoc(db) {
|
|
220
|
+
const chunkDesignDoc = {
|
|
221
|
+
_id: "_design/chunks",
|
|
222
|
+
_rev: void 0,
|
|
223
|
+
ver: 2,
|
|
224
|
+
views: {
|
|
225
|
+
collectDangling: {
|
|
226
|
+
map: function(doc) {
|
|
227
|
+
if (doc._id.startsWith("h:")) {
|
|
228
|
+
emit([doc._id], 0);
|
|
229
|
+
} else {
|
|
230
|
+
if ("children" in doc) {
|
|
231
|
+
doc.children.forEach((e) => emit([e], 1));
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
}.toString(),
|
|
235
|
+
reduce: "_sum"
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
};
|
|
239
|
+
let updateDDoc = false;
|
|
240
|
+
try {
|
|
241
|
+
const old = await db.get(chunkDesignDoc._id);
|
|
242
|
+
if (old?.ver ?? 0 < chunkDesignDoc.ver) {
|
|
243
|
+
chunkDesignDoc._rev = old._rev;
|
|
244
|
+
updateDDoc = true;
|
|
245
|
+
}
|
|
246
|
+
} catch (ex) {
|
|
247
|
+
if (isNotFoundError(ex)) {
|
|
248
|
+
updateDDoc = true;
|
|
249
|
+
} else {
|
|
250
|
+
Logger(`Failed to make design document for operating chunks`);
|
|
251
|
+
Logger(ex, LOG_LEVEL_VERBOSE);
|
|
252
|
+
return false;
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
try {
|
|
256
|
+
if (updateDDoc) {
|
|
257
|
+
await db.put(chunkDesignDoc);
|
|
258
|
+
}
|
|
259
|
+
} catch (ex) {
|
|
260
|
+
Logger(`Failed to make design document for operating chunks`);
|
|
261
|
+
Logger(ex, LOG_LEVEL_VERBOSE);
|
|
262
|
+
return false;
|
|
263
|
+
}
|
|
264
|
+
return true;
|
|
265
|
+
}
|
|
266
|
+
async function collectChunksUsage(db) {
|
|
267
|
+
if (!await prepareChunkDesignDoc(db)) {
|
|
268
|
+
Logger(`Could not prepare design document for operating chunks`);
|
|
269
|
+
return [];
|
|
270
|
+
}
|
|
271
|
+
const q = await db.query("chunks/collectDangling", { reduce: true, group: true });
|
|
272
|
+
const rows = q.rows;
|
|
273
|
+
return rows;
|
|
274
|
+
}
|
|
275
|
+
function collectUnreferencedChunks(db) {
|
|
276
|
+
return collectChunks(db, "DANGLING");
|
|
277
|
+
}
|
|
278
|
+
async function purgeChunksRemote(setting, docs) {
|
|
279
|
+
await serialized("purge-remote", async () => {
|
|
280
|
+
const CHUNK_SIZE = 100;
|
|
281
|
+
function makeChunkedArrayFromArray(items) {
|
|
282
|
+
const chunked = [];
|
|
283
|
+
for (let i = 0; i < items.length; i += CHUNK_SIZE) {
|
|
284
|
+
chunked.push(items.slice(i, i + CHUNK_SIZE));
|
|
285
|
+
}
|
|
286
|
+
return chunked;
|
|
287
|
+
}
|
|
288
|
+
const buffer = makeChunkedArrayFromArray(docs);
|
|
289
|
+
for (const chunkedPayload of buffer) {
|
|
290
|
+
const rets = await _requestToCouchDBFetch(
|
|
291
|
+
`${setting.couchDB_URI.replace(/\/+$/, "")}/${setting.couchDB_DBNAME}`,
|
|
292
|
+
setting.couchDB_USER,
|
|
293
|
+
setting.couchDB_PASSWORD,
|
|
294
|
+
"_purge",
|
|
295
|
+
Object.fromEntries(chunkedPayload.map((e) => [e.id, [e.rev]])),
|
|
296
|
+
"POST"
|
|
297
|
+
);
|
|
298
|
+
Logger(JSON.stringify(await rets.json()), LOG_LEVEL_VERBOSE);
|
|
299
|
+
}
|
|
300
|
+
return;
|
|
301
|
+
});
|
|
302
|
+
}
|
|
303
|
+
export {
|
|
304
|
+
balanceChunkPurgedDBs,
|
|
305
|
+
collectChunks,
|
|
306
|
+
collectChunksUsage,
|
|
307
|
+
collectUnbalancedChunkIDs,
|
|
308
|
+
collectUnreferencedChunks,
|
|
309
|
+
fetchAllUsedChunks,
|
|
310
|
+
purgeChunksLocal,
|
|
311
|
+
purgeChunksRemote,
|
|
312
|
+
purgeUnreferencedChunks,
|
|
313
|
+
transferChunks
|
|
314
|
+
};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import * as fflate from "fflate";
|
|
2
|
+
import type { EntryDoc } from "../common/types.js";
|
|
3
|
+
export declare function _compressText(text: string): Promise<string>;
|
|
4
|
+
export declare const wrappedInflate: (data: Uint8Array<ArrayBuffer>, opts: fflate.AsyncInflateOptions) => Promise<Uint8Array<ArrayBuffer>>;
|
|
5
|
+
export declare const wrappedDeflate: (data: Uint8Array<ArrayBuffer>, opts: fflate.AsyncDeflateOptions) => Promise<Uint8Array<ArrayBuffer>>;
|
|
6
|
+
export declare function _decompressText(compressed: string, _useUTF16?: boolean): Promise<string>;
|
|
7
|
+
export declare function compressDoc(doc: EntryDoc): Promise<import("../common/types.js").NoteEntry | import("../common/types.js").NewEntry | import("../common/types.js").PlainEntry | import("../common/types.js").EntryLeaf | import("../common/types.js").EntryChunkPack | import("../common/types.js").EntryVersionInfo | import("../common/types.js").EntryMilestoneInfo | import("../common/types.js").EntryNodeInfo>;
|
|
8
|
+
export declare function decompressDoc(doc: EntryDoc): Promise<import("../common/types.js").NoteEntry | import("../common/types.js").NewEntry | import("../common/types.js").PlainEntry | import("../common/types.js").EntryLeaf | import("../common/types.js").EntryChunkPack | import("../common/types.js").EntryVersionInfo | import("../common/types.js").EntryMilestoneInfo | import("../common/types.js").EntryNodeInfo>;
|
|
9
|
+
export declare function wrapFflateFunc<T, U>(func: (data: T, opts: U, cb: fflate.FlateCallback) => unknown): (data: T, opts: U) => Promise<Uint8Array<ArrayBuffer>>;
|
|
10
|
+
export declare const replicationFilter: (db: PouchDB.Database<EntryDoc>, compress: boolean) => void;
|
|
11
|
+
export declare const MARK_SHIFT_COMPRESSED = "\u000ELZ\u001D";
|