@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,918 @@
1
+ 'use strict';
2
+
3
+ const environmentUtility = require('./environmentUtility.js');
4
+
5
+ const common = require('./commonUtility.js');
6
+ const lmdbTerms = require('./terms.js');
7
+ const LMDB_ERRORS = require('../errors/commonErrors.js').LMDB_ERRORS_ENUM;
8
+ const hdbTerms = require('../hdbTerms.ts');
9
+ const cursorFunctions = require('./searchCursorFunctions.js');
10
+ const { parseRow } = cursorFunctions;
11
+ // eslint-disable-next-line no-unused-vars
12
+ const lmdb = require('lmdb');
13
+ const { OVERFLOW_MARKER, MAX_SEARCH_KEY_LENGTH } = lmdbTerms;
14
+
15
+ /** UTILITY CURSOR FUNCTIONS **/
16
+
17
+ /**
18
+ * Creates the basis for a full iteration of a dbi with an evaluation function used to determine the logic inside the iteration
19
+ * @param {lmdb.Transaction} transactionOrEnv
20
+ * @param {String} hash_attribute
21
+ * @param {String} attribute
22
+ * @param {boolean} reverse - defines if the iterator goes from last to first
23
+ * @param {number} limit - defines the max number of entries to iterate
24
+ * @param {number} offset - defines the entries to skip
25
+ * @returns {[]}
26
+ */
27
+ function iterateFullIndex(
28
+ transactionOrEnv,
29
+ hash_attribute,
30
+ attribute,
31
+ reverse = false,
32
+ limit = undefined,
33
+ offset = undefined
34
+ ) {
35
+ return setupTransaction(transactionOrEnv, hash_attribute, attribute, (transaction, dbi) => {
36
+ return dbi.getRange({
37
+ transaction,
38
+ start: reverse ? undefined : false,
39
+ end: !reverse ? undefined : false,
40
+ limit,
41
+ offset,
42
+ reverse,
43
+ });
44
+ });
45
+ }
46
+
47
+ /**
48
+ * specific iterator function for perfroming betweens on numeric columns
49
+ * for this function specifically it is important to remember that the buffer representations of numbers are stored in the following order:
50
+ * 0,1,2,3,4,5,6.....1000,-1,-2,-3,-4,-5,-6....-1000
51
+ * as such we need to do some work with the cursor in order to move to the point we need depending on the type of range we are searching.
52
+ * another important point to remember is the search is always iterating forward. this makes sense for positive number searches,
53
+ * but get wonky for negative number searches and especially for a range of between -4 & 6. the reason is we will start the iterator at 0, move forward to 6,
54
+ * then we need to jump forward to the highest negative number and stop at the start of our range (-4).
55
+ * @param {TableTransaction} transactionOrEnv
56
+ * @param {String} hash_attribute
57
+ * @param {String} attribute
58
+ * @param {Number|String} lowerValue
59
+ * @param {Number|String} upperValue
60
+ * @param {boolean} reverse
61
+ * @param {number} limit - defines the max number of entries to iterate
62
+ * @param {number} offset - defines the entries to skip
63
+ * @returns {Iterable}
64
+ */
65
+ function iterateRangeBetween(
66
+ transactionOrEnv,
67
+ hash_attribute,
68
+ attribute,
69
+ lowerValue,
70
+ upperValue,
71
+ reverse = false,
72
+ limit = undefined,
73
+ offset = undefined,
74
+ exclusiveLower = false,
75
+ exclusiveUpper = false
76
+ ) {
77
+ return setupTransaction(transactionOrEnv, hash_attribute, attribute, (transaction, attrDbi, env, hash_attribute) => {
78
+ let end = reverse === true ? lowerValue : upperValue;
79
+ let start = reverse === true ? upperValue : lowerValue;
80
+ let inclusiveEnd = reverse === true ? !exclusiveLower : !exclusiveUpper;
81
+ let exclusiveStart = reverse === true ? exclusiveUpper : exclusiveLower;
82
+ let options = {
83
+ transaction,
84
+ start,
85
+ end,
86
+ reverse,
87
+ limit,
88
+ offset,
89
+ inclusiveEnd,
90
+ exclusiveStart,
91
+ };
92
+ if (hash_attribute === attribute) {
93
+ options.values = false;
94
+ return attrDbi.getRange(options).map((value) => ({ value }));
95
+ } else return attrDbi.getRange(options);
96
+ });
97
+ }
98
+
99
+ /**
100
+ * @param {lmdb.Transaction|lmdb.RootDatabase} transactionOrEnv
101
+ * @param {String} hash_attribute
102
+ * @param {String} attribute
103
+ * @param {Function} callback
104
+ */
105
+ function setupTransaction(transactionOrEnv, hash_attribute, attribute, callback) {
106
+ let env = transactionOrEnv.database || transactionOrEnv;
107
+ // make sure all DBIs have been opened prior to starting any new persistent read transaction
108
+ let attrDbi = environmentUtility.openDBI(env, attribute);
109
+ if (attrDbi[lmdbTerms.DBI_DEFINITION_NAME].isPrimaryKey) {
110
+ hash_attribute = attribute;
111
+ } else if (hash_attribute) {
112
+ environmentUtility.openDBI(env, hash_attribute);
113
+ }
114
+ let transaction;
115
+ if (transactionOrEnv.database) transaction = transactionOrEnv;
116
+ else {
117
+ transaction = transactionOrEnv.useReadTransaction();
118
+ transaction.database = transactionOrEnv;
119
+ }
120
+ // do the main query after the dbi opening has been committed
121
+ let results = callback(transaction, attrDbi, env, hash_attribute);
122
+ results.transaction = transaction;
123
+ if (!transactionOrEnv.database) {
124
+ results.onDone = () => {
125
+ transaction.done();
126
+ };
127
+ }
128
+ return results;
129
+ }
130
+
131
+ function getOverflowCheck(env, transaction, hash_attribute, attribute) {
132
+ let primaryDbi;
133
+
134
+ return function (key, value) {
135
+ if (typeof key === 'string' && key.endsWith(OVERFLOW_MARKER)) {
136
+ // the entire value couldn't be encoded because it was too long, so need to search the attribute from
137
+ // the original record.
138
+ // first get the hash/primary dbi
139
+ if (!primaryDbi) {
140
+ // only have to open once per search
141
+ if (hash_attribute) primaryDbi = environmentUtility.openDBI(env, hash_attribute);
142
+ else {
143
+ // not sure how often this gets called without a hash_attribute, as this would be kind of expensive
144
+ // if done frequently
145
+ let dbis = environmentUtility.listDBIs(env);
146
+ for (let i = 0, l = dbis.length; i < l; i++) {
147
+ primaryDbi = environmentUtility.openDBI(env, dbis[i]);
148
+ if (primaryDbi[lmdbTerms.DBI_DEFINITION_NAME].isPrimaryKey) break;
149
+ }
150
+ }
151
+ }
152
+ let record = primaryDbi.get(value, { transaction, lazy: true });
153
+ key = record[attribute];
154
+ }
155
+ return key;
156
+ };
157
+ }
158
+
159
+ /**
160
+ * iterates the entire hash_attribute dbi and returns all objects back
161
+ * @param {lmdb.Transaction} transaction - Transaction used to interact with all data in an environment
162
+ * @param {String} hash_attribute - name of the hash_attribute for this environment
163
+ * @param {Array.<String>} fetchAttributes - string array of attributes to pull from the object
164
+ * @returns {Array.<Object>} - object array of fetched records
165
+ * @param {boolean} reverse - defines if the iterator goes from last to first
166
+ * @param {number} limit - defines the max number of entries to iterate
167
+ * @param {number} offset - defines the entries to skip
168
+ */
169
+ function searchAll(
170
+ transactionOrEnv,
171
+ hash_attribute,
172
+ fetchAttributes,
173
+ reverse = false,
174
+ limit = undefined,
175
+ offset = undefined
176
+ ) {
177
+ common.validateEnv(transactionOrEnv);
178
+ if (hash_attribute === undefined) {
179
+ throw new Error(LMDB_ERRORS.HASH_ATTRIBUTE_REQUIRED);
180
+ }
181
+ return setupTransaction(transactionOrEnv, hash_attribute, hash_attribute, (transaction, dbi, env) => {
182
+ validateFetchAttributes(fetchAttributes);
183
+ fetchAttributes = setGetWholeRowAttributes(env, fetchAttributes);
184
+ return dbi
185
+ .getRange({
186
+ transaction,
187
+ start: reverse ? undefined : false,
188
+ end: !reverse ? undefined : false,
189
+ limit,
190
+ offset,
191
+ reverse,
192
+ })
193
+ .map((entry) => {
194
+ return parseRow(entry.value, fetchAttributes);
195
+ });
196
+ });
197
+ }
198
+
199
+ /**
200
+ * iterates the entire hash_attribute dbi and returns all objects back in a map
201
+ * @param {lmdb.Transaction} transactionOrEnv - Transaction used to interact with all data in an environment
202
+ * @param {String} hash_attribute - name of the hash_attribute for this environment
203
+ * @param {Array.<String>} fetchAttributes - string array of attributes to pull from the object
204
+ * @param {boolean} reverse - defines if the iterator goes from last to first
205
+ * @param {number} limit - defines the max number of entries to iterate
206
+ * @param {number} offset - defines the entries to skip
207
+ * @returns {{String|Number, Object}} - object array of fetched records
208
+
209
+ */
210
+ function searchAllToMap(
211
+ transactionOrEnv,
212
+ hash_attribute,
213
+ fetchAttributes,
214
+ reverse = false,
215
+ limit = undefined,
216
+ offset = undefined
217
+ ) {
218
+ common.validateEnv(transactionOrEnv);
219
+
220
+ if (hash_attribute === undefined) {
221
+ throw new Error(LMDB_ERRORS.HASH_ATTRIBUTE_REQUIRED);
222
+ }
223
+
224
+ validateFetchAttributes(fetchAttributes);
225
+ fetchAttributes = setGetWholeRowAttributes(transactionOrEnv.database || transactionOrEnv, fetchAttributes);
226
+ let map = new Map();
227
+ for (let { key, value } of iterateFullIndex(
228
+ transactionOrEnv,
229
+ hash_attribute,
230
+ hash_attribute,
231
+ reverse,
232
+ limit,
233
+ offset
234
+ )) {
235
+ map.set(key, cursorFunctions.parseRow(value, fetchAttributes));
236
+ }
237
+ return map;
238
+ }
239
+
240
+ /**
241
+ * iterates a dbi and returns the key/value pairing for each entry
242
+ * @param env
243
+ * @param attribute
244
+ * @param {boolean} reverse - defines if the iterator goes from last to first
245
+ * @param {number} limit - defines the max number of entries to iterate
246
+ * @param {number} offset - defines the entries to skip
247
+ * @returns {Array.<Array>}
248
+ */
249
+ function iterateDBI(transactionOrEnv, attribute, reverse = false, limit = undefined, offset = undefined) {
250
+ common.validateEnv(transactionOrEnv);
251
+
252
+ if (attribute === undefined) {
253
+ throw new Error(LMDB_ERRORS.ATTRIBUTE_REQUIRED);
254
+ }
255
+ let results = Object.create(null);
256
+ let iterator = iterateFullIndex(transactionOrEnv, undefined, attribute, reverse, limit, offset);
257
+ let transaction = iterator.transaction;
258
+ const overflowCheck = getOverflowCheck(transaction.database, transaction, undefined, attribute);
259
+ for (let { key, value } of iterator) {
260
+ let fullKey = overflowCheck(key, value);
261
+ if (results[fullKey] === undefined) {
262
+ results[fullKey] = [];
263
+ }
264
+ results[fullKey].push(value);
265
+ }
266
+ return results;
267
+ }
268
+
269
+ /**
270
+ * counts all records in an environment based on the count from stating the hash_attribute dbi
271
+ * @param {lmdb.RootDatabase} env - Transaction used to interact with all data in an environment
272
+ * @param {String} hash_attribute - name of the hash_attribute for this environment
273
+ * @returns {number} - number of records in the environment
274
+ */
275
+ function countAll(env, hash_attribute) {
276
+ common.validateEnv(env);
277
+
278
+ if (hash_attribute === undefined) {
279
+ throw new Error(LMDB_ERRORS.HASH_ATTRIBUTE_REQUIRED);
280
+ }
281
+
282
+ let stat = environmentUtility.statDBI(env, hash_attribute);
283
+ return stat.entryCount;
284
+ }
285
+
286
+ /**
287
+ * performs an equal search on the key of a named dbi, returns a list of ids where their keys literally match the searchValue
288
+ * @param {lmdb.Transaction} transactionOrEnv - Transaction used to interact with all data in an environment
289
+ * @param {String} hash_attribute
290
+ * @param {String} attribute - name of the attribute (dbi) to search
291
+ * @param searchValue - value to search
292
+ * @param {boolean} reverse - defines if the iterator goes from last to first
293
+ * @param {number} limit - defines the max number of entries to iterate
294
+ * @param {number} offset - defines the entries to skip
295
+ * @returns {[[],[]]} - ids matching the search
296
+ */
297
+ function equals(
298
+ transactionOrEnv,
299
+ hash_attribute,
300
+ attribute,
301
+ searchValue,
302
+ reverse = false,
303
+ limit = undefined,
304
+ offset = undefined
305
+ ) {
306
+ validateComparisonFunctions(transactionOrEnv, attribute, searchValue);
307
+ return setupTransaction(transactionOrEnv, hash_attribute, attribute, (transaction, dbi, env, hash_attribute) => {
308
+ searchValue = common.convertKeyValueToWrite(searchValue);
309
+ if (hash_attribute === attribute) {
310
+ let value = dbi.get(searchValue, { transaction, lazy: true });
311
+ return value === undefined ? [] : [{ key: searchValue, value: searchValue }];
312
+ } else {
313
+ return dbi
314
+ .getValues(searchValue, {
315
+ transaction,
316
+ reverse,
317
+ limit,
318
+ offset,
319
+ })
320
+ .map((value) => ({ key: searchValue, value }));
321
+ }
322
+ });
323
+ }
324
+
325
+ /**
326
+ * Counts the number of entries for a key of a named dbi, returning the count
327
+ * @param {lmdb.RootDatabase} env - Transaction used to interact with all data in an environment
328
+ * @param {String} hash_attribute
329
+ * @param {String} attribute - name of the attribute (dbi) to search
330
+ * @param searchValue - value to search
331
+ */
332
+ function count(env, attribute, searchValue) {
333
+ validateComparisonFunctions(env, attribute, searchValue);
334
+ let dbi = environmentUtility.openDBI(env, attribute);
335
+ return dbi.getValuesCount(searchValue);
336
+ }
337
+
338
+ /**
339
+ * performs an startsWith search on the key of a named dbi, returns a list of ids where their keys begin with the searchValue
340
+ * @param {lmdb.Transaction} transactionOrEnv - Transaction used to interact with all data in an environment
341
+ * @param {String} hash_attribute
342
+ * @param {String} attribute - name of the attribute (dbi) to search
343
+ * @param searchValue - value to search
344
+ * @param {boolean} reverse - defines if the iterator goes from last to first
345
+ * @param {number} limit - defines the max number of entries to iterate
346
+ * @param {number} offset - defines the entries to skip
347
+ * @returns {lmdb.ArrayLikeIterable<unknown>} - ids matching the search
348
+ */
349
+ function startsWith(
350
+ transactionOrEnv,
351
+ hash_attribute,
352
+ attribute,
353
+ searchValue,
354
+ reverse = false,
355
+ limit = undefined,
356
+ offset = undefined
357
+ ) {
358
+ validateComparisonFunctions(transactionOrEnv, attribute, searchValue);
359
+ return setupTransaction(transactionOrEnv, null, attribute, (transaction, dbi) => {
360
+ //if the search is numeric we need to scan the entire index, if string we can just do a range
361
+ searchValue = common.convertKeyValueToWrite(searchValue);
362
+ let stringSearch = true;
363
+ if (typeof searchValue === 'number') {
364
+ stringSearch = false;
365
+ }
366
+ let iterator;
367
+ //if we are reversing we need to get the key after the one we want to search on so we can start there and iterate to the front
368
+ if (reverse === true) {
369
+ let nextKey;
370
+ //iterate based on the searchValue until the key no longer starts with the searchValue, this is the key we need to start with in the search
371
+ for (let key of dbi.getKeys({ transaction, start: searchValue })) {
372
+ if (!key.startsWith(searchValue)) {
373
+ nextKey = key;
374
+ break;
375
+ }
376
+ }
377
+
378
+ //with the new search value we iterate
379
+ if (nextKey !== undefined) {
380
+ if (Number.isInteger(offset)) {
381
+ offset++;
382
+ } else {
383
+ limit++;
384
+ }
385
+ }
386
+
387
+ iterator = dbi.getRange({ transaction, start: nextKey, end: undefined, reverse, limit, offset }).map((entry) => {
388
+ let { key } = entry;
389
+ if (key === nextKey) {
390
+ return;
391
+ }
392
+
393
+ if (key.toString().startsWith(searchValue)) {
394
+ return entry;
395
+ } else if (stringSearch === true) {
396
+ return iterator.DONE;
397
+ }
398
+ });
399
+ return iterator.filter((entry) => entry);
400
+ } else {
401
+ iterator = dbi.getRange({ transaction, start: searchValue, reverse, limit, offset }).map((entry) => {
402
+ if (entry.key.toString().startsWith(searchValue)) {
403
+ return entry;
404
+ } else if (stringSearch === true) {
405
+ return iterator.DONE;
406
+ }
407
+ });
408
+ return stringSearch ? iterator : iterator.filter((entry) => entry); // filter out non-matching if we are not
409
+ // a string and have to do a full scan
410
+ }
411
+ });
412
+ }
413
+
414
+ /**
415
+ * performs an endsWith search on the key of a named dbi, returns a list of ids where their keys end with searchValue
416
+ * @param {lmdb.Transaction} transaction - Transaction used to interact with all data in an environment
417
+ * @param {String} hash_attribute
418
+ * @param {String} attribute - name of the attribute (dbi) to search
419
+ * @param searchValue - value to search
420
+ * @param {boolean} reverse - defines if the iterator goes from last to first
421
+ * @param {number} limit - defines the max number of entries to iterate
422
+ * @param {number} offset - defines the entries to skip
423
+ * @returns {[[],[]]} - ids matching the search
424
+ */
425
+ function endsWith(
426
+ transaction,
427
+ hash_attribute,
428
+ attribute,
429
+ searchValue,
430
+ reverse = false,
431
+ limit = undefined,
432
+ offset = undefined
433
+ ) {
434
+ return contains(transaction, hash_attribute, attribute, searchValue, reverse, limit, offset, true);
435
+ }
436
+
437
+ /**
438
+ * performs a contains search on the key of a named dbi, returns a list of ids where their keys contain the searchValue
439
+ * @param {lmdb.Transaction|lmdb.RootDatabase} transactionOrEnv - Transaction used to interact with all data in an
440
+ * environment
441
+ * @param {String} hash_attribute
442
+ * @param {String} attribute - name of the attribute (dbi) to search
443
+ * @param {String|Number} searchValue - value to search
444
+ * @param {boolean} reverse - defines if the iterator goes from last to first
445
+ * @param {number} limit - defines the max number of entries to iterate
446
+ * @param {number} offset - defines the entries to skip
447
+ * @param {boolean} ends_with - Must only contain this value at the end
448
+ * @returns {[[],[]]} - ids matching the search
449
+ */
450
+ function contains(
451
+ transactionOrEnv,
452
+ hash_attribute,
453
+ attribute,
454
+ searchValue,
455
+ reverse = false,
456
+ limit = undefined,
457
+ offset = undefined,
458
+ ends_with = false
459
+ ) {
460
+ validateComparisonFunctions(transactionOrEnv, attribute, searchValue);
461
+ return setupTransaction(transactionOrEnv, null, attribute, (transaction, attrDbi, env, hash_attribute) => {
462
+ const overflowCheck = getOverflowCheck(env, transaction, hash_attribute, attribute);
463
+ offset = Number.isInteger(offset) ? offset : 0;
464
+ return attrDbi
465
+ .getKeys({ transaction, end: reverse ? false : undefined, reverse })
466
+ .flatMap((key) => {
467
+ let foundStr = key.toString();
468
+ if (foundStr.endsWith(OVERFLOW_MARKER)) {
469
+ // the entire value couldn't be encoded because it was too long, so need to search the attributes from
470
+ // the original record
471
+ return attrDbi
472
+ .getValues(key, { transaction })
473
+ .map((primaryKey) => {
474
+ // this will get the full value from each entire record so we can check it
475
+ let fullKey = overflowCheck(key, primaryKey);
476
+ if (ends_with ? fullKey.endsWith(searchValue) : fullKey.includes(searchValue)) {
477
+ return { key: fullKey, value: primaryKey };
478
+ }
479
+ })
480
+ .filter((v) => v);
481
+ } else if (ends_with ? foundStr.endsWith(searchValue) : foundStr.includes(searchValue)) {
482
+ if (attrDbi[lmdbTerms.DBI_DEFINITION_NAME].isPrimaryKey) return { key, value: key };
483
+ else {
484
+ return attrDbi.getValues(key, { transaction }).map((primaryKey) => {
485
+ return { key, value: primaryKey };
486
+ });
487
+ }
488
+ }
489
+ return [];
490
+ })
491
+ .slice(offset, limit === undefined ? undefined : limit + (offset || 0));
492
+ });
493
+ }
494
+
495
+ /** RANGE FUNCTIONS **/
496
+
497
+ /**
498
+ * performs a greater than search for string / numeric search value
499
+ * @param {lmdb.Transaction} transactionOrEnv
500
+ * @param {String} hash_attribute
501
+ * @param {String} attribute
502
+ * @param {String|Number} searchValue
503
+ * @param {boolean} reverse - determines direction to iterate
504
+ * @param {number} limit - defines the max number of entries to iterate
505
+ * @param {number} offset - defines the entries to skip
506
+ * @returns {[[],[]]}
507
+ */
508
+ function greaterThan(
509
+ transactionOrEnv,
510
+ hash_attribute,
511
+ attribute,
512
+ searchValue,
513
+ reverse = false,
514
+ limit = undefined,
515
+ offset = undefined
516
+ ) {
517
+ validateComparisonFunctions(transactionOrEnv, attribute, searchValue);
518
+
519
+ let type = typeof searchValue;
520
+ let upperValue;
521
+ if (type === 'string') upperValue = '\uffff';
522
+ else if (type === 'number') upperValue = Infinity;
523
+ else if (type === 'boolean') upperValue = true;
524
+ return iterateRangeBetween(
525
+ transactionOrEnv,
526
+ hash_attribute,
527
+ attribute,
528
+ searchValue,
529
+ upperValue,
530
+ reverse,
531
+ limit,
532
+ offset,
533
+ true,
534
+ false
535
+ );
536
+ }
537
+
538
+ /**
539
+ * performs a greater than equal search for string / numeric search value
540
+ * @param {lmdb.Transaction} transactionOrEnv
541
+ * @param {String} hash_attribute
542
+ * @param {String} attribute
543
+ * @param {String|Number} searchValue
544
+ * @param {boolean} reverse - determines direction of iterator
545
+ * @param {number} limit - defines the max number of entries to iterate
546
+ * @param {number} offset - defines the entries to skip
547
+ * @returns {[[],[]]}
548
+ */
549
+ function greaterThanEqual(
550
+ transactionOrEnv,
551
+ hash_attribute,
552
+ attribute,
553
+ searchValue,
554
+ reverse = false,
555
+ limit = undefined,
556
+ offset = undefined
557
+ ) {
558
+ validateComparisonFunctions(transactionOrEnv, attribute, searchValue);
559
+
560
+ let type = typeof searchValue;
561
+ let upperValue;
562
+ if (type === 'string') upperValue = '\uffff';
563
+ else if (type === 'number') upperValue = Infinity;
564
+ else if (type === 'boolean') upperValue = true;
565
+ return iterateRangeBetween(
566
+ transactionOrEnv,
567
+ hash_attribute,
568
+ attribute,
569
+ searchValue,
570
+ upperValue,
571
+ reverse,
572
+ limit,
573
+ offset,
574
+ false,
575
+ false
576
+ );
577
+ }
578
+
579
+ /**
580
+ * performs a less than search for string / numeric search value
581
+ * @param {lmdb.Transaction} transactionOrEnv
582
+ * @param {String} hash_attribute
583
+ * @param {String} attribute
584
+ * @param {String|Number} searchValue
585
+ * @param {boolean} reverse - determines direction of iterator
586
+ * @param {number} limit - defines the max number of entries to iterate
587
+ * @param {number} offset - defines the entries to skip
588
+ * @returns {[[],[]]}
589
+ */
590
+ function lessThan(
591
+ transactionOrEnv,
592
+ hash_attribute,
593
+ attribute,
594
+ searchValue,
595
+ reverse = false,
596
+ limit = undefined,
597
+ offset = undefined
598
+ ) {
599
+ validateComparisonFunctions(transactionOrEnv, attribute, searchValue);
600
+ let type = typeof searchValue;
601
+ let lowerValue;
602
+ if (type === 'string') lowerValue = '\x00';
603
+ else if (type === 'number') lowerValue = -Infinity;
604
+ else if (type === 'boolean') lowerValue = false;
605
+ return iterateRangeBetween(
606
+ transactionOrEnv,
607
+ hash_attribute,
608
+ attribute,
609
+ lowerValue,
610
+ searchValue,
611
+ reverse,
612
+ limit,
613
+ offset,
614
+ false,
615
+ true
616
+ );
617
+ }
618
+
619
+ /**
620
+ * performs a less than equal search for string / numeric search value
621
+ * @param {lmdb.Transaction} transactionOrEnv
622
+ * @param {String} hash_attribute
623
+ * @param {String} attribute
624
+ * @param {String|Number} searchValue
625
+ * @param {boolean} reverse - defines the direction to iterate
626
+ * @param {number} limit - defines the max number of entries to iterate
627
+ * @param {number} offset - defines the entries to skip
628
+ * @returns {[[],[]]}
629
+ */
630
+ function lessThanEqual(
631
+ transactionOrEnv,
632
+ hash_attribute,
633
+ attribute,
634
+ searchValue,
635
+ reverse = false,
636
+ limit = undefined,
637
+ offset = undefined
638
+ ) {
639
+ validateComparisonFunctions(transactionOrEnv, attribute, searchValue);
640
+ let type = typeof searchValue;
641
+ let lowerValue;
642
+ if (type === 'string') lowerValue = '\x00';
643
+ else if (type === 'number') lowerValue = -Infinity;
644
+ else if (type === 'boolean') lowerValue = false;
645
+ return iterateRangeBetween(
646
+ transactionOrEnv,
647
+ hash_attribute,
648
+ attribute,
649
+ lowerValue,
650
+ searchValue,
651
+ reverse,
652
+ limit,
653
+ offset,
654
+ false,
655
+ false
656
+ );
657
+ }
658
+
659
+ /**
660
+ * performs a between search for string / numeric search value
661
+ * @param {lmdb.Transaction} transactionOrEnv
662
+ * @param {String} hash_attribute
663
+ * @param {String} attribute
664
+ * @param {String|Number} startValue
665
+ * @param {String|Number}endValue
666
+ * @param {boolean} reverse - defines if the iterator goes from last to first
667
+ * @param {number} limit - defines the max number of entries to iterate
668
+ * @param {number} offset - defines the entries to skip
669
+ * @returns {*[]}
670
+ */
671
+ function between(
672
+ transactionOrEnv,
673
+ hash_attribute,
674
+ attribute,
675
+ startValue,
676
+ endValue,
677
+ reverse = false,
678
+ limit = undefined,
679
+ offset = undefined
680
+ ) {
681
+ common.validateEnv(transactionOrEnv);
682
+
683
+ if (attribute === undefined) {
684
+ throw new Error(LMDB_ERRORS.ATTRIBUTE_REQUIRED);
685
+ }
686
+
687
+ if (startValue === undefined) {
688
+ throw new Error(LMDB_ERRORS.START_VALUE_REQUIRED);
689
+ }
690
+
691
+ if (endValue === undefined) {
692
+ throw new Error(LMDB_ERRORS.END_VALUE_REQUIRED);
693
+ }
694
+
695
+ startValue = common.convertKeyValueToWrite(startValue);
696
+ endValue = common.convertKeyValueToWrite(endValue);
697
+ if (startValue > endValue) {
698
+ throw new Error(LMDB_ERRORS.END_VALUE_MUST_BE_GREATER_THAN_START_VALUE);
699
+ }
700
+
701
+ return iterateRangeBetween(transactionOrEnv, hash_attribute, attribute, startValue, endValue, reverse, limit, offset);
702
+ }
703
+
704
+ /**
705
+ * finds a single record based on the id passed
706
+ * @param {lmdb.Transaction} transactionOrEnv - Transaction used to interact with all data in an environment
707
+ * @param {String} hash_attribute - name of the hash_attribute for this environment
708
+ * @param {Array.<String>} fetchAttributes - string array of attributes to pull from the object
709
+ * @param {String} id - id value to search
710
+ * @returns {{}} - object found
711
+ */
712
+ function searchByHash(transactionOrEnv, hash_attribute, fetchAttributes, id) {
713
+ common.validateEnv(transactionOrEnv);
714
+ let env = transactionOrEnv.database || transactionOrEnv;
715
+ let transaction = transactionOrEnv.database ? transactionOrEnv : null;
716
+ if (hash_attribute === undefined) {
717
+ throw new Error(LMDB_ERRORS.HASH_ATTRIBUTE_REQUIRED);
718
+ }
719
+
720
+ validateFetchAttributes(fetchAttributes);
721
+ fetchAttributes = setGetWholeRowAttributes(env, fetchAttributes);
722
+ if (id === undefined) {
723
+ throw new Error(LMDB_ERRORS.ID_REQUIRED);
724
+ }
725
+
726
+ let obj = null;
727
+ let object = env.dbis[hash_attribute].get(id, { transaction, lazy: fetchAttributes.length < 3 });
728
+
729
+ if (object) {
730
+ obj = cursorFunctions.parseRow(object, fetchAttributes);
731
+ }
732
+ return obj;
733
+ }
734
+
735
+ /**
736
+ * checks if a hash value exists based on the id passed
737
+ * @param {lmdb.Transaction} transactionOrEnv - Transaction used to interact with all data in an environment
738
+ * @param {String} hash_attribute - name of the hash_attribute for this environment
739
+ * @param {String|Number} id - id value to check exists
740
+ * @returns {boolean} - whether the hash exists (true) or not (false)
741
+ */
742
+ function checkHashExists(transactionOrEnv, hash_attribute, id) {
743
+ common.validateEnv(transactionOrEnv);
744
+ let env = transactionOrEnv.database || transactionOrEnv;
745
+ let transaction = transactionOrEnv.database ? transactionOrEnv : null;
746
+
747
+ if (hash_attribute === undefined) {
748
+ throw new Error(LMDB_ERRORS.HASH_ATTRIBUTE_REQUIRED);
749
+ }
750
+
751
+ if (id === undefined) {
752
+ throw new Error(LMDB_ERRORS.ID_REQUIRED);
753
+ }
754
+
755
+ let foundKey = true;
756
+
757
+ let value = env.dbis[hash_attribute].get(id, { transaction, lazy: true });
758
+
759
+ if (value === undefined) {
760
+ foundKey = false;
761
+ }
762
+ return foundKey;
763
+ }
764
+
765
+ /**
766
+ * finds an array of records based on the ids passed
767
+ * @param {lmdb.Transaction} transactionOrEnv - Transaction used to interact with all data in an environment
768
+ * @param {String} hash_attribute - name of the hash_attribute for this environment
769
+ * @param {Array.<String>} fetchAttributes - string array of attributes to pull from the object
770
+ * @param {Array.<String>} ids - list of ids to search
771
+ * @param {[]} [notFound] - optional, meant to be an array passed by reference so that skipped ids can be aggregated.
772
+ * @returns {Map} - Map of records found
773
+ */
774
+ function batchSearchByHash(transactionOrEnv, hash_attribute, fetchAttributes, ids, notFound = []) {
775
+ initializeBatchSearchByHash(transactionOrEnv, hash_attribute, fetchAttributes, ids, notFound);
776
+
777
+ return batchHashSearch(transactionOrEnv, hash_attribute, fetchAttributes, ids, notFound).map((entry) => entry[1]);
778
+ }
779
+
780
+ /**
781
+ * finds an array of records based on the ids passed and returns a map of the results
782
+ * @param {lmdb.Transaction} transactionOrEnv - Transaction used to interact with all data in an environment
783
+ * @param {String} hash_attribute - name of the hash_attribute for this environment
784
+ * @param {Array.<String>} fetchAttributes - string array of attributes to pull from the object
785
+ * @param {Array.<String>} ids - list of ids to search
786
+ * @param {[]} [notFound] - optional, meant to be an array passed by reference so that skipped ids can be aggregated.
787
+ * @returns {Map} - Map of records found
788
+ */
789
+ function batchSearchByHashToMap(transactionOrEnv, hash_attribute, fetchAttributes, ids, notFound = []) {
790
+ initializeBatchSearchByHash(transactionOrEnv, hash_attribute, fetchAttributes, ids, notFound);
791
+ let results = new Map();
792
+ for (let [id, record] of batchHashSearch(transactionOrEnv, hash_attribute, fetchAttributes, ids, notFound)) {
793
+ results.set(id, record);
794
+ }
795
+ return results;
796
+ }
797
+
798
+ /**
799
+ * finds an array of records based on the ids passed and returns a map of the results
800
+ * @param {lmdb.Transaction} transactionOrEnv - Transaction used to interact with all data in an environment
801
+ * @param {String} hash_attribute - name of the hash_attribute for this environment
802
+ * @param {Array.<String>} fetchAttributes - string array of attributes to pull from the object
803
+ * @param {Array.<String>} ids - list of ids to search
804
+ * @param {[]} [notFound] - optional, meant to be an array passed by reference so that skipped ids can be aggregated.
805
+ * @returns {Object}
806
+ */
807
+ function batchHashSearch(transactionOrEnv, hash_attribute, fetchAttributes, ids, notFound = []) {
808
+ return setupTransaction(transactionOrEnv, hash_attribute, hash_attribute, (transaction, dbi, env) => {
809
+ fetchAttributes = setGetWholeRowAttributes(env, fetchAttributes);
810
+ let lazy = fetchAttributes.length < 3;
811
+
812
+ return ids
813
+ .map((id) => {
814
+ let object = env.dbis[hash_attribute].get(id, { transaction, lazy });
815
+ if (object) {
816
+ return [id, cursorFunctions.parseRow(object, fetchAttributes)];
817
+ } else {
818
+ notFound.push(id);
819
+ }
820
+ })
821
+ .filter((object) => object); // omit not found
822
+ });
823
+ }
824
+
825
+ /**
826
+ * function used to intialize the batchSearchByHash functions
827
+ * @param {lmdb.Transaction} transactionOrEnv - Transaction used to interact with all data in an environment
828
+ * @param {String} hash_attribute - name of the hash_attribute for this environment
829
+ * @param {Array.<String>} fetchAttributes - string array of attributes to pull from the object
830
+ * @param {Array.<String>} ids - list of ids to search
831
+ * @param {[]} [_notFound] -optional, meant to be an array passed by reference so that skipped ids can be aggregated.
832
+ */
833
+ function initializeBatchSearchByHash(transactionOrEnv, hash_attribute, fetchAttributes, ids, _notFound) {
834
+ common.validateEnv(transactionOrEnv);
835
+
836
+ if (hash_attribute === undefined) {
837
+ throw new Error(LMDB_ERRORS.HASH_ATTRIBUTE_REQUIRED);
838
+ }
839
+
840
+ validateFetchAttributes(fetchAttributes);
841
+
842
+ if (ids === undefined || ids === null) {
843
+ throw new Error(LMDB_ERRORS.IDS_REQUIRED);
844
+ }
845
+ if (!ids[Symbol.iterator]) {
846
+ throw new Error(LMDB_ERRORS.IDS_MUST_BE_ITERABLE);
847
+ }
848
+ }
849
+
850
+ /**
851
+ * validates the fetchAttributes argument
852
+ * @param fetchAttributes - string array of attributes to pull from the object
853
+ */
854
+ function validateFetchAttributes(fetchAttributes) {
855
+ if (!Array.isArray(fetchAttributes)) {
856
+ if (fetchAttributes === undefined) {
857
+ throw new Error(LMDB_ERRORS.FETCH_ATTRIBUTES_REQUIRED);
858
+ }
859
+ throw new Error(LMDB_ERRORS.FETCH_ATTRIBUTES_MUST_BE_ARRAY);
860
+ }
861
+ }
862
+
863
+ /**
864
+ * common validation function for all of the comparison searches (equals, startsWith, endsWith, contains)
865
+ * @param {lmdb.RootDatabase} env - The env used to interact with all data in an environment
866
+ * @param attribute - name of the attribute (dbi) to search
867
+ * @param searchValue - value to search
868
+ */
869
+ function validateComparisonFunctions(env, attribute, searchValue) {
870
+ common.validateEnv(env);
871
+ if (attribute === undefined) {
872
+ throw new Error(LMDB_ERRORS.ATTRIBUTE_REQUIRED);
873
+ }
874
+
875
+ if (searchValue === undefined) {
876
+ throw new Error(LMDB_ERRORS.SEARCH_VALUE_REQUIRED);
877
+ }
878
+
879
+ if (searchValue?.length > MAX_SEARCH_KEY_LENGTH) {
880
+ throw new Error(LMDB_ERRORS.SEARCH_VALUE_TOO_LARGE);
881
+ }
882
+ }
883
+
884
+ /**
885
+ * determines if the intent is to return the whole row based on fetchAttributes having 1 entry that is wildcard * or %
886
+ * @param env
887
+ * @param fetchAttributes
888
+ * @returns {Array}
889
+ */
890
+ function setGetWholeRowAttributes(env, fetchAttributes) {
891
+ if (fetchAttributes.length === 1 && hdbTerms.SEARCH_WILDCARDS.indexOf(fetchAttributes[0]) >= 0) {
892
+ fetchAttributes = environmentUtility.listDBIs(env);
893
+ }
894
+
895
+ return fetchAttributes;
896
+ }
897
+
898
+ module.exports = {
899
+ searchAll,
900
+ searchAllToMap,
901
+ count,
902
+ countAll,
903
+ equals,
904
+ startsWith,
905
+ endsWith,
906
+ contains,
907
+ searchByHash,
908
+ setGetWholeRowAttributes,
909
+ batchSearchByHash,
910
+ batchSearchByHashToMap,
911
+ checkHashExists,
912
+ iterateDBI,
913
+ greaterThan,
914
+ greaterThanEqual,
915
+ lessThan,
916
+ lessThanEqual,
917
+ between,
918
+ };