@harperfast/harper 5.2.9 → 5.2.10

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 (177) hide show
  1. package/dist/resources/DatabaseTransaction.d.ts +3 -0
  2. package/dist/resources/DatabaseTransaction.js +90 -2
  3. package/dist/resources/DatabaseTransaction.js.map +1 -1
  4. package/dist/resources/PrimaryRocksDatabase.js +2 -1
  5. package/dist/resources/PrimaryRocksDatabase.js.map +1 -1
  6. package/dist/resources/RocksIndexStore.js +2 -1
  7. package/dist/resources/RocksIndexStore.js.map +1 -1
  8. package/dist/resources/Table.js +13 -5
  9. package/dist/resources/Table.js.map +1 -1
  10. package/dist/resources/auditStore.js +142 -53
  11. package/dist/resources/auditStore.js.map +1 -1
  12. package/dist/resources/databases.d.ts +9 -0
  13. package/dist/resources/databases.js +315 -76
  14. package/dist/resources/databases.js.map +1 -1
  15. package/dist/resources/search.js +33 -7
  16. package/dist/resources/search.js.map +1 -1
  17. package/dist/server/storageReclamation.d.ts +7 -0
  18. package/dist/server/storageReclamation.js +10 -0
  19. package/dist/server/storageReclamation.js.map +1 -1
  20. package/dist/server/threads/manageThreads.d.ts +1 -0
  21. package/dist/server/threads/manageThreads.js +7 -0
  22. package/dist/server/threads/manageThreads.js.map +1 -1
  23. package/npm-shrinkwrap.json +41 -41
  24. package/package.json +2 -2
  25. package/resources/DatabaseTransaction.ts +88 -2
  26. package/resources/PrimaryRocksDatabase.ts +2 -1
  27. package/resources/RocksIndexStore.ts +2 -1
  28. package/resources/Table.ts +13 -5
  29. package/resources/auditStore.ts +144 -52
  30. package/resources/databases.ts +296 -70
  31. package/resources/search.ts +32 -7
  32. package/server/storageReclamation.ts +10 -0
  33. package/server/threads/manageThreads.js +7 -0
  34. package/studio/web/assets/Chat-Br06zdMA.js +2267 -0
  35. package/studio/web/assets/FloatingChat-BWImX5fA.js +23 -0
  36. package/studio/web/assets/{abnfDiagram-VCTEODGH-C0_BAZyO.js → abnfDiagram-VCTEODGH-B0BebmD2.js} +1 -1
  37. package/studio/web/assets/{alertDialog-DIHt7Z0r.js → alertDialog-CQyAJJhl.js} +1 -1
  38. package/studio/web/assets/{apiToken-c3Rd-w6g.js → apiToken-DN0nmDsq.js} +1 -1
  39. package/studio/web/assets/applications-kSxVoyeU.js +296 -0
  40. package/studio/web/assets/architecture-7GRP2DOG-LB-MLAAb.js +1 -0
  41. package/studio/web/assets/{architectureDiagram-5GKGNRK7-BWzrASgm.js → architectureDiagram-5GKGNRK7-7SW3GD-K.js} +1 -1
  42. package/studio/web/assets/authStore-C3Nfubqr.js +3 -0
  43. package/studio/web/assets/{blockDiagram-NRAW4CY4-BdJX9Khj.js → blockDiagram-I7D4REHJ-BqguiadH.js} +2 -2
  44. package/studio/web/assets/{button-DhiX-njv.js → button-BIsUKRZq.js} +2 -2
  45. package/studio/web/assets/{c4Diagram-UCG6FXSJ-CI6MzGmQ.js → c4Diagram-7LVT6UL2-LBNf8t_X.js} +1 -1
  46. package/studio/web/assets/channel-yictG-U-.js +1 -0
  47. package/studio/web/assets/{chevron-up-Df2c8uoU.js → chevron-up-DtKGqDn3.js} +1 -1
  48. package/studio/web/assets/{chunk-TEH6E4GO-P87k5mNi.js → chunk-4HAMMTFA-DWtTut21.js} +1 -1
  49. package/studio/web/assets/{chunk-75Z2AOVW-BT8tVmks.js → chunk-75Z2AOVW-QGQD6th2.js} +1 -1
  50. package/studio/web/assets/{chunk-DU6HZSFF-9kAOOmI6.js → chunk-DU6HZSFF-Chq20Ba5.js} +1 -1
  51. package/studio/web/assets/{chunk-F27PBJKO-BW7ao8AY.js → chunk-F27PBJKO-BVA5EPhV.js} +1 -1
  52. package/studio/web/assets/{chunk-GMAD6QVW-BNyXpoQO.js → chunk-GMAD6QVW-BeS7S07A.js} +1 -1
  53. package/studio/web/assets/{chunk-OBVCFTLP-D4wWOqDQ.js → chunk-GVQU2GXP-sbwVIQ8i.js} +1 -1
  54. package/studio/web/assets/{chunk-G27WJ6UU-COyLMcgK.js → chunk-IMKFNOWR-Bnh3tAVd.js} +1 -1
  55. package/studio/web/assets/{chunk-JQ64N6SF-Cyz1IeLf.js → chunk-L3NEJ4N5-COfUyKII.js} +1 -1
  56. package/studio/web/assets/chunk-OSK3NFVY-ByciRftO.js +10 -0
  57. package/studio/web/assets/{chunk-P2QGCYS3-DmIFY4d7.js → chunk-P2QGCYS3-CP1VhG_c.js} +1 -1
  58. package/studio/web/assets/{chunk-POPQ4Y6H-BPrvMyKz.js → chunk-POPQ4Y6H-ClWhhkwW.js} +1 -1
  59. package/studio/web/assets/{chunk-PWAF6VOD-2zB6IW9i.js → chunk-PWAF6VOD-1z1THyS5.js} +1 -1
  60. package/studio/web/assets/{chunk-RHFEMEQ7-2FgyI8YU.js → chunk-SHT3W25Y-LpQkMsah.js} +2 -2
  61. package/studio/web/assets/{chunk-SVP7TREG-FwtbH2QC.js → chunk-SVP7TREG-jtdAHw0S.js} +1 -1
  62. package/studio/web/assets/{chunk-LCL6LL3I-HOzK_ppE.js → chunk-TICWLB2K-VOwzetX-.js} +1 -1
  63. package/studio/web/assets/classDiagram-ZZMXUADV-VaEwSy_g.js +1 -0
  64. package/studio/web/assets/classDiagram-v2-VYDZK3BY-VaEwSy_g.js +1 -0
  65. package/studio/web/assets/{createLucideIcon-BKGPfjm2.js → createLucideIcon-CzW9508A.js} +1 -1
  66. package/studio/web/assets/{cssMode-CEN2mzSA.js → cssMode-C1JeufH5.js} +1 -1
  67. package/studio/web/assets/{cynefin-OW5HDTMX-BRkpLFQV.js → cynefin-OW5HDTMX-BbdbCvub.js} +1 -1
  68. package/studio/web/assets/{cynefinDiagram-5FMLGOSQ-CHT1DaX6.js → cynefinDiagram-5FMLGOSQ-TP-aIqbt.js} +1 -1
  69. package/studio/web/assets/{dagre-3AP2YEHR-DpUXBh63.js → dagre-GXQ25YYZ-DShnGpGo.js} +1 -1
  70. package/studio/web/assets/{diagram-S7CK7UJ4-BuymVFZT.js → diagram-S7CK7UJ4-aoCVTtcy.js} +1 -1
  71. package/studio/web/assets/{diagram-UQ7AKVKN-CyP148RM.js → diagram-UQ7AKVKN-DglXtQ6x.js} +1 -1
  72. package/studio/web/assets/{diagram-VSXAHHWV-CoCAg3M9.js → diagram-VSXAHHWV-fhEdmkwM.js} +1 -1
  73. package/studio/web/assets/{diagram-VX7I27RA-BpOqCFca.js → diagram-VX7I27RA-DccVJet6.js} +1 -1
  74. package/studio/web/assets/{diagram-Z3DM3KII-Bfpw7Vbj.js → diagram-Z3DM3KII-D-RyJJb7.js} +1 -1
  75. package/studio/web/assets/{dialog-CBf0Mr1d.js → dialog-Cn2uWgD4.js} +1 -1
  76. package/studio/web/assets/{dist-lkA3O3eM.js → dist-DP8UjMB_.js} +1 -1
  77. package/studio/web/assets/{download-BtTOBem-.js → download-B5T5r7ss.js} +1 -1
  78. package/studio/web/assets/{ebnfDiagram-PWID7BFC-DS_6aWqL.js → ebnfDiagram-PWID7BFC-DJGpIpz_.js} +1 -1
  79. package/studio/web/assets/{editor-D8oDeCTL.js → editor-qoo9CrGO.js} +1 -1
  80. package/studio/web/assets/{erDiagram-SSCWMZ5O-DJNk6Fgw.js → erDiagram-RLTQ6QDP-CIfNlgkC.js} +1 -1
  81. package/studio/web/assets/eventmodeling-NTZA5JFV-CLxnp2CR.js +1 -0
  82. package/studio/web/assets/flowDiagram-HODETNUW-BIbhmz9f.js +1 -0
  83. package/studio/web/assets/{ganttDiagram-EL5Y4UJY-2pOExxMY.js → ganttDiagram-EL5Y4UJY-BxToTzzD.js} +1 -1
  84. package/studio/web/assets/{getAnalytics-D4LKGeVy.js → getAnalytics-GHK8ORfM.js} +1 -1
  85. package/studio/web/assets/{gitGraph-4MIJSDKK-CH5ZxwzF.js → gitGraph-4MIJSDKK-D2s2w8lE.js} +1 -1
  86. package/studio/web/assets/{gitGraphDiagram-WWUBYQGX-DVIsIhbO.js → gitGraphDiagram-WWUBYQGX-Dwntd4-x.js} +1 -1
  87. package/studio/web/assets/{html-u3vOg7LJ.js → html-Dt4IIy04.js} +1 -1
  88. package/studio/web/assets/{htmlMode-DyO31v-P.js → htmlMode-DXgKKr4C.js} +1 -1
  89. package/studio/web/assets/index-6onkYFOG.js +824 -0
  90. package/studio/web/assets/{index-Cxj2_wsl.css → index-7RMEgVG1.css} +1 -1
  91. package/studio/web/assets/index.lazy-BrCFnpNJ.js +2 -0
  92. package/studio/web/assets/{info-A6RAGUB7-CPQfTnaG.js → info-A6RAGUB7-DYjkvb0C.js} +1 -1
  93. package/studio/web/assets/{infoDiagram-RXCK75RN-DlwLYlwm.js → infoDiagram-27XIBGKW-Bnp1FJE5.js} +1 -1
  94. package/studio/web/assets/{ishikawaDiagram-5VMMS53U-BRXRp29U.js → ishikawaDiagram-5VMMS53U-D9Xh2r6X.js} +1 -1
  95. package/studio/web/assets/{javascript-CUvxOyTC.js → javascript-DNCQGUBc.js} +1 -1
  96. package/studio/web/assets/{journeyDiagram-EYS64GPL-B0ou8k0n.js → journeyDiagram-3NMN7TZE-CokIi6ll.js} +2 -2
  97. package/studio/web/assets/{jsonMode-f_IwbF3D.js → jsonMode-CR6HWruP.js} +1 -1
  98. package/studio/web/assets/{kanban-definition-3QL26DDD-uYg7iYzp.js → kanban-definition-UXKFOSKX-CukSFJfX.js} +1 -1
  99. package/studio/web/assets/{languageServices-DXtZ6rEF.js → languageServices-BM4fI4rS.js} +1 -1
  100. package/studio/web/assets/{lspLanguageFeatures-B4pCF1zO.js → lspLanguageFeatures-DSa1ttcD.js} +1 -1
  101. package/studio/web/assets/{mermaid-parser.core-Ck-fC8b7.js → mermaid-parser.core-BlEsOWNO.js} +3 -3
  102. package/studio/web/assets/{mermaid.core-CP8aNNYm.js → mermaid.core-BlkGaMIH.js} +5 -5
  103. package/studio/web/assets/{mindmap-definition-FBJOCRG2-CgTZ-rit.js → mindmap-definition-YA3MSWOX-IprMc_0j.js} +1 -1
  104. package/studio/web/assets/{notifications-D3tIQ4sg.js → notifications-BHXLnh6x.js} +1 -1
  105. package/studio/web/assets/notifications-CUmtIA6z.js +1 -0
  106. package/studio/web/assets/{packet-AYTQ26CC-DEyoPtPb.js → packet-AYTQ26CC-Bi3V04Zi.js} +1 -1
  107. package/studio/web/assets/{pegDiagram-XKGWAZYB-DrD-7sD9.js → pegDiagram-XKGWAZYB-BNuPDLZY.js} +1 -1
  108. package/studio/web/assets/{pie-WAS4IAKB-wjj-EI1d.js → pie-WAS4IAKB-_6DoDbng.js} +1 -1
  109. package/studio/web/assets/{pieDiagram-E7YTZNPT-GntqDCzv.js → pieDiagram-E7YTZNPT-DqNb6Ht2.js} +1 -1
  110. package/studio/web/assets/{profile-DZWU7MgT.js → profile-8BeFSF3j.js} +1 -1
  111. package/studio/web/assets/{quadrantDiagram-AXDQQJYC-0UeqXQGd.js → quadrantDiagram-AXDQQJYC-BGH9E2YR.js} +1 -1
  112. package/studio/web/assets/{radar-RG4KPBEZ-DFSA5h7k.js → radar-RG4KPBEZ-DDdVczcL.js} +1 -1
  113. package/studio/web/assets/{railroad-74A4TZTK-CaOUG9wR.js → railroad-74A4TZTK-BJUP4Jds.js} +1 -1
  114. package/studio/web/assets/railroad-abnf-HS5TGJTU-Bm3L1L0h.js +1 -0
  115. package/studio/web/assets/railroad-ebnf-LZEXJU2U-CKzLGlkw.js +1 -0
  116. package/studio/web/assets/railroad-peg-WCYAUIDC-S8xLjslx.js +1 -0
  117. package/studio/web/assets/{railroadDiagram-O6MQD6OU-yHUELZaV.js → railroadDiagram-O6MQD6OU-DGTPh2KZ.js} +1 -1
  118. package/studio/web/assets/{regions-CkyurXzE.js → regions-C8qR0HhD.js} +1 -1
  119. package/studio/web/assets/{register-BUyhWjBO.js → register-B4n5i0SD.js} +3 -3
  120. package/studio/web/assets/{requirementDiagram-EFPCY7ZU-DNEGFjuW.js → requirementDiagram-BXWQKSXE-BJnO6uLz.js} +1 -1
  121. package/studio/web/assets/{sankeyDiagram-P5KCCOFB-DpyAmSVR.js → sankeyDiagram-P5KCCOFB-0vSOdymH.js} +1 -1
  122. package/studio/web/assets/{sequenceDiagram-WJ2MYXX4-TyaT7xNk.js → sequenceDiagram-WJ2MYXX4-hETizDWE.js} +1 -1
  123. package/studio/web/assets/{setComponentFile-CeyKSZAa.js → setComponentFile-g0_B0lgX.js} +1 -1
  124. package/studio/web/assets/{setup-D2kn7cAA.js → setup-B0CTj_Q5.js} +2 -2
  125. package/studio/web/assets/{stateDiagram-HBIQ2CUA-CeEdTArZ.js → stateDiagram-D77RDMKH-CdYQ_KtC.js} +1 -1
  126. package/studio/web/assets/stateDiagram-v2-MP3YSRHH-CdKuzQMT.js +1 -0
  127. package/studio/web/assets/status-C6Yib7-K.js +61 -0
  128. package/studio/web/assets/{swimlanes-XN3QIQJK-B54FmF46.js → swimlanes-42K2YHIH-B8cHIpU4.js} +1 -1
  129. package/studio/web/assets/swimlanesDiagram-VR7AAH4N-DmOSJwaH.js +8 -0
  130. package/studio/web/assets/{tabs-B_G5zscN.js → tabs-BrHu7gJi.js} +1 -1
  131. package/studio/web/assets/{timeline-definition-24CTP7MA-D-a9ujbo.js → timeline-definition-24CTP7MA-BJWYSXqF.js} +1 -1
  132. package/studio/web/assets/{toggleHighContrast-C0UW6rI2.js → toggleHighContrast-Dgta7bVi.js} +1 -1
  133. package/studio/web/assets/{treeView-Q6P3EWNA-CrW_6JnS.js → treeView-Q6P3EWNA-qxe_v6CQ.js} +1 -1
  134. package/studio/web/assets/{treemap-WGGIJYW6-BxyYLdP_.js → treemap-WGGIJYW6-dDo97XXF.js} +1 -1
  135. package/studio/web/assets/{tsMode-DBC0zmDx.js → tsMode-CH_jHvU-.js} +1 -1
  136. package/studio/web/assets/{typescript-DApRQir3.js → typescript-Co9LCXd5.js} +1 -1
  137. package/studio/web/assets/{useEntityRestURL-DB6JStU1.js → useEntityRestURL-wKC8NsC_.js} +1 -1
  138. package/studio/web/assets/{useLocalStorage-Dtj1QS8_.js → useLocalStorage-BqMR3D8_.js} +1 -1
  139. package/studio/web/assets/vendor-core-c2JRRJpV.js +58 -0
  140. package/studio/web/assets/vendor-datadog-CLUcJXOo.js +6 -0
  141. package/studio/web/assets/{vendor-react-Dyj4O3HE.js → vendor-react-CJV_K1u4.js} +1 -1
  142. package/studio/web/assets/vendor-tanstack-DxzraizX.js +1 -0
  143. package/studio/web/assets/{vendor-ui-vhu-UHhF.js → vendor-ui-BUjK0h8a.js} +2 -2
  144. package/studio/web/assets/{vennDiagram-4TSXK5OY-Cy7s7Mpy.js → vennDiagram-4TSXK5OY-A3i-lCdl.js} +1 -1
  145. package/studio/web/assets/{wardley-WFR3VGLG-BeBL35g2.js → wardley-WFR3VGLG-B0ik-_6g.js} +1 -1
  146. package/studio/web/assets/{wardleyDiagram-VM6X3IG4-BylmIGSg.js → wardleyDiagram-VM6X3IG4-CjrkKWUR.js} +1 -1
  147. package/studio/web/assets/{workers-C0bFIedw.js → workers-CWeLxCXA.js} +1 -1
  148. package/studio/web/assets/x-DIzaLEdK.js +1 -0
  149. package/studio/web/assets/{xml-HWd01lU-.js → xml-BadC-0Rk.js} +1 -1
  150. package/studio/web/assets/{xychartDiagram-S5SC5T6Z-CoKALMXr.js → xychartDiagram-S5SC5T6Z-Biok4GYV.js} +1 -1
  151. package/studio/web/assets/{yaml-CIH0Nt-h.js → yaml-BiUfxPbC.js} +1 -1
  152. package/studio/web/index.html +14 -14
  153. package/studio/web/assets/Chat-JpO8EtUu.js +0 -2067
  154. package/studio/web/assets/FloatingChat-Bcj3xSZu.js +0 -23
  155. package/studio/web/assets/applications-ByqLRKyZ.js +0 -296
  156. package/studio/web/assets/architecture-7GRP2DOG-DNdx5tEU.js +0 -1
  157. package/studio/web/assets/authStore-qKmCZcaf.js +0 -3
  158. package/studio/web/assets/channel-DtCV8PTL.js +0 -1
  159. package/studio/web/assets/chunk-R7TYR2AO-Irip67yr.js +0 -10
  160. package/studio/web/assets/classDiagram-DTDB5LWJ-DbO_dCNE.js +0 -1
  161. package/studio/web/assets/classDiagram-v2-JRS7N3AN-DbO_dCNE.js +0 -1
  162. package/studio/web/assets/eventmodeling-NTZA5JFV-5jbe4A5P.js +0 -1
  163. package/studio/web/assets/flowDiagram-A5DVABFB-Dp9Ezlow.js +0 -1
  164. package/studio/web/assets/index-aSt5tY-L.js +0 -824
  165. package/studio/web/assets/index.lazy-B9jiPwT8.js +0 -2
  166. package/studio/web/assets/notifications-CUoYgU98.js +0 -1
  167. package/studio/web/assets/railroad-abnf-HS5TGJTU-Bc0Qi0WH.js +0 -1
  168. package/studio/web/assets/railroad-ebnf-LZEXJU2U-G8rVVZ2C.js +0 -1
  169. package/studio/web/assets/railroad-peg-WCYAUIDC-CrehKBhC.js +0 -1
  170. package/studio/web/assets/stateDiagram-v2-4QOOHH4V-D4tuw9Su.js +0 -1
  171. package/studio/web/assets/status-D7Xn5ePA.js +0 -61
  172. package/studio/web/assets/swimlanesDiagram-VK2B7HYN-XOhmNEvq.js +0 -8
  173. package/studio/web/assets/vendor-core-RCcadM3e.js +0 -73
  174. package/studio/web/assets/vendor-datadog-BRv-mOv1.js +0 -6
  175. package/studio/web/assets/vendor-tanstack-BiFWSB3W.js +0 -1
  176. package/studio/web/assets/x-B9o9hsep.js +0 -1
  177. /package/studio/web/assets/{sizeCapture-X5ZJPWSS-B0uUizjq.js → sizeCapture-INFHLROL-B0uUizjq.js} +0 -0
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "harper",
3
- "version": "5.2.9",
3
+ "version": "5.2.10",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "harper",
9
- "version": "5.2.9",
9
+ "version": "5.2.10",
10
10
  "license": "Apache-2.0",
