@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,366 @@
1
+ 'use strict';
2
+
3
+ const schemaMetadataValidator = require('../validation/schemaMetadataValidator.js');
4
+ const { validateBySchema } = require('../validation/validationWrapper.js');
5
+ const { commonValidators, schemaRegex } = require('../validation/common_validators.js');
6
+ const Joi = require('joi');
7
+ const logger = require('../utility/logging/harper_logger.js');
8
+ const uuidV4 = require('uuid').v4;
9
+ const signalling = require('../utility/signalling.js');
10
+ const hdbTerms = require('../utility/hdbTerms.ts');
11
+ const util = require('util');
12
+ const harperBridge = require('./harperBridge/harperBridge.js');
13
+ const { handleHDBError, hdbErrors, ClientError } = require('../utility/errors/hdbError.js');
14
+ const { HDB_ERROR_MSGS, HTTP_STATUS_CODES } = hdbErrors;
15
+ const { SchemaEventMsg } = require('../server/threads/itc.js');
16
+ const { getDatabases, dropTableMeta } = require('../resources/databases.ts');
17
+ const { transformReq } = require('../utility/common_utils.js');
18
+ const { server } = require('../server/Server.ts');
19
+ const { cleanupOrphans } = require('../resources/blob.ts');
20
+
21
+ const DB_NAME_CONSTRAINTS = Joi.string()
22
+ .min(1)
23
+ .max(commonValidators.schema_length.maximum)
24
+ .pattern(schemaRegex)
25
+ .messages({ 'string.pattern.base': '{:#label} ' + commonValidators.schema_format.message });
26
+
27
+ const TABLE_NAME_CONSTRAINTS = Joi.string()
28
+ .min(1)
29
+ .max(commonValidators.schema_length.maximum)
30
+ .pattern(schemaRegex)
31
+ .messages({ 'string.pattern.base': '{:#label} ' + commonValidators.schema_format.message })
32
+ .required();
33
+
34
+ const PRIMARY_KEY_CONSTRAINTS = Joi.string()
35
+ .min(1)
36
+ .max(commonValidators.schema_length.maximum)
37
+ .pattern(schemaRegex)
38
+ .messages({
39
+ 'string.pattern.base': '{:#label} ' + commonValidators.schema_format.message,
40
+ 'any.required': "'primary_key' is required",
41
+ 'string.base': "'primary_key' must be a string",
42
+ })
43
+ .required();
44
+
45
+ module.exports = {
46
+ createSchema,
47
+ createSchemaStructure,
48
+ createTable,
49
+ createTableStructure,
50
+ createAttribute,
51
+ dropSchema,
52
+ dropTable,
53
+ dropAttribute,
54
+ getBackup,
55
+ cleanupOrphanBlobs,
56
+ };
57
+
58
+ /** EXPORTED FUNCTIONS **/
59
+
60
+ async function createSchema(schemaCreateObject) {
61
+ let schemaStructure = await createSchemaStructure(schemaCreateObject);
62
+ signalling.signalSchemaChange(
63
+ new SchemaEventMsg(process.pid, schemaCreateObject.operation, schemaCreateObject.schema)
64
+ );
65
+
66
+ return schemaStructure;
67
+ }
68
+
69
+ async function createSchemaStructure(schemaCreateObject) {
70
+ const validation = validateBySchema(
71
+ schemaCreateObject,
72
+ Joi.object({
73
+ database: DB_NAME_CONSTRAINTS,
74
+ schema: DB_NAME_CONSTRAINTS,
75
+ })
76
+ );
77
+ if (validation) throw new ClientError(validation.message);
78
+
79
+ transformReq(schemaCreateObject);
80
+
81
+ if (!(await schemaMetadataValidator.checkSchemaExists(schemaCreateObject.schema))) {
82
+ throw handleHDBError(
83
+ new Error(),
84
+ HDB_ERROR_MSGS.SCHEMA_EXISTS_ERR(schemaCreateObject.schema),
85
+ HTTP_STATUS_CODES.BAD_REQUEST,
86
+ hdbTerms.LOG_LEVELS.ERROR,
87
+ HDB_ERROR_MSGS.SCHEMA_EXISTS_ERR(schemaCreateObject.schema),
88
+ true
89
+ );
90
+ }
91
+
92
+ await harperBridge.createSchema(schemaCreateObject);
93
+
94
+ return `database '${schemaCreateObject.schema}' successfully created`;
95
+ }
96
+
97
+ async function createTable(createTableObject) {
98
+ transformReq(createTableObject);
99
+ createTableObject.primary_key = createTableObject.primary_key ?? createTableObject.hash_attribute;
100
+ return await createTableStructure(createTableObject);
101
+ }
102
+
103
+ async function createTableStructure(createTableObject) {
104
+ const validation = validateBySchema(
105
+ createTableObject,
106
+ Joi.object({
107
+ database: DB_NAME_CONSTRAINTS,
108
+ schema: DB_NAME_CONSTRAINTS,
109
+ table: TABLE_NAME_CONSTRAINTS,
110
+ residence: Joi.array().items(Joi.string().min(1)).optional(),
111
+ primary_key: PRIMARY_KEY_CONSTRAINTS,
112
+ })
113
+ );
114
+ if (validation) throw new ClientError(validation.message);
115
+
116
+ let invalidTableMsg = await schemaMetadataValidator.checkSchemaTableExists(
117
+ createTableObject.schema,
118
+ createTableObject.table
119
+ );
120
+ if (!invalidTableMsg) {
121
+ throw handleHDBError(
122
+ new Error(),
123
+ HDB_ERROR_MSGS.TABLE_EXISTS_ERR(createTableObject.schema, createTableObject.table),
124
+ HTTP_STATUS_CODES.BAD_REQUEST,
125
+ hdbTerms.LOG_LEVELS.ERROR,
126
+ HDB_ERROR_MSGS.TABLE_EXISTS_ERR(createTableObject.schema, createTableObject.table),
127
+ true
128
+ );
129
+ }
130
+
131
+ let tableSystemData = {
132
+ name: createTableObject.table,
133
+ schema: createTableObject.schema,
134
+ id: uuidV4(),
135
+ primary_key: createTableObject.primary_key,
136
+ };
137
+
138
+ if (createTableObject.residence) {
139
+ if (global.clustering_on) {
140
+ tableSystemData.residence = createTableObject.residence;
141
+ await harperBridge.createTable(tableSystemData, createTableObject);
142
+ } else {
143
+ throw handleHDBError(
144
+ new Error(),
145
+ `Clustering does not appear to be enabled. Cannot insert table with property 'residence'.`,
146
+ HTTP_STATUS_CODES.BAD_REQUEST
147
+ );
148
+ }
149
+ } else {
150
+ await harperBridge.createTable(tableSystemData, createTableObject);
151
+ }
152
+
153
+ return `table '${createTableObject.schema}.${createTableObject.table}' successfully created.`;
154
+ }
155
+
156
+ async function dropSchema(dropSchemaObject) {
157
+ const validation = validateBySchema(
158
+ dropSchemaObject,
159
+ Joi.object({
160
+ database: Joi.string(),
161
+ schema: Joi.string(),
162
+ })
163
+ .or('database', 'schema')
164
+ .messages({
165
+ 'object.missing': "'database' is required",
166
+ })
167
+ );
168
+ if (validation) throw new ClientError(validation.message);
169
+
170
+ transformReq(dropSchemaObject);
171
+
172
+ let invalidSchemaMsg = await schemaMetadataValidator.checkSchemaExists(dropSchemaObject.schema);
173
+ if (invalidSchemaMsg) {
174
+ throw handleHDBError(
175
+ new Error(),
176
+ invalidSchemaMsg,
177
+ HTTP_STATUS_CODES.NOT_FOUND,
178
+ hdbTerms.LOG_LEVELS.ERROR,
179
+ invalidSchemaMsg,
180
+ true
181
+ );
182
+ }
183
+
184
+ await harperBridge.dropSchema(dropSchemaObject);
185
+ signalling.signalSchemaChange(new SchemaEventMsg(process.pid, dropSchemaObject.operation, dropSchemaObject.schema));
186
+
187
+ let response = await server.replication.replicateOperation(dropSchemaObject);
188
+ response.message = `successfully deleted '${dropSchemaObject.schema}'`;
189
+ return response;
190
+ }
191
+
192
+ async function dropTable(dropTableObject) {
193
+ const validation = validateBySchema(
194
+ dropTableObject,
195
+ Joi.object({
196
+ database: Joi.string(),
197
+ schema: Joi.string(),
198
+ table: Joi.string().required(),
199
+ })
200
+ );
201
+ if (validation) throw new ClientError(validation.message);
202
+
203
+ transformReq(dropTableObject);
204
+
205
+ let invalidSchemaTableMsg = await schemaMetadataValidator.checkSchemaTableExists(
206
+ dropTableObject.schema,
207
+ dropTableObject.table
208
+ );
209
+ if (invalidSchemaTableMsg) {
210
+ throw handleHDBError(
211
+ new Error(),
212
+ invalidSchemaTableMsg,
213
+ HTTP_STATUS_CODES.NOT_FOUND,
214
+ hdbTerms.LOG_LEVELS.ERROR,
215
+ invalidSchemaTableMsg,
216
+ true
217
+ );
218
+ }
219
+
220
+ await harperBridge.dropTable(dropTableObject);
221
+
222
+ await dropTableMeta({ table: dropTableObject.table, database: dropTableObject.schema });
223
+
224
+ let response = await server.replication.replicateOperation(dropTableObject);
225
+ response.message = `successfully deleted table '${dropTableObject.schema}.${dropTableObject.table}'`;
226
+ return response;
227
+ }
228
+
229
+ /**
230
+ * Drops all files for the specified attribute.
231
+ * @param dropAttributeObject - The JSON formatted inbound message.
232
+ * @returns {Promise<*>}
233
+ */
234
+ async function dropAttribute(dropAttributeObject) {
235
+ const validation = validateBySchema(
236
+ dropAttributeObject,
237
+ Joi.object({
238
+ database: Joi.string(),
239
+ schema: Joi.string(),
240
+ table: Joi.string().required(),
241
+ attribute: Joi.string().required(),
242
+ })
243
+ );
244
+ if (validation) throw new ClientError(validation.message);
245
+
246
+ transformReq(dropAttributeObject);
247
+
248
+ let invalidSchemaTableMsg = await schemaMetadataValidator.checkSchemaTableExists(
249
+ dropAttributeObject.schema,
250
+ dropAttributeObject.table
251
+ );
252
+ if (invalidSchemaTableMsg) {
253
+ throw handleHDBError(
254
+ new Error(),
255
+ invalidSchemaTableMsg,
256
+ HTTP_STATUS_CODES.NOT_FOUND,
257
+ hdbTerms.LOG_LEVELS.ERROR,
258
+ invalidSchemaTableMsg,
259
+ true
260
+ );
261
+ }
262
+
263
+ if (
264
+ dropAttributeObject.attribute ===
265
+ global.hdb_schema[dropAttributeObject.schema][dropAttributeObject.table].primary_key
266
+ ) {
267
+ throw handleHDBError(
268
+ new Error(),
269
+ 'You cannot drop a hash attribute',
270
+ HTTP_STATUS_CODES.BAD_REQUEST,
271
+ undefined,
272
+ undefined,
273
+ true
274
+ );
275
+ }
276
+
277
+ if (hdbTerms.TIME_STAMP_NAMES.indexOf(dropAttributeObject.attribute) >= 0) {
278
+ throw handleHDBError(
279
+ new Error(),
280
+ `cannot drop internal timestamp attribute: ${dropAttributeObject.attribute}`,
281
+ HTTP_STATUS_CODES.BAD_REQUEST,
282
+ undefined,
283
+ undefined,
284
+ true
285
+ );
286
+ }
287
+
288
+ try {
289
+ await harperBridge.dropAttribute(dropAttributeObject);
290
+ dropAttributeFromGlobal(dropAttributeObject);
291
+ signalling.signalSchemaChange(
292
+ new SchemaEventMsg(
293
+ process.pid,
294
+ dropAttributeObject.operation,
295
+ dropAttributeObject.schema,
296
+ dropAttributeObject.table,
297
+ dropAttributeObject.attribute
298
+ )
299
+ );
300
+
301
+ return `successfully deleted attribute '${dropAttributeObject.attribute}'`;
302
+ } catch (err) {
303
+ logger.error(`Got an error deleting attribute ${util.inspect(dropAttributeObject)}.`);
304
+ throw err;
305
+ }
306
+ }
307
+
308
+ /**
309
+ * Removes the dropped attribute from the global hdb schema object.
310
+ * @param dropAttributeObject
311
+ */
312
+ function dropAttributeFromGlobal(dropAttributeObject) {
313
+ let attributesObj = Object.values(
314
+ global.hdb_schema[dropAttributeObject.schema][dropAttributeObject.table]['attributes']
315
+ );
316
+
317
+ for (let i = 0; i < attributesObj.length; i++) {
318
+ if (attributesObj[i].attribute === dropAttributeObject.attribute) {
319
+ global.hdb_schema[dropAttributeObject.schema][dropAttributeObject.table]['attributes'].splice(i, 1);
320
+ }
321
+ }
322
+ }
323
+
324
+ async function createAttribute(createAttributeObject) {
325
+ transformReq(createAttributeObject);
326
+
327
+ const tableAttr = getDatabases()[createAttributeObject.schema][createAttributeObject.table].attributes;
328
+ for (const { name } of tableAttr) {
329
+ if (name === createAttributeObject.attribute) {
330
+ throw handleHDBError(
331
+ new Error(),
332
+ `attribute '${createAttributeObject.attribute}' already exists in ${createAttributeObject.schema}.${createAttributeObject.table}`,
333
+ HTTP_STATUS_CODES.BAD_REQUEST,
334
+ undefined,
335
+ undefined,
336
+ true
337
+ );
338
+ }
339
+ }
340
+
341
+ await harperBridge.createAttribute(createAttributeObject);
342
+ signalling.signalSchemaChange(
343
+ new SchemaEventMsg(
344
+ process.pid,
345
+ createAttributeObject.operation,
346
+ createAttributeObject.schema,
347
+ createAttributeObject.table,
348
+ createAttributeObject.attribute
349
+ )
350
+ );
351
+
352
+ return `attribute '${createAttributeObject.schema}.${createAttributeObject.table}.${createAttributeObject.attribute}' successfully created.`;
353
+ }
354
+
355
+ function getBackup(getBackupObject) {
356
+ return harperBridge.getBackup(getBackupObject);
357
+ }
358
+
359
+ function cleanupOrphanBlobs(request) {
360
+ if (!request.database) throw new ClientError('Must provide "database" name for search for orphaned blobs');
361
+ const database = databases[request.database];
362
+ if (!database) throw new ClientError(`Unknown database '${request.database}'`);
363
+ // don't await, it will probably take hours
364
+ cleanupOrphans(databases[request.database], request.database);
365
+ return { message: 'Orphaned blobs cleanup started, check logs for progress' };
366
+ }
@@ -0,0 +1,289 @@
1
+ 'use strict';
2
+
3
+ const logger = require('../utility/logging/harper_logger.js');
4
+ const { validateBySchema } = require('../validation/validationWrapper.js');
5
+ const Joi = require('joi');
6
+ const hdbUtils = require('../utility/common_utils.js');
7
+ const { handleHDBError, hdbErrors, ClientError } = require('../utility/errors/hdbError.js');
8
+ const { HDB_ERROR_MSGS, HTTP_STATUS_CODES } = hdbErrors;
9
+ const envMngr = require('../utility/environment/environmentManager.js');
10
+ envMngr.initSync();
11
+ const { getDatabases } = require('../resources/databases.ts');
12
+ const fs = require('fs-extra');
13
+
14
+ module.exports = {
15
+ describeAll,
16
+ describeTable: descTable,
17
+ describeSchema,
18
+ };
19
+
20
+ /**
21
+ * This method is exposed to the API and internally for system operations. If the op is being made internally, the `opObj`
22
+ * argument is not passed and, therefore, no permissions are used to filter the final schema metadata results.
23
+ * @param opObj
24
+ * @returns {Promise<{}|HdbError>}
25
+ */
26
+ async function describeAll(opObj = {}) {
27
+ try {
28
+ const sysCall = hdbUtils.isEmptyOrZeroLength(opObj);
29
+ const bypassAuth = !!opObj.bypass_auth;
30
+ let rolePerms;
31
+ let isSu;
32
+ if (!sysCall && !bypassAuth) {
33
+ rolePerms = opObj.hdb_user?.role?.permission;
34
+ isSu = rolePerms?.super_user;
35
+ }
36
+ let databases = getDatabases();
37
+ let schemaList = {};
38
+ let schemaPerms = {};
39
+ let tResults = [];
40
+ const exact_count = opObj?.exact_count;
41
+ const include_computed = opObj?.include_computed;
42
+ for (let schema in databases) {
43
+ schemaList[schema] = true;
44
+ if (!sysCall && !isSu && !bypassAuth) schemaPerms[schema] = opObj.hdb_user?.role?.permission[schema]?.describe;
45
+ let tables = databases[schema];
46
+ for (let table in tables) {
47
+ try {
48
+ let desc;
49
+ if (sysCall || isSu || bypassAuth) {
50
+ desc = await descTable({ schema, table, exact_count, include_computed });
51
+ } else if (rolePerms && rolePerms[schema].describe && rolePerms[schema].tables[table].describe) {
52
+ const tAttrPerms = rolePerms[schema].tables[table].attribute_permissions;
53
+ desc = await descTable({ schema, table, exact_count, include_computed }, tAttrPerms);
54
+ }
55
+ if (desc) {
56
+ tResults.push(desc);
57
+ }
58
+ } catch (e) {
59
+ logger.error(e);
60
+ }
61
+ }
62
+ }
63
+
64
+ let hdbDescription = {};
65
+ for (let t in tResults) {
66
+ if (sysCall || isSu || bypassAuth) {
67
+ if (hdbDescription[tResults[t].schema] == null) {
68
+ hdbDescription[tResults[t].schema] = {};
69
+ }
70
+
71
+ hdbDescription[tResults[t].schema][tResults[t].name] = tResults[t];
72
+ if (schemaList[tResults[t].schema]) {
73
+ delete schemaList[tResults[t].schema];
74
+ }
75
+ } else if (schemaPerms[tResults[t].schema]) {
76
+ if (hdbDescription[tResults[t].schema] == null) {
77
+ hdbDescription[tResults[t].schema] = {};
78
+ }
79
+
80
+ hdbDescription[tResults[t].schema][tResults[t].name] = tResults[t];
81
+ if (schemaList[tResults[t].schema]) {
82
+ delete schemaList[tResults[t].schema];
83
+ }
84
+ }
85
+ }
86
+
87
+ for (let schema in schemaList) {
88
+ if (sysCall || isSu || bypassAuth) {
89
+ hdbDescription[schema] = {};
90
+ } else if (schemaPerms[schema]) {
91
+ hdbDescription[schema] = {};
92
+ }
93
+ }
94
+ return hdbDescription;
95
+ } catch (e) {
96
+ logger.error('Got an error in describeAll');
97
+ logger.error(e);
98
+ return handleHDBError(new Error(), HDB_ERROR_MSGS.DESCRIBE_ALL_ERR);
99
+ }
100
+ }
101
+
102
+ /**
103
+ * This method will return the metadata for a table - if `attrPerms` are passed as an argument (or included in the `describeTableObject` arg),
104
+ * the final results w/ be filtered based on those permissions
105
+ *
106
+ * @param describeTableObject
107
+ * @param attrPerms - optional - permissions for the role requesting metadata for the table used when chained to other
108
+ * internal operations. If this method is hit via the API, perms will be grabbed from the describeTableObject which
109
+ * includes the users role and permissions.
110
+ * @returns {Promise<{}|*>}
111
+ */
112
+ async function descTable(describeTableObject, attrPerms) {
113
+ hdbUtils.transformReq(describeTableObject);
114
+ let { schema, table } = describeTableObject;
115
+ schema = schema?.toString();
116
+ table = table?.toString();
117
+ let tableAttrPerms = attrPerms;
118
+
119
+ //If the describeTableObject includes a `hdb_user` value, it is being called from the API and we can grab the user's
120
+ // role permissions from there
121
+ if (describeTableObject.hdb_user && !describeTableObject.hdb_user?.role?.permission?.super_user) {
122
+ tableAttrPerms = describeTableObject.hdb_user?.role?.permission[schema]?.tables[table]?.attribute_permissions;
123
+ }
124
+
125
+ const validation = validateBySchema(
126
+ describeTableObject,
127
+ Joi.object({
128
+ database: Joi.string(),
129
+ table: Joi.string().required(),
130
+ exact_count: Joi.boolean().strict(),
131
+ include_computed: Joi.boolean().strict(),
132
+ })
133
+ );
134
+ if (validation) throw new ClientError(validation.message);
135
+
136
+ let databases = getDatabases();
137
+ let tables = databases[schema];
138
+ if (!tables) {
139
+ throw handleHDBError(
140
+ new Error(),
141
+ HDB_ERROR_MSGS.SCHEMA_NOT_FOUND(describeTableObject.schema),
142
+ HTTP_STATUS_CODES.NOT_FOUND
143
+ );
144
+ }
145
+ let tableObj = tables[table];
146
+ if (!tableObj)
147
+ throw handleHDBError(
148
+ new Error(),
149
+ HDB_ERROR_MSGS.TABLE_NOT_FOUND(describeTableObject.schema, describeTableObject.table),
150
+ HTTP_STATUS_CODES.NOT_FOUND
151
+ );
152
+
153
+ function pushAtt(att) {
154
+ if (!att.computed || describeTableObject.include_computed)
155
+ attributes.push({
156
+ attribute: att.attribute,
157
+ type: att.type,
158
+ elements: att.elements?.type,
159
+ indexed: att.indexed,
160
+ is_primary_key: att.isPrimaryKey,
161
+ assigned_created_time: att.assignCreatedTime,
162
+ assigned_updated_time: att.assignUpdatedTime,
163
+ nullable: att.nullable,
164
+ computed: att.computed ? true : undefined, // only include if computed
165
+ properties: att.properties
166
+ ? att.properties.map((prop) => {
167
+ return { type: prop.type, name: prop.name };
168
+ })
169
+ : undefined,
170
+ });
171
+ }
172
+
173
+ let attributes = [];
174
+ if (tableAttrPerms) {
175
+ let permittedAttr = {};
176
+ tableAttrPerms.forEach((a) => {
177
+ if (a.describe) permittedAttr[a.attribute_name] = true;
178
+ });
179
+
180
+ tableObj.attributes.forEach((a) => {
181
+ if (permittedAttr[a.name]) pushAtt(a);
182
+ });
183
+ } else {
184
+ tableObj.attributes?.forEach((att) => pushAtt(att));
185
+ }
186
+ let db_size;
187
+ try {
188
+ db_size = (await fs.stat(tableObj.primaryStore.path)).size;
189
+ } catch (error) {
190
+ logger.warn(`unable to get database size`, error);
191
+ }
192
+ let tableResult = {
193
+ schema,
194
+ name: tableObj.tableName,
195
+ primary_key: tableObj.attributes.find((attribute) => attribute.isPrimaryKey || attribute.isPrimaryKey)?.name,
196
+ audit: tableObj.audit,
197
+ schema_defined: tableObj.schemaDefined,
198
+ attributes,
199
+ db_size,
200
+ };
201
+ if (tableObj.replicate !== undefined) tableResult.replicate = tableObj.replicate;
202
+ if (tableObj.expirationMS !== undefined) tableResult.expiration = tableObj.expirationMS / 1000 + 's';
203
+ if (tableObj.sealed !== undefined) tableResult.sealed = tableObj.sealed;
204
+ if (tableObj.sources?.length > 0)
205
+ tableResult.sources = tableObj.sources
206
+ .map((source) => source.name)
207
+ .filter((source) => source && source !== 'Replicator');
208
+
209
+ try {
210
+ const recordCount = await tableObj.getRecordCount({ exactCount: !!describeTableObject.exact_count });
211
+ tableResult.record_count = recordCount.recordCount;
212
+ tableResult.table_size = tableObj.getSize();
213
+ tableResult.db_audit_size = tableObj.getAuditSize();
214
+ tableResult.estimated_record_range = recordCount.estimatedRange;
215
+ let auditStore = tableObj.auditStore;
216
+ if (auditStore) {
217
+ for (let key of auditStore.getKeys({ reverse: true, limit: 1 })) {
218
+ tableResult.last_updated_record = key[0];
219
+ }
220
+ }
221
+ if (!tableResult.last_updated_record && tableObj.indices.__updatedtime__) {
222
+ for (let key of tableObj.indices.__updatedtime__.getKeys({ reverse: true, limit: 1 })) {
223
+ tableResult.last_updated_record = key;
224
+ }
225
+ }
226
+ } catch (e) {
227
+ logger.warn(`unable to stat table dbi due to ${e}`);
228
+ }
229
+ return tableResult;
230
+ }
231
+
232
+ /**
233
+ * Returns the schema metadata filtered based on permissions for the user role making the request
234
+ *
235
+ * @param describeSchemaObject
236
+ * @returns {Promise<{}|[]>}
237
+ */
238
+ async function describeSchema(describeSchemaObject) {
239
+ hdbUtils.transformReq(describeSchemaObject);
240
+
241
+ const validation = validateBySchema(
242
+ describeSchemaObject,
243
+ Joi.object({
244
+ database: Joi.string(),
245
+ exact_count: Joi.boolean().strict(),
246
+ include_computed: Joi.boolean().strict(),
247
+ })
248
+ );
249
+ if (validation) throw new ClientError(validation.message);
250
+
251
+ let schemaPerms;
252
+
253
+ if (describeSchemaObject.hdb_user && !describeSchemaObject.hdb_user?.role?.permission?.super_user) {
254
+ schemaPerms = describeSchemaObject.hdb_user?.role?.permission[describeSchemaObject.schema];
255
+ }
256
+ const schemaName = describeSchemaObject.schema.toString();
257
+
258
+ let databases = getDatabases();
259
+ let schema = databases[schemaName];
260
+ if (!schema) {
261
+ throw handleHDBError(
262
+ new Error(),
263
+ HDB_ERROR_MSGS.SCHEMA_NOT_FOUND(describeSchemaObject.schema),
264
+ HTTP_STATUS_CODES.NOT_FOUND
265
+ );
266
+ }
267
+ let results = {};
268
+ for (let tableName in schema) {
269
+ let table_perms;
270
+ if (schemaPerms && schemaPerms.tables[tableName]) {
271
+ table_perms = schemaPerms.tables[tableName];
272
+ }
273
+ if (hdbUtils.isEmpty(table_perms) || table_perms.describe) {
274
+ let data = await descTable(
275
+ {
276
+ schema: describeSchemaObject.schema,
277
+ table: tableName,
278
+ exact_count: describeSchemaObject.exact_count,
279
+ include_computed: describeSchemaObject.include_computed,
280
+ },
281
+ table_perms ? table_perms.attribute_permissions : null
282
+ );
283
+ if (data) {
284
+ results[data.name] = data;
285
+ }
286
+ }
287
+ }
288
+ return results;
289
+ }
@@ -0,0 +1,60 @@
1
+ 'use strict';
2
+
3
+ module.exports = {
4
+ searchByConditions,
5
+ searchByHash,
6
+ searchByValue,
7
+ search,
8
+ };
9
+
10
+ const harperBridge = require('./harperBridge/harperBridge.js');
11
+ const { transformReq } = require('../utility/common_utils.js');
12
+
13
+ async function searchByConditions(searchObject) {
14
+ transformReq(searchObject);
15
+ return harperBridge.searchByConditions(searchObject);
16
+ }
17
+
18
+ async function searchByHash(searchObject) {
19
+ transformReq(searchObject);
20
+ if (searchObject.ids) searchObject.hash_values = searchObject.ids;
21
+ let array = [];
22
+ for await (let record of harperBridge.searchByHash(searchObject)) {
23
+ if (record) array.push(record);
24
+ }
25
+ return array;
26
+ }
27
+
28
+ async function searchByValue(searchObject) {
29
+ transformReq(searchObject);
30
+ if (searchObject.hasOwnProperty('desc') === true) {
31
+ searchObject.reverse = searchObject.desc;
32
+ }
33
+ const array = [];
34
+ for await (let record of harperBridge.searchByValue(searchObject)) {
35
+ array.push(record);
36
+ }
37
+ return array;
38
+ }
39
+
40
+ function search(statement, callback) {
41
+ try {
42
+ const SelectValidator = require('../sqlTranslator/SelectValidator.js');
43
+ const SQLSearch = require('./SQLSearch.js');
44
+ let validator = new SelectValidator(statement);
45
+ validator.validate();
46
+
47
+ let sqlSearch = new SQLSearch(validator.statement, validator.attributes);
48
+
49
+ sqlSearch
50
+ .search()
51
+ .then((data) => {
52
+ callback(null, data);
53
+ })
54
+ .catch((e) => {
55
+ callback(e, null);
56
+ });
57
+ } catch (e) {
58
+ return callback(e);
59
+ }
60
+ }