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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (446) hide show
  1. package/bin/BinObjects.js +17 -0
  2. package/bin/cliOperations.js +157 -0
  3. package/bin/copyDb.ts +280 -0
  4. package/bin/harper.js +156 -0
  5. package/bin/install.js +15 -0
  6. package/bin/lite.js +5 -0
  7. package/bin/restart.js +201 -0
  8. package/bin/run.js +409 -0
  9. package/bin/status.js +65 -0
  10. package/bin/stop.js +22 -0
  11. package/bin/upgrade.js +134 -0
  12. package/components/Application.ts +646 -0
  13. package/components/ApplicationScope.ts +49 -0
  14. package/components/Component.ts +53 -0
  15. package/components/ComponentV1.ts +342 -0
  16. package/components/DEFAULT_CONFIG.ts +18 -0
  17. package/components/EntryHandler.ts +227 -0
  18. package/components/Logger.ts +14 -0
  19. package/components/OptionsWatcher.ts +354 -0
  20. package/components/PluginModule.ts +6 -0
  21. package/components/Scope.ts +329 -0
  22. package/components/componentLoader.ts +529 -0
  23. package/components/deriveCommonPatternBase.ts +31 -0
  24. package/components/deriveGlobOptions.ts +44 -0
  25. package/components/deriveURLPath.ts +57 -0
  26. package/components/operations.js +658 -0
  27. package/components/operationsValidation.js +246 -0
  28. package/components/packageComponent.ts +39 -0
  29. package/components/requestRestart.ts +26 -0
  30. package/components/resolveBaseURLPath.ts +38 -0
  31. package/components/status/ComponentStatus.ts +110 -0
  32. package/components/status/ComponentStatusRegistry.ts +251 -0
  33. package/components/status/api.ts +153 -0
  34. package/components/status/crossThread.ts +405 -0
  35. package/components/status/errors.ts +152 -0
  36. package/components/status/index.ts +44 -0
  37. package/components/status/internal.ts +65 -0
  38. package/components/status/registry.ts +12 -0
  39. package/components/status/types.ts +96 -0
  40. package/config/RootConfigWatcher.ts +59 -0
  41. package/config/configHelpers.ts +11 -0
  42. package/config/configUtils.js +967 -0
  43. package/config/harperConfigEnvVars.ts +641 -0
  44. package/dataLayer/CreateAttributeObject.js +25 -0
  45. package/dataLayer/CreateTableObject.js +11 -0
  46. package/dataLayer/DataLayerObjects.js +43 -0
  47. package/dataLayer/DeleteBeforeObject.js +22 -0
  48. package/dataLayer/DeleteObject.js +25 -0
  49. package/dataLayer/DropAttributeObject.js +11 -0
  50. package/dataLayer/GetBackupObject.js +22 -0
  51. package/dataLayer/InsertObject.js +24 -0
  52. package/dataLayer/ReadAuditLogObject.js +24 -0
  53. package/dataLayer/SQLSearch.js +1335 -0
  54. package/dataLayer/SearchByConditionsObject.js +61 -0
  55. package/dataLayer/SearchByHashObject.js +21 -0
  56. package/dataLayer/SearchObject.js +45 -0
  57. package/dataLayer/SqlSearchObject.js +14 -0
  58. package/dataLayer/UpdateObject.js +23 -0
  59. package/dataLayer/UpsertObject.js +23 -0
  60. package/dataLayer/bulkLoad.js +813 -0
  61. package/dataLayer/dataObjects/BulkLoadObjects.js +27 -0
  62. package/dataLayer/dataObjects/UpsertObject.js +23 -0
  63. package/dataLayer/delete.js +164 -0
  64. package/dataLayer/export.js +381 -0
  65. package/dataLayer/getBackup.js +40 -0
  66. package/dataLayer/harperBridge/BridgeMethods.js +81 -0
  67. package/dataLayer/harperBridge/ResourceBridge.ts +633 -0
  68. package/dataLayer/harperBridge/bridgeUtility/insertUpdateReturnObj.js +28 -0
  69. package/dataLayer/harperBridge/bridgeUtility/insertUpdateValidate.js +88 -0
  70. package/dataLayer/harperBridge/harperBridge.js +21 -0
  71. package/dataLayer/harperBridge/lmdbBridge/LMDBBridge.js +119 -0
  72. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/DeleteAuditLogsBeforeResults.js +19 -0
  73. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateAttribute.js +112 -0
  74. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateRecords.js +67 -0
  75. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateSchema.js +31 -0
  76. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateTable.js +94 -0
  77. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDeleteAuditLogsBefore.js +98 -0
  78. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDeleteRecords.js +89 -0
  79. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDropAttribute.js +109 -0
  80. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDropSchema.js +107 -0
  81. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDropTable.js +137 -0
  82. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbFlush.js +35 -0
  83. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbGetBackup.js +111 -0
  84. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbGetDataByHash.js +28 -0
  85. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbGetDataByValue.js +29 -0
  86. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbReadAuditLog.js +207 -0
  87. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbSearchByConditions.js +156 -0
  88. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbSearchByHash.js +21 -0
  89. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbSearchByValue.js +30 -0
  90. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbTransaction.js +19 -0
  91. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbUpdateRecords.js +64 -0
  92. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbUpsertRecords.js +70 -0
  93. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBCreateAttributeObject.js +22 -0
  94. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBDeleteTransactionObject.js +23 -0
  95. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBInsertTransactionObject.js +22 -0
  96. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBTransactionObject.js +23 -0
  97. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBUpdateTransactionObject.js +24 -0
  98. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBUpsertTransactionObject.js +24 -0
  99. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/TableSizeObject.js +25 -0
  100. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/initializeHashSearch.js +21 -0
  101. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/initializePaths.js +157 -0
  102. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbCheckForNewAttributes.js +94 -0
  103. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbCreateTransactionsAuditEnvironment.js +39 -0
  104. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbGetTableSize.js +34 -0
  105. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbProcessRows.js +100 -0
  106. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbSearch.js +371 -0
  107. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbWriteTransaction.js +109 -0
  108. package/dataLayer/hdbInfoController.js +254 -0
  109. package/dataLayer/insert.js +266 -0
  110. package/dataLayer/readAuditLog.js +59 -0
  111. package/dataLayer/schema.js +366 -0
  112. package/dataLayer/schemaDescribe.js +289 -0
  113. package/dataLayer/search.js +60 -0
  114. package/dataLayer/transaction.js +17 -0
  115. package/dataLayer/update.js +124 -0
  116. package/dist/components/Logger.d.ts +12 -0
  117. package/dist/{resources/ResourceInterfaceV2.js → components/Logger.js} +1 -1
  118. package/dist/components/Logger.js.map +1 -0
  119. package/dist/components/Scope.d.ts +14 -4
  120. package/dist/components/Scope.js +18 -10
  121. package/dist/components/Scope.js.map +1 -1
  122. package/dist/components/componentLoader.js +17 -10
  123. package/dist/components/componentLoader.js.map +1 -1
  124. package/dist/components/operations.js +2 -2
  125. package/dist/components/operations.js.map +1 -1
  126. package/dist/config/configUtils.d.ts +1 -1
  127. package/dist/config/configUtils.js +1 -1
  128. package/dist/config/configUtils.js.map +1 -1
  129. package/dist/dataLayer/CreateTableObject.d.ts +2 -2
  130. package/dist/dataLayer/CreateTableObject.js +2 -2
  131. package/dist/dataLayer/CreateTableObject.js.map +1 -1
  132. package/dist/dataLayer/delete.d.ts +1 -1
  133. package/dist/dataLayer/schema.js +6 -5
  134. package/dist/dataLayer/schema.js.map +1 -1
  135. package/dist/dataLayer/schemaDescribe.js +1 -1
  136. package/dist/dataLayer/schemaDescribe.js.map +1 -1
  137. package/dist/index.d.ts +1 -1
  138. package/dist/index.js +2 -0
  139. package/dist/index.js.map +1 -1
  140. package/dist/resources/DatabaseTransaction.d.ts +1 -1
  141. package/dist/resources/IterableEventQueue.d.ts +1 -1
  142. package/dist/resources/LMDBTransaction.d.ts +5 -1
  143. package/dist/resources/Resource.d.ts +1 -1
  144. package/dist/resources/ResourceInterface.d.ts +1 -1
  145. package/dist/resources/RocksIndexStore.d.ts +3 -3
  146. package/dist/resources/RocksTransactionLogStore.d.ts +6 -3
  147. package/dist/resources/Table.d.ts +15 -6
  148. package/dist/resources/Table.js +12 -4
  149. package/dist/resources/Table.js.map +1 -1
  150. package/dist/resources/analytics/read.js +32 -22
  151. package/dist/resources/analytics/read.js.map +1 -1
  152. package/dist/resources/analytics/write.js +3 -6
  153. package/dist/resources/analytics/write.js.map +1 -1
  154. package/dist/resources/auditStore.d.ts +3 -3
  155. package/dist/resources/blob.d.ts +25 -2
  156. package/dist/resources/databases.d.ts +12 -2
  157. package/dist/resources/databases.js +22 -19
  158. package/dist/resources/databases.js.map +1 -1
  159. package/dist/resources/search.js +11 -5
  160. package/dist/resources/search.js.map +1 -1
  161. package/dist/resources/transaction.d.ts +2 -1
  162. package/dist/security/auth.js +1 -1
  163. package/dist/security/auth.js.map +1 -1
  164. package/dist/security/cryptoHash.d.ts +2 -2
  165. package/dist/security/jsLoader.js +265 -73
  166. package/dist/security/jsLoader.js.map +1 -1
  167. package/dist/security/keys.js +11 -12
  168. package/dist/security/keys.js.map +1 -1
  169. package/dist/security/user.js +3 -3
  170. package/dist/security/user.js.map +1 -1
  171. package/dist/server/REST.js +16 -2
  172. package/dist/server/REST.js.map +1 -1
  173. package/dist/server/Server.d.ts +2 -1
  174. package/dist/server/Server.js.map +1 -1
  175. package/dist/server/fastifyRoutes/plugins/hdbCore.d.ts +6 -1
  176. package/dist/server/fastifyRoutes.js +2 -0
  177. package/dist/server/fastifyRoutes.js.map +1 -1
  178. package/dist/server/http.js +12 -6
  179. package/dist/server/http.js.map +1 -1
  180. package/dist/server/jobs/JobObject.d.ts +3 -3
  181. package/dist/server/loadRootComponents.js +1 -0
  182. package/dist/server/loadRootComponents.js.map +1 -1
  183. package/dist/server/operationsServer.js +3 -1
  184. package/dist/server/operationsServer.js.map +1 -1
  185. package/dist/server/serverHelpers/JSONStream.d.ts +3 -3
  186. package/dist/server/serverHelpers/Request.d.ts +5 -5
  187. package/dist/server/serverHelpers/requestTimePlugin.d.ts +1 -1
  188. package/dist/server/threads/manageThreads.d.ts +2 -2
  189. package/dist/server/threads/manageThreads.js +52 -35
  190. package/dist/server/threads/manageThreads.js.map +1 -1
  191. package/dist/server/threads/socketRouter.d.ts +1 -1
  192. package/dist/sqlTranslator/deleteTranslator.d.ts +1 -1
  193. package/dist/utility/AWS/AWSConnector.d.ts +3 -2
  194. package/dist/utility/common_utils.d.ts +3 -3
  195. package/dist/utility/environment/systemInformation.d.ts +1 -0
  196. package/dist/utility/functions/date/dateFunctions.d.ts +11 -11
  197. package/dist/utility/globalSchema.d.ts +1 -1
  198. package/dist/utility/hdbTerms.d.ts +3 -0
  199. package/dist/utility/hdbTerms.js +3 -0
  200. package/dist/utility/hdbTerms.js.map +1 -1
  201. package/dist/utility/installation.d.ts +2 -4
  202. package/dist/utility/installation.js.map +1 -1
  203. package/dist/utility/lmdb/commonUtility.d.ts +2 -1
  204. package/dist/utility/lmdb/commonUtility.js +20 -13
  205. package/dist/utility/lmdb/commonUtility.js.map +1 -1
  206. package/dist/utility/lmdb/deleteUtility.d.ts +1 -0
  207. package/dist/utility/lmdb/environmentUtility.d.ts +1 -0
  208. package/dist/utility/lmdb/searchUtility.d.ts +2 -1
  209. package/dist/utility/lmdb/writeUtility.d.ts +1 -0
  210. package/dist/utility/logging/harper_logger.d.ts +6 -6
  211. package/dist/utility/processManagement/processManagement.d.ts +1 -1
  212. package/dist/utility/processManagement/servicesConfig.d.ts +12 -6
  213. package/dist/validation/common_validators.d.ts +4 -3
  214. package/dist/validation/configValidator.d.ts +3 -2
  215. package/index.d.ts +56 -0
  216. package/index.js +41 -0
  217. package/json/systemSchema.json +373 -0
  218. package/launchServiceScripts/launchHarperDB.js +3 -0
  219. package/launchServiceScripts/utility/checkNodeVersion.js +15 -0
  220. package/package.json +35 -16
  221. package/resources/DatabaseTransaction.ts +378 -0
  222. package/resources/ErrorResource.ts +57 -0
  223. package/resources/IterableEventQueue.ts +94 -0
  224. package/resources/LMDBTransaction.ts +349 -0
  225. package/resources/RecordEncoder.ts +702 -0
  226. package/resources/RequestTarget.ts +134 -0
  227. package/resources/Resource.ts +789 -0
  228. package/resources/ResourceInterface.ts +221 -0
  229. package/resources/Resources.ts +162 -0
  230. package/resources/RocksIndexStore.ts +70 -0
  231. package/resources/RocksTransactionLogStore.ts +352 -0
  232. package/resources/Table.ts +4531 -0
  233. package/resources/analytics/hostnames.ts +72 -0
  234. package/resources/analytics/metadata.ts +10 -0
  235. package/resources/analytics/read.ts +252 -0
  236. package/resources/analytics/write.ts +803 -0
  237. package/resources/auditStore.ts +556 -0
  238. package/resources/blob.ts +1268 -0
  239. package/resources/crdt.ts +125 -0
  240. package/resources/dataLoader.ts +527 -0
  241. package/resources/databases.ts +1290 -0
  242. package/resources/graphql.ts +221 -0
  243. package/resources/indexes/HierarchicalNavigableSmallWorld.ts +638 -0
  244. package/resources/indexes/customIndexes.ts +7 -0
  245. package/resources/indexes/vector.ts +38 -0
  246. package/resources/jsResource.ts +86 -0
  247. package/resources/loadEnv.ts +22 -0
  248. package/resources/login.ts +18 -0
  249. package/resources/openApi.ts +409 -0
  250. package/resources/registrationDeprecated.ts +8 -0
  251. package/resources/replayLogs.ts +136 -0
  252. package/resources/roles.ts +98 -0
  253. package/resources/search.ts +1301 -0
  254. package/resources/tracked.ts +584 -0
  255. package/resources/transaction.ts +89 -0
  256. package/resources/transactionBroadcast.ts +258 -0
  257. package/security/auth.ts +376 -0
  258. package/security/certificateVerification/certificateVerificationSource.ts +84 -0
  259. package/security/certificateVerification/configValidation.ts +107 -0
  260. package/security/certificateVerification/crlVerification.ts +623 -0
  261. package/security/certificateVerification/index.ts +121 -0
  262. package/security/certificateVerification/ocspVerification.ts +148 -0
  263. package/security/certificateVerification/pkijs-ed25519-patch.ts +188 -0
  264. package/security/certificateVerification/types.ts +128 -0
  265. package/security/certificateVerification/verificationConfig.ts +138 -0
  266. package/security/certificateVerification/verificationUtils.ts +447 -0
  267. package/security/cryptoHash.js +42 -0
  268. package/security/data_objects/PermissionAttributeResponseObject.js +15 -0
  269. package/security/data_objects/PermissionResponseObject.js +115 -0
  270. package/security/data_objects/PermissionTableResponseObject.js +20 -0
  271. package/security/fastifyAuth.js +169 -0
  272. package/security/impersonation.ts +160 -0
  273. package/security/jsLoader.ts +733 -0
  274. package/security/keys.js +948 -0
  275. package/security/permissionsTranslator.js +300 -0
  276. package/security/role.js +218 -0
  277. package/security/tokenAuthentication.ts +228 -0
  278. package/security/user.ts +449 -0
  279. package/server/DurableSubscriptionsSession.ts +503 -0
  280. package/server/REST.ts +407 -0
  281. package/server/Server.ts +89 -0
  282. package/server/fastifyRoutes/helpers/getCORSOptions.js +36 -0
  283. package/server/fastifyRoutes/helpers/getHeaderTimeoutConfig.js +15 -0
  284. package/server/fastifyRoutes/helpers/getServerOptions.js +33 -0
  285. package/server/fastifyRoutes/plugins/hdbCore.js +39 -0
  286. package/server/fastifyRoutes.ts +205 -0
  287. package/server/graphqlQuerying.ts +700 -0
  288. package/server/http.ts +640 -0
  289. package/server/itc/serverHandlers.js +161 -0
  290. package/server/itc/utility/ITCEventObject.js +10 -0
  291. package/server/jobs/JobObject.js +24 -0
  292. package/server/jobs/jobProcess.js +69 -0
  293. package/server/jobs/jobRunner.js +162 -0
  294. package/server/jobs/jobs.js +304 -0
  295. package/server/loadRootComponents.js +44 -0
  296. package/server/mqtt.ts +485 -0
  297. package/server/nodeName.ts +75 -0
  298. package/server/operationsServer.ts +313 -0
  299. package/server/serverHelpers/Headers.ts +108 -0
  300. package/server/serverHelpers/JSONStream.ts +269 -0
  301. package/server/serverHelpers/OperationFunctionObject.ts +13 -0
  302. package/server/serverHelpers/Request.ts +158 -0
  303. package/server/serverHelpers/contentTypes.ts +637 -0
  304. package/server/serverHelpers/requestTimePlugin.js +57 -0
  305. package/server/serverHelpers/serverHandlers.js +148 -0
  306. package/server/serverHelpers/serverUtilities.ts +473 -0
  307. package/server/serverRegistry.ts +8 -0
  308. package/server/static.ts +187 -0
  309. package/server/status/definitions.ts +37 -0
  310. package/server/status/index.ts +125 -0
  311. package/server/storageReclamation.ts +93 -0
  312. package/server/threads/itc.js +89 -0
  313. package/server/threads/manageThreads.js +596 -0
  314. package/server/threads/socketRouter.ts +360 -0
  315. package/server/threads/threadServer.js +279 -0
  316. package/server/throttle.ts +73 -0
  317. package/sqlTranslator/SelectValidator.js +330 -0
  318. package/sqlTranslator/alasqlFunctionImporter.js +62 -0
  319. package/sqlTranslator/deleteTranslator.js +67 -0
  320. package/sqlTranslator/index.js +242 -0
  321. package/sqlTranslator/sql_statement_bucket.js +472 -0
  322. package/static/defaultConfig.yaml +3 -0
  323. package/studio/web/HDBDogOnly.svg +78 -0
  324. package/studio/web/assets/PPRadioGrotesk-Bold-DDaUYG8E.woff +0 -0
  325. package/studio/web/assets/fa-brands-400-CEJbCg16.woff +0 -0
  326. package/studio/web/assets/fa-brands-400-CSYNqBb_.ttf +0 -0
  327. package/studio/web/assets/fa-brands-400-DnkPfk3o.eot +0 -0
  328. package/studio/web/assets/fa-brands-400-UxlILjvJ.woff2 +0 -0
  329. package/studio/web/assets/fa-brands-400-cH1MgKbP.svg +3717 -0
  330. package/studio/web/assets/fa-regular-400-BhTwtT8w.eot +0 -0
  331. package/studio/web/assets/fa-regular-400-D1vz6WBx.ttf +0 -0
  332. package/studio/web/assets/fa-regular-400-DFnMcJPd.woff +0 -0
  333. package/studio/web/assets/fa-regular-400-DGzu1beS.woff2 +0 -0
  334. package/studio/web/assets/fa-regular-400-gwj8Pxq-.svg +801 -0
  335. package/studio/web/assets/fa-solid-900-B4ZZ7kfP.svg +5034 -0
  336. package/studio/web/assets/fa-solid-900-B6Axprfb.eot +0 -0
  337. package/studio/web/assets/fa-solid-900-BUswJgRo.woff2 +0 -0
  338. package/studio/web/assets/fa-solid-900-DOXgCApm.woff +0 -0
  339. package/studio/web/assets/fa-solid-900-mxuxnBEa.ttf +0 -0
  340. package/studio/web/assets/index-C1G-Jo6n.js +37 -0
  341. package/studio/web/assets/index-C1G-Jo6n.js.map +1 -0
  342. package/studio/web/assets/index-D-CahN0-.js +2 -0
  343. package/studio/web/assets/index-D-CahN0-.js.map +1 -0
  344. package/studio/web/assets/index-DxlZI0PX.js +235 -0
  345. package/studio/web/assets/index-DxlZI0PX.js.map +1 -0
  346. package/studio/web/assets/index-Y2g_iFpU.css +1 -0
  347. package/studio/web/assets/index-jiPwkrsB.css +1 -0
  348. package/studio/web/assets/index.lazy-BUXDDqq9.js +266 -0
  349. package/studio/web/assets/index.lazy-BUXDDqq9.js.map +1 -0
  350. package/studio/web/assets/profiler-CU93QiSW.js +2 -0
  351. package/studio/web/assets/profiler-CU93QiSW.js.map +1 -0
  352. package/studio/web/assets/react-redux-B8k9Ep7e.js +6 -0
  353. package/studio/web/assets/react-redux-B8k9Ep7e.js.map +1 -0
  354. package/studio/web/assets/startRecording-DFeBXGk6.js +3 -0
  355. package/studio/web/assets/startRecording-DFeBXGk6.js.map +1 -0
  356. package/studio/web/fabric-signup-background.webp +0 -0
  357. package/studio/web/fabric-signup-text.png +0 -0
  358. package/studio/web/favicon_purple.png +0 -0
  359. package/studio/web/github-icon.svg +15 -0
  360. package/studio/web/harper-fabric_black.png +0 -0
  361. package/studio/web/harper-fabric_white.png +0 -0
  362. package/studio/web/harper-studio_white.png +0 -0
  363. package/studio/web/index.html +16 -0
  364. package/studio/web/running.css +148 -0
  365. package/studio/web/running.html +147 -0
  366. package/studio/web/running.js +111 -0
  367. package/upgrade/UpgradeObjects.js +13 -0
  368. package/upgrade/directives/directivesController.js +90 -0
  369. package/upgrade/directivesManager.js +139 -0
  370. package/upgrade/upgradePrompt.js +124 -0
  371. package/upgrade/upgradeUtilities.js +28 -0
  372. package/utility/AWS/AWSConnector.js +29 -0
  373. package/utility/OperationFunctionCaller.js +63 -0
  374. package/utility/assignCmdEnvVariables.js +62 -0
  375. package/utility/common_utils.js +867 -0
  376. package/utility/environment/environmentManager.js +208 -0
  377. package/utility/environment/systemInformation.js +355 -0
  378. package/utility/errors/commonErrors.js +267 -0
  379. package/utility/errors/hdbError.js +146 -0
  380. package/utility/functions/date/dateFunctions.js +65 -0
  381. package/utility/functions/geo.js +355 -0
  382. package/utility/functions/sql/alaSQLExtension.js +104 -0
  383. package/utility/globalSchema.js +35 -0
  384. package/utility/hdbTerms.ts +819 -0
  385. package/utility/install/checkJWTTokensExist.js +62 -0
  386. package/utility/install/harperdb.conf +15 -0
  387. package/utility/install/harperdb.service +14 -0
  388. package/utility/install/installer.js +635 -0
  389. package/utility/installation.ts +30 -0
  390. package/utility/lmdb/DBIDefinition.js +20 -0
  391. package/utility/lmdb/DeleteRecordsResponseObject.js +25 -0
  392. package/utility/lmdb/InsertRecordsResponseObject.js +22 -0
  393. package/utility/lmdb/OpenDBIObject.js +31 -0
  394. package/utility/lmdb/OpenEnvironmentObject.js +41 -0
  395. package/utility/lmdb/UpdateRecordsResponseObject.js +25 -0
  396. package/utility/lmdb/UpsertRecordsResponseObject.js +22 -0
  397. package/utility/lmdb/cleanLMDBMap.js +65 -0
  398. package/utility/lmdb/commonUtility.js +130 -0
  399. package/utility/lmdb/deleteUtility.js +128 -0
  400. package/utility/lmdb/environmentUtility.js +477 -0
  401. package/utility/lmdb/searchCursorFunctions.js +187 -0
  402. package/utility/lmdb/searchUtility.js +918 -0
  403. package/utility/lmdb/terms.js +57 -0
  404. package/utility/lmdb/writeUtility.js +407 -0
  405. package/utility/logging/harper_logger.js +876 -0
  406. package/utility/logging/logRotator.js +157 -0
  407. package/utility/logging/logger.ts +24 -0
  408. package/utility/logging/readLog.js +355 -0
  409. package/utility/logging/transactionLog.js +57 -0
  410. package/utility/mount_hdb.js +59 -0
  411. package/utility/npmUtilities.js +102 -0
  412. package/utility/operationPermissions.ts +112 -0
  413. package/utility/operation_authorization.js +836 -0
  414. package/utility/packageUtils.js +55 -0
  415. package/utility/password.ts +99 -0
  416. package/utility/processManagement/processManagement.js +187 -0
  417. package/utility/processManagement/servicesConfig.js +56 -0
  418. package/utility/scripts/restartHdb.js +24 -0
  419. package/utility/scripts/user_data.sh +13 -0
  420. package/utility/signalling.js +36 -0
  421. package/utility/terms/certificates.js +81 -0
  422. package/utility/when.ts +20 -0
  423. package/validation/bulkDeleteValidator.js +24 -0
  424. package/validation/check_permissions.js +19 -0
  425. package/validation/common_validators.js +95 -0
  426. package/validation/configValidator.js +331 -0
  427. package/validation/deleteValidator.js +15 -0
  428. package/validation/fileLoadValidator.js +153 -0
  429. package/validation/insertValidator.js +40 -0
  430. package/validation/installValidator.js +37 -0
  431. package/validation/readLogValidator.js +64 -0
  432. package/validation/role_validation.js +320 -0
  433. package/validation/schemaMetadataValidator.js +42 -0
  434. package/validation/searchValidator.js +166 -0
  435. package/validation/statusValidator.ts +66 -0
  436. package/validation/transactionLogValidator.js +33 -0
  437. package/validation/user_validation.js +55 -0
  438. package/validation/validationWrapper.js +105 -0
  439. package/dist/resources/ResourceInterfaceV2.d.ts +0 -21
  440. package/dist/resources/ResourceInterfaceV2.js.map +0 -1
  441. package/dist/resources/ResourceV2.d.ts +0 -30
  442. package/dist/resources/ResourceV2.js +0 -27
  443. package/dist/resources/ResourceV2.js.map +0 -1
  444. package/dist/resources/analytics/profile.d.ts +0 -2
  445. package/dist/resources/analytics/profile.js +0 -144
  446. package/dist/resources/analytics/profile.js.map +0 -1
