@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":"rx-database.js","names":["IdleQueue","ObliviousSet","pluginMissing","flatClone","PROMISE_RESOLVE_FALSE","randomToken","ensureNotFalsy","getDefaultRevision","getDefaultRxDocumentMeta","defaultHashSha256","RXDB_VERSION","newRxError","createRxSchema","runPluginHooks","runAsyncPluginHooks","Subject","mergeMap","createRxCollection","flatCloneDocWithMeta","getSingleDocument","getWrappedStorageInstance","INTERNAL_STORAGE_NAME","ensureStorageTokenDocumentExists","getAllCollectionDocuments","getPrimaryKeyOfInternalDocument","INTERNAL_CONTEXT_COLLECTION","INTERNAL_STORE_SCHEMA","_collectionNamePrimary","createRxCollectionStorageInstance","removeCollectionStorages","overwritable","rxChangeEventBulkToRxChangeEvents","USED_DATABASE_NAMES","Set","DATABASE_UNCLOSED_INSTANCE_PROMISE_MAP","Map","DB_COUNT","RxDatabaseBase","name","token","storage","instanceCreationOptions","password","multiInstance","eventReduce","options","internalStore","hashFunction","cleanupPolicy","allowSlowCount","reactivity","onClosed","idleQueue","rxdbVersion","storageInstances","_subs","startupErrors","onClose","closed","collections","states","eventBulks$","closePromise","collectionsSubject$","observable$","pipe","changeEventBulk","storageToken","storageTokenDocument","emittedEventBulkIds","asRxDatabase","catch","err","push","then","doc","data","_proto","prototype","getReactivityFactory","database","Symbol","asyncDispose","close","$emit","has","id","add","next","removeCollectionDoc","schema","writeDoc","_deleted","bulkWrite","document","previous","addCollections","collectionCreators","jsonSchemas","schemas","bulkPutDocs","useArgsByCollectionName","Promise","all","Object","entries","map","args","collectionName","rxJsonSchema","collectionNameWithVersion","collectionDocData","key","context","schemaHash","hash","jsonSchema","version","connectedStorages","_meta","_rev","_attachments","useArgs","assign","hookData","conflictHandler","collectionStorageInstancePromises","keys","forEach","storageInstanceCreationParams","databaseInstanceToken","databaseName","devMode","isDevMode","promise","putDocsResult","ensureNoStartupErrors","error","status","writeError","docInDb","documentInDb","collection","previousSchemaHash","previousSchema","values","p","instance","ret","storageInstance","type","defineProperty","get","lockedRun","fn","wrapCall","requestIdlePromise","exportJSON","_collections","addState","_name","importJSON","_exportedJSON","backup","_options","leaderElector","isLeader","waitForLeadership","migrationStates","resolve","createPromiseWithResolvers","resolveClosePromise","result","complete","sub","unsubscribe","col","remove","removeRxDatabase","registerWebMCP","_createClass","asObservable","throwIfDatabaseNameUsed","getDatabaseNameKey","link","reject","res","rej","createRxDatabaseStorageInstance","createStorageInstance","createRxDatabase","ignoreDuplicate","closeDuplicates","localDocuments","databaseNameKey","databaseNameKeyUnclosedInstancesSet","instancePromiseWithResolvers","closeDuplicatesPromises","Array","from","onInstanceClosed","delete","set","unclosedInstancePromise","rxDatabase","creator","dbInternalsStorageInstance","collectionDocs","collectionNames","removedCollectionNames","isRxDatabase","obj","dbCount","isRxDatabaseFirstTimeInstantiated","tokenDoc","instanceToken"],"sources":["../../src/rx-database.ts"],"sourcesContent":["import { IdleQueue } from 'custom-idle-queue';\r\nimport type {\r\n LeaderElector\r\n} from 'broadcast-channel';\r\nimport { ObliviousSet } from 'oblivious-set';\r\nimport type {\r\n CollectionsOfDatabase,\r\n RxDatabase,\r\n RxCollectionCreator,\r\n RxJsonSchema,\r\n RxCollection,\r\n RxDumpDatabase,\r\n RxDumpDatabaseAny,\r\n BackupOptions,\r\n RxStorage,\r\n RxStorageInstance,\r\n RxStorageInstanceCreationParams,\r\n BulkWriteRow,\r\n RxChangeEvent,\r\n RxDatabaseCreator,\r\n RxChangeEventBulk,\r\n RxDocumentData,\r\n RxCleanupPolicy,\r\n InternalStoreDocType,\r\n InternalStoreStorageTokenDocType,\r\n InternalStoreCollectionDocType,\r\n RxTypeError,\r\n RxError,\r\n HashFunction,\r\n MaybePromise,\r\n RxState,\r\n RxCollectionEvent,\r\n WebMCPOptions,\r\n WebMCPLogEvent\r\n} from './types/index.d.ts';\r\n\r\nimport {\r\n pluginMissing,\r\n flatClone,\r\n PROMISE_RESOLVE_FALSE,\r\n randomToken,\r\n ensureNotFalsy,\r\n getDefaultRevision,\r\n getDefaultRxDocumentMeta,\r\n defaultHashSha256,\r\n RXDB_VERSION\r\n} from './plugins/utils/index.ts';\r\nimport {\r\n newRxError\r\n} from './rx-error.ts';\r\nimport {\r\n createRxSchema,\r\n RxSchema\r\n} from './rx-schema.ts';\r\nimport {\r\n runPluginHooks,\r\n runAsyncPluginHooks\r\n} from './hooks.ts';\r\nimport {\r\n Subject,\r\n Subscription,\r\n Observable\r\n} from 'rxjs';\r\nimport {\r\n mergeMap\r\n} from 'rxjs/operators';\r\nimport {\r\n createRxCollection\r\n} from './rx-collection.ts';\r\nimport {\r\n flatCloneDocWithMeta,\r\n getSingleDocument,\r\n getWrappedStorageInstance,\r\n INTERNAL_STORAGE_NAME,\r\n WrappedRxStorageInstance\r\n} from './rx-storage-helper.ts';\r\nimport type { RxBackupState } from './plugins/backup/index.ts';\r\nimport {\r\n ensureStorageTokenDocumentExists,\r\n getAllCollectionDocuments,\r\n getPrimaryKeyOfInternalDocument,\r\n INTERNAL_CONTEXT_COLLECTION,\r\n INTERNAL_STORE_SCHEMA,\r\n _collectionNamePrimary\r\n} from './rx-database-internal-store.ts';\r\nimport { createRxCollectionStorageInstance, removeCollectionStorages } from './rx-collection-helper.ts';\r\nimport { overwritable } from './overwritable.ts';\r\nimport type { RxMigrationState } from './plugins/migration-schema/index.ts';\r\nimport type { RxReactivityFactory } from './types/plugins/reactivity.d.ts';\r\nimport { rxChangeEventBulkToRxChangeEvents } from './rx-change-event.ts';\r\n\r\n/**\r\n * stores the used database names+storage names\r\n * so we can throw when the same database is created more than once.\r\n */\r\nconst USED_DATABASE_NAMES: Set<string> = new Set();\r\nconst DATABASE_UNCLOSED_INSTANCE_PROMISE_MAP = new Map<string, Set<Promise<RxDatabase>>>();\r\n\r\nlet DB_COUNT = 0;\r\n\r\nexport class RxDatabaseBase<\r\n Internals,\r\n InstanceCreationOptions,\r\n Collections = CollectionsOfDatabase,\r\n Reactivity = unknown\r\n> {\r\n\r\n public readonly idleQueue: IdleQueue = new IdleQueue();\r\n public readonly rxdbVersion = RXDB_VERSION;\r\n\r\n /**\r\n * Contains all known non-closed storage instances\r\n * that belong to this database.\r\n * Used in plugins and unit tests.\r\n */\r\n public readonly storageInstances = new Set<WrappedRxStorageInstance<any, Internals, InstanceCreationOptions>>();\r\n\r\n constructor(\r\n public readonly name: string,\r\n /**\r\n * Uniquely identifies the instance\r\n * of this RxDatabase.\r\n */\r\n public readonly token: string,\r\n public readonly storage: RxStorage<Internals, InstanceCreationOptions>,\r\n public readonly instanceCreationOptions: InstanceCreationOptions,\r\n public readonly password: any,\r\n public readonly multiInstance: boolean,\r\n public readonly eventReduce: boolean = false,\r\n public options: any = {},\r\n /**\r\n * Stores information documents about the collections of the database\r\n */\r\n public readonly internalStore: RxStorageInstance<InternalStoreDocType, Internals, InstanceCreationOptions>,\r\n public readonly hashFunction: HashFunction,\r\n public readonly cleanupPolicy?: Partial<RxCleanupPolicy>,\r\n public readonly allowSlowCount?: boolean,\r\n public readonly reactivity?: RxReactivityFactory<any>,\r\n public readonly onClosed?: () => void,\r\n ) {\r\n DB_COUNT++;\r\n\r\n /**\r\n * In the dev-mode, we create a pseudoInstance\r\n * to get all properties of RxDatabase and ensure they do not\r\n * conflict with the collection names etc.\r\n * So only if it is not pseudoInstance,\r\n * we have all values to prepare a real RxDatabase.\r\n *\r\n * TODO this is ugly, we should use a different way in the dev-mode\r\n * so that all non-dev-mode code can be cleaner.\r\n */\r\n if (this.name !== 'pseudoInstance') {\r\n /**\r\n * Wrap the internal store\r\n * to ensure that calls to it also end up in\r\n * calculation of the idle state and the hooks.\r\n */\r\n this.internalStore = getWrappedStorageInstance(\r\n this.asRxDatabase,\r\n internalStore,\r\n INTERNAL_STORE_SCHEMA\r\n );\r\n\r\n /**\r\n * Start writing the storage token.\r\n * Do not await the creation because it would run\r\n * in a critical path that increases startup time.\r\n *\r\n * Writing the token takes about 20 milliseconds\r\n * even on a fast adapter, so this is worth it.\r\n */\r\n this.storageTokenDocument = ensureStorageTokenDocumentExists(this.asRxDatabase)\r\n .catch(err => this.startupErrors.push(err) as any);\r\n this.storageToken = this.storageTokenDocument\r\n .then(doc => doc.data.token)\r\n .catch(err => this.startupErrors.push(err) as any);\r\n }\r\n }\r\n\r\n get $(): Observable<RxChangeEvent<any>> {\r\n return this.observable$;\r\n }\r\n\r\n /**\r\n * Emits events whenever a JavaScript instance\r\n * of RxCollection is added or removed on the RxDatabase instance.\r\n * Does not emit anything across browser-tabs!\r\n */\r\n get collections$(): Observable<RxCollectionEvent> {\r\n return this.collectionsSubject$.asObservable();\r\n }\r\n\r\n public getReactivityFactory(): RxReactivityFactory<Reactivity> {\r\n if (!this.reactivity) {\r\n throw newRxError('DB14', { database: this.name });\r\n }\r\n return this.reactivity;\r\n }\r\n\r\n public _subs: Subscription[] = [];\r\n\r\n /**\r\n * Because having unhandled exceptions would fail,\r\n * we have to store the async errors of the constructor here\r\n * so we can throw them later.\r\n */\r\n public startupErrors: (RxError | RxTypeError)[] = [];\r\n\r\n /**\r\n * When the database is closed,\r\n * these functions will be called an awaited.\r\n * Used to automatically clean up stuff that\r\n * belongs to this collection.\r\n */\r\n public onClose: (() => MaybePromise<any>)[] = [];\r\n public closed: boolean = false;\r\n public collections: Collections = {} as any;\r\n public states: { [name: string]: RxState<any, Reactivity>; } = {};\r\n\r\n /**\r\n * Support for `using` / `await using` (ECMAScript explicit resource management).\r\n * This allows: `await using db = await createRxDatabase(...)`\r\n */\r\n public async [Symbol.asyncDispose](): Promise<void> {\r\n await this.close();\r\n }\r\n\r\n /**\r\n * Internally only use eventBulks$\r\n * Do not use .$ or .observable$ because that has to transform\r\n * the events which decreases performance.\r\n */\r\n public readonly eventBulks$: Subject<RxChangeEventBulk<any>> = new Subject();\r\n\r\n private closePromise: Promise<boolean> | null = null;\r\n\r\n public collectionsSubject$ = new Subject<RxCollectionEvent>();\r\n private observable$: Observable<RxChangeEvent<any>> = this.eventBulks$\r\n .pipe(\r\n mergeMap((changeEventBulk: RxChangeEventBulk<any>) => rxChangeEventBulkToRxChangeEvents(changeEventBulk))\r\n );\r\n\r\n /**\r\n * Unique token that is stored with the data.\r\n * Used to detect if the dataset has been deleted\r\n * and if two RxDatabase instances work on the same dataset or not.\r\n *\r\n * Because reading and writing the storageToken runs in the hot path\r\n * of database creation, we do not await the storageWrites but instead\r\n * work with the promise when we need the value.\r\n */\r\n public storageToken: Promise<string> = PROMISE_RESOLVE_FALSE as any;\r\n /**\r\n * Stores the whole state of the internal storage token document.\r\n * We need this in some plugins.\r\n */\r\n public storageTokenDocument: Promise<RxDocumentData<InternalStoreStorageTokenDocType>> = PROMISE_RESOLVE_FALSE as any;\r\n\r\n /**\r\n * Contains the ids of all event bulks that have been emitted\r\n * by the database.\r\n * Used to detect duplicates that come in again via BroadcastChannel\r\n * or other streams.\r\n * In the past we tried to remove this and to ensure\r\n * all storages only emit the same event bulks only once\r\n * but it turns out this is just not possible for all storages.\r\n * JavaScript processes, workers and browser tabs can be closed and started at any time\r\n * which can cause cases where it is not possible to know if an event bulk has been emitted already.\r\n */\r\n public emittedEventBulkIds: ObliviousSet<string> = new ObliviousSet(60 * 1000);\r\n\r\n /**\r\n * This is the main handle-point for all change events\r\n * ChangeEvents created by this instance go:\r\n * RxDocument -> RxCollection -> RxDatabase.$emit -> MultiInstance\r\n * ChangeEvents created by other instances go:\r\n * MultiInstance -> RxDatabase.$emit -> RxCollection -> RxDatabase\r\n */\r\n $emit(changeEventBulk: RxChangeEventBulk<any>) {\r\n if (this.emittedEventBulkIds.has(changeEventBulk.id)) {\r\n return;\r\n }\r\n this.emittedEventBulkIds.add(changeEventBulk.id);\r\n this.eventBulks$.next(changeEventBulk);\r\n }\r\n\r\n /**\r\n * removes the collection-doc from the internalStore\r\n */\r\n async removeCollectionDoc(name: string, schema: any): Promise<void> {\r\n const doc = await getSingleDocument(\r\n this.internalStore,\r\n getPrimaryKeyOfInternalDocument(\r\n _collectionNamePrimary(name, schema),\r\n INTERNAL_CONTEXT_COLLECTION\r\n )\r\n );\r\n if (!doc) {\r\n throw newRxError('SNH', { name, schema });\r\n }\r\n const writeDoc = flatCloneDocWithMeta(doc);\r\n writeDoc._deleted = true;\r\n\r\n await this.internalStore.bulkWrite([{\r\n document: writeDoc,\r\n previous: doc\r\n }], 'rx-database-remove-collection');\r\n }\r\n\r\n /**\r\n * creates multiple RxCollections at once\r\n * to be much faster by saving db txs and doing stuff in bulk-operations\r\n * This function is not called often, but mostly in the critical path at the initial page load\r\n * So it must be as fast as possible.\r\n */\r\n async addCollections<CreatedCollections = Partial<Collections>>(collectionCreators: {\r\n [key in keyof CreatedCollections]: RxCollectionCreator<any>\r\n }): Promise<{ [key in keyof CreatedCollections]: RxCollection<any, {}, {}, {}, Reactivity> }> {\r\n const jsonSchemas: { [key in keyof CreatedCollections]: RxJsonSchema<any> } = {} as any;\r\n const schemas: { [key in keyof CreatedCollections]: RxSchema<any> } = {} as any;\r\n const bulkPutDocs: BulkWriteRow<InternalStoreCollectionDocType>[] = [];\r\n const useArgsByCollectionName: any = {};\r\n\r\n await Promise.all(\r\n Object.entries(collectionCreators).map(async ([name, args]) => {\r\n const collectionName: keyof CreatedCollections = name as any;\r\n const rxJsonSchema = (args as RxCollectionCreator<any>).schema;\r\n jsonSchemas[collectionName] = rxJsonSchema;\r\n const schema = createRxSchema(rxJsonSchema, this.hashFunction);\r\n schemas[collectionName] = schema;\r\n\r\n // collection already exists\r\n if ((this.collections as any)[name]) {\r\n throw newRxError('DB3', {\r\n name\r\n });\r\n }\r\n\r\n const collectionNameWithVersion = _collectionNamePrimary(name, rxJsonSchema);\r\n const collectionDocData: RxDocumentData<InternalStoreCollectionDocType> = {\r\n id: getPrimaryKeyOfInternalDocument(\r\n collectionNameWithVersion,\r\n INTERNAL_CONTEXT_COLLECTION\r\n ),\r\n key: collectionNameWithVersion,\r\n context: INTERNAL_CONTEXT_COLLECTION,\r\n data: {\r\n name: collectionName as any,\r\n schemaHash: await schema.hash,\r\n schema: schema.jsonSchema,\r\n version: schema.version,\r\n connectedStorages: []\r\n },\r\n _deleted: false,\r\n _meta: getDefaultRxDocumentMeta(),\r\n _rev: getDefaultRevision(),\r\n _attachments: {}\r\n };\r\n bulkPutDocs.push({\r\n document: collectionDocData\r\n });\r\n\r\n const useArgs: any = Object.assign(\r\n {},\r\n args,\r\n {\r\n name: collectionName,\r\n schema,\r\n database: this\r\n }\r\n );\r\n\r\n // run hooks\r\n const hookData: RxCollectionCreator<any> & { name: string; } = flatClone(args) as any;\r\n (hookData as any).database = this;\r\n hookData.name = name;\r\n runPluginHooks('preCreateRxCollection', hookData);\r\n useArgs.conflictHandler = hookData.conflictHandler;\r\n\r\n useArgsByCollectionName[collectionName] = useArgs;\r\n })\r\n );\r\n\r\n\r\n /**\r\n * Optimization: Start creating collection storage instances\r\n * in parallel with the internal store bulkWrite and startup error check.\r\n * Storage instance creation is independent of the internal store write,\r\n * so we can overlap these I/O operations to reduce time-to-first-insert.\r\n */\r\n const collectionStorageInstancePromises: { [key: string]: Promise<RxStorageInstance<any, any, any>>; } = {};\r\n Object.keys(collectionCreators).forEach((collectionName) => {\r\n const useArgs = useArgsByCollectionName[collectionName];\r\n const storageInstanceCreationParams: RxStorageInstanceCreationParams<any, any> = {\r\n databaseInstanceToken: this.token,\r\n databaseName: this.name,\r\n collectionName: collectionName,\r\n schema: useArgs.schema.jsonSchema,\r\n options: useArgs.instanceCreationOptions || {},\r\n multiInstance: this.multiInstance,\r\n password: this.password,\r\n devMode: overwritable.isDevMode()\r\n };\r\n runPluginHooks('preCreateRxStorageInstance', storageInstanceCreationParams);\r\n const promise = createRxCollectionStorageInstance(\r\n this.asRxDatabase,\r\n storageInstanceCreationParams\r\n );\r\n /**\r\n * Prevent unhandled promise rejection warnings.\r\n * If ensureNoStartupErrors() or the bulkWrite error handling throws\r\n * (e.g. password mismatch, schema mismatch), these promises might\r\n * never be awaited. The actual errors are still propagated when\r\n * the promises are awaited in Phase 5 below.\r\n */\r\n promise.catch(() => { });\r\n collectionStorageInstancePromises[collectionName] = promise;\r\n });\r\n\r\n /**\r\n * If the ensureNoStartupErrors or the bulkWrite error handling throws,\r\n * we must close any pre-created storage instances to avoid resource leaks.\r\n */\r\n let putDocsResult;\r\n try {\r\n [putDocsResult] = await Promise.all([\r\n this.internalStore.bulkWrite(\r\n bulkPutDocs,\r\n 'rx-database-add-collection'\r\n ),\r\n ensureNoStartupErrors(this)\r\n ]);\r\n\r\n await Promise.all(\r\n putDocsResult.error.map(async (error) => {\r\n if (error.status !== 409) {\r\n throw newRxError('DB12', {\r\n database: this.name,\r\n writeError: error\r\n });\r\n }\r\n const docInDb: RxDocumentData<InternalStoreCollectionDocType> = ensureNotFalsy(error.documentInDb);\r\n const collectionName = docInDb.data.name;\r\n const schema = (schemas as any)[collectionName];\r\n // collection already exists but has different schema\r\n if (docInDb.data.schemaHash !== await schema.hash) {\r\n throw newRxError('DB6', {\r\n database: this.name,\r\n collection: collectionName,\r\n previousSchemaHash: docInDb.data.schemaHash,\r\n schemaHash: await schema.hash,\r\n previousSchema: docInDb.data.schema,\r\n schema: ensureNotFalsy((jsonSchemas as any)[collectionName])\r\n });\r\n }\r\n })\r\n );\r\n } catch (err) {\r\n /**\r\n * Close any pre-created storage instances on error.\r\n * Some instances might have failed to create (rejected promise),\r\n * so we catch and ignore errors during cleanup.\r\n */\r\n await Promise.all(\r\n Object.values(collectionStorageInstancePromises).map(\r\n p => p.then(instance => instance.close()).catch(() => { })\r\n )\r\n );\r\n throw err;\r\n }\r\n\r\n const ret: { [key in keyof CreatedCollections]: RxCollection<any, {}, {}, {}, Reactivity> } = {} as any;\r\n await Promise.all(\r\n Object.keys(collectionCreators).map(async (collectionName) => {\r\n const useArgs = useArgsByCollectionName[collectionName];\r\n const storageInstance = await collectionStorageInstancePromises[collectionName];\r\n const collection = await createRxCollection({\r\n ...useArgs,\r\n storageInstance\r\n });\r\n (ret as any)[collectionName] = collection;\r\n\r\n // set as getter to the database\r\n (this.collections as any)[collectionName] = collection;\r\n this.collectionsSubject$.next({\r\n collection,\r\n type: 'ADDED'\r\n });\r\n if (!(this as any)[collectionName]) {\r\n Object.defineProperty(this, collectionName, {\r\n get: () => (this.collections as any)[collectionName]\r\n });\r\n }\r\n })\r\n );\r\n\r\n return ret;\r\n }\r\n\r\n /**\r\n * runs the given function between idleQueue-locking\r\n */\r\n lockedRun<T>(fn: (...args: any[]) => T): T extends Promise<any> ? T : Promise<T> {\r\n return this.idleQueue.wrapCall(fn) as any;\r\n }\r\n\r\n requestIdlePromise() {\r\n return this.idleQueue.requestIdlePromise();\r\n }\r\n\r\n /**\r\n * Export database to a JSON friendly format.\r\n */\r\n exportJSON(_collections?: string[]): Promise<RxDumpDatabase<Collections>>;\r\n exportJSON(_collections?: string[]): Promise<RxDumpDatabaseAny<Collections>>;\r\n exportJSON(_collections?: string[]): Promise<any> {\r\n throw pluginMissing('json-dump');\r\n }\r\n\r\n addState<T = any>(_name?: string): Promise<RxState<T, Reactivity>> {\r\n throw pluginMissing('state');\r\n }\r\n\r\n /**\r\n * Import the parsed JSON export into the collection.\r\n * @param _exportedJSON The previously exported data from the `<db>.exportJSON()` method.\r\n * @note When an interface is loaded in this collection all base properties of the type are typed as `any`\r\n * since data could be encrypted.\r\n */\r\n importJSON(_exportedJSON: RxDumpDatabaseAny<Collections>): Promise<void> {\r\n throw pluginMissing('json-dump');\r\n }\r\n\r\n backup(_options: BackupOptions): RxBackupState {\r\n throw pluginMissing('backup');\r\n }\r\n\r\n public leaderElector(): LeaderElector {\r\n throw pluginMissing('leader-election');\r\n }\r\n\r\n public isLeader(): boolean {\r\n throw pluginMissing('leader-election');\r\n }\r\n /**\r\n * returns a promise which resolves when the instance becomes leader\r\n */\r\n public waitForLeadership(): Promise<boolean> {\r\n throw pluginMissing('leader-election');\r\n }\r\n\r\n public migrationStates(): Observable<RxMigrationState[]> {\r\n throw pluginMissing('migration-schema');\r\n }\r\n\r\n /**\r\n * closes the database-instance and all collections\r\n */\r\n public close(): Promise<boolean> {\r\n if (this.closePromise) {\r\n return this.closePromise;\r\n }\r\n\r\n const { promise, resolve } = createPromiseWithResolvers<boolean>();\r\n const resolveClosePromise = (result: boolean) => {\r\n if (this.onClosed) {\r\n this.onClosed();\r\n }\r\n this.closed = true;\r\n resolve(result);\r\n };\r\n this.closePromise = promise;\r\n\r\n (async () => {\r\n await runAsyncPluginHooks('preCloseRxDatabase', this);\r\n /**\r\n * Complete the event stream\r\n * to stop all subscribers who forgot to unsubscribe.\r\n */\r\n this.eventBulks$.complete();\r\n this.collectionsSubject$.complete();\r\n\r\n DB_COUNT--;\r\n this._subs.map(sub => sub.unsubscribe());\r\n\r\n /**\r\n * closing the pseudo instance will throw\r\n * because stuff is missing\r\n * TODO we should not need the pseudo instance on runtime.\r\n * we should generate the property list on build time.\r\n */\r\n if (this.name === 'pseudoInstance') {\r\n resolveClosePromise(false);\r\n return;\r\n }\r\n\r\n /**\r\n * First wait until the database is idle\r\n */\r\n return this.requestIdlePromise()\r\n .then(() => Promise.all(this.onClose.map(fn => fn())))\r\n // close all collections\r\n .then(() => Promise.all(\r\n Object.keys(this.collections as any)\r\n .map(key => (this.collections as any)[key])\r\n .map(col => col.close())\r\n ))\r\n // close internal storage instances\r\n .then(() => this.internalStore.close())\r\n .then(() => resolveClosePromise(true));\r\n })();\r\n\r\n return promise;\r\n }\r\n\r\n /**\r\n * deletes the database and its stored data.\r\n * Returns the names of all removed collections.\r\n */\r\n remove(): Promise<string[]> {\r\n return this\r\n .close()\r\n .then(() => removeRxDatabase(this.name, this.storage, this.multiInstance, this.password));\r\n }\r\n\r\n get asRxDatabase(): RxDatabase<\r\n {},\r\n Internals,\r\n InstanceCreationOptions,\r\n Reactivity\r\n > {\r\n return this as any;\r\n }\r\n\r\n registerWebMCP(_options?: WebMCPOptions): { error$: Subject<Error>; log$: Subject<WebMCPLogEvent>; } {\r\n throw pluginMissing('webmcp');\r\n }\r\n}\r\n\r\n/**\r\n * checks if an instance with same name and storage already exists\r\n * @throws {RxError} if used\r\n */\r\nfunction throwIfDatabaseNameUsed(\r\n name: string,\r\n storage: RxStorage<any, any>\r\n) {\r\n if (USED_DATABASE_NAMES.has(getDatabaseNameKey(name, storage))) {\r\n throw newRxError('DB8', {\r\n name,\r\n storage: storage.name,\r\n link: 'https://rxdb.info/rx-database.html#ignoreduplicate'\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * Polyfill for https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/withResolvers\r\n */\r\nfunction createPromiseWithResolvers<T>() {\r\n let resolve!: (value: T | PromiseLike<T>) => void;\r\n let reject!: (reason?: any) => void;\r\n const promise = new Promise<T>((res, rej) => {\r\n resolve = res;\r\n reject = rej;\r\n });\r\n return { promise, resolve, reject };\r\n}\r\n\r\nfunction getDatabaseNameKey(\r\n name: string,\r\n storage: RxStorage<any, any>\r\n) {\r\n return storage.name + '|' + name;\r\n}\r\n\r\n/**\r\n * Creates the storage instances that are used internally in the database\r\n * to store schemas and other configuration stuff.\r\n */\r\nexport async function createRxDatabaseStorageInstance<Internals, InstanceCreationOptions>(\r\n databaseInstanceToken: string,\r\n storage: RxStorage<Internals, InstanceCreationOptions>,\r\n databaseName: string,\r\n options: InstanceCreationOptions,\r\n multiInstance: boolean,\r\n password?: string\r\n): Promise<RxStorageInstance<InternalStoreDocType, Internals, InstanceCreationOptions>> {\r\n const internalStore = await storage.createStorageInstance<InternalStoreDocType>(\r\n {\r\n databaseInstanceToken,\r\n databaseName,\r\n collectionName: INTERNAL_STORAGE_NAME,\r\n schema: INTERNAL_STORE_SCHEMA,\r\n options,\r\n multiInstance,\r\n password,\r\n devMode: overwritable.isDevMode()\r\n }\r\n );\r\n return internalStore;\r\n}\r\n\r\nexport function createRxDatabase<\r\n Collections = { [key: string]: RxCollection; },\r\n Internals = any,\r\n InstanceCreationOptions = any,\r\n Reactivity = unknown\r\n>(\r\n {\r\n storage,\r\n instanceCreationOptions,\r\n name,\r\n password,\r\n multiInstance = true,\r\n eventReduce = true,\r\n ignoreDuplicate = false,\r\n options = {},\r\n cleanupPolicy,\r\n closeDuplicates = false,\r\n allowSlowCount = false,\r\n localDocuments = false,\r\n hashFunction = defaultHashSha256,\r\n reactivity\r\n }: RxDatabaseCreator<Internals, InstanceCreationOptions, Reactivity>\r\n): Promise<\r\n RxDatabase<Collections, Internals, InstanceCreationOptions, Reactivity>\r\n> {\r\n runPluginHooks('preCreateRxDatabase', {\r\n storage,\r\n instanceCreationOptions,\r\n name,\r\n password,\r\n multiInstance,\r\n eventReduce,\r\n ignoreDuplicate,\r\n options,\r\n localDocuments\r\n });\r\n\r\n const databaseNameKey = getDatabaseNameKey(name, storage);\r\n const databaseNameKeyUnclosedInstancesSet = DATABASE_UNCLOSED_INSTANCE_PROMISE_MAP.get(databaseNameKey) || new Set();\r\n const instancePromiseWithResolvers = createPromiseWithResolvers<RxDatabase<Collections, Internals, InstanceCreationOptions, Reactivity>>();\r\n const closeDuplicatesPromises = Array.from(databaseNameKeyUnclosedInstancesSet);\r\n const onInstanceClosed = () => {\r\n databaseNameKeyUnclosedInstancesSet.delete(instancePromiseWithResolvers.promise as any as Promise<RxDatabase>);\r\n USED_DATABASE_NAMES.delete(databaseNameKey);\r\n };\r\n\r\n databaseNameKeyUnclosedInstancesSet.add(instancePromiseWithResolvers.promise as any as Promise<RxDatabase>);\r\n DATABASE_UNCLOSED_INSTANCE_PROMISE_MAP.set(databaseNameKey, databaseNameKeyUnclosedInstancesSet);\r\n\r\n (async () => {\r\n if (closeDuplicates) {\r\n await Promise.all(\r\n closeDuplicatesPromises.map((unclosedInstancePromise) =>\r\n unclosedInstancePromise\r\n .catch(() => null)\r\n .then((instance) => instance && instance.close())\r\n )\r\n );\r\n }\r\n\r\n if (ignoreDuplicate) {\r\n if (!overwritable.isDevMode()) {\r\n throw newRxError('DB9', {\r\n database: name\r\n });\r\n }\r\n } else {\r\n // check if combination already used\r\n throwIfDatabaseNameUsed(name, storage);\r\n }\r\n\r\n USED_DATABASE_NAMES.add(databaseNameKey);\r\n\r\n const databaseInstanceToken = randomToken(10);\r\n const storageInstance = await createRxDatabaseStorageInstance<\r\n Internals,\r\n InstanceCreationOptions\r\n >(\r\n databaseInstanceToken,\r\n storage,\r\n name,\r\n instanceCreationOptions as any,\r\n multiInstance,\r\n password\r\n );\r\n const rxDatabase = new RxDatabaseBase(\r\n name,\r\n databaseInstanceToken,\r\n storage,\r\n instanceCreationOptions,\r\n password,\r\n multiInstance,\r\n eventReduce,\r\n options,\r\n storageInstance,\r\n hashFunction,\r\n cleanupPolicy,\r\n allowSlowCount,\r\n reactivity,\r\n onInstanceClosed\r\n ) as RxDatabase<Collections>;\r\n\r\n await runAsyncPluginHooks('createRxDatabase', {\r\n database: rxDatabase,\r\n creator: {\r\n storage,\r\n instanceCreationOptions,\r\n name,\r\n password,\r\n multiInstance,\r\n eventReduce,\r\n ignoreDuplicate,\r\n options,\r\n localDocuments\r\n }\r\n });\r\n\r\n return rxDatabase;\r\n })()\r\n .then((rxDatabase) => {\r\n instancePromiseWithResolvers.resolve(rxDatabase);\r\n })\r\n .catch((err) => {\r\n instancePromiseWithResolvers.reject(err);\r\n onInstanceClosed();\r\n });\r\n\r\n return instancePromiseWithResolvers.promise;\r\n}\r\n\r\n/**\r\n * Removes the database and all its known data\r\n * with all known collections and all internal meta data.\r\n *\r\n * Returns the names of the removed collections.\r\n */\r\nexport async function removeRxDatabase(\r\n databaseName: string,\r\n storage: RxStorage<any, any>,\r\n multiInstance: boolean = true,\r\n password?: string\r\n): Promise<string[]> {\r\n const databaseInstanceToken = randomToken(10);\r\n const dbInternalsStorageInstance = await createRxDatabaseStorageInstance(\r\n databaseInstanceToken,\r\n storage,\r\n databaseName,\r\n {},\r\n multiInstance,\r\n password\r\n );\r\n const collectionDocs = await getAllCollectionDocuments(dbInternalsStorageInstance);\r\n const collectionNames = new Set<string>();\r\n collectionDocs.forEach(doc => collectionNames.add(doc.data.name));\r\n const removedCollectionNames: string[] = Array.from(collectionNames);\r\n\r\n await Promise.all(\r\n removedCollectionNames.map(collectionName => removeCollectionStorages(\r\n storage,\r\n dbInternalsStorageInstance,\r\n databaseInstanceToken,\r\n databaseName,\r\n collectionName,\r\n multiInstance,\r\n password\r\n ))\r\n );\r\n\r\n await runAsyncPluginHooks('postRemoveRxDatabase', {\r\n databaseName,\r\n storage\r\n });\r\n\r\n await dbInternalsStorageInstance.remove();\r\n return removedCollectionNames;\r\n}\r\n\r\nexport function isRxDatabase(obj: any) {\r\n return obj instanceof RxDatabaseBase;\r\n}\r\n\r\nexport function dbCount(): number {\r\n return DB_COUNT;\r\n}\r\n\r\n\r\n/**\r\n * Returns true if the given RxDatabase was the first\r\n * instance that was created on the storage with this name.\r\n *\r\n * Can be used for some optimizations because on the first instantiation,\r\n * we can assume that no data was written before.\r\n */\r\nexport async function isRxDatabaseFirstTimeInstantiated(\r\n database: RxDatabase\r\n): Promise<boolean> {\r\n const tokenDoc = await database.storageTokenDocument;\r\n return tokenDoc.data.instanceToken === database.token;\r\n}\r\n\r\n\r\n/**\r\n * For better performance some tasks run async\r\n * and are awaited later.\r\n * But we still have to ensure that there have been no errors\r\n * on database creation.\r\n */\r\nexport async function ensureNoStartupErrors(\r\n rxDatabase: RxDatabaseBase<any, any, any, any>\r\n) {\r\n await rxDatabase.storageToken;\r\n if (rxDatabase.startupErrors[0]) {\r\n throw rxDatabase.startupErrors[0];\r\n }\r\n}\r\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"rx-database.js","names":["IdleQueue","ObliviousSet","pluginMissing","flatClone","PROMISE_RESOLVE_FALSE","randomToken","ensureNotFalsy","getDefaultRevision","getDefaultRxDocumentMeta","defaultHashSha256","RXDB_VERSION","newRxError","createRxSchema","runPluginHooks","runAsyncPluginHooks","Subject","mergeMap","createRxCollection","flatCloneDocWithMeta","getSingleDocument","getWrappedStorageInstance","INTERNAL_STORAGE_NAME","ensureStorageTokenDocumentExists","getAllCollectionDocuments","getPrimaryKeyOfInternalDocument","INTERNAL_CONTEXT_COLLECTION","INTERNAL_STORE_SCHEMA","_collectionNamePrimary","createRxCollectionStorageInstance","removeCollectionStorages","overwritable","rxChangeEventBulkToRxChangeEvents","USED_DATABASE_NAMES","Set","DATABASE_UNCLOSED_INSTANCE_PROMISE_MAP","Map","DB_COUNT","RxDatabaseBase","name","token","storage","instanceCreationOptions","password","multiInstance","eventReduce","options","internalStore","hashFunction","cleanupPolicy","allowSlowCount","reactivity","onClosed","idleQueue","rxdbVersion","storageInstances","_subs","startupErrors","onClose","closed","collections","states","eventBulks$","closePromise","collectionsSubject$","observable$","pipe","changeEventBulk","storageToken","storageTokenDocument","emittedEventBulkIds","asRxDatabase","catch","err","push","then","doc","data","_proto","prototype","getReactivityFactory","database","Symbol","asyncDispose","close","$emit","has","id","add","next","removeCollectionDoc","schema","writeDoc","_deleted","bulkWrite","document","previous","addCollections","collectionCreators","jsonSchemas","schemas","bulkPutDocs","useArgsByCollectionName","Promise","all","Object","entries","map","args","collectionName","rxJsonSchema","collectionNameWithVersion","collectionDocData","key","context","schemaHash","hash","jsonSchema","version","connectedStorages","_meta","_rev","_attachments","useArgs","assign","hookData","conflictHandler","collectionStorageInstancePromises","keys","forEach","storageInstanceCreationParams","databaseInstanceToken","databaseName","devMode","isDevMode","promise","putDocsResult","ensureNoStartupErrors","error","status","writeError","docInDb","documentInDb","collection","previousSchemaHash","previousSchema","values","p","instance","ret","storageInstance","type","defineProperty","get","lockedRun","fn","wrapCall","requestIdlePromise","exportJSON","_collections","addState","_name","importJSON","_exportedJSON","backup","_options","leaderElector","isLeader","waitForLeadership","migrationStates","resolve","reject","createPromiseWithResolvers","resolveClosePromise","result","complete","sub","unsubscribe","closingError","col","remove","onRemove","removeRxDatabase","registerWebMCP","_createClass","asObservable","throwIfDatabaseNameUsed","getDatabaseNameKey","link","res","rej","createRxDatabaseStorageInstance","createStorageInstance","createRxDatabase","ignoreDuplicate","closeDuplicates","localDocuments","databaseNameKey","databaseNameKeyUnclosedInstancesSet","instancePromiseWithResolvers","closeDuplicatesPromises","Array","from","onInstanceClosed","delete","set","unclosedInstancePromise","rxDatabase","creator","dbInternalsStorageInstance","collectionDocs","collectionNames","removedCollectionNames","isRxDatabase","obj","dbCount","isRxDatabaseFirstTimeInstantiated","tokenDoc","instanceToken"],"sources":["../../src/rx-database.ts"],"sourcesContent":["import { IdleQueue } from 'custom-idle-queue';\r\nimport type {\r\n LeaderElector\r\n} from 'broadcast-channel';\r\nimport { ObliviousSet } from 'oblivious-set';\r\nimport type {\r\n CollectionsOfDatabase,\r\n RxDatabase,\r\n RxCollectionCreator,\r\n RxJsonSchema,\r\n RxCollection,\r\n RxDumpDatabase,\r\n RxDumpDatabaseAny,\r\n BackupOptions,\r\n RxStorage,\r\n RxStorageInstance,\r\n RxStorageInstanceCreationParams,\r\n BulkWriteRow,\r\n RxChangeEvent,\r\n RxDatabaseCreator,\r\n RxChangeEventBulk,\r\n RxDocumentData,\r\n RxCleanupPolicy,\r\n InternalStoreDocType,\r\n InternalStoreStorageTokenDocType,\r\n InternalStoreCollectionDocType,\r\n RxTypeError,\r\n RxError,\r\n HashFunction,\r\n MaybePromise,\r\n RxState,\r\n RxCollectionEvent,\r\n WebMCPOptions,\r\n WebMCPLogEvent\r\n} from './types/index.d.ts';\r\n\r\nimport {\r\n pluginMissing,\r\n flatClone,\r\n PROMISE_RESOLVE_FALSE,\r\n randomToken,\r\n ensureNotFalsy,\r\n getDefaultRevision,\r\n getDefaultRxDocumentMeta,\r\n defaultHashSha256,\r\n RXDB_VERSION\r\n} from './plugins/utils/index.ts';\r\nimport {\r\n newRxError\r\n} from './rx-error.ts';\r\nimport {\r\n createRxSchema,\r\n RxSchema\r\n} from './rx-schema.ts';\r\nimport {\r\n runPluginHooks,\r\n runAsyncPluginHooks\r\n} from './hooks.ts';\r\nimport {\r\n Subject,\r\n Subscription,\r\n Observable\r\n} from 'rxjs';\r\nimport {\r\n mergeMap\r\n} from 'rxjs/operators';\r\nimport {\r\n createRxCollection\r\n} from './rx-collection.ts';\r\nimport {\r\n flatCloneDocWithMeta,\r\n getSingleDocument,\r\n getWrappedStorageInstance,\r\n INTERNAL_STORAGE_NAME,\r\n WrappedRxStorageInstance\r\n} from './rx-storage-helper.ts';\r\nimport type { RxBackupState } from './plugins/backup/index.ts';\r\nimport {\r\n ensureStorageTokenDocumentExists,\r\n getAllCollectionDocuments,\r\n getPrimaryKeyOfInternalDocument,\r\n INTERNAL_CONTEXT_COLLECTION,\r\n INTERNAL_STORE_SCHEMA,\r\n _collectionNamePrimary\r\n} from './rx-database-internal-store.ts';\r\nimport { createRxCollectionStorageInstance, removeCollectionStorages } from './rx-collection-helper.ts';\r\nimport { overwritable } from './overwritable.ts';\r\nimport type { RxMigrationState } from './plugins/migration-schema/index.ts';\r\nimport type { RxReactivityFactory } from './types/plugins/reactivity.d.ts';\r\nimport { rxChangeEventBulkToRxChangeEvents } from './rx-change-event.ts';\r\n\r\n/**\r\n * stores the used database names+storage names\r\n * so we can throw when the same database is created more than once.\r\n */\r\nconst USED_DATABASE_NAMES: Set<string> = new Set();\r\nconst DATABASE_UNCLOSED_INSTANCE_PROMISE_MAP = new Map<string, Set<Promise<RxDatabase>>>();\r\n\r\nlet DB_COUNT = 0;\r\n\r\nexport class RxDatabaseBase<\r\n Internals,\r\n InstanceCreationOptions,\r\n Collections = CollectionsOfDatabase,\r\n Reactivity = unknown\r\n> {\r\n\r\n public readonly idleQueue: IdleQueue = new IdleQueue();\r\n public readonly rxdbVersion = RXDB_VERSION;\r\n\r\n /**\r\n * Contains all known non-closed storage instances\r\n * that belong to this database.\r\n * Used in plugins and unit tests.\r\n */\r\n public readonly storageInstances = new Set<WrappedRxStorageInstance<any, Internals, InstanceCreationOptions>>();\r\n\r\n constructor(\r\n public readonly name: string,\r\n /**\r\n * Uniquely identifies the instance\r\n * of this RxDatabase.\r\n */\r\n public readonly token: string,\r\n public readonly storage: RxStorage<Internals, InstanceCreationOptions>,\r\n public readonly instanceCreationOptions: InstanceCreationOptions,\r\n public readonly password: any,\r\n public readonly multiInstance: boolean,\r\n public readonly eventReduce: boolean = false,\r\n public options: any = {},\r\n /**\r\n * Stores information documents about the collections of the database\r\n */\r\n public readonly internalStore: RxStorageInstance<InternalStoreDocType, Internals, InstanceCreationOptions>,\r\n public readonly hashFunction: HashFunction,\r\n public readonly cleanupPolicy?: Partial<RxCleanupPolicy>,\r\n public readonly allowSlowCount?: boolean,\r\n public readonly reactivity?: RxReactivityFactory<any>,\r\n public readonly onClosed?: () => void,\r\n ) {\r\n DB_COUNT++;\r\n\r\n /**\r\n * In the dev-mode, we create a pseudoInstance\r\n * to get all properties of RxDatabase and ensure they do not\r\n * conflict with the collection names etc.\r\n * So only if it is not pseudoInstance,\r\n * we have all values to prepare a real RxDatabase.\r\n *\r\n * TODO this is ugly, we should use a different way in the dev-mode\r\n * so that all non-dev-mode code can be cleaner.\r\n */\r\n if (this.name !== 'pseudoInstance') {\r\n /**\r\n * Wrap the internal store\r\n * to ensure that calls to it also end up in\r\n * calculation of the idle state and the hooks.\r\n */\r\n this.internalStore = getWrappedStorageInstance(\r\n this.asRxDatabase,\r\n internalStore,\r\n INTERNAL_STORE_SCHEMA\r\n );\r\n\r\n /**\r\n * Start writing the storage token.\r\n * Do not await the creation because it would run\r\n * in a critical path that increases startup time.\r\n *\r\n * Writing the token takes about 20 milliseconds\r\n * even on a fast adapter, so this is worth it.\r\n */\r\n this.storageTokenDocument = ensureStorageTokenDocumentExists(this.asRxDatabase)\r\n .catch(err => this.startupErrors.push(err) as any);\r\n this.storageToken = this.storageTokenDocument\r\n .then(doc => doc.data.token)\r\n .catch(err => this.startupErrors.push(err) as any);\r\n }\r\n }\r\n\r\n get $(): Observable<RxChangeEvent<any>> {\r\n return this.observable$;\r\n }\r\n\r\n /**\r\n * Emits events whenever a JavaScript instance\r\n * of RxCollection is added or removed on the RxDatabase instance.\r\n * Does not emit anything across browser-tabs!\r\n */\r\n get collections$(): Observable<RxCollectionEvent> {\r\n return this.collectionsSubject$.asObservable();\r\n }\r\n\r\n public getReactivityFactory(): RxReactivityFactory<Reactivity> {\r\n if (!this.reactivity) {\r\n throw newRxError('DB14', { database: this.name });\r\n }\r\n return this.reactivity;\r\n }\r\n\r\n public _subs: Subscription[] = [];\r\n\r\n /**\r\n * Because having unhandled exceptions would fail,\r\n * we have to store the async errors of the constructor here\r\n * so we can throw them later.\r\n */\r\n public startupErrors: (RxError | RxTypeError)[] = [];\r\n\r\n /**\r\n * When the database is closed,\r\n * these functions will be called an awaited.\r\n * Used to automatically clean up stuff that\r\n * belongs to this collection.\r\n */\r\n public onClose: (() => MaybePromise<any>)[] = [];\r\n public closed: boolean = false;\r\n public collections: Collections = {} as any;\r\n public states: { [name: string]: RxState<any, Reactivity>; } = {};\r\n\r\n /**\r\n * Support for `using` / `await using` (ECMAScript explicit resource management).\r\n * This allows: `await using db = await createRxDatabase(...)`\r\n */\r\n public async [Symbol.asyncDispose](): Promise<void> {\r\n await this.close();\r\n }\r\n\r\n /**\r\n * Internally only use eventBulks$\r\n * Do not use .$ or .observable$ because that has to transform\r\n * the events which decreases performance.\r\n */\r\n public readonly eventBulks$: Subject<RxChangeEventBulk<any>> = new Subject();\r\n\r\n private closePromise: Promise<boolean> | null = null;\r\n\r\n public collectionsSubject$ = new Subject<RxCollectionEvent>();\r\n private observable$: Observable<RxChangeEvent<any>> = this.eventBulks$\r\n .pipe(\r\n mergeMap((changeEventBulk: RxChangeEventBulk<any>) => rxChangeEventBulkToRxChangeEvents(changeEventBulk))\r\n );\r\n\r\n /**\r\n * Unique token that is stored with the data.\r\n * Used to detect if the dataset has been deleted\r\n * and if two RxDatabase instances work on the same dataset or not.\r\n *\r\n * Because reading and writing the storageToken runs in the hot path\r\n * of database creation, we do not await the storageWrites but instead\r\n * work with the promise when we need the value.\r\n */\r\n public storageToken: Promise<string> = PROMISE_RESOLVE_FALSE as any;\r\n /**\r\n * Stores the whole state of the internal storage token document.\r\n * We need this in some plugins.\r\n */\r\n public storageTokenDocument: Promise<RxDocumentData<InternalStoreStorageTokenDocType>> = PROMISE_RESOLVE_FALSE as any;\r\n\r\n /**\r\n * Contains the ids of all event bulks that have been emitted\r\n * by the database.\r\n * Used to detect duplicates that come in again via BroadcastChannel\r\n * or other streams.\r\n * In the past we tried to remove this and to ensure\r\n * all storages only emit the same event bulks only once\r\n * but it turns out this is just not possible for all storages.\r\n * JavaScript processes, workers and browser tabs can be closed and started at any time\r\n * which can cause cases where it is not possible to know if an event bulk has been emitted already.\r\n */\r\n public emittedEventBulkIds: ObliviousSet<string> = new ObliviousSet(60 * 1000);\r\n\r\n /**\r\n * This is the main handle-point for all change events\r\n * ChangeEvents created by this instance go:\r\n * RxDocument -> RxCollection -> RxDatabase.$emit -> MultiInstance\r\n * ChangeEvents created by other instances go:\r\n * MultiInstance -> RxDatabase.$emit -> RxCollection -> RxDatabase\r\n */\r\n $emit(changeEventBulk: RxChangeEventBulk<any>) {\r\n if (this.emittedEventBulkIds.has(changeEventBulk.id)) {\r\n return;\r\n }\r\n this.emittedEventBulkIds.add(changeEventBulk.id);\r\n this.eventBulks$.next(changeEventBulk);\r\n }\r\n\r\n /**\r\n * removes the collection-doc from the internalStore\r\n */\r\n async removeCollectionDoc(name: string, schema: any): Promise<void> {\r\n const doc = await getSingleDocument(\r\n this.internalStore,\r\n getPrimaryKeyOfInternalDocument(\r\n _collectionNamePrimary(name, schema),\r\n INTERNAL_CONTEXT_COLLECTION\r\n )\r\n );\r\n if (!doc) {\r\n throw newRxError('SNH', { name, schema });\r\n }\r\n const writeDoc = flatCloneDocWithMeta(doc);\r\n writeDoc._deleted = true;\r\n\r\n await this.internalStore.bulkWrite([{\r\n document: writeDoc,\r\n previous: doc\r\n }], 'rx-database-remove-collection');\r\n }\r\n\r\n /**\r\n * creates multiple RxCollections at once\r\n * to be much faster by saving db txs and doing stuff in bulk-operations\r\n * This function is not called often, but mostly in the critical path at the initial page load\r\n * So it must be as fast as possible.\r\n */\r\n async addCollections<CreatedCollections = Partial<Collections>>(collectionCreators: {\r\n [key in keyof CreatedCollections]: RxCollectionCreator<any>\r\n }): Promise<{ [key in keyof CreatedCollections]: RxCollection<any, {}, {}, {}, Reactivity> }> {\r\n const jsonSchemas: { [key in keyof CreatedCollections]: RxJsonSchema<any> } = {} as any;\r\n const schemas: { [key in keyof CreatedCollections]: RxSchema<any> } = {} as any;\r\n const bulkPutDocs: BulkWriteRow<InternalStoreCollectionDocType>[] = [];\r\n const useArgsByCollectionName: any = {};\r\n\r\n await Promise.all(\r\n Object.entries(collectionCreators).map(async ([name, args]) => {\r\n const collectionName: keyof CreatedCollections = name as any;\r\n const rxJsonSchema = (args as RxCollectionCreator<any>).schema;\r\n jsonSchemas[collectionName] = rxJsonSchema;\r\n const schema = createRxSchema(rxJsonSchema, this.hashFunction);\r\n schemas[collectionName] = schema;\r\n\r\n // collection already exists\r\n if ((this.collections as any)[name]) {\r\n throw newRxError('DB3', {\r\n name\r\n });\r\n }\r\n\r\n const collectionNameWithVersion = _collectionNamePrimary(name, rxJsonSchema);\r\n const collectionDocData: RxDocumentData<InternalStoreCollectionDocType> = {\r\n id: getPrimaryKeyOfInternalDocument(\r\n collectionNameWithVersion,\r\n INTERNAL_CONTEXT_COLLECTION\r\n ),\r\n key: collectionNameWithVersion,\r\n context: INTERNAL_CONTEXT_COLLECTION,\r\n data: {\r\n name: collectionName as any,\r\n schemaHash: await schema.hash,\r\n schema: schema.jsonSchema,\r\n version: schema.version,\r\n connectedStorages: []\r\n },\r\n _deleted: false,\r\n _meta: getDefaultRxDocumentMeta(),\r\n _rev: getDefaultRevision(),\r\n _attachments: {}\r\n };\r\n bulkPutDocs.push({\r\n document: collectionDocData\r\n });\r\n\r\n const useArgs: any = Object.assign(\r\n {},\r\n args,\r\n {\r\n name: collectionName,\r\n schema,\r\n database: this\r\n }\r\n );\r\n\r\n // run hooks\r\n const hookData: RxCollectionCreator<any> & { name: string; } = flatClone(args) as any;\r\n (hookData as any).database = this;\r\n hookData.name = name;\r\n runPluginHooks('preCreateRxCollection', hookData);\r\n useArgs.conflictHandler = hookData.conflictHandler;\r\n\r\n useArgsByCollectionName[collectionName] = useArgs;\r\n })\r\n );\r\n\r\n\r\n /**\r\n * Optimization: Start creating collection storage instances\r\n * in parallel with the internal store bulkWrite and startup error check.\r\n * Storage instance creation is independent of the internal store write,\r\n * so we can overlap these I/O operations to reduce time-to-first-insert.\r\n */\r\n const collectionStorageInstancePromises: { [key: string]: Promise<RxStorageInstance<any, any, any>>; } = {};\r\n Object.keys(collectionCreators).forEach((collectionName) => {\r\n const useArgs = useArgsByCollectionName[collectionName];\r\n const storageInstanceCreationParams: RxStorageInstanceCreationParams<any, any> = {\r\n databaseInstanceToken: this.token,\r\n databaseName: this.name,\r\n collectionName: collectionName,\r\n schema: useArgs.schema.jsonSchema,\r\n options: useArgs.instanceCreationOptions || {},\r\n multiInstance: this.multiInstance,\r\n password: this.password,\r\n devMode: overwritable.isDevMode()\r\n };\r\n runPluginHooks('preCreateRxStorageInstance', storageInstanceCreationParams);\r\n const promise = createRxCollectionStorageInstance(\r\n this.asRxDatabase,\r\n storageInstanceCreationParams\r\n );\r\n /**\r\n * Prevent unhandled promise rejection warnings.\r\n * If ensureNoStartupErrors() or the bulkWrite error handling throws\r\n * (e.g. password mismatch, schema mismatch), these promises might\r\n * never be awaited. The actual errors are still propagated when\r\n * the promises are awaited in Phase 5 below.\r\n */\r\n promise.catch(() => { });\r\n collectionStorageInstancePromises[collectionName] = promise;\r\n });\r\n\r\n /**\r\n * If the ensureNoStartupErrors or the bulkWrite error handling throws,\r\n * we must close any pre-created storage instances to avoid resource leaks.\r\n */\r\n let putDocsResult;\r\n try {\r\n [putDocsResult] = await Promise.all([\r\n this.internalStore.bulkWrite(\r\n bulkPutDocs,\r\n 'rx-database-add-collection'\r\n ),\r\n ensureNoStartupErrors(this)\r\n ]);\r\n\r\n await Promise.all(\r\n putDocsResult.error.map(async (error) => {\r\n if (error.status !== 409) {\r\n throw newRxError('DB12', {\r\n database: this.name,\r\n writeError: error\r\n });\r\n }\r\n const docInDb: RxDocumentData<InternalStoreCollectionDocType> = ensureNotFalsy(error.documentInDb);\r\n const collectionName = docInDb.data.name;\r\n const schema = (schemas as any)[collectionName];\r\n // collection already exists but has different schema\r\n if (docInDb.data.schemaHash !== await schema.hash) {\r\n throw newRxError('DB6', {\r\n database: this.name,\r\n collection: collectionName,\r\n previousSchemaHash: docInDb.data.schemaHash,\r\n schemaHash: await schema.hash,\r\n previousSchema: docInDb.data.schema,\r\n schema: ensureNotFalsy((jsonSchemas as any)[collectionName])\r\n });\r\n }\r\n })\r\n );\r\n } catch (err) {\r\n /**\r\n * Close any pre-created storage instances on error.\r\n * Some instances might have failed to create (rejected promise),\r\n * so we catch and ignore errors during cleanup.\r\n */\r\n await Promise.all(\r\n Object.values(collectionStorageInstancePromises).map(\r\n p => p.then(instance => instance.close()).catch(() => { })\r\n )\r\n );\r\n throw err;\r\n }\r\n\r\n const ret: { [key in keyof CreatedCollections]: RxCollection<any, {}, {}, {}, Reactivity> } = {} as any;\r\n await Promise.all(\r\n Object.keys(collectionCreators).map(async (collectionName) => {\r\n const useArgs = useArgsByCollectionName[collectionName];\r\n const storageInstance = await collectionStorageInstancePromises[collectionName];\r\n const collection = await createRxCollection({\r\n ...useArgs,\r\n storageInstance\r\n });\r\n (ret as any)[collectionName] = collection;\r\n\r\n // set as getter to the database\r\n (this.collections as any)[collectionName] = collection;\r\n this.collectionsSubject$.next({\r\n collection,\r\n type: 'ADDED'\r\n });\r\n if (!(this as any)[collectionName]) {\r\n Object.defineProperty(this, collectionName, {\r\n get: () => (this.collections as any)[collectionName]\r\n });\r\n }\r\n })\r\n );\r\n\r\n return ret;\r\n }\r\n\r\n /**\r\n * runs the given function between idleQueue-locking\r\n */\r\n lockedRun<T>(fn: (...args: any[]) => T): T extends Promise<any> ? T : Promise<T> {\r\n return this.idleQueue.wrapCall(fn) as any;\r\n }\r\n\r\n requestIdlePromise() {\r\n return this.idleQueue.requestIdlePromise();\r\n }\r\n\r\n /**\r\n * Export database to a JSON friendly format.\r\n */\r\n exportJSON(_collections?: string[]): Promise<RxDumpDatabase<Collections>>;\r\n exportJSON(_collections?: string[]): Promise<RxDumpDatabaseAny<Collections>>;\r\n exportJSON(_collections?: string[]): Promise<any> {\r\n throw pluginMissing('json-dump');\r\n }\r\n\r\n addState<T = any>(_name?: string): Promise<RxState<T, Reactivity>> {\r\n throw pluginMissing('state');\r\n }\r\n\r\n /**\r\n * Import the parsed JSON export into the collection.\r\n * @param _exportedJSON The previously exported data from the `<db>.exportJSON()` method.\r\n * @note When an interface is loaded in this collection all base properties of the type are typed as `any`\r\n * since data could be encrypted.\r\n */\r\n importJSON(_exportedJSON: RxDumpDatabaseAny<Collections>): Promise<void> {\r\n throw pluginMissing('json-dump');\r\n }\r\n\r\n backup(_options: BackupOptions): RxBackupState {\r\n throw pluginMissing('backup');\r\n }\r\n\r\n public leaderElector(): LeaderElector {\r\n throw pluginMissing('leader-election');\r\n }\r\n\r\n public isLeader(): boolean {\r\n throw pluginMissing('leader-election');\r\n }\r\n /**\r\n * returns a promise which resolves when the instance becomes leader\r\n */\r\n public waitForLeadership(): Promise<boolean> {\r\n throw pluginMissing('leader-election');\r\n }\r\n\r\n public migrationStates(): Observable<RxMigrationState[]> {\r\n throw pluginMissing('migration-schema');\r\n }\r\n\r\n /**\r\n * closes the database-instance and all collections\r\n */\r\n public close(): Promise<boolean> {\r\n if (this.closePromise) {\r\n return this.closePromise;\r\n }\r\n\r\n const { promise, resolve, reject } = createPromiseWithResolvers<boolean>();\r\n const resolveClosePromise = (result: boolean) => {\r\n if (this.onClosed) {\r\n this.onClosed();\r\n }\r\n this.closed = true;\r\n resolve(result);\r\n };\r\n this.closePromise = promise;\r\n\r\n (async () => {\r\n await runAsyncPluginHooks('preCloseRxDatabase', this);\r\n /**\r\n * Complete the event stream\r\n * to stop all subscribers who forgot to unsubscribe.\r\n */\r\n this.eventBulks$.complete();\r\n this.collectionsSubject$.complete();\r\n\r\n DB_COUNT--;\r\n this._subs.map(sub => sub.unsubscribe());\r\n\r\n /**\r\n * closing the pseudo instance will throw\r\n * because stuff is missing\r\n * TODO we should not need the pseudo instance on runtime.\r\n * we should generate the property list on build time.\r\n */\r\n if (this.name === 'pseudoInstance') {\r\n resolveClosePromise(false);\r\n return;\r\n }\r\n\r\n /**\r\n * First wait until the database is idle\r\n */\r\n await this.requestIdlePromise();\r\n\r\n let closingError: Error | null = null;\r\n try {\r\n await Promise.all(this.onClose.map(fn => fn()));\r\n } catch (err: unknown) {\r\n closingError = err as Error;\r\n }\r\n\r\n // close all collections\r\n await Promise.all(\r\n Object.keys(this.collections as any)\r\n .map(key => (this.collections as any)[key])\r\n .map(col => col.close())\r\n );\r\n\r\n // close internal storage instances\r\n await this.internalStore.close();\r\n\r\n if (closingError) {\r\n throw closingError;\r\n }\r\n resolveClosePromise(true);\r\n })().catch((err) => {\r\n /**\r\n * If an error occurs during closing,\r\n * we still have to mark the database as closed\r\n * and clean up the instance tracking so that\r\n * a new database with the same name can be created.\r\n */\r\n if (this.onClosed) {\r\n this.onClosed();\r\n }\r\n this.closed = true;\r\n reject(err);\r\n });\r\n\r\n return promise;\r\n }\r\n\r\n /**\r\n * deletes the database and its stored data.\r\n * Returns the names of all removed collections.\r\n */\r\n async remove(): Promise<string[]> {\r\n /**\r\n * Collect all collection onRemove handlers before closing,\r\n * because close() will clear the collections and unsubscribe\r\n * all listeners, making it impossible to trigger onRemove afterwards.\r\n */\r\n const collections = Object.values(this.collections as any) as RxCollection[];\r\n await this.close();\r\n await Promise.all(\r\n collections.map(col => Promise.all(col.onRemove.map(fn => fn())))\r\n );\r\n return removeRxDatabase(this.name, this.storage, this.multiInstance, this.password);\r\n }\r\n\r\n get asRxDatabase(): RxDatabase<\r\n {},\r\n Internals,\r\n InstanceCreationOptions,\r\n Reactivity\r\n > {\r\n return this as any;\r\n }\r\n\r\n registerWebMCP(_options?: WebMCPOptions): { error$: Subject<Error>; log$: Subject<WebMCPLogEvent>; } {\r\n throw pluginMissing('webmcp');\r\n }\r\n}\r\n\r\n/**\r\n * checks if an instance with same name and storage already exists\r\n * @throws {RxError} if used\r\n */\r\nfunction throwIfDatabaseNameUsed(\r\n name: string,\r\n storage: RxStorage<any, any>\r\n) {\r\n if (USED_DATABASE_NAMES.has(getDatabaseNameKey(name, storage))) {\r\n throw newRxError('DB8', {\r\n name,\r\n storage: storage.name,\r\n link: 'https://rxdb.info/rx-database.html#ignoreduplicate'\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * Polyfill for https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/withResolvers\r\n */\r\nfunction createPromiseWithResolvers<T>() {\r\n let resolve!: (value: T | PromiseLike<T>) => void;\r\n let reject!: (reason?: any) => void;\r\n const promise = new Promise<T>((res, rej) => {\r\n resolve = res;\r\n reject = rej;\r\n });\r\n return { promise, resolve, reject };\r\n}\r\n\r\nfunction getDatabaseNameKey(\r\n name: string,\r\n storage: RxStorage<any, any>\r\n) {\r\n return storage.name + '|' + name;\r\n}\r\n\r\n/**\r\n * Creates the storage instances that are used internally in the database\r\n * to store schemas and other configuration stuff.\r\n */\r\nexport async function createRxDatabaseStorageInstance<Internals, InstanceCreationOptions>(\r\n databaseInstanceToken: string,\r\n storage: RxStorage<Internals, InstanceCreationOptions>,\r\n databaseName: string,\r\n options: InstanceCreationOptions,\r\n multiInstance: boolean,\r\n password?: string\r\n): Promise<RxStorageInstance<InternalStoreDocType, Internals, InstanceCreationOptions>> {\r\n const internalStore = await storage.createStorageInstance<InternalStoreDocType>(\r\n {\r\n databaseInstanceToken,\r\n databaseName,\r\n collectionName: INTERNAL_STORAGE_NAME,\r\n schema: INTERNAL_STORE_SCHEMA,\r\n options,\r\n multiInstance,\r\n password,\r\n devMode: overwritable.isDevMode()\r\n }\r\n );\r\n return internalStore;\r\n}\r\n\r\nexport function createRxDatabase<\r\n Collections = { [key: string]: RxCollection; },\r\n Internals = any,\r\n InstanceCreationOptions = any,\r\n Reactivity = unknown\r\n>(\r\n {\r\n storage,\r\n instanceCreationOptions,\r\n name,\r\n password,\r\n multiInstance = true,\r\n eventReduce = true,\r\n ignoreDuplicate = false,\r\n options = {},\r\n cleanupPolicy,\r\n closeDuplicates = false,\r\n allowSlowCount = false,\r\n localDocuments = false,\r\n hashFunction = defaultHashSha256,\r\n reactivity\r\n }: RxDatabaseCreator<Internals, InstanceCreationOptions, Reactivity>\r\n): Promise<\r\n RxDatabase<Collections, Internals, InstanceCreationOptions, Reactivity>\r\n> {\r\n runPluginHooks('preCreateRxDatabase', {\r\n storage,\r\n instanceCreationOptions,\r\n name,\r\n password,\r\n multiInstance,\r\n eventReduce,\r\n ignoreDuplicate,\r\n options,\r\n localDocuments\r\n });\r\n\r\n const databaseNameKey = getDatabaseNameKey(name, storage);\r\n const databaseNameKeyUnclosedInstancesSet = DATABASE_UNCLOSED_INSTANCE_PROMISE_MAP.get(databaseNameKey) || new Set();\r\n const instancePromiseWithResolvers = createPromiseWithResolvers<RxDatabase<Collections, Internals, InstanceCreationOptions, Reactivity>>();\r\n const closeDuplicatesPromises = Array.from(databaseNameKeyUnclosedInstancesSet);\r\n const onInstanceClosed = () => {\r\n databaseNameKeyUnclosedInstancesSet.delete(instancePromiseWithResolvers.promise as any as Promise<RxDatabase>);\r\n USED_DATABASE_NAMES.delete(databaseNameKey);\r\n };\r\n\r\n databaseNameKeyUnclosedInstancesSet.add(instancePromiseWithResolvers.promise as any as Promise<RxDatabase>);\r\n DATABASE_UNCLOSED_INSTANCE_PROMISE_MAP.set(databaseNameKey, databaseNameKeyUnclosedInstancesSet);\r\n\r\n (async () => {\r\n if (closeDuplicates) {\r\n await Promise.all(\r\n closeDuplicatesPromises.map((unclosedInstancePromise) =>\r\n unclosedInstancePromise\r\n .catch(() => null)\r\n .then((instance) => instance && instance.close())\r\n )\r\n );\r\n }\r\n\r\n if (ignoreDuplicate) {\r\n if (!overwritable.isDevMode()) {\r\n throw newRxError('DB9', {\r\n database: name\r\n });\r\n }\r\n } else {\r\n // check if combination already used\r\n throwIfDatabaseNameUsed(name, storage);\r\n }\r\n\r\n USED_DATABASE_NAMES.add(databaseNameKey);\r\n\r\n const databaseInstanceToken = randomToken(10);\r\n const storageInstance = await createRxDatabaseStorageInstance<\r\n Internals,\r\n InstanceCreationOptions\r\n >(\r\n databaseInstanceToken,\r\n storage,\r\n name,\r\n instanceCreationOptions as any,\r\n multiInstance,\r\n password\r\n );\r\n const rxDatabase = new RxDatabaseBase(\r\n name,\r\n databaseInstanceToken,\r\n storage,\r\n instanceCreationOptions,\r\n password,\r\n multiInstance,\r\n eventReduce,\r\n options,\r\n storageInstance,\r\n hashFunction,\r\n cleanupPolicy,\r\n allowSlowCount,\r\n reactivity,\r\n onInstanceClosed\r\n ) as RxDatabase<Collections>;\r\n\r\n await runAsyncPluginHooks('createRxDatabase', {\r\n database: rxDatabase,\r\n creator: {\r\n storage,\r\n instanceCreationOptions,\r\n name,\r\n password,\r\n multiInstance,\r\n eventReduce,\r\n ignoreDuplicate,\r\n options,\r\n localDocuments\r\n }\r\n });\r\n\r\n return rxDatabase;\r\n })()\r\n .then((rxDatabase) => {\r\n instancePromiseWithResolvers.resolve(rxDatabase);\r\n })\r\n .catch((err) => {\r\n instancePromiseWithResolvers.reject(err);\r\n onInstanceClosed();\r\n });\r\n\r\n return instancePromiseWithResolvers.promise;\r\n}\r\n\r\n/**\r\n * Removes the database and all its known data\r\n * with all known collections and all internal meta data.\r\n *\r\n * Returns the names of the removed collections.\r\n */\r\nexport async function removeRxDatabase(\r\n databaseName: string,\r\n storage: RxStorage<any, any>,\r\n multiInstance: boolean = true,\r\n password?: string\r\n): Promise<string[]> {\r\n const databaseInstanceToken = randomToken(10);\r\n const dbInternalsStorageInstance = await createRxDatabaseStorageInstance(\r\n databaseInstanceToken,\r\n storage,\r\n databaseName,\r\n {},\r\n multiInstance,\r\n password\r\n );\r\n const collectionDocs = await getAllCollectionDocuments(dbInternalsStorageInstance);\r\n const collectionNames = new Set<string>();\r\n collectionDocs.forEach(doc => collectionNames.add(doc.data.name));\r\n const removedCollectionNames: string[] = Array.from(collectionNames);\r\n\r\n await Promise.all(\r\n removedCollectionNames.map(collectionName => removeCollectionStorages(\r\n storage,\r\n dbInternalsStorageInstance,\r\n databaseInstanceToken,\r\n databaseName,\r\n collectionName,\r\n multiInstance,\r\n password\r\n ))\r\n );\r\n\r\n await runAsyncPluginHooks('postRemoveRxDatabase', {\r\n databaseName,\r\n storage\r\n });\r\n\r\n await dbInternalsStorageInstance.remove();\r\n return removedCollectionNames;\r\n}\r\n\r\nexport function isRxDatabase(obj: any) {\r\n return obj instanceof RxDatabaseBase;\r\n}\r\n\r\nexport function dbCount(): number {\r\n return DB_COUNT;\r\n}\r\n\r\n\r\n/**\r\n * Returns true if the given RxDatabase was the first\r\n * instance that was created on the storage with this name.\r\n *\r\n * Can be used for some optimizations because on the first instantiation,\r\n * we can assume that no data was written before.\r\n */\r\nexport async function isRxDatabaseFirstTimeInstantiated(\r\n database: RxDatabase\r\n): Promise<boolean> {\r\n const tokenDoc = await database.storageTokenDocument;\r\n return tokenDoc.data.instanceToken === database.token;\r\n}\r\n\r\n\r\n/**\r\n * For better performance some tasks run async\r\n * and are awaited later.\r\n * But we still have to ensure that there have been no errors\r\n * on database creation.\r\n */\r\nexport async function ensureNoStartupErrors(\r\n rxDatabase: RxDatabaseBase<any, any, any, any>\r\n) {\r\n await rxDatabase.storageToken;\r\n if (rxDatabase.startupErrors[0]) {\r\n throw rxDatabase.startupErrors[0];\r\n }\r\n}\r\n"],"mappings":"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","ignoreList":[]}
@@ -1,5 +1,5 @@
1
1
  import { distinctUntilChanged, filter, map, shareReplay, startWith } from 'rxjs/operators';
2
- import { clone, trimDots, pluginMissing, flatClone, PROMISE_RESOLVE_NULL, RXJS_SHARE_REPLAY_DEFAULTS, getProperty, getFromMapOrCreate, ensureNotFalsy } from "./plugins/utils/index.js";
2
+ import { clone, trimDots, pluginMissing, flatClone, deepEqual, PROMISE_RESOLVE_NULL, RXJS_SHARE_REPLAY_DEFAULTS, getProperty, getFromMapOrCreate, ensureNotFalsy } from "./plugins/utils/index.js";
3
3
  import { newRxError } from "./rx-error.js";
4
4
  import { runPluginHooks } from "./hooks.js";
5
5
  import { getDocumentDataOfRxChangeEvent } from "./rx-change-event.js";
@@ -34,7 +34,7 @@ export var basePrototype = {
34
34
  if (!_this.isInstanceOfRxDocument) {
35
35
  return undefined;
36
36
  }
37
- return _this.$.pipe(map(d => d._data._deleted));
37
+ return _this.$.pipe(map(d => d._data._deleted), distinctUntilChanged());
38
38
  },
39
39
  get deleted$$() {
40
40
  var _this = this;
@@ -92,7 +92,14 @@ export var basePrototype = {
92
92
  });
93
93
  }
94
94
  }
95
- return this.$.pipe(map(data => getProperty(data, path)), distinctUntilChanged());
95
+ return this.$.pipe(map(data => getProperty(data, path)), distinctUntilChanged((prev, curr) => {
96
+ /**
97
+ * Use deepEqual for non-primitive values (objects/arrays)
98
+ * because the default === comparison always fails across
99
+ * document revisions since each revision creates new object references.
100
+ */
101
+ return deepEqual(prev, curr);
102
+ }));
96
103
  },
97
104
  get$$(path) {
98
105
  var obs = this.get$(path);
@@ -192,7 +199,7 @@ export var basePrototype = {
192
199
  // used by some plugins that wrap the method
193
200
  _context) {
194
201
  var oldData = this._data;
195
- var newData = await modifierFromPublicToInternal(mutationFunction)(oldData);
202
+ var newData = await modifierFromPublicToInternal(mutationFunction)(clone(oldData));
196
203
  return this._saveData(newData, oldData);
197
204
  },
198
205
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"rx-document.js","names":["distinctUntilChanged","filter","map","shareReplay","startWith","clone","trimDots","pluginMissing","flatClone","PROMISE_RESOLVE_NULL","RXJS_SHARE_REPLAY_DEFAULTS","getProperty","getFromMapOrCreate","ensureNotFalsy","newRxError","runPluginHooks","getDocumentDataOfRxChangeEvent","overwritable","getSchemaByObjectPath","getWrittenDocumentsFromBulkWriteResponse","throwIfIsStorageWriteError","modifierFromPublicToInternal","basePrototype","primaryPath","_this","isInstanceOfRxDocument","undefined","collection","schema","primary","_data","revision","_rev","deleted$","$","pipe","d","_deleted","deleted$$","reactivity","database","getReactivityFactory","fromObservable","getLatest","deleted","latestDocData","_docCache","getLatestDocumentData","getCachedRxDocument","id","eventBulks$","bulk","isLocal","events","find","ev","documentId","event","changeEvent","prev","curr","docData","$$","get$","path","isDevMode","includes","finalFields","schemaObj","jsonSchema","data","get$$","obs","get","populate","value","ref","refCollection","collections","type","findByIds","exec","then","res","valuesIterator","values","Array","from","findOne","objPath","getDocumentProperty","toJSON","withMetaFields","_attachments","_meta","deepFreezeWhenDevMode","toMutableJSON","update","_updateObj","incrementalUpdate","updateCRDT","putAttachment","putAttachmentBase64","getAttachment","allAttachments","allAttachments$","modify","mutationFunction","_context","oldData","newData","_saveData","incrementalModify","incrementalWriteQueue","addWrite","result","patch","Object","entries","forEach","k","v","incrementalPatch","document","beforeDocumentUpdateWrite","writeRows","previous","writeResult","storageInstance","bulkWrite","isError","error","_runHooks","remove","Promise","reject","removeResult","bulkRemove","length","success","incrementalRemove","newDoc","close","createRxDocumentConstructor","proto","constructor","RxDocumentConstructor","_propertyCache","prototype","createWithConstructor","jsonData","doc","isRxDocument","obj","assign","validateChange","Map","valueObj","isArray","proxy","Proxy","target","property","lastChar","charAt","endsWith","key","slice","plainValue"],"sources":["../../src/rx-document.ts"],"sourcesContent":["import {\r\n Observable\r\n} from 'rxjs';\r\nimport {\r\n distinctUntilChanged,\r\n filter,\r\n map,\r\n shareReplay,\r\n startWith\r\n} from 'rxjs/operators';\r\nimport {\r\n clone,\r\n trimDots,\r\n pluginMissing,\r\n flatClone,\r\n PROMISE_RESOLVE_NULL,\r\n RXJS_SHARE_REPLAY_DEFAULTS,\r\n getProperty,\r\n getFromMapOrCreate,\r\n ensureNotFalsy\r\n} from './plugins/utils/index.ts';\r\nimport {\r\n newRxError\r\n} from './rx-error.ts';\r\nimport {\r\n runPluginHooks\r\n} from './hooks.ts';\r\n\r\nimport type {\r\n RxDocument,\r\n RxCollection,\r\n RxDocumentData,\r\n RxDocumentWriteData,\r\n UpdateQuery,\r\n CRDTEntry,\r\n ModifyFunction\r\n} from './types/index.d.ts';\r\nimport { getDocumentDataOfRxChangeEvent } from './rx-change-event.ts';\r\nimport { overwritable } from './overwritable.ts';\r\nimport { getSchemaByObjectPath } from './rx-schema-helper.ts';\r\nimport { getWrittenDocumentsFromBulkWriteResponse, throwIfIsStorageWriteError } from './rx-storage-helper.ts';\r\nimport { modifierFromPublicToInternal } from './incremental-write.ts';\r\n\r\nexport const basePrototype = {\r\n get primaryPath() {\r\n const _this: RxDocument = this as any;\r\n if (!_this.isInstanceOfRxDocument) {\r\n return undefined;\r\n }\r\n return _this.collection.schema.primaryPath;\r\n },\r\n get primary() {\r\n const _this: RxDocument = this as any;\r\n if (!_this.isInstanceOfRxDocument) {\r\n return undefined;\r\n }\r\n return (_this._data as any)[_this.primaryPath];\r\n },\r\n get revision() {\r\n const _this: RxDocument = this as any;\r\n if (!_this.isInstanceOfRxDocument) {\r\n return undefined;\r\n }\r\n return _this._data._rev;\r\n },\r\n get deleted$() {\r\n const _this: RxDocument<any> = this as any;\r\n if (!_this.isInstanceOfRxDocument) {\r\n return undefined;\r\n }\r\n return _this.$.pipe(\r\n map((d: any) => d._data._deleted)\r\n );\r\n },\r\n get deleted$$() {\r\n const _this: RxDocument = this as any;\r\n const reactivity = _this.collection.database.getReactivityFactory();\r\n return reactivity.fromObservable(\r\n _this.deleted$,\r\n _this.getLatest().deleted,\r\n _this.collection.database\r\n );\r\n },\r\n get deleted() {\r\n const _this: RxDocument = this as any;\r\n if (!_this.isInstanceOfRxDocument) {\r\n return undefined;\r\n }\r\n return _this._data._deleted;\r\n },\r\n\r\n getLatest(this: RxDocument): RxDocument {\r\n const latestDocData = this.collection._docCache.getLatestDocumentData(this.primary);\r\n return this.collection._docCache.getCachedRxDocument(latestDocData);\r\n },\r\n\r\n /**\r\n * returns the observable which emits the plain-data of this document\r\n */\r\n get $(): Observable<RxDocumentData<any>> {\r\n const _this: RxDocument<{}, {}, {}> = this as any;\r\n const id = this.primary;\r\n\r\n return _this.collection.eventBulks$.pipe(\r\n filter((bulk: any) => !bulk.isLocal),\r\n map((bulk: any) => bulk.events.find((ev: any) => ev.documentId === id)),\r\n filter((event: any) => !!event),\r\n map((changeEvent: any) => getDocumentDataOfRxChangeEvent(ensureNotFalsy(changeEvent))),\r\n startWith(_this.collection._docCache.getLatestDocumentData(id)),\r\n distinctUntilChanged((prev: RxDocumentData<any>, curr: RxDocumentData<any>) => prev._rev === curr._rev),\r\n map((docData: RxDocumentData<any>) => (this as RxDocument<any>).collection._docCache.getCachedRxDocument(docData)),\r\n shareReplay(RXJS_SHARE_REPLAY_DEFAULTS)\r\n );\r\n },\r\n get $$(): any {\r\n const _this: RxDocument = this as any;\r\n const reactivity = _this.collection.database.getReactivityFactory();\r\n return reactivity.fromObservable(\r\n _this.$,\r\n _this.getLatest()._data,\r\n _this.collection.database\r\n );\r\n },\r\n\r\n /**\r\n * returns observable of the value of the given path\r\n */\r\n get$(this: RxDocument, path: string): Observable<any> {\r\n if (overwritable.isDevMode()) {\r\n if (path.includes('.item.')) {\r\n throw newRxError('DOC1', {\r\n path\r\n });\r\n }\r\n\r\n if (path === this.primaryPath) {\r\n throw newRxError('DOC2');\r\n }\r\n\r\n // final fields cannot be modified and so also not observed\r\n if (this.collection.schema.finalFields.includes(path)) {\r\n throw newRxError('DOC3', {\r\n path\r\n });\r\n }\r\n\r\n const schemaObj = getSchemaByObjectPath(\r\n this.collection.schema.jsonSchema,\r\n path\r\n );\r\n\r\n if (!schemaObj) {\r\n throw newRxError('DOC4', {\r\n path\r\n });\r\n }\r\n }\r\n\r\n return this.$\r\n .pipe(\r\n map((data: any) => getProperty(data, path)),\r\n distinctUntilChanged()\r\n );\r\n },\r\n get$$(this: RxDocument, path: string) {\r\n const obs = this.get$(path);\r\n const reactivity = this.collection.database.getReactivityFactory();\r\n return reactivity.fromObservable(\r\n obs,\r\n this.getLatest().get(path),\r\n this.collection.database\r\n );\r\n },\r\n\r\n /**\r\n * populate the given path\r\n */\r\n populate(this: RxDocument, path: string): Promise<RxDocument | null> {\r\n const schemaObj = getSchemaByObjectPath(\r\n this.collection.schema.jsonSchema,\r\n path\r\n );\r\n const value = this.get(path);\r\n if (!value) {\r\n return PROMISE_RESOLVE_NULL;\r\n }\r\n if (!schemaObj) {\r\n throw newRxError('DOC5', {\r\n path\r\n });\r\n }\r\n if (!schemaObj.ref) {\r\n throw newRxError('DOC6', {\r\n path,\r\n schemaObj\r\n });\r\n }\r\n\r\n const refCollection: RxCollection = this.collection.database.collections[schemaObj.ref];\r\n if (!refCollection) {\r\n throw newRxError('DOC7', {\r\n ref: schemaObj.ref,\r\n path,\r\n schemaObj\r\n });\r\n }\r\n\r\n if (schemaObj.type === 'array') {\r\n return refCollection.findByIds(value).exec().then(res => {\r\n const valuesIterator = res.values();\r\n return Array.from(valuesIterator) as any;\r\n });\r\n } else {\r\n return refCollection.findOne(value).exec();\r\n }\r\n },\r\n /**\r\n * get data by objectPath\r\n * @hotPath Performance here is really important,\r\n * run some tests before changing anything.\r\n */\r\n get(this: RxDocument, objPath: string): any | null {\r\n return getDocumentProperty(this, objPath);\r\n },\r\n\r\n toJSON(this: RxDocument, withMetaFields = false) {\r\n if (!withMetaFields) {\r\n const data = flatClone(this._data);\r\n delete (data as any)._rev;\r\n delete (data as any)._attachments;\r\n delete (data as any)._deleted;\r\n delete (data as any)._meta;\r\n return overwritable.deepFreezeWhenDevMode(data);\r\n } else {\r\n return overwritable.deepFreezeWhenDevMode(this._data);\r\n }\r\n },\r\n toMutableJSON(this: RxDocument, withMetaFields = false) {\r\n return clone(this.toJSON(withMetaFields as any));\r\n },\r\n\r\n /**\r\n * updates document\r\n * @overwritten by plugin (optional)\r\n * @param updateObj mongodb-like syntax\r\n */\r\n update(_updateObj: UpdateQuery<any>) {\r\n throw pluginMissing('update');\r\n },\r\n incrementalUpdate(_updateObj: UpdateQuery<any>) {\r\n throw pluginMissing('update');\r\n },\r\n updateCRDT(_updateObj: CRDTEntry<any> | CRDTEntry<any>[]) {\r\n throw pluginMissing('crdt');\r\n },\r\n putAttachment() {\r\n throw pluginMissing('attachments');\r\n },\r\n putAttachmentBase64() {\r\n throw pluginMissing('attachments');\r\n },\r\n getAttachment() {\r\n throw pluginMissing('attachments');\r\n },\r\n allAttachments() {\r\n throw pluginMissing('attachments');\r\n },\r\n get allAttachments$() {\r\n throw pluginMissing('attachments');\r\n },\r\n\r\n async modify<RxDocType>(\r\n this: RxDocument<RxDocType>,\r\n mutationFunction: ModifyFunction<RxDocType>,\r\n // used by some plugins that wrap the method\r\n _context?: string\r\n ): Promise<RxDocument> {\r\n const oldData = this._data;\r\n const newData: RxDocumentData<RxDocType> = await modifierFromPublicToInternal<RxDocType>(mutationFunction)(oldData) as any;\r\n return this._saveData(newData, oldData) as any;\r\n },\r\n\r\n /**\r\n * runs an incremental update over the document\r\n * @param function that takes the document-data and returns a new data-object\r\n */\r\n incrementalModify(\r\n this: RxDocument,\r\n mutationFunction: ModifyFunction<any>,\r\n // used by some plugins that wrap the method\r\n _context?: string\r\n ): Promise<RxDocument> {\r\n return this.collection.incrementalWriteQueue.addWrite(\r\n this._data,\r\n modifierFromPublicToInternal(mutationFunction)\r\n ).then(result => this.collection._docCache.getCachedRxDocument(result));\r\n },\r\n\r\n patch<RxDocType>(\r\n this: RxDocument<RxDocType>,\r\n patch: Partial<RxDocType>\r\n ) {\r\n const oldData = this._data;\r\n const newData = clone(oldData);\r\n Object\r\n .entries(patch)\r\n .forEach(([k, v]) => {\r\n (newData as any)[k] = v;\r\n });\r\n return this._saveData(newData, oldData);\r\n },\r\n\r\n /**\r\n * patches the given properties\r\n */\r\n incrementalPatch<RxDocumentType = any>(\r\n this: RxDocument<RxDocumentType>,\r\n patch: Partial<RxDocumentType>\r\n ): Promise<RxDocument<RxDocumentType>> {\r\n return this.incrementalModify((docData) => {\r\n Object\r\n .entries(patch)\r\n .forEach(([k, v]) => {\r\n (docData as any)[k] = v;\r\n });\r\n return docData;\r\n });\r\n },\r\n\r\n /**\r\n * saves the new document-data\r\n * and handles the events\r\n */\r\n async _saveData<RxDocType>(\r\n this: RxDocument<RxDocType>,\r\n newData: RxDocumentWriteData<RxDocType>,\r\n oldData: RxDocumentData<RxDocType>\r\n ): Promise<RxDocument<RxDocType>> {\r\n newData = flatClone(newData);\r\n\r\n // deleted documents cannot be changed\r\n if (this._data._deleted) {\r\n throw newRxError('DOC11', {\r\n id: this.primary,\r\n document: this\r\n });\r\n }\r\n await beforeDocumentUpdateWrite(this.collection, newData, oldData);\r\n const writeRows = [{\r\n previous: oldData,\r\n document: newData\r\n }];\r\n const writeResult = await this.collection.storageInstance.bulkWrite(writeRows, 'rx-document-save-data');\r\n\r\n const isError = writeResult.error[0];\r\n throwIfIsStorageWriteError(this.collection, this.primary, newData, isError);\r\n\r\n await this.collection._runHooks('post', 'save', newData, this);\r\n return this.collection._docCache.getCachedRxDocument(\r\n getWrittenDocumentsFromBulkWriteResponse(\r\n this.collection.schema.primaryPath,\r\n writeRows,\r\n writeResult\r\n )[0]\r\n );\r\n },\r\n\r\n /**\r\n * Remove the document.\r\n * Notice that there is no hard delete,\r\n * instead deleted documents get flagged with _deleted=true.\r\n */\r\n async remove(this: RxDocument): Promise<RxDocument> {\r\n if (this.deleted) {\r\n return Promise.reject(newRxError('DOC13', {\r\n document: this,\r\n id: this.primary\r\n }));\r\n }\r\n\r\n const removeResult = await this.collection.bulkRemove([this]);\r\n if (removeResult.error.length > 0) {\r\n const error = removeResult.error[0];\r\n throwIfIsStorageWriteError(\r\n this.collection,\r\n this.primary,\r\n this._data,\r\n error\r\n );\r\n }\r\n return removeResult.success[0];\r\n },\r\n incrementalRemove(this: RxDocument): Promise<RxDocument> {\r\n return this.incrementalModify(async (docData) => {\r\n await this.collection._runHooks('pre', 'remove', docData, this);\r\n docData._deleted = true;\r\n return docData;\r\n }).then(async (newDoc) => {\r\n await this.collection._runHooks('post', 'remove', newDoc._data, newDoc);\r\n return newDoc;\r\n });\r\n },\r\n close() {\r\n throw newRxError('DOC14');\r\n }\r\n};\r\n\r\nexport function createRxDocumentConstructor(proto = basePrototype) {\r\n const constructor = function RxDocumentConstructor(\r\n this: RxDocument,\r\n collection: RxCollection,\r\n docData: RxDocumentData<any>\r\n ) {\r\n this.collection = collection;\r\n\r\n // assume that this is always equal to the doc-data in the database\r\n this._data = docData;\r\n\r\n /**\r\n * @performance\r\n * Lazy-initialize _propertyCache only when first needed\r\n * instead of creating a new Map for every RxDocument,\r\n * since many documents (e.g. from query results) may never\r\n * have their properties accessed via the cache.\r\n */\r\n this._propertyCache = undefined;\r\n\r\n /**\r\n * because of the prototype-merge,\r\n * we can not use the native instanceof operator\r\n */\r\n this.isInstanceOfRxDocument = true;\r\n };\r\n constructor.prototype = proto;\r\n return constructor;\r\n}\r\n\r\nexport function createWithConstructor<RxDocType>(\r\n constructor: any,\r\n collection: RxCollection<RxDocType>,\r\n jsonData: RxDocumentData<RxDocType>\r\n): RxDocument<RxDocType> | null {\r\n const doc = new constructor(collection, jsonData);\r\n runPluginHooks('createRxDocument', doc);\r\n return doc;\r\n}\r\n\r\nexport function isRxDocument(obj: any): boolean {\r\n return typeof obj === 'object' && obj !== null && 'isInstanceOfRxDocument' in obj;\r\n}\r\n\r\n\r\nexport function beforeDocumentUpdateWrite<RxDocType>(\r\n collection: RxCollection<RxDocType>,\r\n newData: RxDocumentWriteData<RxDocType>,\r\n oldData: RxDocumentData<RxDocType>\r\n): Promise<any> {\r\n /**\r\n * Meta values must always be merged\r\n * instead of overwritten.\r\n * This ensures that different plugins do not overwrite\r\n * each others meta properties.\r\n */\r\n newData._meta = Object.assign(\r\n {},\r\n oldData._meta,\r\n newData._meta\r\n );\r\n\r\n // ensure modifications are ok\r\n if (overwritable.isDevMode()) {\r\n collection.schema.validateChange(oldData, newData);\r\n }\r\n return collection._runHooks('pre', 'save', newData, oldData);\r\n}\r\n\r\n\r\n\r\n\r\nfunction getDocumentProperty(doc: RxDocument, objPath: string): any | null {\r\n /**\r\n * @performance Lazy-initialize _propertyCache on first access\r\n * to avoid creating a Map for documents that never use it.\r\n */\r\n if (!doc._propertyCache) {\r\n doc._propertyCache = new Map<string, any>();\r\n }\r\n return getFromMapOrCreate(\r\n doc._propertyCache,\r\n objPath,\r\n () => {\r\n const valueObj = getProperty(doc._data, objPath);\r\n\r\n // direct return if array or non-object\r\n if (\r\n typeof valueObj !== 'object' ||\r\n valueObj === null ||\r\n Array.isArray(valueObj)\r\n ) {\r\n return overwritable.deepFreezeWhenDevMode(valueObj);\r\n }\r\n const proxy = new Proxy(\r\n /**\r\n * In dev-mode, the _data is deep-frozen\r\n * so we have to flat clone here so that\r\n * the proxy can work.\r\n */\r\n flatClone(valueObj),\r\n {\r\n /**\r\n * @performance is really important here\r\n * because people access nested properties very often\r\n * and might not be aware that this is internally using a Proxy\r\n */\r\n get(target, property: any) {\r\n if (typeof property !== 'string') {\r\n return target[property];\r\n }\r\n\r\n\r\n const lastChar = property.charAt(property.length - 1);\r\n if (lastChar === '$') {\r\n if (property.endsWith('$$')) {\r\n const key = property.slice(0, -2);\r\n return doc.get$$(trimDots(objPath + '.' + key));\r\n } else {\r\n const key = property.slice(0, -1);\r\n return doc.get$(trimDots(objPath + '.' + key));\r\n }\r\n } else if (lastChar === '_') {\r\n const key = property.slice(0, -1);\r\n return doc.populate(trimDots(objPath + '.' + key));\r\n } else {\r\n\r\n /**\r\n * Performance shortcut\r\n * In most cases access to nested properties\r\n * will only access simple values which can be directly returned\r\n * without creating a new Proxy or utilizing the cache.\r\n */\r\n const plainValue = target[property];\r\n if (\r\n typeof plainValue === 'number' ||\r\n typeof plainValue === 'string' ||\r\n typeof plainValue === 'boolean'\r\n ) {\r\n return plainValue;\r\n }\r\n\r\n return getDocumentProperty(doc, trimDots(objPath + '.' + property));\r\n }\r\n }\r\n });\r\n return proxy;\r\n }\r\n );\r\n};\r\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"rx-document.js","names":["distinctUntilChanged","filter","map","shareReplay","startWith","clone","trimDots","pluginMissing","flatClone","deepEqual","PROMISE_RESOLVE_NULL","RXJS_SHARE_REPLAY_DEFAULTS","getProperty","getFromMapOrCreate","ensureNotFalsy","newRxError","runPluginHooks","getDocumentDataOfRxChangeEvent","overwritable","getSchemaByObjectPath","getWrittenDocumentsFromBulkWriteResponse","throwIfIsStorageWriteError","modifierFromPublicToInternal","basePrototype","primaryPath","_this","isInstanceOfRxDocument","undefined","collection","schema","primary","_data","revision","_rev","deleted$","$","pipe","d","_deleted","deleted$$","reactivity","database","getReactivityFactory","fromObservable","getLatest","deleted","latestDocData","_docCache","getLatestDocumentData","getCachedRxDocument","id","eventBulks$","bulk","isLocal","events","find","ev","documentId","event","changeEvent","prev","curr","docData","$$","get$","path","isDevMode","includes","finalFields","schemaObj","jsonSchema","data","get$$","obs","get","populate","value","ref","refCollection","collections","type","findByIds","exec","then","res","valuesIterator","values","Array","from","findOne","objPath","getDocumentProperty","toJSON","withMetaFields","_attachments","_meta","deepFreezeWhenDevMode","toMutableJSON","update","_updateObj","incrementalUpdate","updateCRDT","putAttachment","putAttachmentBase64","getAttachment","allAttachments","allAttachments$","modify","mutationFunction","_context","oldData","newData","_saveData","incrementalModify","incrementalWriteQueue","addWrite","result","patch","Object","entries","forEach","k","v","incrementalPatch","document","beforeDocumentUpdateWrite","writeRows","previous","writeResult","storageInstance","bulkWrite","isError","error","_runHooks","remove","Promise","reject","removeResult","bulkRemove","length","success","incrementalRemove","newDoc","close","createRxDocumentConstructor","proto","constructor","RxDocumentConstructor","_propertyCache","prototype","createWithConstructor","jsonData","doc","isRxDocument","obj","assign","validateChange","Map","valueObj","isArray","proxy","Proxy","target","property","lastChar","charAt","endsWith","key","slice","plainValue"],"sources":["../../src/rx-document.ts"],"sourcesContent":["import {\r\n Observable\r\n} from 'rxjs';\r\nimport {\r\n distinctUntilChanged,\r\n filter,\r\n map,\r\n shareReplay,\r\n startWith\r\n} from 'rxjs/operators';\r\nimport {\r\n clone,\r\n trimDots,\r\n pluginMissing,\r\n flatClone,\r\n deepEqual,\r\n PROMISE_RESOLVE_NULL,\r\n RXJS_SHARE_REPLAY_DEFAULTS,\r\n getProperty,\r\n getFromMapOrCreate,\r\n ensureNotFalsy\r\n} from './plugins/utils/index.ts';\r\nimport {\r\n newRxError\r\n} from './rx-error.ts';\r\nimport {\r\n runPluginHooks\r\n} from './hooks.ts';\r\n\r\nimport type {\r\n RxDocument,\r\n RxCollection,\r\n RxDocumentData,\r\n RxDocumentWriteData,\r\n UpdateQuery,\r\n CRDTEntry,\r\n ModifyFunction\r\n} from './types/index.d.ts';\r\nimport { getDocumentDataOfRxChangeEvent } from './rx-change-event.ts';\r\nimport { overwritable } from './overwritable.ts';\r\nimport { getSchemaByObjectPath } from './rx-schema-helper.ts';\r\nimport { getWrittenDocumentsFromBulkWriteResponse, throwIfIsStorageWriteError } from './rx-storage-helper.ts';\r\nimport { modifierFromPublicToInternal } from './incremental-write.ts';\r\n\r\nexport const basePrototype = {\r\n get primaryPath() {\r\n const _this: RxDocument = this as any;\r\n if (!_this.isInstanceOfRxDocument) {\r\n return undefined;\r\n }\r\n return _this.collection.schema.primaryPath;\r\n },\r\n get primary() {\r\n const _this: RxDocument = this as any;\r\n if (!_this.isInstanceOfRxDocument) {\r\n return undefined;\r\n }\r\n return (_this._data as any)[_this.primaryPath];\r\n },\r\n get revision() {\r\n const _this: RxDocument = this as any;\r\n if (!_this.isInstanceOfRxDocument) {\r\n return undefined;\r\n }\r\n return _this._data._rev;\r\n },\r\n get deleted$() {\r\n const _this: RxDocument<any> = this as any;\r\n if (!_this.isInstanceOfRxDocument) {\r\n return undefined;\r\n }\r\n return _this.$.pipe(\r\n map((d: any) => d._data._deleted),\r\n distinctUntilChanged()\r\n );\r\n },\r\n get deleted$$() {\r\n const _this: RxDocument = this as any;\r\n const reactivity = _this.collection.database.getReactivityFactory();\r\n return reactivity.fromObservable(\r\n _this.deleted$,\r\n _this.getLatest().deleted,\r\n _this.collection.database\r\n );\r\n },\r\n get deleted() {\r\n const _this: RxDocument = this as any;\r\n if (!_this.isInstanceOfRxDocument) {\r\n return undefined;\r\n }\r\n return _this._data._deleted;\r\n },\r\n\r\n getLatest(this: RxDocument): RxDocument {\r\n const latestDocData = this.collection._docCache.getLatestDocumentData(this.primary);\r\n return this.collection._docCache.getCachedRxDocument(latestDocData);\r\n },\r\n\r\n /**\r\n * returns the observable which emits the plain-data of this document\r\n */\r\n get $(): Observable<RxDocumentData<any>> {\r\n const _this: RxDocument<{}, {}, {}> = this as any;\r\n const id = this.primary;\r\n\r\n return _this.collection.eventBulks$.pipe(\r\n filter((bulk: any) => !bulk.isLocal),\r\n map((bulk: any) => bulk.events.find((ev: any) => ev.documentId === id)),\r\n filter((event: any) => !!event),\r\n map((changeEvent: any) => getDocumentDataOfRxChangeEvent(ensureNotFalsy(changeEvent))),\r\n startWith(_this.collection._docCache.getLatestDocumentData(id)),\r\n distinctUntilChanged((prev: RxDocumentData<any>, curr: RxDocumentData<any>) => prev._rev === curr._rev),\r\n map((docData: RxDocumentData<any>) => (this as RxDocument<any>).collection._docCache.getCachedRxDocument(docData)),\r\n shareReplay(RXJS_SHARE_REPLAY_DEFAULTS)\r\n );\r\n },\r\n get $$(): any {\r\n const _this: RxDocument = this as any;\r\n const reactivity = _this.collection.database.getReactivityFactory();\r\n return reactivity.fromObservable(\r\n _this.$,\r\n _this.getLatest()._data,\r\n _this.collection.database\r\n );\r\n },\r\n\r\n /**\r\n * returns observable of the value of the given path\r\n */\r\n get$(this: RxDocument, path: string): Observable<any> {\r\n if (overwritable.isDevMode()) {\r\n if (path.includes('.item.')) {\r\n throw newRxError('DOC1', {\r\n path\r\n });\r\n }\r\n\r\n if (path === this.primaryPath) {\r\n throw newRxError('DOC2');\r\n }\r\n\r\n // final fields cannot be modified and so also not observed\r\n if (this.collection.schema.finalFields.includes(path)) {\r\n throw newRxError('DOC3', {\r\n path\r\n });\r\n }\r\n\r\n const schemaObj = getSchemaByObjectPath(\r\n this.collection.schema.jsonSchema,\r\n path\r\n );\r\n\r\n if (!schemaObj) {\r\n throw newRxError('DOC4', {\r\n path\r\n });\r\n }\r\n }\r\n\r\n return this.$\r\n .pipe(\r\n map((data: any) => getProperty(data, path)),\r\n distinctUntilChanged((prev: any, curr: any) => {\r\n /**\r\n * Use deepEqual for non-primitive values (objects/arrays)\r\n * because the default === comparison always fails across\r\n * document revisions since each revision creates new object references.\r\n */\r\n return deepEqual(prev, curr);\r\n })\r\n );\r\n },\r\n get$$(this: RxDocument, path: string) {\r\n const obs = this.get$(path);\r\n const reactivity = this.collection.database.getReactivityFactory();\r\n return reactivity.fromObservable(\r\n obs,\r\n this.getLatest().get(path),\r\n this.collection.database\r\n );\r\n },\r\n\r\n /**\r\n * populate the given path\r\n */\r\n populate(this: RxDocument, path: string): Promise<RxDocument | null> {\r\n const schemaObj = getSchemaByObjectPath(\r\n this.collection.schema.jsonSchema,\r\n path\r\n );\r\n const value = this.get(path);\r\n if (!value) {\r\n return PROMISE_RESOLVE_NULL;\r\n }\r\n if (!schemaObj) {\r\n throw newRxError('DOC5', {\r\n path\r\n });\r\n }\r\n if (!schemaObj.ref) {\r\n throw newRxError('DOC6', {\r\n path,\r\n schemaObj\r\n });\r\n }\r\n\r\n const refCollection: RxCollection = this.collection.database.collections[schemaObj.ref];\r\n if (!refCollection) {\r\n throw newRxError('DOC7', {\r\n ref: schemaObj.ref,\r\n path,\r\n schemaObj\r\n });\r\n }\r\n\r\n if (schemaObj.type === 'array') {\r\n return refCollection.findByIds(value).exec().then(res => {\r\n const valuesIterator = res.values();\r\n return Array.from(valuesIterator) as any;\r\n });\r\n } else {\r\n return refCollection.findOne(value).exec();\r\n }\r\n },\r\n /**\r\n * get data by objectPath\r\n * @hotPath Performance here is really important,\r\n * run some tests before changing anything.\r\n */\r\n get(this: RxDocument, objPath: string): any | null {\r\n return getDocumentProperty(this, objPath);\r\n },\r\n\r\n toJSON(this: RxDocument, withMetaFields = false) {\r\n if (!withMetaFields) {\r\n const data = flatClone(this._data);\r\n delete (data as any)._rev;\r\n delete (data as any)._attachments;\r\n delete (data as any)._deleted;\r\n delete (data as any)._meta;\r\n return overwritable.deepFreezeWhenDevMode(data);\r\n } else {\r\n return overwritable.deepFreezeWhenDevMode(this._data);\r\n }\r\n },\r\n toMutableJSON(this: RxDocument, withMetaFields = false) {\r\n return clone(this.toJSON(withMetaFields as any));\r\n },\r\n\r\n /**\r\n * updates document\r\n * @overwritten by plugin (optional)\r\n * @param updateObj mongodb-like syntax\r\n */\r\n update(_updateObj: UpdateQuery<any>) {\r\n throw pluginMissing('update');\r\n },\r\n incrementalUpdate(_updateObj: UpdateQuery<any>) {\r\n throw pluginMissing('update');\r\n },\r\n updateCRDT(_updateObj: CRDTEntry<any> | CRDTEntry<any>[]) {\r\n throw pluginMissing('crdt');\r\n },\r\n putAttachment() {\r\n throw pluginMissing('attachments');\r\n },\r\n putAttachmentBase64() {\r\n throw pluginMissing('attachments');\r\n },\r\n getAttachment() {\r\n throw pluginMissing('attachments');\r\n },\r\n allAttachments() {\r\n throw pluginMissing('attachments');\r\n },\r\n get allAttachments$() {\r\n throw pluginMissing('attachments');\r\n },\r\n\r\n async modify<RxDocType>(\r\n this: RxDocument<RxDocType>,\r\n mutationFunction: ModifyFunction<RxDocType>,\r\n // used by some plugins that wrap the method\r\n _context?: string\r\n ): Promise<RxDocument> {\r\n const oldData = this._data;\r\n const newData: RxDocumentData<RxDocType> = await modifierFromPublicToInternal<RxDocType>(mutationFunction)(clone(oldData)) as any;\r\n return this._saveData(newData, oldData) as any;\r\n },\r\n\r\n /**\r\n * runs an incremental update over the document\r\n * @param function that takes the document-data and returns a new data-object\r\n */\r\n incrementalModify(\r\n this: RxDocument,\r\n mutationFunction: ModifyFunction<any>,\r\n // used by some plugins that wrap the method\r\n _context?: string\r\n ): Promise<RxDocument> {\r\n return this.collection.incrementalWriteQueue.addWrite(\r\n this._data,\r\n modifierFromPublicToInternal(mutationFunction)\r\n ).then(result => this.collection._docCache.getCachedRxDocument(result));\r\n },\r\n\r\n patch<RxDocType>(\r\n this: RxDocument<RxDocType>,\r\n patch: Partial<RxDocType>\r\n ) {\r\n const oldData = this._data;\r\n const newData = clone(oldData);\r\n Object\r\n .entries(patch)\r\n .forEach(([k, v]) => {\r\n (newData as any)[k] = v;\r\n });\r\n return this._saveData(newData, oldData);\r\n },\r\n\r\n /**\r\n * patches the given properties\r\n */\r\n incrementalPatch<RxDocumentType = any>(\r\n this: RxDocument<RxDocumentType>,\r\n patch: Partial<RxDocumentType>\r\n ): Promise<RxDocument<RxDocumentType>> {\r\n return this.incrementalModify((docData) => {\r\n Object\r\n .entries(patch)\r\n .forEach(([k, v]) => {\r\n (docData as any)[k] = v;\r\n });\r\n return docData;\r\n });\r\n },\r\n\r\n /**\r\n * saves the new document-data\r\n * and handles the events\r\n */\r\n async _saveData<RxDocType>(\r\n this: RxDocument<RxDocType>,\r\n newData: RxDocumentWriteData<RxDocType>,\r\n oldData: RxDocumentData<RxDocType>\r\n ): Promise<RxDocument<RxDocType>> {\r\n newData = flatClone(newData);\r\n\r\n // deleted documents cannot be changed\r\n if (this._data._deleted) {\r\n throw newRxError('DOC11', {\r\n id: this.primary,\r\n document: this\r\n });\r\n }\r\n await beforeDocumentUpdateWrite(this.collection, newData, oldData);\r\n const writeRows = [{\r\n previous: oldData,\r\n document: newData\r\n }];\r\n const writeResult = await this.collection.storageInstance.bulkWrite(writeRows, 'rx-document-save-data');\r\n\r\n const isError = writeResult.error[0];\r\n throwIfIsStorageWriteError(this.collection, this.primary, newData, isError);\r\n\r\n await this.collection._runHooks('post', 'save', newData, this);\r\n return this.collection._docCache.getCachedRxDocument(\r\n getWrittenDocumentsFromBulkWriteResponse(\r\n this.collection.schema.primaryPath,\r\n writeRows,\r\n writeResult\r\n )[0]\r\n );\r\n },\r\n\r\n /**\r\n * Remove the document.\r\n * Notice that there is no hard delete,\r\n * instead deleted documents get flagged with _deleted=true.\r\n */\r\n async remove(this: RxDocument): Promise<RxDocument> {\r\n if (this.deleted) {\r\n return Promise.reject(newRxError('DOC13', {\r\n document: this,\r\n id: this.primary\r\n }));\r\n }\r\n\r\n const removeResult = await this.collection.bulkRemove([this]);\r\n if (removeResult.error.length > 0) {\r\n const error = removeResult.error[0];\r\n throwIfIsStorageWriteError(\r\n this.collection,\r\n this.primary,\r\n this._data,\r\n error\r\n );\r\n }\r\n return removeResult.success[0];\r\n },\r\n incrementalRemove(this: RxDocument): Promise<RxDocument> {\r\n return this.incrementalModify(async (docData) => {\r\n await this.collection._runHooks('pre', 'remove', docData, this);\r\n docData._deleted = true;\r\n return docData;\r\n }).then(async (newDoc) => {\r\n await this.collection._runHooks('post', 'remove', newDoc._data, newDoc);\r\n return newDoc;\r\n });\r\n },\r\n close() {\r\n throw newRxError('DOC14');\r\n }\r\n};\r\n\r\nexport function createRxDocumentConstructor(proto = basePrototype) {\r\n const constructor = function RxDocumentConstructor(\r\n this: RxDocument,\r\n collection: RxCollection,\r\n docData: RxDocumentData<any>\r\n ) {\r\n this.collection = collection;\r\n\r\n // assume that this is always equal to the doc-data in the database\r\n this._data = docData;\r\n\r\n /**\r\n * @performance\r\n * Lazy-initialize _propertyCache only when first needed\r\n * instead of creating a new Map for every RxDocument,\r\n * since many documents (e.g. from query results) may never\r\n * have their properties accessed via the cache.\r\n */\r\n this._propertyCache = undefined;\r\n\r\n /**\r\n * because of the prototype-merge,\r\n * we can not use the native instanceof operator\r\n */\r\n this.isInstanceOfRxDocument = true;\r\n };\r\n constructor.prototype = proto;\r\n return constructor;\r\n}\r\n\r\nexport function createWithConstructor<RxDocType>(\r\n constructor: any,\r\n collection: RxCollection<RxDocType>,\r\n jsonData: RxDocumentData<RxDocType>\r\n): RxDocument<RxDocType> | null {\r\n const doc = new constructor(collection, jsonData);\r\n runPluginHooks('createRxDocument', doc);\r\n return doc;\r\n}\r\n\r\nexport function isRxDocument(obj: any): boolean {\r\n return typeof obj === 'object' && obj !== null && 'isInstanceOfRxDocument' in obj;\r\n}\r\n\r\n\r\nexport function beforeDocumentUpdateWrite<RxDocType>(\r\n collection: RxCollection<RxDocType>,\r\n newData: RxDocumentWriteData<RxDocType>,\r\n oldData: RxDocumentData<RxDocType>\r\n): Promise<any> {\r\n /**\r\n * Meta values must always be merged\r\n * instead of overwritten.\r\n * This ensures that different plugins do not overwrite\r\n * each others meta properties.\r\n */\r\n newData._meta = Object.assign(\r\n {},\r\n oldData._meta,\r\n newData._meta\r\n );\r\n\r\n // ensure modifications are ok\r\n if (overwritable.isDevMode()) {\r\n collection.schema.validateChange(oldData, newData);\r\n }\r\n return collection._runHooks('pre', 'save', newData, oldData);\r\n}\r\n\r\n\r\n\r\n\r\nfunction getDocumentProperty(doc: RxDocument, objPath: string): any | null {\r\n /**\r\n * @performance Lazy-initialize _propertyCache on first access\r\n * to avoid creating a Map for documents that never use it.\r\n */\r\n if (!doc._propertyCache) {\r\n doc._propertyCache = new Map<string, any>();\r\n }\r\n return getFromMapOrCreate(\r\n doc._propertyCache,\r\n objPath,\r\n () => {\r\n const valueObj = getProperty(doc._data, objPath);\r\n\r\n // direct return if array or non-object\r\n if (\r\n typeof valueObj !== 'object' ||\r\n valueObj === null ||\r\n Array.isArray(valueObj)\r\n ) {\r\n return overwritable.deepFreezeWhenDevMode(valueObj);\r\n }\r\n const proxy = new Proxy(\r\n /**\r\n * In dev-mode, the _data is deep-frozen\r\n * so we have to flat clone here so that\r\n * the proxy can work.\r\n */\r\n flatClone(valueObj),\r\n {\r\n /**\r\n * @performance is really important here\r\n * because people access nested properties very often\r\n * and might not be aware that this is internally using a Proxy\r\n */\r\n get(target, property: any) {\r\n if (typeof property !== 'string') {\r\n return target[property];\r\n }\r\n\r\n\r\n const lastChar = property.charAt(property.length - 1);\r\n if (lastChar === '$') {\r\n if (property.endsWith('$$')) {\r\n const key = property.slice(0, -2);\r\n return doc.get$$(trimDots(objPath + '.' + key));\r\n } else {\r\n const key = property.slice(0, -1);\r\n return doc.get$(trimDots(objPath + '.' + key));\r\n }\r\n } else if (lastChar === '_') {\r\n const key = property.slice(0, -1);\r\n return doc.populate(trimDots(objPath + '.' + key));\r\n } else {\r\n\r\n /**\r\n * Performance shortcut\r\n * In most cases access to nested properties\r\n * will only access simple values which can be directly returned\r\n * without creating a new Proxy or utilizing the cache.\r\n */\r\n const plainValue = target[property];\r\n if (\r\n typeof plainValue === 'number' ||\r\n typeof plainValue === 'string' ||\r\n typeof plainValue === 'boolean'\r\n ) {\r\n return plainValue;\r\n }\r\n\r\n return getDocumentProperty(doc, trimDots(objPath + '.' + property));\r\n }\r\n }\r\n });\r\n return proxy;\r\n }\r\n );\r\n};\r\n"],"mappings":"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","ignoreList":[]}
@@ -37,17 +37,10 @@ skipSort) {
37
37
  * For normalization, we have to normalize this
38
38
  * so our checks can perform properly.
39
39
  *
40
- *
41
- * TODO this must work recursive with nested queries that
42
- * contain multiple selectors via $and or $or etc.
40
+ * This works recursively for nested queries that
41
+ * contain multiple selectors via $and, $or, $nor or $not.
43
42
  */
44
- Object.entries(normalizedMangoQuery.selector).forEach(([field, matcher]) => {
45
- if (typeof matcher !== 'object' || matcher === null) {
46
- normalizedMangoQuery.selector[field] = {
47
- $eq: matcher
48
- };
49
- }
50
- });
43
+ normalizeQuerySelectorShorthands(normalizedMangoQuery.selector);
51
44
  }
52
45
 
53
46
  /**
@@ -117,8 +110,9 @@ skipSort) {
117
110
  schema.indexes.forEach(index => {
118
111
  var useIndex = isMaybeReadonlyArray(index) ? index : [index];
119
112
  var firstWrongIndex = useIndex.findIndex(indexField => !fieldsWithLogicalOperator.has(indexField));
120
- if (firstWrongIndex > 0 && firstWrongIndex > currentFieldsAmount) {
121
- currentFieldsAmount = firstWrongIndex;
113
+ var matchingFieldCount = firstWrongIndex === -1 ? useIndex.length : firstWrongIndex;
114
+ if (matchingFieldCount > 0 && matchingFieldCount > currentFieldsAmount) {
115
+ currentFieldsAmount = matchingFieldCount;
122
116
  currentBestIndexForSort = useIndex;
123
117
  }
124
118
  });
@@ -244,6 +238,35 @@ export async function runQueryUpdateFunction(rxQuery, fn) {
244
238
  }
245
239
  }
246
240
 
241
+ /**
242
+ * Normalizes selector shorthand values recursively.
243
+ * Converts `{field: value}` to `{field: {$eq: value}}`
244
+ * and recurses into $and, $or, $nor arrays and $not objects.
245
+ */
246
+ var SELECTOR_ARRAY_OPERATORS = new Set(['$and', '$or', '$nor']);
247
+ function normalizeQuerySelectorShorthands(selector) {
248
+ Object.entries(selector).forEach(([field, matcher]) => {
249
+ if (typeof matcher !== 'object' || matcher === null) {
250
+ selector[field] = {
251
+ $eq: matcher
252
+ };
253
+ } else if (SELECTOR_ARRAY_OPERATORS.has(field) && Array.isArray(matcher)) {
254
+ matcher.forEach(subSelector => normalizeQuerySelectorShorthands(subSelector));
255
+ } else if (field === '$not' && typeof matcher === 'object') {
256
+ normalizeQuerySelectorShorthands(matcher);
257
+ } else if (!field.startsWith('$') && typeof matcher === 'object') {
258
+ /**
259
+ * Recurse into field-level operator objects to normalize
260
+ * sub-selectors like $elemMatch which contain nested selectors.
261
+ */
262
+ var matcherObj = matcher;
263
+ if (matcherObj.$elemMatch && typeof matcherObj.$elemMatch === 'object') {
264
+ normalizeQuerySelectorShorthands(matcherObj.$elemMatch);
265
+ }
266
+ }
267
+ });
268
+ }
269
+
247
270
  /**
248
271
  * @returns a format of the query that can be used with the storage
249
272
  * when calling RxStorageInstance().query()