@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.
Files changed (444) hide show
  1. package/bin/BinObjects.js +17 -0
  2. package/bin/cliOperations.js +157 -0
  3. package/bin/copyDb.ts +280 -0
  4. package/bin/harper.js +156 -0
  5. package/bin/install.js +15 -0
  6. package/bin/lite.js +5 -0
  7. package/bin/restart.js +201 -0
  8. package/bin/run.js +409 -0
  9. package/bin/status.js +65 -0
  10. package/bin/stop.js +22 -0
  11. package/bin/upgrade.js +134 -0
  12. package/components/Application.ts +646 -0
  13. package/components/ApplicationScope.ts +49 -0
  14. package/components/Component.ts +53 -0
  15. package/components/ComponentV1.ts +342 -0
  16. package/components/DEFAULT_CONFIG.ts +18 -0
  17. package/components/EntryHandler.ts +227 -0
  18. package/components/Logger.ts +14 -0
  19. package/components/OptionsWatcher.ts +354 -0
  20. package/components/PluginModule.ts +6 -0
  21. package/components/Scope.ts +329 -0
  22. package/components/componentLoader.ts +529 -0
  23. package/components/deriveCommonPatternBase.ts +31 -0
  24. package/components/deriveGlobOptions.ts +44 -0
  25. package/components/deriveURLPath.ts +57 -0
  26. package/components/operations.js +658 -0
  27. package/components/operationsValidation.js +246 -0
  28. package/components/packageComponent.ts +39 -0
  29. package/components/requestRestart.ts +26 -0
  30. package/components/resolveBaseURLPath.ts +38 -0
  31. package/components/status/ComponentStatus.ts +110 -0
  32. package/components/status/ComponentStatusRegistry.ts +251 -0
  33. package/components/status/api.ts +153 -0
  34. package/components/status/crossThread.ts +405 -0
  35. package/components/status/errors.ts +152 -0
  36. package/components/status/index.ts +44 -0
  37. package/components/status/internal.ts +65 -0
  38. package/components/status/registry.ts +12 -0
  39. package/components/status/types.ts +96 -0
  40. package/config/RootConfigWatcher.ts +59 -0
  41. package/config/configHelpers.ts +11 -0
  42. package/config/configUtils.js +967 -0
  43. package/config/harperConfigEnvVars.ts +641 -0
  44. package/dataLayer/CreateAttributeObject.js +25 -0
  45. package/dataLayer/CreateTableObject.js +11 -0
  46. package/dataLayer/DataLayerObjects.js +43 -0
  47. package/dataLayer/DeleteBeforeObject.js +22 -0
  48. package/dataLayer/DeleteObject.js +25 -0
  49. package/dataLayer/DropAttributeObject.js +11 -0
  50. package/dataLayer/GetBackupObject.js +22 -0
  51. package/dataLayer/InsertObject.js +24 -0
  52. package/dataLayer/ReadAuditLogObject.js +24 -0
  53. package/dataLayer/SQLSearch.js +1335 -0
  54. package/dataLayer/SearchByConditionsObject.js +61 -0
  55. package/dataLayer/SearchByHashObject.js +21 -0
  56. package/dataLayer/SearchObject.js +45 -0
  57. package/dataLayer/SqlSearchObject.js +14 -0
  58. package/dataLayer/UpdateObject.js +23 -0
  59. package/dataLayer/UpsertObject.js +23 -0
  60. package/dataLayer/bulkLoad.js +813 -0
  61. package/dataLayer/dataObjects/BulkLoadObjects.js +27 -0
  62. package/dataLayer/dataObjects/UpsertObject.js +23 -0
  63. package/dataLayer/delete.js +164 -0
  64. package/dataLayer/export.js +381 -0
  65. package/dataLayer/getBackup.js +40 -0
  66. package/dataLayer/harperBridge/BridgeMethods.js +81 -0
  67. package/dataLayer/harperBridge/ResourceBridge.ts +633 -0
  68. package/dataLayer/harperBridge/bridgeUtility/insertUpdateReturnObj.js +28 -0
  69. package/dataLayer/harperBridge/bridgeUtility/insertUpdateValidate.js +88 -0
  70. package/dataLayer/harperBridge/harperBridge.js +21 -0
  71. package/dataLayer/harperBridge/lmdbBridge/LMDBBridge.js +119 -0
  72. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/DeleteAuditLogsBeforeResults.js +19 -0
  73. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateAttribute.js +112 -0
  74. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateRecords.js +67 -0
  75. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateSchema.js +31 -0
  76. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateTable.js +94 -0
  77. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDeleteAuditLogsBefore.js +98 -0
  78. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDeleteRecords.js +89 -0
  79. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDropAttribute.js +109 -0
  80. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDropSchema.js +107 -0
  81. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDropTable.js +137 -0
  82. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbFlush.js +35 -0
  83. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbGetBackup.js +111 -0
  84. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbGetDataByHash.js +28 -0
  85. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbGetDataByValue.js +29 -0
  86. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbReadAuditLog.js +207 -0
  87. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbSearchByConditions.js +156 -0
  88. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbSearchByHash.js +21 -0
  89. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbSearchByValue.js +30 -0
  90. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbTransaction.js +19 -0
  91. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbUpdateRecords.js +64 -0
  92. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbUpsertRecords.js +70 -0
  93. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBCreateAttributeObject.js +22 -0
  94. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBDeleteTransactionObject.js +23 -0
  95. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBInsertTransactionObject.js +22 -0
  96. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBTransactionObject.js +23 -0
  97. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBUpdateTransactionObject.js +24 -0
  98. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBUpsertTransactionObject.js +24 -0
  99. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/TableSizeObject.js +25 -0
  100. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/initializeHashSearch.js +21 -0
  101. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/initializePaths.js +157 -0
  102. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbCheckForNewAttributes.js +94 -0
  103. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbCreateTransactionsAuditEnvironment.js +39 -0
  104. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbGetTableSize.js +34 -0
  105. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbProcessRows.js +100 -0
  106. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbSearch.js +371 -0
  107. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbWriteTransaction.js +109 -0
  108. package/dataLayer/hdbInfoController.js +254 -0
  109. package/dataLayer/insert.js +266 -0
  110. package/dataLayer/readAuditLog.js +59 -0
  111. package/dataLayer/schema.js +366 -0
  112. package/dataLayer/schemaDescribe.js +289 -0
  113. package/dataLayer/search.js +60 -0
  114. package/dataLayer/transaction.js +17 -0
  115. package/dataLayer/update.js +124 -0
  116. package/dist/components/Logger.d.ts +12 -0
  117. package/dist/components/Logger.js +3 -0
  118. package/dist/components/Logger.js.map +1 -0
  119. package/dist/components/Scope.d.ts +14 -4
  120. package/dist/components/Scope.js +18 -10
  121. package/dist/components/Scope.js.map +1 -1
  122. package/dist/components/componentLoader.js +16 -9
  123. package/dist/components/componentLoader.js.map +1 -1
  124. package/dist/components/operations.js +2 -2
  125. package/dist/components/operations.js.map +1 -1
  126. package/dist/config/configUtils.d.ts +1 -1
  127. package/dist/config/configUtils.js +1 -1
  128. package/dist/config/configUtils.js.map +1 -1
  129. package/dist/dataLayer/CreateTableObject.d.ts +2 -2
  130. package/dist/dataLayer/CreateTableObject.js +2 -2
  131. package/dist/dataLayer/CreateTableObject.js.map +1 -1
  132. package/dist/dataLayer/delete.d.ts +1 -1
  133. package/dist/dataLayer/schema.js +6 -5
  134. package/dist/dataLayer/schema.js.map +1 -1
  135. package/dist/dataLayer/schemaDescribe.js +1 -1
  136. package/dist/dataLayer/schemaDescribe.js.map +1 -1
  137. package/dist/index.d.ts +1 -1
  138. package/dist/index.js +2 -0
  139. package/dist/index.js.map +1 -1
  140. package/dist/resources/DatabaseTransaction.d.ts +1 -1
  141. package/dist/resources/IterableEventQueue.d.ts +1 -1
  142. package/dist/resources/LMDBTransaction.d.ts +5 -1
  143. package/dist/resources/Resource.d.ts +1 -1
  144. package/dist/resources/RocksIndexStore.d.ts +3 -3
  145. package/dist/resources/RocksTransactionLogStore.d.ts +6 -3
  146. package/dist/resources/Table.d.ts +15 -6
  147. package/dist/resources/Table.js +4 -1
  148. package/dist/resources/Table.js.map +1 -1
  149. package/dist/resources/analytics/read.js +32 -22
  150. package/dist/resources/analytics/read.js.map +1 -1
  151. package/dist/resources/analytics/write.js +3 -6
  152. package/dist/resources/analytics/write.js.map +1 -1
  153. package/dist/resources/auditStore.d.ts +3 -3
  154. package/dist/resources/blob.d.ts +25 -2
  155. package/dist/resources/databases.d.ts +12 -2
  156. package/dist/resources/databases.js +22 -19
  157. package/dist/resources/databases.js.map +1 -1
  158. package/dist/resources/search.js +11 -5
  159. package/dist/resources/search.js.map +1 -1
  160. package/dist/resources/transaction.d.ts +2 -1
  161. package/dist/security/auth.js +1 -1
  162. package/dist/security/auth.js.map +1 -1
  163. package/dist/security/cryptoHash.d.ts +2 -2
  164. package/dist/security/jsLoader.js +243 -66
  165. package/dist/security/jsLoader.js.map +1 -1
  166. package/dist/security/keys.js +4 -5
  167. package/dist/security/keys.js.map +1 -1
  168. package/dist/security/user.js +3 -3
  169. package/dist/security/user.js.map +1 -1
  170. package/dist/server/REST.js +16 -2
  171. package/dist/server/REST.js.map +1 -1
  172. package/dist/server/Server.d.ts +2 -1
  173. package/dist/server/Server.js.map +1 -1
  174. package/dist/server/fastifyRoutes/plugins/hdbCore.d.ts +6 -1
  175. package/dist/server/fastifyRoutes.js +2 -0
  176. package/dist/server/fastifyRoutes.js.map +1 -1
  177. package/dist/server/http.js +12 -6
  178. package/dist/server/http.js.map +1 -1
  179. package/dist/server/jobs/JobObject.d.ts +3 -3
  180. package/dist/server/loadRootComponents.js +1 -0
  181. package/dist/server/loadRootComponents.js.map +1 -1
  182. package/dist/server/operationsServer.js +3 -1
  183. package/dist/server/operationsServer.js.map +1 -1
  184. package/dist/server/serverHelpers/JSONStream.d.ts +3 -3
  185. package/dist/server/serverHelpers/Request.d.ts +5 -5
  186. package/dist/server/serverHelpers/requestTimePlugin.d.ts +1 -1
  187. package/dist/server/threads/manageThreads.d.ts +2 -2
  188. package/dist/server/threads/manageThreads.js +50 -35
  189. package/dist/server/threads/manageThreads.js.map +1 -1
  190. package/dist/server/threads/socketRouter.d.ts +1 -1
  191. package/dist/sqlTranslator/deleteTranslator.d.ts +1 -1
  192. package/dist/utility/AWS/AWSConnector.d.ts +3 -2
  193. package/dist/utility/common_utils.d.ts +3 -3
  194. package/dist/utility/environment/systemInformation.d.ts +1 -0
  195. package/dist/utility/functions/date/dateFunctions.d.ts +11 -11
  196. package/dist/utility/globalSchema.d.ts +1 -1
  197. package/dist/utility/hdbTerms.d.ts +3 -0
  198. package/dist/utility/hdbTerms.js +3 -0
  199. package/dist/utility/hdbTerms.js.map +1 -1
  200. package/dist/utility/installation.d.ts +2 -4
  201. package/dist/utility/installation.js.map +1 -1
  202. package/dist/utility/lmdb/commonUtility.d.ts +1 -0
  203. package/dist/utility/lmdb/deleteUtility.d.ts +1 -0
  204. package/dist/utility/lmdb/environmentUtility.d.ts +1 -0
  205. package/dist/utility/lmdb/searchUtility.d.ts +2 -1
  206. package/dist/utility/lmdb/writeUtility.d.ts +1 -0
  207. package/dist/utility/logging/harper_logger.d.ts +6 -6
  208. package/dist/utility/processManagement/processManagement.d.ts +1 -1
  209. package/dist/utility/processManagement/servicesConfig.d.ts +12 -6
  210. package/dist/validation/common_validators.d.ts +4 -3
  211. package/dist/validation/configValidator.d.ts +3 -2
  212. package/index.d.ts +56 -0
  213. package/index.js +41 -0
  214. package/json/systemSchema.json +373 -0
  215. package/launchServiceScripts/launchHarperDB.js +3 -0
  216. package/launchServiceScripts/utility/checkNodeVersion.js +15 -0
  217. package/package.json +21 -3
  218. package/resources/DatabaseTransaction.ts +378 -0
  219. package/resources/ErrorResource.ts +57 -0
  220. package/resources/IterableEventQueue.ts +94 -0
  221. package/resources/LMDBTransaction.ts +349 -0
  222. package/resources/RecordEncoder.ts +702 -0
  223. package/resources/RequestTarget.ts +134 -0
  224. package/resources/Resource.ts +789 -0
  225. package/resources/ResourceInterface.ts +221 -0
  226. package/resources/ResourceInterfaceV2.ts +53 -0
  227. package/resources/ResourceV2.ts +67 -0
  228. package/resources/Resources.ts +162 -0
  229. package/resources/RocksIndexStore.ts +70 -0
  230. package/resources/RocksTransactionLogStore.ts +352 -0
  231. package/resources/Table.ts +4527 -0
  232. package/resources/analytics/hostnames.ts +72 -0
  233. package/resources/analytics/metadata.ts +10 -0
  234. package/resources/analytics/read.ts +252 -0
  235. package/resources/analytics/write.ts +803 -0
  236. package/resources/auditStore.ts +556 -0
  237. package/resources/blob.ts +1268 -0
  238. package/resources/crdt.ts +125 -0
  239. package/resources/dataLoader.ts +527 -0
  240. package/resources/databases.ts +1290 -0
  241. package/resources/graphql.ts +221 -0
  242. package/resources/indexes/HierarchicalNavigableSmallWorld.ts +638 -0
  243. package/resources/indexes/customIndexes.ts +7 -0
  244. package/resources/indexes/vector.ts +38 -0
  245. package/resources/jsResource.ts +86 -0
  246. package/resources/loadEnv.ts +22 -0
  247. package/resources/login.ts +18 -0
  248. package/resources/openApi.ts +409 -0
  249. package/resources/registrationDeprecated.ts +8 -0
  250. package/resources/replayLogs.ts +136 -0
  251. package/resources/roles.ts +98 -0
  252. package/resources/search.ts +1301 -0
  253. package/resources/tracked.ts +584 -0
  254. package/resources/transaction.ts +89 -0
  255. package/resources/transactionBroadcast.ts +258 -0
  256. package/security/auth.ts +376 -0
  257. package/security/certificateVerification/certificateVerificationSource.ts +84 -0
  258. package/security/certificateVerification/configValidation.ts +107 -0
  259. package/security/certificateVerification/crlVerification.ts +623 -0
  260. package/security/certificateVerification/index.ts +121 -0
  261. package/security/certificateVerification/ocspVerification.ts +148 -0
  262. package/security/certificateVerification/pkijs-ed25519-patch.ts +188 -0
  263. package/security/certificateVerification/types.ts +128 -0
  264. package/security/certificateVerification/verificationConfig.ts +138 -0
  265. package/security/certificateVerification/verificationUtils.ts +447 -0
  266. package/security/cryptoHash.js +42 -0
  267. package/security/data_objects/PermissionAttributeResponseObject.js +15 -0
  268. package/security/data_objects/PermissionResponseObject.js +115 -0
  269. package/security/data_objects/PermissionTableResponseObject.js +20 -0
  270. package/security/fastifyAuth.js +169 -0
  271. package/security/impersonation.ts +160 -0
  272. package/security/jsLoader.ts +716 -0
  273. package/security/keys.js +948 -0
  274. package/security/permissionsTranslator.js +300 -0
  275. package/security/role.js +218 -0
  276. package/security/tokenAuthentication.ts +228 -0
  277. package/security/user.ts +449 -0
  278. package/server/DurableSubscriptionsSession.ts +503 -0
  279. package/server/REST.ts +407 -0
  280. package/server/Server.ts +89 -0
  281. package/server/fastifyRoutes/helpers/getCORSOptions.js +36 -0
  282. package/server/fastifyRoutes/helpers/getHeaderTimeoutConfig.js +15 -0
  283. package/server/fastifyRoutes/helpers/getServerOptions.js +33 -0
  284. package/server/fastifyRoutes/plugins/hdbCore.js +39 -0
  285. package/server/fastifyRoutes.ts +205 -0
  286. package/server/graphqlQuerying.ts +700 -0
  287. package/server/http.ts +640 -0
  288. package/server/itc/serverHandlers.js +161 -0
  289. package/server/itc/utility/ITCEventObject.js +10 -0
  290. package/server/jobs/JobObject.js +24 -0
  291. package/server/jobs/jobProcess.js +69 -0
  292. package/server/jobs/jobRunner.js +162 -0
  293. package/server/jobs/jobs.js +304 -0
  294. package/server/loadRootComponents.js +44 -0
  295. package/server/mqtt.ts +485 -0
  296. package/server/nodeName.ts +75 -0
  297. package/server/operationsServer.ts +313 -0
  298. package/server/serverHelpers/Headers.ts +108 -0
  299. package/server/serverHelpers/JSONStream.ts +269 -0
  300. package/server/serverHelpers/OperationFunctionObject.ts +13 -0
  301. package/server/serverHelpers/Request.ts +158 -0
  302. package/server/serverHelpers/contentTypes.ts +637 -0
  303. package/server/serverHelpers/requestTimePlugin.js +57 -0
  304. package/server/serverHelpers/serverHandlers.js +148 -0
  305. package/server/serverHelpers/serverUtilities.ts +473 -0
  306. package/server/serverRegistry.ts +8 -0
  307. package/server/static.ts +187 -0
  308. package/server/status/definitions.ts +37 -0
  309. package/server/status/index.ts +125 -0
  310. package/server/storageReclamation.ts +93 -0
  311. package/server/threads/itc.js +89 -0
  312. package/server/threads/manageThreads.js +594 -0
  313. package/server/threads/socketRouter.ts +360 -0
  314. package/server/threads/threadServer.js +279 -0
  315. package/server/throttle.ts +73 -0
  316. package/sqlTranslator/SelectValidator.js +330 -0
  317. package/sqlTranslator/alasqlFunctionImporter.js +62 -0
  318. package/sqlTranslator/deleteTranslator.js +67 -0
  319. package/sqlTranslator/index.js +242 -0
  320. package/sqlTranslator/sql_statement_bucket.js +472 -0
  321. package/static/defaultConfig.yaml +3 -0
  322. package/studio/web/HDBDogOnly.svg +78 -0
  323. package/studio/web/assets/PPRadioGrotesk-Bold-DDaUYG8E.woff +0 -0
  324. package/studio/web/assets/fa-brands-400-CEJbCg16.woff +0 -0
  325. package/studio/web/assets/fa-brands-400-CSYNqBb_.ttf +0 -0
  326. package/studio/web/assets/fa-brands-400-DnkPfk3o.eot +0 -0
  327. package/studio/web/assets/fa-brands-400-UxlILjvJ.woff2 +0 -0
  328. package/studio/web/assets/fa-brands-400-cH1MgKbP.svg +3717 -0
  329. package/studio/web/assets/fa-regular-400-BhTwtT8w.eot +0 -0
  330. package/studio/web/assets/fa-regular-400-D1vz6WBx.ttf +0 -0
  331. package/studio/web/assets/fa-regular-400-DFnMcJPd.woff +0 -0
  332. package/studio/web/assets/fa-regular-400-DGzu1beS.woff2 +0 -0
  333. package/studio/web/assets/fa-regular-400-gwj8Pxq-.svg +801 -0
  334. package/studio/web/assets/fa-solid-900-B4ZZ7kfP.svg +5034 -0
  335. package/studio/web/assets/fa-solid-900-B6Axprfb.eot +0 -0
  336. package/studio/web/assets/fa-solid-900-BUswJgRo.woff2 +0 -0
  337. package/studio/web/assets/fa-solid-900-DOXgCApm.woff +0 -0
  338. package/studio/web/assets/fa-solid-900-mxuxnBEa.ttf +0 -0
  339. package/studio/web/assets/index-BTgXJX9d.js +235 -0
  340. package/studio/web/assets/index-BTgXJX9d.js.map +1 -0
  341. package/studio/web/assets/index-C-GXfcup.js +37 -0
  342. package/studio/web/assets/index-C-GXfcup.js.map +1 -0
  343. package/studio/web/assets/index-PFlNdimM.js +2 -0
  344. package/studio/web/assets/index-PFlNdimM.js.map +1 -0
  345. package/studio/web/assets/index-Y2g_iFpU.css +1 -0
  346. package/studio/web/assets/index-jiPwkrsB.css +1 -0
  347. package/studio/web/assets/index.lazy-C3TJZJ4o.js +266 -0
  348. package/studio/web/assets/index.lazy-C3TJZJ4o.js.map +1 -0
  349. package/studio/web/assets/profiler-DotzgiCJ.js +2 -0
  350. package/studio/web/assets/profiler-DotzgiCJ.js.map +1 -0
  351. package/studio/web/assets/react-redux-VxUEx_mU.js +6 -0
  352. package/studio/web/assets/react-redux-VxUEx_mU.js.map +1 -0
  353. package/studio/web/assets/startRecording-B_9J9Csd.js +3 -0
  354. package/studio/web/assets/startRecording-B_9J9Csd.js.map +1 -0
  355. package/studio/web/fabric-signup-background.webp +0 -0
  356. package/studio/web/fabric-signup-text.png +0 -0
  357. package/studio/web/favicon_purple.png +0 -0
  358. package/studio/web/github-icon.svg +15 -0
  359. package/studio/web/harper-fabric_black.png +0 -0
  360. package/studio/web/harper-fabric_white.png +0 -0
  361. package/studio/web/harper-studio_white.png +0 -0
  362. package/studio/web/index.html +16 -0
  363. package/studio/web/running.css +148 -0
  364. package/studio/web/running.html +147 -0
  365. package/studio/web/running.js +111 -0
  366. package/upgrade/UpgradeObjects.js +13 -0
  367. package/upgrade/directives/directivesController.js +90 -0
  368. package/upgrade/directivesManager.js +139 -0
  369. package/upgrade/upgradePrompt.js +124 -0
  370. package/upgrade/upgradeUtilities.js +28 -0
  371. package/utility/AWS/AWSConnector.js +29 -0
  372. package/utility/OperationFunctionCaller.js +63 -0
  373. package/utility/assignCmdEnvVariables.js +62 -0
  374. package/utility/common_utils.js +867 -0
  375. package/utility/environment/environmentManager.js +208 -0
  376. package/utility/environment/systemInformation.js +355 -0
  377. package/utility/errors/commonErrors.js +267 -0
  378. package/utility/errors/hdbError.js +146 -0
  379. package/utility/functions/date/dateFunctions.js +65 -0
  380. package/utility/functions/geo.js +355 -0
  381. package/utility/functions/sql/alaSQLExtension.js +104 -0
  382. package/utility/globalSchema.js +35 -0
  383. package/utility/hdbTerms.ts +819 -0
  384. package/utility/install/checkJWTTokensExist.js +62 -0
  385. package/utility/install/harperdb.conf +15 -0
  386. package/utility/install/harperdb.service +14 -0
  387. package/utility/install/installer.js +635 -0
  388. package/utility/installation.ts +30 -0
  389. package/utility/lmdb/DBIDefinition.js +20 -0
  390. package/utility/lmdb/DeleteRecordsResponseObject.js +25 -0
  391. package/utility/lmdb/InsertRecordsResponseObject.js +22 -0
  392. package/utility/lmdb/OpenDBIObject.js +31 -0
  393. package/utility/lmdb/OpenEnvironmentObject.js +41 -0
  394. package/utility/lmdb/UpdateRecordsResponseObject.js +25 -0
  395. package/utility/lmdb/UpsertRecordsResponseObject.js +22 -0
  396. package/utility/lmdb/cleanLMDBMap.js +65 -0
  397. package/utility/lmdb/commonUtility.js +119 -0
  398. package/utility/lmdb/deleteUtility.js +128 -0
  399. package/utility/lmdb/environmentUtility.js +477 -0
  400. package/utility/lmdb/searchCursorFunctions.js +187 -0
  401. package/utility/lmdb/searchUtility.js +918 -0
  402. package/utility/lmdb/terms.js +57 -0
  403. package/utility/lmdb/writeUtility.js +407 -0
  404. package/utility/logging/harper_logger.js +876 -0
  405. package/utility/logging/logRotator.js +157 -0
  406. package/utility/logging/logger.ts +24 -0
  407. package/utility/logging/readLog.js +355 -0
  408. package/utility/logging/transactionLog.js +57 -0
  409. package/utility/mount_hdb.js +59 -0
  410. package/utility/npmUtilities.js +102 -0
  411. package/utility/operationPermissions.ts +112 -0
  412. package/utility/operation_authorization.js +836 -0
  413. package/utility/packageUtils.js +55 -0
  414. package/utility/password.ts +99 -0
  415. package/utility/processManagement/processManagement.js +187 -0
  416. package/utility/processManagement/servicesConfig.js +56 -0
  417. package/utility/scripts/restartHdb.js +24 -0
  418. package/utility/scripts/user_data.sh +13 -0
  419. package/utility/signalling.js +36 -0
  420. package/utility/terms/certificates.js +81 -0
  421. package/utility/when.ts +20 -0
  422. package/v1.d.ts +39 -0
  423. package/v1.js +41 -0
  424. package/v2.d.ts +39 -0
  425. package/v2.js +41 -0
  426. package/validation/bulkDeleteValidator.js +24 -0
  427. package/validation/check_permissions.js +19 -0
  428. package/validation/common_validators.js +95 -0
  429. package/validation/configValidator.js +331 -0
  430. package/validation/deleteValidator.js +15 -0
  431. package/validation/fileLoadValidator.js +153 -0
  432. package/validation/insertValidator.js +40 -0
  433. package/validation/installValidator.js +37 -0
  434. package/validation/readLogValidator.js +64 -0
  435. package/validation/role_validation.js +320 -0
  436. package/validation/schemaMetadataValidator.js +42 -0
  437. package/validation/searchValidator.js +166 -0
  438. package/validation/statusValidator.ts +66 -0
  439. package/validation/transactionLogValidator.js +33 -0
  440. package/validation/user_validation.js +55 -0
  441. package/validation/validationWrapper.js +105 -0
  442. package/dist/resources/analytics/profile.d.ts +0 -2
  443. package/dist/resources/analytics/profile.js +0 -144
  444. 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
+ }