@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.
- package/dist/resources/DatabaseTransaction.d.ts +3 -0
- package/dist/resources/DatabaseTransaction.js +90 -2
- package/dist/resources/DatabaseTransaction.js.map +1 -1
- package/dist/resources/PrimaryRocksDatabase.js +2 -1
- package/dist/resources/PrimaryRocksDatabase.js.map +1 -1
- package/dist/resources/RocksIndexStore.js +2 -1
- package/dist/resources/RocksIndexStore.js.map +1 -1
- package/dist/resources/Table.js +13 -5
- package/dist/resources/Table.js.map +1 -1
- package/dist/resources/auditStore.js +142 -53
- package/dist/resources/auditStore.js.map +1 -1
- package/dist/resources/databases.d.ts +9 -0
- package/dist/resources/databases.js +315 -76
- package/dist/resources/databases.js.map +1 -1
- package/dist/resources/search.js +33 -7
- package/dist/resources/search.js.map +1 -1
- package/dist/server/storageReclamation.d.ts +7 -0
- package/dist/server/storageReclamation.js +10 -0
- package/dist/server/storageReclamation.js.map +1 -1
- package/dist/server/threads/manageThreads.d.ts +1 -0
- package/dist/server/threads/manageThreads.js +7 -0
- package/dist/server/threads/manageThreads.js.map +1 -1
- package/npm-shrinkwrap.json +41 -41
- package/package.json +2 -2
- package/resources/DatabaseTransaction.ts +88 -2
- package/resources/PrimaryRocksDatabase.ts +2 -1
- package/resources/RocksIndexStore.ts +2 -1
- package/resources/Table.ts +13 -5
- package/resources/auditStore.ts +144 -52
- package/resources/databases.ts +296 -70
- package/resources/search.ts +32 -7
- package/server/storageReclamation.ts +10 -0
- package/server/threads/manageThreads.js +7 -0
- package/studio/web/assets/Chat-Br06zdMA.js +2267 -0
- package/studio/web/assets/FloatingChat-BWImX5fA.js +23 -0
- package/studio/web/assets/{abnfDiagram-VCTEODGH-C0_BAZyO.js → abnfDiagram-VCTEODGH-B0BebmD2.js} +1 -1
- package/studio/web/assets/{alertDialog-DIHt7Z0r.js → alertDialog-CQyAJJhl.js} +1 -1
- package/studio/web/assets/{apiToken-c3Rd-w6g.js → apiToken-DN0nmDsq.js} +1 -1
- package/studio/web/assets/applications-kSxVoyeU.js +296 -0
- package/studio/web/assets/architecture-7GRP2DOG-LB-MLAAb.js +1 -0
- package/studio/web/assets/{architectureDiagram-5GKGNRK7-BWzrASgm.js → architectureDiagram-5GKGNRK7-7SW3GD-K.js} +1 -1
- package/studio/web/assets/authStore-C3Nfubqr.js +3 -0
- package/studio/web/assets/{blockDiagram-NRAW4CY4-BdJX9Khj.js → blockDiagram-I7D4REHJ-BqguiadH.js} +2 -2
- package/studio/web/assets/{button-DhiX-njv.js → button-BIsUKRZq.js} +2 -2
- package/studio/web/assets/{c4Diagram-UCG6FXSJ-CI6MzGmQ.js → c4Diagram-7LVT6UL2-LBNf8t_X.js} +1 -1
- package/studio/web/assets/channel-yictG-U-.js +1 -0
- package/studio/web/assets/{chevron-up-Df2c8uoU.js → chevron-up-DtKGqDn3.js} +1 -1
- package/studio/web/assets/{chunk-TEH6E4GO-P87k5mNi.js → chunk-4HAMMTFA-DWtTut21.js} +1 -1
- package/studio/web/assets/{chunk-75Z2AOVW-BT8tVmks.js → chunk-75Z2AOVW-QGQD6th2.js} +1 -1
- package/studio/web/assets/{chunk-DU6HZSFF-9kAOOmI6.js → chunk-DU6HZSFF-Chq20Ba5.js} +1 -1
- package/studio/web/assets/{chunk-F27PBJKO-BW7ao8AY.js → chunk-F27PBJKO-BVA5EPhV.js} +1 -1
- package/studio/web/assets/{chunk-GMAD6QVW-BNyXpoQO.js → chunk-GMAD6QVW-BeS7S07A.js} +1 -1
- package/studio/web/assets/{chunk-OBVCFTLP-D4wWOqDQ.js → chunk-GVQU2GXP-sbwVIQ8i.js} +1 -1
- package/studio/web/assets/{chunk-G27WJ6UU-COyLMcgK.js → chunk-IMKFNOWR-Bnh3tAVd.js} +1 -1
- package/studio/web/assets/{chunk-JQ64N6SF-Cyz1IeLf.js → chunk-L3NEJ4N5-COfUyKII.js} +1 -1
- package/studio/web/assets/chunk-OSK3NFVY-ByciRftO.js +10 -0
- package/studio/web/assets/{chunk-P2QGCYS3-DmIFY4d7.js → chunk-P2QGCYS3-CP1VhG_c.js} +1 -1
- package/studio/web/assets/{chunk-POPQ4Y6H-BPrvMyKz.js → chunk-POPQ4Y6H-ClWhhkwW.js} +1 -1
- package/studio/web/assets/{chunk-PWAF6VOD-2zB6IW9i.js → chunk-PWAF6VOD-1z1THyS5.js} +1 -1
- package/studio/web/assets/{chunk-RHFEMEQ7-2FgyI8YU.js → chunk-SHT3W25Y-LpQkMsah.js} +2 -2
- package/studio/web/assets/{chunk-SVP7TREG-FwtbH2QC.js → chunk-SVP7TREG-jtdAHw0S.js} +1 -1
- package/studio/web/assets/{chunk-LCL6LL3I-HOzK_ppE.js → chunk-TICWLB2K-VOwzetX-.js} +1 -1
- package/studio/web/assets/classDiagram-ZZMXUADV-VaEwSy_g.js +1 -0
- package/studio/web/assets/classDiagram-v2-VYDZK3BY-VaEwSy_g.js +1 -0
- package/studio/web/assets/{createLucideIcon-BKGPfjm2.js → createLucideIcon-CzW9508A.js} +1 -1
- package/studio/web/assets/{cssMode-CEN2mzSA.js → cssMode-C1JeufH5.js} +1 -1
- package/studio/web/assets/{cynefin-OW5HDTMX-BRkpLFQV.js → cynefin-OW5HDTMX-BbdbCvub.js} +1 -1
- package/studio/web/assets/{cynefinDiagram-5FMLGOSQ-CHT1DaX6.js → cynefinDiagram-5FMLGOSQ-TP-aIqbt.js} +1 -1
- package/studio/web/assets/{dagre-3AP2YEHR-DpUXBh63.js → dagre-GXQ25YYZ-DShnGpGo.js} +1 -1
- package/studio/web/assets/{diagram-S7CK7UJ4-BuymVFZT.js → diagram-S7CK7UJ4-aoCVTtcy.js} +1 -1
- package/studio/web/assets/{diagram-UQ7AKVKN-CyP148RM.js → diagram-UQ7AKVKN-DglXtQ6x.js} +1 -1
- package/studio/web/assets/{diagram-VSXAHHWV-CoCAg3M9.js → diagram-VSXAHHWV-fhEdmkwM.js} +1 -1
- package/studio/web/assets/{diagram-VX7I27RA-BpOqCFca.js → diagram-VX7I27RA-DccVJet6.js} +1 -1
- package/studio/web/assets/{diagram-Z3DM3KII-Bfpw7Vbj.js → diagram-Z3DM3KII-D-RyJJb7.js} +1 -1
- package/studio/web/assets/{dialog-CBf0Mr1d.js → dialog-Cn2uWgD4.js} +1 -1
- package/studio/web/assets/{dist-lkA3O3eM.js → dist-DP8UjMB_.js} +1 -1
- package/studio/web/assets/{download-BtTOBem-.js → download-B5T5r7ss.js} +1 -1
- package/studio/web/assets/{ebnfDiagram-PWID7BFC-DS_6aWqL.js → ebnfDiagram-PWID7BFC-DJGpIpz_.js} +1 -1
- package/studio/web/assets/{editor-D8oDeCTL.js → editor-qoo9CrGO.js} +1 -1
- package/studio/web/assets/{erDiagram-SSCWMZ5O-DJNk6Fgw.js → erDiagram-RLTQ6QDP-CIfNlgkC.js} +1 -1
- package/studio/web/assets/eventmodeling-NTZA5JFV-CLxnp2CR.js +1 -0
- package/studio/web/assets/flowDiagram-HODETNUW-BIbhmz9f.js +1 -0
- package/studio/web/assets/{ganttDiagram-EL5Y4UJY-2pOExxMY.js → ganttDiagram-EL5Y4UJY-BxToTzzD.js} +1 -1
- package/studio/web/assets/{getAnalytics-D4LKGeVy.js → getAnalytics-GHK8ORfM.js} +1 -1
- package/studio/web/assets/{gitGraph-4MIJSDKK-CH5ZxwzF.js → gitGraph-4MIJSDKK-D2s2w8lE.js} +1 -1
- package/studio/web/assets/{gitGraphDiagram-WWUBYQGX-DVIsIhbO.js → gitGraphDiagram-WWUBYQGX-Dwntd4-x.js} +1 -1
- package/studio/web/assets/{html-u3vOg7LJ.js → html-Dt4IIy04.js} +1 -1
- package/studio/web/assets/{htmlMode-DyO31v-P.js → htmlMode-DXgKKr4C.js} +1 -1
- package/studio/web/assets/index-6onkYFOG.js +824 -0
- package/studio/web/assets/{index-Cxj2_wsl.css → index-7RMEgVG1.css} +1 -1
- package/studio/web/assets/index.lazy-BrCFnpNJ.js +2 -0
- package/studio/web/assets/{info-A6RAGUB7-CPQfTnaG.js → info-A6RAGUB7-DYjkvb0C.js} +1 -1
- package/studio/web/assets/{infoDiagram-RXCK75RN-DlwLYlwm.js → infoDiagram-27XIBGKW-Bnp1FJE5.js} +1 -1
- package/studio/web/assets/{ishikawaDiagram-5VMMS53U-BRXRp29U.js → ishikawaDiagram-5VMMS53U-D9Xh2r6X.js} +1 -1
- package/studio/web/assets/{javascript-CUvxOyTC.js → javascript-DNCQGUBc.js} +1 -1
- package/studio/web/assets/{journeyDiagram-EYS64GPL-B0ou8k0n.js → journeyDiagram-3NMN7TZE-CokIi6ll.js} +2 -2
- package/studio/web/assets/{jsonMode-f_IwbF3D.js → jsonMode-CR6HWruP.js} +1 -1
- package/studio/web/assets/{kanban-definition-3QL26DDD-uYg7iYzp.js → kanban-definition-UXKFOSKX-CukSFJfX.js} +1 -1
- package/studio/web/assets/{languageServices-DXtZ6rEF.js → languageServices-BM4fI4rS.js} +1 -1
- package/studio/web/assets/{lspLanguageFeatures-B4pCF1zO.js → lspLanguageFeatures-DSa1ttcD.js} +1 -1
- package/studio/web/assets/{mermaid-parser.core-Ck-fC8b7.js → mermaid-parser.core-BlEsOWNO.js} +3 -3
- package/studio/web/assets/{mermaid.core-CP8aNNYm.js → mermaid.core-BlkGaMIH.js} +5 -5
- package/studio/web/assets/{mindmap-definition-FBJOCRG2-CgTZ-rit.js → mindmap-definition-YA3MSWOX-IprMc_0j.js} +1 -1
- package/studio/web/assets/{notifications-D3tIQ4sg.js → notifications-BHXLnh6x.js} +1 -1
- package/studio/web/assets/notifications-CUmtIA6z.js +1 -0
- package/studio/web/assets/{packet-AYTQ26CC-DEyoPtPb.js → packet-AYTQ26CC-Bi3V04Zi.js} +1 -1
- package/studio/web/assets/{pegDiagram-XKGWAZYB-DrD-7sD9.js → pegDiagram-XKGWAZYB-BNuPDLZY.js} +1 -1
- package/studio/web/assets/{pie-WAS4IAKB-wjj-EI1d.js → pie-WAS4IAKB-_6DoDbng.js} +1 -1
- package/studio/web/assets/{pieDiagram-E7YTZNPT-GntqDCzv.js → pieDiagram-E7YTZNPT-DqNb6Ht2.js} +1 -1
- package/studio/web/assets/{profile-DZWU7MgT.js → profile-8BeFSF3j.js} +1 -1
- package/studio/web/assets/{quadrantDiagram-AXDQQJYC-0UeqXQGd.js → quadrantDiagram-AXDQQJYC-BGH9E2YR.js} +1 -1
- package/studio/web/assets/{radar-RG4KPBEZ-DFSA5h7k.js → radar-RG4KPBEZ-DDdVczcL.js} +1 -1
- package/studio/web/assets/{railroad-74A4TZTK-CaOUG9wR.js → railroad-74A4TZTK-BJUP4Jds.js} +1 -1
- package/studio/web/assets/railroad-abnf-HS5TGJTU-Bm3L1L0h.js +1 -0
- package/studio/web/assets/railroad-ebnf-LZEXJU2U-CKzLGlkw.js +1 -0
- package/studio/web/assets/railroad-peg-WCYAUIDC-S8xLjslx.js +1 -0
- package/studio/web/assets/{railroadDiagram-O6MQD6OU-yHUELZaV.js → railroadDiagram-O6MQD6OU-DGTPh2KZ.js} +1 -1
- package/studio/web/assets/{regions-CkyurXzE.js → regions-C8qR0HhD.js} +1 -1
- package/studio/web/assets/{register-BUyhWjBO.js → register-B4n5i0SD.js} +3 -3
- package/studio/web/assets/{requirementDiagram-EFPCY7ZU-DNEGFjuW.js → requirementDiagram-BXWQKSXE-BJnO6uLz.js} +1 -1
- package/studio/web/assets/{sankeyDiagram-P5KCCOFB-DpyAmSVR.js → sankeyDiagram-P5KCCOFB-0vSOdymH.js} +1 -1
- package/studio/web/assets/{sequenceDiagram-WJ2MYXX4-TyaT7xNk.js → sequenceDiagram-WJ2MYXX4-hETizDWE.js} +1 -1
- package/studio/web/assets/{setComponentFile-CeyKSZAa.js → setComponentFile-g0_B0lgX.js} +1 -1
- package/studio/web/assets/{setup-D2kn7cAA.js → setup-B0CTj_Q5.js} +2 -2
- package/studio/web/assets/{stateDiagram-HBIQ2CUA-CeEdTArZ.js → stateDiagram-D77RDMKH-CdYQ_KtC.js} +1 -1
- package/studio/web/assets/stateDiagram-v2-MP3YSRHH-CdKuzQMT.js +1 -0
- package/studio/web/assets/status-C6Yib7-K.js +61 -0
- package/studio/web/assets/{swimlanes-XN3QIQJK-B54FmF46.js → swimlanes-42K2YHIH-B8cHIpU4.js} +1 -1
- package/studio/web/assets/swimlanesDiagram-VR7AAH4N-DmOSJwaH.js +8 -0
- package/studio/web/assets/{tabs-B_G5zscN.js → tabs-BrHu7gJi.js} +1 -1
- package/studio/web/assets/{timeline-definition-24CTP7MA-D-a9ujbo.js → timeline-definition-24CTP7MA-BJWYSXqF.js} +1 -1
- package/studio/web/assets/{toggleHighContrast-C0UW6rI2.js → toggleHighContrast-Dgta7bVi.js} +1 -1
- package/studio/web/assets/{treeView-Q6P3EWNA-CrW_6JnS.js → treeView-Q6P3EWNA-qxe_v6CQ.js} +1 -1
- package/studio/web/assets/{treemap-WGGIJYW6-BxyYLdP_.js → treemap-WGGIJYW6-dDo97XXF.js} +1 -1
- package/studio/web/assets/{tsMode-DBC0zmDx.js → tsMode-CH_jHvU-.js} +1 -1
- package/studio/web/assets/{typescript-DApRQir3.js → typescript-Co9LCXd5.js} +1 -1
- package/studio/web/assets/{useEntityRestURL-DB6JStU1.js → useEntityRestURL-wKC8NsC_.js} +1 -1
- package/studio/web/assets/{useLocalStorage-Dtj1QS8_.js → useLocalStorage-BqMR3D8_.js} +1 -1
- package/studio/web/assets/vendor-core-c2JRRJpV.js +58 -0
- package/studio/web/assets/vendor-datadog-CLUcJXOo.js +6 -0
- package/studio/web/assets/{vendor-react-Dyj4O3HE.js → vendor-react-CJV_K1u4.js} +1 -1
- package/studio/web/assets/vendor-tanstack-DxzraizX.js +1 -0
- package/studio/web/assets/{vendor-ui-vhu-UHhF.js → vendor-ui-BUjK0h8a.js} +2 -2
- package/studio/web/assets/{vennDiagram-4TSXK5OY-Cy7s7Mpy.js → vennDiagram-4TSXK5OY-A3i-lCdl.js} +1 -1
- package/studio/web/assets/{wardley-WFR3VGLG-BeBL35g2.js → wardley-WFR3VGLG-B0ik-_6g.js} +1 -1
- package/studio/web/assets/{wardleyDiagram-VM6X3IG4-BylmIGSg.js → wardleyDiagram-VM6X3IG4-CjrkKWUR.js} +1 -1
- package/studio/web/assets/{workers-C0bFIedw.js → workers-CWeLxCXA.js} +1 -1
- package/studio/web/assets/x-DIzaLEdK.js +1 -0
- package/studio/web/assets/{xml-HWd01lU-.js → xml-BadC-0Rk.js} +1 -1
- package/studio/web/assets/{xychartDiagram-S5SC5T6Z-CoKALMXr.js → xychartDiagram-S5SC5T6Z-Biok4GYV.js} +1 -1
- package/studio/web/assets/{yaml-CIH0Nt-h.js → yaml-BiUfxPbC.js} +1 -1
- package/studio/web/index.html +14 -14
- package/studio/web/assets/Chat-JpO8EtUu.js +0 -2067
- package/studio/web/assets/FloatingChat-Bcj3xSZu.js +0 -23
- package/studio/web/assets/applications-ByqLRKyZ.js +0 -296
- package/studio/web/assets/architecture-7GRP2DOG-DNdx5tEU.js +0 -1
- package/studio/web/assets/authStore-qKmCZcaf.js +0 -3
- package/studio/web/assets/channel-DtCV8PTL.js +0 -1
- package/studio/web/assets/chunk-R7TYR2AO-Irip67yr.js +0 -10
- package/studio/web/assets/classDiagram-DTDB5LWJ-DbO_dCNE.js +0 -1
- package/studio/web/assets/classDiagram-v2-JRS7N3AN-DbO_dCNE.js +0 -1
- package/studio/web/assets/eventmodeling-NTZA5JFV-5jbe4A5P.js +0 -1
- package/studio/web/assets/flowDiagram-A5DVABFB-Dp9Ezlow.js +0 -1
- package/studio/web/assets/index-aSt5tY-L.js +0 -824
- package/studio/web/assets/index.lazy-B9jiPwT8.js +0 -2
- package/studio/web/assets/notifications-CUoYgU98.js +0 -1
- package/studio/web/assets/railroad-abnf-HS5TGJTU-Bc0Qi0WH.js +0 -1
- package/studio/web/assets/railroad-ebnf-LZEXJU2U-G8rVVZ2C.js +0 -1
- package/studio/web/assets/railroad-peg-WCYAUIDC-CrehKBhC.js +0 -1
- package/studio/web/assets/stateDiagram-v2-4QOOHH4V-D4tuw9Su.js +0 -1
- package/studio/web/assets/status-D7Xn5ePA.js +0 -61
- package/studio/web/assets/swimlanesDiagram-VK2B7HYN-XOhmNEvq.js +0 -8
- package/studio/web/assets/vendor-core-RCcadM3e.js +0 -73
- package/studio/web/assets/vendor-datadog-BRv-mOv1.js +0 -6
- package/studio/web/assets/vendor-tanstack-BiFWSB3W.js +0 -1
- package/studio/web/assets/x-B9o9hsep.js +0 -1
- /package/studio/web/assets/{sizeCapture-X5ZJPWSS-B0uUizjq.js → sizeCapture-INFHLROL-B0uUizjq.js} +0 -0
package/npm-shrinkwrap.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "harper",
|
|
3
|
-
"version": "5.2.
|
|
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
|
+
"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.
|
|
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.
|
|
1067
|
-
"resolved": "https://registry.npmjs.org/@harperfast/rocksdb-js/-/rocksdb-js-2.
|
|
1068
|
-
"integrity": "sha512-
|
|
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.
|
|
1083
|
-
"@harperfast/rocksdb-js-darwin-x64": "2.
|
|
1084
|
-
"@harperfast/rocksdb-js-linux-arm64-glibc": "2.
|
|
1085
|
-
"@harperfast/rocksdb-js-linux-arm64-musl": "2.
|
|
1086
|
-
"@harperfast/rocksdb-js-linux-x64-glibc": "2.
|
|
1087
|
-
"@harperfast/rocksdb-js-linux-x64-musl": "2.
|
|
1088
|
-
"@harperfast/rocksdb-js-win32-arm64": "2.
|
|
1089
|
-
"@harperfast/rocksdb-js-win32-x64": "2.
|
|
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.
|
|
1094
|
-
"resolved": "https://registry.npmjs.org/@harperfast/rocksdb-js-darwin-arm64/-/rocksdb-js-darwin-arm64-2.
|
|
1095
|
-
"integrity": "sha512-
|
|
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.
|
|
1110
|
-
"resolved": "https://registry.npmjs.org/@harperfast/rocksdb-js-darwin-x64/-/rocksdb-js-darwin-x64-2.
|
|
1111
|
-
"integrity": "sha512-
|
|
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.
|
|
1126
|
-
"resolved": "https://registry.npmjs.org/@harperfast/rocksdb-js-linux-arm64-glibc/-/rocksdb-js-linux-arm64-glibc-2.
|
|
1127
|
-
"integrity": "sha512
|
|
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.
|
|
1145
|
-
"resolved": "https://registry.npmjs.org/@harperfast/rocksdb-js-linux-arm64-musl/-/rocksdb-js-linux-arm64-musl-2.
|
|
1146
|
-
"integrity": "sha512-
|
|
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.
|
|
1164
|
-
"resolved": "https://registry.npmjs.org/@harperfast/rocksdb-js-linux-x64-glibc/-/rocksdb-js-linux-x64-glibc-2.
|
|
1165
|
-
"integrity": "sha512-
|
|
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.
|
|
1183
|
-
"resolved": "https://registry.npmjs.org/@harperfast/rocksdb-js-linux-x64-musl/-/rocksdb-js-linux-x64-musl-2.
|
|
1184
|
-
"integrity": "sha512-
|
|
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.
|
|
1202
|
-
"resolved": "https://registry.npmjs.org/@harperfast/rocksdb-js-win32-arm64/-/rocksdb-js-win32-arm64-2.
|
|
1203
|
-
"integrity": "sha512-
|
|
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.
|
|
1218
|
-
"resolved": "https://registry.npmjs.org/@harperfast/rocksdb-js-win32-x64/-/rocksdb-js-win32-x64-2.
|
|
1219
|
-
"integrity": "sha512-
|
|
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.
|
|
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.
|
|
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
|
-
|
|
423
|
-
|
|
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
|
}
|
package/resources/Table.ts
CHANGED
|
@@ -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
|
-
|
|
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
|
}
|