11
11
  "dependencies": {
12
12
  "@aws-sdk/client-s3": "^3.1012.0",
@@ -17,7 +17,7 @@
17
17
  "@fastify/cors": "^11.2.0",
18
18
  "@fastify/static": "^9.1.3",
19
19
  "@harperfast/extended-iterable": "1.0.3",
20
- "@harperfast/rocksdb-js": "2.8.0",
20
+ "@harperfast/rocksdb-js": "2.9.0",
21
21
  "@harperfast/skills": "^1.10.8",
22
22
  "@turf/area": "6.5.0",
23
23
  "@turf/boolean-contains": "6.5.0",
@@ -1063,14 +1063,14 @@
1063
1063
  "license": "Apache-2.0"
1064
1064
  },
1065
1065
  "node_modules/@harperfast/rocksdb-js": {
1066
- "version": "2.8.0",
1067
- "resolved": "https://registry.npmjs.org/@harperfast/rocksdb-js/-/rocksdb-js-2.8.0.tgz",
1068
- "integrity": "sha512-czswCG+1KCRMYe6XQcsh5u28IQ6EbIx9eXPQd0kmjiLbtoMjiszYE92756bZJSbDykbR2OJLOazMZg7+qfFSJA==",
1066
+ "version": "2.9.0",
1067
+ "resolved": "https://registry.npmjs.org/@harperfast/rocksdb-js/-/rocksdb-js-2.9.0.tgz",
1068
+ "integrity": "sha512-EOQnnDo4aoxLidosuQGZ2xO4kDCqwridUQdJ7UF7Ui7d5gTh6tUfTkqRSYk2CbFehVJDgU1qQLJZePGsXRRaEg==",
1069
1069
  "license": "Apache-2.0",
1070
1070
  "dependencies": {
1071
- "@harperfast/extended-iterable": "1.0.3",
1072
- "msgpackr": "2.0.6",
1073
- "ordered-binary": "1.6.1"
1071
+ "@harperfast/extended-iterable": "^1.0.3",
1072
+ "msgpackr": "^2.0.6",
1073
+ "ordered-binary": "^1.6.1"
1074
1074
  },
1075
1075
  "bin": {
1076
1076
  "rocksdb-js": "bin/rocksdb-js.mjs"
@@ -1079,20 +1079,20 @@
1079
1079
  "node": "^22.18.0 || >=24.0.0"
1080
1080
  },
1081
1081
  "optionalDependencies": {
1082
- "@harperfast/rocksdb-js-darwin-arm64": "2.8.0",
1083
- "@harperfast/rocksdb-js-darwin-x64": "2.8.0",
1084
- "@harperfast/rocksdb-js-linux-arm64-glibc": "2.8.0",
1085
- "@harperfast/rocksdb-js-linux-arm64-musl": "2.8.0",
1086
- "@harperfast/rocksdb-js-linux-x64-glibc": "2.8.0",
1087
- "@harperfast/rocksdb-js-linux-x64-musl": "2.8.0",
1088
- "@harperfast/rocksdb-js-win32-arm64": "2.8.0",
1089
- "@harperfast/rocksdb-js-win32-x64": "2.8.0"
1082
+ "@harperfast/rocksdb-js-darwin-arm64": "2.9.0",
1083
+ "@harperfast/rocksdb-js-darwin-x64": "2.9.0",
1084
+ "@harperfast/rocksdb-js-linux-arm64-glibc": "2.9.0",
1085
+ "@harperfast/rocksdb-js-linux-arm64-musl": "2.9.0",
1086
+ "@harperfast/rocksdb-js-linux-x64-glibc": "2.9.0",
1087
+ "@harperfast/rocksdb-js-linux-x64-musl": "2.9.0",
1088
+ "@harperfast/rocksdb-js-win32-arm64": "2.9.0",
1089
+ "@harperfast/rocksdb-js-win32-x64": "2.9.0"
1090
1090
  }
1091
1091
  },
