@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
package/AGENTS.md CHANGED
@@ -40,6 +40,10 @@
40
40
  - AVOID rhetorical questions.
41
41
  - AVOID specific words like: very, really, literally, actually, certainly, probably, basically, delve, embark, enlightening, esteemed, shed light, craft, creative, imagine, realm, game-changer, unlock, discover, skyrocket, abyss, not alone, in a world where, revolutionize, disruptive, utilize, utilizing, dive deep, tapestry, illuminate, unveil, pivotal, intricate, elucidate, hence, furthermore, realm, however, harness, exciting, groundbreaking, cutting-edge, remarkable, it remains to be seen, glimpse into, navigating, landscape, stark, testament, in summary, in conclusion, moreover, boost, skyrocket, opened up, powerful, inquiries, ever-evolving.
42
42
  - Review your response and ensure no em dashes.
43
+ - MUST format FAQ sections using HTML `<details>` and `<summary>` tags. Ensure there is an empty line before and after the inner markdown content so it parses correctly.
44
+ - SHOULD try to use components from the `docs-src/src/components` folder when writing docs.
45
+
46
+
43
47
 
44
48
  ## Development Workflow
45
49
  1. Make changes
package/CHANGELOG.md CHANGED
@@ -5,14 +5,57 @@
5
5
 
6
6
  <!-- ADD new changes here! -->
7
7
 
