@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,246 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const Joi = require('joi');
|
|
4
|
+
const fs = require('fs-extra');
|
|
5
|
+
const path = require('path');
|
|
6
|
+
const validator = require('../validation/validationWrapper.js');
|
|
7
|
+
const envMangr = require('../utility/environment/environmentManager.js');
|
|
8
|
+
const hdbTerms = require('../utility/hdbTerms.ts');
|
|
9
|
+
const hdbLogger = require('../utility/logging/harper_logger.js');
|
|
10
|
+
const { hdbErrors } = require('../utility/errors/hdbError.js');
|
|
11
|
+
const { HDB_ERROR_MSGS } = hdbErrors;
|
|
12
|
+
|
|
13
|
+
// File name can only be alphanumeric, dash and underscores
|
|
14
|
+
const PROJECT_FILE_NAME_REGEX = /^[a-zA-Z0-9-_]+$/;
|
|
15
|
+
|
|
16
|
+
module.exports = {
|
|
17
|
+
getDropCustomFunctionValidator,
|
|
18
|
+
setCustomFunctionValidator,
|
|
19
|
+
addComponentValidator,
|
|
20
|
+
dropCustomFunctionProjectValidator,
|
|
21
|
+
packageComponentValidator,
|
|
22
|
+
deployComponentValidator,
|
|
23
|
+
setComponentFileValidator,
|
|
24
|
+
getComponentFileValidator,
|
|
25
|
+
dropComponentFileValidator,
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Check to see if a project dir exists in the custom functions dir.
|
|
30
|
+
* @param checkExists - determine if validator returns error if exists or vice versa
|
|
31
|
+
* @param project
|
|
32
|
+
* @param helpers
|
|
33
|
+
* @returns {*}
|
|
34
|
+
*/
|
|
35
|
+
function checkProjectExists(checkExists, project, helpers) {
|
|
36
|
+
try {
|
|
37
|
+
const cfDir = envMangr.get(hdbTerms.CONFIG_PARAMS.COMPONENTSROOT);
|
|
38
|
+
const projectDir = path.join(cfDir, project);
|
|
39
|
+
|
|
40
|
+
if (!fs.existsSync(projectDir)) {
|
|
41
|
+
if (checkExists) {
|
|
42
|
+
return helpers.message(HDB_ERROR_MSGS.NO_PROJECT);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
return project;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
if (checkExists) {
|
|
49
|
+
return project;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
return helpers.message(HDB_ERROR_MSGS.PROJECT_EXISTS);
|
|
53
|
+
} catch (err) {
|
|
54
|
+
hdbLogger.error(err);
|
|
55
|
+
return helpers.message(HDB_ERROR_MSGS.VALIDATION_ERR);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function checkFilePath(path, helpers) {
|
|
60
|
+
if (path.includes('..')) return helpers.message('Invalid file path');
|
|
61
|
+
return path;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Check the custom functions dir to see if a file exists.
|
|
66
|
+
* @param project
|
|
67
|
+
* @param type
|
|
68
|
+
* @param file
|
|
69
|
+
* @param helpers
|
|
70
|
+
* @returns {*}
|
|
71
|
+
*/
|
|
72
|
+
function checkFileExists(project, type, file, helpers) {
|
|
73
|
+
try {
|
|
74
|
+
const cfDir = envMangr.get(hdbTerms.CONFIG_PARAMS.COMPONENTSROOT);
|
|
75
|
+
const filePath = path.join(cfDir, project, type, file + '.js');
|
|
76
|
+
if (!fs.existsSync(filePath)) {
|
|
77
|
+
return helpers.message(HDB_ERROR_MSGS.NO_FILE);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
return file;
|
|
81
|
+
} catch (err) {
|
|
82
|
+
hdbLogger.error(err);
|
|
83
|
+
return helpers.message(HDB_ERROR_MSGS.VALIDATION_ERR);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Used to validate getCustomFunction and dropCustomFunction
|
|
89
|
+
* @param req
|
|
90
|
+
* @returns {*}
|
|
91
|
+
*/
|
|
92
|
+
function getDropCustomFunctionValidator(req) {
|
|
93
|
+
const getFuncSchema = Joi.object({
|
|
94
|
+
project: Joi.string()
|
|
95
|
+
.pattern(PROJECT_FILE_NAME_REGEX)
|
|
96
|
+
.custom(checkProjectExists.bind(null, true))
|
|
97
|
+
.required()
|
|
98
|
+
.messages({ 'string.pattern.base': HDB_ERROR_MSGS.BAD_PROJECT_NAME }),
|
|
99
|
+
type: Joi.string().valid('helpers', 'routes').required(),
|
|
100
|
+
file: Joi.string()
|
|
101
|
+
.pattern(PROJECT_FILE_NAME_REGEX)
|
|
102
|
+
.custom(checkFileExists.bind(null, req.project, req.type))
|
|
103
|
+
.custom(checkFilePath)
|
|
104
|
+
.required()
|
|
105
|
+
.messages({ 'string.pattern.base': HDB_ERROR_MSGS.BAD_FILE_NAME }),
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
return validator.validateBySchema(req, getFuncSchema);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Validate setCustomFunction requests.
|
|
113
|
+
* @param req
|
|
114
|
+
* @returns {*}
|
|
115
|
+
*/
|
|
116
|
+
function setCustomFunctionValidator(req) {
|
|
117
|
+
const setFuncSchema = Joi.object({
|
|
118
|
+
project: Joi.string()
|
|
119
|
+
.pattern(PROJECT_FILE_NAME_REGEX)
|
|
120
|
+
.custom(checkProjectExists.bind(null, true))
|
|
121
|
+
.required()
|
|
122
|
+
.messages({ 'string.pattern.base': HDB_ERROR_MSGS.BAD_PROJECT_NAME }),
|
|
123
|
+
type: Joi.string().valid('helpers', 'routes').required(),
|
|
124
|
+
file: Joi.string().custom(checkFilePath).required(),
|
|
125
|
+
function_content: Joi.string().required(),
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
return validator.validateBySchema(req, setFuncSchema);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Validate set_component_file requests.
|
|
133
|
+
* @param req
|
|
134
|
+
* @returns {*}
|
|
135
|
+
*/
|
|
136
|
+
function setComponentFileValidator(req) {
|
|
137
|
+
const setCompSchema = Joi.object({
|
|
138
|
+
project: Joi.string()
|
|
139
|
+
.pattern(PROJECT_FILE_NAME_REGEX)
|
|
140
|
+
.required()
|
|
141
|
+
.messages({ 'string.pattern.base': HDB_ERROR_MSGS.BAD_PROJECT_NAME }),
|
|
142
|
+
file: Joi.string().custom(checkFilePath).required(),
|
|
143
|
+
payload: Joi.string().allow('').optional(),
|
|
144
|
+
encoding: Joi.string().valid('utf8', 'ASCII', 'binary', 'hex', 'base64', 'utf16le', 'latin1', 'ucs2').optional(),
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
return validator.validateBySchema(req, setCompSchema);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
function dropComponentFileValidator(req) {
|
|
151
|
+
const dropCompSchema = Joi.object({
|
|
152
|
+
project: Joi.string()
|
|
153
|
+
.pattern(PROJECT_FILE_NAME_REGEX)
|
|
154
|
+
.required()
|
|
155
|
+
.messages({ 'string.pattern.base': HDB_ERROR_MSGS.BAD_PROJECT_NAME }),
|
|
156
|
+
file: Joi.string().custom(checkFilePath).optional(),
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
return validator.validateBySchema(req, dropCompSchema);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
function getComponentFileValidator(req) {
|
|
163
|
+
const getCompSchema = Joi.object({
|
|
164
|
+
project: Joi.string().required(),
|
|
165
|
+
file: Joi.string().custom(checkFilePath).required(),
|
|
166
|
+
encoding: Joi.string().valid('utf8', 'ASCII', 'binary', 'hex', 'base64', 'utf16le', 'latin1', 'ucs2').optional(),
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
return validator.validateBySchema(req, getCompSchema);
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
/**
|
|
173
|
+
* Validate addCustomFunctionProject requests.
|
|
174
|
+
* @param req
|
|
175
|
+
* @returns {*}
|
|
176
|
+
*/
|
|
177
|
+
function addComponentValidator(req) {
|
|
178
|
+
const addFuncSchema = Joi.object({
|
|
179
|
+
project: Joi.string()
|
|
180
|
+
.pattern(PROJECT_FILE_NAME_REGEX)
|
|
181
|
+
.custom(checkProjectExists.bind(null, false))
|
|
182
|
+
.required()
|
|
183
|
+
.messages({ 'string.pattern.base': HDB_ERROR_MSGS.BAD_PROJECT_NAME }),
|
|
184
|
+
template: Joi.string().optional(),
|
|
185
|
+
install_command: Joi.string().optional(),
|
|
186
|
+
install_timeout: Joi.number().optional(),
|
|
187
|
+
});
|
|
188
|
+
|
|
189
|
+
return validator.validateBySchema(req, addFuncSchema);
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/**
|
|
193
|
+
* Validate dropCustomFunctionProject requests.
|
|
194
|
+
* @param req
|
|
195
|
+
* @returns {*}
|
|
196
|
+
*/
|
|
197
|
+
function dropCustomFunctionProjectValidator(req) {
|
|
198
|
+
const dropFuncSchema = Joi.object({
|
|
199
|
+
project: Joi.string()
|
|
200
|
+
.pattern(PROJECT_FILE_NAME_REGEX)
|
|
201
|
+
.custom(checkProjectExists.bind(null, true))
|
|
202
|
+
.required()
|
|
203
|
+
.messages({ 'string.pattern.base': HDB_ERROR_MSGS.BAD_PROJECT_NAME }),
|
|
204
|
+
});
|
|
205
|
+
|
|
206
|
+
return validator.validateBySchema(req, dropFuncSchema);
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
/**
|
|
210
|
+
* Validate packageCustomFunctionProject requests.
|
|
211
|
+
* @param req
|
|
212
|
+
* @returns {*}
|
|
213
|
+
*/
|
|
214
|
+
function packageComponentValidator(req) {
|
|
215
|
+
const packageProjSchema = Joi.object({
|
|
216
|
+
project: Joi.string()
|
|
217
|
+
.pattern(PROJECT_FILE_NAME_REGEX)
|
|
218
|
+
.required()
|
|
219
|
+
.messages({ 'string.pattern.base': HDB_ERROR_MSGS.BAD_PROJECT_NAME }),
|
|
220
|
+
skip_node_modules: Joi.boolean(),
|
|
221
|
+
skip_symlinks: Joi.boolean(),
|
|
222
|
+
});
|
|
223
|
+
|
|
224
|
+
return validator.validateBySchema(req, packageProjSchema);
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
/**
|
|
228
|
+
* Validate deployComponent requests.
|
|
229
|
+
* @param req
|
|
230
|
+
* @returns {*}
|
|
231
|
+
*/
|
|
232
|
+
function deployComponentValidator(req) {
|
|
233
|
+
const deployProjSchema = Joi.object({
|
|
234
|
+
project: Joi.string()
|
|
235
|
+
.pattern(PROJECT_FILE_NAME_REGEX)
|
|
236
|
+
.required()
|
|
237
|
+
.messages({ 'string.pattern.base': HDB_ERROR_MSGS.BAD_PROJECT_NAME }),
|
|
238
|
+
package: Joi.string().optional(),
|
|
239
|
+
restart: Joi.alternatives().try(Joi.boolean(), Joi.string().valid('rolling')).optional(),
|
|
240
|
+
install_command: Joi.string().optional(),
|
|
241
|
+
install_timeout: Joi.number().optional(),
|
|
242
|
+
force: Joi.boolean().optional(),
|
|
243
|
+
});
|
|
244
|
+
|
|
245
|
+
return validator.validateBySchema(req, deployProjSchema);
|
|
246
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { join } from 'path';
|
|
2
|
+
import tar from 'tar-fs';
|
|
3
|
+
import { createGzip } from 'node:zlib';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Package a directory into a tarball, base64 encoded
|
|
7
|
+
* @param directory
|
|
8
|
+
*/
|
|
9
|
+
export function packageDirectory(
|
|
10
|
+
directory: string,
|
|
11
|
+
options: { skip_node_modules?: boolean; skip_symlinks?: boolean } = { skip_node_modules: false, skip_symlinks: false }
|
|
12
|
+
): Promise<Buffer> {
|
|
13
|
+
return new Promise((resolve, reject) => {
|
|
14
|
+
// for deployComponent to a remote server, we need to tar the local directory
|
|
15
|
+
const chunks = [];
|
|
16
|
+
// pack the directory
|
|
17
|
+
tar
|
|
18
|
+
.pack(directory, {
|
|
19
|
+
dereference: !options.skip_symlinks,
|
|
20
|
+
ignore: options.skip_node_modules
|
|
21
|
+
? (name: string) => {
|
|
22
|
+
return name.includes('node_modules') || name.includes(join('cache', 'webpack'));
|
|
23
|
+
}
|
|
24
|
+
: undefined,
|
|
25
|
+
map: (header) => {
|
|
26
|
+
if (header.type === 'directory') {
|
|
27
|
+
header.mode = 0o755;
|
|
28
|
+
}
|
|
29
|
+
return header;
|
|
30
|
+
},
|
|
31
|
+
})
|
|
32
|
+
.pipe(createGzip())
|
|
33
|
+
.on('data', (chunk: Buffer) => chunks.push(chunk))
|
|
34
|
+
.on('end', () => {
|
|
35
|
+
resolve(Buffer.concat(chunks));
|
|
36
|
+
})
|
|
37
|
+
.on('error', reject);
|
|
38
|
+
});
|
|
39
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { Status } from '../server/status/index.ts';
|
|
2
|
+
|
|
3
|
+
let restartArrayBuffer: ArrayBuffer;
|
|
4
|
+
let restartNeededArray: Uint8Array;
|
|
5
|
+
|
|
6
|
+
function ensureInitialized() {
|
|
7
|
+
if (!restartArrayBuffer) {
|
|
8
|
+
restartArrayBuffer = Status.primaryStore.getUserSharedBuffer('restart-needed', new ArrayBuffer(1));
|
|
9
|
+
restartNeededArray = new Uint8Array(restartArrayBuffer);
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export function requestRestart() {
|
|
14
|
+
ensureInitialized();
|
|
15
|
+
restartNeededArray[0] = 1;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export function restartNeeded() {
|
|
19
|
+
ensureInitialized();
|
|
20
|
+
return restartNeededArray[0] === 1;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export function resetRestartNeeded() {
|
|
24
|
+
ensureInitialized();
|
|
25
|
+
restartNeededArray[0] = 0;
|
|
26
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export class InvalidBaseURLPathError extends Error {
|
|
2
|
+
constructor(urlPath: string) {
|
|
3
|
+
super(`urlPath must not contain '..'. Received: '${urlPath}'`);
|
|
4
|
+
}
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Resolve the base URL path based on the component name and `urlPath` configuration option.
|
|
9
|
+
*
|
|
10
|
+
* For example, resolving the component config `urlPath` value for component `test-component`:
|
|
11
|
+
* - `undefined`, `''`, `'/'` -> `'/'`
|
|
12
|
+
* - `'static'`, `'/static/'`, `'/static'`, `'static/'` -> `'/static/'`
|
|
13
|
+
* - `'v1/static'`, `'/v1/static/'`, `'/v1/static'`, `'v1/static/'` -> `'/v1/static/'`
|
|
14
|
+
* - `'./static'`, `'./static/'` -> `'/test-component/static/'`
|
|
15
|
+
* - `'.'`, `'./'` -> `'/test-component/'`
|
|
16
|
+
* - `'..'`, `'../'`, `'../static'`, `'./..'` -> Error
|
|
17
|
+
*/
|
|
18
|
+
export function resolveBaseURLPath(name: string, urlPath?: string): string {
|
|
19
|
+
if (urlPath?.includes('..')) {
|
|
20
|
+
throw new InvalidBaseURLPathError(urlPath);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
let baseURLPath = urlPath || '/';
|
|
24
|
+
|
|
25
|
+
if (baseURLPath === '.' || baseURLPath.startsWith('./')) {
|
|
26
|
+
baseURLPath = `/${name}${baseURLPath.slice(1)}`;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
if (!baseURLPath.startsWith('/')) {
|
|
30
|
+
baseURLPath = `/${baseURLPath}`;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
if (!baseURLPath.endsWith('/')) {
|
|
34
|
+
baseURLPath = `${baseURLPath}/`;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
return baseURLPath;
|
|
38
|
+
}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ComponentStatus Class
|
|
3
|
+
*
|
|
4
|
+
* This module contains the ComponentStatus class which represents an individual
|
|
5
|
+
* component's status with methods for status management.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { type ComponentStatusLevel, COMPONENT_STATUS_LEVELS } from './types.ts';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Component status information class
|
|
12
|
+
*/
|
|
13
|
+
export class ComponentStatus {
|
|
14
|
+
/** Last time this status was checked/updated */
|
|
15
|
+
public lastChecked: Date;
|
|
16
|
+
/** Current status level */
|
|
17
|
+
public status: ComponentStatusLevel;
|
|
18
|
+
/** Human-readable status message */
|
|
19
|
+
public message?: string;
|
|
20
|
+
/** Error information if status is 'error' */
|
|
21
|
+
public error?: Error | string;
|
|
22
|
+
|
|
23
|
+
constructor(status: ComponentStatusLevel, message?: string, error?: Error | string) {
|
|
24
|
+
this.lastChecked = new Date();
|
|
25
|
+
this.status = status;
|
|
26
|
+
this.message = message;
|
|
27
|
+
this.error = error;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Update the status level and refresh the timestamp
|
|
32
|
+
*/
|
|
33
|
+
public updateStatus(status: ComponentStatusLevel, message?: string): void {
|
|
34
|
+
this.status = status;
|
|
35
|
+
this.message = message;
|
|
36
|
+
this.lastChecked = new Date();
|
|
37
|
+
// Clear error when status is not ERROR
|
|
38
|
+
if (status !== COMPONENT_STATUS_LEVELS.ERROR) {
|
|
39
|
+
this.error = undefined;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Set status to healthy
|
|
45
|
+
*/
|
|
46
|
+
public markHealthy(message?: string): void {
|
|
47
|
+
this.updateStatus(COMPONENT_STATUS_LEVELS.HEALTHY, message || 'Component is healthy');
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Set status to error
|
|
52
|
+
*/
|
|
53
|
+
public markError(error: Error | string, message?: string): void {
|
|
54
|
+
this.status = COMPONENT_STATUS_LEVELS.ERROR;
|
|
55
|
+
this.error = error;
|
|
56
|
+
this.message = message || (typeof error === 'string' ? error : error.message);
|
|
57
|
+
this.lastChecked = new Date();
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Set status to warning
|
|
62
|
+
*/
|
|
63
|
+
public markWarning(message: string): void {
|
|
64
|
+
this.updateStatus(COMPONENT_STATUS_LEVELS.WARNING, message);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Set status to loading
|
|
69
|
+
*/
|
|
70
|
+
public markLoading(message?: string): void {
|
|
71
|
+
this.updateStatus(COMPONENT_STATUS_LEVELS.LOADING, message || 'Component is loading');
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Check if component is healthy
|
|
76
|
+
*/
|
|
77
|
+
public isHealthy(): boolean {
|
|
78
|
+
return this.status === COMPONENT_STATUS_LEVELS.HEALTHY;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Check if component has an error
|
|
83
|
+
*/
|
|
84
|
+
public hasError(): boolean {
|
|
85
|
+
return this.status === COMPONENT_STATUS_LEVELS.ERROR;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Check if component is loading
|
|
90
|
+
*/
|
|
91
|
+
public isLoading(): boolean {
|
|
92
|
+
return this.status === COMPONENT_STATUS_LEVELS.LOADING;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Check if component has a warning
|
|
97
|
+
*/
|
|
98
|
+
public hasWarning(): boolean {
|
|
99
|
+
return this.status === COMPONENT_STATUS_LEVELS.WARNING;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Get a summary string of the component status
|
|
104
|
+
*/
|
|
105
|
+
public getSummary(): string {
|
|
106
|
+
const statusText = this.status.toUpperCase();
|
|
107
|
+
const messageText = this.message ? `: ${this.message}` : '';
|
|
108
|
+
return `${statusText}${messageText}`;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ComponentStatusRegistry Class
|
|
3
|
+
*
|
|
4
|
+
* This module contains the ComponentStatusRegistry class which provides
|
|
5
|
+
* centralized management of component health status.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { ComponentStatus } from './ComponentStatus.ts';
|
|
9
|
+
import {
|
|
10
|
+
type ComponentStatusLevel,
|
|
11
|
+
COMPONENT_STATUS_LEVELS,
|
|
12
|
+
type AggregatedComponentStatus,
|
|
13
|
+
type ComponentApplicationStatus,
|
|
14
|
+
} from './types.ts';
|
|
15
|
+
import { crossThreadCollector, StatusAggregator } from './crossThread.ts';
|
|
16
|
+
import { ComponentStatusOperationError } from './errors.ts';
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Map of component names to their status information
|
|
20
|
+
*/
|
|
21
|
+
export type ComponentStatusMap = Map<string, ComponentStatus>;
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Component Status Registry Class
|
|
25
|
+
* Provides a centralized registry for managing component health status
|
|
26
|
+
*/
|
|
27
|
+
export class ComponentStatusRegistry {
|
|
28
|
+
private statusMap: ComponentStatusMap = new Map();
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Reset the component status registry, clearing all existing status data
|
|
32
|
+
* This should be called when the component system starts up
|
|
33
|
+
*/
|
|
34
|
+
public reset(): void {
|
|
35
|
+
this.statusMap = new Map();
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Register or update component health status
|
|
40
|
+
* This function allows components to report their own health status
|
|
41
|
+
*/
|
|
42
|
+
public setStatus(
|
|
43
|
+
componentName: string,
|
|
44
|
+
status: ComponentStatusLevel,
|
|
45
|
+
message?: string,
|
|
46
|
+
error?: Error | string
|
|
47
|
+
): void {
|
|
48
|
+
if (!componentName || typeof componentName !== 'string') {
|
|
49
|
+
throw new ComponentStatusOperationError(
|
|
50
|
+
String(componentName),
|
|
51
|
+
'setStatus',
|
|
52
|
+
'Component name must be a non-empty string'
|
|
53
|
+
);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
if (!Object.values(COMPONENT_STATUS_LEVELS).includes(status)) {
|
|
57
|
+
throw new ComponentStatusOperationError(
|
|
58
|
+
componentName,
|
|
59
|
+
'setStatus',
|
|
60
|
+
`Invalid status level: ${status}. Must be one of: ${Object.values(COMPONENT_STATUS_LEVELS).join(', ')}`
|
|
61
|
+
);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
this.statusMap.set(componentName, new ComponentStatus(status, message, error));
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Get the current status of a component
|
|
69
|
+
*/
|
|
70
|
+
public getStatus(componentName: string): ComponentStatus | undefined {
|
|
71
|
+
return this.statusMap.get(componentName);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Get all component statuses
|
|
76
|
+
*/
|
|
77
|
+
public getAllStatuses(): ComponentStatusMap {
|
|
78
|
+
return this.statusMap;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Report component as healthy
|
|
83
|
+
*/
|
|
84
|
+
public reportHealthy(componentName: string, message?: string): void {
|
|
85
|
+
this.setStatus(componentName, COMPONENT_STATUS_LEVELS.HEALTHY, message);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Report component error
|
|
90
|
+
*/
|
|
91
|
+
public reportError(componentName: string, error: Error | string, message?: string): void {
|
|
92
|
+
this.setStatus(componentName, COMPONENT_STATUS_LEVELS.ERROR, message, error);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Report component warning
|
|
97
|
+
*/
|
|
98
|
+
public reportWarning(componentName: string, message: string): void {
|
|
99
|
+
this.setStatus(componentName, COMPONENT_STATUS_LEVELS.WARNING, message);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Component Lifecycle Management
|
|
104
|
+
*/
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Initialize component as loading - call this when component loading begins
|
|
108
|
+
*/
|
|
109
|
+
public initializeLoading(componentName: string, message?: string): void {
|
|
110
|
+
this.setStatus(componentName, COMPONENT_STATUS_LEVELS.LOADING, message || 'Component is loading');
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Mark component as successfully loaded
|
|
115
|
+
*/
|
|
116
|
+
public markLoaded(componentName: string, message?: string): void {
|
|
117
|
+
this.setStatus(componentName, COMPONENT_STATUS_LEVELS.HEALTHY, message || 'Component loaded successfully');
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Mark component as failed to load
|
|
122
|
+
*/
|
|
123
|
+
public markFailed(componentName: string, error: Error | string, message?: string): void {
|
|
124
|
+
this.setStatus(componentName, COMPONENT_STATUS_LEVELS.ERROR, message, error);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* Get all components with a specific status level
|
|
129
|
+
*/
|
|
130
|
+
public getComponentsByStatus(statusLevel: ComponentStatusLevel): Array<{ name: string; status: ComponentStatus }> {
|
|
131
|
+
const result: Array<{ name: string; status: ComponentStatus }> = [];
|
|
132
|
+
for (const [name, status] of this.statusMap) {
|
|
133
|
+
if (status.status === statusLevel) {
|
|
134
|
+
result.push({ name, status });
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
return result;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* Get a summary of all component statuses
|
|
142
|
+
*/
|
|
143
|
+
public getStatusSummary(): Record<ComponentStatusLevel, number> {
|
|
144
|
+
const summary: Record<ComponentStatusLevel, number> = {
|
|
145
|
+
[COMPONENT_STATUS_LEVELS.HEALTHY]: 0,
|
|
146
|
+
[COMPONENT_STATUS_LEVELS.ERROR]: 0,
|
|
147
|
+
[COMPONENT_STATUS_LEVELS.WARNING]: 0,
|
|
148
|
+
[COMPONENT_STATUS_LEVELS.LOADING]: 0,
|
|
149
|
+
[COMPONENT_STATUS_LEVELS.UNKNOWN]: 0,
|
|
150
|
+
};
|
|
151
|
+
|
|
152
|
+
for (const status of this.statusMap.values()) {
|
|
153
|
+
summary[status.status]++;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
return summary;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* Static method to get aggregated component statuses from all threads
|
|
161
|
+
* Returns a Map with one entry per component showing overall status and thread distribution
|
|
162
|
+
*/
|
|
163
|
+
public static async getAggregatedFromAllThreads(
|
|
164
|
+
registry: ComponentStatusRegistry
|
|
165
|
+
): Promise<Map<string, AggregatedComponentStatus>> {
|
|
166
|
+
const allStatuses = await crossThreadCollector.collect(registry);
|
|
167
|
+
return StatusAggregator.aggregate(allStatuses);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/**
|
|
171
|
+
* Get aggregated status for a specific component and all its sub-components
|
|
172
|
+
* This method handles both exact matches and sub-component aggregation
|
|
173
|
+
*
|
|
174
|
+
* @param componentName - The component name to look up (e.g., "application-template", "http")
|
|
175
|
+
* @param consolidatedStatuses - Pre-fetched consolidated statuses from all threads (optional, will fetch if not provided)
|
|
176
|
+
* @returns Aggregated status information for the component
|
|
177
|
+
*/
|
|
178
|
+
public async getAggregatedStatusFor(
|
|
179
|
+
componentName: string,
|
|
180
|
+
consolidatedStatuses?: Map<string, AggregatedComponentStatus>
|
|
181
|
+
): Promise<ComponentApplicationStatus> {
|
|
182
|
+
// Get consolidated statuses from all threads if not provided
|
|
183
|
+
if (!consolidatedStatuses) {
|
|
184
|
+
consolidatedStatuses = await ComponentStatusRegistry.getAggregatedFromAllThreads(this);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
// Collect all statuses related to this component
|
|
188
|
+
const allStatuses = [];
|
|
189
|
+
const componentPrefix = componentName + '.';
|
|
190
|
+
|
|
191
|
+
// Add exact match if exists
|
|
192
|
+
const exactMatch = consolidatedStatuses.get(componentName);
|
|
193
|
+
if (exactMatch) {
|
|
194
|
+
allStatuses.push({ key: componentName, ...exactMatch });
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
// Add sub-component statuses
|
|
198
|
+
for (const [statusKey, statusValue] of consolidatedStatuses) {
|
|
199
|
+
if (statusKey.startsWith(componentPrefix)) {
|
|
200
|
+
allStatuses.push({ key: statusKey, ...statusValue });
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
if (allStatuses.length === 0) {
|
|
205
|
+
// No status found at all
|
|
206
|
+
return {
|
|
207
|
+
status: COMPONENT_STATUS_LEVELS.UNKNOWN,
|
|
208
|
+
message: 'The component has not been loaded yet (may need a restart)',
|
|
209
|
+
lastChecked: { workers: {} },
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
// Aggregate all statuses
|
|
214
|
+
const hasErrors = allStatuses.some((s) => s.status === COMPONENT_STATUS_LEVELS.ERROR);
|
|
215
|
+
const hasLoading = allStatuses.some((s) => s.status === COMPONENT_STATUS_LEVELS.LOADING);
|
|
216
|
+
|
|
217
|
+
const overallStatus = hasErrors
|
|
218
|
+
? COMPONENT_STATUS_LEVELS.ERROR
|
|
219
|
+
: hasLoading
|
|
220
|
+
? COMPONENT_STATUS_LEVELS.LOADING
|
|
221
|
+
: COMPONENT_STATUS_LEVELS.HEALTHY;
|
|
222
|
+
|
|
223
|
+
// Show details if anything is not healthy
|
|
224
|
+
let overallMessage = 'All components loaded successfully';
|
|
225
|
+
const details: Record<string, { status: ComponentStatusLevel; message?: string }> = {};
|
|
226
|
+
|
|
227
|
+
if (hasErrors || hasLoading) {
|
|
228
|
+
const problemStatuses = allStatuses.filter(
|
|
229
|
+
(s) => s.status === COMPONENT_STATUS_LEVELS.ERROR || s.status === COMPONENT_STATUS_LEVELS.LOADING
|
|
230
|
+
);
|
|
231
|
+
overallMessage = problemStatuses.map((s) => `${s.key}: ${s.latestMessage || s.status}`).join('; ');
|
|
232
|
+
|
|
233
|
+
// Include details for debugging
|
|
234
|
+
for (const status of allStatuses) {
|
|
235
|
+
if (status.status !== COMPONENT_STATUS_LEVELS.HEALTHY) {
|
|
236
|
+
details[status.key] = {
|
|
237
|
+
status: status.status,
|
|
238
|
+
message: status.latestMessage,
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
return {
|
|
245
|
+
status: overallStatus,
|
|
246
|
+
message: overallMessage,
|
|
247
|
+
...(Object.keys(details).length > 0 && { details }),
|
|
248
|
+
lastChecked: allStatuses[0]?.lastChecked || { workers: {} },
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
}
|