1092
1092
  "node_modules/@harperfast/rocksdb-js-darwin-arm64": {
1093
- "version": "2.8.0",
1094
- "resolved": "https://registry.npmjs.org/@harperfast/rocksdb-js-darwin-arm64/-/rocksdb-js-darwin-arm64-2.8.0.tgz",
1095
- "integrity": "sha512-v7cj3bGpRptZHXSbhVzYJ0k+jyMD0Z0kX0u8YNZH6Xq+ifZ6zBkBbyoSdvQ2waGLJXxBORylUxTgYMvTZWiQBA==",
1093
+ "version": "2.9.0",
1094
+ "resolved": "https://registry.npmjs.org/@harperfast/rocksdb-js-darwin-arm64/-/rocksdb-js-darwin-arm64-2.9.0.tgz",
1095
+ "integrity": "sha512-zgBjJKkHlyjiKJP+FkstFj1znZ/O8qXE9yIXIyKhTtxDeayobFY2x6M/KOWd9N1kaa8GrAQXGawUEXZnV1U+qw==",
1096
1096
  "cpu": [
1097
1097
  "arm64"
1098
1098
  ],
@@ -1106,9 +1106,9 @@
1106
1106
  }
1107
1107
  },
1108
1108
  "node_modules/@harperfast/rocksdb-js-darwin-x64": {
1109
- "version": "2.8.0",
1110
- "resolved": "https://registry.npmjs.org/@harperfast/rocksdb-js-darwin-x64/-/rocksdb-js-darwin-x64-2.8.0.tgz",
1111
- "integrity": "sha512-9mMPPvRhxjLorE7u1gN3n+InzT4XHXQkHYdNKE6qN4iwZy0vM8iHoQLwIiN9GpzUiueEqBEilAP/9mIOHhMgBw==",
1109
+ "version": "2.9.0",
1110
+ "resolved": "https://registry.npmjs.org/@harperfast/rocksdb-js-darwin-x64/-/rocksdb-js-darwin-x64-2.9.0.tgz",
1111
+ "integrity": "sha512-OfAtdB7GDjkKYaq6Db3mDfoRKnrnjXS1X4OaF4xFsQUoZRtmMvF3OTP9w4N8c2vvEff2kjlGqpj2Dewab1uGNQ==",
1112
1112
  "cpu": [
1113
1113
  "x64"
1114
1114
  ],
@@ -1122,9 +1122,9 @@
1122
1122
  }
