@harperfast/harper 5.0.0-alpha.10 → 5.0.0-beta.3

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 (446) 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/{resources/ResourceInterfaceV2.js → components/Logger.js} +1 -1
  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 +17 -10
  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/ResourceInterface.d.ts +1 -1
  145. package/dist/resources/RocksIndexStore.d.ts +3 -3
  146. package/dist/resources/RocksTransactionLogStore.d.ts +6 -3
  147. package/dist/resources/Table.d.ts +15 -6
  148. package/dist/resources/Table.js +12 -4
  149. package/dist/resources/Table.js.map +1 -1
  150. package/dist/resources/analytics/read.js +32 -22
  151. package/dist/resources/analytics/read.js.map +1 -1
  152. package/dist/resources/analytics/write.js +3 -6
  153. package/dist/resources/analytics/write.js.map +1 -1
  154. package/dist/resources/auditStore.d.ts +3 -3
  155. package/dist/resources/blob.d.ts +25 -2
  156. package/dist/resources/databases.d.ts +12 -2
  157. package/dist/resources/databases.js +22 -19
  158. package/dist/resources/databases.js.map +1 -1
  159. package/dist/resources/search.js +11 -5
  160. package/dist/resources/search.js.map +1 -1
  161. package/dist/resources/transaction.d.ts +2 -1
  162. package/dist/security/auth.js +1 -1
  163. package/dist/security/auth.js.map +1 -1
  164. package/dist/security/cryptoHash.d.ts +2 -2
  165. package/dist/security/jsLoader.js +265 -73
  166. package/dist/security/jsLoader.js.map +1 -1
  167. package/dist/security/keys.js +11 -12
  168. package/dist/security/keys.js.map +1 -1
  169. package/dist/security/user.js +3 -3
  170. package/dist/security/user.js.map +1 -1
  171. package/dist/server/REST.js +16 -2
  172. package/dist/server/REST.js.map +1 -1
  173. package/dist/server/Server.d.ts +2 -1
  174. package/dist/server/Server.js.map +1 -1
  175. package/dist/server/fastifyRoutes/plugins/hdbCore.d.ts +6 -1
  176. package/dist/server/fastifyRoutes.js +2 -0
  177. package/dist/server/fastifyRoutes.js.map +1 -1
  178. package/dist/server/http.js +12 -6
  179. package/dist/server/http.js.map +1 -1
  180. package/dist/server/jobs/JobObject.d.ts +3 -3
  181. package/dist/server/loadRootComponents.js +1 -0
  182. package/dist/server/loadRootComponents.js.map +1 -1
  183. package/dist/server/operationsServer.js +3 -1
  184. package/dist/server/operationsServer.js.map +1 -1
  185. package/dist/server/serverHelpers/JSONStream.d.ts +3 -3
  186. package/dist/server/serverHelpers/Request.d.ts +5 -5
  187. package/dist/server/serverHelpers/requestTimePlugin.d.ts +1 -1
  188. package/dist/server/threads/manageThreads.d.ts +2 -2
  189. package/dist/server/threads/manageThreads.js +52 -35
  190. package/dist/server/threads/manageThreads.js.map +1 -1
  191. package/dist/server/threads/socketRouter.d.ts +1 -1
  192. package/dist/sqlTranslator/deleteTranslator.d.ts +1 -1
  193. package/dist/utility/AWS/AWSConnector.d.ts +3 -2
  194. package/dist/utility/common_utils.d.ts +3 -3
  195. package/dist/utility/environment/systemInformation.d.ts +1 -0
  196. package/dist/utility/functions/date/dateFunctions.d.ts +11 -11
  197. package/dist/utility/globalSchema.d.ts +1 -1
  198. package/dist/utility/hdbTerms.d.ts +3 -0
  199. package/dist/utility/hdbTerms.js +3 -0
  200. package/dist/utility/hdbTerms.js.map +1 -1
  201. package/dist/utility/installation.d.ts +2 -4
  202. package/dist/utility/installation.js.map +1 -1
  203. package/dist/utility/lmdb/commonUtility.d.ts +2 -1
  204. package/dist/utility/lmdb/commonUtility.js +20 -13
  205. package/dist/utility/lmdb/commonUtility.js.map +1 -1
  206. package/dist/utility/lmdb/deleteUtility.d.ts +1 -0
  207. package/dist/utility/lmdb/environmentUtility.d.ts +1 -0
  208. package/dist/utility/lmdb/searchUtility.d.ts +2 -1
  209. package/dist/utility/lmdb/writeUtility.d.ts +1 -0
  210. package/dist/utility/logging/harper_logger.d.ts +6 -6
  211. package/dist/utility/processManagement/processManagement.d.ts +1 -1
  212. package/dist/utility/processManagement/servicesConfig.d.ts +12 -6
  213. package/dist/validation/common_validators.d.ts +4 -3
  214. package/dist/validation/configValidator.d.ts +3 -2
  215. package/index.d.ts +56 -0
  216. package/index.js +41 -0
  217. package/json/systemSchema.json +373 -0
  218. package/launchServiceScripts/launchHarperDB.js +3 -0
  219. package/launchServiceScripts/utility/checkNodeVersion.js +15 -0
  220. package/package.json +35 -16
  221. package/resources/DatabaseTransaction.ts +378 -0
  222. package/resources/ErrorResource.ts +57 -0
  223. package/resources/IterableEventQueue.ts +94 -0
  224. package/resources/LMDBTransaction.ts +349 -0
  225. package/resources/RecordEncoder.ts +702 -0
  226. package/resources/RequestTarget.ts +134 -0
  227. package/resources/Resource.ts +789 -0
  228. package/resources/ResourceInterface.ts +221 -0
  229. package/resources/Resources.ts +162 -0
  230. package/resources/RocksIndexStore.ts +70 -0
  231. package/resources/RocksTransactionLogStore.ts +352 -0
  232. package/resources/Table.ts +4531 -0
  233. package/resources/analytics/hostnames.ts +72 -0
  234. package/resources/analytics/metadata.ts +10 -0
  235. package/resources/analytics/read.ts +252 -0
  236. package/resources/analytics/write.ts +803 -0
  237. package/resources/auditStore.ts +556 -0
  238. package/resources/blob.ts +1268 -0
  239. package/resources/crdt.ts +125 -0
  240. package/resources/dataLoader.ts +527 -0
  241. package/resources/databases.ts +1290 -0
  242. package/resources/graphql.ts +221 -0
  243. package/resources/indexes/HierarchicalNavigableSmallWorld.ts +638 -0
  244. package/resources/indexes/customIndexes.ts +7 -0
  245. package/resources/indexes/vector.ts +38 -0
  246. package/resources/jsResource.ts +86 -0
  247. package/resources/loadEnv.ts +22 -0
  248. package/resources/login.ts +18 -0
  249. package/resources/openApi.ts +409 -0
  250. package/resources/registrationDeprecated.ts +8 -0
  251. package/resources/replayLogs.ts +136 -0
  252. package/resources/roles.ts +98 -0
  253. package/resources/search.ts +1301 -0
  254. package/resources/tracked.ts +584 -0
  255. package/resources/transaction.ts +89 -0
  256. package/resources/transactionBroadcast.ts +258 -0
  257. package/security/auth.ts +376 -0
  258. package/security/certificateVerification/certificateVerificationSource.ts +84 -0
  259. package/security/certificateVerification/configValidation.ts +107 -0
  260. package/security/certificateVerification/crlVerification.ts +623 -0
  261. package/security/certificateVerification/index.ts +121 -0
  262. package/security/certificateVerification/ocspVerification.ts +148 -0
  263. package/security/certificateVerification/pkijs-ed25519-patch.ts +188 -0
  264. package/security/certificateVerification/types.ts +128 -0
  265. package/security/certificateVerification/verificationConfig.ts +138 -0
  266. package/security/certificateVerification/verificationUtils.ts +447 -0
  267. package/security/cryptoHash.js +42 -0
  268. package/security/data_objects/PermissionAttributeResponseObject.js +15 -0
  269. package/security/data_objects/PermissionResponseObject.js +115 -0
  270. package/security/data_objects/PermissionTableResponseObject.js +20 -0
  271. package/security/fastifyAuth.js +169 -0
  272. package/security/impersonation.ts +160 -0
  273. package/security/jsLoader.ts +733 -0
  274. package/security/keys.js +948 -0
  275. package/security/permissionsTranslator.js +300 -0
  276. package/security/role.js +218 -0
  277. package/security/tokenAuthentication.ts +228 -0
  278. package/security/user.ts +449 -0
  279. package/server/DurableSubscriptionsSession.ts +503 -0
  280. package/server/REST.ts +407 -0
  281. package/server/Server.ts +89 -0
  282. package/server/fastifyRoutes/helpers/getCORSOptions.js +36 -0
  283. package/server/fastifyRoutes/helpers/getHeaderTimeoutConfig.js +15 -0
  284. package/server/fastifyRoutes/helpers/getServerOptions.js +33 -0
  285. package/server/fastifyRoutes/plugins/hdbCore.js +39 -0
  286. package/server/fastifyRoutes.ts +205 -0
  287. package/server/graphqlQuerying.ts +700 -0
  288. package/server/http.ts +640 -0
  289. package/server/itc/serverHandlers.js +161 -0
  290. package/server/itc/utility/ITCEventObject.js +10 -0
  291. package/server/jobs/JobObject.js +24 -0
  292. package/server/jobs/jobProcess.js +69 -0
  293. package/server/jobs/jobRunner.js +162 -0
  294. package/server/jobs/jobs.js +304 -0
  295. package/server/loadRootComponents.js +44 -0
  296. package/server/mqtt.ts +485 -0
  297. package/server/nodeName.ts +75 -0
  298. package/server/operationsServer.ts +313 -0
  299. package/server/serverHelpers/Headers.ts +108 -0
  300. package/server/serverHelpers/JSONStream.ts +269 -0
  301. package/server/serverHelpers/OperationFunctionObject.ts +13 -0
  302. package/server/serverHelpers/Request.ts +158 -0
  303. package/server/serverHelpers/contentTypes.ts +637 -0
  304. package/server/serverHelpers/requestTimePlugin.js +57 -0
  305. package/server/serverHelpers/serverHandlers.js +148 -0
  306. package/server/serverHelpers/serverUtilities.ts +473 -0
  307. package/server/serverRegistry.ts +8 -0
  308. package/server/static.ts +187 -0
  309. package/server/status/definitions.ts +37 -0
  310. package/server/status/index.ts +125 -0
  311. package/server/storageReclamation.ts +93 -0
  312. package/server/threads/itc.js +89 -0
  313. package/server/threads/manageThreads.js +596 -0
  314. package/server/threads/socketRouter.ts +360 -0
  315. package/server/threads/threadServer.js +279 -0
  316. package/server/throttle.ts +73 -0
  317. package/sqlTranslator/SelectValidator.js +330 -0
  318. package/sqlTranslator/alasqlFunctionImporter.js +62 -0
  319. package/sqlTranslator/deleteTranslator.js +67 -0
  320. package/sqlTranslator/index.js +242 -0
  321. package/sqlTranslator/sql_statement_bucket.js +472 -0
  322. package/static/defaultConfig.yaml +3 -0
  323. package/studio/web/HDBDogOnly.svg +78 -0
  324. package/studio/web/assets/PPRadioGrotesk-Bold-DDaUYG8E.woff +0 -0
  325. package/studio/web/assets/fa-brands-400-CEJbCg16.woff +0 -0
  326. package/studio/web/assets/fa-brands-400-CSYNqBb_.ttf +0 -0
  327. package/studio/web/assets/fa-brands-400-DnkPfk3o.eot +0 -0
  328. package/studio/web/assets/fa-brands-400-UxlILjvJ.woff2 +0 -0
  329. package/studio/web/assets/fa-brands-400-cH1MgKbP.svg +3717 -0
  330. package/studio/web/assets/fa-regular-400-BhTwtT8w.eot +0 -0
  331. package/studio/web/assets/fa-regular-400-D1vz6WBx.ttf +0 -0
  332. package/studio/web/assets/fa-regular-400-DFnMcJPd.woff +0 -0
  333. package/studio/web/assets/fa-regular-400-DGzu1beS.woff2 +0 -0
  334. package/studio/web/assets/fa-regular-400-gwj8Pxq-.svg +801 -0
  335. package/studio/web/assets/fa-solid-900-B4ZZ7kfP.svg +5034 -0
  336. package/studio/web/assets/fa-solid-900-B6Axprfb.eot +0 -0
  337. package/studio/web/assets/fa-solid-900-BUswJgRo.woff2 +0 -0
  338. package/studio/web/assets/fa-solid-900-DOXgCApm.woff +0 -0
  339. package/studio/web/assets/fa-solid-900-mxuxnBEa.ttf +0 -0
  340. package/studio/web/assets/index-C1G-Jo6n.js +37 -0
  341. package/studio/web/assets/index-C1G-Jo6n.js.map +1 -0
  342. package/studio/web/assets/index-D-CahN0-.js +2 -0
  343. package/studio/web/assets/index-D-CahN0-.js.map +1 -0
  344. package/studio/web/assets/index-DxlZI0PX.js +235 -0
  345. package/studio/web/assets/index-DxlZI0PX.js.map +1 -0
  346. package/studio/web/assets/index-Y2g_iFpU.css +1 -0
  347. package/studio/web/assets/index-jiPwkrsB.css +1 -0
  348. package/studio/web/assets/index.lazy-BUXDDqq9.js +266 -0
  349. package/studio/web/assets/index.lazy-BUXDDqq9.js.map +1 -0
  350. package/studio/web/assets/profiler-CU93QiSW.js +2 -0
  351. package/studio/web/assets/profiler-CU93QiSW.js.map +1 -0
  352. package/studio/web/assets/react-redux-B8k9Ep7e.js +6 -0
  353. package/studio/web/assets/react-redux-B8k9Ep7e.js.map +1 -0
  354. package/studio/web/assets/startRecording-DFeBXGk6.js +3 -0
  355. package/studio/web/assets/startRecording-DFeBXGk6.js.map +1 -0
  356. package/studio/web/fabric-signup-background.webp +0 -0
  357. package/studio/web/fabric-signup-text.png +0 -0
  358. package/studio/web/favicon_purple.png +0 -0
  359. package/studio/web/github-icon.svg +15 -0
  360. package/studio/web/harper-fabric_black.png +0 -0
  361. package/studio/web/harper-fabric_white.png +0 -0
  362. package/studio/web/harper-studio_white.png +0 -0
  363. package/studio/web/index.html +16 -0
  364. package/studio/web/running.css +148 -0
  365. package/studio/web/running.html +147 -0
  366. package/studio/web/running.js +111 -0
  367. package/upgrade/UpgradeObjects.js +13 -0
  368. package/upgrade/directives/directivesController.js +90 -0
  369. package/upgrade/directivesManager.js +139 -0
  370. package/upgrade/upgradePrompt.js +124 -0
  371. package/upgrade/upgradeUtilities.js +28 -0
  372. package/utility/AWS/AWSConnector.js +29 -0
  373. package/utility/OperationFunctionCaller.js +63 -0
  374. package/utility/assignCmdEnvVariables.js +62 -0
  375. package/utility/common_utils.js +867 -0
  376. package/utility/environment/environmentManager.js +208 -0
  377. package/utility/environment/systemInformation.js +355 -0
  378. package/utility/errors/commonErrors.js +267 -0
  379. package/utility/errors/hdbError.js +146 -0
  380. package/utility/functions/date/dateFunctions.js +65 -0
  381. package/utility/functions/geo.js +355 -0
  382. package/utility/functions/sql/alaSQLExtension.js +104 -0
  383. package/utility/globalSchema.js +35 -0
  384. package/utility/hdbTerms.ts +819 -0
  385. package/utility/install/checkJWTTokensExist.js +62 -0
  386. package/utility/install/harperdb.conf +15 -0
  387. package/utility/install/harperdb.service +14 -0
  388. package/utility/install/installer.js +635 -0
  389. package/utility/installation.ts +30 -0
  390. package/utility/lmdb/DBIDefinition.js +20 -0
  391. package/utility/lmdb/DeleteRecordsResponseObject.js +25 -0
  392. package/utility/lmdb/InsertRecordsResponseObject.js +22 -0
  393. package/utility/lmdb/OpenDBIObject.js +31 -0
  394. package/utility/lmdb/OpenEnvironmentObject.js +41 -0
  395. package/utility/lmdb/UpdateRecordsResponseObject.js +25 -0
  396. package/utility/lmdb/UpsertRecordsResponseObject.js +22 -0
  397. package/utility/lmdb/cleanLMDBMap.js +65 -0
  398. package/utility/lmdb/commonUtility.js +130 -0
  399. package/utility/lmdb/deleteUtility.js +128 -0
  400. package/utility/lmdb/environmentUtility.js +477 -0
  401. package/utility/lmdb/searchCursorFunctions.js +187 -0
  402. package/utility/lmdb/searchUtility.js +918 -0
  403. package/utility/lmdb/terms.js +57 -0
  404. package/utility/lmdb/writeUtility.js +407 -0
  405. package/utility/logging/harper_logger.js +876 -0
  406. package/utility/logging/logRotator.js +157 -0
  407. package/utility/logging/logger.ts +24 -0
  408. package/utility/logging/readLog.js +355 -0
  409. package/utility/logging/transactionLog.js +57 -0
  410. package/utility/mount_hdb.js +59 -0
  411. package/utility/npmUtilities.js +102 -0
  412. package/utility/operationPermissions.ts +112 -0
  413. package/utility/operation_authorization.js +836 -0
  414. package/utility/packageUtils.js +55 -0
  415. package/utility/password.ts +99 -0
  416. package/utility/processManagement/processManagement.js +187 -0
  417. package/utility/processManagement/servicesConfig.js +56 -0
  418. package/utility/scripts/restartHdb.js +24 -0
  419. package/utility/scripts/user_data.sh +13 -0
  420. package/utility/signalling.js +36 -0
  421. package/utility/terms/certificates.js +81 -0
  422. package/utility/when.ts +20 -0
  423. package/validation/bulkDeleteValidator.js +24 -0
  424. package/validation/check_permissions.js +19 -0
  425. package/validation/common_validators.js +95 -0
  426. package/validation/configValidator.js +331 -0
  427. package/validation/deleteValidator.js +15 -0
  428. package/validation/fileLoadValidator.js +153 -0
  429. package/validation/insertValidator.js +40 -0
  430. package/validation/installValidator.js +37 -0
  431. package/validation/readLogValidator.js +64 -0
  432. package/validation/role_validation.js +320 -0
  433. package/validation/schemaMetadataValidator.js +42 -0
  434. package/validation/searchValidator.js +166 -0
  435. package/validation/statusValidator.ts +66 -0
  436. package/validation/transactionLogValidator.js +33 -0
  437. package/validation/user_validation.js +55 -0
  438. package/validation/validationWrapper.js +105 -0
  439. package/dist/resources/ResourceInterfaceV2.d.ts +0 -21
  440. package/dist/resources/ResourceInterfaceV2.js.map +0 -1
  441. package/dist/resources/ResourceV2.d.ts +0 -30
  442. package/dist/resources/ResourceV2.js +0 -27
  443. package/dist/resources/ResourceV2.js.map +0 -1
  444. package/dist/resources/analytics/profile.d.ts +0 -2
  445. package/dist/resources/analytics/profile.js +0 -144
  446. package/dist/resources/analytics/profile.js.map +0 -1
