@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
|
@@ -38,10 +38,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
38
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
39
|
exports.logRotator = logRotator;
|
|
40
40
|
const fs_1 = require("fs");
|
|
41
|
-
const zlib_1 = require("zlib");
|
|
42
|
-
const util_1 = require("util");
|
|
43
|
-
const stream_1 = require("stream");
|
|
44
|
-
const pipe = (0, util_1.promisify)(stream_1.pipeline);
|
|
45
41
|
const path = __importStar(require("path"));
|
|
46
42
|
const envMgr = __importStar(require("../environment/environmentManager.js"));
|
|
47
43
|
envMgr.initSync();
|
|
@@ -49,8 +45,11 @@ const harper_logger_ts_1 = __importDefault(require("./harper_logger.js"));
|
|
|
49
45
|
const hdbTerms_ts_1 = require("../hdbTerms.js");
|
|
50
46
|
const common_utils_ts_1 = require("../common_utils.js");
|
|
51
47
|
const storageReclamation_ts_1 = require("../../server/storageReclamation.js");
|
|
48
|
+
const logGenerationCoordinator_ts_1 = require("./logGenerationCoordinator.js");
|
|
49
|
+
const logRotation_ts_1 = require("./logRotation.js");
|
|
52
50
|
// Interval in ms to check log file and decide if it should be rotated.
|
|
53
51
|
const LOG_AUDIT_INTERVAL = 60000;
|
|
52
|
+
const RELEASE_PROOF_REPORT_INTERVAL = 5 * 60 * 1000;
|
|
54
53
|
const INT_SIZE_UNDEFINED_MSG = "'interval' and 'maxSize' are both undefined, to enable logging rotation at least one of these values must be defined in harperdb-config.yaml";
|
|
55
54
|
/**
|
|
56
55
|
* Rotates hdb.log using an interval and/or maxSize param to determine if log should be rotated.
|
|
@@ -58,7 +57,7 @@ const INT_SIZE_UNDEFINED_MSG = "'interval' and 'maxSize' are both undefined, to
|
|
|
58
57
|
* If log file is within the values set in config, log file will be renamed/moved and a new empty hdb.log created.
|
|
59
58
|
* @returns LogRotator
|
|
60
59
|
*/
|
|
61
|
-
function logRotator({ logger, maxSize, interval, retention, enabled, path: rotatedLogDir, auditInterval }) {
|
|
60
|
+
function logRotator({ logger, maxSize, interval, retention, enabled, compress, path: rotatedLogDir, auditInterval, }) {
|
|
62
61
|
if (enabled === false)
|
|
63
62
|
return;
|
|
64
63
|
let reclamationPriority = 0;
|
|
@@ -68,126 +67,234 @@ function logRotator({ logger, maxSize, interval, retention, enabled, path: rotat
|
|
|
68
67
|
if (!maxSize && !interval) {
|
|
69
68
|
throw new Error(INT_SIZE_UNDEFINED_MSG);
|
|
70
69
|
}
|
|
71
|
-
|
|
72
|
-
rotatedLogDir = path.join(path.dirname(logger.path), 'rotated');
|
|
73
|
-
}
|
|
70
|
+
rotatedLogDir = (0, logRotation_ts_1.resolveRotatedLogDir)(logger.path, rotatedLogDir);
|
|
74
71
|
(0, fs_1.mkdirSync)(rotatedLogDir, { recursive: true });
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
const unit = maxSize.slice(-1);
|
|
79
|
-
const size = maxSize.slice(0, -1);
|
|
80
|
-
if (unit === 'G')
|
|
81
|
-
maxBytes = size * 1000000000;
|
|
82
|
-
else if (unit === 'M')
|
|
83
|
-
maxBytes = size * 1000000;
|
|
84
|
-
else
|
|
85
|
-
maxBytes = size * 1000;
|
|
72
|
+
const maxBytes = (0, logRotation_ts_1.parseMaxSize)(maxSize);
|
|
73
|
+
if (maxSize && !maxBytes) {
|
|
74
|
+
harper_logger_ts_1.default.error(`Ignoring logging.rotation.maxSize '${maxSize}': ${logRotation_ts_1.INVALID_MAX_SIZE_MSG}`);
|
|
86
75
|
}
|
|
76
|
+
// The rotation block first, because that is all the write-path guard can read — environmentManager
|
|
77
|
+
// imports harper_logger — and two sources would mean two destruction policies for one log.
|
|
78
|
+
const compressArchives = compress ?? envMgr.get(hdbTerms_ts_1.CONFIG_PARAMS.LOGGING_ROTATION_COMPRESS);
|
|
87
79
|
// Convert interval param to ms.
|
|
88
80
|
let maxInterval;
|
|
89
81
|
if (interval) {
|
|
90
82
|
maxInterval = (0, common_utils_ts_1.convertToMS)(interval);
|
|
91
83
|
}
|
|
92
84
|
let lastRotatedLogPath;
|
|
93
|
-
// convert date.now to minutes
|
|
94
85
|
let lastRotationTime = Date.now();
|
|
86
|
+
let observedGeneration;
|
|
87
|
+
try {
|
|
88
|
+
const active = (0, fs_1.statSync)(logger.path);
|
|
89
|
+
observedGeneration = generationIdentity(active);
|
|
90
|
+
if (active.birthtimeMs > 0)
|
|
91
|
+
lastRotationTime = Math.min(lastRotationTime, active.birthtimeMs);
|
|
92
|
+
}
|
|
93
|
+
catch { }
|
|
95
94
|
harper_logger_ts_1.default.trace('Log rotate enabled, maxSize:', maxSize, 'interval:', interval);
|
|
95
|
+
let tickInFlight = false;
|
|
96
|
+
let ended = false;
|
|
97
|
+
let releaseProofStalled = false;
|
|
98
|
+
let nextReleaseProofReport = 0;
|
|
99
|
+
let retentionCursor = 0;
|
|
100
|
+
const auditIntervalMs = auditInterval ?? LOG_AUDIT_INTERVAL;
|
|
101
|
+
const compressionBudgetMs = Math.max(1, Math.floor(auditIntervalMs / 4));
|
|
102
|
+
/**
|
|
103
|
+
* rename() reports ENOENT for a missing destination directory as well as a missing source, and
|
|
104
|
+
* only the second is the benign lost race. The directory is created once at rotator start, so a
|
|
105
|
+
* rotation target removed under a running instance otherwise stops rotation permanently and
|
|
106
|
+
* silently — and with `interval` and no `maxSize` there is no write-path guard to recreate it.
|
|
107
|
+
*/
|
|
108
|
+
function recoverRotationTarget(err) {
|
|
109
|
+
if (err.code !== 'ENOENT' || (0, fs_1.existsSync)(rotatedLogDir))
|
|
110
|
+
return;
|
|
111
|
+
try {
|
|
112
|
+
(0, fs_1.mkdirSync)(rotatedLogDir, { recursive: true });
|
|
113
|
+
harper_logger_ts_1.default.warn(`The log rotation directory ${rotatedLogDir} was missing and has been recreated`);
|
|
114
|
+
}
|
|
115
|
+
catch (mkdirErr) {
|
|
116
|
+
harper_logger_ts_1.default.error('Could not recreate the log rotation directory', rotatedLogDir, mkdirErr);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
96
119
|
const setIntervalId = setInterval(async () => {
|
|
97
|
-
//
|
|
98
|
-
//
|
|
99
|
-
if (
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
if (
|
|
120
|
+
// setInterval does not await the callback, and one pass can now wait on peers; overlapping
|
|
121
|
+
// passes would work the same archive twice and double-compress it.
|
|
122
|
+
if (tickInFlight || ended)
|
|
123
|
+
return;
|
|
124
|
+
tickInFlight = true;
|
|
125
|
+
const tickDeadline = Date.now() + auditIntervalMs;
|
|
126
|
+
// The tick is async but setInterval doesn't await it, so any error that escapes this callback
|
|
127
|
+
// becomes an unhandled rejection rather than surfacing anywhere useful — and since it isn't
|
|
128
|
+
// caught, it also skips the retention cleanup below. Contain everything here and report via
|
|
129
|
+
// the logger instead, so one bad tick (e.g. an unexpected fs error) never kills rotation for
|
|
130
|
+
// the rest of the process's life.
|
|
131
|
+
try {
|
|
132
|
+
if (maxBytes) {
|
|
110
133
|
try {
|
|
111
|
-
|
|
134
|
+
// statSync, and the rename in the same turn: an await here lets a writing thread rotate
|
|
135
|
+
// the generation this tick measured and start a fresh one, which the tick would then
|
|
136
|
+
// archive near-empty.
|
|
137
|
+
const active = (0, fs_1.statSync)(logger.path);
|
|
138
|
+
if (active.size >= maxBytes) {
|
|
139
|
+
lastRotatedLogPath = await moveLogFile(logger.path, rotatedLogDir, logger, compressArchives, active);
|
|
140
|
+
// The interval clock counts from the last rotation of any kind. Without this an
|
|
141
|
+
// instance whose uptime has passed `interval` archives a freshly-created log every
|
|
142
|
+
// interval on top of the size rotations already doing the work.
|
|
143
|
+
lastRotationTime = Date.now();
|
|
144
|
+
}
|
|
112
145
|
}
|
|
113
146
|
catch (err) {
|
|
114
|
-
//
|
|
147
|
+
// A missing or already-rotated active log only invalidates this check; retention below
|
|
148
|
+
// must still run, so skip the check rather than leaving the whole tick.
|
|
149
|
+
recoverRotationTarget(err);
|
|
115
150
|
if (err.code !== 'ENOENT')
|
|
116
151
|
throw err;
|
|
117
152
|
}
|
|
118
153
|
}
|
|
119
|
-
|
|
120
|
-
if (maxInterval) {
|
|
121
|
-
const minSinceLastRotate = Date.now() - lastRotationTime;
|
|
122
|
-
if (minSinceLastRotate >= maxInterval) {
|
|
154
|
+
if (maxInterval) {
|
|
123
155
|
try {
|
|
124
|
-
|
|
125
|
-
|
|
156
|
+
const activeGeneration = generationIdentity((0, fs_1.statSync)(logger.path));
|
|
157
|
+
if (activeGeneration && activeGeneration !== observedGeneration) {
|
|
158
|
+
observedGeneration = activeGeneration;
|
|
159
|
+
lastRotationTime = Date.now();
|
|
160
|
+
}
|
|
126
161
|
}
|
|
127
162
|
catch (err) {
|
|
128
|
-
// If the log file doesn't exist, skip rotation
|
|
129
163
|
if (err.code !== 'ENOENT')
|
|
130
164
|
throw err;
|
|
131
165
|
}
|
|
166
|
+
if (Date.now() - lastRotationTime >= maxInterval) {
|
|
167
|
+
try {
|
|
168
|
+
lastRotatedLogPath = await moveLogFile(logger.path, rotatedLogDir, logger, compressArchives);
|
|
169
|
+
lastRotationTime = Date.now();
|
|
170
|
+
}
|
|
171
|
+
catch (err) {
|
|
172
|
+
// If the log file doesn't exist, skip rotation
|
|
173
|
+
recoverRotationTarget(err);
|
|
174
|
+
if (err.code !== 'ENOENT')
|
|
175
|
+
throw err;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
132
178
|
}
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
//
|
|
136
|
-
//
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
}
|
|
143
|
-
catch (err) {
|
|
144
|
-
// The rotated log dir may not exist yet (nothing rotated so far); nothing to clean up
|
|
145
|
-
if (err.code !== 'ENOENT')
|
|
146
|
-
harper_logger_ts_1.default.error('Error reading rotated log directory', rotatedLogDir, err);
|
|
147
|
-
files = [];
|
|
148
|
-
}
|
|
149
|
-
for (const file of files) {
|
|
179
|
+
// The compression sweep and retention both destroy archives this thread did not rotate, so
|
|
180
|
+
// both need the same proof: every peer releases any descriptor that is not on the live
|
|
181
|
+
// generation, and reports the log paths it is writing. One round trip per tick serves both,
|
|
182
|
+
// and it is not gated on retention being configured — retention is unset by default, and a
|
|
183
|
+
// worker's uncompressed archive still needs finishing.
|
|
184
|
+
if (compressArchives || retention || reclamationPriority) {
|
|
185
|
+
// Enumerated BEFORE the proof, and only these are destroyed: an archive created after the
|
|
186
|
+
// proof was never covered by it, and a peer blocked mid-rotation may still be writing to it.
|
|
187
|
+
let candidates;
|
|
150
188
|
try {
|
|
151
|
-
|
|
152
|
-
if (Date.now() - fileStats.mtimeMs > retentionMs) {
|
|
153
|
-
await fs_1.promises.unlink(path.join(rotatedLogDir, file));
|
|
154
|
-
}
|
|
189
|
+
candidates = await fs_1.promises.readdir(rotatedLogDir);
|
|
155
190
|
}
|
|
156
191
|
catch (err) {
|
|
157
|
-
|
|
192
|
+
if (err.code !== 'ENOENT')
|
|
193
|
+
harper_logger_ts_1.default.error('Error reading rotated log directory', rotatedLogDir, err);
|
|
194
|
+
candidates = [];
|
|
195
|
+
}
|
|
196
|
+
const { released, liveLogPaths } = await (0, logGenerationCoordinator_ts_1.requestStaleDescriptorRelease)(tickDeadline);
|
|
197
|
+
// A peer whose event loop is blocked never answers, and the whole pass then destroys
|
|
198
|
+
// nothing — correct, but it is also the only thing bounding the rotated directory, so an
|
|
199
|
+
// operator who configured retention has to be able to see that it has stopped. Repeat at
|
|
200
|
+
// a low rate so a permanent stall does not disappear after one warning.
|
|
201
|
+
if (!released && Date.now() >= nextReleaseProofReport) {
|
|
202
|
+
nextReleaseProofReport = Date.now() + RELEASE_PROOF_REPORT_INTERVAL;
|
|
203
|
+
releaseProofStalled = true;
|
|
204
|
+
harper_logger_ts_1.default.warn(`Log rotation could not prove every thread released its archived log descriptors; compression and retention are paused for ${rotatedLogDir}`);
|
|
205
|
+
}
|
|
206
|
+
else if (released && releaseProofStalled) {
|
|
207
|
+
releaseProofStalled = false;
|
|
208
|
+
nextReleaseProofReport = 0;
|
|
209
|
+
harper_logger_ts_1.default.notify(`Log rotation descriptor release recovered; retention resumed for ${rotatedLogDir}`);
|
|
210
|
+
}
|
|
211
|
+
const liveLogs = new Set([...liveLogPaths, logger.path].map((p) => path.resolve(p)));
|
|
212
|
+
if (released && (retention || reclamationPriority)) {
|
|
213
|
+
// remove old logs after retention time
|
|
214
|
+
// adjust retention time if there is a reclamation priority in place
|
|
215
|
+
const retentionMs = (0, common_utils_ts_1.convertToMS)(retention ?? '1M') / (1 + reclamationPriority);
|
|
216
|
+
let retentionCompleted = true;
|
|
217
|
+
let examined = 0;
|
|
218
|
+
for (; examined < candidates.length; examined++) {
|
|
219
|
+
if (ended || Date.now() >= tickDeadline) {
|
|
220
|
+
retentionCompleted = false;
|
|
221
|
+
break;
|
|
222
|
+
}
|
|
223
|
+
const file = candidates[(retentionCursor + examined) % candidates.length];
|
|
224
|
+
try {
|
|
225
|
+
const archivePath = path.join(rotatedLogDir, file);
|
|
226
|
+
// An explicitly configured rotation path may contain live component logs too.
|
|
227
|
+
if (liveLogs.has(path.resolve(archivePath)))
|
|
228
|
+
continue;
|
|
229
|
+
// Unlinking an inode a stalled writer still holds loses whatever it writes next
|
|
230
|
+
// just as surely as compressing over it would.
|
|
231
|
+
if ((0, logRotation_ts_1.isArchivePendingQuiescence)(archivePath))
|
|
232
|
+
continue;
|
|
233
|
+
const fileStats = await fs_1.promises.stat(archivePath);
|
|
234
|
+
if (Date.now() - fileStats.mtimeMs > retentionMs) {
|
|
235
|
+
await fs_1.promises.unlink(archivePath);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
catch (err) {
|
|
239
|
+
if (err.code !== 'ENOENT')
|
|
240
|
+
harper_logger_ts_1.default.error('Error trying to remove log', file, err);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
if (retentionCompleted) {
|
|
244
|
+
retentionCursor = 0;
|
|
245
|
+
reclamationPriority = 0;
|
|
246
|
+
}
|
|
247
|
+
else if (candidates.length) {
|
|
248
|
+
retentionCursor = (retentionCursor + examined) % candidates.length;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
if (released && compressArchives && !ended) {
|
|
252
|
+
const compressionFailure = await (0, logRotation_ts_1.compressPendingArchives)(rotatedLogDir, candidates, liveLogs, {
|
|
253
|
+
deadline: Math.min(tickDeadline, Date.now() + compressionBudgetMs),
|
|
254
|
+
shouldStop: () => ended,
|
|
255
|
+
});
|
|
256
|
+
if (compressionFailure)
|
|
257
|
+
harper_logger_ts_1.default.error('Error compressing rotated log', compressionFailure.file, compressionFailure.error);
|
|
158
258
|
}
|
|
159
259
|
}
|
|
160
260
|
}
|
|
161
|
-
|
|
261
|
+
catch (err) {
|
|
262
|
+
harper_logger_ts_1.default.error('Error during log rotation audit tick for', logger.path, err);
|
|
263
|
+
}
|
|
264
|
+
finally {
|
|
265
|
+
try {
|
|
266
|
+
await (0, logRotation_ts_1.retryPendingGenerations)({ deadline: tickDeadline, shouldStop: () => ended });
|
|
267
|
+
}
|
|
268
|
+
catch (err) {
|
|
269
|
+
harper_logger_ts_1.default.error('Error retrying pending log generations for', logger.path, err);
|
|
270
|
+
}
|
|
271
|
+
tickInFlight = false;
|
|
272
|
+
}
|
|
273
|
+
}, auditIntervalMs).unref();
|
|
162
274
|
return {
|
|
163
275
|
end() {
|
|
276
|
+
ended = true;
|
|
164
277
|
clearInterval(setIntervalId);
|
|
165
278
|
},
|
|
166
279
|
getLastRotatedLogPath() {
|
|
167
280
|
return lastRotatedLogPath;
|
|
168
281
|
},
|
|
169
282
|
};
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
const compress = envMgr.get(hdbTerms_ts_1.CONFIG_PARAMS.LOGGING_ROTATION_COMPRESS);
|
|
173
|
-
let fullRotateLogPath = path.join(rotatedLogPath, `HDB-${new Date(Date.now()).toISOString().replaceAll(':', '-')}.log`);
|
|
174
|
-
// Move log file to rotated log path first (if we crash
|
|
175
|
-
// during compression, we don't want to restart the compression with a new file)
|
|
176
|
-
await fs_1.promises.rename(logPath, fullRotateLogPath);
|
|
177
|
-
// Close the rotating logger's own file descriptor now that the file has moved. This must be the
|
|
178
|
-
// logger's own closeLogFile (which resets its internal logFD), not the module-global one — otherwise
|
|
179
|
-
// the descriptor stays open on the moved (and, when compressing, subsequently unlinked) inode until the
|
|
180
|
-
// logger's safety timeout fires, pinning disk space and sending any writes in that window into the
|
|
181
|
-
// rotated/deleted file. Closing it here makes the next write reopen a fresh log file immediately.
|
|
182
|
-
(logger?.closeLogFile ?? harper_logger_ts_1.default.closeLogFile)();
|
|
183
|
-
if (compress) {
|
|
184
|
-
logPath = fullRotateLogPath;
|
|
185
|
-
fullRotateLogPath += '.gz';
|
|
186
|
-
await pipe((0, fs_1.createReadStream)(logPath), (0, zlib_1.createGzip)(), (0, fs_1.createWriteStream)(fullRotateLogPath));
|
|
187
|
-
await fs_1.promises.unlink(logPath);
|
|
283
|
+
function generationIdentity(stats) {
|
|
284
|
+
return stats.ino ? `${stats.dev}:${stats.ino}` : undefined;
|
|
188
285
|
}
|
|
286
|
+
}
|
|
287
|
+
async function moveLogFile(logPath, rotatedLogPath, logger, compress, activeStats) {
|
|
288
|
+
// The rename and the descriptor close must not be separated by an await: the descriptor would
|
|
289
|
+
// otherwise keep feeding the archived inode while the event loop runs. Closing the rotating
|
|
290
|
+
// logger's own descriptor (not the module-global one) is what makes the next write reopen a
|
|
291
|
+
// fresh log file rather than append to the moved — and, when compressing, unlinked — inode.
|
|
292
|
+
// `activeStats` is the caller's own stat of the live generation, when it has one: the size check
|
|
293
|
+
// must rename the generation it measured, and a second stat here could pick up a newer one.
|
|
294
|
+
const generation = (0, logRotation_ts_1.rotateLogFileSync)(logPath, rotatedLogPath, logger?.closeLogFile ?? harper_logger_ts_1.default.closeLogFile, activeStats);
|
|
295
|
+
const publishedPath = await (0, logRotation_ts_1.publishArchivedGeneration)(generation, compress ?? envMgr.get(hdbTerms_ts_1.CONFIG_PARAMS.LOGGING_ROTATION_COMPRESS), (error) => harper_logger_ts_1.default.error('Error compressing rotated log', generation.archivePath, error));
|
|
189
296
|
// This notify log will create a new log file after the previous one has been rotated. It's important to keep this log as notify
|
|
190
|
-
harper_logger_ts_1.default.notify(`hdb.log rotated, old log moved to ${
|
|
191
|
-
return
|
|
297
|
+
harper_logger_ts_1.default.notify(`hdb.log rotated, old log moved to ${publishedPath}`);
|
|
298
|
+
return publishedPath;
|
|
192
299
|
}
|
|
193
300
|
//# sourceMappingURL=logRotator.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logRotator.js","sourceRoot":"","sources":["../../../utility/logging/logRotator.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"logRotator.js","sourceRoot":"","sources":["../../../utility/logging/logRotator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A node's identity — node.hostname, and the replication.hostname / certificate it falls back to —
|
|
3
|
+
* must be a bare hostname or IP literal, not a URL: it becomes the certificate common name and the
|
|
4
|
+
* host replication advertises and dials, so a scheme/port/path/non-string corrupts both (harper#2218,
|
|
5
|
+
* where "ws://http://host:9926:9925" resolves to host "http"). Returns a reason clause when `value`
|
|
6
|
+
* is not a bare host, else undefined. An empty string is "unset" (a caller's cue to fall back), not a
|
|
7
|
+
* violation.
|
|
8
|
+
*/
|
|
9
|
+
export declare function bareHostViolation(value: unknown): string | undefined;
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.bareHostViolation = bareHostViolation;
|
|
4
|
+
const node_net_1 = require("node:net");
|
|
5
|
+
/**
|
|
6
|
+
* A node's identity — node.hostname, and the replication.hostname / certificate it falls back to —
|
|
7
|
+
* must be a bare hostname or IP literal, not a URL: it becomes the certificate common name and the
|
|
8
|
+
* host replication advertises and dials, so a scheme/port/path/non-string corrupts both (harper#2218,
|
|
9
|
+
* where "ws://http://host:9926:9925" resolves to host "http"). Returns a reason clause when `value`
|
|
10
|
+
* is not a bare host, else undefined. An empty string is "unset" (a caller's cue to fall back), not a
|
|
11
|
+
* violation.
|
|
12
|
+
*/
|
|
13
|
+
function bareHostViolation(value) {
|
|
14
|
+
if (typeof value !== 'string')
|
|
15
|
+
return `must be a string, but is a ${value === null ? 'null' : typeof value}`;
|
|
16
|
+
if (value === '')
|
|
17
|
+
return undefined;
|
|
18
|
+
// The identity is stored unbracketed (bracketing belongs to URL construction). Reject a bracketed
|
|
19
|
+
// form so it is never cached — otherwise net.isIP fails on it and the certificate SAN is mistyped
|
|
20
|
+
// as DNS rather than IP, and the same node's identity string would differ by source.
|
|
21
|
+
if (value.includes('[') || value.includes(']'))
|
|
22
|
+
return 'must be an unbracketed IPv6 literal (e.g. "::1", not "[::1]")';
|
|
23
|
+
// A zone id ("fe80::1%eth0") passes net.isIP but has no valid URL authority, so exclude it here.
|
|
24
|
+
if ((0, node_net_1.isIP)(value) && !value.includes('%'))
|
|
25
|
+
return undefined; // a bare IPv4/IPv6 literal is a valid identity
|
|
26
|
+
if (value.includes('://'))
|
|
27
|
+
return 'must not include a URL scheme';
|
|
28
|
+
let url;
|
|
29
|
+
try {
|
|
30
|
+
// Parse under a special scheme so the host grammar matches the ws:// replication URLs that
|
|
31
|
+
// consume this value — a host this accepts is one the consumer accepts (a non-special scheme is
|
|
32
|
+
// more lenient and would pass e.g. "node%20" or "0x7f.1"). A port or path makes url.hostname
|
|
33
|
+
// differ from the input and is caught by the round-trip check below.
|
|
34
|
+
url = new URL(`https://${value}`);
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return 'is not a valid hostname';
|
|
38
|
+
}
|
|
39
|
+
// Report the port before the round-trip check: the parser strips a default port for the scheme it
|
|
40
|
+
// was given (":443" under https), which would otherwise surface as a vaguer "is not a bare hostname".
|
|
41
|
+
if (url.port || (url.hostname && value.slice(url.hostname.length).startsWith(':'))) {
|
|
42
|
+
return 'must not include a port';
|
|
43
|
+
}
|
|
44
|
+
if (url.username || url.password)
|
|
45
|
+
return 'must not include credentials';
|
|
46
|
+
if (url.search)
|
|
47
|
+
return 'must not include a query string';
|
|
48
|
+
if (url.hash)
|
|
49
|
+
return 'must not include a fragment';
|
|
50
|
+
if (url.pathname && url.pathname !== '/')
|
|
51
|
+
return 'must not include a path';
|
|
52
|
+
// The host must survive parsing unchanged (compared case-insensitively, since URL lowercases it);
|
|
53
|
+
// anything that does not round-trip carried extra syntax and is not a bare host.
|
|
54
|
+
if (url.hostname.toLowerCase() !== value.toLowerCase())
|
|
55
|
+
return 'is not a bare hostname';
|
|
56
|
+
return undefined;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=nodeIdentity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nodeIdentity.js","sourceRoot":"","sources":["../../utility/nodeIdentity.ts"],"names":[],"mappings":";;AAUA,8CAkCC;AA5CD,uCAAgC;AAEhC;;;;;;;GAOG;AACH,SAAgB,iBAAiB,CAAC,KAAc;IAC/C,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,8BAA8B,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,KAAK,EAAE,CAAC;IAC7G,IAAI,KAAK,KAAK,EAAE;QAAE,OAAO,SAAS,CAAC;IACnC,kGAAkG;IAClG,kGAAkG;IAClG,qFAAqF;IACrF,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC;QAC7C,OAAO,+DAA+D,CAAC;IACxE,iGAAiG;IACjG,IAAI,IAAA,eAAI,EAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC,CAAC,+CAA+C;IAC1G,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,+BAA+B,CAAC;IAClE,IAAI,GAAG,CAAC;IACR,IAAI,CAAC;QACJ,2FAA2F;QAC3F,gGAAgG;QAChG,6FAA6F;QAC7F,qEAAqE;QACrE,GAAG,GAAG,IAAI,GAAG,CAAC,WAAW,KAAK,EAAE,CAAC,CAAC;IACnC,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,yBAAyB,CAAC;IAClC,CAAC;IACD,kGAAkG;IAClG,sGAAsG;IACtG,IAAI,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;QACpF,OAAO,yBAAyB,CAAC;IAClC,CAAC;IACD,IAAI,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,QAAQ;QAAE,OAAO,8BAA8B,CAAC;IACxE,IAAI,GAAG,CAAC,MAAM;QAAE,OAAO,iCAAiC,CAAC;IACzD,IAAI,GAAG,CAAC,IAAI;QAAE,OAAO,6BAA6B,CAAC;IACnD,IAAI,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,QAAQ,KAAK,GAAG;QAAE,OAAO,yBAAyB,CAAC;IAC3E,kGAAkG;IAClG,iFAAiF;IACjF,IAAI,GAAG,CAAC,QAAQ,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC,WAAW,EAAE;QAAE,OAAO,wBAAwB,CAAC;IACxF,OAAO,SAAS,CAAC;AAClB,CAAC"}
|
|
@@ -57,14 +57,14 @@ async function installModules(req) {
|
|
|
57
57
|
const deprecationWarning = 'install_node_modules is deprecated. Dependencies are automatically installed on' +
|
|
58
58
|
' deploy, and install_node_modules can lead to inconsistent behavior';
|
|
59
59
|
harper_logger_ts_1.default.warn(deprecationWarning, req.projects);
|
|
60
|
-
const validation = modulesValidator(req);
|
|
60
|
+
const { error: validation, value: validatedRequest } = modulesValidator(req);
|
|
61
61
|
if (validation) {
|
|
62
62
|
throw (0, hdbError_ts_1.handleHDBError)(validation, validation.message, HTTP_STATUS_CODES.BAD_REQUEST);
|
|
63
63
|
}
|
|
64
|
-
|
|
64
|
+
const { projects, dry_run: dryRun, allowInstallScripts } = validatedRequest;
|
|
65
65
|
const componentsRootDirPath = (0, configUtils_ts_1.getConfigPath)(hdbTerms_ts_1.CONFIG_PARAMS.COMPONENTSROOT);
|
|
66
66
|
const responseObject = {};
|
|
67
|
-
const args = [
|
|
67
|
+
const args = [...(0, Application_ts_1.packageManagerInstallArguments)('npm', allowInstallScripts, true), '--json'];
|
|
68
68
|
if (dryRun)
|
|
69
69
|
args.push('--dry-run');
|
|
70
70
|
for (const project of projects) {
|
|
@@ -114,15 +114,19 @@ function parseNPMStdErr(stderr) {
|
|
|
114
114
|
}
|
|
115
115
|
}
|
|
116
116
|
/**
|
|
117
|
-
* Validator for
|
|
117
|
+
* Validator for installModules
|
|
118
118
|
* @param {Object} req
|
|
119
|
-
* @returns {*}
|
|
120
119
|
*/
|
|
121
120
|
function modulesValidator(req) {
|
|
121
|
+
// `dryRun` was the only spelling that worked before dry_run was honored; keep it accepted, but
|
|
122
|
+
// reject a request that carries both rather than picking a winner
|
|
122
123
|
const funcSchema = joi_1.default.object({
|
|
123
124
|
projects: joi_1.default.array().min(1).items(joi_1.default.string()).required(),
|
|
124
125
|
dry_run: joi_1.default.boolean().default(false),
|
|
125
|
-
|
|
126
|
-
|
|
126
|
+
allowInstallScripts: joi_1.default.boolean().default(true),
|
|
127
|
+
})
|
|
128
|
+
.rename('dryRun', 'dry_run', { ignoreUndefined: true })
|
|
129
|
+
.rename('install_allow_scripts', 'allowInstallScripts', { ignoreUndefined: true });
|
|
130
|
+
return validator.validateAndConvertBySchema(req, funcSchema);
|
|
127
131
|
}
|
|
128
132
|
//# sourceMappingURL=npmUtilities.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"npmUtilities.js","sourceRoot":"","sources":["../../utility/npmUtilities.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuBb,wCAuDC;AA5ED,8CAAsB;AACtB,2CAA6B;AAE7B,sDAAiE;AAEjE,MAAM,EAAE,iBAAiB,EAAE,GAAG,uBAAS,CAAC;AAExC,8EAAgE;AAChE,kFAAsD;AAEtD,+CAA8C;AAC9C,6DAAyD;AACzD,
|
|
1
|
+
{"version":3,"file":"npmUtilities.js","sourceRoot":"","sources":["../../utility/npmUtilities.ts"],"names":[],"mappings":"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"}
|
|
@@ -22,7 +22,7 @@ export declare const OPERATION_PERMISSION_GROUPS: {
|
|
|
22
22
|
* and bulk load. Does NOT include schema DDL (create_attribute), user/role management,
|
|
23
23
|
* or admin reads (get_configuration, logs). Add those explicitly when needed.
|
|
24
24
|
*/
|
|
25
|
-
readonly standard_user: readonly ["search", "search_by_conditions", "search_by_hash", "search_by_id", "search_by_value", "sql", "describe_all", "describe_schema", "describe_database", "describe_table", "user_info", "get_job", "get_analytics", "list_metrics", "describe_metric", "insert", "update", "upsert", "delete", "csv_data_load", "csv_file_load", "csv_url_load", "import_from_s3"];
|
|
25
|
+
readonly standard_user: readonly ["search", "search_by_conditions", "search_by_hash", "search_by_id", "search_by_value", "sql", "describe_all", "describe_schema", "describe_database", "describe_table", "user_info", "get_job", "get_analytics", "list_metrics", "describe_metric", "insert", "update", "upsert", "put", "delete", "csv_data_load", "csv_file_load", "csv_url_load", "import_from_s3"];
|
|
26
26
|
/**
|
|
27
27
|
* Drive the built-in agent (#626): send prompts, read/list sessions, and approve/cancel
|
|
28
28
|
* runs. Grants a scoped, non-super_user "delegation" role access to the agent without full
|
|
@@ -42,6 +42,8 @@ export declare function registerGrantableOperation(name: string): void;
|
|
|
42
42
|
* primarily for tests that register throwaway ops and must not leak them into the global set.
|
|
43
43
|
*/
|
|
44
44
|
export declare function unregisterGrantableOperation(name: string): void;
|
|
45
|
+
export declare function registerWorkerGrantableOperation(name: string): void;
|
|
46
|
+
export declare function unregisterWorkerGrantableOperation(name: string): void;
|
|
45
47
|
/**
|
|
46
48
|
* Validates that every entry in an operations array is a known operation name or group name.
|
|
47
49
|
* Returns the first invalid entry, or null if all entries are valid.
|
|
@@ -3,6 +3,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.OPERATION_PERMISSION_GROUPS = void 0;
|
|
4
4
|
exports.registerGrantableOperation = registerGrantableOperation;
|
|
5
5
|
exports.unregisterGrantableOperation = unregisterGrantableOperation;
|
|
6
|
+
exports.registerWorkerGrantableOperation = registerWorkerGrantableOperation;
|
|
7
|
+
exports.unregisterWorkerGrantableOperation = unregisterWorkerGrantableOperation;
|
|
6
8
|
exports.validateOperations = validateOperations;
|
|
7
9
|
exports.expandOperationsPerms = expandOperationsPerms;
|
|
8
10
|
const hdbTerms_ts_1 = require("./hdbTerms.js");
|
|
@@ -75,6 +77,7 @@ exports.OPERATION_PERMISSION_GROUPS = {
|
|
|
75
77
|
hdbTerms_ts_1.OPERATIONS_ENUM.INSERT,
|
|
76
78
|
hdbTerms_ts_1.OPERATIONS_ENUM.UPDATE,
|
|
77
79
|
hdbTerms_ts_1.OPERATIONS_ENUM.UPSERT,
|
|
80
|
+
hdbTerms_ts_1.OPERATIONS_ENUM.PUT,
|
|
78
81
|
hdbTerms_ts_1.OPERATIONS_ENUM.DELETE,
|
|
79
82
|
// Bulk load
|
|
80
83
|
hdbTerms_ts_1.OPERATIONS_ENUM.CSV_DATA_LOAD,
|
|
@@ -102,6 +105,11 @@ const validGroups = new Set(Object.keys(exports.OPERATION_PERMISSION_GROUPS));
|
|
|
102
105
|
// permission) whose names may fall outside OPERATIONS_ENUM. Tracked so they're grantable in a
|
|
103
106
|
// role's `operations` allowlist (add_role/alter_role/impersonation validate against this set too).
|
|
104
107
|
const dynamicallyRegisteredOps = new Set();
|
|
108
|
+
// The same, for ops registered on a WORKER and mirrored here by the OPERATION_REGISTERED bridge.
|
|
109
|
+
// Deliberately a separate set: the two threads can register the same name independently (a hot
|
|
110
|
+
// deploy can add a `startOnMainThread` component while the worker offering that name is retiring),
|
|
111
|
+
// so worker-lifecycle cleanup must not be able to revoke a mark this thread made itself.
|
|
112
|
+
const workerRegisteredOps = new Set();
|
|
105
113
|
/**
|
|
106
114
|
* Mark a dynamically-registered operation name as a valid target for role `operations` grants.
|
|
107
115
|
* Called by registerOperationPermission so a component op declaring a permission can actually be
|
|
@@ -117,13 +125,20 @@ function registerGrantableOperation(name) {
|
|
|
117
125
|
function unregisterGrantableOperation(name) {
|
|
118
126
|
dynamicallyRegisteredOps.delete(name);
|
|
119
127
|
}
|
|
128
|
+
function registerWorkerGrantableOperation(name) {
|
|
129
|
+
workerRegisteredOps.add(name);
|
|
130
|
+
}
|
|
131
|
+
function unregisterWorkerGrantableOperation(name) {
|
|
132
|
+
workerRegisteredOps.delete(name);
|
|
133
|
+
}
|
|
120
134
|
/**
|
|
121
135
|
* Validates that every entry in an operations array is a known operation name or group name.
|
|
122
136
|
* Returns the first invalid entry, or null if all entries are valid.
|
|
123
137
|
*/
|
|
124
138
|
function validateOperations(operations) {
|
|
125
139
|
for (const op of operations) {
|
|
126
|
-
if (typeof op !== 'string' ||
|
|
140
|
+
if (typeof op !== 'string' ||
|
|
141
|
+
(!validOps.has(op) && !validGroups.has(op) && !dynamicallyRegisteredOps.has(op) && !workerRegisteredOps.has(op))) {
|
|
127
142
|
return String(op);
|
|
128
143
|
}
|
|
129
144
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"operationPermissions.js","sourceRoot":"","sources":["../../utility/operationPermissions.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"operationPermissions.js","sourceRoot":"","sources":["../../utility/operationPermissions.ts"],"names":[],"mappings":"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"}
|