8
- ### 17.0.0-beta.17 (11 March 2026)
9
-
10
- - A list of changes for RxDB v17 can be found [here](https://rxdb.info/releases/17.0.0.html)
11
-
12
8
  <!-- /CHANGELOG NEWEST -->
13
9
 
14
10
  <!-- RELEASE BELOW -->
15
11
 
12
+ ### 17.1.0 (2 April 2026)
13
+
14
+ - FIX CRDT plugin `bulkInsert` hook not including schema default values in CRDT operations, causing data loss during conflict resolution rebuild when fields rely on schema defaults
15
+ - FIX `RxDocument.get$()` on nested object/array paths emitting spurious values when unrelated document fields changed, because `distinctUntilChanged()` used reference equality which always fails for non-primitive values across document revisions
16
+ - FIX `incrementalUpsert()` throwing a CONFLICT error when a concurrent `upsert()`/`insert()` creates the same document between the internal `findOne()` and `insert()` calls
17
+ - FIX `upsertLocal()` on a previously removed local document keeping the document in deleted state instead of un-deleting it
18
+ - FIX push-only replication losing local writes that occur during a pause because `reSync()` events were filtered out when no pull handler was configured
19
+ - FIX `getStartIndexStringFromUpperBound()` incorrectly mapping `INDEX_MIN` to `'1'` for boolean index fields, causing queries with exclusive bounds (`$gt`/`$lt`) on a field preceding a boolean index field to include boundary documents in the results
20
+ - FIX leader-election plugin not calling `die()` on the LeaderElector when the database is closed, because `LEADER_ELECTORS_OF_DB` was never populated due to a dead code branch
21
+ - FIX encryption plugin schema transformation not correctly handling nested dot-notation encrypted paths (e.g. `'nested.field'`), causing validation failures when using a validator storage with non-string nested encrypted fields
22
+ - FIX dev-mode `checkSchema()` not validating composite primary key fields for encryption (SC15), index (SC13), unique (SC14), and type (SC16) constraints because it compared property names against the primaryKey object instead of resolving the primary field path
23
+ - FIX `findOne().remove()` crashing with `TypeError: Cannot read properties of null` when no document matches the query, instead of returning `null`
24
+ - ADD `findOne().remove(true)` to throw when no document matches, consistent with `findOne().exec(true)`
25
+ - FIX schema migration losing `_deleted` state when migration strategy returns a new object, causing deleted documents to be resurrected after migration
26
+ - FIX `RxPipeline.remove()` not properly cleaning up checkpoint when called during active processing, causing a re-added pipeline with the same identifier to skip already-processed documents instead of starting fresh
27
+ - FIX cleanup plugin prematurely exiting its retry loop when `storageInstance.cleanup()` returns `false` (batched cleanup), because `Array.find()` returns the found value `false` and `!false` evaluates to `true`, causing `isDone` to be set incorrectly
28
+ - FIX encryption plugin `validatePassword()` leaking the plaintext password in `RxError` parameters and error messages when password validation fails
29
+ - FIX `database.remove()` not calling collection `onRemove` handlers, because `close()` unsubscribed all listeners before the remove operation could trigger them
30
+ - FIX query-builder `eq()`/`equals()` silently overwriting other operator conditions on the same field because the value was stored as a raw primitive instead of using the `$eq` operator form
31
+ - FIX `deleted$` observable emitting on every document revision instead of only when the deleted state changes, by adding `distinctUntilChanged()`
32
+ - FIX `postSave` collection hook not receiving the RxDocument instance as the second argument, unlike `postInsert` and `postRemove` which correctly pass it
33
+ - FIX `getJsonSchemaWithoutMeta()` not removing `_rev` from schema properties, while correctly removing other internal meta properties (`_deleted`, `_meta`, `_attachments`)
34
+ - FIX `allAttachments$` observable emitting attachments with a stale document reference, causing `attachment.doc` to point to an outdated document version instead of the latest one
35
+ - FIX RxState not correctly recovering full-state replacements (via `set('', modifier)`) from disk on database reopen, causing corrupted state
36
+
37
+ - FIX memory storage `count()` returning incorrect results when the selector is not fully satisfied by the index and the query has a `limit` set
38
+
39
+ - FIX `replicateRxCollection().remove()` on a never-started replication now creates the meta instance and deletes its data instead of skipping cleanup
40
+ - FIX `REPLICATION_STATE_BY_COLLECTION` not cleaned up on `cancel()`/`remove()`, leaking replication state references
41
+ - FIX floating-point rounding overflow in index string decimal generation, where `Math.round` could produce a value equal to the multiplier (e.g. 10 instead of max 9), creating a string one character too long and breaking sort order in compound indexes
42
+ - FIX `normalizeMangoQuery()` skipped fully-matching indexes when choosing default sort order, falling back to the first index instead of using the best match
43
+ - FIX RxState `set('', modifier)` passed `undefined` to the modifier instead of the current state
44
+ - FIX `RxMigrationStatus.count.percent` returning `NaN` instead of `100` when migrating a collection with 0 documents
45
+ - FIX `fillWithDefaultSettings()` index deduplication was broken because `Array.filter()` return value was discarded, causing duplicate indexes in schemas when user-defined indexes become identical after adding `_deleted` prefix and primary key suffix
46
+ - FIX encryption plugin not stripping type-specific schema keywords (`maxLength`, `required`, `items`, etc.) from encrypted fields, causing validation errors when using a validator storage with encryption
47
+ - FIX incorrect index string generation for negative decimal numbers causing wrong sort order and query results
48
+ - FIX `rateQueryPlan()` evaluated `startKeys` twice instead of `endKeys`, causing suboptimal index selection for `$lt`/`$lte` queries.
49
+ - FIX event-reduce mutating cached `docsDataMap` causing missing documents after insert-delete cycles
50
+ - FIX `modify()` not deep-cloning document data, allowing the modifier to corrupt internal state via shared nested references
51
+ - FIX `fillObjectWithDefaults` shared mutable references for non-primitive schema defaults (arrays/objects) causing corrupted values on subsequent inserts
52
+
53
+ ### 17.0.0 (30 March 2026)
54
+
55
+ 🚀 **RxDB v17 is released**
56
+
57
+ - A list of changes for RxDB v17 can be found [here](https://rxdb.info/releases/17.0.0.html)
58
+
16
59
  ### 16.21.1 (2 December 2025)
17
60
 
18
61
  - feat: replication-supabase querybuilder [#7566](https://github.com/pubkey/rxdb/pull/7566)
package/CLAUDE.md CHANGED
@@ -61,3 +61,5 @@ npm run check-types
61
61
  - AVOID rhetorical questions.
62
62
  - AVOID specific words like: very, really, literally, actually, certainly, probably, basically, delve, embark, enlightening, esteemed, shed light, craft, creative, imagine, realm, game-changer, unlock, discover, skyrocket, abyss, not alone, in a world where, revolutionize, disruptive, utilize, utilizing, dive deep, tapestry, illuminate, unveil, pivotal, intricate, elucidate, hence, furthermore, realm, however, harness, exciting, groundbreaking, cutting-edge, remarkable, it remains to be seen, glimpse into, navigating, landscape, stark, testament, in summary, in conclusion, moreover, boost, skyrocket, opened up, powerful, inquiries, ever-evolving.
63
63
  - Review your response and ensure no em dashes.
64
+ - MUST format FAQ sections using HTML `<details>` and `<summary>` tags. Ensure there is an empty line before and after the inner markdown content so it parses correctly.
65
+ - SHOULD try to use components from the `docs-src/src/components` folder when writing docs.
@@ -7,6 +7,7 @@ exports.ChangeEventBuffer = void 0;
7
7
  exports.createChangeEventBuffer = createChangeEventBuffer;
8
8
  var _operators = require("rxjs/operators");
9
9
  var _index = require("./plugins/utils/index.js");
10
+ var _rxError = require("./rx-error.js");
10
11
  /**
11
12
  * a buffer-cache which holds the last X changeEvents of the collection
12
13
  */
@@ -117,7 +118,7 @@ var ChangeEventBuffer = exports.ChangeEventBuffer = /*#__PURE__*/function () {
117
118
  this.processTasks();
118
119
  var ret = this.getFrom(pointer);
119
120
  if (ret === null) {
120
- throw new Error('out of bounds');
121
+ throw (0, _rxError.newRxError)('COB1');
121
122
  } else {
122
123
  ret.forEach(cE => fn(cE));
123
124
  }
@@ -1 +1 @@
1
- {"version":3,"file":"change-event-buffer.js","names":["_operators","require","_index","ChangeEventBuffer","exports","collection","subs","counter","eventCounterMap","WeakMap","buffer","limit","tasks","Set","push","eventBulks$","pipe","filter","bulk","isLocal","subscribe","eventBulk","add","_handleChangeEvents","events","size","requestIdlePromiseNoQueue","then","processTasks","_proto","prototype","Array","from","forEach","task","clear","counterBefore","length","slice","concat","counterBase","index","event","set","getCounter","getBuffer","getArrayIndexByPointer","pointer","oldestEvent","oldestCounter","get","rest","getFrom","ret","currentIndex","nextEvent","runFrom","fn","Error","cE","reduceByLastOfDoc","changeEvents","close","sub","unsubscribe","createChangeEventBuffer"],"sources":["../../src/change-event-buffer.ts"],"sourcesContent":["/**\r\n * a buffer-cache which holds the last X changeEvents of the collection\r\n */\r\nimport {\r\n Subscription\r\n} from 'rxjs';\r\nimport { filter } from 'rxjs/operators';\r\nimport type {\r\n RxChangeEventBulk,\r\n RxCollection,\r\n RxStorageChangeEvent\r\n} from './types/index.d.ts';\r\nimport {\r\n requestIdlePromiseNoQueue\r\n} from './plugins/utils/index.ts';\r\n\r\n\r\n/**\r\n * This buffer rembemers previous change events\r\n * so that queries can use them on .exec()\r\n * to calculate the new result set via event-reduce instead\r\n * of running the query against the storage.\r\n */\r\nexport class ChangeEventBuffer<RxDocType> {\r\n /**\r\n * These properties are private to ensure they cannot\r\n * be read without first processing the lazy tasks.\r\n */\r\n private subs: Subscription[] = [];\r\n private counter: number = 0;\r\n private eventCounterMap: WeakMap<\r\n RxStorageChangeEvent<RxDocType>,\r\n number\r\n > = new WeakMap();\r\n /**\r\n * array with changeEvents\r\n * starts with oldest known event, ends with newest\r\n */\r\n private buffer: RxStorageChangeEvent<RxDocType>[] = [];\r\n\r\n public limit: number = 100;\r\n\r\n\r\n\r\n private tasks = new Set<Function>();\r\n\r\n constructor(\r\n public collection: RxCollection\r\n ) {\r\n this.subs.push(\r\n this.collection.eventBulks$.pipe(\r\n filter((bulk: RxChangeEventBulk<RxDocType>) => !bulk.isLocal)\r\n ).subscribe((eventBulk: RxChangeEventBulk<RxDocType>) => {\r\n this.tasks.add(() => this._handleChangeEvents(eventBulk.events));\r\n if (this.tasks.size <= 1) {\r\n requestIdlePromiseNoQueue().then(() => {\r\n this.processTasks();\r\n });\r\n }\r\n })\r\n );\r\n }\r\n\r\n private processTasks() {\r\n if (this.tasks.size === 0) {\r\n return;\r\n }\r\n const tasks = Array.from(this.tasks);\r\n tasks.forEach(task => task());\r\n this.tasks.clear();\r\n }\r\n\r\n private _handleChangeEvents(events: RxStorageChangeEvent<RxDocType>[]) {\r\n const counterBefore = this.counter;\r\n this.counter = this.counter + events.length;\r\n if (events.length > this.limit) {\r\n this.buffer = events.slice(events.length * -1);\r\n } else {\r\n this.buffer = this.buffer.concat(events);\r\n this.buffer = this.buffer.slice(this.limit * -1);\r\n }\r\n const counterBase = counterBefore + 1;\r\n const eventCounterMap = this.eventCounterMap;\r\n for (let index = 0; index < events.length; index++) {\r\n const event = events[index];\r\n eventCounterMap.set(event, counterBase + index);\r\n }\r\n }\r\n\r\n getCounter() {\r\n this.processTasks();\r\n return this.counter;\r\n }\r\n getBuffer() {\r\n this.processTasks();\r\n return this.buffer;\r\n }\r\n\r\n /**\r\n * gets the array-index for the given pointer\r\n * @return arrayIndex which can be used to iterate from there. If null, pointer is out of lower bound\r\n */\r\n getArrayIndexByPointer(pointer: number): number | null {\r\n this.processTasks();\r\n const oldestEvent = this.buffer[0];\r\n const oldestCounter = this.eventCounterMap.get(\r\n oldestEvent\r\n ) as number;\r\n\r\n if (pointer < oldestCounter)\r\n return null; // out of bounds\r\n\r\n const rest = pointer - oldestCounter;\r\n return rest;\r\n }\r\n\r\n /**\r\n * get all changeEvents which came in later than the pointer-event\r\n * @return array with change-events. If null, pointer out of bounds\r\n */\r\n getFrom(pointer: number): RxStorageChangeEvent<RxDocType>[] | null {\r\n this.processTasks();\r\n const ret = [];\r\n let currentIndex = this.getArrayIndexByPointer(pointer);\r\n if (currentIndex === null) // out of bounds\r\n return null;\r\n\r\n while (true) {\r\n const nextEvent = this.buffer[currentIndex];\r\n currentIndex++;\r\n if (!nextEvent) {\r\n return ret;\r\n } else {\r\n ret.push(nextEvent);\r\n }\r\n }\r\n }\r\n\r\n runFrom(pointer: number, fn: Function) {\r\n this.processTasks();\r\n const ret = this.getFrom(pointer);\r\n if (ret === null) {\r\n throw new Error('out of bounds');\r\n } else {\r\n ret.forEach(cE => fn(cE));\r\n }\r\n }\r\n\r\n /**\r\n * no matter how many operations are done on one document,\r\n * only the last operation has to be checked to calculate the new state\r\n * this function reduces the events to the last ChangeEvent of each doc.\r\n * This functionality is currently disabled. It is questionable if\r\n * pre-merging the events would really be faster or actually slower.\r\n */\r\n reduceByLastOfDoc(changeEvents: RxStorageChangeEvent<RxDocType>[]): RxStorageChangeEvent<RxDocType>[] {\r\n this.processTasks();\r\n return changeEvents.slice(0);\r\n }\r\n\r\n close() {\r\n this.tasks.clear();\r\n this.subs.forEach(sub => sub.unsubscribe());\r\n }\r\n}\r\n\r\nexport function createChangeEventBuffer<RxdocType>(\r\n collection: RxCollection<RxdocType, any>\r\n) {\r\n return new ChangeEventBuffer<RxdocType>(collection);\r\n}\r\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"change-event-buffer.js","names":["_operators","require","_index","_rxError","ChangeEventBuffer","exports","collection","subs","counter","eventCounterMap","WeakMap","buffer","limit","tasks","Set","push","eventBulks$","pipe","filter","bulk","isLocal","subscribe","eventBulk","add","_handleChangeEvents","events","size","requestIdlePromiseNoQueue","then","processTasks","_proto","prototype","Array","from","forEach","task","clear","counterBefore","length","slice","concat","counterBase","index","event","set","getCounter","getBuffer","getArrayIndexByPointer","pointer","oldestEvent","oldestCounter","get","rest","getFrom","ret","currentIndex","nextEvent","runFrom","fn","newRxError","cE","reduceByLastOfDoc","changeEvents","close","sub","unsubscribe","createChangeEventBuffer"],"sources":["../../src/change-event-buffer.ts"],"sourcesContent":["/**\r\n * a buffer-cache which holds the last X changeEvents of the collection\r\n */\r\nimport {\r\n Subscription\r\n} from 'rxjs';\r\nimport { filter } from 'rxjs/operators';\r\nimport type {\r\n RxChangeEventBulk,\r\n RxCollection,\r\n RxStorageChangeEvent\r\n} from './types/index.d.ts';\r\nimport {\r\n requestIdlePromiseNoQueue\r\n} from './plugins/utils/index.ts';\r\nimport {\r\n newRxError\r\n} from './rx-error.ts';\r\n\r\n\r\n/**\r\n * This buffer rembemers previous change events\r\n * so that queries can use them on .exec()\r\n * to calculate the new result set via event-reduce instead\r\n * of running the query against the storage.\r\n */\r\nexport class ChangeEventBuffer<RxDocType> {\r\n /**\r\n * These properties are private to ensure they cannot\r\n * be read without first processing the lazy tasks.\r\n */\r\n private subs: Subscription[] = [];\r\n private counter: number = 0;\r\n private eventCounterMap: WeakMap<\r\n RxStorageChangeEvent<RxDocType>,\r\n number\r\n > = new WeakMap();\r\n /**\r\n * array with changeEvents\r\n * starts with oldest known event, ends with newest\r\n */\r\n private buffer: RxStorageChangeEvent<RxDocType>[] = [];\r\n\r\n public limit: number = 100;\r\n\r\n\r\n\r\n private tasks = new Set<Function>();\r\n\r\n constructor(\r\n public collection: RxCollection\r\n ) {\r\n this.subs.push(\r\n this.collection.eventBulks$.pipe(\r\n filter((bulk: RxChangeEventBulk<RxDocType>) => !bulk.isLocal)\r\n ).subscribe((eventBulk: RxChangeEventBulk<RxDocType>) => {\r\n this.tasks.add(() => this._handleChangeEvents(eventBulk.events));\r\n if (this.tasks.size <= 1) {\r\n requestIdlePromiseNoQueue().then(() => {\r\n this.processTasks();\r\n });\r\n }\r\n })\r\n );\r\n }\r\n\r\n private processTasks() {\r\n if (this.tasks.size === 0) {\r\n return;\r\n }\r\n const tasks = Array.from(this.tasks);\r\n tasks.forEach(task => task());\r\n this.tasks.clear();\r\n }\r\n\r\n private _handleChangeEvents(events: RxStorageChangeEvent<RxDocType>[]) {\r\n const counterBefore = this.counter;\r\n this.counter = this.counter + events.length;\r\n if (events.length > this.limit) {\r\n this.buffer = events.slice(events.length * -1);\r\n } else {\r\n this.buffer = this.buffer.concat(events);\r\n this.buffer = this.buffer.slice(this.limit * -1);\r\n }\r\n const counterBase = counterBefore + 1;\r\n const eventCounterMap = this.eventCounterMap;\r\n for (let index = 0; index < events.length; index++) {\r\n const event = events[index];\r\n eventCounterMap.set(event, counterBase + index);\r\n }\r\n }\r\n\r\n getCounter() {\r\n this.processTasks();\r\n return this.counter;\r\n }\r\n getBuffer() {\r\n this.processTasks();\r\n return this.buffer;\r\n }\r\n\r\n /**\r\n * gets the array-index for the given pointer\r\n * @return arrayIndex which can be used to iterate from there. If null, pointer is out of lower bound\r\n */\r\n getArrayIndexByPointer(pointer: number): number | null {\r\n this.processTasks();\r\n const oldestEvent = this.buffer[0];\r\n const oldestCounter = this.eventCounterMap.get(\r\n oldestEvent\r\n ) as number;\r\n\r\n if (pointer < oldestCounter)\r\n return null; // out of bounds\r\n\r\n const rest = pointer - oldestCounter;\r\n return rest;\r\n }\r\n\r\n /**\r\n * get all changeEvents which came in later than the pointer-event\r\n * @return array with change-events. If null, pointer out of bounds\r\n */\r\n getFrom(pointer: number): RxStorageChangeEvent<RxDocType>[] | null {\r\n this.processTasks();\r\n const ret = [];\r\n let currentIndex = this.getArrayIndexByPointer(pointer);\r\n if (currentIndex === null) // out of bounds\r\n return null;\r\n\r\n while (true) {\r\n const nextEvent = this.buffer[currentIndex];\r\n currentIndex++;\r\n if (!nextEvent) {\r\n return ret;\r\n } else {\r\n ret.push(nextEvent);\r\n }\r\n }\r\n }\r\n\r\n runFrom(pointer: number, fn: Function) {\r\n this.processTasks();\r\n const ret = this.getFrom(pointer);\r\n if (ret === null) {\r\n throw newRxError('COB1');\r\n } else {\r\n ret.forEach(cE => fn(cE));\r\n }\r\n }\r\n\r\n /**\r\n * no matter how many operations are done on one document,\r\n * only the last operation has to be checked to calculate the new state\r\n * this function reduces the events to the last ChangeEvent of each doc.\r\n * This functionality is currently disabled. It is questionable if\r\n * pre-merging the events would really be faster or actually slower.\r\n */\r\n reduceByLastOfDoc(changeEvents: RxStorageChangeEvent<RxDocType>[]): RxStorageChangeEvent<RxDocType>[] {\r\n this.processTasks();\r\n return changeEvents.slice(0);\r\n }\r\n\r\n close() {\r\n this.tasks.clear();\r\n this.subs.forEach(sub => sub.unsubscribe());\r\n }\r\n}\r\n\r\nexport function createChangeEventBuffer<RxdocType>(\r\n collection: RxCollection<RxdocType, any>\r\n) {\r\n return new ChangeEventBuffer<RxdocType>(collection);\r\n}\r\n"],"mappings":"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","ignoreList":[]}
@@ -15,6 +15,7 @@ exports.getStringLengthOfIndexNumber = getStringLengthOfIndexNumber;
15
15
  var _rxSchemaHelper = require("./rx-schema-helper.js");
16
16
  var _index = require("./plugins/utils/index.js");
17
17
  var _queryPlanner = require("./query-planner.js");
18
+ var _rxError = require("./rx-error.js");
18
19
  /**
19
20
  * For some RxStorage implementations,
20
21
  * we need to use our custom crafted indexes
@@ -38,7 +39,9 @@ function getIndexMeta(schema, index) {
38
39
  var fieldNameProperties = index.map(fieldName => {
39
40
  var schemaPart = (0, _rxSchemaHelper.getSchemaByObjectPath)(schema, fieldName);
40
41
  if (!schemaPart) {
41
- throw new Error('not in schema: ' + fieldName);
42
+ throw (0, _rxError.newRxError)('CI1', {
43
+ fieldName
44
+ });
42
45
  }
43
46
  var type = schemaPart.type;
44
47
  var parsedLengths;
@@ -63,10 +66,51 @@ function getIndexMeta(schema, index) {
63
66
  };
64
67
  } else {
65
68
  // number
66
- getIndexStringPart = docData => {
67
- var fieldValue = getValue(docData);
68
- return getNumberIndexString(parsedLengths, fieldValue);
69
- };
69
+ /**
70
+ * @performance
71
+ * Inline the number index string generation to avoid
72
+ * function call overhead and redundant boundary checks.
73
+ * Document data in the hot path is assumed to be valid.
74
+ */
75
+ var pLengths = parsedLengths;
76
+ var pMin = pLengths.minimum;
77
+ var pMax = pLengths.maximum;
78
+ var pRoundedMin = pLengths.roundedMinimum;
79
+ var pNonDecimals = pLengths.nonDecimals;
80
+ var pDecimals = pLengths.decimals;
81
+ var pMultiplier = pLengths.multiplier;
82
+ if (pDecimals === 0) {
83
+ getIndexStringPart = docData => {
84
+ var fieldValue = getValue(docData);
85
+ if (typeof fieldValue === 'undefined') {
86
+ fieldValue = 0;
87
+ }
88
+ if (fieldValue < pMin) {
89
+ fieldValue = pMin;
90
+ }
91
+ if (fieldValue > pMax) {
92
+ fieldValue = pMax;
93
+ }
94
+ return (Math.floor(fieldValue) - pRoundedMin).toString().padStart(pNonDecimals, '0');
95
+ };
96
+ } else {
97
+ getIndexStringPart = docData => {
98
+ var fieldValue = getValue(docData);
99
+ if (typeof fieldValue === 'undefined') {
100
+ fieldValue = 0;
101
+ }
102
+ if (fieldValue < pMin) {
103
+ fieldValue = pMin;
104
+ }
105
+ if (fieldValue > pMax) {
106
+ fieldValue = pMax;
107
+ }
108
+ var flooredValue = Math.floor(fieldValue);
109
+ var shifted = Math.min(Math.round((fieldValue - flooredValue) * pMultiplier), pMultiplier - 1);
110
+ var str = (flooredValue - pRoundedMin).toString().padStart(pNonDecimals, '0');
111
+ return str + shifted.toString().padStart(pDecimals, '0');
112
+ };
113
+ }
70
114
  }
71
115
  var ret = {
72
116
  fieldName,
@@ -98,7 +142,22 @@ function getIndexableStringMonad(schema, index) {
98
142
 
99
143
  /**
100
144
  * @hotPath Performance of this function is very critical!
145
+ * Specialize for common field counts to avoid loop overhead.
101
146
  */
147
+ if (fieldNamePropertiesAmount === 1) {
148
+ return indexPartsFunctions[0];
149
+ }
150
+ if (fieldNamePropertiesAmount === 2) {
151
+ var fn0 = indexPartsFunctions[0];
152
+ var fn1 = indexPartsFunctions[1];
153
+ return docData => fn0(docData) + fn1(docData);
154
+ }
155
+ if (fieldNamePropertiesAmount === 3) {
156
+ var _fn = indexPartsFunctions[0];
157
+ var _fn2 = indexPartsFunctions[1];
158
+ var fn2 = indexPartsFunctions[2];
159
+ return docData => _fn(docData) + _fn2(docData) + fn2(docData);
160
+ }
102
161
  var ret = function (docData) {
103
162
  var str = '';
104
163
  for (var i = 0; i < fieldNamePropertiesAmount; ++i) {
@@ -124,7 +183,8 @@ function getStringLengthOfIndexNumber(schemaPart) {
124
183
  maximum,
125
184
  nonDecimals,
126
185
  decimals,
127
- roundedMinimum: minimum
186
+ roundedMinimum: minimum,
187
+ multiplier: Math.pow(10, decimals)
128
188
  };
129
189
  }
130
190
  function getIndexStringLength(schema, index) {
@@ -172,9 +232,16 @@ function getNumberIndexString(parsedLengths, fieldValue) {
172
232
  var nonDecimalsValueAsString = (Math.floor(fieldValue) - parsedLengths.roundedMinimum).toString();
173
233
  var str = nonDecimalsValueAsString.padStart(parsedLengths.nonDecimals, '0');
174
234
  if (parsedLengths.decimals > 0) {
175
- var splitByDecimalPoint = fieldValue.toString().split('.');
176
- var decimalValueAsString = splitByDecimalPoint.length > 1 ? splitByDecimalPoint[1] : '0';
177
- str += decimalValueAsString.padEnd(parsedLengths.decimals, '0');
235
+ /**
236
+ * @performance
237
+ * Use math to extract decimal digits instead of toString().split('.')
238
+ * which creates intermediate strings and arrays.
239
+ * multiplier is pre-computed in ParsedLengths to avoid Math.pow() per call.
240
+ */
241
+ var multiplier = parsedLengths.multiplier;
242
+ var shifted = Math.min(Math.round((fieldValue - Math.floor(fieldValue)) * multiplier), multiplier - 1);
243
+ var decimalPart = shifted.toString();
244
+ str += decimalPart.padStart(parsedLengths.decimals, '0');
178
245
  }
179
246
  return str;
180
247
  }
@@ -220,7 +287,9 @@ function getStartIndexStringFromLowerBound(schema, index, lowerBound) {
220
287
  }
221
288
  break;
222
289
  default:
223
- throw new Error('unknown index type ' + type);
290
+ throw (0, _rxError.newRxError)('CI2', {
291
+ type: type
292
+ });
224
293
  }
225
294
  });
226
295
  return str;
@@ -243,8 +312,10 @@ function getStartIndexStringFromUpperBound(schema, index, upperBound) {
243
312
  }
244
313
  break;
245
314
  case 'boolean':
246
- if (bound === null) {
315
+ if (bound === null || bound === _queryPlanner.INDEX_MAX) {
247
316
  str += '1';
317
+ } else if (bound === _queryPlanner.INDEX_MIN) {
318
+ str += '0';
248
319
  } else {
249
320
  var boolToStr = bound ? '1' : '0';
250
321
  str += boolToStr;
@@ -264,7 +335,9 @@ function getStartIndexStringFromUpperBound(schema, index, upperBound) {
264
335
  }
265
336
  break;
266
337
  default:
267
- throw new Error('unknown index type ' + type);
338
+ throw (0, _rxError.newRxError)('CI2', {
339
+ type: type
340
+ });
268
341
  }
269
342
  });
270
343
  return str;
@@ -1 +1 @@
1
- {"version":3,"file":"custom-index.js","names":["_rxSchemaHelper","require","_index","_queryPlanner","getIndexMeta","schema","index","fieldNameProperties","map","fieldName","schemaPart","getSchemaByObjectPath","Error","type","parsedLengths","getStringLengthOfIndexNumber","getValue","objectPathMonad","maxLength","getIndexStringPart","docData","fieldValue","padEnd","getNumberIndexString","ret","getIndexableStringMonad","fieldNamePropertiesAmount","length","indexPartsFunctions","r","str","i","minimum","Math","floor","maximum","ceil","multipleOf","valueSpan","nonDecimals","toString","multipleOfParts","split","decimals","roundedMinimum","getIndexStringLength","forEach","props","getPrimaryKeyFromIndexableString","indexableString","primaryKeyLength","paddedPrimaryKey","slice","primaryKey","trim","nonDecimalsValueAsString","padStart","splitByDecimalPoint","decimalValueAsString","getStartIndexStringFromLowerBound","lowerBound","idx","bound","ensureNotFalsy","INDEX_MIN","INDEX_MAX","boolToStr","fillChar","repeat","add","getStartIndexStringFromUpperBound","upperBound","changeIndexableStringByOneQuantum","direction","lastChar","charCode","charCodeAt","withoutLastChar","String","fromCharCode"],"sources":["../../src/custom-index.ts"],"sourcesContent":["/**\r\n * For some RxStorage implementations,\r\n * we need to use our custom crafted indexes\r\n * so we can easily iterate over them. And sort plain arrays of document data.\r\n *\r\n * We really often have to craft an index string for a given document.\r\n * Performance of everything in this file is very important\r\n * which is why the code sometimes looks strange.\r\n * Run performance tests before and after you touch anything here!\r\n */\r\n\r\nimport {\r\n getSchemaByObjectPath\r\n} from './rx-schema-helper.ts';\r\nimport type {\r\n JsonSchema,\r\n RxDocumentData,\r\n RxJsonSchema\r\n} from './types/index.d.ts';\r\nimport {\r\n ensureNotFalsy,\r\n objectPathMonad,\r\n ObjectPathMonadFunction\r\n} from './plugins/utils/index.ts';\r\nimport {\r\n INDEX_MAX,\r\n INDEX_MIN\r\n} from './query-planner.ts';\r\n\r\n\r\n/**\r\n * Prepare all relevant information\r\n * outside of the returned function\r\n * from getIndexableStringMonad()\r\n * to save performance when the returned\r\n * function is called many times.\r\n */\r\ntype IndexMetaField<RxDocType> = {\r\n fieldName: string;\r\n schemaPart: JsonSchema;\r\n /*\r\n * Only in number fields.\r\n */\r\n parsedLengths?: ParsedLengths;\r\n getValue: ObjectPathMonadFunction<RxDocType>;\r\n getIndexStringPart: (docData: RxDocumentData<RxDocType>) => string;\r\n};\r\n\r\nexport function getIndexMeta<RxDocType>(\r\n schema: RxJsonSchema<RxDocumentData<RxDocType>>,\r\n index: string[]\r\n): IndexMetaField<RxDocType>[] {\r\n const fieldNameProperties: IndexMetaField<RxDocType>[] = index.map(fieldName => {\r\n const schemaPart = getSchemaByObjectPath(\r\n schema,\r\n fieldName\r\n );\r\n if (!schemaPart) {\r\n throw new Error('not in schema: ' + fieldName);\r\n }\r\n const type = schemaPart.type;\r\n let parsedLengths: ParsedLengths | undefined;\r\n if (type === 'number' || type === 'integer') {\r\n parsedLengths = getStringLengthOfIndexNumber(\r\n schemaPart\r\n );\r\n }\r\n\r\n const getValue = objectPathMonad(fieldName);\r\n const maxLength = schemaPart.maxLength ? schemaPart.maxLength : 0;\r\n\r\n let getIndexStringPart: (docData: RxDocumentData<RxDocType>) => string;\r\n if (type === 'string') {\r\n getIndexStringPart = docData => {\r\n let fieldValue = getValue(docData);\r\n if (!fieldValue) {\r\n fieldValue = '';\r\n }\r\n return fieldValue.padEnd(maxLength, ' ');\r\n };\r\n } else if (type === 'boolean') {\r\n getIndexStringPart = docData => {\r\n const fieldValue = getValue(docData);\r\n return fieldValue ? '1' : '0';\r\n };\r\n } else { // number\r\n getIndexStringPart = docData => {\r\n const fieldValue = getValue(docData);\r\n return getNumberIndexString(\r\n parsedLengths as any,\r\n fieldValue\r\n );\r\n };\r\n }\r\n\r\n const ret: IndexMetaField<RxDocType> = {\r\n fieldName,\r\n schemaPart,\r\n parsedLengths,\r\n getValue,\r\n getIndexStringPart\r\n };\r\n return ret;\r\n });\r\n return fieldNameProperties;\r\n}\r\n\r\n\r\n/**\r\n * Crafts an indexable string that can be used\r\n * to check if a document would be sorted below or above\r\n * another documents, dependent on the index values.\r\n * @monad for better performance\r\n *\r\n * IMPORTANT: Performance is really important here\r\n * which is why we code so 'strange'.\r\n * Always run performance tests when you want to\r\n * change something in this method.\r\n */\r\nexport function getIndexableStringMonad<RxDocType>(\r\n schema: RxJsonSchema<RxDocumentData<RxDocType>>,\r\n index: string[]\r\n): (docData: RxDocumentData<RxDocType>) => string {\r\n const fieldNameProperties = getIndexMeta(schema, index);\r\n const fieldNamePropertiesAmount = fieldNameProperties.length;\r\n const indexPartsFunctions = fieldNameProperties.map(r => r.getIndexStringPart);\r\n\r\n\r\n /**\r\n * @hotPath Performance of this function is very critical!\r\n */\r\n const ret = function (docData: RxDocumentData<RxDocType>): string {\r\n let str = '';\r\n for (let i = 0; i < fieldNamePropertiesAmount; ++i) {\r\n str += indexPartsFunctions[i](docData);\r\n }\r\n return str;\r\n };\r\n return ret;\r\n}\r\n\r\n\r\ndeclare type ParsedLengths = {\r\n minimum: number;\r\n maximum: number;\r\n nonDecimals: number;\r\n decimals: number;\r\n roundedMinimum: number;\r\n};\r\nexport function getStringLengthOfIndexNumber(\r\n schemaPart: JsonSchema\r\n): ParsedLengths {\r\n const minimum = Math.floor(schemaPart.minimum as number);\r\n const maximum = Math.ceil(schemaPart.maximum as number);\r\n const multipleOf: number = schemaPart.multipleOf as number;\r\n\r\n const valueSpan = maximum - minimum;\r\n const nonDecimals = valueSpan.toString().length;\r\n\r\n const multipleOfParts = multipleOf.toString().split('.');\r\n let decimals = 0;\r\n if (multipleOfParts.length > 1) {\r\n decimals = multipleOfParts[1].length;\r\n }\r\n return {\r\n minimum,\r\n maximum,\r\n nonDecimals,\r\n decimals,\r\n roundedMinimum: minimum\r\n };\r\n}\r\n\r\nexport function getIndexStringLength<RxDocType>(\r\n schema: RxJsonSchema<RxDocumentData<RxDocType>>,\r\n index: string[]\r\n): number {\r\n const fieldNameProperties = getIndexMeta(schema, index);\r\n let length = 0;\r\n fieldNameProperties.forEach(props => {\r\n const schemaPart = props.schemaPart;\r\n const type = schemaPart.type;\r\n\r\n if (type === 'string') {\r\n length += schemaPart.maxLength as number;\r\n } else if (type === 'boolean') {\r\n length += 1;\r\n } else {\r\n const parsedLengths = props.parsedLengths as ParsedLengths;\r\n length = length + parsedLengths.nonDecimals + parsedLengths.decimals;\r\n }\r\n\r\n });\r\n return length;\r\n}\r\n\r\n\r\nexport function getPrimaryKeyFromIndexableString(\r\n indexableString: string,\r\n primaryKeyLength: number\r\n): string {\r\n const paddedPrimaryKey = indexableString.slice(primaryKeyLength * -1);\r\n // we can safely trim here because the primary key is not allowed to start or end with a space char.\r\n const primaryKey = paddedPrimaryKey.trim();\r\n return primaryKey;\r\n}\r\n\r\n\r\nexport function getNumberIndexString(\r\n parsedLengths: ParsedLengths,\r\n fieldValue: number\r\n): string {\r\n /**\r\n * Ensure that the given value is in the boundaries\r\n * of the schema, otherwise it would create a broken index string.\r\n * This can happen for example if you have a minimum of 0\r\n * and run a query like\r\n * selector {\r\n * numField: { $gt: -1000 }\r\n * }\r\n */\r\n if (typeof fieldValue === 'undefined') {\r\n fieldValue = 0;\r\n }\r\n if (fieldValue < parsedLengths.minimum) {\r\n fieldValue = parsedLengths.minimum;\r\n }\r\n if (fieldValue > parsedLengths.maximum) {\r\n fieldValue = parsedLengths.maximum;\r\n }\r\n\r\n const nonDecimalsValueAsString = (Math.floor(fieldValue) - parsedLengths.roundedMinimum).toString();\r\n let str = nonDecimalsValueAsString.padStart(parsedLengths.nonDecimals, '0');\r\n\r\n if (parsedLengths.decimals > 0) {\r\n const splitByDecimalPoint = fieldValue.toString().split('.');\r\n const decimalValueAsString = splitByDecimalPoint.length > 1 ? splitByDecimalPoint[1] : '0';\r\n str += decimalValueAsString.padEnd(parsedLengths.decimals, '0');\r\n }\r\n return str;\r\n}\r\n\r\nexport function getStartIndexStringFromLowerBound(\r\n schema: RxJsonSchema<any>,\r\n index: string[],\r\n lowerBound: (string | boolean | number | null | undefined)[]\r\n): string {\r\n let str = '';\r\n index.forEach((fieldName, idx) => {\r\n const schemaPart = getSchemaByObjectPath(\r\n schema,\r\n fieldName\r\n );\r\n const bound = lowerBound[idx];\r\n const type = schemaPart.type;\r\n\r\n switch (type) {\r\n case 'string':\r\n const maxLength = ensureNotFalsy(schemaPart.maxLength, 'maxLength not set');\r\n if (typeof bound === 'string') {\r\n str += (bound as string).padEnd(maxLength, ' ');\r\n } else {\r\n // str += ''.padStart(maxLength, inclusiveStart ? ' ' : INDEX_MAX);\r\n str += ''.padEnd(maxLength, ' ');\r\n }\r\n break;\r\n case 'boolean':\r\n if (bound === null) {\r\n str += '0';\r\n } else if (bound === INDEX_MIN) {\r\n str += '0';\r\n } else if (bound === INDEX_MAX) {\r\n str += '1';\r\n } else {\r\n const boolToStr = bound ? '1' : '0';\r\n str += boolToStr;\r\n }\r\n break;\r\n case 'number':\r\n case 'integer':\r\n const parsedLengths = getStringLengthOfIndexNumber(\r\n schemaPart\r\n );\r\n if (bound === null || bound === INDEX_MIN) {\r\n const fillChar = '0';\r\n str += fillChar.repeat(parsedLengths.nonDecimals + parsedLengths.decimals);\r\n } else if (bound === INDEX_MAX) {\r\n str += getNumberIndexString(\r\n parsedLengths,\r\n parsedLengths.maximum\r\n );\r\n } else {\r\n const add = getNumberIndexString(\r\n parsedLengths,\r\n bound as number\r\n );\r\n str += add;\r\n }\r\n break;\r\n default:\r\n throw new Error('unknown index type ' + type);\r\n }\r\n });\r\n return str;\r\n}\r\n\r\n\r\nexport function getStartIndexStringFromUpperBound(\r\n schema: RxJsonSchema<any>,\r\n index: string[],\r\n upperBound: (string | boolean | number | null | undefined)[]\r\n): string {\r\n let str = '';\r\n index.forEach((fieldName, idx) => {\r\n const schemaPart = getSchemaByObjectPath(\r\n schema,\r\n fieldName\r\n );\r\n const bound = upperBound[idx];\r\n const type = schemaPart.type;\r\n\r\n switch (type) {\r\n case 'string':\r\n const maxLength = ensureNotFalsy(schemaPart.maxLength, 'maxLength not set');\r\n if (typeof bound === 'string' && bound !== INDEX_MAX) {\r\n str += (bound as string).padEnd(maxLength, ' ');\r\n } else if (bound === INDEX_MIN) {\r\n str += ''.padEnd(maxLength, ' ');\r\n } else {\r\n str += ''.padEnd(maxLength, INDEX_MAX);\r\n }\r\n break;\r\n case 'boolean':\r\n if (bound === null) {\r\n str += '1';\r\n } else {\r\n const boolToStr = bound ? '1' : '0';\r\n str += boolToStr;\r\n }\r\n break;\r\n case 'number':\r\n case 'integer':\r\n const parsedLengths = getStringLengthOfIndexNumber(\r\n schemaPart\r\n );\r\n if (bound === null || bound === INDEX_MAX) {\r\n const fillChar = '9';\r\n str += fillChar.repeat(parsedLengths.nonDecimals + parsedLengths.decimals);\r\n } else if (bound === INDEX_MIN) {\r\n const fillChar = '0';\r\n str += fillChar.repeat(parsedLengths.nonDecimals + parsedLengths.decimals);\r\n } else {\r\n str += getNumberIndexString(\r\n parsedLengths,\r\n bound as number\r\n );\r\n }\r\n break;\r\n default:\r\n throw new Error('unknown index type ' + type);\r\n }\r\n });\r\n return str;\r\n}\r\n\r\n/**\r\n * Used in storages where it is not possible\r\n * to define inclusiveEnd/inclusiveStart\r\n */\r\nexport function changeIndexableStringByOneQuantum(str: string, direction: 1 | -1): string {\r\n const lastChar = str.slice(-1);\r\n let charCode = lastChar.charCodeAt(0);\r\n charCode = charCode + direction;\r\n const withoutLastChar = str.slice(0, -1);\r\n return withoutLastChar + String.fromCharCode(charCode);\r\n}\r\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"custom-index.js","names":["_rxSchemaHelper","require","_index","_queryPlanner","_rxError","getIndexMeta","schema","index","fieldNameProperties","map","fieldName","schemaPart","getSchemaByObjectPath","newRxError","type","parsedLengths","getStringLengthOfIndexNumber","getValue","objectPathMonad","maxLength","getIndexStringPart","docData","fieldValue","padEnd","pLengths","pMin","minimum","pMax","maximum","pRoundedMin","roundedMinimum","pNonDecimals","nonDecimals","pDecimals","decimals","pMultiplier","multiplier","Math","floor","toString","padStart","flooredValue","shifted","min","round","str","ret","getIndexableStringMonad","fieldNamePropertiesAmount","length","indexPartsFunctions","r","fn0","fn1","fn2","i","ceil","multipleOf","valueSpan","multipleOfParts","split","pow","getIndexStringLength","forEach","props","getPrimaryKeyFromIndexableString","indexableString","primaryKeyLength","paddedPrimaryKey","slice","primaryKey","trim","getNumberIndexString","nonDecimalsValueAsString","decimalPart","getStartIndexStringFromLowerBound","lowerBound","idx","bound","ensureNotFalsy","INDEX_MIN","INDEX_MAX","boolToStr","fillChar","repeat","add","getStartIndexStringFromUpperBound","upperBound","changeIndexableStringByOneQuantum","direction","lastChar","charCode","charCodeAt","withoutLastChar","String","fromCharCode"],"sources":["../../src/custom-index.ts"],"sourcesContent":["/**\r\n * For some RxStorage implementations,\r\n * we need to use our custom crafted indexes\r\n * so we can easily iterate over them. And sort plain arrays of document data.\r\n *\r\n * We really often have to craft an index string for a given document.\r\n * Performance of everything in this file is very important\r\n * which is why the code sometimes looks strange.\r\n * Run performance tests before and after you touch anything here!\r\n */\r\n\r\nimport {\r\n getSchemaByObjectPath\r\n} from './rx-schema-helper.ts';\r\nimport type {\r\n JsonSchema,\r\n RxDocumentData,\r\n RxJsonSchema\r\n} from './types/index.d.ts';\r\nimport {\r\n ensureNotFalsy,\r\n objectPathMonad,\r\n ObjectPathMonadFunction\r\n} from './plugins/utils/index.ts';\r\nimport {\r\n INDEX_MAX,\r\n INDEX_MIN\r\n} from './query-planner.ts';\r\nimport {\r\n newRxError\r\n} from './rx-error.ts';\r\n\r\n\r\n/**\r\n * Prepare all relevant information\r\n * outside of the returned function\r\n * from getIndexableStringMonad()\r\n * to save performance when the returned\r\n * function is called many times.\r\n */\r\ntype IndexMetaField<RxDocType> = {\r\n fieldName: string;\r\n schemaPart: JsonSchema;\r\n /*\r\n * Only in number fields.\r\n */\r\n parsedLengths?: ParsedLengths;\r\n getValue: ObjectPathMonadFunction<RxDocType>;\r\n getIndexStringPart: (docData: RxDocumentData<RxDocType>) => string;\r\n};\r\n\r\nexport function getIndexMeta<RxDocType>(\r\n schema: RxJsonSchema<RxDocumentData<RxDocType>>,\r\n index: string[]\r\n): IndexMetaField<RxDocType>[] {\r\n const fieldNameProperties: IndexMetaField<RxDocType>[] = index.map(fieldName => {\r\n const schemaPart = getSchemaByObjectPath(\r\n schema,\r\n fieldName\r\n );\r\n if (!schemaPart) {\r\n throw newRxError('CI1', { fieldName });\r\n }\r\n const type = schemaPart.type;\r\n let parsedLengths: ParsedLengths | undefined;\r\n if (type === 'number' || type === 'integer') {\r\n parsedLengths = getStringLengthOfIndexNumber(\r\n schemaPart\r\n );\r\n }\r\n\r\n const getValue = objectPathMonad(fieldName);\r\n const maxLength = schemaPart.maxLength ? schemaPart.maxLength : 0;\r\n\r\n let getIndexStringPart: (docData: RxDocumentData<RxDocType>) => string;\r\n if (type === 'string') {\r\n getIndexStringPart = docData => {\r\n let fieldValue = getValue(docData);\r\n if (!fieldValue) {\r\n fieldValue = '';\r\n }\r\n return fieldValue.padEnd(maxLength, ' ');\r\n };\r\n } else if (type === 'boolean') {\r\n getIndexStringPart = docData => {\r\n const fieldValue = getValue(docData);\r\n return fieldValue ? '1' : '0';\r\n };\r\n } else { // number\r\n /**\r\n * @performance\r\n * Inline the number index string generation to avoid\r\n * function call overhead and redundant boundary checks.\r\n * Document data in the hot path is assumed to be valid.\r\n */\r\n const pLengths = parsedLengths as ParsedLengths;\r\n const pMin = pLengths.minimum;\r\n const pMax = pLengths.maximum;\r\n const pRoundedMin = pLengths.roundedMinimum;\r\n const pNonDecimals = pLengths.nonDecimals;\r\n const pDecimals = pLengths.decimals;\r\n const pMultiplier = pLengths.multiplier;\r\n if (pDecimals === 0) {\r\n getIndexStringPart = docData => {\r\n let fieldValue = getValue(docData);\r\n if (typeof fieldValue === 'undefined') {\r\n fieldValue = 0;\r\n }\r\n if (fieldValue < pMin) {\r\n fieldValue = pMin;\r\n }\r\n if (fieldValue > pMax) {\r\n fieldValue = pMax;\r\n }\r\n return (Math.floor(fieldValue) - pRoundedMin).toString().padStart(pNonDecimals, '0');\r\n };\r\n } else {\r\n getIndexStringPart = docData => {\r\n let fieldValue = getValue(docData);\r\n if (typeof fieldValue === 'undefined') {\r\n fieldValue = 0;\r\n }\r\n if (fieldValue < pMin) {\r\n fieldValue = pMin;\r\n }\r\n if (fieldValue > pMax) {\r\n fieldValue = pMax;\r\n }\r\n const flooredValue = Math.floor(fieldValue);\r\n const shifted = Math.min(\r\n Math.round((fieldValue - flooredValue) * pMultiplier),\r\n pMultiplier - 1\r\n );\r\n const str = (flooredValue - pRoundedMin).toString().padStart(pNonDecimals, '0');\r\n return str + shifted.toString().padStart(pDecimals, '0');\r\n };\r\n }\r\n }\r\n\r\n const ret: IndexMetaField<RxDocType> = {\r\n fieldName,\r\n schemaPart,\r\n parsedLengths,\r\n getValue,\r\n getIndexStringPart\r\n };\r\n return ret;\r\n });\r\n return fieldNameProperties;\r\n}\r\n\r\n\r\n/**\r\n * Crafts an indexable string that can be used\r\n * to check if a document would be sorted below or above\r\n * another documents, dependent on the index values.\r\n * @monad for better performance\r\n *\r\n * IMPORTANT: Performance is really important here\r\n * which is why we code so 'strange'.\r\n * Always run performance tests when you want to\r\n * change something in this method.\r\n */\r\nexport function getIndexableStringMonad<RxDocType>(\r\n schema: RxJsonSchema<RxDocumentData<RxDocType>>,\r\n index: string[]\r\n): (docData: RxDocumentData<RxDocType>) => string {\r\n const fieldNameProperties = getIndexMeta(schema, index);\r\n const fieldNamePropertiesAmount = fieldNameProperties.length;\r\n const indexPartsFunctions = fieldNameProperties.map(r => r.getIndexStringPart);\r\n\r\n /**\r\n * @hotPath Performance of this function is very critical!\r\n * Specialize for common field counts to avoid loop overhead.\r\n */\r\n if (fieldNamePropertiesAmount === 1) {\r\n return indexPartsFunctions[0];\r\n }\r\n if (fieldNamePropertiesAmount === 2) {\r\n const fn0 = indexPartsFunctions[0];\r\n const fn1 = indexPartsFunctions[1];\r\n return (docData: RxDocumentData<RxDocType>): string => fn0(docData) + fn1(docData);\r\n }\r\n if (fieldNamePropertiesAmount === 3) {\r\n const fn0 = indexPartsFunctions[0];\r\n const fn1 = indexPartsFunctions[1];\r\n const fn2 = indexPartsFunctions[2];\r\n return (docData: RxDocumentData<RxDocType>): string => fn0(docData) + fn1(docData) + fn2(docData);\r\n }\r\n\r\n const ret = function (docData: RxDocumentData<RxDocType>): string {\r\n let str = '';\r\n for (let i = 0; i < fieldNamePropertiesAmount; ++i) {\r\n str += indexPartsFunctions[i](docData);\r\n }\r\n return str;\r\n };\r\n return ret;\r\n}\r\n\r\n\r\ndeclare type ParsedLengths = {\r\n minimum: number;\r\n maximum: number;\r\n nonDecimals: number;\r\n decimals: number;\r\n roundedMinimum: number;\r\n /**\r\n * Pre-computed Math.pow(10, decimals) to avoid\r\n * recomputing on every getNumberIndexString call.\r\n */\r\n multiplier: number;\r\n};\r\nexport function getStringLengthOfIndexNumber(\r\n schemaPart: JsonSchema\r\n): ParsedLengths {\r\n const minimum = Math.floor(schemaPart.minimum as number);\r\n const maximum = Math.ceil(schemaPart.maximum as number);\r\n const multipleOf: number = schemaPart.multipleOf as number;\r\n\r\n const valueSpan = maximum - minimum;\r\n const nonDecimals = valueSpan.toString().length;\r\n\r\n const multipleOfParts = multipleOf.toString().split('.');\r\n let decimals = 0;\r\n if (multipleOfParts.length > 1) {\r\n decimals = multipleOfParts[1].length;\r\n }\r\n return {\r\n minimum,\r\n maximum,\r\n nonDecimals,\r\n decimals,\r\n roundedMinimum: minimum,\r\n multiplier: Math.pow(10, decimals)\r\n };\r\n}\r\n\r\nexport function getIndexStringLength<RxDocType>(\r\n schema: RxJsonSchema<RxDocumentData<RxDocType>>,\r\n index: string[]\r\n): number {\r\n const fieldNameProperties = getIndexMeta(schema, index);\r\n let length = 0;\r\n fieldNameProperties.forEach(props => {\r\n const schemaPart = props.schemaPart;\r\n const type = schemaPart.type;\r\n\r\n if (type === 'string') {\r\n length += schemaPart.maxLength as number;\r\n } else if (type === 'boolean') {\r\n length += 1;\r\n } else {\r\n const parsedLengths = props.parsedLengths as ParsedLengths;\r\n length = length + parsedLengths.nonDecimals + parsedLengths.decimals;\r\n }\r\n\r\n });\r\n return length;\r\n}\r\n\r\n\r\nexport function getPrimaryKeyFromIndexableString(\r\n indexableString: string,\r\n primaryKeyLength: number\r\n): string {\r\n const paddedPrimaryKey = indexableString.slice(primaryKeyLength * -1);\r\n // we can safely trim here because the primary key is not allowed to start or end with a space char.\r\n const primaryKey = paddedPrimaryKey.trim();\r\n return primaryKey;\r\n}\r\n\r\n\r\nexport function getNumberIndexString(\r\n parsedLengths: ParsedLengths,\r\n fieldValue: number\r\n): string {\r\n /**\r\n * Ensure that the given value is in the boundaries\r\n * of the schema, otherwise it would create a broken index string.\r\n * This can happen for example if you have a minimum of 0\r\n * and run a query like\r\n * selector {\r\n * numField: { $gt: -1000 }\r\n * }\r\n */\r\n if (typeof fieldValue === 'undefined') {\r\n fieldValue = 0;\r\n }\r\n if (fieldValue < parsedLengths.minimum) {\r\n fieldValue = parsedLengths.minimum;\r\n }\r\n if (fieldValue > parsedLengths.maximum) {\r\n fieldValue = parsedLengths.maximum;\r\n }\r\n\r\n const nonDecimalsValueAsString = (Math.floor(fieldValue) - parsedLengths.roundedMinimum).toString();\r\n let str = nonDecimalsValueAsString.padStart(parsedLengths.nonDecimals, '0');\r\n\r\n if (parsedLengths.decimals > 0) {\r\n /**\r\n * @performance\r\n * Use math to extract decimal digits instead of toString().split('.')\r\n * which creates intermediate strings and arrays.\r\n * multiplier is pre-computed in ParsedLengths to avoid Math.pow() per call.\r\n */\r\n const multiplier = parsedLengths.multiplier;\r\n const shifted = Math.min(\r\n Math.round((fieldValue - Math.floor(fieldValue)) * multiplier),\r\n multiplier - 1\r\n );\r\n const decimalPart = shifted.toString();\r\n str += decimalPart.padStart(parsedLengths.decimals, '0');\r\n }\r\n return str;\r\n}\r\n\r\nexport function getStartIndexStringFromLowerBound(\r\n schema: RxJsonSchema<any>,\r\n index: string[],\r\n lowerBound: (string | boolean | number | null | undefined)[]\r\n): string {\r\n let str = '';\r\n index.forEach((fieldName, idx) => {\r\n const schemaPart = getSchemaByObjectPath(\r\n schema,\r\n fieldName\r\n );\r\n const bound = lowerBound[idx];\r\n const type = schemaPart.type;\r\n\r\n switch (type) {\r\n case 'string':\r\n const maxLength = ensureNotFalsy(schemaPart.maxLength, 'maxLength not set');\r\n if (typeof bound === 'string') {\r\n str += (bound as string).padEnd(maxLength, ' ');\r\n } else {\r\n // str += ''.padStart(maxLength, inclusiveStart ? ' ' : INDEX_MAX);\r\n str += ''.padEnd(maxLength, ' ');\r\n }\r\n break;\r\n case 'boolean':\r\n if (bound === null) {\r\n str += '0';\r\n } else if (bound === INDEX_MIN) {\r\n str += '0';\r\n } else if (bound === INDEX_MAX) {\r\n str += '1';\r\n } else {\r\n const boolToStr = bound ? '1' : '0';\r\n str += boolToStr;\r\n }\r\n break;\r\n case 'number':\r\n case 'integer':\r\n const parsedLengths = getStringLengthOfIndexNumber(\r\n schemaPart\r\n );\r\n if (bound === null || bound === INDEX_MIN) {\r\n const fillChar = '0';\r\n str += fillChar.repeat(parsedLengths.nonDecimals + parsedLengths.decimals);\r\n } else if (bound === INDEX_MAX) {\r\n str += getNumberIndexString(\r\n parsedLengths,\r\n parsedLengths.maximum\r\n );\r\n } else {\r\n const add = getNumberIndexString(\r\n parsedLengths,\r\n bound as number\r\n );\r\n str += add;\r\n }\r\n break;\r\n default:\r\n throw newRxError('CI2', { type: type as string });\r\n }\r\n });\r\n return str;\r\n}\r\n\r\n\r\nexport function getStartIndexStringFromUpperBound(\r\n schema: RxJsonSchema<any>,\r\n index: string[],\r\n upperBound: (string | boolean | number | null | undefined)[]\r\n): string {\r\n let str = '';\r\n index.forEach((fieldName, idx) => {\r\n const schemaPart = getSchemaByObjectPath(\r\n schema,\r\n fieldName\r\n );\r\n const bound = upperBound[idx];\r\n const type = schemaPart.type;\r\n\r\n switch (type) {\r\n case 'string':\r\n const maxLength = ensureNotFalsy(schemaPart.maxLength, 'maxLength not set');\r\n if (typeof bound === 'string' && bound !== INDEX_MAX) {\r\n str += (bound as string).padEnd(maxLength, ' ');\r\n } else if (bound === INDEX_MIN) {\r\n str += ''.padEnd(maxLength, ' ');\r\n } else {\r\n str += ''.padEnd(maxLength, INDEX_MAX);\r\n }\r\n break;\r\n case 'boolean':\r\n if (bound === null || bound === INDEX_MAX) {\r\n str += '1';\r\n } else if (bound === INDEX_MIN) {\r\n str += '0';\r\n } else {\r\n const boolToStr = bound ? '1' : '0';\r\n str += boolToStr;\r\n }\r\n break;\r\n case 'number':\r\n case 'integer':\r\n const parsedLengths = getStringLengthOfIndexNumber(\r\n schemaPart\r\n );\r\n if (bound === null || bound === INDEX_MAX) {\r\n const fillChar = '9';\r\n str += fillChar.repeat(parsedLengths.nonDecimals + parsedLengths.decimals);\r\n } else if (bound === INDEX_MIN) {\r\n const fillChar = '0';\r\n str += fillChar.repeat(parsedLengths.nonDecimals + parsedLengths.decimals);\r\n } else {\r\n str += getNumberIndexString(\r\n parsedLengths,\r\n bound as number\r\n );\r\n }\r\n break;\r\n default:\r\n throw newRxError('CI2', { type: type as string });\r\n }\r\n });\r\n return str;\r\n}\r\n\r\n/**\r\n * Used in storages where it is not possible\r\n * to define inclusiveEnd/inclusiveStart\r\n */\r\nexport function changeIndexableStringByOneQuantum(str: string, direction: 1 | -1): string {\r\n const lastChar = str.slice(-1);\r\n let charCode = lastChar.charCodeAt(0);\r\n charCode = charCode + direction;\r\n const withoutLastChar = str.slice(0, -1);\r\n return withoutLastChar + String.fromCharCode(charCode);\r\n}\r\n"],"mappings":"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","ignoreList":[]}
@@ -52,7 +52,7 @@ var DocumentCache = exports.DocumentCache = /*#__PURE__*/function () {
52
52
  var docId = docMeta.docId;
53
53
  var cacheItem = this.cacheItemByDocId.get(docId);
54
54
  if (cacheItem) {
55
- cacheItem[0].delete(docMeta.revisionHeight + docMeta.lwt + '');
55
+ cacheItem[0].delete(docMeta.rev + docMeta.lwt);
56
56
  if (cacheItem[0].size === 0) {
57
57
  /**
58
58
  * No state of the document is cached anymore,
@@ -92,8 +92,7 @@ var DocumentCache = exports.DocumentCache = /*#__PURE__*/function () {
92
92
  if (this.tasks.size === 0) {
93
93
  return;
94
94
  }
95
- var tasks = Array.from(this.tasks);
96
- tasks.forEach(task => task());
95
+ this.tasks.forEach(task => task());
97
96
  this.tasks.clear();
98
97
  }
99
98
 
@@ -128,11 +127,76 @@ var DocumentCache = exports.DocumentCache = /*#__PURE__*/function () {
128
127
  }, {
129
128
  key: "getCachedRxDocument",
130
129
  get: function () {
131
- var fn = getCachedRxDocumentMonad(this);
132
- return (0, _index2.overwriteGetterForCaching)(this, 'getCachedRxDocument', doc => fn([doc])[0]);
130
+ var fn = getCachedRxDocumentSingle(this);
131
+ return (0, _index2.overwriteGetterForCaching)(this, 'getCachedRxDocument', fn);
133
132
  }
134
133
  }]);
135
134
  }();
135
+ /**
136
+ * @hotPath Dedicated single-document function that avoids array allocations.
137
+ * Used by getCachedRxDocument which is called from many call sites.
138
+ */
139
+ function getCachedRxDocumentSingle(docCache) {
140
+ var primaryPath = docCache.primaryPath;
141
+ var cacheItemByDocId = docCache.cacheItemByDocId;
142
+ var registry = docCache.registry;
143
+ var deepFreezeWhenDevMode = _overwritable.overwritable.deepFreezeWhenDevMode;
144
+ var documentCreator = docCache.documentCreator;
145
+ return docData => {
146
+ var docId = docData[primaryPath];
147
+ var rev = docData._rev;
148
+ var lwt = docData._meta.lwt;
149
+ var cacheKey = rev + lwt;
150
+ var cacheItem = cacheItemByDocId.get(docId);
151
+ if (!cacheItem) {
152
+ docData = deepFreezeWhenDevMode(docData);
153
+ var newDoc = documentCreator(docData);
154
+ var newByRev = new Map();
155
+ newByRev.set(cacheKey, createWeakRefWithFallback(newDoc));
156
+ cacheItemByDocId.set(docId, [newByRev, docData]);
157
+ if (registry) {
158
+ docCache.tasks.add(() => {
159
+ registry.register(newDoc, {
160
+ docId: newDoc.primary,
161
+ rev,
162
+ lwt
163
+ });
164
+ });
165
+ if (docCache.tasks.size <= 1) {
166
+ (0, _index2.requestIdlePromiseNoQueue)().then(() => {
167
+ docCache.processTasks();
168
+ });
169
+ }
170
+ }
171
+ return newDoc;
172
+ }
173
+ var byRev = cacheItem[0];
174
+ var cachedRxDocumentWeakRef = byRev.get(cacheKey);
175
+ var cachedRxDocument = cachedRxDocumentWeakRef ? cachedRxDocumentWeakRef.deref() : undefined;
176
+ if (!cachedRxDocument) {
177
+ docData = deepFreezeWhenDevMode(docData);
178
+ cachedRxDocument = documentCreator(docData);
179
+ byRev.set(cacheKey, createWeakRefWithFallback(cachedRxDocument));
180
+ if (registry) {
181
+ var registeredDoc = cachedRxDocument;
182
+ docCache.tasks.add(() => {
183
+ registry.register(registeredDoc, {
184
+ docId: registeredDoc.primary,
185
+ rev,
186
+ lwt
187
+ });
188
+ });
189
+ if (docCache.tasks.size <= 1) {
190
+ (0, _index2.requestIdlePromiseNoQueue)().then(() => {
191
+ docCache.processTasks();
192
+ });
193
+ }
194
+ }
195
+ }
196
+ return cachedRxDocument;
197
+ };
198
+ }
199
+
136
200
  /**
137
201
  * This function is called very very often.
138
202
  * @hotPath This is one of the most important methods for performance.
@@ -146,53 +210,71 @@ function getCachedRxDocumentMonad(docCache) {
146
210
  var documentCreator = docCache.documentCreator;
147
211
  var fn = docsData => {
148
212
  var ret = new Array(docsData.length);
149
- var registryTasks = [];
213
+ var registryTasks;
150
214
  for (var index = 0; index < docsData.length; index++) {
151
215
  var docData = docsData[index];
152
216
  var docId = docData[primaryPath];
153
- var revisionHeight = (0, _index2.getHeightOfRevision)(docData._rev);
154
-
155
- /**
156
- * @performance
157
- * Compute the byRev cache key once and reuse it
158
- * for both the Map.get() and Map.set() calls.
159
- */
160
- var cacheKey = revisionHeight + docData._meta.lwt + '';
161
- var byRev = void 0;
162
- var cachedRxDocumentWeakRef = void 0;
217
+ var rev = docData._rev;
218
+ var lwt = docData._meta.lwt;
219
+ var cacheKey = rev + lwt;
163
220
  var cacheItem = cacheItemByDocId.get(docId);
164
221
  if (!cacheItem) {
165
- byRev = new Map();
166
- cacheItem = [byRev, docData];
167
- cacheItemByDocId.set(docId, cacheItem);
168
- } else {
169
- byRev = cacheItem[0];
170
- cachedRxDocumentWeakRef = byRev.get(cacheKey);
171
- }
172
- var cachedRxDocument = cachedRxDocumentWeakRef ? cachedRxDocumentWeakRef.deref() : undefined;
173
- if (!cachedRxDocument) {
222
+ /**
223
+ * New document - no need for WeakRef lookup.
224
+ * Create cache item directly.
225
+ */
174
226
  docData = deepFreezeWhenDevMode(docData);
175
- cachedRxDocument = documentCreator(docData);
227
+ var cachedRxDocument = documentCreator(docData);
228
+ var byRev = new Map();
176
229
  byRev.set(cacheKey, createWeakRefWithFallback(cachedRxDocument));
230
+ cacheItemByDocId.set(docId, [byRev, docData]);
231
+ ret[index] = cachedRxDocument;
177
232
  if (registry) {
178
- registryTasks.push(cachedRxDocument);
233
+ if (!registryTasks) {
234
+ registryTasks = [];
235
+ }
236
+ registryTasks.push({
237
+ doc: cachedRxDocument,
238
+ rev,
239
+ lwt
240
+ });
241
+ }
242
+ } else {
243
+ var _byRev = cacheItem[0];
244
+ var cachedRxDocumentWeakRef = _byRev.get(cacheKey);
245
+ var _cachedRxDocument = cachedRxDocumentWeakRef ? cachedRxDocumentWeakRef.deref() : undefined;
246
+ if (!_cachedRxDocument) {
247
+ docData = deepFreezeWhenDevMode(docData);
248
+ _cachedRxDocument = documentCreator(docData);
249
+ _byRev.set(cacheKey, createWeakRefWithFallback(_cachedRxDocument));
250
+ if (registry) {
251
+ if (!registryTasks) {
252
+ registryTasks = [];
253
+ }
254
+ registryTasks.push({
255
+ doc: _cachedRxDocument,
256
+ rev,
257
+ lwt
258
+ });
259
+ }
179
260
  }
261
+ ret[index] = _cachedRxDocument;
180
262
  }
181
- ret[index] = cachedRxDocument;
182
263
  }
183
- if (registryTasks.length > 0 && registry) {
264
+ if (registryTasks && registry) {
184
265
  /**
185
266
  * Calling registry.register() has shown to have
186
267
  * really bad performance. So we add the cached documents
187
268
  * lazily.
188
269
  */
270
+ var tasks = registryTasks;
189
271
  docCache.tasks.add(() => {
190
- for (var _index = 0; _index < registryTasks.length; _index++) {
191
- var doc = registryTasks[_index];
192
- registry.register(doc, {
193
- docId: doc.primary,
194
- revisionHeight: (0, _index2.getHeightOfRevision)(doc.revision),
195
- lwt: doc._data._meta.lwt
272
+ for (var _index = 0; _index < tasks.length; _index++) {
273
+ var task = tasks[_index];
274
+ registry.register(task.doc, {
275
+ docId: task.doc.primary,
276
+ rev: task.rev,
277
+ lwt: task.lwt
196
278
  });
197
279
  }
198
280
  });