@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
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { ClientError } from '../utility/errors/hdbError.ts';
|
|
2
|
+
import { serializeMessage, findBestSerializer } from '../server/serverHelpers/contentTypes.ts';
|
|
3
|
+
import { Headers } from '../server/serverHelpers/Headers.ts';
|
|
4
|
+
|
|
5
|
+
export { isCredentialRejection, markCredentialRejection, credentialRejectionError } from './credentialRejection.ts';
|
|
6
|
+
|
|
7
|
+
const DEFERRED_CREDENTIAL_REJECTION = Symbol('harper.deferredCredentialRejection');
|
|
8
|
+
|
|
9
|
+
export type DeferredCredentialRejection = {
|
|
10
|
+
readonly status: number;
|
|
11
|
+
readonly message: string;
|
|
12
|
+
readonly strategy: string;
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
const CREDENTIAL_REJECTION_STATUS = 401;
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Records that this request presented a credential Harper rejected, without deciding the request.
|
|
19
|
+
* The caller leaves `request.user` unset and the inbound `Authorization` header untouched.
|
|
20
|
+
*
|
|
21
|
+
* The immutable, non-enumerable descriptor prevents downstream middleware from clearing it and
|
|
22
|
+
* keeps it out of request copies and serialization.
|
|
23
|
+
*/
|
|
24
|
+
export function deferCredentialRejection(request: any, error: { message?: string }, strategy: string): void {
|
|
25
|
+
if (getDeferredCredentialRejection(request)) return;
|
|
26
|
+
const deferred: DeferredCredentialRejection = Object.freeze({
|
|
27
|
+
status: CREDENTIAL_REJECTION_STATUS,
|
|
28
|
+
message: error?.message ?? 'Unauthorized',
|
|
29
|
+
strategy,
|
|
30
|
+
});
|
|
31
|
+
Object.defineProperty(request, DEFERRED_CREDENTIAL_REJECTION, {
|
|
32
|
+
value: deferred,
|
|
33
|
+
enumerable: false,
|
|
34
|
+
configurable: false,
|
|
35
|
+
writable: false,
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export function getDeferredCredentialRejection(request: any): DeferredCredentialRejection | undefined {
|
|
40
|
+
return request?.[DEFERRED_CREDENTIAL_REJECTION];
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* The response an owning layer returns once it has established Harper owns the route: exactly the
|
|
45
|
+
* descriptor `security/auth.ts` returns in-line, so immediate and deferred rejection share a wire
|
|
46
|
+
* contract.
|
|
47
|
+
*
|
|
48
|
+
* Owner-specific error mapping must not run first. REST renders a thrown error as an RFC 9457
|
|
49
|
+
* Problem Details document and GraphQL as `{errors:[…]}` rather than authentication's negotiated
|
|
50
|
+
* `{error: message}` response. `security/auth.ts` likewise leaves a settled rejection's status and
|
|
51
|
+
* challenge headers alone, so it stays byte-identical to the in-line 401 it replaced.
|
|
52
|
+
*
|
|
53
|
+
* Returns `undefined` when nothing was deferred, so a caller can `return settled ?? …` inline.
|
|
54
|
+
*/
|
|
55
|
+
export function settleDeferredCredentialRejection(
|
|
56
|
+
request: any
|
|
57
|
+
): { status: number; headers: Headers; body: string | Buffer } | undefined {
|
|
58
|
+
const deferred = getDeferredCredentialRejection(request);
|
|
59
|
+
if (!deferred) return undefined;
|
|
60
|
+
const contentType = (request?.headers ? findBestSerializer(request).type : undefined) ?? 'application/json';
|
|
61
|
+
return {
|
|
62
|
+
status: deferred.status,
|
|
63
|
+
headers: new Headers({ 'Content-Type': contentType }),
|
|
64
|
+
body: serializeMessage({ error: deferred.message }, request) as string | Buffer,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export function assertNoDeferredCredentialRejection(request: any): void {
|
|
69
|
+
const deferred = getDeferredCredentialRejection(request);
|
|
70
|
+
if (deferred) throw new ClientError(deferred.message, deferred.status);
|
|
71
|
+
}
|
|
@@ -1,10 +1,46 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import type { User, UserRole } from './user.ts';
|
|
2
3
|
import type { ImpersonatePayload } from '../server/operationsServer.ts';
|
|
3
4
|
import { getUsersWithRolesCache } from './user.ts';
|
|
4
5
|
import { validateOperations } from '../utility/operationPermissions.ts';
|
|
6
|
+
import { addRoleValidation } from '../validation/role_validation.ts';
|
|
5
7
|
import { ClientError } from '../utility/errors/hdbError.ts';
|
|
6
8
|
import harperLogger from '../utility/logging/harper_logger.ts';
|
|
7
9
|
import { getRoleByName } from './role.ts';
|
|
10
|
+
import { attachScopeToUser } from './operationScope.ts';
|
|
11
|
+
import { attachWorkloadIdentityToUser } from './credentialProvenance.ts';
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Content-derived identity for synthetic (inline) roles. getRolePermissions memoizes translated
|
|
15
|
+
* permissions by role name, so synthetic roles must never share a constant name: two inline roles
|
|
16
|
+
* with different permissions would alias in that cache and leak permissions across principals.
|
|
17
|
+
* Hashing the (already downgraded) permission content isolates distinct permission sets while
|
|
18
|
+
* letting identical ones share a cache entry. The paired __updatedtime__ of 0 keeps the memo key
|
|
19
|
+
* stable across requests; the content hash in the name is what invalidates on permission change.
|
|
20
|
+
*
|
|
21
|
+
* Object keys are canonicalized before hashing so two structurally-identical permission sets that
|
|
22
|
+
* differ only in key order (e.g. from different client request shapes) map to the same name and
|
|
23
|
+
* share one cache slot — otherwise they would each consume a distinct slot (never an aliasing bug,
|
|
24
|
+
* but it worsens the bounded synthetic-role cache pressure).
|
|
25
|
+
*/
|
|
26
|
+
export function syntheticRoleName(prefix: string, permission: object): string {
|
|
27
|
+
return `${prefix}_${createHash('sha256').update(canonicalJSON(permission)).digest('hex').slice(0, 24)}`;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// Array order is intentionally preserved: operations is order-insensitive semantically, but
|
|
31
|
+
// canonicalizing it too would be a broader behavior change than this cache-sharing fix needs.
|
|
32
|
+
function canonicalJSON(value: any): string {
|
|
33
|
+
return JSON.stringify(value, (_key, v) =>
|
|
34
|
+
v && typeof v === 'object' && !Array.isArray(v)
|
|
35
|
+
? Object.keys(v)
|
|
36
|
+
.sort()
|
|
37
|
+
.reduce((acc: any, k) => {
|
|
38
|
+
acc[k] = v[k];
|
|
39
|
+
return acc;
|
|
40
|
+
}, {})
|
|
41
|
+
: v
|
|
42
|
+
);
|
|
43
|
+
}
|
|
8
44
|
|
|
9
45
|
/**
|
|
10
46
|
* Applies impersonation to a request. The authenticated user must be a super_user.
|
|
@@ -38,6 +74,26 @@ export async function applyImpersonation(authenticatedUser: User, payload: Imper
|
|
|
38
74
|
// Enforce downgrade: never allow escalation
|
|
39
75
|
enforceDowngrade(impersonatedUser);
|
|
40
76
|
|
|
77
|
+
// A token's operation scope (#2174) constrains the credential regardless of which principal it
|
|
78
|
+
// acts as, so it survives impersonation. enforceDowngrade only bounds the impersonated role's
|
|
79
|
+
// permissions; without carrying the scope, a scoped super_user token would shed it by impersonating.
|
|
80
|
+
attachScopeToUser(impersonatedUser, (authenticatedUser as any).tokenOperations);
|
|
81
|
+
// Same reasoning for provenance (#2171), and the omission would be worse: impersonation returns a
|
|
82
|
+
// NEW principal, so dropping the marker here would let a workload token impersonate — even down to
|
|
83
|
+
// a lesser role — and then mint a 30-day credential that createTokens would no longer refuse.
|
|
84
|
+
attachWorkloadIdentityToUser(impersonatedUser, (authenticatedUser as any).fromWorkloadIdentity);
|
|
85
|
+
|
|
86
|
+
// Re-key the synthetic role by its effective (post-downgrade) content so it can never alias
|
|
87
|
+
// another impersonation's permissions or poison a persisted role's memoized translation —
|
|
88
|
+
// getRolePermissions caches by role name (see syntheticRoleName).
|
|
89
|
+
if (impersonatedUser.role) {
|
|
90
|
+
impersonatedUser.role = {
|
|
91
|
+
...impersonatedUser.role,
|
|
92
|
+
role: syntheticRoleName('_impersonated', impersonatedUser.role.permission),
|
|
93
|
+
__updatedtime__: 0,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
|
|
41
97
|
// Tag for audit trail
|
|
42
98
|
impersonatedUser._impersonated = true;
|
|
43
99
|
impersonatedUser._impersonatedBy = authenticatedUser.username;
|
|
@@ -49,9 +105,60 @@ export async function applyImpersonation(authenticatedUser: User, payload: Imper
|
|
|
49
105
|
return impersonatedUser;
|
|
50
106
|
}
|
|
51
107
|
|
|
52
|
-
|
|
108
|
+
/**
|
|
109
|
+
* Builds the synthetic user embedded in a scoped authentication token
|
|
110
|
+
* (create_authentication_tokens with an inline `role` object). Same gate and downgrade rules as
|
|
111
|
+
* impersonation Mode A. `trusted` marks internal dispatch (operation authorization bypassed),
|
|
112
|
+
* where no authenticated minter exists.
|
|
113
|
+
*/
|
|
114
|
+
export async function buildScopedTokenUser(
|
|
115
|
+
minter: User | undefined,
|
|
116
|
+
payload: ImpersonatePayload,
|
|
117
|
+
trusted = false
|
|
118
|
+
): Promise<User> {
|
|
119
|
+
if (!trusted && !minter?.role?.permission?.super_user) {
|
|
120
|
+
throw new ClientError('Only super_user can create a token with an inline role', 403);
|
|
121
|
+
}
|
|
122
|
+
validatePayload(payload, 'scoped token role');
|
|
123
|
+
if (!payload.role) {
|
|
124
|
+
throw new ClientError("A scoped token requires 'role' with 'permission'");
|
|
125
|
+
}
|
|
126
|
+
const username = payload.username || (minter?.username && `scoped:${minter.username}`);
|
|
127
|
+
if (!username || typeof username !== 'string') {
|
|
128
|
+
throw new ClientError("A scoped token requires a 'username'");
|
|
129
|
+
}
|
|
130
|
+
// The attribution name must never collide with a real principal: paths that rehydrate a user
|
|
131
|
+
// by name (e.g. MQTT last-will replay) would resolve the token's bearer to that user's full
|
|
132
|
+
// permissions. This also keeps scoped-token activity distinguishable in audit logs.
|
|
133
|
+
if ((await getUsersWithRolesCache())?.has(username)) {
|
|
134
|
+
throw new ClientError(`'username' must not name an existing user; scoped-token attribution is a label`);
|
|
135
|
+
}
|
|
136
|
+
// Downgrade first so validation and the content hash see the effective permission set.
|
|
137
|
+
const permission = {
|
|
138
|
+
...payload.role.permission,
|
|
139
|
+
super_user: false,
|
|
140
|
+
cluster_user: false,
|
|
141
|
+
} as UserRole['permission'];
|
|
142
|
+
// Full persisted-role validation: a malformed shape must fail at mint (400), not at every use.
|
|
143
|
+
const deepValidation = addRoleValidation({ role: 'scoped_token', permission });
|
|
144
|
+
if (deepValidation) throw deepValidation;
|
|
145
|
+
const roleName = syntheticRoleName('_scoped_token', permission);
|
|
146
|
+
return {
|
|
147
|
+
username,
|
|
148
|
+
active: true,
|
|
149
|
+
role: {
|
|
150
|
+
permission,
|
|
151
|
+
role: roleName,
|
|
152
|
+
id: roleName,
|
|
153
|
+
__updatedtime__: 0,
|
|
154
|
+
__createdtime__: 0,
|
|
155
|
+
},
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
function validatePayload(payload: ImpersonatePayload, context = 'impersonate payload'): void {
|
|
53
160
|
if (typeof payload !== 'object' || payload === null || Array.isArray(payload)) {
|
|
54
|
-
throw new ClientError(
|
|
161
|
+
throw new ClientError(`Invalid ${context}: must be an object`);
|
|
55
162
|
}
|
|
56
163
|
|
|
57
164
|
const hasRole = payload.role !== undefined;
|
|
@@ -59,33 +166,31 @@ function validatePayload(payload: ImpersonatePayload): void {
|
|
|
59
166
|
const hasRoleName = typeof payload.role_name === 'string' && payload.role_name.length > 0;
|
|
60
167
|
|
|
61
168
|
if (!hasRole && !hasUsername && !hasRoleName) {
|
|
62
|
-
throw new ClientError(
|
|
63
|
-
"Invalid impersonate payload: must include 'username', 'role_name', or 'role' with 'permission'"
|
|
64
|
-
);
|
|
169
|
+
throw new ClientError(`Invalid ${context}: must include 'username', 'role_name', or 'role' with 'permission'`);
|
|
65
170
|
}
|
|
66
171
|
|
|
67
172
|
if (hasRole) {
|
|
68
173
|
if (typeof payload.role !== 'object' || payload.role === null) {
|
|
69
|
-
throw new ClientError(
|
|
174
|
+
throw new ClientError(`Invalid ${context}: 'role' must be an object`);
|
|
70
175
|
}
|
|
71
176
|
if (typeof payload.role.permission !== 'object' || payload.role.permission === null) {
|
|
72
|
-
throw new ClientError(
|
|
177
|
+
throw new ClientError(`Invalid ${context}: 'role.permission' must be an object`);
|
|
73
178
|
}
|
|
74
|
-
validateOperationsField(payload.role.permission);
|
|
179
|
+
validateOperationsField(payload.role.permission, context);
|
|
75
180
|
}
|
|
76
181
|
}
|
|
77
182
|
|
|
78
|
-
function validateOperationsField(permission: Record<string, unknown
|
|
183
|
+
function validateOperationsField(permission: Record<string, unknown>, context = 'impersonate payload'): void {
|
|
79
184
|
const operations = permission.operations;
|
|
80
185
|
if (operations === undefined) return;
|
|
81
186
|
|
|
82
187
|
if (!Array.isArray(operations)) {
|
|
83
|
-
throw new ClientError(
|
|
188
|
+
throw new ClientError(`Invalid ${context}: 'operations' must be an array`);
|
|
84
189
|
}
|
|
85
190
|
|
|
86
191
|
const invalidOp = validateOperations(operations);
|
|
87
192
|
if (invalidOp !== null) {
|
|
88
|
-
throw new ClientError(`Invalid
|
|
193
|
+
throw new ClientError(`Invalid ${context}: unknown operation '${invalidOp}'`);
|
|
89
194
|
}
|
|
90
195
|
}
|
|
91
196
|
|
package/security/jsLoader.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { Resource } from '../resources/Resource.ts';
|
|
2
2
|
import { contextStorage, transaction } from '../resources/transaction.ts';
|
|
3
3
|
import { RequestTarget } from '../resources/RequestTarget.ts';
|
|
4
|
-
import { tables, databases } from '../resources/databases.ts';
|
|
4
|
+
import { tables, databases, scopedTableFactory } from '../resources/databases.ts';
|
|
5
5
|
import { models as harperModelsSingleton } from '../resources/models/Models.ts';
|
|
6
|
-
import { defineTable, types } from '../resources/defineTable.ts';
|
|
6
|
+
import { defineTable, defineTableUsing, types } from '../resources/defineTable.ts';
|
|
7
7
|
import { defineResource, t, schemaOf, projectTableFragment } from '../resources/defineResource.ts';
|
|
8
8
|
import { readFile } from 'node:fs/promises';
|
|
9
9
|
import { dirname, isAbsolute, join, relative, resolve, sep } from 'node:path';
|
|
@@ -15,10 +15,12 @@ import logger from '../utility/logging/harper_logger.ts';
|
|
|
15
15
|
import { createRequire } from 'node:module';
|
|
16
16
|
import * as env from '../utility/environment/environmentManager';
|
|
17
17
|
import * as child_process from 'node:child_process';
|
|
18
|
-
import { CONFIG_PARAMS } from '../utility/hdbTerms.ts';
|
|
18
|
+
import { CONFIG_PARAMS, DEFAULT_DATABASE_NAME } from '../utility/hdbTerms.ts';
|
|
19
|
+
|
|
19
20
|
import { contentTypes } from '../server/serverHelpers/contentTypes.ts';
|
|
20
21
|
import type {} from 'ses';
|
|
21
22
|
import {
|
|
23
|
+
existsSync,
|
|
22
24
|
mkdirSync,
|
|
23
25
|
readFileSync,
|
|
24
26
|
writeFileSync,
|
|
@@ -174,13 +176,13 @@ function walkExportsConditions(entry: unknown, conditions: readonly string[]): s
|
|
|
174
176
|
|
|
175
177
|
/**
|
|
176
178
|
* Resolve a bare package specifier to a file:// URL using the package's exports map
|
|
177
|
-
* with ESM import conditions. Used as a fallback when
|
|
178
|
-
*
|
|
179
|
-
* conditions and no "require").
|
|
179
|
+
* with ESM import conditions. Used as a fallback when the runtime's CommonJS resolver
|
|
180
|
+
* cannot match a pure-ESM package (exports map with only "import" conditions).
|
|
180
181
|
*/
|
|
181
182
|
function resolveESMPackageExports(
|
|
182
183
|
specifier: string,
|
|
183
|
-
fromDir: string
|
|
184
|
+
fromDir: string,
|
|
185
|
+
preferRequireConditions = false
|
|
184
186
|
): { resolvedUrl: string; packageJsonUrl: string; packageJsonSource: Buffer } | null {
|
|
185
187
|
const isScoped = specifier.startsWith('@');
|
|
186
188
|
const parts = specifier.split('/');
|
|
@@ -223,11 +225,23 @@ function resolveESMPackageExports(
|
|
|
223
225
|
|
|
224
226
|
if (!entry) return null;
|
|
225
227
|
|
|
226
|
-
const relative =
|
|
228
|
+
const relative = preferRequireConditions
|
|
229
|
+
? (walkExportsConditions(entry, ['bun', 'require', 'node', 'default']) ??
|
|
230
|
+
walkExportsConditions(entry, ['bun', 'import', 'node', 'default']))
|
|
231
|
+
: walkExportsConditions(entry, ['import', 'node', 'default']);
|
|
227
232
|
if (!relative) return null;
|
|
228
233
|
|
|
234
|
+
let resolvedPath = join(pkgRoot, relative);
|
|
235
|
+
if (preferRequireConditions && !existsSync(resolvedPath)) {
|
|
236
|
+
// The runtime's preferred condition (Bun's `require`) named a target that isn't
|
|
237
|
+
// actually on disk -- fall back to the plain ESM `import` condition instead of
|
|
238
|
+
// failing resolution outright.
|
|
239
|
+
const importRelative = walkExportsConditions(entry, ['import', 'node', 'default']);
|
|
240
|
+
if (importRelative) resolvedPath = join(pkgRoot, importRelative);
|
|
241
|
+
}
|
|
242
|
+
|
|
229
243
|
return {
|
|
230
|
-
resolvedUrl: pathToFileURL(realpathSync(
|
|
244
|
+
resolvedUrl: pathToFileURL(realpathSync(resolvedPath)).toString(),
|
|
231
245
|
packageJsonUrl: pathToFileURL(realpathSync(packageJsonPath)).toString(),
|
|
232
246
|
packageJsonSource,
|
|
233
247
|
};
|
|
@@ -325,9 +339,10 @@ async function loadModuleWithVM(moduleUrl: string, scope: ApplicationScope, useC
|
|
|
325
339
|
const referrerDir = resolveReferrer.startsWith('file:')
|
|
326
340
|
? dirname(fileURLToPath(resolveReferrer))
|
|
327
341
|
: dirname(resolveReferrer);
|
|
328
|
-
const esmResolved = resolveESMPackageExports(specifier, referrerDir);
|
|
342
|
+
const esmResolved = resolveESMPackageExports(specifier, referrerDir, (err as any)?.code === 'MODULE_NOT_FOUND');
|
|
329
343
|
if (esmResolved) {
|
|
330
344
|
scope.recordLoadedModule?.(esmResolved.packageJsonUrl, esmResolved.packageJsonSource);
|
|
345
|
+
scope.recordLoadedModule?.(esmResolved.resolvedUrl, readFileSync(new URL(esmResolved.resolvedUrl)));
|
|
331
346
|
return esmResolved.resolvedUrl;
|
|
332
347
|
}
|
|
333
348
|
}
|
|
@@ -849,6 +864,52 @@ function getGlobalObject(scope: ApplicationScope, copyIntrinsics = false) {
|
|
|
849
864
|
// `Resource`/`tables`/`databases`/`createBlob`/… below are the live, process-wide singletons (the
|
|
850
865
|
// same values surfaced as the top-level package exports and bare globals), not per-compartment
|
|
851
866
|
// copies — only `server`/`logger`/`resources`/`config` are scope-overridable.
|
|
867
|
+
/**
|
|
868
|
+
* The `databases`/`tables` a scope sees. An application that declared `branchedDatabases` gets a view
|
|
869
|
+
* in which those names resolve to its private graph and everything else falls through to the real
|
|
870
|
+
* map, live: `databases` gains entries at runtime (`ensureDB`), so a copy taken at load would
|
|
871
|
+
* silently stop showing databases created afterwards.
|
|
872
|
+
*
|
|
873
|
+
* An unbranched scope gets the process-wide singletons **by identity**, not a view: that is the
|
|
874
|
+
* overwhelmingly common case and it must stay indistinguishable from before, and it means only
|
|
875
|
+
* branched applications pay for the indirection. Proxying rather than copying also keeps
|
|
876
|
+
* `databases.system` — deliberately non-enumerable (`resources/databases.ts`) — reachable for free.
|
|
877
|
+
*/
|
|
878
|
+
function scopedDatabaseBindings(scope: ApplicationScope): { databases: any; tables: any } {
|
|
879
|
+
const branches = scope.branches;
|
|
880
|
+
if (!branches?.size) return { databases, tables };
|
|
881
|
+
// Every branched name already exists on the target as a writable, configurable property (a branch
|
|
882
|
+
// is only ever taken of a database that exists), so overriding it here breaks no Proxy invariant.
|
|
883
|
+
const scoped = new Proxy(databases, {
|
|
884
|
+
get: (target, key, receiver) =>
|
|
885
|
+
typeof key === 'string' && branches.has(key) ? branches.get(key)!.tables : Reflect.get(target, key, receiver),
|
|
886
|
+
getOwnPropertyDescriptor(target, key) {
|
|
887
|
+
if (typeof key !== 'string' || !branches.has(key)) return Reflect.getOwnPropertyDescriptor(target, key);
|
|
888
|
+
return { value: branches.get(key)!.tables, writable: true, enumerable: true, configurable: true };
|
|
889
|
+
},
|
|
890
|
+
});
|
|
891
|
+
// `tables` is the flat alias for the default database, so it follows that database's branch.
|
|
892
|
+
return { databases: scoped, tables: branches.get(DEFAULT_DATABASE_NAME)?.tables ?? tables };
|
|
893
|
+
}
|
|
894
|
+
|
|
895
|
+
/**
|
|
896
|
+
* `defineTable` for a branched application registers through that application's table factory, so
|
|
897
|
+
* a branched name lands in its branch; an unbranched application gets `defineTable` itself.
|
|
898
|
+
*/
|
|
899
|
+
function scopedDefineTable(scope: ApplicationScope): typeof defineTable {
|
|
900
|
+
const branches = scope.branches;
|
|
901
|
+
if (!branches?.size) return defineTable;
|
|
902
|
+
const declareTable = scopedTableFactory(branches);
|
|
903
|
+
return function (name: string, shape: any, options?: any) {
|
|
904
|
+
return defineTableUsing(declareTable, name, shape, options);
|
|
905
|
+
} as typeof defineTable;
|
|
906
|
+
}
|
|
907
|
+
|
|
908
|
+
/** Everything an application sees differently because of what it declared. Built once, at load. */
|
|
909
|
+
export function scopedBindings(scope: ApplicationScope): { databases: any; tables: any; defineTable: any } {
|
|
910
|
+
return { ...scopedDatabaseBindings(scope), defineTable: scopedDefineTable(scope) };
|
|
911
|
+
}
|
|
912
|
+
|
|
852
913
|
function getHarperExports(scope: ApplicationScope) {
|
|
853
914
|
return {
|
|
854
915
|
server: scope.server ?? server,
|
|
@@ -859,9 +920,7 @@ function getHarperExports(scope: ApplicationScope) {
|
|
|
859
920
|
// the process-wide singletons below.
|
|
860
921
|
secrets: getSecretsForComponent(scope.name),
|
|
861
922
|
Resource,
|
|
862
|
-
|
|
863
|
-
databases,
|
|
864
|
-
defineTable,
|
|
923
|
+
...scopedBindings(scope),
|
|
865
924
|
types,
|
|
866
925
|
defineResource,
|
|
867
926
|
t,
|
|
@@ -914,7 +973,6 @@ const ALLOWED_NODE_BUILTIN_MODULES = env.get(CONFIG_PARAMS.APPLICATIONS_ALLOWEDB
|
|
|
914
973
|
return true;
|
|
915
974
|
},
|
|
916
975
|
};
|
|
917
|
-
const ALLOWED_COMMANDS = new Set(env.get(CONFIG_PARAMS.APPLICATIONS_ALLOWEDSPAWNCOMMANDS) ?? []);
|
|
918
976
|
const child_processConstrained: any = {
|
|
919
977
|
exec: createSpawn(child_process.exec),
|
|
920
978
|
execFile: createSpawn(child_process.execFile),
|
|
@@ -1070,10 +1128,15 @@ function acquirePidFileLock(
|
|
|
1070
1128
|
}
|
|
1071
1129
|
|
|
1072
1130
|
function createSpawn(spawnFunction: (...args: any) => child_process.ChildProcess, alwaysAllow?: boolean) {
|
|
1073
|
-
const basePath = env.getHdbBasePath();
|
|
1074
1131
|
return function (command: string, args?: any, options?: any, callback?: (...args: any[]) => void) {
|
|
1075
|
-
|
|
1076
|
-
|
|
1132
|
+
// componentLoader imports this module, so it can load before the config is resolved; a value
|
|
1133
|
+
// captured out here would pin an empty allowlist, and an undefined base path, for the life of
|
|
1134
|
+
// the process. Anything but a configured list denies.
|
|
1135
|
+
if (!alwaysAllow) {
|
|
1136
|
+
const allowedCommands = env.get(CONFIG_PARAMS.APPLICATIONS_ALLOWEDSPAWNCOMMANDS);
|
|
1137
|
+
if (!Array.isArray(allowedCommands) || !allowedCommands.includes(command.split(' ')[0])) {
|
|
1138
|
+
throw new Error(`Command ${command} is not allowed`);
|
|
1139
|
+
}
|
|
1077
1140
|
}
|
|
1078
1141
|
const processName = options?.name;
|
|
1079
1142
|
if (!processName)
|
|
@@ -1083,7 +1146,7 @@ function createSpawn(spawnFunction: (...args: any) => child_process.ChildProcess
|
|
|
1083
1146
|
const requestedVersion = options?.version;
|
|
1084
1147
|
|
|
1085
1148
|
// Ensure PID directory exists
|
|
1086
|
-
const pidDir = join(
|
|
1149
|
+
const pidDir = join(env.getHdbBasePath(), 'pids');
|
|
1087
1150
|
mkdirSync(pidDir, { recursive: true });
|
|
1088
1151
|
|
|
1089
1152
|
const pidFilePath = join(pidDir, `${processName}.pid`);
|