@harperfast/harper 5.3.0-beta.4 → 5.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/backup.ts +6 -1
- package/components/Application.ts +486 -115
- package/components/DESIGN.md +109 -21
- package/components/deploymentProvenance.ts +28 -0
- package/components/operations.js +14 -7
- package/components/packageComponent.ts +5 -1
- package/config-root.schema.json +1 -1
- package/dataLayer/DESIGN.md +35 -7
- package/dataLayer/blobBackup.ts +71 -30
- package/dataLayer/harperBridge/ResourceBridge.ts +16 -2
- package/dataLayer/rocksdbBackup.ts +88 -34
- package/dataLayer/schemaDescribe.ts +45 -1
- package/dist/bin/backup.js +1 -1
- package/dist/bin/backup.js.map +1 -1
- package/dist/components/Application.d.ts +11 -21
- package/dist/components/Application.js +436 -105
- package/dist/components/Application.js.map +1 -1
- package/dist/components/deploymentProvenance.d.ts +4 -0
- package/dist/components/deploymentProvenance.js +32 -0
- package/dist/components/deploymentProvenance.js.map +1 -0
- package/dist/components/operations.js +14 -7
- package/dist/components/operations.js.map +1 -1
- package/dist/components/packageComponent.js +6 -1
- package/dist/components/packageComponent.js.map +1 -1
- package/dist/dataLayer/blobBackup.d.ts +30 -3
- package/dist/dataLayer/blobBackup.js +73 -36
- package/dist/dataLayer/blobBackup.js.map +1 -1
- package/dist/dataLayer/harperBridge/ResourceBridge.d.ts +1 -0
- package/dist/dataLayer/harperBridge/ResourceBridge.js +15 -3
- package/dist/dataLayer/harperBridge/ResourceBridge.js.map +1 -1
- package/dist/dataLayer/rocksdbBackup.d.ts +4 -1
- package/dist/dataLayer/rocksdbBackup.js +74 -36
- package/dist/dataLayer/rocksdbBackup.js.map +1 -1
- package/dist/dataLayer/schemaDescribe.js +45 -1
- package/dist/dataLayer/schemaDescribe.js.map +1 -1
- package/dist/resources/DatabaseTransaction.d.ts +1 -0
- package/dist/resources/DatabaseTransaction.js +33 -8
- package/dist/resources/DatabaseTransaction.js.map +1 -1
- package/dist/resources/ResourceInterface.d.ts +7 -3
- package/dist/resources/ResourceInterface.js +2 -0
- package/dist/resources/ResourceInterface.js.map +1 -1
- package/dist/resources/Table.d.ts +151 -445
- package/dist/resources/Table.js +209 -8
- package/dist/resources/Table.js.map +1 -1
- package/dist/resources/analytics/write.d.ts +11 -0
- package/dist/resources/analytics/write.js +3 -0
- package/dist/resources/analytics/write.js.map +1 -1
- package/dist/resources/blob.d.ts +30 -0
- package/dist/resources/blob.js +189 -1
- package/dist/resources/blob.js.map +1 -1
- package/dist/resources/databases.d.ts +1 -0
- package/dist/resources/databases.js +80 -15
- package/dist/resources/databases.js.map +1 -1
- package/dist/resources/derivedIndexRuntime.d.ts +13 -0
- package/dist/resources/derivedIndexRuntime.js +57 -5
- package/dist/resources/derivedIndexRuntime.js.map +1 -1
- package/dist/resources/derivedIndexes.d.ts +1 -0
- package/dist/resources/derivedIndexes.js +116 -15
- package/dist/resources/derivedIndexes.js.map +1 -1
- package/dist/resources/fullTextSchema.d.ts +5 -3
- package/dist/resources/fullTextSchema.js +48 -5
- package/dist/resources/fullTextSchema.js.map +1 -1
- package/dist/resources/fullTextSchemaLifecycle.d.ts +2 -0
- package/dist/resources/fullTextSchemaLifecycle.js +33 -0
- package/dist/resources/fullTextSchemaLifecycle.js.map +1 -1
- package/dist/resources/graphql.js +30 -12
- package/dist/resources/graphql.js.map +1 -1
- package/dist/resources/indexes/HierarchicalNavigableSmallWorld.d.ts +21 -1
- package/dist/resources/indexes/HierarchicalNavigableSmallWorld.js +114 -5
- package/dist/resources/indexes/HierarchicalNavigableSmallWorld.js.map +1 -1
- package/dist/resources/indexes/fullTextDerivedIndex.d.ts +11 -2
- package/dist/resources/indexes/fullTextDerivedIndex.js +187 -24
- package/dist/resources/indexes/fullTextDerivedIndex.js.map +1 -1
- package/dist/resources/indexes/fullTextNativeBinding.d.ts +99 -1
- package/dist/resources/indexes/fullTextNativeBinding.js +35 -1
- package/dist/resources/indexes/fullTextNativeBinding.js.map +1 -1
- package/dist/resources/indexes/fullTextQueryIndex.d.ts +58 -0
- package/dist/resources/indexes/fullTextQueryIndex.js +943 -0
- package/dist/resources/indexes/fullTextQueryIndex.js.map +1 -0
- package/dist/resources/indexes/fullTextQueryProtocol.d.ts +6 -0
- package/dist/resources/indexes/fullTextQueryProtocol.js +32 -0
- package/dist/resources/indexes/fullTextQueryProtocol.js.map +1 -0
- package/dist/resources/indexes/nativeFullTextDerivedIndexLifecycle.d.ts +4 -1
- package/dist/resources/indexes/nativeFullTextDerivedIndexLifecycle.js +30 -7
- package/dist/resources/indexes/nativeFullTextDerivedIndexLifecycle.js.map +1 -1
- package/dist/resources/search.d.ts +41 -0
- package/dist/resources/search.js +468 -26
- package/dist/resources/search.js.map +1 -1
- package/dist/resources/transactionBroadcast.js +101 -50
- package/dist/resources/transactionBroadcast.js.map +1 -1
- package/dist/resources/typeParity.d.ts +9 -0
- package/dist/resources/typeParity.js +3 -0
- package/dist/resources/typeParity.js.map +1 -0
- package/dist/server/REST.js.map +1 -1
- package/dist/server/itc/serverHandlers.js +48 -8
- package/dist/server/itc/serverHandlers.js.map +1 -1
- package/dist/server/serverHelpers/contentTypes.d.ts +7 -0
- package/dist/server/serverHelpers/contentTypes.js +36 -23
- package/dist/server/serverHelpers/contentTypes.js.map +1 -1
- package/dist/server/serverHelpers/uwsServer.js +28 -5
- package/dist/server/serverHelpers/uwsServer.js.map +1 -1
- package/dist/server/threads/itc.js +19 -0
- package/dist/server/threads/itc.js.map +1 -1
- package/dist/server/threads/manageThreads.d.ts +3 -0
- package/dist/server/threads/manageThreads.js +90 -23
- package/dist/server/threads/manageThreads.js.map +1 -1
- package/dist/utility/operation_authorization.js +25 -7
- package/dist/utility/operation_authorization.js.map +1 -1
- package/dist/utility/signalling.js +3 -0
- package/dist/utility/signalling.js.map +1 -1
- package/dist/validation/searchValidator.js +22 -2
- package/dist/validation/searchValidator.js.map +1 -1
- package/npm-shrinkwrap.json +22 -22
- package/package.json +2 -4
- package/resources/DESIGN.md +19 -2
- package/resources/DatabaseTransaction.ts +40 -10
- package/resources/FULL_TEXT.md +97 -0
- package/resources/ResourceInterface.ts +8 -2
- package/resources/Table.ts +767 -17
- package/resources/analytics/write.ts +3 -3
- package/resources/blob.ts +183 -1
- package/resources/databases.ts +126 -14
- package/resources/derivedIndexRuntime.ts +79 -6
- package/resources/derivedIndexes.ts +142 -18
- package/resources/fullTextSchema.ts +55 -9
- package/resources/fullTextSchemaLifecycle.ts +45 -0
- package/resources/graphql.ts +33 -12
- package/resources/indexes/DESIGN.md +167 -15
- package/resources/indexes/HierarchicalNavigableSmallWorld.ts +125 -5
- package/resources/indexes/fullTextDerivedIndex.ts +216 -32
- package/resources/indexes/fullTextNativeBinding.ts +133 -3
- package/resources/indexes/fullTextQueryIndex.ts +1120 -0
- package/resources/indexes/fullTextQueryProtocol.ts +35 -0
- package/resources/indexes/nativeFullTextDerivedIndexLifecycle.ts +28 -8
- package/resources/search.ts +513 -26
- package/resources/transactionBroadcast.ts +86 -47
- package/resources/typeParity.ts +20 -0
- package/schema.graphql +18 -5
- package/server/DESIGN.md +18 -0
- package/server/REST.ts +1 -1
- package/server/itc/serverHandlers.js +61 -8
- package/server/serverHelpers/contentTypes.ts +31 -26
- package/server/serverHelpers/uwsServer.ts +35 -7
- package/server/threads/itc.js +21 -0
- package/server/threads/manageThreads.js +95 -21
- package/studio/web/assets/{Chat-Bq60AO-g.js → Chat-CNEKMllJ.js} +13 -13
- package/studio/web/assets/FloatingChat-CEnWhHeR.js +23 -0
- package/studio/web/assets/SearchDialog-CwhJdEdY.js +1 -0
- package/studio/web/assets/{abnfDiagram-O67JEVCF-DpPZWMOf.js → abnfDiagram-O67JEVCF-raXE027J.js} +1 -1
- package/studio/web/assets/alertDialog-BbWD9Xxa.js +1 -0
- package/studio/web/assets/apiToken-DC5vsaaO.js +1 -0
- package/studio/web/assets/applications-DQZxDy0x.js +296 -0
- package/studio/web/assets/architecture-7GRP2DOG-DDmz3hpI.js +1 -0
- package/studio/web/assets/{architectureDiagram-NJMV4G6O-OmgLraID.js → architectureDiagram-NJMV4G6O-C8_Eet7w.js} +1 -1
- package/studio/web/assets/arrow-up-D2g_57vT.js +1 -0
- package/studio/web/assets/authStore-CJCaADw9.js +3 -0
- package/studio/web/assets/{blockDiagram-BEXU5L5S-Cv7CD3Ai.js → blockDiagram-BEXU5L5S-DR6S5-1D.js} +1 -1
- package/studio/web/assets/{button-MFP9n8Ck.js → button-DWwfgGWI.js} +2 -2
- package/studio/web/assets/{c4Diagram-YGBWAQC7-Ds1vKYnN.js → c4Diagram-YGBWAQC7-BAfZ1G01.js} +1 -1
- package/studio/web/assets/channel-D0AkPjJ8.js +1 -0
- package/studio/web/assets/{chevron-up-CFe8x5Bp.js → chevron-up-CFxbMGv2.js} +1 -1
- package/studio/web/assets/{chunk-3FUC2YCW-DpnBPH8B.js → chunk-3FUC2YCW-DuRp-j19.js} +1 -1
- package/studio/web/assets/{chunk-5DYCD2WN-LLLCQSzg.js → chunk-5DYCD2WN-BceBfIHT.js} +1 -1
- package/studio/web/assets/{chunk-742MDFTN-BL8J_pIO.js → chunk-742MDFTN-CIkt8ijt.js} +1 -1
- package/studio/web/assets/{chunk-7INBJB4K-C-hJHiiK.js → chunk-7INBJB4K-BpeAXyOi.js} +1 -1
- package/studio/web/assets/{chunk-7M6MHVWA-C6ZqkFbA.js → chunk-7M6MHVWA-h6WlaTzO.js} +1 -1
- package/studio/web/assets/{chunk-7PRAP22T-CUXM8BG6.js → chunk-7PRAP22T-KyqX6x3f.js} +1 -1
- package/studio/web/assets/{chunk-GTNCS2PH-DJ2BFvS1.js → chunk-GTNCS2PH-DGHLXyow.js} +1 -1
- package/studio/web/assets/{chunk-GWA4HPMP-C42bSqLL.js → chunk-GWA4HPMP-DsejB6gA.js} +1 -1
- package/studio/web/assets/{chunk-MBY4JIJT-C-5jz6Lo.js → chunk-MBY4JIJT-BwSGweQP.js} +1 -1
- package/studio/web/assets/{chunk-NETBCI7D-D-bzlN4r.js → chunk-NETBCI7D-C8UnOw_f.js} +1 -1
- package/studio/web/assets/{chunk-O7XYJQB3-ep14zA23.js → chunk-O7XYJQB3-CBS3nZYV.js} +1 -1
- package/studio/web/assets/{chunk-UA2S7LBM-BMRWRHED.js → chunk-UA2S7LBM-BHpEdH8D.js} +1 -1
- package/studio/web/assets/{chunk-WEXAMYUT-DdLYVdX1.js → chunk-WEXAMYUT-BAIhTwyh.js} +1 -1
- package/studio/web/assets/{chunk-Z7XXMR3K-BmKEDjcP.js → chunk-Z7XXMR3K-DSHbImdf.js} +1 -1
- package/studio/web/assets/{chunk-ZIGJFQKS-DLZgdNxA.js → chunk-ZIGJFQKS-Cs8fUn7y.js} +1 -1
- package/studio/web/assets/{classDiagram-v2-NBCMYWYE-DOI5vgKT.js → classDiagram-v2-NBCMYWYE-DmDPkt2u.js} +1 -1
- package/studio/web/assets/cn-6T8VranJ.js +1 -0
- package/studio/web/assets/{codicon-Brq4_Ui5.ttf → codicon-DF1abBS2.ttf} +0 -0
- package/studio/web/assets/{createLucideIcon-bziYxJli.js → createLucideIcon-fO5dL7D5.js} +1 -1
- package/studio/web/assets/{css.worker-l1psR_wG.js → css.worker-DoT-OOzx.js} +36 -36
- package/studio/web/assets/{cssMode-DJyc9mHj.js → cssMode-Dz2DxF4e.js} +1 -1
- package/studio/web/assets/{cynefin-OW5HDTMX-BSW-DB7S.js → cynefin-OW5HDTMX-DIvbXLSj.js} +1 -1
- package/studio/web/assets/{cynefinDiagram-VND7K2PF-CbAHEwxt.js → cynefinDiagram-VND7K2PF-BdtaXiCE.js} +1 -1
- package/studio/web/assets/{dagre-6A5THRUB-Csxewgs4.js → dagre-6A5THRUB-C7RUWHyz.js} +1 -1
- package/studio/web/assets/{diagram-22UHCM2B-a0rt8tY4.js → diagram-22UHCM2B-DJCvcaWP.js} +1 -1
- package/studio/web/assets/{diagram-3UASUU5V-lEj2SVNh.js → diagram-3UASUU5V-Du6VKWln.js} +1 -1
- package/studio/web/assets/{diagram-ATOU4E4O-HcrAeB-q.js → diagram-ATOU4E4O-dxRfeG4B.js} +1 -1
- package/studio/web/assets/{diagram-CDSNMT55-CYxiuyEx.js → diagram-CDSNMT55-l5Ga0u-W.js} +1 -1
- package/studio/web/assets/{diagram-MLGK6HIB-ChbCJTgJ.js → diagram-MLGK6HIB-CNQY47LA.js} +1 -1
- package/studio/web/assets/{diagram-MPIPVDR6-DaX9Y-N3.js → diagram-MPIPVDR6-7prveD1B.js} +1 -1
- package/studio/web/assets/{dist-Cz2Y6-6G.js → dist-BrRuMUzt.js} +1 -1
- package/studio/web/assets/{download-CtostjYn.js → download-Cn6tPG4L.js} +1 -1
- package/studio/web/assets/{ebnfDiagram-ZINNZB2B-CwAsENB1.js → ebnfDiagram-ZINNZB2B-5OnkTpfi.js} +1 -1
- package/studio/web/assets/{editor-DDIsQfj6.js → editor-B3mjd3tz.js} +1 -1
- package/studio/web/assets/editor.worker-Yd1NR0QT.js +33 -0
- package/studio/web/assets/{elk-276RUBZZ-Hexg9E4D.js → elk-276RUBZZ-DxDQPjQT.js} +1 -1
- package/studio/web/assets/{erDiagram-OPXOYQCR-CeC-wwO1.js → erDiagram-OPXOYQCR-CQlCX84D.js} +1 -1
- package/studio/web/assets/eventmodeling-NTZA5JFV-DONQf5aG.js +1 -0
- package/studio/web/assets/flowDiagram-KWPJA3E3-BoZ8_QR1.js +1 -0
- package/studio/web/assets/{ganttDiagram-FUAMR5RP-C2_Hhl1-.js → ganttDiagram-FUAMR5RP-bloX3Voy.js} +1 -1
- package/studio/web/assets/{getAnalytics-CjthMQqF.js → getAnalytics-C0FHjtdQ.js} +1 -1
- package/studio/web/assets/{gitGraph-4MIJSDKK-xIk5Vuew.js → gitGraph-4MIJSDKK-BrXWmJt2.js} +1 -1
- package/studio/web/assets/{gitGraphDiagram-X574FWY7-CMxJ34up.js → gitGraphDiagram-X574FWY7-C2KnnZeY.js} +1 -1
- package/studio/web/assets/{html-g1BJHxLy.js → html-BsRGM7tp.js} +1 -1
- package/studio/web/assets/{html.worker-DdwM4IrA.js → html.worker-B1dwY0Ay.js} +27 -27
- package/studio/web/assets/{htmlMode-Vh5IglCQ.js → htmlMode-tUKJaA3o.js} +1 -1
- package/studio/web/assets/index-72cEH474.css +1 -0
- package/studio/web/assets/index-BuqFjN5K.js +828 -0
- package/studio/web/assets/index.lazy-CcpfQFY_.js +2 -0
- package/studio/web/assets/{info-A6RAGUB7-o49TEbj-.js → info-A6RAGUB7-BhzBHe4U.js} +1 -1
- package/studio/web/assets/{infoDiagram-VRGFBTTK-Cjhh7yzZ.js → infoDiagram-VRGFBTTK-B0J1132p.js} +1 -1
- package/studio/web/assets/{ishikawaDiagram-OU5B5YK6-C63aXRmh.js → ishikawaDiagram-OU5B5YK6-BNk0tuQx.js} +1 -1
- package/studio/web/assets/{javascript-5VIolqf7.js → javascript-BZ_uRGHl.js} +1 -1
- package/studio/web/assets/{journeyDiagram-ZHPQQLJL-D_o0P5Mu.js → journeyDiagram-ZHPQQLJL-Be79RMQM.js} +1 -1
- package/studio/web/assets/json.worker-BQqXGI3X.js +65 -0
- package/studio/web/assets/{jsonMode-DG4zQraI.js → jsonMode-DgB-aFMj.js} +1 -1
- package/studio/web/assets/{kanban-definition-PNTS6WVX-CTI9SSxY.js → kanban-definition-PNTS6WVX-4uuoQP9W.js} +1 -1
- package/studio/web/assets/{languageServices-t5FBpX-i.js → languageServices-BleuBw17.js} +1 -1
- package/studio/web/assets/localStorageKeys-etzFY_xV.js +1 -0
- package/studio/web/assets/{lspLanguageFeatures-DgVnNPh-.js → lspLanguageFeatures-ByVYLSsQ.js} +1 -1
- package/studio/web/assets/{mermaid-parser.core-C2lcH_jP.js → mermaid-parser.core-V1UYMeXV.js} +3 -3
- package/studio/web/assets/{mermaid.core-BG5bjfIG.js → mermaid.core-1PX6R49U.js} +4 -4
- package/studio/web/assets/{mindmap-definition-NLK3R4M7-BK7ho6JD.js → mindmap-definition-NLK3R4M7-C70Ctm0J.js} +1 -1
- package/studio/web/assets/notifications-D1Nf-Edn.js +1 -0
- package/studio/web/assets/notifications-TuzN0IMi.js +1 -0
- package/studio/web/assets/{packet-AYTQ26CC-BHPy6KBV.js → packet-AYTQ26CC-DWbXHx5g.js} +1 -1
- package/studio/web/assets/{pegDiagram-GJSIUBJH-DzjwG3jO.js → pegDiagram-GJSIUBJH-d6z1cc7W.js} +1 -1
- package/studio/web/assets/{pie-WAS4IAKB-D0cP-DTU.js → pie-WAS4IAKB-DjoTm3yr.js} +1 -1
- package/studio/web/assets/{pieDiagram-5QR66LMP-C_hOP9Lv.js → pieDiagram-5QR66LMP-Dz3RHpDA.js} +1 -1
- package/studio/web/assets/profile-D7C7Lupz.js +1 -0
- package/studio/web/assets/{quadrantDiagram-O4NWA36T-CZW8PbV1.js → quadrantDiagram-O4NWA36T-CIF5Qkou.js} +1 -1
- package/studio/web/assets/{radar-RG4KPBEZ-C8fk0U81.js → radar-RG4KPBEZ-CVBgjCOj.js} +1 -1
- package/studio/web/assets/{railroad-74A4TZTK-B60FWm17.js → railroad-74A4TZTK-BdhXw10Q.js} +1 -1
- package/studio/web/assets/railroad-abnf-HS5TGJTU-BcoQPN39.js +1 -0
- package/studio/web/assets/railroad-ebnf-LZEXJU2U-B1Lke2JN.js +1 -0
- package/studio/web/assets/railroad-peg-WCYAUIDC-D-oJFkiV.js +1 -0
- package/studio/web/assets/{railroadDiagram-XR7U4H2S-DyyNmgbU.js → railroadDiagram-XR7U4H2S-y3Jv2U6N.js} +1 -1
- package/studio/web/assets/regions-nGQCm-v8.js +1 -0
- package/studio/web/assets/register-C3x9Ze6P.js +909 -0
- package/studio/web/assets/register-DjpsE8to.css +1 -0
- package/studio/web/assets/{requirementDiagram-PLB6GJNP-C4H-mLKu.js → requirementDiagram-PLB6GJNP-ChINZEmu.js} +1 -1
- package/studio/web/assets/restartGate-nHAFLDh-.js +1 -0
- package/studio/web/assets/{sankeyDiagram-IPEJSGJF-DHDyga4c.js → sankeyDiagram-IPEJSGJF-D9AyLce2.js} +1 -1
- package/studio/web/assets/{sequenceDiagram-PO4LG4MO-CdNcHXRI.js → sequenceDiagram-PO4LG4MO-hfk4aIEm.js} +1 -1
- package/studio/web/assets/{setComponentFile-z4-qJCbA.js → setComponentFile-DpjrRqeG.js} +1 -1
- package/studio/web/assets/{setup-CS50uJ4x.js → setup-CGiKLZ9e.js} +2 -2
- package/studio/web/assets/{stateDiagram-v2-GCMORJYK-CpKuXq15.js → stateDiagram-v2-GCMORJYK-Bs8RIb9K.js} +1 -1
- package/studio/web/assets/status-CGJwrNPH.js +61 -0
- package/studio/web/assets/{swimlanes-2SLR337P-NRHa2D8I.js → swimlanes-2SLR337P-B52xrf6t.js} +1 -1
- package/studio/web/assets/swimlanesDiagram-TC7HE7FX-DfN7BAP5.js +8 -0
- package/studio/web/assets/tabs-BCTQzoQK.js +1 -0
- package/studio/web/assets/{timeline-definition-EJHVYXUP-D39Y-xpq.js → timeline-definition-EJHVYXUP-DJSITpQX.js} +1 -1
- package/studio/web/assets/toggleHighContrast-C-Ne6P7T.js +51 -0
- package/studio/web/assets/toggleHighContrast-n7clI0si.css +1 -0
- package/studio/web/assets/{treeView-Q6P3EWNA-CRWR9OqD.js → treeView-Q6P3EWNA-C-epdxRo.js} +1 -1
- package/studio/web/assets/{treemap-WGGIJYW6-ZfXyJgLO.js → treemap-WGGIJYW6-DOVyp_zw.js} +1 -1
- package/studio/web/assets/{ts.worker-DDMUrpqh.js → ts.worker-Clm12uY6.js} +131 -131
- package/studio/web/assets/{tsMode-D83Gg3cq.js → tsMode-CSreYTys.js} +1 -1
- package/studio/web/assets/{typescript-Dfp-GrNq.js → typescript-MnxBk89W.js} +1 -1
- package/studio/web/assets/{useEntityRestURL-BKetlINf.js → useEntityRestURL-TNrh77-s.js} +1 -1
- package/studio/web/assets/{usecaseDiagram-POWQR4AR-jf-zIDZ_.js → usecaseDiagram-POWQR4AR-B6252cbq.js} +1 -1
- package/studio/web/assets/{vendor-core-BdkdbUek.js → vendor-core-6LhfJlRC.js} +1 -1
- package/studio/web/assets/vendor-datadog-ozKf-pts.js +6 -0
- package/studio/web/assets/{vendor-react-izWchTRL.js → vendor-react-BOliS0BL.js} +1 -1
- package/studio/web/assets/vendor-tanstack-Bntfka-M.js +2 -0
- package/studio/web/assets/vendor-ui-9EYYDgoN.js +41 -0
- package/studio/web/assets/{vennDiagram-UO4OBE2U-BKYAZUh_.js → vennDiagram-UO4OBE2U-DZTsDA4k.js} +1 -1
- package/studio/web/assets/{wardley-WFR3VGLG-BO7f36ci.js → wardley-WFR3VGLG-Cfqoe6z4.js} +1 -1
- package/studio/web/assets/{wardleyDiagram-VNRHLVJA-Djb0JDQc.js → wardleyDiagram-VNRHLVJA-qu_f7Tvl.js} +1 -1
- package/studio/web/assets/{workers-CCvmDLH3.js → workers-BfZlUNVI.js} +3 -3
- package/studio/web/assets/{xml-06pZp00U.js → xml-BHd6qGH7.js} +1 -1
- package/studio/web/assets/{xychartDiagram-PMCCYNJV-BQh9ubvb.js → xychartDiagram-PMCCYNJV-UrOKRsmR.js} +1 -1
- package/studio/web/assets/{yaml-iSnWMVlV.js → yaml-C53R8OQq.js} +1 -1
- package/studio/web/assets/{yaml.worker-DAK2o_H1.js → yaml.worker-D9JekGdp.js} +183 -183
- package/studio/web/index.html +15 -15
- package/utility/operation_authorization.ts +27 -7
- package/utility/signalling.ts +3 -0
- package/validation/searchValidator.ts +22 -13
- package/studio/web/assets/FloatingChat-D4560T0p.js +0 -23
- package/studio/web/assets/alertDialog-UrbiMgQt.js +0 -1
- package/studio/web/assets/apiToken-BEvbFPMc.js +0 -1
- package/studio/web/assets/applications-CSUVTH4E.js +0 -296
- package/studio/web/assets/architecture-7GRP2DOG-11l4Ny1l.js +0 -1
- package/studio/web/assets/authStore-5jSS5pTW.js +0 -3
- package/studio/web/assets/channel-BDtouPd6.js +0 -1
- package/studio/web/assets/dialog-DTepachC.js +0 -1
- package/studio/web/assets/editor.worker-CkkvdXvO.js +0 -33
- package/studio/web/assets/eventmodeling-NTZA5JFV-CFb03e0o.js +0 -1
- package/studio/web/assets/flowDiagram-KWPJA3E3-Cidi00_Y.js +0 -1
- package/studio/web/assets/index-CPoDzQTe.css +0 -1
- package/studio/web/assets/index-DGRAzvO4.js +0 -824
- package/studio/web/assets/index.lazy-vgSic7et.js +0 -2
- package/studio/web/assets/json.worker-CSi2hF-a.js +0 -65
- package/studio/web/assets/notifications-BeWcX04m.js +0 -1
- package/studio/web/assets/notifications-DUGWrWoO.js +0 -1
- package/studio/web/assets/profile-BvUEDBzW.js +0 -1
- package/studio/web/assets/railroad-abnf-HS5TGJTU-CLMVZvH0.js +0 -1
- package/studio/web/assets/railroad-ebnf-LZEXJU2U--tlwFoVB.js +0 -1
- package/studio/web/assets/railroad-peg-WCYAUIDC-Dpuslblm.js +0 -1
- package/studio/web/assets/regions-CB-_2m7M.js +0 -1
- package/studio/web/assets/register-1w1Zr3b2.js +0 -848
- package/studio/web/assets/register-jjEx9u7D.css +0 -1
- package/studio/web/assets/setLocalStorage-D_kflv4U.js +0 -1
- package/studio/web/assets/status-CI0wOdOE.js +0 -61
- package/studio/web/assets/swimlanesDiagram-TC7HE7FX-BBk4t4hO.js +0 -8
- package/studio/web/assets/tabs-CnQ_zenf.js +0 -1
- package/studio/web/assets/toggleHighContrast--ixms01u.css +0 -1
- package/studio/web/assets/toggleHighContrast-BsAE4jPe.js +0 -49
- package/studio/web/assets/useLocalStorage-BYoZF60G.js +0 -1
- package/studio/web/assets/vendor-datadog-fCQhBHGk.js +0 -6
- package/studio/web/assets/vendor-tanstack-CQ1aRjVa.js +0 -2
- package/studio/web/assets/vendor-ui-aE1tHcW7.js +0 -41
- package/studio/web/assets/x-vYntCxm4.js +0 -1
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
+
import { randomUUID } from 'node:crypto';
|
|
3
4
|
import { createReadStream, existsSync, readdirSync } from 'node:fs';
|
|
4
|
-
import { open,
|
|
5
|
+
import { open, writeFile } from 'node:fs/promises';
|
|
5
6
|
import { join, relative, resolve, sep } from 'node:path';
|
|
6
7
|
import { PassThrough, Writable } from 'node:stream';
|
|
7
8
|
import { pipeline } from 'node:stream/promises';
|
|
@@ -27,12 +28,14 @@ import { SchemaEventMsg } from '../server/threads/itc.js';
|
|
|
27
28
|
import { beginRestore, completeRestore, abandonRestore, checkRestoreState, type RestoreLock } from './restoreMarker.ts';
|
|
28
29
|
import {
|
|
29
30
|
assertBlobSnapshotRestorable,
|
|
31
|
+
assertEngineOnlyRestoreAllowed,
|
|
30
32
|
blobSnapshotDir,
|
|
31
33
|
blobsReadmeContent,
|
|
32
34
|
deleteBlobSnapshot,
|
|
33
35
|
purgeBlobSnapshots,
|
|
34
36
|
restoreBlobSnapshot,
|
|
35
37
|
snapshotBlobs,
|
|
38
|
+
walkBlobFiles,
|
|
36
39
|
} from './blobBackup.ts';
|
|
37
40
|
import {
|
|
38
41
|
deleteBackupManifest,
|
|
@@ -165,7 +168,7 @@ function requireBackupId(backupId: any): number {
|
|
|
165
168
|
return backupId;
|
|
166
169
|
}
|
|
167
170
|
|
|
168
|
-
function requireBooleanOption(value: any, name: string): boolean {
|
|
171
|
+
export function requireBooleanOption(value: any, name: string): boolean {
|
|
169
172
|
if (value !== undefined && typeof value !== 'boolean') {
|
|
170
173
|
throw new ClientError(`'${name}' must be a boolean`);
|
|
171
174
|
}
|
|
@@ -439,6 +442,13 @@ the backup (blobs are restored automatically). Restore the latest backup in plac
|
|
|
439
442
|
|
|
440
443
|
harper restore_backup database=${databaseName} backup_id=<id>
|
|
441
444
|
|
|
445
|
+
A backup created with \`exclude_blobs\` carries no blobs, so restoring one is refused unless you pass
|
|
446
|
+
\`allow_engine_only=true\`. The restored records address whichever blobs are on disk now: if the
|
|
447
|
+
database still has blob files a record can resolve to one that no longer belongs to it, and if it has
|
|
448
|
+
none the blob ids start over at 1 and the next blob written lands on a path a restored record already
|
|
449
|
+
references. Restoring into a new database is **not** a way around this — its blob roots are empty for
|
|
450
|
+
the same reason. Restore a backup that includes blobs, or accept the mixed result explicitly.
|
|
451
|
+
|
|
442
452
|
A database held open by a loaded component — and always the \`system\` database — cannot be restored
|
|
443
453
|
while Harper is running; stop the server and run the same command offline. Offline you can also
|
|
444
454
|
restore into a *copy*, leaving the original untouched:
|
|
@@ -491,6 +501,7 @@ export async function verifyBackup(request: any) {
|
|
|
491
501
|
|
|
492
502
|
export async function validateRestoreBackup(request: any) {
|
|
493
503
|
requireSuperUser(request, OPERATIONS_ENUM.RESTORE_BACKUP);
|
|
504
|
+
requireBooleanOption(request.allow_engine_only, 'allow_engine_only');
|
|
494
505
|
const databaseName = getDatabaseName(request);
|
|
495
506
|
if (databaseName === 'system') {
|
|
496
507
|
throw new ClientError(
|
|
@@ -558,13 +569,25 @@ export async function restoreBackup(request: any) {
|
|
|
558
569
|
: resolveDatabasePath(databaseName);
|
|
559
570
|
// reject a backup with more blob roots than the current config *before* anything destructive —
|
|
560
571
|
// restoring it would mis-address blobs (records persist their root index)
|
|
561
|
-
|
|
572
|
+
const blobRoots = getBlobPathsForDatabaseName(databaseName);
|
|
573
|
+
await assertBlobSnapshotRestorable(backupDir, backupId, blobRoots);
|
|
574
|
+
const allowEngineOnly = requireBooleanOption(request.allow_engine_only, 'allow_engine_only');
|
|
575
|
+
// Once is enough: the decision reads the manifest and the opt-in, never the destination, so no
|
|
576
|
+
// concurrent writer can change the answer between here and the purge.
|
|
577
|
+
assertEngineOnlyRestoreAllowed(databaseName, { backupHasBlobs: manifest.blobs, allowEngineOnly });
|
|
562
578
|
const lock = beginRestoreForDatabase(databaseDir, databaseName);
|
|
579
|
+
const restoreToken = randomUUID();
|
|
563
580
|
let destructionStarted = false;
|
|
564
581
|
try {
|
|
565
|
-
// close the database across all worker threads
|
|
566
|
-
// restoring marker keeps
|
|
567
|
-
|
|
582
|
+
// Block new blob saves, drain in-flight saves, and close the database across all worker threads.
|
|
583
|
+
// Each thread also rescans, and the restoring marker keeps it from reloading mid-restore.
|
|
584
|
+
try {
|
|
585
|
+
await signalling.signalSchemaChange(restoreSchemaEvent(databaseName, 'close', restoreToken));
|
|
586
|
+
} catch {
|
|
587
|
+
throw new BackupInProgressError(
|
|
588
|
+
`Cannot restore database '${databaseName}': not every worker completed the blob-save barrier before the acknowledgement deadline. Retry the restore after the stalled work has cleared.`
|
|
589
|
+
);
|
|
590
|
+
}
|
|
568
591
|
// A live component (or the system database) can hold its own handle on the database that
|
|
569
592
|
// Harper does not track and cannot close, so verify actual process-wide closure before
|
|
570
593
|
// purging — restoring under an open instance would corrupt it. If handles remain, fail
|
|
@@ -587,6 +610,19 @@ export async function restoreBackup(request: any) {
|
|
|
587
610
|
// before any destruction is safe to clear.
|
|
588
611
|
if (destructionStarted || lock.preexisting) {
|
|
589
612
|
abandonRestore(lock);
|
|
613
|
+
// The restore is over even though it failed, so release the workers' blob fence. Without this
|
|
614
|
+
// the fence outlives the attempt: the marker keeps the database from loading, but an operator
|
|
615
|
+
// who gives up and drops/recreates the name instead of rerunning gets a database whose writes
|
|
616
|
+
// are refused by a fence no restore owns any more. Treated as a replaced generation because
|
|
617
|
+
// destruction may have begun -- forgoing a deletion only leaks a file for the orphan sweep,
|
|
618
|
+
// while performing a stale one destroys restored bytes.
|
|
619
|
+
try {
|
|
620
|
+
await signalling.signalSchemaChange(restoreSchemaEvent(databaseName, 'reload', restoreToken, true));
|
|
621
|
+
} catch (releaseError) {
|
|
622
|
+
// Never mask the restore failure with a broadcast failure; the fence is worker-local state
|
|
623
|
+
// and a process restart clears it regardless.
|
|
624
|
+
logger.error(`Could not release the blob fence after a failed restore of '${databaseName}'`, releaseError);
|
|
625
|
+
}
|
|
590
626
|
// wrap rather than mutate error.message: a frozen/library error can have a non-writable
|
|
591
627
|
// message (assigning it throws TypeError under 'use strict')
|
|
592
628
|
throw new Error(
|
|
@@ -597,13 +633,33 @@ export async function restoreBackup(request: any) {
|
|
|
597
633
|
// nothing destructive happened and the marker was fresh — clear it and let every thread reload
|
|
598
634
|
// the intact database
|
|
599
635
|
completeRestore(lock);
|
|
600
|
-
await signalling.signalSchemaChange(
|
|
636
|
+
await signalling.signalSchemaChange(restoreSchemaEvent(databaseName, 'reload', restoreToken, false));
|
|
601
637
|
throw error;
|
|
602
638
|
}
|
|
603
639
|
completeRestore(lock);
|
|
604
640
|
// signal again: with the marker gone, every thread's rescan reloads the restored database
|
|
605
|
-
await signalling.signalSchemaChange(
|
|
606
|
-
return { database: databaseName, backup_id: backupId };
|
|
641
|
+
await signalling.signalSchemaChange(restoreSchemaEvent(databaseName, 'reload', restoreToken));
|
|
642
|
+
return { database: databaseName, backup_id: backupId, ...(allowEngineOnly ? { allow_engine_only: true } : {}) };
|
|
643
|
+
}
|
|
644
|
+
|
|
645
|
+
/**
|
|
646
|
+
* `restoreToken` identifies the restore that owns the blob fence. Two restores of the same database
|
|
647
|
+
* can overlap, so a worker releases the fence only for the token that established it -- see
|
|
648
|
+
* `resumeBlobSavesAfterRestore`.
|
|
649
|
+
*/
|
|
650
|
+
function restoreSchemaEvent(
|
|
651
|
+
databaseName: string,
|
|
652
|
+
restorePhase: 'close' | 'reload',
|
|
653
|
+
restoreToken: string,
|
|
654
|
+
generationReplaced = true
|
|
655
|
+
) {
|
|
656
|
+
const message: any = new SchemaEventMsg(process.pid, OPERATIONS_ENUM.RESTORE_BACKUP, databaseName);
|
|
657
|
+
message.restorePhase = restorePhase;
|
|
658
|
+
message.restoreToken = restoreToken;
|
|
659
|
+
// Tells a worker whether the blob roots it fenced were actually replaced. A restore that failed its
|
|
660
|
+
// admission checks destroyed nothing, so that worker's queued reclamations are still valid.
|
|
661
|
+
message.generationReplaced = generationReplaced;
|
|
662
|
+
return message;
|
|
607
663
|
}
|
|
608
664
|
|
|
609
665
|
// After the close broadcast is acknowledged, every worker thread has released its Harper-managed
|
|
@@ -820,28 +876,11 @@ function writeWithBackpressure(dest: PassThrough, chunk: Buffer): Promise<void>
|
|
|
820
876
|
async function appendBlobEntries(pack: Pack, blobRoots: string[]): Promise<void> {
|
|
821
877
|
for (let index = 0; index < blobRoots.length; index++) {
|
|
822
878
|
const root = blobRoots[index];
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
const
|
|
827
|
-
|
|
828
|
-
try {
|
|
829
|
-
entries = await readdir(dir, { withFileTypes: true });
|
|
830
|
-
} catch (error: any) {
|
|
831
|
-
if (error.code === 'ENOENT') continue;
|
|
832
|
-
throw error;
|
|
833
|
-
}
|
|
834
|
-
for (const entry of entries) {
|
|
835
|
-
const filePath = join(dir, entry.name);
|
|
836
|
-
if (entry.isDirectory()) {
|
|
837
|
-
stack.push(filePath);
|
|
838
|
-
} else if (entry.isFile()) {
|
|
839
|
-
// tar entry names are always POSIX-separated; relative() yields `\` on Windows, which
|
|
840
|
-
// would otherwise become literal filename characters when extracted on POSIX
|
|
841
|
-
const relativePath = relative(root, filePath).split(sep).join('/');
|
|
842
|
-
await appendBlobEntry(pack, filePath, `blobs/${index}/${relativePath}`);
|
|
843
|
-
}
|
|
844
|
-
}
|
|
879
|
+
for await (const filePath of walkBlobFiles(root)) {
|
|
880
|
+
// tar entry names are always POSIX-separated; relative() yields `\` on Windows, which
|
|
881
|
+
// would otherwise become literal filename characters when extracted on POSIX
|
|
882
|
+
const relativePath = relative(root, filePath).split(sep).join('/');
|
|
883
|
+
await appendBlobEntry(pack, filePath, `blobs/${index}/${relativePath}`);
|
|
845
884
|
}
|
|
846
885
|
}
|
|
847
886
|
}
|
|
@@ -996,7 +1035,15 @@ export async function createBackupOffline(databaseName: string, excludeBlobs = f
|
|
|
996
1035
|
* server start. `targetDatabase` restores into a different database directory (non-destructive
|
|
997
1036
|
* for the source database); the server picks it up on next start via normal engine detection.
|
|
998
1037
|
*/
|
|
999
|
-
export async function restoreBackupOffline(
|
|
1038
|
+
export async function restoreBackupOffline(
|
|
1039
|
+
databaseName: string,
|
|
1040
|
+
backupId?: number,
|
|
1041
|
+
targetDatabase?: string,
|
|
1042
|
+
allowEngineOnlyOption?: boolean
|
|
1043
|
+
) {
|
|
1044
|
+
// Validated the same way the online path validates it, so a malformed opt-in is refused rather than
|
|
1045
|
+
// silently read as "no". The CLI JSON-parses `key=value`, so a typo arrives here as a string.
|
|
1046
|
+
const allowEngineOnly = requireBooleanOption(allowEngineOnlyOption, 'allow_engine_only');
|
|
1000
1047
|
validateDatabaseName(databaseName);
|
|
1001
1048
|
const backupDir = backupDirForDatabase(databaseName);
|
|
1002
1049
|
// resolve to the latest complete backup (or the requested id, rejected if incomplete)
|
|
@@ -1014,7 +1061,9 @@ export async function restoreBackupOffline(databaseName: string, backupId?: numb
|
|
|
1014
1061
|
}
|
|
1015
1062
|
// reject a backup with more blob roots than the target's current config before anything
|
|
1016
1063
|
// destructive (records persist their root index, so collapsing would mis-address blobs)
|
|
1017
|
-
|
|
1064
|
+
const blobRoots = getBlobPathsForDatabaseName(targetDatabase ?? databaseName);
|
|
1065
|
+
await assertBlobSnapshotRestorable(backupDir, backupId, blobRoots);
|
|
1066
|
+
assertEngineOnlyRestoreAllowed(targetDatabase ?? databaseName, { backupHasBlobs: manifest.blobs, allowEngineOnly });
|
|
1018
1067
|
// Take the restore lock + marker BEFORE probing so a server that starts after this point sees the
|
|
1019
1068
|
// marker and refuses to load the database (closing the window between the probe and the purge).
|
|
1020
1069
|
const lock = beginRestoreForDatabase(databaseDir, targetDatabase ?? databaseName);
|
|
@@ -1069,7 +1118,12 @@ export async function restoreBackupOffline(databaseName: string, backupId?: numb
|
|
|
1069
1118
|
throw error;
|
|
1070
1119
|
}
|
|
1071
1120
|
completeRestore(lock);
|
|
1072
|
-
return {
|
|
1121
|
+
return {
|
|
1122
|
+
database: databaseName,
|
|
1123
|
+
backup_id: backupId,
|
|
1124
|
+
restored_to: databaseDir,
|
|
1125
|
+
...(allowEngineOnly ? { allow_engine_only: true } : {}),
|
|
1126
|
+
};
|
|
1073
1127
|
}
|
|
1074
1128
|
|
|
1075
1129
|
function isMissingOrEmptyDir(path: string): boolean {
|
|
@@ -181,11 +181,15 @@ async function descTable(describeTableObject: any, attrPerms?: any) {
|
|
|
181
181
|
}
|
|
182
182
|
|
|
183
183
|
let attributes = [];
|
|
184
|
-
|
|
184
|
+
let readableAttributes: Set<string> | undefined;
|
|
185
|
+
if (tableAttrPerms?.length) {
|
|
185
186
|
let permittedAttr = {};
|
|
187
|
+
let readableAttr = {};
|
|
186
188
|
tableAttrPerms.forEach((a) => {
|
|
187
189
|
if (a.describe) permittedAttr[a.attribute_name] = true;
|
|
190
|
+
if (a.read) readableAttr[a.attribute_name] = true;
|
|
188
191
|
});
|
|
192
|
+
readableAttributes = new Set(Object.keys(readableAttr));
|
|
189
193
|
|
|
190
194
|
tableObj.attributes.forEach((a) => {
|
|
191
195
|
if (permittedAttr[a.name]) pushAtt(a);
|
|
@@ -220,6 +224,46 @@ async function descTable(describeTableObject: any, attrPerms?: any) {
|
|
|
220
224
|
tableResult.sources = (tableObj as any).sources
|
|
221
225
|
.map((source: any) => source.name)
|
|
222
226
|
.filter((source: any) => source && source !== 'Replicator');
|
|
227
|
+
if (tableObj.fullTextIndexes?.length > 0) {
|
|
228
|
+
const { fullTextDerivedIndexReadiness } = await import('../resources/derivedIndexes.ts');
|
|
229
|
+
tableResult.full_text_indexes = tableObj.fullTextIndexes
|
|
230
|
+
.map((definition: any) => {
|
|
231
|
+
const fields = definition.fields.filter(
|
|
232
|
+
(field: any) => !readableAttributes || readableAttributes.has(field.name)
|
|
233
|
+
);
|
|
234
|
+
if (fields.length === 0) return;
|
|
235
|
+
const readiness = fullTextDerivedIndexReadiness(tableObj, definition.name);
|
|
236
|
+
return {
|
|
237
|
+
name: definition.name,
|
|
238
|
+
fields: fields.map(({ name, weight, mediaType, highlight }: any) => ({
|
|
239
|
+
name,
|
|
240
|
+
weight,
|
|
241
|
+
...(mediaType ? { media_type: mediaType } : null),
|
|
242
|
+
...(highlight ? { highlight: true } : null),
|
|
243
|
+
})),
|
|
244
|
+
analyzer: definition.analyzer,
|
|
245
|
+
stop_words: definition.stopWords,
|
|
246
|
+
positions: definition.positions,
|
|
247
|
+
surface_terms: definition.surfaceTerms,
|
|
248
|
+
synonyms: definition.synonyms,
|
|
249
|
+
highlighting: definition.highlighting ?? false,
|
|
250
|
+
query_modes: [
|
|
251
|
+
'any',
|
|
252
|
+
'all',
|
|
253
|
+
'fuzzy',
|
|
254
|
+
...(definition.positions ? ['phrase'] : []),
|
|
255
|
+
...(definition.surfaceTerms ? ['prefix', 'fuzzy-prefix'] : []),
|
|
256
|
+
],
|
|
257
|
+
readiness: {
|
|
258
|
+
state: readiness.state,
|
|
259
|
+
...(readiness.reason ? { reason: readiness.reason } : null),
|
|
260
|
+
owner_epoch: readiness.ownerEpoch.toString(),
|
|
261
|
+
rebuild_attempts: readiness.rebuildAttempts,
|
|
262
|
+
},
|
|
263
|
+
};
|
|
264
|
+
})
|
|
265
|
+
.filter(Boolean);
|
|
266
|
+
}
|
|
223
267
|
|
|
224
268
|
try {
|
|
225
269
|
// `getRecordCount` scans the table's primary store, which dominates describe latency on large
|
package/dist/bin/backup.js
CHANGED
|
@@ -99,7 +99,7 @@ async function runBackupCommand(command) {
|
|
|
99
99
|
result = await (0, rocksdbBackup_ts_1.purgeBackupsOffline)(databaseName, request.keep_count);
|
|
100
100
|
break;
|
|
101
101
|
case OPERATIONS_ENUM.RESTORE_BACKUP:
|
|
102
|
-
result = await (0, rocksdbBackup_ts_1.restoreBackupOffline)(databaseName, request.backup_id, request.target_database);
|
|
102
|
+
result = await (0, rocksdbBackup_ts_1.restoreBackupOffline)(databaseName, request.backup_id, request.target_database, request.allow_engine_only);
|
|
103
103
|
break;
|
|
104
104
|
default:
|
|
105
105
|
throw new Error(`Unknown backup command '${command}'`);
|
package/dist/bin/backup.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"backup.js","sourceRoot":"","sources":["../../bin/backup.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkCb,
|
|
1
|
+
{"version":3,"file":"backup.js","sourceRoot":"","sources":["../../bin/backup.ts"],"names":[],"mappings":"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"}
|
|
@@ -137,13 +137,13 @@ type DormantBuild = {
|
|
|
137
137
|
* cannot hold or miss a slot. Never throws: a failure must neither fail a component closed nor replace a
|
|
138
138
|
* deploy's own error.
|
|
139
139
|
*
|
|
140
|
-
* `
|
|
141
|
-
*
|
|
142
|
-
*
|
|
143
|
-
* the eviction tail leaves
|
|
144
|
-
* not pin it
|
|
140
|
+
* A `pinned` id is never evicted. A delayed activation runs this preamble under the same lock it is about to
|
|
141
|
+
* activate under, so without the pin retention would delete the artifact the request named — immediately, when the
|
|
142
|
+
* knob is `0` — and a settlement's pins keep the releases it just put back. Pins are applied after the kept set is
|
|
143
|
+
* chosen, so each pinned build in the eviction tail leaves one more than `maxCount` on disk until a pass that does
|
|
144
|
+
* not pin it.
|
|
145
145
|
*/
|
|
146
|
-
export declare function pruneDormantBuilds(componentName: string, builds: DormantBuild[], maxCount: number,
|
|
146
|
+
export declare function pruneDormantBuilds(componentName: string, builds: DormantBuild[], maxCount: number, pinned?: string | readonly string[]): Promise<void>;
|
|
147
147
|
export type ArtifactDescriptor = {
|
|
148
148
|
v: number;
|
|
149
149
|
component: string;
|
|
@@ -159,21 +159,10 @@ export declare function makeRollbackPlaceholderMovable(applicationDirPath: strin
|
|
|
159
159
|
ino: bigint;
|
|
160
160
|
} | undefined): Promise<void>;
|
|
161
161
|
/**
|
|
162
|
-
*
|
|
163
|
-
*
|
|
164
|
-
*
|
|
165
|
-
* Ownership is published as part of the claim rather than at certification, because resolving and packing can
|
|
166
|
-
* take minutes and until a tree exists to infer an owner from, a directory answering to nobody is one another
|
|
167
|
-
* component will take for abandoned. Unattributed is a permanent refusal, though, so a failure here — a full
|
|
168
|
-
* disk, an EIO on the temp write or its sync — would burn this deployment id for good, every retry refused by
|
|
169
|
-
* its own wreckage. The removal is scoped to the directory this invocation made, and deliberately not
|
|
170
|
-
* broadened to one found by EEXIST: that directory may be another claimant's, and removing it is the race the
|
|
171
|
-
* refusal exists to prevent. Best-effort, because the claim failure is what the caller needs to see.
|
|
172
|
-
*
|
|
173
|
-
* `write` is a parameter so the failure is testable without a filesystem that can be made to fail on exactly
|
|
174
|
-
* this write and nothing else.
|
|
162
|
+
* The claim names no id yet, so a failure burns nothing. `write` is a parameter so the failure is testable without a
|
|
163
|
+
* filesystem that can be made to fail on exactly this write.
|
|
175
164
|
*/
|
|
176
|
-
export declare function publishClaimOwnership(
|
|
165
|
+
export declare function publishClaimOwnership(claimDirPath: string, componentName: string, write?: (filePath: string, contents: string) => Promise<void>): Promise<void>;
|
|
177
166
|
/**
|
|
178
167
|
* The components a deployment's evidence implicates, when its journal and its ownership sidecar disagree
|
|
179
168
|
* about whose it is — or `undefined` when there is no disagreement to act on.
|
|
@@ -218,7 +207,7 @@ export declare function recoverInterruptedActivations(componentsRootDirPath: str
|
|
|
218
207
|
* dormant. The lock is taken only when there is something to do; a lock a live deploy holds is the same
|
|
219
208
|
* deferral the residue branch records.
|
|
220
209
|
*/
|
|
221
|
-
export declare function reconcileDormantBuilds(componentsRootDirPath: string, owner: string, builds: DormantBuild[], maxCount: number): Promise<Map<string, Error>>;
|
|
210
|
+
export declare function reconcileDormantBuilds(componentsRootDirPath: string, owner: string, builds: DormantBuild[], maxCount: number, pinned?: readonly string[]): Promise<Map<string, Error>>;
|
|
222
211
|
export declare function markCandidateComplete(componentDirPath: string, deploymentId: string, componentName: string): Promise<void>;
|
|
223
212
|
/**
|
|
224
213
|
* Make a built and validated candidate live, as one transaction over three effects: the live tree moves
|
|
@@ -322,6 +311,7 @@ export declare class Application {
|
|
|
322
311
|
isNewComponent: boolean;
|
|
323
312
|
packageMetadataChanged: boolean;
|
|
324
313
|
installationIsOpaque: boolean;
|
|
314
|
+
alreadyActive: boolean;
|
|
325
315
|
constructor({ name, payload, packageIdentifier, install, onInstallLine, credentials }: ApplicationOptions);
|
|
326
316
|
writeTransientNpmrc(): Promise<void>;
|
|
327
317
|
get gitCredentialEnv(): Record<string, string> | undefined;
|