@harperfast/harper 5.1.27 → 5.1.29
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/RocksTransactionLogStore.d.ts +4 -2
- package/dist/resources/RocksTransactionLogStore.js +12 -6
- package/dist/resources/RocksTransactionLogStore.js.map +1 -1
- package/dist/resources/Table.js +66 -16
- package/dist/resources/Table.js.map +1 -1
- package/dist/resources/replayLogs.js +25 -21
- package/dist/resources/replayLogs.js.map +1 -1
- package/dist/resources/transactionBroadcast.js +4 -6
- package/dist/resources/transactionBroadcast.js.map +1 -1
- package/dist/security/user.js +5 -1
- package/dist/security/user.js.map +1 -1
- package/dist/utility/coalesceRefresh.d.ts +6 -0
- package/dist/utility/coalesceRefresh.js +42 -0
- package/dist/utility/coalesceRefresh.js.map +1 -0
- package/npm-shrinkwrap.json +2 -2
- package/package.json +1 -1
- package/resources/DESIGN.md +5 -0
- package/resources/RocksTransactionLogStore.ts +12 -6
- package/resources/Table.ts +65 -19
- package/resources/replayLogs.ts +25 -22
- package/resources/transactionBroadcast.ts +4 -4
- package/security/user.ts +6 -1
- package/studio/web/404.html +79 -0
- package/studio/web/assets/Chat-CSSJ_LuP.js +2294 -0
- package/studio/web/assets/FloatingChat-C-5i9pB-.js +23 -0
- package/studio/web/assets/_basePickBy-QJXUw_pr.js +1 -0
- package/studio/web/assets/_baseUniq-DR4vVjyC.js +1 -0
- package/studio/web/assets/{abnfDiagram-VCTEODGH-C0_BAZyO.js → abnfDiagram-O67JEVCF-DpPZWMOf.js} +1 -1
- package/studio/web/assets/{alertDialog-DIHt7Z0r.js → alertDialog-UrbiMgQt.js} +1 -1
- package/studio/web/assets/{apiToken-BnjVwGyX.js → apiToken-_BwddeaY.js} +1 -1
- package/studio/web/assets/applications-EoXf0cg8.js +296 -0
- package/studio/web/assets/architecture-7GRP2DOG-11l4Ny1l.js +1 -0
- package/studio/web/assets/architectureDiagram-NJMV4G6O-OmgLraID.js +36 -0
- package/studio/web/assets/authStore-5jSS5pTW.js +3 -0
- package/studio/web/assets/{blockDiagram-NRAW4CY4-BdJX9Khj.js → blockDiagram-BEXU5L5S-Cv7CD3Ai.js} +16 -5
- package/studio/web/assets/{button-DhiX-njv.js → button-MFP9n8Ck.js} +2 -2
- package/studio/web/assets/c4Diagram-YGBWAQC7-Ds1vKYnN.js +38 -0
- package/studio/web/assets/channel-BDtouPd6.js +1 -0
- package/studio/web/assets/chevron-up-CFe8x5Bp.js +1 -0
- package/studio/web/assets/chunk-3FUC2YCW-DpnBPH8B.js +2 -0
- package/studio/web/assets/{chunk-OBVCFTLP-D4wWOqDQ.js → chunk-5DYCD2WN-LLLCQSzg.js} +1 -1
- package/studio/web/assets/{chunk-PWAF6VOD-2zB6IW9i.js → chunk-742MDFTN-BL8J_pIO.js} +1 -1
- package/studio/web/assets/chunk-7INBJB4K-C-hJHiiK.js +62 -0
- package/studio/web/assets/chunk-7M6MHVWA-C6ZqkFbA.js +213 -0
- package/studio/web/assets/chunk-7PRAP22T-CUXM8BG6.js +1 -0
- package/studio/web/assets/chunk-DUW6YSOI-Dgx8z5s3.js +1 -0
- package/studio/web/assets/{chunk-FOHPRMQF-DHwB1DNv.js → chunk-FOHPRMQF-DzxwRta7.js} +9 -9
- package/studio/web/assets/{chunk-SVP7TREG-FwtbH2QC.js → chunk-GTNCS2PH-DJ2BFvS1.js} +1 -1
- package/studio/web/assets/{chunk-F27PBJKO-BW7ao8AY.js → chunk-GWA4HPMP-C42bSqLL.js} +1 -1
- package/studio/web/assets/chunk-J5ZVWO5B-oDCd-gWO.js +1 -0
- package/studio/web/assets/chunk-MBY4JIJT-C-5jz6Lo.js +72 -0
- package/studio/web/assets/chunk-NETBCI7D-D-bzlN4r.js +1 -0
- package/studio/web/assets/chunk-O7XYJQB3-ep14zA23.js +128 -0
- package/studio/web/assets/chunk-UA2S7LBM-BMRWRHED.js +1 -0
- package/studio/web/assets/{chunk-POPQ4Y6H-BPrvMyKz.js → chunk-WEXAMYUT-DdLYVdX1.js} +1 -1
- package/studio/web/assets/{chunk-XXDRQBXY-BoGZu3HH.js → chunk-XXDRQBXY-CbPh2l8S.js} +1 -1
- package/studio/web/assets/chunk-Z7XXMR3K-BmKEDjcP.js +10 -0
- package/studio/web/assets/{chunk-75Z2AOVW-BT8tVmks.js → chunk-ZIGJFQKS-DLZgdNxA.js} +2 -2
- package/studio/web/assets/classDiagram-v2-NBCMYWYE-DOI5vgKT.js +217 -0
- package/studio/web/assets/cose-bilkent-JH36ORCC-BSOszL11.js +1 -0
- package/studio/web/assets/createLucideIcon-bziYxJli.js +1 -0
- package/studio/web/assets/{css.worker-BD9HbRGW.js → css.worker-l1psR_wG.js} +13 -10
- package/studio/web/assets/{cssMode-BcnWGrZ7.js → cssMode-lBlR-7LH.js} +1 -1
- package/studio/web/assets/cynefin-OW5HDTMX-BSW-DB7S.js +1 -0
- package/studio/web/assets/cynefinDiagram-VND7K2PF-CbAHEwxt.js +62 -0
- package/studio/web/assets/cytoscape.esm-BZkf-uXn.js +321 -0
- package/studio/web/assets/dagre-6A5THRUB-Csxewgs4.js +4 -0
- package/studio/web/assets/diagram-22UHCM2B-a0rt8tY4.js +200 -0
- package/studio/web/assets/{diagram-VX7I27RA-BpOqCFca.js → diagram-3UASUU5V-lEj2SVNh.js} +2 -2
- package/studio/web/assets/{diagram-VSXAHHWV-CoCAg3M9.js → diagram-ATOU4E4O-HcrAeB-q.js} +3 -3
- package/studio/web/assets/{diagram-S7CK7UJ4-BuymVFZT.js → diagram-CDSNMT55-CYxiuyEx.js} +3 -3
- package/studio/web/assets/{diagram-Z3DM3KII-Bfpw7Vbj.js → diagram-MLGK6HIB-ChbCJTgJ.js} +1 -1
- package/studio/web/assets/diagram-MPIPVDR6-DaX9Y-N3.js +41 -0
- package/studio/web/assets/dialog-DTepachC.js +1 -0
- package/studio/web/assets/{dist-kYfyPZP9.js → dist-BRuBKNNy.js} +1 -1
- package/studio/web/assets/{dist-lkA3O3eM.js → dist-Cz2Y6-6G.js} +2 -2
- package/studio/web/assets/download-CtostjYn.js +1 -0
- package/studio/web/assets/{ebnfDiagram-PWID7BFC-DS_6aWqL.js → ebnfDiagram-ZINNZB2B-CwAsENB1.js} +1 -1
- package/studio/web/assets/{editor-BpwT7NMH.js → editor-DD13jWk4.js} +1 -1
- package/studio/web/assets/editor.worker-CkkvdXvO.js +33 -0
- package/studio/web/assets/elk-276RUBZZ-Hexg9E4D.js +27 -0
- package/studio/web/assets/{erDiagram-SSCWMZ5O-DJNk6Fgw.js → erDiagram-OPXOYQCR-CeC-wwO1.js} +15 -15
- package/studio/web/assets/eventmodeling-NTZA5JFV-CFb03e0o.js +1 -0
- package/studio/web/assets/flowDiagram-KWPJA3E3-Cidi00_Y.js +1 -0
- package/studio/web/assets/{ganttDiagram-EL5Y4UJY-2pOExxMY.js → ganttDiagram-FUAMR5RP-C2_Hhl1-.js} +2 -2
- package/studio/web/assets/{getAnalytics-D4LKGeVy.js → getAnalytics-CjthMQqF.js} +1 -1
- package/studio/web/assets/gitGraph-4MIJSDKK-xIk5Vuew.js +1 -0
- package/studio/web/assets/{gitGraphDiagram-WWUBYQGX-DVIsIhbO.js → gitGraphDiagram-X574FWY7-CMxJ34up.js} +4 -4
- package/studio/web/assets/graphlib-C9Tl7QrK.js +1 -0
- package/studio/web/assets/{html-BrgdgRGR.js → html-D-yZFVDJ.js} +1 -1
- package/studio/web/assets/{html.worker-DsMmVtuG.js → html.worker-DdwM4IrA.js} +12 -9
- package/studio/web/assets/{htmlMode-JHLbSnTh.js → htmlMode-CcX-hDcn.js} +1 -1
- package/studio/web/assets/index-BiEuS38J.js +824 -0
- package/studio/web/assets/index-CPoDzQTe.css +1 -0
- package/studio/web/assets/index.lazy-BmFnCdF7.js +2 -0
- package/studio/web/assets/info-A6RAGUB7-o49TEbj-.js +1 -0
- package/studio/web/assets/infoDiagram-VRGFBTTK-Cjhh7yzZ.js +2 -0
- package/studio/web/assets/{ishikawaDiagram-5VMMS53U-BRXRp29U.js → ishikawaDiagram-OU5B5YK6-C63aXRmh.js} +2 -2
- package/studio/web/assets/{javascript-DdiFlcph.js → javascript-C_Qb7VgS.js} +1 -1
- package/studio/web/assets/{journeyDiagram-EYS64GPL-B0ou8k0n.js → journeyDiagram-ZHPQQLJL-D_o0P5Mu.js} +4 -4
- package/studio/web/assets/json.worker-CSi2hF-a.js +65 -0
- package/studio/web/assets/{jsonMode-y-tjAvy2.js → jsonMode-Bu06LimW.js} +1 -1
- package/studio/web/assets/{kanban-definition-3QL26DDD-uYg7iYzp.js → kanban-definition-PNTS6WVX-CTI9SSxY.js} +7 -7
- package/studio/web/assets/{katex-CXMH3UgJ.js → katex-ZlcWpGUi.js} +2 -2
- package/studio/web/assets/languageServices-Ca1R1u3j.js +1 -0
- package/studio/web/assets/linear-Ds1AeO4V.js +1 -0
- package/studio/web/assets/{lspLanguageFeatures-BLONDcH7.js → lspLanguageFeatures-DlK675B0.js} +2 -2
- package/studio/web/assets/{mermaid-parser.core-Ck-fC8b7.js → mermaid-parser.core-C2lcH_jP.js} +3 -3
- package/studio/web/assets/mermaid.core-BG5bjfIG.js +44 -0
- package/studio/web/assets/{mindmap-definition-FBJOCRG2-CgTZ-rit.js → mindmap-definition-NLK3R4M7-BK7ho6JD.js} +24 -24
- package/studio/web/assets/{notifications-CD-AioQq.js → notifications-ByFMWGKr.js} +1 -1
- package/studio/web/assets/notifications-Dlp-DUlc.js +1 -0
- package/studio/web/assets/packet-AYTQ26CC-BHPy6KBV.js +1 -0
- package/studio/web/assets/{pegDiagram-XKGWAZYB-DrD-7sD9.js → pegDiagram-GJSIUBJH-DzjwG3jO.js} +1 -1
- package/studio/web/assets/pie-WAS4IAKB-D0cP-DTU.js +1 -0
- package/studio/web/assets/{pieDiagram-E7YTZNPT-GntqDCzv.js → pieDiagram-5QR66LMP-C_hOP9Lv.js} +2 -2
- package/studio/web/assets/profile-CGlJ4T3_.js +1 -0
- package/studio/web/assets/{quadrantDiagram-AXDQQJYC-0UeqXQGd.js → quadrantDiagram-O4NWA36T-CZW8PbV1.js} +3 -3
- package/studio/web/assets/radar-RG4KPBEZ-C8fk0U81.js +1 -0
- package/studio/web/assets/railroad-74A4TZTK-B60FWm17.js +1 -0
- package/studio/web/assets/railroad-abnf-HS5TGJTU-CLMVZvH0.js +1 -0
- package/studio/web/assets/railroad-ebnf-LZEXJU2U--tlwFoVB.js +1 -0
- package/studio/web/assets/railroad-peg-WCYAUIDC-Dpuslblm.js +1 -0
- package/studio/web/assets/{railroadDiagram-O6MQD6OU-yHUELZaV.js → railroadDiagram-XR7U4H2S-DyyNmgbU.js} +1 -1
- package/studio/web/assets/regions-DTTjgYbw.js +1 -0
- package/studio/web/assets/{register-aPXx7u_R.js → register-BEBUrRqE.js} +39 -39
- package/studio/web/assets/{requirementDiagram-EFPCY7ZU-DNEGFjuW.js → requirementDiagram-PLB6GJNP-C4H-mLKu.js} +11 -11
- package/studio/web/assets/{rolldown-runtime-hePW80VL.js → rolldown-runtime-Dd_uD5pT.js} +1 -1
- package/studio/web/assets/sankeyDiagram-IPEJSGJF-DHDyga4c.js +40 -0
- package/studio/web/assets/sequenceDiagram-PO4LG4MO-CdNcHXRI.js +169 -0
- package/studio/web/assets/setComponentFile-C28rPBf4.js +1 -0
- package/studio/web/assets/{setup-flP_i7Na.js → setup-6gEOddyI.js} +2 -2
- package/studio/web/assets/sizeCapture-INFHLROL-3uHXrFqA.js +1 -0
- package/studio/web/assets/{src-CMc7m_Ut.js → src-D0vMJQRr.js} +1 -1
- package/studio/web/assets/stateDiagram-v2-GCMORJYK-CpKuXq15.js +291 -0
- package/studio/web/assets/status-1KvBgL5x.js +61 -0
- package/studio/web/assets/swimlanes-2SLR337P-NRHa2D8I.js +1 -0
- package/studio/web/assets/swimlanesDiagram-TC7HE7FX-BBk4t4hO.js +8 -0
- package/studio/web/assets/{tabs-B_G5zscN.js → tabs-CnQ_zenf.js} +1 -1
- package/studio/web/assets/{time-Cclkb7kQ.js → time-Ci1v4fvT.js} +1 -1
- package/studio/web/assets/timeline-definition-EJHVYXUP-D39Y-xpq.js +120 -0
- package/studio/web/assets/toggleHighContrast-CXlv5tpg.js +49 -0
- package/studio/web/assets/treeView-Q6P3EWNA-CRWR9OqD.js +1 -0
- package/studio/web/assets/treemap-WGGIJYW6-ZfXyJgLO.js +1 -0
- package/studio/web/assets/{ts.worker-DpaaFKhy.js → ts.worker-DDMUrpqh.js} +118 -115
- package/studio/web/assets/{tsMode-MuMR2idI.js → tsMode-BHepKavV.js} +5 -5
- package/studio/web/assets/{typescript-oRqW34s_.js → typescript-C9CHPLmr.js} +1 -1
- package/studio/web/assets/{useEntityRestURL-CL8txIs9.js → useEntityRestURL-BNUVRoP4.js} +1 -1
- package/studio/web/assets/useLocalStorage-BYoZF60G.js +1 -0
- package/studio/web/assets/usecaseDiagram-POWQR4AR-jf-zIDZ_.js +328 -0
- package/studio/web/assets/vendor-core-BdkdbUek.js +63 -0
- package/studio/web/assets/vendor-datadog-fCQhBHGk.js +6 -0
- package/studio/web/assets/vendor-react-izWchTRL.js +9 -0
- package/studio/web/assets/vendor-tanstack-CQ1aRjVa.js +2 -0
- package/studio/web/assets/vendor-ui-aE1tHcW7.js +41 -0
- package/studio/web/assets/vennDiagram-UO4OBE2U-BKYAZUh_.js +34 -0
- package/studio/web/assets/wardley-WFR3VGLG-BO7f36ci.js +1 -0
- package/studio/web/assets/{wardleyDiagram-VM6X3IG4-BylmIGSg.js → wardleyDiagram-VNRHLVJA-Djb0JDQc.js} +3 -3
- package/studio/web/assets/{workers-DLjwoG6x.js → workers-B0sIl4Uq.js} +1 -1
- package/studio/web/assets/x-vYntCxm4.js +1 -0
- package/studio/web/assets/{xml-3AYuspMz.js → xml-BX3ACYE-.js} +1 -1
- package/studio/web/assets/{xychartDiagram-S5SC5T6Z-CoKALMXr.js → xychartDiagram-PMCCYNJV-BQh9ubvb.js} +3 -3
- package/studio/web/assets/{yaml-UbiHrEpT.js → yaml-CTtQqCZf.js} +1 -1
- package/studio/web/assets/yaml.worker-DAK2o_H1.js +479 -0
- package/studio/web/auth/fabric-globe-dark.png +0 -0
- package/studio/web/auth/fabric-globe-light.png +0 -0
- package/studio/web/auth/fabric-platform-dark.png +0 -0
- package/studio/web/auth/fabric-platform-light.png +0 -0
- package/studio/web/index.html +15 -15
- package/utility/coalesceRefresh.ts +37 -0
- package/studio/web/assets/Chat-BkQZUW_u.js +0 -2067
- package/studio/web/assets/FloatingChat-CgzPnxV-.js +0 -23
- package/studio/web/assets/applications-V4u8yfT1.js +0 -296
- package/studio/web/assets/architecture-7GRP2DOG-DNdx5tEU.js +0 -1
- package/studio/web/assets/architectureDiagram-5GKGNRK7-BWzrASgm.js +0 -36
- package/studio/web/assets/authStore-qKmCZcaf.js +0 -3
- package/studio/web/assets/c4Diagram-UCG6FXSJ-CI6MzGmQ.js +0 -38
- package/studio/web/assets/channel-DtCV8PTL.js +0 -1
- package/studio/web/assets/chevron-up-Df2c8uoU.js +0 -1
- package/studio/web/assets/chunk-DU6HZSFF-9kAOOmI6.js +0 -127
- package/studio/web/assets/chunk-G27WJ6UU-COyLMcgK.js +0 -231
- package/studio/web/assets/chunk-GMAD6QVW-BNyXpoQO.js +0 -72
- package/studio/web/assets/chunk-JQ64N6SF-Cyz1IeLf.js +0 -1
- package/studio/web/assets/chunk-LCL6LL3I-HOzK_ppE.js +0 -206
- package/studio/web/assets/chunk-P2QGCYS3-DmIFY4d7.js +0 -1
- package/studio/web/assets/chunk-R7TYR2AO-Irip67yr.js +0 -10
- package/studio/web/assets/chunk-RHFEMEQ7-2FgyI8YU.js +0 -168
- package/studio/web/assets/chunk-TEH6E4GO-P87k5mNi.js +0 -62
- 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/cose-bilkent-JH36ORCC-Cuuf67Bh.js +0 -1
- package/studio/web/assets/createLucideIcon-BKGPfjm2.js +0 -1
- package/studio/web/assets/cynefin-OW5HDTMX-BRkpLFQV.js +0 -1
- package/studio/web/assets/cynefinDiagram-5FMLGOSQ-CHT1DaX6.js +0 -62
- package/studio/web/assets/cytoscape.esm-C2x7inlt.js +0 -321
- package/studio/web/assets/dagre-3AP2YEHR-DpUXBh63.js +0 -4
- package/studio/web/assets/dagre-PrKaheQc.js +0 -1
- package/studio/web/assets/diagram-UQ7AKVKN-CyP148RM.js +0 -41
- package/studio/web/assets/dialog-CBf0Mr1d.js +0 -1
- package/studio/web/assets/download-BtTOBem-.js +0 -1
- package/studio/web/assets/editor.worker-DwcOiOeP.js +0 -30
- package/studio/web/assets/eventmodeling-NTZA5JFV-5jbe4A5P.js +0 -1
- package/studio/web/assets/flowDiagram-A5DVABFB-Dp9Ezlow.js +0 -1
- package/studio/web/assets/gitGraph-4MIJSDKK-CH5ZxwzF.js +0 -1
- package/studio/web/assets/graphlib-DS17s2tU.js +0 -1
- package/studio/web/assets/index-Cxj2_wsl.css +0 -1
- package/studio/web/assets/index-nvKFTYif.js +0 -824
- package/studio/web/assets/index.lazy-BvCjZaOM.js +0 -2
- package/studio/web/assets/info-A6RAGUB7-CPQfTnaG.js +0 -1
- package/studio/web/assets/infoDiagram-RXCK75RN-DlwLYlwm.js +0 -2
- package/studio/web/assets/json.worker-fO_hOLCP.js +0 -62
- package/studio/web/assets/languageServices-BpWu4JeF.js +0 -1
- package/studio/web/assets/linear-Cnt8506Q.js +0 -1
- package/studio/web/assets/mermaid.core-CP8aNNYm.js +0 -44
- package/studio/web/assets/notifications-Drk24Aro.js +0 -1
- package/studio/web/assets/packet-AYTQ26CC-DEyoPtPb.js +0 -1
- package/studio/web/assets/pie-WAS4IAKB-wjj-EI1d.js +0 -1
- package/studio/web/assets/profile-D2UPY_7W.js +0 -1
- package/studio/web/assets/radar-RG4KPBEZ-DFSA5h7k.js +0 -1
- package/studio/web/assets/railroad-74A4TZTK-CaOUG9wR.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/regions-CRxU70wx.js +0 -1
- package/studio/web/assets/sankeyDiagram-P5KCCOFB-DpyAmSVR.js +0 -40
- package/studio/web/assets/sequenceDiagram-WJ2MYXX4-TyaT7xNk.js +0 -162
- package/studio/web/assets/setComponentFile-DhSuHoa4.js +0 -1
- package/studio/web/assets/sizeCapture-X5ZJPWSS-B0uUizjq.js +0 -1
- package/studio/web/assets/stateDiagram-HBIQ2CUA-CeEdTArZ.js +0 -1
- package/studio/web/assets/stateDiagram-v2-4QOOHH4V-D4tuw9Su.js +0 -1
- package/studio/web/assets/status-CPJlcpUL.js +0 -61
- package/studio/web/assets/swimlanes-XN3QIQJK-B54FmF46.js +0 -1
- package/studio/web/assets/swimlanesDiagram-VK2B7HYN-XOhmNEvq.js +0 -8
- package/studio/web/assets/timeline-definition-24CTP7MA-D-a9ujbo.js +0 -120
- package/studio/web/assets/toggleHighContrast-hzY5eJz1.js +0 -49
- package/studio/web/assets/treeView-Q6P3EWNA-CrW_6JnS.js +0 -1
- package/studio/web/assets/treemap-WGGIJYW6-BxyYLdP_.js +0 -1
- package/studio/web/assets/useLocalStorage-Dtj1QS8_.js +0 -1
- 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-react-Dyj4O3HE.js +0 -9
- package/studio/web/assets/vendor-tanstack-BiFWSB3W.js +0 -1
- package/studio/web/assets/vendor-ui-vhu-UHhF.js +0 -41
- package/studio/web/assets/vennDiagram-4TSXK5OY-Cy7s7Mpy.js +0 -34
- package/studio/web/assets/wardley-WFR3VGLG-BeBL35g2.js +0 -1
- package/studio/web/assets/x-B9o9hsep.js +0 -1
- package/studio/web/assets/yaml.worker-BDL8_iuk.js +0 -454
package/resources/replayLogs.ts
CHANGED
|
@@ -75,8 +75,9 @@ export function replayLogs(rootStore: RocksDatabase, tables: any): Promise<void>
|
|
|
75
75
|
tableById.set(table.tableId, table);
|
|
76
76
|
}
|
|
77
77
|
// replay all the logs
|
|
78
|
-
let transaction: DatabaseTransaction;
|
|
78
|
+
let transaction: DatabaseTransaction | undefined;
|
|
79
79
|
let lastTimestamp = 0;
|
|
80
|
+
let openCommitEnded = false;
|
|
80
81
|
let writes = 0;
|
|
81
82
|
let skipped = 0;
|
|
82
83
|
// Track forward progress so a backlog of unwritable entries can't grind the boot thread
|
|
@@ -110,8 +111,27 @@ export function replayLogs(rootStore: RocksDatabase, tables: any): Promise<void>
|
|
|
110
111
|
originatingOperation,
|
|
111
112
|
username,
|
|
112
113
|
extendedType,
|
|
114
|
+
endTxn,
|
|
113
115
|
} = auditRecord;
|
|
114
116
|
try {
|
|
117
|
+
// A replay transaction is one native commit ("Boot replay transactions" in DESIGN.md).
|
|
118
|
+
if (transaction && (openCommitEnded || lastTimestamp !== version)) {
|
|
119
|
+
const ending = transaction;
|
|
120
|
+
transaction = undefined;
|
|
121
|
+
try {
|
|
122
|
+
ending.directCommitSync();
|
|
123
|
+
} catch (error) {
|
|
124
|
+
logger.error('Error committing replay transaction', error);
|
|
125
|
+
}
|
|
126
|
+
// The wall-clock budget (harper#1316) is checked only here, between native commits with
|
|
127
|
+
// nothing staged, so aborting never tears a commit in half.
|
|
128
|
+
if (shouldAbortSlowReplay(performance.now() - replayStartTime, replayTimeoutMs)) {
|
|
129
|
+
logger.fatal(
|
|
130
|
+
`Aborting transaction-log replay in ${(rootStore as any).databaseName} database: replay has exceeded the wall-clock time limit (${writes} written, ${skipped} skipped). The transaction log contains a pathologically deep out-of-order write history that is too expensive to reconcile during boot (harper#1316). Re-clone this node from a healthy leader to recover the unreplayed data.`
|
|
131
|
+
);
|
|
132
|
+
break;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
115
135
|
if (classifyAuditEntryForReplay(extendedType, tableId, true) === 'corrupt-header') {
|
|
116
136
|
skipped++;
|
|
117
137
|
noProgressRun++;
|
|
@@ -165,28 +185,9 @@ export function replayLogs(rootStore: RocksDatabase, tables: any): Promise<void>
|
|
|
165
185
|
warnedReplayHappening = true;
|
|
166
186
|
console.warn('Harper was not properly shutdown, replaying transaction logs to synchronize database');
|
|
167
187
|
}
|
|
168
|
-
if (
|
|
188
|
+
if (!transaction) {
|
|
169
189
|
lastTimestamp = version;
|
|
170
|
-
|
|
171
|
-
// commit the last transaction since we are starting a new one
|
|
172
|
-
transaction?.directCommitSync();
|
|
173
|
-
} catch (error) {
|
|
174
|
-
logger.error('Error committing replay transaction', error);
|
|
175
|
-
}
|
|
176
|
-
// Abort if replay has exceeded the total wall-clock budget even while making progress
|
|
177
|
-
// (harper#1316, facet a). shouldAbortStalledReplay resets its counters on every write,
|
|
178
|
-
// so a slow-but-progressing replay (deep out-of-order audit chain walk per entry) can
|
|
179
|
-
// peg the boot thread indefinitely without tripping it. Checked only here, at a version
|
|
180
|
-
// boundary: the prior version's transaction was just committed in full and the new one
|
|
181
|
-
// is not yet staged, so aborting never tears a same-version (same source-transaction)
|
|
182
|
-
// write batch in half. Re-clone to recover the unreplayed remainder.
|
|
183
|
-
if (shouldAbortSlowReplay(performance.now() - replayStartTime, replayTimeoutMs)) {
|
|
184
|
-
logger.fatal(
|
|
185
|
-
`Aborting transaction-log replay in ${(rootStore as any).databaseName} database: replay has exceeded the wall-clock time limit (${writes} written, ${skipped} skipped). The transaction log contains a pathologically deep out-of-order write history that is too expensive to reconcile during boot (harper#1316). Re-clone this node from a healthy leader to recover the unreplayed data.`
|
|
186
|
-
);
|
|
187
|
-
transaction = undefined as any; // already committed above; nothing staged for the new version
|
|
188
|
-
break;
|
|
189
|
-
}
|
|
190
|
+
openCommitEnded = false;
|
|
190
191
|
transaction = new DatabaseTransaction();
|
|
191
192
|
transaction.db = primaryStore;
|
|
192
193
|
transaction.timestamp = version;
|
|
@@ -280,6 +281,8 @@ export function replayLogs(rootStore: RocksDatabase, tables: any): Promise<void>
|
|
|
280
281
|
logger.error(`Error writing from replay of log`, err, {
|
|
281
282
|
version,
|
|
282
283
|
});
|
|
284
|
+
} finally {
|
|
285
|
+
if (endTxn) openCommitEnded = true;
|
|
283
286
|
}
|
|
284
287
|
}
|
|
285
288
|
try {
|
|
@@ -187,7 +187,7 @@ function notifyFromTransactionData(subscriptions, auditLogIterable?, allowYield
|
|
|
187
187
|
let ancestorLevel = 0;
|
|
188
188
|
do {
|
|
189
189
|
// we iterate through the key hierarchy, notifying all subscribers for each key,
|
|
190
|
-
// so for an id like resource/foo/bar, we notify subscribers for resource/foo/bar, resource/foo/, resource
|
|
190
|
+
// so for an id like resource/foo/bar, we notify subscribers for resource/foo/bar, resource/foo/, resource/, and the root (null)
|
|
191
191
|
// this allows for efficient subscriptions to children ids/topics
|
|
192
192
|
const keySubscriptions = tableSubscriptions.get(matchingKey);
|
|
193
193
|
if (keySubscriptions) {
|
|
@@ -228,9 +228,9 @@ function notifyFromTransactionData(subscriptions, auditLogIterable?, allowYield
|
|
|
228
228
|
if (lastSlash !== matchingKey.length - 1) {
|
|
229
229
|
ancestorLevel++; // don't increase the ancestor level for this going from resource/ to resource
|
|
230
230
|
}
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
231
|
+
// lastIndexOf clamps a negative fromIndex to 0, so '/' would otherwise yield itself forever
|
|
232
|
+
const parentKey = lastSlash > -1 ? matchingKey.slice(0, lastSlash + 1) : null;
|
|
233
|
+
matchingKey = parentKey === matchingKey ? null : parentKey;
|
|
234
234
|
} while (true);
|
|
235
235
|
}
|
|
236
236
|
} else if (auditRecord.type === 'reload') {
|
package/security/user.ts
CHANGED
|
@@ -105,6 +105,7 @@ import * as password from '../utility/password.ts';
|
|
|
105
105
|
import { server } from '../server/Server.ts';
|
|
106
106
|
import * as terms from '../utility/hdbTerms.ts';
|
|
107
107
|
import { expandOperationsPerms } from '../utility/operationPermissions.ts';
|
|
108
|
+
import { coalesceRefresh } from '../utility/coalesceRefresh.ts';
|
|
108
109
|
|
|
109
110
|
server.getUser = (username: string, password?: string | null): Promise<User> => {
|
|
110
111
|
return findAndValidateUser(username, password, password != null);
|
|
@@ -371,9 +372,13 @@ function cacheExpandedOperationsPerms(userRole: UserRole) {
|
|
|
371
372
|
userRole.permission._expandedOperations = expandOperationsPerms(userRole.permission.operations);
|
|
372
373
|
}
|
|
373
374
|
|
|
375
|
+
const refreshUsersWithRolesCache = coalesceRefresh(async () => {
|
|
376
|
+
usersWithRolesMap = await listUsers();
|
|
377
|
+
});
|
|
378
|
+
|
|
374
379
|
async function setUsersWithRolesCache(cache = undefined) {
|
|
375
380
|
if (cache) usersWithRolesMap = cache;
|
|
376
|
-
else
|
|
381
|
+
else await refreshUsersWithRolesCache();
|
|
377
382
|
}
|
|
378
383
|
|
|
379
384
|
async function getUsersWithRolesCache() {
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8" />
|
|
5
|
+
<title>Page Not Found — Harper Fabric</title>
|
|
6
|
+
<link rel="icon" type="image/svg+xml" href="/HDBDogOnly.svg" />
|
|
7
|
+
<link rel="icon" type="dynamic-favicon" href="/favicon_purple.png" />
|
|
8
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
9
|
+
<meta name="robots" content="noindex" />
|
|
10
|
+
<!-- Self-contained on purpose: this page is served when a URL matched nothing, so it must not
|
|
11
|
+
depend on a hashed bundle, a stylesheet, or a font that might itself be the thing missing. -->
|
|
12
|
+
<style>
|
|
13
|
+
* {
|
|
14
|
+
margin: 0;
|
|
15
|
+
padding: 0;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
body {
|
|
19
|
+
align-items: center;
|
|
20
|
+
background: linear-gradient(45deg, #312556, #403b8a, #7a3a87);
|
|
21
|
+
box-sizing: border-box;
|
|
22
|
+
color: #efefef;
|
|
23
|
+
display: flex;
|
|
24
|
+
font-family: helvetica, sans-serif;
|
|
25
|
+
justify-content: center;
|
|
26
|
+
line-height: 1.5;
|
|
27
|
+
min-height: 100vh;
|
|
28
|
+
padding: 2rem 1.5rem;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
main {
|
|
32
|
+
max-width: 30rem;
|
|
33
|
+
text-align: center;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
img {
|
|
37
|
+
height: 84px;
|
|
38
|
+
width: 84px;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
h1 {
|
|
42
|
+
font-size: 1.75rem;
|
|
43
|
+
font-weight: 400;
|
|
44
|
+
margin: 1.5rem 0 0.75rem;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
p {
|
|
48
|
+
color: hsl(0, 0%, 85%);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
a {
|
|
52
|
+
background-color: hsla(0, 0%, 0%, 0.35);
|
|
53
|
+
border-radius: 0.375rem;
|
|
54
|
+
color: #fff;
|
|
55
|
+
display: inline-block;
|
|
56
|
+
margin-top: 1.75rem;
|
|
57
|
+
padding: 0.625rem 1.25rem;
|
|
58
|
+
text-decoration: none;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
a:hover,
|
|
62
|
+
a:focus-visible {
|
|
63
|
+
background-color: hsla(0, 0%, 0%, 0.6);
|
|
64
|
+
}
|
|
65
|
+
</style>
|
|
66
|
+
</head>
|
|
67
|
+
|
|
68
|
+
<body>
|
|
69
|
+
<main>
|
|
70
|
+
<img src="/HDBDogOnly.svg" alt="" width="84" height="84" />
|
|
71
|
+
<h1>Page not found</h1>
|
|
72
|
+
<p>
|
|
73
|
+
That address isn't part of Harper Fabric. If you followed a link from
|
|
74
|
+
outside Studio, it may have pointed somewhere that has since moved.
|
|
75
|
+
</p>
|
|
76
|
+
<a href="/">Go to Harper Fabric</a>
|
|
77
|
+
</main>
|
|
78
|
+
</body>
|
|
79
|
+
</html>
|