@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
@@ -11,7 +11,7 @@ var _rxjs = require("rxjs");
11
11
  var _customIndex = require("../../custom-index.js");
12
12
  var _rxSchemaHelper = require("../../rx-schema-helper.js");
13
13
  var _rxStorageHelper = require("../../rx-storage-helper.js");
14
- var _index = require("../../plugins/utils/index.js");
14
+ var _index2 = require("../../plugins/utils/index.js");
15
15
  var _binarySearchBounds = require("./binary-search-bounds.js");
16
16
  var _memoryHelper = require("./memory-helper.js");
17
17
  var _memoryIndexes = require("./memory-indexes.js");
@@ -65,7 +65,7 @@ var RxStorageInstanceMemory = exports.RxStorageInstanceMemory = /*#__PURE__*/fun
65
65
  this.categorizedByWriteInput.set(documentWrites, categorized);
66
66
  this.internals.ensurePersistenceTask = categorized;
67
67
  if (!this.internals.ensurePersistenceIdlePromise) {
68
- this.internals.ensurePersistenceIdlePromise = (0, _index.requestIdlePromiseNoQueue)().then(() => {
68
+ this.internals.ensurePersistenceIdlePromise = (0, _index2.requestIdlePromiseNoQueue)().then(() => {
69
69
  this.internals.ensurePersistenceIdlePromise = undefined;
70
70
  this.ensurePersistence();
71
71
  });
@@ -76,7 +76,7 @@ var RxStorageInstanceMemory = exports.RxStorageInstanceMemory = /*#__PURE__*/fun
76
76
  * task has been added.
77
77
  */
78
78
  if (categorized.eventBulk.events.length > 0) {
79
- var lastState = (0, _index.ensureNotFalsy)(categorized.newestRow).document;
79
+ var lastState = (0, _index2.ensureNotFalsy)(categorized.newestRow).document;
80
80
  categorized.eventBulk.checkpoint = {
81
81
  id: lastState[primaryPath],
82
82
  lwt: lastState._meta.lwt
@@ -99,15 +99,15 @@ var RxStorageInstanceMemory = exports.RxStorageInstanceMemory = /*#__PURE__*/fun
99
99
  return;
100
100
  }
101
101
  var internals = this.internals;
102
- var documentsById = this.internals.documents;
103
102
  var primaryPath = this.primaryPath;
104
103
  var categorized = this.internals.ensurePersistenceTask;
105
104
  this.internals.ensurePersistenceTask = undefined;
106
105
 
107
106
  /**
108
107
  * Do inserts/updates
108
+ * @performance Use cached byIndexArray instead of Object.values()
109
109
  */
110
- var stateByIndex = Object.values(this.internals.byIndex);
110
+ var stateByIndex = internals.byIndexArray;
111
111
 
112
112
  /**
113
113
  * @performance Use batch insert for bulk inserts to avoid
@@ -124,7 +124,14 @@ var RxStorageInstanceMemory = exports.RxStorageInstanceMemory = /*#__PURE__*/fun
124
124
  var writeRow = bulkUpdateDocs[i];
125
125
  var doc = writeRow.document;
126
126
  var docId = doc[primaryPath];
127
- (0, _memoryHelper.putWriteRowToState)(docId, internals, stateByIndex, doc, documentsById.get(docId));
127
+ /**
128
+ * @performance
129
+ * Pass writeRow.previous directly as the old document state
130
+ * instead of re-looking it up from the documents Map.
131
+ * This is safe because categorizeBulkWriteRows already verified
132
+ * that previous._rev matches the document in the Map (conflict check).
133
+ */
134
+ (0, _memoryHelper.putWriteRowToState)(docId, internals, stateByIndex, doc, writeRow.previous);
128
135
  }
129
136
 
130
137
  /**
@@ -158,11 +165,23 @@ var RxStorageInstanceMemory = exports.RxStorageInstanceMemory = /*#__PURE__*/fun
158
165
  if (documentsById.size === 0) {
159
166
  return Promise.resolve(ret);
160
167
  }
161
- for (var i = 0; i < docIds.length; ++i) {
162
- var docId = docIds[i];
163
- var docInDb = documentsById.get(docId);
164
- if (docInDb && (!docInDb._deleted || withDeleted)) {
165
- ret.push(docInDb);
168
+ /**
169
+ * @performance
170
+ * Split into two paths to avoid checking withDeleted on every iteration.
171
+ */
172
+ if (withDeleted) {
173
+ for (var i = 0; i < docIds.length; ++i) {
174
+ var docInDb = documentsById.get(docIds[i]);
175
+ if (docInDb) {
176
+ ret.push(docInDb);
177
+ }
178
+ }
179
+ } else {
180
+ for (var _i = 0; _i < docIds.length; ++_i) {
181
+ var _docInDb = documentsById.get(docIds[_i]);
182
+ if (_docInDb && !_docInDb._deleted) {
183
+ ret.push(_docInDb);
184
+ }
166
185
  }
167
186
  }
168
187
  return Promise.resolve(ret);
@@ -190,8 +209,13 @@ var RxStorageInstanceMemory = exports.RxStorageInstanceMemory = /*#__PURE__*/fun
190
209
  throw new Error('index does not exist ' + indexName);
191
210
  }
192
211
  var docsWithIndex = this.internals.byIndex[indexName].docsWithIndex;
193
- var indexOfLower = (queryPlan.inclusiveStart ? _binarySearchBounds.boundGE : _binarySearchBounds.boundGT)(docsWithIndex, [lowerBoundString], _memoryHelper.compareDocsWithIndex);
194
- var indexOfUpper = (queryPlan.inclusiveEnd ? _binarySearchBounds.boundLE : _binarySearchBounds.boundLT)(docsWithIndex, [upperBoundString], _memoryHelper.compareDocsWithIndex);
212
+
213
+ /**
214
+ * @performance Use string-specialized binary search to avoid
215
+ * temporary array allocations on every query.
216
+ */
217
+ var indexOfLower = queryPlan.inclusiveStart ? (0, _binarySearchBounds.boundGEByIndexString)(docsWithIndex, lowerBoundString) : (0, _binarySearchBounds.boundGTByIndexString)(docsWithIndex, lowerBoundString);
218
+ var indexOfUpper = queryPlan.inclusiveEnd ? (0, _binarySearchBounds.boundLEByIndexString)(docsWithIndex, upperBoundString) : (0, _binarySearchBounds.boundLTByIndexString)(docsWithIndex, upperBoundString);
195
219
  var rows = [];
196
220
 
197
221
  /**
@@ -250,44 +274,74 @@ var RxStorageInstanceMemory = exports.RxStorageInstanceMemory = /*#__PURE__*/fun
250
274
  * If the selector is satisfied by the index,
251
275
  * we can compute the count directly from the index range
252
276
  * without extracting document data into an array.
277
+ * Uses string-specialized binary search to avoid allocations.
253
278
  */
254
279
  if (queryPlan.selectorSatisfiedByIndex) {
255
- var queryPlanFields = queryPlan.index;
256
- var index = queryPlanFields;
257
- var lowerBound = queryPlan.startKeys;
258
- var lowerBoundString = (0, _customIndex.getStartIndexStringFromLowerBound)(this.schema, index, lowerBound);
259
- var upperBound = queryPlan.endKeys;
260
- var upperBoundString = (0, _customIndex.getStartIndexStringFromUpperBound)(this.schema, index, upperBound);
261
- var indexName = (0, _memoryIndexes.getMemoryIndexName)(index);
262
- if (!this.internals.byIndex[indexName]) {
280
+ var _queryPlanFields = queryPlan.index;
281
+ var _index = _queryPlanFields;
282
+ var _lowerBound = queryPlan.startKeys;
283
+ var _lowerBoundString = (0, _customIndex.getStartIndexStringFromLowerBound)(this.schema, _index, _lowerBound);
284
+ var _upperBound = queryPlan.endKeys;
285
+ var _upperBoundString = (0, _customIndex.getStartIndexStringFromUpperBound)(this.schema, _index, _upperBound);
286
+ var _indexName = (0, _memoryIndexes.getMemoryIndexName)(_index);
287
+ if (!this.internals.byIndex[_indexName]) {
263
288
  throw (0, _rxError.newRxError)('SNH', {
264
289
  args: {
265
- indexName
290
+ indexName: _indexName
266
291
  }
267
292
  });
268
293
  }
269
- var docsWithIndex = this.internals.byIndex[indexName].docsWithIndex;
270
- var indexOfLower = (queryPlan.inclusiveStart ? _binarySearchBounds.boundGE : _binarySearchBounds.boundGT)(docsWithIndex, [lowerBoundString], _memoryHelper.compareDocsWithIndex);
271
- var indexOfUpper = (queryPlan.inclusiveEnd ? _binarySearchBounds.boundLE : _binarySearchBounds.boundLT)(docsWithIndex, [upperBoundString], _memoryHelper.compareDocsWithIndex);
272
- var _count = Math.max(0, indexOfUpper - indexOfLower + 1);
294
+ var _docsWithIndex = this.internals.byIndex[_indexName].docsWithIndex;
295
+ var _indexOfLower = queryPlan.inclusiveStart ? (0, _binarySearchBounds.boundGEByIndexString)(_docsWithIndex, _lowerBoundString) : (0, _binarySearchBounds.boundGTByIndexString)(_docsWithIndex, _lowerBoundString);
296
+ var _indexOfUpper = queryPlan.inclusiveEnd ? (0, _binarySearchBounds.boundLEByIndexString)(_docsWithIndex, _upperBoundString) : (0, _binarySearchBounds.boundLTByIndexString)(_docsWithIndex, _upperBoundString);
297
+ var _count = Math.max(0, _indexOfUpper - _indexOfLower + 1);
273
298
  return Promise.resolve({
274
299
  count: _count,
275
300
  mode: 'fast'
276
301
  });
277
302
  }
278
- return this.query(preparedQuery).then(result => ({
279
- count: result.documents.length,
303
+ var queryMatcher = (0, _rxQueryHelper.getQueryMatcher)(this.schema, preparedQuery.query);
304
+ var queryPlanFields = queryPlan.index;
305
+ var index = queryPlanFields;
306
+ var lowerBound = queryPlan.startKeys;
307
+ var lowerBoundString = (0, _customIndex.getStartIndexStringFromLowerBound)(this.schema, index, lowerBound);
308
+ var upperBound = queryPlan.endKeys;
309
+ var upperBoundString = (0, _customIndex.getStartIndexStringFromUpperBound)(this.schema, index, upperBound);
310
+ var indexName = (0, _memoryIndexes.getMemoryIndexName)(index);
311
+ if (!this.internals.byIndex[indexName]) {
312
+ throw (0, _rxError.newRxError)('SNH', {
313
+ args: {
314
+ indexName
315
+ }
316
+ });
317
+ }
318
+ var docsWithIndex = this.internals.byIndex[indexName].docsWithIndex;
319
+ var indexOfLower = queryPlan.inclusiveStart ? (0, _binarySearchBounds.boundGEByIndexString)(docsWithIndex, lowerBoundString) : (0, _binarySearchBounds.boundGTByIndexString)(docsWithIndex, lowerBoundString);
320
+ var indexOfUpper = queryPlan.inclusiveEnd ? (0, _binarySearchBounds.boundLEByIndexString)(docsWithIndex, upperBoundString) : (0, _binarySearchBounds.boundLTByIndexString)(docsWithIndex, upperBoundString);
321
+ var count = 0;
322
+ while (indexOfLower <= indexOfUpper) {
323
+ var currentRow = docsWithIndex[indexOfLower];
324
+ if (!currentRow) {
325
+ break;
326
+ }
327
+ if (queryMatcher(currentRow[1])) {
328
+ count++;
329
+ }
330
+ indexOfLower++;
331
+ }
332
+ return Promise.resolve({
333
+ count,
280
334
  mode: 'fast'
281
- }));
335
+ });
282
336
  };
283
337
  _proto.cleanup = function cleanup(minimumDeletedTime) {
284
338
  this.ensurePersistence();
285
- var maxDeletionTime = (0, _index.now)() - minimumDeletedTime;
339
+ var maxDeletionTime = (0, _index2.now)() - minimumDeletedTime;
286
340
  var index = ['_deleted', '_meta.lwt', this.primaryPath];
287
341
  var indexName = (0, _memoryIndexes.getMemoryIndexName)(index);
288
342
  var docsWithIndex = this.internals.byIndex[indexName].docsWithIndex;
289
343
  var lowerBoundString = (0, _customIndex.getStartIndexStringFromLowerBound)(this.schema, index, [true, 0, '']);
290
- var indexOfLower = (0, _binarySearchBounds.boundGT)(docsWithIndex, [lowerBoundString], _memoryHelper.compareDocsWithIndex);
344
+ var indexOfLower = (0, _binarySearchBounds.boundGTByIndexString)(docsWithIndex, lowerBoundString);
291
345
  var done = false;
292
346
  while (!done) {
293
347
  var currentDoc = docsWithIndex[indexOfLower];
@@ -295,10 +349,15 @@ var RxStorageInstanceMemory = exports.RxStorageInstanceMemory = /*#__PURE__*/fun
295
349
  done = true;
296
350
  } else {
297
351
  (0, _memoryHelper.removeDocFromState)(this.primaryPath, this.schema, this.internals, currentDoc[1]);
298
- indexOfLower++;
352
+ /**
353
+ * Do NOT increment indexOfLower after removal.
354
+ * removeDocFromState() splices the element out of the array,
355
+ * so the next element shifts into the current position.
356
+ * Incrementing would skip it.
357
+ */
299
358
  }
300
359
  }
301
- return _index.PROMISE_RESOLVE_TRUE;
360
+ return _index2.PROMISE_RESOLVE_TRUE;
302
361
  };
303
362
  _proto.getAttachmentData = function getAttachmentData(documentId, attachmentId, digest) {
304
363
  this.ensurePersistence();
@@ -328,11 +387,11 @@ var RxStorageInstanceMemory = exports.RxStorageInstanceMemory = /*#__PURE__*/fun
328
387
  OPEN_MEMORY_INSTANCES.delete(this);
329
388
  this.ensurePersistence();
330
389
  if (this.closed) {
331
- return _index.PROMISE_RESOLVE_VOID;
390
+ return _index2.PROMISE_RESOLVE_VOID;
332
391
  }
333
392
  this.closed = true;
334
393
  this.internals.refCount = this.internals.refCount - 1;
335
- return _index.PROMISE_RESOLVE_VOID;
394
+ return _index2.PROMISE_RESOLVE_VOID;
336
395
  };
337
396
  return RxStorageInstanceMemory;
338
397
  }();
@@ -341,13 +400,14 @@ function createMemoryStorageInstance(storage, params, settings) {
341
400
  var internals = storage.collectionStates.get(collectionKey);
342
401
  if (!internals) {
343
402
  internals = {
344
- id: (0, _index.randomToken)(5),
403
+ id: (0, _index2.randomToken)(5),
345
404
  schema: params.schema,
346
405
  removed: false,
347
406
  refCount: 1,
348
407
  documents: new Map(),
349
408
  attachments: params.schema.attachments ? new Map() : undefined,
350
409
  byIndex: {},
410
+ byIndexArray: [],
351
411
  changes$: new _rxjs.Subject()
352
412
  };
353
413
  (0, _memoryIndexes.addIndexesToInternalsState)(internals, params.schema);
@@ -360,7 +420,7 @@ function createMemoryStorageInstance(storage, params, settings) {
360
420
  * does not exist here, we have hard-to-debug problems
361
421
  * downstream.
362
422
  */
363
- if (params.devMode && !(0, _index.deepEqual)(internals.schema, params.schema)) {
423
+ if (params.devMode && !(0, _index2.deepEqual)(internals.schema, params.schema)) {
364
424
  throw new Error('storage was already created with a different schema');
365
425
  }
366
426
  internals.refCount = internals.refCount + 1;
@@ -1 +1 @@
1
- {"version":3,"file":"rx-storage-instance-memory.js","names":["_rxjs","require","_customIndex","_rxSchemaHelper","_rxStorageHelper","_index","_binarySearchBounds","_memoryHelper","_memoryIndexes","_rxQueryHelper","_rxError","OPEN_MEMORY_INSTANCES","exports","Set","RxStorageInstanceMemory","storage","databaseName","collectionName","schema","internals","options","settings","devMode","closed","categorizedByWriteInput","WeakMap","add","primaryPath","getPrimaryFieldOfPrimaryKey","primaryKey","_proto","prototype","bulkWrite","documentWrites","context","ensurePersistence","ensureNotRemoved","documentsById","documents","categorized","categorizeBulkWriteRows","error","errors","awaitMe","Promise","resolve","set","ensurePersistenceTask","ensurePersistenceIdlePromise","requestIdlePromiseNoQueue","then","undefined","eventBulk","events","length","lastState","ensureNotFalsy","newestRow","document","checkpoint","id","lwt","_meta","changes$","next","stateByIndex","Object","values","byIndex","bulkInsertDocs","bulkInsertToState","bulkUpdateDocs","i","writeRow","doc","docId","putWriteRowToState","get","attachments","attachmentsMap","attachmentsAdd","forEach","attachment","attachmentMapKey","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","getQueryMatcher","queryPlanFields","index","mustManuallyResort","sortSatisfiedByIndex","lowerBound","startKeys","lowerBoundString","getStartIndexStringFromLowerBound","upperBound","endKeys","upperBoundString","getStartIndexStringFromUpperBound","indexName","getMemoryIndexName","Error","docsWithIndex","indexOfLower","inclusiveStart","boundGE","boundGT","compareDocsWithIndex","indexOfUpper","inclusiveEnd","boundLE","boundLT","rows","rangeLength","extractLength","Math","min","Array","done","currentRow","currentDoc","sortComparator","getSortComparator","sort","slice","count","newRxError","args","max","mode","result","cleanup","minimumDeletedTime","maxDeletionTime","now","removeDocFromState","PROMISE_RESOLVE_TRUE","getAttachmentData","key","data","changeStream","asObservable","remove","removed","collectionStates","getMemoryCollectionKey","version","close","PROMISE_RESOLVE_VOID","refCount","createMemoryStorageInstance","params","collectionKey","randomToken","Map","Subject","addIndexesToInternalsState","deepEqual","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":["_rxjs","require","_customIndex","_rxSchemaHelper","_rxStorageHelper","_index2","_binarySearchBounds","_memoryHelper","_memoryIndexes","_rxQueryHelper","_rxError","OPEN_MEMORY_INSTANCES","exports","Set","RxStorageInstanceMemory","storage","databaseName","collectionName","schema","internals","options","settings","devMode","closed","categorizedByWriteInput","WeakMap","add","primaryPath","getPrimaryFieldOfPrimaryKey","primaryKey","_proto","prototype","bulkWrite","documentWrites","context","ensurePersistence","ensureNotRemoved","documentsById","documents","categorized","categorizeBulkWriteRows","error","errors","awaitMe","Promise","resolve","set","ensurePersistenceTask","ensurePersistenceIdlePromise","requestIdlePromiseNoQueue","then","undefined","eventBulk","events","length","lastState","ensureNotFalsy","newestRow","document","checkpoint","id","lwt","_meta","changes$","next","stateByIndex","byIndexArray","bulkInsertDocs","bulkInsertToState","bulkUpdateDocs","i","writeRow","doc","docId","putWriteRowToState","previous","attachments","attachmentsMap","attachmentsAdd","forEach","attachment","attachmentMapKey","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","getQueryMatcher","queryPlanFields","index","mustManuallyResort","sortSatisfiedByIndex","lowerBound","startKeys","lowerBoundString","getStartIndexStringFromLowerBound","upperBound","endKeys","upperBoundString","getStartIndexStringFromUpperBound","indexName","getMemoryIndexName","byIndex","Error","docsWithIndex","indexOfLower","inclusiveStart","boundGEByIndexString","boundGTByIndexString","indexOfUpper","inclusiveEnd","boundLEByIndexString","boundLTByIndexString","rows","rangeLength","extractLength","Math","min","Array","done","currentRow","currentDoc","sortComparator","getSortComparator","sort","slice","count","newRxError","args","max","mode","cleanup","minimumDeletedTime","maxDeletionTime","now","removeDocFromState","PROMISE_RESOLVE_TRUE","getAttachmentData","key","data","changeStream","asObservable","remove","removed","collectionStates","getMemoryCollectionKey","version","close","PROMISE_RESOLVE_VOID","refCount","createMemoryStorageInstance","params","collectionKey","randomToken","Map","Subject","addIndexesToInternalsState","deepEqual","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":[]}
@@ -3,13 +3,16 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.RX_STORAGE_NAME_MONGODB = exports.MONGO_OPTIONS_DRIVER_INFO = exports.MONGO_ID_SUBSTITUTE_FIELDNAME = void 0;
6
+ exports.RX_STORAGE_NAME_MONGODB = exports.MONGO_OPTIONS_DRIVER_INFO = exports.MONGO_ID_SUBSTITUTE_FIELDNAME = exports.MONGO_CLIENT_CACHE = void 0;
7
+ exports.closeMongoDBClient = closeMongoDBClient;
8
+ exports.getMongoDBClient = getMongoDBClient;
7
9
  exports.getMongoDBIndexName = getMongoDBIndexName;
8
10
  exports.prepareMongoDBQuery = prepareMongoDBQuery;
9
11
  exports.primarySwapMongoDBQuerySelector = primarySwapMongoDBQuerySelector;
10
12
  exports.swapMongoToRxDoc = swapMongoToRxDoc;
11
13
  exports.swapRxDocToMongo = swapRxDocToMongo;
12
14
  exports.swapToMongoSort = swapToMongoSort;
15
+ var _mongodb = require("mongodb");
13
16
  var _index = require("../utils/index.js");
14
17
  var _rxSchemaHelper = require("../../rx-schema-helper.js");
15
18
  var RX_STORAGE_NAME_MONGODB = exports.RX_STORAGE_NAME_MONGODB = 'mongodb';
@@ -94,4 +97,42 @@ function swapToMongoSort(sort) {
94
97
  function getMongoDBIndexName(index) {
95
98
  return index.join('|');
96
99
  }
100
+ var MONGO_CLIENT_CACHE = exports.MONGO_CLIENT_CACHE = new Map();
101
+ async function getMongoDBClient(connection) {
102
+ var cached = MONGO_CLIENT_CACHE.get(connection);
103
+ if (!cached) {
104
+ var client = new _mongodb.MongoClient(connection, MONGO_OPTIONS_DRIVER_INFO);
105
+ cached = {
106
+ client,
107
+ refCount: 1,
108
+ promise: client.connect().then(() => client)
109
+ };
110
+ MONGO_CLIENT_CACHE.set(connection, cached);
111
+ return cached.promise;
112
+ }
113
+ cached.refCount++;
114
+ if (cached.closeTimeout) {
115
+ clearTimeout(cached.closeTimeout);
116
+ cached.closeTimeout = undefined;
117
+ }
118
+ return cached.promise;
119
+ }
120
+ async function closeMongoDBClient(connection) {
121
+ var cached = MONGO_CLIENT_CACHE.get(connection);
122
+ if (cached) {
123
+ cached.refCount--;
124
+ if (cached.refCount === 0) {
125
+ if (cached.closeTimeout) {
126
+ clearTimeout(cached.closeTimeout);
127
+ }
128
+ cached.closeTimeout = setTimeout(() => {
129
+ var innerCached = MONGO_CLIENT_CACHE.get(connection);
130
+ if (innerCached && innerCached.refCount === 0) {
131
+ MONGO_CLIENT_CACHE.delete(connection);
132
+ innerCached.client.close().catch(() => {});
133
+ }
134
+ }, 2000); // 2 second delay to allow reuse
135
+ }
136
+ }
137
+ }
97
138
  //# sourceMappingURL=mongodb-helper.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"mongodb-helper.js","names":["_index","require","_rxSchemaHelper","RX_STORAGE_NAME_MONGODB","exports","MONGO_OPTIONS_DRIVER_INFO","driverInfo","name","version","RXDB_VERSION","MONGO_ID_SUBSTITUTE_FIELDNAME","primarySwapMongoDBQuerySelector","primaryKey","selector","flatClone","Array","isArray","map","item","ret","Object","entries","forEach","k","v","_id","startsWith","prepareMongoDBQuery","schema","mutateableQuery","getPrimaryFieldOfPrimaryKey","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":";;;;;;;;;;;;AAUA,IAAAA,MAAA,GAAAC,OAAA;AAEA,IAAAC,eAAA,GAAAD,OAAA;AACO,IAAME,uBAAuB,GAAAC,OAAA,CAAAD,uBAAA,GAAG,SAAS;AAEzC,IAAME,yBAAyB,GAAAD,OAAA,CAAAC,yBAAA,GAAG;EACrCC,UAAU,EAAE;IACRC,IAAI,EAAE,MAAM;IACZC,OAAO,EAAEC;EACb;AACJ,CAAC;;AAED;AACA;AACA;AACA;AACA;AACO,IAAMC,6BAA6B,GAAAN,OAAA,CAAAM,6BAAA,GAAG,MAAM;AAE5C,SAASC,+BAA+BA,CAC3CC,UAA2B,EAC3BC,QAAuC,EACV;EAC7BA,QAAQ,GAAG,IAAAC,gBAAS,EAACD,QAAQ,CAAC;EAE9B,IAAID,UAAU,KAAK,KAAK,EAAE;IACtB,OAAOC,QAAQ;EACnB;EACA,IAAIE,KAAK,CAACC,OAAO,CAACH,QAAQ,CAAC,EAAE;IACzB,OAAOA,QAAQ,CAACI,GAAG,CAACC,IAAI,IAAIP,+BAA+B,CAACC,UAAU,EAAEM,IAAI,CAAC,CAAC;EAClF,CAAC,MAAM,IAAI,OAAOL,QAAQ,KAAK,QAAQ,EAAE;IACrC,IAAMM,GAAQ,GAAG,CAAC,CAAC;IACnBC,MAAM,CAACC,OAAO,CAACR,QAAQ,CAAC,CAACS,OAAO,CAAC,CAAC,CAACC,CAAC,EAAEC,CAAC,CAAC,KAAK;MACzC,IAAID,CAAC,KAAKX,UAAU,EAAE;QAClBO,GAAG,CAACM,GAAG,GAAGD,CAAC;MACf,CAAC,MAAM;QACH,IAAID,CAAC,CAACG,UAAU,CAAC,GAAG,CAAC,EAAE;UACnBP,GAAG,CAACI,CAAC,CAAC,GAAGZ,+BAA+B,CAACC,UAAU,EAAEY,CAAQ,CAAC;QAClE,CAAC,MAAM;UACHL,GAAG,CAACI,CAAC,CAAC,GAAGC,CAAC;QACd;MACJ;IACJ,CAAC,CAAC;IACF,OAAOL,GAAG;EACd,CAAC,MAAM;IACH,OAAON,QAAQ;EACnB;AACJ;AAGO,SAASc,mBAAmBA,CAC/BC,MAA+C,EAC/CC,eAA4C,EAC9C;EACE,IAAMjB,UAAU,GAAG,IAAAkB,2CAA2B,EAACF,MAAM,CAAChB,UAAU,CAAQ;EACxE,IAAMmB,aAA8C,GAAG;IACnDC,KAAK,EAAEH,eAAe;IACtBI,aAAa,EAAEtB,+BAA+B,CAC1CC,UAAU,EACViB,eAAe,CAAChB,QACpB,CAAC;IACDqB,SAAS,EAAEC,eAAe,CAACN,eAAe,CAACO,IAAI;EACnD,CAAC;EACD,OAAOL,aAAa;AACxB;AAAC;AAGM,SAASM,gBAAgBA,CAC5BC,OAAY,EACa;EACzBA,OAAO,GAAG,IAAAxB,gBAAS,EAACwB,OAAO,CAAC;EAC5B,IAAKA,OAAO,CAAS5B,6BAA6B,CAAC,EAAE;IACjD,IAAM6B,KAAK,GAAID,OAAO,CAAS5B,6BAA6B,CAAC;IAC7D,OAAQ4B,OAAO,CAAS5B,6BAA6B,CAAC;IACrD4B,OAAO,CAASb,GAAG,GAAGc,KAAK;EAChC,CAAC,MAAM;IACH,OAAQD,OAAO,CAASb,GAAG;EAC/B;EACA,OAAOa,OAAO;AAClB;AAEO,SAASE,gBAAgBA,CAC5BF,OAAkC,EAC/B;EACHA,OAAO,GAAG,IAAAxB,gBAAS,EAACwB,OAAO,CAAC;EAC5B,IAAKA,OAAO,CAASb,GAAG,EAAE;IACtB,IAAMc,KAAK,GAAID,OAAO,CAASb,GAAG;IAClC,OAAQa,OAAO,CAASb,GAAG;IAC1Ba,OAAO,CAAS5B,6BAA6B,CAAC,GAAG6B,KAAK;EAC3D;EACA,OAAOD,OAAO;AAClB;AAEO,SAASH,eAAeA,CAC3BC,IAAqC,EAC5B;EACT,IAAMjB,GAAQ,GAAG,CAAC,CAAC;EACnBiB,IAAI,CAACd,OAAO,CAACmB,QAAQ,IAAI;IACrB,IAAM,CAACC,GAAG,EAAEC,SAAS,CAAC,GAAGvB,MAAM,CAACC,OAAO,CAACoB,QAAQ,CAAC,CAAC,CAAC,CAAC;IACpD,IAAMG,QAAQ,GAAGF,GAAG,KAAK,KAAK,GAAGhC,6BAA6B,GAAGgC,GAAG;IACpE,IAAMG,cAAc,GAAGF,SAAS,KAAK,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC;IACnDxB,GAAG,CAACyB,QAAQ,CAAC,GAAGC,cAAc;EAClC,CAAC,CAAC;EACF,OAAO1B,GAAG;AACd;AAEO,SAAS2B,mBAAmBA,CAACC,KAAe,EAAU;EACzD,OAAOA,KAAK,CAACC,IAAI,CAAC,GAAG,CAAC;AAC1B","ignoreList":[]}
1
+ {"version":3,"file":"mongodb-helper.js","names":["_mongodb","require","_index","_rxSchemaHelper","RX_STORAGE_NAME_MONGODB","exports","MONGO_OPTIONS_DRIVER_INFO","driverInfo","name","version","RXDB_VERSION","MONGO_ID_SUBSTITUTE_FIELDNAME","primarySwapMongoDBQuerySelector","primaryKey","selector","flatClone","Array","isArray","map","item","ret","Object","entries","forEach","k","v","_id","startsWith","prepareMongoDBQuery","schema","mutateableQuery","getPrimaryFieldOfPrimaryKey","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","MongoClient","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":[]}
@@ -10,7 +10,6 @@ var _readOnlyError2 = _interopRequireDefault(require("@babel/runtime/helpers/rea
10
10
  var _rxjs = require("rxjs");
11
11
  var _rxSchemaHelper = require("../../rx-schema-helper.js");
12
12
  var _index = require("../../plugins/utils/index.js");
13
- var _mongodb = require("mongodb");
14
13
  var _rxStorageHelper = require("../../rx-storage-helper.js");
15
14
  var _mongodbHelper = require("./mongodb-helper.js");
16
15
  var RxStorageInstanceMongoDB = exports.RxStorageInstanceMongoDB = /*#__PURE__*/function () {
@@ -29,7 +28,7 @@ var RxStorageInstanceMongoDB = exports.RxStorageInstanceMongoDB = /*#__PURE__*/f
29
28
  * to RxDB
30
29
  */
31
30
 
32
- function RxStorageInstanceMongoDB(storage, databaseName, collectionName, schema, internals, options, settings) {
31
+ function RxStorageInstanceMongoDB(storage, databaseName, collectionName, schema, internals, options, settings, mongoClient) {
33
32
  this.changes$ = new _rxjs.Subject();
34
33
  this.runningOperations = new _rxjs.BehaviorSubject(0);
35
34
  this.writeQueue = _index.PROMISE_RESOLVE_VOID;
@@ -41,12 +40,12 @@ var RxStorageInstanceMongoDB = exports.RxStorageInstanceMongoDB = /*#__PURE__*/f
41
40
  this.internals = internals;
42
41
  this.options = options;
43
42
  this.settings = settings;
43
+ this.mongoClient = mongoClient;
44
44
  if (this.schema.attachments) {
45
45
  throw new Error('attachments not supported in mongodb storage, make a PR if you need that');
46
46
  }
47
47
  this.primaryPath = (0, _rxSchemaHelper.getPrimaryFieldOfPrimaryKey)(this.schema.primaryKey);
48
48
  this.inMongoPrimaryPath = this.primaryPath === '_id' ? _mongodbHelper.MONGO_ID_SUBSTITUTE_FIELDNAME : this.primaryPath;
49
- this.mongoClient = new _mongodb.MongoClient(storage.databaseSettings.connection, _mongodbHelper.MONGO_OPTIONS_DRIVER_INFO);
50
49
  this.mongoDatabase = this.mongoClient.db(databaseName + '-v' + this.schema.version);
51
50
  var indexes = (this.schema.indexes ? this.schema.indexes.slice() : []).map(index => {
52
51
  var arIndex = (0, _index.isMaybeReadonlyArray)(index) ? index.slice(0) : [index];
@@ -311,14 +310,15 @@ var RxStorageInstanceMongoDB = exports.RxStorageInstanceMongoDB = /*#__PURE__*/f
311
310
  await this.mongoCollectionPromise;
312
311
  await (0, _rxjs.firstValueFrom)(this.runningOperations.pipe((0, _rxjs.filter)(c => c === 0)));
313
312
  // await ensureNotFalsy(this.mongoChangeStream).close();
314
- await this.mongoClient.close();
313
+ await (0, _mongodbHelper.closeMongoDBClient)(this.storage.databaseSettings.connection);
315
314
  })();
316
315
  return this.closed;
317
316
  };
318
317
  return RxStorageInstanceMongoDB;
319
318
  }();
320
- function createMongoDBStorageInstance(storage, params, settings) {
321
- var instance = new RxStorageInstanceMongoDB(storage, params.databaseName, params.collectionName, params.schema, {}, params.options, settings);
322
- return Promise.resolve(instance);
319
+ async function createMongoDBStorageInstance(storage, params, settings) {
320
+ var mongoClient = await (0, _mongodbHelper.getMongoDBClient)(storage.databaseSettings.connection);
321
+ var instance = new RxStorageInstanceMongoDB(storage, params.databaseName, params.collectionName, params.schema, {}, params.options, settings, mongoClient);
322
+ return instance;
323
323
  }
324
324
  //# sourceMappingURL=rx-storage-instance-mongodb.js.map