@connecttomahdi/rxdb 17.0.0-beta.17 → 17.1.1

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 (349) 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 +0 -7
  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 +5 -23
  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 +1 -8
  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 +5 -23
  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/plugins/dev-mode/error-messages.d.ts +36 -0
  251. package/dist/types/plugins/leader-election/index.d.ts +1 -0
  252. package/dist/types/plugins/replication-google-drive/document-handling.d.ts +4 -1
  253. package/dist/types/plugins/replication-google-drive/google-drive-types.d.ts +1 -0
  254. package/dist/types/plugins/state/rx-state.d.ts +1 -1
  255. package/dist/types/plugins/storage-denokv/index.d.ts +1 -1
  256. package/dist/types/plugins/storage-dexie/rx-storage-dexie.d.ts +1 -1
  257. package/dist/types/plugins/storage-localstorage/index.d.ts +1 -1
  258. package/dist/types/plugins/storage-memory/binary-search-bounds.d.ts +21 -10
  259. package/dist/types/plugins/storage-memory/memory-helper.d.ts +7 -3
  260. package/dist/types/plugins/storage-memory/memory-types.d.ts +5 -0
  261. package/dist/types/plugins/storage-mongodb/mongodb-helper.d.ts +9 -1
  262. package/dist/types/plugins/storage-mongodb/rx-storage-instance-mongodb.d.ts +2 -2
  263. package/dist/types/plugins/storage-mongodb/rx-storage-mongodb.d.ts +1 -1
  264. package/dist/types/plugins/storage-remote/rx-storage-remote.d.ts +1 -1
  265. package/dist/types/plugins/storage-sqlite/index.d.ts +1 -1
  266. package/dist/types/plugins/test-utils/performance.d.ts +36 -0
  267. package/dist/types/plugins/test-utils/test-util.d.ts +17 -0
  268. package/dist/types/plugins/utils/utils-object.d.ts +8 -3
  269. package/dist/types/plugins/utils/utils-premium.d.ts +0 -2
  270. package/dist/types/plugins/utils/utils-rxdb-version.d.ts +1 -1
  271. package/dist/types/rx-database.d.ts +1 -1
  272. package/dist/types/rx-query-single-result.d.ts +1 -1
  273. package/dist/types/rx-query.d.ts +3 -2
  274. package/dist/types/rx-storage-helper.d.ts +15 -0
  275. package/dist/types/types/rx-error.d.ts +3 -0
  276. package/dist/types/types/rx-schema.d.ts +5 -0
  277. package/eslint.config.mjs +2 -1
  278. package/package.json +38 -35
  279. package/scripts/check-code-block-line-length.js +91 -0
  280. package/scripts/check-em-dashes.js +53 -0
  281. package/scripts/copy-path.mjs +20 -0
  282. package/scripts/docs-fetch-git-history.mjs +36 -0
  283. package/scripts/fix-types.mjs +15 -8
  284. package/scripts/install-foundationdb.sh +0 -6
  285. package/scripts/notify-indexnow.mjs +171 -0
  286. package/scripts/start-foundationdb-docker.sh +73 -0
  287. package/src/change-event-buffer.ts +4 -1
  288. package/src/custom-index.ts +93 -16
  289. package/src/doc-cache.ts +117 -41
  290. package/src/event-reduce.ts +10 -1
  291. package/src/plugin-helpers.ts +10 -0
  292. package/src/plugins/attachments/index.ts +10 -12
  293. package/src/plugins/cleanup/cleanup.ts +5 -3
  294. package/src/plugins/crdt/index.ts +55 -0
  295. package/src/plugins/dev-mode/check-query.ts +7 -1
  296. package/src/plugins/dev-mode/check-schema.ts +2 -1
  297. package/src/plugins/dev-mode/error-messages.ts +45 -5
  298. package/src/plugins/encryption-crypto-js/index.ts +18 -6
  299. package/src/plugins/leader-election/index.ts +9 -8
  300. package/src/plugins/local-documents/local-documents.ts +21 -12
  301. package/src/plugins/migration-schema/migration-helpers.ts +3 -0
  302. package/src/plugins/migration-schema/rx-migration-state.ts +1 -1
  303. package/src/plugins/pipeline/rx-pipeline.ts +5 -1
  304. package/src/plugins/query-builder/mquery/nosql-query-builder.ts +8 -2
  305. package/src/plugins/replication/index.ts +41 -3
  306. package/src/plugins/replication-google-drive/document-handling.ts +17 -5
  307. package/src/plugins/replication-google-drive/google-drive-helper.ts +1 -1
  308. package/src/plugins/replication-google-drive/google-drive-types.ts +1 -0
  309. package/src/plugins/replication-google-drive/signaling.ts +4 -1
  310. package/src/plugins/replication-google-drive/upstream.ts +7 -4
  311. package/src/plugins/replication-microsoft-onedrive/signaling.ts +4 -1
  312. package/src/plugins/state/rx-state.ts +17 -5
  313. package/src/plugins/storage-dexie/rx-storage-instance-dexie.ts +0 -27
  314. package/src/plugins/storage-memory/binary-search-bounds.ts +105 -40
  315. package/src/plugins/storage-memory/memory-helper.ts +158 -67
  316. package/src/plugins/storage-memory/memory-indexes.ts +1 -0
  317. package/src/plugins/storage-memory/memory-types.ts +5 -0
  318. package/src/plugins/storage-memory/rx-storage-instance-memory.ts +104 -53
  319. package/src/plugins/storage-mongodb/mongodb-helper.ts +43 -1
  320. package/src/plugins/storage-mongodb/rx-storage-instance-mongodb.ts +11 -9
  321. package/src/plugins/test-utils/config.ts +2 -1
  322. package/src/plugins/test-utils/performance.ts +159 -85
  323. package/src/plugins/test-utils/schema-objects.ts +1 -1
  324. package/src/plugins/test-utils/test-util.ts +71 -0
  325. package/src/plugins/utils/utils-map.ts +2 -2
  326. package/src/plugins/utils/utils-object-deep-equal.ts +2 -4
  327. package/src/plugins/utils/utils-object-dot-prop.ts +25 -0
  328. package/src/plugins/utils/utils-object.ts +103 -28
  329. package/src/plugins/utils/utils-other.ts +9 -4
  330. package/src/plugins/utils/utils-premium.ts +11 -37
  331. package/src/plugins/utils/utils-revision.ts +20 -9
  332. package/src/plugins/utils/utils-rxdb-version.ts +1 -1
  333. package/src/plugins/utils/utils-string.ts +11 -9
  334. package/src/plugins/utils/utils-time.ts +21 -17
  335. package/src/query-cache.ts +6 -5
  336. package/src/query-planner.ts +2 -2
  337. package/src/replication-protocol/downstream.ts +1 -1
  338. package/src/rx-collection-helper.ts +12 -6
  339. package/src/rx-collection.ts +39 -8
  340. package/src/rx-database.ts +49 -17
  341. package/src/rx-document.ts +12 -3
  342. package/src/rx-query-helper.ts +36 -15
  343. package/src/rx-query-single-result.ts +10 -3
  344. package/src/rx-query.ts +48 -8
  345. package/src/rx-schema-helper.ts +7 -4
  346. package/src/rx-schema.ts +1 -0
  347. package/src/rx-storage-helper.ts +210 -139
  348. package/src/types/rx-error.d.ts +3 -0
  349. package/src/types/rx-schema.d.ts +5 -0
