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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (444) hide show
  1. package/bin/BinObjects.js +17 -0
  2. package/bin/cliOperations.js +157 -0
  3. package/bin/copyDb.ts +280 -0
  4. package/bin/harper.js +156 -0
  5. package/bin/install.js +15 -0
  6. package/bin/lite.js +5 -0
  7. package/bin/restart.js +201 -0
  8. package/bin/run.js +409 -0
  9. package/bin/status.js +65 -0
  10. package/bin/stop.js +22 -0
  11. package/bin/upgrade.js +134 -0
  12. package/components/Application.ts +646 -0
  13. package/components/ApplicationScope.ts +49 -0
  14. package/components/Component.ts +53 -0
  15. package/components/ComponentV1.ts +342 -0
  16. package/components/DEFAULT_CONFIG.ts +18 -0
  17. package/components/EntryHandler.ts +227 -0
  18. package/components/Logger.ts +14 -0
  19. package/components/OptionsWatcher.ts +354 -0
  20. package/components/PluginModule.ts +6 -0
  21. package/components/Scope.ts +329 -0
  22. package/components/componentLoader.ts +529 -0
  23. package/components/deriveCommonPatternBase.ts +31 -0
  24. package/components/deriveGlobOptions.ts +44 -0
  25. package/components/deriveURLPath.ts +57 -0
  26. package/components/operations.js +658 -0
  27. package/components/operationsValidation.js +246 -0
  28. package/components/packageComponent.ts +39 -0
  29. package/components/requestRestart.ts +26 -0
  30. package/components/resolveBaseURLPath.ts +38 -0
  31. package/components/status/ComponentStatus.ts +110 -0
  32. package/components/status/ComponentStatusRegistry.ts +251 -0
  33. package/components/status/api.ts +153 -0
  34. package/components/status/crossThread.ts +405 -0
  35. package/components/status/errors.ts +152 -0
  36. package/components/status/index.ts +44 -0
  37. package/components/status/internal.ts +65 -0
  38. package/components/status/registry.ts +12 -0
  39. package/components/status/types.ts +96 -0
  40. package/config/RootConfigWatcher.ts +59 -0
  41. package/config/configHelpers.ts +11 -0
  42. package/config/configUtils.js +967 -0
  43. package/config/harperConfigEnvVars.ts +641 -0
  44. package/dataLayer/CreateAttributeObject.js +25 -0
  45. package/dataLayer/CreateTableObject.js +11 -0
  46. package/dataLayer/DataLayerObjects.js +43 -0
  47. package/dataLayer/DeleteBeforeObject.js +22 -0
  48. package/dataLayer/DeleteObject.js +25 -0
  49. package/dataLayer/DropAttributeObject.js +11 -0
  50. package/dataLayer/GetBackupObject.js +22 -0
  51. package/dataLayer/InsertObject.js +24 -0
  52. package/dataLayer/ReadAuditLogObject.js +24 -0
  53. package/dataLayer/SQLSearch.js +1335 -0
  54. package/dataLayer/SearchByConditionsObject.js +61 -0
  55. package/dataLayer/SearchByHashObject.js +21 -0
  56. package/dataLayer/SearchObject.js +45 -0
  57. package/dataLayer/SqlSearchObject.js +14 -0
  58. package/dataLayer/UpdateObject.js +23 -0
  59. package/dataLayer/UpsertObject.js +23 -0
  60. package/dataLayer/bulkLoad.js +813 -0
  61. package/dataLayer/dataObjects/BulkLoadObjects.js +27 -0
  62. package/dataLayer/dataObjects/UpsertObject.js +23 -0
  63. package/dataLayer/delete.js +164 -0
  64. package/dataLayer/export.js +381 -0
  65. package/dataLayer/getBackup.js +40 -0
  66. package/dataLayer/harperBridge/BridgeMethods.js +81 -0
  67. package/dataLayer/harperBridge/ResourceBridge.ts +633 -0
  68. package/dataLayer/harperBridge/bridgeUtility/insertUpdateReturnObj.js +28 -0
  69. package/dataLayer/harperBridge/bridgeUtility/insertUpdateValidate.js +88 -0
  70. package/dataLayer/harperBridge/harperBridge.js +21 -0
  71. package/dataLayer/harperBridge/lmdbBridge/LMDBBridge.js +119 -0
  72. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/DeleteAuditLogsBeforeResults.js +19 -0
  73. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateAttribute.js +112 -0
  74. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateRecords.js +67 -0
  75. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateSchema.js +31 -0
  76. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateTable.js +94 -0
  77. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDeleteAuditLogsBefore.js +98 -0
  78. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDeleteRecords.js +89 -0
  79. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDropAttribute.js +109 -0
  80. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDropSchema.js +107 -0
  81. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDropTable.js +137 -0
  82. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbFlush.js +35 -0
  83. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbGetBackup.js +111 -0
  84. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbGetDataByHash.js +28 -0
  85. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbGetDataByValue.js +29 -0
  86. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbReadAuditLog.js +207 -0
  87. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbSearchByConditions.js +156 -0
  88. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbSearchByHash.js +21 -0
  89. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbSearchByValue.js +30 -0
  90. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbTransaction.js +19 -0
  91. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbUpdateRecords.js +64 -0
  92. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbUpsertRecords.js +70 -0
  93. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBCreateAttributeObject.js +22 -0
  94. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBDeleteTransactionObject.js +23 -0
  95. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBInsertTransactionObject.js +22 -0
  96. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBTransactionObject.js +23 -0
  97. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBUpdateTransactionObject.js +24 -0
  98. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBUpsertTransactionObject.js +24 -0
  99. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/TableSizeObject.js +25 -0
  100. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/initializeHashSearch.js +21 -0
  101. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/initializePaths.js +157 -0
  102. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbCheckForNewAttributes.js +94 -0
  103. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbCreateTransactionsAuditEnvironment.js +39 -0
  104. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbGetTableSize.js +34 -0
  105. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbProcessRows.js +100 -0
  106. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbSearch.js +371 -0
  107. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbWriteTransaction.js +109 -0
  108. package/dataLayer/hdbInfoController.js +254 -0
  109. package/dataLayer/insert.js +266 -0
  110. package/dataLayer/readAuditLog.js +59 -0
  111. package/dataLayer/schema.js +366 -0
  112. package/dataLayer/schemaDescribe.js +289 -0
  113. package/dataLayer/search.js +60 -0
  114. package/dataLayer/transaction.js +17 -0
  115. package/dataLayer/update.js +124 -0
  116. package/dist/components/Logger.d.ts +12 -0
  117. package/dist/components/Logger.js +3 -0
  118. package/dist/components/Logger.js.map +1 -0
  119. package/dist/components/Scope.d.ts +14 -4
  120. package/dist/components/Scope.js +18 -10
  121. package/dist/components/Scope.js.map +1 -1
  122. package/dist/components/componentLoader.js +16 -9
  123. package/dist/components/componentLoader.js.map +1 -1
  124. package/dist/components/operations.js +2 -2
  125. package/dist/components/operations.js.map +1 -1
  126. package/dist/config/configUtils.d.ts +1 -1
  127. package/dist/config/configUtils.js +1 -1
  128. package/dist/config/configUtils.js.map +1 -1
  129. package/dist/dataLayer/CreateTableObject.d.ts +2 -2
  130. package/dist/dataLayer/CreateTableObject.js +2 -2
  131. package/dist/dataLayer/CreateTableObject.js.map +1 -1
  132. package/dist/dataLayer/delete.d.ts +1 -1
  133. package/dist/dataLayer/schema.js +6 -5
  134. package/dist/dataLayer/schema.js.map +1 -1
  135. package/dist/dataLayer/schemaDescribe.js +1 -1
  136. package/dist/dataLayer/schemaDescribe.js.map +1 -1
  137. package/dist/index.d.ts +1 -1
  138. package/dist/index.js +2 -0
  139. package/dist/index.js.map +1 -1
  140. package/dist/resources/DatabaseTransaction.d.ts +1 -1
  141. package/dist/resources/IterableEventQueue.d.ts +1 -1
  142. package/dist/resources/LMDBTransaction.d.ts +5 -1
  143. package/dist/resources/Resource.d.ts +1 -1
  144. package/dist/resources/RocksIndexStore.d.ts +3 -3
  145. package/dist/resources/RocksTransactionLogStore.d.ts +6 -3
  146. package/dist/resources/Table.d.ts +15 -6
  147. package/dist/resources/Table.js +4 -1
  148. package/dist/resources/Table.js.map +1 -1
  149. package/dist/resources/analytics/read.js +32 -22
  150. package/dist/resources/analytics/read.js.map +1 -1
  151. package/dist/resources/analytics/write.js +3 -6
  152. package/dist/resources/analytics/write.js.map +1 -1
  153. package/dist/resources/auditStore.d.ts +3 -3
  154. package/dist/resources/blob.d.ts +25 -2
  155. package/dist/resources/databases.d.ts +12 -2
  156. package/dist/resources/databases.js +22 -19
  157. package/dist/resources/databases.js.map +1 -1
  158. package/dist/resources/search.js +11 -5
  159. package/dist/resources/search.js.map +1 -1
  160. package/dist/resources/transaction.d.ts +2 -1
  161. package/dist/security/auth.js +1 -1
  162. package/dist/security/auth.js.map +1 -1
  163. package/dist/security/cryptoHash.d.ts +2 -2
  164. package/dist/security/jsLoader.js +243 -66
  165. package/dist/security/jsLoader.js.map +1 -1
  166. package/dist/security/keys.js +4 -5
  167. package/dist/security/keys.js.map +1 -1
  168. package/dist/security/user.js +3 -3
  169. package/dist/security/user.js.map +1 -1
  170. package/dist/server/REST.js +16 -2
  171. package/dist/server/REST.js.map +1 -1
  172. package/dist/server/Server.d.ts +2 -1
  173. package/dist/server/Server.js.map +1 -1
  174. package/dist/server/fastifyRoutes/plugins/hdbCore.d.ts +6 -1
  175. package/dist/server/fastifyRoutes.js +2 -0
  176. package/dist/server/fastifyRoutes.js.map +1 -1
  177. package/dist/server/http.js +12 -6
  178. package/dist/server/http.js.map +1 -1
  179. package/dist/server/jobs/JobObject.d.ts +3 -3
  180. package/dist/server/loadRootComponents.js +1 -0
  181. package/dist/server/loadRootComponents.js.map +1 -1
  182. package/dist/server/operationsServer.js +3 -1
  183. package/dist/server/operationsServer.js.map +1 -1
  184. package/dist/server/serverHelpers/JSONStream.d.ts +3 -3
  185. package/dist/server/serverHelpers/Request.d.ts +5 -5
  186. package/dist/server/serverHelpers/requestTimePlugin.d.ts +1 -1
  187. package/dist/server/threads/manageThreads.d.ts +2 -2
  188. package/dist/server/threads/manageThreads.js +50 -35
  189. package/dist/server/threads/manageThreads.js.map +1 -1
  190. package/dist/server/threads/socketRouter.d.ts +1 -1
  191. package/dist/sqlTranslator/deleteTranslator.d.ts +1 -1
  192. package/dist/utility/AWS/AWSConnector.d.ts +3 -2
  193. package/dist/utility/common_utils.d.ts +3 -3
  194. package/dist/utility/environment/systemInformation.d.ts +1 -0
  195. package/dist/utility/functions/date/dateFunctions.d.ts +11 -11
  196. package/dist/utility/globalSchema.d.ts +1 -1
  197. package/dist/utility/hdbTerms.d.ts +3 -0
  198. package/dist/utility/hdbTerms.js +3 -0
  199. package/dist/utility/hdbTerms.js.map +1 -1
  200. package/dist/utility/installation.d.ts +2 -4
  201. package/dist/utility/installation.js.map +1 -1
  202. package/dist/utility/lmdb/commonUtility.d.ts +1 -0
  203. package/dist/utility/lmdb/deleteUtility.d.ts +1 -0
  204. package/dist/utility/lmdb/environmentUtility.d.ts +1 -0
  205. package/dist/utility/lmdb/searchUtility.d.ts +2 -1
  206. package/dist/utility/lmdb/writeUtility.d.ts +1 -0
  207. package/dist/utility/logging/harper_logger.d.ts +6 -6
  208. package/dist/utility/processManagement/processManagement.d.ts +1 -1
  209. package/dist/utility/processManagement/servicesConfig.d.ts +12 -6
  210. package/dist/validation/common_validators.d.ts +4 -3
  211. package/dist/validation/configValidator.d.ts +3 -2
  212. package/index.d.ts +56 -0
  213. package/index.js +41 -0
  214. package/json/systemSchema.json +373 -0
  215. package/launchServiceScripts/launchHarperDB.js +3 -0
  216. package/launchServiceScripts/utility/checkNodeVersion.js +15 -0
  217. package/package.json +21 -3
  218. package/resources/DatabaseTransaction.ts +378 -0
  219. package/resources/ErrorResource.ts +57 -0
  220. package/resources/IterableEventQueue.ts +94 -0
  221. package/resources/LMDBTransaction.ts +349 -0
  222. package/resources/RecordEncoder.ts +702 -0
  223. package/resources/RequestTarget.ts +134 -0
  224. package/resources/Resource.ts +789 -0
  225. package/resources/ResourceInterface.ts +221 -0
  226. package/resources/ResourceInterfaceV2.ts +53 -0
  227. package/resources/ResourceV2.ts +67 -0
  228. package/resources/Resources.ts +162 -0
  229. package/resources/RocksIndexStore.ts +70 -0
  230. package/resources/RocksTransactionLogStore.ts +352 -0
  231. package/resources/Table.ts +4527 -0
  232. package/resources/analytics/hostnames.ts +72 -0
  233. package/resources/analytics/metadata.ts +10 -0
  234. package/resources/analytics/read.ts +252 -0
  235. package/resources/analytics/write.ts +803 -0
  236. package/resources/auditStore.ts +556 -0
  237. package/resources/blob.ts +1268 -0
  238. package/resources/crdt.ts +125 -0
  239. package/resources/dataLoader.ts +527 -0
  240. package/resources/databases.ts +1290 -0
  241. package/resources/graphql.ts +221 -0
  242. package/resources/indexes/HierarchicalNavigableSmallWorld.ts +638 -0
  243. package/resources/indexes/customIndexes.ts +7 -0
  244. package/resources/indexes/vector.ts +38 -0
  245. package/resources/jsResource.ts +86 -0
  246. package/resources/loadEnv.ts +22 -0
  247. package/resources/login.ts +18 -0
  248. package/resources/openApi.ts +409 -0
  249. package/resources/registrationDeprecated.ts +8 -0
  250. package/resources/replayLogs.ts +136 -0
  251. package/resources/roles.ts +98 -0
  252. package/resources/search.ts +1301 -0
  253. package/resources/tracked.ts +584 -0
  254. package/resources/transaction.ts +89 -0
  255. package/resources/transactionBroadcast.ts +258 -0
  256. package/security/auth.ts +376 -0
  257. package/security/certificateVerification/certificateVerificationSource.ts +84 -0
  258. package/security/certificateVerification/configValidation.ts +107 -0
  259. package/security/certificateVerification/crlVerification.ts +623 -0
  260. package/security/certificateVerification/index.ts +121 -0
  261. package/security/certificateVerification/ocspVerification.ts +148 -0
  262. package/security/certificateVerification/pkijs-ed25519-patch.ts +188 -0
  263. package/security/certificateVerification/types.ts +128 -0
  264. package/security/certificateVerification/verificationConfig.ts +138 -0
  265. package/security/certificateVerification/verificationUtils.ts +447 -0
  266. package/security/cryptoHash.js +42 -0
  267. package/security/data_objects/PermissionAttributeResponseObject.js +15 -0
  268. package/security/data_objects/PermissionResponseObject.js +115 -0
  269. package/security/data_objects/PermissionTableResponseObject.js +20 -0
  270. package/security/fastifyAuth.js +169 -0
  271. package/security/impersonation.ts +160 -0
  272. package/security/jsLoader.ts +716 -0
  273. package/security/keys.js +948 -0
  274. package/security/permissionsTranslator.js +300 -0
  275. package/security/role.js +218 -0
  276. package/security/tokenAuthentication.ts +228 -0
  277. package/security/user.ts +449 -0
  278. package/server/DurableSubscriptionsSession.ts +503 -0
  279. package/server/REST.ts +407 -0
  280. package/server/Server.ts +89 -0
  281. package/server/fastifyRoutes/helpers/getCORSOptions.js +36 -0
  282. package/server/fastifyRoutes/helpers/getHeaderTimeoutConfig.js +15 -0
  283. package/server/fastifyRoutes/helpers/getServerOptions.js +33 -0
  284. package/server/fastifyRoutes/plugins/hdbCore.js +39 -0
  285. package/server/fastifyRoutes.ts +205 -0
  286. package/server/graphqlQuerying.ts +700 -0
  287. package/server/http.ts +640 -0
  288. package/server/itc/serverHandlers.js +161 -0
  289. package/server/itc/utility/ITCEventObject.js +10 -0
  290. package/server/jobs/JobObject.js +24 -0
  291. package/server/jobs/jobProcess.js +69 -0
  292. package/server/jobs/jobRunner.js +162 -0
  293. package/server/jobs/jobs.js +304 -0
  294. package/server/loadRootComponents.js +44 -0
  295. package/server/mqtt.ts +485 -0
  296. package/server/nodeName.ts +75 -0
  297. package/server/operationsServer.ts +313 -0
  298. package/server/serverHelpers/Headers.ts +108 -0
  299. package/server/serverHelpers/JSONStream.ts +269 -0
  300. package/server/serverHelpers/OperationFunctionObject.ts +13 -0
  301. package/server/serverHelpers/Request.ts +158 -0
  302. package/server/serverHelpers/contentTypes.ts +637 -0
  303. package/server/serverHelpers/requestTimePlugin.js +57 -0
  304. package/server/serverHelpers/serverHandlers.js +148 -0
  305. package/server/serverHelpers/serverUtilities.ts +473 -0
  306. package/server/serverRegistry.ts +8 -0
  307. package/server/static.ts +187 -0
  308. package/server/status/definitions.ts +37 -0
  309. package/server/status/index.ts +125 -0
  310. package/server/storageReclamation.ts +93 -0
  311. package/server/threads/itc.js +89 -0
  312. package/server/threads/manageThreads.js +594 -0
  313. package/server/threads/socketRouter.ts +360 -0
  314. package/server/threads/threadServer.js +279 -0
  315. package/server/throttle.ts +73 -0
  316. package/sqlTranslator/SelectValidator.js +330 -0
  317. package/sqlTranslator/alasqlFunctionImporter.js +62 -0
  318. package/sqlTranslator/deleteTranslator.js +67 -0
  319. package/sqlTranslator/index.js +242 -0
  320. package/sqlTranslator/sql_statement_bucket.js +472 -0
  321. package/static/defaultConfig.yaml +3 -0
  322. package/studio/web/HDBDogOnly.svg +78 -0
  323. package/studio/web/assets/PPRadioGrotesk-Bold-DDaUYG8E.woff +0 -0
  324. package/studio/web/assets/fa-brands-400-CEJbCg16.woff +0 -0
  325. package/studio/web/assets/fa-brands-400-CSYNqBb_.ttf +0 -0
  326. package/studio/web/assets/fa-brands-400-DnkPfk3o.eot +0 -0
  327. package/studio/web/assets/fa-brands-400-UxlILjvJ.woff2 +0 -0
  328. package/studio/web/assets/fa-brands-400-cH1MgKbP.svg +3717 -0
  329. package/studio/web/assets/fa-regular-400-BhTwtT8w.eot +0 -0
  330. package/studio/web/assets/fa-regular-400-D1vz6WBx.ttf +0 -0
  331. package/studio/web/assets/fa-regular-400-DFnMcJPd.woff +0 -0
  332. package/studio/web/assets/fa-regular-400-DGzu1beS.woff2 +0 -0
  333. package/studio/web/assets/fa-regular-400-gwj8Pxq-.svg +801 -0
  334. package/studio/web/assets/fa-solid-900-B4ZZ7kfP.svg +5034 -0
  335. package/studio/web/assets/fa-solid-900-B6Axprfb.eot +0 -0
  336. package/studio/web/assets/fa-solid-900-BUswJgRo.woff2 +0 -0
  337. package/studio/web/assets/fa-solid-900-DOXgCApm.woff +0 -0
  338. package/studio/web/assets/fa-solid-900-mxuxnBEa.ttf +0 -0
  339. package/studio/web/assets/index-BTgXJX9d.js +235 -0
  340. package/studio/web/assets/index-BTgXJX9d.js.map +1 -0
  341. package/studio/web/assets/index-C-GXfcup.js +37 -0
  342. package/studio/web/assets/index-C-GXfcup.js.map +1 -0
  343. package/studio/web/assets/index-PFlNdimM.js +2 -0
  344. package/studio/web/assets/index-PFlNdimM.js.map +1 -0
  345. package/studio/web/assets/index-Y2g_iFpU.css +1 -0
  346. package/studio/web/assets/index-jiPwkrsB.css +1 -0
  347. package/studio/web/assets/index.lazy-C3TJZJ4o.js +266 -0
  348. package/studio/web/assets/index.lazy-C3TJZJ4o.js.map +1 -0
  349. package/studio/web/assets/profiler-DotzgiCJ.js +2 -0
  350. package/studio/web/assets/profiler-DotzgiCJ.js.map +1 -0
  351. package/studio/web/assets/react-redux-VxUEx_mU.js +6 -0
  352. package/studio/web/assets/react-redux-VxUEx_mU.js.map +1 -0
  353. package/studio/web/assets/startRecording-B_9J9Csd.js +3 -0
  354. package/studio/web/assets/startRecording-B_9J9Csd.js.map +1 -0
  355. package/studio/web/fabric-signup-background.webp +0 -0
  356. package/studio/web/fabric-signup-text.png +0 -0
  357. package/studio/web/favicon_purple.png +0 -0
  358. package/studio/web/github-icon.svg +15 -0
  359. package/studio/web/harper-fabric_black.png +0 -0
  360. package/studio/web/harper-fabric_white.png +0 -0
  361. package/studio/web/harper-studio_white.png +0 -0
  362. package/studio/web/index.html +16 -0
  363. package/studio/web/running.css +148 -0
  364. package/studio/web/running.html +147 -0
  365. package/studio/web/running.js +111 -0
  366. package/upgrade/UpgradeObjects.js +13 -0
  367. package/upgrade/directives/directivesController.js +90 -0
  368. package/upgrade/directivesManager.js +139 -0
  369. package/upgrade/upgradePrompt.js +124 -0
  370. package/upgrade/upgradeUtilities.js +28 -0
  371. package/utility/AWS/AWSConnector.js +29 -0
  372. package/utility/OperationFunctionCaller.js +63 -0
  373. package/utility/assignCmdEnvVariables.js +62 -0
  374. package/utility/common_utils.js +867 -0
  375. package/utility/environment/environmentManager.js +208 -0
  376. package/utility/environment/systemInformation.js +355 -0
  377. package/utility/errors/commonErrors.js +267 -0
  378. package/utility/errors/hdbError.js +146 -0
  379. package/utility/functions/date/dateFunctions.js +65 -0
  380. package/utility/functions/geo.js +355 -0
  381. package/utility/functions/sql/alaSQLExtension.js +104 -0
  382. package/utility/globalSchema.js +35 -0
  383. package/utility/hdbTerms.ts +819 -0
  384. package/utility/install/checkJWTTokensExist.js +62 -0
  385. package/utility/install/harperdb.conf +15 -0
  386. package/utility/install/harperdb.service +14 -0
  387. package/utility/install/installer.js +635 -0
  388. package/utility/installation.ts +30 -0
  389. package/utility/lmdb/DBIDefinition.js +20 -0
  390. package/utility/lmdb/DeleteRecordsResponseObject.js +25 -0
  391. package/utility/lmdb/InsertRecordsResponseObject.js +22 -0
  392. package/utility/lmdb/OpenDBIObject.js +31 -0
  393. package/utility/lmdb/OpenEnvironmentObject.js +41 -0
  394. package/utility/lmdb/UpdateRecordsResponseObject.js +25 -0
  395. package/utility/lmdb/UpsertRecordsResponseObject.js +22 -0
  396. package/utility/lmdb/cleanLMDBMap.js +65 -0
  397. package/utility/lmdb/commonUtility.js +119 -0
  398. package/utility/lmdb/deleteUtility.js +128 -0
  399. package/utility/lmdb/environmentUtility.js +477 -0
  400. package/utility/lmdb/searchCursorFunctions.js +187 -0
  401. package/utility/lmdb/searchUtility.js +918 -0
  402. package/utility/lmdb/terms.js +57 -0
  403. package/utility/lmdb/writeUtility.js +407 -0
  404. package/utility/logging/harper_logger.js +876 -0
  405. package/utility/logging/logRotator.js +157 -0
  406. package/utility/logging/logger.ts +24 -0
  407. package/utility/logging/readLog.js +355 -0
  408. package/utility/logging/transactionLog.js +57 -0
  409. package/utility/mount_hdb.js +59 -0
  410. package/utility/npmUtilities.js +102 -0
  411. package/utility/operationPermissions.ts +112 -0
  412. package/utility/operation_authorization.js +836 -0
  413. package/utility/packageUtils.js +55 -0
  414. package/utility/password.ts +99 -0
  415. package/utility/processManagement/processManagement.js +187 -0
  416. package/utility/processManagement/servicesConfig.js +56 -0
  417. package/utility/scripts/restartHdb.js +24 -0
  418. package/utility/scripts/user_data.sh +13 -0
  419. package/utility/signalling.js +36 -0
  420. package/utility/terms/certificates.js +81 -0
  421. package/utility/when.ts +20 -0
  422. package/v1.d.ts +39 -0
  423. package/v1.js +41 -0
  424. package/v2.d.ts +39 -0
  425. package/v2.js +41 -0
  426. package/validation/bulkDeleteValidator.js +24 -0
  427. package/validation/check_permissions.js +19 -0
  428. package/validation/common_validators.js +95 -0
  429. package/validation/configValidator.js +331 -0
  430. package/validation/deleteValidator.js +15 -0
  431. package/validation/fileLoadValidator.js +153 -0
  432. package/validation/insertValidator.js +40 -0
  433. package/validation/installValidator.js +37 -0
  434. package/validation/readLogValidator.js +64 -0
  435. package/validation/role_validation.js +320 -0
  436. package/validation/schemaMetadataValidator.js +42 -0
  437. package/validation/searchValidator.js +166 -0
  438. package/validation/statusValidator.ts +66 -0
  439. package/validation/transactionLogValidator.js +33 -0
  440. package/validation/user_validation.js +55 -0
  441. package/validation/validationWrapper.js +105 -0
  442. package/dist/resources/analytics/profile.d.ts +0 -2
  443. package/dist/resources/analytics/profile.js +0 -144
  444. package/dist/resources/analytics/profile.js.map +0 -1
