@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
@@ -4,8 +4,8 @@ import { getStartIndexStringFromLowerBound, getStartIndexStringFromUpperBound }
4
4
  import { getPrimaryFieldOfPrimaryKey } from "../../rx-schema-helper.js";
5
5
  import { categorizeBulkWriteRows } from "../../rx-storage-helper.js";
6
6
  import { deepEqual, ensureNotFalsy, now, PROMISE_RESOLVE_TRUE, PROMISE_RESOLVE_VOID, randomToken, requestIdlePromiseNoQueue } from "../../plugins/utils/index.js";
7
- import { boundGE, boundGT, boundLE, boundLT } from "./binary-search-bounds.js";
8
- import { attachmentMapKey, bulkInsertToState, compareDocsWithIndex, ensureNotRemoved, getMemoryCollectionKey, putWriteRowToState, removeDocFromState } from "./memory-helper.js";
7
+ import { boundGEByIndexString, boundGTByIndexString, boundLEByIndexString, boundLTByIndexString } from "./binary-search-bounds.js";
8
+ import { attachmentMapKey, bulkInsertToState, ensureNotRemoved, getMemoryCollectionKey, putWriteRowToState, removeDocFromState } from "./memory-helper.js";
9
9
  import { addIndexesToInternalsState, getMemoryIndexName } from "./memory-indexes.js";
10
10
  import { getQueryMatcher, getSortComparator } from "../../rx-query-helper.js";
11
11
  import { newRxError } from "../../rx-error.js";
@@ -92,15 +92,15 @@ export var RxStorageInstanceMemory = /*#__PURE__*/function () {
92
92
  return;
93
93
  }
94
94
  var internals = this.internals;
95
- var documentsById = this.internals.documents;
96
95
  var primaryPath = this.primaryPath;
97
96
  var categorized = this.internals.ensurePersistenceTask;
98
97
  this.internals.ensurePersistenceTask = undefined;
99
98
 
100
99
  /**
101
100
  * Do inserts/updates
101
+ * @performance Use cached byIndexArray instead of Object.values()
102
102
  */
103
- var stateByIndex = Object.values(this.internals.byIndex);
103
+ var stateByIndex = internals.byIndexArray;
104
104
 
105
105
  /**
106
106
  * @performance Use batch insert for bulk inserts to avoid
@@ -117,7 +117,14 @@ export var RxStorageInstanceMemory = /*#__PURE__*/function () {
117
117
  var writeRow = bulkUpdateDocs[i];
118
118
  var doc = writeRow.document;
119
119
  var docId = doc[primaryPath];
120
- putWriteRowToState(docId, internals, stateByIndex, doc, documentsById.get(docId));
120
+ /**
121
+ * @performance
122
+ * Pass writeRow.previous directly as the old document state
123
+ * instead of re-looking it up from the documents Map.
124
+ * This is safe because categorizeBulkWriteRows already verified
125
+ * that previous._rev matches the document in the Map (conflict check).
126
+ */
127
+ putWriteRowToState(docId, internals, stateByIndex, doc, writeRow.previous);
121
128
  }
122
129
 