1123
1123
  },
1124
1124
  "node_modules/@harperfast/rocksdb-js-linux-arm64-glibc": {
1125
- "version": "2.8.0",
1126
- "resolved": "https://registry.npmjs.org/@harperfast/rocksdb-js-linux-arm64-glibc/-/rocksdb-js-linux-arm64-glibc-2.8.0.tgz",
1127
- "integrity": "sha512-H1nNimVbIB4/6Sxv5DrxmP1asHLbxTCHuZ2ZN/zudqPkp/bTTSs5RsczOH6JeKTEUxUsJDTXM4nGRcn6LwFaOg==",
1125
+ "version": "2.9.0",
1126
+ "resolved": "https://registry.npmjs.org/@harperfast/rocksdb-js-linux-arm64-glibc/-/rocksdb-js-linux-arm64-glibc-2.9.0.tgz",
1127
+ "integrity": "sha512-/CnIr6vy+D5M4c2WOAyoC9/2TKSEYCvvsyzz0AoWw3taUmEX6fR308eHMA0iKFHPp7xSI3fyz0fBOd+3TO250A==",
1128
1128
  "cpu": [
1129
1129
  "arm64"
1130
1130
  ],
@@ -1141,9 +1141,9 @@
1141
1141
  }
1142
1142
  },
