@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
package/bin/restart.js
ADDED
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const minimist = require('minimist');
|
|
4
|
+
const { isMainThread, parentPort } = require('worker_threads');
|
|
5
|
+
const hdbTerms = require('../utility/hdbTerms.ts');
|
|
6
|
+
const hdbLogger = require('../utility/logging/harper_logger.js');
|
|
7
|
+
const processMan = require('../utility/processManagement/processManagement.js');
|
|
8
|
+
const { compactOnStart } = require('./copyDb.ts');
|
|
9
|
+
const { restartWorkers, onMessageByType, shutdownWorkersNow } = require('../server/threads/manageThreads.js');
|
|
10
|
+
const { handleHDBError, hdbErrors } = require('../utility/errors/hdbError.js');
|
|
11
|
+
const { HTTP_STATUS_CODES } = hdbErrors;
|
|
12
|
+
const envMgr = require('../utility/environment/environmentManager.js');
|
|
13
|
+
const path = require('node:path');
|
|
14
|
+
const { unlinkSync } = require('node:fs');
|
|
15
|
+
envMgr.initSync();
|
|
16
|
+
|
|
17
|
+
const RESTART_RESPONSE = `Restarting Harper. This may take up to ${hdbTerms.RESTART_TIMEOUT_MS / 1000} seconds.`;
|
|
18
|
+
const INVALID_SERVICE_ERR = 'Invalid service';
|
|
19
|
+
|
|
20
|
+
let calledFromCli;
|
|
21
|
+
|
|
22
|
+
module.exports = {
|
|
23
|
+
restart,
|
|
24
|
+
restartService,
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
// Add ITC event listener to main thread which will be called from child that receives restart request.
|
|
28
|
+
if (isMainThread) {
|
|
29
|
+
onMessageByType(hdbTerms.ITC_EVENT_TYPES.RESTART, async (message, port) => {
|
|
30
|
+
if (message.workerType) await restartService({ service: message.workerType });
|
|
31
|
+
else restart({ operation: 'restart' });
|
|
32
|
+
port.postMessage({ type: 'restart-complete' });
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Restart Harper.
|
|
38
|
+
* It will restart all the child threads and the hub and leaf server processes.
|
|
39
|
+
* @param req
|
|
40
|
+
* @returns {Promise<string>}
|
|
41
|
+
*/
|
|
42
|
+
async function restart(req) {
|
|
43
|
+
calledFromCli = Object.keys(req).length === 0;
|
|
44
|
+
|
|
45
|
+
const cliArgs = minimist(process.argv);
|
|
46
|
+
if (cliArgs.service) {
|
|
47
|
+
await restartService(cliArgs);
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
if (calledFromCli) {
|
|
52
|
+
const hdbPid = processMan.getHdbPid();
|
|
53
|
+
console.error(hdbPid ? 'Restarting Harper...' : 'Starting Harper...');
|
|
54
|
+
require('./run.js').launch(true);
|
|
55
|
+
return RESTART_RESPONSE;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
if (isMainThread) {
|
|
59
|
+
hdbLogger.notify(RESTART_RESPONSE);
|
|
60
|
+
|
|
61
|
+
if (envMgr.get(hdbTerms.CONFIG_PARAMS.STORAGE_COMPACTONSTART)) await compactOnStart();
|
|
62
|
+
|
|
63
|
+
if (process.env.HARPER_EXIT_ON_RESTART) {
|
|
64
|
+
// use this to exit the process so that it will be restarted by the
|
|
65
|
+
// PM/container/orchestrator.
|
|
66
|
+
hdbLogger.warn('Exiting Harper process to trigger a container restart');
|
|
67
|
+
process.exit(0);
|
|
68
|
+
}
|
|
69
|
+
setTimeout(async () => {
|
|
70
|
+
// It seems like you should just be able to start the other process and kill this process and everything should
|
|
71
|
+
// be cleaned up, however that doesn't work for some reason; the socket listening fds somehow get transferred to the
|
|
72
|
+
// child process if they are not explicitly closed. And when transferred they are orphaned listening, accepting
|
|
73
|
+
// connections and hanging. So we need to explicitly close down all the workers and then start the new process
|
|
74
|
+
// and shut down.
|
|
75
|
+
hdbLogger.debug('Shutdown workers');
|
|
76
|
+
await shutdownWorkersNow();
|
|
77
|
+
await processMan.cleanupChildrenProcesses(false);
|
|
78
|
+
// remove pid file so it doesn't trip up the launch
|
|
79
|
+
await unlinkSync(path.join(envMgr.get(hdbTerms.CONFIG_PARAMS.ROOTPATH), hdbTerms.HDB_PID_FILE), `${process.pid}`);
|
|
80
|
+
hdbLogger.debug('Starting new process...');
|
|
81
|
+
// now launch the new process and exit this process
|
|
82
|
+
require('./run.js').launch(true);
|
|
83
|
+
}, 50); // can't await this because it is going to do an exit()
|
|
84
|
+
} else {
|
|
85
|
+
// Post msg to main parent thread requesting it restart (so the main thread can process.exit())
|
|
86
|
+
parentPort.postMessage({
|
|
87
|
+
type: hdbTerms.ITC_EVENT_TYPES.RESTART,
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
return RESTART_RESPONSE;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Used to restart a particular service, services includes - httpWorkers
|
|
96
|
+
* @param req
|
|
97
|
+
* @returns {Promise<string>}
|
|
98
|
+
*/
|
|
99
|
+
async function restartService(req) {
|
|
100
|
+
let { service } = req;
|
|
101
|
+
if (hdbTerms.HDB_PROCESS_SERVICES[service] === undefined) {
|
|
102
|
+
throw handleHDBError(new Error(), INVALID_SERVICE_ERR, HTTP_STATUS_CODES.BAD_REQUEST, undefined, undefined, true);
|
|
103
|
+
}
|
|
104
|
+
processMan.expectedRestartOfChildren();
|
|
105
|
+
if (!isMainThread) {
|
|
106
|
+
if (req.replicated) {
|
|
107
|
+
server.replication.monitorNodeCAs(); // get all the CAs from the nodes we know about
|
|
108
|
+
}
|
|
109
|
+
parentPort.postMessage({
|
|
110
|
+
type: hdbTerms.ITC_EVENT_TYPES.RESTART,
|
|
111
|
+
workerType: service,
|
|
112
|
+
});
|
|
113
|
+
parentPort.ref(); // don't let the parent thread exit until we're done
|
|
114
|
+
await new Promise((resolve) => {
|
|
115
|
+
parentPort.on('message', (msg) => {
|
|
116
|
+
if (msg.type === 'restart-complete') {
|
|
117
|
+
resolve();
|
|
118
|
+
parentPort.unref();
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
});
|
|
122
|
+
let replicatedResponses;
|
|
123
|
+
if (req.replicated) {
|
|
124
|
+
req.replicated = false; // don't send a replicated flag to the nodes we are sending to
|
|
125
|
+
replicatedResponses = [];
|
|
126
|
+
for (let node of server.nodes) {
|
|
127
|
+
if (node.name === server.replication.getThisNodeName()) continue;
|
|
128
|
+
// for now, only one at a time
|
|
129
|
+
let job_id;
|
|
130
|
+
try {
|
|
131
|
+
({ job_id } = await server.replication.sendOperationToNode(node, req));
|
|
132
|
+
} catch (err) {
|
|
133
|
+
// If request to node fails, add the error to the response and continue to the next node
|
|
134
|
+
replicatedResponses.push({ node: node.name, message: err.message });
|
|
135
|
+
continue;
|
|
136
|
+
}
|
|
137
|
+
// wait for the job to finish by polling for the completion of the job
|
|
138
|
+
replicatedResponses.push(
|
|
139
|
+
await new Promise((resolve, reject) => {
|
|
140
|
+
const RETRY_INTERVAL = 250;
|
|
141
|
+
let retriesLeft = 2400; // 10 minutes
|
|
142
|
+
let interval = setInterval(async () => {
|
|
143
|
+
if (retriesLeft-- <= 0) {
|
|
144
|
+
clearInterval(interval);
|
|
145
|
+
let error = new Error('Timed out waiting for restart job to complete');
|
|
146
|
+
error.replicated = replicatedResponses; // report the finished restarts
|
|
147
|
+
reject(error);
|
|
148
|
+
}
|
|
149
|
+
let response = await server.replication.sendOperationToNode(node, {
|
|
150
|
+
operation: 'get_job',
|
|
151
|
+
id: job_id,
|
|
152
|
+
});
|
|
153
|
+
const jobResult = response.results[0];
|
|
154
|
+
if (jobResult.status === 'COMPLETE') {
|
|
155
|
+
clearInterval(interval);
|
|
156
|
+
resolve({ node: node.name, message: jobResult.message });
|
|
157
|
+
}
|
|
158
|
+
if (jobResult.status === 'ERROR') {
|
|
159
|
+
clearInterval(interval);
|
|
160
|
+
let error = new Error(jobResult.message);
|
|
161
|
+
error.replicated = replicatedResponses; // report the finished restarts
|
|
162
|
+
reject(error);
|
|
163
|
+
}
|
|
164
|
+
}, RETRY_INTERVAL);
|
|
165
|
+
})
|
|
166
|
+
);
|
|
167
|
+
}
|
|
168
|
+
return { replicated: replicatedResponses };
|
|
169
|
+
}
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
let errMsg;
|
|
174
|
+
switch (service) {
|
|
175
|
+
case 'custom_functions':
|
|
176
|
+
case 'custom functions':
|
|
177
|
+
case hdbTerms.HDB_PROCESS_SERVICES.harperdb:
|
|
178
|
+
case hdbTerms.HDB_PROCESS_SERVICES.http_workers:
|
|
179
|
+
case hdbTerms.HDB_PROCESS_SERVICES.http:
|
|
180
|
+
if (calledFromCli) console.log(`Restarting httpWorkers`);
|
|
181
|
+
hdbLogger.notify('Restarting http_workers');
|
|
182
|
+
|
|
183
|
+
if (calledFromCli) {
|
|
184
|
+
await processMan.restart(hdbTerms.PROCESS_DESCRIPTORS.HDB);
|
|
185
|
+
} else {
|
|
186
|
+
await restartWorkers('http');
|
|
187
|
+
}
|
|
188
|
+
break;
|
|
189
|
+
default:
|
|
190
|
+
errMsg = `Unrecognized service: ${service}`;
|
|
191
|
+
break;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
if (errMsg) {
|
|
195
|
+
hdbLogger.error(errMsg);
|
|
196
|
+
if (calledFromCli) console.error(errMsg);
|
|
197
|
+
return errMsg;
|
|
198
|
+
}
|
|
199
|
+
if (service === 'custom_functions') service = 'Custom Functions';
|
|
200
|
+
return `Restarting ${service}`;
|
|
201
|
+
}
|
package/bin/run.js
ADDED
|
@@ -0,0 +1,409 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const env = require('../utility/environment/environmentManager.js');
|
|
4
|
+
env.initSync();
|
|
5
|
+
|
|
6
|
+
// This unused restart require is here so that main thread loads ITC event listener defined in restart file. Do not remove.
|
|
7
|
+
require('./restart.js');
|
|
8
|
+
const terms = require('../utility/hdbTerms.ts');
|
|
9
|
+
const { CONFIG_PARAMS } = terms;
|
|
10
|
+
const hdbLogger = require('../utility/logging/harper_logger.js');
|
|
11
|
+
const fs = require('fs-extra');
|
|
12
|
+
const path = require('path');
|
|
13
|
+
const checkJwtTokens = require('../utility/install/checkJWTTokensExist.js');
|
|
14
|
+
const { install } = require('../utility/install/installer.js');
|
|
15
|
+
const chalk = require('chalk');
|
|
16
|
+
const { packageJson } = require('../utility/packageUtils.js');
|
|
17
|
+
const hdbUtils = require('../utility/common_utils.js');
|
|
18
|
+
const installation = require('../utility/installation.ts');
|
|
19
|
+
const configUtils = require('../config/configUtils.js');
|
|
20
|
+
const assignCMDENVVariables = require('../utility/assignCmdEnvVariables.js');
|
|
21
|
+
const upgrade = require('./upgrade.js');
|
|
22
|
+
const { compactOnStart } = require('./copyDb.ts');
|
|
23
|
+
const minimist = require('minimist');
|
|
24
|
+
const keys = require('../security/keys.js');
|
|
25
|
+
const { startHTTPThreads } = require('../server/threads/socketRouter.ts');
|
|
26
|
+
const hdbInfoController = require('../dataLayer/hdbInfoController.js');
|
|
27
|
+
const hdbTerms = require('../utility/hdbTerms.ts');
|
|
28
|
+
const { getHdbPid, isProcessRunning } = require('../utility/processManagement/processManagement.js');
|
|
29
|
+
const { PACKAGE_ROOT } = require('../utility/packageUtils');
|
|
30
|
+
|
|
31
|
+
let pmUtils;
|
|
32
|
+
let cmdArgs;
|
|
33
|
+
let skipExitListeners = false;
|
|
34
|
+
|
|
35
|
+
const UPGRADE_COMPLETE_MSG = 'Upgrade complete. Starting Harper.';
|
|
36
|
+
const UPGRADE_ERR = 'Got an error while trying to upgrade your Harper instance. Exiting Harper.';
|
|
37
|
+
const HDB_NOT_FOUND_MSG = 'Harper not found, starting install process.';
|
|
38
|
+
const INSTALL_ERR = 'There was an error during install, check install_log.log for more details. Exiting.';
|
|
39
|
+
const HDB_STARTED = 'Harper successfully started.';
|
|
40
|
+
|
|
41
|
+
function addUnhandleRejectionListener() {
|
|
42
|
+
process.on('unhandledRejection', (reason, promise) => {
|
|
43
|
+
hdbLogger.error('Unhandled promise rejection: Promise', promise, 'reason:', reason);
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function addExitListeners() {
|
|
48
|
+
if (!skipExitListeners) {
|
|
49
|
+
const removeHdbPid = () => {
|
|
50
|
+
fs.removeSync(path.join(env.get(terms.CONFIG_PARAMS.ROOTPATH), terms.HDB_PID_FILE));
|
|
51
|
+
process.exit(0);
|
|
52
|
+
};
|
|
53
|
+
process.on('exit', () => {
|
|
54
|
+
removeHdbPid();
|
|
55
|
+
});
|
|
56
|
+
process.on('SIGINT', () => {
|
|
57
|
+
removeHdbPid();
|
|
58
|
+
});
|
|
59
|
+
process.on('SIGQUIT', () => {
|
|
60
|
+
removeHdbPid();
|
|
61
|
+
});
|
|
62
|
+
process.on('SIGTERM', () => {
|
|
63
|
+
removeHdbPid();
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Do the initial checks and potential upgrades/installation
|
|
70
|
+
* @param calledByInstall
|
|
71
|
+
* @param calledByMain
|
|
72
|
+
* @returns {Promise<void>}
|
|
73
|
+
*/
|
|
74
|
+
async function initialize(calledByInstall = false, calledByMain = false) {
|
|
75
|
+
// Check to see if HDB is installed, if it isn't we call install.
|
|
76
|
+
console.log(chalk.magenta('Starting Harper...'));
|
|
77
|
+
|
|
78
|
+
addUnhandleRejectionListener();
|
|
79
|
+
|
|
80
|
+
hdbLogger.suppressLogging?.(() => {
|
|
81
|
+
console.log(chalk.magenta('' + fs.readFileSync(path.join(PACKAGE_ROOT, 'static/ascii_logo.txt'))));
|
|
82
|
+
});
|
|
83
|
+
hdbLogger.debug('Checking to make sure hdb is installed');
|
|
84
|
+
if (installation.isHdbInstalled(env, hdbLogger) === false) {
|
|
85
|
+
console.log(HDB_NOT_FOUND_MSG);
|
|
86
|
+
try {
|
|
87
|
+
await install();
|
|
88
|
+
} catch (err) {
|
|
89
|
+
console.error(INSTALL_ERR, err);
|
|
90
|
+
hdbLogger.error(err);
|
|
91
|
+
process.exit(1);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// The called by install check is here because if cmd/env args are passed to install (which calls run when done)
|
|
96
|
+
// we do not need to update/backup the config file on run.
|
|
97
|
+
if (!calledByInstall) {
|
|
98
|
+
// If run is called with cmd/env vars we create a backup of config and update config file.
|
|
99
|
+
let parsedArgs = assignCMDENVVariables(Object.keys(terms.CONFIG_PARAM_MAP), true);
|
|
100
|
+
|
|
101
|
+
// If HARPER_SET_CONFIG is present, filter out any config keys that are set in it
|
|
102
|
+
// to prevent individual env vars from overriding explicit runtime configuration
|
|
103
|
+
const { filterArgsAgainstRuntimeConfig } = require('../config/harperConfigEnvVars.ts');
|
|
104
|
+
parsedArgs = filterArgsAgainstRuntimeConfig(parsedArgs);
|
|
105
|
+
|
|
106
|
+
if (!hdbUtils.isEmpty(parsedArgs) && !hdbUtils.isEmptyOrZeroLength(Object.keys(parsedArgs))) {
|
|
107
|
+
configUtils.updateConfigValue(undefined, undefined, parsedArgs, true, true);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// if this process is Harper restarting, the parent could still be compacting RocksDB on exit,
|
|
112
|
+
// so we need to wait for the parent to exit
|
|
113
|
+
if (process.env.HARPER_PARENT_PROCESS_PID) {
|
|
114
|
+
const prevProcessPid = parseInt(process.env.HARPER_PARENT_PROCESS_PID);
|
|
115
|
+
delete process.env.HARPER_PARENT_PROCESS_PID;
|
|
116
|
+
if (isProcessRunning(prevProcessPid)) {
|
|
117
|
+
hdbLogger.info(`Previous process ${prevProcessPid} is still running, waiting up to 15 seconds...`);
|
|
118
|
+
// check if the previous process is still running, and if so, wait up to 15 seconds before timing out
|
|
119
|
+
const timeout = setTimeout(() => {
|
|
120
|
+
console.error(`Previous process ${prevProcessPid} is still running, exiting.`);
|
|
121
|
+
process.exit(1);
|
|
122
|
+
}, 15000);
|
|
123
|
+
while (isProcessRunning(prevProcessPid)) {
|
|
124
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
125
|
+
}
|
|
126
|
+
hdbLogger.info(`Previous process ${prevProcessPid} has exited`);
|
|
127
|
+
clearTimeout(timeout);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
// Check to see if Harper is already running by checking for a pid file
|
|
132
|
+
// If found confirm it matches a currently running processes
|
|
133
|
+
let hdbPid = getHdbPid();
|
|
134
|
+
if (hdbPid) {
|
|
135
|
+
hdbLogger.debug('Error: Harper is already running');
|
|
136
|
+
console.error(`Error: Harper is already running (pid: ${hdbPid})`);
|
|
137
|
+
process.exit(4);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
addExitListeners();
|
|
141
|
+
|
|
142
|
+
if (calledByMain) {
|
|
143
|
+
// Write Harper PID to file for tracking purposes
|
|
144
|
+
await fs.writeFile(path.join(env.get(hdbTerms.CONFIG_PARAMS.ROOTPATH), hdbTerms.HDB_PID_FILE), `${process.pid}`);
|
|
145
|
+
}
|
|
146
|
+
hdbLogger.info('Harper PID', process.pid);
|
|
147
|
+
|
|
148
|
+
// Check to see if an upgrade is needed based on existing hdbInfo data. If so, we need to force the user to upgrade
|
|
149
|
+
// before the server can be started.
|
|
150
|
+
let upgradeVers;
|
|
151
|
+
try {
|
|
152
|
+
const updateObj = await hdbInfoController.getVersionUpdateInfo();
|
|
153
|
+
if (updateObj !== undefined) {
|
|
154
|
+
upgradeVers = updateObj[terms.UPGRADE_JSON_FIELD_NAMES_ENUM.UPGRADE_VERSION];
|
|
155
|
+
await upgrade.upgrade(updateObj);
|
|
156
|
+
console.log(UPGRADE_COMPLETE_MSG);
|
|
157
|
+
}
|
|
158
|
+
} catch (err) {
|
|
159
|
+
if (upgradeVers) {
|
|
160
|
+
console.error(
|
|
161
|
+
`Got an error while trying to upgrade your Harper instance to version ${upgradeVers}. Exiting Harper.`,
|
|
162
|
+
err
|
|
163
|
+
);
|
|
164
|
+
hdbLogger.error(err);
|
|
165
|
+
} else {
|
|
166
|
+
console.error(UPGRADE_ERR, err);
|
|
167
|
+
hdbLogger.error(err);
|
|
168
|
+
}
|
|
169
|
+
process.exit(1);
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
checkJwtTokens();
|
|
173
|
+
|
|
174
|
+
await keys.reviewSelfSignedCert();
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Starts Harper DB threads
|
|
178
|
+
* If the hdbBootProps file is not found, it is assumed an install needs to be performed.
|
|
179
|
+
* @param calledByInstall - If run is called by install we want to ignore any
|
|
180
|
+
* cmd/env args as they would have already been written to config on install.
|
|
181
|
+
* @returns {Promise<void>}
|
|
182
|
+
*/
|
|
183
|
+
async function main(calledByInstall = false) {
|
|
184
|
+
try {
|
|
185
|
+
cmdArgs = minimist(process.argv);
|
|
186
|
+
if (cmdArgs.ROOTPATH) {
|
|
187
|
+
let harperConfigPath = path.join(cmdArgs.ROOTPATH, hdbTerms.HARPER_CONFIG_FILE);
|
|
188
|
+
if (!fs.existsSync(harperConfigPath) && fs.existsSync(path.join(cmdArgs.ROOTPATH, hdbTerms.HARPER_CONFIG_FILE)))
|
|
189
|
+
harperConfigPath = path.join(cmdArgs.ROOTPATH, hdbTerms.HDB_CONFIG_FILE);
|
|
190
|
+
configUtils.updateConfigObject('settings_path', harperConfigPath);
|
|
191
|
+
}
|
|
192
|
+
await initialize(calledByInstall, true);
|
|
193
|
+
|
|
194
|
+
if (env.get(terms.CONFIG_PARAMS.STORAGE_COMPACTONSTART)) await compactOnStart();
|
|
195
|
+
|
|
196
|
+
const isScripted = process.env.IS_SCRIPTED_SERVICE && !cmdArgs.service;
|
|
197
|
+
|
|
198
|
+
await startHTTPThreads(
|
|
199
|
+
process.env.DEV_MODE
|
|
200
|
+
? 1
|
|
201
|
+
: (env.get(hdbTerms.CONFIG_PARAMS.THREADS_COUNT) ?? env.get(hdbTerms.CONFIG_PARAMS.THREADS))
|
|
202
|
+
);
|
|
203
|
+
|
|
204
|
+
if (!isScripted) started();
|
|
205
|
+
} catch (err) {
|
|
206
|
+
console.error(err);
|
|
207
|
+
hdbLogger.error(err);
|
|
208
|
+
process.exit(1);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
function started() {
|
|
212
|
+
// Console log Harper dog logo
|
|
213
|
+
hdbLogger.suppressLogging(() => {
|
|
214
|
+
console.log(chalk.magenta(`Harper ${packageJson.version} successfully started`));
|
|
215
|
+
});
|
|
216
|
+
hdbLogger.notify(HDB_STARTED);
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Launches a separate process for Harper and then exits. This is an unusual practice and is anathema
|
|
220
|
+
* to the way processes are typically handled, both in terminal and for services (systemd), but this functionality
|
|
221
|
+
* is retained for legacy purposes.
|
|
222
|
+
* @returns {Promise<void>} // ha ha, it doesn't!
|
|
223
|
+
*/
|
|
224
|
+
async function launch(exit = true) {
|
|
225
|
+
skipExitListeners = !exit;
|
|
226
|
+
try {
|
|
227
|
+
if (pmUtils === undefined) pmUtils = require('../utility/processManagement/processManagement.js');
|
|
228
|
+
hdbLogger.debug('initializing processManagement...');
|
|
229
|
+
await initialize();
|
|
230
|
+
hdbLogger.debug('Starting new main process');
|
|
231
|
+
|
|
232
|
+
await pmUtils.startService(terms.PROCESS_DESCRIPTORS.HDB, true);
|
|
233
|
+
started();
|
|
234
|
+
if (exit) process.exit(0);
|
|
235
|
+
} catch (err) {
|
|
236
|
+
console.error(err);
|
|
237
|
+
hdbLogger.error(err);
|
|
238
|
+
process.exit(1);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
exports.launch = launch;
|
|
243
|
+
exports.main = main;
|
|
244
|
+
exports.startupLog = startupLog;
|
|
245
|
+
|
|
246
|
+
/**
|
|
247
|
+
* Logs running services and relevant ports/information.
|
|
248
|
+
* Called by worker thread 1 once all servers have started
|
|
249
|
+
* @param portResolutions
|
|
250
|
+
*/
|
|
251
|
+
function startupLog(portResolutions) {
|
|
252
|
+
// Adds padding to a string
|
|
253
|
+
const padding = 20;
|
|
254
|
+
const pad = (param) => param.padEnd(padding);
|
|
255
|
+
let logMsg = '\n';
|
|
256
|
+
|
|
257
|
+
logMsg += `${pad('Hostname:')}${env.get(CONFIG_PARAMS.NODE_HOSTNAME)}\n`;
|
|
258
|
+
|
|
259
|
+
logMsg += `${pad('Worker Threads:')}${env.get(CONFIG_PARAMS.THREADS_COUNT)}\n`;
|
|
260
|
+
|
|
261
|
+
logMsg += `${pad('Root Path:')}${env.get(CONFIG_PARAMS.ROOTPATH)}\n`;
|
|
262
|
+
|
|
263
|
+
if (env.get(CONFIG_PARAMS.THREADS_DEBUG) !== false) {
|
|
264
|
+
logMsg += `${pad('Debugging:')}enabled: true`;
|
|
265
|
+
logMsg += env.get(CONFIG_PARAMS.THREADS_DEBUG_PORT)
|
|
266
|
+
? `, TCP: ${env.get(CONFIG_PARAMS.THREADS_DEBUG_PORT)}\n`
|
|
267
|
+
: '\n';
|
|
268
|
+
}
|
|
269
|
+
const logFilePath = path.join(env.get(CONFIG_PARAMS.LOGGING_ROOT), 'hdb.log');
|
|
270
|
+
logMsg += `${pad('Logging:')}level: ${env.get(CONFIG_PARAMS.LOGGING_LEVEL)}, location: ${
|
|
271
|
+
logFilePath + (env.get(CONFIG_PARAMS.LOGGING_STDSTREAMS) ? ', stdout/err' : '')
|
|
272
|
+
}\n`;
|
|
273
|
+
|
|
274
|
+
// Database Log aka Applications API aka http (in config)
|
|
275
|
+
logMsg += pad('Default:');
|
|
276
|
+
logMsg += env.get(CONFIG_PARAMS.HTTP_PORT) ? `HTTP (and WS): ${env.get(CONFIG_PARAMS.HTTP_PORT)}, ` : '';
|
|
277
|
+
logMsg += env.get(CONFIG_PARAMS.HTTP_SECUREPORT) ? `HTTPS (and WS): ${env.get(CONFIG_PARAMS.HTTP_SECUREPORT)}, ` : '';
|
|
278
|
+
logMsg += `CORS: ${
|
|
279
|
+
env.get(CONFIG_PARAMS.HTTP_CORS) ? `enabled for ${env.get(CONFIG_PARAMS.HTTP_CORSACCESSLIST)}` : 'disabled'
|
|
280
|
+
}\n`;
|
|
281
|
+
|
|
282
|
+
// Operations API Log
|
|
283
|
+
logMsg += pad('Operations API:');
|
|
284
|
+
logMsg += env.get(CONFIG_PARAMS.OPERATIONSAPI_NETWORK_PORT)
|
|
285
|
+
? `HTTP: ${env.get(CONFIG_PARAMS.OPERATIONSAPI_NETWORK_PORT)}, `
|
|
286
|
+
: '';
|
|
287
|
+
logMsg += env.get(CONFIG_PARAMS.OPERATIONSAPI_NETWORK_SECUREPORT)
|
|
288
|
+
? `HTTPS: ${env.get(CONFIG_PARAMS.OPERATIONSAPI_NETWORK_SECUREPORT)}, `
|
|
289
|
+
: '';
|
|
290
|
+
logMsg += `CORS: ${
|
|
291
|
+
env.get(CONFIG_PARAMS.OPERATIONSAPI_NETWORK_CORS)
|
|
292
|
+
? `enabled for ${env.get(CONFIG_PARAMS.OPERATIONSAPI_NETWORK_CORSACCESSLIST)}`
|
|
293
|
+
: 'disabled'
|
|
294
|
+
}`;
|
|
295
|
+
logMsg += `, unix socket: ${env.get(CONFIG_PARAMS.OPERATIONSAPI_NETWORK_DOMAINSOCKET)}\n`;
|
|
296
|
+
if (env.get(CONFIG_PARAMS.OPERATIONSAPI_NETWORK_PORT)) {
|
|
297
|
+
logMsg +=
|
|
298
|
+
pad('') +
|
|
299
|
+
'http://' +
|
|
300
|
+
env.get(CONFIG_PARAMS.NODE_HOSTNAME) +
|
|
301
|
+
':' +
|
|
302
|
+
env.get(CONFIG_PARAMS.OPERATIONSAPI_NETWORK_PORT) +
|
|
303
|
+
'/\n';
|
|
304
|
+
}
|
|
305
|
+
if (env.get(CONFIG_PARAMS.OPERATIONSAPI_NETWORK_SECUREPORT)) {
|
|
306
|
+
logMsg +=
|
|
307
|
+
'\n' +
|
|
308
|
+
pad('') +
|
|
309
|
+
'https://' +
|
|
310
|
+
env.get(CONFIG_PARAMS.NODE_HOSTNAME) +
|
|
311
|
+
':' +
|
|
312
|
+
env.get(CONFIG_PARAMS.OPERATIONSAPI_NETWORK_SECUREPORT) +
|
|
313
|
+
'/\n';
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
// MQTT Log
|
|
317
|
+
logMsg += pad('MQTT:');
|
|
318
|
+
logMsg += env.get(CONFIG_PARAMS.MQTT_NETWORK_PORT) ? `TCP: ${env.get(CONFIG_PARAMS.MQTT_NETWORK_PORT)}, ` : '';
|
|
319
|
+
logMsg += env.get(CONFIG_PARAMS.MQTT_NETWORK_SECUREPORT)
|
|
320
|
+
? `TLS: ${env.get(CONFIG_PARAMS.MQTT_NETWORK_SECUREPORT)}`
|
|
321
|
+
: '';
|
|
322
|
+
logMsg +=
|
|
323
|
+
env.get(CONFIG_PARAMS.MQTT_WEBSOCKET) && env.get(CONFIG_PARAMS.HTTP_PORT)
|
|
324
|
+
? `, WS: ${env.get(CONFIG_PARAMS.HTTP_PORT)}`
|
|
325
|
+
: '';
|
|
326
|
+
logMsg +=
|
|
327
|
+
env.get(CONFIG_PARAMS.MQTT_WEBSOCKET) && env.get(CONFIG_PARAMS.HTTP_SECUREPORT)
|
|
328
|
+
? `, WSS: ${env.get(CONFIG_PARAMS.HTTP_SECUREPORT)}\n`
|
|
329
|
+
: '\n';
|
|
330
|
+
|
|
331
|
+
if (env.get(CONFIG_PARAMS.REPLICATION_URL)) {
|
|
332
|
+
let repLog = `${pad('Replication:')}\n`;
|
|
333
|
+
|
|
334
|
+
repLog += `${pad('Replication Url:')}${env.get(CONFIG_PARAMS.REPLICATION_URL)}\n`;
|
|
335
|
+
// Replication log
|
|
336
|
+
const replicationPort =
|
|
337
|
+
env.get(CONFIG_PARAMS.REPLICATION_PORT) ?? env.get(CONFIG_PARAMS.OPERATIONSAPI_NETWORK_PORT);
|
|
338
|
+
const replicationSecurePort =
|
|
339
|
+
env.get(CONFIG_PARAMS.REPLICATION_SECUREPORT) ?? env.get(CONFIG_PARAMS.OPERATIONSAPI_NETWORK_SECUREPORT);
|
|
340
|
+
|
|
341
|
+
repLog += replicationPort ? `WS: ${replicationPort}, ` : '';
|
|
342
|
+
repLog += replicationSecurePort ? `WSS: ${replicationSecurePort} ` : '';
|
|
343
|
+
logMsg += `${repLog.slice(0, -2)}\n`;
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
// Extract all non-default components from the config file
|
|
347
|
+
let components = [];
|
|
348
|
+
const configObj = configUtils.getConfigObj();
|
|
349
|
+
for (const cfg in configObj) {
|
|
350
|
+
if (configObj[cfg].package) components.push(cfg);
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
// portResolutions is a Map of port to protocol name and component name built in threadServer.js
|
|
354
|
+
// we iterate through the map to build a log for REST and for any components that are using custom ports
|
|
355
|
+
let comps = {};
|
|
356
|
+
let restHostnames = [];
|
|
357
|
+
let restLog = `${pad('REST:')}`;
|
|
358
|
+
for (const [key, values] of portResolutions) {
|
|
359
|
+
for (const value of values) {
|
|
360
|
+
const name = value.name;
|
|
361
|
+
const pair = `${value.protocol_name}: ${key}, `;
|
|
362
|
+
if (!restLog.includes(pair) && name === 'rest') {
|
|
363
|
+
restLog += pair;
|
|
364
|
+
if (value.protocol_name === 'HTTP' || value.protocol_name === 'HTTPS') {
|
|
365
|
+
restHostnames.push(`${value.protocol_name.toLowerCase()}://${env.get(CONFIG_PARAMS.NODE_HOSTNAME)}:${key}/`);
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
if (components.includes(name)) {
|
|
370
|
+
if (comps[name]) {
|
|
371
|
+
comps[name] += pair;
|
|
372
|
+
} else {
|
|
373
|
+
comps[name] = pair;
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
// Remove the trailing comma and space
|
|
380
|
+
if (restLog.length > padding + 1) {
|
|
381
|
+
restLog = restLog.slice(0, -2);
|
|
382
|
+
logMsg += `${restLog}\n`;
|
|
383
|
+
for (const restHostname of restHostnames) {
|
|
384
|
+
logMsg += pad('') + restHostname + '\n';
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
let appPortsLog = env.get(CONFIG_PARAMS.HTTP_PORT) ? `HTTP: ${env.get(CONFIG_PARAMS.HTTP_PORT)}, ` : '';
|
|
389
|
+
appPortsLog += env.get(CONFIG_PARAMS.HTTP_SECUREPORT) ? `HTTPS: ${env.get(CONFIG_PARAMS.HTTP_SECUREPORT)}, ` : '';
|
|
390
|
+
if (appPortsLog.length > padding + 1) appPortsLog = appPortsLog.slice(0, -2);
|
|
391
|
+
|
|
392
|
+
// Build logs for all components
|
|
393
|
+
for (const c of components) {
|
|
394
|
+
if (comps[c]) {
|
|
395
|
+
logMsg += `${pad(c + ': ')}${comps[c].slice(0, -2)}\n`;
|
|
396
|
+
} else {
|
|
397
|
+
logMsg += `${pad(c + ': ')}${appPortsLog}\n`;
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
console.log(logMsg);
|
|
402
|
+
if (env.get(CONFIG_PARAMS.LOGGING_STDSTREAMS) && hdbLogger.logsAtLevel('info')) {
|
|
403
|
+
hdbLogger.suppressLogging(() => {
|
|
404
|
+
console.log(
|
|
405
|
+
`Note that log messages are being sent to the console (stdout and stderr) in addition to the log file ${logFilePath}. This can be disabled by setting logging.stdStreams to false, and the log file can be directly monitored/tailed.`
|
|
406
|
+
);
|
|
407
|
+
});
|
|
408
|
+
}
|
|
409
|
+
}
|
package/bin/status.js
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const fs = require('fs-extra');
|
|
4
|
+
const path = require('path');
|
|
5
|
+
const YAML = require('yaml');
|
|
6
|
+
|
|
7
|
+
const hdbTerms = require('../utility/hdbTerms.ts');
|
|
8
|
+
const hdbLog = require('../utility/logging/harper_logger.js');
|
|
9
|
+
const sysInfo = require('../utility/environment/systemInformation.js');
|
|
10
|
+
const envMgr = require('../utility/environment/environmentManager.js');
|
|
11
|
+
const installation = require('../utility/installation.ts');
|
|
12
|
+
envMgr.initSync();
|
|
13
|
+
|
|
14
|
+
const STATUSES = {
|
|
15
|
+
RUNNING: 'running',
|
|
16
|
+
STOPPED: 'stopped',
|
|
17
|
+
ERRORED: 'errored',
|
|
18
|
+
NOT_INSTALLED: 'not installed',
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
let hdbRoot;
|
|
22
|
+
|
|
23
|
+
module.exports = status;
|
|
24
|
+
|
|
25
|
+
async function status() {
|
|
26
|
+
let status = {
|
|
27
|
+
harperdb: {
|
|
28
|
+
status: STATUSES.STOPPED,
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
if (!installation.isHdbInstalled(envMgr, hdbLog)) {
|
|
33
|
+
status.harperdb.status = STATUSES.NOT_INSTALLED;
|
|
34
|
+
console.log(YAML.stringify(status));
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
hdbRoot = envMgr.get(hdbTerms.CONFIG_PARAMS.ROOTPATH);
|
|
39
|
+
let hdbPid;
|
|
40
|
+
try {
|
|
41
|
+
hdbPid = Number.parseInt(await fs.readFile(path.join(hdbRoot, hdbTerms.HDB_PID_FILE), 'utf8'));
|
|
42
|
+
} catch (err) {
|
|
43
|
+
if (err.code === hdbTerms.NODE_ERROR_CODES.ENOENT) {
|
|
44
|
+
hdbLog.info('`harperdb status` did not find a hdb.pid file');
|
|
45
|
+
status.harperdb.status = STATUSES.STOPPED;
|
|
46
|
+
console.log(YAML.stringify(status));
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
throw err;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// Check the saved pid against any running hdb processes
|
|
54
|
+
const hdbSysInfo = await sysInfo.getHDBProcessInfo();
|
|
55
|
+
for (const proc of hdbSysInfo.core) {
|
|
56
|
+
if (proc.pid === hdbPid) {
|
|
57
|
+
status.harperdb.status = STATUSES.RUNNING;
|
|
58
|
+
status.harperdb.pid = hdbPid;
|
|
59
|
+
break;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
console.log(YAML.stringify(status));
|
|
64
|
+
process.exit();
|
|
65
|
+
}
|
package/bin/stop.js
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const hdbLogger = require('../utility/logging/harper_logger.js');
|
|
4
|
+
const util = require('util');
|
|
5
|
+
const childProcess = require('child_process');
|
|
6
|
+
const exec = util.promisify(childProcess.exec);
|
|
7
|
+
const sysInfo = require('../utility/environment/systemInformation.js');
|
|
8
|
+
|
|
9
|
+
const STOP_MSG = 'Stopping Harper.';
|
|
10
|
+
|
|
11
|
+
module.exports = stop;
|
|
12
|
+
|
|
13
|
+
async function stop() {
|
|
14
|
+
console.log(STOP_MSG);
|
|
15
|
+
hdbLogger.notify(STOP_MSG);
|
|
16
|
+
|
|
17
|
+
const processes = await sysInfo.getHDBProcessInfo();
|
|
18
|
+
|
|
19
|
+
processes.core.forEach((p) => {
|
|
20
|
+
exec(`kill ${p.pid}`);
|
|
21
|
+
});
|
|
22
|
+
}
|