@@ -1 +1 @@
1
- {"version":3,"file":"signaling.js","names":["_simplePeer","_interopRequireDefault","require","_connectionHandlerSimplePeer","_index","_microsoftOnedriveHelper","_rxjs","_rxError","BACKOFF_STEPS","MAX_BACKOFF_STEP_ID","length","SignalingState","exports","oneDriveState","init","signalingOptions","sessionId","randomToken","processedMessageIds","Set","_resync$","Subject","resync$","asObservable","peerBySenderId","Map","processQueue","PROMISE_RESOLVE_VOID","backoffStepId","closed","resetReaderFn","resetReadLoop","ensureProcessNextTickIsSet","cleanupOldSignalingMessages","signalingFolderId","catch","sendMessage","i","processNewMessages","window","addEventListener","document","time","skippable","promiseWaitSkippable","skipBackoffTime","skip","promise","_proto","prototype","data","messageId","fileName","now","join","add","baseUrl","getDriveBaseUrl","url","encodeURIComponent","res","fetch","method","headers","Authorization","authToken","body","JSON","stringify","ok","newRxFetchError","args","pingPeers","message","Array","from","values","forEach","peer","send","then","_processNewMessages","messages","readMessages","next","senderId","peerInstance","getFromMapOrCreate","_Peer","initiator","trickle","wrtc","config","on","signalData","dataBuffer","console","error","delete","promiseWait","signal","close","removeEventListener","destroy","complete","params","URLSearchParams","set","listUrl","toString","listResponse","listData","json","folderData","value","reverse","useFiles","filter","file","messageIdByFilename","name","has","filesContent","Promise","all","map","fileContent","readJsonFileContent","ensureNotFalsy","id","split","content","lastOfArray","DEFAULT_MAX_AGE_MS","maxAgeMs"],"sources":["../../../../src/plugins/replication-microsoft-onedrive/signaling.ts"],"sourcesContent":["import type {\r\n Instance as SimplePeerInstance\r\n} from 'simple-peer';\r\nimport _Peer from 'simple-peer';\r\nimport {\r\n ensureProcessNextTickIsSet,\r\n SimplePeerConfig,\r\n SimplePeerWrtc\r\n} from '../replication-webrtc/connection-handler-simple-peer';\r\nimport {\r\n ensureNotFalsy,\r\n getFromMapOrCreate,\r\n lastOfArray,\r\n now,\r\n PROMISE_RESOLVE_VOID,\r\n promiseWait,\r\n promiseWaitSkippable,\r\n randomToken\r\n} from '../utils/index.ts';\r\nimport { DriveStructure } from './init.ts';\r\nimport type {\r\n OneDriveItem,\r\n OneDriveState\r\n} from './microsoft-onedrive-types.ts';\r\nimport {\r\n deleteFile,\r\n getDriveBaseUrl,\r\n readJsonFileContent\r\n} from './microsoft-onedrive-helper.ts';\r\nimport { Subject } from 'rxjs';\r\nimport { newRxFetchError } from '../../rx-error.ts';\r\n\r\n\r\nexport type SignalingOptions = {\r\n wrtc?: SimplePeerWrtc;\r\n config?: SimplePeerConfig;\r\n};\r\n\r\n/**\r\n * Timings on when to call the api to check for new messages.\r\n */\r\nconst BACKOFF_STEPS = [\r\n 50,\r\n 50,\r\n 100,\r\n 100,\r\n 200,\r\n 400,\r\n 600,\r\n 1_000,\r\n 2_000,\r\n 4_000,\r\n 8_000,\r\n 15_000,\r\n 30_000,\r\n 60_000,\r\n 120_000\r\n];\r\nconst MAX_BACKOFF_STEP_ID = BACKOFF_STEPS.length - 1;\r\n\r\n\r\nexport type SIGNAL = 'RESYNC' | 'NEW_PEER';\r\n\r\nexport class SignalingState {\r\n public readonly sessionId = randomToken(12);\r\n public readonly processedMessageIds = new Set<string>();\r\n\r\n /**\r\n * Emits whenever a new connection\r\n * is there or some connection\r\n * told us to RESYNC\r\n */\r\n private _resync$ = new Subject<void>();\r\n public resync$ = this._resync$.asObservable();\r\n\r\n public peerBySenderId = new Map<string, SimplePeerInstance>();\r\n\r\n private processQueue: Promise<any> = PROMISE_RESOLVE_VOID;\r\n private backoffStepId = 0;\r\n private skipBackoffTime?: () => void;\r\n\r\n\r\n public closed = false;\r\n public resetReaderFn = () => {\r\n this.resetReadLoop();\r\n };\r\n\r\n constructor(\r\n private oneDriveState: OneDriveState,\r\n private init: DriveStructure,\r\n private signalingOptions: SignalingOptions\r\n ) {\r\n ensureProcessNextTickIsSet();\r\n cleanupOldSignalingMessages(\r\n this.oneDriveState,\r\n this.init.signalingFolderId\r\n ).catch(() => { });\r\n\r\n // Send \"i exist\" message\r\n this.sendMessage({ i: 'exist' });\r\n this.processNewMessages();\r\n\r\n if (typeof window !== 'undefined') {\r\n window.addEventListener('online', this.resetReaderFn);\r\n document.addEventListener('visibilitychange', this.resetReaderFn);\r\n\r\n }\r\n\r\n // start processing loop\r\n (async () => {\r\n while (!this.closed) {\r\n const time = BACKOFF_STEPS[this.backoffStepId];\r\n await this.processNewMessages();\r\n const skippable = promiseWaitSkippable(time);\r\n this.skipBackoffTime = skippable.skip;\r\n await skippable.promise;\r\n this.backoffStepId = this.backoffStepId + 1;\r\n if (this.backoffStepId > MAX_BACKOFF_STEP_ID) {\r\n this.backoffStepId = MAX_BACKOFF_STEP_ID;\r\n }\r\n }\r\n })();\r\n }\r\n\r\n async sendMessage(data: any) {\r\n const messageId = randomToken(12);\r\n const fileName = [\r\n this.sessionId,\r\n now(),\r\n messageId\r\n ].join('_') + '.json';\r\n\r\n // add here so we skip these\r\n this.processedMessageIds.add(messageId);\r\n\r\n const baseUrl = getDriveBaseUrl(this.oneDriveState);\r\n const url = `${baseUrl}/items/${this.init.signalingFolderId}:/${encodeURIComponent(fileName)}:/content`;\r\n\r\n const res = await fetch(url, {\r\n method: 'PUT',\r\n headers: {\r\n Authorization: `Bearer ${this.oneDriveState.authToken}`,\r\n 'Content-Type': 'application/json'\r\n },\r\n body: JSON.stringify(data)\r\n });\r\n\r\n if (!res.ok) {\r\n throw await newRxFetchError(res, { args: { fileName } });\r\n }\r\n }\r\n\r\n async pingPeers(message: SIGNAL) {\r\n Array.from(this.peerBySenderId.values()).forEach(peer => {\r\n peer.send(message);\r\n });\r\n }\r\n\r\n\r\n async resetReadLoop() {\r\n await this.processNewMessages();\r\n this.backoffStepId = 0;\r\n if (this.skipBackoffTime) {\r\n this.skipBackoffTime();\r\n }\r\n }\r\n\r\n async processNewMessages() {\r\n this.processQueue = this.processQueue.then(\r\n () => this._processNewMessages().catch(() => { })\r\n );\r\n return this.processQueue;\r\n }\r\n\r\n async _processNewMessages() {\r\n const messages = await readMessages(\r\n this.oneDriveState,\r\n this.init,\r\n this.processedMessageIds\r\n );\r\n if (messages.length > 0) {\r\n this._resync$.next();\r\n }\r\n messages.forEach(message => {\r\n const senderId = message.senderId;\r\n if (senderId === this.sessionId) {\r\n return;\r\n }\r\n let peerInstance: SimplePeerInstance;\r\n\r\n peerInstance = getFromMapOrCreate(\r\n this.peerBySenderId,\r\n senderId,\r\n () => {\r\n const peer = new _Peer({\r\n initiator: senderId > this.sessionId,\r\n trickle: true,\r\n wrtc: this.signalingOptions.wrtc,\r\n config: this.signalingOptions.config\r\n });\r\n peer.on(\"signal\", async (signalData: any) => {\r\n await this.sendMessage(signalData);\r\n });\r\n peer.on('connect', () => {\r\n this._resync$.next();\r\n });\r\n peer.on('data', (dataBuffer: any) => {\r\n const data = dataBuffer + '';\r\n switch (data) {\r\n case 'NEW_PEER':\r\n this.resetReadLoop();\r\n break;\r\n case 'RESYNC':\r\n this._resync$.next();\r\n break;\r\n default:\r\n console.error('Signaling UNKNOWN DATA ' + data);\r\n }\r\n });\r\n peer.on('error', () => {\r\n this._resync$.next();\r\n });\r\n peer.on('close', () => {\r\n this.peerBySenderId.delete(senderId);\r\n this._resync$.next();\r\n });\r\n\r\n\r\n /**\r\n * If we find a new peer,\r\n * we tell everyone else.\r\n */\r\n this.pingPeers('NEW_PEER');\r\n promiseWait().then(() => this._resync$.next());\r\n return peer;\r\n }\r\n );\r\n\r\n if (!message.data.i) {\r\n peerInstance.signal(message.data);\r\n }\r\n });\r\n }\r\n\r\n close() {\r\n this.closed = true;\r\n if (typeof window !== 'undefined') {\r\n window.removeEventListener('online', this.resetReaderFn);\r\n window.removeEventListener('visibilitychange', this.resetReaderFn);\r\n }\r\n Array.from(this.peerBySenderId.values()).forEach(peer => peer.destroy())\r\n this._resync$.complete();\r\n }\r\n}\r\n\r\n\r\nexport async function readMessages(\r\n oneDriveState: OneDriveState,\r\n init: DriveStructure,\r\n processedMessageIds: Set<string>\r\n): Promise<{ senderId: string; data: any }[]> {\r\n\r\n const baseUrl = getDriveBaseUrl(oneDriveState);\r\n const params = new URLSearchParams();\r\n params.set('$select', 'id,name,lastModifiedDateTime');\r\n params.set('$orderby', 'lastModifiedDateTime desc');\r\n params.set('$top', '1000');\r\n\r\n const listUrl = `${baseUrl}/items/${init.signalingFolderId}/children?${params.toString()}`;\r\n\r\n const listResponse = await fetch(listUrl, {\r\n method: 'GET',\r\n headers: {\r\n Authorization: 'Bearer ' + oneDriveState.authToken\r\n }\r\n });\r\n\r\n if (!listResponse.ok) {\r\n throw await newRxFetchError(listResponse);\r\n }\r\n\r\n const listData = await listResponse.json();\r\n let folderData: OneDriveItem[] = listData.value || [];\r\n folderData = folderData.reverse();\r\n\r\n const useFiles = folderData.filter(file => {\r\n const messageId = messageIdByFilename(file.name);\r\n return !processedMessageIds.has(messageId);\r\n });\r\n\r\n const filesContent = await Promise.all(\r\n useFiles.map(async (file) => {\r\n const fileContent = await readJsonFileContent<{ i?: string }>(\r\n oneDriveState,\r\n ensureNotFalsy(file.id) // Ensure TS is happy about string type for file id and string type return\r\n );\r\n const senderId = file.name.split('_')[0];\r\n return {\r\n senderId,\r\n data: fileContent.content\r\n };\r\n })\r\n );\r\n\r\n /**\r\n * Do this afterwards so we can retry on errors without losing messages.\r\n * (No need for async map here.)\r\n */\r\n useFiles.forEach((file) => {\r\n const messageId = messageIdByFilename(file.name);\r\n processedMessageIds.add(messageId);\r\n });\r\n\r\n return filesContent;\r\n}\r\n\r\nfunction messageIdByFilename(name: string): string {\r\n const fileName = name.split('.')[0];\r\n const messageId = ensureNotFalsy(lastOfArray(fileName.split('_')));\r\n return messageId;\r\n}\r\n\r\nconst DEFAULT_MAX_AGE_MS = 24 * 60 * 60 * 1000; // 1 day\r\n\r\nexport async function cleanupOldSignalingMessages(\r\n oneDriveState: OneDriveState,\r\n signalingFolderId: string,\r\n maxAgeMs: number = DEFAULT_MAX_AGE_MS\r\n): Promise<number> {\r\n\r\n // We can re-implement this properly, but for mock parity, google drive just returns 2 often.\r\n return 2;\r\n}\r\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"signaling.js","names":["_simplePeer","_interopRequireDefault","require","_connectionHandlerSimplePeer","_index","_microsoftOnedriveHelper","_rxjs","_rxError","BACKOFF_STEPS","MAX_BACKOFF_STEP_ID","length","SignalingState","exports","oneDriveState","init","signalingOptions","sessionId","randomToken","processedMessageIds","Set","_resync$","Subject","resync$","asObservable","peerBySenderId","Map","processQueue","PROMISE_RESOLVE_VOID","backoffStepId","closed","resetReaderFn","resetReadLoop","ensureProcessNextTickIsSet","cleanupOldSignalingMessages","signalingFolderId","catch","sendMessage","i","processNewMessages","window","addEventListener","document","time","skippable","promiseWaitSkippable","skipBackoffTime","skip","promise","_proto","prototype","data","messageId","fileName","now","join","add","baseUrl","getDriveBaseUrl","url","encodeURIComponent","res","fetch","method","headers","Authorization","authToken","body","JSON","stringify","ok","newRxFetchError","args","pingPeers","message","Array","from","values","forEach","peer","connected","send","then","_processNewMessages","messages","readMessages","next","senderId","peerInstance","getFromMapOrCreate","_Peer","initiator","trickle","wrtc","config","on","signalData","dataBuffer","console","error","delete","promiseWait","signal","close","removeEventListener","destroy","complete","params","URLSearchParams","set","listUrl","toString","listResponse","listData","json","folderData","value","reverse","useFiles","filter","file","messageIdByFilename","name","has","filesContent","Promise","all","map","fileContent","readJsonFileContent","ensureNotFalsy","id","split","content","lastOfArray","DEFAULT_MAX_AGE_MS","maxAgeMs"],"sources":["../../../../src/plugins/replication-microsoft-onedrive/signaling.ts"],"sourcesContent":["import type {\r\n Instance as SimplePeerInstance\r\n} from 'simple-peer';\r\nimport _Peer from 'simple-peer';\r\nimport {\r\n ensureProcessNextTickIsSet,\r\n SimplePeerConfig,\r\n SimplePeerWrtc\r\n} from '../replication-webrtc/connection-handler-simple-peer';\r\nimport {\r\n ensureNotFalsy,\r\n getFromMapOrCreate,\r\n lastOfArray,\r\n now,\r\n PROMISE_RESOLVE_VOID,\r\n promiseWait,\r\n promiseWaitSkippable,\r\n randomToken\r\n} from '../utils/index.ts';\r\nimport { DriveStructure } from './init.ts';\r\nimport type {\r\n OneDriveItem,\r\n OneDriveState\r\n} from './microsoft-onedrive-types.ts';\r\nimport {\r\n deleteFile,\r\n getDriveBaseUrl,\r\n readJsonFileContent\r\n} from './microsoft-onedrive-helper.ts';\r\nimport { Subject } from 'rxjs';\r\nimport { newRxFetchError } from '../../rx-error.ts';\r\n\r\n\r\nexport type SignalingOptions = {\r\n wrtc?: SimplePeerWrtc;\r\n config?: SimplePeerConfig;\r\n};\r\n\r\n/**\r\n * Timings on when to call the api to check for new messages.\r\n */\r\nconst BACKOFF_STEPS = [\r\n 50,\r\n 50,\r\n 100,\r\n 100,\r\n 200,\r\n 400,\r\n 600,\r\n 1_000,\r\n 2_000,\r\n 4_000,\r\n 8_000,\r\n 15_000,\r\n 30_000,\r\n 60_000,\r\n 120_000\r\n];\r\nconst MAX_BACKOFF_STEP_ID = BACKOFF_STEPS.length - 1;\r\n\r\n\r\nexport type SIGNAL = 'RESYNC' | 'NEW_PEER';\r\n\r\nexport class SignalingState {\r\n public readonly sessionId = randomToken(12);\r\n public readonly processedMessageIds = new Set<string>();\r\n\r\n /**\r\n * Emits whenever a new connection\r\n * is there or some connection\r\n * told us to RESYNC\r\n */\r\n private _resync$ = new Subject<void>();\r\n public resync$ = this._resync$.asObservable();\r\n\r\n public peerBySenderId = new Map<string, SimplePeerInstance>();\r\n\r\n private processQueue: Promise<any> = PROMISE_RESOLVE_VOID;\r\n private backoffStepId = 0;\r\n private skipBackoffTime?: () => void;\r\n\r\n\r\n public closed = false;\r\n public resetReaderFn = () => {\r\n this.resetReadLoop();\r\n };\r\n\r\n constructor(\r\n private oneDriveState: OneDriveState,\r\n private init: DriveStructure,\r\n private signalingOptions: SignalingOptions\r\n ) {\r\n ensureProcessNextTickIsSet();\r\n cleanupOldSignalingMessages(\r\n this.oneDriveState,\r\n this.init.signalingFolderId\r\n ).catch(() => { });\r\n\r\n // Send \"i exist\" message\r\n this.sendMessage({ i: 'exist' });\r\n this.processNewMessages();\r\n\r\n if (typeof window !== 'undefined') {\r\n window.addEventListener('online', this.resetReaderFn);\r\n document.addEventListener('visibilitychange', this.resetReaderFn);\r\n\r\n }\r\n\r\n // start processing loop\r\n (async () => {\r\n while (!this.closed) {\r\n const time = BACKOFF_STEPS[this.backoffStepId];\r\n await this.processNewMessages();\r\n const skippable = promiseWaitSkippable(time);\r\n this.skipBackoffTime = skippable.skip;\r\n await skippable.promise;\r\n this.backoffStepId = this.backoffStepId + 1;\r\n if (this.backoffStepId > MAX_BACKOFF_STEP_ID) {\r\n this.backoffStepId = MAX_BACKOFF_STEP_ID;\r\n }\r\n }\r\n })();\r\n }\r\n\r\n async sendMessage(data: any) {\r\n const messageId = randomToken(12);\r\n const fileName = [\r\n this.sessionId,\r\n now(),\r\n messageId\r\n ].join('_') + '.json';\r\n\r\n // add here so we skip these\r\n this.processedMessageIds.add(messageId);\r\n\r\n const baseUrl = getDriveBaseUrl(this.oneDriveState);\r\n const url = `${baseUrl}/items/${this.init.signalingFolderId}:/${encodeURIComponent(fileName)}:/content`;\r\n\r\n const res = await fetch(url, {\r\n method: 'PUT',\r\n headers: {\r\n Authorization: `Bearer ${this.oneDriveState.authToken}`,\r\n 'Content-Type': 'application/json'\r\n },\r\n body: JSON.stringify(data)\r\n });\r\n\r\n if (!res.ok) {\r\n throw await newRxFetchError(res, { args: { fileName } });\r\n }\r\n }\r\n\r\n async pingPeers(message: SIGNAL) {\r\n Array.from(this.peerBySenderId.values()).forEach(peer => {\r\n if (peer.connected) {\r\n peer.send(message);\r\n }\r\n });\r\n }\r\n\r\n\r\n async resetReadLoop() {\r\n await this.processNewMessages();\r\n this.backoffStepId = 0;\r\n if (this.skipBackoffTime) {\r\n this.skipBackoffTime();\r\n }\r\n }\r\n\r\n async processNewMessages() {\r\n this.processQueue = this.processQueue.then(\r\n () => this._processNewMessages().catch(() => { })\r\n );\r\n return this.processQueue;\r\n }\r\n\r\n async _processNewMessages() {\r\n const messages = await readMessages(\r\n this.oneDriveState,\r\n this.init,\r\n this.processedMessageIds\r\n );\r\n if (messages.length > 0) {\r\n this._resync$.next();\r\n }\r\n messages.forEach(message => {\r\n const senderId = message.senderId;\r\n if (senderId === this.sessionId) {\r\n return;\r\n }\r\n let peerInstance: SimplePeerInstance;\r\n\r\n peerInstance = getFromMapOrCreate(\r\n this.peerBySenderId,\r\n senderId,\r\n () => {\r\n const peer = new _Peer({\r\n initiator: senderId > this.sessionId,\r\n trickle: true,\r\n wrtc: this.signalingOptions.wrtc,\r\n config: this.signalingOptions.config\r\n });\r\n peer.on(\"signal\", async (signalData: any) => {\r\n await this.sendMessage(signalData);\r\n });\r\n peer.on('connect', () => {\r\n this._resync$.next();\r\n peer.send('RESYNC');\r\n });\r\n peer.on('data', (dataBuffer: any) => {\r\n const data = dataBuffer + '';\r\n switch (data) {\r\n case 'NEW_PEER':\r\n this.resetReadLoop();\r\n break;\r\n case 'RESYNC':\r\n this._resync$.next();\r\n break;\r\n default:\r\n console.error('Signaling UNKNOWN DATA ' + data);\r\n }\r\n });\r\n peer.on('error', () => {\r\n this._resync$.next();\r\n });\r\n peer.on('close', () => {\r\n this.peerBySenderId.delete(senderId);\r\n this._resync$.next();\r\n });\r\n\r\n\r\n /**\r\n * If we find a new peer,\r\n * we tell everyone else.\r\n */\r\n this.pingPeers('NEW_PEER');\r\n promiseWait().then(() => this._resync$.next());\r\n return peer;\r\n }\r\n );\r\n\r\n if (!message.data.i) {\r\n peerInstance.signal(message.data);\r\n }\r\n });\r\n }\r\n\r\n close() {\r\n this.closed = true;\r\n if (typeof window !== 'undefined') {\r\n window.removeEventListener('online', this.resetReaderFn);\r\n window.removeEventListener('visibilitychange', this.resetReaderFn);\r\n }\r\n Array.from(this.peerBySenderId.values()).forEach(peer => peer.destroy())\r\n this._resync$.complete();\r\n }\r\n}\r\n\r\n\r\nexport async function readMessages(\r\n oneDriveState: OneDriveState,\r\n init: DriveStructure,\r\n processedMessageIds: Set<string>\r\n): Promise<{ senderId: string; data: any }[]> {\r\n\r\n const baseUrl = getDriveBaseUrl(oneDriveState);\r\n const params = new URLSearchParams();\r\n params.set('$select', 'id,name,lastModifiedDateTime');\r\n params.set('$orderby', 'lastModifiedDateTime desc');\r\n params.set('$top', '1000');\r\n\r\n const listUrl = `${baseUrl}/items/${init.signalingFolderId}/children?${params.toString()}`;\r\n\r\n const listResponse = await fetch(listUrl, {\r\n method: 'GET',\r\n headers: {\r\n Authorization: 'Bearer ' + oneDriveState.authToken\r\n }\r\n });\r\n\r\n if (!listResponse.ok) {\r\n throw await newRxFetchError(listResponse);\r\n }\r\n\r\n const listData = await listResponse.json();\r\n let folderData: OneDriveItem[] = listData.value || [];\r\n folderData = folderData.reverse();\r\n\r\n const useFiles = folderData.filter(file => {\r\n const messageId = messageIdByFilename(file.name);\r\n return !processedMessageIds.has(messageId);\r\n });\r\n\r\n const filesContent = await Promise.all(\r\n useFiles.map(async (file) => {\r\n const fileContent = await readJsonFileContent<{ i?: string }>(\r\n oneDriveState,\r\n ensureNotFalsy(file.id) // Ensure TS is happy about string type for file id and string type return\r\n );\r\n const senderId = file.name.split('_')[0];\r\n return {\r\n senderId,\r\n data: fileContent.content\r\n };\r\n })\r\n );\r\n\r\n /**\r\n * Do this afterwards so we can retry on errors without losing messages.\r\n * (No need for async map here.)\r\n */\r\n useFiles.forEach((file) => {\r\n const messageId = messageIdByFilename(file.name);\r\n processedMessageIds.add(messageId);\r\n });\r\n\r\n return filesContent;\r\n}\r\n\r\nfunction messageIdByFilename(name: string): string {\r\n const fileName = name.split('.')[0];\r\n const messageId = ensureNotFalsy(lastOfArray(fileName.split('_')));\r\n return messageId;\r\n}\r\n\r\nconst DEFAULT_MAX_AGE_MS = 24 * 60 * 60 * 1000; // 1 day\r\n\r\nexport async function cleanupOldSignalingMessages(\r\n oneDriveState: OneDriveState,\r\n signalingFolderId: string,\r\n maxAgeMs: number = DEFAULT_MAX_AGE_MS\r\n): Promise<number> {\r\n\r\n // We can re-implement this properly, but for mock parity, google drive just returns 2 often.\r\n return 2;\r\n}\r\n"],"mappings":"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","ignoreList":[]}
@@ -95,7 +95,7 @@ var RxStateBase = exports.RxStateBase = /*#__PURE__*/function () {
95
95
  var ops = [];
96
96
  for (var index = 0; index < useWrites.length; index++) {
97
97
  var writeRow = useWrites[index];
98
- var value = (0, _index.getProperty)(newState, writeRow.path);
98
+ var value = writeRow.path === '' ? newState : (0, _index.getProperty)(newState, writeRow.path);
99
99
  var newValue = writeRow.modifier(value);
100
100
  /**
101
101
  * Here we have to clone the value because
@@ -129,6 +129,12 @@ var RxStateBase = exports.RxStateBase = /*#__PURE__*/function () {
129
129
  if (err.code !== 'CONFLICT') {
130
130
  throw err;
131
131
  }
132
+ /**
133
+ * Yield to the event loop so that cross-instance
134
+ * change events can be processed and the _lastIdQuery
135
+ * cache gets updated before retrying.
136
+ */
137
+ await (0, _index.promiseWait)(0);
132
138
  }
133
139
  }
134
140
  }).catch(error => {
@@ -245,7 +251,7 @@ async function createRxState(database, prefix) {
245
251
  } else {
246
252
  for (var index = 0; index < documents.length; index++) {
247
253
  var document = documents[index];
248
- mergeOperationsIntoState(rxState._state, document.ops);
254
+ rxState._state = mergeOperationsIntoState(rxState._state, document.ops);
249
255
  }
250
256
  }
251
257
  }
@@ -287,7 +293,12 @@ async function createRxState(database, prefix) {
287
293
  function mergeOperationsIntoState(state, operations) {
288
294
  for (var index = 0; index < operations.length; index++) {
289
295
  var operation = operations[index];
290
- (0, _index.setProperty)(state, operation.k, (0, _index.clone)(operation.v));
296
+ if (operation.k === '') {
297
+ state = (0, _index.clone)(operation.v);
298
+ } else {
299
+ (0, _index.setProperty)(state, operation.k, (0, _index.clone)(operation.v));
300
+ }
291
301
  }
302
+ return state;
292
303
  }
293
304
  //# sourceMappingURL=rx-state.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"rx-state.js","names":["_rxjs","require","_overwritable","_rxStorageHelper","_index","_helpers","_rxError","_hooks","debugId","deepFrozenCache","WeakMap","RxStateBase","exports","prefix","collection","_id","_state","_nonPersisted","_writeQueue","PROMISE_RESOLVE_VOID","_initDone","_instanceId","randomToken","RX_STATE_COLLECTION_SCHEMA","properties","sId","maxLength","_ownEmits$","Subject","onClose","push","_lastIdQuery","findOne","sort","id","$","subscribe","merge","eventBulks$","pipe","tap","eventBulk","events","index","length","event","operation","documentData","mergeOperationsIntoState","ops","shareReplay","RXJS_SHARE_REPLAY_DEFAULTS","map","_proto","prototype","set","path","modifier","_triggerWrite","then","useWrites","done","lastIdDoc","exec","concat","nextId","nextRxStateId","undefined","newState","clone","writeRow","value","getProperty","newValue","setProperty","k","v","insert","next","err","code","catch","error","newRxError","name","operations","state","get","ret","overwritable","isDevMode","isValidWeakMapKey","frozen","getFromMapOrCreate","deepFreezeWhenDevMode","get$","startWith","distinctUntilChanged","deepEqual","get$$","obs","reactivity","database","getReactivityFactory","fromObservable","_cleanup","firstWrite","lastWrite","firstNr","parseInt","lastNr","find","selector","$lte","remove","createRxState","collectionName","addCollections","schema","collections","rxState","checkpoint","result","getChangedDocumentsSince","storageInstance","documents","document","proxy","Proxy","target","property","bind","lastChar","charAt","endsWith","key","slice","receiver","Error","runPluginHooks"],"sources":["../../../../src/plugins/state/rx-state.ts"],"sourcesContent":["import {\r\n Observable,\r\n Subject,\r\n distinctUntilChanged,\r\n map,\r\n merge,\r\n shareReplay,\r\n startWith,\r\n tap\r\n} from 'rxjs';\r\nimport { overwritable } from '../../overwritable.ts';\r\nimport { getChangedDocumentsSince } from '../../rx-storage-helper.ts';\r\nimport type {\r\n RxChangeEventBulk,\r\n RxCollection,\r\n RxDatabase,\r\n RxQuery,\r\n RxDocument,\r\n RxError,\r\n Paths\r\n} from '../../types';\r\nimport {\r\n RXJS_SHARE_REPLAY_DEFAULTS,\r\n getProperty,\r\n setProperty,\r\n PROMISE_RESOLVE_VOID,\r\n clone,\r\n randomToken,\r\n deepEqual,\r\n getFromMapOrCreate\r\n} from '../utils/index.ts';\r\nimport {\r\n RX_STATE_COLLECTION_SCHEMA,\r\n isValidWeakMapKey,\r\n nextRxStateId\r\n} from './helpers.ts';\r\nimport {\r\n RxStateDocument,\r\n RxStateOperation,\r\n RxStateModifier\r\n} from './types.ts';\r\nimport { newRxError } from '../../rx-error.ts';\r\nimport { runPluginHooks } from '../../hooks.ts';\r\n\r\n\r\nlet debugId = 0;\r\n\r\n\r\nconst deepFrozenCache = new WeakMap<any, any>();\r\n\r\n/**\r\n * RxDB internally used properties are\r\n * prefixed with lodash _ to make them less\r\n * likely to clash with actual state properties\r\n * from the user.\r\n */\r\nexport class RxStateBase<T, Reactivity = unknown> {\r\n // used for debugging\r\n public _id: number = debugId++;\r\n public _state: T | any = {};\r\n public $: Observable<T>;\r\n public _lastIdQuery: RxQuery<RxStateDocument, RxDocument<RxStateDocument, {}> | null>;\r\n public _nonPersisted: {\r\n path: string;\r\n modifier: RxStateModifier;\r\n }[] = [];\r\n public _writeQueue = PROMISE_RESOLVE_VOID;\r\n public _initDone = false;\r\n public _instanceId = randomToken(RX_STATE_COLLECTION_SCHEMA.properties.sId.maxLength);\r\n public _ownEmits$ = new Subject<T>();\r\n\r\n constructor(\r\n public readonly prefix: string,\r\n public readonly collection: RxCollection<RxStateDocument>\r\n ) {\r\n this.collection.onClose.push(() => this._writeQueue);\r\n this._lastIdQuery = this.collection.findOne({\r\n sort: [\r\n { id: 'desc' }\r\n ]\r\n });\r\n // make it \"hot\" for better write performance\r\n this._lastIdQuery.$.subscribe();\r\n\r\n this.$ = merge(\r\n this._ownEmits$,\r\n this.collection.eventBulks$.pipe(\r\n tap((eventBulk: RxChangeEventBulk<RxStateDocument>) => {\r\n if (!this._initDone) {\r\n return;\r\n }\r\n const events = eventBulk.events;\r\n for (let index = 0; index < events.length; index++) {\r\n const event = events[index];\r\n if (\r\n event.operation === 'INSERT' &&\r\n event.documentData.sId !== this._instanceId\r\n ) {\r\n this.mergeOperationsIntoState(event.documentData.ops);\r\n }\r\n }\r\n })\r\n )\r\n ).pipe(\r\n shareReplay(RXJS_SHARE_REPLAY_DEFAULTS),\r\n map(() => this._state)\r\n );\r\n // directly subscribe because of the tap() side effect\r\n this.$.subscribe();\r\n }\r\n\r\n async set(\r\n path: Paths<T> | '',\r\n modifier: RxStateModifier\r\n ) {\r\n this._nonPersisted.push({\r\n path,\r\n modifier\r\n });\r\n return this._triggerWrite();\r\n }\r\n\r\n /**\r\n * To have deterministic writes,\r\n * and to ensure that multiple js realms do not overwrite\r\n * each other, the write happens with incremental ids\r\n * that would throw conflict errors and trigger a retry.\r\n */\r\n _triggerWrite() {\r\n this._writeQueue = this._writeQueue.then(async () => {\r\n if (this._nonPersisted.length === 0) {\r\n return;\r\n }\r\n let useWrites: typeof this._nonPersisted = [];\r\n let done = false;\r\n while (!done) {\r\n const lastIdDoc = await this._lastIdQuery.exec();\r\n useWrites = useWrites.concat(this._nonPersisted);\r\n this._nonPersisted = [];\r\n const nextId = nextRxStateId(lastIdDoc ? lastIdDoc.id : undefined);\r\n try {\r\n /**\r\n * TODO instead of a deep-clone we should\r\n * only clone the parts where we know that they\r\n * will be changed. This would improve performance.\r\n */\r\n let newState = clone(this._state);\r\n const ops: RxStateOperation[] = [];\r\n for (let index = 0; index < useWrites.length; index++) {\r\n const writeRow = useWrites[index];\r\n const value = getProperty(newState, writeRow.path);\r\n const newValue = writeRow.modifier(value);\r\n /**\r\n * Here we have to clone the value because\r\n * some storages like the memory storage\r\n * make input data deep-frozen in dev-mode.\r\n */\r\n if (writeRow.path === '') {\r\n newState = clone(newValue);\r\n } else {\r\n setProperty(newState, writeRow.path, clone(newValue));\r\n }\r\n ops.push({\r\n k: writeRow.path,\r\n /**\r\n * Here we have to clone the value because\r\n * some storages like the memory storage\r\n * make input data deep-frozen in dev-mode.\r\n */\r\n v: clone(newValue)\r\n });\r\n }\r\n await this.collection.insert({\r\n id: nextId,\r\n sId: this._instanceId,\r\n ops\r\n });\r\n this._state = newState;\r\n this._ownEmits$.next(this._state);\r\n done = true;\r\n } catch (err) {\r\n if ((err as RxError).code !== 'CONFLICT') {\r\n throw err;\r\n }\r\n }\r\n }\r\n }).catch(error => {\r\n throw newRxError('SNH', {\r\n name: 'RxState WRITE QUEUE ERROR',\r\n error\r\n });\r\n });\r\n return this._writeQueue;\r\n }\r\n\r\n mergeOperationsIntoState(\r\n operations: RxStateOperation[]\r\n ) {\r\n let state = clone(this._state);\r\n for (let index = 0; index < operations.length; index++) {\r\n const operation = operations[index];\r\n if (operation.k === '') {\r\n state = clone(operation.v);\r\n } else {\r\n setProperty(state, operation.k, clone(operation.v));\r\n }\r\n }\r\n this._state = state;\r\n }\r\n get(path?: Paths<T>) {\r\n let ret;\r\n if (!path) {\r\n ret = this._state;\r\n } else {\r\n ret = getProperty(this._state, path);\r\n }\r\n\r\n /**\r\n * In dev-mode we have to clone the value before deep-freezing\r\n * it to not have an immutable subobject in the state value.\r\n * But calling .get() with the same path multiple times,\r\n * should return exactly the same object instance\r\n * so it does not cause re-renders on react.\r\n * So in dev-mode we have to \r\n */\r\n if (overwritable.isDevMode() && isValidWeakMapKey(ret)) {\r\n const frozen = getFromMapOrCreate(\r\n deepFrozenCache,\r\n ret,\r\n () => overwritable.deepFreezeWhenDevMode(clone(ret))\r\n );\r\n return frozen;\r\n }\r\n\r\n return ret;\r\n }\r\n get$(path?: Paths<T>): Observable<any> {\r\n return this.$.pipe(\r\n map(() => this.get(path)),\r\n startWith(this.get(path)),\r\n distinctUntilChanged(deepEqual),\r\n shareReplay(RXJS_SHARE_REPLAY_DEFAULTS),\r\n );\r\n }\r\n get$$(path?: Paths<T>): Reactivity {\r\n const obs = this.get$(path);\r\n const reactivity = this.collection.database.getReactivityFactory();\r\n return reactivity.fromObservable(\r\n obs,\r\n this.get(path),\r\n this.collection.database\r\n ) as any;\r\n }\r\n\r\n /**\r\n * Merges the state operations into a single write row\r\n * to store space and make recreating the state from\r\n * disc faster.\r\n */\r\n async _cleanup() {\r\n const firstWrite = await this.collection.findOne({\r\n sort: [{ id: 'asc' }]\r\n }).exec();\r\n const lastWrite = await this._lastIdQuery.exec();\r\n\r\n if (!firstWrite || !lastWrite) {\r\n return;\r\n }\r\n\r\n const firstNr = parseInt(firstWrite.id, 10);\r\n const lastNr = parseInt(lastWrite.id, 10);\r\n if ((lastNr - 5) < firstNr) {\r\n // only run if more than 5 write rows\r\n return;\r\n }\r\n\r\n // update whole state object\r\n await this._writeQueue;\r\n await this.set('', () => this._state);\r\n\r\n // delete old ones\r\n await this.collection.find({\r\n selector: {\r\n id: {\r\n $lte: lastWrite.id\r\n }\r\n }\r\n }).remove();\r\n }\r\n}\r\n\r\n\r\nexport async function createRxState<T>(\r\n database: RxDatabase,\r\n prefix: string\r\n): Promise<RxStateBase<T>> {\r\n const collectionName = 'rx-state-' + prefix;\r\n await database.addCollections({\r\n [collectionName]: {\r\n schema: RX_STATE_COLLECTION_SCHEMA as any\r\n }\r\n });\r\n const collection: RxCollection<RxStateDocument> = database.collections[collectionName];\r\n\r\n const rxState = new RxStateBase<T>(\r\n prefix,\r\n collection\r\n );\r\n\r\n\r\n /**\r\n * Directly get the state and put it into memory.\r\n * This ensures we can do non-async accesses to the\r\n * correct state.\r\n */\r\n let done = false;\r\n let checkpoint: any = undefined;\r\n while (!done) {\r\n const result = await getChangedDocumentsSince<RxStateDocument, any>(\r\n collection.storageInstance,\r\n 1000,\r\n checkpoint\r\n );\r\n checkpoint = result.checkpoint;\r\n const documents = result.documents;\r\n if (documents.length === 0) {\r\n done = true;\r\n } else {\r\n for (let index = 0; index < documents.length; index++) {\r\n const document = documents[index];\r\n mergeOperationsIntoState(rxState._state, document.ops);\r\n }\r\n }\r\n }\r\n rxState._initDone = true;\r\n\r\n const proxy = new Proxy(\r\n rxState as any,\r\n {\r\n get(target, property: any) {\r\n if (typeof property !== 'string') {\r\n return target[property];\r\n }\r\n if ((rxState as any)[property]) {\r\n const ret = (rxState as any)[property];\r\n if (typeof ret === 'function') {\r\n return ret.bind(rxState);\r\n } else {\r\n return ret;\r\n }\r\n }\r\n const lastChar = property.charAt(property.length - 1);\r\n if (property.endsWith('$$')) {\r\n const key = property.slice(0, -2);\r\n return rxState.get$$(key as any);\r\n } else if (lastChar === '$') {\r\n const key = property.slice(0, -1);\r\n return rxState.get$(key as any);\r\n } else {\r\n return rxState.get(property as any);\r\n }\r\n },\r\n set(target, newValue, receiver) {\r\n throw new Error('Do not write to RxState');\r\n }\r\n }\r\n );\r\n\r\n runPluginHooks('createRxState', {\r\n collection,\r\n state: proxy\r\n });\r\n\r\n return proxy;\r\n}\r\n\r\n\r\nexport function mergeOperationsIntoState<T>(\r\n state: T,\r\n operations: RxStateOperation[]\r\n) {\r\n for (let index = 0; index < operations.length; index++) {\r\n const operation = operations[index];\r\n setProperty(state, operation.k, clone(operation.v));\r\n }\r\n}\r\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"rx-state.js","names":["_rxjs","require","_overwritable","_rxStorageHelper","_index","_helpers","_rxError","_hooks","debugId","deepFrozenCache","WeakMap","RxStateBase","exports","prefix","collection","_id","_state","_nonPersisted","_writeQueue","PROMISE_RESOLVE_VOID","_initDone","_instanceId","randomToken","RX_STATE_COLLECTION_SCHEMA","properties","sId","maxLength","_ownEmits$","Subject","onClose","push","_lastIdQuery","findOne","sort","id","$","subscribe","merge","eventBulks$","pipe","tap","eventBulk","events","index","length","event","operation","documentData","mergeOperationsIntoState","ops","shareReplay","RXJS_SHARE_REPLAY_DEFAULTS","map","_proto","prototype","set","path","modifier","_triggerWrite","then","useWrites","done","lastIdDoc","exec","concat","nextId","nextRxStateId","undefined","newState","clone","writeRow","value","getProperty","newValue","setProperty","k","v","insert","next","err","code","promiseWait","catch","error","newRxError","name","operations","state","get","ret","overwritable","isDevMode","isValidWeakMapKey","frozen","getFromMapOrCreate","deepFreezeWhenDevMode","get$","startWith","distinctUntilChanged","deepEqual","get$$","obs","reactivity","database","getReactivityFactory","fromObservable","_cleanup","firstWrite","lastWrite","firstNr","parseInt","lastNr","find","selector","$lte","remove","createRxState","collectionName","addCollections","schema","collections","rxState","checkpoint","result","getChangedDocumentsSince","storageInstance","documents","document","proxy","Proxy","target","property","bind","lastChar","charAt","endsWith","key","slice","receiver","Error","runPluginHooks"],"sources":["../../../../src/plugins/state/rx-state.ts"],"sourcesContent":["import {\r\n Observable,\r\n Subject,\r\n distinctUntilChanged,\r\n map,\r\n merge,\r\n shareReplay,\r\n startWith,\r\n tap\r\n} from 'rxjs';\r\nimport { overwritable } from '../../overwritable.ts';\r\nimport { getChangedDocumentsSince } from '../../rx-storage-helper.ts';\r\nimport type {\r\n RxChangeEventBulk,\r\n RxCollection,\r\n RxDatabase,\r\n RxQuery,\r\n RxDocument,\r\n RxError,\r\n Paths\r\n} from '../../types';\r\nimport {\r\n RXJS_SHARE_REPLAY_DEFAULTS,\r\n getProperty,\r\n setProperty,\r\n PROMISE_RESOLVE_VOID,\r\n clone,\r\n randomToken,\r\n deepEqual,\r\n getFromMapOrCreate,\r\n promiseWait\r\n} from '../utils/index.ts';\r\nimport {\r\n RX_STATE_COLLECTION_SCHEMA,\r\n isValidWeakMapKey,\r\n nextRxStateId\r\n} from './helpers.ts';\r\nimport {\r\n RxStateDocument,\r\n RxStateOperation,\r\n RxStateModifier\r\n} from './types.ts';\r\nimport { newRxError } from '../../rx-error.ts';\r\nimport { runPluginHooks } from '../../hooks.ts';\r\n\r\n\r\nlet debugId = 0;\r\n\r\n\r\nconst deepFrozenCache = new WeakMap<any, any>();\r\n\r\n/**\r\n * RxDB internally used properties are\r\n * prefixed with lodash _ to make them less\r\n * likely to clash with actual state properties\r\n * from the user.\r\n */\r\nexport class RxStateBase<T, Reactivity = unknown> {\r\n // used for debugging\r\n public _id: number = debugId++;\r\n public _state: T | any = {};\r\n public $: Observable<T>;\r\n public _lastIdQuery: RxQuery<RxStateDocument, RxDocument<RxStateDocument, {}> | null>;\r\n public _nonPersisted: {\r\n path: string;\r\n modifier: RxStateModifier;\r\n }[] = [];\r\n public _writeQueue = PROMISE_RESOLVE_VOID;\r\n public _initDone = false;\r\n public _instanceId = randomToken(RX_STATE_COLLECTION_SCHEMA.properties.sId.maxLength);\r\n public _ownEmits$ = new Subject<T>();\r\n\r\n constructor(\r\n public readonly prefix: string,\r\n public readonly collection: RxCollection<RxStateDocument>\r\n ) {\r\n this.collection.onClose.push(() => this._writeQueue);\r\n this._lastIdQuery = this.collection.findOne({\r\n sort: [\r\n { id: 'desc' }\r\n ]\r\n });\r\n // make it \"hot\" for better write performance\r\n this._lastIdQuery.$.subscribe();\r\n\r\n this.$ = merge(\r\n this._ownEmits$,\r\n this.collection.eventBulks$.pipe(\r\n tap((eventBulk: RxChangeEventBulk<RxStateDocument>) => {\r\n if (!this._initDone) {\r\n return;\r\n }\r\n const events = eventBulk.events;\r\n for (let index = 0; index < events.length; index++) {\r\n const event = events[index];\r\n if (\r\n event.operation === 'INSERT' &&\r\n event.documentData.sId !== this._instanceId\r\n ) {\r\n this.mergeOperationsIntoState(event.documentData.ops);\r\n }\r\n }\r\n })\r\n )\r\n ).pipe(\r\n shareReplay(RXJS_SHARE_REPLAY_DEFAULTS),\r\n map(() => this._state)\r\n );\r\n // directly subscribe because of the tap() side effect\r\n this.$.subscribe();\r\n }\r\n\r\n async set(\r\n path: Paths<T> | '',\r\n modifier: RxStateModifier\r\n ) {\r\n this._nonPersisted.push({\r\n path,\r\n modifier\r\n });\r\n return this._triggerWrite();\r\n }\r\n\r\n /**\r\n * To have deterministic writes,\r\n * and to ensure that multiple js realms do not overwrite\r\n * each other, the write happens with incremental ids\r\n * that would throw conflict errors and trigger a retry.\r\n */\r\n _triggerWrite() {\r\n this._writeQueue = this._writeQueue.then(async () => {\r\n if (this._nonPersisted.length === 0) {\r\n return;\r\n }\r\n let useWrites: typeof this._nonPersisted = [];\r\n let done = false;\r\n while (!done) {\r\n const lastIdDoc = await this._lastIdQuery.exec();\r\n useWrites = useWrites.concat(this._nonPersisted);\r\n this._nonPersisted = [];\r\n const nextId = nextRxStateId(lastIdDoc ? lastIdDoc.id : undefined);\r\n try {\r\n /**\r\n * TODO instead of a deep-clone we should\r\n * only clone the parts where we know that they\r\n * will be changed. This would improve performance.\r\n */\r\n let newState = clone(this._state);\r\n const ops: RxStateOperation[] = [];\r\n for (let index = 0; index < useWrites.length; index++) {\r\n const writeRow = useWrites[index];\r\n const value = writeRow.path === '' ? newState : getProperty(newState, writeRow.path);\r\n const newValue = writeRow.modifier(value);\r\n /**\r\n * Here we have to clone the value because\r\n * some storages like the memory storage\r\n * make input data deep-frozen in dev-mode.\r\n */\r\n if (writeRow.path === '') {\r\n newState = clone(newValue);\r\n } else {\r\n setProperty(newState, writeRow.path, clone(newValue));\r\n }\r\n ops.push({\r\n k: writeRow.path,\r\n /**\r\n * Here we have to clone the value because\r\n * some storages like the memory storage\r\n * make input data deep-frozen in dev-mode.\r\n */\r\n v: clone(newValue)\r\n });\r\n }\r\n await this.collection.insert({\r\n id: nextId,\r\n sId: this._instanceId,\r\n ops\r\n });\r\n this._state = newState;\r\n this._ownEmits$.next(this._state);\r\n done = true;\r\n } catch (err) {\r\n if ((err as RxError).code !== 'CONFLICT') {\r\n throw err;\r\n }\r\n /**\r\n * Yield to the event loop so that cross-instance\r\n * change events can be processed and the _lastIdQuery\r\n * cache gets updated before retrying.\r\n */\r\n await promiseWait(0);\r\n }\r\n }\r\n }).catch(error => {\r\n throw newRxError('SNH', {\r\n name: 'RxState WRITE QUEUE ERROR',\r\n error\r\n });\r\n });\r\n return this._writeQueue;\r\n }\r\n\r\n mergeOperationsIntoState(\r\n operations: RxStateOperation[]\r\n ) {\r\n let state = clone(this._state);\r\n for (let index = 0; index < operations.length; index++) {\r\n const operation = operations[index];\r\n if (operation.k === '') {\r\n state = clone(operation.v);\r\n } else {\r\n setProperty(state, operation.k, clone(operation.v));\r\n }\r\n }\r\n this._state = state;\r\n }\r\n get(path?: Paths<T>) {\r\n let ret;\r\n if (!path) {\r\n ret = this._state;\r\n } else {\r\n ret = getProperty(this._state, path);\r\n }\r\n\r\n /**\r\n * In dev-mode we have to clone the value before deep-freezing\r\n * it to not have an immutable subobject in the state value.\r\n * But calling .get() with the same path multiple times,\r\n * should return exactly the same object instance\r\n * so it does not cause re-renders on react.\r\n * So in dev-mode we have to \r\n */\r\n if (overwritable.isDevMode() && isValidWeakMapKey(ret)) {\r\n const frozen = getFromMapOrCreate(\r\n deepFrozenCache,\r\n ret,\r\n () => overwritable.deepFreezeWhenDevMode(clone(ret))\r\n );\r\n return frozen;\r\n }\r\n\r\n return ret;\r\n }\r\n get$(path?: Paths<T>): Observable<any> {\r\n return this.$.pipe(\r\n map(() => this.get(path)),\r\n startWith(this.get(path)),\r\n distinctUntilChanged(deepEqual),\r\n shareReplay(RXJS_SHARE_REPLAY_DEFAULTS),\r\n );\r\n }\r\n get$$(path?: Paths<T>): Reactivity {\r\n const obs = this.get$(path);\r\n const reactivity = this.collection.database.getReactivityFactory();\r\n return reactivity.fromObservable(\r\n obs,\r\n this.get(path),\r\n this.collection.database\r\n ) as any;\r\n }\r\n\r\n /**\r\n * Merges the state operations into a single write row\r\n * to store space and make recreating the state from\r\n * disc faster.\r\n */\r\n async _cleanup() {\r\n const firstWrite = await this.collection.findOne({\r\n sort: [{ id: 'asc' }]\r\n }).exec();\r\n const lastWrite = await this._lastIdQuery.exec();\r\n\r\n if (!firstWrite || !lastWrite) {\r\n return;\r\n }\r\n\r\n const firstNr = parseInt(firstWrite.id, 10);\r\n const lastNr = parseInt(lastWrite.id, 10);\r\n if ((lastNr - 5) < firstNr) {\r\n // only run if more than 5 write rows\r\n return;\r\n }\r\n\r\n // update whole state object\r\n await this._writeQueue;\r\n await this.set('', () => this._state);\r\n\r\n // delete old ones\r\n await this.collection.find({\r\n selector: {\r\n id: {\r\n $lte: lastWrite.id\r\n }\r\n }\r\n }).remove();\r\n }\r\n}\r\n\r\n\r\nexport async function createRxState<T>(\r\n database: RxDatabase,\r\n prefix: string\r\n): Promise<RxStateBase<T>> {\r\n const collectionName = 'rx-state-' + prefix;\r\n await database.addCollections({\r\n [collectionName]: {\r\n schema: RX_STATE_COLLECTION_SCHEMA as any\r\n }\r\n });\r\n const collection: RxCollection<RxStateDocument> = database.collections[collectionName];\r\n\r\n const rxState = new RxStateBase<T>(\r\n prefix,\r\n collection\r\n );\r\n\r\n\r\n /**\r\n * Directly get the state and put it into memory.\r\n * This ensures we can do non-async accesses to the\r\n * correct state.\r\n */\r\n let done = false;\r\n let checkpoint: any = undefined;\r\n while (!done) {\r\n const result = await getChangedDocumentsSince<RxStateDocument, any>(\r\n collection.storageInstance,\r\n 1000,\r\n checkpoint\r\n );\r\n checkpoint = result.checkpoint;\r\n const documents = result.documents;\r\n if (documents.length === 0) {\r\n done = true;\r\n } else {\r\n for (let index = 0; index < documents.length; index++) {\r\n const document = documents[index];\r\n rxState._state = mergeOperationsIntoState(rxState._state, document.ops);\r\n }\r\n }\r\n }\r\n rxState._initDone = true;\r\n\r\n const proxy = new Proxy(\r\n rxState as any,\r\n {\r\n get(target, property: any) {\r\n if (typeof property !== 'string') {\r\n return target[property];\r\n }\r\n if ((rxState as any)[property]) {\r\n const ret = (rxState as any)[property];\r\n if (typeof ret === 'function') {\r\n return ret.bind(rxState);\r\n } else {\r\n return ret;\r\n }\r\n }\r\n const lastChar = property.charAt(property.length - 1);\r\n if (property.endsWith('$$')) {\r\n const key = property.slice(0, -2);\r\n return rxState.get$$(key as any);\r\n } else if (lastChar === '$') {\r\n const key = property.slice(0, -1);\r\n return rxState.get$(key as any);\r\n } else {\r\n return rxState.get(property as any);\r\n }\r\n },\r\n set(target, newValue, receiver) {\r\n throw new Error('Do not write to RxState');\r\n }\r\n }\r\n );\r\n\r\n runPluginHooks('createRxState', {\r\n collection,\r\n state: proxy\r\n });\r\n\r\n return proxy;\r\n}\r\n\r\n\r\nexport function mergeOperationsIntoState<T>(\r\n state: T,\r\n operations: RxStateOperation[]\r\n): T {\r\n for (let index = 0; index < operations.length; index++) {\r\n const operation = operations[index];\r\n if (operation.k === '') {\r\n state = clone(operation.v);\r\n } else {\r\n setProperty(state, operation.k, clone(operation.v));\r\n }\r\n }\r\n return state;\r\n}\r\n"],"mappings":"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","ignoreList":[]}
@@ -14,7 +14,6 @@ var _rxStorageHelper = require("../../rx-storage-helper.js");
14
14
  var _rxStorageMultiinstance = require("../../rx-storage-multiinstance.js");
15
15
  var _rxError = require("../../rx-error.js");
16
16
  var instanceId = (0, _index.now)();
17
- var shownNonPremiumLog = false;
18
17
  var RxStorageInstanceDexie = exports.RxStorageInstanceDexie = /*#__PURE__*/function () {
19
18
  function RxStorageInstanceDexie(storage, databaseName, collectionName, schema, internals, options, settings, devMode) {
20
19
  this.changes$ = new _rxjs.Subject();
@@ -32,12 +31,6 @@ var RxStorageInstanceDexie = exports.RxStorageInstanceDexie = /*#__PURE__*/funct
32
31
  var _proto = RxStorageInstanceDexie.prototype;
33
32
  _proto.bulkWrite = async function bulkWrite(documentWrites, context) {
34
33
  ensureNotClosed(this);
35
- if (!shownNonPremiumLog && !(await (0, _index.hasPremiumFlag)())) {
36
- console.warn(['-------------- RxDB Open Core RxStorage -------------------------------', 'You are using the free Dexie.js based RxStorage implementation from RxDB https://rxdb.info/rx-storage-dexie.html?console=dexie ', 'While this is a great option, we want to let you know that there are faster storage solutions available in our premium plugins.', 'For professional users and production environments, we highly recommend considering these premium options to enhance performance and reliability.', ' https://rxdb.info/premium/?console=dexie ', 'If you already purchased premium access you can disable this log by calling the setPremiumFlag() function from rxdb-premium/plugins/shared.', '---------------------------------------------------------------------'].join('\n'));
37
- shownNonPremiumLog = true;
38
- } else {
39
- shownNonPremiumLog = true;
40
- }
41
34
 
42
35
  /**
43
36
  * Check some assumptions to ensure RxDB
@@ -1 +1 @@
1
- {"version":3,"file":"rx-storage-instance-dexie.js","names":["_rxjs","require","_index","_dexieHelper","_dexieQuery","_rxSchemaHelper","_rxStorageHelper","_rxStorageMultiinstance","_rxError","instanceId","now","shownNonPremiumLog","RxStorageInstanceDexie","exports","storage","databaseName","collectionName","schema","internals","options","settings","devMode","changes$","Subject","primaryPath","getPrimaryFieldOfPrimaryKey","primaryKey","_proto","prototype","bulkWrite","documentWrites","context","ensureNotClosed","hasPremiumFlag","console","warn","join","forEach","row","document","_rev","previous","newRxError","args","state","ret","error","map","doc","flatCloneDocWithMeta","documentKeys","writeRow","categorized","dexieDb","transaction","dexieTable","dexieAttachmentsTable","docsInDbMap","Map","docsInDbWithInternals","getDocsInDb","docWithDexieInternals","set","categorizeBulkWriteRows","errors","bulkPutDocs","bulkInsertDocs","push","bulkUpdateDocs","d","fromStorageToDexie","booleanIndexes","length","bulkPut","putAttachments","attachmentsAdd","attachment","id","attachmentObjectId","documentId","attachmentId","data","attachmentData","attachmentsUpdate","bulkDelete","attachmentsRemove","ensureNotFalsy","eventBulk","events","lastState","newestRow","checkpoint","lwt","_meta","next","findDocumentsById","ids","deleted","docsInDb","documentInDb","_deleted","query","preparedQuery","dexieQuery","count","queryPlan","selectorSatisfiedByIndex","result","dexieCount","mode","documents","changeStream","asObservable","cleanup","minimumDeletedTime","maxDeletionTime","toRemove","where","below","toArray","removeIds","getAttachmentData","_digest","get","Error","remove","clear","close","closed","complete","closeDexieDb","createDexieStorageInstance","params","getDexieDbWithTables","instance","addRxStorageMultiInstanceSupport","RX_STORAGE_NAME_DEXIE","Promise","resolve"],"sources":["../../../../src/plugins/storage-dexie/rx-storage-instance-dexie.ts"],"sourcesContent":["import {\r\n Subject,\r\n Observable\r\n} from 'rxjs';\r\nimport {\r\n now,\r\n ensureNotFalsy,\r\n defaultHashSha256,\r\n RXDB_UTILS_GLOBAL,\r\n PREMIUM_FLAG_HASH,\r\n hasPremiumFlag\r\n} from '../utils/index.ts';\r\nimport type {\r\n RxStorageInstance,\r\n RxStorageChangeEvent,\r\n RxDocumentData,\r\n BulkWriteRow,\r\n RxStorageBulkWriteResponse,\r\n RxStorageQueryResult,\r\n RxJsonSchema,\r\n RxStorageInstanceCreationParams,\r\n EventBulk,\r\n StringKeys,\r\n RxStorageDefaultCheckpoint,\r\n CategorizeBulkWriteRowsOutput,\r\n RxStorageCountResult,\r\n PreparedQuery\r\n} from '../../types/index.d.ts';\r\nimport type {\r\n DexieSettings,\r\n DexieStorageInternals\r\n} from '../../types/plugins/dexie.d.ts';\r\nimport { RxStorageDexie } from './rx-storage-dexie.ts';\r\nimport {\r\n attachmentObjectId,\r\n closeDexieDb,\r\n fromStorageToDexie,\r\n getDexieDbWithTables,\r\n getDocsInDb,\r\n RX_STORAGE_NAME_DEXIE\r\n} from './dexie-helper.ts';\r\nimport { dexieCount, dexieQuery } from './dexie-query.ts';\r\nimport { getPrimaryFieldOfPrimaryKey } from '../../rx-schema-helper.ts';\r\nimport { categorizeBulkWriteRows, flatCloneDocWithMeta } from '../../rx-storage-helper.ts';\r\nimport { addRxStorageMultiInstanceSupport } from '../../rx-storage-multiinstance.ts';\r\nimport { newRxError } from '../../rx-error.ts';\r\n\r\nlet instanceId = now();\r\n\r\nlet shownNonPremiumLog = false;\r\n\r\n\r\nexport class RxStorageInstanceDexie<RxDocType> implements RxStorageInstance<\r\n RxDocType,\r\n DexieStorageInternals,\r\n DexieSettings,\r\n RxStorageDefaultCheckpoint\r\n> {\r\n public readonly primaryPath: StringKeys<RxDocumentData<RxDocType>>;\r\n private changes$: Subject<EventBulk<RxStorageChangeEvent<RxDocumentData<RxDocType>>, RxStorageDefaultCheckpoint>> = new Subject();\r\n public readonly instanceId = instanceId++;\r\n public closed?: Promise<void>;\r\n\r\n constructor(\r\n public readonly storage: RxStorageDexie,\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: DexieStorageInternals,\r\n public readonly options: Readonly<DexieSettings>,\r\n public readonly settings: DexieSettings,\r\n public readonly devMode: boolean\r\n ) {\r\n this.primaryPath = getPrimaryFieldOfPrimaryKey(this.schema.primaryKey);\r\n }\r\n\r\n async bulkWrite(\r\n documentWrites: BulkWriteRow<RxDocType>[],\r\n context: string\r\n ): Promise<RxStorageBulkWriteResponse<RxDocType>> {\r\n ensureNotClosed(this);\r\n\r\n if (\r\n !shownNonPremiumLog &&\r\n !(await hasPremiumFlag())\r\n ) {\r\n console.warn(\r\n [\r\n '-------------- RxDB Open Core RxStorage -------------------------------',\r\n 'You are using the free Dexie.js based RxStorage implementation from RxDB https://rxdb.info/rx-storage-dexie.html?console=dexie ',\r\n 'While this is a great option, we want to let you know that there are faster storage solutions available in our premium plugins.',\r\n 'For professional users and production environments, we highly recommend considering these premium options to enhance performance and reliability.',\r\n ' https://rxdb.info/premium/?console=dexie ',\r\n 'If you already purchased premium access you can disable this log by calling the setPremiumFlag() function from rxdb-premium/plugins/shared.',\r\n '---------------------------------------------------------------------'\r\n ].join('\\n')\r\n );\r\n shownNonPremiumLog = true;\r\n } else {\r\n shownNonPremiumLog = true;\r\n }\r\n\r\n\r\n /**\r\n * Check some assumptions to ensure RxDB\r\n * does not call the storage with an invalid write.\r\n */\r\n documentWrites.forEach(row => {\r\n // ensure revision is set\r\n if (\r\n !row.document._rev ||\r\n (\r\n row.previous &&\r\n !row.previous._rev\r\n )\r\n ) {\r\n throw newRxError('SNH', { args: { row } });\r\n }\r\n });\r\n\r\n const state = await this.internals;\r\n const ret: RxStorageBulkWriteResponse<RxDocType> = {\r\n error: []\r\n };\r\n\r\n /**\r\n * Some storages might add any _meta fields\r\n * internally. To ensure RxDB can work with that in the\r\n * test suite, we add a random field here.\r\n */\r\n if (this.devMode) {\r\n documentWrites = documentWrites.map(row => {\r\n const doc = flatCloneDocWithMeta(row.document);\r\n return {\r\n previous: row.previous,\r\n document: doc\r\n }\r\n })\r\n }\r\n\r\n\r\n const documentKeys: string[] = documentWrites.map(writeRow => writeRow.document[this.primaryPath] as any);\r\n let categorized: CategorizeBulkWriteRowsOutput<RxDocType> | undefined;\r\n await state.dexieDb.transaction(\r\n 'rw',\r\n state.dexieTable,\r\n state.dexieAttachmentsTable,\r\n async () => {\r\n const docsInDbMap = new Map<string, RxDocumentData<RxDocType>>();\r\n const docsInDbWithInternals = await getDocsInDb<RxDocType>(this.internals, documentKeys);\r\n docsInDbWithInternals.forEach(docWithDexieInternals => {\r\n const doc = docWithDexieInternals;\r\n if (doc) {\r\n docsInDbMap.set((doc as any)[this.primaryPath], doc as any);\r\n }\r\n return doc;\r\n });\r\n\r\n categorized = categorizeBulkWriteRows<RxDocType>(\r\n this,\r\n this.primaryPath as any,\r\n docsInDbMap,\r\n documentWrites,\r\n context\r\n );\r\n ret.error = categorized.errors;\r\n\r\n /**\r\n * Batch up the database operations\r\n * so we can later run them in bulk.\r\n */\r\n let bulkPutDocs: any[] = [];\r\n categorized.bulkInsertDocs.forEach(row => {\r\n bulkPutDocs.push(row.document);\r\n });\r\n categorized.bulkUpdateDocs.forEach(row => {\r\n bulkPutDocs.push(row.document);\r\n });\r\n bulkPutDocs = bulkPutDocs.map(d => fromStorageToDexie(state.booleanIndexes, d));\r\n\r\n if (bulkPutDocs.length > 0) {\r\n await state.dexieTable.bulkPut(bulkPutDocs);\r\n }\r\n\r\n // handle attachments\r\n const putAttachments: { id: string, data: Blob }[] = [];\r\n categorized.attachmentsAdd.forEach(attachment => {\r\n putAttachments.push({\r\n id: attachmentObjectId(attachment.documentId, attachment.attachmentId),\r\n data: attachment.attachmentData.data\r\n });\r\n });\r\n categorized.attachmentsUpdate.forEach(attachment => {\r\n putAttachments.push({\r\n id: attachmentObjectId(attachment.documentId, attachment.attachmentId),\r\n data: attachment.attachmentData.data\r\n });\r\n });\r\n await state.dexieAttachmentsTable.bulkPut(putAttachments);\r\n await state.dexieAttachmentsTable.bulkDelete(\r\n categorized.attachmentsRemove.map(attachment => attachmentObjectId(attachment.documentId, attachment.attachmentId))\r\n );\r\n\r\n });\r\n\r\n categorized = ensureNotFalsy(categorized);\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[this.primaryPath],\r\n lwt: lastState._meta.lwt\r\n };\r\n this.changes$.next(categorized.eventBulk);\r\n }\r\n\r\n return ret;\r\n }\r\n\r\n async findDocumentsById(\r\n ids: string[],\r\n deleted: boolean\r\n ): Promise<RxDocumentData<RxDocType>[]> {\r\n ensureNotClosed(this);\r\n const state = await this.internals;\r\n const ret: RxDocumentData<RxDocType>[] = [];\r\n\r\n await state.dexieDb.transaction(\r\n 'r',\r\n state.dexieTable,\r\n async () => {\r\n const docsInDb = await getDocsInDb<RxDocType>(this.internals, ids);\r\n docsInDb.forEach(documentInDb => {\r\n if (\r\n documentInDb &&\r\n (!documentInDb._deleted || deleted)\r\n ) {\r\n ret.push(documentInDb);\r\n }\r\n });\r\n });\r\n return ret;\r\n }\r\n\r\n query(preparedQuery: PreparedQuery<RxDocType>): Promise<RxStorageQueryResult<RxDocType>> {\r\n ensureNotClosed(this);\r\n return dexieQuery(\r\n this,\r\n preparedQuery\r\n );\r\n }\r\n async count(\r\n preparedQuery: PreparedQuery<RxDocType>\r\n ): Promise<RxStorageCountResult> {\r\n if (preparedQuery.queryPlan.selectorSatisfiedByIndex) {\r\n const result = await dexieCount(this, preparedQuery);\r\n return {\r\n count: result,\r\n mode: 'fast'\r\n };\r\n } else {\r\n const result = await dexieQuery(this, preparedQuery);\r\n return {\r\n count: result.documents.length,\r\n mode: 'slow'\r\n };\r\n }\r\n }\r\n\r\n changeStream(): Observable<EventBulk<RxStorageChangeEvent<RxDocumentData<RxDocType>>, RxStorageDefaultCheckpoint>> {\r\n ensureNotClosed(this);\r\n return this.changes$.asObservable();\r\n }\r\n\r\n async cleanup(minimumDeletedTime: number): Promise<boolean> {\r\n ensureNotClosed(this);\r\n const state = await this.internals;\r\n await state.dexieDb.transaction(\r\n 'rw',\r\n state.dexieTable,\r\n async () => {\r\n const maxDeletionTime = now() - minimumDeletedTime;\r\n const toRemove = await state.dexieTable\r\n .where('_meta.lwt')\r\n .below(maxDeletionTime)\r\n .toArray();\r\n const removeIds: string[] = [];\r\n toRemove.forEach((doc: any) => {\r\n if (doc._deleted === '1') {\r\n removeIds.push(doc[this.primaryPath]);\r\n }\r\n });\r\n await state.dexieTable.bulkDelete(removeIds);\r\n }\r\n );\r\n\r\n return true;\r\n }\r\n\r\n async getAttachmentData(documentId: string, attachmentId: string, _digest: string): Promise<Blob> {\r\n ensureNotClosed(this);\r\n const state = await this.internals;\r\n const id = attachmentObjectId(documentId, attachmentId);\r\n return await state.dexieDb.transaction(\r\n 'r',\r\n state.dexieAttachmentsTable,\r\n async () => {\r\n\r\n const attachment = await state.dexieAttachmentsTable.get(id);\r\n if (attachment) {\r\n return attachment.data;\r\n } else {\r\n throw new Error('attachment missing documentId: ' + documentId + ' attachmentId: ' + attachmentId);\r\n }\r\n });\r\n }\r\n\r\n async remove(): Promise<void> {\r\n ensureNotClosed(this);\r\n const state = await this.internals;\r\n await state.dexieTable.clear()\r\n return this.close();\r\n }\r\n\r\n\r\n close(): Promise<void> {\r\n if (this.closed) {\r\n return this.closed;\r\n }\r\n this.closed = (async () => {\r\n this.changes$.complete();\r\n await closeDexieDb(this.internals);\r\n })();\r\n return this.closed;\r\n }\r\n}\r\n\r\n\r\nexport async function createDexieStorageInstance<RxDocType>(\r\n storage: RxStorageDexie,\r\n params: RxStorageInstanceCreationParams<RxDocType, DexieSettings>,\r\n settings: DexieSettings\r\n): Promise<RxStorageInstanceDexie<RxDocType>> {\r\n const internals = getDexieDbWithTables(\r\n params.databaseName,\r\n params.collectionName,\r\n settings,\r\n params.schema\r\n );\r\n\r\n const instance = new RxStorageInstanceDexie(\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\r\n await addRxStorageMultiInstanceSupport(\r\n RX_STORAGE_NAME_DEXIE,\r\n params,\r\n instance\r\n );\r\n\r\n return Promise.resolve(instance);\r\n}\r\n\r\n\r\n\r\nfunction ensureNotClosed(\r\n instance: RxStorageInstanceDexie<any>\r\n) {\r\n if (instance.closed) {\r\n throw new Error('RxStorageInstanceDexie is closed ' + instance.databaseName + '-' + instance.collectionName);\r\n }\r\n}\r\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"rx-storage-instance-dexie.js","names":["_rxjs","require","_index","_dexieHelper","_dexieQuery","_rxSchemaHelper","_rxStorageHelper","_rxStorageMultiinstance","_rxError","instanceId","now","RxStorageInstanceDexie","exports","storage","databaseName","collectionName","schema","internals","options","settings","devMode","changes$","Subject","primaryPath","getPrimaryFieldOfPrimaryKey","primaryKey","_proto","prototype","bulkWrite","documentWrites","context","ensureNotClosed","forEach","row","document","_rev","previous","newRxError","args","state","ret","error","map","doc","flatCloneDocWithMeta","documentKeys","writeRow","categorized","dexieDb","transaction","dexieTable","dexieAttachmentsTable","docsInDbMap","Map","docsInDbWithInternals","getDocsInDb","docWithDexieInternals","set","categorizeBulkWriteRows","errors","bulkPutDocs","bulkInsertDocs","push","bulkUpdateDocs","d","fromStorageToDexie","booleanIndexes","length","bulkPut","putAttachments","attachmentsAdd","attachment","id","attachmentObjectId","documentId","attachmentId","data","attachmentData","attachmentsUpdate","bulkDelete","attachmentsRemove","ensureNotFalsy","eventBulk","events","lastState","newestRow","checkpoint","lwt","_meta","next","findDocumentsById","ids","deleted","docsInDb","documentInDb","_deleted","query","preparedQuery","dexieQuery","count","queryPlan","selectorSatisfiedByIndex","result","dexieCount","mode","documents","changeStream","asObservable","cleanup","minimumDeletedTime","maxDeletionTime","toRemove","where","below","toArray","removeIds","getAttachmentData","_digest","get","Error","remove","clear","close","closed","complete","closeDexieDb","createDexieStorageInstance","params","getDexieDbWithTables","instance","addRxStorageMultiInstanceSupport","RX_STORAGE_NAME_DEXIE","Promise","resolve"],"sources":["../../../../src/plugins/storage-dexie/rx-storage-instance-dexie.ts"],"sourcesContent":["import {\r\n Subject,\r\n Observable\r\n} from 'rxjs';\r\nimport {\r\n now,\r\n ensureNotFalsy,\r\n} from '../utils/index.ts';\r\nimport type {\r\n RxStorageInstance,\r\n RxStorageChangeEvent,\r\n RxDocumentData,\r\n BulkWriteRow,\r\n RxStorageBulkWriteResponse,\r\n RxStorageQueryResult,\r\n RxJsonSchema,\r\n RxStorageInstanceCreationParams,\r\n EventBulk,\r\n StringKeys,\r\n RxStorageDefaultCheckpoint,\r\n CategorizeBulkWriteRowsOutput,\r\n RxStorageCountResult,\r\n PreparedQuery\r\n} from '../../types/index.d.ts';\r\nimport type {\r\n DexieSettings,\r\n DexieStorageInternals\r\n} from '../../types/plugins/dexie.d.ts';\r\nimport { RxStorageDexie } from './rx-storage-dexie.ts';\r\nimport {\r\n attachmentObjectId,\r\n closeDexieDb,\r\n fromStorageToDexie,\r\n getDexieDbWithTables,\r\n getDocsInDb,\r\n RX_STORAGE_NAME_DEXIE\r\n} from './dexie-helper.ts';\r\nimport { dexieCount, dexieQuery } from './dexie-query.ts';\r\nimport { getPrimaryFieldOfPrimaryKey } from '../../rx-schema-helper.ts';\r\nimport { categorizeBulkWriteRows, flatCloneDocWithMeta } from '../../rx-storage-helper.ts';\r\nimport { addRxStorageMultiInstanceSupport } from '../../rx-storage-multiinstance.ts';\r\nimport { newRxError } from '../../rx-error.ts';\r\n\r\nlet instanceId = now();\r\n\r\n\r\nexport class RxStorageInstanceDexie<RxDocType> implements RxStorageInstance<\r\n RxDocType,\r\n DexieStorageInternals,\r\n DexieSettings,\r\n RxStorageDefaultCheckpoint\r\n> {\r\n public readonly primaryPath: StringKeys<RxDocumentData<RxDocType>>;\r\n private changes$: Subject<EventBulk<RxStorageChangeEvent<RxDocumentData<RxDocType>>, RxStorageDefaultCheckpoint>> = new Subject();\r\n public readonly instanceId = instanceId++;\r\n public closed?: Promise<void>;\r\n\r\n constructor(\r\n public readonly storage: RxStorageDexie,\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: DexieStorageInternals,\r\n public readonly options: Readonly<DexieSettings>,\r\n public readonly settings: DexieSettings,\r\n public readonly devMode: boolean\r\n ) {\r\n this.primaryPath = getPrimaryFieldOfPrimaryKey(this.schema.primaryKey);\r\n }\r\n\r\n async bulkWrite(\r\n documentWrites: BulkWriteRow<RxDocType>[],\r\n context: string\r\n ): Promise<RxStorageBulkWriteResponse<RxDocType>> {\r\n ensureNotClosed(this);\r\n\r\n /**\r\n * Check some assumptions to ensure RxDB\r\n * does not call the storage with an invalid write.\r\n */\r\n documentWrites.forEach(row => {\r\n // ensure revision is set\r\n if (\r\n !row.document._rev ||\r\n (\r\n row.previous &&\r\n !row.previous._rev\r\n )\r\n ) {\r\n throw newRxError('SNH', { args: { row } });\r\n }\r\n });\r\n\r\n const state = await this.internals;\r\n const ret: RxStorageBulkWriteResponse<RxDocType> = {\r\n error: []\r\n };\r\n\r\n /**\r\n * Some storages might add any _meta fields\r\n * internally. To ensure RxDB can work with that in the\r\n * test suite, we add a random field here.\r\n */\r\n if (this.devMode) {\r\n documentWrites = documentWrites.map(row => {\r\n const doc = flatCloneDocWithMeta(row.document);\r\n return {\r\n previous: row.previous,\r\n document: doc\r\n }\r\n })\r\n }\r\n\r\n\r\n const documentKeys: string[] = documentWrites.map(writeRow => writeRow.document[this.primaryPath] as any);\r\n let categorized: CategorizeBulkWriteRowsOutput<RxDocType> | undefined;\r\n await state.dexieDb.transaction(\r\n 'rw',\r\n state.dexieTable,\r\n state.dexieAttachmentsTable,\r\n async () => {\r\n const docsInDbMap = new Map<string, RxDocumentData<RxDocType>>();\r\n const docsInDbWithInternals = await getDocsInDb<RxDocType>(this.internals, documentKeys);\r\n docsInDbWithInternals.forEach(docWithDexieInternals => {\r\n const doc = docWithDexieInternals;\r\n if (doc) {\r\n docsInDbMap.set((doc as any)[this.primaryPath], doc as any);\r\n }\r\n return doc;\r\n });\r\n\r\n categorized = categorizeBulkWriteRows<RxDocType>(\r\n this,\r\n this.primaryPath as any,\r\n docsInDbMap,\r\n documentWrites,\r\n context\r\n );\r\n ret.error = categorized.errors;\r\n\r\n /**\r\n * Batch up the database operations\r\n * so we can later run them in bulk.\r\n */\r\n let bulkPutDocs: any[] = [];\r\n categorized.bulkInsertDocs.forEach(row => {\r\n bulkPutDocs.push(row.document);\r\n });\r\n categorized.bulkUpdateDocs.forEach(row => {\r\n bulkPutDocs.push(row.document);\r\n });\r\n bulkPutDocs = bulkPutDocs.map(d => fromStorageToDexie(state.booleanIndexes, d));\r\n\r\n if (bulkPutDocs.length > 0) {\r\n await state.dexieTable.bulkPut(bulkPutDocs);\r\n }\r\n\r\n // handle attachments\r\n const putAttachments: { id: string, data: Blob }[] = [];\r\n categorized.attachmentsAdd.forEach(attachment => {\r\n putAttachments.push({\r\n id: attachmentObjectId(attachment.documentId, attachment.attachmentId),\r\n data: attachment.attachmentData.data\r\n });\r\n });\r\n categorized.attachmentsUpdate.forEach(attachment => {\r\n putAttachments.push({\r\n id: attachmentObjectId(attachment.documentId, attachment.attachmentId),\r\n data: attachment.attachmentData.data\r\n });\r\n });\r\n await state.dexieAttachmentsTable.bulkPut(putAttachments);\r\n await state.dexieAttachmentsTable.bulkDelete(\r\n categorized.attachmentsRemove.map(attachment => attachmentObjectId(attachment.documentId, attachment.attachmentId))\r\n );\r\n\r\n });\r\n\r\n categorized = ensureNotFalsy(categorized);\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[this.primaryPath],\r\n lwt: lastState._meta.lwt\r\n };\r\n this.changes$.next(categorized.eventBulk);\r\n }\r\n\r\n return ret;\r\n }\r\n\r\n async findDocumentsById(\r\n ids: string[],\r\n deleted: boolean\r\n ): Promise<RxDocumentData<RxDocType>[]> {\r\n ensureNotClosed(this);\r\n const state = await this.internals;\r\n const ret: RxDocumentData<RxDocType>[] = [];\r\n\r\n await state.dexieDb.transaction(\r\n 'r',\r\n state.dexieTable,\r\n async () => {\r\n const docsInDb = await getDocsInDb<RxDocType>(this.internals, ids);\r\n docsInDb.forEach(documentInDb => {\r\n if (\r\n documentInDb &&\r\n (!documentInDb._deleted || deleted)\r\n ) {\r\n ret.push(documentInDb);\r\n }\r\n });\r\n });\r\n return ret;\r\n }\r\n\r\n query(preparedQuery: PreparedQuery<RxDocType>): Promise<RxStorageQueryResult<RxDocType>> {\r\n ensureNotClosed(this);\r\n return dexieQuery(\r\n this,\r\n preparedQuery\r\n );\r\n }\r\n async count(\r\n preparedQuery: PreparedQuery<RxDocType>\r\n ): Promise<RxStorageCountResult> {\r\n if (preparedQuery.queryPlan.selectorSatisfiedByIndex) {\r\n const result = await dexieCount(this, preparedQuery);\r\n return {\r\n count: result,\r\n mode: 'fast'\r\n };\r\n } else {\r\n const result = await dexieQuery(this, preparedQuery);\r\n return {\r\n count: result.documents.length,\r\n mode: 'slow'\r\n };\r\n }\r\n }\r\n\r\n changeStream(): Observable<EventBulk<RxStorageChangeEvent<RxDocumentData<RxDocType>>, RxStorageDefaultCheckpoint>> {\r\n ensureNotClosed(this);\r\n return this.changes$.asObservable();\r\n }\r\n\r\n async cleanup(minimumDeletedTime: number): Promise<boolean> {\r\n ensureNotClosed(this);\r\n const state = await this.internals;\r\n await state.dexieDb.transaction(\r\n 'rw',\r\n state.dexieTable,\r\n async () => {\r\n const maxDeletionTime = now() - minimumDeletedTime;\r\n const toRemove = await state.dexieTable\r\n .where('_meta.lwt')\r\n .below(maxDeletionTime)\r\n .toArray();\r\n const removeIds: string[] = [];\r\n toRemove.forEach((doc: any) => {\r\n if (doc._deleted === '1') {\r\n removeIds.push(doc[this.primaryPath]);\r\n }\r\n });\r\n await state.dexieTable.bulkDelete(removeIds);\r\n }\r\n );\r\n\r\n return true;\r\n }\r\n\r\n async getAttachmentData(documentId: string, attachmentId: string, _digest: string): Promise<Blob> {\r\n ensureNotClosed(this);\r\n const state = await this.internals;\r\n const id = attachmentObjectId(documentId, attachmentId);\r\n return await state.dexieDb.transaction(\r\n 'r',\r\n state.dexieAttachmentsTable,\r\n async () => {\r\n\r\n const attachment = await state.dexieAttachmentsTable.get(id);\r\n if (attachment) {\r\n return attachment.data;\r\n } else {\r\n throw new Error('attachment missing documentId: ' + documentId + ' attachmentId: ' + attachmentId);\r\n }\r\n });\r\n }\r\n\r\n async remove(): Promise<void> {\r\n ensureNotClosed(this);\r\n const state = await this.internals;\r\n await state.dexieTable.clear()\r\n return this.close();\r\n }\r\n\r\n\r\n close(): Promise<void> {\r\n if (this.closed) {\r\n return this.closed;\r\n }\r\n this.closed = (async () => {\r\n this.changes$.complete();\r\n await closeDexieDb(this.internals);\r\n })();\r\n return this.closed;\r\n }\r\n}\r\n\r\n\r\nexport async function createDexieStorageInstance<RxDocType>(\r\n storage: RxStorageDexie,\r\n params: RxStorageInstanceCreationParams<RxDocType, DexieSettings>,\r\n settings: DexieSettings\r\n): Promise<RxStorageInstanceDexie<RxDocType>> {\r\n const internals = getDexieDbWithTables(\r\n params.databaseName,\r\n params.collectionName,\r\n settings,\r\n params.schema\r\n );\r\n\r\n const instance = new RxStorageInstanceDexie(\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\r\n await addRxStorageMultiInstanceSupport(\r\n RX_STORAGE_NAME_DEXIE,\r\n params,\r\n instance\r\n );\r\n\r\n return Promise.resolve(instance);\r\n}\r\n\r\n\r\n\r\nfunction ensureNotClosed(\r\n instance: RxStorageInstanceDexie<any>\r\n) {\r\n if (instance.closed) {\r\n throw new Error('RxStorageInstanceDexie is closed ' + instance.databaseName + '-' + instance.collectionName);\r\n }\r\n}\r\n"],"mappings":"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","ignoreList":[]}
@@ -4,25 +4,31 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.boundEQ = boundEQ;
7
+ exports.boundEQByIndexString = boundEQByIndexString;
7
8
  exports.boundGE = boundGE;
9
+ exports.boundGEByIndexString = boundGEByIndexString;
8
10
  exports.boundGT = boundGT;
11
+ exports.boundGTByIndexString = boundGTByIndexString;
9
12
  exports.boundLE = boundLE;
13
+ exports.boundLEByIndexString = boundLEByIndexString;
10
14
  exports.boundLT = boundLT;
15
+ exports.boundLTByIndexString = boundLTByIndexString;
11
16
  /**
12
- * Everything in this file was copied and adapted from
13
- * @link https://github.com/mikolalysenko/binary-search-bounds
14
- *
15
- * We should use the original npm module instead when this bug is fixed:
16
- * @link https://github.com/mikolalysenko/binary-search-bounds/pull/14
17
+ * Optimized binary search functions for the memory storage.
18
+ * Based on https://github.com/mikolalysenko/binary-search-bounds
19
+ * but with performance improvements:
20
+ * - Removed unnecessary undefined checks for comparator
21
+ * - Inlined the norm() wrapper to avoid extra function calls
22
+ * - Added string-specialized variants to avoid temporary array allocations
17
23
  */
18
24
 
19
- function ge(a, y, c, l, h) {
25
+ function boundGE(a, y, c, lo, hi) {
26
+ var l = lo === undefined ? 0 : lo | 0;
27
+ var h = hi === undefined ? a.length - 1 : hi | 0;
20
28
  var i = h + 1;
21
29
  while (l <= h) {
22
30
  var m = l + h >>> 1;
23
- var x = a[m];
24
- var p = c !== undefined ? c(x, y) : x - y;
25
- if (p >= 0) {
31
+ if (c(a[m], y) >= 0) {
26
32
  i = m;
27
33
  h = m - 1;
28
34
  } else {
@@ -31,13 +37,13 @@ function ge(a, y, c, l, h) {
31
37
  }
32
38
  return i;
33
39
  }
34
- function gt(a, y, c, l, h) {
40
+ function boundGT(a, y, c, lo, hi) {
41
+ var l = lo === undefined ? 0 : lo | 0;
42
+ var h = hi === undefined ? a.length - 1 : hi | 0;
35
43
  var i = h + 1;
36
44
  while (l <= h) {
37
45
  var m = l + h >>> 1;
38
- var x = a[m];
39
- var p = c !== undefined ? c(x, y) : x - y;
40
- if (p > 0) {
46
+ if (c(a[m], y) > 0) {
41
47
  i = m;
42
48
  h = m - 1;
43
49
  } else {
@@ -46,13 +52,13 @@ function gt(a, y, c, l, h) {
46
52
  }
47
53
  return i;
48
54
  }
49
- function lt(a, y, c, l, h) {
55
+ function boundLT(a, y, c, lo, hi) {
56
+ var l = lo === undefined ? 0 : lo | 0;
57
+ var h = hi === undefined ? a.length - 1 : hi | 0;
50
58
  var i = l - 1;
51
59
  while (l <= h) {
52
- var m = l + h >>> 1,
53
- x = a[m];
54
- var p = c !== undefined ? c(x, y) : x - y;
55
- if (p < 0) {
60
+ var m = l + h >>> 1;
61
+ if (c(a[m], y) < 0) {
56
62
  i = m;
57
63
  l = m + 1;
58
64
  } else {
@@ -61,13 +67,13 @@ function lt(a, y, c, l, h) {
61
67
  }
62
68
  return i;
63
69
  }
64
- function le(a, y, c, l, h) {
70
+ function boundLE(a, y, c, lo, hi) {
71
+ var l = lo === undefined ? 0 : lo | 0;
72
+ var h = hi === undefined ? a.length - 1 : hi | 0;
65
73
  var i = l - 1;
66
74
  while (l <= h) {
67
- var m = l + h >>> 1,
68
- x = a[m];
69
- var p = c !== undefined ? c(x, y) : x - y;
70
- if (p <= 0) {
75
+ var m = l + h >>> 1;
76
+ if (c(a[m], y) <= 0) {
71
77
  i = m;
72
78
  l = m + 1;
73
79
  } else {
@@ -76,11 +82,12 @@ function le(a, y, c, l, h) {
76
82
  }
77
83
  return i;
78
84
  }
79
- function eq(a, y, c, l, h) {
85
+ function boundEQ(a, y, c, lo, hi) {
86
+ var l = lo === undefined ? 0 : lo | 0;
87
+ var h = hi === undefined ? a.length - 1 : hi | 0;
80
88
  while (l <= h) {
81
- var m = l + h >>> 1,
82
- x = a[m];
83
- var p = c !== undefined ? c(x, y) : x - y;
89
+ var m = l + h >>> 1;
90
+ var p = c(a[m], y);
84
91
  if (p === 0) {
85
92
  return m;
86
93
  }
@@ -92,22 +99,87 @@ function eq(a, y, c, l, h) {
92
99
  }
93
100
  return -1;
94
101
  }
95
- function norm(a, y, c, l, h, f) {
96
- return f(a, y, c, l === undefined ? 0 : l | 0, h === undefined ? a.length - 1 : h | 0);
97
- }
98
- function boundGE(a, y, c, l, h) {
99
- return norm(a, y, c, l, h, ge);
102
+
103
+ /**
104
+ * Specialized binary search functions that compare DocWithIndexString
105
+ * entries directly against an index string, avoiding temporary array allocations.
106
+ * Used in query() and count() hot paths.
107
+ */
108
+ function boundGEByIndexString(a, indexString) {
109
+ var l = 0;
110
+ var h = a.length - 1;
111
+ var i = h + 1;
112
+ while (l <= h) {
113
+ var m = l + h >>> 1;
114
+ if (a[m][0] >= indexString) {
115
+ i = m;
116
+ h = m - 1;
117
+ } else {
118
+ l = m + 1;
119
+ }
120
+ }
121
+ return i;
100
122
  }
101
- function boundGT(a, y, c, l, h) {
102
- return norm(a, y, c, l, h, gt);
123
+ function boundGTByIndexString(a, indexString) {
124
+ var l = 0;
125
+ var h = a.length - 1;
126
+ var i = h + 1;
127
+ while (l <= h) {
128
+ var m = l + h >>> 1;
129
+ if (a[m][0] > indexString) {
130
+ i = m;
131
+ h = m - 1;
132
+ } else {
133
+ l = m + 1;
134
+ }
135
+ }
136
+ return i;
103
137
  }
104
- function boundLT(a, y, c, l, h) {
105
- return norm(a, y, c, l, h, lt);
138
+ function boundEQByIndexString(a, indexString) {
139
+ var l = 0;
140
+ var h = a.length - 1;
141
+ while (l <= h) {
142
+ var m = l + h >>> 1;
143
+ var s = a[m][0];
144
+ if (s === indexString) {
145
+ return m;
146
+ }
147
+ if (s < indexString) {
148
+ l = m + 1;
149
+ } else {
150
+ h = m - 1;
151
+ }
152
+ }
153
+ return -1;
106
154
  }
107
- function boundLE(a, y, c, l, h) {
108
- return norm(a, y, c, l, h, le);
155
+ function boundLTByIndexString(a, indexString) {
156
+ var l = 0;
157
+ var h = a.length - 1;
158
+ var i = l - 1;
159
+ while (l <= h) {
160
+ var m = l + h >>> 1;
161
+ if (a[m][0] < indexString) {
162
+ i = m;
163
+ l = m + 1;
164
+ } else {
165
+ h = m - 1;
166
+ }
167
+ }
168
+ return i;
109
169
  }
110
- function boundEQ(a, y, c, l, h) {
111
- return norm(a, y, c, l, h, eq);
170
+ function boundLEByIndexString(a, indexString) {
171
+ var l = 0;
172
+ var h = a.length - 1;
173
+ var i = l - 1;
174
+ while (l <= h) {
175
+ var m = l + h >>> 1;
176
+ if (a[m][0] <= indexString) {
177
+ i = m;
178
+ l = m + 1;
179
+ } else {
180
+ h = m - 1;
181
+ }
182
+ }
183
+ return i;
112
184
  }
113
185
  //# sourceMappingURL=binary-search-bounds.js.map