1143
1143
  "node_modules/@harperfast/rocksdb-js-linux-arm64-musl": {
1144
- "version": "2.8.0",
1145
- "resolved": "https://registry.npmjs.org/@harperfast/rocksdb-js-linux-arm64-musl/-/rocksdb-js-linux-arm64-musl-2.8.0.tgz",
1146
- "integrity": "sha512-EqG4lkYptNviIcPPaQjK+X4ufjqzSImIvVxP89GHFHrbOJkGgEwRpiya0gWfGu3vJ1iGL1XL1nsU/kEjeDOugg==",
1144
+ "version": "2.9.0",
1145
+ "resolved": "https://registry.npmjs.org/@harperfast/rocksdb-js-linux-arm64-musl/-/rocksdb-js-linux-arm64-musl-2.9.0.tgz",
1146
+ "integrity": "sha512-MBM4Vv4ERdRgbmXZXQrGPhgmTmb0EX22dwDEFrq57mpn5IEuuXU4S/RXGAcsoEmYqYb86lvtukD5AnvxcefoSA==",
1147
1147
  "cpu": [
1148
1148
  "arm64"
1149
1149
  ],
@@ -1160,9 +1160,9 @@
1160
1160
  }
1161
1161
  },
1162
1162
  "node_modules/@harperfast/rocksdb-js-linux-x64-glibc": {
1163
- "version": "2.8.0",
1164
- "resolved": "https://registry.npmjs.org/@harperfast/rocksdb-js-linux-x64-glibc/-/rocksdb-js-linux-x64-glibc-2.8.0.tgz",
1165
- "integrity": "sha512-MZPKZ6gF8kCy/KXTav4tc7T2uq+iOunxDOYq7nifZkCCy+0+C9U7g9CZx0NErORRQRP29x3z0zEKkCQ/go5c6Q==",
1163
+ "version": "2.9.0",
1164
+ "resolved": "https://registry.npmjs.org/@harperfast/rocksdb-js-linux-x64-glibc/-/rocksdb-js-linux-x64-glibc-2.9.0.tgz",
1165
+ "integrity": "sha512-rhIoInrDAzwMx7N2H0K1mM8x/hY2D/NF2rhd8ERT2w2GoK4NqdBtPldVY8ein8fmtDdYaS6CpHmRSmq+xlhqhw==",
1166
1166
  "cpu": [
1167
1167
  "x64"
1168
1168
  ],
@@ -1179,9 +1179,9 @@
1179
1179
  }