@@ -0,0 +1,95 @@
1
+ 'use strict';
2
+
3
+ const hdbUtils = require('../utility/common_utils.js');
4
+ const hdbTerms = require('../utility/hdbTerms.ts');
5
+ const schemaRegex = /^[\x20-\x2E|\x30-\x5F|\x61-\x7E]*$/;
6
+ const Joi = require('joi');
7
+
8
+ const commonValidators = {
9
+ schema_format: {
10
+ pattern: schemaRegex,
11
+ message: 'names cannot include backticks or forward slashes',
12
+ },
13
+ schema_length: {
14
+ minimum: 1,
15
+ maximum: 250,
16
+ tooLong: 'cannot exceed 250 characters',
17
+ },
18
+ };
19
+
20
+ // A Joi schema that can be used to validate hdb schemas and tables.
21
+ const hdbSchemaTable = Joi.alternatives(
22
+ Joi.string()
23
+ .min(1)
24
+ .max(commonValidators.schema_length.maximum)
25
+ .pattern(schemaRegex)
26
+ .messages({ 'string.pattern.base': '{:#label} ' + commonValidators.schema_format.message }),
27
+ Joi.number(),
28
+ Joi.array()
29
+ ).required();
30
+
31
+ const hdbDatabase = Joi.alternatives(
32
+ Joi.string()
33
+ .min(1)
34
+ .max(commonValidators.schema_length.maximum)
35
+ .pattern(schemaRegex)
36
+ .messages({ 'string.pattern.base': '{:#label} ' + commonValidators.schema_format.message }),
37
+ Joi.number()
38
+ );
39
+
40
+ const hdbTable = Joi.alternatives(
41
+ Joi.string()
42
+ .min(1)
43
+ .max(commonValidators.schema_length.maximum)
44
+ .pattern(schemaRegex)
45
+ .messages({ 'string.pattern.base': '{:#label} ' + commonValidators.schema_format.message }),
46
+ Joi.number()
47
+ ).required();
48
+
49
+ function checkValidTable(propertyName, value) {
50
+ if (!value) return `'${propertyName}' is required`;
51
+ if (typeof value !== 'string') return `'${propertyName}' must be a string`;
52
+ if (!value.length) return `'${propertyName}' must be at least one character`;
53
+ if (value.length > commonValidators.schema_length.maximum) return `'${propertyName}' maximum of 250 characters`;
54
+ if (!schemaRegex.test(value)) return `'${propertyName}' has illegal characters`;
55
+ return '';
56
+ }
57
+
58
+ function validateSchemaExists(value, helpers) {
59
+ if (!hdbUtils.doesSchemaExist(value)) {
60
+ return helpers.message(`Database '${value}' does not exist`);
61
+ }
62
+
63
+ return value;
64
+ }
65
+
66
+ function validateTableExists(value, helpers) {
67
+ const schema = helpers.state.ancestors[0].schema;
68
+ if (!hdbUtils.doesTableExist(schema, value)) {
69
+ return helpers.message(`Table '${value}' does not exist`);
70
+ }
71
+
72
+ return value;
73
+ }
74
+
75
+ function validateSchemaName(value, helpers) {
76
+ if (value.toLowerCase() === hdbTerms.SYSTEM_SCHEMA_NAME) {
77
+ return helpers.message(
78
+ `'subscriptions[${helpers.state.path[1]}]' invalid database name, '${hdbTerms.SYSTEM_SCHEMA_NAME}' name is reserved`
79
+ );
80
+ }
81
+
82
+ return value;
83
+ }
84
+
85
+ module.exports = {
86
+ commonValidators,
87
+ schemaRegex,
88
+ hdbSchemaTable,
89
+ validateSchemaExists,
90
+ validateTableExists,
91
+ validateSchemaName,
92
+ checkValidTable,
93
+ hdbDatabase,
94
+ hdbTable,
95
+ };
@@ -0,0 +1,331 @@
1
+ 'use strict';
2
+
3
+ const fs = require('fs-extra');
4
+ const Joi = require('joi');
5
+ const os = require('os');
6
+ const { boolean, string, number, array } = Joi.types();
7
+ const { totalmem } = require('os');
8
+ const path = require('path');
9
+ const hdbLogger = require('../utility/logging/harper_logger.js');
10
+ const hdbUtils = require('../utility/common_utils.js');
11
+ const hdbTerms = require('../utility/hdbTerms.ts');
12
+ const validator = require('./validationWrapper.js');
13
+
14
+ const DEFAULT_LOG_FOLDER = 'log';
15
+ const DEFAULT_COMPONENTS_FOLDER = 'components';
16
+ const INVALID_SIZE_UNIT_MSG = 'Invalid logging.rotation.maxSize unit. Available units are G, M or K';
17
+ const INVALID_INTERVAL_UNIT_MSG = 'Invalid logging.rotation.interval unit. Available units are D, H or M (minutes)';
18
+ const INVALID_MAX_SIZE_VALUE_MSG =
19
+ "Invalid logging.rotation.maxSize value. Value should be a number followed by unit e.g. '10M'";
20
+ const INVALID_INTERVAL_VALUE_MSG =
21
+ "Invalid logging.rotation.interval value. Value should be a number followed by unit e.g. '10D'";
22
+ const UNDEFINED_OPS_API = 'rootPath config parameter is undefined';
23
+
24
+ const portConstraints = Joi.alternatives([number.min(0), string])
25
+ .optional()
26
+ .empty(null);
27
+ const routeConstraints = Joi.alternatives([
28
+ array
29
+ .items(
30
+ string,
31
+ {
32
+ host: string.required(),
33
+ port: portConstraints,
34
+ },
35
+ {
36
+ hostname: string.required(),
37
+ port: portConstraints,
38
+ }
39
+ )
40
+ .empty(null),
41
+ array.items(string),
42
+ ]);
43
+
44
+ let hdbRoot;
45
+ let skipFsVal = false;
46
+
47
+ module.exports = {
48
+ configValidator,
49
+ routesValidator,
50
+ routeConstraints,
51
+ };
52
+
53
+ function configValidator(configJson, skipFsValidation = false) {
54
+ skipFsVal = skipFsValidation;
55
+ hdbRoot = configJson.rootPath;
56
+ if (hdbUtils.isEmpty(hdbRoot)) {
57
+ throw UNDEFINED_OPS_API;
58
+ }
59
+
60
+ const enabledConstraints = boolean.optional();
61
+ const threadsConstraints = number.min(0).max(1000).empty(null).default(setDefaultThreads);
62
+ const rootConstraints = string
63
+ .pattern(/^[\\/]$|([\\/a-zA-Z_0-9:-]+)+$/, 'directory path')
64
+ .empty(null)
65
+ .default(setDefaultRoot);
66
+ const pemFileConstraints = string.optional().empty(null);
67
+
68
+ const storagePathConstraints = Joi.custom(validatePath).empty(null).default(setDefaultRoot);
69
+ const tlsConstraints = Joi.object({
70
+ certificate: pemFileConstraints,
71
+ certificateAuthority: pemFileConstraints,
72
+ privateKey: pemFileConstraints,
73
+ });
74
+
75
+ const configSchema = Joi.object({
76
+ authentication: Joi.alternatives(
77
+ Joi.object({
78
+ authorizeLocal: boolean,
79
+ cacheTTL: number.required(),
80
+ cookie: Joi.object({
81
+ domains: array.items(string).optional(),
82
+ expires: string.optional(),
83
+ }),
84
+ enableSessions: boolean,
85
+ hashFunction: string.valid('md5', 'sha256', 'argon2id').optional().empty(null),
86
+ }),
87
+ boolean
88
+ ).optional(),
89
+ analytics: Joi.object({
90
+ aggregatePeriod: number,
91
+ replicate: boolean.optional(),
92
+ }),
93
+ replication: Joi.object({
94
+ hostname: Joi.alternatives(string, number).optional().empty(null),
95
+ url: string.optional().empty(null),
96
+ port: portConstraints,
97
+ securePort: portConstraints,
98
+ routes: array.optional().empty(null),
99
+ databases: Joi.alternatives(string, array),
100
+ enableRootCAs: boolean.optional(),
101
+ copyTablesToCatchUp: boolean.optional(),
102
+ }).optional(),
103
+ componentsRoot: rootConstraints.optional(),
104
+ localStudio: Joi.object({
105
+ enabled: enabledConstraints,
106
+ }).required(),
107
+ logging: Joi.object({
108
+ auditAuthEvents: Joi.object({
109
+ logFailed: boolean,
110
+ logSuccessful: boolean,
111
+ }),
112
+ file: boolean.required(),
113
+ level: Joi.valid('notify', 'fatal', 'error', 'warn', 'info', 'debug', 'trace'),
114
+ rotation: Joi.object({
115
+ enabled: boolean.optional(),
116
+ compress: boolean.optional(),
117
+ interval: string.custom(validateRotationInterval).optional().empty(null),
118
+ maxSize: string.custom(validateRotationMaxSize).optional().empty(null),
119
+ path: string.optional().empty(null).default(setDefaultRoot),
120
+ }).required(),
121
+ root: rootConstraints,
122
+ stdStreams: boolean.required(),
123
+ auditLog: boolean.required(),
124
+ }).required(),
125
+ operationsApi: Joi.object({
126
+ network: Joi.object({
127
+ cors: boolean.optional(),
128
+ corsAccessList: array.optional(),
129
+ headersTimeout: number.min(1).optional(),
130
+ keepAliveTimeout: number.min(1).optional(),
131
+ port: portConstraints,
132
+ domainSocket: Joi.optional().empty('hdb/operations-server').default(setDefaultRoot),
133
+ securePort: portConstraints,
134
+ timeout: number.min(1).optional(),
135
+ }).optional(),
136
+ tls: Joi.alternatives([Joi.array().items(tlsConstraints), tlsConstraints]),
137
+ }).required(),
138
+ rootPath: string.pattern(/^[\\/]$|([\\/a-zA-Z_0-9:-]+)+$/, 'directory path').required(),
139
+ mqtt: Joi.object({
140
+ network: Joi.object({
141
+ port: portConstraints,
142
+ securePort: portConstraints,
143
+ mtls: Joi.alternatives([
144
+ boolean.optional(),
145
+ Joi.object({
146
+ user: string.optional(),
147
+ certificateAuthority: pemFileConstraints,
148
+ required: boolean.optional(),
149
+ }),
150
+ ]),
151
+ }).required(),
152
+ webSocket: boolean.optional(),
153
+ requireAuthentication: boolean.optional(),
154
+ }),
155
+ http: Joi.object({
156
+ compressionThreshold: number.optional(),
157
+ cors: boolean.optional(),
158
+ corsAccessList: array.optional(),
159
+ headersTimeout: number.min(1).optional(),
160
+ port: portConstraints,
161
+ securePort: portConstraints,
162
+ maxHeaderSize: number.optional(),
163
+ mtls: Joi.alternatives([
164
+ boolean.optional(),
165
+ Joi.object({
166
+ user: string.optional(),
167
+ certificateAuthority: pemFileConstraints,
168
+ required: boolean.optional(),
169
+ }),
170
+ ]),
171
+ threadRange: Joi.alternatives([array.optional(), string.optional()]),
172
+ }).required(),
173
+ threads: Joi.alternatives(
174
+ threadsConstraints.optional(),
175
+ Joi.object({
176
+ count: threadsConstraints.optional(),
177
+ debug: Joi.alternatives(
178
+ boolean.optional(),
179
+ Joi.object({
180
+ startingPort: number.min(1).optional(),
181
+ host: string.optional(),
182
+ waitForDebugger: boolean.optional(),
183
+ })
184
+ ),
185
+ maxHeapMemory: number.min(0).optional(),
186
+ })
187
+ ),
188
+ storage: Joi.object({
189
+ writeAsync: boolean.required(),
190
+ overlappingSync: boolean.optional(),
191
+ caching: boolean.optional(),
192
+ compression: Joi.alternatives([
193
+ boolean.optional(),
194
+ Joi.object({ dictionary: string.optional(), threshold: number.optional() }),
195
+ ]),
196
+ compactOnStart: boolean.optional(),
197
+ compactOnStartKeepBackup: boolean.optional(),
198
+ noReadAhead: boolean.optional(),
199
+ path: storagePathConstraints,
200
+ prefetchWrites: boolean.optional(),
201
+ maxFreeSpaceToLoad: number.optional(),
202
+ maxFreeSpaceToRetain: number.optional(),
203
+ }).required(),
204
+ ignoreScripts: boolean.optional(),
205
+ tls: Joi.alternatives([Joi.array().items(tlsConstraints), tlsConstraints]),
206
+ });
207
+
208
+ // Not using the validation wrapper here because we need the result if validation is successful because
209
+ // there is default values set as part of validation.
210
+ return configSchema.validate(configJson, {
211
+ allowUnknown: true,
212
+ abortEarly: false,
213
+ errors: { wrap: { label: "'" } },
214
+ });
215
+ }
216
+
217
+ // This function is used to validate existence of paths passed as an argument
218
+ function doesPathExist(pathToCheck) {
219
+ if (skipFsVal) return null;
220
+ let exists = fs.existsSync(pathToCheck);
221
+ if (exists) {
222
+ return null;
223
+ }
224
+
225
+ return `Specified path ${pathToCheck} does not exist.`;
226
+ }
227
+
228
+ function validatePath(value, helpers) {
229
+ Joi.assert(value, string.pattern(/^[\\/]$|([\\/a-zA-Z_0-9:-]+)+$/, 'directory path'));
230
+
231
+ const doesExistMsg = doesPathExist(value);
232
+ if (doesExistMsg) {
233
+ return helpers.message(doesExistMsg);
234
+ }
235
+ }
236
+
237
+ function validateRotationMaxSize(value, helpers) {
238
+ const unit = value.slice(-1);
239
+ if (unit !== 'G' && unit !== 'M' && unit !== 'K') {
240
+ return helpers.message(INVALID_SIZE_UNIT_MSG);
241
+ }
242
+
243
+ const size = value.slice(0, -1);
244
+ if (isNaN(parseInt(size))) {
245
+ return helpers.message(INVALID_MAX_SIZE_VALUE_MSG);
246
+ }
247
+
248
+ return value;
249
+ }
250
+
251
+ function validateRotationInterval(value, helpers) {
252
+ const unit = value.slice(-1);
253
+ if (unit !== 'D' && unit !== 'H' && unit !== 'M') {
254
+ return helpers.message(INVALID_INTERVAL_UNIT_MSG);
255
+ }
256
+
257
+ const size = value.slice(0, -1);
258
+ if (isNaN(parseInt(size))) {
259
+ return helpers.message(INVALID_INTERVAL_VALUE_MSG);
260
+ }
261
+
262
+ return value;
263
+ }
264
+
265
+ function setDefaultThreads(parent, helpers) {
266
+ const configParam = helpers.state.path.join('.');
267
+ let processors = os.cpus().length;
268
+
269
+ // default to one less than the number of logical CPU/processors so we can have good concurrency with the
270
+ // ingest process and any extra processes (jobs, reply, etc.).
271
+ let numProcesses = processors - 1;
272
+ // But if only two or less processors, keep two processes so we have some level of concurrency fairness
273
+ if (numProcesses <= 2) numProcesses = 2;
274
+ let availableMemory = process.constrainedMemory?.() || totalmem(); // used constrained memory if it is available
275
+ // and lower than total memory
276
+ availableMemory = Math.round(Math.min(availableMemory, totalmem()) / 1000000);
277
+ // (available memory -750MB) / 300MB
278
+ numProcesses = Math.max(Math.min(numProcesses, Math.round((availableMemory - 750) / 300)), 1);
279
+ hdbLogger.info(
280
+ `Detected ${processors} cores and ${availableMemory}MB on this machine, defaulting ${configParam} to ${numProcesses}`
281
+ );
282
+ return numProcesses;
283
+ }
284
+
285
+ /**
286
+ * Sets a default root for a config param.
287
+ * @param parent
288
+ * @param helpers
289
+ * @returns {string}
290
+ */
291
+ function setDefaultRoot(parent, helpers) {
292
+ // For some reason Joi is still calling set default when value is not null.
293
+ // For that reason we do this check.
294
+ const configParam = helpers.state.path.join('.');
295
+ if (!hdbUtils.isEmpty(helpers.original) && configParam !== 'operationsApi.network.domainSocket') {
296
+ return helpers.original;
297
+ }
298
+
299
+ if (hdbUtils.isEmpty(hdbRoot)) {
300
+ throw new Error(`Error setting default root for: ${configParam}. HDB root is not defined`);
301
+ }
302
+
303
+ switch (configParam) {
304
+ case 'componentsRoot':
305
+ return path.join(hdbRoot, DEFAULT_COMPONENTS_FOLDER);
306
+ case 'logging.root':
307
+ return path.join(hdbRoot, DEFAULT_LOG_FOLDER);
308
+ case 'storage.path':
309
+ const legacyStoragePath = path.join(hdbRoot, hdbTerms.LEGACY_DATABASES_DIR_NAME);
310
+ if (fs.existsSync(legacyStoragePath)) return legacyStoragePath;
311
+ return path.join(hdbRoot, hdbTerms.DATABASES_DIR_NAME);
312
+ case 'logging.rotation.path':
313
+ return path.join(hdbRoot, DEFAULT_LOG_FOLDER);
314
+ case 'operationsApi.network.domainSocket':
315
+ return configParam == null ? null : path.join(hdbRoot, 'operations-server');
316
+ default:
317
+ throw new Error(`Error setting default root for config parameter: ${configParam}. Unrecognized config parameter`);
318
+ }
319
+ }
320
+
321
+ /**
322
+ * Validates just the routes array.
323
+ * @param routesArray
324
+ * @returns {*}
325
+ */
326
+ function routesValidator(routesArray) {
327
+ const schema = Joi.object({
328
+ routes: routeConstraints,
329
+ });
330
+ return validator.validateBySchema({ routes: routesArray }, schema);
331
+ }
@@ -0,0 +1,15 @@
1
+ const validator = require('./validationWrapper.js');
2
+ const Joi = require('joi');
3
+ const { hdbTable, hdbDatabase } = require('./common_validators.js');
4
+
5
+ const deleteSchema = Joi.object({
6
+ schema: hdbDatabase,
7
+ database: hdbDatabase,
8
+ table: hdbTable,
9
+ hash_values: Joi.array().required(),
10
+ ids: Joi.array(),
11
+ });
12
+
13
+ module.exports = function (deleteObject) {
14
+ return validator.validateBySchema(deleteObject, deleteSchema);
15
+ };
@@ -0,0 +1,153 @@
1
+ const clone = require('clone');
2
+ const validator = require('./validationWrapper.js');
3
+ const commonUtils = require('../utility/common_utils.js');
4
+ const hdbTerms = require('../utility/hdbTerms.ts');
5
+ const fs = require('fs');
6
+ const joi = require('joi');
7
+ const { string } = joi.types();
8
+ const { hdbErrors, handleHDBError } = require('../utility/errors/hdbError.js');
9
+ const { HTTP_STATUS_CODES } = hdbErrors;
10
+
11
+ const { commonValidators } = require('./common_validators.js');
12
+
13
+ const isRequiredString = ' is required';
14
+
15
+ const actions = ['insert', 'update', 'upsert'];
16
+ const constraints = {
17
+ database: {
18
+ presence: false,
19
+ format: commonValidators.schema_format,
20
+ length: commonValidators.schema_length,
21
+ },
22
+ schema: {
23
+ presence: false,
24
+ format: commonValidators.schema_format,
25
+ length: commonValidators.schema_length,
26
+ },
27
+ table: {
28
+ presence: true,
29
+ format: commonValidators.schema_format,
30
+ length: commonValidators.schema_length,
31
+ },
32
+ action: {
33
+ inclusion: {
34
+ within: actions,
35
+ message: 'is required and must be either insert, update, or upsert',
36
+ },
37
+ },
38
+ file_path: {},
39
+ csv_url: {
40
+ url: {
41
+ allowLocal: true,
42
+ },
43
+ },
44
+ data: {},
45
+ passthrough_headers: {},
46
+ };
47
+
48
+ const baseJoiSchema = {
49
+ schema: string.required(),
50
+ table: string.required(),
51
+ action: string.valid('insert', 'update', 'upsert'),
52
+ };
53
+
54
+ const { AWS_ACCESS_KEY, AWS_SECRET, AWS_BUCKET, AWS_FILE_KEY, REGION } = hdbTerms.S3_BUCKET_AUTH_KEYS;
55
+
56
+ const s3Constraints = {
57
+ s3: {
58
+ presence: true,
59
+ },
60
+ [`s3.${AWS_ACCESS_KEY}`]: {
61
+ presence: true,
62
+ type: 'String',
63
+ },
64
+ [`s3.${AWS_SECRET}`]: {
65
+ presence: true,
66
+ type: 'String',
67
+ },
68
+ [`s3.${AWS_BUCKET}`]: {
69
+ presence: true,
70
+ type: 'String',
71
+ },
72
+ [`s3.${AWS_FILE_KEY}`]: {
73
+ presence: true,
74
+ type: 'String',
75
+ hasValidFileExt: ['.csv', '.json'],
76
+ },
77
+ [`s3.${REGION}`]: {
78
+ presence: true,
79
+ type: 'String',
80
+ },
81
+ };
82
+
83
+ const dataConstraints = clone(constraints);
84
+ dataConstraints.data.presence = {
85
+ message: isRequiredString,
86
+ };
87
+
88
+ const fileConstraints = clone(constraints);
89
+ fileConstraints.file_path.presence = {
90
+ message: isRequiredString,
91
+ };
92
+
93
+ const s3FileConstraints = Object.assign(clone(constraints), s3Constraints);
94
+
95
+ const urlSchema = clone(baseJoiSchema);
96
+ urlSchema.csv_url = string.uri().messages({ 'string.uri': "'csv_url' must be a valid url" }).required();
97
+ urlSchema.passthrough_headers = joi.object();
98
+
99
+ function dataObject(object) {
100
+ let validateRes = validator.validateObject(object, dataConstraints);
101
+ return postValidateChecks(object, validateRes);
102
+ }
103
+
104
+ function urlObject(object) {
105
+ let validateRes = validator.validateBySchema(object, joi.object(urlSchema));
106
+ return postValidateChecks(object, validateRes);
107
+ }
108
+
109
+ function fileObject(object) {
110
+ let validateRes = validator.validateObject(object, fileConstraints);
111
+ return postValidateChecks(object, validateRes);
112
+ }
113
+
114
+ function s3FileObject(object) {
115
+ let validateRes = validator.validateObject(object, s3FileConstraints);
116
+ return postValidateChecks(object, validateRes);
117
+ }
118
+
119
+ /**
120
+ * Post validate module checks, confirms schema and table exist.
121
+ * If file upload - checks that it exists, permissions and size.
122
+ */
123
+ function postValidateChecks(object, validateRes) {
124
+ if (!validateRes) {
125
+ let msg = commonUtils.checkGlobalSchemaTable(object.schema, object.table);
126
+ if (msg) {
127
+ return handleHDBError(new Error(), msg, HTTP_STATUS_CODES.BAD_REQUEST);
128
+ }
129
+
130
+ if (object.operation === hdbTerms.OPERATIONS_ENUM.CSV_FILE_LOAD) {
131
+ try {
132
+ fs.accessSync(object.file_path, fs.constants.R_OK | fs.constants.F_OK);
133
+ } catch (err) {
134
+ if (err.code === hdbTerms.NODE_ERROR_CODES.ENOENT) {
135
+ return handleHDBError(err, `No such file or directory ${err.path}`, HTTP_STATUS_CODES.BAD_REQUEST);
136
+ }
137
+
138
+ if (err.code === hdbTerms.NODE_ERROR_CODES.EACCES) {
139
+ return handleHDBError(err, `Permission denied ${err.path}`, HTTP_STATUS_CODES.BAD_REQUEST);
140
+ }
141
+ return handleHDBError(err);
142
+ }
143
+ }
144
+ }
145
+ return validateRes;
146
+ }
147
+
148
+ module.exports = {
149
+ dataObject,
150
+ urlObject,
151
+ fileObject,
152
+ s3FileObject,
153
+ };
@@ -0,0 +1,40 @@
1
+ const { hdbTable, hdbDatabase } = require('./common_validators.js');
2
+ const validator = require('./validationWrapper.js');
3
+ const Joi = require('joi');
4
+ const INVALID_ATTRIBUTE_NAMES = {
5
+ undefined: 'undefined',
6
+ null: 'null',
7
+ };
8
+
9
+ const customRecordsVal = (value, helpers) => {
10
+ const attributes = Object.keys(value);
11
+ const attributesLength = attributes.length;
12
+ let errorMsg = undefined;
13
+ for (let i = 0; i < attributesLength; i++) {
14
+ const attribute = attributes[i];
15
+ if (!attribute || attribute.length === 0 || INVALID_ATTRIBUTE_NAMES[attribute] !== undefined) {
16
+ if (errorMsg === undefined) {
17
+ errorMsg = `Invalid attribute name: '${attribute}'`;
18
+ } else {
19
+ errorMsg += `. Invalid attribute name: '${attribute}'`;
20
+ }
21
+ }
22
+ }
23
+
24
+ if (errorMsg) {
25
+ return helpers.message(errorMsg);
26
+ }
27
+
28
+ return value;
29
+ };
30
+
31
+ const insertSchema = Joi.object({
32
+ database: hdbDatabase,
33
+ schema: hdbDatabase,
34
+ table: hdbTable,
35
+ records: Joi.array().items(Joi.object().custom(customRecordsVal)).required(),
36
+ });
37
+
38
+ module.exports = function (insertObject) {
39
+ return validator.validateBySchema(insertObject, insertSchema);
40
+ };
@@ -0,0 +1,37 @@
1
+ 'use strict';
2
+
3
+ const Joi = require('joi');
4
+ const { string, number } = Joi.types();
5
+ const fs = require('fs-extra');
6
+ const hdbTerms = require('../utility/hdbTerms.ts');
7
+ const path = require('path');
8
+ const validator = require('../validation/validationWrapper.js');
9
+
10
+ module.exports = installValidator;
11
+
12
+ /**
13
+ * Used to validate any command or environment variables used passed to install.
14
+ * @param param
15
+ * @returns {*}
16
+ */
17
+ function installValidator(param) {
18
+ const installSchema = Joi.object({
19
+ [hdbTerms.INSTALL_PROMPTS.ROOTPATH]: Joi.custom(validateRootAvailable),
20
+ [hdbTerms.INSTALL_PROMPTS.OPERATIONSAPI_NETWORK_PORT]: Joi.alternatives([number.min(0), string]).allow(
21
+ 'null',
22
+ null
23
+ ),
24
+ [hdbTerms.INSTALL_PROMPTS.TC_AGREEMENT]: string.valid('yes', 'YES', 'Yes'),
25
+ });
26
+
27
+ return validator.validateBySchema(param, installSchema);
28
+ }
29
+
30
+ function validateRootAvailable(value, helpers) {
31
+ if (
32
+ fs.existsSync(path.join(value, 'system/hdb_user/data.mdb')) ||
33
+ fs.existsSync(path.join(value, 'system/hdb_user.mdb'))
34
+ ) {
35
+ return helpers.message(`'${value}' is already in use. Please enter a different path.`);
36
+ }
37
+ }