@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
|
@@ -37,6 +37,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
37
37
|
};
|
|
38
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
39
|
exports.forComponent = exports.getLogFilePath = exports.externalLogger = exports.logLevel = exports.OUTPUTS = void 0;
|
|
40
|
+
exports.updateLogger = updateLogger;
|
|
40
41
|
exports.isErrorLike = isErrorLike;
|
|
41
42
|
exports.disableStdio = disableStdio;
|
|
42
43
|
exports.isStdioBrokenError = isStdioBrokenError;
|
|
@@ -72,6 +73,8 @@ const packageUtils_js_1 = require("../../utility/packageUtils.js");
|
|
|
72
73
|
const globals_js_1 = require("../../globals.js");
|
|
73
74
|
const console_1 = require("console");
|
|
74
75
|
const node_util_1 = require("node:util");
|
|
76
|
+
const logRotation_ts_1 = require("./logRotation.js");
|
|
77
|
+
const logGenerationCoordinator_ts_1 = require("./logGenerationCoordinator.js");
|
|
75
78
|
const { isNativeError } = node_util_1.types;
|
|
76
79
|
// store the native write function so we can call it after we write to the log file (and store it on process.stdout
|
|
77
80
|
// because unit tests will create multiple instances of this module)
|
|
@@ -100,6 +103,17 @@ exports.OUTPUTS = {
|
|
|
100
103
|
// Location of default config YAML.
|
|
101
104
|
const DEFAULT_CONFIG_FILE = join(packageUtils_js_1.PACKAGE_ROOT, 'static', hdbTerms.HDB_DEFAULT_CONFIG_FILE);
|
|
102
105
|
const CLOSE_LOG_FD_TIMEOUT = 10000;
|
|
106
|
+
// Above the module-scope initLogSettings() call below, which reaches getFileLogger: a const
|
|
107
|
+
// declared after it is still in its temporal dead zone when the file sink first reads one.
|
|
108
|
+
const LOG_TIME_USAGE_THRESHOLD = 100;
|
|
109
|
+
// How long to write straight to stdio after the log file refuses an append.
|
|
110
|
+
const APPEND_RETRY_COOLDOWN = 5000;
|
|
111
|
+
// Ceiling on how often a failing rotation may report itself; the failure repeats every check point.
|
|
112
|
+
const ROTATION_REPORT_INTERVAL = 60000;
|
|
113
|
+
const SET_ROTATION_POLICY = Symbol('setRotationPolicy');
|
|
114
|
+
const GET_ROTATION_POLICY = Symbol('getRotationPolicy');
|
|
115
|
+
const FILE_ROTATION_SOURCE = Symbol('fileRotationSource');
|
|
116
|
+
const SERVICE_NAME = worker_threads_1.workerData?.name?.replace(/ /g, '-') || 'main';
|
|
103
117
|
let logConsole;
|
|
104
118
|
let log_to_file;
|
|
105
119
|
let logToStdstreams;
|
|
@@ -149,8 +163,19 @@ let logImmediately;
|
|
|
149
163
|
// Call init to get all the required log settings.
|
|
150
164
|
let hdbProperties;
|
|
151
165
|
let rootConfig;
|
|
152
|
-
|
|
153
|
-
|
|
166
|
+
// `mainLoggerRef` defaults to the module's private `mainLogger` singleton (the real production
|
|
167
|
+
// behavior) but can be overridden by callers (currently just tests) so the inheritance decision
|
|
168
|
+
// below can be exercised against a throwaway logger without reaching into module-private state.
|
|
169
|
+
function updateLogger(logger, logOptions, name, mainLoggerRef = mainLogger) {
|
|
170
|
+
// Fall back to the main logger's rotation (like level/path below) so an external/component
|
|
171
|
+
// logger with no rotation block of its own inherits maxSize/interval/etc rather than losing
|
|
172
|
+
// rotation entirely (#1877). Excluded when `logger` IS mainLoggerRef: the fallback would just
|
|
173
|
+
// reassign mainLogger.rotation to itself, making it impossible to ever clear main's rotation.
|
|
174
|
+
const inheritedRotation = logOptions.rotation ?? (logger === mainLoggerRef ? undefined : mainLoggerRef?.rotation);
|
|
175
|
+
const loggerPolicy = logger[GET_ROTATION_POLICY]?.();
|
|
176
|
+
const mainPolicy = mainLoggerRef?.[GET_ROTATION_POLICY]?.();
|
|
177
|
+
const inheritsRotation = logOptions.rotation == null && logger !== mainLoggerRef;
|
|
178
|
+
const rotationSource = inheritsRotation ? mainPolicy?.source : loggerPolicy?.ownSource;
|
|
154
179
|
let path = logOptions.path;
|
|
155
180
|
if (path) {
|
|
156
181
|
if (!logOptions.root)
|
|
@@ -160,20 +185,49 @@ function updateLogger(logger, logOptions, name) {
|
|
|
160
185
|
path = join(logOptions.root, logName);
|
|
161
186
|
}
|
|
162
187
|
else {
|
|
163
|
-
path =
|
|
188
|
+
path = mainLoggerRef.path;
|
|
164
189
|
if (!logOptions.root)
|
|
165
190
|
logOptions.root = pathModule.dirname(path);
|
|
166
191
|
}
|
|
192
|
+
if (inheritedRotation && inheritedRotation === mainLoggerRef?.rotation && path !== mainLoggerRef?.path) {
|
|
193
|
+
// This logger has no rotation block of its own and is inheriting main's wholesale — but
|
|
194
|
+
// inheriting `rotation.path` too would point this logger's archives at wherever main
|
|
195
|
+
// archives to. If this logger's file lives on a different filesystem/volume than that
|
|
196
|
+
// directory, the rotator's fs.rename() there fails with EXDEV and the tick error leaks
|
|
197
|
+
// (contained in logRotator.ts) without ever rotating this log. Strip the inherited path so
|
|
198
|
+
// rotation instead defaults beside this logger's own path (logRotator's own <log dir>/rotated
|
|
199
|
+
// fallback); an explicit `rotation.path` in this logger's own config still wins, since that
|
|
200
|
+
// goes through `logOptions.rotation` above, not this fallback. Clone rather than mutate:
|
|
201
|
+
// `inheritedRotation` is the literal object shared by mainLogger.rotation and every other
|
|
202
|
+
// component that inherited it.
|
|
203
|
+
//
|
|
204
|
+
// Only when the paths differ. A logger writing to main's own file shares main's rotation
|
|
205
|
+
// state — file loggers are cached per path — so stripping there discards the operator's
|
|
206
|
+
// configured rotation.path for the main log itself, which no EXDEV risk justifies.
|
|
207
|
+
const { path: _inheritedPath, ...rotationWithoutPath } = inheritedRotation;
|
|
208
|
+
setRotationPolicy(rotationWithoutPath);
|
|
209
|
+
}
|
|
210
|
+
else {
|
|
211
|
+
setRotationPolicy(inheritedRotation);
|
|
212
|
+
}
|
|
213
|
+
// After the rotation above: assigning `path` goes through the setter that rebuilds this path's
|
|
214
|
+
// file logger, and it reads `logger.rotation` as it stands at that moment.
|
|
167
215
|
if (path)
|
|
168
216
|
logger.path = path;
|
|
169
217
|
else
|
|
170
218
|
console.error('No path for logger', logOptions);
|
|
171
|
-
logger.level = LOG_LEVEL_HIERARCHY[logOptions.level] ??
|
|
219
|
+
logger.level = LOG_LEVEL_HIERARCHY[logOptions.level] ?? mainLoggerRef?.level ?? LOG_LEVEL_HIERARCHY.info;
|
|
172
220
|
updateConditional(logger);
|
|
173
221
|
logger.logToStdstreams = logOptions.stdStreams ?? false;
|
|
174
222
|
// if there is a configured tag or if a component is logging to default/main log path, use the component name as the tag
|
|
175
223
|
// to differentiate it
|
|
176
|
-
logger.tag = logOptions.tag ?? ((
|
|
224
|
+
logger.tag = logOptions.tag ?? ((mainLoggerRef.path === logger.path || exports.externalLogger.path === logger.path) && name);
|
|
225
|
+
function setRotationPolicy(rotation) {
|
|
226
|
+
if (logger[SET_ROTATION_POLICY])
|
|
227
|
+
logger[SET_ROTATION_POLICY](rotation, rotationSource, inheritsRotation);
|
|
228
|
+
else
|
|
229
|
+
logger.rotation = rotation;
|
|
230
|
+
}
|
|
177
231
|
}
|
|
178
232
|
// creates a logger where the methods are only defined if they are within the log level.
|
|
179
233
|
// Using this conditional logger means that every method call must be optional like log.trace?.('message),
|
|
@@ -202,13 +256,25 @@ function resolveLogPath(configPath, rootPath) {
|
|
|
202
256
|
async function updateLogSettings() {
|
|
203
257
|
if (!rootConfig) {
|
|
204
258
|
// set up the initial watcher
|
|
205
|
-
rootConfig =
|
|
259
|
+
rootConfig = (0, RootConfigWatcher_ts_1.getSharedRootConfigWatcher)();
|
|
206
260
|
// wait for it to be ready
|
|
207
261
|
await rootConfig.ready;
|
|
208
262
|
// TODO: Any way to differentiate changes that we can and can't handle?
|
|
209
263
|
rootConfig.on('change', updateLogSettings);
|
|
210
264
|
}
|
|
211
|
-
|
|
265
|
+
applyLogSettings(rootConfig.config);
|
|
266
|
+
}
|
|
267
|
+
// Separate from the watcher wiring above because the watcher it builds reads a process-wide path,
|
|
268
|
+
// which leaves no way to exercise these settings against a given config.
|
|
269
|
+
function applyLogSettings(rootConfigObject) {
|
|
270
|
+
// `ready` settles on every terminal read outcome, including ones that carry no config at all —
|
|
271
|
+
// see DESIGN.md, "Every terminal read outcome settles the barrier". Applying that as settings
|
|
272
|
+
// would not be "the defaults": `updateLogger` reads an absent `rotation` as rotation off and an
|
|
273
|
+
// absent `console` as console off, so an unreadable config would silently disable logging.
|
|
274
|
+
// What `initLogSettings()` established at startup stands until a real config arrives, which
|
|
275
|
+
// is why the watcher settles those outcomes with no config rather than an empty one.
|
|
276
|
+
if (!rootConfigObject || typeof rootConfigObject !== 'object')
|
|
277
|
+
return;
|
|
212
278
|
const logOptions = rootConfigObject.logging ?? {};
|
|
213
279
|
// Resolve relative paths against rootPath from the same config
|
|
214
280
|
const rootPath = rootConfigObject.rootPath;
|
|
@@ -231,7 +297,9 @@ async function updateLogSettings() {
|
|
|
231
297
|
for (const name in rootConfigObject) {
|
|
232
298
|
// we now scan each component to see if it has logging individual configured
|
|
233
299
|
const component = rootConfigObject[name];
|
|
234
|
-
|
|
300
|
+
// `myComponent:` with nothing under it parses to null, and an async listener's TypeError
|
|
301
|
+
// escapes the watcher's emit guard as an unhandled rejection.
|
|
302
|
+
if (component?.logging) {
|
|
235
303
|
updateLogger(mainLogger.forComponent(name), component.logging, name);
|
|
236
304
|
}
|
|
237
305
|
else if (mainLogger.hasComponent(name)) {
|
|
@@ -431,6 +499,8 @@ module.exports = {
|
|
|
431
499
|
// we can start using the RootConfigWatcher
|
|
432
500
|
start: updateLogSettings,
|
|
433
501
|
startOnMainThread: updateLogSettings,
|
|
502
|
+
// Test-only: applies a config without the process-wide watcher `updateLogSettings` builds.
|
|
503
|
+
_applyLogSettingsForTests: applyLogSettings,
|
|
434
504
|
errorToString,
|
|
435
505
|
errorForLog,
|
|
436
506
|
inspectForLog,
|
|
@@ -438,7 +508,19 @@ module.exports = {
|
|
|
438
508
|
disableStdio,
|
|
439
509
|
isStdioBrokenError,
|
|
440
510
|
externalLogger: exports.externalLogger,
|
|
511
|
+
updateLogger,
|
|
441
512
|
};
|
|
513
|
+
// Writes past the stdio guard installed by installStdioGuard, which would otherwise route the
|
|
514
|
+
// text back into the file logger this is the fallback for, and swallows a broken pipe - there is
|
|
515
|
+
// nowhere left to report it.
|
|
516
|
+
function writeToStdioDirectly(stream, text) {
|
|
517
|
+
try {
|
|
518
|
+
nativeStdWrite.call(stream, text);
|
|
519
|
+
}
|
|
520
|
+
catch {
|
|
521
|
+
// stdio is gone too
|
|
522
|
+
}
|
|
523
|
+
}
|
|
442
524
|
// A bare no-op would read as permanent backpressure to a pipe()'d source; this drains and
|
|
443
525
|
// discards instead.
|
|
444
526
|
function noopWrite(_chunk, encoding, callback) {
|
|
@@ -479,6 +561,14 @@ function logsAtLevel(level) {
|
|
|
479
561
|
function initLogSettings(forceInit = false) {
|
|
480
562
|
try {
|
|
481
563
|
if (hdbProperties === undefined || forceInit) {
|
|
564
|
+
if (forceInit && mainLogger?.[SET_ROTATION_POLICY]) {
|
|
565
|
+
const currentPath = mainLogger.path;
|
|
566
|
+
if (currentPath) {
|
|
567
|
+
const { ownSource } = mainLogger[GET_ROTATION_POLICY]();
|
|
568
|
+
mainLogger[SET_ROTATION_POLICY](undefined, ownSource, false);
|
|
569
|
+
mainLogger.path = currentPath;
|
|
570
|
+
}
|
|
571
|
+
}
|
|
482
572
|
closeLogFile();
|
|
483
573
|
const bootPropsFilePath = getPropsFilePath();
|
|
484
574
|
let properties = (0, assignCmdEnvVariables_ts_1.default)(['ROOTPATH']);
|
|
@@ -557,10 +647,17 @@ function initLogSettings(forceInit = false) {
|
|
|
557
647
|
log_to_file = false;
|
|
558
648
|
logToStdstreams = true;
|
|
559
649
|
exports.logLevel = exports.logLevel === undefined ? defaultLevel : exports.logLevel;
|
|
560
|
-
|
|
650
|
+
// createLogger shadows the module-level `logToStdstreams` with this option, so omitting it
|
|
651
|
+
// drops every log written before a config exists rather than routing it to the streams.
|
|
652
|
+
mainLogger = createLogger({ level: exports.logLevel, stdStreams: logToStdstreams });
|
|
561
653
|
// setup the external logger
|
|
562
654
|
exports.externalLogger = mainLogger.forComponent('external');
|
|
563
655
|
exports.externalLogger.tag = null; // don't tag by default
|
|
656
|
+
// The streams are this branch's only sink, so it needs the same EPIPE/EIO listeners the
|
|
657
|
+
// configured path installs below: `harper install | head -1` closes the reader, and the
|
|
658
|
+
// async error would otherwise land on a stream with none and take the install down. The
|
|
659
|
+
// guard's write override is inert here, because `log_to_file` is false.
|
|
660
|
+
stdioLogging();
|
|
564
661
|
return;
|
|
565
662
|
}
|
|
566
663
|
console.error(err);
|
|
@@ -648,14 +745,18 @@ function suppressLogging(callback) {
|
|
|
648
745
|
loggingEnabled = true;
|
|
649
746
|
}
|
|
650
747
|
}
|
|
651
|
-
const SERVICE_NAME = worker_threads_1.workerData?.name?.replace(/ /g, '-') || 'main';
|
|
652
748
|
// these are used to store information about the current service and tag so we can prepend them to the log during
|
|
653
749
|
// the writes, without having to pass the information through the Console instance
|
|
654
750
|
let currentLevel = 'info'; // default is info
|
|
655
751
|
let currentServiceName;
|
|
656
752
|
let currentTag;
|
|
657
753
|
function createLogger(options = {}) {
|
|
658
|
-
let { path: logFilePath, level: logLevel, stdStreams: logToStdstreams, rotation, isExternalInstance, writeToLog, component, } = options;
|
|
754
|
+
let { path: logFilePath, level: logLevel, stdStreams: logToStdstreams, rotation, isExternalInstance, writeToLog, component, rotationSource, rotationInherited = false, } = options;
|
|
755
|
+
const ownRotationSource = Symbol('rotationPolicySource');
|
|
756
|
+
let currentRotationSource = rotationSource ?? ownRotationSource;
|
|
757
|
+
let previousRotationSource;
|
|
758
|
+
let currentRotationInherited = rotationInherited;
|
|
759
|
+
let rotationChangeIsAuthoritative = rotation !== undefined;
|
|
659
760
|
if (!logLevel)
|
|
660
761
|
logLevel = 'info';
|
|
661
762
|
let level = typeof logLevel === 'number' ? logLevel : LOG_LEVEL_HIERARCHY[logLevel];
|
|
@@ -706,7 +807,8 @@ function createLogger(options = {}) {
|
|
|
706
807
|
else if (logToStdstreams)
|
|
707
808
|
process.stderr.write(log);
|
|
708
809
|
}
|
|
709
|
-
let logToFile = logFilePath && getFileLogger(logFilePath, rotation, isExternalInstance);
|
|
810
|
+
let logToFile = logFilePath && getFileLogger(logFilePath, rotation, isExternalInstance, rotationPolicy());
|
|
811
|
+
rotationPolicyApplied();
|
|
710
812
|
function logPrepend(write) {
|
|
711
813
|
return {
|
|
712
814
|
write(log) {
|
|
@@ -728,6 +830,14 @@ function createLogger(options = {}) {
|
|
|
728
830
|
stderr: logPrepend(writeToLog ?? logStdErr),
|
|
729
831
|
colorMode: (logToStdstreams && colorMode) || false,
|
|
730
832
|
}, level);
|
|
833
|
+
logger[SET_ROTATION_POLICY] = function (newRotation, source = ownRotationSource, inherited = false) {
|
|
834
|
+
previousRotationSource = currentRotationSource;
|
|
835
|
+
currentRotationSource = source ?? ownRotationSource;
|
|
836
|
+
currentRotationInherited = inherited;
|
|
837
|
+
rotationChangeIsAuthoritative = true;
|
|
838
|
+
logger.rotation = newRotation;
|
|
839
|
+
};
|
|
840
|
+
logger[GET_ROTATION_POLICY] = () => ({ ownSource: ownRotationSource, source: currentRotationSource });
|
|
731
841
|
updateConditional(logger);
|
|
732
842
|
logger.path = logFilePath;
|
|
733
843
|
Object.defineProperty(logger, 'path', {
|
|
@@ -736,7 +846,10 @@ function createLogger(options = {}) {
|
|
|
736
846
|
},
|
|
737
847
|
set(path) {
|
|
738
848
|
logFilePath = path;
|
|
739
|
-
|
|
849
|
+
if (!logFilePath)
|
|
850
|
+
return;
|
|
851
|
+
logToFile = getFileLogger(logFilePath, logger.rotation, isExternalInstance, rotationPolicy());
|
|
852
|
+
rotationPolicyApplied();
|
|
740
853
|
if (isExternalInstance)
|
|
741
854
|
writeToLogFile = logToFile;
|
|
742
855
|
},
|
|
@@ -750,12 +863,15 @@ function createLogger(options = {}) {
|
|
|
750
863
|
let componentLogger = components.get(name);
|
|
751
864
|
if (!componentLogger) {
|
|
752
865
|
const protoLogger = isExternal ? exports.externalLogger : logger;
|
|
866
|
+
const protoRotationPolicy = protoLogger[GET_ROTATION_POLICY]?.();
|
|
753
867
|
componentLogger = createLogger({
|
|
754
868
|
path: protoLogger.path,
|
|
755
869
|
level: protoLogger.level,
|
|
756
870
|
stdStreams: protoLogger.logToStdstreams,
|
|
757
871
|
isExternalInstance: isExternal || name === 'external',
|
|
758
872
|
rotation: protoLogger.rotation,
|
|
873
|
+
rotationSource: protoRotationPolicy?.source,
|
|
874
|
+
rotationInherited: true,
|
|
759
875
|
writeToLog,
|
|
760
876
|
component: true,
|
|
761
877
|
});
|
|
@@ -772,33 +888,80 @@ function createLogger(options = {}) {
|
|
|
772
888
|
logger.components = components;
|
|
773
889
|
}
|
|
774
890
|
return logger;
|
|
891
|
+
function rotationPolicy() {
|
|
892
|
+
return {
|
|
893
|
+
source: currentRotationSource,
|
|
894
|
+
previousSource: previousRotationSource,
|
|
895
|
+
inherited: currentRotationInherited,
|
|
896
|
+
authoritative: rotationChangeIsAuthoritative,
|
|
897
|
+
};
|
|
898
|
+
}
|
|
899
|
+
function rotationPolicyApplied() {
|
|
900
|
+
previousRotationSource = currentRotationSource;
|
|
901
|
+
rotationChangeIsAuthoritative = false;
|
|
902
|
+
}
|
|
775
903
|
}
|
|
776
|
-
const LOG_TIME_USAGE_THRESHOLD = 100;
|
|
777
904
|
/**
|
|
778
905
|
* Get the file logger for the given path. If it doesn't exist, create it.
|
|
779
906
|
* @param path
|
|
780
907
|
* @param isExternalInstance
|
|
781
908
|
* @return {any}
|
|
782
909
|
*/
|
|
783
|
-
function getFileLogger(path, rotation, isExternalInstance) {
|
|
910
|
+
function getFileLogger(path, rotation, isExternalInstance, rotationPolicy) {
|
|
784
911
|
let logger = fileLoggers.get(path);
|
|
785
|
-
let logFD, loggedFDError, logTimer;
|
|
912
|
+
let logFD, loggedFDError, loggedAppendError, logTimer, retryAppendAfter;
|
|
786
913
|
let logBuffer;
|
|
914
|
+
let rotationProblemNotice;
|
|
787
915
|
let logTimeUsage = 0;
|
|
916
|
+
let rotationGuard, logFDIdentity, nextRotationReport = 0;
|
|
788
917
|
if (!logger) {
|
|
789
918
|
logger = logToFile;
|
|
790
919
|
logger.closeLogFile = closeLogFile;
|
|
920
|
+
// The guard has to be installed through the live closure: later calls for this path get the
|
|
921
|
+
// cached logger back, and their own logFD/logBuffer are dead.
|
|
922
|
+
logger.installRotationGuard = installRotationGuard;
|
|
791
923
|
logger.path = path;
|
|
792
924
|
fileLoggers.set(path, logger);
|
|
793
|
-
|
|
794
|
-
|
|
925
|
+
// Registered by the sink, not by the size guard: a thread that writes this file but has no
|
|
926
|
+
// guard (no maxSize, or rotation driven only by interval) still holds a descriptor, and an
|
|
927
|
+
// answer from it has to mean "released" rather than only "handler ran".
|
|
928
|
+
(0, logGenerationCoordinator_ts_1.registerLogSink)(path, { identity: () => logFDIdentity, close: closeLogFile });
|
|
929
|
+
}
|
|
930
|
+
const currentSource = logger[FILE_ROTATION_SOURCE];
|
|
931
|
+
const sameSource = currentSource === rotationPolicy.source;
|
|
932
|
+
const replacesPreviousSource = currentSource !== undefined && currentSource === rotationPolicy.previousSource;
|
|
933
|
+
const canInstall = rotation !== undefined &&
|
|
934
|
+
(!rotationPolicy.inherited || currentSource === undefined || sameSource || replacesPreviousSource);
|
|
935
|
+
const canClear = rotation === undefined && rotationPolicy.authoritative && (sameSource || replacesPreviousSource);
|
|
936
|
+
let reconfigured = false;
|
|
937
|
+
if (canInstall) {
|
|
938
|
+
logger[FILE_ROTATION_SOURCE] = rotationPolicy.source;
|
|
939
|
+
reconfigured = JSON.stringify(rotation) !== JSON.stringify(logger.rotation);
|
|
940
|
+
}
|
|
941
|
+
if (reconfigured) {
|
|
795
942
|
logger.rotation = rotation;
|
|
943
|
+
// Every writing thread, and synchronously: request logging is produced by the HTTP workers, and
|
|
944
|
+
// at the rates that make maxSize matter a deferred guard misses megabytes before it exists.
|
|
945
|
+
logger.installRotationGuard(rotation);
|
|
946
|
+
}
|
|
947
|
+
else if (canClear) {
|
|
948
|
+
logger.rotation = undefined;
|
|
949
|
+
logger[FILE_ROTATION_SOURCE] = undefined;
|
|
950
|
+
logger.installRotationGuard(undefined);
|
|
951
|
+
reconfigured = true;
|
|
952
|
+
}
|
|
953
|
+
if (worker_threads_1.isMainThread && reconfigured) {
|
|
796
954
|
setTimeout(() => {
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
const { logRotator } = require('./logRotator');
|
|
955
|
+
// Everything inside the try: a throw from a timer callback is unhandled, and neither
|
|
956
|
+
// require('./logRotator') (which reaches environmentManager's synchronous init) nor a
|
|
957
|
+
// rotator teardown may take the process down over log rotation (#847).
|
|
801
958
|
try {
|
|
959
|
+
const previousRotator = logger.rotator;
|
|
960
|
+
logger.rotator = undefined;
|
|
961
|
+
previousRotator?.end();
|
|
962
|
+
if (!rotation)
|
|
963
|
+
return;
|
|
964
|
+
const { logRotator } = require('./logRotator');
|
|
802
965
|
logger.rotator = logRotator({
|
|
803
966
|
logger,
|
|
804
967
|
...rotation,
|
|
@@ -810,6 +973,50 @@ function getFileLogger(path, rotation, isExternalInstance) {
|
|
|
810
973
|
}, 100);
|
|
811
974
|
}
|
|
812
975
|
return logger;
|
|
976
|
+
function installRotationGuard(newRotation) {
|
|
977
|
+
rotationGuard = undefined;
|
|
978
|
+
if (!newRotation || newRotation.enabled === false)
|
|
979
|
+
return;
|
|
980
|
+
const maxBytes = (0, logRotation_ts_1.parseMaxSize)(newRotation.maxSize);
|
|
981
|
+
if (!maxBytes) {
|
|
982
|
+
if (newRotation.maxSize != null)
|
|
983
|
+
reportRotationProblem(`logging.rotation.maxSize: ${logRotation_ts_1.INVALID_MAX_SIZE_MSG}`);
|
|
984
|
+
return;
|
|
985
|
+
}
|
|
986
|
+
try {
|
|
987
|
+
rotationGuard = (0, logRotation_ts_1.createRotationGuard)({
|
|
988
|
+
logPath: path,
|
|
989
|
+
maxBytes,
|
|
990
|
+
rotatedLogDir: (0, logRotation_ts_1.resolveRotatedLogDir)(path, newRotation.path),
|
|
991
|
+
// From the rotation block rather than environmentManager (which logRotator still reads):
|
|
992
|
+
// environmentManager imports this module, so it cannot be reached from the write path.
|
|
993
|
+
compress: newRotation.compress,
|
|
994
|
+
getLogIdentity: () => logFDIdentity,
|
|
995
|
+
closeLogFile,
|
|
996
|
+
report: reportRotationProblem,
|
|
997
|
+
onRotated(archivePath) {
|
|
998
|
+
// Same shape as every other line in the file: written straight to the sink, this
|
|
999
|
+
// bypasses the prefix createLogger's logPrepend adds, and readLog parses by level.
|
|
1000
|
+
logToFile(`[${SERVICE_NAME}/${worker_threads_1.threadId}] [notify]: hdb.log rotated, old log moved to ${archivePath}`);
|
|
1001
|
+
},
|
|
1002
|
+
});
|
|
1003
|
+
}
|
|
1004
|
+
catch (error) {
|
|
1005
|
+
reportRotationProblem(`log rotation is disabled for ${path}: ${error}`);
|
|
1006
|
+
}
|
|
1007
|
+
}
|
|
1008
|
+
function reportRotationProblem(text) {
|
|
1009
|
+
// Straight to stdio, never back through this sink: the sink is what rotation is failing on.
|
|
1010
|
+
// Rate-limited rather than once-only, so a later, different failure is still reported.
|
|
1011
|
+
if (nextRotationReport > performance.now())
|
|
1012
|
+
return;
|
|
1013
|
+
nextRotationReport = performance.now() + ROTATION_REPORT_INTERVAL;
|
|
1014
|
+
const message = `Harper log rotation problem — ${text}`;
|
|
1015
|
+
// Scripted services discard stdio. Preserve the warning in the active file on the next
|
|
1016
|
+
// successful append as well, without recursing through the rotation guard.
|
|
1017
|
+
rotationProblemNotice = `${new Date().toISOString()} [${SERVICE_NAME}/${worker_threads_1.threadId}] [error]: ${message}\n`;
|
|
1018
|
+
writeToStdioDirectly(process.stderr, `${message}\n`);
|
|
1019
|
+
}
|
|
813
1020
|
function logToFile(log) {
|
|
814
1021
|
let entry = `${new Date().toISOString()} ${log}${log.endsWith('\n') ? '' : '\n'}`;
|
|
815
1022
|
if (logBuffer) {
|
|
@@ -839,19 +1046,51 @@ function getFileLogger(path, rotation, isExternalInstance) {
|
|
|
839
1046
|
}
|
|
840
1047
|
// this is called on a timer, and will write the log buffer to the file
|
|
841
1048
|
function logQueuedData(entry) {
|
|
1049
|
+
const payload = logBuffer ? logBuffer.join('') : entry;
|
|
1050
|
+
// Released before anything can re-enter: the rotation notice is written from inside the append
|
|
1051
|
+
// below, and a re-entrant flush still holding this batch would write it twice.
|
|
1052
|
+
logBuffer = null;
|
|
1053
|
+
if (payload === undefined)
|
|
1054
|
+
return;
|
|
1055
|
+
// A file that just refused a write will refuse the next one too, and every attempt costs a
|
|
1056
|
+
// failed syscall plus a thrown error on whatever path is logging - which, on a full volume,
|
|
1057
|
+
// is the request path at full rate. Go straight to stdio until the cooldown expires.
|
|
1058
|
+
// Opened after the guard: a guard recovering by rotation closes this descriptor first.
|
|
1059
|
+
const mayAppend = !(retryAppendAfter > performance.now()) && (rotationGuard?.beforeAppend() ?? true);
|
|
842
1060
|
openLogFile(undefined);
|
|
843
|
-
if (logFD) {
|
|
1061
|
+
if (logFD && mayAppend) {
|
|
844
1062
|
let startTime = performance.now();
|
|
845
|
-
|
|
1063
|
+
try {
|
|
1064
|
+
const appendPayload = rotationProblemNotice ? rotationProblemNotice + payload : payload;
|
|
1065
|
+
const appendBuffer = Buffer.from(appendPayload);
|
|
1066
|
+
fs.appendFileSync(logFD, appendBuffer);
|
|
1067
|
+
rotationProblemNotice = undefined;
|
|
1068
|
+
// Both cleared, so a volume that fills again months later reports itself again
|
|
1069
|
+
retryAppendAfter = undefined;
|
|
1070
|
+
loggedAppendError = false;
|
|
1071
|
+
rotationGuard?.recordWrite(appendBuffer.length);
|
|
1072
|
+
}
|
|
1073
|
+
catch (error) {
|
|
1074
|
+
retryAppendAfter = performance.now() + APPEND_RETRY_COOLDOWN;
|
|
1075
|
+
// A log write must never take the process down: on an exhausted volume this throws from
|
|
1076
|
+
// both inline and timer call sites, making every log statement a crash point (#847).
|
|
1077
|
+
// The fallback goes through nativeStdWrite rather than console because
|
|
1078
|
+
// installStdioGuard routes console output back into this same file logger when
|
|
1079
|
+
// logging.file and logging.console are both on, which would recurse until the stack blew.
|
|
1080
|
+
if (!loggedAppendError) {
|
|
1081
|
+
loggedAppendError = true;
|
|
1082
|
+
writeToStdioDirectly(process.stderr, `Harper cannot write to its log file: ${error}\n`);
|
|
1083
|
+
}
|
|
1084
|
+
writeToStdioDirectly(process.stdout, payload);
|
|
1085
|
+
return;
|
|
1086
|
+
}
|
|
846
1087
|
let endTime = performance.now();
|
|
847
1088
|
// determine if we are using more than about two percent of processing time for log writes recently, and if so, we
|
|
848
1089
|
// will start buffering
|
|
849
1090
|
logTimeUsage = Math.max(endTime, logTimeUsage) + (endTime - startTime) * 50;
|
|
850
1091
|
}
|
|
851
|
-
else
|
|
852
|
-
|
|
853
|
-
if (logBuffer)
|
|
854
|
-
logBuffer = null;
|
|
1092
|
+
else
|
|
1093
|
+
writeToStdioDirectly(process.stdout, payload);
|
|
855
1094
|
}
|
|
856
1095
|
function closeLogFile(_unused) {
|
|
857
1096
|
try {
|
|
@@ -859,6 +1098,7 @@ function getFileLogger(path, rotation, isExternalInstance) {
|
|
|
859
1098
|
}
|
|
860
1099
|
catch { }
|
|
861
1100
|
logFD = null;
|
|
1101
|
+
logFDIdentity = null;
|
|
862
1102
|
if (isExternalInstance)
|
|
863
1103
|
mainLogFd = null;
|
|
864
1104
|
}
|
|
@@ -866,14 +1106,29 @@ function getFileLogger(path, rotation, isExternalInstance) {
|
|
|
866
1106
|
if (!logFD) {
|
|
867
1107
|
try {
|
|
868
1108
|
logFD = fs.openSync(path, 'a');
|
|
1109
|
+
// Which generation this descriptor belongs to, recorded once here so the size guard's
|
|
1110
|
+
// checkpoint needs a single pathname stat to tell whether the file has moved under it.
|
|
1111
|
+
try {
|
|
1112
|
+
const opened = fs.fstatSync(logFD);
|
|
1113
|
+
logFDIdentity = { ino: opened.ino, dev: opened.dev };
|
|
1114
|
+
}
|
|
1115
|
+
catch {
|
|
1116
|
+
logFDIdentity = null;
|
|
1117
|
+
}
|
|
869
1118
|
if (isExternalInstance)
|
|
870
1119
|
mainLogFd = logFD;
|
|
871
1120
|
}
|
|
872
1121
|
catch (error) {
|
|
873
1122
|
if (error.code === 'ENOENT' && !isRetry) {
|
|
874
1123
|
// if the directory doesn't exist, create it
|
|
875
|
-
|
|
876
|
-
|
|
1124
|
+
try {
|
|
1125
|
+
fs.mkdirpSync(pathModule.dirname(path));
|
|
1126
|
+
return openLogFile(true);
|
|
1127
|
+
}
|
|
1128
|
+
catch (mkdirError) {
|
|
1129
|
+
// creating the log directory can fail for the same reason the log write can
|
|
1130
|
+
error = mkdirError;
|
|
1131
|
+
}
|
|
877
1132
|
}
|
|
878
1133
|
if (!loggedFDError) {
|
|
879
1134
|
loggedFDError = true;
|
|
@@ -1906,5 +2161,6 @@ exports.default = {
|
|
|
1906
2161
|
errorForLog,
|
|
1907
2162
|
inspectForLog,
|
|
1908
2163
|
isErrorLike,
|
|
2164
|
+
updateLogger,
|
|
1909
2165
|
};
|
|
1910
2166
|
//# sourceMappingURL=harper_logger.js.map
|