1180
1180
  },
1181
1181
  "node_modules/@harperfast/rocksdb-js-linux-x64-musl": {
1182
- "version": "2.8.0",
1183
- "resolved": "https://registry.npmjs.org/@harperfast/rocksdb-js-linux-x64-musl/-/rocksdb-js-linux-x64-musl-2.8.0.tgz",
1184
- "integrity": "sha512-PnMn1f/UxGOZKxlayR82tzsFCGoaMu0mBGKMmP/r2rbxzX5T89T0c+aVhuhpgNrFlWXTdawlA10Oh/YjfT/2qQ==",
1182
+ "version": "2.9.0",
1183
+ "resolved": "https://registry.npmjs.org/@harperfast/rocksdb-js-linux-x64-musl/-/rocksdb-js-linux-x64-musl-2.9.0.tgz",
1184
+ "integrity": "sha512-D/MfsqycP7ijIAAptUcITsMMzn7cnawdL3H1XUqe+h9fgNP7+y0gXk/9KxVA5D6cKPw1TkEDaeLuuBsiI2vFUA==",
1185
1185
  "cpu": [
1186
1186
  "x64"
1187
1187
  ],
@@ -1198,9 +1198,9 @@
1198
1198
  }
1199
1199
  },
1200
1200
  "node_modules/@harperfast/rocksdb-js-win32-arm64": {
1201
- "version": "2.8.0",
1202
- "resolved": "https://registry.npmjs.org/@harperfast/rocksdb-js-win32-arm64/-/rocksdb-js-win32-arm64-2.8.0.tgz",
1203
- "integrity": "sha512-4khqmGbIebiCwY3FVIgcUXEmMapgWP8f97aNrbThPDCIkuJscB3yoAG4A8OJo+Jln/TdjJZOgy8e2ir9F926dA==",
1201
+ "version": "2.9.0",
1202
+ "resolved": "https://registry.npmjs.org/@harperfast/rocksdb-js-win32-arm64/-/rocksdb-js-win32-arm64-2.9.0.tgz",
1203
+ "integrity": "sha512-76PILBAErw0R9enoprg83FdyHk0UNG63pII4klFV5Xlrfj0gmJ0iqLEbocEwC+d2RTGkpgkUPjoNMw4BbMpyTA==",
1204
1204
  "cpu": [
1205
1205
  "arm64"
1206
1206
  ],
@@ -1214,9 +1214,9 @@
1214
1214
  }
1215
1215
  },
