@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.
Files changed (516) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +49 -0
  3. package/dist/API/DirectFileManipulator.d.ts +2 -0
  4. package/dist/API/DirectFileManipulator.js +4 -0
  5. package/dist/API/DirectFileManipulatorV2.d.ts +150 -0
  6. package/dist/API/DirectFileManipulatorV2.js +424 -0
  7. package/dist/API/processSetting.d.ts +41 -0
  8. package/dist/API/processSetting.js +140 -0
  9. package/dist/ContentSplitter/ContentSplitter.d.ts +28 -0
  10. package/dist/ContentSplitter/ContentSplitter.js +5 -0
  11. package/dist/ContentSplitter/ContentSplitterBase.d.ts +51 -0
  12. package/dist/ContentSplitter/ContentSplitterBase.js +83 -0
  13. package/dist/ContentSplitter/ContentSplitterRabinKarp.d.ts +9 -0
  14. package/dist/ContentSplitter/ContentSplitterRabinKarp.js +32 -0
  15. package/dist/ContentSplitter/ContentSplitterV1.d.ts +9 -0
  16. package/dist/ContentSplitter/ContentSplitterV1.js +34 -0
  17. package/dist/ContentSplitter/ContentSplitterV2.d.ts +9 -0
  18. package/dist/ContentSplitter/ContentSplitterV2.js +34 -0
  19. package/dist/ContentSplitter/ContentSplitters.d.ts +12 -0
  20. package/dist/ContentSplitter/ContentSplitters.js +29 -0
  21. package/dist/bureau/bureau.d.ts +7 -0
  22. package/dist/bureau/bureau.js +5 -0
  23. package/dist/common/ConnectionString.d.ts +30 -0
  24. package/dist/common/ConnectionString.js +179 -0
  25. package/dist/common/LSError.d.ts +48 -0
  26. package/dist/common/LSError.js +112 -0
  27. package/dist/common/configForDoc.d.ts +79 -0
  28. package/dist/common/configForDoc.js +312 -0
  29. package/dist/common/coreEnvFunctions.d.ts +21 -0
  30. package/dist/common/coreEnvFunctions.js +22 -0
  31. package/dist/common/coreEnvVars.d.ts +3 -0
  32. package/dist/common/coreEnvVars.js +6 -0
  33. package/dist/common/i18n.d.ts +18 -0
  34. package/dist/common/i18n.js +7193 -0
  35. package/dist/common/logger.d.ts +2 -0
  36. package/dist/common/logger.js +1 -0
  37. package/dist/common/messages/combinedMessages.dev.d.ts +7 -0
  38. package/dist/common/messages/combinedMessages.dev.js +44 -0
  39. package/dist/common/messages/combinedMessages.prod.d.ts +9264 -0
  40. package/dist/common/messages/combinedMessages.prod.js +9271 -0
  41. package/dist/common/messages/de.d.ts +297 -0
  42. package/dist/common/messages/de.js +7 -0
  43. package/dist/common/messages/def.d.ts +1119 -0
  44. package/dist/common/messages/def.js +7 -0
  45. package/dist/common/messages/es.d.ts +689 -0
  46. package/dist/common/messages/es.js +7 -0
  47. package/dist/common/messages/fr.d.ts +582 -0
  48. package/dist/common/messages/fr.js +7 -0
  49. package/dist/common/messages/he.d.ts +583 -0
  50. package/dist/common/messages/he.js +7 -0
  51. package/dist/common/messages/ja.d.ts +838 -0
  52. package/dist/common/messages/ja.js +7 -0
  53. package/dist/common/messages/ko.d.ts +800 -0
  54. package/dist/common/messages/ko.js +7 -0
  55. package/dist/common/messages/ru.d.ts +858 -0
  56. package/dist/common/messages/ru.js +7 -0
  57. package/dist/common/messages/zh-tw.d.ts +384 -0
  58. package/dist/common/messages/zh-tw.js +7 -0
  59. package/dist/common/messages/zh.d.ts +1093 -0
  60. package/dist/common/messages/zh.js +7 -0
  61. package/dist/common/messagesJson/de.json +295 -0
  62. package/dist/common/messagesJson/en.json +1117 -0
  63. package/dist/common/messagesJson/es.json +687 -0
  64. package/dist/common/messagesJson/fr.json +580 -0
  65. package/dist/common/messagesJson/he.json +581 -0
  66. package/dist/common/messagesJson/ja.json +836 -0
  67. package/dist/common/messagesJson/ko.json +798 -0
  68. package/dist/common/messagesJson/ru.json +856 -0
  69. package/dist/common/messagesJson/zh-tw.json +382 -0
  70. package/dist/common/messagesJson/zh.json +1091 -0
  71. package/dist/common/models/auth.type.d.ts +41 -0
  72. package/dist/common/models/auth.type.js +0 -0
  73. package/dist/common/models/db.const.d.ts +20 -0
  74. package/dist/common/models/db.const.js +28 -0
  75. package/dist/common/models/db.definition.d.ts +56 -0
  76. package/dist/common/models/db.definition.js +6 -0
  77. package/dist/common/models/db.type.d.ts +142 -0
  78. package/dist/common/models/db.type.js +0 -0
  79. package/dist/common/models/diff.definition.d.ts +16 -0
  80. package/dist/common/models/diff.definition.js +0 -0
  81. package/dist/common/models/fileaccess.const.d.ts +7 -0
  82. package/dist/common/models/fileaccess.const.js +16 -0
  83. package/dist/common/models/fileaccess.type.d.ts +72 -0
  84. package/dist/common/models/fileaccess.type.js +0 -0
  85. package/dist/common/models/redflag.const.d.ts +32 -0
  86. package/dist/common/models/redflag.const.js +27 -0
  87. package/dist/common/models/setting.const.d.ts +49 -0
  88. package/dist/common/models/setting.const.defaults.d.ts +3 -0
  89. package/dist/common/models/setting.const.defaults.js +185 -0
  90. package/dist/common/models/setting.const.js +68 -0
  91. package/dist/common/models/setting.const.preferred.d.ts +5 -0
  92. package/dist/common/models/setting.const.preferred.js +35 -0
  93. package/dist/common/models/setting.const.qr.d.ts +2 -0
  94. package/dist/common/models/setting.const.qr.js +174 -0
  95. package/dist/common/models/setting.type.d.ts +900 -0
  96. package/dist/common/models/setting.type.js +8 -0
  97. package/dist/common/models/shared.const.behabiour.d.ts +28 -0
  98. package/dist/common/models/shared.const.behabiour.js +36 -0
  99. package/dist/common/models/shared.const.d.ts +5 -0
  100. package/dist/common/models/shared.const.js +12 -0
  101. package/dist/common/models/shared.const.symbols.d.ts +9 -0
  102. package/dist/common/models/shared.const.symbols.js +20 -0
  103. package/dist/common/models/shared.definition.configNames.d.ts +36 -0
  104. package/dist/common/models/shared.definition.configNames.js +203 -0
  105. package/dist/common/models/shared.definition.d.ts +22 -0
  106. package/dist/common/models/shared.definition.js +24 -0
  107. package/dist/common/models/shared.type.util.d.ts +8 -0
  108. package/dist/common/models/shared.type.util.js +0 -0
  109. package/dist/common/models/sync.definition.d.ts +18 -0
  110. package/dist/common/models/sync.definition.js +20 -0
  111. package/dist/common/models/tweak.definition.d.ts +191 -0
  112. package/dist/common/models/tweak.definition.js +77 -0
  113. package/dist/common/rosetta.d.ts +42 -0
  114. package/dist/common/rosetta.js +57 -0
  115. package/dist/common/settingConstants.d.ts +216 -0
  116. package/dist/common/settingConstants.js +434 -0
  117. package/dist/common/typeUtils.d.ts +17 -0
  118. package/dist/common/typeUtils.js +51 -0
  119. package/dist/common/types.d.ts +107 -0
  120. package/dist/common/types.js +212 -0
  121. package/dist/common/utils.d.ts +129 -0
  122. package/dist/common/utils.doc.d.ts +11 -0
  123. package/dist/common/utils.doc.js +35 -0
  124. package/dist/common/utils.js +583 -0
  125. package/dist/common/utils.object.d.ts +2 -0
  126. package/dist/common/utils.object.js +14 -0
  127. package/dist/common/utils.patch.d.ts +8 -0
  128. package/dist/common/utils.patch.js +178 -0
  129. package/dist/common/utils.type.d.ts +1 -0
  130. package/dist/common/utils.type.js +0 -0
  131. package/dist/context.d.ts +8 -0
  132. package/dist/context.js +14 -0
  133. package/dist/databases/IndexedDBKeyValueDatabase.d.ts +26 -0
  134. package/dist/databases/IndexedDBKeyValueDatabase.js +130 -0
  135. package/dist/dataobject/StoredMap.d.ts +12 -0
  136. package/dist/dataobject/StoredMap.js +47 -0
  137. package/dist/dev/checks.d.ts +5 -0
  138. package/dist/dev/checks.js +38 -0
  139. package/dist/encryption/encryptHKDF.d.ts +3 -0
  140. package/dist/encryption/encryptHKDF.js +7 -0
  141. package/dist/encryption/stringEncryption.d.ts +27 -0
  142. package/dist/encryption/stringEncryption.js +59 -0
  143. package/dist/events/coreEvents.d.ts +54 -0
  144. package/dist/events/coreEvents.js +46 -0
  145. package/dist/hub/hub.d.ts +11 -0
  146. package/dist/hub/hub.js +7 -0
  147. package/dist/index.d.ts +1 -0
  148. package/dist/index.js +4 -0
  149. package/dist/interfaces/AsyncActivityRunner.d.ts +18 -0
  150. package/dist/interfaces/AsyncActivityRunner.js +7 -0
  151. package/dist/interfaces/Confirm.d.ts +17 -0
  152. package/dist/interfaces/Confirm.js +0 -0
  153. package/dist/interfaces/DatabaseFileAccess.d.ts +14 -0
  154. package/dist/interfaces/DatabaseFileAccess.js +0 -0
  155. package/dist/interfaces/DatabaseRebuilder.d.ts +13 -0
  156. package/dist/interfaces/DatabaseRebuilder.js +0 -0
  157. package/dist/interfaces/FileHandler.d.ts +13 -0
  158. package/dist/interfaces/FileHandler.js +0 -0
  159. package/dist/interfaces/KeyValueDatabase.d.ts +11 -0
  160. package/dist/interfaces/KeyValueDatabase.js +0 -0
  161. package/dist/interfaces/ServiceModule.d.ts +59 -0
  162. package/dist/interfaces/ServiceModule.js +19 -0
  163. package/dist/interfaces/StorageAccess.d.ts +44 -0
  164. package/dist/interfaces/StorageAccess.js +0 -0
  165. package/dist/interfaces/StorageEventManager.d.ts +16 -0
  166. package/dist/interfaces/StorageEventManager.js +5 -0
  167. package/dist/managers/ChangeManager.d.ts +61 -0
  168. package/dist/managers/ChangeManager.js +104 -0
  169. package/dist/managers/ChunkDeliveryCoordinator.d.ts +51 -0
  170. package/dist/managers/ChunkDeliveryCoordinator.js +136 -0
  171. package/dist/managers/ChunkFetcher.d.ts +44 -0
  172. package/dist/managers/ChunkFetcher.js +251 -0
  173. package/dist/managers/ChunkManager.d.ts +2 -0
  174. package/dist/managers/ChunkManager.js +4 -0
  175. package/dist/managers/ConflictManager.d.ts +37 -0
  176. package/dist/managers/ConflictManager.js +322 -0
  177. package/dist/managers/EntryManager/EntryManager.d.ts +37 -0
  178. package/dist/managers/EntryManager/EntryManager.js +73 -0
  179. package/dist/managers/EntryManager/EntryManagerImpls.d.ts +74 -0
  180. package/dist/managers/EntryManager/EntryManagerImpls.js +499 -0
  181. package/dist/managers/HashManager/HashManager.d.ts +60 -0
  182. package/dist/managers/HashManager/HashManager.js +97 -0
  183. package/dist/managers/HashManager/HashManagerCore.d.ts +114 -0
  184. package/dist/managers/HashManager/HashManagerCore.js +99 -0
  185. package/dist/managers/HashManager/PureJSHashManager.d.ts +77 -0
  186. package/dist/managers/HashManager/PureJSHashManager.js +84 -0
  187. package/dist/managers/HashManager/XXHashHashManager.d.ts +96 -0
  188. package/dist/managers/HashManager/XXHashHashManager.js +111 -0
  189. package/dist/managers/LayeredChunkManager/ArrivalWaitLayer.d.ts +30 -0
  190. package/dist/managers/LayeredChunkManager/ArrivalWaitLayer.js +115 -0
  191. package/dist/managers/LayeredChunkManager/CacheLayer.d.ts +59 -0
  192. package/dist/managers/LayeredChunkManager/CacheLayer.js +161 -0
  193. package/dist/managers/LayeredChunkManager/ChunkLayerInterfaces.d.ts +37 -0
  194. package/dist/managers/LayeredChunkManager/ChunkLayerInterfaces.js +0 -0
  195. package/dist/managers/LayeredChunkManager/DatabaseReadLayer.d.ts +14 -0
  196. package/dist/managers/LayeredChunkManager/DatabaseReadLayer.js +78 -0
  197. package/dist/managers/LayeredChunkManager/DatabaseWriteLayer.d.ts +11 -0
  198. package/dist/managers/LayeredChunkManager/DatabaseWriteLayer.js +43 -0
  199. package/dist/managers/LayeredChunkManager/HotPackLayer.d.ts +9 -0
  200. package/dist/managers/LayeredChunkManager/HotPackLayer.js +8 -0
  201. package/dist/managers/LayeredChunkManager/types.d.ts +39 -0
  202. package/dist/managers/LayeredChunkManager/types.js +0 -0
  203. package/dist/managers/LayeredChunkManager.d.ts +53 -0
  204. package/dist/managers/LayeredChunkManager.js +240 -0
  205. package/dist/managers/LiveSyncManagers.d.ts +48 -0
  206. package/dist/managers/LiveSyncManagers.js +136 -0
  207. package/dist/managers/StorageEventManager.d.ts +135 -0
  208. package/dist/managers/StorageEventManager.js +564 -0
  209. package/dist/managers/StorageProcessingManager.d.ts +14 -0
  210. package/dist/managers/StorageProcessingManager.js +48 -0
  211. package/dist/managers/adapters/IStorageEventConverterAdapter.d.ts +16 -0
  212. package/dist/managers/adapters/IStorageEventConverterAdapter.js +0 -0
  213. package/dist/managers/adapters/IStorageEventManagerAdapter.d.ts +18 -0
  214. package/dist/managers/adapters/IStorageEventManagerAdapter.js +0 -0
  215. package/dist/managers/adapters/IStorageEventPersistenceAdapter.d.ts +15 -0
  216. package/dist/managers/adapters/IStorageEventPersistenceAdapter.js +0 -0
  217. package/dist/managers/adapters/IStorageEventStatusAdapter.d.ts +13 -0
  218. package/dist/managers/adapters/IStorageEventStatusAdapter.js +0 -0
  219. package/dist/managers/adapters/IStorageEventTypeGuardAdapter.d.ts +16 -0
  220. package/dist/managers/adapters/IStorageEventTypeGuardAdapter.js +0 -0
  221. package/dist/managers/adapters/IStorageEventWatchAdapter.d.ts +21 -0
  222. package/dist/managers/adapters/IStorageEventWatchAdapter.js +0 -0
  223. package/dist/managers/adapters/index.d.ts +6 -0
  224. package/dist/managers/adapters/index.js +0 -0
  225. package/dist/mock_and_interop/stores.d.ts +21 -0
  226. package/dist/mock_and_interop/stores.js +15 -0
  227. package/dist/mock_and_interop/wrapper.d.ts +7 -0
  228. package/dist/mock_and_interop/wrapper.js +37 -0
  229. package/dist/mods.d.ts +1 -0
  230. package/dist/mods.js +18 -0
  231. package/dist/platform/browser/index.d.ts +1 -0
  232. package/dist/platform/browser/index.js +10 -0
  233. package/dist/platform/browser/storage.d.ts +35 -0
  234. package/dist/platform/browser/storage.js +139 -0
  235. package/dist/platform/node/index.d.ts +23 -0
  236. package/dist/platform/node/index.js +33 -0
  237. package/dist/platform/node/storage.d.ts +31 -0
  238. package/dist/platform/node/storage.js +104 -0
  239. package/dist/platform/storagePath.d.ts +7 -0
  240. package/dist/platform/storagePath.js +20 -0
  241. package/dist/pouchdb/LiveSyncDBFunctions.d.ts +14 -0
  242. package/dist/pouchdb/LiveSyncDBFunctions.js +129 -0
  243. package/dist/pouchdb/LiveSyncLocalDB.d.ts +196 -0
  244. package/dist/pouchdb/LiveSyncLocalDB.js +381 -0
  245. package/dist/pouchdb/PouchDBConstructor.d.ts +3 -0
  246. package/dist/pouchdb/PouchDBConstructor.js +0 -0
  247. package/dist/pouchdb/ReplicatorShim.d.ts +51 -0
  248. package/dist/pouchdb/ReplicatorShim.js +109 -0
  249. package/dist/pouchdb/StreamingFetch.d.ts +19 -0
  250. package/dist/pouchdb/StreamingFetch.js +263 -0
  251. package/dist/pouchdb/chunks.d.ts +38 -0
  252. package/dist/pouchdb/chunks.js +314 -0
  253. package/dist/pouchdb/compress.d.ts +11 -0
  254. package/dist/pouchdb/compress.js +99 -0
  255. package/dist/pouchdb/encryption.d.ts +20 -0
  256. package/dist/pouchdb/encryption.js +458 -0
  257. package/dist/pouchdb/negotiation.d.ts +9 -0
  258. package/dist/pouchdb/negotiation.js +109 -0
  259. package/dist/pouchdb/pouchdb-browser.d.ts +2 -0
  260. package/dist/pouchdb/pouchdb-browser.js +96 -0
  261. package/dist/pouchdb/pouchdb-http.d.ts +2 -0
  262. package/dist/pouchdb/pouchdb-http.js +94 -0
  263. package/dist/pouchdb/pouchdb-test.d.ts +2 -0
  264. package/dist/pouchdb/pouchdb-test.js +12 -0
  265. package/dist/pouchdb/utils_couchdb.d.ts +4 -0
  266. package/dist/pouchdb/utils_couchdb.js +38 -0
  267. package/dist/replication/LiveSyncAbstractReplicator.d.ts +69 -0
  268. package/dist/replication/LiveSyncAbstractReplicator.js +92 -0
  269. package/dist/replication/SyncParamsHandler.d.ts +35 -0
  270. package/dist/replication/SyncParamsHandler.js +118 -0
  271. package/dist/replication/couchdb/LiveSyncReplicator.d.ts +85 -0
  272. package/dist/replication/couchdb/LiveSyncReplicator.js +1132 -0
  273. package/dist/replication/httplib.d.ts +75 -0
  274. package/dist/replication/httplib.js +187 -0
  275. package/dist/replication/journal/JournalSyncCore.d.ts +70 -0
  276. package/dist/replication/journal/JournalSyncCore.js +737 -0
  277. package/dist/replication/journal/JournalSyncTypes.d.ts +9 -0
  278. package/dist/replication/journal/JournalSyncTypes.js +11 -0
  279. package/dist/replication/journal/LiveSyncJournalReplicator.d.ts +40 -0
  280. package/dist/replication/journal/LiveSyncJournalReplicator.js +294 -0
  281. package/dist/replication/journal/LiveSyncJournalReplicatorEnv.d.ts +3 -0
  282. package/dist/replication/journal/LiveSyncJournalReplicatorEnv.js +0 -0
  283. package/dist/replication/journal/objectstore/JournalStorageAdapter.d.ts +15 -0
  284. package/dist/replication/journal/objectstore/JournalStorageAdapter.js +0 -0
  285. package/dist/replication/journal/objectstore/MinioStorageAdapter.d.ts +21 -0
  286. package/dist/replication/journal/objectstore/MinioStorageAdapter.js +204 -0
  287. package/dist/replication/trystero/LiveSyncTrysteroReplicator.d.ts +90 -0
  288. package/dist/replication/trystero/LiveSyncTrysteroReplicator.js +380 -0
  289. package/dist/replication/trystero/P2PLogCollector.d.ts +8 -0
  290. package/dist/replication/trystero/P2PLogCollector.js +91 -0
  291. package/dist/replication/trystero/P2PReplicatorBase.d.ts +19 -0
  292. package/dist/replication/trystero/P2PReplicatorBase.js +0 -0
  293. package/dist/replication/trystero/P2PReplicatorCore.d.ts +12 -0
  294. package/dist/replication/trystero/P2PReplicatorCore.js +126 -0
  295. package/dist/replication/trystero/P2PReplicatorPaneCommon.d.ts +41 -0
  296. package/dist/replication/trystero/P2PReplicatorPaneCommon.js +20 -0
  297. package/dist/replication/trystero/ProxiedDB.d.ts +13 -0
  298. package/dist/replication/trystero/ProxiedDB.js +20 -0
  299. package/dist/replication/trystero/TrysteroReplicator.d.ts +152 -0
  300. package/dist/replication/trystero/TrysteroReplicator.js +683 -0
  301. package/dist/replication/trystero/TrysteroReplicatorP2PClient.d.ts +19 -0
  302. package/dist/replication/trystero/TrysteroReplicatorP2PClient.js +80 -0
  303. package/dist/replication/trystero/TrysteroReplicatorP2PConnection.d.ts +2 -0
  304. package/dist/replication/trystero/TrysteroReplicatorP2PConnection.js +4 -0
  305. package/dist/replication/trystero/TrysteroReplicatorP2PServer.d.ts +117 -0
  306. package/dist/replication/trystero/TrysteroReplicatorP2PServer.js +540 -0
  307. package/dist/replication/trystero/UseP2PReplicatorResult.d.ts +11 -0
  308. package/dist/replication/trystero/UseP2PReplicatorResult.js +0 -0
  309. package/dist/replication/trystero/addP2PEventHandlers.d.ts +35 -0
  310. package/dist/replication/trystero/addP2PEventHandlers.js +43 -0
  311. package/dist/replication/trystero/rpcCompat.d.ts +1 -0
  312. package/dist/replication/trystero/rpcCompat.js +9 -0
  313. package/dist/replication/trystero/types.d.ts +95 -0
  314. package/dist/replication/trystero/types.js +27 -0
  315. package/dist/replication/trystero/useP2PReplicatorCommands.d.ts +7 -0
  316. package/dist/replication/trystero/useP2PReplicatorCommands.js +25 -0
  317. package/dist/replication/trystero/useP2PReplicatorFeature.d.ts +17 -0
  318. package/dist/replication/trystero/useP2PReplicatorFeature.js +82 -0
  319. package/dist/rpc/RpcRoom.d.ts +24 -0
  320. package/dist/rpc/RpcRoom.js +300 -0
  321. package/dist/rpc/RpcSession.d.ts +9 -0
  322. package/dist/rpc/RpcSession.js +32 -0
  323. package/dist/rpc/chunking.d.ts +11 -0
  324. package/dist/rpc/chunking.js +58 -0
  325. package/dist/rpc/errors.d.ts +8 -0
  326. package/dist/rpc/errors.js +26 -0
  327. package/dist/rpc/index.d.ts +6 -0
  328. package/dist/rpc/index.js +12 -0
  329. package/dist/rpc/pouchdb/RpcPouchDBProxy.d.ts +75 -0
  330. package/dist/rpc/pouchdb/RpcPouchDBProxy.js +115 -0
  331. package/dist/rpc/pouchdb/RpcPouchDBServer.d.ts +16 -0
  332. package/dist/rpc/pouchdb/RpcPouchDBServer.js +55 -0
  333. package/dist/rpc/transports/DiagRTCPeerConnections.d.ts +24 -0
  334. package/dist/rpc/transports/DiagRTCPeerConnections.js +208 -0
  335. package/dist/rpc/transports/DiagRTCPeerConnections.types.d.ts +64 -0
  336. package/dist/rpc/transports/DiagRTCPeerConnections.types.js +12 -0
  337. package/dist/rpc/transports/DiagRTCPeerConnections.utils.d.ts +33 -0
  338. package/dist/rpc/transports/DiagRTCPeerConnections.utils.js +217 -0
  339. package/dist/rpc/transports/TrysteroTransport.d.ts +216 -0
  340. package/dist/rpc/transports/TrysteroTransport.js +134 -0
  341. package/dist/rpc/transports/trysteroUtils.d.ts +3 -0
  342. package/dist/rpc/transports/trysteroUtils.js +37 -0
  343. package/dist/rpc/types.d.ts +75 -0
  344. package/dist/rpc/types.js +6 -0
  345. package/dist/serviceFeatures/checkRemoteSize.d.ts +28 -0
  346. package/dist/serviceFeatures/checkRemoteSize.js +178 -0
  347. package/dist/serviceFeatures/offlineScanner.d.ts +128 -0
  348. package/dist/serviceFeatures/offlineScanner.js +553 -0
  349. package/dist/serviceFeatures/prepareDatabaseForUse.d.ts +20 -0
  350. package/dist/serviceFeatures/prepareDatabaseForUse.js +39 -0
  351. package/dist/serviceFeatures/remoteConfig.d.ts +46 -0
  352. package/dist/serviceFeatures/remoteConfig.js +247 -0
  353. package/dist/serviceFeatures/setupObsidian/qrCode.d.ts +4 -0
  354. package/dist/serviceFeatures/setupObsidian/qrCode.js +67 -0
  355. package/dist/serviceFeatures/setupObsidian/setupUri.d.ts +7 -0
  356. package/dist/serviceFeatures/setupObsidian/setupUri.js +70 -0
  357. package/dist/serviceFeatures/setupObsidian/types.d.ts +2 -0
  358. package/dist/serviceFeatures/setupObsidian/types.js +0 -0
  359. package/dist/serviceFeatures/targetFilter.d.ts +24 -0
  360. package/dist/serviceFeatures/targetFilter.js +178 -0
  361. package/dist/serviceModules/FileAccessBase.d.ts +93 -0
  362. package/dist/serviceModules/FileAccessBase.js +219 -0
  363. package/dist/serviceModules/Rebuilder.d.ts +92 -0
  364. package/dist/serviceModules/Rebuilder.js +449 -0
  365. package/dist/serviceModules/ServiceDatabaseFileAccessBase.d.ts +40 -0
  366. package/dist/serviceModules/ServiceDatabaseFileAccessBase.js +306 -0
  367. package/dist/serviceModules/ServiceFileAccessBase.d.ts +64 -0
  368. package/dist/serviceModules/ServiceFileAccessBase.js +312 -0
  369. package/dist/serviceModules/ServiceFileHandlerBase.d.ts +52 -0
  370. package/dist/serviceModules/ServiceFileHandlerBase.js +493 -0
  371. package/dist/serviceModules/ServiceModuleBase.d.ts +10 -0
  372. package/dist/serviceModules/ServiceModuleBase.js +13 -0
  373. package/dist/serviceModules/adapters/IConversionAdapter.d.ts +15 -0
  374. package/dist/serviceModules/adapters/IConversionAdapter.js +0 -0
  375. package/dist/serviceModules/adapters/IFileSystemAdapter.d.ts +47 -0
  376. package/dist/serviceModules/adapters/IFileSystemAdapter.js +0 -0
  377. package/dist/serviceModules/adapters/IPathAdapter.d.ts +15 -0
  378. package/dist/serviceModules/adapters/IPathAdapter.js +0 -0
  379. package/dist/serviceModules/adapters/IStorageAdapter.d.ts +56 -0
  380. package/dist/serviceModules/adapters/IStorageAdapter.js +0 -0
  381. package/dist/serviceModules/adapters/ITypeGuardAdapter.d.ts +14 -0
  382. package/dist/serviceModules/adapters/ITypeGuardAdapter.js +0 -0
  383. package/dist/serviceModules/adapters/IVaultAdapter.d.ts +51 -0
  384. package/dist/serviceModules/adapters/IVaultAdapter.js +0 -0
  385. package/dist/serviceModules/adapters/index.d.ts +6 -0
  386. package/dist/serviceModules/adapters/index.js +0 -0
  387. package/dist/services/BrowserServices.d.ts +36 -0
  388. package/dist/services/BrowserServices.js +123 -0
  389. package/dist/services/HeadlessServices.d.ts +14 -0
  390. package/dist/services/HeadlessServices.js +144 -0
  391. package/dist/services/InjectableServices.d.ts +1 -0
  392. package/dist/services/InjectableServices.js +4 -0
  393. package/dist/services/ServiceHub.d.ts +82 -0
  394. package/dist/services/ServiceHub.js +66 -0
  395. package/dist/services/base/APIService.d.ts +93 -0
  396. package/dist/services/base/APIService.js +44 -0
  397. package/dist/services/base/AppLifecycleService.d.ts +132 -0
  398. package/dist/services/base/AppLifecycleService.js +123 -0
  399. package/dist/services/base/ConfigService.d.ts +7 -0
  400. package/dist/services/base/ConfigService.js +6 -0
  401. package/dist/services/base/ConflictService.d.ts +54 -0
  402. package/dist/services/base/ConflictService.js +22 -0
  403. package/dist/services/base/ControlService.d.ts +54 -0
  404. package/dist/services/base/ControlService.js +103 -0
  405. package/dist/services/base/DatabaseEventService.d.ts +38 -0
  406. package/dist/services/base/DatabaseEventService.js +38 -0
  407. package/dist/services/base/DatabaseService.d.ts +40 -0
  408. package/dist/services/base/DatabaseService.js +79 -0
  409. package/dist/services/base/FileProcessingService.d.ts +25 -0
  410. package/dist/services/base/FileProcessingService.js +28 -0
  411. package/dist/services/base/IService.d.ts +284 -0
  412. package/dist/services/base/IService.js +1 -0
  413. package/dist/services/base/KeyValueDBService.d.ts +42 -0
  414. package/dist/services/base/KeyValueDBService.js +133 -0
  415. package/dist/services/base/MessageTranslator.d.ts +6 -0
  416. package/dist/services/base/MessageTranslator.js +4 -0
  417. package/dist/services/base/PathService.d.ts +38 -0
  418. package/dist/services/base/PathService.js +66 -0
  419. package/dist/services/base/RemoteService.d.ts +61 -0
  420. package/dist/services/base/RemoteService.js +212 -0
  421. package/dist/services/base/ReplicationService.d.ts +92 -0
  422. package/dist/services/base/ReplicationService.js +261 -0
  423. package/dist/services/base/ReplicatorService.d.ts +66 -0
  424. package/dist/services/base/ReplicatorService.js +164 -0
  425. package/dist/services/base/ServiceBase.d.ts +33 -0
  426. package/dist/services/base/ServiceBase.js +27 -0
  427. package/dist/services/base/SettingService.d.ts +112 -0
  428. package/dist/services/base/SettingService.js +543 -0
  429. package/dist/services/base/TestService.d.ts +28 -0
  430. package/dist/services/base/TestService.js +19 -0
  431. package/dist/services/base/TweakValueService.d.ts +40 -0
  432. package/dist/services/base/TweakValueService.js +6 -0
  433. package/dist/services/base/UnresolvedErrorManager.d.ts +15 -0
  434. package/dist/services/base/UnresolvedErrorManager.js +44 -0
  435. package/dist/services/base/VaultService.d.ts +69 -0
  436. package/dist/services/base/VaultService.js +70 -0
  437. package/dist/services/implements/base/SvelteDialog.d.ts +79 -0
  438. package/dist/services/implements/base/SvelteDialog.js +134 -0
  439. package/dist/services/implements/base/UIService.d.ts +24 -0
  440. package/dist/services/implements/base/UIService.js +37 -0
  441. package/dist/services/implements/browser/BrowserAPIService.d.ts +54 -0
  442. package/dist/services/implements/browser/BrowserAPIService.js +298 -0
  443. package/dist/services/implements/browser/BrowserDatabaseService.d.ts +7 -0
  444. package/dist/services/implements/browser/BrowserDatabaseService.js +10 -0
  445. package/dist/services/implements/browser/ConfigServiceBrowserCompat.d.ts +16 -0
  446. package/dist/services/implements/browser/ConfigServiceBrowserCompat.js +23 -0
  447. package/dist/services/implements/headless/HeadlessAPIService.d.ts +52 -0
  448. package/dist/services/implements/headless/HeadlessAPIService.js +127 -0
  449. package/dist/services/implements/headless/HeadlessDatabaseService.d.ts +7 -0
  450. package/dist/services/implements/headless/HeadlessDatabaseService.js +10 -0
  451. package/dist/services/implements/injectable/InjectableAPIService.d.ts +7 -0
  452. package/dist/services/implements/injectable/InjectableAPIService.js +18 -0
  453. package/dist/services/implements/injectable/InjectableAppLifecycleService.d.ts +11 -0
  454. package/dist/services/implements/injectable/InjectableAppLifecycleService.js +14 -0
  455. package/dist/services/implements/injectable/InjectableConflictService.d.ts +11 -0
  456. package/dist/services/implements/injectable/InjectableConflictService.js +14 -0
  457. package/dist/services/implements/injectable/InjectableDatabaseEventService.d.ts +4 -0
  458. package/dist/services/implements/injectable/InjectableDatabaseEventService.js +7 -0
  459. package/dist/services/implements/injectable/InjectableFileProcessingService.d.ts +4 -0
  460. package/dist/services/implements/injectable/InjectableFileProcessingService.js +6 -0
  461. package/dist/services/implements/injectable/InjectablePathService.d.ts +12 -0
  462. package/dist/services/implements/injectable/InjectablePathService.js +36 -0
  463. package/dist/services/implements/injectable/InjectableRemoteService.d.ts +4 -0
  464. package/dist/services/implements/injectable/InjectableRemoteService.js +7 -0
  465. package/dist/services/implements/injectable/InjectableReplicationService.d.ts +4 -0
  466. package/dist/services/implements/injectable/InjectableReplicationService.js +6 -0
  467. package/dist/services/implements/injectable/InjectableReplicatorService.d.ts +4 -0
  468. package/dist/services/implements/injectable/InjectableReplicatorService.js +7 -0
  469. package/dist/services/implements/injectable/InjectableServiceHub.d.ts +72 -0
  470. package/dist/services/implements/injectable/InjectableServiceHub.js +125 -0
  471. package/dist/services/implements/injectable/InjectableServices.d.ts +36 -0
  472. package/dist/services/implements/injectable/InjectableServices.js +1 -0
  473. package/dist/services/implements/injectable/InjectableSettingService.d.ts +11 -0
  474. package/dist/services/implements/injectable/InjectableSettingService.js +33 -0
  475. package/dist/services/implements/injectable/InjectableTestService.d.ts +5 -0
  476. package/dist/services/implements/injectable/InjectableTestService.js +8 -0
  477. package/dist/services/implements/injectable/InjectableTweakValueService.d.ts +15 -0
  478. package/dist/services/implements/injectable/InjectableTweakValueService.js +12 -0
  479. package/dist/services/implements/injectable/InjectableVaultService.d.ts +9 -0
  480. package/dist/services/implements/injectable/InjectableVaultService.js +20 -0
  481. package/dist/services/lib/HandlerUtils.d.ts +374 -0
  482. package/dist/services/lib/HandlerUtils.js +412 -0
  483. package/dist/services/lib/logUtils.d.ts +13 -0
  484. package/dist/services/lib/logUtils.js +28 -0
  485. package/dist/services/lib/remoteActivity.d.ts +13 -0
  486. package/dist/services/lib/remoteActivity.js +11 -0
  487. package/dist/string_and_binary/chunks.d.ts +10 -0
  488. package/dist/string_and_binary/chunks.js +561 -0
  489. package/dist/string_and_binary/convert.d.ts +8 -0
  490. package/dist/string_and_binary/convert.js +46 -0
  491. package/dist/string_and_binary/hash.d.ts +2 -0
  492. package/dist/string_and_binary/hash.js +1 -0
  493. package/dist/string_and_binary/path.d.ts +35 -0
  494. package/dist/string_and_binary/path.js +240 -0
  495. package/dist/worker/bg.common.d.ts +2 -0
  496. package/dist/worker/bg.common.js +6 -0
  497. package/dist/worker/bg.worker.d.ts +1 -0
  498. package/dist/worker/bg.worker.encryption.d.ts +7 -0
  499. package/dist/worker/bg.worker.encryption.js +30 -0
  500. package/dist/worker/bg.worker.js +14 -0
  501. package/dist/worker/bg.worker.splitting.d.ts +6 -0
  502. package/dist/worker/bg.worker.splitting.js +36 -0
  503. package/dist/worker/bgWorker.d.ts +25 -0
  504. package/dist/worker/bgWorker.direct.d.ts +40 -0
  505. package/dist/worker/bgWorker.direct.js +65 -0
  506. package/dist/worker/bgWorker.encryption.d.ts +22 -0
  507. package/dist/worker/bgWorker.encryption.js +40 -0
  508. package/dist/worker/bgWorker.js +348 -0
  509. package/dist/worker/bgWorker.splitting.d.ts +27 -0
  510. package/dist/worker/bgWorker.splitting.js +123 -0
  511. package/dist/worker/universalTypes.d.ts +63 -0
  512. package/dist/worker/universalTypes.js +4 -0
  513. package/docs/development.md +51 -0
  514. package/docs/platform-storage.md +60 -0
  515. package/docs/releasing.md +69 -0
  516. 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
+ };
@@ -0,0 +1,2 @@
1
+ import PouchDB from "pouchdb-core";
2
+ export { PouchDB };