@@ -0,0 +1,635 @@
1
+ 'use strict';
2
+
3
+ const os = require('os');
4
+ const inquirer = require('inquirer');
5
+ const fs = require('fs-extra');
6
+ const PropertiesReader = require('properties-reader');
7
+ const chalk = require('chalk');
8
+ const path = require('path');
9
+ let ora; // Will be loaded dynamically as it's an ES module
10
+ const YAML = require('yaml');
11
+
12
+ const hdbLogger = require('../logging/harper_logger.js');
13
+ const envManager = require('../environment/environmentManager.js');
14
+ const hdbUtils = require('../common_utils.js');
15
+ const assignCMDENVVariables = require('../../utility/assignCmdEnvVariables.js');
16
+ const hdbInfoController = require('../../dataLayer/hdbInfoController.js');
17
+ const { packageJson } = require('../packageUtils.js');
18
+ const hdbTerms = require('../hdbTerms.ts');
19
+ const { CONFIG_PARAMS } = hdbTerms;
20
+ const installValidator = require('../../validation/installValidator.js');
21
+ const mountHdb = require('../mount_hdb.js');
22
+ const configUtils = require('../../config/configUtils.js');
23
+ const userOps = require('../../security/user.ts');
24
+ const roleOps = require('../../security/role.js');
25
+ const checkJwtTokens = require('./checkJWTTokensExist.js');
26
+ const globalSchema = require('../globalSchema.js');
27
+ const promisify = require('util').promisify;
28
+ const pSchemaToGlobal = promisify(globalSchema.setSchemaDataToGlobal);
29
+ const keys = require('../../security/keys.js');
30
+
31
+ // Removes the color formatting that was being applied to the prompt answer.
32
+ const PROMPT_ANSWER_TRANSFORMER = (answer) => answer;
33
+ const HDB_PROMPT_MSG = (msg) => chalk.magenta.bold(msg);
34
+ const LINE_BREAK = os.EOL;
35
+ const PROMPT_PREFIX = '';
36
+ const INSTALL_START_MSG = 'Starting Harper install...';
37
+ const INSTALL_COMPLETE_MSG = 'Harper installation was successful.';
38
+ const UPGRADE_MSG = 'An out of date version of Harper is already installed.';
39
+ const HDB_EXISTS_MSG = 'It appears that Harper is already installed. Exiting install...';
40
+ const ABORT_MSG = 'Aborting install';
41
+ const PROCESS_HOME = os.homedir();
42
+ const DEFAULT_HDB_ROOT = path.join(PROCESS_HOME, hdbTerms.HDB_ROOT_DIR_NAME);
43
+ const DEFAULT_ADMIN_USERNAME = 'admin';
44
+ const DEFAULT_NODE_HOSTNAME = 'localhost';
45
+ const DEFAULT_CONFIG_MODE = 'dev';
46
+
47
+ const DEV_MODE_CONFIG = {
48
+ [CONFIG_PARAMS.HTTP_CORS]: true,
49
+ [CONFIG_PARAMS.HTTP_CORSACCESSLIST]: ['*'],
50
+ [CONFIG_PARAMS.HTTP_PORT]: 9926,
51
+ [CONFIG_PARAMS.AUTHENTICATION_AUTHORIZELOCAL]: true,
52
+ [CONFIG_PARAMS.THREADS_COUNT]: 1,
53
+ [CONFIG_PARAMS.THREADS_DEBUG]: true,
54
+ [CONFIG_PARAMS.LOGGING_STDSTREAMS]: true,
55
+ [CONFIG_PARAMS.LOGGING_LEVEL]: 'info',
56
+ [CONFIG_PARAMS.OPERATIONSAPI_NETWORK_PORT]: 9925,
57
+ [CONFIG_PARAMS.LOCALSTUDIO_ENABLED]: true,
58
+ [CONFIG_PARAMS.NODE_HOSTNAME]: DEFAULT_NODE_HOSTNAME,
59
+ };
60
+
61
+ // Install prompts
62
+ const INSTALL_PROMPTS = {
63
+ DESTINATION: 'Please enter a destination for Harper:',
64
+ HDB_USERNAME: 'Please enter a username for the administrative user:',
65
+ HDB_PASS: 'Please enter a password for the administrative user:',
66
+ NODE_HOSTNAME: 'Please enter the hostname for the Harper instance:',
67
+ DEFAULTS_MODE: 'Default Config - dev (easy access/debugging) or prod (security/performance): (dev/prod)',
68
+ };
69
+
70
+ const cfgEnv = assignCMDENVVariables([hdbTerms.INSTALL_PROMPTS.HDB_CONFIG]);
71
+ let hdbRoot = undefined;
72
+ let conditionalRollback = false;
73
+ let ignoreExisting = false;
74
+
75
+ /**
76
+ * This module orchestrates the installation of Harper.
77
+ */
78
+
79
+ module.exports = { install, updateConfigEnv, setIgnoreExisting };
80
+ install.createSuperUser = createSuperUser;
81
+
82
+ /**
83
+ * Calls all the functions that are needed to install Harper.
84
+ * @returns {Promise<void>}
85
+ */
86
+ async function install() {
87
+ console.log(HDB_PROMPT_MSG(LINE_BREAK + INSTALL_START_MSG + LINE_BREAK));
88
+ hdbLogger.notify(INSTALL_START_MSG);
89
+
90
+ let configFromFile;
91
+ if (cfgEnv[hdbTerms.INSTALL_PROMPTS.HDB_CONFIG]) {
92
+ configFromFile = getConfigFromFile();
93
+ }
94
+
95
+ // Check to see if any cmd/env vars are passed that override install prompts.
96
+ const promptOverride = checkForPromptOverride();
97
+ Object.assign(promptOverride, configFromFile);
98
+ if (
99
+ promptOverride[hdbTerms.INSTALL_PROMPTS.REPLICATION_HOSTNAME] &&
100
+ !promptOverride[hdbTerms.INSTALL_PROMPTS.NODE_HOSTNAME]
101
+ ) {
102
+ promptOverride[hdbTerms.INSTALL_PROMPTS.NODE_HOSTNAME] =
103
+ promptOverride[hdbTerms.INSTALL_PROMPTS.REPLICATION_HOSTNAME];
104
+ }
105
+
106
+ // For backwards compatibility for a time before DEFAULTS_MODE (and host name) assume prod when these args used
107
+ if (
108
+ promptOverride[hdbTerms.INSTALL_PROMPTS.ROOTPATH] &&
109
+ promptOverride[hdbTerms.INSTALL_PROMPTS.HDB_ADMIN_USERNAME] &&
110
+ promptOverride[hdbTerms.INSTALL_PROMPTS.HDB_ADMIN_PASSWORD] &&
111
+ promptOverride[hdbTerms.INSTALL_PROMPTS.NODE_HOSTNAME] &&
112
+ promptOverride[hdbTerms.INSTALL_PROMPTS.DEFAULTS_MODE] === undefined
113
+ ) {
114
+ promptOverride[hdbTerms.INSTALL_PROMPTS.DEFAULTS_MODE] = 'prod';
115
+ }
116
+
117
+ // Validate any cmd/env params passed to install
118
+ const validationError = installValidator(promptOverride);
119
+ if (validationError) {
120
+ throw validationError.message;
121
+ }
122
+
123
+ // Check for an existing installation of Harper.
124
+ await checkForExistingInstall();
125
+
126
+ // Prompt the user with params needed for install.
127
+ const installParams = await installPrompts(promptOverride);
128
+
129
+ // HDB root is the one of the first params we need for install.
130
+ hdbRoot = installParams[hdbTerms.INSTALL_PROMPTS.ROOTPATH];
131
+
132
+ if (
133
+ cfgEnv[hdbTerms.INSTALL_PROMPTS.HDB_CONFIG] &&
134
+ path.dirname(cfgEnv[hdbTerms.INSTALL_PROMPTS.HDB_CONFIG]) === hdbRoot
135
+ ) {
136
+ conditionalRollback = true;
137
+ }
138
+
139
+ // We allow HDB to run without a boot file we check for a harperdb-config.yaml
140
+ if (
141
+ !ignoreExisting &&
142
+ !cfgEnv[hdbTerms.INSTALL_PROMPTS.HDB_CONFIG] &&
143
+ (await fs.pathExists(
144
+ path.join(hdbRoot, hdbTerms.HARPER_CONFIG_FILE) ||
145
+ (await fs.pathExists(path.join(hdbRoot, hdbTerms.HDB_CONFIG_FILE)))
146
+ ))
147
+ ) {
148
+ console.error(HDB_EXISTS_MSG);
149
+ process.exit();
150
+ }
151
+
152
+ if (!ora) {
153
+ ora = (await import('ora')).default;
154
+ }
155
+ const spinner = ora({
156
+ prefixText: HDB_PROMPT_MSG('Installing'),
157
+ color: 'magenta',
158
+ spinner: 'simpleDots',
159
+ });
160
+ spinner.start();
161
+
162
+ if (hdbUtils.isEmpty(hdbRoot)) {
163
+ throw new Error('Installer should have the HDB root param at the stage it is in but it does not.');
164
+ }
165
+ envManager.setHdbBasePath(hdbRoot);
166
+ envManager.setProperty(hdbTerms.CONFIG_PARAMS.STORAGE_ENGINE, installParams.STORAGE_ENGINE);
167
+
168
+ // Creates the Harper project folder structure and the LMDB environments/dbis.
169
+ await mountHdb(hdbRoot);
170
+
171
+ // Creates the boot prop file in user home dir. Boot prop file contains location of hdb config.
172
+ await createBootPropertiesFile();
173
+
174
+ // Create the harperdb-config.yaml file
175
+ await createConfigFile(installParams);
176
+
177
+ // At this point there should be config and Harper folders so re-init log settings to update
178
+ hdbLogger.initLogSettings(true);
179
+
180
+ // Create the super user.
181
+ await createSuperUser(installParams);
182
+
183
+ // Create cert and private keys.
184
+ await keys.updateConfigCert();
185
+ await keys.generateCertsKeys();
186
+
187
+ // Insert current version of Harper into versions table.
188
+ await insertHdbVersionInfo();
189
+
190
+ // Checks that the RSA keys exist for JWT generation, if not we create them.
191
+ checkJwtTokens();
192
+
193
+ spinner.stop();
194
+
195
+ console.log(HDB_PROMPT_MSG(LINE_BREAK + INSTALL_COMPLETE_MSG + LINE_BREAK));
196
+ hdbLogger.notify(INSTALL_COMPLETE_MSG);
197
+ }
198
+
199
+ function getConfigFromFile() {
200
+ let doc = YAML.parseDocument(fs.readFileSync(cfgEnv[hdbTerms.INSTALL_PROMPTS.HDB_CONFIG], 'utf8'), {
201
+ simpleKeys: true,
202
+ });
203
+ const flatCfg = configUtils.flattenConfig(doc.toJSON());
204
+
205
+ // This ensures that if config file has rootpath, rootpath install prompt uses this value
206
+ if (flatCfg[hdbTerms.CONFIG_PARAMS.ROOTPATH.toLowerCase()])
207
+ flatCfg.ROOTPATH = flatCfg[hdbTerms.CONFIG_PARAMS.ROOTPATH.toLowerCase()];
208
+
209
+ return flatCfg;
210
+ }
211
+
212
+ /**
213
+ * Asks the user the questions needed to get Harper installed.
214
+ * If cmd/env vats are passed to install the prompts will not be asked.
215
+ * @param promptOverride - an object that contains all the params needed to install.
216
+ * @returns {Promise<*>}
217
+ */
218
+ async function installPrompts(promptOverride) {
219
+ hdbLogger.trace('Getting install prompts and params.');
220
+
221
+ const promptsSchema = [
222
+ {
223
+ type: 'input',
224
+ transformer: PROMPT_ANSWER_TRANSFORMER,
225
+ when: displayCmdEnvVar(promptOverride[hdbTerms.INSTALL_PROMPTS.ROOTPATH], INSTALL_PROMPTS.DESTINATION),
226
+ name: hdbTerms.INSTALL_PROMPTS.ROOTPATH,
227
+ prefix: PROMPT_PREFIX,
228
+ default: DEFAULT_HDB_ROOT,
229
+ validate: async (value) => {
230
+ if (checkForEmptyValue(value)) return checkForEmptyValue(value);
231
+ if (await fs.pathExists(path.join(value, 'system', 'hdb_user.mdb')))
232
+ return `'${value}' is already in use. Please enter a different path.`;
233
+ return true;
234
+ },
235
+ message: HDB_PROMPT_MSG(INSTALL_PROMPTS.DESTINATION),
236
+ },
237
+ {
238
+ type: 'input',
239
+ transformer: PROMPT_ANSWER_TRANSFORMER,
240
+ when: displayCmdEnvVar(promptOverride[hdbTerms.INSTALL_PROMPTS.HDB_ADMIN_USERNAME], INSTALL_PROMPTS.HDB_USERNAME),
241
+ name: hdbTerms.INSTALL_PROMPTS.HDB_ADMIN_USERNAME,
242
+ prefix: PROMPT_PREFIX,
243
+ default: DEFAULT_ADMIN_USERNAME,
244
+ validate: (value) => {
245
+ if (checkForEmptyValue(value)) return checkForEmptyValue(value);
246
+ return true;
247
+ },
248
+ message: HDB_PROMPT_MSG(INSTALL_PROMPTS.HDB_USERNAME),
249
+ },
250
+ {
251
+ type: 'password',
252
+ when: displayCmdEnvVar(promptOverride[hdbTerms.INSTALL_PROMPTS.HDB_ADMIN_PASSWORD], INSTALL_PROMPTS.HDB_PASS),
253
+ name: hdbTerms.INSTALL_PROMPTS.HDB_ADMIN_PASSWORD,
254
+ prefix: PROMPT_PREFIX,
255
+ validate: (value) => {
256
+ if (checkForEmptyValue(value)) return checkForEmptyValue(value);
257
+ return true;
258
+ },
259
+ message: HDB_PROMPT_MSG(INSTALL_PROMPTS.HDB_PASS),
260
+ },
261
+ {
262
+ type: 'input',
263
+ transformer: PROMPT_ANSWER_TRANSFORMER,
264
+ when: displayCmdEnvVar(promptOverride[hdbTerms.INSTALL_PROMPTS.NODE_HOSTNAME], INSTALL_PROMPTS.NODE_HOSTNAME),
265
+ name: hdbTerms.INSTALL_PROMPTS.NODE_HOSTNAME,
266
+ prefix: PROMPT_PREFIX,
267
+ default: DEFAULT_NODE_HOSTNAME,
268
+ validate: (value) => {
269
+ if (checkForEmptyValue(value)) return checkForEmptyValue(value);
270
+ return true;
271
+ },
272
+ message: HDB_PROMPT_MSG(INSTALL_PROMPTS.NODE_HOSTNAME),
273
+ },
274
+ {
275
+ type: 'input',
276
+ transformer: PROMPT_ANSWER_TRANSFORMER,
277
+ when: displayCmdEnvVar(promptOverride[hdbTerms.INSTALL_PROMPTS.DEFAULTS_MODE], INSTALL_PROMPTS.DEFAULTS_MODE),
278
+ name: hdbTerms.INSTALL_PROMPTS.DEFAULTS_MODE,
279
+ prefix: PROMPT_PREFIX,
280
+ default: DEFAULT_CONFIG_MODE,
281
+ validate: (value) => {
282
+ if (checkForEmptyValue(value)) return checkForEmptyValue(value);
283
+ if (value !== 'dev' && value !== 'prod') {
284
+ return `Invalid response '${value}', options are 'dev' or 'prod'.`;
285
+ }
286
+ return true;
287
+ },
288
+ message: HDB_PROMPT_MSG(INSTALL_PROMPTS.DEFAULTS_MODE),
289
+ },
290
+ ];
291
+
292
+ const answers = await inquirer.prompt(promptsSchema);
293
+ // If there are no answers all the prompts have been overridden.
294
+ if (Object.keys(answers).length === 0) {
295
+ return promptOverride;
296
+ }
297
+
298
+ // Loop through the answers and if they dont exist in the promptOverride obj add them.
299
+ for (const param in answers) {
300
+ if (promptOverride[param] === undefined) {
301
+ promptOverride[param] = answers[param];
302
+ }
303
+ }
304
+
305
+ return promptOverride;
306
+ }
307
+
308
+ /**
309
+ * Used to log prompt override values. A boolean is returned because this will
310
+ * determine if the prompt is called or not.
311
+ * @param value
312
+ * @param msg
313
+ * @returns {boolean}
314
+ */
315
+ function displayCmdEnvVar(value, msg) {
316
+ if (value !== undefined) {
317
+ if (msg.includes('password')) {
318
+ console.log(`${HDB_PROMPT_MSG(msg)} ${chalk.gray('[hidden]')}`);
319
+ hdbLogger.trace(`${HDB_PROMPT_MSG(msg)} [hidden]`);
320
+ } else {
321
+ console.log(`${HDB_PROMPT_MSG(msg)} ${value}`);
322
+ hdbLogger.trace(`${HDB_PROMPT_MSG(msg)} ${value}`);
323
+ }
324
+ return false;
325
+ }
326
+
327
+ return true;
328
+ }
329
+
330
+ /**
331
+ * Checks for an empty value.
332
+ * @param value
333
+ * @returns {string|undefined}
334
+ */
335
+ function checkForEmptyValue(value) {
336
+ const val = value.replace(/ /g, '');
337
+ if (val === '' || val === "''" || val === '""') {
338
+ return 'Value cannot be empty.';
339
+ }
340
+
341
+ return undefined;
342
+ }
343
+
344
+ /**
345
+ * Check the cmd/env vars for any values that should override the install prompts.
346
+ */
347
+ function checkForPromptOverride() {
348
+ const installPromptsArray = Object.keys(hdbTerms.INSTALL_PROMPTS);
349
+ // The config refactor meant that some config values have multiple key names (old and new). Also some of the
350
+ // prompts are not config file values. For this reason we search twice for any matching cmd/env vars.
351
+ const promptCmdenvArgs = assignCMDENVVariables(installPromptsArray);
352
+ const configCmdenvArgs = assignCMDENVVariables(Object.keys(hdbTerms.CONFIG_PARAM_MAP), true);
353
+ const overrideValues = {};
354
+
355
+ for (const install_prompt of installPromptsArray) {
356
+ // Get the config param for a prompt. There will be only one config param for a config value, this is the value
357
+ // that corresponds to a position in the config yaml file. This can be undefined because some of the prompts are
358
+ // not config file values.
359
+ const configParam = hdbTerms.CONFIG_PARAM_MAP[install_prompt.toLowerCase()];
360
+
361
+ // If cmd/env var is passed that matches one of the install wizard prompts add it to override values object.
362
+ if (promptCmdenvArgs[install_prompt]) {
363
+ if (configParam === undefined) {
364
+ overrideValues[install_prompt] = promptCmdenvArgs[install_prompt];
365
+ } else {
366
+ overrideValues[configParam.toUpperCase()] = promptCmdenvArgs[install_prompt];
367
+ }
368
+
369
+ // If the prompt has a corresponding config param and that config param is present in the cmd/env vars, set that value
370
+ // to its corresponding prompt value.
371
+ } else if (configParam !== undefined && configCmdenvArgs[configParam.toLowerCase()]) {
372
+ overrideValues[install_prompt] = configCmdenvArgs[configParam.toLowerCase()];
373
+ }
374
+ }
375
+
376
+ return overrideValues;
377
+ }
378
+
379
+ /**
380
+ * Checks for an existing install of Harper and prompts user accordingly.
381
+ * @returns {Promise<void>}
382
+ */
383
+ async function checkForExistingInstall() {
384
+ hdbLogger.trace('Checking for existing install.');
385
+ const bootPropPath = hdbUtils.getPropsFilePath();
386
+ const bootFileExists = await fs.pathExists(bootPropPath);
387
+
388
+ let hdbExists;
389
+ if (bootFileExists) {
390
+ hdbLogger.trace(`Install found an existing boot prop file at:${bootPropPath}`);
391
+ const hdbProperties = PropertiesReader(bootPropPath);
392
+ const configFilePath =
393
+ configUtils.getConfigValue(hdbTerms.BOOT_PROP_PARAMS.SETTINGS_PATH_KEY) ||
394
+ hdbProperties.get(hdbTerms.BOOT_PROP_PARAMS.SETTINGS_PATH_KEY);
395
+ hdbExists = await fs.pathExists(configFilePath);
396
+ }
397
+
398
+ // If the boot file doesn't exist check to see if cli/env root path has been passed and
399
+ // is pointing to an installed HDB
400
+ if (!bootFileExists && hdbUtils.noBootFile()) hdbExists = true;
401
+
402
+ if (hdbExists && !ignoreExisting) {
403
+ hdbLogger.trace(`Install found existing HDB config at:${bootPropPath}`);
404
+ // getVersionUpdateInfo will only return an obj if there is an upgrade directive for the new version.
405
+ const upgradeObj = await hdbInfoController.getVersionUpdateInfo();
406
+ if (upgradeObj) {
407
+ const upgradeToVerMsg = `Please use \`harperdb upgrade\` to update to ${packageJson.version}. Exiting install...`;
408
+ console.log(LINE_BREAK + chalk.magenta.bold(UPGRADE_MSG));
409
+ console.log(chalk.magenta.bold(upgradeToVerMsg));
410
+ hdbLogger.error(upgradeToVerMsg);
411
+ } else {
412
+ console.log(LINE_BREAK + chalk.magenta.bold(HDB_EXISTS_MSG));
413
+ hdbLogger.error(HDB_EXISTS_MSG);
414
+ }
415
+ process.exit(0);
416
+ }
417
+ }
418
+
419
+ async function createBootPropertiesFile() {
420
+ const configFilePath = path.join(hdbRoot, hdbTerms.HARPER_CONFIG_FILE);
421
+
422
+ let install_user;
423
+ try {
424
+ install_user = os.userInfo().username;
425
+ } catch {
426
+ // this could fail on android, try env variables
427
+ install_user =
428
+ process.env.USERNAME || process.env.USER || process.env.LOGNAME || process.env.LNAME || process.env.SUDO_USER;
429
+ }
430
+
431
+ if (install_user) {
432
+ const bootPropsValue = `settings_path = ${configFilePath}
433
+ install_user = ${install_user}`;
434
+
435
+ const homeDir = hdbUtils.getHomeDir();
436
+ const homeDirPath = path.join(homeDir, hdbTerms.HDB_HOME_DIR_NAME);
437
+ const homeDirKeysDirPath = path.join(homeDirPath, hdbTerms.LICENSE_KEY_DIR_NAME);
438
+ const propsFilePath = path.join(homeDirPath, hdbTerms.BOOT_PROPS_FILE_NAME);
439
+ // if the properties file already exists, and we have an explicit ROOTPATH, we don't overwrite the existing
440
+ // properties file
441
+ if (!fs.existsSync(propsFilePath) || !hdbUtils.getEnvCliRootPath()) {
442
+ try {
443
+ fs.mkdirpSync(homeDirPath, { mode: hdbTerms.HDB_FILE_PERMISSIONS });
444
+ fs.mkdirpSync(homeDirKeysDirPath, { mode: hdbTerms.HDB_FILE_PERMISSIONS });
445
+ } catch {
446
+ console.error(
447
+ `Could not make settings directory ${hdbTerms.HDB_HOME_DIR_NAME} in home directory. Please check your permissions and try again.`
448
+ );
449
+ }
450
+
451
+ try {
452
+ await fs.writeFile(propsFilePath, bootPropsValue);
453
+ } catch (err) {
454
+ hdbLogger.error(`There was an error creating the boot file at path: ${propsFilePath}`);
455
+ throw err;
456
+ }
457
+ }
458
+
459
+ envManager.setProperty(hdbTerms.HDB_SETTINGS_NAMES.INSTALL_USER, `${install_user}`);
460
+ envManager.setProperty(hdbTerms.HDB_SETTINGS_NAMES.SETTINGS_PATH_KEY, configFilePath);
461
+ envManager.setProperty(envManager.BOOT_PROPS_FILE_PATH, propsFilePath);
462
+ }
463
+ }
464
+
465
+ /**
466
+ * Calls the util function that creates the Harper config file.
467
+ * If an error occurs during the create install is rolled backed.
468
+ * @param installParams
469
+ * @returns {Promise<void>}
470
+ */
471
+ async function createConfigFile(installParams) {
472
+ hdbLogger.trace('Creating Harper config file');
473
+ const args = assignCMDENVVariables(Object.keys(hdbTerms.CONFIG_PARAM_MAP), true);
474
+ Object.assign(args, installParams);
475
+
476
+ // If installing in dev mode set dev config defaults
477
+ if (installParams[hdbTerms.INSTALL_PROMPTS.DEFAULTS_MODE] === 'dev') {
478
+ process.env.DEV_MODE = 'true';
479
+ for (const cfg in DEV_MODE_CONFIG) {
480
+ // Before setting http.port check that secure port is not being passed
481
+ if (cfg === CONFIG_PARAMS.HTTP_PORT && args[CONFIG_PARAMS.HTTP_SECUREPORT.toLowerCase()] === undefined) {
482
+ args[cfg] = args[cfg.toLowerCase()] ?? DEV_MODE_CONFIG[cfg];
483
+ // set secure port to null to override default
484
+ args[CONFIG_PARAMS.HTTP_SECUREPORT] = null;
485
+ continue;
486
+ } else if (cfg === CONFIG_PARAMS.HTTP_PORT) {
487
+ continue;
488
+ }
489
+
490
+ // Before setting ops API port check that secure port is not being passed
491
+ if (
492
+ cfg === CONFIG_PARAMS.OPERATIONSAPI_NETWORK_PORT &&
493
+ args[CONFIG_PARAMS.OPERATIONSAPI_NETWORK_SECUREPORT.toLowerCase()] === undefined
494
+ ) {
495
+ args[cfg] = args[cfg.toLowerCase()] ?? DEV_MODE_CONFIG[cfg];
496
+ // set secure port to null to override default
497
+ args[CONFIG_PARAMS.OPERATIONSAPI_NETWORK_SECUREPORT] = null;
498
+ continue;
499
+ } else if (cfg === CONFIG_PARAMS.OPERATIONSAPI_NETWORK_PORT) {
500
+ continue;
501
+ }
502
+
503
+ if (args[cfg.toLowerCase()] === undefined) args[cfg] = DEV_MODE_CONFIG[cfg];
504
+ }
505
+ } else {
506
+ if (args[CONFIG_PARAMS.OPERATIONSAPI_NETWORK_PORT.toLowerCase()])
507
+ args[CONFIG_PARAMS.OPERATIONSAPI_NETWORK_SECUREPORT] = null;
508
+ if (args[CONFIG_PARAMS.HTTP_PORT.toLowerCase()]) args[CONFIG_PARAMS.HTTP_SECUREPORT] = null;
509
+ }
510
+
511
+ try {
512
+ if (!cfgEnv[hdbTerms.INSTALL_PROMPTS.HDB_CONFIG]) {
513
+ // Create the Harper config file.
514
+ configUtils.createConfigFile(args);
515
+ }
516
+
517
+ envManager.initSync();
518
+ } catch (configErr) {
519
+ rollbackInstall(configErr);
520
+ }
521
+ }
522
+
523
+ /**
524
+ * Used to remove the .harperdb and hdb folder if there is an error with creating the config file.
525
+ * @param errMsg
526
+ */
527
+ function rollbackInstall(errMsg) {
528
+ hdbLogger.error(`Error creating Harper config file. Rolling back install - ${errMsg}`);
529
+ console.error(errMsg);
530
+ console.error(ABORT_MSG);
531
+
532
+ // Remove boot file folder.
533
+ const harperdbBootFolder = path.resolve(envManager.get(envManager.BOOT_PROPS_FILE_PATH), '../');
534
+ if (harperdbBootFolder) {
535
+ fs.removeSync(harperdbBootFolder);
536
+ }
537
+
538
+ // Remove HDB.
539
+ if (hdbRoot) {
540
+ // We do a conditional rollback if installing from config file that exists in the hdb rootpath
541
+ if (conditionalRollback) {
542
+ const dir = fs.readdirSync(hdbRoot, { withFileTypes: true });
543
+ dir.forEach((d) => {
544
+ const fullPath = path.join(d.path, d.name);
545
+ if (fullPath !== cfgEnv[hdbTerms.INSTALL_PROMPTS.HDB_CONFIG]) {
546
+ fs.removeSync(fullPath);
547
+ }
548
+ });
549
+ } else {
550
+ fs.removeSync(hdbRoot);
551
+ }
552
+ }
553
+
554
+ process.exit(1);
555
+ }
556
+
557
+ /**
558
+ * Creates a Harper role and then adds a use to that role.
559
+ * @param role
560
+ * @param adminUser
561
+ * @returns {Promise<void>}
562
+ */
563
+ async function createAdminUser(role, adminUser) {
564
+ hdbLogger.trace('Creating admin user');
565
+
566
+ await pSchemaToGlobal();
567
+ let roleResponse;
568
+ try {
569
+ roleResponse = await roleOps.addRole(role);
570
+ } catch (err) {
571
+ // This is here to allow installs overtop of existing user/roles tables
572
+ if (err.message.includes('already exists')) {
573
+ adminUser = undefined;
574
+ } else {
575
+ err.message += 'Error creating role';
576
+ throw err;
577
+ }
578
+ }
579
+
580
+ if (adminUser) {
581
+ try {
582
+ adminUser.role = roleResponse.role;
583
+ await userOps.addUser(adminUser);
584
+ } catch (err) {
585
+ err.message = `Error creating user - ${err}`;
586
+ throw err;
587
+ }
588
+ }
589
+ }
590
+
591
+ /**
592
+ * Create HDB admin user with input from user.
593
+ * @param installParams
594
+ * @returns {Promise<void>}
595
+ */
596
+ async function createSuperUser(installParams) {
597
+ hdbLogger.trace('Creating Super user.');
598
+ const role = {
599
+ role: 'super_user',
600
+ permission: {
601
+ super_user: true,
602
+ },
603
+ };
604
+
605
+ const user = {
606
+ username: installParams[hdbTerms.INSTALL_PROMPTS.HDB_ADMIN_USERNAME].toString(),
607
+ password: installParams[hdbTerms.INSTALL_PROMPTS.HDB_ADMIN_PASSWORD].toString(),
608
+ active: true,
609
+ };
610
+
611
+ await createAdminUser(role, user);
612
+ delete installParams[hdbTerms.INSTALL_PROMPTS.HDB_ADMIN_USERNAME];
613
+ delete installParams[hdbTerms.INSTALL_PROMPTS.HDB_ADMIN_PASSWORD];
614
+ }
615
+
616
+ /**
617
+ * Makes a call to insert the hdbInfo table with the newly installed version,
618
+ * @returns {Promise<void>}
619
+ */
620
+ async function insertHdbVersionInfo() {
621
+ const vers = packageJson.version;
622
+ if (vers) {
623
+ await hdbInfoController.insertHdbInstallInfo(vers);
624
+ } else {
625
+ throw new Error('The version is missing/removed from Harper package.json');
626
+ }
627
+ }
628
+
629
+ function updateConfigEnv(value) {
630
+ cfgEnv[hdbTerms.INSTALL_PROMPTS.HDB_CONFIG] = value;
631
+ }
632
+
633
+ function setIgnoreExisting(value) {
634
+ ignoreExisting = value;
635
+ }
@@ -0,0 +1,30 @@
1
+ import type { Logger } from '../components/Logger.ts';
2
+ import * as terms from './hdbTerms.js';
3
+ import fs from 'node:fs';
4
+ import { noBootFile, getPropsFilePath } from './common_utils.js';
5
+
6
+ interface Env {
7
+ get(key: string): string;
8
+ }
9
+
10
+ /** isHdbInstalled checks for a valid installation of Harper based on the env
11
+ * arg's settings path and any boot props file it can find and returns true
12
+ * if an installation is found; false otherwise.
13
+ */
14
+ export function isHdbInstalled(env: Env, logger: Pick<Logger, 'error'>) {
15
+ try {
16
+ fs.statSync(getPropsFilePath());
17
+ fs.statSync(env.get(terms.HDB_SETTINGS_NAMES.SETTINGS_PATH_KEY));
18
+ } catch (err) {
19
+ if (noBootFile()) return true;
20
+ if (err.code === 'ENOENT') {
21
+ // either boot props or settings file not found, hdb not installed
22
+ return false;
23
+ }
24
+
25
+ logger.error(`Error checking for HDB install - ${err}`);
26
+ throw err;
27
+ }
28
+
29
+ return true;
30
+ }
@@ -0,0 +1,20 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * used to define specific attributes of a dbi.
5
+ * dupSort for allowing duplicate keys, or not
6
+ * intKey defines if the key entries are integers or not
7
+ */
8
+ class DBIDefinition {
9
+ /**
10
+ * @param {Boolean} dupSort - allow duplicate keys, or not
11
+ * @param {Boolean} isPrimaryKey - defines if this is the primary key
12
+ */
13
+ constructor(dupSort = false, isPrimaryKey = false) {
14
+ this.dup_sort = dupSort;
15
+ this.isPrimaryKey = isPrimaryKey;
16
+ this.useVersions = isPrimaryKey;
17
+ }
18
+ }
19
+
20
+ module.exports = DBIDefinition;