@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,27 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
class BulkLoadFileObject {
|
|
4
|
+
constructor(operationFunc, action, schema, table, filePath, fileType, rolePerms = null) {
|
|
5
|
+
this.op = operationFunc;
|
|
6
|
+
this.action = action;
|
|
7
|
+
this.schema = schema;
|
|
8
|
+
this.table = table;
|
|
9
|
+
this.file_path = filePath;
|
|
10
|
+
this.file_type = fileType;
|
|
11
|
+
this.role_perms = rolePerms;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
class BulkLoadDataObject {
|
|
16
|
+
constructor(action, schema, table, jsonData) {
|
|
17
|
+
this.action = action;
|
|
18
|
+
this.schema = schema;
|
|
19
|
+
this.table = table;
|
|
20
|
+
this.data = jsonData;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
module.exports = {
|
|
25
|
+
BulkLoadFileObject,
|
|
26
|
+
BulkLoadDataObject,
|
|
27
|
+
};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
const OPERATIONS_ENUM = require('../../utility/hdbTerms.ts').OPERATIONS_ENUM;
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* object representing an UPSERT operation
|
|
6
|
+
*/
|
|
7
|
+
class UpsertObject {
|
|
8
|
+
/**
|
|
9
|
+
* @param {String} schema
|
|
10
|
+
* @param {string} table
|
|
11
|
+
* @param {Array.<Object>} records
|
|
12
|
+
* @param {any} __origin
|
|
13
|
+
*/
|
|
14
|
+
constructor(schema, table, records, __origin = undefined) {
|
|
15
|
+
this.operation = OPERATIONS_ENUM.UPSERT;
|
|
16
|
+
this.schema = schema;
|
|
17
|
+
this.table = table;
|
|
18
|
+
this.records = records;
|
|
19
|
+
this.__origin = __origin;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
module.exports = UpsertObject;
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const bulkDeleteValidator = require('../validation/bulkDeleteValidator.js');
|
|
4
|
+
const deleteValidator = require('../validation/deleteValidator.js');
|
|
5
|
+
const commonUtils = require('../utility/common_utils.js');
|
|
6
|
+
const moment = require('moment');
|
|
7
|
+
const harperLogger = require('../utility/logging/harper_logger.js');
|
|
8
|
+
const { promisify, callbackify } = require('util');
|
|
9
|
+
const terms = require('../utility/hdbTerms.ts');
|
|
10
|
+
const globalSchema = require('../utility/globalSchema.js');
|
|
11
|
+
const pGlobalSchema = promisify(globalSchema.getTableSchema);
|
|
12
|
+
const harperBridge = require('./harperBridge/harperBridge.js');
|
|
13
|
+
const { DeleteResponseObject } = require('./DataLayerObjects.js');
|
|
14
|
+
const { handleHDBError, hdbErrors } = require('../utility/errors/hdbError.js');
|
|
15
|
+
const { HDB_ERROR_MSGS, HTTP_STATUS_CODES } = hdbErrors;
|
|
16
|
+
|
|
17
|
+
const SUCCESS_MESSAGE = 'records successfully deleted';
|
|
18
|
+
|
|
19
|
+
// Callbackified functions
|
|
20
|
+
const cbDeleteRecord = callbackify(deleteRecord);
|
|
21
|
+
|
|
22
|
+
module.exports = {
|
|
23
|
+
delete: cbDeleteRecord,
|
|
24
|
+
deleteRecord,
|
|
25
|
+
deleteFilesBefore,
|
|
26
|
+
deleteAuditLogsBefore,
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Deletes files that have a system date before the date parameter.
|
|
31
|
+
* Note this does not technically delete the values from the database.
|
|
32
|
+
* This serves only to remove files for devices that have a small amount of disk space.
|
|
33
|
+
*
|
|
34
|
+
* @param deleteObj - the request passed from chooseOperation.
|
|
35
|
+
*/
|
|
36
|
+
async function deleteFilesBefore(deleteObj) {
|
|
37
|
+
let validation = bulkDeleteValidator(deleteObj, 'date');
|
|
38
|
+
if (validation) {
|
|
39
|
+
throw handleHDBError(validation, validation.message, HTTP_STATUS_CODES.BAD_REQUEST, undefined, undefined, true);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
commonUtils.transformReq(deleteObj);
|
|
43
|
+
|
|
44
|
+
let parsedDate = moment(deleteObj.date, moment.ISO_8601);
|
|
45
|
+
if (!parsedDate.isValid()) {
|
|
46
|
+
throw handleHDBError(
|
|
47
|
+
new Error(),
|
|
48
|
+
HDB_ERROR_MSGS.INVALID_DATE,
|
|
49
|
+
HTTP_STATUS_CODES.BAD_REQUEST,
|
|
50
|
+
terms.LOG_LEVELS.ERROR,
|
|
51
|
+
HDB_ERROR_MSGS.INVALID_DATE,
|
|
52
|
+
true
|
|
53
|
+
);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
let invalidSchemaTableMsg = commonUtils.checkSchemaTableExist(deleteObj.schema, deleteObj.table);
|
|
57
|
+
if (invalidSchemaTableMsg) {
|
|
58
|
+
throw handleHDBError(
|
|
59
|
+
new Error(),
|
|
60
|
+
invalidSchemaTableMsg,
|
|
61
|
+
HTTP_STATUS_CODES.NOT_FOUND,
|
|
62
|
+
terms.LOG_LEVELS.ERROR,
|
|
63
|
+
invalidSchemaTableMsg,
|
|
64
|
+
true
|
|
65
|
+
);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
let results = await harperBridge.deleteRecordsBefore(deleteObj);
|
|
69
|
+
await pGlobalSchema(deleteObj.schema, deleteObj.table);
|
|
70
|
+
harperLogger.info(`Finished deleting files before ${deleteObj.date}`);
|
|
71
|
+
if (results && results.message) {
|
|
72
|
+
return results.message;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Deletes audit logs which are older than a specific date
|
|
78
|
+
*
|
|
79
|
+
* @param {DeleteBeforeObject} deleteObj - the request passed from chooseOperation.
|
|
80
|
+
*/
|
|
81
|
+
async function deleteAuditLogsBefore(deleteObj) {
|
|
82
|
+
let validation = bulkDeleteValidator(deleteObj, 'timestamp');
|
|
83
|
+
if (validation) {
|
|
84
|
+
throw handleHDBError(validation, validation.message, HTTP_STATUS_CODES.BAD_REQUEST, undefined, undefined, true);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
commonUtils.transformReq(deleteObj);
|
|
88
|
+
|
|
89
|
+
if (isNaN(deleteObj.timestamp)) {
|
|
90
|
+
throw handleHDBError(
|
|
91
|
+
new Error(),
|
|
92
|
+
HDB_ERROR_MSGS.INVALID_VALUE('Timestamp'),
|
|
93
|
+
HTTP_STATUS_CODES.BAD_REQUEST,
|
|
94
|
+
terms.LOG_LEVELS.ERROR,
|
|
95
|
+
HDB_ERROR_MSGS.INVALID_VALUE('Timestamp'),
|
|
96
|
+
true
|
|
97
|
+
);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
let invalidSchemaTableMsg = commonUtils.checkSchemaTableExist(deleteObj.schema, deleteObj.table);
|
|
101
|
+
if (invalidSchemaTableMsg) {
|
|
102
|
+
throw handleHDBError(
|
|
103
|
+
new Error(),
|
|
104
|
+
invalidSchemaTableMsg,
|
|
105
|
+
HTTP_STATUS_CODES.NOT_FOUND,
|
|
106
|
+
terms.LOG_LEVELS.ERROR,
|
|
107
|
+
invalidSchemaTableMsg,
|
|
108
|
+
true
|
|
109
|
+
);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
let results = await harperBridge.deleteAuditLogsBefore(deleteObj);
|
|
113
|
+
await pGlobalSchema(deleteObj.schema, deleteObj.table);
|
|
114
|
+
harperLogger.info(`Finished deleting audit logs before ${deleteObj.timestamp}`);
|
|
115
|
+
|
|
116
|
+
return results;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Calls the harper bridge to delete records.
|
|
121
|
+
* @param deleteObject
|
|
122
|
+
* @returns {Promise<string>}
|
|
123
|
+
*/
|
|
124
|
+
async function deleteRecord(deleteObject) {
|
|
125
|
+
if (deleteObject.ids) deleteObject.hash_values = deleteObject.ids;
|
|
126
|
+
let validation = deleteValidator(deleteObject);
|
|
127
|
+
if (validation) {
|
|
128
|
+
throw handleHDBError(validation, validation.message, HTTP_STATUS_CODES.BAD_REQUEST, undefined, undefined, true);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
commonUtils.transformReq(deleteObject);
|
|
132
|
+
|
|
133
|
+
let invalidSchemaTableMsg = commonUtils.checkSchemaTableExist(deleteObject.schema, deleteObject.table);
|
|
134
|
+
if (invalidSchemaTableMsg) {
|
|
135
|
+
throw handleHDBError(
|
|
136
|
+
new Error(),
|
|
137
|
+
invalidSchemaTableMsg,
|
|
138
|
+
HTTP_STATUS_CODES.NOT_FOUND,
|
|
139
|
+
terms.LOG_LEVELS.ERROR,
|
|
140
|
+
invalidSchemaTableMsg,
|
|
141
|
+
true
|
|
142
|
+
);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
try {
|
|
146
|
+
await pGlobalSchema(deleteObject.schema, deleteObject.table);
|
|
147
|
+
let deleteResultObject = await harperBridge.deleteRecords(deleteObject);
|
|
148
|
+
|
|
149
|
+
if (commonUtils.isEmptyOrZeroLength(deleteResultObject.message)) {
|
|
150
|
+
deleteResultObject.message = `${deleteResultObject.deleted_hashes.length} of ${deleteObject.hash_values.length} ${SUCCESS_MESSAGE}`;
|
|
151
|
+
}
|
|
152
|
+
return deleteResultObject;
|
|
153
|
+
} catch (err) {
|
|
154
|
+
if (err.message === terms.SEARCH_NOT_FOUND_MESSAGE) {
|
|
155
|
+
let returnMsg = new DeleteResponseObject();
|
|
156
|
+
returnMsg.message = terms.SEARCH_NOT_FOUND_MESSAGE;
|
|
157
|
+
returnMsg.skipped_hashes = deleteObject.hash_values.length;
|
|
158
|
+
returnMsg.deleted_hashes = 0;
|
|
159
|
+
return returnMsg;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
throw err;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
@@ -0,0 +1,381 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const search = require('./search.js');
|
|
4
|
+
const AWSConnector = require('../utility/AWS/AWSConnector.js');
|
|
5
|
+
const { AsyncParser } = require('json2csv');
|
|
6
|
+
const stream = require('stream');
|
|
7
|
+
const hdbUtils = require('../utility/common_utils.js');
|
|
8
|
+
const fs = require('fs-extra');
|
|
9
|
+
const path = require('path');
|
|
10
|
+
const hdbLogger = require('../utility/logging/harper_logger.js');
|
|
11
|
+
const { promisify } = require('util');
|
|
12
|
+
const hdbCommon = require('../utility/common_utils.js');
|
|
13
|
+
const { handleHDBError, hdbErrors } = require('../utility/errors/hdbError.js');
|
|
14
|
+
const { HDB_ERROR_MSGS, HTTP_STATUS_CODES } = hdbErrors;
|
|
15
|
+
const { streamAsJSON } = require('../server/serverHelpers/JSONStream.ts');
|
|
16
|
+
const { Upload } = require('@aws-sdk/lib-storage');
|
|
17
|
+
const { toCsvStream } = require('../server/serverHelpers/contentTypes.ts');
|
|
18
|
+
|
|
19
|
+
const VALID_SEARCH_OPERATIONS = ['search_by_value', 'search_by_hash', 'sql', 'search_by_conditions'];
|
|
20
|
+
const VALID_EXPORT_FORMATS = ['json', 'csv'];
|
|
21
|
+
const JSON_TEXT = 'json';
|
|
22
|
+
const CSV = 'csv';
|
|
23
|
+
const LOCAL_JSON_EXPORT_MSG = 'Successfully exported JSON locally.';
|
|
24
|
+
const LOCAL_CSV_EXPORT_MSG = 'Successfully exported CSV locally.';
|
|
25
|
+
// Size is number of records
|
|
26
|
+
const S3_JSON_EXPORT_CHUNK_SIZE = 1000;
|
|
27
|
+
|
|
28
|
+
// Promisified function
|
|
29
|
+
const pSearchByHash = search.searchByHash;
|
|
30
|
+
const pSearchByValue = search.searchByValue;
|
|
31
|
+
const streamFinished = promisify(stream.finished);
|
|
32
|
+
|
|
33
|
+
module.exports = {
|
|
34
|
+
export_to_s3,
|
|
35
|
+
export_local,
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Allows for exporting and saving to a file system the receiving system has access to
|
|
40
|
+
*
|
|
41
|
+
* @param exportObject
|
|
42
|
+
*/
|
|
43
|
+
async function export_local(exportObject) {
|
|
44
|
+
hdbLogger.trace(
|
|
45
|
+
`export_local request to path: ${exportObject.path}, filename: ${exportObject.filename}, format: ${exportObject.format}`
|
|
46
|
+
);
|
|
47
|
+
let errorMessage = exportCoreValidation(exportObject);
|
|
48
|
+
if (!hdbUtils.isEmpty(errorMessage)) {
|
|
49
|
+
hdbLogger.error(errorMessage);
|
|
50
|
+
throw handleHDBError(new Error(), errorMessage, HTTP_STATUS_CODES.BAD_REQUEST, undefined, undefined, true);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
if (hdbUtils.isEmpty(exportObject.path)) {
|
|
54
|
+
hdbLogger.error(HDB_ERROR_MSGS.MISSING_VALUE('path'));
|
|
55
|
+
throw handleHDBError(
|
|
56
|
+
new Error(),
|
|
57
|
+
HDB_ERROR_MSGS.MISSING_VALUE('path'),
|
|
58
|
+
HTTP_STATUS_CODES.BAD_REQUEST,
|
|
59
|
+
undefined,
|
|
60
|
+
undefined,
|
|
61
|
+
true
|
|
62
|
+
);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
//we will allow for a missing filename and autogen one based on the epoch
|
|
66
|
+
let filename =
|
|
67
|
+
(hdbUtils.isEmpty(exportObject.filename) ? new Date().getTime() : exportObject.filename) +
|
|
68
|
+
'.' +
|
|
69
|
+
exportObject.format;
|
|
70
|
+
|
|
71
|
+
if (exportObject.path.endsWith(path.sep)) {
|
|
72
|
+
exportObject.path = exportObject.path.substring(0, exportObject.path.length - 1);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
let filePath = hdbUtils.buildFolderPath(exportObject.path, filename);
|
|
76
|
+
await confirmPath(exportObject.path);
|
|
77
|
+
let records = await getRecords(exportObject);
|
|
78
|
+
return await saveToLocal(filePath, exportObject.format, records);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* stats the path sent in to verify the path exists, the user has access & the path is a directory
|
|
83
|
+
* @param directoryPath
|
|
84
|
+
*/
|
|
85
|
+
async function confirmPath(directoryPath) {
|
|
86
|
+
hdbLogger.trace('in confirmPath');
|
|
87
|
+
if (hdbUtils.isEmptyOrZeroLength(directoryPath)) {
|
|
88
|
+
throw handleHDBError(
|
|
89
|
+
new Error(),
|
|
90
|
+
`Invalid path: ${directoryPath}`,
|
|
91
|
+
HTTP_STATUS_CODES.BAD_REQUEST,
|
|
92
|
+
undefined,
|
|
93
|
+
undefined,
|
|
94
|
+
true
|
|
95
|
+
);
|
|
96
|
+
}
|
|
97
|
+
let stats = undefined;
|
|
98
|
+
try {
|
|
99
|
+
stats = await fs.stat(directoryPath);
|
|
100
|
+
} catch (err) {
|
|
101
|
+
let errorMessage;
|
|
102
|
+
if (err.code === 'ENOENT') {
|
|
103
|
+
errorMessage = `path '${directoryPath}' does not exist`;
|
|
104
|
+
} else if (err.code === 'EACCES') {
|
|
105
|
+
errorMessage = `access to path '${directoryPath}' is denied`;
|
|
106
|
+
} else {
|
|
107
|
+
errorMessage = err.message;
|
|
108
|
+
}
|
|
109
|
+
hdbLogger.error(errorMessage);
|
|
110
|
+
throw handleHDBError(new Error(), errorMessage, HTTP_STATUS_CODES.BAD_REQUEST, undefined, undefined, true);
|
|
111
|
+
}
|
|
112
|
+
if (!stats.isDirectory()) {
|
|
113
|
+
let err = `path '${directoryPath}' is not a directory, please supply a valid folder path`;
|
|
114
|
+
hdbLogger.error(err);
|
|
115
|
+
throw handleHDBError(new Error(), err, HTTP_STATUS_CODES.BAD_REQUEST, undefined, undefined, true);
|
|
116
|
+
}
|
|
117
|
+
return true;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* takes the data and saves it to the file system
|
|
122
|
+
* @param filePath
|
|
123
|
+
* @param sourceDataFormat
|
|
124
|
+
* @param data
|
|
125
|
+
*/
|
|
126
|
+
async function saveToLocal(filePath, sourceDataFormat, data) {
|
|
127
|
+
hdbLogger.trace('in saveToLocal');
|
|
128
|
+
if (hdbCommon.isEmptyOrZeroLength(filePath)) {
|
|
129
|
+
throw handleHDBError(
|
|
130
|
+
new Error(),
|
|
131
|
+
HDB_ERROR_MSGS.INVALID_VALUE('file_path'),
|
|
132
|
+
HTTP_STATUS_CODES.BAD_REQUEST,
|
|
133
|
+
undefined,
|
|
134
|
+
undefined,
|
|
135
|
+
true
|
|
136
|
+
);
|
|
137
|
+
}
|
|
138
|
+
if (hdbCommon.isEmptyOrZeroLength(sourceDataFormat)) {
|
|
139
|
+
throw handleHDBError(
|
|
140
|
+
new Error(),
|
|
141
|
+
HDB_ERROR_MSGS.INVALID_VALUE('Source format'),
|
|
142
|
+
HTTP_STATUS_CODES.BAD_REQUEST,
|
|
143
|
+
undefined,
|
|
144
|
+
undefined,
|
|
145
|
+
true
|
|
146
|
+
);
|
|
147
|
+
}
|
|
148
|
+
if (hdbCommon.isEmpty(data)) {
|
|
149
|
+
throw handleHDBError(
|
|
150
|
+
new Error(),
|
|
151
|
+
HDB_ERROR_MSGS.NOT_FOUND('Data'),
|
|
152
|
+
HTTP_STATUS_CODES.BAD_REQUEST,
|
|
153
|
+
undefined,
|
|
154
|
+
undefined,
|
|
155
|
+
true
|
|
156
|
+
);
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
if (sourceDataFormat === JSON_TEXT) {
|
|
160
|
+
// Create a write stream to the local export file.
|
|
161
|
+
let writeStream = fs.createWriteStream(filePath);
|
|
162
|
+
streamAsJSON(data).pipe(writeStream);
|
|
163
|
+
// Wait until done. Throws if there are errors.
|
|
164
|
+
await streamFinished(writeStream);
|
|
165
|
+
|
|
166
|
+
return {
|
|
167
|
+
message: LOCAL_JSON_EXPORT_MSG,
|
|
168
|
+
path: filePath,
|
|
169
|
+
};
|
|
170
|
+
} else if (sourceDataFormat === CSV) {
|
|
171
|
+
// Create a write stream to the local export file.
|
|
172
|
+
let writeStream = fs.createWriteStream(filePath);
|
|
173
|
+
// Create a read stream with the data.
|
|
174
|
+
let readableStream = stream.Readable.from(data);
|
|
175
|
+
let options = {};
|
|
176
|
+
const columns = data.getColumns?.();
|
|
177
|
+
if (columns)
|
|
178
|
+
options.fields = columns.map((column) => ({
|
|
179
|
+
label: column,
|
|
180
|
+
value: column,
|
|
181
|
+
}));
|
|
182
|
+
let transformOptions = { objectMode: true };
|
|
183
|
+
// Initialize json2csv parser
|
|
184
|
+
let asyncParser = new AsyncParser(options, transformOptions);
|
|
185
|
+
let parsingProcessor = asyncParser.fromInput(readableStream).toOutput(writeStream);
|
|
186
|
+
await parsingProcessor.promise(false);
|
|
187
|
+
|
|
188
|
+
return {
|
|
189
|
+
message: LOCAL_CSV_EXPORT_MSG,
|
|
190
|
+
path: filePath,
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
throw handleHDBError(new Error(), HDB_ERROR_MSGS.INVALID_VALUE('format'), HTTP_STATUS_CODES.BAD_REQUEST);
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
/**
|
|
198
|
+
*allows for exporting a result to s3
|
|
199
|
+
* @param exportObject
|
|
200
|
+
* @returns {*}
|
|
201
|
+
*/
|
|
202
|
+
async function export_to_s3(exportObject) {
|
|
203
|
+
if (!exportObject.s3 || Object.keys(exportObject.s3).length === 0) {
|
|
204
|
+
throw handleHDBError(new Error(), HDB_ERROR_MSGS.MISSING_VALUE('S3 object'), HTTP_STATUS_CODES.BAD_REQUEST);
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
if (hdbUtils.isEmptyOrZeroLength(exportObject.s3.aws_access_key_id)) {
|
|
208
|
+
throw handleHDBError(new Error(), HDB_ERROR_MSGS.MISSING_VALUE('aws_access_key_id'), HTTP_STATUS_CODES.BAD_REQUEST);
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
if (hdbUtils.isEmptyOrZeroLength(exportObject.s3.aws_secret_access_key)) {
|
|
212
|
+
throw handleHDBError(
|
|
213
|
+
new Error(),
|
|
214
|
+
HDB_ERROR_MSGS.MISSING_VALUE('aws_secret_access_key'),
|
|
215
|
+
HTTP_STATUS_CODES.BAD_REQUEST
|
|
216
|
+
);
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
if (hdbUtils.isEmptyOrZeroLength(exportObject.s3.bucket)) {
|
|
220
|
+
throw handleHDBError(new Error(), HDB_ERROR_MSGS.MISSING_VALUE('bucket'), HTTP_STATUS_CODES.BAD_REQUEST);
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
if (hdbUtils.isEmptyOrZeroLength(exportObject.s3.key)) {
|
|
224
|
+
throw handleHDBError(new Error(), HDB_ERROR_MSGS.MISSING_VALUE('key'), HTTP_STATUS_CODES.BAD_REQUEST);
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
if (hdbUtils.isEmptyOrZeroLength(exportObject.s3.region)) {
|
|
228
|
+
throw handleHDBError(new Error(), HDB_ERROR_MSGS.MISSING_VALUE('region'), HTTP_STATUS_CODES.BAD_REQUEST);
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
let errorMessage = exportCoreValidation(exportObject);
|
|
232
|
+
if (!hdbUtils.isEmpty(errorMessage)) {
|
|
233
|
+
throw handleHDBError(new Error(), errorMessage, HTTP_STATUS_CODES.BAD_REQUEST);
|
|
234
|
+
}
|
|
235
|
+
hdbLogger.trace(
|
|
236
|
+
`called export_to_s3 to bucket: ${exportObject.s3.bucket} and query ${exportObject.search_operation.sql}`
|
|
237
|
+
);
|
|
238
|
+
|
|
239
|
+
let data;
|
|
240
|
+
try {
|
|
241
|
+
data = await getRecords(exportObject);
|
|
242
|
+
} catch (err) {
|
|
243
|
+
hdbLogger.error(err);
|
|
244
|
+
throw err;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
let s3 = await AWSConnector.getS3AuthObj(
|
|
248
|
+
exportObject.s3.aws_access_key_id,
|
|
249
|
+
exportObject.s3.aws_secret_access_key,
|
|
250
|
+
exportObject.s3.region
|
|
251
|
+
);
|
|
252
|
+
let s3Name;
|
|
253
|
+
let passThrough = new stream.PassThrough();
|
|
254
|
+
|
|
255
|
+
if (exportObject.format === CSV) {
|
|
256
|
+
s3Name = exportObject.s3.key + '.csv';
|
|
257
|
+
// Create a read stream with the data.
|
|
258
|
+
|
|
259
|
+
// Create a json2csv stream transform.
|
|
260
|
+
const csvStream = toCsvStream(data, data.getColumns?.());
|
|
261
|
+
csvStream.on('error', (err) => {
|
|
262
|
+
throw err;
|
|
263
|
+
});
|
|
264
|
+
// Pipe the data read stream through json2csv which converts it and then pipes it to a pass through which sends it to S3 upload method.
|
|
265
|
+
csvStream.pipe(passThrough);
|
|
266
|
+
} else if (exportObject.format === JSON_TEXT) {
|
|
267
|
+
s3Name = exportObject.s3.key + '.json';
|
|
268
|
+
// Initialize an empty read stream.
|
|
269
|
+
const readableStream = new stream.Readable();
|
|
270
|
+
// Pipe the read stream to a pass through, this is what sends it to the S3 upload method.
|
|
271
|
+
readableStream.pipe(passThrough);
|
|
272
|
+
readableStream.on('error', (err) => {
|
|
273
|
+
throw err;
|
|
274
|
+
});
|
|
275
|
+
// Use push to add data into the read stream queue.
|
|
276
|
+
readableStream.push('[');
|
|
277
|
+
let dataLength = data.length;
|
|
278
|
+
let chunk = '';
|
|
279
|
+
// Loop through the data and build chunks to push to the read stream.
|
|
280
|
+
for (const [index, record] of data.entries()) {
|
|
281
|
+
let stringChunk = index === dataLength - 1 ? JSON.stringify(record) : JSON.stringify(record) + ',';
|
|
282
|
+
chunk += stringChunk;
|
|
283
|
+
|
|
284
|
+
if (index !== 0 && index % S3_JSON_EXPORT_CHUNK_SIZE === 0) {
|
|
285
|
+
// Use push to add data into the read stream queue.
|
|
286
|
+
readableStream.push(chunk);
|
|
287
|
+
// Once the chunk has been pushed we no longer need that data. Clear it out for the next lot.
|
|
288
|
+
chunk = '';
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
// If the loop is finished and there are still items in the chunk var push it to stream.
|
|
293
|
+
if (chunk.length !== 0) {
|
|
294
|
+
readableStream.push(chunk);
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
readableStream.push(']');
|
|
298
|
+
// Done writing data
|
|
299
|
+
readableStream.push(null);
|
|
300
|
+
} else {
|
|
301
|
+
throw handleHDBError(new Error(), HDB_ERROR_MSGS.INVALID_VALUE('format'), HTTP_STATUS_CODES.BAD_REQUEST);
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
// Multipart upload to S3
|
|
305
|
+
// https://github.com/aws/aws-sdk-js-v3/tree/main/lib/lib-storage
|
|
306
|
+
const parallelUpload = new Upload({
|
|
307
|
+
client: s3,
|
|
308
|
+
params: { Bucket: exportObject.s3.bucket, Key: s3Name, Body: passThrough },
|
|
309
|
+
});
|
|
310
|
+
return parallelUpload.done();
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
/**
|
|
314
|
+
* handles the core validation of the exportObject variable
|
|
315
|
+
* @param exportObject
|
|
316
|
+
* @returns {string}
|
|
317
|
+
*/
|
|
318
|
+
function exportCoreValidation(exportObject) {
|
|
319
|
+
hdbLogger.trace('in exportCoreValidation');
|
|
320
|
+
if (hdbUtils.isEmpty(exportObject.format)) {
|
|
321
|
+
return 'format missing';
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
if (VALID_EXPORT_FORMATS.indexOf(exportObject.format) < 0) {
|
|
325
|
+
return `format invalid. must be one of the following values: ${VALID_EXPORT_FORMATS.join(', ')}`;
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
let searchOperation = exportObject.search_operation.operation;
|
|
329
|
+
if (hdbUtils.isEmpty(searchOperation)) {
|
|
330
|
+
return 'search_operation.operation missing';
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
if (VALID_SEARCH_OPERATIONS.indexOf(searchOperation) < 0) {
|
|
334
|
+
return `search_operation.operation must be one of the following values: ${VALID_SEARCH_OPERATIONS.join(', ')}`;
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
let pSql;
|
|
339
|
+
/**
|
|
340
|
+
* determines which search operation to perform and executes it.
|
|
341
|
+
* @param exportObject
|
|
342
|
+
*/
|
|
343
|
+
async function getRecords(exportObject) {
|
|
344
|
+
hdbLogger.trace('in getRecords');
|
|
345
|
+
let operation;
|
|
346
|
+
let errMsg = undefined;
|
|
347
|
+
if (
|
|
348
|
+
hdbCommon.isEmpty(exportObject.search_operation) ||
|
|
349
|
+
hdbCommon.isEmptyOrZeroLength(exportObject.search_operation.operation)
|
|
350
|
+
) {
|
|
351
|
+
throw handleHDBError(new Error(), HDB_ERROR_MSGS.INVALID_VALUE('Search operation'), HTTP_STATUS_CODES.BAD_REQUEST);
|
|
352
|
+
}
|
|
353
|
+
switch (exportObject.search_operation.operation) {
|
|
354
|
+
case 'search_by_value':
|
|
355
|
+
operation = pSearchByValue;
|
|
356
|
+
break;
|
|
357
|
+
case 'search_by_hash':
|
|
358
|
+
operation = pSearchByHash;
|
|
359
|
+
break;
|
|
360
|
+
case 'search_by_conditions':
|
|
361
|
+
operation = search.searchByConditions;
|
|
362
|
+
break;
|
|
363
|
+
case 'sql': {
|
|
364
|
+
if (!pSql) {
|
|
365
|
+
const sql = require('../sqlTranslator/index.js');
|
|
366
|
+
pSql = promisify(sql.evaluateSQL);
|
|
367
|
+
}
|
|
368
|
+
operation = pSql;
|
|
369
|
+
break;
|
|
370
|
+
}
|
|
371
|
+
default:
|
|
372
|
+
errMsg = `Operation ${exportObject.search_operation.operation} is not support by export.`;
|
|
373
|
+
hdbLogger.error(errMsg);
|
|
374
|
+
throw handleHDBError(new Error(), errMsg, HTTP_STATUS_CODES.BAD_REQUEST);
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
//in order to validate the search function and invoke permissions we need to add the hdb_user to the searchOperation
|
|
378
|
+
exportObject.search_operation.hdb_user = exportObject.hdb_user;
|
|
379
|
+
|
|
380
|
+
return operation(exportObject.search_operation);
|
|
381
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const harperBridge = require('./harperBridge/harperBridge.js');
|
|
4
|
+
// eslint-disable-next-line no-unused-vars
|
|
5
|
+
const GetBackupObject = require('./GetBackupObject.js');
|
|
6
|
+
const hdbUtils = require('../utility/common_utils.js');
|
|
7
|
+
const hdbTerms = require('../utility/hdbTerms.ts');
|
|
8
|
+
const { handleHDBError, hdbErrors } = require('../utility/errors/hdbError.js');
|
|
9
|
+
const { HDB_ERROR_MSGS, HTTP_STATUS_CODES } = hdbErrors;
|
|
10
|
+
|
|
11
|
+
module.exports = getBackup;
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
*
|
|
15
|
+
* @param {GetBackupObject} getBackupObject
|
|
16
|
+
* @returns {Promise<void>}
|
|
17
|
+
*/
|
|
18
|
+
async function getBackup(getBackupObject) {
|
|
19
|
+
if (hdbUtils.isEmpty(getBackupObject.schema)) {
|
|
20
|
+
throw new Error(HDB_ERROR_MSGS.SCHEMA_REQUIRED_ERR);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
if (hdbUtils.isEmpty(getBackupObject.table)) {
|
|
24
|
+
throw new Error(HDB_ERROR_MSGS.TABLE_REQUIRED_ERR);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const invalidSchemaTableMsg = hdbUtils.checkSchemaTableExist(getBackupObject.schema, getBackupObject.table);
|
|
28
|
+
if (invalidSchemaTableMsg) {
|
|
29
|
+
throw handleHDBError(
|
|
30
|
+
new Error(),
|
|
31
|
+
invalidSchemaTableMsg,
|
|
32
|
+
HTTP_STATUS_CODES.NOT_FOUND,
|
|
33
|
+
hdbTerms.LOG_LEVELS.ERROR,
|
|
34
|
+
invalidSchemaTableMsg,
|
|
35
|
+
true
|
|
36
|
+
);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
return harperBridge.getBackup(getBackupObject);
|
|
40
|
+
}
|