123
130
  /**
@@ -151,11 +158,23 @@ export var RxStorageInstanceMemory = /*#__PURE__*/function () {
151
158
  if (documentsById.size === 0) {
152
159
  return Promise.resolve(ret);
153
160
  }
154
- for (var i = 0; i < docIds.length; ++i) {
155
- var docId = docIds[i];
156
- var docInDb = documentsById.get(docId);
157
- if (docInDb && (!docInDb._deleted || withDeleted)) {
158
- ret.push(docInDb);
161
+ /**
162
+ * @performance
163
+ * Split into two paths to avoid checking withDeleted on every iteration.
164
+ */
165
+ if (withDeleted) {
166
+ for (var i = 0; i < docIds.length; ++i) {
167
+ var docInDb = documentsById.get(docIds[i]);
168
+ if (docInDb) {
169
+ ret.push(docInDb);
170
+ }
171
+ }
172
+ } else {
173
+ for (var _i = 0; _i < docIds.length; ++_i) {
174
+ var _docInDb = documentsById.get(docIds[_i]);
175
+ if (_docInDb && !_docInDb._deleted) {
176
+ ret.push(_docInDb);
177
+ }
159
178
  }
160
179
  }
161
180
  return Promise.resolve(ret);
@@ -183,8 +202,13 @@ export var RxStorageInstanceMemory = /*#__PURE__*/function () {
183
202
  throw new Error('index does not exist ' + indexName);
184
203
  }
185
204
  var docsWithIndex = this.internals.byIndex[indexName].docsWithIndex;
186
- var indexOfLower = (queryPlan.inclusiveStart ? boundGE : boundGT)(docsWithIndex, [lowerBoundString], compareDocsWithIndex);
187
- var indexOfUpper = (queryPlan.inclusiveEnd ? boundLE : boundLT)(docsWithIndex, [upperBoundString], compareDocsWithIndex);
205
+
206
+ /**
207
+ * @performance Use string-specialized binary search to avoid
208
+ * temporary array allocations on every query.
209
+ */
210
+ var indexOfLower = queryPlan.inclusiveStart ? boundGEByIndexString(docsWithIndex, lowerBoundString) : boundGTByIndexString(docsWithIndex, lowerBoundString);
211
+ var indexOfUpper = queryPlan.inclusiveEnd ? boundLEByIndexString(docsWithIndex, upperBoundString) : boundLTByIndexString(docsWithIndex, upperBoundString);
188
212
  var rows = [];
189
213
 
190
214
  /**
@@ -243,35 +267,65 @@ export var RxStorageInstanceMemory = /*#__PURE__*/function () {
243
267
  * If the selector is satisfied by the index,
244
268
  * we can compute the count directly from the index range
245
269
  * without extracting document data into an array.
270
+ * Uses string-specialized binary search to avoid allocations.
246
271
  */
247
272
  if (queryPlan.selectorSatisfiedByIndex) {
248
- var queryPlanFields = queryPlan.index;
249
- var index = queryPlanFields;
250
- var lowerBound = queryPlan.startKeys;
251
- var lowerBoundString = getStartIndexStringFromLowerBound(this.schema, index, lowerBound);
252
- var upperBound = queryPlan.endKeys;
253
- var upperBoundString = getStartIndexStringFromUpperBound(this.schema, index, upperBound);
254
- var indexName = getMemoryIndexName(index);
255
- if (!this.internals.byIndex[indexName]) {
273
+ var _queryPlanFields = queryPlan.index;
274
+ var _index = _queryPlanFields;
275
+ var _lowerBound = queryPlan.startKeys;
276
+ var _lowerBoundString = getStartIndexStringFromLowerBound(this.schema, _index, _lowerBound);
277
+ var _upperBound = queryPlan.endKeys;
278
+ var _upperBoundString = getStartIndexStringFromUpperBound(this.schema, _index, _upperBound);
279
+ var _indexName = getMemoryIndexName(_index);
280
+ if (!this.internals.byIndex[_indexName]) {
256
281
  throw newRxError('SNH', {
257
282
  args: {
258
- indexName
283
+ indexName: _indexName
259
284
  }
260
285
  });
261
286
  }
262
- var docsWithIndex = this.internals.byIndex[indexName].docsWithIndex;
263
- var indexOfLower = (queryPlan.inclusiveStart ? boundGE : boundGT)(docsWithIndex, [lowerBoundString], compareDocsWithIndex);
264
- var indexOfUpper = (queryPlan.inclusiveEnd ? boundLE : boundLT)(docsWithIndex, [upperBoundString], compareDocsWithIndex);
265
- var _count = Math.max(0, indexOfUpper - indexOfLower + 1);
287
+ var _docsWithIndex = this.internals.byIndex[_indexName].docsWithIndex;
288
+ var _indexOfLower = queryPlan.inclusiveStart ? boundGEByIndexString(_docsWithIndex, _lowerBoundString) : boundGTByIndexString(_docsWithIndex, _lowerBoundString);
289
+ var _indexOfUpper = queryPlan.inclusiveEnd ? boundLEByIndexString(_docsWithIndex, _upperBoundString) : boundLTByIndexString(_docsWithIndex, _upperBoundString);
290
+ var _count = Math.max(0, _indexOfUpper - _indexOfLower + 1);
266
291
  return Promise.resolve({
267
292
  count: _count,
268
293
  mode: 'fast'
269
294
  });
270
295
  }
271
- return this.query(preparedQuery).then(result => ({
272
- count: result.documents.length,
296
+ var queryMatcher = getQueryMatcher(this.schema, preparedQuery.query);
297
+ var queryPlanFields = queryPlan.index;
298
+ var index = queryPlanFields;
299
+ var lowerBound = queryPlan.startKeys;
300
+ var lowerBoundString = getStartIndexStringFromLowerBound(this.schema, index, lowerBound);
301
+ var upperBound = queryPlan.endKeys;
302
+ var upperBoundString = getStartIndexStringFromUpperBound(this.schema, index, upperBound);
303
+ var indexName = getMemoryIndexName(index);
304
+ if (!this.internals.byIndex[indexName]) {
305
+ throw newRxError('SNH', {
306
+ args: {
307
+ indexName
308
+ }
309
+ });
310
+ }
311
+ var docsWithIndex = this.internals.byIndex[indexName].docsWithIndex;
312
+ var indexOfLower = queryPlan.inclusiveStart ? boundGEByIndexString(docsWithIndex, lowerBoundString) : boundGTByIndexString(docsWithIndex, lowerBoundString);
313
+ var indexOfUpper = queryPlan.inclusiveEnd ? boundLEByIndexString(docsWithIndex, upperBoundString) : boundLTByIndexString(docsWithIndex, upperBoundString);
314
+ var count = 0;
315
+ while (indexOfLower <= indexOfUpper) {
316
+ var currentRow = docsWithIndex[indexOfLower];
317
+ if (!currentRow) {
318
+ break;
319
+ }
320
+ if (queryMatcher(currentRow[1])) {
321
+ count++;
322
+ }
323
+ indexOfLower++;
324
+ }
325
+ return Promise.resolve({
326
+ count,
273
327
  mode: 'fast'
274
- }));
328
+ });
275
329
  };
276
330
  _proto.cleanup = function cleanup(minimumDeletedTime) {
277
331
  this.ensurePersistence();
@@ -280,7 +334,7 @@ export var RxStorageInstanceMemory = /*#__PURE__*/function () {
280
334
  var indexName = getMemoryIndexName(index);
281
335
  var docsWithIndex = this.internals.byIndex[indexName].docsWithIndex;
282
336
  var lowerBoundString = getStartIndexStringFromLowerBound(this.schema, index, [true, 0, '']);
283
- var indexOfLower = boundGT(docsWithIndex, [lowerBoundString], compareDocsWithIndex);
337
+ var indexOfLower = boundGTByIndexString(docsWithIndex, lowerBoundString);
284
338
  var done = false;
285
339
  while (!done) {
286
340
  var currentDoc = docsWithIndex[indexOfLower];
@@ -288,7 +342,12 @@ export var RxStorageInstanceMemory = /*#__PURE__*/function () {
288
342
  done = true;
289
343
  } else {
290
344
  removeDocFromState(this.primaryPath, this.schema, this.internals, currentDoc[1]);
291
- indexOfLower++;
345
+ /**
346
+ * Do NOT increment indexOfLower after removal.
347
+ * removeDocFromState() splices the element out of the array,
348
+ * so the next element shifts into the current position.
349
+ * Incrementing would skip it.
350
+ */
292
351
  }
293
352
  }
294
353
  return PROMISE_RESOLVE_TRUE;
@@ -341,6 +400,7 @@ export function createMemoryStorageInstance(storage, params, settings) {
341
400
  documents: new Map(),
342
401
  attachments: params.schema.attachments ? new Map() : undefined,
343
402
  byIndex: {},
403
+ byIndexArray: [],
344
404
  changes$: new Subject()
345
405
  };
346
406
  addIndexesToInternalsState(internals, params.schema);
@@ -1 +1 @@
1
- {"version":3,"file":"rx-storage-instance-memory.js","names":["Subject","getStartIndexStringFromLowerBound","getStartIndexStringFromUpperBound","getPrimaryFieldOfPrimaryKey","categorizeBulkWriteRows","deepEqual","ensureNotFalsy","now","PROMISE_RESOLVE_TRUE","PROMISE_RESOLVE_VOID","randomToken","requestIdlePromiseNoQueue","boundGE","boundGT","boundLE","boundLT","attachmentMapKey","bulkInsertToState","compareDocsWithIndex","ensureNotRemoved","getMemoryCollectionKey","putWriteRowToState","removeDocFromState","addIndexesToInternalsState","getMemoryIndexName","getQueryMatcher","getSortComparator","newRxError","OPEN_MEMORY_INSTANCES","Set","RxStorageInstanceMemory","storage","databaseName","collectionName","schema","internals","options","settings","devMode","closed","categorizedByWriteInput","WeakMap","add","primaryPath","primaryKey","_proto","prototype","bulkWrite","documentWrites","context","ensurePersistence","documentsById","documents","categorized","error","errors","awaitMe","Promise","resolve","set","ensurePersistenceTask","ensurePersistenceIdlePromise","then","undefined","eventBulk","events","length","lastState","newestRow","document","checkpoint","id","lwt","_meta","changes$","next","stateByIndex","Object","values","byIndex","bulkInsertDocs","bulkUpdateDocs","i","writeRow","doc","docId","get","attachments","attachmentsMap","attachmentsAdd","forEach","attachment","documentId","attachmentId","writeData","attachmentData","digest","attachmentsUpdate","attachmentsRemove","delete","findDocumentsById","docIds","withDeleted","ret","size","docInDb","_deleted","push","query","preparedQuery","queryPlan","skip","limit","Infinity","skipPlusLimit","queryMatcher","selectorSatisfiedByIndex","queryPlanFields","index","mustManuallyResort","sortSatisfiedByIndex","lowerBound","startKeys","lowerBoundString","upperBound","endKeys","upperBoundString","indexName","Error","docsWithIndex","indexOfLower","inclusiveStart","indexOfUpper","inclusiveEnd","rows","rangeLength","extractLength","Math","min","Array","done","currentRow","currentDoc","sortComparator","sort","slice","count","args","max","mode","result","cleanup","minimumDeletedTime","maxDeletionTime","getAttachmentData","key","data","changeStream","asObservable","remove","removed","collectionStates","version","close","refCount","createMemoryStorageInstance","params","collectionKey","Map","instance"],"sources":["../../../../src/plugins/storage-memory/rx-storage-instance-memory.ts"],"sourcesContent":["import {\r\n Observable,\r\n Subject\r\n} from 'rxjs';\r\nimport {\r\n getStartIndexStringFromLowerBound,\r\n getStartIndexStringFromUpperBound\r\n} from '../../custom-index.ts';\r\nimport { getPrimaryFieldOfPrimaryKey } from '../../rx-schema-helper.ts';\r\nimport {\r\n categorizeBulkWriteRows\r\n} from '../../rx-storage-helper.ts';\r\nimport type {\r\n BulkWriteRow,\r\n CategorizeBulkWriteRowsOutput,\r\n EventBulk,\r\n PreparedQuery,\r\n QueryMatcher,\r\n RxDocumentData,\r\n RxJsonSchema,\r\n RxStorageBulkWriteResponse,\r\n RxStorageChangeEvent,\r\n RxStorageCountResult,\r\n RxStorageDefaultCheckpoint,\r\n RxStorageInstance,\r\n RxStorageInstanceCreationParams,\r\n RxStorageQueryResult,\r\n StringKeys\r\n} from '../../types/index.d.ts';\r\nimport {\r\n deepEqual,\r\n ensureNotFalsy,\r\n now,\r\n PROMISE_RESOLVE_TRUE,\r\n PROMISE_RESOLVE_VOID,\r\n randomToken,\r\n requestIdlePromiseNoQueue\r\n} from '../../plugins/utils/index.ts';\r\nimport {\r\n boundGE,\r\n boundGT,\r\n boundLE,\r\n boundLT\r\n} from './binary-search-bounds.ts';\r\nimport {\r\n attachmentMapKey,\r\n bulkInsertToState,\r\n compareDocsWithIndex,\r\n ensureNotRemoved,\r\n getMemoryCollectionKey,\r\n putWriteRowToState,\r\n removeDocFromState\r\n} from './memory-helper.ts';\r\nimport {\r\n addIndexesToInternalsState,\r\n getMemoryIndexName\r\n} from './memory-indexes.ts';\r\nimport type {\r\n MemoryStorageInternals,\r\n RxStorageMemory,\r\n RxStorageMemoryInstanceCreationOptions,\r\n RxStorageMemorySettings\r\n} from './memory-types.ts';\r\nimport { getQueryMatcher, getSortComparator } from '../../rx-query-helper.ts';\r\nimport { newRxError } from '../../rx-error.ts';\r\n\r\n/**\r\n * Used in tests to ensure everything\r\n * is closed correctly\r\n */\r\nexport const OPEN_MEMORY_INSTANCES = new Set<RxStorageInstanceMemory<any>>();\r\n\r\nexport class RxStorageInstanceMemory<RxDocType> implements RxStorageInstance<\r\n RxDocType,\r\n MemoryStorageInternals<RxDocType>,\r\n RxStorageMemoryInstanceCreationOptions,\r\n RxStorageDefaultCheckpoint\r\n> {\r\n\r\n public readonly primaryPath: StringKeys<RxDocumentData<RxDocType>>;\r\n public closed = false;\r\n\r\n /**\r\n * Used by some plugins and storage wrappers\r\n * to find out details about the internals of a write operation.\r\n * For example if you want to know which documents really have been replaced\r\n * or newly inserted.\r\n */\r\n public categorizedByWriteInput = new WeakMap<BulkWriteRow<RxDocType>[], CategorizeBulkWriteRowsOutput<RxDocType>>();\r\n\r\n constructor(\r\n public readonly storage: RxStorageMemory,\r\n public readonly databaseName: string,\r\n public readonly collectionName: string,\r\n public readonly schema: Readonly<RxJsonSchema<RxDocumentData<RxDocType>>>,\r\n public readonly internals: MemoryStorageInternals<RxDocType>,\r\n public readonly options: Readonly<RxStorageMemoryInstanceCreationOptions>,\r\n public readonly settings: RxStorageMemorySettings,\r\n public readonly devMode: boolean\r\n ) {\r\n OPEN_MEMORY_INSTANCES.add(this);\r\n this.primaryPath = getPrimaryFieldOfPrimaryKey(this.schema.primaryKey);\r\n }\r\n\r\n bulkWrite(\r\n documentWrites: BulkWriteRow<RxDocType>[],\r\n context: string\r\n ): Promise<RxStorageBulkWriteResponse<RxDocType>> {\r\n this.ensurePersistence();\r\n ensureNotRemoved(this);\r\n const internals = this.internals;\r\n const documentsById = this.internals.documents;\r\n const primaryPath = this.primaryPath;\r\n\r\n\r\n const categorized = categorizeBulkWriteRows<RxDocType>(\r\n this,\r\n primaryPath as any,\r\n documentsById,\r\n documentWrites,\r\n context\r\n );\r\n const error = categorized.errors;\r\n /**\r\n * @performance\r\n * We have to return a Promise but we do not want to wait\r\n * one tick, so we directly create the promise\r\n * which makes it likely to be already resolved later.\r\n */\r\n const awaitMe = Promise.resolve({ error });\r\n\r\n this.categorizedByWriteInput.set(documentWrites, categorized);\r\n this.internals.ensurePersistenceTask = categorized;\r\n\r\n if (!this.internals.ensurePersistenceIdlePromise) {\r\n this.internals.ensurePersistenceIdlePromise = requestIdlePromiseNoQueue().then(() => {\r\n this.internals.ensurePersistenceIdlePromise = undefined;\r\n this.ensurePersistence();\r\n });\r\n }\r\n\r\n /**\r\n * Important: The events must be emitted AFTER the persistence\r\n * task has been added.\r\n */\r\n if (categorized.eventBulk.events.length > 0) {\r\n const lastState = ensureNotFalsy(categorized.newestRow).document;\r\n categorized.eventBulk.checkpoint = {\r\n id: lastState[primaryPath],\r\n lwt: lastState._meta.lwt\r\n };\r\n internals.changes$.next(categorized.eventBulk);\r\n }\r\n\r\n return awaitMe;\r\n }\r\n\r\n /**\r\n * Instead of directly inserting the documents into all indexes,\r\n * we do it lazy in the background. This gives the application time\r\n * to directly work with the write-result and to do stuff like rendering DOM\r\n * notes and processing RxDB queries.\r\n * Then in some later time, or just before the next read/write,\r\n * it is ensured that the indexes have been written.\r\n */\r\n public ensurePersistence() {\r\n if (\r\n !this.internals.ensurePersistenceTask\r\n ) {\r\n return;\r\n }\r\n const internals = this.internals;\r\n const documentsById = this.internals.documents;\r\n const primaryPath = this.primaryPath;\r\n\r\n const categorized = this.internals.ensurePersistenceTask;\r\n this.internals.ensurePersistenceTask = undefined;\r\n\r\n /**\r\n * Do inserts/updates\r\n */\r\n const stateByIndex = Object.values(this.internals.byIndex);\r\n\r\n /**\r\n * @performance Use batch insert for bulk inserts to avoid\r\n * repeated Array.splice() calls which are O(n) each.\r\n * Instead, batch-compute index entries, sort them,\r\n * and merge into existing sorted arrays.\r\n */\r\n const bulkInsertDocs = categorized.bulkInsertDocs;\r\n if (bulkInsertDocs.length > 0) {\r\n bulkInsertToState(\r\n primaryPath as any,\r\n internals,\r\n stateByIndex,\r\n bulkInsertDocs\r\n );\r\n }\r\n\r\n const bulkUpdateDocs = categorized.bulkUpdateDocs;\r\n for (let i = 0; i < bulkUpdateDocs.length; ++i) {\r\n const writeRow = bulkUpdateDocs[i];\r\n const doc = writeRow.document;\r\n const docId = doc[primaryPath];\r\n putWriteRowToState(\r\n docId as any,\r\n internals,\r\n stateByIndex,\r\n doc,\r\n documentsById.get(docId as any)\r\n );\r\n }\r\n\r\n /**\r\n * Handle attachments\r\n */\r\n if (this.schema.attachments) {\r\n const attachmentsMap = internals.attachments;\r\n categorized.attachmentsAdd.forEach(attachment => {\r\n attachmentsMap.set(\r\n attachmentMapKey(attachment.documentId, attachment.attachmentId),\r\n {\r\n writeData: attachment.attachmentData,\r\n digest: attachment.digest\r\n }\r\n );\r\n });\r\n if (this.schema.attachments) {\r\n categorized.attachmentsUpdate.forEach(attachment => {\r\n attachmentsMap.set(\r\n attachmentMapKey(attachment.documentId, attachment.attachmentId),\r\n {\r\n writeData: attachment.attachmentData,\r\n digest: attachment.digest\r\n }\r\n );\r\n });\r\n categorized.attachmentsRemove.forEach(attachment => {\r\n attachmentsMap.delete(\r\n attachmentMapKey(attachment.documentId, attachment.attachmentId)\r\n );\r\n });\r\n }\r\n }\r\n }\r\n\r\n findDocumentsById(\r\n docIds: string[],\r\n withDeleted: boolean\r\n ): Promise<RxDocumentData<RxDocType>[]> {\r\n this.ensurePersistence();\r\n const documentsById = this.internals.documents;\r\n const ret: RxDocumentData<RxDocType>[] = [];\r\n if (documentsById.size === 0) {\r\n return Promise.resolve(ret);\r\n }\r\n for (let i = 0; i < docIds.length; ++i) {\r\n const docId = docIds[i];\r\n const docInDb = documentsById.get(docId);\r\n if (\r\n docInDb &&\r\n (\r\n !docInDb._deleted ||\r\n withDeleted\r\n )\r\n ) {\r\n ret.push(docInDb);\r\n }\r\n }\r\n return Promise.resolve(ret);\r\n }\r\n\r\n query(\r\n preparedQuery: PreparedQuery<RxDocType>\r\n ): Promise<RxStorageQueryResult<RxDocType>> {\r\n this.ensurePersistence();\r\n\r\n const queryPlan = preparedQuery.queryPlan;\r\n const query = preparedQuery.query;\r\n\r\n const skip = query.skip ? query.skip : 0;\r\n const limit = query.limit ? query.limit : Infinity;\r\n const skipPlusLimit = skip + limit;\r\n\r\n let queryMatcher: QueryMatcher<RxDocumentData<RxDocType>> | false = false;\r\n if (!queryPlan.selectorSatisfiedByIndex) {\r\n queryMatcher = getQueryMatcher(\r\n this.schema,\r\n preparedQuery.query\r\n );\r\n }\r\n\r\n const queryPlanFields: string[] = queryPlan.index;\r\n const mustManuallyResort = !queryPlan.sortSatisfiedByIndex;\r\n const index: string[] | undefined = queryPlanFields;\r\n const lowerBound: any[] = queryPlan.startKeys;\r\n const lowerBoundString = getStartIndexStringFromLowerBound(\r\n this.schema,\r\n index,\r\n lowerBound\r\n );\r\n\r\n const upperBound: any[] = queryPlan.endKeys;\r\n const upperBoundString = getStartIndexStringFromUpperBound(\r\n this.schema,\r\n index,\r\n upperBound\r\n );\r\n const indexName = getMemoryIndexName(index);\r\n\r\n if (!this.internals.byIndex[indexName]) {\r\n throw new Error('index does not exist ' + indexName);\r\n }\r\n const docsWithIndex = this.internals.byIndex[indexName].docsWithIndex;\r\n\r\n\r\n\r\n let indexOfLower = (queryPlan.inclusiveStart ? boundGE : boundGT)(\r\n docsWithIndex,\r\n [\r\n lowerBoundString\r\n ] as any,\r\n compareDocsWithIndex\r\n );\r\n\r\n const indexOfUpper = (queryPlan.inclusiveEnd ? boundLE : boundLT)(\r\n docsWithIndex,\r\n [\r\n upperBoundString\r\n ] as any,\r\n compareDocsWithIndex\r\n );\r\n\r\n let rows: RxDocumentData<RxDocType>[] = [];\r\n\r\n /**\r\n * @performance\r\n * If the selector is satisfied by the index,\r\n * we can extract all documents in the range without\r\n * running a per-document queryMatcher check.\r\n * This is a common case for queries like find-by-query\r\n * where the selector is empty or fully covered by the index.\r\n */\r\n if (!queryMatcher) {\r\n const rangeLength = indexOfUpper - indexOfLower + 1;\r\n if (rangeLength > 0) {\r\n const extractLength = mustManuallyResort\r\n ? rangeLength\r\n : Math.min(rangeLength, skipPlusLimit);\r\n rows = new Array(extractLength);\r\n for (let i = 0; i < extractLength; i++) {\r\n rows[i] = docsWithIndex[indexOfLower + i][1];\r\n }\r\n }\r\n } else {\r\n let done = false;\r\n while (!done) {\r\n const currentRow = docsWithIndex[indexOfLower];\r\n if (\r\n !currentRow ||\r\n indexOfLower > indexOfUpper\r\n ) {\r\n break;\r\n }\r\n const currentDoc = currentRow[1];\r\n\r\n if (queryMatcher(currentDoc)) {\r\n rows.push(currentDoc);\r\n }\r\n\r\n if (\r\n (rows.length >= skipPlusLimit && !mustManuallyResort)\r\n ) {\r\n done = true;\r\n }\r\n\r\n indexOfLower++;\r\n }\r\n }\r\n\r\n if (mustManuallyResort) {\r\n const sortComparator = getSortComparator(this.schema, preparedQuery.query);\r\n rows = rows.sort(sortComparator);\r\n }\r\n\r\n // apply skip and limit boundaries.\r\n if (skip !== 0 || rows.length > skipPlusLimit) {\r\n rows = rows.slice(skip, skipPlusLimit);\r\n }\r\n\r\n return Promise.resolve({\r\n documents: rows\r\n });\r\n }\r\n\r\n count(\r\n preparedQuery: PreparedQuery<RxDocType>\r\n ): Promise<RxStorageCountResult> {\r\n this.ensurePersistence();\r\n\r\n const queryPlan = preparedQuery.queryPlan;\r\n\r\n /**\r\n * @performance\r\n * If the selector is satisfied by the index,\r\n * we can compute the count directly from the index range\r\n * without extracting document data into an array.\r\n */\r\n if (queryPlan.selectorSatisfiedByIndex) {\r\n const queryPlanFields: string[] = queryPlan.index;\r\n const index: string[] = queryPlanFields;\r\n const lowerBound: any[] = queryPlan.startKeys;\r\n const lowerBoundString = getStartIndexStringFromLowerBound(\r\n this.schema,\r\n index,\r\n lowerBound\r\n );\r\n const upperBound: any[] = queryPlan.endKeys;\r\n const upperBoundString = getStartIndexStringFromUpperBound(\r\n this.schema,\r\n index,\r\n upperBound\r\n );\r\n const indexName = getMemoryIndexName(index);\r\n\r\n if (!this.internals.byIndex[indexName]) {\r\n throw newRxError('SNH', { args: { indexName } });\r\n }\r\n const docsWithIndex = this.internals.byIndex[indexName].docsWithIndex;\r\n\r\n const indexOfLower = (queryPlan.inclusiveStart ? boundGE : boundGT)(\r\n docsWithIndex,\r\n [lowerBoundString] as any,\r\n compareDocsWithIndex\r\n );\r\n\r\n const indexOfUpper = (queryPlan.inclusiveEnd ? boundLE : boundLT)(\r\n docsWithIndex,\r\n [upperBoundString] as any,\r\n compareDocsWithIndex\r\n );\r\n\r\n const count = Math.max(0, indexOfUpper - indexOfLower + 1);\r\n return Promise.resolve({\r\n count,\r\n mode: 'fast'\r\n });\r\n }\r\n\r\n return this.query(preparedQuery).then(result => ({\r\n count: result.documents.length,\r\n mode: 'fast' as const\r\n }));\r\n }\r\n\r\n cleanup(minimumDeletedTime: number): Promise<boolean> {\r\n this.ensurePersistence();\r\n const maxDeletionTime = now() - minimumDeletedTime;\r\n const index = ['_deleted', '_meta.lwt', this.primaryPath as any];\r\n const indexName = getMemoryIndexName(index);\r\n const docsWithIndex = this.internals.byIndex[indexName].docsWithIndex;\r\n\r\n const lowerBoundString = getStartIndexStringFromLowerBound(\r\n this.schema,\r\n index,\r\n [\r\n true,\r\n 0,\r\n ''\r\n ]\r\n );\r\n\r\n let indexOfLower = boundGT(\r\n docsWithIndex,\r\n [\r\n lowerBoundString\r\n ] as any,\r\n compareDocsWithIndex\r\n );\r\n\r\n let done = false;\r\n while (!done) {\r\n const currentDoc = docsWithIndex[indexOfLower];\r\n if (!currentDoc || currentDoc[1]._meta.lwt > maxDeletionTime) {\r\n done = true;\r\n } else {\r\n removeDocFromState(\r\n this.primaryPath as any,\r\n this.schema,\r\n this.internals,\r\n currentDoc[1]\r\n );\r\n indexOfLower++;\r\n }\r\n }\r\n return PROMISE_RESOLVE_TRUE;\r\n }\r\n\r\n getAttachmentData(\r\n documentId: string,\r\n attachmentId: string,\r\n digest: string\r\n ): Promise<Blob> {\r\n this.ensurePersistence();\r\n ensureNotRemoved(this);\r\n const key = attachmentMapKey(documentId, attachmentId);\r\n const data = this.internals.attachments.get(key);\r\n\r\n if (\r\n !digest ||\r\n !data ||\r\n data.digest !== digest\r\n ) {\r\n throw new Error('attachment does not exist: ' + key);\r\n }\r\n return Promise.resolve(data.writeData.data);\r\n }\r\n\r\n changeStream(): Observable<EventBulk<RxStorageChangeEvent<RxDocumentData<RxDocType>>, RxStorageDefaultCheckpoint>> {\r\n ensureNotRemoved(this);\r\n return this.internals.changes$.asObservable();\r\n }\r\n\r\n async remove(): Promise<void> {\r\n if (this.closed) {\r\n throw new Error('closed');\r\n }\r\n this.ensurePersistence();\r\n ensureNotRemoved(this);\r\n\r\n this.internals.removed = true;\r\n this.storage.collectionStates.delete(\r\n getMemoryCollectionKey(\r\n this.databaseName,\r\n this.collectionName,\r\n this.schema.version\r\n )\r\n );\r\n await this.close();\r\n }\r\n\r\n close(): Promise<void> {\r\n OPEN_MEMORY_INSTANCES.delete(this);\r\n\r\n this.ensurePersistence();\r\n if (this.closed) {\r\n return PROMISE_RESOLVE_VOID;\r\n }\r\n this.closed = true;\r\n\r\n this.internals.refCount = this.internals.refCount - 1;\r\n return PROMISE_RESOLVE_VOID;\r\n }\r\n}\r\n\r\nexport function createMemoryStorageInstance<RxDocType>(\r\n storage: RxStorageMemory,\r\n params: RxStorageInstanceCreationParams<RxDocType, RxStorageMemoryInstanceCreationOptions>,\r\n settings: RxStorageMemorySettings\r\n): Promise<RxStorageInstanceMemory<RxDocType>> {\r\n const collectionKey = getMemoryCollectionKey(\r\n params.databaseName,\r\n params.collectionName,\r\n params.schema.version\r\n );\r\n\r\n let internals = storage.collectionStates.get(collectionKey);\r\n if (!internals) {\r\n internals = {\r\n id: randomToken(5),\r\n schema: params.schema,\r\n removed: false,\r\n refCount: 1,\r\n documents: new Map(),\r\n attachments: params.schema.attachments ? new Map() : undefined as any,\r\n byIndex: {},\r\n changes$: new Subject()\r\n };\r\n addIndexesToInternalsState(internals, params.schema);\r\n storage.collectionStates.set(collectionKey, internals);\r\n } else {\r\n /**\r\n * Ensure that the storage was not already\r\n * created with a different schema.\r\n * This is very important because if this check\r\n * does not exist here, we have hard-to-debug problems\r\n * downstream.\r\n */\r\n if (\r\n params.devMode &&\r\n !deepEqual(internals.schema, params.schema)\r\n ) {\r\n throw new Error('storage was already created with a different schema');\r\n }\r\n internals.refCount = internals.refCount + 1;\r\n }\r\n\r\n const instance = new RxStorageInstanceMemory(\r\n storage,\r\n params.databaseName,\r\n params.collectionName,\r\n params.schema,\r\n internals,\r\n params.options,\r\n settings,\r\n params.devMode\r\n );\r\n return Promise.resolve(instance);\r\n}\r\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"rx-storage-instance-memory.js","names":["Subject","getStartIndexStringFromLowerBound","getStartIndexStringFromUpperBound","getPrimaryFieldOfPrimaryKey","categorizeBulkWriteRows","deepEqual","ensureNotFalsy","now","PROMISE_RESOLVE_TRUE","PROMISE_RESOLVE_VOID","randomToken","requestIdlePromiseNoQueue","boundGEByIndexString","boundGTByIndexString","boundLEByIndexString","boundLTByIndexString","attachmentMapKey","bulkInsertToState","ensureNotRemoved","getMemoryCollectionKey","putWriteRowToState","removeDocFromState","addIndexesToInternalsState","getMemoryIndexName","getQueryMatcher","getSortComparator","newRxError","OPEN_MEMORY_INSTANCES","Set","RxStorageInstanceMemory","storage","databaseName","collectionName","schema","internals","options","settings","devMode","closed","categorizedByWriteInput","WeakMap","add","primaryPath","primaryKey","_proto","prototype","bulkWrite","documentWrites","context","ensurePersistence","documentsById","documents","categorized","error","errors","awaitMe","Promise","resolve","set","ensurePersistenceTask","ensurePersistenceIdlePromise","then","undefined","eventBulk","events","length","lastState","newestRow","document","checkpoint","id","lwt","_meta","changes$","next","stateByIndex","byIndexArray","bulkInsertDocs","bulkUpdateDocs","i","writeRow","doc","docId","previous","attachments","attachmentsMap","attachmentsAdd","forEach","attachment","documentId","attachmentId","writeData","attachmentData","digest","attachmentsUpdate","attachmentsRemove","delete","findDocumentsById","docIds","withDeleted","ret","size","docInDb","get","push","_deleted","query","preparedQuery","queryPlan","skip","limit","Infinity","skipPlusLimit","queryMatcher","selectorSatisfiedByIndex","queryPlanFields","index","mustManuallyResort","sortSatisfiedByIndex","lowerBound","startKeys","lowerBoundString","upperBound","endKeys","upperBoundString","indexName","byIndex","Error","docsWithIndex","indexOfLower","inclusiveStart","indexOfUpper","inclusiveEnd","rows","rangeLength","extractLength","Math","min","Array","done","currentRow","currentDoc","sortComparator","sort","slice","count","args","max","mode","cleanup","minimumDeletedTime","maxDeletionTime","getAttachmentData","key","data","changeStream","asObservable","remove","removed","collectionStates","version","close","refCount","createMemoryStorageInstance","params","collectionKey","Map","instance"],"sources":["../../../../src/plugins/storage-memory/rx-storage-instance-memory.ts"],"sourcesContent":["import {\r\n Observable,\r\n Subject\r\n} from 'rxjs';\r\nimport {\r\n getStartIndexStringFromLowerBound,\r\n getStartIndexStringFromUpperBound\r\n} from '../../custom-index.ts';\r\nimport { getPrimaryFieldOfPrimaryKey } from '../../rx-schema-helper.ts';\r\nimport {\r\n categorizeBulkWriteRows\r\n} from '../../rx-storage-helper.ts';\r\nimport type {\r\n BulkWriteRow,\r\n CategorizeBulkWriteRowsOutput,\r\n EventBulk,\r\n PreparedQuery,\r\n QueryMatcher,\r\n RxDocumentData,\r\n RxJsonSchema,\r\n RxStorageBulkWriteResponse,\r\n RxStorageChangeEvent,\r\n RxStorageCountResult,\r\n RxStorageDefaultCheckpoint,\r\n RxStorageInstance,\r\n RxStorageInstanceCreationParams,\r\n RxStorageQueryResult,\r\n StringKeys\r\n} from '../../types/index.d.ts';\r\nimport {\r\n deepEqual,\r\n ensureNotFalsy,\r\n now,\r\n PROMISE_RESOLVE_TRUE,\r\n PROMISE_RESOLVE_VOID,\r\n randomToken,\r\n requestIdlePromiseNoQueue\r\n} from '../../plugins/utils/index.ts';\r\nimport {\r\n boundGEByIndexString,\r\n boundGTByIndexString,\r\n boundLEByIndexString,\r\n boundLTByIndexString\r\n} from './binary-search-bounds.ts';\r\nimport {\r\n attachmentMapKey,\r\n bulkInsertToState,\r\n ensureNotRemoved,\r\n getMemoryCollectionKey,\r\n putWriteRowToState,\r\n removeDocFromState\r\n} from './memory-helper.ts';\r\nimport {\r\n addIndexesToInternalsState,\r\n getMemoryIndexName\r\n} from './memory-indexes.ts';\r\nimport type {\r\n MemoryStorageInternals,\r\n RxStorageMemory,\r\n RxStorageMemoryInstanceCreationOptions,\r\n RxStorageMemorySettings\r\n} from './memory-types.ts';\r\nimport { getQueryMatcher, getSortComparator } from '../../rx-query-helper.ts';\r\nimport { newRxError } from '../../rx-error.ts';\r\n\r\n/**\r\n * Used in tests to ensure everything\r\n * is closed correctly\r\n */\r\nexport const OPEN_MEMORY_INSTANCES = new Set<RxStorageInstanceMemory<any>>();\r\n\r\nexport class RxStorageInstanceMemory<RxDocType> implements RxStorageInstance<\r\n RxDocType,\r\n MemoryStorageInternals<RxDocType>,\r\n RxStorageMemoryInstanceCreationOptions,\r\n RxStorageDefaultCheckpoint\r\n> {\r\n\r\n public readonly primaryPath: StringKeys<RxDocumentData<RxDocType>>;\r\n public closed = false;\r\n\r\n /**\r\n * Used by some plugins and storage wrappers\r\n * to find out details about the internals of a write operation.\r\n * For example if you want to know which documents really have been replaced\r\n * or newly inserted.\r\n */\r\n public categorizedByWriteInput = new WeakMap<BulkWriteRow<RxDocType>[], CategorizeBulkWriteRowsOutput<RxDocType>>();\r\n\r\n constructor(\r\n public readonly storage: RxStorageMemory,\r\n public readonly databaseName: string,\r\n public readonly collectionName: string,\r\n public readonly schema: Readonly<RxJsonSchema<RxDocumentData<RxDocType>>>,\r\n public readonly internals: MemoryStorageInternals<RxDocType>,\r\n public readonly options: Readonly<RxStorageMemoryInstanceCreationOptions>,\r\n public readonly settings: RxStorageMemorySettings,\r\n public readonly devMode: boolean\r\n ) {\r\n OPEN_MEMORY_INSTANCES.add(this);\r\n this.primaryPath = getPrimaryFieldOfPrimaryKey(this.schema.primaryKey);\r\n }\r\n\r\n bulkWrite(\r\n documentWrites: BulkWriteRow<RxDocType>[],\r\n context: string\r\n ): Promise<RxStorageBulkWriteResponse<RxDocType>> {\r\n this.ensurePersistence();\r\n ensureNotRemoved(this);\r\n const internals = this.internals;\r\n const documentsById = this.internals.documents;\r\n const primaryPath = this.primaryPath;\r\n\r\n\r\n const categorized = categorizeBulkWriteRows<RxDocType>(\r\n this,\r\n primaryPath as any,\r\n documentsById,\r\n documentWrites,\r\n context\r\n );\r\n const error = categorized.errors;\r\n /**\r\n * @performance\r\n * We have to return a Promise but we do not want to wait\r\n * one tick, so we directly create the promise\r\n * which makes it likely to be already resolved later.\r\n */\r\n const awaitMe = Promise.resolve({ error });\r\n\r\n this.categorizedByWriteInput.set(documentWrites, categorized);\r\n this.internals.ensurePersistenceTask = categorized;\r\n\r\n if (!this.internals.ensurePersistenceIdlePromise) {\r\n this.internals.ensurePersistenceIdlePromise = requestIdlePromiseNoQueue().then(() => {\r\n this.internals.ensurePersistenceIdlePromise = undefined;\r\n this.ensurePersistence();\r\n });\r\n }\r\n\r\n /**\r\n * Important: The events must be emitted AFTER the persistence\r\n * task has been added.\r\n */\r\n if (categorized.eventBulk.events.length > 0) {\r\n const lastState = ensureNotFalsy(categorized.newestRow).document;\r\n categorized.eventBulk.checkpoint = {\r\n id: lastState[primaryPath],\r\n lwt: lastState._meta.lwt\r\n };\r\n internals.changes$.next(categorized.eventBulk);\r\n }\r\n\r\n return awaitMe;\r\n }\r\n\r\n /**\r\n * Instead of directly inserting the documents into all indexes,\r\n * we do it lazy in the background. This gives the application time\r\n * to directly work with the write-result and to do stuff like rendering DOM\r\n * notes and processing RxDB queries.\r\n * Then in some later time, or just before the next read/write,\r\n * it is ensured that the indexes have been written.\r\n */\r\n public ensurePersistence() {\r\n if (\r\n !this.internals.ensurePersistenceTask\r\n ) {\r\n return;\r\n }\r\n const internals = this.internals;\r\n const primaryPath = this.primaryPath;\r\n\r\n const categorized = this.internals.ensurePersistenceTask;\r\n this.internals.ensurePersistenceTask = undefined;\r\n\r\n /**\r\n * Do inserts/updates\r\n * @performance Use cached byIndexArray instead of Object.values()\r\n */\r\n const stateByIndex = internals.byIndexArray;\r\n\r\n /**\r\n * @performance Use batch insert for bulk inserts to avoid\r\n * repeated Array.splice() calls which are O(n) each.\r\n * Instead, batch-compute index entries, sort them,\r\n * and merge into existing sorted arrays.\r\n */\r\n const bulkInsertDocs = categorized.bulkInsertDocs;\r\n if (bulkInsertDocs.length > 0) {\r\n bulkInsertToState(\r\n primaryPath as any,\r\n internals,\r\n stateByIndex,\r\n bulkInsertDocs\r\n );\r\n }\r\n\r\n const bulkUpdateDocs = categorized.bulkUpdateDocs;\r\n for (let i = 0; i < bulkUpdateDocs.length; ++i) {\r\n const writeRow = bulkUpdateDocs[i];\r\n const doc = writeRow.document;\r\n const docId = doc[primaryPath];\r\n /**\r\n * @performance\r\n * Pass writeRow.previous directly as the old document state\r\n * instead of re-looking it up from the documents Map.\r\n * This is safe because categorizeBulkWriteRows already verified\r\n * that previous._rev matches the document in the Map (conflict check).\r\n */\r\n putWriteRowToState(\r\n docId as any,\r\n internals,\r\n stateByIndex,\r\n doc,\r\n writeRow.previous\r\n );\r\n }\r\n\r\n /**\r\n * Handle attachments\r\n */\r\n if (this.schema.attachments) {\r\n const attachmentsMap = internals.attachments;\r\n categorized.attachmentsAdd.forEach(attachment => {\r\n attachmentsMap.set(\r\n attachmentMapKey(attachment.documentId, attachment.attachmentId),\r\n {\r\n writeData: attachment.attachmentData,\r\n digest: attachment.digest\r\n }\r\n );\r\n });\r\n if (this.schema.attachments) {\r\n categorized.attachmentsUpdate.forEach(attachment => {\r\n attachmentsMap.set(\r\n attachmentMapKey(attachment.documentId, attachment.attachmentId),\r\n {\r\n writeData: attachment.attachmentData,\r\n digest: attachment.digest\r\n }\r\n );\r\n });\r\n categorized.attachmentsRemove.forEach(attachment => {\r\n attachmentsMap.delete(\r\n attachmentMapKey(attachment.documentId, attachment.attachmentId)\r\n );\r\n });\r\n }\r\n }\r\n }\r\n\r\n findDocumentsById(\r\n docIds: string[],\r\n withDeleted: boolean\r\n ): Promise<RxDocumentData<RxDocType>[]> {\r\n this.ensurePersistence();\r\n const documentsById = this.internals.documents;\r\n const ret: RxDocumentData<RxDocType>[] = [];\r\n if (documentsById.size === 0) {\r\n return Promise.resolve(ret);\r\n }\r\n /**\r\n * @performance\r\n * Split into two paths to avoid checking withDeleted on every iteration.\r\n */\r\n if (withDeleted) {\r\n for (let i = 0; i < docIds.length; ++i) {\r\n const docInDb = documentsById.get(docIds[i]);\r\n if (docInDb) {\r\n ret.push(docInDb);\r\n }\r\n }\r\n } else {\r\n for (let i = 0; i < docIds.length; ++i) {\r\n const docInDb = documentsById.get(docIds[i]);\r\n if (docInDb && !docInDb._deleted) {\r\n ret.push(docInDb);\r\n }\r\n }\r\n }\r\n return Promise.resolve(ret);\r\n }\r\n\r\n query(\r\n preparedQuery: PreparedQuery<RxDocType>\r\n ): Promise<RxStorageQueryResult<RxDocType>> {\r\n this.ensurePersistence();\r\n\r\n const queryPlan = preparedQuery.queryPlan;\r\n const query = preparedQuery.query;\r\n\r\n const skip = query.skip ? query.skip : 0;\r\n const limit = query.limit ? query.limit : Infinity;\r\n const skipPlusLimit = skip + limit;\r\n\r\n let queryMatcher: QueryMatcher<RxDocumentData<RxDocType>> | false = false;\r\n if (!queryPlan.selectorSatisfiedByIndex) {\r\n queryMatcher = getQueryMatcher(\r\n this.schema,\r\n preparedQuery.query\r\n );\r\n }\r\n\r\n const queryPlanFields: string[] = queryPlan.index;\r\n const mustManuallyResort = !queryPlan.sortSatisfiedByIndex;\r\n const index: string[] | undefined = queryPlanFields;\r\n const lowerBound: any[] = queryPlan.startKeys;\r\n const lowerBoundString = getStartIndexStringFromLowerBound(\r\n this.schema,\r\n index,\r\n lowerBound\r\n );\r\n\r\n const upperBound: any[] = queryPlan.endKeys;\r\n const upperBoundString = getStartIndexStringFromUpperBound(\r\n this.schema,\r\n index,\r\n upperBound\r\n );\r\n const indexName = getMemoryIndexName(index);\r\n\r\n if (!this.internals.byIndex[indexName]) {\r\n throw new Error('index does not exist ' + indexName);\r\n }\r\n const docsWithIndex = this.internals.byIndex[indexName].docsWithIndex;\r\n\r\n\r\n /**\r\n * @performance Use string-specialized binary search to avoid\r\n * temporary array allocations on every query.\r\n */\r\n let indexOfLower = queryPlan.inclusiveStart\r\n ? boundGEByIndexString(docsWithIndex, lowerBoundString)\r\n : boundGTByIndexString(docsWithIndex, lowerBoundString);\r\n\r\n const indexOfUpper = queryPlan.inclusiveEnd\r\n ? boundLEByIndexString(docsWithIndex, upperBoundString)\r\n : boundLTByIndexString(docsWithIndex, upperBoundString);\r\n\r\n let rows: RxDocumentData<RxDocType>[] = [];\r\n\r\n /**\r\n * @performance\r\n * If the selector is satisfied by the index,\r\n * we can extract all documents in the range without\r\n * running a per-document queryMatcher check.\r\n * This is a common case for queries like find-by-query\r\n * where the selector is empty or fully covered by the index.\r\n */\r\n if (!queryMatcher) {\r\n const rangeLength = indexOfUpper - indexOfLower + 1;\r\n if (rangeLength > 0) {\r\n const extractLength = mustManuallyResort\r\n ? rangeLength\r\n : Math.min(rangeLength, skipPlusLimit);\r\n rows = new Array(extractLength);\r\n for (let i = 0; i < extractLength; i++) {\r\n rows[i] = docsWithIndex[indexOfLower + i][1];\r\n }\r\n }\r\n } else {\r\n let done = false;\r\n while (!done) {\r\n const currentRow = docsWithIndex[indexOfLower];\r\n if (\r\n !currentRow ||\r\n indexOfLower > indexOfUpper\r\n ) {\r\n break;\r\n }\r\n const currentDoc = currentRow[1];\r\n\r\n if (queryMatcher(currentDoc)) {\r\n rows.push(currentDoc);\r\n }\r\n\r\n if (\r\n (rows.length >= skipPlusLimit && !mustManuallyResort)\r\n ) {\r\n done = true;\r\n }\r\n\r\n indexOfLower++;\r\n }\r\n }\r\n\r\n if (mustManuallyResort) {\r\n const sortComparator = getSortComparator(this.schema, preparedQuery.query);\r\n rows = rows.sort(sortComparator);\r\n }\r\n\r\n // apply skip and limit boundaries.\r\n if (skip !== 0 || rows.length > skipPlusLimit) {\r\n rows = rows.slice(skip, skipPlusLimit);\r\n }\r\n\r\n return Promise.resolve({\r\n documents: rows\r\n });\r\n }\r\n\r\n count(\r\n preparedQuery: PreparedQuery<RxDocType>\r\n ): Promise<RxStorageCountResult> {\r\n this.ensurePersistence();\r\n\r\n const queryPlan = preparedQuery.queryPlan;\r\n\r\n /**\r\n * @performance\r\n * If the selector is satisfied by the index,\r\n * we can compute the count directly from the index range\r\n * without extracting document data into an array.\r\n * Uses string-specialized binary search to avoid allocations.\r\n */\r\n if (queryPlan.selectorSatisfiedByIndex) {\r\n const queryPlanFields: string[] = queryPlan.index;\r\n const index: string[] = queryPlanFields;\r\n const lowerBound: any[] = queryPlan.startKeys;\r\n const lowerBoundString = getStartIndexStringFromLowerBound(\r\n this.schema,\r\n index,\r\n lowerBound\r\n );\r\n const upperBound: any[] = queryPlan.endKeys;\r\n const upperBoundString = getStartIndexStringFromUpperBound(\r\n this.schema,\r\n index,\r\n upperBound\r\n );\r\n const indexName = getMemoryIndexName(index);\r\n\r\n if (!this.internals.byIndex[indexName]) {\r\n throw newRxError('SNH', { args: { indexName } });\r\n }\r\n const docsWithIndex = this.internals.byIndex[indexName].docsWithIndex;\r\n\r\n const indexOfLower = queryPlan.inclusiveStart\r\n ? boundGEByIndexString(docsWithIndex, lowerBoundString)\r\n : boundGTByIndexString(docsWithIndex, lowerBoundString);\r\n\r\n const indexOfUpper = queryPlan.inclusiveEnd\r\n ? boundLEByIndexString(docsWithIndex, upperBoundString)\r\n : boundLTByIndexString(docsWithIndex, upperBoundString);\r\n\r\n const count = Math.max(0, indexOfUpper - indexOfLower + 1);\r\n return Promise.resolve({\r\n count,\r\n mode: 'fast'\r\n });\r\n }\r\n\r\n const queryMatcher = getQueryMatcher(\r\n this.schema,\r\n preparedQuery.query\r\n );\r\n const queryPlanFields: string[] = queryPlan.index;\r\n const index: string[] = queryPlanFields;\r\n const lowerBound: any[] = queryPlan.startKeys;\r\n const lowerBoundString = getStartIndexStringFromLowerBound(\r\n this.schema,\r\n index,\r\n lowerBound\r\n );\r\n const upperBound: any[] = queryPlan.endKeys;\r\n const upperBoundString = getStartIndexStringFromUpperBound(\r\n this.schema,\r\n index,\r\n upperBound\r\n );\r\n const indexName = getMemoryIndexName(index);\r\n if (!this.internals.byIndex[indexName]) {\r\n throw newRxError('SNH', { args: { indexName } });\r\n }\r\n const docsWithIndex = this.internals.byIndex[indexName].docsWithIndex;\r\n\r\n let indexOfLower = queryPlan.inclusiveStart\r\n ? boundGEByIndexString(docsWithIndex, lowerBoundString)\r\n : boundGTByIndexString(docsWithIndex, lowerBoundString);\r\n\r\n const indexOfUpper = queryPlan.inclusiveEnd\r\n ? boundLEByIndexString(docsWithIndex, upperBoundString)\r\n : boundLTByIndexString(docsWithIndex, upperBoundString);\r\n\r\n let count = 0;\r\n while (indexOfLower <= indexOfUpper) {\r\n const currentRow = docsWithIndex[indexOfLower];\r\n if (!currentRow) {\r\n break;\r\n }\r\n if (queryMatcher(currentRow[1])) {\r\n count++;\r\n }\r\n indexOfLower++;\r\n }\r\n\r\n return Promise.resolve({\r\n count,\r\n mode: 'fast' as const\r\n });\r\n }\r\n\r\n cleanup(minimumDeletedTime: number): Promise<boolean> {\r\n this.ensurePersistence();\r\n const maxDeletionTime = now() - minimumDeletedTime;\r\n const index = ['_deleted', '_meta.lwt', this.primaryPath as any];\r\n const indexName = getMemoryIndexName(index);\r\n const docsWithIndex = this.internals.byIndex[indexName].docsWithIndex;\r\n\r\n const lowerBoundString = getStartIndexStringFromLowerBound(\r\n this.schema,\r\n index,\r\n [\r\n true,\r\n 0,\r\n ''\r\n ]\r\n );\r\n\r\n let indexOfLower = boundGTByIndexString(\r\n docsWithIndex,\r\n lowerBoundString\r\n );\r\n\r\n let done = false;\r\n while (!done) {\r\n const currentDoc = docsWithIndex[indexOfLower];\r\n if (!currentDoc || currentDoc[1]._meta.lwt > maxDeletionTime) {\r\n done = true;\r\n } else {\r\n removeDocFromState(\r\n this.primaryPath as any,\r\n this.schema,\r\n this.internals,\r\n currentDoc[1]\r\n );\r\n /**\r\n * Do NOT increment indexOfLower after removal.\r\n * removeDocFromState() splices the element out of the array,\r\n * so the next element shifts into the current position.\r\n * Incrementing would skip it.\r\n */\r\n }\r\n }\r\n return PROMISE_RESOLVE_TRUE;\r\n }\r\n\r\n getAttachmentData(\r\n documentId: string,\r\n attachmentId: string,\r\n digest: string\r\n ): Promise<Blob> {\r\n this.ensurePersistence();\r\n ensureNotRemoved(this);\r\n const key = attachmentMapKey(documentId, attachmentId);\r\n const data = this.internals.attachments.get(key);\r\n\r\n if (\r\n !digest ||\r\n !data ||\r\n data.digest !== digest\r\n ) {\r\n throw new Error('attachment does not exist: ' + key);\r\n }\r\n return Promise.resolve(data.writeData.data);\r\n }\r\n\r\n changeStream(): Observable<EventBulk<RxStorageChangeEvent<RxDocumentData<RxDocType>>, RxStorageDefaultCheckpoint>> {\r\n ensureNotRemoved(this);\r\n return this.internals.changes$.asObservable();\r\n }\r\n\r\n async remove(): Promise<void> {\r\n if (this.closed) {\r\n throw new Error('closed');\r\n }\r\n this.ensurePersistence();\r\n ensureNotRemoved(this);\r\n\r\n this.internals.removed = true;\r\n this.storage.collectionStates.delete(\r\n getMemoryCollectionKey(\r\n this.databaseName,\r\n this.collectionName,\r\n this.schema.version\r\n )\r\n );\r\n await this.close();\r\n }\r\n\r\n close(): Promise<void> {\r\n OPEN_MEMORY_INSTANCES.delete(this);\r\n\r\n this.ensurePersistence();\r\n if (this.closed) {\r\n return PROMISE_RESOLVE_VOID;\r\n }\r\n this.closed = true;\r\n\r\n this.internals.refCount = this.internals.refCount - 1;\r\n return PROMISE_RESOLVE_VOID;\r\n }\r\n}\r\n\r\nexport function createMemoryStorageInstance<RxDocType>(\r\n storage: RxStorageMemory,\r\n params: RxStorageInstanceCreationParams<RxDocType, RxStorageMemoryInstanceCreationOptions>,\r\n settings: RxStorageMemorySettings\r\n): Promise<RxStorageInstanceMemory<RxDocType>> {\r\n const collectionKey = getMemoryCollectionKey(\r\n params.databaseName,\r\n params.collectionName,\r\n params.schema.version\r\n );\r\n\r\n let internals = storage.collectionStates.get(collectionKey);\r\n if (!internals) {\r\n internals = {\r\n id: randomToken(5),\r\n schema: params.schema,\r\n removed: false,\r\n refCount: 1,\r\n documents: new Map(),\r\n attachments: params.schema.attachments ? new Map() : undefined as any,\r\n byIndex: {},\r\n byIndexArray: [],\r\n changes$: new Subject()\r\n };\r\n addIndexesToInternalsState(internals, params.schema);\r\n storage.collectionStates.set(collectionKey, internals);\r\n } else {\r\n /**\r\n * Ensure that the storage was not already\r\n * created with a different schema.\r\n * This is very important because if this check\r\n * does not exist here, we have hard-to-debug problems\r\n * downstream.\r\n */\r\n if (\r\n params.devMode &&\r\n !deepEqual(internals.schema, params.schema)\r\n ) {\r\n throw new Error('storage was already created with a different schema');\r\n }\r\n internals.refCount = internals.refCount + 1;\r\n }\r\n\r\n const instance = new RxStorageInstanceMemory(\r\n storage,\r\n params.databaseName,\r\n params.collectionName,\r\n params.schema,\r\n internals,\r\n params.options,\r\n settings,\r\n params.devMode\r\n );\r\n return Promise.resolve(instance);\r\n}\r\n"],"mappings":"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","ignoreList":[]}
@@ -1,3 +1,4 @@
1
+ import { MongoClient } from 'mongodb';
1
2
  import { RXDB_VERSION, flatClone } from "../utils/index.js";
2
3
  import { getPrimaryFieldOfPrimaryKey } from "../../rx-schema-helper.js";
3
4
  export var RX_STORAGE_NAME_MONGODB = 'mongodb';
@@ -82,4 +83,42 @@ export function swapToMongoSort(sort) {
82
83
  export function getMongoDBIndexName(index) {
83
84
  return index.join('|');
84
85
  }
86
+ export var MONGO_CLIENT_CACHE = new Map();
87
+ export async function getMongoDBClient(connection) {
88
+ var cached = MONGO_CLIENT_CACHE.get(connection);
89
+ if (!cached) {
90
+ var client = new MongoClient(connection, MONGO_OPTIONS_DRIVER_INFO);
91
+ cached = {
92
+ client,
93
+ refCount: 1,
94
+ promise: client.connect().then(() => client)
95
+ };
96
+ MONGO_CLIENT_CACHE.set(connection, cached);
97
+ return cached.promise;
98
+ }
99
+ cached.refCount++;
100
+ if (cached.closeTimeout) {
101
+ clearTimeout(cached.closeTimeout);
102
+ cached.closeTimeout = undefined;
103
+ }
104
+ return cached.promise;
105
+ }
106
+ export async function closeMongoDBClient(connection) {
107
+ var cached = MONGO_CLIENT_CACHE.get(connection);
108
+ if (cached) {
109
+ cached.refCount--;
110
+ if (cached.refCount === 0) {
111
+ if (cached.closeTimeout) {
112
+ clearTimeout(cached.closeTimeout);
113
+ }
114
+ cached.closeTimeout = setTimeout(() => {
115
+ var innerCached = MONGO_CLIENT_CACHE.get(connection);
116
+ if (innerCached && innerCached.refCount === 0) {
117
+ MONGO_CLIENT_CACHE.delete(connection);
118
+ innerCached.client.close().catch(() => {});
119
+ }
120
+ }, 2000); // 2 second delay to allow reuse
121
+ }
122
+ }
123
+ }
85
124
  //# sourceMappingURL=mongodb-helper.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"mongodb-helper.js","names":["RXDB_VERSION","flatClone","getPrimaryFieldOfPrimaryKey","RX_STORAGE_NAME_MONGODB","MONGO_OPTIONS_DRIVER_INFO","driverInfo","name","version","MONGO_ID_SUBSTITUTE_FIELDNAME","primarySwapMongoDBQuerySelector","primaryKey","selector","Array","isArray","map","item","ret","Object","entries","forEach","k","v","_id","startsWith","prepareMongoDBQuery","schema","mutateableQuery","preparedQuery","query","mongoSelector","mongoSort","swapToMongoSort","sort","swapMongoToRxDoc","docData","value","swapRxDocToMongo","sortPart","key","direction","mongoKey","mongoDirection","getMongoDBIndexName","index","join"],"sources":["../../../../src/plugins/storage-mongodb/mongodb-helper.ts"],"sourcesContent":["import type {\r\n FilledMangoQuery,\r\n MangoQuerySelector,\r\n MangoQuerySortPart,\r\n RxDocumentData,\r\n RxJsonSchema\r\n} from '../../types/index.d.ts';\r\nimport {\r\n Sort as MongoSort\r\n} from 'mongodb';\r\nimport { RXDB_VERSION, flatClone } from '../utils/index.ts';\r\nimport { MongoDBPreparedQuery, MongoQuerySelector } from './mongodb-types.ts';\r\nimport { getPrimaryFieldOfPrimaryKey } from '../../rx-schema-helper.ts';\r\nexport const RX_STORAGE_NAME_MONGODB = 'mongodb';\r\n\r\nexport const MONGO_OPTIONS_DRIVER_INFO = {\r\n driverInfo: {\r\n name: 'RxDB',\r\n version: RXDB_VERSION\r\n }\r\n};\r\n\r\n/**\r\n * MongoDB uses the _id field by itself (max 12 bytes)\r\n * so we have to substitute the _id field if\r\n * it is used in the RxDocType.\r\n */\r\nexport const MONGO_ID_SUBSTITUTE_FIELDNAME = '__id';\r\n\r\nexport function primarySwapMongoDBQuerySelector<RxDocType>(\r\n primaryKey: keyof RxDocType,\r\n selector: MangoQuerySelector<RxDocType>\r\n): MongoQuerySelector<RxDocType> {\r\n selector = flatClone(selector);\r\n\r\n if (primaryKey !== '_id') {\r\n return selector as any;\r\n }\r\n if (Array.isArray(selector)) {\r\n return selector.map(item => primarySwapMongoDBQuerySelector(primaryKey, item)) as any;\r\n } else if (typeof selector === 'object') {\r\n const ret: any = {};\r\n Object.entries(selector).forEach(([k, v]) => {\r\n if (k === primaryKey) {\r\n ret._id = v;\r\n } else {\r\n if (k.startsWith('$')) {\r\n ret[k] = primarySwapMongoDBQuerySelector(primaryKey, v as any);\r\n } else {\r\n ret[k] = v;\r\n }\r\n }\r\n });\r\n return ret;\r\n } else {\r\n return selector;\r\n }\r\n}\r\n\r\n\r\nexport function prepareMongoDBQuery<RxDocType>(\r\n schema: RxJsonSchema<RxDocumentData<RxDocType>>,\r\n mutateableQuery: FilledMangoQuery<RxDocType>\r\n) {\r\n const primaryKey = getPrimaryFieldOfPrimaryKey(schema.primaryKey) as any;\r\n const preparedQuery: MongoDBPreparedQuery<RxDocType> = {\r\n query: mutateableQuery,\r\n mongoSelector: primarySwapMongoDBQuerySelector(\r\n primaryKey,\r\n mutateableQuery.selector\r\n ),\r\n mongoSort: swapToMongoSort(mutateableQuery.sort)\r\n };\r\n return preparedQuery;\r\n};\r\n\r\n\r\nexport function swapMongoToRxDoc<RxDocType>(\r\n docData: any\r\n): RxDocumentData<RxDocType> {\r\n docData = flatClone(docData);\r\n if ((docData as any)[MONGO_ID_SUBSTITUTE_FIELDNAME]) {\r\n const value = (docData as any)[MONGO_ID_SUBSTITUTE_FIELDNAME];\r\n delete (docData as any)[MONGO_ID_SUBSTITUTE_FIELDNAME];\r\n (docData as any)._id = value;\r\n } else {\r\n delete (docData as any)._id;\r\n }\r\n return docData;\r\n}\r\n\r\nexport function swapRxDocToMongo<RxDocType>(\r\n docData: RxDocumentData<RxDocType>\r\n): any {\r\n docData = flatClone(docData);\r\n if ((docData as any)._id) {\r\n const value = (docData as any)._id;\r\n delete (docData as any)._id;\r\n (docData as any)[MONGO_ID_SUBSTITUTE_FIELDNAME] = value;\r\n }\r\n return docData;\r\n}\r\n\r\nexport function swapToMongoSort<RxDocType>(\r\n sort: MangoQuerySortPart<RxDocType>[]\r\n): MongoSort {\r\n const ret: any = {};\r\n sort.forEach(sortPart => {\r\n const [key, direction] = Object.entries(sortPart)[0];\r\n const mongoKey = key === '_id' ? MONGO_ID_SUBSTITUTE_FIELDNAME : key;\r\n const mongoDirection = direction === 'asc' ? 1 : -1;\r\n ret[mongoKey] = mongoDirection;\r\n });\r\n return ret;\r\n}\r\n\r\nexport function getMongoDBIndexName(index: string[]): string {\r\n return index.join('|');\r\n}\r\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"mongodb-helper.js","names":["MongoClient","RXDB_VERSION","flatClone","getPrimaryFieldOfPrimaryKey","RX_STORAGE_NAME_MONGODB","MONGO_OPTIONS_DRIVER_INFO","driverInfo","name","version","MONGO_ID_SUBSTITUTE_FIELDNAME","primarySwapMongoDBQuerySelector","primaryKey","selector","Array","isArray","map","item","ret","Object","entries","forEach","k","v","_id","startsWith","prepareMongoDBQuery","schema","mutateableQuery","preparedQuery","query","mongoSelector","mongoSort","swapToMongoSort","sort","swapMongoToRxDoc","docData","value","swapRxDocToMongo","sortPart","key","direction","mongoKey","mongoDirection","getMongoDBIndexName","index","join","MONGO_CLIENT_CACHE","Map","getMongoDBClient","connection","cached","get","client","refCount","promise","connect","then","set","closeTimeout","clearTimeout","undefined","closeMongoDBClient","setTimeout","innerCached","delete","close","catch"],"sources":["../../../../src/plugins/storage-mongodb/mongodb-helper.ts"],"sourcesContent":["import type {\r\n FilledMangoQuery,\r\n MangoQuerySelector,\r\n MangoQuerySortPart,\r\n RxDocumentData,\r\n RxJsonSchema\r\n} from '../../types/index.d.ts';\r\nimport {\r\n Sort as MongoSort,\r\n MongoClient\r\n} from 'mongodb';\r\nimport { RXDB_VERSION, flatClone } from '../utils/index.ts';\r\nimport { MongoDBPreparedQuery, MongoQuerySelector } from './mongodb-types.ts';\r\nimport { getPrimaryFieldOfPrimaryKey } from '../../rx-schema-helper.ts';\r\nexport const RX_STORAGE_NAME_MONGODB = 'mongodb';\r\n\r\nexport const MONGO_OPTIONS_DRIVER_INFO = {\r\n driverInfo: {\r\n name: 'RxDB',\r\n version: RXDB_VERSION\r\n }\r\n};\r\n\r\n/**\r\n * MongoDB uses the _id field by itself (max 12 bytes)\r\n * so we have to substitute the _id field if\r\n * it is used in the RxDocType.\r\n */\r\nexport const MONGO_ID_SUBSTITUTE_FIELDNAME = '__id';\r\n\r\nexport function primarySwapMongoDBQuerySelector<RxDocType>(\r\n primaryKey: keyof RxDocType,\r\n selector: MangoQuerySelector<RxDocType>\r\n): MongoQuerySelector<RxDocType> {\r\n selector = flatClone(selector);\r\n\r\n if (primaryKey !== '_id') {\r\n return selector as any;\r\n }\r\n if (Array.isArray(selector)) {\r\n return selector.map(item => primarySwapMongoDBQuerySelector(primaryKey, item)) as any;\r\n } else if (typeof selector === 'object') {\r\n const ret: any = {};\r\n Object.entries(selector).forEach(([k, v]) => {\r\n if (k === primaryKey) {\r\n ret._id = v;\r\n } else {\r\n if (k.startsWith('$')) {\r\n ret[k] = primarySwapMongoDBQuerySelector(primaryKey, v as any);\r\n } else {\r\n ret[k] = v;\r\n }\r\n }\r\n });\r\n return ret;\r\n } else {\r\n return selector;\r\n }\r\n}\r\n\r\n\r\nexport function prepareMongoDBQuery<RxDocType>(\r\n schema: RxJsonSchema<RxDocumentData<RxDocType>>,\r\n mutateableQuery: FilledMangoQuery<RxDocType>\r\n) {\r\n const primaryKey = getPrimaryFieldOfPrimaryKey(schema.primaryKey) as any;\r\n const preparedQuery: MongoDBPreparedQuery<RxDocType> = {\r\n query: mutateableQuery,\r\n mongoSelector: primarySwapMongoDBQuerySelector(\r\n primaryKey,\r\n mutateableQuery.selector\r\n ),\r\n mongoSort: swapToMongoSort(mutateableQuery.sort)\r\n };\r\n return preparedQuery;\r\n};\r\n\r\n\r\nexport function swapMongoToRxDoc<RxDocType>(\r\n docData: any\r\n): RxDocumentData<RxDocType> {\r\n docData = flatClone(docData);\r\n if ((docData as any)[MONGO_ID_SUBSTITUTE_FIELDNAME]) {\r\n const value = (docData as any)[MONGO_ID_SUBSTITUTE_FIELDNAME];\r\n delete (docData as any)[MONGO_ID_SUBSTITUTE_FIELDNAME];\r\n (docData as any)._id = value;\r\n } else {\r\n delete (docData as any)._id;\r\n }\r\n return docData;\r\n}\r\n\r\nexport function swapRxDocToMongo<RxDocType>(\r\n docData: RxDocumentData<RxDocType>\r\n): any {\r\n docData = flatClone(docData);\r\n if ((docData as any)._id) {\r\n const value = (docData as any)._id;\r\n delete (docData as any)._id;\r\n (docData as any)[MONGO_ID_SUBSTITUTE_FIELDNAME] = value;\r\n }\r\n return docData;\r\n}\r\n\r\nexport function swapToMongoSort<RxDocType>(\r\n sort: MangoQuerySortPart<RxDocType>[]\r\n): MongoSort {\r\n const ret: any = {};\r\n sort.forEach(sortPart => {\r\n const [key, direction] = Object.entries(sortPart)[0];\r\n const mongoKey = key === '_id' ? MONGO_ID_SUBSTITUTE_FIELDNAME : key;\r\n const mongoDirection = direction === 'asc' ? 1 : -1;\r\n ret[mongoKey] = mongoDirection;\r\n });\r\n return ret;\r\n}\r\n\r\nexport function getMongoDBIndexName(index: string[]): string {\r\n return index.join('|');\r\n}\r\n\r\nexport const MONGO_CLIENT_CACHE = new Map<string, { client: MongoClient, refCount: number, promise: Promise<MongoClient>, closeTimeout?: ReturnType<typeof setTimeout> }>();\r\n\r\nexport async function getMongoDBClient(connection: string): Promise<MongoClient> {\r\n let cached = MONGO_CLIENT_CACHE.get(connection);\r\n if (!cached) {\r\n const client = new MongoClient(connection, MONGO_OPTIONS_DRIVER_INFO);\r\n cached = {\r\n client,\r\n refCount: 1,\r\n promise: client.connect().then(() => client)\r\n };\r\n MONGO_CLIENT_CACHE.set(connection, cached);\r\n return cached.promise;\r\n }\r\n cached.refCount++;\r\n if (cached.closeTimeout) {\r\n clearTimeout(cached.closeTimeout);\r\n cached.closeTimeout = undefined;\r\n }\r\n return cached.promise;\r\n}\r\n\r\nexport async function closeMongoDBClient(connection: string): Promise<void> {\r\n const cached = MONGO_CLIENT_CACHE.get(connection);\r\n if (cached) {\r\n cached.refCount--;\r\n if (cached.refCount === 0) {\r\n if (cached.closeTimeout) {\r\n clearTimeout(cached.closeTimeout);\r\n }\r\n cached.closeTimeout = setTimeout(() => {\r\n const innerCached = MONGO_CLIENT_CACHE.get(connection);\r\n if (innerCached && innerCached.refCount === 0) {\r\n MONGO_CLIENT_CACHE.delete(connection);\r\n innerCached.client.close().catch(() => { });\r\n }\r\n }, 2000); // 2 second delay to allow reuse\r\n }\r\n }\r\n}\r\n"],"mappings":"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","ignoreList":[]}
@@ -2,9 +2,8 @@ import _readOnlyError from "@babel/runtime/helpers/readOnlyError";
2
2
  import { BehaviorSubject, Subject, filter, firstValueFrom } from 'rxjs';
3
3
  import { getPrimaryFieldOfPrimaryKey } from "../../rx-schema-helper.js";
4
4
  import { ensureNotFalsy, getFromMapOrThrow, isMaybeReadonlyArray, now, PROMISE_RESOLVE_VOID, requestIdlePromise } from "../../plugins/utils/index.js";
5
- import { MongoClient } from 'mongodb';
6
5
  import { categorizeBulkWriteRows } from "../../rx-storage-helper.js";
7
- import { MONGO_ID_SUBSTITUTE_FIELDNAME, MONGO_OPTIONS_DRIVER_INFO, getMongoDBIndexName, prepareMongoDBQuery, swapMongoToRxDoc, swapRxDocToMongo } from "./mongodb-helper.js";
6
+ import { MONGO_ID_SUBSTITUTE_FIELDNAME, getMongoDBIndexName, prepareMongoDBQuery, swapMongoToRxDoc, swapRxDocToMongo, getMongoDBClient, closeMongoDBClient } from "./mongodb-helper.js";
8
7
  export var RxStorageInstanceMongoDB = /*#__PURE__*/function () {
9
8
  // public mongoChangeStream?: MongoChangeStream<any, ChangeStreamDocument<any>>;
10
9
 
@@ -21,7 +20,7 @@ export var RxStorageInstanceMongoDB = /*#__PURE__*/function () {
21
20
  * to RxDB
22
21
  */
23
22
 
24
- function RxStorageInstanceMongoDB(storage, databaseName, collectionName, schema, internals, options, settings) {
23
+ function RxStorageInstanceMongoDB(storage, databaseName, collectionName, schema, internals, options, settings, mongoClient) {
25
24
  this.changes$ = new Subject();
26
25
  this.runningOperations = new BehaviorSubject(0);
27
26
  this.writeQueue = PROMISE_RESOLVE_VOID;
@@ -33,12 +32,12 @@ export var RxStorageInstanceMongoDB = /*#__PURE__*/function () {
33
32
  this.internals = internals;
34
33
  this.options = options;
35
34
  this.settings = settings;
35
+ this.mongoClient = mongoClient;
36
36
  if (this.schema.attachments) {
37
37
  throw new Error('attachments not supported in mongodb storage, make a PR if you need that');
38
38
  }
39
39
  this.primaryPath = getPrimaryFieldOfPrimaryKey(this.schema.primaryKey);
40
40
  this.inMongoPrimaryPath = this.primaryPath === '_id' ? MONGO_ID_SUBSTITUTE_FIELDNAME : this.primaryPath;
41
- this.mongoClient = new MongoClient(storage.databaseSettings.connection, MONGO_OPTIONS_DRIVER_INFO);
42
41
  this.mongoDatabase = this.mongoClient.db(databaseName + '-v' + this.schema.version);
43
42
  var indexes = (this.schema.indexes ? this.schema.indexes.slice() : []).map(index => {
44
43
  var arIndex = isMaybeReadonlyArray(index) ? index.slice(0) : [index];
@@ -303,14 +302,15 @@ export var RxStorageInstanceMongoDB = /*#__PURE__*/function () {
303
302
  await this.mongoCollectionPromise;
304
303
  await firstValueFrom(this.runningOperations.pipe(filter(c => c === 0)));
305
304
  // await ensureNotFalsy(this.mongoChangeStream).close();
306
- await this.mongoClient.close();
305
+ await closeMongoDBClient(this.storage.databaseSettings.connection);
307
306
  })();
308
307
  return this.closed;
309
308
  };
310
309
  return RxStorageInstanceMongoDB;
311
310
  }();
312
- export function createMongoDBStorageInstance(storage, params, settings) {
313
- var instance = new RxStorageInstanceMongoDB(storage, params.databaseName, params.collectionName, params.schema, {}, params.options, settings);
314
- return Promise.resolve(instance);
311
+ export async function createMongoDBStorageInstance(storage, params, settings) {
312
+ var mongoClient = await getMongoDBClient(storage.databaseSettings.connection);
313
+ var instance = new RxStorageInstanceMongoDB(storage, params.databaseName, params.collectionName, params.schema, {}, params.options, settings, mongoClient);
314
+ return instance;
315
315
  }
316
316
  //# sourceMappingURL=rx-storage-instance-mongodb.js.map