@harperfast/harper 5.0.0-alpha.10 → 5.0.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/BinObjects.js +17 -0
- package/bin/cliOperations.js +157 -0
- package/bin/copyDb.ts +280 -0
- package/bin/harper.js +156 -0
- package/bin/install.js +15 -0
- package/bin/lite.js +5 -0
- package/bin/restart.js +201 -0
- package/bin/run.js +409 -0
- package/bin/status.js +65 -0
- package/bin/stop.js +22 -0
- package/bin/upgrade.js +134 -0
- package/components/Application.ts +646 -0
- package/components/ApplicationScope.ts +49 -0
- package/components/Component.ts +53 -0
- package/components/ComponentV1.ts +342 -0
- package/components/DEFAULT_CONFIG.ts +18 -0
- package/components/EntryHandler.ts +227 -0
- package/components/Logger.ts +14 -0
- package/components/OptionsWatcher.ts +354 -0
- package/components/PluginModule.ts +6 -0
- package/components/Scope.ts +329 -0
- package/components/componentLoader.ts +529 -0
- package/components/deriveCommonPatternBase.ts +31 -0
- package/components/deriveGlobOptions.ts +44 -0
- package/components/deriveURLPath.ts +57 -0
- package/components/operations.js +658 -0
- package/components/operationsValidation.js +246 -0
- package/components/packageComponent.ts +39 -0
- package/components/requestRestart.ts +26 -0
- package/components/resolveBaseURLPath.ts +38 -0
- package/components/status/ComponentStatus.ts +110 -0
- package/components/status/ComponentStatusRegistry.ts +251 -0
- package/components/status/api.ts +153 -0
- package/components/status/crossThread.ts +405 -0
- package/components/status/errors.ts +152 -0
- package/components/status/index.ts +44 -0
- package/components/status/internal.ts +65 -0
- package/components/status/registry.ts +12 -0
- package/components/status/types.ts +96 -0
- package/config/RootConfigWatcher.ts +59 -0
- package/config/configHelpers.ts +11 -0
- package/config/configUtils.js +967 -0
- package/config/harperConfigEnvVars.ts +641 -0
- package/dataLayer/CreateAttributeObject.js +25 -0
- package/dataLayer/CreateTableObject.js +11 -0
- package/dataLayer/DataLayerObjects.js +43 -0
- package/dataLayer/DeleteBeforeObject.js +22 -0
- package/dataLayer/DeleteObject.js +25 -0
- package/dataLayer/DropAttributeObject.js +11 -0
- package/dataLayer/GetBackupObject.js +22 -0
- package/dataLayer/InsertObject.js +24 -0
- package/dataLayer/ReadAuditLogObject.js +24 -0
- package/dataLayer/SQLSearch.js +1335 -0
- package/dataLayer/SearchByConditionsObject.js +61 -0
- package/dataLayer/SearchByHashObject.js +21 -0
- package/dataLayer/SearchObject.js +45 -0
- package/dataLayer/SqlSearchObject.js +14 -0
- package/dataLayer/UpdateObject.js +23 -0
- package/dataLayer/UpsertObject.js +23 -0
- package/dataLayer/bulkLoad.js +813 -0
- package/dataLayer/dataObjects/BulkLoadObjects.js +27 -0
- package/dataLayer/dataObjects/UpsertObject.js +23 -0
- package/dataLayer/delete.js +164 -0
- package/dataLayer/export.js +381 -0
- package/dataLayer/getBackup.js +40 -0
- package/dataLayer/harperBridge/BridgeMethods.js +81 -0
- package/dataLayer/harperBridge/ResourceBridge.ts +633 -0
- package/dataLayer/harperBridge/bridgeUtility/insertUpdateReturnObj.js +28 -0
- package/dataLayer/harperBridge/bridgeUtility/insertUpdateValidate.js +88 -0
- package/dataLayer/harperBridge/harperBridge.js +21 -0
- package/dataLayer/harperBridge/lmdbBridge/LMDBBridge.js +119 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/DeleteAuditLogsBeforeResults.js +19 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateAttribute.js +112 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateRecords.js +67 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateSchema.js +31 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateTable.js +94 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDeleteAuditLogsBefore.js +98 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDeleteRecords.js +89 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDropAttribute.js +109 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDropSchema.js +107 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDropTable.js +137 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbFlush.js +35 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbGetBackup.js +111 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbGetDataByHash.js +28 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbGetDataByValue.js +29 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbReadAuditLog.js +207 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbSearchByConditions.js +156 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbSearchByHash.js +21 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbSearchByValue.js +30 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbTransaction.js +19 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbUpdateRecords.js +64 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbUpsertRecords.js +70 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBCreateAttributeObject.js +22 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBDeleteTransactionObject.js +23 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBInsertTransactionObject.js +22 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBTransactionObject.js +23 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBUpdateTransactionObject.js +24 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBUpsertTransactionObject.js +24 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/TableSizeObject.js +25 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/initializeHashSearch.js +21 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/initializePaths.js +157 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbCheckForNewAttributes.js +94 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbCreateTransactionsAuditEnvironment.js +39 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbGetTableSize.js +34 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbProcessRows.js +100 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbSearch.js +371 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbWriteTransaction.js +109 -0
- package/dataLayer/hdbInfoController.js +254 -0
- package/dataLayer/insert.js +266 -0
- package/dataLayer/readAuditLog.js +59 -0
- package/dataLayer/schema.js +366 -0
- package/dataLayer/schemaDescribe.js +289 -0
- package/dataLayer/search.js +60 -0
- package/dataLayer/transaction.js +17 -0
- package/dataLayer/update.js +124 -0
- package/dist/components/Logger.d.ts +12 -0
- package/dist/components/Logger.js +3 -0
- package/dist/components/Logger.js.map +1 -0
- package/dist/components/Scope.d.ts +14 -4
- package/dist/components/Scope.js +18 -10
- package/dist/components/Scope.js.map +1 -1
- package/dist/components/componentLoader.js +16 -9
- package/dist/components/componentLoader.js.map +1 -1
- package/dist/components/operations.js +2 -2
- package/dist/components/operations.js.map +1 -1
- package/dist/config/configUtils.d.ts +1 -1
- package/dist/config/configUtils.js +1 -1
- package/dist/config/configUtils.js.map +1 -1
- package/dist/dataLayer/CreateTableObject.d.ts +2 -2
- package/dist/dataLayer/CreateTableObject.js +2 -2
- package/dist/dataLayer/CreateTableObject.js.map +1 -1
- package/dist/dataLayer/delete.d.ts +1 -1
- package/dist/dataLayer/schema.js +6 -5
- package/dist/dataLayer/schema.js.map +1 -1
- package/dist/dataLayer/schemaDescribe.js +1 -1
- package/dist/dataLayer/schemaDescribe.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/resources/DatabaseTransaction.d.ts +1 -1
- package/dist/resources/IterableEventQueue.d.ts +1 -1
- package/dist/resources/LMDBTransaction.d.ts +5 -1
- package/dist/resources/Resource.d.ts +1 -1
- package/dist/resources/RocksIndexStore.d.ts +3 -3
- package/dist/resources/RocksTransactionLogStore.d.ts +6 -3
- package/dist/resources/Table.d.ts +15 -6
- package/dist/resources/Table.js +4 -1
- package/dist/resources/Table.js.map +1 -1
- package/dist/resources/analytics/read.js +32 -22
- package/dist/resources/analytics/read.js.map +1 -1
- package/dist/resources/analytics/write.js +3 -6
- package/dist/resources/analytics/write.js.map +1 -1
- package/dist/resources/auditStore.d.ts +3 -3
- package/dist/resources/blob.d.ts +25 -2
- package/dist/resources/databases.d.ts +12 -2
- package/dist/resources/databases.js +22 -19
- package/dist/resources/databases.js.map +1 -1
- package/dist/resources/search.js +11 -5
- package/dist/resources/search.js.map +1 -1
- package/dist/resources/transaction.d.ts +2 -1
- package/dist/security/auth.js +1 -1
- package/dist/security/auth.js.map +1 -1
- package/dist/security/cryptoHash.d.ts +2 -2
- package/dist/security/jsLoader.js +243 -66
- package/dist/security/jsLoader.js.map +1 -1
- package/dist/security/keys.js +4 -5
- package/dist/security/keys.js.map +1 -1
- package/dist/security/user.js +3 -3
- package/dist/security/user.js.map +1 -1
- package/dist/server/REST.js +16 -2
- package/dist/server/REST.js.map +1 -1
- package/dist/server/Server.d.ts +2 -1
- package/dist/server/Server.js.map +1 -1
- package/dist/server/fastifyRoutes/plugins/hdbCore.d.ts +6 -1
- package/dist/server/fastifyRoutes.js +2 -0
- package/dist/server/fastifyRoutes.js.map +1 -1
- package/dist/server/http.js +12 -6
- package/dist/server/http.js.map +1 -1
- package/dist/server/jobs/JobObject.d.ts +3 -3
- package/dist/server/loadRootComponents.js +1 -0
- package/dist/server/loadRootComponents.js.map +1 -1
- package/dist/server/operationsServer.js +3 -1
- package/dist/server/operationsServer.js.map +1 -1
- package/dist/server/serverHelpers/JSONStream.d.ts +3 -3
- package/dist/server/serverHelpers/Request.d.ts +5 -5
- package/dist/server/serverHelpers/requestTimePlugin.d.ts +1 -1
- package/dist/server/threads/manageThreads.d.ts +2 -2
- package/dist/server/threads/manageThreads.js +50 -35
- package/dist/server/threads/manageThreads.js.map +1 -1
- package/dist/server/threads/socketRouter.d.ts +1 -1
- package/dist/sqlTranslator/deleteTranslator.d.ts +1 -1
- package/dist/utility/AWS/AWSConnector.d.ts +3 -2
- package/dist/utility/common_utils.d.ts +3 -3
- package/dist/utility/environment/systemInformation.d.ts +1 -0
- package/dist/utility/functions/date/dateFunctions.d.ts +11 -11
- package/dist/utility/globalSchema.d.ts +1 -1
- package/dist/utility/hdbTerms.d.ts +3 -0
- package/dist/utility/hdbTerms.js +3 -0
- package/dist/utility/hdbTerms.js.map +1 -1
- package/dist/utility/installation.d.ts +2 -4
- package/dist/utility/installation.js.map +1 -1
- package/dist/utility/lmdb/commonUtility.d.ts +1 -0
- package/dist/utility/lmdb/deleteUtility.d.ts +1 -0
- package/dist/utility/lmdb/environmentUtility.d.ts +1 -0
- package/dist/utility/lmdb/searchUtility.d.ts +2 -1
- package/dist/utility/lmdb/writeUtility.d.ts +1 -0
- package/dist/utility/logging/harper_logger.d.ts +6 -6
- package/dist/utility/processManagement/processManagement.d.ts +1 -1
- package/dist/utility/processManagement/servicesConfig.d.ts +12 -6
- package/dist/validation/common_validators.d.ts +4 -3
- package/dist/validation/configValidator.d.ts +3 -2
- package/index.d.ts +56 -0
- package/index.js +41 -0
- package/json/systemSchema.json +373 -0
- package/launchServiceScripts/launchHarperDB.js +3 -0
- package/launchServiceScripts/utility/checkNodeVersion.js +15 -0
- package/package.json +21 -3
- package/resources/DatabaseTransaction.ts +378 -0
- package/resources/ErrorResource.ts +57 -0
- package/resources/IterableEventQueue.ts +94 -0
- package/resources/LMDBTransaction.ts +349 -0
- package/resources/RecordEncoder.ts +702 -0
- package/resources/RequestTarget.ts +134 -0
- package/resources/Resource.ts +789 -0
- package/resources/ResourceInterface.ts +221 -0
- package/resources/ResourceInterfaceV2.ts +53 -0
- package/resources/ResourceV2.ts +67 -0
- package/resources/Resources.ts +162 -0
- package/resources/RocksIndexStore.ts +70 -0
- package/resources/RocksTransactionLogStore.ts +352 -0
- package/resources/Table.ts +4527 -0
- package/resources/analytics/hostnames.ts +72 -0
- package/resources/analytics/metadata.ts +10 -0
- package/resources/analytics/read.ts +252 -0
- package/resources/analytics/write.ts +803 -0
- package/resources/auditStore.ts +556 -0
- package/resources/blob.ts +1268 -0
- package/resources/crdt.ts +125 -0
- package/resources/dataLoader.ts +527 -0
- package/resources/databases.ts +1290 -0
- package/resources/graphql.ts +221 -0
- package/resources/indexes/HierarchicalNavigableSmallWorld.ts +638 -0
- package/resources/indexes/customIndexes.ts +7 -0
- package/resources/indexes/vector.ts +38 -0
- package/resources/jsResource.ts +86 -0
- package/resources/loadEnv.ts +22 -0
- package/resources/login.ts +18 -0
- package/resources/openApi.ts +409 -0
- package/resources/registrationDeprecated.ts +8 -0
- package/resources/replayLogs.ts +136 -0
- package/resources/roles.ts +98 -0
- package/resources/search.ts +1301 -0
- package/resources/tracked.ts +584 -0
- package/resources/transaction.ts +89 -0
- package/resources/transactionBroadcast.ts +258 -0
- package/security/auth.ts +376 -0
- package/security/certificateVerification/certificateVerificationSource.ts +84 -0
- package/security/certificateVerification/configValidation.ts +107 -0
- package/security/certificateVerification/crlVerification.ts +623 -0
- package/security/certificateVerification/index.ts +121 -0
- package/security/certificateVerification/ocspVerification.ts +148 -0
- package/security/certificateVerification/pkijs-ed25519-patch.ts +188 -0
- package/security/certificateVerification/types.ts +128 -0
- package/security/certificateVerification/verificationConfig.ts +138 -0
- package/security/certificateVerification/verificationUtils.ts +447 -0
- package/security/cryptoHash.js +42 -0
- package/security/data_objects/PermissionAttributeResponseObject.js +15 -0
- package/security/data_objects/PermissionResponseObject.js +115 -0
- package/security/data_objects/PermissionTableResponseObject.js +20 -0
- package/security/fastifyAuth.js +169 -0
- package/security/impersonation.ts +160 -0
- package/security/jsLoader.ts +716 -0
- package/security/keys.js +948 -0
- package/security/permissionsTranslator.js +300 -0
- package/security/role.js +218 -0
- package/security/tokenAuthentication.ts +228 -0
- package/security/user.ts +449 -0
- package/server/DurableSubscriptionsSession.ts +503 -0
- package/server/REST.ts +407 -0
- package/server/Server.ts +89 -0
- package/server/fastifyRoutes/helpers/getCORSOptions.js +36 -0
- package/server/fastifyRoutes/helpers/getHeaderTimeoutConfig.js +15 -0
- package/server/fastifyRoutes/helpers/getServerOptions.js +33 -0
- package/server/fastifyRoutes/plugins/hdbCore.js +39 -0
- package/server/fastifyRoutes.ts +205 -0
- package/server/graphqlQuerying.ts +700 -0
- package/server/http.ts +640 -0
- package/server/itc/serverHandlers.js +161 -0
- package/server/itc/utility/ITCEventObject.js +10 -0
- package/server/jobs/JobObject.js +24 -0
- package/server/jobs/jobProcess.js +69 -0
- package/server/jobs/jobRunner.js +162 -0
- package/server/jobs/jobs.js +304 -0
- package/server/loadRootComponents.js +44 -0
- package/server/mqtt.ts +485 -0
- package/server/nodeName.ts +75 -0
- package/server/operationsServer.ts +313 -0
- package/server/serverHelpers/Headers.ts +108 -0
- package/server/serverHelpers/JSONStream.ts +269 -0
- package/server/serverHelpers/OperationFunctionObject.ts +13 -0
- package/server/serverHelpers/Request.ts +158 -0
- package/server/serverHelpers/contentTypes.ts +637 -0
- package/server/serverHelpers/requestTimePlugin.js +57 -0
- package/server/serverHelpers/serverHandlers.js +148 -0
- package/server/serverHelpers/serverUtilities.ts +473 -0
- package/server/serverRegistry.ts +8 -0
- package/server/static.ts +187 -0
- package/server/status/definitions.ts +37 -0
- package/server/status/index.ts +125 -0
- package/server/storageReclamation.ts +93 -0
- package/server/threads/itc.js +89 -0
- package/server/threads/manageThreads.js +594 -0
- package/server/threads/socketRouter.ts +360 -0
- package/server/threads/threadServer.js +279 -0
- package/server/throttle.ts +73 -0
- package/sqlTranslator/SelectValidator.js +330 -0
- package/sqlTranslator/alasqlFunctionImporter.js +62 -0
- package/sqlTranslator/deleteTranslator.js +67 -0
- package/sqlTranslator/index.js +242 -0
- package/sqlTranslator/sql_statement_bucket.js +472 -0
- package/static/defaultConfig.yaml +3 -0
- package/studio/web/HDBDogOnly.svg +78 -0
- package/studio/web/assets/PPRadioGrotesk-Bold-DDaUYG8E.woff +0 -0
- package/studio/web/assets/fa-brands-400-CEJbCg16.woff +0 -0
- package/studio/web/assets/fa-brands-400-CSYNqBb_.ttf +0 -0
- package/studio/web/assets/fa-brands-400-DnkPfk3o.eot +0 -0
- package/studio/web/assets/fa-brands-400-UxlILjvJ.woff2 +0 -0
- package/studio/web/assets/fa-brands-400-cH1MgKbP.svg +3717 -0
- package/studio/web/assets/fa-regular-400-BhTwtT8w.eot +0 -0
- package/studio/web/assets/fa-regular-400-D1vz6WBx.ttf +0 -0
- package/studio/web/assets/fa-regular-400-DFnMcJPd.woff +0 -0
- package/studio/web/assets/fa-regular-400-DGzu1beS.woff2 +0 -0
- package/studio/web/assets/fa-regular-400-gwj8Pxq-.svg +801 -0
- package/studio/web/assets/fa-solid-900-B4ZZ7kfP.svg +5034 -0
- package/studio/web/assets/fa-solid-900-B6Axprfb.eot +0 -0
- package/studio/web/assets/fa-solid-900-BUswJgRo.woff2 +0 -0
- package/studio/web/assets/fa-solid-900-DOXgCApm.woff +0 -0
- package/studio/web/assets/fa-solid-900-mxuxnBEa.ttf +0 -0
- package/studio/web/assets/index-BTgXJX9d.js +235 -0
- package/studio/web/assets/index-BTgXJX9d.js.map +1 -0
- package/studio/web/assets/index-C-GXfcup.js +37 -0
- package/studio/web/assets/index-C-GXfcup.js.map +1 -0
- package/studio/web/assets/index-PFlNdimM.js +2 -0
- package/studio/web/assets/index-PFlNdimM.js.map +1 -0
- package/studio/web/assets/index-Y2g_iFpU.css +1 -0
- package/studio/web/assets/index-jiPwkrsB.css +1 -0
- package/studio/web/assets/index.lazy-C3TJZJ4o.js +266 -0
- package/studio/web/assets/index.lazy-C3TJZJ4o.js.map +1 -0
- package/studio/web/assets/profiler-DotzgiCJ.js +2 -0
- package/studio/web/assets/profiler-DotzgiCJ.js.map +1 -0
- package/studio/web/assets/react-redux-VxUEx_mU.js +6 -0
- package/studio/web/assets/react-redux-VxUEx_mU.js.map +1 -0
- package/studio/web/assets/startRecording-B_9J9Csd.js +3 -0
- package/studio/web/assets/startRecording-B_9J9Csd.js.map +1 -0
- package/studio/web/fabric-signup-background.webp +0 -0
- package/studio/web/fabric-signup-text.png +0 -0
- package/studio/web/favicon_purple.png +0 -0
- package/studio/web/github-icon.svg +15 -0
- package/studio/web/harper-fabric_black.png +0 -0
- package/studio/web/harper-fabric_white.png +0 -0
- package/studio/web/harper-studio_white.png +0 -0
- package/studio/web/index.html +16 -0
- package/studio/web/running.css +148 -0
- package/studio/web/running.html +147 -0
- package/studio/web/running.js +111 -0
- package/upgrade/UpgradeObjects.js +13 -0
- package/upgrade/directives/directivesController.js +90 -0
- package/upgrade/directivesManager.js +139 -0
- package/upgrade/upgradePrompt.js +124 -0
- package/upgrade/upgradeUtilities.js +28 -0
- package/utility/AWS/AWSConnector.js +29 -0
- package/utility/OperationFunctionCaller.js +63 -0
- package/utility/assignCmdEnvVariables.js +62 -0
- package/utility/common_utils.js +867 -0
- package/utility/environment/environmentManager.js +208 -0
- package/utility/environment/systemInformation.js +355 -0
- package/utility/errors/commonErrors.js +267 -0
- package/utility/errors/hdbError.js +146 -0
- package/utility/functions/date/dateFunctions.js +65 -0
- package/utility/functions/geo.js +355 -0
- package/utility/functions/sql/alaSQLExtension.js +104 -0
- package/utility/globalSchema.js +35 -0
- package/utility/hdbTerms.ts +819 -0
- package/utility/install/checkJWTTokensExist.js +62 -0
- package/utility/install/harperdb.conf +15 -0
- package/utility/install/harperdb.service +14 -0
- package/utility/install/installer.js +635 -0
- package/utility/installation.ts +30 -0
- package/utility/lmdb/DBIDefinition.js +20 -0
- package/utility/lmdb/DeleteRecordsResponseObject.js +25 -0
- package/utility/lmdb/InsertRecordsResponseObject.js +22 -0
- package/utility/lmdb/OpenDBIObject.js +31 -0
- package/utility/lmdb/OpenEnvironmentObject.js +41 -0
- package/utility/lmdb/UpdateRecordsResponseObject.js +25 -0
- package/utility/lmdb/UpsertRecordsResponseObject.js +22 -0
- package/utility/lmdb/cleanLMDBMap.js +65 -0
- package/utility/lmdb/commonUtility.js +119 -0
- package/utility/lmdb/deleteUtility.js +128 -0
- package/utility/lmdb/environmentUtility.js +477 -0
- package/utility/lmdb/searchCursorFunctions.js +187 -0
- package/utility/lmdb/searchUtility.js +918 -0
- package/utility/lmdb/terms.js +57 -0
- package/utility/lmdb/writeUtility.js +407 -0
- package/utility/logging/harper_logger.js +876 -0
- package/utility/logging/logRotator.js +157 -0
- package/utility/logging/logger.ts +24 -0
- package/utility/logging/readLog.js +355 -0
- package/utility/logging/transactionLog.js +57 -0
- package/utility/mount_hdb.js +59 -0
- package/utility/npmUtilities.js +102 -0
- package/utility/operationPermissions.ts +112 -0
- package/utility/operation_authorization.js +836 -0
- package/utility/packageUtils.js +55 -0
- package/utility/password.ts +99 -0
- package/utility/processManagement/processManagement.js +187 -0
- package/utility/processManagement/servicesConfig.js +56 -0
- package/utility/scripts/restartHdb.js +24 -0
- package/utility/scripts/user_data.sh +13 -0
- package/utility/signalling.js +36 -0
- package/utility/terms/certificates.js +81 -0
- package/utility/when.ts +20 -0
- package/v1.d.ts +39 -0
- package/v1.js +41 -0
- package/v2.d.ts +39 -0
- package/v2.js +41 -0
- package/validation/bulkDeleteValidator.js +24 -0
- package/validation/check_permissions.js +19 -0
- package/validation/common_validators.js +95 -0
- package/validation/configValidator.js +331 -0
- package/validation/deleteValidator.js +15 -0
- package/validation/fileLoadValidator.js +153 -0
- package/validation/insertValidator.js +40 -0
- package/validation/installValidator.js +37 -0
- package/validation/readLogValidator.js +64 -0
- package/validation/role_validation.js +320 -0
- package/validation/schemaMetadataValidator.js +42 -0
- package/validation/searchValidator.js +166 -0
- package/validation/statusValidator.ts +66 -0
- package/validation/transactionLogValidator.js +33 -0
- package/validation/user_validation.js +55 -0
- package/validation/validationWrapper.js +105 -0
- package/dist/resources/analytics/profile.d.ts +0 -2
- package/dist/resources/analytics/profile.js +0 -144
- package/dist/resources/analytics/profile.js.map +0 -1
|
@@ -0,0 +1,876 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// Note - do not import/use commonUtils.js in this module, it will cause circular dependencies.
|
|
4
|
+
const fs = require('fs-extra');
|
|
5
|
+
const { workerData, threadId, isMainThread } = require('worker_threads');
|
|
6
|
+
const pathModule = require('path');
|
|
7
|
+
const YAML = require('yaml');
|
|
8
|
+
const PropertiesReader = require('properties-reader');
|
|
9
|
+
const hdbTerms = require('../hdbTerms.ts');
|
|
10
|
+
const assignCMDENVVariables = require('../assignCmdEnvVariables.js');
|
|
11
|
+
const os = require('os');
|
|
12
|
+
const { PACKAGE_ROOT } = require('../../utility/packageUtils.js');
|
|
13
|
+
const { _assignPackageExport } = require('../../globals.js');
|
|
14
|
+
const { Console } = require('console');
|
|
15
|
+
// store the native write function so we can call it after we write to the log file (and store it on process.stdout
|
|
16
|
+
// because unit tests will create multiple instances of this module)
|
|
17
|
+
let nativeStdWrite = process.env.IS_SCRIPTED_SERVICE
|
|
18
|
+
? function () {
|
|
19
|
+
// if this is a child process started by a start/restart
|
|
20
|
+
// command, we can't write to stdout/stderr, we make this a noop
|
|
21
|
+
}
|
|
22
|
+
: process.stdout.nativeWrite || (process.stdout.nativeWrite = process.stdout.write);
|
|
23
|
+
let fileLoggers = new Map();
|
|
24
|
+
const { join } = pathModule;
|
|
25
|
+
|
|
26
|
+
const MAX_LOG_BUFFER = 10000;
|
|
27
|
+
const LOG_LEVEL_HIERARCHY = {
|
|
28
|
+
notify: 7,
|
|
29
|
+
fatal: 6,
|
|
30
|
+
error: 5,
|
|
31
|
+
warn: 4,
|
|
32
|
+
info: 3,
|
|
33
|
+
debug: 2,
|
|
34
|
+
trace: 1,
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
const OUTPUTS = {
|
|
38
|
+
STDOUT: 'stdOut',
|
|
39
|
+
STDERR: 'stdErr',
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
// Location of default config YAML.
|
|
43
|
+
const DEFAULT_CONFIG_FILE = join(PACKAGE_ROOT, 'static', hdbTerms.HDB_DEFAULT_CONFIG_FILE);
|
|
44
|
+
|
|
45
|
+
const CLOSE_LOG_FD_TIMEOUT = 10000;
|
|
46
|
+
|
|
47
|
+
let logConsole;
|
|
48
|
+
let log_to_file;
|
|
49
|
+
let logToStdstreams;
|
|
50
|
+
let colorMode;
|
|
51
|
+
let logLevel;
|
|
52
|
+
let logName;
|
|
53
|
+
let logRoot;
|
|
54
|
+
let logFilePath;
|
|
55
|
+
let mainLogger;
|
|
56
|
+
let externalLogger; // default logger used for the global used by external components
|
|
57
|
+
let mainLogFd;
|
|
58
|
+
let writeToLogFile;
|
|
59
|
+
let logImmediately;
|
|
60
|
+
|
|
61
|
+
// If this is the first time logger is called by process, hdb props will be undefined.
|
|
62
|
+
// Call init to get all the required log settings.
|
|
63
|
+
let hdbProperties;
|
|
64
|
+
|
|
65
|
+
let rootConfig;
|
|
66
|
+
|
|
67
|
+
function updateLogger(logger, logOptions, name) {
|
|
68
|
+
logger.rotation = logOptions.rotation;
|
|
69
|
+
let path = logOptions.path;
|
|
70
|
+
if (path) {
|
|
71
|
+
if (!logOptions.root) logOptions.root = pathModule.dirname(path);
|
|
72
|
+
} else if (logOptions.root) {
|
|
73
|
+
path = join(logOptions.root, logName);
|
|
74
|
+
} else {
|
|
75
|
+
path = mainLogger.path;
|
|
76
|
+
if (!logOptions.root) logOptions.root = pathModule.dirname(path);
|
|
77
|
+
}
|
|
78
|
+
if (path) logger.path = path;
|
|
79
|
+
else console.error('No path for logger', logOptions);
|
|
80
|
+
logger.level = LOG_LEVEL_HIERARCHY[logOptions.level] ?? mainLogger?.level ?? LOG_LEVEL_HIERARCHY.info;
|
|
81
|
+
updateConditional(logger);
|
|
82
|
+
logger.logToStdstreams = logOptions.stdStreams ?? false;
|
|
83
|
+
// if there is a configured tag or if a component is logging to default/main log path, use the component name as the tag
|
|
84
|
+
// to differentiate it
|
|
85
|
+
logger.tag = logOptions.tag ?? (mainLogger.path === logger.path && name);
|
|
86
|
+
}
|
|
87
|
+
// creates a logger where the methods are only defined if they are within the log level.
|
|
88
|
+
// Using this conditional logger means that every method call must be optional like log.trace?.('message),
|
|
89
|
+
// but there can be performance benefits to using this since it means that the arguments
|
|
90
|
+
// do not need to be evaluated at all.
|
|
91
|
+
function updateConditional(logger) {
|
|
92
|
+
const conditional = logger.conditional ?? (logger.conditional = {});
|
|
93
|
+
conditional.notify = LOG_LEVEL_HIERARCHY.notify >= logger.level ? logger.notify.bind(logger) : undefined;
|
|
94
|
+
conditional.fatal = LOG_LEVEL_HIERARCHY.fatal >= logger.level ? logger.fatal.bind(logger) : undefined;
|
|
95
|
+
conditional.error = LOG_LEVEL_HIERARCHY.error >= logger.level ? logger.error.bind(logger) : undefined;
|
|
96
|
+
conditional.warn = LOG_LEVEL_HIERARCHY.warn >= logger.level ? logger.warn.bind(logger) : undefined;
|
|
97
|
+
conditional.info = LOG_LEVEL_HIERARCHY.info >= logger.level ? logger.info.bind(logger) : undefined;
|
|
98
|
+
conditional.debug = LOG_LEVEL_HIERARCHY.debug >= logger.level ? logger.debug.bind(logger) : undefined;
|
|
99
|
+
conditional.trace = LOG_LEVEL_HIERARCHY.trace >= logger.level ? logger.trace.bind(logger) : undefined;
|
|
100
|
+
}
|
|
101
|
+
async function updateLogSettings() {
|
|
102
|
+
if (!rootConfig) {
|
|
103
|
+
// set up the initial watcher
|
|
104
|
+
rootConfig = new RootConfigWatcher();
|
|
105
|
+
// wait for it to be ready
|
|
106
|
+
await rootConfig.ready;
|
|
107
|
+
// TODO: Any way to differentiate changes that we can and can't handle?
|
|
108
|
+
rootConfig.on('change', updateLogSettings);
|
|
109
|
+
}
|
|
110
|
+
let rootConfigObject = rootConfig.config;
|
|
111
|
+
const logOptions = rootConfigObject.logging ?? {};
|
|
112
|
+
updateLogger(mainLogger, logOptions);
|
|
113
|
+
logFilePath = mainLogger.path;
|
|
114
|
+
logConsole = logOptions.console ?? false;
|
|
115
|
+
if (logOptions.external) {
|
|
116
|
+
updateLogger(externalLogger, logOptions.external);
|
|
117
|
+
}
|
|
118
|
+
for (const name in rootConfigObject) {
|
|
119
|
+
// we now scan each component to see if it has logging individual configured
|
|
120
|
+
const component = rootConfigObject[name];
|
|
121
|
+
if (component.logging) {
|
|
122
|
+
updateLogger(mainLogger.forComponent(name), component.logging, name);
|
|
123
|
+
} else if (mainLogger.hasComponent(name)) {
|
|
124
|
+
updateLogger(mainLogger.forComponent(name), logOptions, name);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
class HarperLogger extends Console {
|
|
130
|
+
constructor(streams, level) {
|
|
131
|
+
streams.stdout.removeListener = () => {};
|
|
132
|
+
streams.stderr.removeListener = () => {};
|
|
133
|
+
streams.stdout.listenerCount = () => {};
|
|
134
|
+
streams.stderr.listenerCount = () => {};
|
|
135
|
+
super(streams);
|
|
136
|
+
this.level = level;
|
|
137
|
+
}
|
|
138
|
+
trace(...args) {
|
|
139
|
+
currentLevel = 'trace';
|
|
140
|
+
if (this.level <= LOG_LEVEL_HIERARCHY.trace) {
|
|
141
|
+
super.info(...args);
|
|
142
|
+
}
|
|
143
|
+
currentLevel = 'info';
|
|
144
|
+
}
|
|
145
|
+
debug(...args) {
|
|
146
|
+
currentLevel = 'debug';
|
|
147
|
+
if (this.level <= LOG_LEVEL_HIERARCHY.debug) {
|
|
148
|
+
super.info(...args);
|
|
149
|
+
}
|
|
150
|
+
currentLevel = 'info';
|
|
151
|
+
}
|
|
152
|
+
info(...args) {
|
|
153
|
+
currentLevel = 'info';
|
|
154
|
+
if (this.level <= LOG_LEVEL_HIERARCHY.info) {
|
|
155
|
+
super.info(...args);
|
|
156
|
+
}
|
|
157
|
+
currentLevel = 'info';
|
|
158
|
+
}
|
|
159
|
+
warn(...args) {
|
|
160
|
+
currentLevel = 'warn';
|
|
161
|
+
if (this.level <= LOG_LEVEL_HIERARCHY.warn) {
|
|
162
|
+
super.warn(...args);
|
|
163
|
+
}
|
|
164
|
+
currentLevel = 'info';
|
|
165
|
+
}
|
|
166
|
+
error(...args) {
|
|
167
|
+
currentLevel = 'error';
|
|
168
|
+
if (this.level <= LOG_LEVEL_HIERARCHY.error) {
|
|
169
|
+
super.error(...args);
|
|
170
|
+
}
|
|
171
|
+
currentLevel = 'info';
|
|
172
|
+
}
|
|
173
|
+
fatal(...args) {
|
|
174
|
+
logImmediately = true;
|
|
175
|
+
try {
|
|
176
|
+
currentLevel = 'fatal';
|
|
177
|
+
if (this.level <= LOG_LEVEL_HIERARCHY.fatal) {
|
|
178
|
+
super.error(...args);
|
|
179
|
+
}
|
|
180
|
+
currentLevel = 'info';
|
|
181
|
+
} finally {
|
|
182
|
+
logImmediately = false;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
notify(...args) {
|
|
186
|
+
logImmediately = true;
|
|
187
|
+
try {
|
|
188
|
+
currentLevel = 'notify';
|
|
189
|
+
if (this.level <= LOG_LEVEL_HIERARCHY.notify) {
|
|
190
|
+
super.info(...args);
|
|
191
|
+
}
|
|
192
|
+
currentLevel = 'info';
|
|
193
|
+
} finally {
|
|
194
|
+
logImmediately = false;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
withTag(tag) {
|
|
198
|
+
return loggerWithTag(tag, true, this);
|
|
199
|
+
}
|
|
200
|
+
forComponent(_name) {
|
|
201
|
+
// to be replaced
|
|
202
|
+
return this;
|
|
203
|
+
}
|
|
204
|
+
hasComponent(_name) {
|
|
205
|
+
// to be replaced
|
|
206
|
+
return false;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
if (hdbProperties === undefined) initLogSettings();
|
|
211
|
+
|
|
212
|
+
module.exports = {
|
|
213
|
+
notify,
|
|
214
|
+
fatal,
|
|
215
|
+
error,
|
|
216
|
+
warn,
|
|
217
|
+
info,
|
|
218
|
+
debug,
|
|
219
|
+
trace,
|
|
220
|
+
logLevel,
|
|
221
|
+
loggerWithTag,
|
|
222
|
+
suppressLogging,
|
|
223
|
+
initLogSettings,
|
|
224
|
+
logCustomLevel,
|
|
225
|
+
closeLogFile,
|
|
226
|
+
createLogger,
|
|
227
|
+
logsAtLevel,
|
|
228
|
+
getLogFilePath: () => logFilePath,
|
|
229
|
+
forComponent: (name) => mainLogger.forComponent(name),
|
|
230
|
+
setMainLogger,
|
|
231
|
+
setLogLevel,
|
|
232
|
+
OUTPUTS,
|
|
233
|
+
AuthAuditLog,
|
|
234
|
+
// for now these functions at least notify us of when the component system is ready so
|
|
235
|
+
// we can start using the RootConfigWatcher
|
|
236
|
+
start: updateLogSettings,
|
|
237
|
+
startOnMainThread: updateLogSettings,
|
|
238
|
+
errorToString,
|
|
239
|
+
disableStdio,
|
|
240
|
+
};
|
|
241
|
+
|
|
242
|
+
/**
|
|
243
|
+
* We call this if stdio is not functional
|
|
244
|
+
*/
|
|
245
|
+
function disableStdio() {
|
|
246
|
+
nativeStdWrite = function () {}; // make this a noop
|
|
247
|
+
}
|
|
248
|
+
module.exports.externalLogger = {
|
|
249
|
+
notify(...args) {
|
|
250
|
+
externalLogger.notify(...args);
|
|
251
|
+
},
|
|
252
|
+
fatal(...args) {
|
|
253
|
+
externalLogger.fatal(...args);
|
|
254
|
+
},
|
|
255
|
+
error(...args) {
|
|
256
|
+
externalLogger.error(...args);
|
|
257
|
+
},
|
|
258
|
+
warn(...args) {
|
|
259
|
+
externalLogger.warn(...args);
|
|
260
|
+
},
|
|
261
|
+
info(...args) {
|
|
262
|
+
externalLogger.info(...args);
|
|
263
|
+
},
|
|
264
|
+
debug(...args) {
|
|
265
|
+
externalLogger.debug(...args);
|
|
266
|
+
},
|
|
267
|
+
trace(...args) {
|
|
268
|
+
externalLogger.trace(...args);
|
|
269
|
+
},
|
|
270
|
+
withTag(tag) {
|
|
271
|
+
return externalLogger.withTag(tag);
|
|
272
|
+
},
|
|
273
|
+
loggerWithTag(tag) {
|
|
274
|
+
return externalLogger.withTag(tag);
|
|
275
|
+
},
|
|
276
|
+
};
|
|
277
|
+
_assignPackageExport('logger', module.exports.externalLogger);
|
|
278
|
+
|
|
279
|
+
/**
|
|
280
|
+
* Check if the current log level is at or below the given level.
|
|
281
|
+
* @param level
|
|
282
|
+
* @return {boolean}
|
|
283
|
+
*/
|
|
284
|
+
function logsAtLevel(level) {
|
|
285
|
+
return LOG_LEVEL_HIERARCHY[logLevel] <= LOG_LEVEL_HIERARCHY[level];
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
/**
|
|
289
|
+
* Get the log settings from the settings file.
|
|
290
|
+
* If the settings file doesn't exist (during install) check for command or env vars, if there aren't
|
|
291
|
+
* any, use default values.
|
|
292
|
+
*/
|
|
293
|
+
function initLogSettings(forceInit = false) {
|
|
294
|
+
try {
|
|
295
|
+
if (hdbProperties === undefined || forceInit) {
|
|
296
|
+
closeLogFile();
|
|
297
|
+
const bootPropsFilePath = getPropsFilePath();
|
|
298
|
+
let properties = assignCMDENVVariables(['ROOTPATH']);
|
|
299
|
+
try {
|
|
300
|
+
hdbProperties = PropertiesReader(bootPropsFilePath);
|
|
301
|
+
} catch (err) {
|
|
302
|
+
// This is here for situations where HDB isn't using a boot file
|
|
303
|
+
if (
|
|
304
|
+
!properties.ROOTPATH ||
|
|
305
|
+
(!fs.pathExistsSync(join(properties.ROOTPATH, hdbTerms.HARPER_CONFIG_FILE)) &&
|
|
306
|
+
!fs.pathExistsSync(join(properties.ROOTPATH, hdbTerms.HDB_CONFIG_FILE)))
|
|
307
|
+
)
|
|
308
|
+
throw err;
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
//if root path check for config file, if it exists - all good
|
|
312
|
+
// if root path and no config file just throw err
|
|
313
|
+
let configPath;
|
|
314
|
+
if (properties.ROOTPATH) {
|
|
315
|
+
configPath = join(properties.ROOTPATH, hdbTerms.HARPER_CONFIG_FILE);
|
|
316
|
+
if (!fs.pathExistsSync(configPath) && fs.pathExistsSync(join(properties.ROOTPATH, hdbTerms.HDB_CONFIG_FILE)))
|
|
317
|
+
configPath = join(properties.ROOTPATH, hdbTerms.HDB_CONFIG_FILE);
|
|
318
|
+
} else configPath = hdbProperties.get('settings_path');
|
|
319
|
+
let rotation;
|
|
320
|
+
({
|
|
321
|
+
level: logLevel,
|
|
322
|
+
configLogPath: logRoot,
|
|
323
|
+
toFile: log_to_file,
|
|
324
|
+
logConsole,
|
|
325
|
+
colorMode,
|
|
326
|
+
rotation,
|
|
327
|
+
toStream: logToStdstreams,
|
|
328
|
+
} = getLogConfig(configPath));
|
|
329
|
+
|
|
330
|
+
logName = hdbTerms.LOG_NAMES.HDB;
|
|
331
|
+
logFilePath = join(logRoot, logName);
|
|
332
|
+
|
|
333
|
+
mainLogger = createLogger({
|
|
334
|
+
path: logFilePath,
|
|
335
|
+
level: logLevel,
|
|
336
|
+
stdStreams: logToStdstreams,
|
|
337
|
+
rotation,
|
|
338
|
+
});
|
|
339
|
+
// setup the external logger
|
|
340
|
+
externalLogger = mainLogger.forComponent('external');
|
|
341
|
+
externalLogger.tag = null; // don't tag by default
|
|
342
|
+
if (isMainThread) {
|
|
343
|
+
try {
|
|
344
|
+
const SegfaultHandler = require('segfault-handler');
|
|
345
|
+
SegfaultHandler.registerHandler(join(logRoot, 'crash.log'));
|
|
346
|
+
} catch {
|
|
347
|
+
// optional dependency, ok if we can't run it
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
} catch (err) {
|
|
352
|
+
hdbProperties = undefined;
|
|
353
|
+
if (err.code === hdbTerms.NODE_ERROR_CODES.ENOENT || err.code === hdbTerms.NODE_ERROR_CODES.ERR_INVALID_ARG_TYPE) {
|
|
354
|
+
// If the env settings haven't been initialized check cmd/env vars for values. If values not found used default.
|
|
355
|
+
const cmdEnvs = assignCMDENVVariables(Object.keys(hdbTerms.CONFIG_PARAM_MAP), true);
|
|
356
|
+
for (const key in cmdEnvs) {
|
|
357
|
+
const configParam = hdbTerms.CONFIG_PARAM_MAP[key];
|
|
358
|
+
if (configParam) configParam.toLowerCase();
|
|
359
|
+
const configValue = cmdEnvs[key];
|
|
360
|
+
if (configParam === hdbTerms.CONFIG_PARAMS.LOGGING_LEVEL) {
|
|
361
|
+
logLevel = configValue;
|
|
362
|
+
continue;
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
if (configParam === hdbTerms.CONFIG_PARAMS.LOGGING_CONSOLE) {
|
|
366
|
+
logConsole = configParam;
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
const { defaultLevel } = getDefaultConfig();
|
|
371
|
+
|
|
372
|
+
log_to_file = false;
|
|
373
|
+
logToStdstreams = true;
|
|
374
|
+
|
|
375
|
+
logLevel = logLevel === undefined ? defaultLevel : logLevel;
|
|
376
|
+
|
|
377
|
+
mainLogger = createLogger({ level: logLevel });
|
|
378
|
+
// setup the external logger
|
|
379
|
+
externalLogger = mainLogger.forComponent('external');
|
|
380
|
+
externalLogger.tag = null; // don't tag by default
|
|
381
|
+
return;
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
error('Error initializing log settings');
|
|
385
|
+
error(err);
|
|
386
|
+
throw err;
|
|
387
|
+
}
|
|
388
|
+
if (process.env.DEV_MODE) logToStdstreams = true;
|
|
389
|
+
stdioLogging();
|
|
390
|
+
}
|
|
391
|
+
let loggingEnabled = true;
|
|
392
|
+
function stdioLogging() {
|
|
393
|
+
if (log_to_file) {
|
|
394
|
+
process.stdout.write = function (data) {
|
|
395
|
+
if (
|
|
396
|
+
typeof data === 'string' && // this is how we identify console output vs redirected output from a worker
|
|
397
|
+
loggingEnabled &&
|
|
398
|
+
logConsole
|
|
399
|
+
) {
|
|
400
|
+
data = data.toString();
|
|
401
|
+
if (data[data.length - 1] === '\n') data = data.slice(0, -1);
|
|
402
|
+
writeToLogFile(data);
|
|
403
|
+
}
|
|
404
|
+
return nativeStdWrite.apply(process.stdout, arguments);
|
|
405
|
+
};
|
|
406
|
+
process.stderr.write = function (data) {
|
|
407
|
+
if (
|
|
408
|
+
typeof data === 'string' && // this is how we identify console output vs redirected output from a worker
|
|
409
|
+
loggingEnabled &&
|
|
410
|
+
logConsole
|
|
411
|
+
) {
|
|
412
|
+
if (data[data.length - 1] === '\n') data = data.slice(0, -1);
|
|
413
|
+
writeToLogFile(data);
|
|
414
|
+
}
|
|
415
|
+
return nativeStdWrite.apply(process.stderr, arguments);
|
|
416
|
+
};
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
function loggerWithTag(tag, conditional, logger = mainLogger) {
|
|
421
|
+
tag = tag.replace(/ /g, '-'); // tag can't have spaces
|
|
422
|
+
return {
|
|
423
|
+
notify: logWithTag(logger.notify, 'notify'),
|
|
424
|
+
fatal: logWithTag(logger.fatal, 'fatal'),
|
|
425
|
+
error: logWithTag(logger.error, 'error'),
|
|
426
|
+
warn: logWithTag(logger.warn, 'warn'),
|
|
427
|
+
info: logWithTag(logger.info, 'info'),
|
|
428
|
+
debug: logWithTag(logger.debug, 'debug'),
|
|
429
|
+
trace: logWithTag(logger.trace, 'trace'),
|
|
430
|
+
};
|
|
431
|
+
function logWithTag(loggerMethod, level) {
|
|
432
|
+
return !conditional || logger.level <= LOG_LEVEL_HIERARCHY[level]
|
|
433
|
+
? function (...args) {
|
|
434
|
+
currentTag = tag;
|
|
435
|
+
try {
|
|
436
|
+
return loggerMethod.call(logger, ...args);
|
|
437
|
+
} finally {
|
|
438
|
+
currentTag = undefined;
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
: null;
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
function suppressLogging(callback) {
|
|
446
|
+
try {
|
|
447
|
+
loggingEnabled = false;
|
|
448
|
+
callback();
|
|
449
|
+
} finally {
|
|
450
|
+
loggingEnabled = true;
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
const SERVICE_NAME = workerData?.name?.replace(/ /g, '-') || 'main';
|
|
455
|
+
// these are used to store information about the current service and tag so we can prepend them to the log during
|
|
456
|
+
// the writes, without having to pass the information through the Console instance
|
|
457
|
+
let currentLevel = 'info'; // default is info
|
|
458
|
+
let currentServiceName;
|
|
459
|
+
let currentTag;
|
|
460
|
+
function createLogger({
|
|
461
|
+
path: logFilePath,
|
|
462
|
+
level: logLevel,
|
|
463
|
+
stdStreams: logToStdstreams,
|
|
464
|
+
rotation,
|
|
465
|
+
isExternalInstance,
|
|
466
|
+
writeToLog,
|
|
467
|
+
component,
|
|
468
|
+
}) {
|
|
469
|
+
if (!logLevel) logLevel = 'info';
|
|
470
|
+
let level = LOG_LEVEL_HIERARCHY[logLevel];
|
|
471
|
+
let logger;
|
|
472
|
+
/**
|
|
473
|
+
* Log to std out and/or file
|
|
474
|
+
* @param log
|
|
475
|
+
*/
|
|
476
|
+
function logStdOut(log) {
|
|
477
|
+
if (log_to_file) {
|
|
478
|
+
if (logger.logToStdstreams) {
|
|
479
|
+
// eslint-disable-next-line no-control-regex
|
|
480
|
+
logToFile(log.replace(/\x1b\[[0-9;]*m/g, '')); // remove color codes
|
|
481
|
+
loggingEnabled = false;
|
|
482
|
+
try {
|
|
483
|
+
// if we are writing std streams we don't want to double write to the file through the stdio capture
|
|
484
|
+
process.stdout.write(log);
|
|
485
|
+
} finally {
|
|
486
|
+
loggingEnabled = true;
|
|
487
|
+
}
|
|
488
|
+
} else {
|
|
489
|
+
logToFile(log);
|
|
490
|
+
}
|
|
491
|
+
} else if (logToStdstreams) process.stdout.write(log);
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
/**
|
|
495
|
+
* Log to std err and/or file
|
|
496
|
+
* @param log
|
|
497
|
+
*/
|
|
498
|
+
function logStdErr(log) {
|
|
499
|
+
if (log_to_file) {
|
|
500
|
+
logToFile(log);
|
|
501
|
+
if (logToStdstreams) {
|
|
502
|
+
loggingEnabled = false;
|
|
503
|
+
try {
|
|
504
|
+
// if we are writing std streams we don't want to double write to the file through the stdio capture
|
|
505
|
+
process.stderr.write(log);
|
|
506
|
+
} finally {
|
|
507
|
+
loggingEnabled = true;
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
} else if (logToStdstreams) process.stderr.write(log);
|
|
511
|
+
}
|
|
512
|
+
let logToFile = logFilePath && getFileLogger(logFilePath, rotation, isExternalInstance);
|
|
513
|
+
function logPrepend(write) {
|
|
514
|
+
return {
|
|
515
|
+
write(log) {
|
|
516
|
+
let tags = [currentLevel];
|
|
517
|
+
tags.unshift(currentServiceName || SERVICE_NAME + '/' + threadId);
|
|
518
|
+
if (currentTag) tags.push(currentTag);
|
|
519
|
+
if (logger.tag) tags.push(logger.tag);
|
|
520
|
+
write(`[${tags.join('] [')}]: ${log}`);
|
|
521
|
+
},
|
|
522
|
+
};
|
|
523
|
+
}
|
|
524
|
+
if (isExternalInstance) {
|
|
525
|
+
writeToLogFile = logToFile;
|
|
526
|
+
}
|
|
527
|
+
logger = new HarperLogger(
|
|
528
|
+
{
|
|
529
|
+
stdout: logPrepend(writeToLog ?? logStdOut),
|
|
530
|
+
stderr: logPrepend(writeToLog ?? logStdErr),
|
|
531
|
+
colorMode: (logToStdstreams && colorMode) || false,
|
|
532
|
+
},
|
|
533
|
+
level
|
|
534
|
+
);
|
|
535
|
+
updateConditional(logger);
|
|
536
|
+
logger.path = logFilePath;
|
|
537
|
+
Object.defineProperty(logger, 'path', {
|
|
538
|
+
get() {
|
|
539
|
+
return logFilePath;
|
|
540
|
+
},
|
|
541
|
+
set(path) {
|
|
542
|
+
logFilePath = path;
|
|
543
|
+
logToFile = getFileLogger(logFilePath, logger.rotation, isExternalInstance);
|
|
544
|
+
if (isExternalInstance) writeToLogFile = logToFile;
|
|
545
|
+
},
|
|
546
|
+
enumerable: true,
|
|
547
|
+
});
|
|
548
|
+
logger.closeLogFile = logToFile?.closeLogFile;
|
|
549
|
+
logger.logToStdstreams = logToStdstreams;
|
|
550
|
+
if (!component) {
|
|
551
|
+
let components = new Map();
|
|
552
|
+
logger.forComponent = function (name) {
|
|
553
|
+
let componentLogger = components.get(name);
|
|
554
|
+
if (!componentLogger) {
|
|
555
|
+
componentLogger = createLogger({
|
|
556
|
+
path: logFilePath,
|
|
557
|
+
level: logLevel,
|
|
558
|
+
stdStreams: logToStdstreams,
|
|
559
|
+
isExternalInstance: name === 'external',
|
|
560
|
+
rotation,
|
|
561
|
+
writeToLog,
|
|
562
|
+
component: true,
|
|
563
|
+
});
|
|
564
|
+
components.set(name, componentLogger);
|
|
565
|
+
}
|
|
566
|
+
return componentLogger;
|
|
567
|
+
};
|
|
568
|
+
logger.hasComponent = function (name) {
|
|
569
|
+
return components.has(name);
|
|
570
|
+
};
|
|
571
|
+
}
|
|
572
|
+
return logger;
|
|
573
|
+
}
|
|
574
|
+
const LOG_TIME_USAGE_THRESHOLD = 100;
|
|
575
|
+
/**
|
|
576
|
+
* Get the file logger for the given path. If it doesn't exist, create it.
|
|
577
|
+
* @param path
|
|
578
|
+
* @param isExternalInstance
|
|
579
|
+
* @return {any}
|
|
580
|
+
*/
|
|
581
|
+
function getFileLogger(path, rotation, isExternalInstance) {
|
|
582
|
+
let logger = fileLoggers.get(path);
|
|
583
|
+
let logFD, loggedFDError, logTimer;
|
|
584
|
+
let logBuffer;
|
|
585
|
+
let logTimeUsage = 0;
|
|
586
|
+
if (!logger) {
|
|
587
|
+
logger = logToFile;
|
|
588
|
+
logger.closeLogFile = closeLogFile;
|
|
589
|
+
logger.path = path;
|
|
590
|
+
fileLoggers.set(path, logger);
|
|
591
|
+
}
|
|
592
|
+
if (isMainThread && JSON.stringify(rotation) !== JSON.stringify(logger.rotation)) {
|
|
593
|
+
logger.rotation = rotation;
|
|
594
|
+
setTimeout(() => {
|
|
595
|
+
logger.rotator?.end();
|
|
596
|
+
if (!rotation) return;
|
|
597
|
+
const logRotator = require('./logRotator.js');
|
|
598
|
+
try {
|
|
599
|
+
logger.rotator = logRotator({
|
|
600
|
+
logger,
|
|
601
|
+
...rotation,
|
|
602
|
+
});
|
|
603
|
+
} catch (error) {
|
|
604
|
+
logger('Error initializing log rotator', error);
|
|
605
|
+
}
|
|
606
|
+
}, 100);
|
|
607
|
+
}
|
|
608
|
+
return logger;
|
|
609
|
+
function logToFile(log) {
|
|
610
|
+
let entry = `${new Date().toISOString()} ${log}${log.endsWith('\n') ? '' : '\n'}`;
|
|
611
|
+
if (logBuffer) {
|
|
612
|
+
// if we are currently in log buffer mode, we will add the entry to the buffer (there will be a timer to write it)
|
|
613
|
+
if (logBuffer.length < MAX_LOG_BUFFER) {
|
|
614
|
+
logBuffer.push(entry);
|
|
615
|
+
} else if (logBuffer.length === MAX_LOG_BUFFER) {
|
|
616
|
+
logBuffer.push('Maximum log buffer rate reached, logs will be throttled\n');
|
|
617
|
+
}
|
|
618
|
+
if (logImmediately) {
|
|
619
|
+
clearTimeout(logTimer);
|
|
620
|
+
logQueuedData();
|
|
621
|
+
}
|
|
622
|
+
} else {
|
|
623
|
+
if (logImmediately || logTimeUsage < performance.now() + LOG_TIME_USAGE_THRESHOLD) {
|
|
624
|
+
// if we have a directive to log immediately, or we are not using more than 2 percent of processing time
|
|
625
|
+
logQueuedData(entry);
|
|
626
|
+
} else {
|
|
627
|
+
logTimeUsage = Math.min(logTimeUsage, performance.now() + LOG_TIME_USAGE_THRESHOLD);
|
|
628
|
+
logBuffer = [entry];
|
|
629
|
+
logTimer = setTimeout(logQueuedData, 1);
|
|
630
|
+
}
|
|
631
|
+
}
|
|
632
|
+
}
|
|
633
|
+
// this is called on a timer, and will write the log buffer to the file
|
|
634
|
+
function logQueuedData(entry) {
|
|
635
|
+
openLogFile();
|
|
636
|
+
if (logFD) {
|
|
637
|
+
let startTime = performance.now();
|
|
638
|
+
fs.appendFileSync(logFD, logBuffer ? logBuffer.join('') : entry);
|
|
639
|
+
let endTime = performance.now();
|
|
640
|
+
// determine if we are using more than about two percent of processing time for log writes recently, and if so, we
|
|
641
|
+
// will start buffering
|
|
642
|
+
logTimeUsage = Math.max(endTime, logTimeUsage) + (endTime - startTime) * 50;
|
|
643
|
+
} else if (!loggedFDError) console.log(logBuffer ? logBuffer.join('') : entry);
|
|
644
|
+
if (logBuffer) logBuffer = null;
|
|
645
|
+
}
|
|
646
|
+
|
|
647
|
+
function closeLogFile() {
|
|
648
|
+
try {
|
|
649
|
+
fs.closeSync(logFD);
|
|
650
|
+
} catch {}
|
|
651
|
+
logFD = null;
|
|
652
|
+
if (isExternalInstance) mainLogFd = null;
|
|
653
|
+
}
|
|
654
|
+
|
|
655
|
+
function openLogFile(isRetry) {
|
|
656
|
+
if (!logFD) {
|
|
657
|
+
try {
|
|
658
|
+
logFD = fs.openSync(path, 'a');
|
|
659
|
+
if (isExternalInstance) mainLogFd = logFD;
|
|
660
|
+
} catch (error) {
|
|
661
|
+
if (error.code === 'ENOENT' && !isRetry) {
|
|
662
|
+
// if the directory doesn't exist, create it
|
|
663
|
+
fs.mkdirpSync(pathModule.dirname(path));
|
|
664
|
+
return openLogFile(true);
|
|
665
|
+
}
|
|
666
|
+
if (!loggedFDError) {
|
|
667
|
+
loggedFDError = true;
|
|
668
|
+
console.error(error);
|
|
669
|
+
}
|
|
670
|
+
}
|
|
671
|
+
setTimeout(() => {
|
|
672
|
+
closeLogFile();
|
|
673
|
+
}, CLOSE_LOG_FD_TIMEOUT).unref(); // periodically time it out so we can reset it in case the file has been moved (log rotation or by user) or deleted.
|
|
674
|
+
}
|
|
675
|
+
}
|
|
676
|
+
}
|
|
677
|
+
/**
|
|
678
|
+
* Log an info level log.
|
|
679
|
+
* @param args - rest parameter syntax (...args), allows function to accept indefinite number of args as an array of log messages(strings/objects).
|
|
680
|
+
* Provide args separated by commas. No need to stringify objects. Console will do that
|
|
681
|
+
*/
|
|
682
|
+
function info(...args) {
|
|
683
|
+
mainLogger.info(...args);
|
|
684
|
+
}
|
|
685
|
+
|
|
686
|
+
/**
|
|
687
|
+
* Log a trace level log.
|
|
688
|
+
* @param args - rest parameter syntax (...args), allows function to accept indefinite number of args as an array of log messages(strings/objects).
|
|
689
|
+
* Provide args separated by commas. No need to stringify objects. Console will do that
|
|
690
|
+
*/
|
|
691
|
+
function trace(...args) {
|
|
692
|
+
mainLogger.trace(...args);
|
|
693
|
+
}
|
|
694
|
+
|
|
695
|
+
/**
|
|
696
|
+
* Log a error level log.
|
|
697
|
+
* @param args - rest parameter syntax (...args), allows function to accept indefinite number of args as an array of log messages(strings/objects).
|
|
698
|
+
* Provide args separated by commas. No need to stringify objects. Console will do that
|
|
699
|
+
*/
|
|
700
|
+
function error(...args) {
|
|
701
|
+
mainLogger.error(...args);
|
|
702
|
+
}
|
|
703
|
+
|
|
704
|
+
/**
|
|
705
|
+
* Log a debug level log.
|
|
706
|
+
* @param args - rest parameter syntax (...args), allows function to accept indefinite number of args as an array of log messages(strings/objects).
|
|
707
|
+
* Provide args separated by commas. No need to stringify objects. Console will do that
|
|
708
|
+
*/
|
|
709
|
+
function debug(...args) {
|
|
710
|
+
mainLogger.debug(...args);
|
|
711
|
+
}
|
|
712
|
+
|
|
713
|
+
/**
|
|
714
|
+
* Log a notify level log.
|
|
715
|
+
* @param args - rest parameter syntax (...args), allows function to accept indefinite number of args as an array of log messages(strings/objects).
|
|
716
|
+
* Provide args separated by commas. No need to stringify objects. Console will do that
|
|
717
|
+
*/
|
|
718
|
+
function notify(...args) {
|
|
719
|
+
mainLogger.notify(...args);
|
|
720
|
+
}
|
|
721
|
+
|
|
722
|
+
/**
|
|
723
|
+
* Log a fatal level log.
|
|
724
|
+
* @param args - rest parameter syntax (...args), allows function to accept indefinite number of args as an array of log messages(strings/objects).
|
|
725
|
+
* Provide args separated by commas. No need to stringify objects. Console will do that
|
|
726
|
+
*/
|
|
727
|
+
function fatal(...args) {
|
|
728
|
+
mainLogger.fatal(...args);
|
|
729
|
+
}
|
|
730
|
+
|
|
731
|
+
/**
|
|
732
|
+
* Log a warn level log.
|
|
733
|
+
* @param args - rest parameter syntax (...args), allows function to accept indefinite number of args as an array of log messages(strings/objects).
|
|
734
|
+
* Provide args separated by commas. No need to stringify objects. Console will do that
|
|
735
|
+
*/
|
|
736
|
+
function warn(...args) {
|
|
737
|
+
mainLogger.warn(...args);
|
|
738
|
+
}
|
|
739
|
+
|
|
740
|
+
function logCustomLevel(level, output, options, ...args) {
|
|
741
|
+
currentServiceName = options.service_name;
|
|
742
|
+
try {
|
|
743
|
+
mainLogger[level](...args);
|
|
744
|
+
} finally {
|
|
745
|
+
currentServiceName = undefined;
|
|
746
|
+
}
|
|
747
|
+
}
|
|
748
|
+
|
|
749
|
+
/**
|
|
750
|
+
* This is a duplicate of commonUtils.getPropsFilePath. We need to have it duplicated here to avoid a circular dependency
|
|
751
|
+
* that happens when commonUtils is imported.
|
|
752
|
+
* @returns {*}
|
|
753
|
+
*/
|
|
754
|
+
function getPropsFilePath() {
|
|
755
|
+
let homeDir = undefined;
|
|
756
|
+
try {
|
|
757
|
+
homeDir = os.homedir();
|
|
758
|
+
} catch {
|
|
759
|
+
// could get here in android
|
|
760
|
+
homeDir = process.env.HOME;
|
|
761
|
+
}
|
|
762
|
+
if (!homeDir) {
|
|
763
|
+
homeDir = '~/';
|
|
764
|
+
}
|
|
765
|
+
|
|
766
|
+
let _bootPropsFilePath = join(homeDir, hdbTerms.HDB_HOME_DIR_NAME, hdbTerms.BOOT_PROPS_FILE_NAME);
|
|
767
|
+
// this checks how we used to store the boot props file for older installations.
|
|
768
|
+
if (!fs.existsSync(_bootPropsFilePath)) {
|
|
769
|
+
_bootPropsFilePath = join(PACKAGE_ROOT, 'utility/hdb_boot_properties.file');
|
|
770
|
+
}
|
|
771
|
+
return _bootPropsFilePath;
|
|
772
|
+
}
|
|
773
|
+
|
|
774
|
+
function setLogLevel(level) {
|
|
775
|
+
logLevel = level;
|
|
776
|
+
}
|
|
777
|
+
|
|
778
|
+
/**
|
|
779
|
+
* Reads the harperdb-config.yaml file for log settings.
|
|
780
|
+
* @param hdbConfigPath
|
|
781
|
+
* @returns {{configLogPath: any, rotate: any, level: any, toFile: any, root: any, toStream: any}}
|
|
782
|
+
*/
|
|
783
|
+
function getLogConfig(hdbConfigPath) {
|
|
784
|
+
try {
|
|
785
|
+
// This is here to accommodate pre 4.0.0 settings files that might exist during upgrade.
|
|
786
|
+
if (hdbConfigPath.includes('config/settings.js')) {
|
|
787
|
+
const oldHdbSettings = PropertiesReader(hdbConfigPath);
|
|
788
|
+
return {
|
|
789
|
+
level: oldHdbSettings.get(hdbTerms.HDB_SETTINGS_NAMES.LOG_LEVEL_KEY),
|
|
790
|
+
configLogPath: pathModule.dirname(oldHdbSettings.get(hdbTerms.HDB_SETTINGS_NAMES.LOG_PATH_KEY)),
|
|
791
|
+
toFile: oldHdbSettings.get(hdbTerms.HDB_SETTINGS_NAMES.LOG_TO_FILE),
|
|
792
|
+
toStream: oldHdbSettings.get(hdbTerms.HDB_SETTINGS_NAMES.LOG_TO_STDSTREAMS),
|
|
793
|
+
};
|
|
794
|
+
}
|
|
795
|
+
const configDoc = YAML.parseDocument(fs.readFileSync(hdbConfigPath, 'utf8'));
|
|
796
|
+
const level = configDoc.getIn(['logging', 'level']);
|
|
797
|
+
const configLogPath = configDoc.getIn(['logging', 'root']);
|
|
798
|
+
const toFile = configDoc.getIn(['logging', 'file']);
|
|
799
|
+
const toStream = configDoc.getIn(['logging', 'stdStreams']);
|
|
800
|
+
const logConsole = configDoc.getIn(['logging', 'console']);
|
|
801
|
+
const colorMode = configDoc.getIn(['logging', 'colors']) ?? true; // default to true
|
|
802
|
+
const rotation = configDoc.getIn(['logging', 'rotation'])?.toJSON();
|
|
803
|
+
|
|
804
|
+
return {
|
|
805
|
+
level,
|
|
806
|
+
configLogPath,
|
|
807
|
+
toFile,
|
|
808
|
+
toStream,
|
|
809
|
+
logConsole,
|
|
810
|
+
colorMode,
|
|
811
|
+
rotation,
|
|
812
|
+
};
|
|
813
|
+
} catch (err) {
|
|
814
|
+
// If the config file doesn't exist throw ENOENT error and parent function will use default log settings
|
|
815
|
+
if (err.code === hdbTerms.NODE_ERROR_CODES.ENOENT) {
|
|
816
|
+
throw err;
|
|
817
|
+
}
|
|
818
|
+
|
|
819
|
+
console.error('Error accessing config file for logging');
|
|
820
|
+
console.error(err);
|
|
821
|
+
}
|
|
822
|
+
}
|
|
823
|
+
|
|
824
|
+
/**
|
|
825
|
+
* Read the default harperdb yaml file for default log settings.
|
|
826
|
+
* Used in early install stages before harperdb-config.yaml exists
|
|
827
|
+
* @returns {{default_to_file: any, default_level: any, default_to_stream: any}}
|
|
828
|
+
*/
|
|
829
|
+
function getDefaultConfig() {
|
|
830
|
+
try {
|
|
831
|
+
const defaultConfigDoc = YAML.parseDocument(fs.readFileSync(DEFAULT_CONFIG_FILE, 'utf8'));
|
|
832
|
+
const defaultLevel = defaultConfigDoc.getIn(['logging', 'level']);
|
|
833
|
+
const defaultToFile = defaultConfigDoc.getIn(['logging', 'file']);
|
|
834
|
+
const defaultToStream = defaultConfigDoc.getIn(['logging', 'stdStreams']);
|
|
835
|
+
return {
|
|
836
|
+
defaultLevel,
|
|
837
|
+
defaultToFile,
|
|
838
|
+
defaultToStream,
|
|
839
|
+
};
|
|
840
|
+
} catch (err) {
|
|
841
|
+
console.error('Error accessing default config file for logging');
|
|
842
|
+
console.error(err);
|
|
843
|
+
}
|
|
844
|
+
}
|
|
845
|
+
|
|
846
|
+
/**
|
|
847
|
+
* This converts an error to a human readable string. This follows the convention of standard console logging
|
|
848
|
+
* of printing the error as "ErrorClassName: message". Strangely, this is _not_ how Error.prototype.toString
|
|
849
|
+
* behaves, so this normalizes to match the bevahior of the console rather than default toString.
|
|
850
|
+
* @param error
|
|
851
|
+
* @return {string|string}
|
|
852
|
+
*/
|
|
853
|
+
function errorToString(error) {
|
|
854
|
+
return typeof error.message === 'string' ? `${error.constructor.name}: ${error.message}` : error.toString();
|
|
855
|
+
}
|
|
856
|
+
|
|
857
|
+
function setMainLogger(logger) {
|
|
858
|
+
mainLogger = logger;
|
|
859
|
+
}
|
|
860
|
+
function closeLogFile() {
|
|
861
|
+
try {
|
|
862
|
+
fs.closeSync(mainLogFd);
|
|
863
|
+
} catch {}
|
|
864
|
+
mainLogFd = null;
|
|
865
|
+
}
|
|
866
|
+
|
|
867
|
+
function AuthAuditLog(username, status, type, originatingIp, requestMethod, path) {
|
|
868
|
+
this.username = username;
|
|
869
|
+
this.status = status;
|
|
870
|
+
this.type = type;
|
|
871
|
+
this.originating_ip = originatingIp;
|
|
872
|
+
this.request_method = requestMethod;
|
|
873
|
+
this.path = path;
|
|
874
|
+
}
|
|
875
|
+
// we have to load this at the end to avoid circular dependencies problems
|
|
876
|
+
const { RootConfigWatcher } = require('../../config/RootConfigWatcher.ts');
|