@verdant-web/store 3.3.1 → 3.4.0-next.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 (338) hide show
  1. package/dist/bundle/index.js +8 -8
  2. package/dist/bundle/index.js.map +4 -4
  3. package/dist/esm/BackoffScheduler.js.map +1 -1
  4. package/dist/esm/IDBService.js.map +1 -1
  5. package/dist/esm/UndoHistory.js.map +1 -1
  6. package/dist/esm/__tests__/documents.test.js.map +1 -1
  7. package/dist/esm/__tests__/queries.test.js.map +1 -1
  8. package/dist/esm/backup.js.map +1 -1
  9. package/dist/esm/client/Client.js +7 -0
  10. package/dist/esm/client/Client.js.map +1 -1
  11. package/dist/esm/client/ClientDescriptor.js.map +1 -1
  12. package/dist/esm/entities/Entity.js.map +1 -1
  13. package/dist/esm/entities/EntityCache.js.map +1 -1
  14. package/dist/esm/entities/EntityMetadata.js.map +1 -1
  15. package/dist/esm/entities/EntityStore.js.map +1 -1
  16. package/dist/esm/entities/OperationBatcher.js.map +1 -1
  17. package/dist/esm/files/EntityFile.js.map +1 -1
  18. package/dist/esm/files/FileManager.js +3 -0
  19. package/dist/esm/files/FileManager.js.map +1 -1
  20. package/dist/esm/files/FileStorage.js.map +1 -1
  21. package/dist/esm/files/utils.js.map +1 -1
  22. package/dist/esm/idb.js.map +1 -1
  23. package/dist/esm/metadata/AckInfoStore.js.map +1 -1
  24. package/dist/esm/metadata/LocalReplicaStore.js.map +1 -1
  25. package/dist/esm/metadata/MessageCreator.js.map +1 -1
  26. package/dist/esm/metadata/Metadata.js +7 -4
  27. package/dist/esm/metadata/Metadata.js.map +1 -1
  28. package/dist/esm/metadata/OperationsStore.js.map +1 -1
  29. package/dist/esm/metadata/SchemaStore.js.map +1 -1
  30. package/dist/esm/metadata/openMetadataDatabase.js.map +1 -1
  31. package/dist/esm/migration/db.js.map +1 -1
  32. package/dist/esm/migration/openDatabase.js.map +1 -1
  33. package/dist/esm/migration/paths.js.map +1 -1
  34. package/dist/esm/queries/BaseQuery.js.map +1 -1
  35. package/dist/esm/queries/QueryCache.js.map +1 -1
  36. package/dist/esm/queries/QueryableStorage.js.map +1 -1
  37. package/dist/esm/queries/dbQueries.js.map +1 -1
  38. package/dist/esm/queries/keys.js.map +1 -1
  39. package/dist/esm/queries/ranges.js.map +1 -1
  40. package/dist/esm/queries/utils.js.map +1 -1
  41. package/dist/esm/sync/FileSync.js.map +1 -1
  42. package/dist/esm/sync/Heartbeat.js.map +1 -1
  43. package/dist/esm/sync/PresenceManager.js.map +1 -1
  44. package/dist/esm/sync/PushPullSync.js.map +1 -1
  45. package/dist/esm/sync/ServerSyncEndpointProvider.js.map +1 -1
  46. package/dist/esm/sync/Sync.js.map +1 -1
  47. package/dist/esm/sync/WebSocketSync.js.map +1 -1
  48. package/package.json +9 -10
  49. package/src/client/Client.ts +8 -1
  50. package/src/files/FileManager.ts +4 -0
  51. package/src/metadata/Metadata.ts +11 -7
  52. package/src/sync/Sync.ts +2 -2
  53. package/dist/cjs/BackoffScheduler.d.ts +0 -19
  54. package/dist/cjs/BackoffScheduler.js +0 -45
  55. package/dist/cjs/BackoffScheduler.js.map +0 -1
  56. package/dist/cjs/DocumentManager.d.ts +0 -28
  57. package/dist/cjs/DocumentManager.js +0 -45
  58. package/dist/cjs/DocumentManager.js.map +0 -1
  59. package/dist/cjs/FakeWeakRef.d.ts +0 -11
  60. package/dist/cjs/FakeWeakRef.js +0 -19
  61. package/dist/cjs/FakeWeakRef.js.map +0 -1
  62. package/dist/cjs/IDBService.d.ts +0 -30
  63. package/dist/cjs/IDBService.js +0 -101
  64. package/dist/cjs/IDBService.js.map +0 -1
  65. package/dist/cjs/UndoHistory.d.ts +0 -16
  66. package/dist/cjs/UndoHistory.js +0 -55
  67. package/dist/cjs/UndoHistory.js.map +0 -1
  68. package/dist/cjs/__tests__/batching.test.d.ts +0 -1
  69. package/dist/cjs/__tests__/batching.test.js +0 -47
  70. package/dist/cjs/__tests__/batching.test.js.map +0 -1
  71. package/dist/cjs/__tests__/documents.test.d.ts +0 -1
  72. package/dist/cjs/__tests__/documents.test.js +0 -468
  73. package/dist/cjs/__tests__/documents.test.js.map +0 -1
  74. package/dist/cjs/__tests__/fixtures/testStorage.d.ts +0 -76
  75. package/dist/cjs/__tests__/fixtures/testStorage.js +0 -96
  76. package/dist/cjs/__tests__/fixtures/testStorage.js.map +0 -1
  77. package/dist/cjs/__tests__/legacyOids.test.d.ts +0 -1
  78. package/dist/cjs/__tests__/legacyOids.test.js +0 -354
  79. package/dist/cjs/__tests__/legacyOids.test.js.map +0 -1
  80. package/dist/cjs/__tests__/mutations.test.d.ts +0 -1
  81. package/dist/cjs/__tests__/mutations.test.js +0 -48
  82. package/dist/cjs/__tests__/mutations.test.js.map +0 -1
  83. package/dist/cjs/__tests__/queries.test.d.ts +0 -1
  84. package/dist/cjs/__tests__/queries.test.js +0 -323
  85. package/dist/cjs/__tests__/queries.test.js.map +0 -1
  86. package/dist/cjs/__tests__/setup/indexedDB.d.ts +0 -1
  87. package/dist/cjs/__tests__/setup/indexedDB.js +0 -16
  88. package/dist/cjs/__tests__/setup/indexedDB.js.map +0 -1
  89. package/dist/cjs/__tests__/undo.test.d.ts +0 -1
  90. package/dist/cjs/__tests__/undo.test.js +0 -94
  91. package/dist/cjs/__tests__/undo.test.js.map +0 -1
  92. package/dist/cjs/backup.d.ts +0 -10
  93. package/dist/cjs/backup.js +0 -58
  94. package/dist/cjs/backup.js.map +0 -1
  95. package/dist/cjs/client/Client.d.ts +0 -120
  96. package/dist/cjs/client/Client.js +0 -300
  97. package/dist/cjs/client/Client.js.map +0 -1
  98. package/dist/cjs/client/ClientDescriptor.d.ts +0 -76
  99. package/dist/cjs/client/ClientDescriptor.js +0 -213
  100. package/dist/cjs/client/ClientDescriptor.js.map +0 -1
  101. package/dist/cjs/client/constants.d.ts +0 -1
  102. package/dist/cjs/client/constants.js +0 -5
  103. package/dist/cjs/client/constants.js.map +0 -1
  104. package/dist/cjs/constants.d.ts +0 -1
  105. package/dist/cjs/constants.js +0 -5
  106. package/dist/cjs/constants.js.map +0 -1
  107. package/dist/cjs/context.d.ts +0 -38
  108. package/dist/cjs/context.js +0 -3
  109. package/dist/cjs/context.js.map +0 -1
  110. package/dist/cjs/entities/Entity.d.ts +0 -148
  111. package/dist/cjs/entities/Entity.js +0 -711
  112. package/dist/cjs/entities/Entity.js.map +0 -1
  113. package/dist/cjs/entities/Entity.test.d.ts +0 -1
  114. package/dist/cjs/entities/Entity.test.js +0 -194
  115. package/dist/cjs/entities/Entity.test.js.map +0 -1
  116. package/dist/cjs/entities/EntityCache.d.ts +0 -15
  117. package/dist/cjs/entities/EntityCache.js +0 -39
  118. package/dist/cjs/entities/EntityCache.js.map +0 -1
  119. package/dist/cjs/entities/EntityMetadata.d.ts +0 -68
  120. package/dist/cjs/entities/EntityMetadata.js +0 -261
  121. package/dist/cjs/entities/EntityMetadata.js.map +0 -1
  122. package/dist/cjs/entities/EntityStore.d.ts +0 -80
  123. package/dist/cjs/entities/EntityStore.js +0 -352
  124. package/dist/cjs/entities/EntityStore.js.map +0 -1
  125. package/dist/cjs/entities/OperationBatcher.d.ts +0 -52
  126. package/dist/cjs/entities/OperationBatcher.js +0 -165
  127. package/dist/cjs/entities/OperationBatcher.js.map +0 -1
  128. package/dist/cjs/entities/types.d.ts +0 -103
  129. package/dist/cjs/entities/types.js +0 -3
  130. package/dist/cjs/entities/types.js.map +0 -1
  131. package/dist/cjs/files/EntityFile.d.ts +0 -35
  132. package/dist/cjs/files/EntityFile.js +0 -81
  133. package/dist/cjs/files/EntityFile.js.map +0 -1
  134. package/dist/cjs/files/FileManager.d.ts +0 -46
  135. package/dist/cjs/files/FileManager.js +0 -174
  136. package/dist/cjs/files/FileManager.js.map +0 -1
  137. package/dist/cjs/files/FileStorage.d.ts +0 -39
  138. package/dist/cjs/files/FileStorage.js +0 -110
  139. package/dist/cjs/files/FileStorage.js.map +0 -1
  140. package/dist/cjs/files/utils.d.ts +0 -10
  141. package/dist/cjs/files/utils.js +0 -62
  142. package/dist/cjs/files/utils.js.map +0 -1
  143. package/dist/cjs/files/utils.test.d.ts +0 -1
  144. package/dist/cjs/files/utils.test.js +0 -81
  145. package/dist/cjs/files/utils.test.js.map +0 -1
  146. package/dist/cjs/idb.d.ts +0 -13
  147. package/dist/cjs/idb.js +0 -158
  148. package/dist/cjs/idb.js.map +0 -1
  149. package/dist/cjs/index.d.ts +0 -23
  150. package/dist/cjs/index.js +0 -25
  151. package/dist/cjs/index.js.map +0 -1
  152. package/dist/cjs/metadata/AckInfoStore.d.ts +0 -10
  153. package/dist/cjs/metadata/AckInfoStore.js +0 -26
  154. package/dist/cjs/metadata/AckInfoStore.js.map +0 -1
  155. package/dist/cjs/metadata/BaselinesStore.d.ts +0 -40
  156. package/dist/cjs/metadata/BaselinesStore.js +0 -106
  157. package/dist/cjs/metadata/BaselinesStore.js.map +0 -1
  158. package/dist/cjs/metadata/LocalReplicaStore.d.ts +0 -18
  159. package/dist/cjs/metadata/LocalReplicaStore.js +0 -62
  160. package/dist/cjs/metadata/LocalReplicaStore.js.map +0 -1
  161. package/dist/cjs/metadata/MessageCreator.d.ts +0 -19
  162. package/dist/cjs/metadata/MessageCreator.js +0 -128
  163. package/dist/cjs/metadata/MessageCreator.js.map +0 -1
  164. package/dist/cjs/metadata/Metadata.d.ts +0 -134
  165. package/dist/cjs/metadata/Metadata.js +0 -405
  166. package/dist/cjs/metadata/Metadata.js.map +0 -1
  167. package/dist/cjs/metadata/OperationsStore.d.ts +0 -62
  168. package/dist/cjs/metadata/OperationsStore.js +0 -179
  169. package/dist/cjs/metadata/OperationsStore.js.map +0 -1
  170. package/dist/cjs/metadata/SchemaStore.d.ts +0 -9
  171. package/dist/cjs/metadata/SchemaStore.js +0 -39
  172. package/dist/cjs/metadata/SchemaStore.js.map +0 -1
  173. package/dist/cjs/metadata/openMetadataDatabase.d.ts +0 -19
  174. package/dist/cjs/metadata/openMetadataDatabase.js +0 -220
  175. package/dist/cjs/metadata/openMetadataDatabase.js.map +0 -1
  176. package/dist/cjs/migration/db.d.ts +0 -8
  177. package/dist/cjs/migration/db.js +0 -112
  178. package/dist/cjs/migration/db.js.map +0 -1
  179. package/dist/cjs/migration/errors.d.ts +0 -5
  180. package/dist/cjs/migration/errors.js +0 -12
  181. package/dist/cjs/migration/errors.js.map +0 -1
  182. package/dist/cjs/migration/openDatabase.d.ts +0 -20
  183. package/dist/cjs/migration/openDatabase.js +0 -468
  184. package/dist/cjs/migration/openDatabase.js.map +0 -1
  185. package/dist/cjs/migration/paths.d.ts +0 -6
  186. package/dist/cjs/migration/paths.js +0 -53
  187. package/dist/cjs/migration/paths.js.map +0 -1
  188. package/dist/cjs/migration/paths.test.d.ts +0 -1
  189. package/dist/cjs/migration/paths.test.js +0 -91
  190. package/dist/cjs/migration/paths.test.js.map +0 -1
  191. package/dist/cjs/queries/BaseQuery.d.ts +0 -53
  192. package/dist/cjs/queries/BaseQuery.js +0 -148
  193. package/dist/cjs/queries/BaseQuery.js.map +0 -1
  194. package/dist/cjs/queries/CollectionQueries.d.ts +0 -55
  195. package/dist/cjs/queries/CollectionQueries.js +0 -92
  196. package/dist/cjs/queries/CollectionQueries.js.map +0 -1
  197. package/dist/cjs/queries/FindAllQuery.d.ts +0 -12
  198. package/dist/cjs/queries/FindAllQuery.js +0 -44
  199. package/dist/cjs/queries/FindAllQuery.js.map +0 -1
  200. package/dist/cjs/queries/FindInfiniteQuery.d.ts +0 -19
  201. package/dist/cjs/queries/FindInfiniteQuery.js +0 -70
  202. package/dist/cjs/queries/FindInfiniteQuery.js.map +0 -1
  203. package/dist/cjs/queries/FindOneQuery.d.ts +0 -12
  204. package/dist/cjs/queries/FindOneQuery.js +0 -43
  205. package/dist/cjs/queries/FindOneQuery.js.map +0 -1
  206. package/dist/cjs/queries/FindPageQuery.d.ts +0 -24
  207. package/dist/cjs/queries/FindPageQuery.js +0 -77
  208. package/dist/cjs/queries/FindPageQuery.js.map +0 -1
  209. package/dist/cjs/queries/GetQuery.d.ts +0 -10
  210. package/dist/cjs/queries/GetQuery.js +0 -30
  211. package/dist/cjs/queries/GetQuery.js.map +0 -1
  212. package/dist/cjs/queries/QueryCache.d.ts +0 -17
  213. package/dist/cjs/queries/QueryCache.js +0 -46
  214. package/dist/cjs/queries/QueryCache.js.map +0 -1
  215. package/dist/cjs/queries/QueryableStorage.d.ts +0 -20
  216. package/dist/cjs/queries/QueryableStorage.js +0 -94
  217. package/dist/cjs/queries/QueryableStorage.js.map +0 -1
  218. package/dist/cjs/queries/dbQueries.d.ts +0 -22
  219. package/dist/cjs/queries/dbQueries.js +0 -136
  220. package/dist/cjs/queries/dbQueries.js.map +0 -1
  221. package/dist/cjs/queries/keys.d.ts +0 -10
  222. package/dist/cjs/queries/keys.js +0 -34
  223. package/dist/cjs/queries/keys.js.map +0 -1
  224. package/dist/cjs/queries/ranges.d.ts +0 -2
  225. package/dist/cjs/queries/ranges.js +0 -70
  226. package/dist/cjs/queries/ranges.js.map +0 -1
  227. package/dist/cjs/queries/types.d.ts +0 -6
  228. package/dist/cjs/queries/types.js +0 -3
  229. package/dist/cjs/queries/types.js.map +0 -1
  230. package/dist/cjs/queries/utils.d.ts +0 -3
  231. package/dist/cjs/queries/utils.js +0 -25
  232. package/dist/cjs/queries/utils.js.map +0 -1
  233. package/dist/cjs/sync/FileSync.d.ts +0 -24
  234. package/dist/cjs/sync/FileSync.js +0 -87
  235. package/dist/cjs/sync/FileSync.js.map +0 -1
  236. package/dist/cjs/sync/Heartbeat.d.ts +0 -25
  237. package/dist/cjs/sync/Heartbeat.js +0 -64
  238. package/dist/cjs/sync/Heartbeat.js.map +0 -1
  239. package/dist/cjs/sync/PresenceManager.d.ts +0 -55
  240. package/dist/cjs/sync/PresenceManager.js +0 -126
  241. package/dist/cjs/sync/PresenceManager.js.map +0 -1
  242. package/dist/cjs/sync/PushPullSync.d.ts +0 -39
  243. package/dist/cjs/sync/PushPullSync.js +0 -159
  244. package/dist/cjs/sync/PushPullSync.js.map +0 -1
  245. package/dist/cjs/sync/ServerSyncEndpointProvider.d.ts +0 -34
  246. package/dist/cjs/sync/ServerSyncEndpointProvider.js +0 -69
  247. package/dist/cjs/sync/ServerSyncEndpointProvider.js.map +0 -1
  248. package/dist/cjs/sync/Sync.d.ts +0 -160
  249. package/dist/cjs/sync/Sync.js +0 -293
  250. package/dist/cjs/sync/Sync.js.map +0 -1
  251. package/dist/cjs/sync/WebSocketSync.d.ts +0 -44
  252. package/dist/cjs/sync/WebSocketSync.js +0 -221
  253. package/dist/cjs/sync/WebSocketSync.js.map +0 -1
  254. package/dist/cjs/types.d.ts +0 -12
  255. package/dist/cjs/types.js +0 -3
  256. package/dist/cjs/types.js.map +0 -1
  257. package/dist/cjs/utils/Disposable.d.ts +0 -6
  258. package/dist/cjs/utils/Disposable.js +0 -19
  259. package/dist/cjs/utils/Disposable.js.map +0 -1
  260. package/dist/cjs/utils/Resolvable.d.ts +0 -8
  261. package/dist/cjs/utils/Resolvable.js +0 -23
  262. package/dist/cjs/utils/Resolvable.js.map +0 -1
  263. package/dist/cjs/vanilla.d.ts +0 -1
  264. package/dist/cjs/vanilla.js +0 -28
  265. package/dist/cjs/vanilla.js.map +0 -1
  266. package/dist/esm/BackoffScheduler.d.ts +0 -19
  267. package/dist/esm/DocumentManager.d.ts +0 -28
  268. package/dist/esm/FakeWeakRef.d.ts +0 -11
  269. package/dist/esm/IDBService.d.ts +0 -30
  270. package/dist/esm/UndoHistory.d.ts +0 -16
  271. package/dist/esm/__tests__/batching.test.d.ts +0 -1
  272. package/dist/esm/__tests__/documents.test.d.ts +0 -1
  273. package/dist/esm/__tests__/fixtures/testStorage.d.ts +0 -76
  274. package/dist/esm/__tests__/legacyOids.test.d.ts +0 -1
  275. package/dist/esm/__tests__/mutations.test.d.ts +0 -1
  276. package/dist/esm/__tests__/queries.test.d.ts +0 -1
  277. package/dist/esm/__tests__/setup/indexedDB.d.ts +0 -1
  278. package/dist/esm/__tests__/undo.test.d.ts +0 -1
  279. package/dist/esm/backup.d.ts +0 -10
  280. package/dist/esm/client/Client.d.ts +0 -120
  281. package/dist/esm/client/ClientDescriptor.d.ts +0 -76
  282. package/dist/esm/client/constants.d.ts +0 -1
  283. package/dist/esm/constants.d.ts +0 -1
  284. package/dist/esm/context.d.ts +0 -38
  285. package/dist/esm/entities/Entity.d.ts +0 -148
  286. package/dist/esm/entities/Entity.test.d.ts +0 -1
  287. package/dist/esm/entities/EntityCache.d.ts +0 -15
  288. package/dist/esm/entities/EntityMetadata.d.ts +0 -68
  289. package/dist/esm/entities/EntityStore.d.ts +0 -80
  290. package/dist/esm/entities/OperationBatcher.d.ts +0 -52
  291. package/dist/esm/entities/types.d.ts +0 -103
  292. package/dist/esm/files/EntityFile.d.ts +0 -35
  293. package/dist/esm/files/FileManager.d.ts +0 -46
  294. package/dist/esm/files/FileStorage.d.ts +0 -39
  295. package/dist/esm/files/utils.d.ts +0 -10
  296. package/dist/esm/files/utils.test.d.ts +0 -1
  297. package/dist/esm/idb.d.ts +0 -13
  298. package/dist/esm/index.d.ts +0 -23
  299. package/dist/esm/metadata/AckInfoStore.d.ts +0 -10
  300. package/dist/esm/metadata/BaselinesStore.d.ts +0 -40
  301. package/dist/esm/metadata/LocalReplicaStore.d.ts +0 -18
  302. package/dist/esm/metadata/MessageCreator.d.ts +0 -19
  303. package/dist/esm/metadata/Metadata.d.ts +0 -134
  304. package/dist/esm/metadata/OperationsStore.d.ts +0 -62
  305. package/dist/esm/metadata/SchemaStore.d.ts +0 -9
  306. package/dist/esm/metadata/openMetadataDatabase.d.ts +0 -19
  307. package/dist/esm/migration/db.d.ts +0 -8
  308. package/dist/esm/migration/errors.d.ts +0 -5
  309. package/dist/esm/migration/openDatabase.d.ts +0 -20
  310. package/dist/esm/migration/paths.d.ts +0 -6
  311. package/dist/esm/migration/paths.test.d.ts +0 -1
  312. package/dist/esm/queries/BaseQuery.d.ts +0 -53
  313. package/dist/esm/queries/CollectionQueries.d.ts +0 -55
  314. package/dist/esm/queries/FindAllQuery.d.ts +0 -12
  315. package/dist/esm/queries/FindInfiniteQuery.d.ts +0 -19
  316. package/dist/esm/queries/FindOneQuery.d.ts +0 -12
  317. package/dist/esm/queries/FindPageQuery.d.ts +0 -24
  318. package/dist/esm/queries/GetQuery.d.ts +0 -10
  319. package/dist/esm/queries/QueryCache.d.ts +0 -17
  320. package/dist/esm/queries/QueryableStorage.d.ts +0 -20
  321. package/dist/esm/queries/dbQueries.d.ts +0 -22
  322. package/dist/esm/queries/keys.d.ts +0 -10
  323. package/dist/esm/queries/ranges.d.ts +0 -2
  324. package/dist/esm/queries/types.d.ts +0 -6
  325. package/dist/esm/queries/utils.d.ts +0 -3
  326. package/dist/esm/sync/FileSync.d.ts +0 -24
  327. package/dist/esm/sync/Heartbeat.d.ts +0 -25
  328. package/dist/esm/sync/PresenceManager.d.ts +0 -55
  329. package/dist/esm/sync/PushPullSync.d.ts +0 -39
  330. package/dist/esm/sync/ServerSyncEndpointProvider.d.ts +0 -34
  331. package/dist/esm/sync/Sync.d.ts +0 -160
  332. package/dist/esm/sync/WebSocketSync.d.ts +0 -44
  333. package/dist/esm/types.d.ts +0 -12
  334. package/dist/esm/utils/Disposable.d.ts +0 -6
  335. package/dist/esm/utils/Resolvable.d.ts +0 -8
  336. package/dist/esm/vanilla.d.ts +0 -1
  337. package/dist/tsconfig-cjs.tsbuildinfo +0 -1
  338. package/dist/tsconfig.tsbuildinfo +0 -1
