@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,658 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const path = require('node:path');
|
|
4
|
+
const { isMainThread } = require('node:worker_threads');
|
|
5
|
+
const fs = require('fs-extra');
|
|
6
|
+
const fg = require('fast-glob');
|
|
7
|
+
const normalize = require('normalize-path');
|
|
8
|
+
const validator = require('./operationsValidation.js');
|
|
9
|
+
const log = require('../utility/logging/harper_logger.js');
|
|
10
|
+
const hdbTerms = require('../utility/hdbTerms.ts');
|
|
11
|
+
const env = require('../utility/environment/environmentManager.js');
|
|
12
|
+
const configUtils = require('../config/configUtils.js');
|
|
13
|
+
const hdbUtils = require('../utility/common_utils.js');
|
|
14
|
+
const { handleHDBError, hdbErrors } = require('../utility/errors/hdbError.js');
|
|
15
|
+
const { HDB_ERROR_MSGS, HTTP_STATUS_CODES } = hdbErrors;
|
|
16
|
+
const manageThreads = require('../server/threads/manageThreads.js');
|
|
17
|
+
const { packageDirectory } = require('../components/packageComponent.ts');
|
|
18
|
+
const { Resources } = require('../resources/Resources.ts');
|
|
19
|
+
const { Application, prepareApplication } = require('./Application.ts');
|
|
20
|
+
const { server } = require('../server/Server.ts');
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Read the settings.js file and return the
|
|
24
|
+
*
|
|
25
|
+
* @return Object.<String>
|
|
26
|
+
*/
|
|
27
|
+
function customFunctionsStatus() {
|
|
28
|
+
log.trace(`getting custom api status`);
|
|
29
|
+
let response = {};
|
|
30
|
+
|
|
31
|
+
try {
|
|
32
|
+
response = {
|
|
33
|
+
port: env.get(hdbTerms.CONFIG_PARAMS.HTTP_PORT),
|
|
34
|
+
directory: env.get(hdbTerms.CONFIG_PARAMS.COMPONENTSROOT),
|
|
35
|
+
is_enabled: true,
|
|
36
|
+
};
|
|
37
|
+
} catch (err) {
|
|
38
|
+
throw handleHDBError(
|
|
39
|
+
new Error(),
|
|
40
|
+
HDB_ERROR_MSGS.FUNCTION_STATUS,
|
|
41
|
+
HTTP_STATUS_CODES.INTERNAL_SERVER_ERROR,
|
|
42
|
+
log.ERR,
|
|
43
|
+
err
|
|
44
|
+
);
|
|
45
|
+
}
|
|
46
|
+
return response;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Read the user-defined custom_functions/routes directory and return the file names
|
|
51
|
+
*
|
|
52
|
+
* @return Array.<String>
|
|
53
|
+
*/
|
|
54
|
+
function getCustomFunctions() {
|
|
55
|
+
log.trace(`getting custom api endpoints`);
|
|
56
|
+
let response = {};
|
|
57
|
+
const dir = env.get(hdbTerms.CONFIG_PARAMS.COMPONENTSROOT);
|
|
58
|
+
|
|
59
|
+
try {
|
|
60
|
+
const projectFolders = fg.sync(normalize(`${dir}/*`), { onlyDirectories: true });
|
|
61
|
+
|
|
62
|
+
projectFolders.forEach((projectFolder) => {
|
|
63
|
+
const folderName = projectFolder.split('/').pop();
|
|
64
|
+
response[folderName] = {
|
|
65
|
+
routes: fg
|
|
66
|
+
.sync(normalize(`${projectFolder}/routes/*.js`))
|
|
67
|
+
.map((filepath) => filepath.split('/').pop().split('.js')[0]),
|
|
68
|
+
helpers: fg
|
|
69
|
+
.sync(normalize(`${projectFolder}/helpers/*.js`))
|
|
70
|
+
.map((filepath) => filepath.split('/').pop().split('.js')[0]),
|
|
71
|
+
};
|
|
72
|
+
});
|
|
73
|
+
} catch (err) {
|
|
74
|
+
throw handleHDBError(
|
|
75
|
+
new Error(),
|
|
76
|
+
HDB_ERROR_MSGS.GET_FUNCTIONS,
|
|
77
|
+
HTTP_STATUS_CODES.INTERNAL_SERVER_ERROR,
|
|
78
|
+
log.ERR,
|
|
79
|
+
err
|
|
80
|
+
);
|
|
81
|
+
}
|
|
82
|
+
return response;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Read the specified functionName file in the custom_functions/routes directory and return the file content
|
|
87
|
+
*
|
|
88
|
+
* @param {NodeObject} req
|
|
89
|
+
* @returns {string}
|
|
90
|
+
*/
|
|
91
|
+
function getCustomFunction(req) {
|
|
92
|
+
if (req.project) {
|
|
93
|
+
req.project = path.parse(req.project).name;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
if (req.file) {
|
|
97
|
+
req.file = path.parse(req.file).name;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
const validation = validator.getDropCustomFunctionValidator(req);
|
|
101
|
+
if (validation) {
|
|
102
|
+
throw handleHDBError(validation, validation.message, HTTP_STATUS_CODES.BAD_REQUEST);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
log.trace(`getting custom api endpoint file content`);
|
|
106
|
+
const cfDir = env.get(hdbTerms.CONFIG_PARAMS.COMPONENTSROOT);
|
|
107
|
+
const { project, type, file } = req;
|
|
108
|
+
const fileLocation = path.join(cfDir, project, type, file + '.js');
|
|
109
|
+
|
|
110
|
+
try {
|
|
111
|
+
return fs.readFileSync(fileLocation, { encoding: 'utf8' });
|
|
112
|
+
} catch (err) {
|
|
113
|
+
throw handleHDBError(
|
|
114
|
+
new Error(),
|
|
115
|
+
HDB_ERROR_MSGS.GET_FUNCTION,
|
|
116
|
+
HTTP_STATUS_CODES.INTERNAL_SERVER_ERROR,
|
|
117
|
+
log.ERR,
|
|
118
|
+
err
|
|
119
|
+
);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* Write the supplied function_content to the provided functionName file in the custom_functions/routes directory
|
|
125
|
+
*
|
|
126
|
+
* @param {NodeObject} req
|
|
127
|
+
* @returns {{message:string}}
|
|
128
|
+
*/
|
|
129
|
+
async function setCustomFunction(req) {
|
|
130
|
+
if (req.project) {
|
|
131
|
+
req.project = path.parse(req.project).name;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
if (req.file) {
|
|
135
|
+
req.file = path.parse(req.file).name;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
const validation = validator.setCustomFunctionValidator(req);
|
|
139
|
+
if (validation) {
|
|
140
|
+
throw handleHDBError(validation, validation.message, HTTP_STATUS_CODES.BAD_REQUEST);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
log.trace(`setting custom function file content`);
|
|
144
|
+
const cfDir = env.get(hdbTerms.CONFIG_PARAMS.COMPONENTSROOT);
|
|
145
|
+
const { project, type, file, function_content } = req;
|
|
146
|
+
|
|
147
|
+
try {
|
|
148
|
+
fs.outputFileSync(path.join(cfDir, project, type, file + '.js'), function_content);
|
|
149
|
+
let response = await server.replication.replicateOperation(req);
|
|
150
|
+
response.message = `Successfully updated custom function: ${file}.js`;
|
|
151
|
+
return response;
|
|
152
|
+
} catch (err) {
|
|
153
|
+
throw handleHDBError(
|
|
154
|
+
new Error(),
|
|
155
|
+
HDB_ERROR_MSGS.SET_FUNCTION,
|
|
156
|
+
HTTP_STATUS_CODES.INTERNAL_SERVER_ERROR,
|
|
157
|
+
log.ERR,
|
|
158
|
+
err
|
|
159
|
+
);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* Delete the provided functionName file from the custom_functions/routes directory
|
|
165
|
+
*
|
|
166
|
+
* @param {NodeObject} req
|
|
167
|
+
* @returns {{message:string}}
|
|
168
|
+
*/
|
|
169
|
+
async function dropCustomFunction(req) {
|
|
170
|
+
if (req.project) {
|
|
171
|
+
req.project = path.parse(req.project).name;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
if (req.file) {
|
|
175
|
+
req.file = path.parse(req.file).name;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
const validation = validator.getDropCustomFunctionValidator(req);
|
|
179
|
+
if (validation) {
|
|
180
|
+
throw handleHDBError(validation, validation.message, HTTP_STATUS_CODES.BAD_REQUEST);
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
log.trace(`dropping custom function file`);
|
|
184
|
+
const cfDir = env.get(hdbTerms.CONFIG_PARAMS.COMPONENTSROOT);
|
|
185
|
+
const { project, type, file } = req;
|
|
186
|
+
|
|
187
|
+
try {
|
|
188
|
+
fs.unlinkSync(path.join(cfDir, project, type, file + '.js'));
|
|
189
|
+
let response = await server.replication.replicateOperation(req);
|
|
190
|
+
response.message = `Successfully deleted custom function: ${file}.js`;
|
|
191
|
+
return response;
|
|
192
|
+
} catch (err) {
|
|
193
|
+
throw handleHDBError(
|
|
194
|
+
new Error(),
|
|
195
|
+
HDB_ERROR_MSGS.DROP_FUNCTION,
|
|
196
|
+
HTTP_STATUS_CODES.INTERNAL_SERVER_ERROR,
|
|
197
|
+
log.ERR,
|
|
198
|
+
err
|
|
199
|
+
);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
/**
|
|
204
|
+
* Create a new project folder in the components folder and copy the template into it
|
|
205
|
+
* @param {NodeObject} req
|
|
206
|
+
* @returns {{message:string}}
|
|
207
|
+
*/
|
|
208
|
+
async function addComponent(req) {
|
|
209
|
+
if (req.project) {
|
|
210
|
+
req.project = path.parse(req.project).name;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
const validation = validator.addComponentValidator(req);
|
|
214
|
+
if (validation) {
|
|
215
|
+
throw handleHDBError(validation, validation.message, HTTP_STATUS_CODES.BAD_REQUEST);
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
log.trace(`adding component`);
|
|
219
|
+
const cfDir = env.get(hdbTerms.CONFIG_PARAMS.COMPONENTSROOT);
|
|
220
|
+
const { project, install_command, install_timeout } = req;
|
|
221
|
+
|
|
222
|
+
const template = req.template || 'https://github.com/harperdb/application-template';
|
|
223
|
+
|
|
224
|
+
try {
|
|
225
|
+
const projectDir = path.join(cfDir, project);
|
|
226
|
+
fs.mkdirSync(projectDir, { recursive: true });
|
|
227
|
+
const application = new Application({
|
|
228
|
+
name: project,
|
|
229
|
+
packageIdentifier: template,
|
|
230
|
+
install: {
|
|
231
|
+
command: install_command,
|
|
232
|
+
timeout: install_timeout,
|
|
233
|
+
},
|
|
234
|
+
});
|
|
235
|
+
await prepareApplication(application);
|
|
236
|
+
let response = await server.replication.replicateOperation(req);
|
|
237
|
+
response.message = `Successfully added project: ${project}`;
|
|
238
|
+
return response;
|
|
239
|
+
} catch (err) {
|
|
240
|
+
throw handleHDBError(
|
|
241
|
+
new Error(),
|
|
242
|
+
HDB_ERROR_MSGS.ADD_FUNCTION,
|
|
243
|
+
HTTP_STATUS_CODES.INTERNAL_SERVER_ERROR,
|
|
244
|
+
log.ERR,
|
|
245
|
+
err
|
|
246
|
+
);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
/**
|
|
251
|
+
* Remove a project folder from the custom_functions folder
|
|
252
|
+
*
|
|
253
|
+
* @param {NodeObject} req
|
|
254
|
+
* @returns {string}
|
|
255
|
+
*/
|
|
256
|
+
async function dropCustomFunctionProject(req) {
|
|
257
|
+
if (req.project) {
|
|
258
|
+
req.project = path.parse(req.project).name;
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
const validation = validator.dropCustomFunctionProjectValidator(req);
|
|
262
|
+
if (validation) {
|
|
263
|
+
throw handleHDBError(validation, validation.message, HTTP_STATUS_CODES.BAD_REQUEST);
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
log.trace(`dropping custom function project`);
|
|
267
|
+
const cfDir = env.get(hdbTerms.CONFIG_PARAMS.COMPONENTSROOT);
|
|
268
|
+
const { project } = req;
|
|
269
|
+
|
|
270
|
+
let apps = env.get(hdbTerms.CONFIG_PARAMS.APPS);
|
|
271
|
+
if (!hdbUtils.isEmptyOrZeroLength(apps)) {
|
|
272
|
+
let appFound = false;
|
|
273
|
+
for (const [i, app] of apps.entries()) {
|
|
274
|
+
if (app.name === project) {
|
|
275
|
+
apps.splice(i, 1);
|
|
276
|
+
appFound = true;
|
|
277
|
+
break;
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
if (appFound) {
|
|
282
|
+
configUtils.updateConfigValue(hdbTerms.CONFIG_PARAMS.APPS, apps);
|
|
283
|
+
|
|
284
|
+
return `Successfully deleted project: ${project}`;
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
try {
|
|
289
|
+
const projectDir = path.join(cfDir, project);
|
|
290
|
+
fs.rmSync(projectDir, { recursive: true });
|
|
291
|
+
let response = await server.replication.replicateOperation(req);
|
|
292
|
+
response.message = `Successfully deleted project: ${project}`;
|
|
293
|
+
return response;
|
|
294
|
+
} catch (err) {
|
|
295
|
+
throw handleHDBError(
|
|
296
|
+
new Error(),
|
|
297
|
+
HDB_ERROR_MSGS.DROP_FUNCTION_PROJECT,
|
|
298
|
+
HTTP_STATUS_CODES.INTERNAL_SERVER_ERROR,
|
|
299
|
+
log.ERR,
|
|
300
|
+
err
|
|
301
|
+
);
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
/**
|
|
306
|
+
* Will package a component into a temp tar file then output that file as a base64 string.
|
|
307
|
+
* Req can accept a skip_node_modules boolean which will skip the node mods when creating temp tar file.
|
|
308
|
+
* @param req
|
|
309
|
+
* @returns {Promise<{payload: *, project}>}
|
|
310
|
+
*/
|
|
311
|
+
async function packageComponent(req) {
|
|
312
|
+
if (req.project) {
|
|
313
|
+
req.project = path.parse(req.project).name;
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
const validation = validator.packageComponentValidator(req);
|
|
317
|
+
if (validation) {
|
|
318
|
+
throw handleHDBError(validation, validation.message, HTTP_STATUS_CODES.BAD_REQUEST);
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
const cfDir = env.get(hdbTerms.CONFIG_PARAMS.COMPONENTSROOT);
|
|
322
|
+
const { project } = req;
|
|
323
|
+
log.trace(`packaging component`, project);
|
|
324
|
+
|
|
325
|
+
let pathToProject;
|
|
326
|
+
try {
|
|
327
|
+
pathToProject = await fs.realpath(path.join(cfDir, project));
|
|
328
|
+
} catch (err) {
|
|
329
|
+
if (err.code !== hdbTerms.NODE_ERROR_CODES.ENOENT) throw err;
|
|
330
|
+
try {
|
|
331
|
+
pathToProject = await fs.realpath(path.join(env.get(hdbTerms.CONFIG_PARAMS.ROOTPATH), 'node_modules', project));
|
|
332
|
+
} catch (err) {
|
|
333
|
+
if (err.code === hdbTerms.NODE_ERROR_CODES.ENOENT) throw new Error(`Unable to locate project '${project}'`);
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
const payload = (await packageDirectory(pathToProject, req)).toString('base64');
|
|
338
|
+
|
|
339
|
+
// return the package payload as base64-encoded string
|
|
340
|
+
return { project, payload };
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
/**
|
|
344
|
+
* Can deploy a component in multiple ways. If a 'package' is provided all it will do is write that package to
|
|
345
|
+
* harperdb-config, when HDB is restarted the package will be installed in hdb/nodeModules. If a base64 encoded string is passed it
|
|
346
|
+
* will write string to a temp tar file and extract that file into the deployed project in hdb/components.
|
|
347
|
+
* @param req
|
|
348
|
+
* @returns {Promise<string>}
|
|
349
|
+
*/
|
|
350
|
+
async function deployComponent(req) {
|
|
351
|
+
if (req.project) {
|
|
352
|
+
req.project = path.parse(req.project).name;
|
|
353
|
+
} else if (req.package) {
|
|
354
|
+
req.project = getProjectNameFromPackage(req.package);
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
const validation = validator.deployComponentValidator(req);
|
|
358
|
+
if (validation) {
|
|
359
|
+
throw handleHDBError(validation, validation.message, HTTP_STATUS_CODES.BAD_REQUEST);
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
// Write to root config if the request contains a package identifier
|
|
363
|
+
// TODO: how can we keep record of the `payload`? Its often too large to stuff into a config file; especially the root config. Maybe we can write it to a file and reference that way?
|
|
364
|
+
if (req.package) {
|
|
365
|
+
// Check if trying to overwrite a core component (requires force)
|
|
366
|
+
// Lazy-load to avoid circular dependency with componentLoader
|
|
367
|
+
const { TRUSTED_RESOURCE_PLUGINS } = require('./componentLoader.ts');
|
|
368
|
+
if (TRUSTED_RESOURCE_PLUGINS[req.project] && !req.force) {
|
|
369
|
+
throw handleHDBError(
|
|
370
|
+
new Error(),
|
|
371
|
+
`Cannot deploy component with name '${req.project}': this is a protected core component name. Use force: true to overwrite.`,
|
|
372
|
+
HTTP_STATUS_CODES.CONFLICT
|
|
373
|
+
);
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
const applicationConfig = { package: req.package };
|
|
377
|
+
// Avoid writing an empty `install:` block
|
|
378
|
+
if (req.install_command || req.install_timeout) {
|
|
379
|
+
applicationConfig.install = {
|
|
380
|
+
command: req.install_command,
|
|
381
|
+
timeout: req.install_timeout,
|
|
382
|
+
};
|
|
383
|
+
}
|
|
384
|
+
await configUtils.addConfig(req.project, applicationConfig);
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
const application = new Application({
|
|
388
|
+
name: req.project,
|
|
389
|
+
payload: req.payload,
|
|
390
|
+
packageIdentifier: req.package,
|
|
391
|
+
install: {
|
|
392
|
+
command: req.install_command,
|
|
393
|
+
timeout: req.install_timeout,
|
|
394
|
+
},
|
|
395
|
+
});
|
|
396
|
+
|
|
397
|
+
await prepareApplication(application);
|
|
398
|
+
|
|
399
|
+
// the main thread should never actually load component, just do a deploy
|
|
400
|
+
if (isMainThread) return;
|
|
401
|
+
|
|
402
|
+
// now we attempt to actually load the component in case there is
|
|
403
|
+
// an error we can immediately detect and report
|
|
404
|
+
const pseudoResources = new Resources();
|
|
405
|
+
pseudoResources.isWorker = true;
|
|
406
|
+
|
|
407
|
+
if (!process.env.HARPER_SAFE_MODE) {
|
|
408
|
+
const componentLoader = require('./componentLoader.ts');
|
|
409
|
+
let lastError;
|
|
410
|
+
componentLoader.setErrorReporter((error) => (lastError = error));
|
|
411
|
+
await componentLoader.loadComponent(
|
|
412
|
+
application.dirPath,
|
|
413
|
+
pseudoResources,
|
|
414
|
+
undefined,
|
|
415
|
+
false,
|
|
416
|
+
undefined,
|
|
417
|
+
false,
|
|
418
|
+
req.project
|
|
419
|
+
);
|
|
420
|
+
|
|
421
|
+
if (lastError) throw lastError;
|
|
422
|
+
}
|
|
423
|
+
const rollingRestart = req.restart === 'rolling';
|
|
424
|
+
// if doing a rolling restart set restart to false so that other nodes don't also restart.
|
|
425
|
+
req.restart = rollingRestart ? false : req.restart;
|
|
426
|
+
let response = await server.replication.replicateOperation(req);
|
|
427
|
+
if (req.restart === true) {
|
|
428
|
+
manageThreads.restartWorkers('http');
|
|
429
|
+
response.message = `Successfully deployed: ${application.name}, restarting Harper`;
|
|
430
|
+
} else if (rollingRestart) {
|
|
431
|
+
const serverUtilities = require('../server/serverHelpers/serverUtilities.ts');
|
|
432
|
+
const jobResponse = await serverUtilities.executeJob({
|
|
433
|
+
operation: 'restart_service',
|
|
434
|
+
service: 'http',
|
|
435
|
+
replicated: true,
|
|
436
|
+
});
|
|
437
|
+
|
|
438
|
+
response.restartJobId = jobResponse.job_id;
|
|
439
|
+
response.message = `Successfully deployed: ${application.name}, restarting Harper`;
|
|
440
|
+
} else response.message = `Successfully deployed: ${application.name}`;
|
|
441
|
+
|
|
442
|
+
return response;
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
/**
|
|
446
|
+
* Extracts a project name from the specified package name or URL
|
|
447
|
+
* @param {string} pkg - Package name or URL
|
|
448
|
+
* @returns {string} The project name
|
|
449
|
+
*/
|
|
450
|
+
function getProjectNameFromPackage(pkg) {
|
|
451
|
+
if (pkg.startsWith('git+ssh://')) {
|
|
452
|
+
return path.basename(pkg.split('#')[0].replace(/\.git$/, ''));
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
if (pkg.startsWith('http://') || pkg.startsWith('https://')) {
|
|
456
|
+
return path.basename(new URL(pkg.replace(/\.git$/, '')).pathname);
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
if (pkg.startsWith('file://')) {
|
|
460
|
+
try {
|
|
461
|
+
const { name } = JSON.parse(fs.readFileSync(path.join(pkg, 'package.json'), 'utf8'));
|
|
462
|
+
return path.basename(name);
|
|
463
|
+
} catch {
|
|
464
|
+
//
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
return path.basename(pkg);
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
/**
|
|
472
|
+
* Gets a JSON directory tree of the components dir and all nested files/folders
|
|
473
|
+
* @returns {Promise<*>}
|
|
474
|
+
*/
|
|
475
|
+
async function getComponents() {
|
|
476
|
+
// Recursive function that will traverse the components dir and build json
|
|
477
|
+
// directory tree as it goes.
|
|
478
|
+
const rootConfig = configUtils.getConfiguration();
|
|
479
|
+
const walkDir = async (dir, result) => {
|
|
480
|
+
try {
|
|
481
|
+
const list = await fs.readdir(dir, { withFileTypes: true });
|
|
482
|
+
for (let item of list) {
|
|
483
|
+
const itemName = item.name;
|
|
484
|
+
if (itemName === 'node_modules') continue;
|
|
485
|
+
const itemPath = path.join(dir, itemName);
|
|
486
|
+
if (item.isDirectory() || item.isSymbolicLink()) {
|
|
487
|
+
let res = {
|
|
488
|
+
name: itemName,
|
|
489
|
+
entries: [],
|
|
490
|
+
};
|
|
491
|
+
result.entries.push(res);
|
|
492
|
+
await walkDir(itemPath, res);
|
|
493
|
+
} else {
|
|
494
|
+
const stats = await fs.stat(itemPath);
|
|
495
|
+
const res = {
|
|
496
|
+
name: path.basename(itemName),
|
|
497
|
+
mtime: stats.mtime,
|
|
498
|
+
size: stats.size,
|
|
499
|
+
};
|
|
500
|
+
result.entries.push(res);
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
return result;
|
|
504
|
+
} catch (error) {
|
|
505
|
+
log.warn('Error loading package', error);
|
|
506
|
+
return { error: error.toString(), entries: [] };
|
|
507
|
+
}
|
|
508
|
+
};
|
|
509
|
+
|
|
510
|
+
const results = await walkDir(env.get(hdbTerms.CONFIG_PARAMS.COMPONENTSROOT), {
|
|
511
|
+
name: env.get(hdbTerms.CONFIG_PARAMS.COMPONENTSROOT).split(path.sep).slice(-1).pop(),
|
|
512
|
+
entries: [],
|
|
513
|
+
});
|
|
514
|
+
for (let entry of results.entries) {
|
|
515
|
+
const sourcePackage = rootConfig[entry.name]?.package;
|
|
516
|
+
if (sourcePackage) entry.package = sourcePackage;
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
const { internal: statusInternal } = require('./status/index.ts');
|
|
520
|
+
let consolidatedStatuses;
|
|
521
|
+
|
|
522
|
+
try {
|
|
523
|
+
consolidatedStatuses = await statusInternal.ComponentStatusRegistry.getAggregatedFromAllThreads(
|
|
524
|
+
statusInternal.componentStatusRegistry
|
|
525
|
+
);
|
|
526
|
+
} catch (error) {
|
|
527
|
+
// If we can't get status from threads, continue with unknown statuses
|
|
528
|
+
log.debug(`Failed to get component status from threads: ${error.message}`);
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
for (const component of results.entries) {
|
|
532
|
+
try {
|
|
533
|
+
component.status = await statusInternal.componentStatusRegistry.getAggregatedStatusFor(
|
|
534
|
+
component.name,
|
|
535
|
+
consolidatedStatuses
|
|
536
|
+
);
|
|
537
|
+
} catch (error) {
|
|
538
|
+
log.debug(`Failed to get aggregated status for component ${component.name}: ${error.message}`);
|
|
539
|
+
component.status = {
|
|
540
|
+
status: 'unknown',
|
|
541
|
+
message: 'Failed to retrieve component status',
|
|
542
|
+
lastChecked: { workers: {} },
|
|
543
|
+
};
|
|
544
|
+
}
|
|
545
|
+
}
|
|
546
|
+
return results;
|
|
547
|
+
}
|
|
548
|
+
|
|
549
|
+
/**
|
|
550
|
+
* Gets the contents of a component file
|
|
551
|
+
* @param req
|
|
552
|
+
* @returns {Promise<*>}
|
|
553
|
+
*/
|
|
554
|
+
async function getComponentFile(req) {
|
|
555
|
+
const validation = validator.getComponentFileValidator(req);
|
|
556
|
+
if (validation) {
|
|
557
|
+
throw handleHDBError(validation, validation.message, HTTP_STATUS_CODES.BAD_REQUEST);
|
|
558
|
+
}
|
|
559
|
+
|
|
560
|
+
const compRoot = env.get(hdbTerms.CONFIG_PARAMS.COMPONENTSROOT);
|
|
561
|
+
const options = req.encoding ? { encoding: req.encoding } : { encoding: 'utf8' };
|
|
562
|
+
|
|
563
|
+
try {
|
|
564
|
+
const stats = await fs.stat(path.join(compRoot, req.project, req.file));
|
|
565
|
+
return {
|
|
566
|
+
message: await fs.readFile(path.join(compRoot, req.project, req.file), options),
|
|
567
|
+
size: stats.size,
|
|
568
|
+
birthtime: stats.birthtime,
|
|
569
|
+
mtime: stats.mtime,
|
|
570
|
+
};
|
|
571
|
+
} catch (err) {
|
|
572
|
+
if (err.code === hdbTerms.NODE_ERROR_CODES.ENOENT) {
|
|
573
|
+
throw new Error(`Component file not found '${path.join(req.project, req.file)}'`);
|
|
574
|
+
}
|
|
575
|
+
throw err;
|
|
576
|
+
}
|
|
577
|
+
}
|
|
578
|
+
|
|
579
|
+
/**
|
|
580
|
+
* Used to update or create a component file
|
|
581
|
+
* @param req
|
|
582
|
+
* @returns {Promise<{message:string}>}
|
|
583
|
+
*/
|
|
584
|
+
async function setComponentFile(req) {
|
|
585
|
+
const validation = validator.setComponentFileValidator(req);
|
|
586
|
+
if (validation) {
|
|
587
|
+
throw handleHDBError(validation, validation.message, HTTP_STATUS_CODES.BAD_REQUEST);
|
|
588
|
+
}
|
|
589
|
+
|
|
590
|
+
const options = req.encoding ? { encoding: req.encoding } : { encoding: 'utf8' };
|
|
591
|
+
const pathToComp = path.join(env.get(hdbTerms.CONFIG_PARAMS.COMPONENTSROOT), req.project, req.file);
|
|
592
|
+
if (req.payload !== undefined) {
|
|
593
|
+
await fs.ensureFile(pathToComp);
|
|
594
|
+
await fs.outputFile(pathToComp, req.payload, options);
|
|
595
|
+
} else {
|
|
596
|
+
await fs.ensureDir(pathToComp);
|
|
597
|
+
}
|
|
598
|
+
let response = await server.replication.replicateOperation(req);
|
|
599
|
+
response.message = `Successfully set component: ` + req.file;
|
|
600
|
+
return response;
|
|
601
|
+
}
|
|
602
|
+
|
|
603
|
+
/**
|
|
604
|
+
* Deletes a component dir/file
|
|
605
|
+
* @param req
|
|
606
|
+
* @returns {Promise<{message:string}>}
|
|
607
|
+
*/
|
|
608
|
+
async function dropComponent(req) {
|
|
609
|
+
const validation = validator.dropComponentFileValidator(req);
|
|
610
|
+
if (validation) {
|
|
611
|
+
throw handleHDBError(validation, validation.message, HTTP_STATUS_CODES.BAD_REQUEST);
|
|
612
|
+
}
|
|
613
|
+
|
|
614
|
+
const { project, file } = req;
|
|
615
|
+
const projectPath = req.file ? path.join(project, file) : project;
|
|
616
|
+
const pathToComponent = path.join(env.get(hdbTerms.CONFIG_PARAMS.COMPONENTSROOT), projectPath);
|
|
617
|
+
|
|
618
|
+
const componentSymlink = path.join(env.get(hdbTerms.CONFIG_PARAMS.ROOTPATH), 'node_modules', project);
|
|
619
|
+
if (await fs.pathExists(componentSymlink)) {
|
|
620
|
+
await fs.unlink(componentSymlink);
|
|
621
|
+
}
|
|
622
|
+
|
|
623
|
+
if (await fs.pathExists(pathToComponent)) {
|
|
624
|
+
await fs.remove(pathToComponent);
|
|
625
|
+
}
|
|
626
|
+
|
|
627
|
+
// Remove the component from the package.json file
|
|
628
|
+
const packageJsonPath = path.join(env.get(hdbTerms.CONFIG_PARAMS.ROOTPATH), 'package.json');
|
|
629
|
+
if (await fs.pathExists(packageJsonPath)) {
|
|
630
|
+
const packageJson = JSON.parse(await fs.readFile(packageJsonPath, 'utf8'));
|
|
631
|
+
if (packageJson?.dependencies?.[project]) {
|
|
632
|
+
delete packageJson.dependencies[project];
|
|
633
|
+
}
|
|
634
|
+
await fs.writeFile(packageJsonPath, JSON.stringify(packageJson, null, 2), 'utf8');
|
|
635
|
+
}
|
|
636
|
+
|
|
637
|
+
configUtils.deleteConfigFromFile([project]);
|
|
638
|
+
let response = await server.replication.replicateOperation(req);
|
|
639
|
+
if (req.restart === true) {
|
|
640
|
+
manageThreads.restartWorkers('http');
|
|
641
|
+
response.message = `Successfully dropped: ${projectPath}, restarting Harper`;
|
|
642
|
+
} else response.message = `Successfully dropped: ${projectPath}`;
|
|
643
|
+
return response;
|
|
644
|
+
}
|
|
645
|
+
|
|
646
|
+
exports.customFunctionsStatus = customFunctionsStatus;
|
|
647
|
+
exports.getCustomFunctions = getCustomFunctions;
|
|
648
|
+
exports.getCustomFunction = getCustomFunction;
|
|
649
|
+
exports.setCustomFunction = setCustomFunction;
|
|
650
|
+
exports.dropCustomFunction = dropCustomFunction;
|
|
651
|
+
exports.addComponent = addComponent;
|
|
652
|
+
exports.dropCustomFunctionProject = dropCustomFunctionProject;
|
|
653
|
+
exports.packageComponent = packageComponent;
|
|
654
|
+
exports.deployComponent = deployComponent;
|
|
655
|
+
exports.getComponents = getComponents;
|
|
656
|
+
exports.getComponentFile = getComponentFile;
|
|
657
|
+
exports.setComponentFile = setComponentFile;
|
|
658
|
+
exports.dropComponent = dropComponent;
|