@connecttomahdi/rxdb 17.0.0-beta.17 → 17.1.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 (379) hide show
  1. package/AGENTS.md +4 -0
  2. package/CHANGELOG.md +47 -4
  3. package/CLAUDE.md +2 -0
  4. package/dist/cjs/change-event-buffer.js +2 -1
  5. package/dist/cjs/change-event-buffer.js.map +1 -1
  6. package/dist/cjs/custom-index.js +85 -12
  7. package/dist/cjs/custom-index.js.map +1 -1
  8. package/dist/cjs/doc-cache.js +117 -35
  9. package/dist/cjs/doc-cache.js.map +1 -1
  10. package/dist/cjs/event-reduce.js +10 -1
  11. package/dist/cjs/event-reduce.js.map +1 -1
  12. package/dist/cjs/plugin-helpers.js +16 -0
  13. package/dist/cjs/plugin-helpers.js.map +1 -1
  14. package/dist/cjs/plugins/attachments/index.js +3 -3
  15. package/dist/cjs/plugins/attachments/index.js.map +1 -1
  16. package/dist/cjs/plugins/cleanup/cleanup.js +5 -3
  17. package/dist/cjs/plugins/cleanup/cleanup.js.map +1 -1
  18. package/dist/cjs/plugins/crdt/index.js +52 -0
  19. package/dist/cjs/plugins/crdt/index.js.map +1 -1
  20. package/dist/cjs/plugins/dev-mode/check-query.js +7 -1
  21. package/dist/cjs/plugins/dev-mode/check-query.js.map +1 -1
  22. package/dist/cjs/plugins/dev-mode/check-schema.js +2 -1
  23. package/dist/cjs/plugins/dev-mode/check-schema.js.map +1 -1
  24. package/dist/cjs/plugins/dev-mode/error-messages.js +43 -5
  25. package/dist/cjs/plugins/dev-mode/error-messages.js.map +1 -1
  26. package/dist/cjs/plugins/encryption-crypto-js/index.js +22 -6
  27. package/dist/cjs/plugins/encryption-crypto-js/index.js.map +1 -1
  28. package/dist/cjs/plugins/leader-election/index.js +5 -5
  29. package/dist/cjs/plugins/leader-election/index.js.map +1 -1
  30. package/dist/cjs/plugins/local-documents/local-documents.js +20 -13
  31. package/dist/cjs/plugins/local-documents/local-documents.js.map +1 -1
  32. package/dist/cjs/plugins/migration-schema/migration-helpers.js +3 -0
  33. package/dist/cjs/plugins/migration-schema/migration-helpers.js.map +1 -1
  34. package/dist/cjs/plugins/migration-schema/rx-migration-state.js +1 -1
  35. package/dist/cjs/plugins/migration-schema/rx-migration-state.js.map +1 -1
  36. package/dist/cjs/plugins/pipeline/rx-pipeline.js +5 -1
  37. package/dist/cjs/plugins/pipeline/rx-pipeline.js.map +1 -1
  38. package/dist/cjs/plugins/query-builder/mquery/nosql-query-builder.js +4 -2
  39. package/dist/cjs/plugins/query-builder/mquery/nosql-query-builder.js.map +1 -1
  40. package/dist/cjs/plugins/replication/index.js +40 -2
  41. package/dist/cjs/plugins/replication/index.js.map +1 -1
  42. package/dist/cjs/plugins/replication-google-drive/document-handling.js +17 -6
  43. package/dist/cjs/plugins/replication-google-drive/document-handling.js.map +1 -1
  44. package/dist/cjs/plugins/replication-google-drive/google-drive-helper.js +1 -1
  45. package/dist/cjs/plugins/replication-google-drive/google-drive-helper.js.map +1 -1
  46. package/dist/cjs/plugins/replication-google-drive/google-drive-types.js.map +1 -1
  47. package/dist/cjs/plugins/replication-google-drive/signaling.js +4 -1
  48. package/dist/cjs/plugins/replication-google-drive/signaling.js.map +1 -1
  49. package/dist/cjs/plugins/replication-google-drive/upstream.js +7 -4
  50. package/dist/cjs/plugins/replication-google-drive/upstream.js.map +1 -1
  51. package/dist/cjs/plugins/replication-microsoft-onedrive/signaling.js +4 -1
  52. package/dist/cjs/plugins/replication-microsoft-onedrive/signaling.js.map +1 -1
  53. package/dist/cjs/plugins/state/rx-state.js +14 -3
  54. package/dist/cjs/plugins/state/rx-state.js.map +1 -1
  55. package/dist/cjs/plugins/storage-dexie/rx-storage-instance-dexie.js +10 -17
  56. package/dist/cjs/plugins/storage-dexie/rx-storage-instance-dexie.js.map +1 -1
  57. package/dist/cjs/plugins/storage-memory/binary-search-bounds.js +112 -40
  58. package/dist/cjs/plugins/storage-memory/binary-search-bounds.js.map +1 -1
  59. package/dist/cjs/plugins/storage-memory/memory-helper.js +127 -40
  60. package/dist/cjs/plugins/storage-memory/memory-helper.js.map +1 -1
  61. package/dist/cjs/plugins/storage-memory/memory-indexes.js +1 -0
  62. package/dist/cjs/plugins/storage-memory/memory-indexes.js.map +1 -1
  63. package/dist/cjs/plugins/storage-memory/memory-types.js.map +1 -1
  64. package/dist/cjs/plugins/storage-memory/rx-storage-instance-memory.js +97 -37
  65. package/dist/cjs/plugins/storage-memory/rx-storage-instance-memory.js.map +1 -1
  66. package/dist/cjs/plugins/storage-mongodb/mongodb-helper.js +42 -1
  67. package/dist/cjs/plugins/storage-mongodb/mongodb-helper.js.map +1 -1
  68. package/dist/cjs/plugins/storage-mongodb/rx-storage-instance-mongodb.js +7 -7
  69. package/dist/cjs/plugins/storage-mongodb/rx-storage-instance-mongodb.js.map +1 -1
  70. package/dist/cjs/plugins/test-utils/config.js +1 -1
  71. package/dist/cjs/plugins/test-utils/config.js.map +1 -1
  72. package/dist/cjs/plugins/test-utils/performance.js +122 -92
  73. package/dist/cjs/plugins/test-utils/performance.js.map +1 -1
  74. package/dist/cjs/plugins/test-utils/schema-objects.js +1 -1
  75. package/dist/cjs/plugins/test-utils/schema-objects.js.map +1 -1
  76. package/dist/cjs/plugins/test-utils/test-util.js +62 -0
  77. package/dist/cjs/plugins/test-utils/test-util.js.map +1 -1
  78. package/dist/cjs/plugins/utils/utils-map.js +2 -2
  79. package/dist/cjs/plugins/utils/utils-map.js.map +1 -1
  80. package/dist/cjs/plugins/utils/utils-object-deep-equal.js +3 -2
  81. package/dist/cjs/plugins/utils/utils-object-deep-equal.js.map +1 -1
  82. package/dist/cjs/plugins/utils/utils-object-dot-prop.js +25 -0
  83. package/dist/cjs/plugins/utils/utils-object-dot-prop.js.map +1 -1
  84. package/dist/cjs/plugins/utils/utils-object.js +102 -27
  85. package/dist/cjs/plugins/utils/utils-object.js.map +1 -1
  86. package/dist/cjs/plugins/utils/utils-other.js +9 -4
  87. package/dist/cjs/plugins/utils/utils-other.js.map +1 -1
  88. package/dist/cjs/plugins/utils/utils-premium.js +1 -19
  89. package/dist/cjs/plugins/utils/utils-premium.js.map +1 -1
  90. package/dist/cjs/plugins/utils/utils-revision.js +20 -10
  91. package/dist/cjs/plugins/utils/utils-revision.js.map +1 -1
  92. package/dist/cjs/plugins/utils/utils-rxdb-version.js +1 -1
  93. package/dist/cjs/plugins/utils/utils-rxdb-version.js.map +1 -1
  94. package/dist/cjs/plugins/utils/utils-string.js +11 -8
  95. package/dist/cjs/plugins/utils/utils-string.js.map +1 -1
  96. package/dist/cjs/plugins/utils/utils-time.js +21 -16
  97. package/dist/cjs/plugins/utils/utils-time.js.map +1 -1
  98. package/dist/cjs/query-cache.js +6 -4
  99. package/dist/cjs/query-cache.js.map +1 -1
  100. package/dist/cjs/query-planner.js +2 -2
  101. package/dist/cjs/query-planner.js.map +1 -1
  102. package/dist/cjs/replication-protocol/downstream.js +1 -1
  103. package/dist/cjs/replication-protocol/downstream.js.map +1 -1
  104. package/dist/cjs/rx-collection-helper.js +11 -6
  105. package/dist/cjs/rx-collection-helper.js.map +1 -1
  106. package/dist/cjs/rx-collection.js +34 -6
  107. package/dist/cjs/rx-collection.js.map +1 -1
  108. package/dist/cjs/rx-database.js +40 -7
  109. package/dist/cjs/rx-database.js.map +1 -1
  110. package/dist/cjs/rx-document.js +10 -3
  111. package/dist/cjs/rx-document.js.map +1 -1
  112. package/dist/cjs/rx-query-helper.js +35 -12
  113. package/dist/cjs/rx-query-helper.js.map +1 -1
  114. package/dist/cjs/rx-query-single-result.js +9 -2
  115. package/dist/cjs/rx-query-single-result.js.map +1 -1
  116. package/dist/cjs/rx-query.js +72 -29
  117. package/dist/cjs/rx-query.js.map +1 -1
  118. package/dist/cjs/rx-schema-helper.js +9 -3
  119. package/dist/cjs/rx-schema-helper.js.map +1 -1
  120. package/dist/cjs/rx-schema.js +1 -0
  121. package/dist/cjs/rx-schema.js.map +1 -1
  122. package/dist/cjs/rx-storage-helper.js +212 -129
  123. package/dist/cjs/rx-storage-helper.js.map +1 -1
  124. package/dist/cjs/types/rx-error.d.js.map +1 -1
  125. package/dist/cjs/types/rx-schema.d.js.map +1 -1
  126. package/dist/esm/change-event-buffer.js +2 -1
  127. package/dist/esm/change-event-buffer.js.map +1 -1
  128. package/dist/esm/custom-index.js +85 -12
  129. package/dist/esm/custom-index.js.map +1 -1
  130. package/dist/esm/doc-cache.js +118 -36
  131. package/dist/esm/doc-cache.js.map +1 -1
  132. package/dist/esm/event-reduce.js +10 -1
  133. package/dist/esm/event-reduce.js.map +1 -1
  134. package/dist/esm/plugin-helpers.js +16 -0
  135. package/dist/esm/plugin-helpers.js.map +1 -1
  136. package/dist/esm/plugins/attachments/index.js +3 -3
  137. package/dist/esm/plugins/attachments/index.js.map +1 -1
  138. package/dist/esm/plugins/cleanup/cleanup.js +5 -3
  139. package/dist/esm/plugins/cleanup/cleanup.js.map +1 -1
  140. package/dist/esm/plugins/crdt/index.js +52 -0
  141. package/dist/esm/plugins/crdt/index.js.map +1 -1
  142. package/dist/esm/plugins/dev-mode/check-query.js +7 -1
  143. package/dist/esm/plugins/dev-mode/check-query.js.map +1 -1
  144. package/dist/esm/plugins/dev-mode/check-schema.js +2 -1
  145. package/dist/esm/plugins/dev-mode/check-schema.js.map +1 -1
  146. package/dist/esm/plugins/dev-mode/error-messages.js +43 -5
  147. package/dist/esm/plugins/dev-mode/error-messages.js.map +1 -1
  148. package/dist/esm/plugins/encryption-crypto-js/index.js +22 -6
  149. package/dist/esm/plugins/encryption-crypto-js/index.js.map +1 -1
  150. package/dist/esm/plugins/leader-election/index.js +4 -4
  151. package/dist/esm/plugins/leader-election/index.js.map +1 -1
  152. package/dist/esm/plugins/local-documents/local-documents.js +20 -13
  153. package/dist/esm/plugins/local-documents/local-documents.js.map +1 -1
  154. package/dist/esm/plugins/migration-schema/migration-helpers.js +3 -0
  155. package/dist/esm/plugins/migration-schema/migration-helpers.js.map +1 -1
  156. package/dist/esm/plugins/migration-schema/rx-migration-state.js +1 -1
  157. package/dist/esm/plugins/migration-schema/rx-migration-state.js.map +1 -1
  158. package/dist/esm/plugins/pipeline/rx-pipeline.js +5 -1
  159. package/dist/esm/plugins/pipeline/rx-pipeline.js.map +1 -1
  160. package/dist/esm/plugins/query-builder/mquery/nosql-query-builder.js +4 -2
  161. package/dist/esm/plugins/query-builder/mquery/nosql-query-builder.js.map +1 -1
  162. package/dist/esm/plugins/replication/index.js +40 -2
  163. package/dist/esm/plugins/replication/index.js.map +1 -1
  164. package/dist/esm/plugins/replication-google-drive/document-handling.js +17 -6
  165. package/dist/esm/plugins/replication-google-drive/document-handling.js.map +1 -1
  166. package/dist/esm/plugins/replication-google-drive/google-drive-helper.js +1 -1
  167. package/dist/esm/plugins/replication-google-drive/google-drive-helper.js.map +1 -1
  168. package/dist/esm/plugins/replication-google-drive/google-drive-types.js.map +1 -1
  169. package/dist/esm/plugins/replication-google-drive/signaling.js +4 -1
  170. package/dist/esm/plugins/replication-google-drive/signaling.js.map +1 -1
  171. package/dist/esm/plugins/replication-google-drive/upstream.js +7 -4
  172. package/dist/esm/plugins/replication-google-drive/upstream.js.map +1 -1
  173. package/dist/esm/plugins/replication-microsoft-onedrive/signaling.js +4 -1
  174. package/dist/esm/plugins/replication-microsoft-onedrive/signaling.js.map +1 -1
  175. package/dist/esm/plugins/state/rx-state.js +15 -4
  176. package/dist/esm/plugins/state/rx-state.js.map +1 -1
  177. package/dist/esm/plugins/storage-dexie/rx-storage-instance-dexie.js +11 -18
  178. package/dist/esm/plugins/storage-dexie/rx-storage-instance-dexie.js.map +1 -1
  179. package/dist/esm/plugins/storage-memory/binary-search-bounds.js +107 -40
  180. package/dist/esm/plugins/storage-memory/binary-search-bounds.js.map +1 -1
  181. package/dist/esm/plugins/storage-memory/memory-helper.js +128 -41
  182. package/dist/esm/plugins/storage-memory/memory-helper.js.map +1 -1
  183. package/dist/esm/plugins/storage-memory/memory-indexes.js +1 -0
  184. package/dist/esm/plugins/storage-memory/memory-indexes.js.map +1 -1
  185. package/dist/esm/plugins/storage-memory/memory-types.js.map +1 -1
  186. package/dist/esm/plugins/storage-memory/rx-storage-instance-memory.js +90 -30
  187. package/dist/esm/plugins/storage-memory/rx-storage-instance-memory.js.map +1 -1
  188. package/dist/esm/plugins/storage-mongodb/mongodb-helper.js +39 -0
  189. package/dist/esm/plugins/storage-mongodb/mongodb-helper.js.map +1 -1
  190. package/dist/esm/plugins/storage-mongodb/rx-storage-instance-mongodb.js +8 -8
  191. package/dist/esm/plugins/storage-mongodb/rx-storage-instance-mongodb.js.map +1 -1
  192. package/dist/esm/plugins/test-utils/config.js +1 -1
  193. package/dist/esm/plugins/test-utils/config.js.map +1 -1
  194. package/dist/esm/plugins/test-utils/performance.js +122 -92
  195. package/dist/esm/plugins/test-utils/performance.js.map +1 -1
  196. package/dist/esm/plugins/test-utils/schema-objects.js +1 -1
  197. package/dist/esm/plugins/test-utils/schema-objects.js.map +1 -1
  198. package/dist/esm/plugins/test-utils/test-util.js +59 -0
  199. package/dist/esm/plugins/test-utils/test-util.js.map +1 -1
  200. package/dist/esm/plugins/utils/utils-map.js +2 -2
  201. package/dist/esm/plugins/utils/utils-map.js.map +1 -1
  202. package/dist/esm/plugins/utils/utils-object-deep-equal.js +3 -2
  203. package/dist/esm/plugins/utils/utils-object-deep-equal.js.map +1 -1
  204. package/dist/esm/plugins/utils/utils-object-dot-prop.js +25 -0
  205. package/dist/esm/plugins/utils/utils-object-dot-prop.js.map +1 -1
  206. package/dist/esm/plugins/utils/utils-object.js +102 -27
  207. package/dist/esm/plugins/utils/utils-object.js.map +1 -1
  208. package/dist/esm/plugins/utils/utils-other.js +9 -4
  209. package/dist/esm/plugins/utils/utils-other.js.map +1 -1
  210. package/dist/esm/plugins/utils/utils-premium.js +1 -19
  211. package/dist/esm/plugins/utils/utils-premium.js.map +1 -1
  212. package/dist/esm/plugins/utils/utils-revision.js +20 -10
  213. package/dist/esm/plugins/utils/utils-revision.js.map +1 -1
  214. package/dist/esm/plugins/utils/utils-rxdb-version.js +1 -1
  215. package/dist/esm/plugins/utils/utils-rxdb-version.js.map +1 -1
  216. package/dist/esm/plugins/utils/utils-string.js +11 -8
  217. package/dist/esm/plugins/utils/utils-string.js.map +1 -1
  218. package/dist/esm/plugins/utils/utils-time.js +21 -16
  219. package/dist/esm/plugins/utils/utils-time.js.map +1 -1
  220. package/dist/esm/query-cache.js +7 -5
  221. package/dist/esm/query-cache.js.map +1 -1
  222. package/dist/esm/query-planner.js +2 -2
  223. package/dist/esm/query-planner.js.map +1 -1
  224. package/dist/esm/replication-protocol/downstream.js +1 -1
  225. package/dist/esm/replication-protocol/downstream.js.map +1 -1
  226. package/dist/esm/rx-collection-helper.js +12 -7
  227. package/dist/esm/rx-collection-helper.js.map +1 -1
  228. package/dist/esm/rx-collection.js +35 -7
  229. package/dist/esm/rx-collection.js.map +1 -1
  230. package/dist/esm/rx-database.js +40 -7
  231. package/dist/esm/rx-database.js.map +1 -1
  232. package/dist/esm/rx-document.js +11 -4
  233. package/dist/esm/rx-document.js.map +1 -1
  234. package/dist/esm/rx-query-helper.js +35 -12
  235. package/dist/esm/rx-query-helper.js.map +1 -1
  236. package/dist/esm/rx-query-single-result.js +10 -3
  237. package/dist/esm/rx-query-single-result.js.map +1 -1
  238. package/dist/esm/rx-query.js +72 -29
  239. package/dist/esm/rx-query.js.map +1 -1
  240. package/dist/esm/rx-schema-helper.js +9 -3
  241. package/dist/esm/rx-schema-helper.js.map +1 -1
  242. package/dist/esm/rx-schema.js +1 -0
  243. package/dist/esm/rx-schema.js.map +1 -1
  244. package/dist/esm/rx-storage-helper.js +176 -94
  245. package/dist/esm/rx-storage-helper.js.map +1 -1
  246. package/dist/esm/types/rx-error.d.js.map +1 -1
  247. package/dist/esm/types/rx-schema.d.js.map +1 -1
  248. package/dist/types/custom-index.d.ts +5 -0
  249. package/dist/types/doc-cache.d.ts +1 -1
  250. package/dist/types/index.d.ts +25 -26
  251. package/dist/types/plugins/dev-mode/error-messages.d.ts +36 -0
  252. package/dist/types/plugins/leader-election/index.d.ts +1 -0
  253. package/dist/types/plugins/replication-google-drive/document-handling.d.ts +4 -1
  254. package/dist/types/plugins/replication-google-drive/google-drive-types.d.ts +1 -0
  255. package/dist/types/plugins/state/rx-state.d.ts +1 -1
  256. package/dist/types/plugins/storage-denokv/index.d.ts +1 -1
  257. package/dist/types/plugins/storage-dexie/rx-storage-dexie.d.ts +1 -1
  258. package/dist/types/plugins/storage-localstorage/index.d.ts +1 -1
  259. package/dist/types/plugins/storage-memory/binary-search-bounds.d.ts +21 -10
  260. package/dist/types/plugins/storage-memory/memory-helper.d.ts +7 -3
  261. package/dist/types/plugins/storage-memory/memory-types.d.ts +5 -0
  262. package/dist/types/plugins/storage-mongodb/mongodb-helper.d.ts +9 -1
  263. package/dist/types/plugins/storage-mongodb/rx-storage-instance-mongodb.d.ts +2 -2
  264. package/dist/types/plugins/storage-mongodb/rx-storage-mongodb.d.ts +1 -1
  265. package/dist/types/plugins/storage-remote/rx-storage-remote.d.ts +1 -1
  266. package/dist/types/plugins/storage-sqlite/index.d.ts +1 -1
  267. package/dist/types/plugins/test-utils/performance.d.ts +36 -0
  268. package/dist/types/plugins/test-utils/test-util.d.ts +17 -0
  269. package/dist/types/plugins/utils/utils-object.d.ts +8 -3
  270. package/dist/types/plugins/utils/utils-premium.d.ts +0 -2
  271. package/dist/types/plugins/utils/utils-rxdb-version.d.ts +1 -1
  272. package/dist/types/rx-database.d.ts +1 -1
  273. package/dist/types/rx-query-single-result.d.ts +1 -1
  274. package/dist/types/rx-query.d.ts +3 -2
  275. package/dist/types/rx-storage-helper.d.ts +15 -0
  276. package/eslint.config.mjs +2 -1
  277. package/package.json +732 -729
  278. package/scripts/check-code-block-line-length.js +91 -0
  279. package/scripts/check-em-dashes.js +53 -0
  280. package/scripts/docs-fetch-git-history.mjs +36 -0
  281. package/scripts/install-foundationdb.sh +0 -6
  282. package/scripts/notify-indexnow.mjs +171 -0
  283. package/scripts/start-foundationdb-docker.sh +73 -0
  284. package/src/change-event-buffer.ts +4 -1
  285. package/src/custom-index.ts +93 -16
  286. package/src/doc-cache.ts +117 -41
  287. package/src/event-reduce.ts +10 -1
  288. package/src/plugin-helpers.ts +10 -0
  289. package/src/plugins/attachments/index.ts +10 -12
  290. package/src/plugins/cleanup/cleanup.ts +5 -3
  291. package/src/plugins/crdt/index.ts +55 -0
  292. package/src/plugins/dev-mode/check-query.ts +7 -1
  293. package/src/plugins/dev-mode/check-schema.ts +2 -1
  294. package/src/plugins/dev-mode/error-messages.ts +45 -5
  295. package/src/plugins/encryption-crypto-js/index.ts +18 -6
  296. package/src/plugins/leader-election/index.ts +9 -8
  297. package/src/plugins/local-documents/local-documents.ts +21 -12
  298. package/src/plugins/migration-schema/migration-helpers.ts +3 -0
  299. package/src/plugins/migration-schema/rx-migration-state.ts +1 -1
  300. package/src/plugins/pipeline/rx-pipeline.ts +5 -1
  301. package/src/plugins/query-builder/mquery/nosql-query-builder.ts +8 -2
  302. package/src/plugins/replication/index.ts +41 -3
  303. package/src/plugins/replication-google-drive/document-handling.ts +17 -5
  304. package/src/plugins/replication-google-drive/google-drive-helper.ts +1 -1
  305. package/src/plugins/replication-google-drive/google-drive-types.ts +1 -0
  306. package/src/plugins/replication-google-drive/signaling.ts +4 -1
  307. package/src/plugins/replication-google-drive/upstream.ts +7 -4
  308. package/src/plugins/replication-microsoft-onedrive/signaling.ts +4 -1
  309. package/src/plugins/state/rx-state.ts +17 -5
  310. package/src/plugins/storage-dexie/rx-storage-instance-dexie.ts +0 -27
  311. package/src/plugins/storage-memory/binary-search-bounds.ts +105 -40
  312. package/src/plugins/storage-memory/memory-helper.ts +158 -67
  313. package/src/plugins/storage-memory/memory-indexes.ts +1 -0
  314. package/src/plugins/storage-memory/memory-types.ts +5 -0
  315. package/src/plugins/storage-memory/rx-storage-instance-memory.ts +104 -53
  316. package/src/plugins/storage-mongodb/mongodb-helper.ts +43 -1
  317. package/src/plugins/storage-mongodb/rx-storage-instance-mongodb.ts +11 -9
  318. package/src/plugins/test-utils/config.ts +2 -1
  319. package/src/plugins/test-utils/performance.ts +159 -85
  320. package/src/plugins/test-utils/schema-objects.ts +1 -1
  321. package/src/plugins/test-utils/test-util.ts +71 -0
  322. package/src/plugins/utils/utils-map.ts +2 -2
  323. package/src/plugins/utils/utils-object-deep-equal.ts +2 -4
  324. package/src/plugins/utils/utils-object-dot-prop.ts +25 -0
  325. package/src/plugins/utils/utils-object.ts +103 -28
  326. package/src/plugins/utils/utils-other.ts +9 -4
  327. package/src/plugins/utils/utils-premium.ts +11 -37
  328. package/src/plugins/utils/utils-revision.ts +20 -9
  329. package/src/plugins/utils/utils-rxdb-version.ts +1 -1
  330. package/src/plugins/utils/utils-string.ts +11 -9
  331. package/src/plugins/utils/utils-time.ts +21 -17
  332. package/src/query-cache.ts +6 -5
  333. package/src/query-planner.ts +2 -2
  334. package/src/replication-protocol/downstream.ts +1 -1
  335. package/src/rx-collection-helper.ts +12 -6
  336. package/src/rx-collection.ts +39 -8
  337. package/src/rx-database.ts +49 -17
  338. package/src/rx-document.ts +12 -3
  339. package/src/rx-query-helper.ts +36 -15
  340. package/src/rx-query-single-result.ts +10 -3
  341. package/src/rx-query.ts +48 -8
  342. package/src/rx-schema-helper.ts +7 -4
  343. package/src/rx-schema.ts +1 -0
  344. package/src/rx-storage-helper.ts +210 -139
  345. package/src/types/rx-error.d.ts +3 -0
  346. package/src/types/rx-schema.d.ts +5 -0
  347. package/dist/esm/package.json +0 -1
  348. package/dist/types/types/conflict-handling.d.ts +0 -48
  349. package/dist/types/types/couchdb.d.ts +0 -293
  350. package/dist/types/types/index.d.ts +0 -32
  351. package/dist/types/types/modules/index.d.ts +0 -0
  352. package/dist/types/types/modules/mocha.parallel.d.ts +0 -1
  353. package/dist/types/types/plugins/backup.d.ts +0 -35
  354. package/dist/types/types/plugins/cleanup.d.ts +0 -38
  355. package/dist/types/types/plugins/crdt.d.ts +0 -76
  356. package/dist/types/types/plugins/dexie.d.ts +0 -30
  357. package/dist/types/types/plugins/local-documents.d.ts +0 -49
  358. package/dist/types/types/plugins/migration.d.ts +0 -14
  359. package/dist/types/types/plugins/reactivity.d.ts +0 -40
  360. package/dist/types/types/plugins/replication-graphql.d.ts +0 -98
  361. package/dist/types/types/plugins/replication.d.ts +0 -175
  362. package/dist/types/types/plugins/state.d.ts +0 -4
  363. package/dist/types/types/plugins/update.d.ts +0 -23
  364. package/dist/types/types/plugins/webmcp.d.ts +0 -40
  365. package/dist/types/types/query-planner.d.ts +0 -47
  366. package/dist/types/types/replication-protocol.d.ts +0 -296
  367. package/dist/types/types/rx-attachment.d.ts +0 -46
  368. package/dist/types/types/rx-change-event.d.ts +0 -85
  369. package/dist/types/types/rx-collection.d.ts +0 -117
  370. package/dist/types/types/rx-database-internal-store.d.ts +0 -54
  371. package/dist/types/types/rx-database.d.ts +0 -124
  372. package/dist/types/types/rx-document.d.ts +0 -160
  373. package/dist/types/types/rx-error.d.ts +0 -222
  374. package/dist/types/types/rx-plugin.d.ts +0 -167
  375. package/dist/types/types/rx-query.d.ts +0 -144
  376. package/dist/types/types/rx-schema.d.ts +0 -209
  377. package/dist/types/types/rx-storage.d.ts +0 -347
  378. package/dist/types/types/rx-storage.interface.d.ts +0 -312
  379. package/dist/types/types/util.d.ts +0 -180
