@harperfast/harper 5.2.9 → 5.3.0-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/agent/mcpTools.ts +1 -1
- package/agent/session.ts +25 -14
- package/bin/cliOperations.ts +46 -9
- package/bin/copyDb.ts +282 -59
- package/bin/deploySetup.ts +16 -5
- package/bin/harper.ts +1 -1
- package/bin/help.ts +4 -1
- package/bin/lite.ts +4 -1
- package/bin/restart.ts +59 -3
- package/bin/run.ts +6 -11
- package/bin/upgrade.js +7 -3
- package/bin/workloadIdentity.ts +119 -0
- package/components/Application.ts +2414 -242
- package/components/ApplicationScope.ts +8 -0
- package/components/EntryHandler.ts +59 -39
- package/components/OptionsWatcher.ts +150 -74
- package/components/RuntimeModuleTracker.ts +38 -7
- package/components/Scope.ts +37 -15
- package/components/awaitRestart.ts +84 -0
- package/components/componentLoader.ts +340 -30
- package/components/componentPreparationLock.ts +16 -5
- package/components/mcp/adapters/harperHttp.ts +4 -0
- package/components/mcp/listChanged.ts +4 -0
- package/components/mcp/toolRegistry.ts +2 -0
- package/components/mcp/tools/operations.ts +9 -0
- package/components/mcp/tools/schemas/operationDescriptions.ts +2 -2
- package/components/operations.js +270 -78
- package/components/operationsValidation.js +49 -1
- package/components/status/ComponentStatusRegistry.ts +59 -0
- package/config/RootConfigWatcher.ts +80 -34
- package/config/configUtils.ts +291 -34
- package/config/harperConfigEnvVars.ts +170 -27
- package/config-root.schema.json +29 -0
- package/dataLayer/blobBackup.ts +160 -50
- package/dataLayer/delete.ts +6 -1
- package/dataLayer/harperBridge/ResourceBridge.ts +52 -8
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/DeleteAuditLogsBeforeResults.js +3 -1
- package/dataLayer/hdbInfoController.ts +34 -1
- package/dataLayer/insert.ts +44 -1
- package/dataLayer/rocksdbBackup.ts +53 -10
- package/dataLayer/schema.ts +11 -1
- package/dataLayer/schemaDescribe.ts +8 -1
- package/dist/agent/mcpTools.js +1 -1
- package/dist/agent/mcpTools.js.map +1 -1
- package/dist/agent/session.d.ts +22 -0
- package/dist/agent/session.js +26 -15
- package/dist/agent/session.js.map +1 -1
- package/dist/bin/cliOperations.js +48 -9
- package/dist/bin/cliOperations.js.map +1 -1
- package/dist/bin/copyDb.d.ts +12 -1
- package/dist/bin/copyDb.js +248 -60
- package/dist/bin/copyDb.js.map +1 -1
- package/dist/bin/deploySetup.d.ts +2 -0
- package/dist/bin/deploySetup.js +11 -3
- package/dist/bin/deploySetup.js.map +1 -1
- package/dist/bin/harper.js +1 -1
- package/dist/bin/harper.js.map +1 -1
- package/dist/bin/help.js +4 -1
- package/dist/bin/help.js.map +1 -1
- package/dist/bin/lite.js +4 -1
- package/dist/bin/lite.js.map +1 -1
- package/dist/bin/restart.js +54 -5
- package/dist/bin/restart.js.map +1 -1
- package/dist/bin/run.js +4 -10
- package/dist/bin/run.js.map +1 -1
- package/dist/bin/upgrade.js +4 -3
- package/dist/bin/upgrade.js.map +1 -1
- package/dist/bin/workloadIdentity.d.ts +18 -0
- package/dist/bin/workloadIdentity.js +100 -0
- package/dist/bin/workloadIdentity.js.map +1 -0
- package/dist/components/Application.d.ts +139 -16
- package/dist/components/Application.js +2215 -267
- package/dist/components/Application.js.map +1 -1
- package/dist/components/ApplicationScope.d.ts +8 -0
- package/dist/components/ApplicationScope.js +7 -0
- package/dist/components/ApplicationScope.js.map +1 -1
- package/dist/components/EntryHandler.js +26 -10
- package/dist/components/EntryHandler.js.map +1 -1
- package/dist/components/OptionsWatcher.d.ts +1 -0
- package/dist/components/OptionsWatcher.js +141 -74
- package/dist/components/OptionsWatcher.js.map +1 -1
- package/dist/components/RuntimeModuleTracker.js +40 -6
- package/dist/components/RuntimeModuleTracker.js.map +1 -1
- package/dist/components/Scope.js +38 -13
- package/dist/components/Scope.js.map +1 -1
- package/dist/components/awaitRestart.d.ts +33 -0
- package/dist/components/awaitRestart.js +61 -0
- package/dist/components/awaitRestart.js.map +1 -0
- package/dist/components/componentLoader.d.ts +38 -1
- package/dist/components/componentLoader.js +279 -22
- package/dist/components/componentLoader.js.map +1 -1
- package/dist/components/componentPreparationLock.d.ts +5 -0
- package/dist/components/componentPreparationLock.js +14 -6
- package/dist/components/componentPreparationLock.js.map +1 -1
- package/dist/components/mcp/adapters/harperHttp.js +4 -0
- package/dist/components/mcp/adapters/harperHttp.js.map +1 -1
- package/dist/components/mcp/listChanged.js +5 -0
- package/dist/components/mcp/listChanged.js.map +1 -1
- package/dist/components/mcp/toolRegistry.d.ts +1 -0
- package/dist/components/mcp/toolRegistry.js.map +1 -1
- package/dist/components/mcp/tools/operations.d.ts +5 -0
- package/dist/components/mcp/tools/operations.js +9 -0
- package/dist/components/mcp/tools/operations.js.map +1 -1
- package/dist/components/mcp/tools/schemas/operationDescriptions.js +2 -2
- package/dist/components/mcp/tools/schemas/operationDescriptions.js.map +1 -1
- package/dist/components/operations.js +231 -77
- package/dist/components/operations.js.map +1 -1
- package/dist/components/operationsValidation.js +49 -1
- package/dist/components/operationsValidation.js.map +1 -1
- package/dist/components/status/ComponentStatusRegistry.d.ts +0 -4
- package/dist/components/status/ComponentStatusRegistry.js +63 -0
- package/dist/components/status/ComponentStatusRegistry.js.map +1 -1
- package/dist/config/RootConfigWatcher.d.ts +7 -1
- package/dist/config/RootConfigWatcher.js +64 -27
- package/dist/config/RootConfigWatcher.js.map +1 -1
- package/dist/config/configUtils.d.ts +9 -1
- package/dist/config/configUtils.js +254 -33
- package/dist/config/configUtils.js.map +1 -1
- package/dist/config/harperConfigEnvVars.d.ts +16 -0
- package/dist/config/harperConfigEnvVars.js +162 -25
- package/dist/config/harperConfigEnvVars.js.map +1 -1
- package/dist/dataLayer/blobBackup.d.ts +49 -20
- package/dist/dataLayer/blobBackup.js +139 -50
- package/dist/dataLayer/blobBackup.js.map +1 -1
- package/dist/dataLayer/delete.js +1 -1
- package/dist/dataLayer/delete.js.map +1 -1
- package/dist/dataLayer/harperBridge/ResourceBridge.d.ts +14 -1
- package/dist/dataLayer/harperBridge/ResourceBridge.js +51 -10
- package/dist/dataLayer/harperBridge/ResourceBridge.js.map +1 -1
- package/dist/dataLayer/harperBridge/lmdbBridge/lmdbMethods/DeleteAuditLogsBeforeResults.d.ts +3 -1
- package/dist/dataLayer/harperBridge/lmdbBridge/lmdbMethods/DeleteAuditLogsBeforeResults.js +3 -1
- package/dist/dataLayer/harperBridge/lmdbBridge/lmdbMethods/DeleteAuditLogsBeforeResults.js.map +1 -1
- package/dist/dataLayer/hdbInfoController.d.ts +10 -0
- package/dist/dataLayer/hdbInfoController.js +30 -1
- package/dist/dataLayer/hdbInfoController.js.map +1 -1
- package/dist/dataLayer/insert.d.ts +9 -1
- package/dist/dataLayer/insert.js +30 -0
- package/dist/dataLayer/insert.js.map +1 -1
- package/dist/dataLayer/rocksdbBackup.d.ts +2 -2
- package/dist/dataLayer/rocksdbBackup.js +45 -8
- package/dist/dataLayer/rocksdbBackup.js.map +1 -1
- package/dist/dataLayer/schema.js +8 -0
- package/dist/dataLayer/schema.js.map +1 -1
- package/dist/dataLayer/schemaDescribe.js +8 -1
- package/dist/dataLayer/schemaDescribe.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js.map +1 -1
- package/dist/json/systemSchema.json +52 -0
- package/dist/resources/DatabaseTransaction.d.ts +55 -0
- package/dist/resources/DatabaseTransaction.js +459 -45
- package/dist/resources/DatabaseTransaction.js.map +1 -1
- package/dist/resources/LMDBTransaction.js +22 -4
- package/dist/resources/LMDBTransaction.js.map +1 -1
- package/dist/resources/PrimaryRocksDatabase.d.ts +1 -0
- package/dist/resources/PrimaryRocksDatabase.js +29 -0
- package/dist/resources/PrimaryRocksDatabase.js.map +1 -1
- package/dist/resources/RecordEncoder.d.ts +20 -0
- package/dist/resources/RecordEncoder.js +94 -9
- package/dist/resources/RecordEncoder.js.map +1 -1
- package/dist/resources/RequestTarget.d.ts +2 -0
- package/dist/resources/RequestTarget.js.map +1 -1
- package/dist/resources/Resource.js +20 -11
- package/dist/resources/Resource.js.map +1 -1
- package/dist/resources/ResourceInterface.d.ts +20 -1
- package/dist/resources/ResourceInterface.js.map +1 -1
- package/dist/resources/RocksIndexStore.d.ts +6 -1
- package/dist/resources/RocksIndexStore.js +24 -9
- package/dist/resources/RocksIndexStore.js.map +1 -1
- package/dist/resources/RocksTransactionLogStore.d.ts +14 -1
- package/dist/resources/RocksTransactionLogStore.js +57 -17
- package/dist/resources/RocksTransactionLogStore.js.map +1 -1
- package/dist/resources/Table.d.ts +112 -8
- package/dist/resources/Table.js +1073 -191
- package/dist/resources/Table.js.map +1 -1
- package/dist/resources/auditStore.d.ts +11 -2
- package/dist/resources/auditStore.js +325 -71
- package/dist/resources/auditStore.js.map +1 -1
- package/dist/resources/blob.d.ts +129 -9
- package/dist/resources/blob.js +992 -114
- package/dist/resources/blob.js.map +1 -1
- package/dist/resources/branchDatabase.d.ts +48 -0
- package/dist/resources/branchDatabase.js +892 -0
- package/dist/resources/branchDatabase.js.map +1 -0
- package/dist/resources/crdt.js +50 -12
- package/dist/resources/crdt.js.map +1 -1
- package/dist/resources/databases.d.ts +150 -0
- package/dist/resources/databases.js +1200 -239
- package/dist/resources/databases.js.map +1 -1
- package/dist/resources/defineTable.d.ts +10 -2
- package/dist/resources/defineTable.js +9 -1
- package/dist/resources/defineTable.js.map +1 -1
- package/dist/resources/graphql.d.ts +1 -1
- package/dist/resources/graphql.js +50 -15
- package/dist/resources/graphql.js.map +1 -1
- package/dist/resources/indexes/HierarchicalNavigableSmallWorld.d.ts +1 -0
- package/dist/resources/indexes/HierarchicalNavigableSmallWorld.js +6 -2
- package/dist/resources/indexes/HierarchicalNavigableSmallWorld.js.map +1 -1
- package/dist/resources/longLivedTransactions.d.ts +71 -0
- package/dist/resources/longLivedTransactions.js +358 -0
- package/dist/resources/longLivedTransactions.js.map +1 -0
- package/dist/resources/models/backendRegistry.d.ts +26 -0
- package/dist/resources/models/backendRegistry.js +60 -2
- package/dist/resources/models/backendRegistry.js.map +1 -1
- package/dist/resources/models/bootstrap.d.ts +33 -1
- package/dist/resources/models/bootstrap.js +416 -31
- package/dist/resources/models/bootstrap.js.map +1 -1
- package/dist/resources/recordLock.d.ts +80 -0
- package/dist/resources/recordLock.js +184 -0
- package/dist/resources/recordLock.js.map +1 -0
- package/dist/resources/replayLogs.d.ts +14 -1
- package/dist/resources/replayLogs.js +152 -24
- package/dist/resources/replayLogs.js.map +1 -1
- package/dist/resources/replayLogsGuards.d.ts +94 -7
- package/dist/resources/replayLogsGuards.js +111 -7
- package/dist/resources/replayLogsGuards.js.map +1 -1
- package/dist/resources/search.js +158 -6
- package/dist/resources/search.js.map +1 -1
- package/dist/resources/transactionBroadcast.d.ts +1 -1
- package/dist/resources/transactionBroadcast.js +2 -2
- package/dist/resources/transactionBroadcast.js.map +1 -1
- package/dist/security/auth.js +61 -30
- package/dist/security/auth.js.map +1 -1
- package/dist/security/authn/oidc/claims.d.ts +22 -0
- package/dist/security/authn/oidc/claims.js +71 -0
- package/dist/security/authn/oidc/claims.js.map +1 -0
- package/dist/security/authn/oidc/identityToken.d.ts +27 -0
- package/dist/security/authn/oidc/identityToken.js +111 -0
- package/dist/security/authn/oidc/identityToken.js.map +1 -0
- package/dist/security/authn/oidc/jwks.d.ts +25 -0
- package/dist/security/authn/oidc/jwks.js +261 -0
- package/dist/security/authn/oidc/jwks.js.map +1 -0
- package/dist/security/authn/oidc/providers/generic.d.ts +13 -0
- package/dist/security/authn/oidc/providers/generic.js +34 -0
- package/dist/security/authn/oidc/providers/generic.js.map +1 -0
- package/dist/security/authn/oidc/providers/githubActions.d.ts +11 -0
- package/dist/security/authn/oidc/providers/githubActions.js +129 -0
- package/dist/security/authn/oidc/providers/githubActions.js.map +1 -0
- package/dist/security/authn/oidc/providers/index.d.ts +37 -0
- package/dist/security/authn/oidc/providers/index.js +24 -0
- package/dist/security/authn/oidc/providers/index.js.map +1 -0
- package/dist/security/authn/oidc/tokenExchange.d.ts +12 -0
- package/dist/security/authn/oidc/tokenExchange.js +306 -0
- package/dist/security/authn/oidc/tokenExchange.js.map +1 -0
- package/dist/security/authn/oidc/trustPolicyOperations.d.ts +49 -0
- package/dist/security/authn/oidc/trustPolicyOperations.js +358 -0
- package/dist/security/authn/oidc/trustPolicyOperations.js.map +1 -0
- package/dist/security/authn/oidc/types.d.ts +38 -0
- package/dist/security/authn/oidc/types.js +6 -0
- package/dist/security/authn/oidc/types.js.map +1 -0
- package/dist/security/certificateVerification/index.js +40 -11
- package/dist/security/certificateVerification/index.js.map +1 -1
- package/dist/security/certificateVerification/trustedIssuers.d.ts +24 -0
- package/dist/security/certificateVerification/trustedIssuers.js +79 -0
- package/dist/security/certificateVerification/trustedIssuers.js.map +1 -0
- package/dist/security/certificateVerification/types.d.ts +1 -0
- package/dist/security/credentialProvenance.d.ts +35 -0
- package/dist/security/credentialProvenance.js +51 -0
- package/dist/security/credentialProvenance.js.map +1 -0
- package/dist/security/credentialRejection.d.ts +4 -0
- package/dist/security/credentialRejection.js +24 -0
- package/dist/security/credentialRejection.js.map +1 -0
- package/dist/security/deferredAuthentication.d.ts +36 -0
- package/dist/security/deferredAuthentication.js +70 -0
- package/dist/security/deferredAuthentication.js.map +1 -0
- package/dist/security/impersonation.d.ts +21 -0
- package/dist/security/impersonation.js +108 -9
- package/dist/security/impersonation.js.map +1 -1
- package/dist/security/jsLoader.d.ts +6 -0
- package/dist/security/jsLoader.js +75 -15
- package/dist/security/jsLoader.js.map +1 -1
- package/dist/security/keys.js +301 -71
- package/dist/security/keys.js.map +1 -1
- package/dist/security/operationScope.d.ts +21 -0
- package/dist/security/operationScope.js +36 -0
- package/dist/security/operationScope.js.map +1 -0
- package/dist/security/permissionsTranslator.js +21 -0
- package/dist/security/permissionsTranslator.js.map +1 -1
- package/dist/security/tokenAuthentication.d.ts +19 -1
- package/dist/security/tokenAuthentication.js +191 -10
- package/dist/security/tokenAuthentication.js.map +1 -1
- package/dist/security/user.js +4 -3
- package/dist/security/user.js.map +1 -1
- package/dist/server/DurableSubscriptionsSession.d.ts +2 -2
- package/dist/server/DurableSubscriptionsSession.js +67 -10
- package/dist/server/DurableSubscriptionsSession.js.map +1 -1
- package/dist/server/REST.js +73 -0
- package/dist/server/REST.js.map +1 -1
- package/dist/server/graphqlQuerying.js +4 -0
- package/dist/server/graphqlQuerying.js.map +1 -1
- package/dist/server/http.d.ts +11 -0
- package/dist/server/http.js +88 -15
- package/dist/server/http.js.map +1 -1
- package/dist/server/itc/serverHandlers.js +8 -1
- package/dist/server/itc/serverHandlers.js.map +1 -1
- package/dist/server/jobs/jobProcess.js +6 -2
- package/dist/server/jobs/jobProcess.js.map +1 -1
- package/dist/server/jobs/jobs.js +4 -1
- package/dist/server/jobs/jobs.js.map +1 -1
- package/dist/server/liveSubscriptionAuth.d.ts +26 -4
- package/dist/server/liveSubscriptionAuth.js +105 -39
- package/dist/server/liveSubscriptionAuth.js.map +1 -1
- package/dist/server/loadRootComponents.js +49 -10
- package/dist/server/loadRootComponents.js.map +1 -1
- package/dist/server/mqtt.d.ts +2 -0
- package/dist/server/mqtt.js +165 -30
- package/dist/server/mqtt.js.map +1 -1
- package/dist/server/nodeName.d.ts +2 -0
- package/dist/server/nodeName.js +107 -23
- package/dist/server/nodeName.js.map +1 -1
- package/dist/server/serverHelpers/Headers.d.ts +25 -0
- package/dist/server/serverHelpers/Headers.js +139 -1
- package/dist/server/serverHelpers/Headers.js.map +1 -1
- package/dist/server/serverHelpers/contentTypes.d.ts +9 -0
- package/dist/server/serverHelpers/contentTypes.js +32 -25
- package/dist/server/serverHelpers/contentTypes.js.map +1 -1
- package/dist/server/serverHelpers/deployValidationState.d.ts +3 -0
- package/dist/server/serverHelpers/deployValidationState.js +9 -19
- package/dist/server/serverHelpers/deployValidationState.js.map +1 -1
- package/dist/server/serverHelpers/operationAuthorizationState.d.ts +12 -0
- package/dist/server/serverHelpers/operationAuthorizationState.js +24 -2
- package/dist/server/serverHelpers/operationAuthorizationState.js.map +1 -1
- package/dist/server/serverHelpers/registeredOperations.d.ts +5 -4
- package/dist/server/serverHelpers/registeredOperations.js +74 -21
- package/dist/server/serverHelpers/registeredOperations.js.map +1 -1
- package/dist/server/serverHelpers/requestSanitization.d.ts +11 -0
- package/dist/server/serverHelpers/requestSanitization.js +20 -0
- package/dist/server/serverHelpers/requestSanitization.js.map +1 -0
- package/dist/server/serverHelpers/serverHandlers.js +6 -3
- package/dist/server/serverHelpers/serverHandlers.js.map +1 -1
- package/dist/server/serverHelpers/serverUtilities.d.ts +18 -0
- package/dist/server/serverHelpers/serverUtilities.js +90 -20
- package/dist/server/serverHelpers/serverUtilities.js.map +1 -1
- package/dist/server/serverHelpers/sharedMessageEncoding.d.ts +67 -0
- package/dist/server/serverHelpers/sharedMessageEncoding.js +280 -0
- package/dist/server/serverHelpers/sharedMessageEncoding.js.map +1 -0
- package/dist/server/serverHelpers/uwsServer.js +19 -1
- package/dist/server/serverHelpers/uwsServer.js.map +1 -1
- package/dist/server/static.js +24 -28
- package/dist/server/static.js.map +1 -1
- package/dist/server/storageReclamation.d.ts +12 -0
- package/dist/server/storageReclamation.js +26 -0
- package/dist/server/storageReclamation.js.map +1 -1
- package/dist/server/threads/itc.d.ts +7 -2
- package/dist/server/threads/itc.js +5 -1
- package/dist/server/threads/itc.js.map +1 -1
- package/dist/server/threads/manageThreads.d.ts +26 -3
- package/dist/server/threads/manageThreads.js +517 -65
- package/dist/server/threads/manageThreads.js.map +1 -1
- package/dist/server/threads/socketRouter.js +89 -26
- package/dist/server/threads/socketRouter.js.map +1 -1
- package/dist/server/threads/threadHeapMemory.d.ts +2 -0
- package/dist/server/threads/threadHeapMemory.js +31 -0
- package/dist/server/threads/threadHeapMemory.js.map +1 -0
- package/dist/server/threads/threadServer.js +46 -15
- package/dist/server/threads/threadServer.js.map +1 -1
- package/dist/sqlEngine/config.d.ts +1 -3
- package/dist/sqlEngine/config.js +19 -16
- package/dist/sqlEngine/config.js.map +1 -1
- package/dist/sqlTranslator/index.d.ts +1 -1
- package/dist/sqlTranslator/index.js +30 -7
- package/dist/sqlTranslator/index.js.map +1 -1
- package/dist/upgrade/directives/5-3-0.d.ts +7 -0
- package/dist/upgrade/directives/5-3-0.js +148 -0
- package/dist/upgrade/directives/5-3-0.js.map +1 -0
- package/dist/upgrade/directives/directivesController.js +2 -1
- package/dist/upgrade/directives/directivesController.js.map +1 -1
- package/dist/utility/OperationFunctionCaller.js +2 -1
- package/dist/utility/OperationFunctionCaller.js.map +1 -1
- package/dist/utility/common_utils.d.ts +16 -0
- package/dist/utility/common_utils.js +32 -6
- package/dist/utility/common_utils.js.map +1 -1
- package/dist/utility/componentNames.d.ts +8 -0
- package/dist/utility/componentNames.js +12 -1
- package/dist/utility/componentNames.js.map +1 -1
- package/dist/utility/environment/environmentManager.js +3 -6
- package/dist/utility/environment/environmentManager.js.map +1 -1
- package/dist/utility/environment/systemInformation.d.ts +1 -0
- package/dist/utility/environment/systemInformation.js +1 -0
- package/dist/utility/environment/systemInformation.js.map +1 -1
- package/dist/utility/errors/commonErrors.d.ts +2 -0
- package/dist/utility/errors/commonErrors.js +2 -0
- package/dist/utility/errors/commonErrors.js.map +1 -1
- package/dist/utility/errors/hdbError.d.ts +17 -0
- package/dist/utility/errors/hdbError.js +30 -1
- package/dist/utility/errors/hdbError.js.map +1 -1
- package/dist/utility/globalSchema.d.ts +18 -0
- package/dist/utility/hdbTerms.d.ts +16 -0
- package/dist/utility/hdbTerms.js +18 -2
- package/dist/utility/hdbTerms.js.map +1 -1
- package/dist/utility/logging/harper_logger.d.ts +2 -0
- package/dist/utility/logging/harper_logger.js +91 -14
- package/dist/utility/logging/harper_logger.js.map +1 -1
- package/dist/utility/logging/logRotator.js +76 -49
- package/dist/utility/logging/logRotator.js.map +1 -1
- package/dist/utility/nodeIdentity.d.ts +9 -0
- package/dist/utility/nodeIdentity.js +58 -0
- package/dist/utility/nodeIdentity.js.map +1 -0
- package/dist/utility/npmUtilities.js +9 -7
- package/dist/utility/npmUtilities.js.map +1 -1
- package/dist/utility/operationPermissions.d.ts +3 -1
- package/dist/utility/operationPermissions.js +16 -1
- package/dist/utility/operationPermissions.js.map +1 -1
- package/dist/utility/operation_authorization.d.ts +10 -7
- package/dist/utility/operation_authorization.js +212 -41
- package/dist/utility/operation_authorization.js.map +1 -1
- package/dist/utility/watchPath.d.ts +29 -0
- package/dist/utility/watchPath.js +68 -0
- package/dist/utility/watchPath.js.map +1 -0
- package/dist/utility/watcherFallback.d.ts +86 -0
- package/dist/utility/watcherFallback.js +278 -1
- package/dist/utility/watcherFallback.js.map +1 -1
- package/dist/validation/configValidator.d.ts +12 -0
- package/dist/validation/configValidator.js +199 -72
- package/dist/validation/configValidator.js.map +1 -1
- package/dist/validation/installValidator.js +12 -0
- package/dist/validation/installValidator.js.map +1 -1
- package/dist/validation/validationWrapper.d.ts +11 -0
- package/dist/validation/validationWrapper.js +16 -3
- package/dist/validation/validationWrapper.js.map +1 -1
- package/index.ts +2 -0
- package/json/systemSchema.json +52 -0
- package/npm-shrinkwrap.json +196 -194
- package/package.json +7 -6
- package/resources/DESIGN.md +114 -52
- package/resources/DatabaseTransaction.ts +521 -43
- package/resources/LMDBTransaction.ts +26 -4
- package/resources/PrimaryRocksDatabase.ts +28 -1
- package/resources/RecordEncoder.ts +103 -8
- package/resources/RequestTarget.ts +2 -0
- package/resources/Resource.ts +17 -9
- package/resources/ResourceInterface.ts +23 -0
- package/resources/RocksIndexStore.ts +30 -9
- package/resources/RocksTransactionLogStore.ts +78 -21
- package/resources/Table.ts +1110 -159
- package/resources/auditStore.ts +331 -73
- package/resources/blob.ts +1029 -110
- package/resources/branchDatabase.ts +941 -0
- package/resources/crdt.ts +76 -12
- package/resources/databases.ts +1310 -252
- package/resources/defineTable.ts +18 -2
- package/resources/graphql.ts +70 -16
- package/resources/indexes/HierarchicalNavigableSmallWorld.ts +6 -2
- package/resources/longLivedTransactions.ts +360 -0
- package/resources/models/backendRegistry.ts +84 -2
- package/resources/models/bootstrap.ts +473 -28
- package/resources/recordLock.ts +253 -0
- package/resources/replayLogs.ts +147 -26
- package/resources/replayLogsGuards.ts +171 -8
- package/resources/search.ts +154 -7
- package/resources/transactionBroadcast.ts +3 -3
- package/security/auth.ts +68 -29
- package/security/authn/oidc/claims.ts +72 -0
- package/security/authn/oidc/identityToken.ts +129 -0
- package/security/authn/oidc/jwks.ts +260 -0
- package/security/authn/oidc/providers/generic.ts +40 -0
- package/security/authn/oidc/providers/githubActions.ts +137 -0
- package/security/authn/oidc/providers/index.ts +52 -0
- package/security/authn/oidc/tokenExchange.ts +300 -0
- package/security/authn/oidc/trustPolicyOperations.ts +343 -0
- package/security/authn/oidc/types.ts +41 -0
- package/security/certificateVerification/index.ts +54 -13
- package/security/certificateVerification/trustedIssuers.ts +76 -0
- package/security/certificateVerification/types.ts +1 -0
- package/security/credentialProvenance.ts +47 -0
- package/security/credentialRejection.ts +22 -0
- package/security/deferredAuthentication.ts +71 -0
- package/security/impersonation.ts +117 -12
- package/security/jsLoader.ts +81 -18
- package/security/keys.ts +298 -72
- package/security/operationScope.ts +33 -0
- package/security/permissionsTranslator.js +23 -0
- package/security/tokenAuthentication.ts +233 -12
- package/security/user.ts +4 -3
- package/server/DESIGN.md +183 -16
- package/server/DurableSubscriptionsSession.ts +71 -11
- package/server/REST.ts +79 -1
- package/server/graphqlQuerying.ts +4 -0
- package/server/http.ts +99 -18
- package/server/itc/serverHandlers.js +8 -1
- package/server/jobs/jobProcess.ts +8 -2
- package/server/jobs/jobs.ts +4 -1
- package/server/liveSubscriptionAuth.ts +129 -46
- package/server/loadRootComponents.js +50 -8
- package/server/mqtt.ts +179 -38
- package/server/nodeName.ts +103 -21
- package/server/serverHelpers/Headers.ts +131 -0
- package/server/serverHelpers/contentTypes.ts +29 -21
- package/server/serverHelpers/deployValidationState.ts +24 -13
- package/server/serverHelpers/operationAuthorizationState.ts +34 -3
- package/server/serverHelpers/registeredOperations.ts +79 -22
- package/server/serverHelpers/requestSanitization.ts +15 -0
- package/server/serverHelpers/serverHandlers.js +6 -3
- package/server/serverHelpers/serverUtilities.ts +104 -31
- package/server/serverHelpers/sharedMessageEncoding.ts +307 -0
- package/server/serverHelpers/uwsServer.ts +17 -2
- package/server/static.ts +23 -29
- package/server/storageReclamation.ts +23 -0
- package/server/threads/itc.js +11 -1
- package/server/threads/manageThreads.js +526 -56
- package/server/threads/socketRouter.ts +81 -26
- package/server/threads/threadHeapMemory.ts +26 -0
- package/server/threads/threadServer.js +43 -15
- package/sqlTranslator/index.ts +31 -8
- package/studio/web/assets/Chat-BnCBegQz.js +2267 -0
- package/studio/web/assets/FloatingChat-CoDW1ySS.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-Bwk5BLXW.js} +1 -1
- package/studio/web/assets/applications-DHxGi7JH.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-s0cWI-_M.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-DNcRHK54.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-Bdssedlg.js} +1 -1
- package/studio/web/assets/{htmlMode-DyO31v-P.js → htmlMode-CoDlJ3fw.js} +1 -1
- package/studio/web/assets/{index-Cxj2_wsl.css → index-7RMEgVG1.css} +1 -1
- package/studio/web/assets/index-D6sxmFLR.js +824 -0
- package/studio/web/assets/index.lazy-tmU5BS8s.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-B8meVSTH.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-DpIPd35T.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-C_5FMJzQ.js} +1 -1
- package/studio/web/assets/{lspLanguageFeatures-B4pCF1zO.js → lspLanguageFeatures-BIzNBzPK.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-CQf18QKb.js} +1 -1
- package/studio/web/assets/notifications-CvZivSbh.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-DdOwtntb.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-n69fwagr.js} +1 -1
- package/studio/web/assets/{register-BUyhWjBO.js → register-PfWTCXWB.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-Bg6O7X0S.js} +1 -1
- package/studio/web/assets/{setup-D2kn7cAA.js → setup-CUx_aUDl.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-D7BVKqX9.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-DBSyXzMr.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-BByKCjBS.js} +1 -1
- package/studio/web/assets/{typescript-DApRQir3.js → typescript-DDLnLpw9.js} +1 -1
- package/studio/web/assets/{useEntityRestURL-DB6JStU1.js → useEntityRestURL-31CHGaHk.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-pR3jRY9D.js} +1 -1
- package/studio/web/assets/x-DIzaLEdK.js +1 -0
- package/studio/web/assets/{xml-HWd01lU-.js → xml-2iRnMhQO.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-Bf92gJpd.js} +1 -1
- package/studio/web/index.html +14 -14
- package/upgrade/directives/5-3-0.ts +132 -0
- package/upgrade/directives/directivesController.ts +2 -1
- package/utility/OperationFunctionCaller.ts +2 -1
- package/utility/common_utils.ts +30 -5
- package/utility/componentNames.ts +12 -0
- package/utility/environment/environmentManager.ts +3 -7
- package/utility/environment/systemInformation.ts +7 -0
- package/utility/errors/commonErrors.ts +4 -0
- package/utility/errors/hdbError.ts +29 -0
- package/utility/hdbTerms.ts +17 -0
- package/utility/logging/harper_logger.ts +87 -14
- package/utility/logging/logRotator.ts +72 -45
- package/utility/nodeIdentity.ts +45 -0
- package/utility/npmUtilities.ts +10 -8
- package/utility/operationPermissions.ts +18 -1
- package/utility/operation_authorization.ts +231 -42
- package/utility/watchPath.ts +63 -0
- package/utility/watcherFallback.ts +270 -0
- package/validation/configValidator.ts +209 -72
- package/validation/installValidator.ts +15 -0
- package/validation/validationWrapper.ts +18 -4
- 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/config/configUtils.ts
CHANGED
|
@@ -1,11 +1,17 @@
|
|
|
1
1
|
import * as hdbTerms from '../utility/hdbTerms.ts';
|
|
2
2
|
import * as hdbUtils from '../utility/common_utils.ts';
|
|
3
3
|
import logger from '../utility/logging/harper_logger.ts';
|
|
4
|
-
import {
|
|
4
|
+
import {
|
|
5
|
+
configValidator,
|
|
6
|
+
getDomainSocketPathLengthWarning,
|
|
7
|
+
isLegacySqlApplicationEntry,
|
|
8
|
+
} from '../validation/configValidator.ts';
|
|
9
|
+
import { isReservedComponentName } from '../utility/componentNames.ts';
|
|
5
10
|
import fs from 'fs-extra';
|
|
6
11
|
import YAML from 'yaml';
|
|
7
12
|
import path from 'path';
|
|
8
|
-
import {
|
|
13
|
+
import { constants as osConstants } from 'node:os';
|
|
14
|
+
import { isMainThread, threadId } from 'node:worker_threads';
|
|
9
15
|
import { randomBytes } from 'node:crypto';
|
|
10
16
|
import isNumber from 'is-number';
|
|
11
17
|
import propertiesReaderModule from 'properties-reader';
|
|
@@ -23,8 +29,9 @@ import { server } from '../server/Server.ts';
|
|
|
23
29
|
import { getBackupDirPath } from './configHelpers.ts';
|
|
24
30
|
import { PACKAGE_ROOT } from '../utility/packageUtils.js';
|
|
25
31
|
import * as env from '../utility/environment/environmentManager.ts';
|
|
26
|
-
import {
|
|
32
|
+
import { prepareRuntimeEnvConfig, hasPersistedEnvConfigState, discardConfigState } from './harperConfigEnvVars.ts';
|
|
27
33
|
import { warnComponentEnvConfigVars, resolveConfiguredPath } from './componentEnvPrepass.ts';
|
|
34
|
+
import { isStartableThreadHeapMemory } from '../server/threads/threadHeapMemory.ts';
|
|
28
35
|
|
|
29
36
|
const { DATABASES_PARAM_CONFIG, CONFIG_PARAMS, CONFIG_PARAM_MAP } = hdbTerms;
|
|
30
37
|
const UNINIT_GET_CONFIG_ERR = 'Unable to get config value because config is uninitialized';
|
|
@@ -90,20 +97,47 @@ export function getConfigPath(param: string) {
|
|
|
90
97
|
// in the same millisecond can't collide on the temp name and then race the rename.
|
|
91
98
|
//
|
|
92
99
|
// Windows has no POSIX-style "replace an open file" semantics: rename() fails with
|
|
93
|
-
// EPERM/EACCES
|
|
94
|
-
//
|
|
95
|
-
//
|
|
96
|
-
//
|
|
97
|
-
//
|
|
98
|
-
// The budget must outlast a single AV real-time scan pass (seconds, not hundreds of ms):
|
|
99
|
-
// the previous ~910ms budget was exhausted twice in a row by the same test on a CI runner
|
|
100
|
-
// (harper#2036), so the worst case is now ~3.6s.
|
|
100
|
+
// EPERM/EACCES while another descriptor is open on the destination. The sleep below blocks the
|
|
101
|
+
// calling thread, so this can only ride out a holder that releases without needing that
|
|
102
|
+
// thread's event loop. A holder on the calling thread would live exactly as long as the budget,
|
|
103
|
+
// which is why config readers must not keep a descriptor on this file open across an event-loop
|
|
104
|
+
// turn (RootConfigWatcher.handleChange, OptionsWatcher#handleChange).
|
|
101
105
|
const RENAME_RETRY_MAX_ATTEMPTS = 12;
|
|
102
106
|
const RENAME_RETRY_INITIAL_DELAY_MS = 10;
|
|
103
107
|
const RENAME_RETRY_MAX_DELAY_MS = 500;
|
|
104
108
|
// Never notified; exists only so Atomics.wait can time out (a synchronous, CPU-idle sleep).
|
|
105
109
|
const renameRetrySleepBuffer = new Int32Array(new SharedArrayBuffer(4));
|
|
106
110
|
|
|
111
|
+
// Linux has no libuv mapping for EDQUOT, so a quota-exhausted write surfaces as
|
|
112
|
+
// `Unknown system error -122` with an unusable `code`; the numeric errno is the portable signal
|
|
113
|
+
// (EDQUOT is 122 on Linux, 69 on macOS).
|
|
114
|
+
const STORAGE_EXHAUSTED_CODES = new Set(['ENOSPC', 'EDQUOT']);
|
|
115
|
+
// EDQUOT is absent from os.constants.errno on platforms without quotas, so filter before negating:
|
|
116
|
+
// -undefined is NaN, which would sit in the set matching nothing and reading as a bug.
|
|
117
|
+
const STORAGE_EXHAUSTED_ERRNOS = new Set(
|
|
118
|
+
[osConstants.errno.ENOSPC, osConstants.errno.EDQUOT].filter((errno) => errno !== undefined).map((errno) => -errno)
|
|
119
|
+
);
|
|
120
|
+
|
|
121
|
+
export function isStorageExhausted(error): boolean {
|
|
122
|
+
return STORAGE_EXHAUSTED_CODES.has(error?.code) || STORAGE_EXHAUSTED_ERRNOS.has(error?.errno);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// Boot-path persistence of derived config is best-effort: on an exhausted volume a fatal write here
|
|
126
|
+
// is an un-breakable restart loop, because freeing space needs a started process (#847).
|
|
127
|
+
export function persistConfigDuringBoot(artifactPath: string, write: () => void): boolean {
|
|
128
|
+
try {
|
|
129
|
+
write();
|
|
130
|
+
return true;
|
|
131
|
+
} catch (error) {
|
|
132
|
+
if (!isStorageExhausted(error)) throw error;
|
|
133
|
+
logger.error(
|
|
134
|
+
`Storage exhausted (${error.code ?? error.errno}) writing ${artifactPath}; continuing startup with the in-memory configuration. The file on disk is unchanged - free space on the Harper volume to restore config persistence.`
|
|
135
|
+
);
|
|
136
|
+
return false;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
// Returns true when the file was written, false when an unchanged write was skipped.
|
|
107
141
|
export function atomicWriteFile(
|
|
108
142
|
filePath,
|
|
109
143
|
content,
|
|
@@ -111,16 +145,47 @@ export function atomicWriteFile(
|
|
|
111
145
|
maxRetries = RENAME_RETRY_MAX_ATTEMPTS,
|
|
112
146
|
initialDelayMs = RENAME_RETRY_INITIAL_DELAY_MS,
|
|
113
147
|
maxDelayMs = RENAME_RETRY_MAX_DELAY_MS,
|
|
148
|
+
skipIfUnchanged = false,
|
|
114
149
|
} = {}
|
|
115
150
|
) {
|
|
151
|
+
// Opt-in: skipping means no mtime bump, so no watcher event. Only callers that re-derive the
|
|
152
|
+
// same file every boot want that.
|
|
153
|
+
if (skipIfUnchanged && matchesFileContent(filePath, content)) return false;
|
|
116
154
|
const tempPath = `${filePath}.${process.pid}.${threadId}.${randomBytes(4).toString('hex')}.tmp`;
|
|
117
|
-
|
|
155
|
+
try {
|
|
156
|
+
fs.writeFileSync(tempPath, content);
|
|
157
|
+
} catch (err) {
|
|
158
|
+
// The open succeeds before the write runs out of room, leaving the temp file behind.
|
|
159
|
+
removeTempFile(tempPath);
|
|
160
|
+
throw err;
|
|
161
|
+
}
|
|
162
|
+
try {
|
|
163
|
+
renameWithRetry(tempPath, filePath, { maxRetries, initialDelayMs, maxDelayMs });
|
|
164
|
+
} catch (err) {
|
|
165
|
+
removeTempFile(tempPath);
|
|
166
|
+
throw err;
|
|
167
|
+
}
|
|
168
|
+
return true;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
export function renameWithRetry(
|
|
172
|
+
fromPath,
|
|
173
|
+
toPath,
|
|
174
|
+
{
|
|
175
|
+
maxRetries = RENAME_RETRY_MAX_ATTEMPTS,
|
|
176
|
+
initialDelayMs = RENAME_RETRY_INITIAL_DELAY_MS,
|
|
177
|
+
maxDelayMs = RENAME_RETRY_MAX_DELAY_MS,
|
|
178
|
+
} = {}
|
|
179
|
+
) {
|
|
118
180
|
let retries = maxRetries;
|
|
119
181
|
let delayMs = initialDelayMs;
|
|
182
|
+
let attempts = 0;
|
|
183
|
+
const startedAt = Date.now();
|
|
120
184
|
while (true) {
|
|
121
185
|
try {
|
|
122
|
-
|
|
123
|
-
|
|
186
|
+
attempts++;
|
|
187
|
+
fs.renameSync(fromPath, toPath);
|
|
188
|
+
return;
|
|
124
189
|
} catch (err) {
|
|
125
190
|
if (retries > 0 && (err.code === 'EPERM' || err.code === 'EACCES')) {
|
|
126
191
|
retries--;
|
|
@@ -131,17 +196,35 @@ export function atomicWriteFile(
|
|
|
131
196
|
delayMs = Math.min(delayMs * 2, maxDelayMs);
|
|
132
197
|
continue;
|
|
133
198
|
}
|
|
134
|
-
//
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
199
|
+
// Attempts and elapsed distinguish a holder that never released from one that lost
|
|
200
|
+
// a race, and neither survives on the rethrown error.
|
|
201
|
+
if (err.code === 'EPERM' || err.code === 'EACCES') {
|
|
202
|
+
logger.warn(
|
|
203
|
+
`Could not replace ${toPath}: ${err.code} after ${attempts} attempts over ${Date.now() - startedAt}ms`
|
|
204
|
+
);
|
|
139
205
|
}
|
|
140
206
|
throw err;
|
|
141
207
|
}
|
|
142
208
|
}
|
|
143
209
|
}
|
|
144
210
|
|
|
211
|
+
function removeTempFile(tempPath) {
|
|
212
|
+
try {
|
|
213
|
+
fs.unlinkSync(tempPath);
|
|
214
|
+
} catch {
|
|
215
|
+
// ignore cleanup errors
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
function matchesFileContent(filePath, content): boolean {
|
|
220
|
+
if (typeof content !== 'string') return false;
|
|
221
|
+
try {
|
|
222
|
+
return fs.readFileSync(filePath, 'utf8') === content;
|
|
223
|
+
} catch {
|
|
224
|
+
return false;
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
|
|
145
228
|
/**
|
|
146
229
|
* Builds the Harper config file using user inputs and default values from defaultConfig.yaml
|
|
147
230
|
* @param args - any args that the user provided.
|
|
@@ -154,7 +237,7 @@ export function createConfigFile(args, skipFsValidation = false) {
|
|
|
154
237
|
// Loop through the user inputted args. Match them to a parameter in the default config file and update value.
|
|
155
238
|
let schemasArgs;
|
|
156
239
|
for (const arg in args) {
|
|
157
|
-
let configParam =
|
|
240
|
+
let configParam = lookupConfigParam(arg);
|
|
158
241
|
|
|
159
242
|
// Schemas config args are handled differently, so if they exist set them to var that will be used by setSchemasConfig
|
|
160
243
|
if (configParam === CONFIG_PARAMS.DATABASES) {
|
|
@@ -169,7 +252,7 @@ export function createConfigFile(args, skipFsValidation = false) {
|
|
|
169
252
|
continue;
|
|
170
253
|
}
|
|
171
254
|
|
|
172
|
-
if (!configParam && (arg
|
|
255
|
+
if (!configParam && isSuffixEscapedParam(arg)) {
|
|
173
256
|
configParam = arg;
|
|
174
257
|
}
|
|
175
258
|
|
|
@@ -273,7 +356,7 @@ export function getDefaultConfig(param: string) {
|
|
|
273
356
|
flatDefaultConfigObj = flattenConfig(configDoc.toJSON());
|
|
274
357
|
}
|
|
275
358
|
|
|
276
|
-
const paramMap =
|
|
359
|
+
const paramMap = lookupConfigParam(param);
|
|
277
360
|
if (paramMap === undefined) return undefined;
|
|
278
361
|
|
|
279
362
|
return flatDefaultConfigObj[paramMap.toLowerCase()];
|
|
@@ -297,7 +380,7 @@ export function getConfigValue(param: string | null | undefined) {
|
|
|
297
380
|
return undefined;
|
|
298
381
|
}
|
|
299
382
|
|
|
300
|
-
const paramMap =
|
|
383
|
+
const paramMap = lookupConfigParam(param);
|
|
301
384
|
if (paramMap === undefined) return undefined;
|
|
302
385
|
|
|
303
386
|
return flatConfigObj[paramMap.toLowerCase()];
|
|
@@ -352,7 +435,10 @@ export function ensureConfigKeysPresent(keys: string[]): string[] {
|
|
|
352
435
|
}
|
|
353
436
|
if (added.length === 0) return [];
|
|
354
437
|
|
|
355
|
-
|
|
438
|
+
// Worker threads re-read the config from disk and never run this backfill, so a key that only
|
|
439
|
+
// exists in this thread's memory activates nowhere that serves requests: report nothing when the
|
|
440
|
+
// write was refused rather than logging an activation the request path did not get.
|
|
441
|
+
if (!persistConfigDuringBoot(configFilePath, () => atomicWriteFile(configFilePath, String(configDoc)))) return [];
|
|
356
442
|
|
|
357
443
|
// Mirror the additions into the already-memoized config so a built-in gated on the new key
|
|
358
444
|
// activates on the CURRENT boot: componentLoader reads the root config from getConfigObj(),
|
|
@@ -572,7 +658,7 @@ function checkForUpdatedConfig(configDoc, configFilePath) {
|
|
|
572
658
|
HTTP_STATUS_CODES.INTERNAL_SERVER_ERROR
|
|
573
659
|
);
|
|
574
660
|
}
|
|
575
|
-
atomicWriteFile(configFilePath, String(configDoc));
|
|
661
|
+
persistConfigDuringBoot(configFilePath, () => atomicWriteFile(configFilePath, String(configDoc)));
|
|
576
662
|
}
|
|
577
663
|
}
|
|
578
664
|
|
|
@@ -676,6 +762,10 @@ function validateConfig(configDoc, skipFsValidation = false) {
|
|
|
676
762
|
configDoc.setIn(['operationsApi', 'network', 'domainSocket'], domainSocket);
|
|
677
763
|
const domainSocketWarning = getDomainSocketPathLengthWarning(validation.value.rootPath, domainSocket);
|
|
678
764
|
if (domainSocketWarning) logger.warn(domainSocketWarning);
|
|
765
|
+
if (isLegacySqlApplicationEntry(configJson.sql))
|
|
766
|
+
logger.warn(
|
|
767
|
+
"The root config entry 'sql' is an application, but 'sql' now configures Harper's SQL engine. Redeploy that application under a different name and remove the 'sql' entry; until then the SQL engine settings cannot be configured."
|
|
768
|
+
);
|
|
679
769
|
}
|
|
680
770
|
|
|
681
771
|
/**
|
|
@@ -690,7 +780,7 @@ export function updateConfigObject(param: string, value: any) {
|
|
|
690
780
|
flatConfigObj = {};
|
|
691
781
|
}
|
|
692
782
|
|
|
693
|
-
const configObjKey =
|
|
783
|
+
const configObjKey = lookupConfigParam(param);
|
|
694
784
|
if (configObjKey === undefined) {
|
|
695
785
|
logger.trace(`Unable to update config object because config param '${param}' does not exist`);
|
|
696
786
|
return;
|
|
@@ -734,6 +824,71 @@ export function updateConfigObject(param: string, value: any) {
|
|
|
734
824
|
}
|
|
735
825
|
}
|
|
736
826
|
|
|
827
|
+
/**
|
|
828
|
+
* Canonical config param for an arg name, or `undefined` when the name is not a config param.
|
|
829
|
+
* `Object.hasOwn` because a bare lookup resolves inherited names: `constructor` yields an
|
|
830
|
+
* `Object.prototype` member that then fails `.split('_')` or `.toLowerCase()`.
|
|
831
|
+
*/
|
|
832
|
+
function lookupConfigParam(arg: string): string | undefined {
|
|
833
|
+
if (typeof arg !== 'string') return undefined;
|
|
834
|
+
const name = arg.toLowerCase();
|
|
835
|
+
return Object.hasOwn(CONFIG_PARAM_MAP, name) ? CONFIG_PARAM_MAP[name] : undefined;
|
|
836
|
+
}
|
|
837
|
+
|
|
838
|
+
const COMPONENT_PARAM_SUFFIXES = ['_package', '_port'];
|
|
839
|
+
|
|
840
|
+
function suffixEscapedComponentName(arg: string): string | undefined {
|
|
841
|
+
if (typeof arg !== 'string') return undefined;
|
|
842
|
+
const suffix = COMPONENT_PARAM_SUFFIXES.find((candidate) => arg.endsWith(candidate));
|
|
843
|
+
if (suffix === undefined) return undefined;
|
|
844
|
+
const component = arg.slice(0, -suffix.length);
|
|
845
|
+
return component === '' ? undefined : component;
|
|
846
|
+
}
|
|
847
|
+
|
|
848
|
+
/**
|
|
849
|
+
* Component entries (`my-component_package`, `my-component_port`) are operator-named, so they
|
|
850
|
+
* cannot be enumerated in CONFIG_PARAM_MAP and bypass it. This escape is the one way to write a
|
|
851
|
+
* root component entry without going through deploy_component, so a reserved name is excluded.
|
|
852
|
+
*/
|
|
853
|
+
function isSuffixEscapedParam(arg: string): boolean {
|
|
854
|
+
const component = suffixEscapedComponentName(arg);
|
|
855
|
+
return component !== undefined && !isReservedComponentName(component);
|
|
856
|
+
}
|
|
857
|
+
|
|
858
|
+
function findReservedComponentParams(args: object): string[] {
|
|
859
|
+
const reserved = [];
|
|
860
|
+
for (const arg in args) {
|
|
861
|
+
if (!Object.hasOwn(args, arg)) continue;
|
|
862
|
+
const component = suffixEscapedComponentName(arg);
|
|
863
|
+
if (component !== undefined && isReservedComponentName(component)) reserved.push(arg);
|
|
864
|
+
}
|
|
865
|
+
return reserved;
|
|
866
|
+
}
|
|
867
|
+
|
|
868
|
+
const MAX_REPORTED_UNRECOGNIZED = 10;
|
|
869
|
+
|
|
870
|
+
/**
|
|
871
|
+
* Render unrecognized names for an error that also reaches the operations log: control characters
|
|
872
|
+
* are stripped so a name containing a newline cannot forge a log line, and the list is capped so a
|
|
873
|
+
* body carrying thousands of unknown keys cannot produce an unbounded message.
|
|
874
|
+
*/
|
|
875
|
+
function describeUnrecognized(names: string[]): string {
|
|
876
|
+
const shown = names
|
|
877
|
+
.slice(0, MAX_REPORTED_UNRECOGNIZED)
|
|
878
|
+
// eslint-disable-next-line no-control-regex
|
|
879
|
+
.map((name) => name.replace(/[\u0000-\u001f\u007f]/g, '?'));
|
|
880
|
+
const remaining = names.length - shown.length;
|
|
881
|
+
return remaining > 0 ? `${shown.join(', ')} (and ${remaining} more)` : shown.join(', ');
|
|
882
|
+
}
|
|
883
|
+
|
|
884
|
+
function findUnrecognizedParams(args: object): string[] {
|
|
885
|
+
let unrecognized;
|
|
886
|
+
for (const arg in args) {
|
|
887
|
+
if (lookupConfigParam(arg) === undefined && !isSuffixEscapedParam(arg)) (unrecognized ??= []).push(arg);
|
|
888
|
+
}
|
|
889
|
+
return unrecognized ?? [];
|
|
890
|
+
}
|
|
891
|
+
|
|
737
892
|
/**
|
|
738
893
|
* Updates and validates a config value in config file. Can also create a backup of config before updating.
|
|
739
894
|
* @param param - the config value to update
|
|
@@ -794,7 +949,7 @@ export function updateConfigValue(
|
|
|
794
949
|
if (skipParamMap) {
|
|
795
950
|
configParam = param;
|
|
796
951
|
} else {
|
|
797
|
-
configParam =
|
|
952
|
+
configParam = lookupConfigParam(param);
|
|
798
953
|
if (configParam === undefined) {
|
|
799
954
|
throw handleHDBError(
|
|
800
955
|
new Error(),
|
|
@@ -813,7 +968,7 @@ export function updateConfigValue(
|
|
|
813
968
|
} else {
|
|
814
969
|
// Loop through the user inputted args. Match them to a parameter in the default config file and update value.
|
|
815
970
|
for (const arg in parsedArgs) {
|
|
816
|
-
let configParam =
|
|
971
|
+
let configParam = lookupConfigParam(arg);
|
|
817
972
|
|
|
818
973
|
// If setting http.securePort to the same value as http.port, set http.port to null to avoid clashing ports
|
|
819
974
|
if (
|
|
@@ -845,7 +1000,7 @@ export function updateConfigValue(
|
|
|
845
1000
|
}
|
|
846
1001
|
}
|
|
847
1002
|
|
|
848
|
-
if (!configParam && (arg
|
|
1003
|
+
if (!configParam && isSuffixEscapedParam(arg)) {
|
|
849
1004
|
configParam = arg;
|
|
850
1005
|
}
|
|
851
1006
|
|
|
@@ -1039,14 +1194,54 @@ export function getConfiguration() {
|
|
|
1039
1194
|
return configDoc.toJSON();
|
|
1040
1195
|
}
|
|
1041
1196
|
|
|
1197
|
+
// `set_configuration` is the one config writer that also fans out (`replicated: true`), so a value
|
|
1198
|
+
// accepted here lands on every peer at once and the next rolling restart takes the whole cluster
|
|
1199
|
+
// down together (harper-pro#558). Boot-time writers are deliberately not gated the same way: config
|
|
1200
|
+
// that already exists has to stay bootable, so it is recovered at the point of use instead
|
|
1201
|
+
// (server/threads/threadHeapMemory.ts).
|
|
1202
|
+
function assertThreadHeapMemoryStartable(configFields) {
|
|
1203
|
+
for (const field in configFields) {
|
|
1204
|
+
const configParam = CONFIG_PARAM_MAP[field.toLowerCase()];
|
|
1205
|
+
let configured;
|
|
1206
|
+
if (configParam === CONFIG_PARAMS.THREADS_MAXHEAPMEMORY) configured = configFields[field];
|
|
1207
|
+
else if (configParam === CONFIG_PARAMS.THREADS) configured = readSectionHeapMemory(configFields[field]);
|
|
1208
|
+
else continue;
|
|
1209
|
+
const value = castConfigValue(CONFIG_PARAMS.THREADS_MAXHEAPMEMORY, configured);
|
|
1210
|
+
if (typeof value !== 'number' || isStartableThreadHeapMemory(value)) continue;
|
|
1211
|
+
throw handleHDBError(
|
|
1212
|
+
new Error(),
|
|
1213
|
+
HDB_ERROR_MSGS.CONFIG_VALIDATION(
|
|
1214
|
+
`'threads.maxHeapMemory' must be greater than or equal to ${hdbTerms.MIN_THREAD_HEAP_MEMORY_MB}`
|
|
1215
|
+
),
|
|
1216
|
+
HTTP_STATUS_CODES.BAD_REQUEST,
|
|
1217
|
+
undefined,
|
|
1218
|
+
undefined,
|
|
1219
|
+
true
|
|
1220
|
+
);
|
|
1221
|
+
}
|
|
1222
|
+
}
|
|
1223
|
+
|
|
1224
|
+
// A whole `threads` section reaches the same config key, and `threads` canonicalizes to itself
|
|
1225
|
+
// rather than to `threads_count`. It arrives either as an object or as the JSON string
|
|
1226
|
+
// castConfigValue parses, and flattenConfig lowercases every key on the way back out, so the nested
|
|
1227
|
+
// name has to be matched the same way the top-level one is.
|
|
1228
|
+
function readSectionHeapMemory(section) {
|
|
1229
|
+
const parsed = castConfigValue(CONFIG_PARAMS.THREADS, section);
|
|
1230
|
+
if (!hdbUtils.isObject(parsed)) return undefined;
|
|
1231
|
+
for (const key in parsed) if (key.toLowerCase() === 'maxheapmemory') return parsed[key];
|
|
1232
|
+
}
|
|
1233
|
+
|
|
1042
1234
|
/**
|
|
1043
1235
|
* Set Configuration - this function sets new configuration
|
|
1044
1236
|
* @param setConfigJson
|
|
1045
1237
|
|
|
1046
1238
|
*/
|
|
1047
1239
|
export async function setConfiguration(setConfigJson) {
|
|
1240
|
+
// `hdb_auth_header` is the 4.x spelling of `hdbAuthHeader`, and `impersonate` is a generic
|
|
1241
|
+
// operation-body field (server/operationsServer.ts): control fields, never config params.
|
|
1048
1242
|
// eslint-disable-next-line no-unused-vars
|
|
1049
|
-
const { operation, hdb_user, hdbAuthHeader, replicated, ...configFields } =
|
|
1243
|
+
const { operation, hdb_user, hdbAuthHeader, hdb_auth_header, impersonate, replicated, ...configFields } =
|
|
1244
|
+
setConfigJson;
|
|
1050
1245
|
// Operation-control field, not a config param: enforce boolean (matching other
|
|
1051
1246
|
// `replicated` surfaces, e.g. analyticsValidator) before any local write so a
|
|
1052
1247
|
// malformed value like the string "false" — which is truthy — can't apply config
|
|
@@ -1061,6 +1256,32 @@ export async function setConfiguration(setConfigJson) {
|
|
|
1061
1256
|
true
|
|
1062
1257
|
);
|
|
1063
1258
|
}
|
|
1259
|
+
const reservedComponentParams = findReservedComponentParams(configFields);
|
|
1260
|
+
if (reservedComponentParams.length > 0) {
|
|
1261
|
+
throw handleHDBError(
|
|
1262
|
+
new Error(),
|
|
1263
|
+
`Unable to update config, cannot configure a component whose name is reserved for Harper's own configuration section: ${describeUnrecognized(reservedComponentParams)}`,
|
|
1264
|
+
HTTP_STATUS_CODES.BAD_REQUEST,
|
|
1265
|
+
undefined,
|
|
1266
|
+
undefined,
|
|
1267
|
+
true
|
|
1268
|
+
);
|
|
1269
|
+
}
|
|
1270
|
+
// Before any local write: the writer skips names it cannot resolve, so a request mixing
|
|
1271
|
+
// recognized and unrecognized names would otherwise apply the recognized half and still report
|
|
1272
|
+
// success.
|
|
1273
|
+
const unrecognized = findUnrecognizedParams(configFields);
|
|
1274
|
+
if (unrecognized.length > 0) {
|
|
1275
|
+
throw handleHDBError(
|
|
1276
|
+
new Error(),
|
|
1277
|
+
`Unable to update config, unrecognized config parameter${unrecognized.length > 1 ? 's' : ''}: ${describeUnrecognized(unrecognized)}`,
|
|
1278
|
+
HTTP_STATUS_CODES.BAD_REQUEST,
|
|
1279
|
+
undefined,
|
|
1280
|
+
undefined,
|
|
1281
|
+
true
|
|
1282
|
+
);
|
|
1283
|
+
}
|
|
1284
|
+
assertThreadHeapMemoryStartable(configFields);
|
|
1064
1285
|
try {
|
|
1065
1286
|
updateConfigValue(undefined, undefined, configFields, true);
|
|
1066
1287
|
if (replicated) {
|
|
@@ -1151,9 +1372,16 @@ function applyRuntimeEnvVarConfig(configDoc, configFilePath, options = {}) {
|
|
|
1151
1372
|
// Convert to JSON for processing
|
|
1152
1373
|
const configObj = configDoc.toJSON();
|
|
1153
1374
|
|
|
1375
|
+
let saveEnvConfigState;
|
|
1376
|
+
let confirmEnvConfigState;
|
|
1377
|
+
let commitEnvConfigState;
|
|
1154
1378
|
try {
|
|
1155
1379
|
// Apply env vars with source tracking and drift detection
|
|
1156
|
-
|
|
1380
|
+
({
|
|
1381
|
+
saveState: saveEnvConfigState,
|
|
1382
|
+
confirmConfigWritten: confirmEnvConfigState,
|
|
1383
|
+
commitState: commitEnvConfigState,
|
|
1384
|
+
} = prepareRuntimeEnvConfig(configObj, rootPath, options));
|
|
1157
1385
|
|
|
1158
1386
|
// If securePort was set to the same value as port, auto-null port to avoid clashing
|
|
1159
1387
|
if (configObj.http?.port && configObj.http?.port === configObj.http?.securePort) {
|
|
@@ -1185,11 +1413,18 @@ function applyRuntimeEnvVarConfig(configDoc, configFilePath, options = {}) {
|
|
|
1185
1413
|
throw error;
|
|
1186
1414
|
}
|
|
1187
1415
|
|
|
1188
|
-
//
|
|
1416
|
+
// Install has no config file yet and no process to keep alive, so its snapshot write stays
|
|
1417
|
+
// mandatory - an install that never recorded originals should fail, not proceed.
|
|
1189
1418
|
if (!configFilePath) {
|
|
1419
|
+
commitEnvConfigState();
|
|
1190
1420
|
return;
|
|
1191
1421
|
}
|
|
1192
1422
|
|
|
1423
|
+
// Every worker thread runs initConfig and derives the same merged config, so letting them all
|
|
1424
|
+
// persist it means N threads racing over one pair of files for a result they already agree on.
|
|
1425
|
+
// The main thread owns the on-disk copy; a worker runs on the in-memory one.
|
|
1426
|
+
if (!isMainThread) return;
|
|
1427
|
+
|
|
1193
1428
|
// Persist changes to file
|
|
1194
1429
|
try {
|
|
1195
1430
|
if (configDoc.errors?.length > 0) {
|
|
@@ -1199,8 +1434,30 @@ function applyRuntimeEnvVarConfig(configDoc, configFilePath, options = {}) {
|
|
|
1199
1434
|
HTTP_STATUS_CODES.INTERNAL_SERVER_ERROR
|
|
1200
1435
|
);
|
|
1201
1436
|
}
|
|
1202
|
-
|
|
1203
|
-
|
|
1437
|
+
// Stage, write the file, promote by rename: the confirmed state is the only record of the
|
|
1438
|
+
// file's pre-env values, so no write an exhausted volume can refuse may stand between it and
|
|
1439
|
+
// disk. See DESIGN.md, boot-path config persistence.
|
|
1440
|
+
let stateStaged = false;
|
|
1441
|
+
if (persistConfigDuringBoot(`${rootPath} env config state`, () => (stateStaged = saveEnvConfigState()))) {
|
|
1442
|
+
let configPersisted = false;
|
|
1443
|
+
let configRewritten = false;
|
|
1444
|
+
try {
|
|
1445
|
+
configPersisted = persistConfigDuringBoot(configFilePath, () => {
|
|
1446
|
+
configRewritten = atomicWriteFile(configFilePath, String(configDoc), { skipIfUnchanged: true });
|
|
1447
|
+
});
|
|
1448
|
+
} finally {
|
|
1449
|
+
if (!configPersisted && stateStaged) discardConfigState(rootPath as string);
|
|
1450
|
+
}
|
|
1451
|
+
if (configPersisted) {
|
|
1452
|
+
if (stateStaged) confirmEnvConfigState();
|
|
1453
|
+
// Distinguished, because this is the line that answers "did something rewrite my config?"
|
|
1454
|
+
logger.debug(
|
|
1455
|
+
configRewritten
|
|
1456
|
+
? 'Config file updated with runtime env var values'
|
|
1457
|
+
: 'Config file already matched the runtime env var values'
|
|
1458
|
+
);
|
|
1459
|
+
}
|
|
1460
|
+
}
|
|
1204
1461
|
} catch (error) {
|
|
1205
1462
|
logger.error(`Failed to write config file after applying runtime env vars: ${error.message}`);
|
|
1206
1463
|
throw error;
|