@@ -1,165 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.OperationBatcher = void 0;
4
- const common_1 = require("@verdant-web/common");
5
- const DEFAULT_BATCH_KEY = '@@default';
6
- class OperationBatcher {
7
- constructor({ batchTimeout = 200, meta, ctx, entities, }) {
8
- this.currentBatchKey = DEFAULT_BATCH_KEY;
9
- this.flushOperations = async (operations, batchKey, meta) => {
10
- this.ctx.log('debug', 'Flushing', operations.length, 'operations from batch', batchKey, 'to storage / sync');
11
- if (!operations.length)
12
- return;
13
- // rewrite timestamps of all operations to now - this preserves
14
- // the linear history of operations which are sent to the server.
15
- // even if multiple batches are spun up in parallel and flushed
16
- // after delay, the final operations in each one should reflect
17
- // when the batch flushed, not when the changes were made.
18
- // This also corresponds to user-observed behavior, since unconfirmed
19
- // operations are applied universally after confirmed operations locally,
20
- // so even operations which were made before a remote operation but
21
- // have not been confirmed yet will appear to come after the remote one
22
- // despite the provisional timestamp being earlier
23
- // NOTE: this MUST be mutating the original operation object! this timestamp
24
- // also serves as a unique ID for deduplication later.
25
- for (const op of operations) {
26
- op.timestamp = this.meta.now;
27
- }
28
- await this.commitOperations(operations, meta);
29
- };
30
- /**
31
- * Immediately flushes operations to storage / sync.
32
- * Providing source to second arg skips hydrating related
33
- * Entity from storage, which is useful when that Entity
34
- * isn't in storage (i.e. still creating) or just to speed
35
- * up the commit.
36
- */
37
- this.commitOperations = async (operations, meta) => {
38
- if (!operations.length)
39
- return;
40
- // now is the time to decide on what the undo operations will
41
- // look like, based on the confirmed view of the related entities.
42
- if (meta.undoable) {
43
- const undo = await this.createUndo({
44
- ops: operations,
45
- source: meta.source,
46
- });
47
- if (undo)
48
- this.ctx.undoHistory.addUndo(undo);
49
- }
50
- // ship it out to EntityStore to compute final snapshots
51
- // write to storage and refresh entities and queries
52
- await this.entities.addData({
53
- operations,
54
- baselines: [],
55
- isLocal: true,
56
- });
57
- };
58
- /**
59
- * Adds operations to the active batch.
60
- */
61
- this.addOperations = (operations) => {
62
- if (!operations.length)
63
- return;
64
- this.batcher.add({
65
- key: this.currentBatchKey,
66
- items: operations,
67
- });
68
- this.ctx.log(`debug`, 'added', operations.length, 'ops to batch', this.currentBatchKey, ', size = ', this.batcher.getSize(this.currentBatchKey));
69
- };
70
- this.batch = ({ undoable = true, batchName = (0, common_1.generateId)(), max = null, timeout = this.defaultBatchTimeout, } = {}) => {
71
- const internalBatch = this.batcher.add({
72
- key: batchName,
73
- max,
74
- timeout,
75
- items: [],
76
- userData: { undoable },
77
- });
78
- const externalApi = {
79
- run: (fn) => {
80
- // while the provided function runs, operations are forwarded
81
- // to the new batch instead of default. this relies on the function
82
- // being synchronous.
83
- this.currentBatchKey = batchName;
84
- fn();
85
- this.currentBatchKey = DEFAULT_BATCH_KEY;
86
- return externalApi;
87
- },
88
- commit: async () => {
89
- // before running a batch, the default operations must be flushed
90
- // this better preserves undo history behavior...
91
- // if we left the default batch open while flushing a named batch,
92
- // then the default batch would be flushed after the named batch,
93
- // and the default batch could contain operations both prior and
94
- // after the named batch. this would result in a confusing undo
95
- // history where the first undo might reverse changes before and
96
- // after a set of other changes.
97
- await this.batcher.flush(DEFAULT_BATCH_KEY);
98
- return internalBatch.flush();
99
- },
100
- flush: () => externalApi.commit(),
101
- discard: () => {
102
- this.batcher.discard(batchName);
103
- },
104
- };
105
- return externalApi;
106
- };
107
- this.flushAll = () => Promise.all(this.batcher.flushAll());
108
- this.createUndo = async (data) => {
109
- // this can't be done on-demand because we rely on the current
110
- // state of the entities to calculate the inverse operations.
111
- const inverseOps = await this.getInverseOperations(data);
112
- if (!inverseOps.length)
113
- return null;
114
- return async () => {
115
- const redo = await this.createUndo({
116
- ops: inverseOps,
117
- source: data.source,
118
- });
119
- // set time to now for all undo operations, they're happening now.
120
- for (const op of inverseOps) {
121
- op.timestamp = this.meta.now;
122
- }
123
- await this.commitOperations(inverseOps,
124
- // undos should not generate their own undo operations
125
- // since they already calculate redo as the inverse.
126
- { undoable: false });
127
- return redo;
128
- };
129
- };
130
- this.getInverseOperations = async ({ ops, source, }) => {
131
- const grouped = (0, common_1.groupPatchesByOid)(ops);
132
- const inverseOps = [];
133
- const getNow = () => this.meta.now;
134
- await Promise.all(Object.entries(grouped).map(async ([oid, patches]) => {
135
- const entity = source !== null && source !== void 0 ? source : (await this.entities.hydrate((0, common_1.getOidRoot)(oid)));
136
- // TODO: this is getting the rebased baseline? how? are ops being submitted early?
137
- const viewData = entity === null || entity === void 0 ? void 0 : entity.__getViewData__(oid, 'confirmed');
138
- if (!viewData) {
139
- this.ctx.log('warn', 'could not find entity', oid, 'for undo operation', ops);
140
- return;
141
- }
142
- const inverse = (0, common_1.getUndoOperations)(oid, viewData.view, patches, getNow);
143
- inverseOps.unshift(...inverse);
144
- }));
145
- return inverseOps;
146
- };
147
- this.meta = meta;
148
- this.ctx = ctx;
149
- this.entities = entities;
150
- this.defaultBatchTimeout = batchTimeout;
151
- this.batcher = new common_1.Batcher(this.flushOperations);
152
- this.batcher.add({
153
- key: DEFAULT_BATCH_KEY,
154
- items: [],
155
- max: 100,
156
- timeout: batchTimeout,
157
- userData: { undoable: true },
158
- });
159
- }
160
- get isDefaultBatch() {
161
- return this.currentBatchKey === DEFAULT_BATCH_KEY;
162
- }
163
- }
164
- exports.OperationBatcher = OperationBatcher;
165
- //# sourceMappingURL=OperationBatcher.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"OperationBatcher.js","sourceRoot":"","sources":["../../../src/entities/OperationBatcher.ts"],"names":[],"mappings":"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"}
@@ -1,103 +0,0 @@
1
- import { ObjectIdentifier } from '@verdant-web/common';
2
- import type { Entity } from './Entity.js';
3
- export type AccessibleEntityProperty<T> = T extends Array<any> ? number : T extends object ? keyof T : never;
4
- export type DataFromInit<Init> = Init extends {
5
- [key: string]: any;
6
- } ? {
7
- [Key in keyof Init]: Init[Key];
8
- } : Init extends Array<any> ? Init : any;
9
- export type DeletableKeys<T> = keyof {
10
- [Key in keyof T as IfNullableThen<T[Key], Key>]: Key;
11
- };
12
- type IfNullableThen<T, Out> = undefined extends T ? Out : null extends T ? Out : never;
13
- export type EntityShape<E extends Entity<any, any>> = E extends Entity<infer Value, any> ? Value : never;
14
- export type BaseEntityValue = {
15
- [Key: string]: any;
16
- } | any[];
17
- export interface EntityChange {
18
- oid: ObjectIdentifier;
19
- isLocal: boolean;
20
- }
21
- export interface EntityChangeInfo {
22
- isLocal?: boolean;
23
- }
24
- export type EntityEvents = {
25
- change: (info: EntityChangeInfo) => void;
26
- changeDeep: (target: BaseEntity<any, any, any>, info: EntityChangeInfo) => void;
27
- delete: (info: EntityChangeInfo) => void;
28
- restore: (info: EntityChangeInfo) => void;
29
- };
30
- export interface BaseEntity<Init, Value extends BaseEntityValue, Snapshot = DataFromInit<Init>> {
31
- dispose: () => void;
32
- subscribe<EventName extends keyof EntityEvents>(event: EventName, callback: EntityEvents[EventName]): () => void;
33
- get<Key extends keyof Value>(key: Key): Value[Key];
34
- getAll(): Value;
35
- getSnapshot(): Snapshot;
36
- readonly deleted: boolean;
37
- readonly updatedAt: number;
38
- readonly uid: string;
39
- }
40
- export type DeepPartial<T> = T extends object ? {
41
- [P in keyof T]?: DeepPartial<T[P]>;
42
- } : T;
43
- export interface ObjectEntity<Init, Value extends BaseEntityValue, Snapshot = DataFromInit<Init>> extends BaseEntity<Init, Value, Snapshot> {
44
- keys(): string[];
45
- entries(): [string, Exclude<Value[keyof Value], undefined>][];
46
- values(): Exclude<Value[keyof Value], undefined>[];
47
- set<Key extends keyof Init>(key: Key, value: Init[Key]): void;
48
- delete(key: DeletableKeys<Value>): void;
49
- update(value: DeepPartial<Init>, options?: {
50
- /**
51
- * Forces the replacement of sub-objects in the update payload - rather than
52
- * Verdant keeping their identities intact and merging changes, your update
53
- * will replace these objects entirely, overwriting any other changes from other
54
- * sources.
55
- *
56
- * Useful when the update you're making is logically replacing sub-objects, rather
57
- * than simply modifying them.
58
- *
59
- * Default: false
60
- */
61
- replaceSubObjects?: boolean;
62
- /**
63
- * If set to false, this will drop any keys in the object which were
64
- * not provided in your update payload, while also merging the ones that
65
- * were. This option only works for `map` and `any` type fields; you cannot
66
- * use it with defined `object` type fields.
67
- *
68
- * Default: true
69
- */
70
- merge?: boolean;
71
- }): void;
72
- readonly isList: false;
73
- }
74
- export interface ListEntity<Init, Value extends BaseEntityValue, Snapshot = DataFromInit<Init>> extends Iterable<ListItemValue<Value>>, BaseEntity<Init, Value, Snapshot> {
75
- readonly isList: true;
76
- readonly length: number;
77
- push(value: ListItemInit<Init>): void;
78
- insert(index: number, value: ListItemInit<Init>): void;
79
- move(from: number, to: number): void;
80
- moveItem(item: ListItemValue<Value>, to: number): void;
81
- /**
82
- * A Set operation which adds a value if an equivalent value is not already present.
83
- * Object values are never the same.
84
- */
85
- add(value: ListItemValue<Value>): void;
86
- removeAll(item: ListItemValue<Value>): void;
87
- removeFirst(item: ListItemValue<Value>): void;
88
- removeLast(item: ListItemValue<Value>): void;
89
- map<U>(callback: (value: ListItemValue<Value>, index: number) => U): U[];
90
- filter(callback: (value: ListItemValue<Value>, index: number) => boolean): ListItemValue<Value>[];
91
- delete(index: number): void;
92
- has(value: ListItemValue<Value>): boolean;
93
- forEach(callback: (value: ListItemValue<Value>, index: number) => void): void;
94
- some(predicate: (value: ListItemValue<Value>) => boolean): boolean;
95
- every(predicate: (value: ListItemValue<Value>) => boolean): boolean;
96
- find(predicate: (value: ListItemValue<Value>) => boolean): ListItemValue<Value> | undefined;
97
- includes(value: ListItemValue<Value>): boolean;
98
- }
99
- export type AnyEntity<Init, KeyValue extends BaseEntityValue, Snapshot extends any> = ListEntity<Init, KeyValue, Snapshot> | ObjectEntity<Init, KeyValue, Snapshot>;
100
- export type ListItemValue<KeyValue> = KeyValue extends Array<infer T> ? T : never;
101
- export type ListItemInit<Init> = Init extends Array<infer T> ? T : never;
102
- export type EntityDestructured<T extends AnyEntity<any, any, any> | null> = (T extends ListEntity<any, infer KeyValue, any> ? KeyValue : T extends ObjectEntity<any, infer KeyValue, any> ? KeyValue : never) | (T extends null ? null : never);
103
- export {};
@@ -1,3 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- //# sourceMappingURL=types.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/entities/types.ts"],"names":[],"mappings":""}
@@ -1,35 +0,0 @@
1
- import { EventSubscriber, FileData } from '@verdant-web/common';
2
- export type EntityFileEvents = {
3
- change: () => void;
4
- };
5
- export declare const UPDATE: unique symbol;
6
- export declare const MARK_FAILED: unique symbol;
7
- export type EntityFileSnapshot = {
8
- id: string;
9
- url?: string | null;
10
- };
11
- /**
12
- * Provides a consistent interface for files used in an app via
13
- * Entity access.
14
- */
15
- export declare class EntityFile extends EventSubscriber<EntityFileEvents> {
16
- readonly id: string;
17
- private _objectUrl;
18
- private _fileData;
19
- private _loading;
20
- private _failed;
21
- private _downloadRemote;
22
- constructor(id: string, { downloadRemote, }?: {
23
- downloadRemote?: boolean;
24
- });
25
- get downloadRemote(): boolean;
26
- [UPDATE]: (fileData: FileData) => void;
27
- [MARK_FAILED]: () => void;
28
- get url(): string | null;
29
- get name(): string | null;
30
- get type(): string | null;
31
- get loading(): boolean;
32
- get failed(): boolean;
33
- destroy: () => void;
34
- getSnapshot(): EntityFileSnapshot;
35
- }
@@ -1,81 +0,0 @@
1
- "use strict";
2
- var _a, _b;
3
- Object.defineProperty(exports, "__esModule", { value: true });
4
- exports.EntityFile = exports.MARK_FAILED = exports.UPDATE = void 0;
5
- const common_1 = require("@verdant-web/common");
6
- exports.UPDATE = Symbol('entity-file-update');
7
- exports.MARK_FAILED = Symbol('entity-file-mark-failed');
8
- /**
9
- * Provides a consistent interface for files used in an app via
10
- * Entity access.
11
- */
12
- class EntityFile extends common_1.EventSubscriber {
13
- constructor(id, { downloadRemote = false, } = {}) {
14
- super();
15
- this.id = id;
16
- // cached object URL for a local blob file, if applicable
17
- this._objectUrl = null;
18
- this._fileData = null;
19
- this._loading = true;
20
- this._failed = false;
21
- this._downloadRemote = false;
22
- this[_a] = (fileData) => {
23
- this._loading = false;
24
- this._failed = false;
25
- this._fileData = fileData;
26
- if (fileData.file) {
27
- if (this._objectUrl) {
28
- URL.revokeObjectURL(this._objectUrl);
29
- }
30
- this._objectUrl = URL.createObjectURL(fileData.file);
31
- }
32
- this.emit('change');
33
- };
34
- this[_b] = () => {
35
- this._failed = true;
36
- this._loading = false;
37
- this.emit('change');
38
- };
39
- this.destroy = () => {
40
- if (this._objectUrl) {
41
- URL.revokeObjectURL(this._objectUrl);
42
- }
43
- this.dispose();
44
- };
45
- this._downloadRemote = downloadRemote;
46
- }
47
- get downloadRemote() {
48
- return this._downloadRemote;
49
- }
50
- get url() {
51
- var _c, _d;
52
- if (this.loading)
53
- return null;
54
- if (this._objectUrl)
55
- return this._objectUrl;
56
- return (_d = (_c = this._fileData) === null || _c === void 0 ? void 0 : _c.url) !== null && _d !== void 0 ? _d : null;
57
- }
58
- get name() {
59
- var _c, _d;
60
- return (_d = (_c = this._fileData) === null || _c === void 0 ? void 0 : _c.name) !== null && _d !== void 0 ? _d : null;
61
- }
62
- get type() {
63
- var _c, _d;
64
- return (_d = (_c = this._fileData) === null || _c === void 0 ? void 0 : _c.type) !== null && _d !== void 0 ? _d : null;
65
- }
66
- get loading() {
67
- return this._loading;
68
- }
69
- get failed() {
70
- return this._failed;
71
- }
72
- getSnapshot() {
73
- return {
74
- id: this.id,
75
- url: this.loading || this.failed ? undefined : this.url,
76
- };
77
- }
78
- }
79
- exports.EntityFile = EntityFile;
80
- _a = exports.UPDATE, _b = exports.MARK_FAILED;
81
- //# sourceMappingURL=EntityFile.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"EntityFile.js","sourceRoot":"","sources":["../../../src/files/EntityFile.ts"],"names":[],"mappings":";;;;AAAA,gDAAgE;AAMnD,QAAA,MAAM,GAAG,MAAM,CAAC,oBAAoB,CAAC,CAAC;AACtC,QAAA,WAAW,GAAG,MAAM,CAAC,yBAAyB,CAAC,CAAC;AAO7D;;;GAGG;AACH,MAAa,UAAW,SAAQ,wBAAiC;IAQhE,YACiB,EAAU,EAC1B,EACC,cAAc,GAAG,KAAK,MAGnB,EAAE;QAEN,KAAK,EAAE,CAAC;QAPQ,OAAE,GAAF,EAAE,CAAQ;QAR3B,yDAAyD;QACjD,eAAU,GAAkB,IAAI,CAAC;QACjC,cAAS,GAAoB,IAAI,CAAC;QAClC,aAAQ,GAAG,IAAI,CAAC;QAChB,YAAO,GAAG,KAAK,CAAC;QAChB,oBAAe,GAAG,KAAK,CAAC;QAkBhC,QAAQ,GAAG,CAAC,QAAkB,EAAE,EAAE;YACjC,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;YACtB,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;YACrB,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;YAC1B,IAAI,QAAQ,CAAC,IAAI,EAAE;gBAClB,IAAI,IAAI,CAAC,UAAU,EAAE;oBACpB,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;iBACrC;gBACD,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;aACrD;YACD,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACrB,CAAC,CAAC;QAEF,QAAa,GAAG,GAAG,EAAE;YACpB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;YACpB,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;YACtB,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACrB,CAAC,CAAC;QAwBF,YAAO,GAAG,GAAG,EAAE;YACd,IAAI,IAAI,CAAC,UAAU,EAAE;gBACpB,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;aACrC;YACD,IAAI,CAAC,OAAO,EAAE,CAAC;QAChB,CAAC,CAAC;QArDD,IAAI,CAAC,eAAe,GAAG,cAAc,CAAC;IACvC,CAAC;IAED,IAAI,cAAc;QACjB,OAAO,IAAI,CAAC,eAAe,CAAC;IAC7B,CAAC;IAqBD,IAAI,GAAG;;QACN,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC;QAC9B,IAAI,IAAI,CAAC,UAAU;YAAE,OAAO,IAAI,CAAC,UAAU,CAAC;QAC5C,OAAO,MAAA,MAAA,IAAI,CAAC,SAAS,0CAAE,GAAG,mCAAI,IAAI,CAAC;IACpC,CAAC;IAED,IAAI,IAAI;;QACP,OAAO,MAAA,MAAA,IAAI,CAAC,SAAS,0CAAE,IAAI,mCAAI,IAAI,CAAC;IACrC,CAAC;IAED,IAAI,IAAI;;QACP,OAAO,MAAA,MAAA,IAAI,CAAC,SAAS,0CAAE,IAAI,mCAAI,IAAI,CAAC;IACrC,CAAC;IAED,IAAI,OAAO;QACV,OAAO,IAAI,CAAC,QAAQ,CAAC;IACtB,CAAC;IAED,IAAI,MAAM;QACT,OAAO,IAAI,CAAC,OAAO,CAAC;IACrB,CAAC;IASD,WAAW;QACV,OAAO;YACN,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,GAAG,EAAE,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG;SACvD,CAAC;IACH,CAAC;CACD;AA9ED,gCA8EC;KAtDC,cAAM,OAaN,mBAAW"}
@@ -1,46 +0,0 @@
1
- import { FileData } from '@verdant-web/common';
2
- import { Context } from '../context.js';
3
- import { Metadata } from '../metadata/Metadata.js';
4
- import { Sync } from '../sync/Sync.js';
5
- import { EntityFile } from './EntityFile.js';
6
- import { ReturnedFileData } from './FileStorage.js';
7
- export interface FileManagerConfig {
8
- /**
9
- * Override the heuristic for deciding when a deleted file can be cleaned up.
10
- * By default this waits 3 days since deletion, then deletes the file data.
11
- * If the file has been synchronized to a server, it could still be restored
12
- * if the server has not yet deleted it.
13
- */
14
- canCleanupDeletedFile?: (file: ReturnedFileData) => boolean;
15
- }
16
- export declare class FileManager {
17
- private storage;
18
- private sync;
19
- private context;
20
- private files;
21
- private config;
22
- private meta;
23
- constructor({ db, sync, context, meta, config, }: {
24
- db: IDBDatabase;
25
- sync: Sync;
26
- context: Context;
27
- config?: FileManagerConfig;
28
- meta: Metadata;
29
- });
30
- add: (fileInput: Omit<FileData, 'remote'>) => Promise<void>;
31
- private uploadFile;
32
- /**
33
- * Immediately returns an EntityFile to use, then either loads
34
- * the file from cache, local database, or the server.
35
- */
36
- get: (id: string, options?: {
37
- downloadRemote?: boolean;
38
- }) => EntityFile;
39
- private load;
40
- listUnsynced: () => Promise<ReturnedFileData[]>;
41
- exportAll: (downloadRemote?: boolean) => Promise<ReturnedFileData[]>;
42
- importAll: (files: ReturnedFileData[]) => Promise<void>;
43
- private onOnlineChange;
44
- private tryCleanupDeletedFiles;
45
- private handleFileRefsDeleted;
46
- }
@@ -1,174 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.FileManager = void 0;
4
- const EntityFile_js_1 = require("./EntityFile.js");
5
- const FileStorage_js_1 = require("./FileStorage.js");
6
- /**
7
- * Default: if file was deleted > 3 days ago
8
- */
9
- function defaultCanCleanup(fileData) {
10
- return (fileData.deletedAt !== null &&
11
- fileData.deletedAt < Date.now() - 1000 * 60 * 24 * 3);
12
- }
13
- class FileManager {
14
- constructor({ db, sync, context, meta, config = {}, }) {
15
- this.files = new Map();
16
- this.add = async (fileInput) => {
17
- const file = fileInput;
18
- file.remote = false;
19
- // immediately cache the file
20
- if (!this.files.has(file.id)) {
21
- const entityFile = new EntityFile_js_1.EntityFile(file.id);
22
- entityFile[EntityFile_js_1.UPDATE](file);
23
- this.files.set(file.id, entityFile);
24
- }
25
- else {
26
- this.files.get(file.id)[EntityFile_js_1.UPDATE](file);
27
- }
28
- // write to local storage and send to sync immediately
29
- await this.storage.addFile(file);
30
- // send to sync
31
- if (file.file) {
32
- await this.uploadFile(file, 1);
33
- }
34
- };
35
- this.uploadFile = async (file, retries = 0) => {
36
- const result = await this.sync.uploadFile(file);
37
- if (result.success) {
38
- await this.storage.markUploaded(file.id);
39
- }
40
- else {
41
- if (result.retry && retries < 5) {
42
- this.context.log('error', 'Error uploading file, retrying...');
43
- // schedule a retry
44
- setTimeout(this.uploadFile, 1000, file, retries + 1);
45
- }
46
- else {
47
- this.context.log('error', 'Failed to upload file. Not retrying until next sync.');
48
- }
49
- }
50
- };
51
- /**
52
- * Immediately returns an EntityFile to use, then either loads
53
- * the file from cache, local database, or the server.
54
- */
55
- this.get = (id, options) => {
56
- if (this.files.has(id)) {
57
- return this.files.get(id);
58
- }
59
- const file = new EntityFile_js_1.EntityFile(id, options);
60
- this.files.set(id, file);
61
- this.load(file);
62
- return file;
63
- };
64
- this.load = async (file, retries = 0) => {
65
- if (retries > 5) {
66
- this.context.log('error', 'Failed to load file after 5 retries');
67
- file[EntityFile_js_1.MARK_FAILED]();
68
- return;
69
- }
70
- const fileData = await this.storage.getFile(file.id);
71
- if (fileData) {
72
- file[EntityFile_js_1.UPDATE](fileData);
73
- }
74
- else {
75
- // maybe we don't have it yet, it might be on the server still.
76
- try {
77
- const result = await this.sync.getFile(file.id);
78
- if (result.success) {
79
- file[EntityFile_js_1.UPDATE](result.data);
80
- await this.storage.addFile(result.data, {
81
- downloadRemote: file.downloadRemote,
82
- });
83
- }
84
- else {
85
- this.context.log('error', 'Failed to load file', result);
86
- file[EntityFile_js_1.MARK_FAILED]();
87
- if (result.retry) {
88
- // schedule a retry
89
- setTimeout(this.load, 1000, file, retries + 1);
90
- }
91
- }
92
- }
93
- catch (err) {
94
- this.context.log('error', 'Failed to load file', err);
95
- file[EntityFile_js_1.MARK_FAILED]();
96
- // schedule a retry
97
- setTimeout(this.load, 1000, file, retries + 1);
98
- }
99
- }
100
- };
101
- this.listUnsynced = async () => {
102
- return this.storage.listUnsynced();
103
- };
104
- this.exportAll = async (downloadRemote = false) => {
105
- const storedFiles = await this.storage.getAll();
106
- if (downloadRemote) {
107
- for (const storedFile of storedFiles) {
108
- // if it doesn't have a buffer, we need to read
109
- // one from the server
110
- if (!storedFile.file && storedFile.url) {
111
- try {
112
- const blob = await fetch(storedFile.url, {
113
- method: 'GET',
114
- credentials: 'include',
115
- }).then((r) => r.blob());
116
- storedFile.file = blob;
117
- }
118
- catch (err) {
119
- this.context.log('error', "Failed to download file to cache it locally. The file will still be available using its URL. Check the file server's CORS configuration.", err);
120
- }
121
- }
122
- }
123
- }
124
- return storedFiles;
125
- };
126
- this.importAll = async (files) => {
127
- await Promise.all(files.map((file) => this.add(file)));
128
- };
129
- this.onOnlineChange = async (online) => {
130
- // if online, try to upload any unsynced files
131
- if (online) {
132
- const unsynced = await this.listUnsynced();
133
- await Promise.all(unsynced.map(this.uploadFile));
134
- }
135
- };
136
- this.tryCleanupDeletedFiles = async () => {
137
- let count = 0;
138
- let skipCount = 0;
139
- await this.storage.iterateOverPendingDelete((fileData, store) => {
140
- if (this.config.canCleanupDeletedFile(fileData)) {
141
- count++;
142
- store.delete(fileData.id);
143
- }
144
- else {
145
- skipCount++;
146
- }
147
- });
148
- this.context.log('info', `Cleaned up ${count} files, skipped ${skipCount} files`);
149
- };
150
- this.handleFileRefsDeleted = async (fileRefs) => {
151
- const tx = this.storage.createTransaction(['files'], { mode: 'readwrite' });
152
- await Promise.all(fileRefs.map(async (fileRef) => {
153
- try {
154
- await this.storage.markPendingDelete(fileRef.id, { transaction: tx });
155
- }
156
- catch (err) {
157
- this.context.log('error', 'Failed to mark file for deletion', err);
158
- }
159
- }));
160
- this.context.log('info', `Marked ${fileRefs.length} files as pending delete`);
161
- };
162
- this.storage = new FileStorage_js_1.FileStorage(db);
163
- this.sync = sync;
164
- this.context = context;
165
- this.meta = meta;
166
- this.config = Object.assign({ canCleanupDeletedFile: defaultCanCleanup }, config);
167
- this.sync.subscribe('onlineChange', this.onOnlineChange);
168
- this.meta.subscribe('filesDeleted', this.handleFileRefsDeleted);
169
- // check on startup to see if files can be cleaned up
170
- this.tryCleanupDeletedFiles();
171
- }
172
- }
173
- exports.FileManager = FileManager;
174
- //# sourceMappingURL=FileManager.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"FileManager.js","sourceRoot":"","sources":["../../../src/files/FileManager.ts"],"names":[],"mappings":"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"}