@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,737 @@
1
+ import {
2
+ LOG_LEVEL_INFO,
3
+ LOG_LEVEL_NOTICE,
4
+ LOG_LEVEL_VERBOSE,
5
+ LOG_LEVEL_DEBUG,
6
+ DEFAULT_SYNC_PARAMETERS,
7
+ ProtocolVersions,
8
+ DOCID_JOURNAL_SYNC_PARAMETERS,
9
+ E2EEAlgorithms
10
+ } from "../../common/types.js";
11
+ import { Logger } from "../../common/logger.js";
12
+ import {
13
+ concatUInt8Array,
14
+ escapeNewLineFromString,
15
+ setAllItems,
16
+ unescapeNewLineFromString
17
+ } from "../../common/utils.js";
18
+ import { shareRunningResult } from "octagonal-wheels/concurrency/lock";
19
+ import { wrappedDeflate, wrappedInflate } from "../../pouchdb/compress.js";
20
+ import { CheckPointInfoDefault } from "./JournalSyncTypes.js";
21
+ import {
22
+ clearHandlers,
23
+ createSyncParamsHanderForServer,
24
+ SyncParamsFetchError,
25
+ SyncParamsNotFoundError,
26
+ SyncParamsUpdateError
27
+ } from "../SyncParamsHandler.js";
28
+ import { REMOTE_CHUNK_FETCHED } from "../../pouchdb/LiveSyncLocalDB.js";
29
+ import { decryptBinary, encryptBinary } from "octagonal-wheels/encryption/encryption";
30
+ import {
31
+ encryptBinary as encryptBinaryHKDF,
32
+ decryptBinary as decryptBinaryHKDF
33
+ } from "octagonal-wheels/encryption/hkdf";
34
+ const RECORD_SPLIT = `
35
+ `;
36
+ const UNIT_SPLIT = ``;
37
+ const te = new TextEncoder();
38
+ function serializeDoc(doc) {
39
+ if (doc._id.startsWith("h:")) {
40
+ const data = doc.data;
41
+ const writeData = escapeNewLineFromString(data);
42
+ return te.encode(`~${doc._id}${UNIT_SPLIT}${writeData}${RECORD_SPLIT}`);
43
+ }
44
+ return te.encode(JSON.stringify(doc) + RECORD_SPLIT);
45
+ }
46
+ class JournalSyncCore {
47
+ _settings;
48
+ storage;
49
+ get db() {
50
+ return this.env.services.database.localDatabase.localDatabase;
51
+ }
52
+ get currentSettings() {
53
+ return this.env.services.setting.currentSettings();
54
+ }
55
+ hash = "";
56
+ processReplication;
57
+ batchSize = 100;
58
+ env;
59
+ store;
60
+ requestedStop = false;
61
+ getInitialSyncParameters() {
62
+ return Promise.resolve({
63
+ ...DEFAULT_SYNC_PARAMETERS,
64
+ protocolVersion: ProtocolVersions.ADVANCED_E2EE,
65
+ pbkdf2salt: ""
66
+ });
67
+ }
68
+ async getSyncParameters() {
69
+ try {
70
+ const downloadedData = await this.storage.download(DOCID_JOURNAL_SYNC_PARAMETERS, true);
71
+ if (!downloadedData) {
72
+ throw new SyncParamsNotFoundError(`Missing sync parameters`);
73
+ }
74
+ const downloadedSyncParams = JSON.parse(new TextDecoder().decode(downloadedData));
75
+ return downloadedSyncParams;
76
+ } catch (ex) {
77
+ Logger(`Could not retrieve remote sync parameters`, LOG_LEVEL_INFO);
78
+ throw SyncParamsFetchError.fromError(ex);
79
+ }
80
+ }
81
+ async putSyncParameters(params) {
82
+ try {
83
+ const data = new TextEncoder().encode(JSON.stringify(params));
84
+ if (await this.storage.upload(DOCID_JOURNAL_SYNC_PARAMETERS, data, "application/json")) {
85
+ return true;
86
+ }
87
+ throw new SyncParamsUpdateError(`Could not store remote sync parameters`);
88
+ } catch (ex) {
89
+ Logger(`Could not upload sync parameters`, LOG_LEVEL_INFO);
90
+ Logger(ex, LOG_LEVEL_VERBOSE);
91
+ throw SyncParamsUpdateError.fromError(ex);
92
+ }
93
+ }
94
+ getHash(settings) {
95
+ return btoa(
96
+ encodeURI([settings.endpoint, `${settings.bucket}${settings.bucketPrefix}`, settings.region].join())
97
+ );
98
+ }
99
+ constructor(settings, store, env, storage) {
100
+ this._settings = settings;
101
+ this.env = env;
102
+ this.processReplication = async (docs) => await env.services.replication.parseSynchroniseResult(docs);
103
+ this.store = store;
104
+ this.hash = this.getHash(settings);
105
+ this.storage = storage;
106
+ clearHandlers();
107
+ }
108
+ async downloadJson(key) {
109
+ try {
110
+ const data = await this.storage.download(key, true);
111
+ if (!data) return false;
112
+ return JSON.parse(new TextDecoder().decode(data));
113
+ } catch (ex) {
114
+ Logger(`Could not download json ${key}`);
115
+ Logger(ex, LOG_LEVEL_VERBOSE);
116
+ return false;
117
+ }
118
+ }
119
+ async uploadJson(key, body) {
120
+ try {
121
+ const data = new TextEncoder().encode(JSON.stringify(body));
122
+ return await this.storage.upload(key, data, "application/json");
123
+ } catch (ex) {
124
+ Logger(`Could not upload json ${key}`);
125
+ Logger(ex, LOG_LEVEL_VERBOSE);
126
+ return false;
127
+ }
128
+ }
129
+ applyNewConfig(settings, store, env) {
130
+ this._settings = settings;
131
+ this.env = env;
132
+ this.processReplication = async (docs) => await env.services.replication.parseSynchroniseResult(docs);
133
+ this.store = store;
134
+ this.hash = this.getHash(settings);
135
+ this.storage.applyNewConfig(settings);
136
+ clearHandlers();
137
+ }
138
+ updateInfo(info) {
139
+ const old = this.env.services.replicator.replicationStatics.value;
140
+ this.env.services.replicator.replicationStatics.value = {
141
+ sent: info.sent ?? old.sent,
142
+ arrived: info.arrived ?? old.arrived,
143
+ maxPullSeq: info.maxPullSeq ?? old.maxPullSeq,
144
+ maxPushSeq: info.maxPushSeq ?? old.maxPushSeq,
145
+ lastSyncPullSeq: info.lastSyncPullSeq ?? old.lastSyncPullSeq,
146
+ lastSyncPushSeq: info.lastSyncPushSeq ?? old.lastSyncPushSeq,
147
+ syncStatus: info.syncStatus ?? old.syncStatus
148
+ };
149
+ }
150
+ async updateCheckPointInfo(func) {
151
+ const checkPointKey = `bucketsync-checkpoint-${this.hash}`;
152
+ const old = await this.getCheckpointInfo();
153
+ const newInfo = func(old);
154
+ this._currentCheckPointInfo = newInfo;
155
+ await this.store.set(checkPointKey, newInfo);
156
+ return newInfo;
157
+ }
158
+ _currentCheckPointInfo = { ...CheckPointInfoDefault };
159
+ async getCheckpointInfo() {
160
+ const checkPointKey = `bucketsync-checkpoint-${this.hash}`;
161
+ const old = await this.store.get(checkPointKey) || {};
162
+ const items = ["knownIDs", "sentIDs", "receivedFiles", "sentFiles"];
163
+ for (const key of items) {
164
+ if (!(key in old)) {
165
+ continue;
166
+ }
167
+ const value = old[key];
168
+ if (value instanceof Set) {
169
+ continue;
170
+ }
171
+ if (Array.isArray(value)) {
172
+ old[key] = new Set(value);
173
+ continue;
174
+ }
175
+ if (value && typeof value === "object") {
176
+ old[key] = new Set(Object.keys(value));
177
+ continue;
178
+ }
179
+ old[key] = /* @__PURE__ */ new Set();
180
+ }
181
+ this._currentCheckPointInfo = { ...CheckPointInfoDefault, ...old };
182
+ return this._currentCheckPointInfo;
183
+ }
184
+ resetAllCaches() {
185
+ clearHandlers();
186
+ }
187
+ async resetCheckpointInfo() {
188
+ await this.updateCheckPointInfo((info) => ({ ...CheckPointInfoDefault }));
189
+ clearHandlers();
190
+ }
191
+ getJournalEpochFromSyncParams(params) {
192
+ return `${params.protocolVersion}:${params.pbkdf2salt}`;
193
+ }
194
+ async ensureCheckpointCachesAreFresh() {
195
+ let journalEpoch = "";
196
+ try {
197
+ const params = await this.getSyncParameters();
198
+ journalEpoch = this.getJournalEpochFromSyncParams(params);
199
+ } catch {
200
+ return;
201
+ }
202
+ const current = await this.getCheckpointInfo();
203
+ if (current.journalEpoch === journalEpoch) {
204
+ return;
205
+ }
206
+ const lastSentFile = [...current.sentFiles].sort().pop();
207
+ if (!lastSentFile) {
208
+ await this.updateCheckPointInfo((info) => ({ ...info, journalEpoch }));
209
+ return;
210
+ }
211
+ let remoteWipeConfirmed;
212
+ try {
213
+ const probe = await this.storage.listFiles(lastSentFile.slice(0, -1), 1);
214
+ remoteWipeConfirmed = probe[0] !== lastSentFile;
215
+ } catch {
216
+ remoteWipeConfirmed = true;
217
+ }
218
+ if (!remoteWipeConfirmed) {
219
+ await this.updateCheckPointInfo((info) => ({ ...info, journalEpoch }));
220
+ Logger(`Journal epoch changed (remote files still present). Epoch updated; caches kept.`, LOG_LEVEL_NOTICE);
221
+ return;
222
+ }
223
+ Logger(`Journal epoch changed and remote wipe confirmed. Clearing dedupe caches.`, LOG_LEVEL_NOTICE);
224
+ await this.updateCheckPointInfo((info) => ({
225
+ ...info,
226
+ journalEpoch,
227
+ knownIDs: /* @__PURE__ */ new Set(),
228
+ sentIDs: /* @__PURE__ */ new Set(),
229
+ receivedFiles: /* @__PURE__ */ new Set(),
230
+ sentFiles: /* @__PURE__ */ new Set()
231
+ }));
232
+ clearHandlers();
233
+ }
234
+ async isAvailable() {
235
+ return await this.storage.isAvailable();
236
+ }
237
+ async resetBucket() {
238
+ let files = [];
239
+ try {
240
+ do {
241
+ files = await this.storage.listFiles("", 100);
242
+ if (files.length == 0) {
243
+ break;
244
+ }
245
+ await this.storage.deleteFiles(files);
246
+ } while (files.length != 0);
247
+ clearHandlers();
248
+ } catch (ex) {
249
+ Logger(`WARNING! Could not delete files.`, LOG_LEVEL_NOTICE, "reset-bucket");
250
+ Logger(ex, LOG_LEVEL_VERBOSE);
251
+ }
252
+ const journals = await this._getRemoteJournals();
253
+ if (journals.length == 0) {
254
+ Logger("Nothing to delete!", LOG_LEVEL_NOTICE);
255
+ return true;
256
+ }
257
+ await this.storage.deleteFiles(journals);
258
+ Logger(`${journals.length} items has been deleted!`, LOG_LEVEL_NOTICE);
259
+ await this.resetCheckpointInfo();
260
+ return true;
261
+ }
262
+ getRemoteKey() {
263
+ return this.getHash(this._settings);
264
+ }
265
+ async getReplicationPBKDF2Salt(refresh) {
266
+ const server = this.getRemoteKey();
267
+ const manager = createSyncParamsHanderForServer(server, {
268
+ put: (params) => this.putSyncParameters(params),
269
+ get: () => this.getSyncParameters(),
270
+ create: () => this.getInitialSyncParameters()
271
+ });
272
+ return await manager.getPBKDF2Salt(refresh);
273
+ }
274
+ isEncryptionPrevented(fileName) {
275
+ if (fileName.endsWith(DOCID_JOURNAL_SYNC_PARAMETERS)) return true;
276
+ return false;
277
+ }
278
+ async decryptDataV2(encrypted, set) {
279
+ const salt = await this.getReplicationPBKDF2Salt();
280
+ return await decryptBinaryHKDF(encrypted, set.passphrase, salt);
281
+ }
282
+ async decryptDataV1(encrypted, set) {
283
+ return await decryptBinary(
284
+ encrypted,
285
+ set.passphrase,
286
+ set.useDynamicIterationCount
287
+ );
288
+ }
289
+ async decryptDownloaded(key, encrypted, set) {
290
+ const u = new Uint8Array(encrypted);
291
+ try {
292
+ if (!set.encrypt || set.passphrase == "" || this.isEncryptionPrevented(key)) {
293
+ return u;
294
+ }
295
+ if (set.E2EEAlgorithm === E2EEAlgorithms.ForceV1) {
296
+ return await this.decryptDataV1(u, set);
297
+ }
298
+ const decrypted = await this.decryptDataV2(u, set);
299
+ return decrypted;
300
+ } catch (ex) {
301
+ Logger(`Failed to decrypt in v2. Falling back to v1: ${key}`, LOG_LEVEL_INFO);
302
+ try {
303
+ const r = await this.decryptDataV1(u, set);
304
+ Logger(`Decrypted in v1: ${key}`, LOG_LEVEL_VERBOSE);
305
+ return r;
306
+ } catch (ex2) {
307
+ Logger(`Could not decrypt in v1: ${key}`, LOG_LEVEL_VERBOSE);
308
+ Logger(ex, LOG_LEVEL_VERBOSE);
309
+ Logger(ex2, LOG_LEVEL_VERBOSE);
310
+ throw ex2;
311
+ }
312
+ }
313
+ }
314
+ async encryptForUpload(key, data, set) {
315
+ if (!set.encrypt || set.passphrase == "" || this.isEncryptionPrevented(key)) {
316
+ return data;
317
+ }
318
+ if (set.E2EEAlgorithm === E2EEAlgorithms.V2) {
319
+ const salt = await this.getReplicationPBKDF2Salt();
320
+ return await encryptBinaryHKDF(data, set.passphrase, salt);
321
+ } else {
322
+ return await encryptBinary(data, set.passphrase, set.useDynamicIterationCount);
323
+ }
324
+ }
325
+ getDocKey(doc) {
326
+ if (doc && doc._id.startsWith("h:")) {
327
+ return doc._id;
328
+ }
329
+ return doc._id + "-" + doc._rev;
330
+ }
331
+ async _createJournalPack(override) {
332
+ const checkPointInfo = await this.getCheckpointInfo();
333
+ const from = override || checkPointInfo.lastLocalSeq;
334
+ Logger(`Journal reading from seq:${from}`, LOG_LEVEL_VERBOSE);
335
+ let knownKeyCount = 0;
336
+ const allChangesTask = this.db.changes({
337
+ live: false,
338
+ since: override || from,
339
+ conflicts: true,
340
+ limit: this.batchSize,
341
+ return_docs: true,
342
+ attachments: false,
343
+ style: "all_docs"
344
+ // NOTE: Do NOT add a filter function here that tests the winning-revision doc.
345
+ // With style:"all_docs", each change entry can carry multiple leaf revisions
346
+ // (e.g. the winner plus a newly-created tombstone for a resolved conflict).
347
+ // A filter based on the winner's key would incorrectly suppress the entire entry
348
+ // even when one of the other leaf revisions (e.g. the tombstone) has never been
349
+ // sent. Per-revision deduplication is handled correctly by the second filter
350
+ // applied after bulkGet below.
351
+ });
352
+ const allChanges = await allChangesTask;
353
+ if (allChanges.results.length == 0) {
354
+ return { changes: [], hasNext: false, packLastSeq: allChanges.last_seq };
355
+ }
356
+ const bd = await this.db.bulkGet({
357
+ docs: allChanges.results.map((e) => e.changes.map((change) => ({ id: e.id, rev: change.rev }))).flat(),
358
+ revs: true
359
+ });
360
+ const packLastSeq = allChanges.last_seq;
361
+ const dbInfo = await this.db.info();
362
+ const hasNext = packLastSeq < dbInfo.update_seq;
363
+ const docs = bd.results.map((e) => e.docs).flat();
364
+ const docChanges = docs.filter((e) => "ok" in e).map((e) => e.ok).filter((doc) => {
365
+ const key = this.getDocKey(doc);
366
+ if (this._currentCheckPointInfo.knownIDs.has(key)) {
367
+ knownKeyCount++;
368
+ return false;
369
+ }
370
+ if (this._currentCheckPointInfo.sentIDs.has(key)) {
371
+ knownKeyCount++;
372
+ return false;
373
+ }
374
+ return true;
375
+ });
376
+ Logger(
377
+ `Checked ${allChanges.results.length} changed entries, selected ${docChanges.length} docs (${knownKeyCount} keys already known)`,
378
+ LOG_LEVEL_DEBUG
379
+ );
380
+ return { changes: docChanges, hasNext, packLastSeq };
381
+ }
382
+ _createSendReadableStream(startSeq, logLevel, MSG_KEY) {
383
+ let currentLastSeq = startSeq;
384
+ return new ReadableStream({
385
+ pull: async (controller) => {
386
+ while (true) {
387
+ if (this.requestedStop) {
388
+ Logger("Packing Journal : Stop requested", logLevel, MSG_KEY);
389
+ controller.close();
390
+ return;
391
+ }
392
+ const { changes, hasNext, packLastSeq } = await this._createJournalPack(currentLastSeq);
393
+ currentLastSeq = packLastSeq;
394
+ if (changes.length > 0) {
395
+ controller.enqueue({ changes, packLastSeq });
396
+ return;
397
+ }
398
+ if (!hasNext) {
399
+ controller.close();
400
+ return;
401
+ }
402
+ }
403
+ }
404
+ });
405
+ }
406
+ _createSendCompressTransformStream(startSeq, seqToProcess, logLevel, MSG_KEY, stats) {
407
+ const maxOutBufLength = 250;
408
+ const maxBinarySize = 1024 * 1024 * 10;
409
+ let outBuf = [];
410
+ let binarySize = 0;
411
+ let batchSentIDs = [];
412
+ let lastProcessedSeq = startSeq;
413
+ return new TransformStream({
414
+ transform: async (chunk, controller) => {
415
+ lastProcessedSeq = chunk.packLastSeq;
416
+ const currentSeq = lastProcessedSeq - startSeq;
417
+ Logger(`Packing Journal: ${currentSeq} / ${seqToProcess}`, logLevel, MSG_KEY);
418
+ for (const row of chunk.changes) {
419
+ const serialized = serializeDoc(row);
420
+ batchSentIDs.push(this.getDocKey(row));
421
+ binarySize += serialized.length;
422
+ outBuf.push(serialized);
423
+ stats.packedDocs++;
424
+ if (outBuf.length > maxOutBufLength || binarySize > maxBinarySize) {
425
+ const sendBuf = concatUInt8Array(outBuf);
426
+ const bin = await wrappedDeflate(sendBuf, { consume: true, level: 8 });
427
+ controller.enqueue({ bin, packLastSeq: chunk.packLastSeq, sentIDs: [...batchSentIDs] });
428
+ outBuf = [];
429
+ binarySize = 0;
430
+ batchSentIDs = [];
431
+ }
432
+ }
433
+ },
434
+ flush: async (controller) => {
435
+ if (outBuf.length > 0) {
436
+ const sendBuf = concatUInt8Array(outBuf);
437
+ const bin = await wrappedDeflate(sendBuf, { consume: true, level: 8 });
438
+ controller.enqueue({ bin, packLastSeq: lastProcessedSeq, sentIDs: [...batchSentIDs] });
439
+ }
440
+ }
441
+ });
442
+ }
443
+ _createSendUploadWritableStream(max, logLevel, MSG_KEY, stats) {
444
+ let sentFilesCount = 0;
445
+ return new WritableStream({
446
+ write: async (chunk) => {
447
+ const sendTimeStamp = Date.now();
448
+ const filename = `${sendTimeStamp}-docs.jsonl.gz`;
449
+ const mime = "application/octet-stream";
450
+ const encryptedBin = await this.encryptForUpload(filename, chunk.bin, this.currentSettings);
451
+ const ret = await this.storage.upload(filename, encryptedBin, mime);
452
+ if (!ret) {
453
+ throw new Error(`Could not send journalPack to the bucket (${filename})`);
454
+ }
455
+ sentFilesCount++;
456
+ stats.uploadedFiles++;
457
+ this.updateInfo({
458
+ sent: sentFilesCount,
459
+ maxPushSeq: max,
460
+ lastSyncPushSeq: chunk.packLastSeq
461
+ });
462
+ await this.updateCheckPointInfo((info) => ({
463
+ ...info,
464
+ lastLocalSeq: chunk.packLastSeq,
465
+ sentIDs: setAllItems(info.sentIDs, chunk.sentIDs),
466
+ sentFiles: info.sentFiles.add(filename)
467
+ }));
468
+ Logger(`Uploading journal: ${sentFilesCount} / ...`, logLevel, MSG_KEY);
469
+ }
470
+ });
471
+ }
472
+ async sendLocalJournal(showMessage = false) {
473
+ this.updateInfo({ syncStatus: "JOURNAL_SEND" });
474
+ return await shareRunningResult("send_journal_stream", async () => {
475
+ this.requestedStop = false;
476
+ const logLevel = showMessage ? LOG_LEVEL_NOTICE : LOG_LEVEL_INFO;
477
+ const MSG_KEY = "pack_journal";
478
+ const max = (await this.db.info()).update_seq;
479
+ const checkPointInfo = await this.getCheckpointInfo();
480
+ const startSeq = checkPointInfo.lastLocalSeq;
481
+ const seqToProcess = max - startSeq;
482
+ Logger(`Packing Journal: Start sending`, logLevel, MSG_KEY);
483
+ const stats = { packedDocs: 0, uploadedFiles: 0 };
484
+ const readable = this._createSendReadableStream(startSeq, logLevel, MSG_KEY);
485
+ const transform = this._createSendCompressTransformStream(startSeq, seqToProcess, logLevel, MSG_KEY, stats);
486
+ const writable = this._createSendUploadWritableStream(max, logLevel, `${MSG_KEY}_upload`, stats);
487
+ try {
488
+ await readable.pipeThrough(transform).pipeTo(writable);
489
+ if (seqToProcess != 0) {
490
+ Logger(
491
+ `Packing Journal: Finished. Processed ${stats.packedDocs} doc(s) into ${stats.uploadedFiles} chunk(s)`,
492
+ logLevel,
493
+ MSG_KEY
494
+ );
495
+ if (stats.uploadedFiles > 0) {
496
+ Logger(
497
+ `Uploading journal: All ${stats.uploadedFiles} chunk(s) uploaded`,
498
+ logLevel,
499
+ `${MSG_KEY}_upload`
500
+ );
501
+ }
502
+ } else {
503
+ Logger(`Packing Journal: No journals to be packed!`, logLevel, MSG_KEY);
504
+ }
505
+ this.updateInfo({ syncStatus: "COMPLETED" });
506
+ return true;
507
+ } catch (ex) {
508
+ Logger(`Packing Journal Error`, logLevel);
509
+ Logger(ex, LOG_LEVEL_VERBOSE);
510
+ this.updateInfo({ syncStatus: "ERRORED" });
511
+ return false;
512
+ }
513
+ });
514
+ }
515
+ async _getRemoteJournals() {
516
+ const checkPointInfo = await this.getCheckpointInfo();
517
+ const StartAfter = [...checkPointInfo.receivedFiles.keys()].sort(
518
+ (a, b) => b.localeCompare(a, void 0, { numeric: true })
519
+ )[0];
520
+ const files = (await this.storage.listFiles(StartAfter)).filter((e) => !e.startsWith("_"));
521
+ if (!files) return [];
522
+ return files.sort((a, b) => a.localeCompare(b, void 0, { numeric: true }));
523
+ }
524
+ async processDocuments(allDocs) {
525
+ let applyTotal = 0;
526
+ let wholeItems = 0;
527
+ try {
528
+ const chunks = [];
529
+ const docs = [];
530
+ allDocs.forEach((e) => {
531
+ if (e._id.startsWith("h:")) {
532
+ chunks.push(e);
533
+ } else {
534
+ docs.push(e);
535
+ }
536
+ });
537
+ try {
538
+ const e1 = (await this.db.allDocs({ include_docs: true, keys: [...chunks.map((e) => e._id)] })).rows;
539
+ const e2 = e1.map((e) => e.id ?? void 0);
540
+ const existChunks = new Set(e2.filter((e) => e !== void 0));
541
+ const saveChunks = chunks.filter((e) => !existChunks.has(e._id)).map((e) => ({ ...e, _rev: void 0 }));
542
+ const ret = await this.db.bulkDocs(saveChunks, { new_edits: true });
543
+ const saveError = ret.filter((e) => "error" in e).map((e) => e.id);
544
+ saveChunks.filter((e) => saveError.indexOf(e._id) === -1).forEach(
545
+ (doc) => this.env.services.context.events.emitEvent(REMOTE_CHUNK_FETCHED, doc)
546
+ );
547
+ await this.updateCheckPointInfo((info) => ({
548
+ ...info,
549
+ knownIDs: setAllItems(
550
+ info.knownIDs,
551
+ chunks.map((e) => this.getDocKey(e))
552
+ )
553
+ }));
554
+ } catch (ex) {
555
+ Logger(`Applying chunks failed`, LOG_LEVEL_INFO);
556
+ Logger(ex, LOG_LEVEL_VERBOSE);
557
+ }
558
+ const params = docs.map((e) => [e._id, [e._rev]]);
559
+ const docsRevs = params.reduce(
560
+ (acc, [id, revs]) => {
561
+ return { ...acc, [id]: [...acc[id] ?? [], ...revs] };
562
+ },
563
+ {}
564
+ );
565
+ const diffRevs = await this.db.revsDiff(docsRevs);
566
+ const saveDocs = docs.filter(
567
+ (e) => e._id in diffRevs && "missing" in diffRevs[e._id] && (diffRevs[e._id].missing?.indexOf(e._rev) ?? 0) !== -1
568
+ );
569
+ await this.db.bulkDocs(saveDocs, { new_edits: false });
570
+ const writeDoc = !this.env.services.setting.currentSettings().suspendParseReplicationResult;
571
+ if (writeDoc) {
572
+ await this.processReplication(saveDocs);
573
+ }
574
+ await this.updateCheckPointInfo((info) => ({
575
+ ...info,
576
+ knownIDs: setAllItems(
577
+ info.knownIDs,
578
+ docs.map((e) => this.getDocKey(e))
579
+ )
580
+ }));
581
+ applyTotal += saveDocs.length;
582
+ wholeItems += docs.length;
583
+ Logger(
584
+ `Applied ${applyTotal} of ${wholeItems} docs (${wholeItems - applyTotal} skipped)`,
585
+ LOG_LEVEL_VERBOSE
586
+ );
587
+ return true;
588
+ } catch (ex) {
589
+ Logger(`Applying journal failed`, LOG_LEVEL_INFO);
590
+ Logger(ex, LOG_LEVEL_VERBOSE);
591
+ return false;
592
+ }
593
+ }
594
+ _createReceiveReadableStream(files) {
595
+ return new ReadableStream({
596
+ pull: (controller) => {
597
+ if (this.requestedStop || files.length === 0) {
598
+ controller.close();
599
+ return;
600
+ }
601
+ const file = files.shift();
602
+ if (file) {
603
+ controller.enqueue(file);
604
+ }
605
+ }
606
+ });
607
+ }
608
+ _createReceiveTransformStream(logLevel) {
609
+ let count = 0;
610
+ return new TransformStream({
611
+ transform: async (key, controller) => {
612
+ count++;
613
+ Logger(`Receiving Journal: ${count}`, logLevel, "receivejournal");
614
+ const checkPointInfo = await this.getCheckpointInfo();
615
+ if (checkPointInfo.sentFiles.has(key) || checkPointInfo.receivedFiles.has(key)) {
616
+ Logger(`Receiving Journal: ${key} is already processed`, LOG_LEVEL_VERBOSE);
617
+ await this.updateCheckPointInfo((info) => ({
618
+ ...info,
619
+ receivedFiles: info.receivedFiles.add(key)
620
+ }));
621
+ return;
622
+ }
623
+ try {
624
+ const encryptedData = await this.storage.download(key, true);
625
+ if (encryptedData === false) {
626
+ throw new Error("Download Error");
627
+ }
628
+ const data = await this.decryptDownloaded(
629
+ key,
630
+ encryptedData,
631
+ this.currentSettings
632
+ );
633
+ const decompressed = await wrappedInflate(new Uint8Array(data), { consume: true });
634
+ if (decompressed.length == 0) {
635
+ controller.enqueue({ key, docs: [] });
636
+ return;
637
+ }
638
+ let idxFrom = 0;
639
+ let idxTo = 0;
640
+ const d = new TextDecoder();
641
+ const result = [];
642
+ do {
643
+ idxTo = decompressed.indexOf(10, idxFrom);
644
+ if (idxTo == -1) break;
645
+ const piece = decompressed.slice(idxFrom, idxTo);
646
+ const strPiece = d.decode(piece);
647
+ if (strPiece.startsWith("~")) {
648
+ const [idPart, dataPart] = strPiece.substring(1).split(UNIT_SPLIT);
649
+ result.push({
650
+ _id: idPart,
651
+ data: unescapeNewLineFromString(dataPart),
652
+ type: "leaf",
653
+ _rev: ""
654
+ });
655
+ } else {
656
+ result.push(JSON.parse(strPiece));
657
+ }
658
+ idxFrom = idxTo + 1;
659
+ } while (idxTo > 0);
660
+ controller.enqueue({ key, docs: result });
661
+ } catch (ex) {
662
+ controller.error(ex);
663
+ }
664
+ }
665
+ });
666
+ }
667
+ _createReceiveWritableStream() {
668
+ let downloaded = 0;
669
+ return new WritableStream({
670
+ write: async (chunk) => {
671
+ const { key, docs } = chunk;
672
+ if (docs.length > 0) {
673
+ const success = await this.processDocuments(docs);
674
+ if (!success) {
675
+ throw new Error(`Could not process downloaded journals for ${key}`);
676
+ }
677
+ }
678
+ await this.updateCheckPointInfo((info) => ({
679
+ ...info,
680
+ receivedFiles: info.receivedFiles.add(key)
681
+ }));
682
+ downloaded++;
683
+ this.updateInfo({ arrived: downloaded, maxPullSeq: downloaded, lastSyncPullSeq: downloaded });
684
+ Logger(`Processing journal: ${key} has been processed`, LOG_LEVEL_INFO);
685
+ }
686
+ });
687
+ }
688
+ async receiveRemoteJournal(showMessage = false) {
689
+ this.updateInfo({ syncStatus: "JOURNAL_RECEIVE" });
690
+ return await shareRunningResult("receive_journal_stream", async () => {
691
+ this.requestedStop = false;
692
+ const logLevel = showMessage ? LOG_LEVEL_NOTICE : LOG_LEVEL_INFO;
693
+ Logger("Receiving Journal: Getting list of remote journal", logLevel, "receivejournal");
694
+ const files = await this._getRemoteJournals();
695
+ if (files.length == 0) {
696
+ Logger(`Receiving Journal: No journals needs to be downloaded`, logLevel, "receivejournal");
697
+ this.updateInfo({ syncStatus: "COMPLETED" });
698
+ return true;
699
+ }
700
+ const readable = this._createReceiveReadableStream(files);
701
+ const transform = this._createReceiveTransformStream(logLevel);
702
+ const writable = this._createReceiveWritableStream();
703
+ try {
704
+ await readable.pipeThrough(transform).pipeTo(writable);
705
+ this.updateInfo({ syncStatus: "COMPLETED" });
706
+ return true;
707
+ } catch (ex) {
708
+ Logger(`Receive Journal Error`, logLevel);
709
+ Logger(ex, LOG_LEVEL_VERBOSE);
710
+ this.updateInfo({ syncStatus: "ERRORED" });
711
+ return false;
712
+ }
713
+ });
714
+ }
715
+ async sync(showResult = false) {
716
+ return await shareRunningResult("replicate", async () => {
717
+ this.requestedStop = false;
718
+ const receiveResult = await this.receiveRemoteJournal(showResult);
719
+ if (this.requestedStop) return;
720
+ if (!receiveResult) {
721
+ const logLevel = showResult ? LOG_LEVEL_NOTICE : LOG_LEVEL_INFO;
722
+ Logger(
723
+ `Could not receive remote journal, so we prevent sending local journals to prevent unwanted mass transfers`,
724
+ logLevel
725
+ );
726
+ return;
727
+ }
728
+ return await this.sendLocalJournal(showResult);
729
+ }) ?? false;
730
+ }
731
+ requestStop() {
732
+ this.requestedStop = true;
733
+ }
734
+ }
735
+ export {
736
+ JournalSyncCore
737
+ };