@harperfast/harper 5.2.13 → 5.3.0-beta.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 +58 -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 +120 -4
- package/bin/run.ts +6 -11
- package/bin/upgrade.js +7 -3
- package/bin/workloadIdentity.ts +119 -0
- package/components/Application.ts +3436 -242
- package/components/ApplicationScope.ts +8 -0
- package/components/EntryHandler.ts +59 -39
- package/components/OptionsWatcher.ts +440 -98
- package/components/RuntimeModuleTracker.ts +38 -7
- package/components/Scope.ts +56 -15
- package/components/awaitRestart.ts +84 -0
- package/components/componentLoader.ts +381 -32
- package/components/componentPreparationLock.ts +16 -5
- package/components/deploymentOperations.ts +4 -1
- package/components/deploymentRecorder.ts +9 -2
- 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 +537 -113
- package/components/operationsValidation.js +98 -3
- package/components/packageComponent.ts +25 -1
- package/components/requestRestart.ts +11 -0
- package/components/status/ComponentStatusRegistry.ts +59 -0
- package/config/RootConfigWatcher.ts +240 -40
- package/config/configReadRetry.ts +62 -0
- package/config/configUtils.ts +357 -48
- package/config/harperConfigEnvVars.ts +170 -27
- package/config/parseConfigFile.ts +34 -0
- package/config/readConfigFileSync.ts +44 -0
- package/config/watcherArming.ts +59 -0
- package/config-root.schema.json +33 -0
- package/dataLayer/blobBackup.ts +160 -50
- package/dataLayer/delete.ts +6 -1
- package/dataLayer/harperBridge/ResourceBridge.ts +80 -10
- 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 +61 -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 +91 -6
- 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 +235 -17
- package/dist/components/Application.js +3038 -238
- 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 +4 -0
- package/dist/components/OptionsWatcher.js +440 -99
- 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 +52 -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 +313 -24
- 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/deploymentOperations.js +4 -1
- package/dist/components/deploymentOperations.js.map +1 -1
- package/dist/components/deploymentRecorder.d.ts +4 -2
- package/dist/components/deploymentRecorder.js +1 -0
- package/dist/components/deploymentRecorder.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.d.ts +28 -0
- package/dist/components/operations.js +476 -113
- package/dist/components/operations.js.map +1 -1
- package/dist/components/operationsValidation.js +97 -3
- package/dist/components/operationsValidation.js.map +1 -1
- package/dist/components/packageComponent.js +24 -0
- package/dist/components/packageComponent.js.map +1 -1
- package/dist/components/requestRestart.d.ts +1 -0
- package/dist/components/requestRestart.js +7 -0
- package/dist/components/requestRestart.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 +9 -1
- package/dist/config/RootConfigWatcher.js +228 -37
- package/dist/config/RootConfigWatcher.js.map +1 -1
- package/dist/config/configReadRetry.d.ts +8 -0
- package/dist/config/configReadRetry.js +62 -0
- package/dist/config/configReadRetry.js.map +1 -0
- package/dist/config/configUtils.d.ts +11 -2
- package/dist/config/configUtils.js +304 -47
- 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/config/parseConfigFile.d.ts +4 -0
- package/dist/config/parseConfigFile.js +35 -0
- package/dist/config/parseConfigFile.js.map +1 -0
- package/dist/config/readConfigFileSync.d.ts +1 -0
- package/dist/config/readConfigFileSync.js +47 -0
- package/dist/config/readConfigFileSync.js.map +1 -0
- package/dist/config/watcherArming.d.ts +15 -0
- package/dist/config/watcherArming.js +59 -0
- package/dist/config/watcherArming.js.map +1 -0
- 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 +72 -12
- 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 +2 -1
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/json/systemSchema.json +55 -0
- package/dist/resources/DatabaseTransaction.d.ts +77 -0
- package/dist/resources/DatabaseTransaction.js +586 -54
- package/dist/resources/DatabaseTransaction.js.map +1 -1
- package/dist/resources/LMDBTransaction.d.ts +2 -1
- package/dist/resources/LMDBTransaction.js +43 -6
- package/dist/resources/LMDBTransaction.js.map +1 -1
- package/dist/resources/PrimaryRocksDatabase.d.ts +1 -0
- package/dist/resources/PrimaryRocksDatabase.js +49 -5
- package/dist/resources/PrimaryRocksDatabase.js.map +1 -1
- package/dist/resources/RecordEncoder.d.ts +20 -0
- package/dist/resources/RecordEncoder.js +110 -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 +117 -24
- package/dist/resources/Resource.js.map +1 -1
- package/dist/resources/ResourceInterface.d.ts +28 -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 +24 -1
- package/dist/resources/RocksTransactionLogStore.js +160 -49
- package/dist/resources/RocksTransactionLogStore.js.map +1 -1
- package/dist/resources/Table.d.ts +165 -10
- package/dist/resources/Table.js +1805 -303
- package/dist/resources/Table.js.map +1 -1
- package/dist/resources/analytics/write.js +10 -3
- package/dist/resources/analytics/write.js.map +1 -1
- package/dist/resources/auditStore.d.ts +181 -2
- package/dist/resources/auditStore.js +640 -29
- 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/dataLoader.js +3 -4
- package/dist/resources/dataLoader.js.map +1 -1
- package/dist/resources/databases.d.ts +157 -14
- package/dist/resources/databases.js +1462 -325
- 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/derivedIndexRegistry.d.ts +5 -0
- package/dist/resources/derivedIndexRegistry.js +68 -0
- package/dist/resources/derivedIndexRegistry.js.map +1 -0
- package/dist/resources/derivedIndexRuntime.d.ts +215 -0
- package/dist/resources/derivedIndexRuntime.js +2027 -0
- package/dist/resources/derivedIndexRuntime.js.map +1 -0
- package/dist/resources/graphql.d.ts +1 -1
- package/dist/resources/graphql.js +52 -16
- package/dist/resources/graphql.js.map +1 -1
- package/dist/resources/indexes/HierarchicalNavigableSmallWorld.d.ts +103 -9
- package/dist/resources/indexes/HierarchicalNavigableSmallWorld.js +854 -41
- package/dist/resources/indexes/HierarchicalNavigableSmallWorld.js.map +1 -1
- package/dist/resources/indexes/hnswDerivedIndex.d.ts +67 -0
- package/dist/resources/indexes/hnswDerivedIndex.js +464 -0
- package/dist/resources/indexes/hnswDerivedIndex.js.map +1 -0
- package/dist/resources/indexes/hnswPlaneBinding.d.ts +65 -0
- package/dist/resources/indexes/hnswPlaneBinding.js +91 -0
- package/dist/resources/indexes/hnswPlaneBinding.js.map +1 -0
- 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/nodeIdMapping.d.ts +5 -0
- package/dist/resources/nodeIdMapping.js +49 -0
- package/dist/resources/nodeIdMapping.js.map +1 -1
- package/dist/resources/recordLock.d.ts +123 -0
- package/dist/resources/recordLock.js +315 -0
- package/dist/resources/recordLock.js.map +1 -0
- package/dist/resources/recordLockCoordinator.d.ts +557 -0
- package/dist/resources/recordLockCoordinator.js +2565 -0
- package/dist/resources/recordLockCoordinator.js.map +1 -0
- package/dist/resources/replayLogs.d.ts +14 -1
- package/dist/resources/replayLogs.js +157 -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/replicatedApplyFailure.d.ts +16 -0
- package/dist/resources/replicatedApplyFailure.js +63 -0
- package/dist/resources/replicatedApplyFailure.js.map +1 -0
- package/dist/resources/scheduler/scheduler.js +3 -3
- package/dist/resources/scheduler/scheduler.js.map +1 -1
- package/dist/resources/search.d.ts +10 -4
- package/dist/resources/search.js +283 -37
- package/dist/resources/search.js.map +1 -1
- package/dist/resources/tracked.d.ts +5 -1
- package/dist/resources/tracked.js +74 -23
- package/dist/resources/tracked.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 +77 -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 +106 -2
- 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 +16 -1
- package/dist/server/http.js +122 -17
- 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 +27 -0
- package/dist/server/serverHelpers/Headers.js +145 -1
- package/dist/server/serverHelpers/Headers.js.map +1 -1
- package/dist/server/serverHelpers/NodeAdapterResponse.d.ts +48 -0
- package/dist/server/serverHelpers/NodeAdapterResponse.js +220 -0
- package/dist/server/serverHelpers/NodeAdapterResponse.js.map +1 -0
- package/dist/server/serverHelpers/Request.d.ts +5 -10
- package/dist/server/serverHelpers/Request.js +38 -136
- package/dist/server/serverHelpers/Request.js.map +1 -1
- package/dist/server/serverHelpers/contentTypes.d.ts +11 -0
- package/dist/server/serverHelpers/contentTypes.js +221 -40
- 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 +178 -29
- 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 +5 -0
- package/dist/server/storageReclamation.js +17 -1
- package/dist/server/storageReclamation.js.map +1 -1
- package/dist/server/threads/isolatedApplications.d.ts +47 -0
- package/dist/server/threads/isolatedApplications.js +171 -0
- package/dist/server/threads/isolatedApplications.js.map +1 -0
- 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/logRotationTransport.d.ts +1 -0
- package/dist/server/threads/logRotationTransport.js +33 -0
- package/dist/server/threads/logRotationTransport.js.map +1 -0
- package/dist/server/threads/manageThreads.d.ts +83 -3
- package/dist/server/threads/manageThreads.js +769 -75
- package/dist/server/threads/manageThreads.js.map +1 -1
- package/dist/server/threads/socketRouter.d.ts +1 -0
- package/dist/server/threads/socketRouter.js +277 -31
- 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 +76 -22
- 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 +33 -0
- package/dist/utility/errors/hdbError.js +58 -1
- package/dist/utility/errors/hdbError.js.map +1 -1
- package/dist/utility/globalSchema.d.ts +18 -0
- package/dist/utility/hdbTerms.d.ts +18 -0
- package/dist/utility/hdbTerms.js +20 -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 +286 -30
- package/dist/utility/logging/harper_logger.js.map +1 -1
- package/dist/utility/logging/logGenerationCoordinator.d.ts +35 -0
- package/dist/utility/logging/logGenerationCoordinator.js +184 -0
- package/dist/utility/logging/logGenerationCoordinator.js.map +1 -0
- package/dist/utility/logging/logRotation.d.ts +46 -0
- package/dist/utility/logging/logRotation.js +365 -0
- package/dist/utility/logging/logRotation.js.map +1 -0
- package/dist/utility/logging/logRotator.d.ts +1 -1
- package/dist/utility/logging/logRotator.js +192 -85
- 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 +11 -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 +41 -0
- package/dist/utility/watcherFallback.js +153 -0
- package/dist/utility/watcherFallback.js.map +1 -1
- package/dist/validation/configValidator.d.ts +12 -0
- package/dist/validation/configValidator.js +205 -75
- 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 +8 -0
- package/json/systemSchema.json +55 -0
- package/npm-shrinkwrap.json +286 -194
- package/package.json +15 -7
- package/resources/DESIGN.md +219 -52
- package/resources/DatabaseTransaction.ts +657 -52
- package/resources/LMDBTransaction.ts +46 -6
- package/resources/PrimaryRocksDatabase.ts +46 -7
- package/resources/RecordEncoder.ts +124 -9
- package/resources/RequestTarget.ts +2 -0
- package/resources/Resource.ts +114 -22
- package/resources/ResourceInterface.ts +31 -0
- package/resources/RocksIndexStore.ts +30 -9
- package/resources/RocksTransactionLogStore.ts +188 -51
- package/resources/Table.ts +1960 -301
- package/resources/analytics/write.ts +10 -3
- package/resources/auditStore.ts +647 -32
- package/resources/blob.ts +1029 -110
- package/resources/branchDatabase.ts +941 -0
- package/resources/crdt.ts +76 -12
- package/resources/dataLoader.ts +3 -4
- package/resources/databases.ts +1584 -320
- package/resources/defineTable.ts +18 -2
- package/resources/derivedIndexRegistry.ts +56 -0
- package/resources/derivedIndexRuntime.ts +2292 -0
- package/resources/graphql.ts +72 -17
- package/resources/indexes/HierarchicalNavigableSmallWorld.ts +911 -48
- package/resources/indexes/hnswDerivedIndex.ts +531 -0
- package/resources/indexes/hnswPlaneBinding.ts +174 -0
- package/resources/longLivedTransactions.ts +360 -0
- package/resources/models/backendRegistry.ts +84 -2
- package/resources/models/bootstrap.ts +473 -28
- package/resources/nodeIdMapping.ts +50 -0
- package/resources/recordLock.ts +419 -0
- package/resources/recordLockCoordinator.ts +3043 -0
- package/resources/replayLogs.ts +152 -26
- package/resources/replayLogsGuards.ts +171 -8
- package/resources/replicatedApplyFailure.ts +77 -0
- package/resources/scheduler/scheduler.ts +4 -4
- package/resources/search.ts +288 -46
- package/resources/tracked.ts +73 -22
- 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 +83 -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 +194 -16
- package/server/DurableSubscriptionsSession.ts +71 -11
- package/server/REST.ts +115 -4
- package/server/graphqlQuerying.ts +4 -0
- package/server/http.ts +133 -20
- 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 +135 -0
- package/server/serverHelpers/NodeAdapterResponse.ts +221 -0
- package/server/serverHelpers/Request.ts +33 -131
- package/server/serverHelpers/contentTypes.ts +217 -36
- 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 +232 -40
- package/server/serverHelpers/sharedMessageEncoding.ts +307 -0
- package/server/serverHelpers/uwsServer.ts +17 -2
- package/server/static.ts +23 -29
- package/server/storageReclamation.ts +15 -2
- package/server/threads/isolatedApplications.ts +157 -0
- package/server/threads/itc.js +11 -1
- package/server/threads/logRotationTransport.ts +40 -0
- package/server/threads/manageThreads.js +771 -66
- package/server/threads/socketRouter.ts +291 -30
- package/server/threads/threadHeapMemory.ts +26 -0
- package/server/threads/threadServer.js +73 -22
- package/sqlTranslator/index.ts +31 -8
- package/studio/web/assets/{Chat-4RrB5134.js → Chat-D3j-1yY1.js} +1 -1
- package/studio/web/assets/{FloatingChat-omlNMDcJ.js → FloatingChat-BxJGYcfB.js} +3 -3
- package/studio/web/assets/{apiToken-Bke3wvfZ.js → apiToken-CT55oWOe.js} +1 -1
- package/studio/web/assets/{applications-DvFDYJgK.js → applications-D9Ct9_vm.js} +1 -1
- package/studio/web/assets/{cssMode-C1vRa7zh.js → cssMode-DV8H7VwA.js} +1 -1
- package/studio/web/assets/{editor-3XRWEDWX.js → editor-uatc0unt.js} +1 -1
- package/studio/web/assets/{html-CTY5tdMr.js → html-Bm6D6paN.js} +1 -1
- package/studio/web/assets/{htmlMode-CG1vSD9t.js → htmlMode-CEn7tpLG.js} +1 -1
- package/studio/web/assets/{index-Dfpeofdu.js → index-BIXW6Pu4.js} +5 -5
- package/studio/web/assets/{index.lazy-B1VOIv-t.js → index.lazy-UI7L-Vrk.js} +1 -1
- package/studio/web/assets/{javascript-CJeJzGnI.js → javascript-CJ0G3AFZ.js} +1 -1
- package/studio/web/assets/{jsonMode-CYPBwM82.js → jsonMode-DQADAYEa.js} +1 -1
- package/studio/web/assets/{languageServices-IKH4GUHl.js → languageServices-CAQJXWcI.js} +1 -1
- package/studio/web/assets/{lspLanguageFeatures-BC8_gxKG.js → lspLanguageFeatures-CCQ8P5sY.js} +1 -1
- package/studio/web/assets/{notifications-BfKBpYcq.js → notifications-BbxTU6Aw.js} +1 -1
- package/studio/web/assets/{notifications-DFbArTfC.js → notifications-Cvb3P1lB.js} +1 -1
- package/studio/web/assets/{profile-Q4-T6c-S.js → profile-Yyb7gsvL.js} +1 -1
- package/studio/web/assets/{regions-CtkV0xje.js → regions-OgjGHlU5.js} +1 -1
- package/studio/web/assets/{register-1ZZuMsiA.js → register-6qwNEOY3.js} +2 -2
- package/studio/web/assets/{setComponentFile-ZWLcWv5X.js → setComponentFile-BilDMtgB.js} +1 -1
- package/studio/web/assets/{setup-DWprJyJy.js → setup-J6qJ7OIU.js} +2 -2
- package/studio/web/assets/{status--aNm8isn.js → status-0RWGcfyD.js} +1 -1
- package/studio/web/assets/{toggleHighContrast-Cq_lt3XD.js → toggleHighContrast-BIn-vErT.js} +1 -1
- package/studio/web/assets/{tsMode-pjgytARx.js → tsMode-DgUXku4d.js} +1 -1
- package/studio/web/assets/{typescript-Cdg0mqUh.js → typescript-C9orXcsM.js} +1 -1
- package/studio/web/assets/{useEntityRestURL-RZhaY8Rn.js → useEntityRestURL-BEoXXbUB.js} +1 -1
- package/studio/web/assets/{workers-BgoXIqQe.js → workers-JVzSDmgx.js} +1 -1
- package/studio/web/assets/{xml-BwSeDMiP.js → xml-Cq-S8S4X.js} +1 -1
- package/studio/web/assets/{yaml-DotCUG5l.js → yaml-sfoRdh1M.js} +1 -1
- package/studio/web/index.html +1 -1
- 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 +57 -0
- package/utility/hdbTerms.ts +19 -0
- package/utility/logging/harper_logger.ts +278 -26
- package/utility/logging/logGenerationCoordinator.ts +196 -0
- package/utility/logging/logRotation.ts +367 -0
- package/utility/logging/logRotator.ts +213 -81
- package/utility/nodeIdentity.ts +45 -0
- package/utility/npmUtilities.ts +12 -8
- package/utility/operationPermissions.ts +18 -1
- package/utility/operation_authorization.ts +231 -42
- package/utility/watchPath.ts +63 -0
- package/utility/watcherFallback.ts +148 -0
- package/validation/configValidator.ts +215 -75
- package/validation/installValidator.ts +15 -0
- package/validation/validationWrapper.ts +18 -4
package/bin/deploySetup.ts
CHANGED
|
@@ -36,6 +36,7 @@ import {
|
|
|
36
36
|
normalizeGitHost,
|
|
37
37
|
projectNameFromPackage,
|
|
38
38
|
GIT_HOST_PATTERN,
|
|
39
|
+
isReservedComponentName,
|
|
39
40
|
PROJECT_NAME_PATTERN,
|
|
40
41
|
} from '../utility/componentNames.ts';
|
|
41
42
|
|
|
@@ -74,6 +75,20 @@ export function resolveComponentName(req: any): string | undefined {
|
|
|
74
75
|
return undefined;
|
|
75
76
|
}
|
|
76
77
|
|
|
78
|
+
/** A credential sealed and granted to a name no deploy can run as is a secret nobody can ever use. */
|
|
79
|
+
export function assertUsableComponentName(component: string): void {
|
|
80
|
+
if (!PROJECT_NAME_PATTERN.test(component)) {
|
|
81
|
+
throw cliError(
|
|
82
|
+
`"${component}" is not a usable component name — a deploy accepts letters, numbers, dashes and underscores.`
|
|
83
|
+
);
|
|
84
|
+
}
|
|
85
|
+
if (isReservedComponentName(component)) {
|
|
86
|
+
throw cliError(
|
|
87
|
+
`"${component}" is reserved for Harper's "${component}" configuration section — deploying a component under that name is refused.`
|
|
88
|
+
);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
77
92
|
/**
|
|
78
93
|
* The canonical bare host for a git credential — `https://github.com/owner/repo` and
|
|
79
94
|
* `git@github.com` both identify `github.com`. Resolved once and then used for everything the host
|
|
@@ -185,11 +200,7 @@ export async function deploySetup(req: any): Promise<void> {
|
|
|
185
200
|
})
|
|
186
201
|
).project ?? ''
|
|
187
202
|
);
|
|
188
|
-
|
|
189
|
-
throw cliError(
|
|
190
|
-
`"${component}" is not a usable component name — a deploy accepts letters, numbers, dashes and underscores.`
|
|
191
|
-
);
|
|
192
|
-
}
|
|
203
|
+
assertUsableComponentName(component);
|
|
193
204
|
|
|
194
205
|
let credentialKey: string; // host (github) or registry (npm) — the credentials-entry discriminator
|
|
195
206
|
let credentialEntry: Record<string, string>;
|
package/bin/harper.ts
CHANGED
|
@@ -119,7 +119,7 @@ async function harper() {
|
|
|
119
119
|
case SERVICE_ACTIONS_ENUM.COPYDB: {
|
|
120
120
|
let sourceDb = process.argv[3];
|
|
121
121
|
let targetDbPath = process.argv[4];
|
|
122
|
-
return require('./copyDb').copyDb(sourceDb, targetDbPath);
|
|
122
|
+
return require('./copyDb').copyDb(sourceDb, targetDbPath, { blobs: 'copy' });
|
|
123
123
|
}
|
|
124
124
|
case OPERATIONS_ENUM.CREATE_BACKUP:
|
|
125
125
|
case OPERATIONS_ENUM.LIST_BACKUPS:
|
package/bin/help.ts
CHANGED
|
@@ -86,7 +86,10 @@ const SECTIONS: Section[] = [
|
|
|
86
86
|
['upgrade', 'Upgrade harperdb'],
|
|
87
87
|
['register', 'Register harperdb'],
|
|
88
88
|
['renew-certs', 'Generate a new set of self-signed certificates'],
|
|
89
|
-
[
|
|
89
|
+
[
|
|
90
|
+
'copy-db <source> <target>',
|
|
91
|
+
'Copies the database named <source> to the <target> environment path. File-backed blobs are copied to <target>-blobs; see its README before restoring.',
|
|
92
|
+
],
|
|
90
93
|
['version', 'Print the version'],
|
|
91
94
|
['help', 'Display this output'],
|
|
92
95
|
],
|
package/bin/lite.ts
CHANGED
package/bin/restart.ts
CHANGED
|
@@ -9,6 +9,9 @@ import { compactOnStart } from './copyDb.ts';
|
|
|
9
9
|
import {
|
|
10
10
|
beginProcessShutdown,
|
|
11
11
|
restartWorkers,
|
|
12
|
+
isThreadRunning,
|
|
13
|
+
decodeRestartScope,
|
|
14
|
+
getRunningIsolatedApplications,
|
|
12
15
|
onMessageByType,
|
|
13
16
|
shutdownWorkersNow,
|
|
14
17
|
} from '../server/threads/manageThreads.js';
|
|
@@ -16,6 +19,8 @@ import { handleHDBError, hdbErrors } from '../utility/errors/hdbError.ts';
|
|
|
16
19
|
const { HTTP_STATUS_CODES } = hdbErrors;
|
|
17
20
|
import * as envMgr from '../utility/environment/environmentManager.ts';
|
|
18
21
|
import * as path from 'node:path';
|
|
22
|
+
import { getConfigObj, getConfigPath } from '../config/configUtils.ts';
|
|
23
|
+
import { withComponentPreparationLock } from '../components/componentPreparationLock.ts';
|
|
19
24
|
import { rmSync } from 'node:fs';
|
|
20
25
|
import { getThisNodeName } from '../server/nodeName.ts';
|
|
21
26
|
import { armRestartExitWatchdog } from './restartExitWatchdog.ts';
|
|
@@ -23,6 +28,7 @@ envMgr.initSync();
|
|
|
23
28
|
|
|
24
29
|
const RESTART_RESPONSE = `Restarting Harper. This may take up to ${hdbTerms.RESTART_TIMEOUT_MS / 1000} seconds.`;
|
|
25
30
|
const INVALID_SERVICE_ERR = 'Invalid service';
|
|
31
|
+
const ISOLATED_TOPOLOGY_REQUEST_TIMEOUT_MS = 5000;
|
|
26
32
|
|
|
27
33
|
let calledFromCli;
|
|
28
34
|
|
|
@@ -31,12 +37,72 @@ export { restart, restartService };
|
|
|
31
37
|
// Add ITC event listener to main thread which will be called from child that receives restart request.
|
|
32
38
|
if (isMainThread) {
|
|
33
39
|
onMessageByType(hdbTerms.ITC_EVENT_TYPES.RESTART, async (message, port) => {
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
40
|
+
try {
|
|
41
|
+
// `scope` stays in its wire form ('' pool, a name, absent = all) until restartService decodes it once
|
|
42
|
+
if (message.removeBranchesFor)
|
|
43
|
+
await restartThenRemoveBranches(message.workerType, message.removeBranchesFor, message.scope);
|
|
44
|
+
else if (message.workerType)
|
|
45
|
+
await restartService({
|
|
46
|
+
service: message.workerType,
|
|
47
|
+
scope: message.scope,
|
|
48
|
+
scopeFallback: message.scopeFallback,
|
|
49
|
+
});
|
|
50
|
+
else restart({ operation: 'restart' });
|
|
51
|
+
} finally {
|
|
52
|
+
port.postMessage({ type: 'restart-complete' });
|
|
53
|
+
}
|
|
37
54
|
});
|
|
38
55
|
}
|
|
39
56
|
|
|
57
|
+
/**
|
|
58
|
+
* Restart, then remove the branches of an application dropped on a worker (which cannot outlive the
|
|
59
|
+
* restart it asked for). The restart happens even if the component lock cannot be taken.
|
|
60
|
+
*/
|
|
61
|
+
async function restartThenRemoveBranches(service: string, project: string, scope: string | undefined): Promise<void> {
|
|
62
|
+
let restarted = false;
|
|
63
|
+
const restartHttpWorkers = async () => {
|
|
64
|
+
restarted = true;
|
|
65
|
+
processMan.expectedRestartOfChildren();
|
|
66
|
+
hdbLogger.notify('Restarting http_workers');
|
|
67
|
+
return restartWorkers('http', undefined, true, null, decodeRestartScope({ scope }));
|
|
68
|
+
};
|
|
69
|
+
try {
|
|
70
|
+
const componentPath = path.join(getConfigPath(hdbTerms.CONFIG_PARAMS.COMPONENTSROOT) as string, project);
|
|
71
|
+
await withComponentPreparationLock(
|
|
72
|
+
componentPath,
|
|
73
|
+
async () => {
|
|
74
|
+
const outcome: any = await restartHttpWorkers();
|
|
75
|
+
if (!outcome || outcome.declined || outcome.workersKeptOnOldCode) {
|
|
76
|
+
hdbLogger.warn(
|
|
77
|
+
`Branched database storage of ${project} was left in place: the restart did not replace every worker`
|
|
78
|
+
);
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
// The worker's drop lock was released before this one was taken; a same-name deploy that landed
|
|
82
|
+
// in between owns these branches now.
|
|
83
|
+
if (getConfigObj()?.[project]) {
|
|
84
|
+
hdbLogger.warn(`${project} was deployed again since it was dropped; leaving its branched databases in place`);
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
const { removeBranchesForApplication } = await import('../resources/branchDatabase.ts');
|
|
88
|
+
await removeBranchesForApplication(project);
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
timeoutMs: 5 * 60 * 1000,
|
|
92
|
+
onWait: (owner) =>
|
|
93
|
+
hdbLogger.debug?.(
|
|
94
|
+
`Waiting to restart after dropping ${project}` +
|
|
95
|
+
(owner ? ` behind process ${owner.pid}, thread ${owner.threadId}` : '')
|
|
96
|
+
),
|
|
97
|
+
isOwnerAlive: (owner) => owner.pid !== process.pid || isThreadRunning(owner.threadId),
|
|
98
|
+
}
|
|
99
|
+
);
|
|
100
|
+
} catch (error) {
|
|
101
|
+
hdbLogger.error(`Could not remove the branched database storage of ${project}`, error);
|
|
102
|
+
if (!restarted) await restartService({ service, scope });
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
40
106
|
/**
|
|
41
107
|
* Restart Harper.
|
|
42
108
|
* It will restart all the child threads and the hub and leaf server processes.
|
|
@@ -127,6 +193,49 @@ async function restartService(req: any) {
|
|
|
127
193
|
if (hdbTerms.HDB_PROCESS_SERVICES[service] === undefined) {
|
|
128
194
|
throw handleHDBError(new Error(), INVALID_SERVICE_ERR, HTTP_STATUS_CODES.BAD_REQUEST, undefined, undefined, true);
|
|
129
195
|
}
|
|
196
|
+
const requestedScope = decodeRestartScope(req);
|
|
197
|
+
if (requestedScope !== undefined && typeof requestedScope !== 'string') {
|
|
198
|
+
throw handleHDBError(
|
|
199
|
+
new Error(),
|
|
200
|
+
'Invalid HTTP worker restart scope: expected a string',
|
|
201
|
+
HTTP_STATUS_CODES.BAD_REQUEST,
|
|
202
|
+
undefined,
|
|
203
|
+
undefined,
|
|
204
|
+
true
|
|
205
|
+
);
|
|
206
|
+
}
|
|
207
|
+
let fallbackScope;
|
|
208
|
+
if (req.scopeFallback !== undefined) {
|
|
209
|
+
fallbackScope = decodeRestartScope({ scope: req.scopeFallback });
|
|
210
|
+
if (fallbackScope !== undefined) {
|
|
211
|
+
throw handleHDBError(
|
|
212
|
+
new Error(),
|
|
213
|
+
'Invalid HTTP worker restart scope fallback: expected the pool scope',
|
|
214
|
+
HTTP_STATUS_CODES.BAD_REQUEST,
|
|
215
|
+
undefined,
|
|
216
|
+
undefined,
|
|
217
|
+
true
|
|
218
|
+
);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
if (typeof requestedScope === 'string' && requestedScope !== '*' && req.scopeFallback === undefined) {
|
|
222
|
+
envMgr.initSync(true);
|
|
223
|
+
const { isIsolatedApplication } = await import('../server/threads/isolatedApplications.ts');
|
|
224
|
+
const configured = isIsolatedApplication(requestedScope);
|
|
225
|
+
const runningApplications = configured
|
|
226
|
+
? []
|
|
227
|
+
: await getRunningIsolatedApplications(ISOLATED_TOPOLOGY_REQUEST_TIMEOUT_MS);
|
|
228
|
+
if (!configured && !runningApplications.includes(requestedScope)) {
|
|
229
|
+
throw handleHDBError(
|
|
230
|
+
new Error(),
|
|
231
|
+
`Unknown isolated application restart scope: ${requestedScope}`,
|
|
232
|
+
HTTP_STATUS_CODES.BAD_REQUEST,
|
|
233
|
+
undefined,
|
|
234
|
+
undefined,
|
|
235
|
+
true
|
|
236
|
+
);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
130
239
|
processMan.expectedRestartOfChildren();
|
|
131
240
|
if (!isMainThread) {
|
|
132
241
|
if (req.replicated) {
|
|
@@ -135,6 +244,8 @@ async function restartService(req: any) {
|
|
|
135
244
|
parentPort.postMessage({
|
|
136
245
|
type: hdbTerms.ITC_EVENT_TYPES.RESTART,
|
|
137
246
|
workerType: service,
|
|
247
|
+
scope: req.scope, // wire form, forwarded as received
|
|
248
|
+
scopeFallback: req.scopeFallback,
|
|
138
249
|
});
|
|
139
250
|
parentPort.ref(); // don't let the parent thread exit until we're done
|
|
140
251
|
await new Promise<void>((resolve) => {
|
|
@@ -209,7 +320,12 @@ async function restartService(req: any) {
|
|
|
209
320
|
if (calledFromCli) {
|
|
210
321
|
await processMan.restart(hdbTerms.PROCESS_DESCRIPTORS.HDB);
|
|
211
322
|
} else {
|
|
212
|
-
|
|
323
|
+
let scope = requestedScope;
|
|
324
|
+
if (req.scopeFallback !== undefined && typeof scope === 'string' && scope !== '*') {
|
|
325
|
+
const runningApplications = await getRunningIsolatedApplications(ISOLATED_TOPOLOGY_REQUEST_TIMEOUT_MS);
|
|
326
|
+
if (!runningApplications.includes(scope)) scope = fallbackScope;
|
|
327
|
+
}
|
|
328
|
+
await restartWorkers('http', undefined, true, null, scope);
|
|
213
329
|
}
|
|
214
330
|
break;
|
|
215
331
|
default:
|
package/bin/run.ts
CHANGED
|
@@ -26,7 +26,7 @@ import { startHTTPThreads } from '../server/threads/socketRouter.ts';
|
|
|
26
26
|
import { beginProcessShutdown } from '../server/threads/manageThreads.js';
|
|
27
27
|
import * as hdbInfoController from '../dataLayer/hdbInfoController.ts';
|
|
28
28
|
import { isReadOnlyMode } from '../resources/databases.ts';
|
|
29
|
-
import { getThisNodeName } from '../server/nodeName.ts';
|
|
29
|
+
import { getThisNodeName, getThisNodeHostname } from '../server/nodeName.ts';
|
|
30
30
|
import * as hdbTerms from '../utility/hdbTerms.ts';
|
|
31
31
|
import { getHdbPid, isProcessRunning } from '../utility/processManagement/processManagement.js';
|
|
32
32
|
import { PACKAGE_ROOT } from '../utility/packageUtils.js';
|
|
@@ -287,6 +287,8 @@ function startupLog(portResolutions: any) {
|
|
|
287
287
|
logMsg += `${pad('Mode:')}${chalk.yellow('READ-ONLY')}\n`;
|
|
288
288
|
}
|
|
289
289
|
|
|
290
|
+
logMsg += `${pad('Version:')}${packageJson.version}\n`;
|
|
291
|
+
|
|
290
292
|
logMsg += `${pad('Hostname:')}${getThisNodeName()}\n`;
|
|
291
293
|
|
|
292
294
|
logMsg += `${pad('Worker Threads:')}${env.get(CONFIG_PARAMS.THREADS_COUNT)}\n`;
|
|
@@ -327,17 +329,10 @@ function startupLog(portResolutions: any) {
|
|
|
327
329
|
}`;
|
|
328
330
|
logMsg += `, unix socket: ${configUtils.getConfigPath(CONFIG_PARAMS.OPERATIONSAPI_NETWORK_DOMAINSOCKET)}\n`;
|
|
329
331
|
if (env.get(CONFIG_PARAMS.OPERATIONSAPI_NETWORK_PORT)) {
|
|
330
|
-
logMsg += pad('')
|
|
332
|
+
logMsg += `${pad('')}http://${getThisNodeHostname()}:${env.get(CONFIG_PARAMS.OPERATIONSAPI_NETWORK_PORT)}/\n`;
|
|
331
333
|
}
|
|
332
334
|
if (env.get(CONFIG_PARAMS.OPERATIONSAPI_NETWORK_SECUREPORT)) {
|
|
333
|
-
logMsg +=
|
|
334
|
-
'\n' +
|
|
335
|
-
pad('') +
|
|
336
|
-
'https://' +
|
|
337
|
-
getThisNodeName() +
|
|
338
|
-
':' +
|
|
339
|
-
env.get(CONFIG_PARAMS.OPERATIONSAPI_NETWORK_SECUREPORT) +
|
|
340
|
-
'/\n';
|
|
335
|
+
logMsg += `\n${pad('')}https://${getThisNodeHostname()}:${env.get(CONFIG_PARAMS.OPERATIONSAPI_NETWORK_SECUREPORT)}/\n`;
|
|
341
336
|
}
|
|
342
337
|
|
|
343
338
|
// MQTT Log
|
|
@@ -389,7 +384,7 @@ function startupLog(portResolutions: any) {
|
|
|
389
384
|
if (!restLog.includes(pair) && name === 'rest') {
|
|
390
385
|
restLog += pair;
|
|
391
386
|
if (value.protocol_name === 'HTTP' || value.protocol_name === 'HTTPS') {
|
|
392
|
-
restHostnames.push(`${value.protocol_name.toLowerCase()}://${
|
|
387
|
+
restHostnames.push(`${value.protocol_name.toLowerCase()}://${getThisNodeHostname()}:${key}/`);
|
|
393
388
|
}
|
|
394
389
|
}
|
|
395
390
|
|
package/bin/upgrade.js
CHANGED
|
@@ -110,11 +110,15 @@ async function runUpgrade(upgradeObj) {
|
|
|
110
110
|
throw err;
|
|
111
111
|
}
|
|
112
112
|
|
|
113
|
+
// The stamp is what stops these directives running again on data they have already migrated.
|
|
113
114
|
try {
|
|
114
|
-
await hdbInfoController.insertHdbUpgradeInfo(upgradeObj[UPGRADE_VERSION]);
|
|
115
|
+
await hdbInfoController.insertHdbUpgradeInfo(upgradeObj[UPGRADE_VERSION] ?? packageJson.version);
|
|
115
116
|
} catch (err) {
|
|
116
|
-
|
|
117
|
-
|
|
117
|
+
printToLogAndConsole(
|
|
118
|
+
`The data upgrade completed, but the new data version could not be recorded in the '${hdbTerms.SYSTEM_TABLE_NAMES.INFO_TABLE_NAME}' table, so Harper will not start. Every restart re-runs the upgrade directives against already-upgraded data, so stop any process supervisor that restarts Harper automatically, then check the logs and contact ${hdbTerms.HDB_SUPPORT_ADDRESS}.`,
|
|
119
|
+
hdbTerms.LOG_LEVELS.ERROR
|
|
120
|
+
);
|
|
121
|
+
throw err;
|
|
118
122
|
}
|
|
119
123
|
}
|
|
120
124
|
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Client half of OIDC trusted publishing (#2171): ask the runtime for a workload identity token
|
|
3
|
+
* addressed to this instance, trade it for a short-lived operation token via `exchange_oidc_token`.
|
|
4
|
+
*
|
|
5
|
+
* Structured as a provider list because the runtimes differ only in how the token is obtained.
|
|
6
|
+
* GitHub Actions is entry one; a Kubernetes entry is `available()` testing for a projected
|
|
7
|
+
* service-account token path and `requestToken()` reading that file. A runtime none of them
|
|
8
|
+
* recognizes falls through to the CLI's other credential sources.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { httpRequest } from '../utility/common_utils.ts';
|
|
12
|
+
|
|
13
|
+
interface WorkloadIdentityProvider {
|
|
14
|
+
name: string;
|
|
15
|
+
/** True when this process can obtain a token from this runtime. */
|
|
16
|
+
available(): boolean;
|
|
17
|
+
/**
|
|
18
|
+
* Obtains an identity token bound to `audience`. Binding it is what makes the token unusable
|
|
19
|
+
* anywhere else — see SHARED_DEFAULT_AUDIENCE in security/authn/oidc/providers/githubActions.ts
|
|
20
|
+
* for what an unbound one costs.
|
|
21
|
+
*/
|
|
22
|
+
requestToken(audience: string): Promise<string>;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/** GitHub sets both of these on a job that declares `permissions: id-token: write`. */
|
|
26
|
+
const GITHUB_TOKEN_REQUEST_URL = 'ACTIONS_ID_TOKEN_REQUEST_URL';
|
|
27
|
+
const GITHUB_TOKEN_REQUEST_TOKEN = 'ACTIONS_ID_TOKEN_REQUEST_TOKEN';
|
|
28
|
+
|
|
29
|
+
const IDENTITY_REQUEST_TIMEOUT_MS = 10_000;
|
|
30
|
+
|
|
31
|
+
const githubActions: WorkloadIdentityProvider = {
|
|
32
|
+
name: 'GitHub Actions',
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Both variables are required: GitHub sets them together, so their absence means the workflow did
|
|
36
|
+
* not grant `id-token: write` — a configuration answer, not a failure to report here.
|
|
37
|
+
*/
|
|
38
|
+
available(): boolean {
|
|
39
|
+
return Boolean(process.env[GITHUB_TOKEN_REQUEST_URL] && process.env[GITHUB_TOKEN_REQUEST_TOKEN]);
|
|
40
|
+
},
|
|
41
|
+
|
|
42
|
+
async requestToken(audience: string): Promise<string> {
|
|
43
|
+
const requestUrl = new URL(process.env[GITHUB_TOKEN_REQUEST_URL] as string);
|
|
44
|
+
requestUrl.searchParams.set('audience', audience);
|
|
45
|
+
|
|
46
|
+
const response = await fetch(requestUrl, {
|
|
47
|
+
headers: {
|
|
48
|
+
authorization: `Bearer ${process.env[GITHUB_TOKEN_REQUEST_TOKEN]}`,
|
|
49
|
+
accept: 'application/json',
|
|
50
|
+
},
|
|
51
|
+
signal: AbortSignal.timeout(IDENTITY_REQUEST_TIMEOUT_MS),
|
|
52
|
+
});
|
|
53
|
+
if (!response.ok) throw new Error(`GitHub returned ${response.status} for an identity token`);
|
|
54
|
+
|
|
55
|
+
const body: any = await response.json();
|
|
56
|
+
if (typeof body?.value !== 'string' || body.value === '') {
|
|
57
|
+
throw new Error('GitHub returned no identity token value');
|
|
58
|
+
}
|
|
59
|
+
return body.value;
|
|
60
|
+
},
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
const PROVIDERS: WorkloadIdentityProvider[] = [githubActions];
|
|
64
|
+
|
|
65
|
+
function activeProvider(): WorkloadIdentityProvider | undefined {
|
|
66
|
+
return PROVIDERS.find((provider) => provider.available());
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/** True when this runtime can prove its own identity to the cluster. */
|
|
70
|
+
export function workloadIdentityAvailable(): boolean {
|
|
71
|
+
return activeProvider() !== undefined;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Trades a workload identity token for a Harper operation token, or undefined when this runtime has
|
|
76
|
+
* no identity to offer. Failures are reported and swallowed: this is the last credential source
|
|
77
|
+
* before the request goes out unauthenticated, and the resulting 401 says nothing useful, so the
|
|
78
|
+
* reason is worth printing even though it is not by itself fatal.
|
|
79
|
+
*/
|
|
80
|
+
export async function exchangeWorkloadIdentityForToken(options: any, audience: string): Promise<string | undefined> {
|
|
81
|
+
const provider = activeProvider();
|
|
82
|
+
if (!provider) return undefined;
|
|
83
|
+
|
|
84
|
+
console.error(`Requesting a ${provider.name} identity token for ${audience}...`);
|
|
85
|
+
let identityToken: string;
|
|
86
|
+
try {
|
|
87
|
+
identityToken = await provider.requestToken(audience);
|
|
88
|
+
} catch (error) {
|
|
89
|
+
console.error(`Could not obtain a ${provider.name} identity token: ${(error as Error).message}`);
|
|
90
|
+
return undefined;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
try {
|
|
94
|
+
const response = await httpRequest(options, { operation: 'exchange_oidc_token', token: identityToken });
|
|
95
|
+
if (response.statusCode === 200) {
|
|
96
|
+
const data = JSON.parse(response.body);
|
|
97
|
+
if (data.operation_token) {
|
|
98
|
+
console.error(`Authenticated as '${data.username}' via OIDC trust policy '${data.policy}'.`);
|
|
99
|
+
return data.operation_token;
|
|
100
|
+
}
|
|
101
|
+
console.error('The OIDC exchange returned no operation token.');
|
|
102
|
+
return undefined;
|
|
103
|
+
}
|
|
104
|
+
if (response.statusCode === 401) {
|
|
105
|
+
// The server deliberately does not say which check failed, so point at the two things the
|
|
106
|
+
// operator can actually inspect rather than inventing a cause.
|
|
107
|
+
console.error(
|
|
108
|
+
'Harper rejected the identity token. Check that a trust policy matches this workload ' +
|
|
109
|
+
'(list_oidc_trust) and that its audience is this instance; the server log records the reason.'
|
|
110
|
+
);
|
|
111
|
+
return undefined;
|
|
112
|
+
}
|
|
113
|
+
console.error(`OIDC exchange failed: ${response.statusCode}`);
|
|
114
|
+
return undefined;
|
|
115
|
+
} catch (error) {
|
|
116
|
+
console.error(`Error exchanging the identity token: ${(error as Error).message}`);
|
|
117
|
+
return undefined;
|
|
118
|
+
}
|
|
119
|
+
}
|