1216
1216
  "node_modules/@harperfast/rocksdb-js-win32-x64": {
1217
- "version": "2.8.0",
1218
- "resolved": "https://registry.npmjs.org/@harperfast/rocksdb-js-win32-x64/-/rocksdb-js-win32-x64-2.8.0.tgz",
1219
- "integrity": "sha512-E5HpBAnRwotITq++534WCinMvYidkkPoaAD5uwBNHiQbNt6YYvNZllJAIh/bukXD+uO6DL6qUMmVkeBh3kWK5A==",
1217
+ "version": "2.9.0",
1218
+ "resolved": "https://registry.npmjs.org/@harperfast/rocksdb-js-win32-x64/-/rocksdb-js-win32-x64-2.9.0.tgz",
1219
+ "integrity": "sha512-BRPIzbvx1NlOhA6vwAnUwFYuIQykmdsjGxnblb5ejvdf9HFw0b6durdKQfPyk8L+RO2uiXqpfkK4Da8V0vhgdQ==",
1220
1220
  "cpu": [
1221
1221
  "x64"
1222
1222
  ],
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@harperfast/harper",
3
3
  "description": "Harper is an open-source Node.js performance platform that unifies database, cache, application, and messaging layers into one in-memory process.",
4
- "version": "5.2.9",
4
+ "version": "5.2.10",
5
5
  "license": "Apache-2.0",
6
6
  "homepage": "https://harper.fast",
7
7
  "bugs": {
@@ -179,7 +179,7 @@
179
179
  "@fastify/cors": "^11.2.0",
180
180
  "@fastify/static": "^9.1.3",
181
181
  "@harperfast/extended-iterable": "1.0.3",
182
- "@harperfast/rocksdb-js": "2.8.0",
182
+ "@harperfast/rocksdb-js": "2.9.0",
183
183
  "@harperfast/skills": "^1.10.8",
184
184
  "@turf/area": "6.5.0",
185
185
  "@turf/boolean-contains": "6.5.0",
@@ -16,6 +16,7 @@ import type { Entry } from './RecordEncoder.ts';
16
16
  import { toBufferKey } from 'ordered-binary';
17
17
 
18
18
  const trackedTxns = new Set<DatabaseTransaction>();
19
+ const readTransactionOwners = new WeakMap<ReadTransaction, DatabaseTransaction>();
19
20
  // Read options for a rotated generation's native transactions; shared because they never vary.
20
21
  const SNAPSHOT_FREE = Object.freeze({ disableSnapshot: true });
21
22
  // Logical transactions the monitor supervises for their WRITES, kept apart from trackedTxns because the
@@ -236,6 +237,76 @@ export function transactionOpenTooLongError(): ServerError {
236
237
  );
237
238
  }
238
239
 
240
+ class ReadSnapshotExpiredError extends ServerError {
241
+ constructor() {
242
+ super('Read scan snapshot expired; retry the read without replaying previously committed writes', 503);
243
+ this.name = 'ReadSnapshotExpiredError';
244
+ }
245
+ }
246
+
247
+ export function trackReadRange(transaction: ReadTransaction, createRange: () => any): any {
248
+ const owner = readTransactionOwners.get(transaction);
249
+ if (!owner) return createRange();
250
+ function checkActive() {
251
+ if (owner.timedOut) throw transactionOpenTooLongError();
252
+ if (owner.transaction !== transaction) {
253
+ throw new ReadSnapshotExpiredError();
254
+ }
255
+ }
256
+ checkActive();
257
+ const range = createRange();
258
+ const iterate = range.iterate;
259
+ range.iterate = function (options) {
260
+ const iterator = iterate.call(this, options);
261
+ let done = false;
262
+ // Closing the underlying iterator is the one step here that can throw for a reason the caller
263
+ // must not see: `next()` only reaches it once the snapshot is already gone, which is the
264
+ // likeliest moment for the native layer to object, and an error from cleanup would replace the
265
+ // named 503 with exactly the raw iterator error this wrapper exists to stop surfacing. The
266
+ // closure reference rather than `this` so a destructured `next` still cleans up.
267
+ const wrapper = {
268
+ [Symbol.iterator]() {
269
+ return this;
270
+ },
271
+ next() {
272
+ if (done) return { done: true, value: undefined };
273
+ try {
274
+ checkActive();
275
+ owner.rangeReadActive = true;
276
+ const result = iterator.next();
277
+ done = result.done === true;
278
+ return result;
279
+ } catch (error) {
280
+ closeQuietly();
281
+ throw error;
282
+ }
283
+ },
284
+ return(value?: any) {
285
+ if (!done) {
286
+ done = true;
287
+ iterator.return?.(value);
288
+ }
289
+ return { done: true, value };
290
+ },
291
+ throw(error) {
292
+ // Not delegated to `iterator.throw`: it closes and rethrows the same error anyway, and
293
+ // delegating after the close below would run it against an iterator already closed.
294
+ closeQuietly();
295
+ throw error;
296
+ },
297
+ };
298
+ function closeQuietly() {
299
+ try {
300
+ wrapper.return();
301
+ } catch {
302
+ // the error being propagated is the actionable one
303
+ }
304
+ }
305
+ return wrapper;
306
+ };
307
+ return range;
308
+ }
309
+
239
310
  type MaybePromise<T> = T | Promise<T>;
240
311
 
241
312
  export type CommitOptions = {
@@ -419,8 +490,9 @@ export class DatabaseTransaction implements Transaction {
419
490
  // back what it asked for.
420
491
  snapshotFree = false;
421
492
 
422
- getReadTxn(disableSnapshot?: boolean): ReadTransaction {
423
- this.readTxnRefCount = (this.readTxnRefCount || 0) + 1;
493
+ rangeReadActive = false;
494
+
495
+ renewReadTimeout(): void {
424
496
  // The limit is an IDLE limit. Writes always re-arm it (see addWrite), but reads only do so
425
497
  // while no uncommitted writes are held: staged writes hold write intents that other writers'
426
498
  // coordinated-retry commits park on, so a handler that wrote once and then only reads — an
@@ -433,6 +505,11 @@ export class DatabaseTransaction implements Transaction {
433
505
  if ((this.writes.length === 0 && !this.next) || this.open !== TRANSACTION_STATE.OPEN || !this.hasPendingWrites()) {
434
506
  this.timeout = Math.max(txnExpiration, this.timeoutBudget);
435
507
  }
508
+ }
509
+
510
+ getReadTxn(disableSnapshot?: boolean): ReadTransaction {
511
+ this.readTxnRefCount = (this.readTxnRefCount || 0) + 1;
512
+ this.renewReadTimeout();
436
513
  if (this.transaction) {
437
514
  if ((this.transaction as any).openTimer) (this.transaction as any).openTimer = 0;
438
515
  return this.transaction;
@@ -467,6 +544,8 @@ export class DatabaseTransaction implements Transaction {
467
544
  // Monitor state is not ownership state: it stays with `trackedTxns.add` in getReadTxn().
468
545
  private attachOwnedTransaction(transaction: RocksTransactionWithRetry): void {
469
546
  this.transaction = transaction;
547
+ readTransactionOwners.set(transaction, this);
548
+ this.rangeReadActive = false;
470
549
  this.readTxnsUsed = 1;
471
550
  this.baseReadRefConsumed = false;
472
551
  }
@@ -507,6 +586,7 @@ export class DatabaseTransaction implements Transaction {
507
586
  trackedTxns.delete(this);
508
587
  this.endWriteSupervision();
509
588
  this.transaction = null;
589
+ this.rangeReadActive = false;
510
590
  this.readTxnsUsed = 0;
511
591
  this.readTxnRefCount = 0;
512
592
  return transaction;
@@ -995,6 +1075,8 @@ export class DatabaseTransaction implements Transaction {
995
1075
  if (transaction) {
996
1076
  this.writes = this.writes.filter((write) => write); // filter out removed entries
997
1077
  if (this.writes.length > 0) {
1078
+ // Commit retries can construct fresh ranges on this live handle after read ownership ends.
1079
+ readTransactionOwners.delete(transaction);
998
1080
  // The transaction was created with coordinatedRetry:true (see
999
1081
  // getReadTxn), so commit() can resolve to RETRY_NOW_VALUE. That
1000
1082
  // sentinel (a number) is why commitResolution is typed
@@ -1581,6 +1663,10 @@ function startMonitoringTxns() {
1581
1663
  }, txnExpiration).unref();
1582
1664
 
1583
1665
  function monitorTransaction(txn: DatabaseTransaction) {
1666
+ if (txn.rangeReadActive) {
1667
+ txn.rangeReadActive = false;
1668
+ txn.renewReadTimeout();
1669
+ }
1584
1670
  {
1585
1671
  // Decay write recency once per tick for every tracked link, independent of the `timeout`
1586
1672
  // branches below — a tracked link that keeps its own idle limit alive by reading must not
@@ -1,3 +1,4 @@
1
+ import { trackReadRange } from './DatabaseTransaction.ts';
1
2
  import { RocksDatabase, type RocksDatabaseOptions, constants, type Store } from '@harperfast/rocksdb-js';
2
3
 
3
4
  const FRESH_VERSION_FLAG = constants.FRESH_VERSION_FLAG;
@@ -151,7 +152,7 @@ export class PrimaryRocksDatabase extends RocksDatabase {
151
152
  }
152
153
 
153
154
  getRange(options?: any): any {
154
- const iterable = super.getRange(options);
155
+ const iterable = trackReadRange(options?.transaction, () => super.getRange(options));
155
156
  if (options?.valuesForKey) return iterable.map((v: any) => v?.value);
156
157
  if (options?.values === false || options?.onlyCount) return iterable;
157
158
  if (!this.#enc.isRocksDB) return iterable;
@@ -1,3 +1,4 @@
1
+ import { trackReadRange } from './DatabaseTransaction.ts';
1
2
  import {
2
3
  DBI,
3
4
  type StoreIteratorOptions,
@@ -35,7 +36,7 @@ export class RocksIndexStore extends RocksDatabase {
35
36
  end = [end, MAXIMUM_KEY];
36
37
  }
37
38
  const translatedOptions = { ...options, start, end };
38
- return super.getRange(translatedOptions).map(({ key }) => {
39
+ return trackReadRange(options.transaction, () => super.getRange(translatedOptions)).map(({ key }) => {
39
40
  return { key: key[0], value: key.length > 2 ? key.slice(1) : key[1] };
40
41
  });
41
42
  }
@@ -86,7 +86,7 @@ import { rebuildUpdateBefore } from './crdt.ts';
86
86
  import { appendHeader } from '../server/serverHelpers/Headers.ts';
87
87
  import fs from 'node:fs';
88
88
  import { Blob, deleteBlobsInObject, findBlobsInObject, startPreCommitBlobsForRecord } from './blob.ts';
89
- import { onStorageReclamation, getStorageSpaceStats } from '../server/storageReclamation.ts';
89
+ import { onStorageReclamation, removeStorageReclamation, getStorageSpaceStats } from '../server/storageReclamation.ts';
90
90
  import { RequestTarget } from './RequestTarget.ts';
91
91
  import harperLogger from '../utility/logging/harper_logger.ts';
92
92
  import { throttle } from '../server/throttle.ts';
@@ -1564,7 +1564,12 @@ export function makeTable(options) {
1564
1564
  if (removeTombstonedCatalog()) await dbisDb.committed;
1565
1565
  }
1566
1566
  } else {
1567
- // legacy table per database
1567
+ // legacy table per database. The store to retire is this table's own audit store: nothing
1568
+ // assigns `primaryStore.auditStore` — openAuditStore() assigns `rootStore.auditStore`, and
1569
+ // this is the reference makeTable() was handed. Awaited so a pass suspended mid-removal has
1570
+ // released the primary DBI before it is closed and unlinked.
1571
+ await auditStore?.stopAuditCleanup?.();
1572
+ removeStorageReclamation(primaryStore.path);
1568
1573
  await primaryStore.close();
1569
1574
  fs.unlinkSync(primaryStore.path);
1570
1575
  }
@@ -3335,6 +3340,7 @@ export function makeTable(options) {
3335
3340
  // objects. Entries are small and shallow; the clone is cheap next to the query.
3336
3341
  conditions = cloneConditions(conditions);
3337
3342
  let orderAlignedCondition;
3343
+ let syntheticOrderCondition;
3338
3344
  const filtered = {};
3339
3345
 
3340
3346
  function prepareConditions(conditions: any[], operator: string) {
@@ -3473,7 +3479,7 @@ export function makeTable(options) {
3473
3479
  // if it is indexed, we add a pseudo-condition to align with the natural sort order of the index.
3474
3480
  // the primary key has no secondary index, but the primary store is itself keyed in
3475
3481
  // primary-key order, so scanning it is already aligned with the sort
3476
- orderAlignedCondition = { ...sort, comparator: 'sort' };
3482
+ orderAlignedCondition = syntheticOrderCondition = { ...sort, comparator: 'sort' };
3477
3483
  conditions.push(orderAlignedCondition);
3478
3484
  } else if (conditions.length === 0 && !target.allowFullScan)
3479
3485
  throw handleHDBError(
@@ -3503,8 +3509,10 @@ export function makeTable(options) {
3503
3509
  };
3504
3510
  }
3505
3511
  } else {
3506
- // if we had to add an aligned condition that isn't first, we remove it and do ordering later
3507
- if (orderAlignedCondition) conditions.splice(conditions.indexOf(orderAlignedCondition), 1);
3512
+ // if we had to add an aligned condition that isn't first, we remove it and do ordering later —
3513
+ // only the one we added; a caller's own condition on the sort attribute is still a filter
3514
+ const syntheticIndex = syntheticOrderCondition ? conditions.indexOf(syntheticOrderCondition) : -1;
3515
+ if (syntheticIndex >= 0) conditions.splice(syntheticIndex, 1);
3508
3516
  postOrdering = sort;
3509
3517
  }
3510
3518
  }