@@ -1 +1 @@
1
- {"version":3,"file":"event-reduce.js","names":["calculateActionName","runAction","rxChangeEventToEventReduceChangeEvent","clone","ensureNotFalsy","getFromMapOrCreate","getQueryMatcher","getSortComparator","normalizeMangoQuery","getSortFieldsOfQuery","primaryKey","query","sort","length","map","part","Object","keys","RXQUERY_QUERY_PARAMS_CACHE","WeakMap","getQueryParams","rxQuery","collection","normalizedMangoQuery","storageInstance","schema","mangoQuery","primaryPath","useSortComparator","jsonSchema","useQueryMatcher","ret","skip","limit","sortFields","sortComparator","queryMatcher","calculateNewResults","rxChangeEvents","database","eventReduce","runFullQueryAgain","queryParams","previousResults","_result","docsData","slice","previousResultsMap","docsDataMap","changed","eventReduceEvents","index","cE","eventReduceEvent","push","foundNonOptimizeable","find","stateResolveFunctionInput","changeEvent","keyDocumentMap","actionName","newResults"],"sources":["../../src/event-reduce.ts"],"sourcesContent":["import {\r\n ActionName,\r\n calculateActionName,\r\n runAction,\r\n QueryParams,\r\n StateResolveFunctionInput,\r\n ChangeEvent\r\n} from 'event-reduce-js';\r\nimport type {\r\n RxQuery,\r\n MangoQuery,\r\n StringKeys,\r\n RxDocumentData,\r\n RxStorageChangeEvent\r\n} from './types/index.d.ts';\r\nimport { rxChangeEventToEventReduceChangeEvent } from './rx-change-event.ts';\r\nimport {\r\n clone,\r\n ensureNotFalsy,\r\n getFromMapOrCreate\r\n} from './plugins/utils/index.ts';\r\nimport { getQueryMatcher, getSortComparator, normalizeMangoQuery } from './rx-query-helper.ts';\r\n\r\nexport type EventReduceResultNeg = {\r\n runFullQueryAgain: true;\r\n};\r\nexport type EventReduceResultPos<RxDocumentType> = {\r\n runFullQueryAgain: false;\r\n changed: boolean;\r\n newResults: RxDocumentType[];\r\n};\r\nexport type EventReduceResult<RxDocumentType> = EventReduceResultNeg | EventReduceResultPos<RxDocumentType>;\r\n\r\n\r\nexport function getSortFieldsOfQuery<RxDocType>(\r\n primaryKey: StringKeys<RxDocumentData<RxDocType>>,\r\n query: MangoQuery<RxDocType>\r\n): (string | StringKeys<RxDocType>)[] {\r\n if (!query.sort || query.sort.length === 0) {\r\n return [primaryKey];\r\n } else {\r\n return query.sort.map(part => Object.keys(part)[0]);\r\n }\r\n}\r\n\r\n\r\n\r\nexport const RXQUERY_QUERY_PARAMS_CACHE: WeakMap<RxQuery, QueryParams<any>> = new WeakMap();\r\nexport function getQueryParams<RxDocType>(\r\n rxQuery: RxQuery<RxDocType>\r\n): QueryParams<RxDocType> {\r\n return getFromMapOrCreate(\r\n RXQUERY_QUERY_PARAMS_CACHE,\r\n rxQuery,\r\n () => {\r\n const collection = rxQuery.collection;\r\n const normalizedMangoQuery = normalizeMangoQuery(\r\n collection.storageInstance.schema,\r\n clone(rxQuery.mangoQuery)\r\n );\r\n const primaryKey = collection.schema.primaryPath;\r\n\r\n /**\r\n * Create a custom sort comparator\r\n * that uses the hooks to ensure\r\n * we send for example compressed documents to be sorted by compressed queries.\r\n *\r\n * @performance\r\n * Avoid creating intermediate wrapper objects on every comparison call.\r\n * The sortComparator and queryMatcher are called directly.\r\n */\r\n const useSortComparator = getSortComparator(\r\n collection.schema.jsonSchema,\r\n normalizedMangoQuery\r\n );\r\n\r\n /**\r\n * Create a custom query matcher\r\n * that uses the hooks to ensure\r\n * we send for example compressed documents to match compressed queries.\r\n */\r\n const useQueryMatcher = getQueryMatcher(\r\n collection.schema.jsonSchema,\r\n normalizedMangoQuery\r\n );\r\n\r\n const ret: QueryParams<any> = {\r\n primaryKey: rxQuery.collection.schema.primaryPath as any,\r\n skip: normalizedMangoQuery.skip,\r\n limit: normalizedMangoQuery.limit,\r\n sortFields: getSortFieldsOfQuery(primaryKey, normalizedMangoQuery) as string[],\r\n sortComparator: useSortComparator,\r\n queryMatcher: useQueryMatcher\r\n };\r\n return ret;\r\n }\r\n );\r\n}\r\n\r\n\r\nexport function calculateNewResults<RxDocumentType>(\r\n rxQuery: RxQuery<RxDocumentType>,\r\n rxChangeEvents: RxStorageChangeEvent<RxDocumentType>[]\r\n): EventReduceResult<RxDocumentType> {\r\n if (!rxQuery.collection.database.eventReduce) {\r\n return {\r\n runFullQueryAgain: true\r\n };\r\n }\r\n const queryParams = getQueryParams(rxQuery);\r\n const previousResults: RxDocumentType[] = ensureNotFalsy(rxQuery._result).docsData.slice(0);\r\n const previousResultsMap: Map<string, RxDocumentType> = ensureNotFalsy(rxQuery._result).docsDataMap;\r\n let changed: boolean = false;\r\n\r\n\r\n const eventReduceEvents: ChangeEvent<RxDocumentType>[] = [];\r\n for (let index = 0; index < rxChangeEvents.length; index++) {\r\n const cE = rxChangeEvents[index];\r\n const eventReduceEvent = rxChangeEventToEventReduceChangeEvent(cE);\r\n if (eventReduceEvent) {\r\n eventReduceEvents.push(eventReduceEvent);\r\n }\r\n }\r\n\r\n const foundNonOptimizeable = eventReduceEvents.find(eventReduceEvent => {\r\n const stateResolveFunctionInput: StateResolveFunctionInput<RxDocumentType> = {\r\n queryParams,\r\n changeEvent: eventReduceEvent,\r\n previousResults,\r\n keyDocumentMap: previousResultsMap\r\n };\r\n\r\n const actionName: ActionName = calculateActionName(stateResolveFunctionInput);\r\n if (actionName === 'runFullQueryAgain') {\r\n return true;\r\n } else if (actionName !== 'doNothing') {\r\n changed = true;\r\n runAction(\r\n actionName,\r\n queryParams,\r\n eventReduceEvent,\r\n previousResults,\r\n previousResultsMap\r\n );\r\n return false;\r\n }\r\n });\r\n if (foundNonOptimizeable) {\r\n return {\r\n runFullQueryAgain: true,\r\n };\r\n } else {\r\n return {\r\n runFullQueryAgain: false,\r\n changed,\r\n newResults: previousResults\r\n };\r\n }\r\n}\r\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"event-reduce.js","names":["calculateActionName","runAction","rxChangeEventToEventReduceChangeEvent","clone","ensureNotFalsy","getFromMapOrCreate","getQueryMatcher","getSortComparator","normalizeMangoQuery","getSortFieldsOfQuery","primaryKey","query","sort","length","map","part","Object","keys","RXQUERY_QUERY_PARAMS_CACHE","WeakMap","getQueryParams","rxQuery","collection","normalizedMangoQuery","storageInstance","schema","mangoQuery","primaryPath","useSortComparator","jsonSchema","useQueryMatcher","ret","skip","limit","sortFields","sortComparator","queryMatcher","calculateNewResults","rxChangeEvents","database","eventReduce","runFullQueryAgain","queryParams","previousResults","_result","docsData","slice","previousResultsMap","Map","docsDataMap","changed","eventReduceEvents","index","cE","eventReduceEvent","push","foundNonOptimizeable","find","stateResolveFunctionInput","changeEvent","keyDocumentMap","actionName","newResults"],"sources":["../../src/event-reduce.ts"],"sourcesContent":["import {\r\n ActionName,\r\n calculateActionName,\r\n runAction,\r\n QueryParams,\r\n StateResolveFunctionInput,\r\n ChangeEvent\r\n} from 'event-reduce-js';\r\nimport type {\r\n RxQuery,\r\n MangoQuery,\r\n StringKeys,\r\n RxDocumentData,\r\n RxStorageChangeEvent\r\n} from './types/index.d.ts';\r\nimport { rxChangeEventToEventReduceChangeEvent } from './rx-change-event.ts';\r\nimport {\r\n clone,\r\n ensureNotFalsy,\r\n getFromMapOrCreate\r\n} from './plugins/utils/index.ts';\r\nimport { getQueryMatcher, getSortComparator, normalizeMangoQuery } from './rx-query-helper.ts';\r\n\r\nexport type EventReduceResultNeg = {\r\n runFullQueryAgain: true;\r\n};\r\nexport type EventReduceResultPos<RxDocumentType> = {\r\n runFullQueryAgain: false;\r\n changed: boolean;\r\n newResults: RxDocumentType[];\r\n};\r\nexport type EventReduceResult<RxDocumentType> = EventReduceResultNeg | EventReduceResultPos<RxDocumentType>;\r\n\r\n\r\nexport function getSortFieldsOfQuery<RxDocType>(\r\n primaryKey: StringKeys<RxDocumentData<RxDocType>>,\r\n query: MangoQuery<RxDocType>\r\n): (string | StringKeys<RxDocType>)[] {\r\n if (!query.sort || query.sort.length === 0) {\r\n return [primaryKey];\r\n } else {\r\n return query.sort.map(part => Object.keys(part)[0]);\r\n }\r\n}\r\n\r\n\r\n\r\nexport const RXQUERY_QUERY_PARAMS_CACHE: WeakMap<RxQuery, QueryParams<any>> = new WeakMap();\r\nexport function getQueryParams<RxDocType>(\r\n rxQuery: RxQuery<RxDocType>\r\n): QueryParams<RxDocType> {\r\n return getFromMapOrCreate(\r\n RXQUERY_QUERY_PARAMS_CACHE,\r\n rxQuery,\r\n () => {\r\n const collection = rxQuery.collection;\r\n const normalizedMangoQuery = normalizeMangoQuery(\r\n collection.storageInstance.schema,\r\n clone(rxQuery.mangoQuery)\r\n );\r\n const primaryKey = collection.schema.primaryPath;\r\n\r\n /**\r\n * Create a custom sort comparator\r\n * that uses the hooks to ensure\r\n * we send for example compressed documents to be sorted by compressed queries.\r\n *\r\n * @performance\r\n * Avoid creating intermediate wrapper objects on every comparison call.\r\n * The sortComparator and queryMatcher are called directly.\r\n */\r\n const useSortComparator = getSortComparator(\r\n collection.schema.jsonSchema,\r\n normalizedMangoQuery\r\n );\r\n\r\n /**\r\n * Create a custom query matcher\r\n * that uses the hooks to ensure\r\n * we send for example compressed documents to match compressed queries.\r\n */\r\n const useQueryMatcher = getQueryMatcher(\r\n collection.schema.jsonSchema,\r\n normalizedMangoQuery\r\n );\r\n\r\n const ret: QueryParams<any> = {\r\n primaryKey: rxQuery.collection.schema.primaryPath as any,\r\n skip: normalizedMangoQuery.skip,\r\n limit: normalizedMangoQuery.limit,\r\n sortFields: getSortFieldsOfQuery(primaryKey, normalizedMangoQuery) as string[],\r\n sortComparator: useSortComparator,\r\n queryMatcher: useQueryMatcher\r\n };\r\n return ret;\r\n }\r\n );\r\n}\r\n\r\n\r\nexport function calculateNewResults<RxDocumentType>(\r\n rxQuery: RxQuery<RxDocumentType>,\r\n rxChangeEvents: RxStorageChangeEvent<RxDocumentType>[]\r\n): EventReduceResult<RxDocumentType> {\r\n if (!rxQuery.collection.database.eventReduce) {\r\n return {\r\n runFullQueryAgain: true\r\n };\r\n }\r\n const queryParams = getQueryParams(rxQuery);\r\n const previousResults: RxDocumentType[] = ensureNotFalsy(rxQuery._result).docsData.slice(0);\r\n /**\r\n * Copy the map to avoid mutating the cached docsDataMap on the result object.\r\n * runAction() modifies the map in-place (adds/removes entries),\r\n * which would corrupt the cached map if a later event triggers runFullQueryAgain\r\n * and the full re-exec returns the same results (keeping the old result object).\r\n * On subsequent event-reduce calls, the corrupted map would cause incorrect\r\n * results because insertAtSortPosition checks keyDocumentMap.has(docId)\r\n * to decide whether to skip insertion.\r\n */\r\n const previousResultsMap: Map<string, RxDocumentType> = new Map(ensureNotFalsy(rxQuery._result).docsDataMap);\r\n let changed: boolean = false;\r\n\r\n\r\n const eventReduceEvents: ChangeEvent<RxDocumentType>[] = [];\r\n for (let index = 0; index < rxChangeEvents.length; index++) {\r\n const cE = rxChangeEvents[index];\r\n const eventReduceEvent = rxChangeEventToEventReduceChangeEvent(cE);\r\n if (eventReduceEvent) {\r\n eventReduceEvents.push(eventReduceEvent);\r\n }\r\n }\r\n\r\n const foundNonOptimizeable = eventReduceEvents.find(eventReduceEvent => {\r\n const stateResolveFunctionInput: StateResolveFunctionInput<RxDocumentType> = {\r\n queryParams,\r\n changeEvent: eventReduceEvent,\r\n previousResults,\r\n keyDocumentMap: previousResultsMap\r\n };\r\n\r\n const actionName: ActionName = calculateActionName(stateResolveFunctionInput);\r\n if (actionName === 'runFullQueryAgain') {\r\n return true;\r\n } else if (actionName !== 'doNothing') {\r\n changed = true;\r\n runAction(\r\n actionName,\r\n queryParams,\r\n eventReduceEvent,\r\n previousResults,\r\n previousResultsMap\r\n );\r\n return false;\r\n }\r\n });\r\n if (foundNonOptimizeable) {\r\n return {\r\n runFullQueryAgain: true,\r\n };\r\n } else {\r\n return {\r\n runFullQueryAgain: false,\r\n changed,\r\n newResults: previousResults\r\n };\r\n }\r\n}\r\n"],"mappings":"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","ignoreList":[]}
@@ -1,6 +1,7 @@
1
1
  import { filter, mergeMap, tap } from 'rxjs/operators';
2
2
  import { getPrimaryFieldOfPrimaryKey } from "./rx-schema-helper.js";
3
3
  import { flatClone, getFromMapOrCreate, requestIdleCallbackIfAvailable } from "./plugins/utils/index.js";
4
+ import { newRxError } from "./rx-error.js";
4
5
  import { BehaviorSubject, firstValueFrom } from 'rxjs';
5
6
 
6
7
  /**
@@ -162,6 +163,11 @@ export function wrapRxStorageInstance(originalSchema, instance, modifyToStorage,
162
163
  },
163
164
  query: preparedQuery => {
164
165
  return instance.query(preparedQuery).then(queryResult => {
166
+ if (typeof queryResult === 'string') {
167
+ throw newRxError('EN5', {
168
+ method: 'query'
169
+ });
170
+ }
165
171
  return Promise.all(queryResult.documents.map(doc => fromStorage(doc)));
166
172
  }).then(documents => ({
167
173
  documents: documents
@@ -174,6 +180,11 @@ export function wrapRxStorageInstance(originalSchema, instance, modifyToStorage,
174
180
  },
175
181
  findDocumentsById: (ids, deleted) => {
176
182
  return instance.findDocumentsById(ids, deleted).then(async findResult => {
183
+ if (typeof findResult === 'string') {
184
+ throw newRxError('EN5', {
185
+ method: 'findDocumentsById'
186
+ });
187
+ }
177
188
  var ret = [];
178
189
  await Promise.all(findResult.map(async doc => {
179
190
  ret.push(await fromStorage(doc));
@@ -183,6 +194,11 @@ export function wrapRxStorageInstance(originalSchema, instance, modifyToStorage,
183
194
  },
184
195
  getChangedDocumentsSince: !instance.getChangedDocumentsSince ? undefined : (limit, checkpoint) => {
185
196
  return instance.getChangedDocumentsSince(limit, checkpoint).then(async result => {
197
+ if (typeof result === 'string') {
198
+ throw newRxError('EN5', {
199
+ method: 'getChangedDocumentsSince'
200
+ });
201
+ }
186
202
  return {
187
203
  checkpoint: result.checkpoint,
188
204
  documents: await Promise.all(result.documents.map(d => fromStorage(d)))
@@ -1 +1 @@
1
- {"version":3,"file":"plugin-helpers.js","names":["filter","mergeMap","tap","getPrimaryFieldOfPrimaryKey","flatClone","getFromMapOrCreate","requestIdleCallbackIfAvailable","BehaviorSubject","firstValueFrom","VALIDATOR_CACHE_BY_VALIDATOR_KEY","Map","wrappedValidateStorageFactory","getValidator","validatorKey","VALIDATOR_CACHE","initValidator","schema","JSON","stringify","args","Object","assign","storage","name","createStorageInstance","params","instance","primaryPath","primaryKey","validatorCached","oldBulkWrite","bulkWrite","bind","documentWrites","context","errors","continueWrites","forEach","row","documentId","document","validationErrors","length","push","status","isError","writeRow","writePromise","Promise","resolve","error","success","then","writeResult","validationError","wrapRxStorageInstance","originalSchema","modifyToStorage","modifyFromStorage","modifyAttachmentFromStorage","v","toStorage","docData","fromStorage","errorFromStorage","ret","documentInDb","previous","processingChangesCount$","wrappedInstance","databaseName","internals","cleanup","options","close","collectionName","count","remove","originalStorageInstance","useRows","all","map","undefined","promises","err","pipe","query","preparedQuery","queryResult","documents","doc","getAttachmentData","attachmentId","digest","data","findDocumentsById","ids","deleted","findResult","getChangedDocumentsSince","limit","checkpoint","result","d","changeStream","next","getValue","eventBulk","useEvents","events","event","documentData","previousDocumentData","ev","operation","isLocal","id"],"sources":["../../src/plugin-helpers.ts"],"sourcesContent":["import { filter, mergeMap, tap } from 'rxjs/operators';\r\nimport { getPrimaryFieldOfPrimaryKey } from './rx-schema-helper.ts';\r\nimport { WrappedRxStorageInstance } from './rx-storage-helper.ts';\r\nimport type {\r\n BulkWriteRow,\r\n EventBulk,\r\n RxChangeEvent,\r\n RxDocumentData,\r\n RxDocumentWriteData,\r\n RxJsonSchema,\r\n RxStorage,\r\n RxStorageWriteError,\r\n RxStorageBulkWriteResponse,\r\n RxStorageChangeEvent,\r\n RxStorageInstance,\r\n RxStorageInstanceCreationParams,\r\n RxValidationError,\r\n RxStorageWriteErrorConflict,\r\n MaybePromise\r\n} from './types/index.d.ts';\r\nimport {\r\n flatClone,\r\n getFromMapOrCreate,\r\n requestIdleCallbackIfAvailable\r\n} from './plugins/utils/index.ts';\r\nimport { BehaviorSubject, firstValueFrom } from 'rxjs';\r\n\r\n\r\ntype WrappedStorageFunction = <Internals, InstanceCreationOptions>(\r\n args: {\r\n storage: RxStorage<Internals, InstanceCreationOptions>;\r\n }\r\n) => RxStorage<Internals, InstanceCreationOptions>;\r\n\r\n/**\r\n * Returns the validation errors.\r\n * If document is fully valid, returns an empty array.\r\n */\r\ntype ValidatorFunction = (docData: RxDocumentData<any>) => RxValidationError[];\r\n\r\n/**\r\n * cache the validators by the schema string\r\n * so we can reuse them when multiple collections have the same schema\r\n *\r\n * Notice: to make it easier and not dependent on a hash function,\r\n * we use the plain json string.\r\n */\r\nconst VALIDATOR_CACHE_BY_VALIDATOR_KEY: Map<string, Map<string, ValidatorFunction>> = new Map();\r\n\r\n/**\r\n * This factory is used in the validation plugins\r\n * so that we can reuse the basic storage wrapping code.\r\n */\r\nexport function wrappedValidateStorageFactory(\r\n /**\r\n * Returns a method that can be used to validate\r\n * documents and throws when the document is not valid.\r\n */\r\n getValidator: (schema: RxJsonSchema<any>) => ValidatorFunction,\r\n /**\r\n * A string to identify the validation library.\r\n */\r\n validatorKey: string\r\n): WrappedStorageFunction {\r\n const VALIDATOR_CACHE = getFromMapOrCreate(\r\n VALIDATOR_CACHE_BY_VALIDATOR_KEY,\r\n validatorKey,\r\n () => new Map()\r\n );\r\n\r\n function initValidator(\r\n schema: RxJsonSchema<any>\r\n ): ValidatorFunction {\r\n return getFromMapOrCreate(\r\n VALIDATOR_CACHE,\r\n JSON.stringify(schema),\r\n () => getValidator(schema)\r\n );\r\n }\r\n\r\n return (args) => {\r\n return Object.assign(\r\n {},\r\n args.storage,\r\n {\r\n name: 'validate-' + validatorKey + '-' + args.storage.name,\r\n async createStorageInstance<RxDocType>(\r\n params: RxStorageInstanceCreationParams<RxDocType, any>\r\n ) {\r\n const instance = await args.storage.createStorageInstance(params);\r\n const primaryPath = getPrimaryFieldOfPrimaryKey(params.schema.primaryKey);\r\n\r\n /**\r\n * Lazy initialize the validator\r\n * to save initial page load performance.\r\n * Some libraries take really long to initialize the validator\r\n * from the schema.\r\n */\r\n let validatorCached: ValidatorFunction;\r\n requestIdleCallbackIfAvailable(() => validatorCached = initValidator(params.schema));\r\n\r\n const oldBulkWrite = instance.bulkWrite.bind(instance);\r\n instance.bulkWrite = (\r\n documentWrites: BulkWriteRow<RxDocType>[],\r\n context: string\r\n ) => {\r\n if (!validatorCached) {\r\n validatorCached = initValidator(params.schema);\r\n }\r\n const errors: RxStorageWriteError<RxDocType>[] = [];\r\n const continueWrites: typeof documentWrites = [];\r\n documentWrites.forEach(row => {\r\n const documentId: string = row.document[primaryPath] as any;\r\n const validationErrors = validatorCached(row.document);\r\n if (validationErrors.length > 0) {\r\n errors.push({\r\n status: 422,\r\n isError: true,\r\n documentId,\r\n validationErrors,\r\n schema: instance.schema,\r\n writeRow: row,\r\n context\r\n });\r\n } else {\r\n continueWrites.push(row);\r\n }\r\n });\r\n const writePromise: Promise<RxStorageBulkWriteResponse<RxDocType>> = continueWrites.length > 0 ?\r\n oldBulkWrite(continueWrites, context) :\r\n Promise.resolve({ error: [], success: [] });\r\n return writePromise.then(writeResult => {\r\n errors.forEach(validationError => {\r\n writeResult.error.push(validationError);\r\n });\r\n return writeResult;\r\n });\r\n };\r\n\r\n return instance;\r\n }\r\n }\r\n );\r\n };\r\n\r\n}\r\n\r\n\r\n\r\n/**\r\n * Used in plugins to easily modify all in- and outgoing\r\n * data of that storage instance.\r\n */\r\nexport function wrapRxStorageInstance<RxDocType>(\r\n originalSchema: RxJsonSchema<RxDocumentData<RxDocType>>,\r\n instance: RxStorageInstance<RxDocType, any, any>,\r\n modifyToStorage: (docData: RxDocumentWriteData<RxDocType>) => MaybePromise<RxDocumentData<any>>,\r\n modifyFromStorage: (docData: RxDocumentData<any>) => MaybePromise<RxDocumentData<RxDocType>>,\r\n modifyAttachmentFromStorage: (attachmentData: Blob) => MaybePromise<Blob> = (v) => v\r\n): WrappedRxStorageInstance<RxDocType, any, any> {\r\n async function toStorage(docData: RxDocumentWriteData<RxDocType>): Promise<RxDocumentData<any>> {\r\n if (!docData) {\r\n return docData;\r\n }\r\n return await modifyToStorage(docData);\r\n }\r\n async function fromStorage(docData: RxDocumentData<any> | null): Promise<RxDocumentData<RxDocType>> {\r\n if (!docData) {\r\n return docData;\r\n }\r\n return await modifyFromStorage(docData);\r\n }\r\n async function errorFromStorage(\r\n error: RxStorageWriteError<any>\r\n ): Promise<RxStorageWriteError<RxDocType>> {\r\n const ret = flatClone(error);\r\n ret.writeRow = flatClone(ret.writeRow);\r\n if ((ret as RxStorageWriteErrorConflict<any>).documentInDb) {\r\n (ret as RxStorageWriteErrorConflict<any>).documentInDb = await fromStorage((ret as RxStorageWriteErrorConflict<any>).documentInDb);\r\n }\r\n if (ret.writeRow.previous) {\r\n ret.writeRow.previous = await fromStorage(ret.writeRow.previous);\r\n }\r\n ret.writeRow.document = await fromStorage(ret.writeRow.document);\r\n return ret;\r\n }\r\n\r\n\r\n const processingChangesCount$ = new BehaviorSubject(0);\r\n\r\n const wrappedInstance: WrappedRxStorageInstance<RxDocType, any, any> = {\r\n databaseName: instance.databaseName,\r\n internals: instance.internals,\r\n cleanup: instance.cleanup.bind(instance),\r\n options: instance.options,\r\n close: instance.close.bind(instance),\r\n schema: originalSchema,\r\n collectionName: instance.collectionName,\r\n count: instance.count.bind(instance),\r\n remove: instance.remove.bind(instance),\r\n originalStorageInstance: instance,\r\n bulkWrite: async (\r\n documentWrites: BulkWriteRow<RxDocType>[],\r\n context: string\r\n ) => {\r\n const useRows: BulkWriteRow<any>[] = [];\r\n await Promise.all(\r\n documentWrites.map(async (row) => {\r\n const [previous, document] = await Promise.all([\r\n row.previous ? toStorage(row.previous) : undefined,\r\n toStorage(row.document)\r\n ]);\r\n useRows.push({ previous, document });\r\n })\r\n );\r\n\r\n const writeResult = await instance.bulkWrite(useRows, context);\r\n const ret: RxStorageBulkWriteResponse<RxDocType> = {\r\n error: []\r\n };\r\n const promises: Promise<any>[] = [];\r\n writeResult.error.forEach(error => {\r\n promises.push(\r\n errorFromStorage(error).then(err => ret.error.push(err))\r\n );\r\n });\r\n await Promise.all(promises);\r\n\r\n /**\r\n * By definition, all change events must be emitted\r\n * BEFORE the write call resolves.\r\n * To ensure that even when the modifiers are async,\r\n * we wait here until the processing queue is empty.\r\n */\r\n await firstValueFrom(\r\n processingChangesCount$.pipe(\r\n filter((v: number) => v === 0)\r\n )\r\n );\r\n return ret;\r\n },\r\n query: (preparedQuery) => {\r\n return instance.query(preparedQuery)\r\n .then(queryResult => {\r\n return Promise.all(queryResult.documents.map(doc => fromStorage(doc)));\r\n })\r\n .then(documents => ({ documents: documents as any }));\r\n },\r\n getAttachmentData: async (\r\n documentId: string,\r\n attachmentId: string,\r\n digest: string\r\n ) => {\r\n let data = await instance.getAttachmentData(documentId, attachmentId, digest);\r\n data = await modifyAttachmentFromStorage(data);\r\n return data;\r\n },\r\n findDocumentsById: (ids, deleted) => {\r\n return instance.findDocumentsById(ids, deleted)\r\n .then(async (findResult) => {\r\n const ret: RxDocumentData<RxDocType>[] = [];\r\n await Promise.all(\r\n findResult\r\n .map(async (doc) => {\r\n ret.push(await fromStorage(doc));\r\n })\r\n );\r\n return ret;\r\n });\r\n },\r\n getChangedDocumentsSince: !instance.getChangedDocumentsSince ? undefined : (limit, checkpoint) => {\r\n return ((instance as any).getChangedDocumentsSince)(limit, checkpoint)\r\n .then(async (result: any) => {\r\n return {\r\n checkpoint: result.checkpoint,\r\n documents: await Promise.all(\r\n result.documents.map((d: any) => fromStorage(d))\r\n )\r\n };\r\n });\r\n },\r\n changeStream: () => {\r\n return instance.changeStream().pipe(\r\n tap(() => processingChangesCount$.next(processingChangesCount$.getValue() + 1)),\r\n mergeMap(async (eventBulk: EventBulk<RxStorageChangeEvent<RxDocType>, any>) => {\r\n const useEvents = await Promise.all(\r\n eventBulk.events.map(async (event: RxStorageChangeEvent<RxDocType>) => {\r\n const [\r\n documentData,\r\n previousDocumentData\r\n ] = await Promise.all([\r\n fromStorage(event.documentData),\r\n fromStorage(event.previousDocumentData)\r\n ]);\r\n const ev: RxChangeEvent<RxDocType> = {\r\n operation: event.operation,\r\n documentId: event.documentId,\r\n documentData: documentData as any,\r\n previousDocumentData: previousDocumentData as any,\r\n isLocal: false\r\n };\r\n return ev;\r\n })\r\n );\r\n const ret: EventBulk<RxStorageChangeEvent<RxDocumentData<RxDocType>>, any> = {\r\n id: eventBulk.id,\r\n events: useEvents,\r\n checkpoint: eventBulk.checkpoint,\r\n context: eventBulk.context\r\n };\r\n return ret;\r\n }),\r\n tap(() => processingChangesCount$.next(processingChangesCount$.getValue() - 1))\r\n );\r\n },\r\n };\r\n\r\n return wrappedInstance;\r\n}\r\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"plugin-helpers.js","names":["filter","mergeMap","tap","getPrimaryFieldOfPrimaryKey","flatClone","getFromMapOrCreate","requestIdleCallbackIfAvailable","newRxError","BehaviorSubject","firstValueFrom","VALIDATOR_CACHE_BY_VALIDATOR_KEY","Map","wrappedValidateStorageFactory","getValidator","validatorKey","VALIDATOR_CACHE","initValidator","schema","JSON","stringify","args","Object","assign","storage","name","createStorageInstance","params","instance","primaryPath","primaryKey","validatorCached","oldBulkWrite","bulkWrite","bind","documentWrites","context","errors","continueWrites","forEach","row","documentId","document","validationErrors","length","push","status","isError","writeRow","writePromise","Promise","resolve","error","success","then","writeResult","validationError","wrapRxStorageInstance","originalSchema","modifyToStorage","modifyFromStorage","modifyAttachmentFromStorage","v","toStorage","docData","fromStorage","errorFromStorage","ret","documentInDb","previous","processingChangesCount$","wrappedInstance","databaseName","internals","cleanup","options","close","collectionName","count","remove","originalStorageInstance","useRows","all","map","undefined","promises","err","pipe","query","preparedQuery","queryResult","method","documents","doc","getAttachmentData","attachmentId","digest","data","findDocumentsById","ids","deleted","findResult","getChangedDocumentsSince","limit","checkpoint","result","d","changeStream","next","getValue","eventBulk","useEvents","events","event","documentData","previousDocumentData","ev","operation","isLocal","id"],"sources":["../../src/plugin-helpers.ts"],"sourcesContent":["import { filter, mergeMap, tap } from 'rxjs/operators';\r\nimport { getPrimaryFieldOfPrimaryKey } from './rx-schema-helper.ts';\r\nimport { WrappedRxStorageInstance } from './rx-storage-helper.ts';\r\nimport type {\r\n BulkWriteRow,\r\n EventBulk,\r\n RxChangeEvent,\r\n RxDocumentData,\r\n RxDocumentWriteData,\r\n RxJsonSchema,\r\n RxStorage,\r\n RxStorageWriteError,\r\n RxStorageBulkWriteResponse,\r\n RxStorageChangeEvent,\r\n RxStorageInstance,\r\n RxStorageInstanceCreationParams,\r\n RxValidationError,\r\n RxStorageWriteErrorConflict,\r\n MaybePromise\r\n} from './types/index.d.ts';\r\nimport {\r\n flatClone,\r\n getFromMapOrCreate,\r\n requestIdleCallbackIfAvailable\r\n} from './plugins/utils/index.ts';\r\nimport { newRxError } from './rx-error.ts';\r\nimport { BehaviorSubject, firstValueFrom } from 'rxjs';\r\n\r\n\r\ntype WrappedStorageFunction = <Internals, InstanceCreationOptions>(\r\n args: {\r\n storage: RxStorage<Internals, InstanceCreationOptions>;\r\n }\r\n) => RxStorage<Internals, InstanceCreationOptions>;\r\n\r\n/**\r\n * Returns the validation errors.\r\n * If document is fully valid, returns an empty array.\r\n */\r\ntype ValidatorFunction = (docData: RxDocumentData<any>) => RxValidationError[];\r\n\r\n/**\r\n * cache the validators by the schema string\r\n * so we can reuse them when multiple collections have the same schema\r\n *\r\n * Notice: to make it easier and not dependent on a hash function,\r\n * we use the plain json string.\r\n */\r\nconst VALIDATOR_CACHE_BY_VALIDATOR_KEY: Map<string, Map<string, ValidatorFunction>> = new Map();\r\n\r\n/**\r\n * This factory is used in the validation plugins\r\n * so that we can reuse the basic storage wrapping code.\r\n */\r\nexport function wrappedValidateStorageFactory(\r\n /**\r\n * Returns a method that can be used to validate\r\n * documents and throws when the document is not valid.\r\n */\r\n getValidator: (schema: RxJsonSchema<any>) => ValidatorFunction,\r\n /**\r\n * A string to identify the validation library.\r\n */\r\n validatorKey: string\r\n): WrappedStorageFunction {\r\n const VALIDATOR_CACHE = getFromMapOrCreate(\r\n VALIDATOR_CACHE_BY_VALIDATOR_KEY,\r\n validatorKey,\r\n () => new Map()\r\n );\r\n\r\n function initValidator(\r\n schema: RxJsonSchema<any>\r\n ): ValidatorFunction {\r\n return getFromMapOrCreate(\r\n VALIDATOR_CACHE,\r\n JSON.stringify(schema),\r\n () => getValidator(schema)\r\n );\r\n }\r\n\r\n return (args) => {\r\n return Object.assign(\r\n {},\r\n args.storage,\r\n {\r\n name: 'validate-' + validatorKey + '-' + args.storage.name,\r\n async createStorageInstance<RxDocType>(\r\n params: RxStorageInstanceCreationParams<RxDocType, any>\r\n ) {\r\n const instance = await args.storage.createStorageInstance(params);\r\n const primaryPath = getPrimaryFieldOfPrimaryKey(params.schema.primaryKey);\r\n\r\n /**\r\n * Lazy initialize the validator\r\n * to save initial page load performance.\r\n * Some libraries take really long to initialize the validator\r\n * from the schema.\r\n */\r\n let validatorCached: ValidatorFunction;\r\n requestIdleCallbackIfAvailable(() => validatorCached = initValidator(params.schema));\r\n\r\n const oldBulkWrite = instance.bulkWrite.bind(instance);\r\n instance.bulkWrite = (\r\n documentWrites: BulkWriteRow<RxDocType>[],\r\n context: string\r\n ) => {\r\n if (!validatorCached) {\r\n validatorCached = initValidator(params.schema);\r\n }\r\n const errors: RxStorageWriteError<RxDocType>[] = [];\r\n const continueWrites: typeof documentWrites = [];\r\n documentWrites.forEach(row => {\r\n const documentId: string = row.document[primaryPath] as any;\r\n const validationErrors = validatorCached(row.document);\r\n if (validationErrors.length > 0) {\r\n errors.push({\r\n status: 422,\r\n isError: true,\r\n documentId,\r\n validationErrors,\r\n schema: instance.schema,\r\n writeRow: row,\r\n context\r\n });\r\n } else {\r\n continueWrites.push(row);\r\n }\r\n });\r\n const writePromise: Promise<RxStorageBulkWriteResponse<RxDocType>> = continueWrites.length > 0 ?\r\n oldBulkWrite(continueWrites, context) :\r\n Promise.resolve({ error: [], success: [] });\r\n return writePromise.then(writeResult => {\r\n errors.forEach(validationError => {\r\n writeResult.error.push(validationError);\r\n });\r\n return writeResult;\r\n });\r\n };\r\n\r\n return instance;\r\n }\r\n }\r\n );\r\n };\r\n\r\n}\r\n\r\n\r\n\r\n/**\r\n * Used in plugins to easily modify all in- and outgoing\r\n * data of that storage instance.\r\n */\r\nexport function wrapRxStorageInstance<RxDocType>(\r\n originalSchema: RxJsonSchema<RxDocumentData<RxDocType>>,\r\n instance: RxStorageInstance<RxDocType, any, any>,\r\n modifyToStorage: (docData: RxDocumentWriteData<RxDocType>) => MaybePromise<RxDocumentData<any>>,\r\n modifyFromStorage: (docData: RxDocumentData<any>) => MaybePromise<RxDocumentData<RxDocType>>,\r\n modifyAttachmentFromStorage: (attachmentData: Blob) => MaybePromise<Blob> = (v) => v\r\n): WrappedRxStorageInstance<RxDocType, any, any> {\r\n async function toStorage(docData: RxDocumentWriteData<RxDocType>): Promise<RxDocumentData<any>> {\r\n if (!docData) {\r\n return docData;\r\n }\r\n return await modifyToStorage(docData);\r\n }\r\n async function fromStorage(docData: RxDocumentData<any> | null): Promise<RxDocumentData<RxDocType>> {\r\n if (!docData) {\r\n return docData;\r\n }\r\n return await modifyFromStorage(docData);\r\n }\r\n async function errorFromStorage(\r\n error: RxStorageWriteError<any>\r\n ): Promise<RxStorageWriteError<RxDocType>> {\r\n const ret = flatClone(error);\r\n ret.writeRow = flatClone(ret.writeRow);\r\n if ((ret as RxStorageWriteErrorConflict<any>).documentInDb) {\r\n (ret as RxStorageWriteErrorConflict<any>).documentInDb = await fromStorage((ret as RxStorageWriteErrorConflict<any>).documentInDb);\r\n }\r\n if (ret.writeRow.previous) {\r\n ret.writeRow.previous = await fromStorage(ret.writeRow.previous);\r\n }\r\n ret.writeRow.document = await fromStorage(ret.writeRow.document);\r\n return ret;\r\n }\r\n\r\n\r\n const processingChangesCount$ = new BehaviorSubject(0);\r\n\r\n const wrappedInstance: WrappedRxStorageInstance<RxDocType, any, any> = {\r\n databaseName: instance.databaseName,\r\n internals: instance.internals,\r\n cleanup: instance.cleanup.bind(instance),\r\n options: instance.options,\r\n close: instance.close.bind(instance),\r\n schema: originalSchema,\r\n collectionName: instance.collectionName,\r\n count: instance.count.bind(instance),\r\n remove: instance.remove.bind(instance),\r\n originalStorageInstance: instance,\r\n bulkWrite: async (\r\n documentWrites: BulkWriteRow<RxDocType>[],\r\n context: string\r\n ) => {\r\n const useRows: BulkWriteRow<any>[] = [];\r\n await Promise.all(\r\n documentWrites.map(async (row) => {\r\n const [previous, document] = await Promise.all([\r\n row.previous ? toStorage(row.previous) : undefined,\r\n toStorage(row.document)\r\n ]);\r\n useRows.push({ previous, document });\r\n })\r\n );\r\n\r\n const writeResult = await instance.bulkWrite(useRows, context);\r\n const ret: RxStorageBulkWriteResponse<RxDocType> = {\r\n error: []\r\n };\r\n const promises: Promise<any>[] = [];\r\n writeResult.error.forEach(error => {\r\n promises.push(\r\n errorFromStorage(error).then(err => ret.error.push(err))\r\n );\r\n });\r\n await Promise.all(promises);\r\n\r\n /**\r\n * By definition, all change events must be emitted\r\n * BEFORE the write call resolves.\r\n * To ensure that even when the modifiers are async,\r\n * we wait here until the processing queue is empty.\r\n */\r\n await firstValueFrom(\r\n processingChangesCount$.pipe(\r\n filter((v: number) => v === 0)\r\n )\r\n );\r\n return ret;\r\n },\r\n query: (preparedQuery) => {\r\n return instance.query(preparedQuery)\r\n .then(queryResult => {\r\n if (typeof queryResult === 'string') {\r\n throw newRxError('EN5', { method: 'query' });\r\n }\r\n return Promise.all(queryResult.documents.map(doc => fromStorage(doc)));\r\n })\r\n .then(documents => ({ documents: documents as any }));\r\n },\r\n getAttachmentData: async (\r\n documentId: string,\r\n attachmentId: string,\r\n digest: string\r\n ) => {\r\n let data = await instance.getAttachmentData(documentId, attachmentId, digest);\r\n data = await modifyAttachmentFromStorage(data);\r\n return data;\r\n },\r\n findDocumentsById: (ids, deleted) => {\r\n return instance.findDocumentsById(ids, deleted)\r\n .then(async (findResult) => {\r\n if (typeof findResult === 'string') {\r\n throw newRxError('EN5', { method: 'findDocumentsById' });\r\n }\r\n const ret: RxDocumentData<RxDocType>[] = [];\r\n await Promise.all(\r\n findResult\r\n .map(async (doc) => {\r\n ret.push(await fromStorage(doc));\r\n })\r\n );\r\n return ret;\r\n });\r\n },\r\n getChangedDocumentsSince: !instance.getChangedDocumentsSince ? undefined : (limit, checkpoint) => {\r\n return ((instance as any).getChangedDocumentsSince)(limit, checkpoint)\r\n .then(async (result: any) => {\r\n if (typeof result === 'string') {\r\n throw newRxError('EN5', { method: 'getChangedDocumentsSince' });\r\n }\r\n return {\r\n checkpoint: result.checkpoint,\r\n documents: await Promise.all(\r\n result.documents.map((d: any) => fromStorage(d))\r\n )\r\n };\r\n });\r\n },\r\n changeStream: () => {\r\n return instance.changeStream().pipe(\r\n tap(() => processingChangesCount$.next(processingChangesCount$.getValue() + 1)),\r\n mergeMap(async (eventBulk: EventBulk<RxStorageChangeEvent<RxDocType>, any>) => {\r\n const useEvents = await Promise.all(\r\n eventBulk.events.map(async (event: RxStorageChangeEvent<RxDocType>) => {\r\n const [\r\n documentData,\r\n previousDocumentData\r\n ] = await Promise.all([\r\n fromStorage(event.documentData),\r\n fromStorage(event.previousDocumentData)\r\n ]);\r\n const ev: RxChangeEvent<RxDocType> = {\r\n operation: event.operation,\r\n documentId: event.documentId,\r\n documentData: documentData as any,\r\n previousDocumentData: previousDocumentData as any,\r\n isLocal: false\r\n };\r\n return ev;\r\n })\r\n );\r\n const ret: EventBulk<RxStorageChangeEvent<RxDocumentData<RxDocType>>, any> = {\r\n id: eventBulk.id,\r\n events: useEvents,\r\n checkpoint: eventBulk.checkpoint,\r\n context: eventBulk.context\r\n };\r\n return ret;\r\n }),\r\n tap(() => processingChangesCount$.next(processingChangesCount$.getValue() - 1))\r\n );\r\n },\r\n };\r\n\r\n return wrappedInstance;\r\n}\r\n"],"mappings":"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","ignoreList":[]}
@@ -179,9 +179,9 @@ export var RxDBAttachmentsPlugin = {
179
179
  proto.allAttachments = allAttachments;
180
180
  Object.defineProperty(proto, 'allAttachments$', {
181
181
  get: function allAttachments$() {
182
- return this.$.pipe(map(rxDocument => Object.entries(rxDocument.toJSON(true)._attachments)), map(entries => {
183
- return entries.map(([id, attachmentData]) => {
184
- return fromStorageInstanceResult(id, attachmentData, this);
182
+ return this.$.pipe(map(rxDocument => {
183
+ return Object.entries(rxDocument.toJSON(true)._attachments).map(([id, attachmentData]) => {
184
+ return fromStorageInstanceResult(id, attachmentData, rxDocument);
185
185
  });
186
186
  }));
187
187
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["map","blobToBase64String","blobToString","createBlobFromBase64","flatClone","PROMISE_RESOLVE_VOID","assignMethodsToAttachment","ensureSchemaSupportsAttachments","RxAttachment","doc","id","type","length","digest","_proto","prototype","remove","collection","incrementalWriteQueue","addWrite","_data","docWriteData","_attachments","then","getData","blob","storageInstance","getAttachmentData","primary","slice","size","getStringData","data","asString","getDataBase64","fromStorageInstanceResult","attachmentData","rxDocument","_putAttachmentsImpl","attachments","prepared","Promise","all","att","database","hashFunction","writeResult","newDocument","_docCache","getCachedRxDocument","putAttachment","results","putAttachmentBase64","putAttachments","getAttachment","docData","attachment","allAttachments","Object","keys","preMigrateDocument","newAttachments","attachmentId","docPrimary","oldCollection","schema","primaryPath","rawAttachmentBlob","postMigrateDocument","_action","RxDBAttachmentsPlugin","name","rxdb","prototypes","RxDocument","proto","defineProperty","get","allAttachments$","$","pipe","entries","toJSON","overwritable","hooks","after"],"sources":["../../../../src/plugins/attachments/index.ts"],"sourcesContent":["import {\r\n map\r\n} from 'rxjs';\r\n\r\nimport {\r\n blobToBase64String,\r\n blobToString,\r\n createBlobFromBase64,\r\n flatClone,\r\n PROMISE_RESOLVE_VOID\r\n} from '../../plugins/utils/index.ts';\r\nimport type {\r\n RxDocument,\r\n RxPlugin,\r\n RxDocumentWriteData,\r\n RxAttachmentData,\r\n RxDocumentData,\r\n RxAttachmentCreator,\r\n RxAttachmentWriteData,\r\n RxCollection,\r\n RxAttachmentCreatorBase64\r\n} from '../../types/index.d.ts';\r\nimport {\r\n assignMethodsToAttachment,\r\n ensureSchemaSupportsAttachments\r\n} from './attachments-utils.ts';\r\n\r\n\r\n\r\n/**\r\n * an RxAttachment is basically just the attachment-stub\r\n * wrapped so that you can access the attachment-data\r\n */\r\nexport class RxAttachment {\r\n public doc: RxDocument;\r\n public id: string;\r\n public type: string;\r\n public length: number;\r\n public digest: string;\r\n constructor({\r\n doc,\r\n id,\r\n type,\r\n length,\r\n digest\r\n }: any) {\r\n this.doc = doc;\r\n this.id = id;\r\n this.type = type;\r\n this.length = length;\r\n this.digest = digest;\r\n\r\n assignMethodsToAttachment(this);\r\n }\r\n\r\n remove(): Promise<void> {\r\n return this.doc.collection.incrementalWriteQueue.addWrite(\r\n this.doc._data,\r\n docWriteData => {\r\n delete docWriteData._attachments[this.id];\r\n return docWriteData;\r\n }\r\n ).then(() => { });\r\n }\r\n\r\n /**\r\n * returns the data for the attachment\r\n */\r\n async getData(): Promise<Blob> {\r\n const blob = await this.doc.collection.storageInstance.getAttachmentData(\r\n this.doc.primary,\r\n this.id,\r\n this.digest\r\n );\r\n // Some storage layers return blobs without the original MIME type.\r\n // Ensure the returned Blob has the attachment's MIME type.\r\n if (blob && blob.type !== this.type) {\r\n return blob.slice(0, blob.size, this.type);\r\n }\r\n return blob;\r\n }\r\n\r\n async getStringData(): Promise<string> {\r\n const data = await this.getData();\r\n const asString = await blobToString(data);\r\n return asString;\r\n }\r\n\r\n async getDataBase64(): Promise<string> {\r\n const blob = await this.getData();\r\n return blobToBase64String(blob);\r\n }\r\n}\r\n\r\nexport function fromStorageInstanceResult<RxDocType>(\r\n id: string,\r\n attachmentData: RxAttachmentData,\r\n rxDocument: RxDocument<RxDocType>\r\n) {\r\n return new RxAttachment({\r\n doc: rxDocument,\r\n id,\r\n type: attachmentData.type,\r\n length: attachmentData.length,\r\n digest: attachmentData.digest\r\n });\r\n}\r\n\r\nasync function _putAttachmentsImpl<RxDocType>(\r\n doc: RxDocument<RxDocType>,\r\n attachments: RxAttachmentCreator[]\r\n): Promise<RxAttachment[]> {\r\n ensureSchemaSupportsAttachments(doc);\r\n\r\n if (attachments.length === 0) {\r\n return [];\r\n }\r\n\r\n const prepared = await Promise.all(\r\n attachments.map(async (att) => ({\r\n id: att.id,\r\n type: att.type,\r\n data: att.data,\r\n digest: await doc.collection.database.hashFunction(att.data)\r\n }))\r\n );\r\n\r\n const writeResult = await doc.collection.incrementalWriteQueue.addWrite(\r\n doc._data,\r\n (docWriteData: RxDocumentWriteData<RxDocType>) => {\r\n docWriteData = flatClone(docWriteData);\r\n docWriteData._attachments = flatClone(docWriteData._attachments);\r\n for (const att of prepared) {\r\n docWriteData._attachments[att.id] = {\r\n length: att.data.size,\r\n type: att.type,\r\n data: att.data,\r\n digest: att.digest\r\n };\r\n }\r\n return docWriteData;\r\n }\r\n );\r\n\r\n const newDocument = doc.collection._docCache.getCachedRxDocument(writeResult);\r\n return prepared.map((att) => fromStorageInstanceResult(\r\n att.id,\r\n writeResult._attachments[att.id],\r\n newDocument\r\n ));\r\n}\r\n\r\nexport async function putAttachment<RxDocType>(\r\n this: RxDocument<RxDocType>,\r\n attachmentData: RxAttachmentCreator\r\n): Promise<RxAttachment> {\r\n const results = await _putAttachmentsImpl(this, [attachmentData]);\r\n return results[0];\r\n}\r\n\r\nexport async function putAttachmentBase64<RxDocType>(\r\n this: RxDocument<RxDocType>,\r\n attachmentData: RxAttachmentCreatorBase64\r\n) {\r\n ensureSchemaSupportsAttachments(this);\r\n const blob = await createBlobFromBase64(attachmentData.data, attachmentData.type);\r\n return this.putAttachment({\r\n id: attachmentData.id,\r\n type: attachmentData.type,\r\n data: blob\r\n });\r\n}\r\n\r\n/**\r\n * Write multiple attachments in a single atomic operation.\r\n */\r\nexport function putAttachments<RxDocType>(\r\n this: RxDocument<RxDocType>,\r\n attachments: RxAttachmentCreator[]\r\n): Promise<RxAttachment[]> {\r\n return _putAttachmentsImpl(this, attachments);\r\n}\r\n\r\n/**\r\n * get an attachment of the document by its id\r\n */\r\nexport function getAttachment(\r\n this: RxDocument,\r\n id: string\r\n): RxAttachment | null {\r\n ensureSchemaSupportsAttachments(this);\r\n const docData: any = this._data;\r\n if (!docData._attachments || !docData._attachments[id])\r\n return null;\r\n\r\n const attachmentData = docData._attachments[id];\r\n const attachment = fromStorageInstanceResult(\r\n id,\r\n attachmentData,\r\n this\r\n );\r\n return attachment;\r\n}\r\n\r\n/**\r\n * returns all attachments of the document\r\n */\r\nexport function allAttachments(\r\n this: RxDocument\r\n): RxAttachment[] {\r\n ensureSchemaSupportsAttachments(this);\r\n const docData: any = this._data;\r\n\r\n // if there are no attachments, the field is missing\r\n if (!docData._attachments) {\r\n return [];\r\n }\r\n return Object.keys(docData._attachments)\r\n .map(id => {\r\n return fromStorageInstanceResult(\r\n id,\r\n docData._attachments[id],\r\n this\r\n );\r\n });\r\n}\r\n\r\nexport async function preMigrateDocument<RxDocType>(\r\n data: {\r\n docData: RxDocumentData<RxDocType>;\r\n oldCollection: RxCollection<RxDocType>;\r\n }\r\n): Promise<void> {\r\n const attachments = data.docData._attachments;\r\n if (attachments) {\r\n const newAttachments: { [attachmentId: string]: RxAttachmentWriteData; } = {};\r\n await Promise.all(\r\n Object.keys(attachments).map(async (attachmentId) => {\r\n const attachment: RxAttachmentData = attachments[attachmentId];\r\n const docPrimary: string = (data.docData as any)[data.oldCollection.schema.primaryPath];\r\n const rawAttachmentBlob = await data.oldCollection.storageInstance.getAttachmentData(\r\n docPrimary,\r\n attachmentId,\r\n attachment.digest\r\n );\r\n const digest = await data.oldCollection.database.hashFunction(rawAttachmentBlob);\r\n newAttachments[attachmentId] = {\r\n length: rawAttachmentBlob.size,\r\n type: attachment.type,\r\n data: rawAttachmentBlob,\r\n digest\r\n };\r\n })\r\n );\r\n\r\n /**\r\n * Hooks mutate the input\r\n * instead of returning stuff\r\n */\r\n (data.docData as RxDocumentWriteData<RxDocType>)._attachments = newAttachments;\r\n }\r\n}\r\n\r\nexport function postMigrateDocument(_action: any): Promise<void> {\r\n /**\r\n * No longer needed because\r\n * we store the attachments data buffers directly in the document.\r\n */\r\n return PROMISE_RESOLVE_VOID;\r\n}\r\n\r\nexport const RxDBAttachmentsPlugin: RxPlugin = {\r\n name: 'attachments',\r\n rxdb: true,\r\n prototypes: {\r\n RxDocument: (proto: any) => {\r\n proto.putAttachment = putAttachment;\r\n proto.putAttachments = putAttachments;\r\n proto.putAttachmentBase64 = putAttachmentBase64;\r\n proto.getAttachment = getAttachment;\r\n proto.allAttachments = allAttachments;\r\n Object.defineProperty(proto, 'allAttachments$', {\r\n get: function allAttachments$(this: RxDocument) {\r\n return this.$\r\n .pipe(\r\n map((rxDocument: RxDocument) => Object.entries(\r\n rxDocument.toJSON(true)._attachments\r\n )),\r\n map((entries: [string, any][]) => {\r\n return entries\r\n .map(([id, attachmentData]: [string, any]) => {\r\n return fromStorageInstanceResult(\r\n id,\r\n attachmentData,\r\n this\r\n );\r\n });\r\n })\r\n );\r\n }\r\n });\r\n }\r\n },\r\n overwritable: {},\r\n hooks: {\r\n preMigrateDocument: {\r\n after: preMigrateDocument\r\n },\r\n postMigrateDocument: {\r\n after: postMigrateDocument\r\n }\r\n }\r\n};\r\n\r\n\r\nexport * from './attachments-utils.ts';\r\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["map","blobToBase64String","blobToString","createBlobFromBase64","flatClone","PROMISE_RESOLVE_VOID","assignMethodsToAttachment","ensureSchemaSupportsAttachments","RxAttachment","doc","id","type","length","digest","_proto","prototype","remove","collection","incrementalWriteQueue","addWrite","_data","docWriteData","_attachments","then","getData","blob","storageInstance","getAttachmentData","primary","slice","size","getStringData","data","asString","getDataBase64","fromStorageInstanceResult","attachmentData","rxDocument","_putAttachmentsImpl","attachments","prepared","Promise","all","att","database","hashFunction","writeResult","newDocument","_docCache","getCachedRxDocument","putAttachment","results","putAttachmentBase64","putAttachments","getAttachment","docData","attachment","allAttachments","Object","keys","preMigrateDocument","newAttachments","attachmentId","docPrimary","oldCollection","schema","primaryPath","rawAttachmentBlob","postMigrateDocument","_action","RxDBAttachmentsPlugin","name","rxdb","prototypes","RxDocument","proto","defineProperty","get","allAttachments$","$","pipe","entries","toJSON","overwritable","hooks","after"],"sources":["../../../../src/plugins/attachments/index.ts"],"sourcesContent":["import {\r\n map\r\n} from 'rxjs';\r\n\r\nimport {\r\n blobToBase64String,\r\n blobToString,\r\n createBlobFromBase64,\r\n flatClone,\r\n PROMISE_RESOLVE_VOID\r\n} from '../../plugins/utils/index.ts';\r\nimport type {\r\n RxDocument,\r\n RxPlugin,\r\n RxDocumentWriteData,\r\n RxAttachmentData,\r\n RxDocumentData,\r\n RxAttachmentCreator,\r\n RxAttachmentWriteData,\r\n RxCollection,\r\n RxAttachmentCreatorBase64\r\n} from '../../types/index.d.ts';\r\nimport {\r\n assignMethodsToAttachment,\r\n ensureSchemaSupportsAttachments\r\n} from './attachments-utils.ts';\r\n\r\n\r\n\r\n/**\r\n * an RxAttachment is basically just the attachment-stub\r\n * wrapped so that you can access the attachment-data\r\n */\r\nexport class RxAttachment {\r\n public doc: RxDocument;\r\n public id: string;\r\n public type: string;\r\n public length: number;\r\n public digest: string;\r\n constructor({\r\n doc,\r\n id,\r\n type,\r\n length,\r\n digest\r\n }: any) {\r\n this.doc = doc;\r\n this.id = id;\r\n this.type = type;\r\n this.length = length;\r\n this.digest = digest;\r\n\r\n assignMethodsToAttachment(this);\r\n }\r\n\r\n remove(): Promise<void> {\r\n return this.doc.collection.incrementalWriteQueue.addWrite(\r\n this.doc._data,\r\n docWriteData => {\r\n delete docWriteData._attachments[this.id];\r\n return docWriteData;\r\n }\r\n ).then(() => { });\r\n }\r\n\r\n /**\r\n * returns the data for the attachment\r\n */\r\n async getData(): Promise<Blob> {\r\n const blob = await this.doc.collection.storageInstance.getAttachmentData(\r\n this.doc.primary,\r\n this.id,\r\n this.digest\r\n );\r\n // Some storage layers return blobs without the original MIME type.\r\n // Ensure the returned Blob has the attachment's MIME type.\r\n if (blob && blob.type !== this.type) {\r\n return blob.slice(0, blob.size, this.type);\r\n }\r\n return blob;\r\n }\r\n\r\n async getStringData(): Promise<string> {\r\n const data = await this.getData();\r\n const asString = await blobToString(data);\r\n return asString;\r\n }\r\n\r\n async getDataBase64(): Promise<string> {\r\n const blob = await this.getData();\r\n return blobToBase64String(blob);\r\n }\r\n}\r\n\r\nexport function fromStorageInstanceResult<RxDocType>(\r\n id: string,\r\n attachmentData: RxAttachmentData,\r\n rxDocument: RxDocument<RxDocType>\r\n) {\r\n return new RxAttachment({\r\n doc: rxDocument,\r\n id,\r\n type: attachmentData.type,\r\n length: attachmentData.length,\r\n digest: attachmentData.digest\r\n });\r\n}\r\n\r\nasync function _putAttachmentsImpl<RxDocType>(\r\n doc: RxDocument<RxDocType>,\r\n attachments: RxAttachmentCreator[]\r\n): Promise<RxAttachment[]> {\r\n ensureSchemaSupportsAttachments(doc);\r\n\r\n if (attachments.length === 0) {\r\n return [];\r\n }\r\n\r\n const prepared = await Promise.all(\r\n attachments.map(async (att) => ({\r\n id: att.id,\r\n type: att.type,\r\n data: att.data,\r\n digest: await doc.collection.database.hashFunction(att.data)\r\n }))\r\n );\r\n\r\n const writeResult = await doc.collection.incrementalWriteQueue.addWrite(\r\n doc._data,\r\n (docWriteData: RxDocumentWriteData<RxDocType>) => {\r\n docWriteData = flatClone(docWriteData);\r\n docWriteData._attachments = flatClone(docWriteData._attachments);\r\n for (const att of prepared) {\r\n docWriteData._attachments[att.id] = {\r\n length: att.data.size,\r\n type: att.type,\r\n data: att.data,\r\n digest: att.digest\r\n };\r\n }\r\n return docWriteData;\r\n }\r\n );\r\n\r\n const newDocument = doc.collection._docCache.getCachedRxDocument(writeResult);\r\n return prepared.map((att) => fromStorageInstanceResult(\r\n att.id,\r\n writeResult._attachments[att.id],\r\n newDocument\r\n ));\r\n}\r\n\r\nexport async function putAttachment<RxDocType>(\r\n this: RxDocument<RxDocType>,\r\n attachmentData: RxAttachmentCreator\r\n): Promise<RxAttachment> {\r\n const results = await _putAttachmentsImpl(this, [attachmentData]);\r\n return results[0];\r\n}\r\n\r\nexport async function putAttachmentBase64<RxDocType>(\r\n this: RxDocument<RxDocType>,\r\n attachmentData: RxAttachmentCreatorBase64\r\n) {\r\n ensureSchemaSupportsAttachments(this);\r\n const blob = await createBlobFromBase64(attachmentData.data, attachmentData.type);\r\n return this.putAttachment({\r\n id: attachmentData.id,\r\n type: attachmentData.type,\r\n data: blob\r\n });\r\n}\r\n\r\n/**\r\n * Write multiple attachments in a single atomic operation.\r\n */\r\nexport function putAttachments<RxDocType>(\r\n this: RxDocument<RxDocType>,\r\n attachments: RxAttachmentCreator[]\r\n): Promise<RxAttachment[]> {\r\n return _putAttachmentsImpl(this, attachments);\r\n}\r\n\r\n/**\r\n * get an attachment of the document by its id\r\n */\r\nexport function getAttachment(\r\n this: RxDocument,\r\n id: string\r\n): RxAttachment | null {\r\n ensureSchemaSupportsAttachments(this);\r\n const docData: any = this._data;\r\n if (!docData._attachments || !docData._attachments[id])\r\n return null;\r\n\r\n const attachmentData = docData._attachments[id];\r\n const attachment = fromStorageInstanceResult(\r\n id,\r\n attachmentData,\r\n this\r\n );\r\n return attachment;\r\n}\r\n\r\n/**\r\n * returns all attachments of the document\r\n */\r\nexport function allAttachments(\r\n this: RxDocument\r\n): RxAttachment[] {\r\n ensureSchemaSupportsAttachments(this);\r\n const docData: any = this._data;\r\n\r\n // if there are no attachments, the field is missing\r\n if (!docData._attachments) {\r\n return [];\r\n }\r\n return Object.keys(docData._attachments)\r\n .map(id => {\r\n return fromStorageInstanceResult(\r\n id,\r\n docData._attachments[id],\r\n this\r\n );\r\n });\r\n}\r\n\r\nexport async function preMigrateDocument<RxDocType>(\r\n data: {\r\n docData: RxDocumentData<RxDocType>;\r\n oldCollection: RxCollection<RxDocType>;\r\n }\r\n): Promise<void> {\r\n const attachments = data.docData._attachments;\r\n if (attachments) {\r\n const newAttachments: { [attachmentId: string]: RxAttachmentWriteData; } = {};\r\n await Promise.all(\r\n Object.keys(attachments).map(async (attachmentId) => {\r\n const attachment: RxAttachmentData = attachments[attachmentId];\r\n const docPrimary: string = (data.docData as any)[data.oldCollection.schema.primaryPath];\r\n const rawAttachmentBlob = await data.oldCollection.storageInstance.getAttachmentData(\r\n docPrimary,\r\n attachmentId,\r\n attachment.digest\r\n );\r\n const digest = await data.oldCollection.database.hashFunction(rawAttachmentBlob);\r\n newAttachments[attachmentId] = {\r\n length: rawAttachmentBlob.size,\r\n type: attachment.type,\r\n data: rawAttachmentBlob,\r\n digest\r\n };\r\n })\r\n );\r\n\r\n /**\r\n * Hooks mutate the input\r\n * instead of returning stuff\r\n */\r\n (data.docData as RxDocumentWriteData<RxDocType>)._attachments = newAttachments;\r\n }\r\n}\r\n\r\nexport function postMigrateDocument(_action: any): Promise<void> {\r\n /**\r\n * No longer needed because\r\n * we store the attachments data buffers directly in the document.\r\n */\r\n return PROMISE_RESOLVE_VOID;\r\n}\r\n\r\nexport const RxDBAttachmentsPlugin: RxPlugin = {\r\n name: 'attachments',\r\n rxdb: true,\r\n prototypes: {\r\n RxDocument: (proto: any) => {\r\n proto.putAttachment = putAttachment;\r\n proto.putAttachments = putAttachments;\r\n proto.putAttachmentBase64 = putAttachmentBase64;\r\n proto.getAttachment = getAttachment;\r\n proto.allAttachments = allAttachments;\r\n Object.defineProperty(proto, 'allAttachments$', {\r\n get: function allAttachments$(this: RxDocument) {\r\n return this.$\r\n .pipe(\r\n map((rxDocument: RxDocument) => {\r\n return Object.entries(\r\n rxDocument.toJSON(true)._attachments\r\n ).map(([id, attachmentData]: [string, any]) => {\r\n return fromStorageInstanceResult(\r\n id,\r\n attachmentData,\r\n rxDocument\r\n );\r\n });\r\n })\r\n );\r\n }\r\n });\r\n }\r\n },\r\n overwritable: {},\r\n hooks: {\r\n preMigrateDocument: {\r\n after: preMigrateDocument\r\n },\r\n postMigrateDocument: {\r\n after: postMigrateDocument\r\n }\r\n }\r\n};\r\n\r\n\r\nexport * from './attachments-utils.ts';\r\n"],"mappings":"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","ignoreList":[]}
@@ -70,17 +70,19 @@ export async function cleanupRxCollection(rxCollection, cleanupPolicy) {
70
70
  return true;
71
71
  }
72
72
  await rxDatabase.requestIdlePromise();
73
+ if (rxCollection.closed) {
74
+ return true;
75
+ }
73
76
  var allDone = [];
74
77
  allDone.push(storageInstance.cleanup(cleanupPolicy.minimumDeletedTime));
75
78
  var replicationStates = getFromMapOrCreate(REPLICATION_STATE_BY_COLLECTION, rxCollection, () => []);
76
79
  for (var replicationState of replicationStates) {
77
80
  var meta = replicationState.metaInstance;
78
- if (meta) {
81
+ if (meta && !replicationState.isStopped()) {
79
82
  allDone.push(meta.cleanup(cleanupPolicy.minimumDeletedTime));
80
83
  }
81
84
  }
82
- var hasFalse = (await Promise.all(allDone)).find(v => !v);
83
- return !hasFalse;
85
+ return (await Promise.all(allDone)).every(v => v);
84
86
  });
85
87
  isDone = await RXSTORAGE_CLEANUP_QUEUE;
86
88
  }
@@ -1 +1 @@
1
- {"version":3,"file":"cleanup.js","names":["PROMISE_RESOLVE_TRUE","getFromMapOrCreate","REPLICATION_STATE_BY_COLLECTION","DEFAULT_CLEANUP_POLICY","runAsyncPluginHooks","firstValueFrom","RXSTORAGE_CLEANUP_QUEUE","startCleanupForRxCollection","rxCollection","rxDatabase","database","cleanupPolicy","Object","assign","initialCleanupWait","closed","cleanupRxCollection","runCleanupAfterDelete","collection","promiseWait","minimumCollectionAge","multiInstance","waitForLeadership","storageInstance","isDone","awaitReplicationsInSync","replicationStates","Promise","all","map","replicationState","isStopped","awaitInSync","then","requestIdlePromise","allDone","push","cleanup","minimumDeletedTime","meta","metaInstance","hasFalse","find","v","collectionName","name","databaseName","eventBulks$","catch","runEach"],"sources":["../../../../src/plugins/cleanup/cleanup.ts"],"sourcesContent":["import type { RxCleanupPolicy, RxCollection } from '../../types/index.d.ts';\r\nimport { PROMISE_RESOLVE_TRUE, getFromMapOrCreate } from '../../plugins/utils/index.ts';\r\nimport { REPLICATION_STATE_BY_COLLECTION } from '../replication/index.ts';\r\nimport { DEFAULT_CLEANUP_POLICY } from './cleanup-helper.ts';\r\nimport { runAsyncPluginHooks } from '../../hooks.ts';\r\nimport { filter, firstValueFrom } from 'rxjs';\r\n\r\n/**\r\n * Even on multiple databases,\r\n * the calls to RxStorage().cleanup()\r\n * must never run in parallel.\r\n * The cleanup is a background task which should\r\n * not affect the performance of other, more important tasks.\r\n */\r\nlet RXSTORAGE_CLEANUP_QUEUE: Promise<boolean> = PROMISE_RESOLVE_TRUE;\r\n\r\nexport async function startCleanupForRxCollection(\r\n rxCollection: RxCollection\r\n) {\r\n const rxDatabase = rxCollection.database;\r\n const cleanupPolicy = Object.assign(\r\n {},\r\n DEFAULT_CLEANUP_POLICY,\r\n rxDatabase.cleanupPolicy ? rxDatabase.cleanupPolicy : {}\r\n );\r\n\r\n\r\n await initialCleanupWait(rxCollection, cleanupPolicy);\r\n if (rxCollection.closed) {\r\n return;\r\n }\r\n\r\n // initially cleanup the collection\r\n await cleanupRxCollection(rxCollection, cleanupPolicy);\r\n\r\n /**\r\n * Afterwards we listen to deletes\r\n * and only re-run the cleanup after\r\n * minimumDeletedTime is reached.\r\n */\r\n await runCleanupAfterDelete(rxCollection, cleanupPolicy);\r\n}\r\n\r\n\r\nexport async function initialCleanupWait(collection: RxCollection, cleanupPolicy: RxCleanupPolicy) {\r\n /**\r\n * Wait until minimumDatabaseInstanceAge is reached\r\n * or collection is closed.\r\n */\r\n await collection.promiseWait(cleanupPolicy.minimumCollectionAge);\r\n if (collection.closed) {\r\n return;\r\n }\r\n\r\n if (collection.database.multiInstance && cleanupPolicy.waitForLeadership) {\r\n await collection.database.waitForLeadership();\r\n }\r\n}\r\n\r\n/**\r\n * Runs the cleanup for a single RxCollection\r\n */\r\nexport async function cleanupRxCollection(\r\n rxCollection: RxCollection,\r\n cleanupPolicy: RxCleanupPolicy\r\n) {\r\n const rxDatabase = rxCollection.database;\r\n const storageInstance = rxCollection.storageInstance;\r\n\r\n // run cleanup() until it returns true\r\n let isDone = false;\r\n while (!isDone && !rxCollection.closed) {\r\n if (cleanupPolicy.awaitReplicationsInSync) {\r\n const replicationStates = getFromMapOrCreate(\r\n REPLICATION_STATE_BY_COLLECTION,\r\n rxCollection,\r\n () => []\r\n );\r\n await Promise.all(\r\n replicationStates.map(replicationState => {\r\n if (!replicationState.isStopped()) {\r\n return replicationState.awaitInSync();\r\n }\r\n })\r\n );\r\n }\r\n if (rxCollection.closed) {\r\n return;\r\n }\r\n RXSTORAGE_CLEANUP_QUEUE = RXSTORAGE_CLEANUP_QUEUE\r\n .then(async () => {\r\n if (rxCollection.closed) {\r\n return true;\r\n }\r\n await rxDatabase.requestIdlePromise();\r\n const allDone: Promise<boolean>[] = [];\r\n allDone.push(storageInstance.cleanup(cleanupPolicy.minimumDeletedTime));\r\n const replicationStates = getFromMapOrCreate(\r\n REPLICATION_STATE_BY_COLLECTION,\r\n rxCollection,\r\n () => []\r\n );\r\n for (const replicationState of replicationStates) {\r\n const meta = replicationState.metaInstance;\r\n if (meta) {\r\n allDone.push(meta.cleanup(cleanupPolicy.minimumDeletedTime));\r\n }\r\n }\r\n\r\n const hasFalse = (await Promise.all(allDone)).find(v => !v);\r\n return !hasFalse;\r\n });\r\n isDone = await RXSTORAGE_CLEANUP_QUEUE;\r\n }\r\n await runAsyncPluginHooks('postCleanup', {\r\n collectionName: rxCollection.name,\r\n databaseName: rxDatabase.name\r\n });\r\n}\r\n\r\nexport async function runCleanupAfterDelete(\r\n rxCollection: RxCollection,\r\n cleanupPolicy: RxCleanupPolicy\r\n) {\r\n while (!rxCollection.closed) {\r\n /**\r\n * In theory we should wait here until a document is deleted.\r\n * But this would mean we have to search through all events ever processed.\r\n * So instead we just wait for any write event and then we anyway throttle\r\n * the calls with the promiseWait() below.\r\n */\r\n await firstValueFrom(rxCollection.eventBulks$).catch(() => { });\r\n\r\n await rxCollection.promiseWait(cleanupPolicy.runEach);\r\n if (rxCollection.closed) {\r\n return;\r\n }\r\n await cleanupRxCollection(rxCollection, cleanupPolicy);\r\n }\r\n}\r\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"cleanup.js","names":["PROMISE_RESOLVE_TRUE","getFromMapOrCreate","REPLICATION_STATE_BY_COLLECTION","DEFAULT_CLEANUP_POLICY","runAsyncPluginHooks","firstValueFrom","RXSTORAGE_CLEANUP_QUEUE","startCleanupForRxCollection","rxCollection","rxDatabase","database","cleanupPolicy","Object","assign","initialCleanupWait","closed","cleanupRxCollection","runCleanupAfterDelete","collection","promiseWait","minimumCollectionAge","multiInstance","waitForLeadership","storageInstance","isDone","awaitReplicationsInSync","replicationStates","Promise","all","map","replicationState","isStopped","awaitInSync","then","requestIdlePromise","allDone","push","cleanup","minimumDeletedTime","meta","metaInstance","every","v","collectionName","name","databaseName","eventBulks$","catch","runEach"],"sources":["../../../../src/plugins/cleanup/cleanup.ts"],"sourcesContent":["import type { RxCleanupPolicy, RxCollection } from '../../types/index.d.ts';\r\nimport { PROMISE_RESOLVE_TRUE, getFromMapOrCreate } from '../../plugins/utils/index.ts';\r\nimport { REPLICATION_STATE_BY_COLLECTION } from '../replication/index.ts';\r\nimport { DEFAULT_CLEANUP_POLICY } from './cleanup-helper.ts';\r\nimport { runAsyncPluginHooks } from '../../hooks.ts';\r\nimport { filter, firstValueFrom } from 'rxjs';\r\n\r\n/**\r\n * Even on multiple databases,\r\n * the calls to RxStorage().cleanup()\r\n * must never run in parallel.\r\n * The cleanup is a background task which should\r\n * not affect the performance of other, more important tasks.\r\n */\r\nlet RXSTORAGE_CLEANUP_QUEUE: Promise<boolean> = PROMISE_RESOLVE_TRUE;\r\n\r\nexport async function startCleanupForRxCollection(\r\n rxCollection: RxCollection\r\n) {\r\n const rxDatabase = rxCollection.database;\r\n const cleanupPolicy = Object.assign(\r\n {},\r\n DEFAULT_CLEANUP_POLICY,\r\n rxDatabase.cleanupPolicy ? rxDatabase.cleanupPolicy : {}\r\n );\r\n\r\n\r\n await initialCleanupWait(rxCollection, cleanupPolicy);\r\n if (rxCollection.closed) {\r\n return;\r\n }\r\n\r\n // initially cleanup the collection\r\n await cleanupRxCollection(rxCollection, cleanupPolicy);\r\n\r\n /**\r\n * Afterwards we listen to deletes\r\n * and only re-run the cleanup after\r\n * minimumDeletedTime is reached.\r\n */\r\n await runCleanupAfterDelete(rxCollection, cleanupPolicy);\r\n}\r\n\r\n\r\nexport async function initialCleanupWait(collection: RxCollection, cleanupPolicy: RxCleanupPolicy) {\r\n /**\r\n * Wait until minimumDatabaseInstanceAge is reached\r\n * or collection is closed.\r\n */\r\n await collection.promiseWait(cleanupPolicy.minimumCollectionAge);\r\n if (collection.closed) {\r\n return;\r\n }\r\n\r\n if (collection.database.multiInstance && cleanupPolicy.waitForLeadership) {\r\n await collection.database.waitForLeadership();\r\n }\r\n}\r\n\r\n/**\r\n * Runs the cleanup for a single RxCollection\r\n */\r\nexport async function cleanupRxCollection(\r\n rxCollection: RxCollection,\r\n cleanupPolicy: RxCleanupPolicy\r\n) {\r\n const rxDatabase = rxCollection.database;\r\n const storageInstance = rxCollection.storageInstance;\r\n\r\n // run cleanup() until it returns true\r\n let isDone = false;\r\n while (!isDone && !rxCollection.closed) {\r\n if (cleanupPolicy.awaitReplicationsInSync) {\r\n const replicationStates = getFromMapOrCreate(\r\n REPLICATION_STATE_BY_COLLECTION,\r\n rxCollection,\r\n () => []\r\n );\r\n await Promise.all(\r\n replicationStates.map(replicationState => {\r\n if (!replicationState.isStopped()) {\r\n return replicationState.awaitInSync();\r\n }\r\n })\r\n );\r\n }\r\n if (rxCollection.closed) {\r\n return;\r\n }\r\n RXSTORAGE_CLEANUP_QUEUE = RXSTORAGE_CLEANUP_QUEUE\r\n .then(async () => {\r\n if (rxCollection.closed) {\r\n return true;\r\n }\r\n await rxDatabase.requestIdlePromise();\r\n if (rxCollection.closed) {\r\n return true;\r\n }\r\n const allDone: Promise<boolean>[] = [];\r\n allDone.push(storageInstance.cleanup(cleanupPolicy.minimumDeletedTime));\r\n const replicationStates = getFromMapOrCreate(\r\n REPLICATION_STATE_BY_COLLECTION,\r\n rxCollection,\r\n () => []\r\n );\r\n for (const replicationState of replicationStates) {\r\n const meta = replicationState.metaInstance;\r\n if (meta && !replicationState.isStopped()) {\r\n allDone.push(meta.cleanup(cleanupPolicy.minimumDeletedTime));\r\n }\r\n }\r\n\r\n return (await Promise.all(allDone)).every(v => v);\r\n });\r\n isDone = await RXSTORAGE_CLEANUP_QUEUE;\r\n }\r\n await runAsyncPluginHooks('postCleanup', {\r\n collectionName: rxCollection.name,\r\n databaseName: rxDatabase.name\r\n });\r\n}\r\n\r\nexport async function runCleanupAfterDelete(\r\n rxCollection: RxCollection,\r\n cleanupPolicy: RxCleanupPolicy\r\n) {\r\n while (!rxCollection.closed) {\r\n /**\r\n * In theory we should wait here until a document is deleted.\r\n * But this would mean we have to search through all events ever processed.\r\n * So instead we just wait for any write event and then we anyway throttle\r\n * the calls with the promiseWait() below.\r\n */\r\n await firstValueFrom(rxCollection.eventBulks$).catch(() => { });\r\n\r\n await rxCollection.promiseWait(cleanupPolicy.runEach);\r\n if (rxCollection.closed) {\r\n return;\r\n }\r\n await cleanupRxCollection(rxCollection, cleanupPolicy);\r\n }\r\n}\r\n"],"mappings":"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","ignoreList":[]}
@@ -2,6 +2,7 @@ import { newRxError } from "../../rx-error.js";
2
2
  import { clone, deepEqual, ensureNotFalsy, getProperty, now, objectPathMonad, setProperty, toArray } from "../../plugins/utils/index.js";
3
3
  import { getQueryMatcher, META_LWT_UNIX_TIME_MAX, overwritable } from "../../index.js";
4
4
  import { mingoUpdater } from "../update/mingo-updater.js";
5
+ import { fillObjectWithDefaults } from "../../rx-schema-helper.js";
5
6
  export async function updateCRDT(entry) {
6
7
  entry = overwritable.deepFreezeWhenDevMode(entry);
7
8
  var jsonSchema = this.collection.schema.jsonSchema;
@@ -244,6 +245,42 @@ export var RxDBcrdtPlugin = {
244
245
  }
245
246
  });
246
247
  };
248
+ var oldincrementalRemove = proto.incrementalRemove;
249
+ proto.incrementalRemove = function () {
250
+ if (!this.collection.schema.jsonSchema.crdt) {
251
+ return oldincrementalRemove.call(this);
252
+ }
253
+ return this.updateCRDT({
254
+ ifMatch: {
255
+ $set: {
256
+ _deleted: true
257
+ }
258
+ }
259
+ });
260
+ };
261
+ var oldModify = proto.modify;
262
+ proto.modify = function (fn, context) {
263
+ if (!this.collection.schema.jsonSchema.crdt) {
264
+ return oldModify.call(this, fn, context);
265
+ }
266
+ throw newRxError('CRDT4', {
267
+ id: this.primary,
268
+ args: {
269
+ method: 'modify'
270
+ }
271
+ });
272
+ };
273
+ var oldPatch = proto.patch;
274
+ proto.patch = function (patch) {
275
+ if (!this.collection.schema.jsonSchema.crdt) {
276
+ return oldPatch.call(this, patch);
277
+ }
278
+ return this.updateCRDT({
279
+ ifMatch: {
280
+ $set: patch
281
+ }
282
+ });
283
+ };
247
284
  var oldincrementalPatch = proto.incrementalPatch;
248
285
  proto.incrementalPatch = function (patch) {
249
286
  if (!this.collection.schema.jsonSchema.crdt) {
@@ -271,6 +308,15 @@ export var RxDBcrdtPlugin = {
271
308
  });
272
309
  }
273
310
  };
311
+ var oldUpdate = proto.update;
312
+ proto.update = function (updateObj) {
313
+ if (!this.collection.schema.jsonSchema.crdt) {
314
+ return oldUpdate.call(this, updateObj);
315
+ }
316
+ return this.updateCRDT({
317
+ ifMatch: updateObj
318
+ });
319
+ };
274
320
  },
275
321
  RxCollection: proto => {
276
322
  proto.insertCRDT = insertCRDT;
@@ -347,6 +393,12 @@ export var RxDBcrdtPlugin = {
347
393
  collection.bulkInsert = async function (docsData) {
348
394
  var storageToken = await collection.database.storageToken;
349
395
  var useDocsData = await Promise.all(docsData.map(async docData => {
396
+ /**
397
+ * Fill schema default values before creating CRDT operations,
398
+ * so that default values are captured in the operations and
399
+ * will be preserved during rebuildFromCRDT (conflict resolution).
400
+ */
401
+ fillObjectWithDefaults(collection.schema, docData);
350
402
  var setMe = {};
351
403
  Object.entries(docData).forEach(([key, value]) => {
352
404
  if (!key.startsWith('_') && key !== crdtField) {