@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,99 @@
|
|
|
1
|
+
import * as fflate from "fflate";
|
|
2
|
+
import {
|
|
3
|
+
tryConvertBase64ToArrayBuffer,
|
|
4
|
+
arrayBufferToBase64Single,
|
|
5
|
+
base64ToArrayBuffer
|
|
6
|
+
} from "../string_and_binary/convert.js";
|
|
7
|
+
async function _compressText(text) {
|
|
8
|
+
const converted = tryConvertBase64ToArrayBuffer(text);
|
|
9
|
+
const data = new Uint8Array(
|
|
10
|
+
converted || await new Blob([text], { type: "application/octet-stream" }).arrayBuffer()
|
|
11
|
+
);
|
|
12
|
+
if (data.buffer.byteLength == 0) {
|
|
13
|
+
return "";
|
|
14
|
+
}
|
|
15
|
+
const df = await wrappedDeflate(new Uint8Array(data), { consume: true, level: 8 });
|
|
16
|
+
const deflateResult = (converted ? "~" : "") + await arrayBufferToBase64Single(df);
|
|
17
|
+
return deflateResult;
|
|
18
|
+
}
|
|
19
|
+
const wrappedInflate = wrapFflateFunc(fflate.inflate);
|
|
20
|
+
const wrappedDeflate = wrapFflateFunc(fflate.deflate);
|
|
21
|
+
async function _decompressText(compressed, _useUTF16 = false) {
|
|
22
|
+
if (compressed.length == 0) {
|
|
23
|
+
return "";
|
|
24
|
+
}
|
|
25
|
+
const converted = compressed[0] == "~";
|
|
26
|
+
const src = compressed.substring(converted ? 1 : 0);
|
|
27
|
+
if (src.length == 0) {
|
|
28
|
+
return "";
|
|
29
|
+
}
|
|
30
|
+
const ab = new Uint8Array(base64ToArrayBuffer(src));
|
|
31
|
+
if (ab.length == 0) {
|
|
32
|
+
return "";
|
|
33
|
+
}
|
|
34
|
+
const ret = await wrappedInflate(new Uint8Array(ab), { consume: true });
|
|
35
|
+
if (converted) {
|
|
36
|
+
return await arrayBufferToBase64Single(ret);
|
|
37
|
+
}
|
|
38
|
+
const response = new Blob([ret]);
|
|
39
|
+
const text = await response.text();
|
|
40
|
+
return text;
|
|
41
|
+
}
|
|
42
|
+
async function compressDoc(doc) {
|
|
43
|
+
if (!("data" in doc)) {
|
|
44
|
+
return doc;
|
|
45
|
+
}
|
|
46
|
+
if (typeof doc.data !== "string") return doc;
|
|
47
|
+
if (doc.data.startsWith(MARK_SHIFT_COMPRESSED)) return doc;
|
|
48
|
+
const oldData = doc.data;
|
|
49
|
+
const compressed = await _compressText(oldData);
|
|
50
|
+
const newData = MARK_SHIFT_COMPRESSED + compressed;
|
|
51
|
+
if (doc.data.length > newData.length) doc.data = newData;
|
|
52
|
+
return doc;
|
|
53
|
+
}
|
|
54
|
+
async function decompressDoc(doc) {
|
|
55
|
+
if (!("data" in doc)) {
|
|
56
|
+
return doc;
|
|
57
|
+
}
|
|
58
|
+
if (typeof doc.data !== "string") return doc;
|
|
59
|
+
if (doc.data.startsWith(MARK_SHIFT_COMPRESSED)) {
|
|
60
|
+
doc.data = await _decompressText(doc.data.substring(MARK_SHIFT_COMPRESSED.length));
|
|
61
|
+
}
|
|
62
|
+
return doc;
|
|
63
|
+
}
|
|
64
|
+
function wrapFflateFunc(func) {
|
|
65
|
+
return (data, opts) => {
|
|
66
|
+
return new Promise((res, rej) => {
|
|
67
|
+
func(data, opts, (err, result) => {
|
|
68
|
+
if (err) rej(err);
|
|
69
|
+
else res(new Uint8Array(result));
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
const replicationFilter = (db, compress) => {
|
|
75
|
+
db.transform({
|
|
76
|
+
//@ts-ignore
|
|
77
|
+
async incoming(doc) {
|
|
78
|
+
if (!compress) return doc;
|
|
79
|
+
return await compressDoc(doc);
|
|
80
|
+
},
|
|
81
|
+
//@ts-ignore
|
|
82
|
+
async outgoing(doc) {
|
|
83
|
+
return await decompressDoc(doc);
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
};
|
|
87
|
+
const MARK_SHIFT = `L`;
|
|
88
|
+
const MARK_SHIFT_COMPRESSED = `${MARK_SHIFT}Z`;
|
|
89
|
+
export {
|
|
90
|
+
MARK_SHIFT_COMPRESSED,
|
|
91
|
+
_compressText,
|
|
92
|
+
_decompressText,
|
|
93
|
+
compressDoc,
|
|
94
|
+
decompressDoc,
|
|
95
|
+
replicationFilter,
|
|
96
|
+
wrapFflateFunc,
|
|
97
|
+
wrappedDeflate,
|
|
98
|
+
wrappedInflate
|
|
99
|
+
};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { type EntryDoc, type AnyEntry, type EntryLeaf, type DocumentID, type E2EEAlgorithm } from "../common/types.js";
|
|
2
|
+
import { encryptWorker, decryptWorker, encryptHKDFWorker, decryptHKDFWorker } from "#worker";
|
|
3
|
+
export declare const encrypt: typeof encryptWorker;
|
|
4
|
+
export declare const decrypt: typeof decryptWorker;
|
|
5
|
+
export declare const encryptHKDF: typeof encryptHKDFWorker;
|
|
6
|
+
export declare const decryptHKDF: typeof decryptHKDFWorker;
|
|
7
|
+
export declare let preprocessOutgoing: (doc: AnyEntry | EntryLeaf) => Promise<AnyEntry | EntryLeaf>;
|
|
8
|
+
export declare let preprocessIncoming: (doc: EntryDoc) => Promise<EntryDoc>;
|
|
9
|
+
export declare function getConfiguredFunctionsForEncryption(passphrase: string, useDynamicIterationCount: boolean, migrationDecrypt: boolean, getPBKDF2Salt: () => Promise<Uint8Array<ArrayBuffer>>, algorithm: E2EEAlgorithm): {
|
|
10
|
+
incoming: (doc: AnyEntry | EntryLeaf) => Promise<AnyEntry | EntryLeaf>;
|
|
11
|
+
outgoing: (doc: EntryDoc) => Promise<AnyEntry | EntryLeaf>;
|
|
12
|
+
};
|
|
13
|
+
export declare const enableEncryption: (db: PouchDB.Database<EntryDoc>, passphrase: string, useDynamicIterationCount: boolean, migrationDecrypt: boolean, getPBKDF2Salt: () => Promise<Uint8Array<ArrayBuffer>>, algorithm: E2EEAlgorithm) => void;
|
|
14
|
+
export declare function disableEncryption(): void;
|
|
15
|
+
export declare const EDEN_ENCRYPTED_KEY: DocumentID;
|
|
16
|
+
export declare const EDEN_ENCRYPTED_KEY_HKDF: DocumentID;
|
|
17
|
+
export declare function shouldEncryptEden(doc: AnyEntry | EntryLeaf): doc is AnyEntry;
|
|
18
|
+
export declare function shouldEncryptEdenHKDF(doc: AnyEntry | EntryLeaf): doc is AnyEntry;
|
|
19
|
+
export declare function shouldDecryptEden(doc: AnyEntry | EntryLeaf): doc is AnyEntry;
|
|
20
|
+
export declare function shouldDecryptEdenHKDF(doc: AnyEntry | EntryLeaf): doc is AnyEntry;
|
|
@@ -0,0 +1,458 @@
|
|
|
1
|
+
import { Logger, LOG_LEVEL_NOTICE, LOG_LEVEL_VERBOSE } from "../common/logger.js";
|
|
2
|
+
import {
|
|
3
|
+
E2EEAlgorithms,
|
|
4
|
+
isMetaEntry
|
|
5
|
+
} from "../common/types.js";
|
|
6
|
+
import { isEncryptedChunkEntry, isSyncInfoEntry, isObfuscatedEntry } from "../common/utils.js";
|
|
7
|
+
import { isPathProbablyObfuscated, obfuscatePath } from "octagonal-wheels/encryption/encryption";
|
|
8
|
+
import { getPath } from "../string_and_binary/path.js";
|
|
9
|
+
import { encryptWorker, decryptWorker, encryptHKDFWorker, decryptHKDFWorker } from "#worker";
|
|
10
|
+
const encrypt = encryptWorker;
|
|
11
|
+
const decrypt = decryptWorker;
|
|
12
|
+
const encryptHKDF = encryptHKDFWorker;
|
|
13
|
+
const decryptHKDF = decryptHKDFWorker;
|
|
14
|
+
const Encrypt_HKDF_Header = "%=";
|
|
15
|
+
const Encrypt_OLD_Header = "%";
|
|
16
|
+
const EncryptionVersions = {
|
|
17
|
+
UNENCRYPTED: 0,
|
|
18
|
+
ENCRYPTED: 1,
|
|
19
|
+
HKDF: 2,
|
|
20
|
+
UNKNOWN: 99
|
|
21
|
+
};
|
|
22
|
+
function getEncryptionVersion(data) {
|
|
23
|
+
if ("e_" in data && data.e_ === true) {
|
|
24
|
+
if (data.data.startsWith(Encrypt_HKDF_Header)) {
|
|
25
|
+
return EncryptionVersions.HKDF;
|
|
26
|
+
} else if (data.data.startsWith(Encrypt_OLD_Header)) {
|
|
27
|
+
return EncryptionVersions.ENCRYPTED;
|
|
28
|
+
}
|
|
29
|
+
return EncryptionVersions.UNKNOWN;
|
|
30
|
+
}
|
|
31
|
+
return EncryptionVersions.UNENCRYPTED;
|
|
32
|
+
}
|
|
33
|
+
async function tryDecryptV1AsFallback(encryptedData, passphrase, useDynamicIterationCount) {
|
|
34
|
+
try {
|
|
35
|
+
return await decrypt(encryptedData, passphrase, useDynamicIterationCount);
|
|
36
|
+
} catch (ex) {
|
|
37
|
+
try {
|
|
38
|
+
Logger(
|
|
39
|
+
"Failed to decrypt with V1 method. Fallback to disable useDynamicIterationCount.",
|
|
40
|
+
LOG_LEVEL_VERBOSE
|
|
41
|
+
);
|
|
42
|
+
Logger(ex, LOG_LEVEL_VERBOSE);
|
|
43
|
+
return await decrypt(encryptedData, passphrase, false);
|
|
44
|
+
} catch (ex2) {
|
|
45
|
+
Logger("Completely failed to decrypt with V1 method.", LOG_LEVEL_VERBOSE);
|
|
46
|
+
Logger(ex2, LOG_LEVEL_VERBOSE);
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
const ENCRYPTED_META_PREFIX = "/\\:";
|
|
52
|
+
function isEncryptedMeta(doc) {
|
|
53
|
+
return "path" in doc && doc.path.startsWith(ENCRYPTED_META_PREFIX);
|
|
54
|
+
}
|
|
55
|
+
async function encryptMetaWithHKDF(doc, passphrase, pbkdf2Salt) {
|
|
56
|
+
if (isEncryptedMeta(doc)) {
|
|
57
|
+
return doc.path;
|
|
58
|
+
}
|
|
59
|
+
const props = {
|
|
60
|
+
path: getPath(doc),
|
|
61
|
+
mtime: doc.mtime,
|
|
62
|
+
ctime: doc.ctime,
|
|
63
|
+
size: doc.size,
|
|
64
|
+
children: isMetaEntry(doc) ? doc.children : void 0
|
|
65
|
+
};
|
|
66
|
+
const propStr = JSON.stringify(props);
|
|
67
|
+
const encryptedMeta = await encryptHKDFWorker(propStr, passphrase, pbkdf2Salt);
|
|
68
|
+
return ENCRYPTED_META_PREFIX + encryptedMeta;
|
|
69
|
+
}
|
|
70
|
+
async function decryptMetaWithHKDF(meta, passphrase, pbkdf2Salt) {
|
|
71
|
+
if (!meta.startsWith(ENCRYPTED_META_PREFIX)) {
|
|
72
|
+
throw new Error("Meta is not encrypted with HKDF.");
|
|
73
|
+
}
|
|
74
|
+
const encryptedMeta = meta.slice(ENCRYPTED_META_PREFIX.length);
|
|
75
|
+
const props = await decryptHKDF(encryptedMeta, passphrase, pbkdf2Salt);
|
|
76
|
+
const parsedProps = JSON.parse(props);
|
|
77
|
+
return parsedProps;
|
|
78
|
+
}
|
|
79
|
+
const MESSAGE_FALLBACK_DECRYPT_FAILED = "Failed to decrypt the data with V1 method. Cannot encrypt with HKDF.";
|
|
80
|
+
const ENCRYPTION_HKDF_FAILED = "Encryption with HKDF failed.";
|
|
81
|
+
const DECRYPTION_HKDF_FAILED = "Decryption with HKDF failed.";
|
|
82
|
+
const DECRYPTION_FALLBACK_FAILED = "Decryption with fallback failed.";
|
|
83
|
+
async function incomingEncryptHKDF(doc, passphrase, useDynamicIterationCount, getPBKDF2Salt) {
|
|
84
|
+
const saveDoc = {
|
|
85
|
+
...doc
|
|
86
|
+
};
|
|
87
|
+
if (isEncryptedChunkEntry(saveDoc) || isSyncInfoEntry(saveDoc)) {
|
|
88
|
+
try {
|
|
89
|
+
const encryptionVersion = getEncryptionVersion(saveDoc);
|
|
90
|
+
if (encryptionVersion === EncryptionVersions.ENCRYPTED) {
|
|
91
|
+
const decrypted = await tryDecryptV1AsFallback(saveDoc.data, passphrase, useDynamicIterationCount);
|
|
92
|
+
if (decrypted === false) {
|
|
93
|
+
Logger(MESSAGE_FALLBACK_DECRYPT_FAILED, LOG_LEVEL_NOTICE);
|
|
94
|
+
throw new Error(MESSAGE_FALLBACK_DECRYPT_FAILED);
|
|
95
|
+
}
|
|
96
|
+
const pbkdf2salt = await getPBKDF2Salt();
|
|
97
|
+
saveDoc.data = await encryptHKDF(saveDoc.data, passphrase, pbkdf2salt);
|
|
98
|
+
saveDoc.e_ = true;
|
|
99
|
+
}
|
|
100
|
+
if (encryptionVersion === EncryptionVersions.HKDF) {
|
|
101
|
+
} else if (encryptionVersion === EncryptionVersions.UNENCRYPTED) {
|
|
102
|
+
const pbkdf2salt = await getPBKDF2Salt();
|
|
103
|
+
saveDoc.data = await encryptHKDF(saveDoc.data, passphrase, pbkdf2salt);
|
|
104
|
+
saveDoc.e_ = true;
|
|
105
|
+
}
|
|
106
|
+
} catch (ex) {
|
|
107
|
+
Logger(ENCRYPTION_HKDF_FAILED, LOG_LEVEL_NOTICE);
|
|
108
|
+
Logger(ex);
|
|
109
|
+
throw ex;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
if (shouldEncryptEdenHKDF(saveDoc)) {
|
|
113
|
+
const pbkdf2salt = await getPBKDF2Salt();
|
|
114
|
+
try {
|
|
115
|
+
saveDoc.eden = {
|
|
116
|
+
[EDEN_ENCRYPTED_KEY_HKDF]: {
|
|
117
|
+
data: await encryptHKDF(JSON.stringify(saveDoc.eden), passphrase, pbkdf2salt),
|
|
118
|
+
epoch: 999999
|
|
119
|
+
}
|
|
120
|
+
};
|
|
121
|
+
} catch (ex) {
|
|
122
|
+
Logger(`${ENCRYPTION_HKDF_FAILED} on Eden`, LOG_LEVEL_NOTICE);
|
|
123
|
+
Logger(ex);
|
|
124
|
+
throw ex;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
if (isObfuscatedEntry(saveDoc)) {
|
|
128
|
+
const pbkdf2salt = await getPBKDF2Salt();
|
|
129
|
+
if (!isEncryptedMeta(saveDoc)) {
|
|
130
|
+
try {
|
|
131
|
+
saveDoc.path = await encryptMetaWithHKDF(
|
|
132
|
+
saveDoc,
|
|
133
|
+
passphrase,
|
|
134
|
+
pbkdf2salt
|
|
135
|
+
);
|
|
136
|
+
saveDoc.mtime = 0;
|
|
137
|
+
saveDoc.ctime = 0;
|
|
138
|
+
saveDoc.size = 0;
|
|
139
|
+
if ("children" in saveDoc) saveDoc.children = [];
|
|
140
|
+
} catch (ex) {
|
|
141
|
+
Logger(`${ENCRYPTION_HKDF_FAILED} on Metadata`, LOG_LEVEL_NOTICE);
|
|
142
|
+
Logger(ex);
|
|
143
|
+
throw ex;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
return saveDoc;
|
|
148
|
+
}
|
|
149
|
+
async function outgoingDecryptHKDF(doc, migrationDecrypt, decrypted, passphrase, useDynamicIterationCount, getPBKDF2Salt) {
|
|
150
|
+
const loadDoc = {
|
|
151
|
+
...doc
|
|
152
|
+
};
|
|
153
|
+
if (isEncryptedChunkEntry(loadDoc) || isSyncInfoEntry(loadDoc)) {
|
|
154
|
+
try {
|
|
155
|
+
const encryptionVersion = getEncryptionVersion(loadDoc);
|
|
156
|
+
if (encryptionVersion === EncryptionVersions.HKDF) {
|
|
157
|
+
const pbkdf2salt = await getPBKDF2Salt();
|
|
158
|
+
loadDoc.data = await decryptHKDF(loadDoc.data, passphrase, pbkdf2salt);
|
|
159
|
+
delete loadDoc.e_;
|
|
160
|
+
} else if (encryptionVersion === EncryptionVersions.ENCRYPTED) {
|
|
161
|
+
const decryptedData = await tryDecryptV1AsFallback(loadDoc.data, passphrase, useDynamicIterationCount);
|
|
162
|
+
if (decryptedData === false) {
|
|
163
|
+
Logger(MESSAGE_FALLBACK_DECRYPT_FAILED, LOG_LEVEL_NOTICE);
|
|
164
|
+
throw new Error(MESSAGE_FALLBACK_DECRYPT_FAILED);
|
|
165
|
+
}
|
|
166
|
+
loadDoc.data = decryptedData;
|
|
167
|
+
delete loadDoc.e_;
|
|
168
|
+
} else if (encryptionVersion === EncryptionVersions.UNENCRYPTED) {
|
|
169
|
+
} else {
|
|
170
|
+
Logger("Unknown encryption version. Cannot decrypt.", LOG_LEVEL_NOTICE);
|
|
171
|
+
throw new Error("Unknown encryption version. Cannot decrypt.");
|
|
172
|
+
}
|
|
173
|
+
} catch (ex) {
|
|
174
|
+
Logger(DECRYPTION_HKDF_FAILED, LOG_LEVEL_NOTICE);
|
|
175
|
+
Logger(ex);
|
|
176
|
+
throw ex;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
if (isObfuscatedEntry(loadDoc)) {
|
|
180
|
+
const path = getPath(loadDoc);
|
|
181
|
+
if (isEncryptedMeta(loadDoc)) {
|
|
182
|
+
const pbkdf2salt = await getPBKDF2Salt();
|
|
183
|
+
try {
|
|
184
|
+
const metadata = await decryptMetaWithHKDF(path, passphrase, pbkdf2salt);
|
|
185
|
+
for (const key of Object.keys(metadata)) {
|
|
186
|
+
loadDoc[key] = metadata[key];
|
|
187
|
+
}
|
|
188
|
+
} catch (ex) {
|
|
189
|
+
Logger(`${DECRYPTION_HKDF_FAILED} on Path`, LOG_LEVEL_NOTICE);
|
|
190
|
+
Logger(ex);
|
|
191
|
+
throw ex;
|
|
192
|
+
}
|
|
193
|
+
} else if (isPathProbablyObfuscated(path)) {
|
|
194
|
+
const decryptedPath = await tryDecryptV1AsFallback(path, passphrase, useDynamicIterationCount);
|
|
195
|
+
if (decryptedPath === false) {
|
|
196
|
+
Logger(`${MESSAGE_FALLBACK_DECRYPT_FAILED} on Path`, LOG_LEVEL_NOTICE);
|
|
197
|
+
throw new Error(MESSAGE_FALLBACK_DECRYPT_FAILED);
|
|
198
|
+
}
|
|
199
|
+
loadDoc.path = decryptedPath;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
let readEden = {};
|
|
203
|
+
let edenDecrypted = false;
|
|
204
|
+
if (shouldDecryptEden(loadDoc)) {
|
|
205
|
+
try {
|
|
206
|
+
const decryptedEden = await tryDecryptV1AsFallback(
|
|
207
|
+
loadDoc.eden[EDEN_ENCRYPTED_KEY].data,
|
|
208
|
+
passphrase,
|
|
209
|
+
useDynamicIterationCount
|
|
210
|
+
);
|
|
211
|
+
if (decryptedEden === false) throw new Error(MESSAGE_FALLBACK_DECRYPT_FAILED);
|
|
212
|
+
readEden = {
|
|
213
|
+
...readEden,
|
|
214
|
+
...JSON.parse(decryptedEden)
|
|
215
|
+
};
|
|
216
|
+
edenDecrypted = true;
|
|
217
|
+
} catch (ex) {
|
|
218
|
+
Logger(`${DECRYPTION_FALLBACK_FAILED} on Eden`, LOG_LEVEL_NOTICE);
|
|
219
|
+
Logger(ex);
|
|
220
|
+
throw ex;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
if (shouldDecryptEdenHKDF(loadDoc)) {
|
|
224
|
+
const pbkdf2salt = await getPBKDF2Salt();
|
|
225
|
+
try {
|
|
226
|
+
const decryptedEdenData = await decryptHKDF(
|
|
227
|
+
loadDoc.eden[EDEN_ENCRYPTED_KEY_HKDF].data,
|
|
228
|
+
passphrase,
|
|
229
|
+
pbkdf2salt
|
|
230
|
+
);
|
|
231
|
+
readEden = {
|
|
232
|
+
...readEden,
|
|
233
|
+
...JSON.parse(decryptedEdenData)
|
|
234
|
+
};
|
|
235
|
+
edenDecrypted = true;
|
|
236
|
+
} catch (ex) {
|
|
237
|
+
Logger(`${DECRYPTION_HKDF_FAILED} on Eden`, LOG_LEVEL_NOTICE);
|
|
238
|
+
Logger(ex);
|
|
239
|
+
throw ex;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
if (edenDecrypted) {
|
|
243
|
+
loadDoc.eden = readEden;
|
|
244
|
+
} else {
|
|
245
|
+
}
|
|
246
|
+
return loadDoc;
|
|
247
|
+
}
|
|
248
|
+
async function incomingEncryptV1(doc, passphrase, useDynamicIterationCount) {
|
|
249
|
+
const saveDoc = {
|
|
250
|
+
...doc
|
|
251
|
+
};
|
|
252
|
+
if (isEncryptedChunkEntry(saveDoc) || isSyncInfoEntry(saveDoc)) {
|
|
253
|
+
try {
|
|
254
|
+
if (!("e_" in saveDoc)) {
|
|
255
|
+
saveDoc.data = await encrypt(saveDoc.data, passphrase, useDynamicIterationCount);
|
|
256
|
+
saveDoc.e_ = true;
|
|
257
|
+
}
|
|
258
|
+
} catch (ex) {
|
|
259
|
+
Logger("Encryption failed.", LOG_LEVEL_NOTICE);
|
|
260
|
+
Logger(ex);
|
|
261
|
+
throw ex;
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
if (shouldEncryptEden(saveDoc)) {
|
|
265
|
+
saveDoc.eden = {
|
|
266
|
+
[EDEN_ENCRYPTED_KEY]: {
|
|
267
|
+
data: await encrypt(JSON.stringify(saveDoc.eden), passphrase, useDynamicIterationCount),
|
|
268
|
+
epoch: 999999
|
|
269
|
+
}
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
if (isObfuscatedEntry(saveDoc)) {
|
|
273
|
+
try {
|
|
274
|
+
const path = getPath(saveDoc);
|
|
275
|
+
if (!isPathProbablyObfuscated(path)) {
|
|
276
|
+
saveDoc.path = await obfuscatePath(
|
|
277
|
+
path,
|
|
278
|
+
passphrase,
|
|
279
|
+
useDynamicIterationCount
|
|
280
|
+
);
|
|
281
|
+
}
|
|
282
|
+
} catch (ex) {
|
|
283
|
+
Logger("Encryption failed.", LOG_LEVEL_NOTICE);
|
|
284
|
+
Logger(ex);
|
|
285
|
+
throw ex;
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
return saveDoc;
|
|
289
|
+
}
|
|
290
|
+
async function outgoingDecryptV1(doc, migrationDecrypt, decrypted, passphrase, useDynamicIterationCount) {
|
|
291
|
+
const loadDoc = {
|
|
292
|
+
...doc
|
|
293
|
+
};
|
|
294
|
+
const _isChunkOrSyncInfo = isEncryptedChunkEntry(loadDoc) || isSyncInfoEntry(loadDoc);
|
|
295
|
+
const _isObfuscatedEntry = isObfuscatedEntry(loadDoc);
|
|
296
|
+
const _shouldDecryptEden = shouldDecryptEden(loadDoc);
|
|
297
|
+
if (_isChunkOrSyncInfo || _isObfuscatedEntry || _shouldDecryptEden) {
|
|
298
|
+
if (migrationDecrypt && decrypted.has(loadDoc._id)) {
|
|
299
|
+
return loadDoc;
|
|
300
|
+
}
|
|
301
|
+
try {
|
|
302
|
+
if (_isChunkOrSyncInfo) {
|
|
303
|
+
loadDoc.data = await decrypt(loadDoc.data, passphrase, useDynamicIterationCount);
|
|
304
|
+
delete loadDoc.e_;
|
|
305
|
+
} else if ("e_" in loadDoc) {
|
|
306
|
+
loadDoc.data = await decrypt(
|
|
307
|
+
loadDoc.data,
|
|
308
|
+
passphrase,
|
|
309
|
+
useDynamicIterationCount
|
|
310
|
+
);
|
|
311
|
+
delete loadDoc.e_;
|
|
312
|
+
}
|
|
313
|
+
if (_isObfuscatedEntry) {
|
|
314
|
+
const path = getPath(loadDoc);
|
|
315
|
+
if (isPathProbablyObfuscated(path)) {
|
|
316
|
+
loadDoc.path = await decrypt(
|
|
317
|
+
path,
|
|
318
|
+
passphrase,
|
|
319
|
+
useDynamicIterationCount
|
|
320
|
+
);
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
if (_shouldDecryptEden) {
|
|
324
|
+
loadDoc.eden = JSON.parse(
|
|
325
|
+
await decrypt(loadDoc.eden[EDEN_ENCRYPTED_KEY].data, passphrase, useDynamicIterationCount)
|
|
326
|
+
);
|
|
327
|
+
}
|
|
328
|
+
if (migrationDecrypt) {
|
|
329
|
+
decrypted.set(loadDoc._id, true);
|
|
330
|
+
}
|
|
331
|
+
} catch (ex) {
|
|
332
|
+
if (useDynamicIterationCount) {
|
|
333
|
+
try {
|
|
334
|
+
if (_isChunkOrSyncInfo) {
|
|
335
|
+
loadDoc.data = await decrypt(loadDoc.data, passphrase, false);
|
|
336
|
+
}
|
|
337
|
+
if (_isObfuscatedEntry) {
|
|
338
|
+
const path = getPath(loadDoc);
|
|
339
|
+
if (isPathProbablyObfuscated(path)) {
|
|
340
|
+
loadDoc.path = await decrypt(path, passphrase, false);
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
if (_shouldDecryptEden) {
|
|
344
|
+
loadDoc.eden = JSON.parse(
|
|
345
|
+
await decrypt(loadDoc.eden[EDEN_ENCRYPTED_KEY].data, passphrase, false)
|
|
346
|
+
);
|
|
347
|
+
}
|
|
348
|
+
if (migrationDecrypt) {
|
|
349
|
+
decrypted.set(loadDoc._id, true);
|
|
350
|
+
}
|
|
351
|
+
} catch (ex2) {
|
|
352
|
+
if (migrationDecrypt && ex2 instanceof SyntaxError) {
|
|
353
|
+
return loadDoc;
|
|
354
|
+
}
|
|
355
|
+
Logger("Decryption failed.", LOG_LEVEL_NOTICE);
|
|
356
|
+
Logger(ex2, LOG_LEVEL_VERBOSE);
|
|
357
|
+
Logger(`id:${loadDoc._id}-${loadDoc._rev?.substring(0, 10)}`, LOG_LEVEL_VERBOSE);
|
|
358
|
+
throw ex2;
|
|
359
|
+
}
|
|
360
|
+
} else {
|
|
361
|
+
Logger("Decryption failed.", LOG_LEVEL_NOTICE);
|
|
362
|
+
Logger(ex, LOG_LEVEL_VERBOSE);
|
|
363
|
+
Logger(`id:${loadDoc._id}-${loadDoc._rev?.substring(0, 10)}`, LOG_LEVEL_VERBOSE);
|
|
364
|
+
throw ex;
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
return loadDoc;
|
|
369
|
+
}
|
|
370
|
+
let preprocessOutgoing = async (doc) => {
|
|
371
|
+
return await Promise.resolve(doc);
|
|
372
|
+
};
|
|
373
|
+
let preprocessIncoming = async (doc) => {
|
|
374
|
+
return await Promise.resolve(doc);
|
|
375
|
+
};
|
|
376
|
+
function getConfiguredFunctionsForEncryption(passphrase, useDynamicIterationCount, migrationDecrypt, getPBKDF2Salt, algorithm) {
|
|
377
|
+
const decryptedCache = /* @__PURE__ */ new Map();
|
|
378
|
+
const incoming = (doc) => algorithm === E2EEAlgorithms.V2 ? incomingEncryptHKDF(doc, passphrase, useDynamicIterationCount, getPBKDF2Salt) : incomingEncryptV1(doc, passphrase, useDynamicIterationCount);
|
|
379
|
+
const outgoing = (doc) => algorithm !== E2EEAlgorithms.ForceV1 ? outgoingDecryptHKDF(
|
|
380
|
+
doc,
|
|
381
|
+
migrationDecrypt,
|
|
382
|
+
decryptedCache,
|
|
383
|
+
passphrase,
|
|
384
|
+
useDynamicIterationCount,
|
|
385
|
+
getPBKDF2Salt
|
|
386
|
+
) : outgoingDecryptV1(doc, migrationDecrypt, decryptedCache, passphrase, useDynamicIterationCount);
|
|
387
|
+
return {
|
|
388
|
+
incoming,
|
|
389
|
+
outgoing
|
|
390
|
+
};
|
|
391
|
+
}
|
|
392
|
+
const enableEncryption = (db, passphrase, useDynamicIterationCount, migrationDecrypt, getPBKDF2Salt, algorithm) => {
|
|
393
|
+
const { incoming, outgoing } = getConfiguredFunctionsForEncryption(
|
|
394
|
+
passphrase,
|
|
395
|
+
useDynamicIterationCount,
|
|
396
|
+
migrationDecrypt,
|
|
397
|
+
getPBKDF2Salt,
|
|
398
|
+
algorithm
|
|
399
|
+
);
|
|
400
|
+
db.transform({
|
|
401
|
+
incoming,
|
|
402
|
+
outgoing
|
|
403
|
+
});
|
|
404
|
+
};
|
|
405
|
+
function disableEncryption() {
|
|
406
|
+
preprocessOutgoing = async (doc) => {
|
|
407
|
+
return await Promise.resolve(doc);
|
|
408
|
+
};
|
|
409
|
+
preprocessIncoming = async (doc) => {
|
|
410
|
+
return await Promise.resolve(doc);
|
|
411
|
+
};
|
|
412
|
+
}
|
|
413
|
+
const EDEN_ENCRYPTED_KEY = "h:++encrypted";
|
|
414
|
+
const EDEN_ENCRYPTED_KEY_HKDF = "h:++encrypted-hkdf";
|
|
415
|
+
function shouldEncryptEden(doc) {
|
|
416
|
+
if ("eden" in doc && !(EDEN_ENCRYPTED_KEY in doc.eden)) {
|
|
417
|
+
return true;
|
|
418
|
+
}
|
|
419
|
+
return false;
|
|
420
|
+
}
|
|
421
|
+
function shouldEncryptEdenHKDF(doc) {
|
|
422
|
+
if ("eden" in doc && !(EDEN_ENCRYPTED_KEY_HKDF in doc.eden)) {
|
|
423
|
+
if (Object.keys(doc.eden).length === 0) {
|
|
424
|
+
return false;
|
|
425
|
+
}
|
|
426
|
+
return true;
|
|
427
|
+
}
|
|
428
|
+
return false;
|
|
429
|
+
}
|
|
430
|
+
function shouldDecryptEden(doc) {
|
|
431
|
+
if ("eden" in doc && EDEN_ENCRYPTED_KEY in doc.eden) {
|
|
432
|
+
return true;
|
|
433
|
+
}
|
|
434
|
+
return false;
|
|
435
|
+
}
|
|
436
|
+
function shouldDecryptEdenHKDF(doc) {
|
|
437
|
+
if ("eden" in doc && EDEN_ENCRYPTED_KEY_HKDF in doc.eden) {
|
|
438
|
+
return true;
|
|
439
|
+
}
|
|
440
|
+
return false;
|
|
441
|
+
}
|
|
442
|
+
export {
|
|
443
|
+
EDEN_ENCRYPTED_KEY,
|
|
444
|
+
EDEN_ENCRYPTED_KEY_HKDF,
|
|
445
|
+
decrypt,
|
|
446
|
+
decryptHKDF,
|
|
447
|
+
disableEncryption,
|
|
448
|
+
enableEncryption,
|
|
449
|
+
encrypt,
|
|
450
|
+
encryptHKDF,
|
|
451
|
+
getConfiguredFunctionsForEncryption,
|
|
452
|
+
preprocessIncoming,
|
|
453
|
+
preprocessOutgoing,
|
|
454
|
+
shouldDecryptEden,
|
|
455
|
+
shouldDecryptEdenHKDF,
|
|
456
|
+
shouldEncryptEden,
|
|
457
|
+
shouldEncryptEdenHKDF
|
|
458
|
+
};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare const checkRemoteVersion: (db: PouchDB.Database, migrate: (from: number, to: number) => Promise<boolean>, barrier?: number) => Promise<boolean>;
|
|
2
|
+
export declare const bumpRemoteVersion: (db: PouchDB.Database, barrier?: number) => Promise<boolean>;
|
|
3
|
+
export declare const checkSyncInfo: (db: PouchDB.Database) => Promise<boolean>;
|
|
4
|
+
/**
|
|
5
|
+
* Counts the number of remote (potentially) compromised chunks in the database.
|
|
6
|
+
* @param db The PouchDB database instance.
|
|
7
|
+
* @returns The number of compromised chunks or false if an error occurs.
|
|
8
|
+
*/
|
|
9
|
+
export declare function countCompromisedChunks(db: PouchDB.Database): Promise<number | false>;
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { LOG_LEVEL_INFO, Logger } from "../common/logger.js";
|
|
2
|
+
import {
|
|
3
|
+
LOG_LEVEL_VERBOSE,
|
|
4
|
+
SYNCINFO_ID,
|
|
5
|
+
VER,
|
|
6
|
+
VERSIONING_DOCID
|
|
7
|
+
} from "../common/types.js";
|
|
8
|
+
import { resolveWithIgnoreKnownError } from "../common/utils.js";
|
|
9
|
+
import { isErrorOfMissingDoc } from "./utils_couchdb.js";
|
|
10
|
+
const checkRemoteVersion = async (db, migrate, barrier = VER) => {
|
|
11
|
+
try {
|
|
12
|
+
const versionInfo = await db.get(VERSIONING_DOCID);
|
|
13
|
+
if (versionInfo.type != "versioninfo") {
|
|
14
|
+
return false;
|
|
15
|
+
}
|
|
16
|
+
const version = versionInfo.version;
|
|
17
|
+
if (version < barrier) {
|
|
18
|
+
const versionUpResult = await migrate(version, barrier);
|
|
19
|
+
if (versionUpResult) {
|
|
20
|
+
await bumpRemoteVersion(db);
|
|
21
|
+
return true;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
if (version == barrier) return true;
|
|
25
|
+
return false;
|
|
26
|
+
} catch (ex) {
|
|
27
|
+
if (isErrorOfMissingDoc(ex)) {
|
|
28
|
+
if (await bumpRemoteVersion(db)) {
|
|
29
|
+
return true;
|
|
30
|
+
}
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
throw ex;
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
const bumpRemoteVersion = async (db, barrier = VER) => {
|
|
37
|
+
const vi = {
|
|
38
|
+
_id: VERSIONING_DOCID,
|
|
39
|
+
version: barrier,
|
|
40
|
+
type: "versioninfo"
|
|
41
|
+
// pbkdf2salt: "", // this will be set later.
|
|
42
|
+
};
|
|
43
|
+
const versionInfo = await resolveWithIgnoreKnownError(db.get(VERSIONING_DOCID), vi);
|
|
44
|
+
if (versionInfo.type != "versioninfo") {
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
vi._rev = versionInfo._rev;
|
|
48
|
+
await db.put(vi);
|
|
49
|
+
return true;
|
|
50
|
+
};
|
|
51
|
+
const checkSyncInfo = async (db) => {
|
|
52
|
+
try {
|
|
53
|
+
const syncinfo = await db.get(SYNCINFO_ID);
|
|
54
|
+
console.log(syncinfo);
|
|
55
|
+
return true;
|
|
56
|
+
} catch (ex) {
|
|
57
|
+
if (isErrorOfMissingDoc(ex)) {
|
|
58
|
+
const randomStrSrc = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
|
|
59
|
+
const temp = [...Array(30)].map((_e) => Math.floor(Math.random() * randomStrSrc.length)).map((e) => randomStrSrc[e]).join("");
|
|
60
|
+
const newSyncInfo = {
|
|
61
|
+
_id: SYNCINFO_ID,
|
|
62
|
+
type: "syncinfo",
|
|
63
|
+
data: temp
|
|
64
|
+
};
|
|
65
|
+
if (await db.put(newSyncInfo)) {
|
|
66
|
+
return true;
|
|
67
|
+
}
|
|
68
|
+
return false;
|
|
69
|
+
} else {
|
|
70
|
+
console.dir(ex);
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
const SELECTOR_COMPROMISED_CHUNK_1 = {
|
|
76
|
+
selector: {
|
|
77
|
+
_id: {
|
|
78
|
+
$lt: "h:"
|
|
79
|
+
},
|
|
80
|
+
type: "leaf"
|
|
81
|
+
}
|
|
82
|
+
};
|
|
83
|
+
const SELECTOR_COMPROMISED_CHUNK_2 = {
|
|
84
|
+
selector: {
|
|
85
|
+
_id: {
|
|
86
|
+
$gt: "h;"
|
|
87
|
+
},
|
|
88
|
+
type: "leaf"
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
async function countCompromisedChunks(db) {
|
|
92
|
+
try {
|
|
93
|
+
Logger(`Counting compromised chunks...`, LOG_LEVEL_VERBOSE);
|
|
94
|
+
const task1 = db.find(SELECTOR_COMPROMISED_CHUNK_1);
|
|
95
|
+
const task2 = db.find(SELECTOR_COMPROMISED_CHUNK_2);
|
|
96
|
+
const [result1, result2] = await Promise.all([task1, task2]);
|
|
97
|
+
return result1.docs.length + result2.docs.length;
|
|
98
|
+
} catch (ex) {
|
|
99
|
+
Logger(`Error counting compromised chunks!`, LOG_LEVEL_INFO);
|
|
100
|
+
Logger(ex, LOG_LEVEL_VERBOSE);
|
|
101
|
+
return false;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
export {
|
|
105
|
+
bumpRemoteVersion,
|
|
106
|
+
checkRemoteVersion,
|
|
107
|
+
checkSyncInfo,
|
|
108
|
+
countCompromisedChunks
|
|
109
|
+
};
|