@harperfast/harper 5.3.0-alpha.1 → 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/bin/cliOperations.ts +12 -0
- package/bin/restart.ts +66 -6
- package/components/Application.ts +1134 -112
- package/components/OptionsWatcher.ts +368 -102
- package/components/Scope.ts +20 -1
- package/components/componentLoader.ts +43 -4
- package/components/deploymentOperations.ts +4 -1
- package/components/deploymentRecorder.ts +9 -2
- package/components/operations.js +284 -52
- package/components/operationsValidation.js +49 -2
- package/components/packageComponent.ts +25 -1
- package/components/requestRestart.ts +11 -0
- package/config/RootConfigWatcher.ts +191 -37
- package/config/configReadRetry.ts +62 -0
- package/config/configUtils.ts +78 -26
- package/config/parseConfigFile.ts +34 -0
- package/config/readConfigFileSync.ts +44 -0
- package/config/watcherArming.ts +59 -0
- package/config-root.schema.json +4 -0
- package/dataLayer/harperBridge/ResourceBridge.ts +28 -2
- package/dist/bin/cliOperations.js +13 -0
- package/dist/bin/cliOperations.js.map +1 -1
- package/dist/bin/restart.js +42 -6
- package/dist/bin/restart.js.map +1 -1
- package/dist/components/Application.d.ts +104 -9
- package/dist/components/Application.js +954 -102
- package/dist/components/Application.js.map +1 -1
- package/dist/components/OptionsWatcher.d.ts +4 -1
- package/dist/components/OptionsWatcher.js +378 -104
- package/dist/components/OptionsWatcher.js.map +1 -1
- package/dist/components/Scope.js +15 -1
- package/dist/components/Scope.js.map +1 -1
- package/dist/components/componentLoader.js +35 -3
- package/dist/components/componentLoader.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/operations.d.ts +28 -0
- package/dist/components/operations.js +263 -54
- package/dist/components/operations.js.map +1 -1
- package/dist/components/operationsValidation.js +48 -2
- 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/config/RootConfigWatcher.d.ts +2 -0
- package/dist/config/RootConfigWatcher.js +189 -35
- 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 +10 -9
- package/dist/config/configUtils.js +63 -27
- package/dist/config/configUtils.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/harperBridge/ResourceBridge.js +21 -2
- package/dist/dataLayer/harperBridge/ResourceBridge.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/json/systemSchema.json +3 -0
- package/dist/resources/DatabaseTransaction.d.ts +25 -0
- package/dist/resources/DatabaseTransaction.js +224 -18
- package/dist/resources/DatabaseTransaction.js.map +1 -1
- package/dist/resources/LMDBTransaction.d.ts +2 -1
- package/dist/resources/LMDBTransaction.js +22 -3
- package/dist/resources/LMDBTransaction.js.map +1 -1
- package/dist/resources/PrimaryRocksDatabase.js +22 -6
- package/dist/resources/PrimaryRocksDatabase.js.map +1 -1
- package/dist/resources/RecordEncoder.d.ts +1 -1
- package/dist/resources/RecordEncoder.js +21 -5
- package/dist/resources/RecordEncoder.js.map +1 -1
- package/dist/resources/Resource.js +97 -13
- package/dist/resources/Resource.js.map +1 -1
- package/dist/resources/ResourceInterface.d.ts +8 -0
- package/dist/resources/RocksIndexStore.js +2 -1
- package/dist/resources/RocksIndexStore.js.map +1 -1
- package/dist/resources/RocksTransactionLogStore.d.ts +10 -0
- package/dist/resources/RocksTransactionLogStore.js +104 -33
- package/dist/resources/RocksTransactionLogStore.js.map +1 -1
- package/dist/resources/Table.d.ts +58 -7
- package/dist/resources/Table.js +1095 -346
- 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 +170 -0
- package/dist/resources/auditStore.js +457 -11
- package/dist/resources/auditStore.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 +16 -13
- package/dist/resources/databases.js +624 -176
- package/dist/resources/databases.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.js +3 -2
- package/dist/resources/graphql.js.map +1 -1
- package/dist/resources/indexes/HierarchicalNavigableSmallWorld.d.ts +102 -9
- package/dist/resources/indexes/HierarchicalNavigableSmallWorld.js +848 -39
- 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/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 +47 -4
- package/dist/resources/recordLock.js +138 -7
- package/dist/resources/recordLock.js.map +1 -1
- 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.js +5 -0
- package/dist/resources/replayLogs.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 +160 -40
- 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/security/jsLoader.js +6 -4
- package/dist/security/jsLoader.js.map +1 -1
- package/dist/server/REST.js +33 -2
- package/dist/server/REST.js.map +1 -1
- package/dist/server/http.d.ts +5 -1
- package/dist/server/http.js +34 -2
- package/dist/server/http.js.map +1 -1
- package/dist/server/serverHelpers/Headers.d.ts +2 -0
- package/dist/server/serverHelpers/Headers.js +6 -0
- 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 +2 -0
- package/dist/server/serverHelpers/contentTypes.js +189 -15
- package/dist/server/serverHelpers/contentTypes.js.map +1 -1
- package/dist/server/serverHelpers/serverUtilities.js +96 -17
- package/dist/server/serverHelpers/serverUtilities.js.map +1 -1
- package/dist/server/storageReclamation.js +1 -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/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 +64 -6
- package/dist/server/threads/manageThreads.js +261 -12
- package/dist/server/threads/manageThreads.js.map +1 -1
- package/dist/server/threads/socketRouter.d.ts +1 -0
- package/dist/server/threads/socketRouter.js +196 -13
- package/dist/server/threads/socketRouter.js.map +1 -1
- package/dist/server/threads/threadServer.js +30 -7
- package/dist/server/threads/threadServer.js.map +1 -1
- package/dist/utility/errors/hdbError.d.ts +24 -0
- package/dist/utility/errors/hdbError.js +58 -1
- package/dist/utility/errors/hdbError.js.map +1 -1
- package/dist/utility/hdbTerms.d.ts +2 -0
- package/dist/utility/hdbTerms.js +2 -0
- package/dist/utility/hdbTerms.js.map +1 -1
- package/dist/utility/logging/harper_logger.js +217 -38
- 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 +172 -92
- package/dist/utility/logging/logRotator.js.map +1 -1
- package/dist/utility/npmUtilities.js +6 -4
- package/dist/utility/npmUtilities.js.map +1 -1
- package/dist/utility/watcherFallback.d.ts +0 -45
- package/dist/utility/watcherFallback.js +1 -125
- package/dist/utility/watcherFallback.js.map +1 -1
- package/dist/validation/configValidator.js +6 -3
- package/dist/validation/configValidator.js.map +1 -1
- package/index.ts +6 -0
- package/json/systemSchema.json +3 -0
- package/npm-shrinkwrap.json +131 -41
- package/package.json +10 -3
- package/resources/DESIGN.md +124 -19
- package/resources/DatabaseTransaction.ts +230 -17
- package/resources/LMDBTransaction.ts +21 -3
- package/resources/PrimaryRocksDatabase.ts +20 -7
- package/resources/RecordEncoder.ts +25 -5
- package/resources/Resource.ts +97 -13
- package/resources/ResourceInterface.ts +8 -0
- package/resources/RocksIndexStore.ts +2 -1
- package/resources/RocksTransactionLogStore.ts +111 -31
- package/resources/Table.ts +1224 -393
- package/resources/analytics/write.ts +10 -3
- package/resources/auditStore.ts +460 -11
- package/resources/dataLoader.ts +3 -4
- package/resources/databases.ts +610 -146
- package/resources/derivedIndexRegistry.ts +56 -0
- package/resources/derivedIndexRuntime.ts +2292 -0
- package/resources/graphql.ts +3 -2
- package/resources/indexes/HierarchicalNavigableSmallWorld.ts +905 -46
- package/resources/indexes/hnswDerivedIndex.ts +531 -0
- package/resources/indexes/hnswPlaneBinding.ts +174 -0
- package/resources/nodeIdMapping.ts +50 -0
- package/resources/recordLock.ts +173 -7
- package/resources/recordLockCoordinator.ts +3043 -0
- package/resources/replayLogs.ts +5 -0
- package/resources/replicatedApplyFailure.ts +77 -0
- package/resources/scheduler/scheduler.ts +4 -4
- package/resources/search.ts +169 -49
- package/resources/tracked.ts +73 -22
- package/security/jsLoader.ts +6 -4
- package/server/DESIGN.md +11 -0
- package/server/REST.ts +36 -3
- package/server/http.ts +34 -2
- package/server/serverHelpers/Headers.ts +5 -1
- package/server/serverHelpers/NodeAdapterResponse.ts +221 -0
- package/server/serverHelpers/Request.ts +33 -131
- package/server/serverHelpers/contentTypes.ts +188 -15
- package/server/serverHelpers/serverUtilities.ts +143 -24
- package/server/storageReclamation.ts +2 -2
- package/server/threads/isolatedApplications.ts +157 -0
- package/server/threads/logRotationTransport.ts +40 -0
- package/server/threads/manageThreads.js +254 -12
- package/server/threads/socketRouter.ts +217 -11
- package/server/threads/threadServer.js +30 -7
- package/studio/web/assets/{Chat-BnCBegQz.js → Chat-D3j-1yY1.js} +1 -1
- package/studio/web/assets/{FloatingChat-CoDW1ySS.js → FloatingChat-BxJGYcfB.js} +3 -3
- package/studio/web/assets/{apiToken-Bwk5BLXW.js → apiToken-CT55oWOe.js} +1 -1
- package/studio/web/assets/{applications-DHxGi7JH.js → applications-D9Ct9_vm.js} +1 -1
- package/studio/web/assets/{cssMode-s0cWI-_M.js → cssMode-DV8H7VwA.js} +1 -1
- package/studio/web/assets/{editor-DNcRHK54.js → editor-uatc0unt.js} +1 -1
- package/studio/web/assets/{html-Bdssedlg.js → html-Bm6D6paN.js} +1 -1
- package/studio/web/assets/{htmlMode-CoDlJ3fw.js → htmlMode-CEn7tpLG.js} +1 -1
- package/studio/web/assets/{index-D6sxmFLR.js → index-BIXW6Pu4.js} +5 -5
- package/studio/web/assets/{index.lazy-tmU5BS8s.js → index.lazy-UI7L-Vrk.js} +1 -1
- package/studio/web/assets/{javascript-B8meVSTH.js → javascript-CJ0G3AFZ.js} +1 -1
- package/studio/web/assets/{jsonMode-DpIPd35T.js → jsonMode-DQADAYEa.js} +1 -1
- package/studio/web/assets/{languageServices-C_5FMJzQ.js → languageServices-CAQJXWcI.js} +1 -1
- package/studio/web/assets/{lspLanguageFeatures-BIzNBzPK.js → lspLanguageFeatures-CCQ8P5sY.js} +1 -1
- package/studio/web/assets/{notifications-CQf18QKb.js → notifications-BbxTU6Aw.js} +1 -1
- package/studio/web/assets/{notifications-CvZivSbh.js → notifications-Cvb3P1lB.js} +1 -1
- package/studio/web/assets/{profile-DdOwtntb.js → profile-Yyb7gsvL.js} +1 -1
- package/studio/web/assets/{regions-n69fwagr.js → regions-OgjGHlU5.js} +1 -1
- package/studio/web/assets/{register-PfWTCXWB.js → register-6qwNEOY3.js} +2 -2
- package/studio/web/assets/{setComponentFile-Bg6O7X0S.js → setComponentFile-BilDMtgB.js} +1 -1
- package/studio/web/assets/{setup-CUx_aUDl.js → setup-J6qJ7OIU.js} +2 -2
- package/studio/web/assets/{status-D7BVKqX9.js → status-0RWGcfyD.js} +1 -1
- package/studio/web/assets/{toggleHighContrast-DBSyXzMr.js → toggleHighContrast-BIn-vErT.js} +1 -1
- package/studio/web/assets/{tsMode-BByKCjBS.js → tsMode-DgUXku4d.js} +1 -1
- package/studio/web/assets/{typescript-DDLnLpw9.js → typescript-C9orXcsM.js} +1 -1
- package/studio/web/assets/{useEntityRestURL-31CHGaHk.js → useEntityRestURL-BEoXXbUB.js} +1 -1
- package/studio/web/assets/{workers-pR3jRY9D.js → workers-JVzSDmgx.js} +1 -1
- package/studio/web/assets/{xml-2iRnMhQO.js → xml-Cq-S8S4X.js} +1 -1
- package/studio/web/assets/{yaml-Bf92gJpd.js → yaml-sfoRdh1M.js} +1 -1
- package/studio/web/index.html +1 -1
- package/utility/errors/hdbError.ts +54 -0
- package/utility/hdbTerms.ts +2 -0
- package/utility/logging/harper_logger.ts +209 -30
- package/utility/logging/logGenerationCoordinator.ts +196 -0
- package/utility/logging/logRotation.ts +367 -0
- package/utility/logging/logRotator.ts +196 -91
- package/utility/npmUtilities.ts +6 -4
- package/utility/watcherFallback.ts +0 -122
- package/validation/configValidator.ts +6 -3
|
@@ -38,20 +38,18 @@ 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
|
-
const crypto_1 = require("crypto");
|
|
47
42
|
const envMgr = __importStar(require("../environment/environmentManager.js"));
|
|
48
43
|
envMgr.initSync();
|
|
49
44
|
const harper_logger_ts_1 = __importDefault(require("./harper_logger.js"));
|
|
50
45
|
const hdbTerms_ts_1 = require("../hdbTerms.js");
|
|
51
46
|
const common_utils_ts_1 = require("../common_utils.js");
|
|
52
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");
|
|
53
50
|
// Interval in ms to check log file and decide if it should be rotated.
|
|
54
51
|
const LOG_AUDIT_INTERVAL = 60000;
|
|
52
|
+
const RELEASE_PROOF_REPORT_INTERVAL = 5 * 60 * 1000;
|
|
55
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";
|
|
56
54
|
/**
|
|
57
55
|
* Rotates hdb.log using an interval and/or maxSize param to determine if log should be rotated.
|
|
@@ -59,7 +57,7 @@ const INT_SIZE_UNDEFINED_MSG = "'interval' and 'maxSize' are both undefined, to
|
|
|
59
57
|
* If log file is within the values set in config, log file will be renamed/moved and a new empty hdb.log created.
|
|
60
58
|
* @returns LogRotator
|
|
61
59
|
*/
|
|
62
|
-
function logRotator({ logger, maxSize, interval, retention, enabled, path: rotatedLogDir, auditInterval }) {
|
|
60
|
+
function logRotator({ logger, maxSize, interval, retention, enabled, compress, path: rotatedLogDir, auditInterval, }) {
|
|
63
61
|
if (enabled === false)
|
|
64
62
|
return;
|
|
65
63
|
let reclamationPriority = 0;
|
|
@@ -69,152 +67,234 @@ function logRotator({ logger, maxSize, interval, retention, enabled, path: rotat
|
|
|
69
67
|
if (!maxSize && !interval) {
|
|
70
68
|
throw new Error(INT_SIZE_UNDEFINED_MSG);
|
|
71
69
|
}
|
|
72
|
-
|
|
73
|
-
rotatedLogDir = path.join(path.dirname(logger.path), 'rotated');
|
|
74
|
-
}
|
|
70
|
+
rotatedLogDir = (0, logRotation_ts_1.resolveRotatedLogDir)(logger.path, rotatedLogDir);
|
|
75
71
|
(0, fs_1.mkdirSync)(rotatedLogDir, { recursive: true });
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
const unit = maxSize.slice(-1);
|
|
80
|
-
const size = maxSize.slice(0, -1);
|
|
81
|
-
if (unit === 'G')
|
|
82
|
-
maxBytes = size * 1000000000;
|
|
83
|
-
else if (unit === 'M')
|
|
84
|
-
maxBytes = size * 1000000;
|
|
85
|
-
else
|
|
86
|
-
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}`);
|
|
87
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);
|
|
88
79
|
// Convert interval param to ms.
|
|
89
80
|
let maxInterval;
|
|
90
81
|
if (interval) {
|
|
91
82
|
maxInterval = (0, common_utils_ts_1.convertToMS)(interval);
|
|
92
83
|
}
|
|
93
84
|
let lastRotatedLogPath;
|
|
94
|
-
// convert date.now to minutes
|
|
95
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 { }
|
|
96
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
|
+
}
|
|
97
119
|
const setIntervalId = setInterval(async () => {
|
|
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;
|
|
98
126
|
// The tick is async but setInterval doesn't await it, so any error that escapes this callback
|
|
99
127
|
// becomes an unhandled rejection rather than surfacing anywhere useful — and since it isn't
|
|
100
128
|
// caught, it also skips the retention cleanup below. Contain everything here and report via
|
|
101
129
|
// the logger instead, so one bad tick (e.g. an unexpected fs error) never kills rotation for
|
|
102
130
|
// the rest of the process's life.
|
|
103
131
|
try {
|
|
104
|
-
// A missing/relocated active log file only invalidates the rotation checks below — retention cleanup
|
|
105
|
-
// must still run. So skip the individual check on ENOENT rather than returning from the whole tick.
|
|
106
132
|
if (maxBytes) {
|
|
107
|
-
let fileStats;
|
|
108
133
|
try {
|
|
109
|
-
|
|
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
|
+
}
|
|
110
145
|
}
|
|
111
146
|
catch (err) {
|
|
112
|
-
//
|
|
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);
|
|
113
150
|
if (err.code !== 'ENOENT')
|
|
114
151
|
throw err;
|
|
115
152
|
}
|
|
116
|
-
if (fileStats && fileStats.size >= maxBytes) {
|
|
117
|
-
try {
|
|
118
|
-
lastRotatedLogPath = await moveLogFile(logger.path, rotatedLogDir, logger);
|
|
119
|
-
}
|
|
120
|
-
catch (err) {
|
|
121
|
-
// If the log file doesn't exist, skip rotation
|
|
122
|
-
if (err.code !== 'ENOENT')
|
|
123
|
-
throw err;
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
153
|
}
|
|
127
154
|
if (maxInterval) {
|
|
128
|
-
|
|
129
|
-
|
|
155
|
+
try {
|
|
156
|
+
const activeGeneration = generationIdentity((0, fs_1.statSync)(logger.path));
|
|
157
|
+
if (activeGeneration && activeGeneration !== observedGeneration) {
|
|
158
|
+
observedGeneration = activeGeneration;
|
|
159
|
+
lastRotationTime = Date.now();
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
catch (err) {
|
|
163
|
+
if (err.code !== 'ENOENT')
|
|
164
|
+
throw err;
|
|
165
|
+
}
|
|
166
|
+
if (Date.now() - lastRotationTime >= maxInterval) {
|
|
130
167
|
try {
|
|
131
|
-
lastRotatedLogPath = await moveLogFile(logger.path, rotatedLogDir, logger);
|
|
168
|
+
lastRotatedLogPath = await moveLogFile(logger.path, rotatedLogDir, logger, compressArchives);
|
|
132
169
|
lastRotationTime = Date.now();
|
|
133
170
|
}
|
|
134
171
|
catch (err) {
|
|
135
172
|
// If the log file doesn't exist, skip rotation
|
|
173
|
+
recoverRotationTarget(err);
|
|
136
174
|
if (err.code !== 'ENOENT')
|
|
137
175
|
throw err;
|
|
138
176
|
}
|
|
139
177
|
}
|
|
140
178
|
}
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
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;
|
|
147
188
|
try {
|
|
148
|
-
|
|
189
|
+
candidates = await fs_1.promises.readdir(rotatedLogDir);
|
|
149
190
|
}
|
|
150
191
|
catch (err) {
|
|
151
|
-
// The rotated log dir may not exist yet (nothing rotated so far); nothing to clean up
|
|
152
192
|
if (err.code !== 'ENOENT')
|
|
153
193
|
harper_logger_ts_1.default.error('Error reading rotated log directory', rotatedLogDir, err);
|
|
154
|
-
|
|
194
|
+
candidates = [];
|
|
155
195
|
}
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
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);
|
|
161
241
|
}
|
|
162
242
|
}
|
|
163
|
-
|
|
164
|
-
|
|
243
|
+
if (retentionCompleted) {
|
|
244
|
+
retentionCursor = 0;
|
|
245
|
+
reclamationPriority = 0;
|
|
246
|
+
}
|
|
247
|
+
else if (candidates.length) {
|
|
248
|
+
retentionCursor = (retentionCursor + examined) % candidates.length;
|
|
165
249
|
}
|
|
166
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);
|
|
258
|
+
}
|
|
167
259
|
}
|
|
168
260
|
}
|
|
169
261
|
catch (err) {
|
|
170
262
|
harper_logger_ts_1.default.error('Error during log rotation audit tick for', logger.path, err);
|
|
171
263
|
}
|
|
172
|
-
|
|
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();
|
|
173
274
|
return {
|
|
174
275
|
end() {
|
|
276
|
+
ended = true;
|
|
175
277
|
clearInterval(setIntervalId);
|
|
176
278
|
},
|
|
177
279
|
getLastRotatedLogPath() {
|
|
178
280
|
return lastRotatedLogPath;
|
|
179
281
|
},
|
|
180
282
|
};
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
// triggered it — combined with the pid, this guarantees two archive names can never collide even if
|
|
184
|
-
// two rotations for two different sources race concurrently within the same audit-interval tick.
|
|
185
|
-
let rotationSequence = 0;
|
|
186
|
-
async function moveLogFile(logPath, rotatedLogPath, logger) {
|
|
187
|
-
const compress = envMgr.get(hdbTerms_ts_1.CONFIG_PARAMS.LOGGING_ROTATION_COMPRESS);
|
|
188
|
-
// Name the archive after its source log (hdb, external, a component name, ...), not a fixed
|
|
189
|
-
// "HDB" literal — external/component loggers can now inherit rotation from the main logger
|
|
190
|
-
// (#1877) and default to the same rotated directory as it, so distinct sources rotating in
|
|
191
|
-
// the same audit tick must not collide on the same timestamp-only filename. A basename alone
|
|
192
|
-
// is not enough either: two distinct source paths can share a basename (e.g. `/logs/a/hdb.log`
|
|
193
|
-
// and `/logs/b/hdb.log`), so a hash of the full resolved source path plus a pid+sequence suffix
|
|
194
|
-
// give every archive a name POSIX rename() can never clobber, even under a same-millisecond race.
|
|
195
|
-
const sourceName = path.basename(logPath, path.extname(logPath)) || 'HDB';
|
|
196
|
-
// sha256, not sha1: this only needs a stable identifier, not cryptographic strength, but a FIPS-mode
|
|
197
|
-
// OpenSSL provider disables sha1 and throws synchronously, which would crash every rotation tick.
|
|
198
|
-
const sourceId = (0, crypto_1.createHash)('sha256').update(path.resolve(logPath)).digest('hex').slice(0, 8);
|
|
199
|
-
const uniqueSuffix = `${process.pid}-${rotationSequence++}`;
|
|
200
|
-
let fullRotateLogPath = path.join(rotatedLogPath, `${sourceName}-${sourceId}-${new Date(Date.now()).toISOString().replaceAll(':', '-')}-${uniqueSuffix}.log`);
|
|
201
|
-
// Move log file to rotated log path first (if we crash
|
|
202
|
-
// during compression, we don't want to restart the compression with a new file)
|
|
203
|
-
await fs_1.promises.rename(logPath, fullRotateLogPath);
|
|
204
|
-
// Close the rotating logger's own file descriptor now that the file has moved. This must be the
|
|
205
|
-
// logger's own closeLogFile (which resets its internal logFD), not the module-global one — otherwise
|
|
206
|
-
// the descriptor stays open on the moved (and, when compressing, subsequently unlinked) inode until the
|
|
207
|
-
// logger's safety timeout fires, pinning disk space and sending any writes in that window into the
|
|
208
|
-
// rotated/deleted file. Closing it here makes the next write reopen a fresh log file immediately.
|
|
209
|
-
(logger?.closeLogFile ?? harper_logger_ts_1.default.closeLogFile)();
|
|
210
|
-
if (compress) {
|
|
211
|
-
logPath = fullRotateLogPath;
|
|
212
|
-
fullRotateLogPath += '.gz';
|
|
213
|
-
await pipe((0, fs_1.createReadStream)(logPath), (0, zlib_1.createGzip)(), (0, fs_1.createWriteStream)(fullRotateLogPath));
|
|
214
|
-
await fs_1.promises.unlink(logPath);
|
|
283
|
+
function generationIdentity(stats) {
|
|
284
|
+
return stats.ino ? `${stats.dev}:${stats.ino}` : undefined;
|
|
215
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));
|
|
216
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
|
|
217
|
-
harper_logger_ts_1.default.notify(`hdb.log rotated, old log moved to ${
|
|
218
|
-
return
|
|
297
|
+
harper_logger_ts_1.default.notify(`hdb.log rotated, old log moved to ${publishedPath}`);
|
|
298
|
+
return publishedPath;
|
|
219
299
|
}
|
|
220
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":"AAAA,YAAY,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4BJ,gCAAU;AA1BnB,2BAAyE;AACzE,2CAA6B;AAC7B,6EAA+D;AAC/D,MAAM,CAAC,QAAQ,EAAE,CAAC;AAClB,0EAA2C;AAC3C,gDAA+C;AAC/C,wDAAiD;AACjD,8EAA0E;AAC1E,+EAA8E;AAC9E,qDAS0B;AAE1B,uEAAuE;AACvE,MAAM,kBAAkB,GAAG,KAAK,CAAC;AACjC,MAAM,6BAA6B,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;AACpD,MAAM,sBAAsB,GAC3B,8IAA8I,CAAC;AAIhJ;;;;;GAKG;AACH,SAAS,UAAU,CAAC,EACnB,MAAM,EACN,OAAO,EACP,QAAQ,EACR,SAAS,EACT,OAAO,EACP,QAAQ,EACR,IAAI,EAAE,aAAa,EACnB,aAAa,GACR;IACL,IAAI,OAAO,KAAK,KAAK;QAAE,OAAO;IAC9B,IAAI,mBAAmB,GAAG,CAAC,CAAC;IAC5B,IAAA,4CAAoB,EACnB,MAAM,CAAC,IAAI,EACX,CAAC,QAAQ,EAAE,EAAE;QACZ,mBAAmB,GAAG,QAAQ,CAAC;IAChC,CAAC,EACD,IAAI,CACJ,CAAC;IAEF,IAAI,CAAC,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;IACzC,CAAC;IAED,aAAa,GAAG,IAAA,qCAAoB,EAAC,MAAM,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;IACjE,IAAA,cAAS,EAAC,aAAa,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE9C,MAAM,QAAQ,GAAG,IAAA,6BAAY,EAAC,OAAO,CAAC,CAAC;IACvC,IAAI,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC1B,0BAAS,CAAC,KAAK,CAAC,sCAAsC,OAAO,MAAM,qCAAoB,EAAE,CAAC,CAAC;IAC5F,CAAC;IAED,mGAAmG;IACnG,2FAA2F;IAC3F,MAAM,gBAAgB,GAAG,QAAQ,IAAI,MAAM,CAAC,GAAG,CAAC,2BAAa,CAAC,yBAAyB,CAAC,CAAC;IAEzF,gCAAgC;IAChC,IAAI,WAAW,CAAC;IAChB,IAAI,QAAQ,EAAE,CAAC;QACd,WAAW,GAAG,IAAA,6BAAW,EAAC,QAAQ,CAAC,CAAC;IACrC,CAAC;IAED,IAAI,kBAAkB,CAAC;IACvB,IAAI,gBAAgB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAClC,IAAI,kBAAkB,CAAC;IACvB,IAAI,CAAC;QACJ,MAAM,MAAM,GAAG,IAAA,aAAQ,EAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACrC,kBAAkB,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;QAChD,IAAI,MAAM,CAAC,WAAW,GAAG,CAAC;YAAE,gBAAgB,GAAG,IAAI,CAAC,GAAG,CAAC,gBAAgB,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;IAC/F,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;IACV,0BAAS,CAAC,KAAK,CAAC,8BAA8B,EAAE,OAAO,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;IAChF,IAAI,YAAY,GAAG,KAAK,CAAC;IACzB,IAAI,KAAK,GAAG,KAAK,CAAC;IAClB,IAAI,mBAAmB,GAAG,KAAK,CAAC;IAChC,IAAI,sBAAsB,GAAG,CAAC,CAAC;IAC/B,IAAI,eAAe,GAAG,CAAC,CAAC;IACxB,MAAM,eAAe,GAAG,aAAa,IAAI,kBAAkB,CAAC;IAC5D,MAAM,mBAAmB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,eAAe,GAAG,CAAC,CAAC,CAAC,CAAC;IACzE;;;;;OAKG;IACH,SAAS,qBAAqB,CAAC,GAAQ;QACtC,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAA,eAAU,EAAC,aAAa,CAAC;YAAE,OAAO;QAC/D,IAAI,CAAC;YACJ,IAAA,cAAS,EAAC,aAAa,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC9C,0BAAS,CAAC,IAAI,CAAC,8BAA8B,aAAa,qCAAqC,CAAC,CAAC;QAClG,CAAC;QAAC,OAAO,QAAQ,EAAE,CAAC;YACnB,0BAAS,CAAC,KAAK,CAAC,+CAA+C,EAAE,aAAa,EAAE,QAAQ,CAAC,CAAC;QAC3F,CAAC;IACF,CAAC;IACD,MAAM,aAAa,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QAC5C,2FAA2F;QAC3F,mEAAmE;QACnE,IAAI,YAAY,IAAI,KAAK;YAAE,OAAO;QAClC,YAAY,GAAG,IAAI,CAAC;QACpB,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,eAAe,CAAC;QAClD,8FAA8F;QAC9F,4FAA4F;QAC5F,4FAA4F;QAC5F,6FAA6F;QAC7F,kCAAkC;QAClC,IAAI,CAAC;YACJ,IAAI,QAAQ,EAAE,CAAC;gBACd,IAAI,CAAC;oBACJ,wFAAwF;oBACxF,qFAAqF;oBACrF,sBAAsB;oBACtB,MAAM,MAAM,GAAG,IAAA,aAAQ,EAAC,MAAM,CAAC,IAAI,CAAC,CAAC;oBACrC,IAAI,MAAM,CAAC,IAAI,IAAI,QAAQ,EAAE,CAAC;wBAC7B,kBAAkB,GAAG,MAAM,WAAW,CAAC,MAAM,CAAC,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,CAAC,CAAC;wBACrG,gFAAgF;wBAChF,mFAAmF;wBACnF,gEAAgE;wBAChE,gBAAgB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;oBAC/B,CAAC;gBACF,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACd,uFAAuF;oBACvF,wEAAwE;oBACxE,qBAAqB,CAAC,GAAG,CAAC,CAAC;oBAC3B,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ;wBAAE,MAAM,GAAG,CAAC;gBACtC,CAAC;YACF,CAAC;YAED,IAAI,WAAW,EAAE,CAAC;gBACjB,IAAI,CAAC;oBACJ,MAAM,gBAAgB,GAAG,kBAAkB,CAAC,IAAA,aAAQ,EAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;oBACnE,IAAI,gBAAgB,IAAI,gBAAgB,KAAK,kBAAkB,EAAE,CAAC;wBACjE,kBAAkB,GAAG,gBAAgB,CAAC;wBACtC,gBAAgB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;oBAC/B,CAAC;gBACF,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACd,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ;wBAAE,MAAM,GAAG,CAAC;gBACtC,CAAC;gBACD,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,gBAAgB,IAAI,WAAW,EAAE,CAAC;oBAClD,IAAI,CAAC;wBACJ,kBAAkB,GAAG,MAAM,WAAW,CAAC,MAAM,CAAC,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,gBAAgB,CAAC,CAAC;wBAC7F,gBAAgB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;oBAC/B,CAAC;oBAAC,OAAO,GAAG,EAAE,CAAC;wBACd,+CAA+C;wBAC/C,qBAAqB,CAAC,GAAG,CAAC,CAAC;wBAC3B,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ;4BAAE,MAAM,GAAG,CAAC;oBACtC,CAAC;gBACF,CAAC;YACF,CAAC;YACD,2FAA2F;YAC3F,uFAAuF;YACvF,4FAA4F;YAC5F,2FAA2F;YAC3F,uDAAuD;YACvD,IAAI,gBAAgB,IAAI,SAAS,IAAI,mBAAmB,EAAE,CAAC;gBAC1D,0FAA0F;gBAC1F,6FAA6F;gBAC7F,IAAI,UAAU,CAAC;gBACf,IAAI,CAAC;oBACJ,UAAU,GAAG,MAAM,aAAM,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;gBAClD,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACd,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ;wBAAE,0BAAS,CAAC,KAAK,CAAC,qCAAqC,EAAE,aAAa,EAAE,GAAG,CAAC,CAAC;oBACtG,UAAU,GAAG,EAAE,CAAC;gBACjB,CAAC;gBACD,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,GAAG,MAAM,IAAA,2DAA6B,EAAC,YAAY,CAAC,CAAC;gBACrF,qFAAqF;gBACrF,yFAAyF;gBACzF,yFAAyF;gBACzF,wEAAwE;gBACxE,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,sBAAsB,EAAE,CAAC;oBACvD,sBAAsB,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,6BAA6B,CAAC;oBACpE,mBAAmB,GAAG,IAAI,CAAC;oBAC3B,0BAAS,CAAC,IAAI,CACb,6HAA6H,aAAa,EAAE,CAC5I,CAAC;gBACH,CAAC;qBAAM,IAAI,QAAQ,IAAI,mBAAmB,EAAE,CAAC;oBAC5C,mBAAmB,GAAG,KAAK,CAAC;oBAC5B,sBAAsB,GAAG,CAAC,CAAC;oBAC3B,0BAAS,CAAC,MAAM,CAAC,oEAAoE,aAAa,EAAE,CAAC,CAAC;gBACvG,CAAC;gBACD,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,YAAY,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAErF,IAAI,QAAQ,IAAI,CAAC,SAAS,IAAI,mBAAmB,CAAC,EAAE,CAAC;oBACpD,uCAAuC;oBACvC,oEAAoE;oBACpE,MAAM,WAAW,GAAG,IAAA,6BAAW,EAAC,SAAS,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,mBAAmB,CAAC,CAAC;oBAC/E,IAAI,kBAAkB,GAAG,IAAI,CAAC;oBAC9B,IAAI,QAAQ,GAAG,CAAC,CAAC;oBACjB,OAAO,QAAQ,GAAG,UAAU,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE,CAAC;wBACjD,IAAI,KAAK,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,YAAY,EAAE,CAAC;4BACzC,kBAAkB,GAAG,KAAK,CAAC;4BAC3B,MAAM;wBACP,CAAC;wBACD,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,eAAe,GAAG,QAAQ,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;wBAC1E,IAAI,CAAC;4BACJ,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;4BACnD,8EAA8E;4BAC9E,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;gCAAE,SAAS;4BACtD,gFAAgF;4BAChF,+CAA+C;4BAC/C,IAAI,IAAA,2CAA0B,EAAC,WAAW,CAAC;gCAAE,SAAS;4BACtD,MAAM,SAAS,GAAG,MAAM,aAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;4BACjD,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,OAAO,GAAG,WAAW,EAAE,CAAC;gCAClD,MAAM,aAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;4BAClC,CAAC;wBACF,CAAC;wBAAC,OAAO,GAAG,EAAE,CAAC;4BACd,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ;gCAAE,0BAAS,CAAC,KAAK,CAAC,4BAA4B,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;wBACrF,CAAC;oBACF,CAAC;oBACD,IAAI,kBAAkB,EAAE,CAAC;wBACxB,eAAe,GAAG,CAAC,CAAC;wBACpB,mBAAmB,GAAG,CAAC,CAAC;oBACzB,CAAC;yBAAM,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC;wBAC9B,eAAe,GAAG,CAAC,eAAe,GAAG,QAAQ,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC;oBACpE,CAAC;gBACF,CAAC;gBAED,IAAI,QAAQ,IAAI,gBAAgB,IAAI,CAAC,KAAK,EAAE,CAAC;oBAC5C,MAAM,kBAAkB,GAAG,MAAM,IAAA,wCAAuB,EAAC,aAAa,EAAE,UAAU,EAAE,QAAQ,EAAE;wBAC7F,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,mBAAmB,CAAC;wBAClE,UAAU,EAAE,GAAG,EAAE,CAAC,KAAK;qBACvB,CAAC,CAAC;oBACH,IAAI,kBAAkB;wBACrB,0BAAS,CAAC,KAAK,CAAC,+BAA+B,EAAE,kBAAkB,CAAC,IAAI,EAAE,kBAAkB,CAAC,KAAK,CAAC,CAAC;gBACtG,CAAC;YACF,CAAC;QACF,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,0BAAS,CAAC,KAAK,CAAC,0CAA0C,EAAE,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAC/E,CAAC;gBAAS,CAAC;YACV,IAAI,CAAC;gBACJ,MAAM,IAAA,wCAAuB,EAAC,EAAE,QAAQ,EAAE,YAAY,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC;YACpF,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACd,0BAAS,CAAC,KAAK,CAAC,4CAA4C,EAAE,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;YACjF,CAAC;YACD,YAAY,GAAG,KAAK,CAAC;QACtB,CAAC;IACF,CAAC,EAAE,eAAe,CAAC,CAAC,KAAK,EAAE,CAAC;IAC5B,OAAO;QACN,GAAG;YACF,KAAK,GAAG,IAAI,CAAC;YACb,aAAa,CAAC,aAAa,CAAC,CAAC;QAC9B,CAAC;QACD,qBAAqB;YACpB,OAAO,kBAAkB,CAAC;QAC3B,CAAC;KACD,CAAC;IAEF,SAAS,kBAAkB,CAAC,KAAU;QACrC,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,IAAI,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IAC5D,CAAC;AACF,CAAC;AAED,KAAK,UAAU,WAAW,CACzB,OAAe,EACf,cAAsB,EACtB,MAAY,EACZ,QAAkB,EAClB,WAAiB;IAEjB,8FAA8F;IAC9F,4FAA4F;IAC5F,4FAA4F;IAC5F,4FAA4F;IAC5F,iGAAiG;IACjG,4FAA4F;IAC5F,MAAM,UAAU,GAAG,IAAA,kCAAiB,EACnC,OAAO,EACP,cAAc,EACd,MAAM,EAAE,YAAY,IAAI,0BAAS,CAAC,YAAY,EAC9C,WAAW,CACX,CAAC;IACF,MAAM,aAAa,GAAG,MAAM,IAAA,0CAAyB,EACpD,UAAU,EACV,QAAQ,IAAI,MAAM,CAAC,GAAG,CAAC,2BAAa,CAAC,yBAAyB,CAAC,EAC/D,CAAC,KAAK,EAAE,EAAE,CAAC,0BAAS,CAAC,KAAK,CAAC,+BAA+B,EAAE,UAAU,CAAC,WAAW,EAAE,KAAK,CAAC,CAC1F,CAAC;IAEF,gIAAgI;IAChI,0BAAS,CAAC,MAAM,CAAC,qCAAqC,aAAa,EAAE,CAAC,CAAC;IACvE,OAAO,aAAa,CAAC;AACtB,CAAC"}
|
|
@@ -61,11 +61,10 @@ async function installModules(req) {
|
|
|
61
61
|
if (validation) {
|
|
62
62
|
throw (0, hdbError_ts_1.handleHDBError)(validation, validation.message, HTTP_STATUS_CODES.BAD_REQUEST);
|
|
63
63
|
}
|
|
64
|
-
const { projects, dry_run: dryRun } = validatedRequest;
|
|
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
|
-
|
|
68
|
-
const args = [...(0, Application_ts_1.packageManagerInstallArguments)('npm', true, true), '--json'];
|
|
67
|
+
const args = [...(0, Application_ts_1.packageManagerInstallArguments)('npm', allowInstallScripts, true), '--json'];
|
|
69
68
|
if (dryRun)
|
|
70
69
|
args.push('--dry-run');
|
|
71
70
|
for (const project of projects) {
|
|
@@ -124,7 +123,10 @@ function modulesValidator(req) {
|
|
|
124
123
|
const funcSchema = joi_1.default.object({
|
|
125
124
|
projects: joi_1.default.array().min(1).items(joi_1.default.string()).required(),
|
|
126
125
|
dry_run: joi_1.default.boolean().default(false),
|
|
127
|
-
|
|
126
|
+
allowInstallScripts: joi_1.default.boolean().default(true),
|
|
127
|
+
})
|
|
128
|
+
.rename('dryRun', 'dry_run', { ignoreUndefined: true })
|
|
129
|
+
.rename('install_allow_scripts', 'allowInstallScripts', { ignoreUndefined: true });
|
|
128
130
|
return validator.validateAndConvertBySchema(req, funcSchema);
|
|
129
131
|
}
|
|
130
132
|
//# sourceMappingURL=npmUtilities.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"npmUtilities.js","sourceRoot":"","sources":["../../utility/npmUtilities.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuBb,
|
|
1
|
+
{"version":3,"file":"npmUtilities.js","sourceRoot":"","sources":["../../utility/npmUtilities.ts"],"names":[],"mappings":"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"}
|
|
@@ -75,48 +75,3 @@ export declare function installLostNativeWatchGuard(): void;
|
|
|
75
75
|
*/
|
|
76
76
|
export declare function guardedWatch(paths: string | string[], options?: ChokidarOptions): FSWatcher;
|
|
77
77
|
export declare function _lostNativeWatchCountForTests(): number;
|
|
78
|
-
export declare class PartialReadRetry {
|
|
79
|
-
#private;
|
|
80
|
-
constructor(filePath: string);
|
|
81
|
-
/** False once the budget is spent, so the caller can fall back to its own error handling. */
|
|
82
|
-
schedule(reread: () => void): boolean;
|
|
83
|
-
/** A usable read arrived, so any re-read still armed for the previous one would duplicate it. */
|
|
84
|
-
settled(): void;
|
|
85
|
-
/**
|
|
86
|
-
* The budget is spent. Distinct from `settled()` in that the report stands — the file has not
|
|
87
|
-
* recovered, and it is shared with every other watcher of it. The budget itself is restored,
|
|
88
|
-
* because the next event may be the repair, and that repair can be observed mid-write too.
|
|
89
|
-
* Returns whether this give-up was the one reported.
|
|
90
|
-
*/
|
|
91
|
-
gaveUp(error?: unknown): boolean;
|
|
92
|
-
/** Terminal: the watcher is closing, so nothing may re-arm the re-read or report on it. */
|
|
93
|
-
cancel(): void;
|
|
94
|
-
}
|
|
95
|
-
/**
|
|
96
|
-
* ENOENT is excluded not because it cannot be transient, but because it already has an answer:
|
|
97
|
-
* `OptionsWatcher` routes it to `remove` (env-only fallback at boot, then removal), and
|
|
98
|
-
* `RootConfigWatcher` keeps its last config rather than tearing down core features on a file
|
|
99
|
-
* that may just be mid-replace. Re-reading would only delay a decision already made.
|
|
100
|
-
*/
|
|
101
|
-
export declare function isPartialReadError(error: unknown): boolean;
|
|
102
|
-
/**
|
|
103
|
-
* A watcher that exhausts its re-read budget serves stale config from then on, so the give-up
|
|
104
|
-
* has to be visible — otherwise the only symptom is a config change that silently did nothing.
|
|
105
|
-
* Warned once per file: every root-config scope watches the same one and would otherwise report
|
|
106
|
-
* a single bad file once each, on every event.
|
|
107
|
-
*/
|
|
108
|
-
export declare function warnPartialReadGaveUp(filePath: string, error?: unknown): boolean;
|
|
109
|
-
/**
|
|
110
|
-
* The kind and position of a failed config read, never its content: a YAML parse error's message
|
|
111
|
-
* quotes the offending source lines, and these files hold credentials.
|
|
112
|
-
*/
|
|
113
|
-
export declare function describeReadFailure(error: unknown): string;
|
|
114
|
-
/** Test-only: whether a give-up warning for this file is currently suppressed as a duplicate. */
|
|
115
|
-
export declare function isPartialReadWarned(filePath: string): boolean;
|
|
116
|
-
/** Test-only: forget that this file was reported, so a suite can start from a known state. */
|
|
117
|
-
export declare function clearPartialReadWarning(filePath: string): void;
|
|
118
|
-
/**
|
|
119
|
-
* A listener that throws while applying new config is a bug in that listener, not evidence the
|
|
120
|
-
* file was half-written — the watcher's own state is already updated, so it keeps going.
|
|
121
|
-
*/
|
|
122
|
-
export declare function warnWatcherListenerError(filePath: string, error: unknown): void;
|