@@ -0,0 +1,81 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * BridgeMethods Class provides a framework for all HarperBridge method classes
5
+ */
6
+
7
+ class BridgeMethods {
8
+ createSchema() {
9
+ throw new Error('createSchema bridge method is not defined');
10
+ }
11
+
12
+ dropSchema() {
13
+ throw new Error('dropSchema bridge method is not defined');
14
+ }
15
+
16
+ createTable() {
17
+ throw new Error('createTable bridge method is not defined');
18
+ }
19
+
20
+ dropTable() {
21
+ throw new Error('dropTable bridge method is not defined');
22
+ }
23
+
24
+ createRecords() {
25
+ throw new Error('createRecords bridge method is not defined');
26
+ }
27
+
28
+ updateRecords() {
29
+ throw new Error('updateRecords bridge method is not defined');
30
+ }
31
+
32
+ async upsertRecords() {
33
+ throw new Error('upsertRecords bridge method is not defined');
34
+ }
35
+
36
+ deleteRecords() {
37
+ throw new Error('deleteRecords bridge method is not defined');
38
+ }
39
+
40
+ createAttribute() {
41
+ throw new Error('createAttribute bridge method is not defined');
42
+ }
43
+
44
+ dropAttribute() {
45
+ throw new Error('dropAttribute bridge method is not defined');
46
+ }
47
+
48
+ searchByConditions() {
49
+ throw new Error('searchByConditions bridge method is not defined');
50
+ }
51
+
52
+ searchByHash() {
53
+ throw new Error('searchByHash bridge method is not defined');
54
+ }
55
+
56
+ searchByValue() {
57
+ throw new Error('searchByValue bridge method is not defined');
58
+ }
59
+
60
+ getDataByHash() {
61
+ throw new Error('getDataByHash bridge method is not defined');
62
+ }
63
+
64
+ getDataByValue() {
65
+ throw new Error('getDataByValue bridge method is not defined');
66
+ }
67
+
68
+ deleteRecordsBefore() {
69
+ throw new Error('deleteRecordsBefore bridge method is not defined');
70
+ }
71
+
72
+ deleteAuditLogsBefore() {
73
+ throw new Error('deleteAuditLogsBefore bridge method is not defined');
74
+ }
75
+
76
+ async readAuditLog() {
77
+ throw new Error('readAuditLog bridge method is not defined');
78
+ }
79
+ }
80
+
81
+ module.exports = BridgeMethods;
@@ -0,0 +1,633 @@
1
+ import LMDBBridge from './lmdbBridge/LMDBBridge.js';
2
+ import searchValidator from '../../validation/searchValidator.js';
3
+ import { handleHDBError, ClientError, hdbErrors } from '../../utility/errors/hdbError.js';
4
+ import { table, getDatabases, database, dropDatabase } from '../../resources/databases.ts';
5
+ import insertUpdateValidate from './bridgeUtility/insertUpdateValidate.js';
6
+ import SearchObject from '../SearchObject.js';
7
+ import {
8
+ OPERATIONS_ENUM,
9
+ VALUE_SEARCH_COMPARATORS,
10
+ VALUE_SEARCH_COMPARATORS_REVERSE_LOOKUP,
11
+ READ_AUDIT_LOG_SEARCH_TYPES_ENUM,
12
+ } from '../../utility/hdbTerms.ts';
13
+ import * as signalling from '../../utility/signalling.js';
14
+ import { SchemaEventMsg } from '../../server/threads/itc.js';
15
+ import { asyncSetTimeout } from '../../utility/common_utils.js';
16
+ import { transaction } from '../../resources/transaction.ts';
17
+ import type { Condition, Query, Context, Select, Id, DirectCondition } from '../../resources/ResourceInterface.ts';
18
+ import { collapseData } from '../../resources/tracked.ts';
19
+ import { errorToString } from '../../utility/logging/harper_logger.js';
20
+
21
+ const { HDB_ERROR_MSGS } = hdbErrors;
22
+ const DEFAULT_DATABASE = 'data';
23
+ const DELETE_CHUNK = 10000;
24
+ const DELETE_PAUSE_MS = 10;
25
+
26
+ export type SearchByConditionsRequest = Query &
27
+ Context & {
28
+ schema?: string;
29
+ database?: string;
30
+ table: string;
31
+ get_attributes: Select;
32
+ reverse?: boolean;
33
+ };
34
+
35
+ /**
36
+ * Currently we are extending LMDBBridge so we can use the LMDB methods as a fallback until all our RAPI methods are
37
+ * implemented
38
+ */
39
+ export class ResourceBridge extends LMDBBridge {
40
+ async searchByConditions(searchObject: SearchByConditionsRequest) {
41
+ if (searchObject.select !== undefined) searchObject.get_attributes = searchObject.select;
42
+
43
+ const table = getTable(searchObject);
44
+ if (!table) {
45
+ throw new ClientError(`Table ${searchObject.table} not found`);
46
+ }
47
+
48
+ searchObject.conditions = searchObject.conditions.map(mapCondition);
49
+ function mapCondition(condition: Condition) {
50
+ if ('conditions' in condition && condition.conditions) {
51
+ condition.conditions = condition.conditions.map(mapCondition);
52
+ return condition;
53
+ } else {
54
+ const c = condition as DirectCondition;
55
+ return {
56
+ attribute: c.attribute ?? c.search_attribute,
57
+ comparator: c.comparator ?? c.search_type,
58
+ value: c.value !== undefined ? c.value : c.search_value, // null is valid value
59
+ };
60
+ }
61
+ }
62
+
63
+ const validationError = searchValidator(searchObject, 'conditions');
64
+ if (validationError) {
65
+ throw handleHDBError(validationError, validationError.message, 400, undefined, undefined, true);
66
+ }
67
+
68
+ return table.search(
69
+ {
70
+ conditions: searchObject.conditions,
71
+ //set the operator to always be lowercase for later evaluations
72
+ operator: searchObject.operator ? searchObject.operator.toLowerCase() : undefined,
73
+ limit: searchObject.limit,
74
+ offset: searchObject.offset,
75
+ reverse: searchObject.reverse,
76
+ select: getSelect(searchObject, table),
77
+ sort: searchObject.sort,
78
+ allowFullScan: true, // operations API can do full scans by default, but REST is more cautious about what it allows
79
+ },
80
+ {
81
+ onlyIfCached: searchObject.onlyIfCached,
82
+ noCacheStore: searchObject.noCacheStore,
83
+ noCache: searchObject.noCache,
84
+ replicateFrom: searchObject.replicateFrom,
85
+ }
86
+ );
87
+ }
88
+
89
+ /**
90
+ * Writes new table data to the system tables creates the environment file and creates two datastores to track created and updated
91
+ * timestamps for new table data.
92
+ * @param tableSystemData
93
+ * @param tableCreateObj
94
+ */
95
+ async createTable(tableSystemData, tableCreateObj) {
96
+ let attributes = tableCreateObj.attributes;
97
+ const schemaDefined = Boolean(attributes);
98
+ const primaryKeyName = tableCreateObj.primary_key || tableCreateObj.hash_attribute;
99
+ if (attributes) {
100
+ // allow for attributes to be specified, but do some massaging to make sure they are in the right form
101
+ for (const attribute of attributes) {
102
+ if (attribute.is_primary_key) {
103
+ attribute.isPrimaryKey = true;
104
+ delete attribute.is_primary_key;
105
+ } else if (attribute.name === primaryKeyName && primaryKeyName) attribute.isPrimaryKey = true;
106
+ }
107
+ } else {
108
+ // legacy default schema for tables created through operations API without attributes
109
+ if (!primaryKeyName)
110
+ throw new ClientError('A primary key must be specified with a `primary_key` property or with `attributes`');
111
+ attributes = [
112
+ { name: primaryKeyName, isPrimaryKey: true },
113
+ { name: '__createdtime__', indexed: true },
114
+ { name: '__updatedtime__', indexed: true },
115
+ ];
116
+ }
117
+ table({
118
+ database: tableCreateObj.database ?? tableCreateObj.schema,
119
+ table: tableCreateObj.table,
120
+ attributes,
121
+ schemaDefined,
122
+ expiration: tableCreateObj.expiration,
123
+ audit: tableCreateObj.audit,
124
+ });
125
+ }
126
+
127
+ async createAttribute(createAttributeObj) {
128
+ await getTable(createAttributeObj).addAttributes([
129
+ {
130
+ name: createAttributeObj.attribute,
131
+ indexed: createAttributeObj.indexed ?? true,
132
+ },
133
+ ]);
134
+ return `attribute ${createAttributeObj.schema}.${createAttributeObj.table}.${createAttributeObj.attribute} successfully created.`;
135
+ }
136
+
137
+ async dropAttribute(dropAttributeObj) {
138
+ const Table = getTable(dropAttributeObj);
139
+ await Table.removeAttributes([dropAttributeObj.attribute]);
140
+ if (!Table.schemaDefined) {
141
+ // legacy behavior of deleting all the property values
142
+ const property = dropAttributeObj.attribute;
143
+ let resolution;
144
+ const deleteRecord = (key, record, version): Promise<void> => {
145
+ record = { ...record };
146
+ delete record[property];
147
+ return Table.primaryStore.put(key, record, version);
148
+ };
149
+ for (const { key, value: record, version } of Table.primaryStore.getRange({ start: true, versions: true })) {
150
+ resolution = deleteRecord(key, record, version);
151
+ await new Promise((resolve) => setImmediate(resolve));
152
+ }
153
+ await resolution;
154
+ }
155
+ return `successfully deleted ${dropAttributeObj.schema}.${dropAttributeObj.table}.${dropAttributeObj.attribute}`;
156
+ }
157
+
158
+ dropTable(dropTableObject) {
159
+ return getTable(dropTableObject).dropTable();
160
+ }
161
+
162
+ createSchema(createSchemaObj) {
163
+ database({
164
+ database: createSchemaObj.schema,
165
+ table: null,
166
+ });
167
+ return signalling.signalSchemaChange(
168
+ new SchemaEventMsg(process.pid, OPERATIONS_ENUM.CREATE_SCHEMA, createSchemaObj.schema)
169
+ );
170
+ }
171
+
172
+ async dropSchema(dropSchemaObj) {
173
+ await dropDatabase(dropSchemaObj.schema);
174
+ signalling.signalSchemaChange(new SchemaEventMsg(process.pid, OPERATIONS_ENUM.DROP_SCHEMA, dropSchemaObj.schema));
175
+ }
176
+
177
+ async updateRecords(updateObj) {
178
+ updateObj.requires_existing = true;
179
+ return this.upsertRecords(updateObj);
180
+ }
181
+
182
+ async createRecords(updateObj) {
183
+ updateObj.requires_no_existing = true;
184
+ return this.upsertRecords(updateObj);
185
+ }
186
+
187
+ async upsertRecords(upsertObj) {
188
+ const { attributes } = insertUpdateValidate(upsertObj);
189
+
190
+ let new_attributes;
191
+ const Table = getDatabases()[upsertObj.schema][upsertObj.table];
192
+ const context: Context = {
193
+ user: upsertObj.hdb_user,
194
+ expiresAt: upsertObj.expiresAt,
195
+ originatingOperation: upsertObj.operation,
196
+ };
197
+ if (upsertObj.replicateTo) context.replicateTo = upsertObj.replicateTo;
198
+ if (upsertObj.replicatedConfirmation) context.replicatedConfirmation = upsertObj.replicatedConfirmation;
199
+ return transaction(context, async (transaction) => {
200
+ if (!Table.schemaDefined) {
201
+ new_attributes = [];
202
+ for (const attribute_name of attributes) {
203
+ const existingAttribute = Table.attributes.find(
204
+ (existingAttribute) => existingAttribute.name == attribute_name
205
+ );
206
+ if (!existingAttribute) {
207
+ new_attributes.push(attribute_name);
208
+ }
209
+ }
210
+ if (new_attributes.length > 0) {
211
+ await Table.addAttributes(
212
+ new_attributes.map((name) => ({
213
+ name,
214
+ indexed: true,
215
+ }))
216
+ );
217
+ }
218
+ }
219
+
220
+ const keys = [];
221
+ const skipped = [];
222
+ for (const record of upsertObj.records) {
223
+ const id = record[Table.primaryKey];
224
+ let existingRecord = id != undefined && (await Table.get(id, context));
225
+ if ((upsertObj.requires_existing && !existingRecord) || (upsertObj.requires_no_existing && existingRecord)) {
226
+ skipped.push(record[Table.primaryKey]);
227
+ continue;
228
+ }
229
+ if (existingRecord) existingRecord = collapseData(existingRecord);
230
+ for (const key in record) {
231
+ if (Object.prototype.hasOwnProperty.call(record, key)) {
232
+ let value = record[key];
233
+ if (typeof value === 'function') {
234
+ try {
235
+ const valueResults = value([[existingRecord]]);
236
+ if (Array.isArray(valueResults)) {
237
+ value = valueResults[0].func_val;
238
+ record[key] = value;
239
+ }
240
+ } catch (error) {
241
+ error.message += 'Trying to set key ' + key + ' on object' + JSON.stringify(record);
242
+ throw error;
243
+ }
244
+ }
245
+ }
246
+ }
247
+ await (id == undefined
248
+ ? Table.create(record, context)
249
+ : existingRecord
250
+ ? Table.patch(record, context)
251
+ : Table.put(record, context));
252
+ keys.push(record[Table.primaryKey]);
253
+ }
254
+ return {
255
+ txn_time: transaction.timestamp,
256
+ written_hashes: keys,
257
+ new_attributes,
258
+ skipped_hashes: skipped,
259
+ };
260
+ });
261
+ }
262
+
263
+ async deleteRecords(deleteObj) {
264
+ const Table = getDatabases()[deleteObj.schema][deleteObj.table];
265
+ const context: Context = { user: deleteObj.hdb_user };
266
+ if (deleteObj.replicateTo) context.replicateTo = deleteObj.replicateTo;
267
+ if (deleteObj.replicatedConfirmation) context.replicatedConfirmation = deleteObj.replicatedConfirmation;
268
+ return transaction(context, async (transaction) => {
269
+ const ids: Id[] = deleteObj.hash_values || deleteObj.records.map((record) => record[Table.primaryKey]);
270
+ const deleted = [];
271
+ const skipped = [];
272
+ for (const id of ids) {
273
+ if (await Table.delete(id, context)) deleted.push(id);
274
+ else skipped.push(id);
275
+ }
276
+ return createDeleteResponse(deleted, skipped, transaction.timestamp);
277
+ });
278
+ }
279
+
280
+ /**
281
+ * Deletes all records in a schema.table that fall behind a passed date.
282
+ * @param deleteObj
283
+ * {
284
+ * operation: 'delete_records_before' <string>,
285
+ * date: ISO-8601 format YYYY-MM-DD <string>,
286
+ * schema: Schema where table resides <string>,
287
+ * table: Table to delete records from <string>,
288
+ * }
289
+ * @returns {undefined}
290
+ */
291
+ async deleteRecordsBefore(deleteObj) {
292
+ const Table = getDatabases()[deleteObj.schema][deleteObj.table];
293
+ if (!Table.createdTimeProperty) {
294
+ throw new ClientError(
295
+ `Table must have a '__createdtime__' attribute or @createdTime timestamp defined to perform this operation`
296
+ );
297
+ }
298
+
299
+ const recordsToDelete = await Table.search({
300
+ conditions: [
301
+ {
302
+ attribute: Table.createdTimeProperty.name,
303
+ value: Date.parse(deleteObj.date),
304
+ comparator: VALUE_SEARCH_COMPARATORS.LESS,
305
+ },
306
+ ],
307
+ });
308
+
309
+ let deleteCalled = false;
310
+ const deletedIds = [];
311
+ const skippedIds = [];
312
+ let i = 0;
313
+ let ids = [];
314
+ const chunkDelete = async () => {
315
+ const deleteRes = await this.deleteRecords({
316
+ schema: deleteObj.schema,
317
+ table: deleteObj.table,
318
+ hash_values: ids,
319
+ });
320
+ deletedIds.push(...deleteRes.deleted_hashes);
321
+ skippedIds.push(...deleteRes.skipped_hashes);
322
+ await asyncSetTimeout(DELETE_PAUSE_MS);
323
+ ids = [];
324
+ deleteCalled = true;
325
+ };
326
+
327
+ for await (const records of recordsToDelete) {
328
+ ids.push(records[Table.primaryKey]);
329
+ i++;
330
+ if (i % DELETE_CHUNK === 0) {
331
+ await chunkDelete();
332
+ }
333
+ }
334
+
335
+ if (ids.length > 0) await chunkDelete();
336
+
337
+ if (!deleteCalled) {
338
+ return { message: 'No records found to delete' };
339
+ }
340
+
341
+ return createDeleteResponse(deletedIds, skippedIds, undefined);
342
+ }
343
+
344
+ /**
345
+ * fetches records by their hash values and returns an Array of the results
346
+ * @param {SearchByHashObject} searchObject
347
+ */
348
+ searchByHash(searchObject) {
349
+ if (searchObject.select !== undefined) searchObject.get_attributes = searchObject.select;
350
+ const validationError = searchValidator(searchObject, 'hashes');
351
+ if (validationError) {
352
+ throw validationError;
353
+ }
354
+ return getRecords(searchObject);
355
+ }
356
+
357
+ /**
358
+ * Called by some SQL functions
359
+ * @param searchObject
360
+ */
361
+ async getDataByHash(searchObject) {
362
+ const map = new Map();
363
+ searchObject._returnKeyValue = true;
364
+ for await (const { key, value } of getRecords(searchObject, true)) {
365
+ map.set(key, value);
366
+ }
367
+ return map;
368
+ }
369
+
370
+ searchByValue(searchObject: SearchObject, comparator?: string) {
371
+ if (comparator && VALUE_SEARCH_COMPARATORS_REVERSE_LOOKUP[comparator] === undefined) {
372
+ throw new Error(`Value search comparator - ${comparator} - is not valid`);
373
+ }
374
+ if (searchObject.select !== undefined) searchObject.get_attributes = searchObject.select;
375
+ if (searchObject.search_attribute !== undefined) searchObject.attribute = searchObject.search_attribute;
376
+ if (searchObject.search_value !== undefined) searchObject.value = searchObject.search_value;
377
+
378
+ const validationError = searchValidator(searchObject, 'value');
379
+ if (validationError) {
380
+ throw validationError;
381
+ }
382
+
383
+ const table = getTable(searchObject);
384
+ if (!table) {
385
+ throw new ClientError(`Table ${searchObject.table} not found`);
386
+ }
387
+ let value = searchObject.value;
388
+ if (value.includes?.('*')) {
389
+ if (value.startsWith('*')) {
390
+ if (value.endsWith('*')) {
391
+ if (value !== '*') {
392
+ comparator = 'contains';
393
+ value = value.slice(1, -1);
394
+ }
395
+ } else {
396
+ comparator = 'ends_with';
397
+ value = value.slice(1);
398
+ }
399
+ } else if (value.endsWith('*')) {
400
+ comparator = 'starts_with';
401
+ value = value.slice(0, -1);
402
+ }
403
+ }
404
+ if (comparator === VALUE_SEARCH_COMPARATORS.BETWEEN) value = [value, searchObject.end_value];
405
+ const conditions =
406
+ value === '*'
407
+ ? []
408
+ : [
409
+ {
410
+ attribute: searchObject.attribute,
411
+ value,
412
+ comparator,
413
+ },
414
+ ];
415
+
416
+ return table.search(
417
+ {
418
+ conditions,
419
+ allowFullScan: true,
420
+ limit: searchObject.limit,
421
+ offset: searchObject.offset,
422
+ reverse: searchObject.reverse,
423
+ sort: searchObject.sort,
424
+ select: getSelect(searchObject, table),
425
+ },
426
+ {
427
+ onlyIfCached: searchObject.onlyIfCached,
428
+ noCacheStore: searchObject.noCacheStore,
429
+ noCache: searchObject.noCache,
430
+ replicateFrom: searchObject.replicateFrom,
431
+ }
432
+ );
433
+ }
434
+
435
+ async getDataByValue(searchObject: SearchObject, comparator) {
436
+ const map = new Map();
437
+ const table = getTable(searchObject);
438
+ if (
439
+ searchObject.get_attributes &&
440
+ !searchObject.get_attributes.includes(table.primaryKey) &&
441
+ searchObject.get_attributes[0] !== '*'
442
+ )
443
+ // ensure that we get the primary key so we can make a mapping
444
+ searchObject.get_attributes.push(table.primaryKey);
445
+ for await (const record of this.searchByValue(searchObject, comparator)) {
446
+ map.set(record[table.primaryKey], record);
447
+ }
448
+ return map;
449
+ }
450
+
451
+ resetReadTxn(schema, table) {
452
+ getTable({ schema, table })?.primaryStore.resetReadTxn?.();
453
+ }
454
+
455
+ async deleteAuditLogsBefore(deleteObj) {
456
+ const table = getTable(deleteObj);
457
+ return table.deleteHistory(deleteObj.timestamp, deleteObj.cleanup_deleted_records);
458
+ }
459
+
460
+ async readAuditLog(readAuditLogObj) {
461
+ const table = getTable(readAuditLogObj);
462
+ const histories = {};
463
+ switch (readAuditLogObj.search_type) {
464
+ case READ_AUDIT_LOG_SEARCH_TYPES_ENUM.HASH_VALUE:
465
+ // get the history of each record
466
+ for (const id of readAuditLogObj.search_values) {
467
+ histories[id] = (await table.getHistoryOfRecord(id)).map((auditRecord) => {
468
+ let operation = auditRecord.operation ?? auditRecord.type;
469
+ if (operation === 'put') operation = 'upsert';
470
+ return {
471
+ operation,
472
+ timestamp: auditRecord.version,
473
+ user_name: auditRecord.user,
474
+ hash_values: [id],
475
+ records: [auditRecord.value],
476
+ };
477
+ });
478
+ }
479
+ return histories;
480
+ case READ_AUDIT_LOG_SEARCH_TYPES_ENUM.USERNAME: {
481
+ const users = readAuditLogObj.search_values;
482
+ // do a full table scan of the history and find users
483
+ for await (const entry of groupRecordsInHistory(table)) {
484
+ if (users.includes(entry.user_name)) {
485
+ const entriesForUser = histories[entry.user_name] || (histories[entry.user_name] = []);
486
+ entriesForUser.push(entry);
487
+ }
488
+ }
489
+ return histories;
490
+ }
491
+ default:
492
+ return groupRecordsInHistory(
493
+ table,
494
+ readAuditLogObj.search_values?.[0],
495
+ readAuditLogObj.search_values?.[1],
496
+ readAuditLogObj.limit
497
+ );
498
+ }
499
+ }
500
+ }
501
+
502
+ function getSelect({ get_attributes }, table) {
503
+ if (get_attributes) {
504
+ if (get_attributes[0] === '*') {
505
+ if (table.schemaDefined) return;
506
+ else get_attributes = table.attributes.map((attribute) => attribute.name);
507
+ }
508
+ get_attributes.forceNulls = true;
509
+ return get_attributes;
510
+ }
511
+ }
512
+ /**
513
+ * Iterator for asynchronous getting ids from an array
514
+ */
515
+ function getRecords(searchObject, returnKeyValue?) {
516
+ const table = getTable(searchObject);
517
+ const select = getSelect(searchObject, table);
518
+ if (!table) {
519
+ throw new ClientError(`Table ${searchObject.table} not found`);
520
+ }
521
+ let lazy;
522
+ if (select && table.attributes.length - select.length > 2 && select.length < 5) lazy = true;
523
+ // we need to get the transaction and ensure that the transaction spans the entire duration
524
+ // of the iteration
525
+ const context = {
526
+ user: searchObject.hdb_user,
527
+ onlyIfCached: searchObject.onlyIfCached,
528
+ noCacheStore: searchObject.noCacheStore,
529
+ noCache: searchObject.noCache,
530
+ replicateFrom: searchObject.replicateFrom,
531
+ };
532
+ let finishedIteration;
533
+ transaction(context, () => new Promise((resolve) => (finishedIteration = resolve)));
534
+ const ids = searchObject.ids || searchObject.hash_values;
535
+ let i = 0;
536
+ return {
537
+ [Symbol.asyncIterator]() {
538
+ return {
539
+ async next() {
540
+ if (i < ids.length) {
541
+ const id = ids[i++];
542
+ let record;
543
+ try {
544
+ record = await table.get({ id, lazy, select }, context);
545
+ record = record && collapseData(record);
546
+ } catch (error) {
547
+ record = {
548
+ message: errorToString(error),
549
+ };
550
+ }
551
+ if (returnKeyValue)
552
+ return {
553
+ value: { key: id, value: record },
554
+ };
555
+ else return { value: record };
556
+ } else {
557
+ finishedIteration();
558
+ return { done: true };
559
+ }
560
+ },
561
+ return(value) {
562
+ finishedIteration();
563
+ return {
564
+ value,
565
+ done: true,
566
+ };
567
+ },
568
+ // eslint-disable-next-line no-unused-vars
569
+ throw(error) {
570
+ finishedIteration();
571
+ return {
572
+ done: true,
573
+ };
574
+ },
575
+ };
576
+ },
577
+ };
578
+ }
579
+ function getTable(operationObject) {
580
+ const databaseName = operationObject.database || operationObject.schema || DEFAULT_DATABASE;
581
+ const tables = getDatabases()[databaseName];
582
+ if (!tables) throw handleHDBError(new Error(), HDB_ERROR_MSGS.SCHEMA_NOT_FOUND(databaseName), 404);
583
+ return tables[operationObject.table];
584
+ }
585
+ /**
586
+ * creates the response object for deletes based on the deleted & skipped hashes
587
+ * @param {[]} deleted - list of hash values successfully deleted
588
+ * @param {[]} skipped - list of hash values which did not get deleted
589
+ * @param {number} txnTime - the transaction timestamp
590
+ * @returns {{skipped_hashes: [], deleted_hashes: [], message: string}}
591
+ */
592
+ function createDeleteResponse(deleted, skipped, txnTime) {
593
+ const total = deleted.length + skipped.length;
594
+ const plural = total === 1 ? 'record' : 'records';
595
+
596
+ return {
597
+ message: `${deleted.length} of ${total} ${plural} successfully deleted`,
598
+ deleted_hashes: deleted,
599
+ skipped_hashes: skipped,
600
+ txn_time: txnTime,
601
+ };
602
+ }
603
+
604
+ async function* groupRecordsInHistory(table, start?, end?, limit?) {
605
+ let enqueued;
606
+ let count = 0;
607
+ for await (const entry of table.getHistory(start, end)) {
608
+ let operation = entry.operation ?? entry.type;
609
+ if (operation === 'put') operation = 'upsert';
610
+ const { id, version: timestamp, value } = entry;
611
+ if (enqueued?.timestamp === timestamp) {
612
+ enqueued.hash_values.push(id);
613
+ enqueued.records.push(value);
614
+ } else {
615
+ if (enqueued) {
616
+ yield enqueued;
617
+ count++;
618
+ if (limit && limit <= count) {
619
+ enqueued = undefined;
620
+ break;
621
+ }
622
+ }
623
+ enqueued = {
624
+ operation,
625
+ user_name: entry.user,
626
+ timestamp,
627
+ hash_values: [id],
628
+ records: [value],
629
+ };
630
+ }
631
+ }
632
+ if (enqueued) yield enqueued;
633
+ }