@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":"index.js","names":["pkg","AES","enc","cryptoEnc","wrapRxStorageInstance","newRxError","newRxTypeError","hasEncryption","arrayBufferToBase64","base64ToArrayBuffer","clone","ensureNotFalsy","flatClone","getProperty","setProperty","MINIMUM_PASSWORD_LENGTH","encryptString","value","password","encrypted","encrypt","toString","decryptString","cipherText","args","decrypted","decrypt","ret","Utf8","wrappedKeyEncryptionCryptoJsStorage","Object","assign","storage","createStorageInstance","params","validatePassword","schema","retInstance","database","databaseName","collection","collectionName","schemaWithoutEncrypted","attachments","forEach","key","properties","type","instance","modifyToStorage","docData","cloneWithoutAttachments","path","stringValue","JSON","stringify","newAttachments","Promise","all","entries","_attachments","map","id","attachment","useAttachment","data","ab","arrayBuffer","base64","Blob","modifyFromStorage","decryptedParsed","parse","modifyAttachmentFromStorage","attachmentData","encryptedText","text","decryptedBase64","undefined","length","minPassLength"],"sources":["../../../../src/plugins/encryption-crypto-js/index.ts"],"sourcesContent":["/**\r\n * this plugin adds the encryption-capabilities to rxdb\r\n * It's using crypto-js/aes for password-encryption\r\n * @link https://github.com/brix/crypto-js\r\n */\r\nimport pkg from 'crypto-js';\r\nconst { AES, enc: cryptoEnc } = pkg;\r\n\r\nimport { wrapRxStorageInstance } from '../../plugin-helpers.ts';\r\nimport { newRxError, newRxTypeError } from '../../rx-error.ts';\r\nimport { hasEncryption } from '../../rx-storage-helper.ts';\r\nimport type {\r\n InternalStoreDocType,\r\n RxAttachmentWriteData,\r\n RxDocumentData,\r\n RxDocumentWriteData,\r\n RxJsonSchema,\r\n RxStorage,\r\n RxStorageInstanceCreationParams\r\n} from '../../types/index.d.ts';\r\nimport {\r\n arrayBufferToBase64,\r\n base64ToArrayBuffer,\r\n clone,\r\n ensureNotFalsy,\r\n flatClone,\r\n getProperty,\r\n setProperty\r\n} from '../../plugins/utils/index.ts';\r\n\r\nexport const MINIMUM_PASSWORD_LENGTH: 8 = 8;\r\n\r\n\r\nexport function encryptString(value: string, password: string): string {\r\n const encrypted = AES.encrypt(value, password);\r\n return encrypted.toString();\r\n}\r\n\r\nexport function decryptString(cipherText: string, password: any): string {\r\n /**\r\n * Trying to decrypt non-strings\r\n * will cause no errors and will be hard to debug.\r\n * So instead we do this check here.\r\n */\r\n if (typeof cipherText !== 'string') {\r\n throw newRxError('SNH', {\r\n args: {\r\n cipherText\r\n }\r\n });\r\n }\r\n\r\n const decrypted = AES.decrypt(cipherText, password);\r\n const ret = decrypted.toString(cryptoEnc.Utf8);\r\n return ret;\r\n}\r\n\r\nexport type InternalStorePasswordDocType = InternalStoreDocType<{\r\n hash: string;\r\n}>;\r\n\r\nexport function wrappedKeyEncryptionCryptoJsStorage<Internals, InstanceCreationOptions>(\r\n args: {\r\n storage: RxStorage<Internals, InstanceCreationOptions>;\r\n }\r\n): RxStorage<Internals, InstanceCreationOptions> {\r\n return Object.assign(\r\n {},\r\n args.storage,\r\n {\r\n async createStorageInstance<RxDocType>(\r\n params: RxStorageInstanceCreationParams<RxDocType, any>\r\n ) {\r\n if (typeof params.password !== 'undefined') {\r\n validatePassword(params.password as any);\r\n }\r\n\r\n if (!hasEncryption(params.schema)) {\r\n const retInstance = await args.storage.createStorageInstance(params);\r\n return retInstance;\r\n }\r\n\r\n if (!params.password) {\r\n throw newRxError('EN3', {\r\n database: params.databaseName,\r\n collection: params.collectionName,\r\n schema: params.schema\r\n });\r\n }\r\n const password = params.password;\r\n\r\n const schemaWithoutEncrypted: RxJsonSchema<RxDocumentData<RxDocType>> = clone(params.schema);\r\n delete schemaWithoutEncrypted.encrypted;\r\n if (schemaWithoutEncrypted.attachments) {\r\n schemaWithoutEncrypted.attachments.encrypted = false;\r\n }\r\n\r\n /**\r\n * Encrypted data is always stored as string\r\n * so we have to change the schema to have \"type\": \"string\"\r\n * on encrypted fields.\r\n */\r\n ensureNotFalsy(params.schema.encrypted).forEach(key => {\r\n (schemaWithoutEncrypted as any).properties[key].type = 'string';\r\n delete (schemaWithoutEncrypted as any).properties[key].properties;\r\n });\r\n\r\n const instance = await args.storage.createStorageInstance(\r\n Object.assign(\r\n {},\r\n params,\r\n {\r\n schema: schemaWithoutEncrypted\r\n }\r\n )\r\n );\r\n\r\n async function modifyToStorage(docData: RxDocumentWriteData<RxDocType>) {\r\n docData = cloneWithoutAttachments(docData);\r\n ensureNotFalsy(params.schema.encrypted)\r\n .forEach(path => {\r\n const value = getProperty(docData, path);\r\n if (typeof value === 'undefined') {\r\n return;\r\n }\r\n\r\n const stringValue = JSON.stringify(value);\r\n const encrypted = encryptString(stringValue, password);\r\n setProperty(docData, path, encrypted);\r\n });\r\n\r\n // handle attachments\r\n if (\r\n params.schema.attachments &&\r\n params.schema.attachments.encrypted\r\n ) {\r\n const newAttachments: typeof docData._attachments = {};\r\n await Promise.all(\r\n Object.entries(docData._attachments).map(async ([id, attachment]) => {\r\n const useAttachment: RxAttachmentWriteData = flatClone(attachment) as any;\r\n if (useAttachment.data) {\r\n const ab = await useAttachment.data.arrayBuffer();\r\n const base64 = arrayBufferToBase64(ab);\r\n const encrypted = encryptString(base64, password);\r\n useAttachment.data = new Blob([encrypted], { type: useAttachment.type });\r\n }\r\n newAttachments[id] = useAttachment;\r\n })\r\n );\r\n docData._attachments = newAttachments;\r\n }\r\n return docData;\r\n }\r\n function modifyFromStorage(docData: RxDocumentData<any>): Promise<RxDocumentData<RxDocType>> {\r\n docData = cloneWithoutAttachments(docData);\r\n ensureNotFalsy(params.schema.encrypted)\r\n .forEach(path => {\r\n const value = getProperty(docData, path);\r\n if (typeof value === 'undefined') {\r\n return;\r\n }\r\n const decrypted = decryptString(value, password);\r\n const decryptedParsed = JSON.parse(decrypted);\r\n setProperty(docData, path, decryptedParsed);\r\n });\r\n return docData;\r\n }\r\n\r\n async function modifyAttachmentFromStorage(attachmentData: Blob): Promise<Blob> {\r\n if (\r\n params.schema.attachments &&\r\n params.schema.attachments.encrypted\r\n ) {\r\n const encryptedText = await attachmentData.text();\r\n const decryptedBase64 = decryptString(encryptedText, password);\r\n const ab = base64ToArrayBuffer(decryptedBase64);\r\n return new Blob([ab], attachmentData.type ? { type: attachmentData.type } : undefined);\r\n } else {\r\n return attachmentData;\r\n }\r\n }\r\n\r\n return wrapRxStorageInstance(\r\n params.schema,\r\n instance,\r\n modifyToStorage,\r\n modifyFromStorage,\r\n modifyAttachmentFromStorage\r\n );\r\n }\r\n }\r\n );\r\n}\r\n\r\n\r\n\r\n\r\n\r\nfunction cloneWithoutAttachments<T>(data: RxDocumentWriteData<T>): RxDocumentData<T> {\r\n const attachments = data._attachments;\r\n data = flatClone(data);\r\n delete (data as any)._attachments;\r\n data = clone(data);\r\n data._attachments = attachments;\r\n return data as any;\r\n}\r\n\r\nfunction validatePassword(password: string) {\r\n if (typeof password !== 'string') {\r\n throw newRxTypeError('EN1', {\r\n password\r\n });\r\n }\r\n if (password.length < MINIMUM_PASSWORD_LENGTH) {\r\n throw newRxError('EN2', {\r\n minPassLength: MINIMUM_PASSWORD_LENGTH,\r\n password\r\n });\r\n }\r\n}\r\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["pkg","AES","enc","cryptoEnc","wrapRxStorageInstance","newRxError","newRxTypeError","hasEncryption","arrayBufferToBase64","base64ToArrayBuffer","clone","ensureNotFalsy","flatClone","getProperty","setProperty","MINIMUM_PASSWORD_LENGTH","encryptString","value","password","encrypted","encrypt","toString","decryptString","cipherText","args","decrypted","decrypt","ret","Utf8","wrappedKeyEncryptionCryptoJsStorage","Object","assign","storage","createStorageInstance","params","validatePassword","schema","retInstance","database","databaseName","collection","collectionName","schemaWithoutEncrypted","attachments","forEach","key","pathParts","split","length","properties","type","currentSchemaLevel","i","instance","modifyToStorage","docData","cloneWithoutAttachments","path","stringValue","JSON","stringify","newAttachments","Promise","all","entries","_attachments","map","id","attachment","useAttachment","data","ab","arrayBuffer","base64","Blob","modifyFromStorage","decryptedParsed","parse","modifyAttachmentFromStorage","attachmentData","encryptedText","text","decryptedBase64","undefined","passwordType","minPassLength","passwordLength"],"sources":["../../../../src/plugins/encryption-crypto-js/index.ts"],"sourcesContent":["/**\r\n * this plugin adds the encryption-capabilities to rxdb\r\n * It's using crypto-js/aes for password-encryption\r\n * @link https://github.com/brix/crypto-js\r\n */\r\nimport pkg from 'crypto-js';\r\nconst { AES, enc: cryptoEnc } = pkg;\r\n\r\nimport { wrapRxStorageInstance } from '../../plugin-helpers.ts';\r\nimport { newRxError, newRxTypeError } from '../../rx-error.ts';\r\nimport { hasEncryption } from '../../rx-storage-helper.ts';\r\nimport type {\r\n InternalStoreDocType,\r\n RxAttachmentWriteData,\r\n RxDocumentData,\r\n RxDocumentWriteData,\r\n RxJsonSchema,\r\n RxStorage,\r\n RxStorageInstanceCreationParams\r\n} from '../../types/index.d.ts';\r\nimport {\r\n arrayBufferToBase64,\r\n base64ToArrayBuffer,\r\n clone,\r\n ensureNotFalsy,\r\n flatClone,\r\n getProperty,\r\n setProperty\r\n} from '../../plugins/utils/index.ts';\r\n\r\nexport const MINIMUM_PASSWORD_LENGTH: 8 = 8;\r\n\r\n\r\nexport function encryptString(value: string, password: string): string {\r\n const encrypted = AES.encrypt(value, password);\r\n return encrypted.toString();\r\n}\r\n\r\nexport function decryptString(cipherText: string, password: any): string {\r\n /**\r\n * Trying to decrypt non-strings\r\n * will cause no errors and will be hard to debug.\r\n * So instead we do this check here.\r\n */\r\n if (typeof cipherText !== 'string') {\r\n throw newRxError('SNH', {\r\n args: {\r\n cipherText\r\n }\r\n });\r\n }\r\n\r\n const decrypted = AES.decrypt(cipherText, password);\r\n const ret = decrypted.toString(cryptoEnc.Utf8);\r\n return ret;\r\n}\r\n\r\nexport type InternalStorePasswordDocType = InternalStoreDocType<{\r\n hash: string;\r\n}>;\r\n\r\nexport function wrappedKeyEncryptionCryptoJsStorage<Internals, InstanceCreationOptions>(\r\n args: {\r\n storage: RxStorage<Internals, InstanceCreationOptions>;\r\n }\r\n): RxStorage<Internals, InstanceCreationOptions> {\r\n return Object.assign(\r\n {},\r\n args.storage,\r\n {\r\n async createStorageInstance<RxDocType>(\r\n params: RxStorageInstanceCreationParams<RxDocType, any>\r\n ) {\r\n if (typeof params.password !== 'undefined') {\r\n validatePassword(params.password as any);\r\n }\r\n\r\n if (!hasEncryption(params.schema)) {\r\n const retInstance = await args.storage.createStorageInstance(params);\r\n return retInstance;\r\n }\r\n\r\n if (!params.password) {\r\n throw newRxError('EN3', {\r\n database: params.databaseName,\r\n collection: params.collectionName,\r\n schema: params.schema\r\n });\r\n }\r\n const password = params.password;\r\n\r\n const schemaWithoutEncrypted: RxJsonSchema<RxDocumentData<RxDocType>> = clone(params.schema);\r\n delete schemaWithoutEncrypted.encrypted;\r\n if (schemaWithoutEncrypted.attachments) {\r\n schemaWithoutEncrypted.attachments.encrypted = false;\r\n }\r\n\r\n /**\r\n * Encrypted data is always stored as string\r\n * so we have to replace the schema definition of\r\n * encrypted fields with just {type: 'string'}.\r\n * All type-specific keywords (properties, required,\r\n * items, maxLength, enum etc.) must be removed because\r\n * they do not apply to the encrypted ciphertext string.\r\n */\r\n ensureNotFalsy(params.schema.encrypted).forEach(key => {\r\n const pathParts = key.split('.');\r\n if (pathParts.length === 1) {\r\n (schemaWithoutEncrypted as any).properties[key] = { type: 'string' };\r\n } else {\r\n // Navigate nested schema structure: properties.a.properties.b.properties.c\r\n let currentSchemaLevel: any = schemaWithoutEncrypted;\r\n for (let i = 0; i < pathParts.length - 1; i++) {\r\n currentSchemaLevel = currentSchemaLevel.properties[pathParts[i]];\r\n }\r\n currentSchemaLevel.properties[pathParts[pathParts.length - 1]] = { type: 'string' };\r\n }\r\n });\r\n\r\n const instance = await args.storage.createStorageInstance(\r\n Object.assign(\r\n {},\r\n params,\r\n {\r\n schema: schemaWithoutEncrypted\r\n }\r\n )\r\n );\r\n\r\n async function modifyToStorage(docData: RxDocumentWriteData<RxDocType>) {\r\n docData = cloneWithoutAttachments(docData);\r\n ensureNotFalsy(params.schema.encrypted)\r\n .forEach(path => {\r\n const value = getProperty(docData, path);\r\n if (typeof value === 'undefined') {\r\n return;\r\n }\r\n\r\n const stringValue = JSON.stringify(value);\r\n const encrypted = encryptString(stringValue, password);\r\n setProperty(docData, path, encrypted);\r\n });\r\n\r\n // handle attachments\r\n if (\r\n params.schema.attachments &&\r\n params.schema.attachments.encrypted\r\n ) {\r\n const newAttachments: typeof docData._attachments = {};\r\n await Promise.all(\r\n Object.entries(docData._attachments).map(async ([id, attachment]) => {\r\n const useAttachment: RxAttachmentWriteData = flatClone(attachment) as any;\r\n if (useAttachment.data) {\r\n const ab = await useAttachment.data.arrayBuffer();\r\n const base64 = arrayBufferToBase64(ab);\r\n const encrypted = encryptString(base64, password);\r\n useAttachment.data = new Blob([encrypted], { type: useAttachment.type });\r\n }\r\n newAttachments[id] = useAttachment;\r\n })\r\n );\r\n docData._attachments = newAttachments;\r\n }\r\n return docData;\r\n }\r\n function modifyFromStorage(docData: RxDocumentData<any>): Promise<RxDocumentData<RxDocType>> {\r\n docData = cloneWithoutAttachments(docData);\r\n ensureNotFalsy(params.schema.encrypted)\r\n .forEach(path => {\r\n const value = getProperty(docData, path);\r\n if (typeof value === 'undefined') {\r\n return;\r\n }\r\n const decrypted = decryptString(value, password);\r\n const decryptedParsed = JSON.parse(decrypted);\r\n setProperty(docData, path, decryptedParsed);\r\n });\r\n return docData;\r\n }\r\n\r\n async function modifyAttachmentFromStorage(attachmentData: Blob): Promise<Blob> {\r\n if (\r\n params.schema.attachments &&\r\n params.schema.attachments.encrypted\r\n ) {\r\n const encryptedText = await attachmentData.text();\r\n const decryptedBase64 = decryptString(encryptedText, password);\r\n const ab = base64ToArrayBuffer(decryptedBase64);\r\n return new Blob([ab], attachmentData.type ? { type: attachmentData.type } : undefined);\r\n } else {\r\n return attachmentData;\r\n }\r\n }\r\n\r\n return wrapRxStorageInstance(\r\n params.schema,\r\n instance,\r\n modifyToStorage,\r\n modifyFromStorage,\r\n modifyAttachmentFromStorage\r\n );\r\n }\r\n }\r\n );\r\n}\r\n\r\n\r\n\r\n\r\n\r\nfunction cloneWithoutAttachments<T>(data: RxDocumentWriteData<T>): RxDocumentData<T> {\r\n const attachments = data._attachments;\r\n data = flatClone(data);\r\n delete (data as any)._attachments;\r\n data = clone(data);\r\n data._attachments = attachments;\r\n return data as any;\r\n}\r\n\r\nfunction validatePassword(password: string) {\r\n if (typeof password !== 'string') {\r\n throw newRxTypeError('EN1', {\r\n passwordType: typeof password\r\n });\r\n }\r\n if (password.length < MINIMUM_PASSWORD_LENGTH) {\r\n throw newRxError('EN2', {\r\n minPassLength: MINIMUM_PASSWORD_LENGTH,\r\n passwordLength: password.length\r\n });\r\n }\r\n}\r\n"],"mappings":"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","ignoreList":[]}
@@ -7,6 +7,7 @@ import { getBroadcastChannelReference, removeBroadcastChannelReference } from ".
7
7
  import { PROMISE_RESOLVE_TRUE, getFromMapOrCreate } from "../utils/index.js";
8
8
  var LEADER_ELECTORS_OF_DB = new WeakMap();
9
9
  var LEADER_ELECTOR_BY_BROADCAST_CHANNEL = new WeakMap();
10
+ export var OPEN_LEADER_ELECTORS = new Set();
10
11
 
11
12
  /**
12
13
  * Returns the leader elector of a broadcast channel.
@@ -40,10 +41,8 @@ export function getForDatabase() {
40
41
  return ret;
41
42
  };
42
43
  var elector = getLeaderElectorByBroadcastChannel(broadcastChannel);
43
- if (!elector) {
44
- elector = getLeaderElectorByBroadcastChannel(broadcastChannel);
45
- LEADER_ELECTORS_OF_DB.set(this, elector);
46
- }
44
+ LEADER_ELECTORS_OF_DB.set(this, elector);
45
+ OPEN_LEADER_ELECTORS.add(elector);
47
46
 
48
47
  /**
49
48
  * Overwrite for caching
@@ -72,6 +71,7 @@ export function onClose(db) {
72
71
  var has = LEADER_ELECTORS_OF_DB.get(db);
73
72
  if (has) {
74
73
  has.die();
74
+ OPEN_LEADER_ELECTORS.delete(has);
75
75
  }
76
76
  }
77
77
  export var rxdb = true;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["createLeaderElection","getBroadcastChannelReference","removeBroadcastChannelReference","PROMISE_RESOLVE_TRUE","getFromMapOrCreate","LEADER_ELECTORS_OF_DB","WeakMap","LEADER_ELECTOR_BY_BROADCAST_CHANNEL","getLeaderElectorByBroadcastChannel","broadcastChannel","getForDatabase","storage","name","token","oldClose","close","bind","ret","elector","set","leaderElector","isLeader","multiInstance","waitForLeadership","awaitLeadership","then","onClose","db","has","get","die","rxdb","prototypes","RxDatabase","proto","RxDBLeaderElectionPlugin","hooks","preCloseRxDatabase","after"],"sources":["../../../../src/plugins/leader-election/index.ts"],"sourcesContent":["/**\r\n * this plugin adds the leader-election-capabilities to rxdb\r\n */\r\n\r\nimport {\r\n createLeaderElection,\r\n LeaderElector,\r\n BroadcastChannel\r\n} from 'broadcast-channel';\r\nimport {\r\n getBroadcastChannelReference,\r\n removeBroadcastChannelReference\r\n} from '../../rx-storage-multiinstance.ts';\r\n\r\nimport type {\r\n RxDatabase,\r\n RxPlugin\r\n} from '../../types/index.d.ts';\r\nimport { PROMISE_RESOLVE_TRUE, getFromMapOrCreate } from '../utils/index.ts';\r\n\r\nconst LEADER_ELECTORS_OF_DB: WeakMap<RxDatabase, LeaderElector> = new WeakMap();\r\nconst LEADER_ELECTOR_BY_BROADCAST_CHANNEL: WeakMap<BroadcastChannel, LeaderElector> = new WeakMap();\r\n\r\n\r\n/**\r\n * Returns the leader elector of a broadcast channel.\r\n * Used to ensure we reuse the same elector for the channel each time.\r\n */\r\nexport function getLeaderElectorByBroadcastChannel(broadcastChannel: BroadcastChannel): LeaderElector {\r\n return getFromMapOrCreate(\r\n LEADER_ELECTOR_BY_BROADCAST_CHANNEL,\r\n broadcastChannel,\r\n () => createLeaderElection(broadcastChannel)\r\n );\r\n}\r\n\r\n/**\r\n * @overwrites RxDatabase().leaderElector for caching\r\n */\r\nexport function getForDatabase(this: RxDatabase): LeaderElector {\r\n const broadcastChannel = getBroadcastChannelReference(\r\n this.storage.name,\r\n this.token,\r\n this.name,\r\n this\r\n );\r\n\r\n /**\r\n * Clean up the reference on RxDatabase.close()\r\n */\r\n const oldClose = this.close.bind(this);\r\n this.close = async function () {\r\n /**\r\n * It is very important that we remove the\r\n * potential leader elected broadcast channel\r\n * AFTER the database is closed. Otherwise an\r\n * instance running in another browser tab can\r\n * already start working on stuff and interfering\r\n * with a half-closed database and its collections.\r\n */\r\n const ret = await oldClose();\r\n removeBroadcastChannelReference(this.token, this);\r\n return ret;\r\n };\r\n\r\n\r\n let elector = getLeaderElectorByBroadcastChannel(broadcastChannel);\r\n if (!elector) {\r\n elector = getLeaderElectorByBroadcastChannel(broadcastChannel);\r\n LEADER_ELECTORS_OF_DB.set(\r\n this,\r\n elector\r\n );\r\n }\r\n\r\n /**\r\n * Overwrite for caching\r\n */\r\n this.leaderElector = () => elector;\r\n\r\n return elector;\r\n}\r\n\r\nexport function isLeader(this: RxDatabase): boolean {\r\n if (!this.multiInstance) {\r\n return true;\r\n }\r\n return this.leaderElector().isLeader;\r\n}\r\n\r\nexport function waitForLeadership(this: RxDatabase): Promise<boolean> {\r\n if (!this.multiInstance) {\r\n return PROMISE_RESOLVE_TRUE;\r\n } else {\r\n return this.leaderElector()\r\n .awaitLeadership()\r\n .then(() => true);\r\n }\r\n}\r\n\r\n/**\r\n * runs when the database gets closed\r\n */\r\nexport function onClose(db: RxDatabase) {\r\n const has = LEADER_ELECTORS_OF_DB.get(db);\r\n if (has) {\r\n has.die();\r\n }\r\n}\r\n\r\nexport const rxdb = true;\r\nexport const prototypes = {\r\n RxDatabase: (proto: any) => {\r\n proto.leaderElector = getForDatabase;\r\n proto.isLeader = isLeader;\r\n proto.waitForLeadership = waitForLeadership;\r\n }\r\n};\r\n\r\nexport const RxDBLeaderElectionPlugin: RxPlugin = {\r\n name: 'leader-election',\r\n rxdb,\r\n prototypes,\r\n hooks: {\r\n preCloseRxDatabase: {\r\n after: onClose\r\n }\r\n }\r\n};\r\n"],"mappings":"AAAA;AACA;AACA;;AAEA,SACIA,oBAAoB,QAGjB,mBAAmB;AAC1B,SACIC,4BAA4B,EAC5BC,+BAA+B,QAC5B,mCAAmC;AAM1C,SAASC,oBAAoB,EAAEC,kBAAkB,QAAQ,mBAAmB;AAE5E,IAAMC,qBAAyD,GAAG,IAAIC,OAAO,CAAC,CAAC;AAC/E,IAAMC,mCAA6E,GAAG,IAAID,OAAO,CAAC,CAAC;;AAGnG;AACA;AACA;AACA;AACA,OAAO,SAASE,kCAAkCA,CAACC,gBAAkC,EAAiB;EAClG,OAAOL,kBAAkB,CACrBG,mCAAmC,EACnCE,gBAAgB,EAChB,MAAMT,oBAAoB,CAACS,gBAAgB,CAC/C,CAAC;AACL;;AAEA;AACA;AACA;AACA,OAAO,SAASC,cAAcA,CAAA,EAAkC;EAC5D,IAAMD,gBAAgB,GAAGR,4BAA4B,CACjD,IAAI,CAACU,OAAO,CAACC,IAAI,EACjB,IAAI,CAACC,KAAK,EACV,IAAI,CAACD,IAAI,EACT,IACJ,CAAC;;EAED;AACJ;AACA;EACI,IAAME,QAAQ,GAAG,IAAI,CAACC,KAAK,CAACC,IAAI,CAAC,IAAI,CAAC;EACtC,IAAI,CAACD,KAAK,GAAG,kBAAkB;IAC3B;AACR;AACA;AACA;AACA;AACA;AACA;AACA;IACQ,IAAME,GAAG,GAAG,MAAMH,QAAQ,CAAC,CAAC;IAC5BZ,+BAA+B,CAAC,IAAI,CAACW,KAAK,EAAE,IAAI,CAAC;IACjD,OAAOI,GAAG;EACd,CAAC;EAGD,IAAIC,OAAO,GAAGV,kCAAkC,CAACC,gBAAgB,CAAC;EAClE,IAAI,CAACS,OAAO,EAAE;IACVA,OAAO,GAAGV,kCAAkC,CAACC,gBAAgB,CAAC;IAC9DJ,qBAAqB,CAACc,GAAG,CACrB,IAAI,EACJD,OACJ,CAAC;EACL;;EAEA;AACJ;AACA;EACI,IAAI,CAACE,aAAa,GAAG,MAAMF,OAAO;EAElC,OAAOA,OAAO;AAClB;AAEA,OAAO,SAASG,QAAQA,CAAA,EAA4B;EAChD,IAAI,CAAC,IAAI,CAACC,aAAa,EAAE;IACrB,OAAO,IAAI;EACf;EACA,OAAO,IAAI,CAACF,aAAa,CAAC,CAAC,CAACC,QAAQ;AACxC;AAEA,OAAO,SAASE,iBAAiBA,CAAA,EAAqC;EAClE,IAAI,CAAC,IAAI,CAACD,aAAa,EAAE;IACrB,OAAOnB,oBAAoB;EAC/B,CAAC,MAAM;IACH,OAAO,IAAI,CAACiB,aAAa,CAAC,CAAC,CACtBI,eAAe,CAAC,CAAC,CACjBC,IAAI,CAAC,MAAM,IAAI,CAAC;EACzB;AACJ;;AAEA;AACA;AACA;AACA,OAAO,SAASC,OAAOA,CAACC,EAAc,EAAE;EACpC,IAAMC,GAAG,GAAGvB,qBAAqB,CAACwB,GAAG,CAACF,EAAE,CAAC;EACzC,IAAIC,GAAG,EAAE;IACLA,GAAG,CAACE,GAAG,CAAC,CAAC;EACb;AACJ;AAEA,OAAO,IAAMC,IAAI,GAAG,IAAI;AACxB,OAAO,IAAMC,UAAU,GAAG;EACtBC,UAAU,EAAGC,KAAU,IAAK;IACxBA,KAAK,CAACd,aAAa,GAAGV,cAAc;IACpCwB,KAAK,CAACb,QAAQ,GAAGA,QAAQ;IACzBa,KAAK,CAACX,iBAAiB,GAAGA,iBAAiB;EAC/C;AACJ,CAAC;AAED,OAAO,IAAMY,wBAAkC,GAAG;EAC9CvB,IAAI,EAAE,iBAAiB;EACvBmB,IAAI;EACJC,UAAU;EACVI,KAAK,EAAE;IACHC,kBAAkB,EAAE;MAChBC,KAAK,EAAEZ;IACX;EACJ;AACJ,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["createLeaderElection","getBroadcastChannelReference","removeBroadcastChannelReference","PROMISE_RESOLVE_TRUE","getFromMapOrCreate","LEADER_ELECTORS_OF_DB","WeakMap","LEADER_ELECTOR_BY_BROADCAST_CHANNEL","OPEN_LEADER_ELECTORS","Set","getLeaderElectorByBroadcastChannel","broadcastChannel","getForDatabase","storage","name","token","oldClose","close","bind","ret","elector","set","add","leaderElector","isLeader","multiInstance","waitForLeadership","awaitLeadership","then","onClose","db","has","get","die","delete","rxdb","prototypes","RxDatabase","proto","RxDBLeaderElectionPlugin","hooks","preCloseRxDatabase","after"],"sources":["../../../../src/plugins/leader-election/index.ts"],"sourcesContent":["/**\r\n * this plugin adds the leader-election-capabilities to rxdb\r\n */\r\n\r\nimport {\r\n createLeaderElection,\r\n LeaderElector,\r\n BroadcastChannel\r\n} from 'broadcast-channel';\r\nimport {\r\n getBroadcastChannelReference,\r\n removeBroadcastChannelReference\r\n} from '../../rx-storage-multiinstance.ts';\r\n\r\nimport type {\r\n RxDatabase,\r\n RxPlugin\r\n} from '../../types/index.d.ts';\r\nimport { PROMISE_RESOLVE_TRUE, getFromMapOrCreate } from '../utils/index.ts';\r\n\r\nconst LEADER_ELECTORS_OF_DB: WeakMap<RxDatabase, LeaderElector> = new WeakMap();\r\nconst LEADER_ELECTOR_BY_BROADCAST_CHANNEL: WeakMap<BroadcastChannel, LeaderElector> = new WeakMap();\r\n\r\nexport const OPEN_LEADER_ELECTORS: Set<LeaderElector> = new Set();\r\n\r\n\r\n/**\r\n * Returns the leader elector of a broadcast channel.\r\n * Used to ensure we reuse the same elector for the channel each time.\r\n */\r\nexport function getLeaderElectorByBroadcastChannel(broadcastChannel: BroadcastChannel): LeaderElector {\r\n return getFromMapOrCreate(\r\n LEADER_ELECTOR_BY_BROADCAST_CHANNEL,\r\n broadcastChannel,\r\n () => createLeaderElection(broadcastChannel)\r\n );\r\n}\r\n\r\n/**\r\n * @overwrites RxDatabase().leaderElector for caching\r\n */\r\nexport function getForDatabase(this: RxDatabase): LeaderElector {\r\n const broadcastChannel = getBroadcastChannelReference(\r\n this.storage.name,\r\n this.token,\r\n this.name,\r\n this\r\n );\r\n\r\n /**\r\n * Clean up the reference on RxDatabase.close()\r\n */\r\n const oldClose = this.close.bind(this);\r\n this.close = async function () {\r\n /**\r\n * It is very important that we remove the\r\n * potential leader elected broadcast channel\r\n * AFTER the database is closed. Otherwise an\r\n * instance running in another browser tab can\r\n * already start working on stuff and interfering\r\n * with a half-closed database and its collections.\r\n */\r\n const ret = await oldClose();\r\n removeBroadcastChannelReference(this.token, this);\r\n return ret;\r\n };\r\n\r\n\r\n const elector = getLeaderElectorByBroadcastChannel(broadcastChannel);\r\n LEADER_ELECTORS_OF_DB.set(\r\n this,\r\n elector\r\n );\r\n OPEN_LEADER_ELECTORS.add(elector);\r\n\r\n /**\r\n * Overwrite for caching\r\n */\r\n this.leaderElector = () => elector;\r\n\r\n return elector;\r\n}\r\n\r\nexport function isLeader(this: RxDatabase): boolean {\r\n if (!this.multiInstance) {\r\n return true;\r\n }\r\n return this.leaderElector().isLeader;\r\n}\r\n\r\nexport function waitForLeadership(this: RxDatabase): Promise<boolean> {\r\n if (!this.multiInstance) {\r\n return PROMISE_RESOLVE_TRUE;\r\n } else {\r\n return this.leaderElector()\r\n .awaitLeadership()\r\n .then(() => true);\r\n }\r\n}\r\n\r\n/**\r\n * runs when the database gets closed\r\n */\r\nexport function onClose(db: RxDatabase) {\r\n const has = LEADER_ELECTORS_OF_DB.get(db);\r\n if (has) {\r\n has.die();\r\n OPEN_LEADER_ELECTORS.delete(has);\r\n }\r\n}\r\n\r\nexport const rxdb = true;\r\nexport const prototypes = {\r\n RxDatabase: (proto: any) => {\r\n proto.leaderElector = getForDatabase;\r\n proto.isLeader = isLeader;\r\n proto.waitForLeadership = waitForLeadership;\r\n }\r\n};\r\n\r\nexport const RxDBLeaderElectionPlugin: RxPlugin = {\r\n name: 'leader-election',\r\n rxdb,\r\n prototypes,\r\n hooks: {\r\n preCloseRxDatabase: {\r\n after: onClose\r\n }\r\n }\r\n};\r\n"],"mappings":"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","ignoreList":[]}
@@ -28,19 +28,26 @@ export async function insertLocal(id, data) {
28
28
  * save the local-document-data
29
29
  * overwrites existing if exists
30
30
  */
31
- export function upsertLocal(id, data) {
32
- return this.getLocal(id).then(existing => {
33
- if (!existing) {
34
- // create new one
35
- var docPromise = this.insertLocal(id, data);
36
- return docPromise;
37
- } else {
38
- // update existing
39
- return existing.incrementalModify(() => {
40
- return data;
41
- });
42
- }
43
- });
31
+ export async function upsertLocal(id, data) {
32
+ var existing = await this.getLocal(id);
33
+ if (!existing) {
34
+ // create new one
35
+ return this.insertLocal(id, data);
36
+ } else if (existing.deleted) {
37
+ // document was deleted before, un-delete it via the write queue
38
+ var state = await getLocalDocStateByParent(this);
39
+ var writeResult = await state.incrementalWriteQueue.addWrite(existing._data, docData => {
40
+ docData.data = data;
41
+ docData._deleted = false;
42
+ return docData;
43
+ });
44
+ return state.docCache.getCachedRxDocument(writeResult);
45
+ } else {
46
+ // update existing
47
+ return existing.incrementalModify(() => {
48
+ return data;
49
+ });
50
+ }
44
51
  }
45
52
  export async function getLocal(id) {
46
53
  var state = await getLocalDocStateByParent(this);
@@ -1 +1 @@
1
- {"version":3,"file":"local-documents.js","names":["getDefaultRevision","getDefaultRxDocumentMeta","filter","map","startWith","mergeMap","getLocalDocStateByParent","getSingleDocument","writeSingle","insertLocal","id","data","state","docData","_deleted","_meta","_rev","_attachments","storageInstance","document","then","newDocData","docCache","getCachedRxDocument","upsertLocal","getLocal","existing","docPromise","incrementalModify","found","getLatestDocumentDataIfExists","Promise","resolve","getLocal$","$","pipe","cE","changeEvent","doc","changeEventOrDoc","isLocal","documentId","use","filterFlagged"],"sources":["../../../../src/plugins/local-documents/local-documents.ts"],"sourcesContent":["import {\r\n getDefaultRevision,\r\n getDefaultRxDocumentMeta\r\n} from '../../plugins/utils/index.ts';\r\n\r\nimport type {\r\n RxChangeEvent,\r\n RxCollection,\r\n RxDatabase,\r\n RxDocument,\r\n RxDocumentWriteData,\r\n RxLocalDocument,\r\n RxLocalDocumentData\r\n} from '../../types/index.d.ts';\r\n\r\nimport {\r\n filter,\r\n map,\r\n startWith,\r\n mergeMap\r\n} from 'rxjs';\r\nimport { Observable } from 'rxjs';\r\n\r\nimport { getLocalDocStateByParent } from './local-documents-helper.ts';\r\nimport { getSingleDocument, writeSingle } from '../../rx-storage-helper.ts';\r\n\r\n\r\n\r\n/**\r\n * save the local-document-data\r\n * throws if already exists\r\n */\r\nexport async function insertLocal<DocData extends Record<string, any> = any, Reactivity = unknown>(\r\n this: RxDatabase | RxCollection,\r\n id: string,\r\n data: DocData\r\n): Promise<RxLocalDocument<DocData, any, Reactivity>> {\r\n const state = await getLocalDocStateByParent(this);\r\n\r\n // create new one\r\n const docData: RxDocumentWriteData<RxLocalDocumentData<DocData>> = {\r\n id: id,\r\n data,\r\n _deleted: false,\r\n _meta: getDefaultRxDocumentMeta(),\r\n _rev: getDefaultRevision(),\r\n _attachments: {}\r\n };\r\n\r\n return writeSingle(\r\n state.storageInstance,\r\n {\r\n document: docData\r\n },\r\n 'local-document-insert'\r\n ).then(newDocData => state.docCache.getCachedRxDocument(newDocData) as any);\r\n}\r\n\r\n/**\r\n * save the local-document-data\r\n * overwrites existing if exists\r\n */\r\nexport function upsertLocal<DocData extends Record<string, any> = any, Reactivity = unknown>(\r\n this: any,\r\n id: string,\r\n data: DocData\r\n): Promise<RxLocalDocument<DocData, any, Reactivity>> {\r\n return this.getLocal(id)\r\n .then((existing: RxDocument) => {\r\n if (!existing) {\r\n // create new one\r\n const docPromise = this.insertLocal(id, data);\r\n return docPromise;\r\n } else {\r\n // update existing\r\n return existing.incrementalModify(() => {\r\n return data;\r\n });\r\n }\r\n });\r\n}\r\n\r\nexport async function getLocal<DocData = any, Reactivity = unknown>(this: any, id: string): Promise<RxLocalDocument<DocData, any, Reactivity> | null> {\r\n const state = await getLocalDocStateByParent(this);\r\n const docCache = state.docCache;\r\n\r\n // check in doc-cache\r\n const found = docCache.getLatestDocumentDataIfExists(id);\r\n if (found) {\r\n return Promise.resolve(\r\n docCache.getCachedRxDocument(found) as any\r\n );\r\n }\r\n\r\n // if not found, check in storage instance\r\n return getSingleDocument(state.storageInstance, id)\r\n .then((docData) => {\r\n if (!docData) {\r\n return null;\r\n }\r\n return state.docCache.getCachedRxDocument(docData) as any;\r\n });\r\n}\r\n\r\nexport function getLocal$<DocData = any, Reactivity = unknown>(this: RxCollection, id: string): Observable<RxLocalDocument<DocData, any, Reactivity> | null> {\r\n return this.$.pipe(\r\n startWith(null),\r\n mergeMap(async (cE: RxChangeEvent<RxLocalDocumentData> | null) => {\r\n if (cE) {\r\n return {\r\n changeEvent: cE\r\n };\r\n } else {\r\n const doc = await this.getLocal(id);\r\n return {\r\n doc: doc\r\n };\r\n }\r\n }),\r\n mergeMap(async (changeEventOrDoc: { changeEvent?: RxChangeEvent<RxLocalDocumentData>; doc?: any }) => {\r\n if (changeEventOrDoc.changeEvent) {\r\n const cE = changeEventOrDoc.changeEvent;\r\n if (!cE.isLocal || cE.documentId !== id) {\r\n return {\r\n use: false\r\n };\r\n } else {\r\n const doc = await this.getLocal(id);\r\n return {\r\n use: true,\r\n doc: doc\r\n };\r\n }\r\n } else {\r\n return {\r\n use: true,\r\n doc: changeEventOrDoc.doc\r\n };\r\n }\r\n }),\r\n filter((filterFlagged: { use: boolean; doc?: any }) => filterFlagged.use),\r\n map((filterFlagged: { use: boolean; doc?: any }) => {\r\n return filterFlagged.doc as any;\r\n })\r\n );\r\n}\r\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"local-documents.js","names":["getDefaultRevision","getDefaultRxDocumentMeta","filter","map","startWith","mergeMap","getLocalDocStateByParent","getSingleDocument","writeSingle","insertLocal","id","data","state","docData","_deleted","_meta","_rev","_attachments","storageInstance","document","then","newDocData","docCache","getCachedRxDocument","upsertLocal","existing","getLocal","deleted","writeResult","incrementalWriteQueue","addWrite","_data","incrementalModify","found","getLatestDocumentDataIfExists","Promise","resolve","getLocal$","$","pipe","cE","changeEvent","doc","changeEventOrDoc","isLocal","documentId","use","filterFlagged"],"sources":["../../../../src/plugins/local-documents/local-documents.ts"],"sourcesContent":["import {\r\n getDefaultRevision,\r\n getDefaultRxDocumentMeta\r\n} from '../../plugins/utils/index.ts';\r\n\r\nimport type {\r\n RxChangeEvent,\r\n RxCollection,\r\n RxDatabase,\r\n RxDocument,\r\n RxDocumentWriteData,\r\n RxLocalDocument,\r\n RxLocalDocumentData\r\n} from '../../types/index.d.ts';\r\n\r\nimport {\r\n filter,\r\n map,\r\n startWith,\r\n mergeMap\r\n} from 'rxjs';\r\nimport { Observable } from 'rxjs';\r\n\r\nimport { getLocalDocStateByParent } from './local-documents-helper.ts';\r\nimport { getSingleDocument, writeSingle } from '../../rx-storage-helper.ts';\r\n\r\n\r\n\r\n/**\r\n * save the local-document-data\r\n * throws if already exists\r\n */\r\nexport async function insertLocal<DocData extends Record<string, any> = any, Reactivity = unknown>(\r\n this: RxDatabase | RxCollection,\r\n id: string,\r\n data: DocData\r\n): Promise<RxLocalDocument<DocData, any, Reactivity>> {\r\n const state = await getLocalDocStateByParent(this);\r\n\r\n // create new one\r\n const docData: RxDocumentWriteData<RxLocalDocumentData<DocData>> = {\r\n id: id,\r\n data,\r\n _deleted: false,\r\n _meta: getDefaultRxDocumentMeta(),\r\n _rev: getDefaultRevision(),\r\n _attachments: {}\r\n };\r\n\r\n return writeSingle(\r\n state.storageInstance,\r\n {\r\n document: docData\r\n },\r\n 'local-document-insert'\r\n ).then(newDocData => state.docCache.getCachedRxDocument(newDocData) as any);\r\n}\r\n\r\n/**\r\n * save the local-document-data\r\n * overwrites existing if exists\r\n */\r\nexport async function upsertLocal<DocData extends Record<string, any> = any, Reactivity = unknown>(\r\n this: any,\r\n id: string,\r\n data: DocData\r\n): Promise<RxLocalDocument<DocData, any, Reactivity>> {\r\n const existing = await this.getLocal(id);\r\n if (!existing) {\r\n // create new one\r\n return this.insertLocal(id, data);\r\n } else if (existing.deleted) {\r\n // document was deleted before, un-delete it via the write queue\r\n const state = await getLocalDocStateByParent(this);\r\n const writeResult = await state.incrementalWriteQueue.addWrite(\r\n (existing as any)._data,\r\n (docData: any) => {\r\n docData.data = data;\r\n docData._deleted = false;\r\n return docData;\r\n }\r\n );\r\n return state.docCache.getCachedRxDocument(writeResult) as any;\r\n } else {\r\n // update existing\r\n return existing.incrementalModify(() => {\r\n return data;\r\n });\r\n }\r\n}\r\n\r\nexport async function getLocal<DocData = any, Reactivity = unknown>(this: any, id: string): Promise<RxLocalDocument<DocData, any, Reactivity> | null> {\r\n const state = await getLocalDocStateByParent(this);\r\n const docCache = state.docCache;\r\n\r\n // check in doc-cache\r\n const found = docCache.getLatestDocumentDataIfExists(id);\r\n if (found) {\r\n return Promise.resolve(\r\n docCache.getCachedRxDocument(found) as any\r\n );\r\n }\r\n\r\n // if not found, check in storage instance\r\n return getSingleDocument(state.storageInstance, id)\r\n .then((docData) => {\r\n if (!docData) {\r\n return null;\r\n }\r\n return state.docCache.getCachedRxDocument(docData) as any;\r\n });\r\n}\r\n\r\nexport function getLocal$<DocData = any, Reactivity = unknown>(this: RxCollection, id: string): Observable<RxLocalDocument<DocData, any, Reactivity> | null> {\r\n return this.$.pipe(\r\n startWith(null),\r\n mergeMap(async (cE: RxChangeEvent<RxLocalDocumentData> | null) => {\r\n if (cE) {\r\n return {\r\n changeEvent: cE\r\n };\r\n } else {\r\n const doc = await this.getLocal(id);\r\n return {\r\n doc: doc\r\n };\r\n }\r\n }),\r\n mergeMap(async (changeEventOrDoc: { changeEvent?: RxChangeEvent<RxLocalDocumentData>; doc?: any }) => {\r\n if (changeEventOrDoc.changeEvent) {\r\n const cE = changeEventOrDoc.changeEvent;\r\n if (!cE.isLocal || cE.documentId !== id) {\r\n return {\r\n use: false\r\n };\r\n } else {\r\n const doc = await this.getLocal(id);\r\n return {\r\n use: true,\r\n doc: doc\r\n };\r\n }\r\n } else {\r\n return {\r\n use: true,\r\n doc: changeEventOrDoc.doc\r\n };\r\n }\r\n }),\r\n filter((filterFlagged: { use: boolean; doc?: any }) => filterFlagged.use),\r\n map((filterFlagged: { use: boolean; doc?: any }) => {\r\n return filterFlagged.doc as any;\r\n })\r\n );\r\n}\r\n"],"mappings":"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","ignoreList":[]}
@@ -34,6 +34,8 @@ export function migrateDocumentData(collection, docSchemaVersion, docData) {
34
34
  var attachmentsBefore = flatClone(docData._attachments);
35
35
  var mutateableDocData = clone(docData);
36
36
  var meta = mutateableDocData._meta;
37
+ var deleted = mutateableDocData._deleted;
38
+ delete mutateableDocData._deleted;
37
39
  delete mutateableDocData._meta;
38
40
  mutateableDocData._attachments = attachmentsBefore;
39
41
  var nextVersion = docSchemaVersion + 1;
@@ -55,6 +57,7 @@ export function migrateDocumentData(collection, docSchemaVersion, docData) {
55
57
  if (meta) {
56
58
  doc._meta = meta;
57
59
  }
60
+ doc._deleted = deleted;
58
61
  return doc;
59
62
  });
60
63
  }
@@ -1 +1 @@
1
- {"version":3,"file":"migration-helpers.js","names":["BehaviorSubject","INTERNAL_CONTEXT_COLLECTION","getPrimaryKeyOfInternalDocument","getPreviousVersions","PROMISE_RESOLVE_FALSE","PROMISE_RESOLVE_NULL","clone","flatClone","getFromMapOrCreate","toPromise","getOldCollectionMeta","migrationState","collectionDocKeys","collection","schema","jsonSchema","map","version","name","found","database","internalStore","findDocumentsById","key","foundById","forEach","f","oldest","find","undefined","migrateDocumentData","docSchemaVersion","docData","attachmentsBefore","_attachments","mutateableDocData","meta","_meta","nextVersion","currentPromise","Promise","resolve","_loop","then","docOrNull","runStrategyIfNotNull","doc","ret","migrationStrategies","retPromise","mustMigrate","oldColDoc","MIGRATION_DEFAULT_BATCH_SIZE","DATA_MIGRATION_STATE_SUBJECT_BY_DATABASE","WeakMap","addMigrationStateToDatabase","allSubject","getMigrationStateByDatabase","allList","getValue","slice","push","next","onDatabaseClose","subject","get","complete"],"sources":["../../../../src/plugins/migration-schema/migration-helpers.ts"],"sourcesContent":["import { BehaviorSubject } from 'rxjs';\r\nimport {\r\n INTERNAL_CONTEXT_COLLECTION,\r\n getPrimaryKeyOfInternalDocument\r\n} from '../../rx-database-internal-store.ts';\r\nimport { getPreviousVersions } from '../../rx-schema.ts';\r\nimport type {\r\n ById,\r\n InternalStoreCollectionDocType,\r\n InternalStoreDocType,\r\n RxCollection,\r\n RxDatabase,\r\n RxDocumentData\r\n} from '../../types/index.d.ts';\r\nimport {\r\n PROMISE_RESOLVE_FALSE,\r\n PROMISE_RESOLVE_NULL,\r\n clone,\r\n flatClone,\r\n getFromMapOrCreate,\r\n toPromise\r\n} from '../utils/index.ts';\r\nimport { RxMigrationState } from './rx-migration-state.ts';\r\n\r\nexport async function getOldCollectionMeta(\r\n migrationState: RxMigrationState\r\n): Promise<RxDocumentData<InternalStoreCollectionDocType> | undefined> {\r\n const collectionDocKeys = getPreviousVersions(migrationState.collection.schema.jsonSchema)\r\n .map(version => migrationState.collection.name + '-' + version);\r\n\r\n const found = await migrationState.database.internalStore.findDocumentsById(\r\n collectionDocKeys.map(key => getPrimaryKeyOfInternalDocument(\r\n key,\r\n INTERNAL_CONTEXT_COLLECTION\r\n )),\r\n false\r\n );\r\n\r\n\r\n /**\r\n * It can happen that a previous migration was canceled or the browser was reloaded\r\n * and on the next startup a new migration was added.\r\n * So we can have multiple collection states with different versions.\r\n * In this case, use the one with the lowest version number and start\r\n * migrating from this one upwards.\r\n */\r\n const foundById: ById<RxDocumentData<InternalStoreDocType>> = {};\r\n found.forEach(f => foundById[f.key] = f);\r\n const oldest = collectionDocKeys.find(key => foundById[key]);\r\n return oldest ? foundById[oldest] : undefined;\r\n}\r\n\r\n\r\n/**\r\n * runs the doc-data through all following migrationStrategies\r\n * so it will match the newest schema.\r\n * @throws Error if final doc does not match final schema or migrationStrategy crashes\r\n * @return final object or null if migrationStrategy deleted it\r\n */\r\nexport function migrateDocumentData(\r\n collection: RxCollection,\r\n docSchemaVersion: number,\r\n docData: any\r\n): Promise<any | null> {\r\n /**\r\n * We cannot deep-clone Blob or Buffer\r\n * so we just flat clone it here\r\n * and attach it to the deep cloned document data.\r\n */\r\n const attachmentsBefore = flatClone(docData._attachments);\r\n const mutateableDocData = clone(docData);\r\n const meta = mutateableDocData._meta;\r\n delete mutateableDocData._meta;\r\n mutateableDocData._attachments = attachmentsBefore;\r\n\r\n let nextVersion = docSchemaVersion + 1;\r\n\r\n // run the document through migrationStrategies\r\n let currentPromise = Promise.resolve(mutateableDocData);\r\n while (nextVersion <= collection.schema.version) {\r\n const version = nextVersion;\r\n currentPromise = currentPromise.then(docOrNull => runStrategyIfNotNull(\r\n collection,\r\n version,\r\n docOrNull\r\n ));\r\n nextVersion++;\r\n }\r\n\r\n return currentPromise.then(doc => {\r\n if (doc === null) {\r\n return PROMISE_RESOLVE_NULL;\r\n }\r\n\r\n if (meta) {\r\n doc._meta = meta;\r\n }\r\n return doc;\r\n });\r\n}\r\n\r\nexport function runStrategyIfNotNull(\r\n collection: RxCollection,\r\n version: number,\r\n docOrNull: any | null\r\n): Promise<any | null> {\r\n if (docOrNull === null) {\r\n return PROMISE_RESOLVE_NULL;\r\n } else {\r\n const ret = collection.migrationStrategies[version](docOrNull, collection);\r\n const retPromise = toPromise(ret);\r\n return retPromise;\r\n }\r\n}\r\n\r\n/**\r\n * returns true if a migration is needed\r\n */\r\nexport async function mustMigrate(\r\n migrationState: RxMigrationState\r\n): Promise<boolean> {\r\n if (migrationState.collection.schema.version === 0) {\r\n return PROMISE_RESOLVE_FALSE;\r\n }\r\n const oldColDoc = await getOldCollectionMeta(migrationState);\r\n return !!oldColDoc;\r\n}\r\nexport const MIGRATION_DEFAULT_BATCH_SIZE = 200;\r\n\r\n\r\nexport type MigrationStateWithCollection = {\r\n collection: RxCollection;\r\n migrationState: RxMigrationState;\r\n};\r\n\r\nexport const DATA_MIGRATION_STATE_SUBJECT_BY_DATABASE = new WeakMap<RxDatabase, BehaviorSubject<RxMigrationState[]>>();\r\nexport function addMigrationStateToDatabase(\r\n migrationState: RxMigrationState\r\n) {\r\n const allSubject = getMigrationStateByDatabase(migrationState.database);\r\n const allList = allSubject.getValue().slice(0);\r\n allList.push(migrationState);\r\n allSubject.next(allList);\r\n}\r\nexport function getMigrationStateByDatabase(database: RxDatabase): BehaviorSubject<RxMigrationState[]> {\r\n return getFromMapOrCreate(\r\n DATA_MIGRATION_STATE_SUBJECT_BY_DATABASE,\r\n database,\r\n () => new BehaviorSubject<RxMigrationState[]>([])\r\n );\r\n}\r\n\r\n/**\r\n * Complete on database close\r\n * so people do not have to unsubscribe\r\n */\r\nexport function onDatabaseClose(database: RxDatabase) {\r\n const subject = DATA_MIGRATION_STATE_SUBJECT_BY_DATABASE.get(database);\r\n if (subject) {\r\n subject.complete();\r\n }\r\n}\r\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"migration-helpers.js","names":["BehaviorSubject","INTERNAL_CONTEXT_COLLECTION","getPrimaryKeyOfInternalDocument","getPreviousVersions","PROMISE_RESOLVE_FALSE","PROMISE_RESOLVE_NULL","clone","flatClone","getFromMapOrCreate","toPromise","getOldCollectionMeta","migrationState","collectionDocKeys","collection","schema","jsonSchema","map","version","name","found","database","internalStore","findDocumentsById","key","foundById","forEach","f","oldest","find","undefined","migrateDocumentData","docSchemaVersion","docData","attachmentsBefore","_attachments","mutateableDocData","meta","_meta","deleted","_deleted","nextVersion","currentPromise","Promise","resolve","_loop","then","docOrNull","runStrategyIfNotNull","doc","ret","migrationStrategies","retPromise","mustMigrate","oldColDoc","MIGRATION_DEFAULT_BATCH_SIZE","DATA_MIGRATION_STATE_SUBJECT_BY_DATABASE","WeakMap","addMigrationStateToDatabase","allSubject","getMigrationStateByDatabase","allList","getValue","slice","push","next","onDatabaseClose","subject","get","complete"],"sources":["../../../../src/plugins/migration-schema/migration-helpers.ts"],"sourcesContent":["import { BehaviorSubject } from 'rxjs';\r\nimport {\r\n INTERNAL_CONTEXT_COLLECTION,\r\n getPrimaryKeyOfInternalDocument\r\n} from '../../rx-database-internal-store.ts';\r\nimport { getPreviousVersions } from '../../rx-schema.ts';\r\nimport type {\r\n ById,\r\n InternalStoreCollectionDocType,\r\n InternalStoreDocType,\r\n RxCollection,\r\n RxDatabase,\r\n RxDocumentData\r\n} from '../../types/index.d.ts';\r\nimport {\r\n PROMISE_RESOLVE_FALSE,\r\n PROMISE_RESOLVE_NULL,\r\n clone,\r\n flatClone,\r\n getFromMapOrCreate,\r\n toPromise\r\n} from '../utils/index.ts';\r\nimport { RxMigrationState } from './rx-migration-state.ts';\r\n\r\nexport async function getOldCollectionMeta(\r\n migrationState: RxMigrationState\r\n): Promise<RxDocumentData<InternalStoreCollectionDocType> | undefined> {\r\n const collectionDocKeys = getPreviousVersions(migrationState.collection.schema.jsonSchema)\r\n .map(version => migrationState.collection.name + '-' + version);\r\n\r\n const found = await migrationState.database.internalStore.findDocumentsById(\r\n collectionDocKeys.map(key => getPrimaryKeyOfInternalDocument(\r\n key,\r\n INTERNAL_CONTEXT_COLLECTION\r\n )),\r\n false\r\n );\r\n\r\n\r\n /**\r\n * It can happen that a previous migration was canceled or the browser was reloaded\r\n * and on the next startup a new migration was added.\r\n * So we can have multiple collection states with different versions.\r\n * In this case, use the one with the lowest version number and start\r\n * migrating from this one upwards.\r\n */\r\n const foundById: ById<RxDocumentData<InternalStoreDocType>> = {};\r\n found.forEach(f => foundById[f.key] = f);\r\n const oldest = collectionDocKeys.find(key => foundById[key]);\r\n return oldest ? foundById[oldest] : undefined;\r\n}\r\n\r\n\r\n/**\r\n * runs the doc-data through all following migrationStrategies\r\n * so it will match the newest schema.\r\n * @throws Error if final doc does not match final schema or migrationStrategy crashes\r\n * @return final object or null if migrationStrategy deleted it\r\n */\r\nexport function migrateDocumentData(\r\n collection: RxCollection,\r\n docSchemaVersion: number,\r\n docData: any\r\n): Promise<any | null> {\r\n /**\r\n * We cannot deep-clone Blob or Buffer\r\n * so we just flat clone it here\r\n * and attach it to the deep cloned document data.\r\n */\r\n const attachmentsBefore = flatClone(docData._attachments);\r\n const mutateableDocData = clone(docData);\r\n const meta = mutateableDocData._meta;\r\n const deleted = mutateableDocData._deleted;\r\n delete mutateableDocData._deleted;\r\n delete mutateableDocData._meta;\r\n mutateableDocData._attachments = attachmentsBefore;\r\n\r\n let nextVersion = docSchemaVersion + 1;\r\n\r\n // run the document through migrationStrategies\r\n let currentPromise = Promise.resolve(mutateableDocData);\r\n while (nextVersion <= collection.schema.version) {\r\n const version = nextVersion;\r\n currentPromise = currentPromise.then(docOrNull => runStrategyIfNotNull(\r\n collection,\r\n version,\r\n docOrNull\r\n ));\r\n nextVersion++;\r\n }\r\n\r\n return currentPromise.then(doc => {\r\n if (doc === null) {\r\n return PROMISE_RESOLVE_NULL;\r\n }\r\n\r\n if (meta) {\r\n doc._meta = meta;\r\n }\r\n doc._deleted = deleted;\r\n return doc;\r\n });\r\n}\r\n\r\nexport function runStrategyIfNotNull(\r\n collection: RxCollection,\r\n version: number,\r\n docOrNull: any | null\r\n): Promise<any | null> {\r\n if (docOrNull === null) {\r\n return PROMISE_RESOLVE_NULL;\r\n } else {\r\n const ret = collection.migrationStrategies[version](docOrNull, collection);\r\n const retPromise = toPromise(ret);\r\n return retPromise;\r\n }\r\n}\r\n\r\n/**\r\n * returns true if a migration is needed\r\n */\r\nexport async function mustMigrate(\r\n migrationState: RxMigrationState\r\n): Promise<boolean> {\r\n if (migrationState.collection.schema.version === 0) {\r\n return PROMISE_RESOLVE_FALSE;\r\n }\r\n const oldColDoc = await getOldCollectionMeta(migrationState);\r\n return !!oldColDoc;\r\n}\r\nexport const MIGRATION_DEFAULT_BATCH_SIZE = 200;\r\n\r\n\r\nexport type MigrationStateWithCollection = {\r\n collection: RxCollection;\r\n migrationState: RxMigrationState;\r\n};\r\n\r\nexport const DATA_MIGRATION_STATE_SUBJECT_BY_DATABASE = new WeakMap<RxDatabase, BehaviorSubject<RxMigrationState[]>>();\r\nexport function addMigrationStateToDatabase(\r\n migrationState: RxMigrationState\r\n) {\r\n const allSubject = getMigrationStateByDatabase(migrationState.database);\r\n const allList = allSubject.getValue().slice(0);\r\n allList.push(migrationState);\r\n allSubject.next(allList);\r\n}\r\nexport function getMigrationStateByDatabase(database: RxDatabase): BehaviorSubject<RxMigrationState[]> {\r\n return getFromMapOrCreate(\r\n DATA_MIGRATION_STATE_SUBJECT_BY_DATABASE,\r\n database,\r\n () => new BehaviorSubject<RxMigrationState[]>([])\r\n );\r\n}\r\n\r\n/**\r\n * Complete on database close\r\n * so people do not have to unsubscribe\r\n */\r\nexport function onDatabaseClose(database: RxDatabase) {\r\n const subject = DATA_MIGRATION_STATE_SUBJECT_BY_DATABASE.get(database);\r\n if (subject) {\r\n subject.complete();\r\n }\r\n}\r\n"],"mappings":"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","ignoreList":[]}
@@ -194,7 +194,7 @@ export var RxMigrationState = /*#__PURE__*/function () {
194
194
  for (var oneHandler of useHandlers) {
195
195
  status = oneHandler(status);
196
196
  }
197
- status.count.percent = Math.round(status.count.handled / status.count.total * 100);
197
+ status.count.percent = status.count.total === 0 ? 100 : Math.round(status.count.handled / status.count.total * 100);
198
198
  if (newDoc && previous && deepEqual(newDoc.data, previous.data)) {
199
199
  break;
200
200
  }
@@ -1 +1 @@
1
- {"version":3,"file":"rx-migration-state.js","names":["Subject","filter","firstValueFrom","map","shareReplay","isBulkWriteConflictError","newRxError","MIGRATION_DEFAULT_BATCH_SIZE","addMigrationStateToDatabase","getOldCollectionMeta","migrateDocumentData","mustMigrate","PROMISE_RESOLVE_TRUE","RXJS_SHARE_REPLAY_DEFAULTS","clone","deepEqual","ensureNotFalsy","errorToPlainJson","getDefaultRevision","getDefaultRxDocumentMeta","getSingleDocument","hasEncryption","observeSingle","writeSingle","BroadcastChannel","createLeaderElection","META_INSTANCE_SCHEMA_TITLE","awaitRxStorageReplicationFirstInSync","awaitRxStorageReplicationInSync","cancelRxStorageReplication","defaultConflictHandler","getRxReplicationMetaInstanceSchema","replicateRxStorageInstance","rxStorageInstanceToReplicationHandler","overwritable","INTERNAL_CONTEXT_MIGRATION_STATUS","addConnectedStorageToCollection","getPrimaryKeyOfInternalDocument","normalizeMangoQuery","prepareQuery","RxMigrationState","collection","migrationStrategies","statusDocKey","name","schema","version","join","started","replicationStates","Set","canceled","updateStatusHandlers","updateStatusQueue","database","oldCollectionMeta","statusDocId","$","internalStore","pipe","d","data","_proto","prototype","getStatus","startMigration","batchSize","must","multiInstance","broadcastChannel","leaderElector","awaitLeadership","oldStorageInstance","storage","createStorageInstance","databaseName","collectionName","databaseInstanceToken","token","options","password","devMode","isDevMode","connectedInstances","getConnectedStorageInstances","totalCount","countAllDocuments","concat","r","oldStorage","updateStatus","s","count","total","Promise","all","connectedInstance","newStorage","migrateStorage","close","storageInstance","originalStorageInstance","err","status","error","currentMeta","previous","document","Object","assign","_deleted","isConflict","documentInDb","handler","push","then","length","useHandlers","newDoc","id","key","context","handled","percent","_meta","_rev","_attachments","oneHandler","Math","round","onClose","cancel","replicationMetaStorageInstance","replicationHandlerBase","replicationState","keepMeta","skipStoringPullMeta","identifier","replicationHandler","masterChangesSince","resolve","checkpoint","documents","masterWrite","rows","migratedRows","row","newDocData","newDocumentState","title","docData","isCheckpoint","assumedMasterState","undefined","migratedDocData","newRow","result","masterChangeStream$","asObservable","forkInstance","metaInstance","pushBatchSize","pullBatchSize","conflictHandler","hashFunction","add","hasError","events","subscribe","processed","up","remove","Array","from","values","state","storageInstances","ret","instance","preparedQuery","selector","countResult","connectedStorages","connectedStorage","Error","newSchema","jsonSchema","migratePromise","catch","race"],"sources":["../../../../src/plugins/migration-schema/rx-migration-state.ts"],"sourcesContent":["import {\r\n Observable,\r\n Subject,\r\n filter,\r\n firstValueFrom,\r\n map,\r\n shareReplay\r\n} from 'rxjs';\r\nimport {\r\n isBulkWriteConflictError,\r\n newRxError\r\n} from '../../rx-error.ts';\r\nimport type {\r\n InternalStoreCollectionDocType,\r\n NumberFunctionMap,\r\n RxCollection,\r\n RxDatabase,\r\n RxError,\r\n RxReplicationWriteToMasterRow,\r\n RxStorageInstance,\r\n RxStorageInstanceReplicationState,\r\n RxTypeError\r\n} from '../../types/index.d.ts';\r\nimport {\r\n MIGRATION_DEFAULT_BATCH_SIZE,\r\n addMigrationStateToDatabase,\r\n getOldCollectionMeta,\r\n migrateDocumentData,\r\n mustMigrate\r\n} from './migration-helpers.ts';\r\nimport {\r\n PROMISE_RESOLVE_TRUE,\r\n RXJS_SHARE_REPLAY_DEFAULTS,\r\n clone,\r\n deepEqual,\r\n ensureNotFalsy,\r\n errorToPlainJson,\r\n getDefaultRevision,\r\n getDefaultRxDocumentMeta,\r\n promiseWait\r\n} from '../utils/index.ts';\r\nimport type {\r\n MigrationStatusUpdate,\r\n RxMigrationStatus,\r\n RxMigrationStatusDocument\r\n} from './migration-types.ts';\r\nimport {\r\n getSingleDocument,\r\n hasEncryption,\r\n observeSingle,\r\n writeSingle\r\n} from '../../rx-storage-helper.ts';\r\nimport {\r\n BroadcastChannel,\r\n createLeaderElection\r\n} from 'broadcast-channel';\r\nimport {\r\n META_INSTANCE_SCHEMA_TITLE,\r\n awaitRxStorageReplicationFirstInSync,\r\n awaitRxStorageReplicationInSync,\r\n cancelRxStorageReplication,\r\n defaultConflictHandler,\r\n getRxReplicationMetaInstanceSchema,\r\n replicateRxStorageInstance,\r\n rxStorageInstanceToReplicationHandler\r\n} from '../../replication-protocol/index.ts';\r\nimport { overwritable } from '../../overwritable.ts';\r\nimport {\r\n INTERNAL_CONTEXT_MIGRATION_STATUS,\r\n addConnectedStorageToCollection,\r\n getPrimaryKeyOfInternalDocument\r\n} from '../../rx-database-internal-store.ts';\r\nimport { normalizeMangoQuery, prepareQuery } from '../../rx-query-helper.ts';\r\n\r\n\r\n\r\nexport class RxMigrationState {\r\n\r\n public database: RxDatabase;\r\n\r\n\r\n private started: boolean = false;\r\n public readonly oldCollectionMeta: ReturnType<typeof getOldCollectionMeta>;\r\n public readonly mustMigrate: ReturnType<typeof mustMigrate>;\r\n public readonly statusDocId: string;\r\n public readonly $: Observable<RxMigrationStatus>;\r\n\r\n /**\r\n * Contains ALL replication states\r\n * that are ever used in this migration state.\r\n */\r\n public replicationStates = new Set<RxStorageInstanceReplicationState<any>>();\r\n public canceled: boolean = false;\r\n public broadcastChannel?: BroadcastChannel;\r\n constructor(\r\n public readonly collection: RxCollection,\r\n public readonly migrationStrategies: NumberFunctionMap,\r\n public readonly statusDocKey = [\r\n collection.name,\r\n 'v',\r\n collection.schema.version\r\n ].join('-'),\r\n ) {\r\n this.database = collection.database;\r\n this.oldCollectionMeta = getOldCollectionMeta(this);\r\n this.mustMigrate = mustMigrate(this);\r\n this.statusDocId = getPrimaryKeyOfInternalDocument(\r\n this.statusDocKey,\r\n INTERNAL_CONTEXT_MIGRATION_STATUS\r\n );\r\n addMigrationStateToDatabase(this);\r\n\r\n this.$ = observeSingle<RxMigrationStatusDocument>(\r\n this.database.internalStore,\r\n this.statusDocId\r\n ).pipe(\r\n filter((d: RxMigrationStatusDocument | null) => !!d),\r\n map((d: RxMigrationStatusDocument | null) => ensureNotFalsy(d).data),\r\n shareReplay(RXJS_SHARE_REPLAY_DEFAULTS)\r\n );\r\n }\r\n\r\n getStatus() {\r\n return firstValueFrom(this.$);\r\n }\r\n\r\n\r\n /**\r\n * Starts the migration.\r\n * Returns void so that people to not get the idea to await\r\n * this function.\r\n * Instead use migratePromise() if you want to await\r\n * the migration. This ensures it works even if the migration\r\n * is run on a different browser tab.\r\n */\r\n async startMigration(batchSize: number = MIGRATION_DEFAULT_BATCH_SIZE): Promise<void> {\r\n const must = await this.mustMigrate;\r\n if (!must) {\r\n return;\r\n }\r\n if (this.started) {\r\n throw newRxError('DM1');\r\n }\r\n this.started = true;\r\n\r\n\r\n /**\r\n * To ensure that multiple tabs do not migrate the same collection,\r\n * we use a new broadcastChannel/leaderElector for each collection.\r\n * This is required because collections can be added dynamically and\r\n * not all tabs might know about this collection.\r\n */\r\n if (this.database.multiInstance) {\r\n this.broadcastChannel = new BroadcastChannel([\r\n 'rx-migration-state',\r\n this.database.name,\r\n this.collection.name,\r\n this.collection.schema.version\r\n ].join('|'));\r\n const leaderElector = createLeaderElection(this.broadcastChannel);\r\n await leaderElector.awaitLeadership();\r\n }\r\n\r\n /**\r\n * Instead of writing a custom migration protocol,\r\n * we do a push-only replication from the old collection data to the new one.\r\n * This also ensure that restarting the replication works without problems.\r\n */\r\n const oldCollectionMeta = await this.oldCollectionMeta;\r\n const oldStorageInstance = await this.database.storage.createStorageInstance({\r\n databaseName: this.database.name,\r\n collectionName: this.collection.name,\r\n databaseInstanceToken: this.database.token,\r\n multiInstance: this.database.multiInstance,\r\n options: {},\r\n schema: ensureNotFalsy(oldCollectionMeta).data.schema,\r\n password: this.database.password,\r\n devMode: overwritable.isDevMode()\r\n });\r\n\r\n\r\n const connectedInstances = await this.getConnectedStorageInstances();\r\n\r\n\r\n /**\r\n * Initially write the migration status into a meta document.\r\n */\r\n const totalCount = await this.countAllDocuments(\r\n [oldStorageInstance].concat(connectedInstances.map(r => r.oldStorage))\r\n );\r\n await this.updateStatus(s => {\r\n s.count.total = totalCount;\r\n return s;\r\n });\r\n\r\n\r\n try {\r\n /**\r\n * First migrate the connected storages,\r\n * afterwards migrate the normal collection.\r\n */\r\n await Promise.all(\r\n connectedInstances.map(async (connectedInstance) => {\r\n await addConnectedStorageToCollection(\r\n this.collection,\r\n connectedInstance.newStorage.collectionName,\r\n connectedInstance.newStorage.schema\r\n );\r\n await this.migrateStorage(\r\n connectedInstance.oldStorage,\r\n connectedInstance.newStorage,\r\n batchSize\r\n );\r\n await connectedInstance.newStorage.close();\r\n })\r\n );\r\n\r\n await this.migrateStorage(\r\n oldStorageInstance,\r\n /**\r\n * Use the originalStorageInstance here\r\n * so that the _meta.lwt time keeps the same\r\n * and our replication checkpoints still point to the\r\n * correct checkpoint.\r\n */\r\n this.collection.storageInstance.originalStorageInstance,\r\n batchSize\r\n );\r\n } catch (err) {\r\n await oldStorageInstance.close();\r\n await this.updateStatus(s => {\r\n s.status = 'ERROR';\r\n s.error = errorToPlainJson(err as Error);\r\n return s;\r\n });\r\n return;\r\n }\r\n\r\n /**\r\n * Remove old collection meta doc with retry on conflict.\r\n * The _rev of the meta doc may have changed since we fetched it\r\n * at the start of migration (due to updateStatus() calls),\r\n * so we re-fetch before each deletion attempt.\r\n * @link https://github.com/pubkey/rxdb/issues/7791\r\n */\r\n while (true) {\r\n const currentMeta = await getOldCollectionMeta(this);\r\n if (!currentMeta) {\r\n break;\r\n }\r\n try {\r\n await writeSingle(\r\n this.database.internalStore,\r\n {\r\n previous: currentMeta,\r\n document: Object.assign(\r\n {},\r\n currentMeta,\r\n {\r\n _deleted: true\r\n }\r\n )\r\n },\r\n 'rx-migration-remove-collection-meta'\r\n );\r\n break;\r\n } catch (error) {\r\n const isConflict = isBulkWriteConflictError<InternalStoreCollectionDocType>(error);\r\n if (isConflict && !!isConflict.documentInDb._deleted) {\r\n break;\r\n } else if (isConflict) {\r\n continue;\r\n } else {\r\n throw error;\r\n }\r\n }\r\n }\r\n\r\n await this.updateStatus(s => {\r\n s.status = 'DONE';\r\n return s;\r\n });\r\n if (this.broadcastChannel) {\r\n await this.broadcastChannel.close();\r\n }\r\n }\r\n\r\n public updateStatusHandlers: MigrationStatusUpdate[] = [];\r\n public updateStatusQueue: Promise<any> = PROMISE_RESOLVE_TRUE;\r\n public updateStatus(\r\n handler: MigrationStatusUpdate\r\n ) {\r\n this.updateStatusHandlers.push(handler);\r\n this.updateStatusQueue = this.updateStatusQueue.then(async () => {\r\n if (this.updateStatusHandlers.length === 0) {\r\n return;\r\n }\r\n // re-run until no conflict\r\n const useHandlers = this.updateStatusHandlers;\r\n this.updateStatusHandlers = [];\r\n while (true) {\r\n const previous = await getSingleDocument<RxMigrationStatusDocument>(\r\n this.database.internalStore,\r\n this.statusDocId\r\n );\r\n let newDoc = clone(previous);\r\n if (!previous) {\r\n newDoc = {\r\n id: this.statusDocId,\r\n key: this.statusDocKey,\r\n context: INTERNAL_CONTEXT_MIGRATION_STATUS,\r\n data: {\r\n collectionName: this.collection.name,\r\n status: 'RUNNING',\r\n count: {\r\n total: 0,\r\n handled: 0,\r\n percent: 0\r\n }\r\n },\r\n _deleted: false,\r\n _meta: getDefaultRxDocumentMeta(),\r\n _rev: getDefaultRevision(),\r\n _attachments: {}\r\n };\r\n }\r\n\r\n let status = ensureNotFalsy(newDoc).data;\r\n for (const oneHandler of useHandlers) {\r\n status = oneHandler(status);\r\n }\r\n status.count.percent = Math.round((status.count.handled / status.count.total) * 100);\r\n\r\n if (\r\n newDoc && previous &&\r\n deepEqual(newDoc.data, previous.data)\r\n ) {\r\n break;\r\n }\r\n\r\n\r\n try {\r\n await writeSingle<RxMigrationStatusDocument>(\r\n this.database.internalStore,\r\n {\r\n previous,\r\n document: ensureNotFalsy(newDoc)\r\n },\r\n INTERNAL_CONTEXT_MIGRATION_STATUS\r\n );\r\n\r\n // write successful\r\n break;\r\n } catch (err) {\r\n // ignore conflicts\r\n if (!isBulkWriteConflictError(err)) {\r\n throw err;\r\n }\r\n }\r\n }\r\n });\r\n return this.updateStatusQueue;\r\n }\r\n\r\n\r\n public async migrateStorage(\r\n oldStorage: RxStorageInstance<any, any, any>,\r\n newStorage: RxStorageInstance<any, any, any>,\r\n batchSize: number\r\n ) {\r\n\r\n this.collection.onClose.push(() => this.cancel());\r\n this.database.onClose.push(() => this.cancel());\r\n const replicationMetaStorageInstance = await this.database.storage.createStorageInstance({\r\n databaseName: this.database.name,\r\n collectionName: 'rx-migration-state-meta-' + oldStorage.collectionName + '-' + oldStorage.schema.version,\r\n databaseInstanceToken: this.database.token,\r\n multiInstance: this.database.multiInstance,\r\n options: {},\r\n schema: getRxReplicationMetaInstanceSchema(oldStorage.schema, hasEncryption(oldStorage.schema)),\r\n password: this.database.password,\r\n devMode: overwritable.isDevMode()\r\n });\r\n\r\n const replicationHandlerBase = rxStorageInstanceToReplicationHandler(\r\n newStorage,\r\n /**\r\n * Ignore push-conflicts.\r\n * If this happens we drop the 'old' document state.\r\n */\r\n defaultConflictHandler,\r\n this.database.token,\r\n true\r\n );\r\n\r\n const replicationState = replicateRxStorageInstance({\r\n keepMeta: true,\r\n skipStoringPullMeta: false,\r\n identifier: [\r\n 'rx-migration-state',\r\n oldStorage.collectionName,\r\n oldStorage.schema.version,\r\n this.collection.schema.version\r\n ].join('-'),\r\n replicationHandler: {\r\n masterChangesSince() {\r\n return Promise.resolve({\r\n checkpoint: null,\r\n documents: []\r\n });\r\n },\r\n masterWrite: async (rows) => {\r\n let migratedRows = await Promise.all(\r\n rows\r\n .map(async (row) => {\r\n let newDocData = row.newDocumentState;\r\n if (newStorage.schema.title === META_INSTANCE_SCHEMA_TITLE) {\r\n newDocData = row.newDocumentState.docData;\r\n if (row.newDocumentState.isCheckpoint === '1') {\r\n return {\r\n assumedMasterState: undefined,\r\n newDocumentState: row.newDocumentState\r\n };\r\n }\r\n }\r\n const migratedDocData: RxReplicationWriteToMasterRow<any> = await migrateDocumentData(\r\n this.collection,\r\n oldStorage.schema.version,\r\n newDocData\r\n );\r\n\r\n /**\r\n * The migration strategy can return null\r\n * which means the document must be deleted during migration.\r\n */\r\n if (migratedDocData === null) {\r\n return null;\r\n }\r\n\r\n const newRow: RxReplicationWriteToMasterRow<any> = {\r\n // drop the assumed master state, we do not have to care about conflicts here.\r\n assumedMasterState: undefined,\r\n newDocumentState: newStorage.schema.title === META_INSTANCE_SCHEMA_TITLE\r\n ? Object.assign({}, row.newDocumentState, { docData: migratedDocData })\r\n : migratedDocData\r\n };\r\n\r\n return newRow;\r\n })\r\n );\r\n\r\n // filter out the documents where the migration strategy returned null\r\n migratedRows = migratedRows.filter(row => !!row && !!row.newDocumentState);\r\n\r\n const result = await replicationHandlerBase.masterWrite(migratedRows as any);\r\n return result;\r\n },\r\n masterChangeStream$: new Subject<any>().asObservable()\r\n },\r\n forkInstance: oldStorage,\r\n metaInstance: replicationMetaStorageInstance,\r\n pushBatchSize: batchSize,\r\n pullBatchSize: 0,\r\n conflictHandler: defaultConflictHandler,\r\n hashFunction: this.database.hashFunction\r\n });\r\n this.replicationStates.add(replicationState);\r\n\r\n let hasError: RxError | RxTypeError | false = false;\r\n replicationState.events.error.subscribe((err: RxError | RxTypeError) => hasError = err);\r\n\r\n // update replication status on each change\r\n replicationState.events.processed.up.subscribe(() => {\r\n this.updateStatus(status => {\r\n status.count.handled = status.count.handled + 1;\r\n return status;\r\n });\r\n });\r\n\r\n await awaitRxStorageReplicationFirstInSync(replicationState);\r\n await awaitRxStorageReplicationInSync(replicationState);\r\n\r\n await this.updateStatusQueue;\r\n if (hasError) {\r\n await cancelRxStorageReplication(replicationState);\r\n await replicationMetaStorageInstance.close();\r\n throw hasError;\r\n }\r\n\r\n // cleanup old storages\r\n await Promise.all([\r\n oldStorage.remove(),\r\n replicationMetaStorageInstance.remove()\r\n ]);\r\n\r\n await cancelRxStorageReplication(replicationState);\r\n }\r\n\r\n /**\r\n * Stops the migration.\r\n * Mostly used in tests to simulate what happens\r\n * when the user reloads the page during a migration.\r\n */\r\n public async cancel() {\r\n this.canceled = true;\r\n await Promise.all(\r\n Array.from(this.replicationStates.values())\r\n .map(state => cancelRxStorageReplication(state))\r\n );\r\n if (this.broadcastChannel) {\r\n await this.broadcastChannel.close();\r\n }\r\n }\r\n\r\n public async countAllDocuments(\r\n storageInstances: RxStorageInstance<any, any, any>[]\r\n ): Promise<number> {\r\n let ret = 0;\r\n await Promise.all(\r\n storageInstances.map(async (instance) => {\r\n\r\n const preparedQuery = prepareQuery(\r\n instance.schema,\r\n normalizeMangoQuery(\r\n instance.schema,\r\n {\r\n selector: {}\r\n }\r\n )\r\n );\r\n const countResult = await instance.count(preparedQuery);\r\n ret += countResult.count;\r\n })\r\n );\r\n return ret;\r\n }\r\n\r\n public async getConnectedStorageInstances() {\r\n const oldCollectionMeta = ensureNotFalsy(await this.oldCollectionMeta);\r\n const ret: {\r\n oldStorage: RxStorageInstance<any, any, any>;\r\n newStorage: RxStorageInstance<any, any, any>;\r\n }[] = [];\r\n\r\n await Promise.all(\r\n await Promise.all(\r\n oldCollectionMeta\r\n .data\r\n .connectedStorages\r\n .map(async (connectedStorage) => {\r\n\r\n // atm we can only migrate replication states.\r\n if (connectedStorage.schema.title !== META_INSTANCE_SCHEMA_TITLE) {\r\n throw new Error('unknown migration handling for schema');\r\n }\r\n\r\n const newSchema = getRxReplicationMetaInstanceSchema(\r\n clone(this.collection.schema.jsonSchema),\r\n hasEncryption(connectedStorage.schema)\r\n );\r\n newSchema.version = this.collection.schema.version;\r\n const [oldStorage, newStorage] = await Promise.all([\r\n this.database.storage.createStorageInstance({\r\n databaseInstanceToken: this.database.token,\r\n databaseName: this.database.name,\r\n devMode: overwritable.isDevMode(),\r\n multiInstance: this.database.multiInstance,\r\n options: {},\r\n schema: connectedStorage.schema,\r\n password: this.database.password,\r\n collectionName: connectedStorage.collectionName\r\n }),\r\n this.database.storage.createStorageInstance({\r\n databaseInstanceToken: this.database.token,\r\n databaseName: this.database.name,\r\n devMode: overwritable.isDevMode(),\r\n multiInstance: this.database.multiInstance,\r\n options: {},\r\n schema: newSchema,\r\n password: this.database.password,\r\n collectionName: connectedStorage.collectionName\r\n })\r\n ]);\r\n ret.push({ oldStorage, newStorage });\r\n })\r\n )\r\n );\r\n\r\n return ret;\r\n }\r\n\r\n\r\n\r\n async migratePromise(batchSize?: number): Promise<RxMigrationStatus> {\r\n this.startMigration(batchSize).catch(() => { });\r\n const must = await this.mustMigrate;\r\n if (!must) {\r\n return {\r\n status: 'DONE',\r\n collectionName: this.collection.name,\r\n count: {\r\n handled: 0,\r\n percent: 0,\r\n total: 0\r\n }\r\n };\r\n }\r\n\r\n const result = await Promise.race([\r\n firstValueFrom(\r\n this.$.pipe(\r\n filter((d: RxMigrationStatus) => d.status === 'DONE')\r\n )\r\n ),\r\n firstValueFrom(\r\n this.$.pipe(\r\n filter((d: RxMigrationStatus) => d.status === 'ERROR')\r\n )\r\n )\r\n ]);\r\n\r\n if (result.status === 'ERROR') {\r\n throw newRxError('DM4', {\r\n collection: this.collection.name,\r\n error: result.error\r\n });\r\n } else {\r\n return result;\r\n }\r\n\r\n }\r\n}\r\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"rx-migration-state.js","names":["Subject","filter","firstValueFrom","map","shareReplay","isBulkWriteConflictError","newRxError","MIGRATION_DEFAULT_BATCH_SIZE","addMigrationStateToDatabase","getOldCollectionMeta","migrateDocumentData","mustMigrate","PROMISE_RESOLVE_TRUE","RXJS_SHARE_REPLAY_DEFAULTS","clone","deepEqual","ensureNotFalsy","errorToPlainJson","getDefaultRevision","getDefaultRxDocumentMeta","getSingleDocument","hasEncryption","observeSingle","writeSingle","BroadcastChannel","createLeaderElection","META_INSTANCE_SCHEMA_TITLE","awaitRxStorageReplicationFirstInSync","awaitRxStorageReplicationInSync","cancelRxStorageReplication","defaultConflictHandler","getRxReplicationMetaInstanceSchema","replicateRxStorageInstance","rxStorageInstanceToReplicationHandler","overwritable","INTERNAL_CONTEXT_MIGRATION_STATUS","addConnectedStorageToCollection","getPrimaryKeyOfInternalDocument","normalizeMangoQuery","prepareQuery","RxMigrationState","collection","migrationStrategies","statusDocKey","name","schema","version","join","started","replicationStates","Set","canceled","updateStatusHandlers","updateStatusQueue","database","oldCollectionMeta","statusDocId","$","internalStore","pipe","d","data","_proto","prototype","getStatus","startMigration","batchSize","must","multiInstance","broadcastChannel","leaderElector","awaitLeadership","oldStorageInstance","storage","createStorageInstance","databaseName","collectionName","databaseInstanceToken","token","options","password","devMode","isDevMode","connectedInstances","getConnectedStorageInstances","totalCount","countAllDocuments","concat","r","oldStorage","updateStatus","s","count","total","Promise","all","connectedInstance","newStorage","migrateStorage","close","storageInstance","originalStorageInstance","err","status","error","currentMeta","previous","document","Object","assign","_deleted","isConflict","documentInDb","handler","push","then","length","useHandlers","newDoc","id","key","context","handled","percent","_meta","_rev","_attachments","oneHandler","Math","round","onClose","cancel","replicationMetaStorageInstance","replicationHandlerBase","replicationState","keepMeta","skipStoringPullMeta","identifier","replicationHandler","masterChangesSince","resolve","checkpoint","documents","masterWrite","rows","migratedRows","row","newDocData","newDocumentState","title","docData","isCheckpoint","assumedMasterState","undefined","migratedDocData","newRow","result","masterChangeStream$","asObservable","forkInstance","metaInstance","pushBatchSize","pullBatchSize","conflictHandler","hashFunction","add","hasError","events","subscribe","processed","up","remove","Array","from","values","state","storageInstances","ret","instance","preparedQuery","selector","countResult","connectedStorages","connectedStorage","Error","newSchema","jsonSchema","migratePromise","catch","race"],"sources":["../../../../src/plugins/migration-schema/rx-migration-state.ts"],"sourcesContent":["import {\r\n Observable,\r\n Subject,\r\n filter,\r\n firstValueFrom,\r\n map,\r\n shareReplay\r\n} from 'rxjs';\r\nimport {\r\n isBulkWriteConflictError,\r\n newRxError\r\n} from '../../rx-error.ts';\r\nimport type {\r\n InternalStoreCollectionDocType,\r\n NumberFunctionMap,\r\n RxCollection,\r\n RxDatabase,\r\n RxError,\r\n RxReplicationWriteToMasterRow,\r\n RxStorageInstance,\r\n RxStorageInstanceReplicationState,\r\n RxTypeError\r\n} from '../../types/index.d.ts';\r\nimport {\r\n MIGRATION_DEFAULT_BATCH_SIZE,\r\n addMigrationStateToDatabase,\r\n getOldCollectionMeta,\r\n migrateDocumentData,\r\n mustMigrate\r\n} from './migration-helpers.ts';\r\nimport {\r\n PROMISE_RESOLVE_TRUE,\r\n RXJS_SHARE_REPLAY_DEFAULTS,\r\n clone,\r\n deepEqual,\r\n ensureNotFalsy,\r\n errorToPlainJson,\r\n getDefaultRevision,\r\n getDefaultRxDocumentMeta,\r\n promiseWait\r\n} from '../utils/index.ts';\r\nimport type {\r\n MigrationStatusUpdate,\r\n RxMigrationStatus,\r\n RxMigrationStatusDocument\r\n} from './migration-types.ts';\r\nimport {\r\n getSingleDocument,\r\n hasEncryption,\r\n observeSingle,\r\n writeSingle\r\n} from '../../rx-storage-helper.ts';\r\nimport {\r\n BroadcastChannel,\r\n createLeaderElection\r\n} from 'broadcast-channel';\r\nimport {\r\n META_INSTANCE_SCHEMA_TITLE,\r\n awaitRxStorageReplicationFirstInSync,\r\n awaitRxStorageReplicationInSync,\r\n cancelRxStorageReplication,\r\n defaultConflictHandler,\r\n getRxReplicationMetaInstanceSchema,\r\n replicateRxStorageInstance,\r\n rxStorageInstanceToReplicationHandler\r\n} from '../../replication-protocol/index.ts';\r\nimport { overwritable } from '../../overwritable.ts';\r\nimport {\r\n INTERNAL_CONTEXT_MIGRATION_STATUS,\r\n addConnectedStorageToCollection,\r\n getPrimaryKeyOfInternalDocument\r\n} from '../../rx-database-internal-store.ts';\r\nimport { normalizeMangoQuery, prepareQuery } from '../../rx-query-helper.ts';\r\n\r\n\r\n\r\nexport class RxMigrationState {\r\n\r\n public database: RxDatabase;\r\n\r\n\r\n private started: boolean = false;\r\n public readonly oldCollectionMeta: ReturnType<typeof getOldCollectionMeta>;\r\n public readonly mustMigrate: ReturnType<typeof mustMigrate>;\r\n public readonly statusDocId: string;\r\n public readonly $: Observable<RxMigrationStatus>;\r\n\r\n /**\r\n * Contains ALL replication states\r\n * that are ever used in this migration state.\r\n */\r\n public replicationStates = new Set<RxStorageInstanceReplicationState<any>>();\r\n public canceled: boolean = false;\r\n public broadcastChannel?: BroadcastChannel;\r\n constructor(\r\n public readonly collection: RxCollection,\r\n public readonly migrationStrategies: NumberFunctionMap,\r\n public readonly statusDocKey = [\r\n collection.name,\r\n 'v',\r\n collection.schema.version\r\n ].join('-'),\r\n ) {\r\n this.database = collection.database;\r\n this.oldCollectionMeta = getOldCollectionMeta(this);\r\n this.mustMigrate = mustMigrate(this);\r\n this.statusDocId = getPrimaryKeyOfInternalDocument(\r\n this.statusDocKey,\r\n INTERNAL_CONTEXT_MIGRATION_STATUS\r\n );\r\n addMigrationStateToDatabase(this);\r\n\r\n this.$ = observeSingle<RxMigrationStatusDocument>(\r\n this.database.internalStore,\r\n this.statusDocId\r\n ).pipe(\r\n filter((d: RxMigrationStatusDocument | null) => !!d),\r\n map((d: RxMigrationStatusDocument | null) => ensureNotFalsy(d).data),\r\n shareReplay(RXJS_SHARE_REPLAY_DEFAULTS)\r\n );\r\n }\r\n\r\n getStatus() {\r\n return firstValueFrom(this.$);\r\n }\r\n\r\n\r\n /**\r\n * Starts the migration.\r\n * Returns void so that people to not get the idea to await\r\n * this function.\r\n * Instead use migratePromise() if you want to await\r\n * the migration. This ensures it works even if the migration\r\n * is run on a different browser tab.\r\n */\r\n async startMigration(batchSize: number = MIGRATION_DEFAULT_BATCH_SIZE): Promise<void> {\r\n const must = await this.mustMigrate;\r\n if (!must) {\r\n return;\r\n }\r\n if (this.started) {\r\n throw newRxError('DM1');\r\n }\r\n this.started = true;\r\n\r\n\r\n /**\r\n * To ensure that multiple tabs do not migrate the same collection,\r\n * we use a new broadcastChannel/leaderElector for each collection.\r\n * This is required because collections can be added dynamically and\r\n * not all tabs might know about this collection.\r\n */\r\n if (this.database.multiInstance) {\r\n this.broadcastChannel = new BroadcastChannel([\r\n 'rx-migration-state',\r\n this.database.name,\r\n this.collection.name,\r\n this.collection.schema.version\r\n ].join('|'));\r\n const leaderElector = createLeaderElection(this.broadcastChannel);\r\n await leaderElector.awaitLeadership();\r\n }\r\n\r\n /**\r\n * Instead of writing a custom migration protocol,\r\n * we do a push-only replication from the old collection data to the new one.\r\n * This also ensure that restarting the replication works without problems.\r\n */\r\n const oldCollectionMeta = await this.oldCollectionMeta;\r\n const oldStorageInstance = await this.database.storage.createStorageInstance({\r\n databaseName: this.database.name,\r\n collectionName: this.collection.name,\r\n databaseInstanceToken: this.database.token,\r\n multiInstance: this.database.multiInstance,\r\n options: {},\r\n schema: ensureNotFalsy(oldCollectionMeta).data.schema,\r\n password: this.database.password,\r\n devMode: overwritable.isDevMode()\r\n });\r\n\r\n\r\n const connectedInstances = await this.getConnectedStorageInstances();\r\n\r\n\r\n /**\r\n * Initially write the migration status into a meta document.\r\n */\r\n const totalCount = await this.countAllDocuments(\r\n [oldStorageInstance].concat(connectedInstances.map(r => r.oldStorage))\r\n );\r\n await this.updateStatus(s => {\r\n s.count.total = totalCount;\r\n return s;\r\n });\r\n\r\n\r\n try {\r\n /**\r\n * First migrate the connected storages,\r\n * afterwards migrate the normal collection.\r\n */\r\n await Promise.all(\r\n connectedInstances.map(async (connectedInstance) => {\r\n await addConnectedStorageToCollection(\r\n this.collection,\r\n connectedInstance.newStorage.collectionName,\r\n connectedInstance.newStorage.schema\r\n );\r\n await this.migrateStorage(\r\n connectedInstance.oldStorage,\r\n connectedInstance.newStorage,\r\n batchSize\r\n );\r\n await connectedInstance.newStorage.close();\r\n })\r\n );\r\n\r\n await this.migrateStorage(\r\n oldStorageInstance,\r\n /**\r\n * Use the originalStorageInstance here\r\n * so that the _meta.lwt time keeps the same\r\n * and our replication checkpoints still point to the\r\n * correct checkpoint.\r\n */\r\n this.collection.storageInstance.originalStorageInstance,\r\n batchSize\r\n );\r\n } catch (err) {\r\n await oldStorageInstance.close();\r\n await this.updateStatus(s => {\r\n s.status = 'ERROR';\r\n s.error = errorToPlainJson(err as Error);\r\n return s;\r\n });\r\n return;\r\n }\r\n\r\n /**\r\n * Remove old collection meta doc with retry on conflict.\r\n * The _rev of the meta doc may have changed since we fetched it\r\n * at the start of migration (due to updateStatus() calls),\r\n * so we re-fetch before each deletion attempt.\r\n * @link https://github.com/pubkey/rxdb/issues/7791\r\n */\r\n while (true) {\r\n const currentMeta = await getOldCollectionMeta(this);\r\n if (!currentMeta) {\r\n break;\r\n }\r\n try {\r\n await writeSingle(\r\n this.database.internalStore,\r\n {\r\n previous: currentMeta,\r\n document: Object.assign(\r\n {},\r\n currentMeta,\r\n {\r\n _deleted: true\r\n }\r\n )\r\n },\r\n 'rx-migration-remove-collection-meta'\r\n );\r\n break;\r\n } catch (error) {\r\n const isConflict = isBulkWriteConflictError<InternalStoreCollectionDocType>(error);\r\n if (isConflict && !!isConflict.documentInDb._deleted) {\r\n break;\r\n } else if (isConflict) {\r\n continue;\r\n } else {\r\n throw error;\r\n }\r\n }\r\n }\r\n\r\n await this.updateStatus(s => {\r\n s.status = 'DONE';\r\n return s;\r\n });\r\n if (this.broadcastChannel) {\r\n await this.broadcastChannel.close();\r\n }\r\n }\r\n\r\n public updateStatusHandlers: MigrationStatusUpdate[] = [];\r\n public updateStatusQueue: Promise<any> = PROMISE_RESOLVE_TRUE;\r\n public updateStatus(\r\n handler: MigrationStatusUpdate\r\n ) {\r\n this.updateStatusHandlers.push(handler);\r\n this.updateStatusQueue = this.updateStatusQueue.then(async () => {\r\n if (this.updateStatusHandlers.length === 0) {\r\n return;\r\n }\r\n // re-run until no conflict\r\n const useHandlers = this.updateStatusHandlers;\r\n this.updateStatusHandlers = [];\r\n while (true) {\r\n const previous = await getSingleDocument<RxMigrationStatusDocument>(\r\n this.database.internalStore,\r\n this.statusDocId\r\n );\r\n let newDoc = clone(previous);\r\n if (!previous) {\r\n newDoc = {\r\n id: this.statusDocId,\r\n key: this.statusDocKey,\r\n context: INTERNAL_CONTEXT_MIGRATION_STATUS,\r\n data: {\r\n collectionName: this.collection.name,\r\n status: 'RUNNING',\r\n count: {\r\n total: 0,\r\n handled: 0,\r\n percent: 0\r\n }\r\n },\r\n _deleted: false,\r\n _meta: getDefaultRxDocumentMeta(),\r\n _rev: getDefaultRevision(),\r\n _attachments: {}\r\n };\r\n }\r\n\r\n let status = ensureNotFalsy(newDoc).data;\r\n for (const oneHandler of useHandlers) {\r\n status = oneHandler(status);\r\n }\r\n status.count.percent = status.count.total === 0 ? 100 : Math.round((status.count.handled / status.count.total) * 100);\r\n\r\n if (\r\n newDoc && previous &&\r\n deepEqual(newDoc.data, previous.data)\r\n ) {\r\n break;\r\n }\r\n\r\n\r\n try {\r\n await writeSingle<RxMigrationStatusDocument>(\r\n this.database.internalStore,\r\n {\r\n previous,\r\n document: ensureNotFalsy(newDoc)\r\n },\r\n INTERNAL_CONTEXT_MIGRATION_STATUS\r\n );\r\n\r\n // write successful\r\n break;\r\n } catch (err) {\r\n // ignore conflicts\r\n if (!isBulkWriteConflictError(err)) {\r\n throw err;\r\n }\r\n }\r\n }\r\n });\r\n return this.updateStatusQueue;\r\n }\r\n\r\n\r\n public async migrateStorage(\r\n oldStorage: RxStorageInstance<any, any, any>,\r\n newStorage: RxStorageInstance<any, any, any>,\r\n batchSize: number\r\n ) {\r\n\r\n this.collection.onClose.push(() => this.cancel());\r\n this.database.onClose.push(() => this.cancel());\r\n const replicationMetaStorageInstance = await this.database.storage.createStorageInstance({\r\n databaseName: this.database.name,\r\n collectionName: 'rx-migration-state-meta-' + oldStorage.collectionName + '-' + oldStorage.schema.version,\r\n databaseInstanceToken: this.database.token,\r\n multiInstance: this.database.multiInstance,\r\n options: {},\r\n schema: getRxReplicationMetaInstanceSchema(oldStorage.schema, hasEncryption(oldStorage.schema)),\r\n password: this.database.password,\r\n devMode: overwritable.isDevMode()\r\n });\r\n\r\n const replicationHandlerBase = rxStorageInstanceToReplicationHandler(\r\n newStorage,\r\n /**\r\n * Ignore push-conflicts.\r\n * If this happens we drop the 'old' document state.\r\n */\r\n defaultConflictHandler,\r\n this.database.token,\r\n true\r\n );\r\n\r\n const replicationState = replicateRxStorageInstance({\r\n keepMeta: true,\r\n skipStoringPullMeta: false,\r\n identifier: [\r\n 'rx-migration-state',\r\n oldStorage.collectionName,\r\n oldStorage.schema.version,\r\n this.collection.schema.version\r\n ].join('-'),\r\n replicationHandler: {\r\n masterChangesSince() {\r\n return Promise.resolve({\r\n checkpoint: null,\r\n documents: []\r\n });\r\n },\r\n masterWrite: async (rows) => {\r\n let migratedRows = await Promise.all(\r\n rows\r\n .map(async (row) => {\r\n let newDocData = row.newDocumentState;\r\n if (newStorage.schema.title === META_INSTANCE_SCHEMA_TITLE) {\r\n newDocData = row.newDocumentState.docData;\r\n if (row.newDocumentState.isCheckpoint === '1') {\r\n return {\r\n assumedMasterState: undefined,\r\n newDocumentState: row.newDocumentState\r\n };\r\n }\r\n }\r\n const migratedDocData: RxReplicationWriteToMasterRow<any> = await migrateDocumentData(\r\n this.collection,\r\n oldStorage.schema.version,\r\n newDocData\r\n );\r\n\r\n /**\r\n * The migration strategy can return null\r\n * which means the document must be deleted during migration.\r\n */\r\n if (migratedDocData === null) {\r\n return null;\r\n }\r\n\r\n const newRow: RxReplicationWriteToMasterRow<any> = {\r\n // drop the assumed master state, we do not have to care about conflicts here.\r\n assumedMasterState: undefined,\r\n newDocumentState: newStorage.schema.title === META_INSTANCE_SCHEMA_TITLE\r\n ? Object.assign({}, row.newDocumentState, { docData: migratedDocData })\r\n : migratedDocData\r\n };\r\n\r\n return newRow;\r\n })\r\n );\r\n\r\n // filter out the documents where the migration strategy returned null\r\n migratedRows = migratedRows.filter(row => !!row && !!row.newDocumentState);\r\n\r\n const result = await replicationHandlerBase.masterWrite(migratedRows as any);\r\n return result;\r\n },\r\n masterChangeStream$: new Subject<any>().asObservable()\r\n },\r\n forkInstance: oldStorage,\r\n metaInstance: replicationMetaStorageInstance,\r\n pushBatchSize: batchSize,\r\n pullBatchSize: 0,\r\n conflictHandler: defaultConflictHandler,\r\n hashFunction: this.database.hashFunction\r\n });\r\n this.replicationStates.add(replicationState);\r\n\r\n let hasError: RxError | RxTypeError | false = false;\r\n replicationState.events.error.subscribe((err: RxError | RxTypeError) => hasError = err);\r\n\r\n // update replication status on each change\r\n replicationState.events.processed.up.subscribe(() => {\r\n this.updateStatus(status => {\r\n status.count.handled = status.count.handled + 1;\r\n return status;\r\n });\r\n });\r\n\r\n await awaitRxStorageReplicationFirstInSync(replicationState);\r\n await awaitRxStorageReplicationInSync(replicationState);\r\n\r\n await this.updateStatusQueue;\r\n if (hasError) {\r\n await cancelRxStorageReplication(replicationState);\r\n await replicationMetaStorageInstance.close();\r\n throw hasError;\r\n }\r\n\r\n // cleanup old storages\r\n await Promise.all([\r\n oldStorage.remove(),\r\n replicationMetaStorageInstance.remove()\r\n ]);\r\n\r\n await cancelRxStorageReplication(replicationState);\r\n }\r\n\r\n /**\r\n * Stops the migration.\r\n * Mostly used in tests to simulate what happens\r\n * when the user reloads the page during a migration.\r\n */\r\n public async cancel() {\r\n this.canceled = true;\r\n await Promise.all(\r\n Array.from(this.replicationStates.values())\r\n .map(state => cancelRxStorageReplication(state))\r\n );\r\n if (this.broadcastChannel) {\r\n await this.broadcastChannel.close();\r\n }\r\n }\r\n\r\n public async countAllDocuments(\r\n storageInstances: RxStorageInstance<any, any, any>[]\r\n ): Promise<number> {\r\n let ret = 0;\r\n await Promise.all(\r\n storageInstances.map(async (instance) => {\r\n\r\n const preparedQuery = prepareQuery(\r\n instance.schema,\r\n normalizeMangoQuery(\r\n instance.schema,\r\n {\r\n selector: {}\r\n }\r\n )\r\n );\r\n const countResult = await instance.count(preparedQuery);\r\n ret += countResult.count;\r\n })\r\n );\r\n return ret;\r\n }\r\n\r\n public async getConnectedStorageInstances() {\r\n const oldCollectionMeta = ensureNotFalsy(await this.oldCollectionMeta);\r\n const ret: {\r\n oldStorage: RxStorageInstance<any, any, any>;\r\n newStorage: RxStorageInstance<any, any, any>;\r\n }[] = [];\r\n\r\n await Promise.all(\r\n await Promise.all(\r\n oldCollectionMeta\r\n .data\r\n .connectedStorages\r\n .map(async (connectedStorage) => {\r\n\r\n // atm we can only migrate replication states.\r\n if (connectedStorage.schema.title !== META_INSTANCE_SCHEMA_TITLE) {\r\n throw new Error('unknown migration handling for schema');\r\n }\r\n\r\n const newSchema = getRxReplicationMetaInstanceSchema(\r\n clone(this.collection.schema.jsonSchema),\r\n hasEncryption(connectedStorage.schema)\r\n );\r\n newSchema.version = this.collection.schema.version;\r\n const [oldStorage, newStorage] = await Promise.all([\r\n this.database.storage.createStorageInstance({\r\n databaseInstanceToken: this.database.token,\r\n databaseName: this.database.name,\r\n devMode: overwritable.isDevMode(),\r\n multiInstance: this.database.multiInstance,\r\n options: {},\r\n schema: connectedStorage.schema,\r\n password: this.database.password,\r\n collectionName: connectedStorage.collectionName\r\n }),\r\n this.database.storage.createStorageInstance({\r\n databaseInstanceToken: this.database.token,\r\n databaseName: this.database.name,\r\n devMode: overwritable.isDevMode(),\r\n multiInstance: this.database.multiInstance,\r\n options: {},\r\n schema: newSchema,\r\n password: this.database.password,\r\n collectionName: connectedStorage.collectionName\r\n })\r\n ]);\r\n ret.push({ oldStorage, newStorage });\r\n })\r\n )\r\n );\r\n\r\n return ret;\r\n }\r\n\r\n\r\n\r\n async migratePromise(batchSize?: number): Promise<RxMigrationStatus> {\r\n this.startMigration(batchSize).catch(() => { });\r\n const must = await this.mustMigrate;\r\n if (!must) {\r\n return {\r\n status: 'DONE',\r\n collectionName: this.collection.name,\r\n count: {\r\n handled: 0,\r\n percent: 0,\r\n total: 0\r\n }\r\n };\r\n }\r\n\r\n const result = await Promise.race([\r\n firstValueFrom(\r\n this.$.pipe(\r\n filter((d: RxMigrationStatus) => d.status === 'DONE')\r\n )\r\n ),\r\n firstValueFrom(\r\n this.$.pipe(\r\n filter((d: RxMigrationStatus) => d.status === 'ERROR')\r\n )\r\n )\r\n ]);\r\n\r\n if (result.status === 'ERROR') {\r\n throw newRxError('DM4', {\r\n collection: this.collection.name,\r\n error: result.error\r\n });\r\n } else {\r\n return result;\r\n }\r\n\r\n }\r\n}\r\n"],"mappings":"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","ignoreList":[]}
@@ -111,6 +111,8 @@ export var RxPipeline = /*#__PURE__*/function () {
111
111
  _ret = await _loop();
112
112
  if (_ret) return _ret.v;
113
113
  }
114
+ }).catch(err => {
115
+ this.error = err;
114
116
  });
115
117
  };
116
118
  _proto.awaitIdle = async function awaitIdle() {
@@ -142,11 +144,14 @@ export var RxPipeline = /*#__PURE__*/function () {
142
144
  * Remove the pipeline and all metadata which it has stored
143
145
  */;
144
146
  _proto.remove = async function remove() {
147
+ await this.close();
145
148
  var insternalStore = this.destination.database.internalStore;
146
149
  var checkpointDoc = await getCheckpointDoc(this);
147
150
  if (checkpointDoc) {
148
151
  var newDoc = clone(checkpointDoc);
149
152
  newDoc._deleted = true;
153
+ newDoc._meta.lwt = now();
154
+ newDoc._rev = createRevision(this.destination.database.token, checkpointDoc);
150
155
  var writeResult = await insternalStore.bulkWrite([{
151
156
  previous: checkpointDoc,
152
157
  document: newDoc
@@ -155,7 +160,6 @@ export var RxPipeline = /*#__PURE__*/function () {
155
160
  throw writeResult.error;
156
161
  }
157
162
  }
158
- return this.close();
159
163
  };
160
164
  return RxPipeline;
161
165
  }();