@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
package/bin/restart.js ADDED
@@ -0,0 +1,201 @@
1
+ 'use strict';
2
+
3
+ const minimist = require('minimist');
4
+ const { isMainThread, parentPort } = require('worker_threads');
5
+ const hdbTerms = require('../utility/hdbTerms.ts');
6
+ const hdbLogger = require('../utility/logging/harper_logger.js');
7
+ const processMan = require('../utility/processManagement/processManagement.js');
8
+ const { compactOnStart } = require('./copyDb.ts');
9
+ const { restartWorkers, onMessageByType, shutdownWorkersNow } = require('../server/threads/manageThreads.js');
10
+ const { handleHDBError, hdbErrors } = require('../utility/errors/hdbError.js');
11
+ const { HTTP_STATUS_CODES } = hdbErrors;
12
+ const envMgr = require('../utility/environment/environmentManager.js');
13
+ const path = require('node:path');
14
+ const { unlinkSync } = require('node:fs');
15
+ envMgr.initSync();
16
+
17
+ const RESTART_RESPONSE = `Restarting Harper. This may take up to ${hdbTerms.RESTART_TIMEOUT_MS / 1000} seconds.`;
18
+ const INVALID_SERVICE_ERR = 'Invalid service';
19
+
20
+ let calledFromCli;
21
+
22
+ module.exports = {
23
+ restart,
24
+ restartService,
25
+ };
26
+
27
+ // Add ITC event listener to main thread which will be called from child that receives restart request.
28
+ if (isMainThread) {
29
+ onMessageByType(hdbTerms.ITC_EVENT_TYPES.RESTART, async (message, port) => {
30
+ if (message.workerType) await restartService({ service: message.workerType });
31
+ else restart({ operation: 'restart' });
32
+ port.postMessage({ type: 'restart-complete' });
33
+ });
34
+ }
35
+
36
+ /**
37
+ * Restart Harper.
38
+ * It will restart all the child threads and the hub and leaf server processes.
39
+ * @param req
40
+ * @returns {Promise<string>}
41
+ */
42
+ async function restart(req) {
43
+ calledFromCli = Object.keys(req).length === 0;
44
+
45
+ const cliArgs = minimist(process.argv);
46
+ if (cliArgs.service) {
47
+ await restartService(cliArgs);
48
+ return;
49
+ }
50
+
51
+ if (calledFromCli) {
52
+ const hdbPid = processMan.getHdbPid();
53
+ console.error(hdbPid ? 'Restarting Harper...' : 'Starting Harper...');
54
+ require('./run.js').launch(true);
55
+ return RESTART_RESPONSE;
56
+ }
57
+
58
+ if (isMainThread) {
59
+ hdbLogger.notify(RESTART_RESPONSE);
60
+
61
+ if (envMgr.get(hdbTerms.CONFIG_PARAMS.STORAGE_COMPACTONSTART)) await compactOnStart();
62
+
63
+ if (process.env.HARPER_EXIT_ON_RESTART) {
64
+ // use this to exit the process so that it will be restarted by the
65
+ // PM/container/orchestrator.
66
+ hdbLogger.warn('Exiting Harper process to trigger a container restart');
67
+ process.exit(0);
68
+ }
69
+ setTimeout(async () => {
70
+ // It seems like you should just be able to start the other process and kill this process and everything should
71
+ // be cleaned up, however that doesn't work for some reason; the socket listening fds somehow get transferred to the
72
+ // child process if they are not explicitly closed. And when transferred they are orphaned listening, accepting
73
+ // connections and hanging. So we need to explicitly close down all the workers and then start the new process
74
+ // and shut down.
75
+ hdbLogger.debug('Shutdown workers');
76
+ await shutdownWorkersNow();
77
+ await processMan.cleanupChildrenProcesses(false);
78
+ // remove pid file so it doesn't trip up the launch
79
+ await unlinkSync(path.join(envMgr.get(hdbTerms.CONFIG_PARAMS.ROOTPATH), hdbTerms.HDB_PID_FILE), `${process.pid}`);
80
+ hdbLogger.debug('Starting new process...');
81
+ // now launch the new process and exit this process
82
+ require('./run.js').launch(true);
83
+ }, 50); // can't await this because it is going to do an exit()
84
+ } else {
85
+ // Post msg to main parent thread requesting it restart (so the main thread can process.exit())
86
+ parentPort.postMessage({
87
+ type: hdbTerms.ITC_EVENT_TYPES.RESTART,
88
+ });
89
+ }
90
+
91
+ return RESTART_RESPONSE;
92
+ }
93
+
94
+ /**
95
+ * Used to restart a particular service, services includes - httpWorkers
96
+ * @param req
97
+ * @returns {Promise<string>}
98
+ */
99
+ async function restartService(req) {
100
+ let { service } = req;
101
+ if (hdbTerms.HDB_PROCESS_SERVICES[service] === undefined) {
102
+ throw handleHDBError(new Error(), INVALID_SERVICE_ERR, HTTP_STATUS_CODES.BAD_REQUEST, undefined, undefined, true);
103
+ }
104
+ processMan.expectedRestartOfChildren();
105
+ if (!isMainThread) {
106
+ if (req.replicated) {
107
+ server.replication.monitorNodeCAs(); // get all the CAs from the nodes we know about
108
+ }
109
+ parentPort.postMessage({
110
+ type: hdbTerms.ITC_EVENT_TYPES.RESTART,
111
+ workerType: service,
112
+ });
113
+ parentPort.ref(); // don't let the parent thread exit until we're done
114
+ await new Promise((resolve) => {
115
+ parentPort.on('message', (msg) => {
116
+ if (msg.type === 'restart-complete') {
117
+ resolve();
118
+ parentPort.unref();
119
+ }
120
+ });
121
+ });
122
+ let replicatedResponses;
123
+ if (req.replicated) {
124
+ req.replicated = false; // don't send a replicated flag to the nodes we are sending to
125
+ replicatedResponses = [];
126
+ for (let node of server.nodes) {
127
+ if (node.name === server.replication.getThisNodeName()) continue;
128
+ // for now, only one at a time
129
+ let job_id;
130
+ try {
131
+ ({ job_id } = await server.replication.sendOperationToNode(node, req));
132
+ } catch (err) {
133
+ // If request to node fails, add the error to the response and continue to the next node
134
+ replicatedResponses.push({ node: node.name, message: err.message });
135
+ continue;
136
+ }
137
+ // wait for the job to finish by polling for the completion of the job
138
+ replicatedResponses.push(
139
+ await new Promise((resolve, reject) => {
140
+ const RETRY_INTERVAL = 250;
141
+ let retriesLeft = 2400; // 10 minutes
142
+ let interval = setInterval(async () => {
143
+ if (retriesLeft-- <= 0) {
144
+ clearInterval(interval);
145
+ let error = new Error('Timed out waiting for restart job to complete');
146
+ error.replicated = replicatedResponses; // report the finished restarts
147
+ reject(error);
148
+ }
149
+ let response = await server.replication.sendOperationToNode(node, {
150
+ operation: 'get_job',
151
+ id: job_id,
152
+ });
153
+ const jobResult = response.results[0];
154
+ if (jobResult.status === 'COMPLETE') {
155
+ clearInterval(interval);
156
+ resolve({ node: node.name, message: jobResult.message });
157
+ }
158
+ if (jobResult.status === 'ERROR') {
159
+ clearInterval(interval);
160
+ let error = new Error(jobResult.message);
161
+ error.replicated = replicatedResponses; // report the finished restarts
162
+ reject(error);
163
+ }
164
+ }, RETRY_INTERVAL);
165
+ })
166
+ );
167
+ }
168
+ return { replicated: replicatedResponses };
169
+ }
170
+ return;
171
+ }
172
+
173
+ let errMsg;
174
+ switch (service) {
175
+ case 'custom_functions':
176
+ case 'custom functions':
177
+ case hdbTerms.HDB_PROCESS_SERVICES.harperdb:
178
+ case hdbTerms.HDB_PROCESS_SERVICES.http_workers:
179
+ case hdbTerms.HDB_PROCESS_SERVICES.http:
180
+ if (calledFromCli) console.log(`Restarting httpWorkers`);
181
+ hdbLogger.notify('Restarting http_workers');
182
+
183
+ if (calledFromCli) {
184
+ await processMan.restart(hdbTerms.PROCESS_DESCRIPTORS.HDB);
185
+ } else {
186
+ await restartWorkers('http');
187
+ }
188
+ break;
189
+ default:
190
+ errMsg = `Unrecognized service: ${service}`;
191
+ break;
192
+ }
193
+
194
+ if (errMsg) {
195
+ hdbLogger.error(errMsg);
196
+ if (calledFromCli) console.error(errMsg);
197
+ return errMsg;
198
+ }
199
+ if (service === 'custom_functions') service = 'Custom Functions';
200
+ return `Restarting ${service}`;
201
+ }
package/bin/run.js ADDED
@@ -0,0 +1,409 @@
1
+ 'use strict';
2
+
3
+ const env = require('../utility/environment/environmentManager.js');
4
+ env.initSync();
5
+
6
+ // This unused restart require is here so that main thread loads ITC event listener defined in restart file. Do not remove.
7
+ require('./restart.js');
8
+ const terms = require('../utility/hdbTerms.ts');
9
+ const { CONFIG_PARAMS } = terms;
10
+ const hdbLogger = require('../utility/logging/harper_logger.js');
11
+ const fs = require('fs-extra');
12
+ const path = require('path');
13
+ const checkJwtTokens = require('../utility/install/checkJWTTokensExist.js');
14
+ const { install } = require('../utility/install/installer.js');
15
+ const chalk = require('chalk');
16
+ const { packageJson } = require('../utility/packageUtils.js');
17
+ const hdbUtils = require('../utility/common_utils.js');
18
+ const installation = require('../utility/installation.ts');
19
+ const configUtils = require('../config/configUtils.js');
20
+ const assignCMDENVVariables = require('../utility/assignCmdEnvVariables.js');
21
+ const upgrade = require('./upgrade.js');
22
+ const { compactOnStart } = require('./copyDb.ts');
23
+ const minimist = require('minimist');
24
+ const keys = require('../security/keys.js');
25
+ const { startHTTPThreads } = require('../server/threads/socketRouter.ts');
26
+ const hdbInfoController = require('../dataLayer/hdbInfoController.js');
27
+ const hdbTerms = require('../utility/hdbTerms.ts');
28
+ const { getHdbPid, isProcessRunning } = require('../utility/processManagement/processManagement.js');
29
+ const { PACKAGE_ROOT } = require('../utility/packageUtils');
30
+
31
+ let pmUtils;
32
+ let cmdArgs;
33
+ let skipExitListeners = false;
34
+
35
+ const UPGRADE_COMPLETE_MSG = 'Upgrade complete. Starting Harper.';
36
+ const UPGRADE_ERR = 'Got an error while trying to upgrade your Harper instance. Exiting Harper.';
37
+ const HDB_NOT_FOUND_MSG = 'Harper not found, starting install process.';
38
+ const INSTALL_ERR = 'There was an error during install, check install_log.log for more details. Exiting.';
39
+ const HDB_STARTED = 'Harper successfully started.';
40
+
41
+ function addUnhandleRejectionListener() {
42
+ process.on('unhandledRejection', (reason, promise) => {
43
+ hdbLogger.error('Unhandled promise rejection: Promise', promise, 'reason:', reason);
44
+ });
45
+ }
46
+
47
+ function addExitListeners() {
48
+ if (!skipExitListeners) {
49
+ const removeHdbPid = () => {
50
+ fs.removeSync(path.join(env.get(terms.CONFIG_PARAMS.ROOTPATH), terms.HDB_PID_FILE));
51
+ process.exit(0);
52
+ };
53
+ process.on('exit', () => {
54
+ removeHdbPid();
55
+ });
56
+ process.on('SIGINT', () => {
57
+ removeHdbPid();
58
+ });
59
+ process.on('SIGQUIT', () => {
60
+ removeHdbPid();
61
+ });
62
+ process.on('SIGTERM', () => {
63
+ removeHdbPid();
64
+ });
65
+ }
66
+ }
67
+
68
+ /**
69
+ * Do the initial checks and potential upgrades/installation
70
+ * @param calledByInstall
71
+ * @param calledByMain
72
+ * @returns {Promise<void>}
73
+ */
74
+ async function initialize(calledByInstall = false, calledByMain = false) {
75
+ // Check to see if HDB is installed, if it isn't we call install.
76
+ console.log(chalk.magenta('Starting Harper...'));
77
+
78
+ addUnhandleRejectionListener();
79
+
80
+ hdbLogger.suppressLogging?.(() => {
81
+ console.log(chalk.magenta('' + fs.readFileSync(path.join(PACKAGE_ROOT, 'static/ascii_logo.txt'))));
82
+ });
83
+ hdbLogger.debug('Checking to make sure hdb is installed');
84
+ if (installation.isHdbInstalled(env, hdbLogger) === false) {
85
+ console.log(HDB_NOT_FOUND_MSG);
86
+ try {
87
+ await install();
88
+ } catch (err) {
89
+ console.error(INSTALL_ERR, err);
90
+ hdbLogger.error(err);
91
+ process.exit(1);
92
+ }
93
+ }
94
+
95
+ // The called by install check is here because if cmd/env args are passed to install (which calls run when done)
96
+ // we do not need to update/backup the config file on run.
97
+ if (!calledByInstall) {
98
+ // If run is called with cmd/env vars we create a backup of config and update config file.
99
+ let parsedArgs = assignCMDENVVariables(Object.keys(terms.CONFIG_PARAM_MAP), true);
100
+
101
+ // If HARPER_SET_CONFIG is present, filter out any config keys that are set in it
102
+ // to prevent individual env vars from overriding explicit runtime configuration
103
+ const { filterArgsAgainstRuntimeConfig } = require('../config/harperConfigEnvVars.ts');
104
+ parsedArgs = filterArgsAgainstRuntimeConfig(parsedArgs);
105
+
106
+ if (!hdbUtils.isEmpty(parsedArgs) && !hdbUtils.isEmptyOrZeroLength(Object.keys(parsedArgs))) {
107
+ configUtils.updateConfigValue(undefined, undefined, parsedArgs, true, true);
108
+ }
109
+ }
110
+
111
+ // if this process is Harper restarting, the parent could still be compacting RocksDB on exit,
112
+ // so we need to wait for the parent to exit
113
+ if (process.env.HARPER_PARENT_PROCESS_PID) {
114
+ const prevProcessPid = parseInt(process.env.HARPER_PARENT_PROCESS_PID);
115
+ delete process.env.HARPER_PARENT_PROCESS_PID;
116
+ if (isProcessRunning(prevProcessPid)) {
117
+ hdbLogger.info(`Previous process ${prevProcessPid} is still running, waiting up to 15 seconds...`);
118
+ // check if the previous process is still running, and if so, wait up to 15 seconds before timing out
119
+ const timeout = setTimeout(() => {
120
+ console.error(`Previous process ${prevProcessPid} is still running, exiting.`);
121
+ process.exit(1);
122
+ }, 15000);
123
+ while (isProcessRunning(prevProcessPid)) {
124
+ await new Promise((resolve) => setTimeout(resolve, 100));
125
+ }
126
+ hdbLogger.info(`Previous process ${prevProcessPid} has exited`);
127
+ clearTimeout(timeout);
128
+ }
129
+ }
130
+
131
+ // Check to see if Harper is already running by checking for a pid file
132
+ // If found confirm it matches a currently running processes
133
+ let hdbPid = getHdbPid();
134
+ if (hdbPid) {
135
+ hdbLogger.debug('Error: Harper is already running');
136
+ console.error(`Error: Harper is already running (pid: ${hdbPid})`);
137
+ process.exit(4);
138
+ }
139
+
140
+ addExitListeners();
141
+
142
+ if (calledByMain) {
143
+ // Write Harper PID to file for tracking purposes
144
+ await fs.writeFile(path.join(env.get(hdbTerms.CONFIG_PARAMS.ROOTPATH), hdbTerms.HDB_PID_FILE), `${process.pid}`);
145
+ }
146
+ hdbLogger.info('Harper PID', process.pid);
147
+
148
+ // Check to see if an upgrade is needed based on existing hdbInfo data. If so, we need to force the user to upgrade
149
+ // before the server can be started.
150
+ let upgradeVers;
151
+ try {
152
+ const updateObj = await hdbInfoController.getVersionUpdateInfo();
153
+ if (updateObj !== undefined) {
154
+ upgradeVers = updateObj[terms.UPGRADE_JSON_FIELD_NAMES_ENUM.UPGRADE_VERSION];
155
+ await upgrade.upgrade(updateObj);
156
+ console.log(UPGRADE_COMPLETE_MSG);
157
+ }
158
+ } catch (err) {
159
+ if (upgradeVers) {
160
+ console.error(
161
+ `Got an error while trying to upgrade your Harper instance to version ${upgradeVers}. Exiting Harper.`,
162
+ err
163
+ );
164
+ hdbLogger.error(err);
165
+ } else {
166
+ console.error(UPGRADE_ERR, err);
167
+ hdbLogger.error(err);
168
+ }
169
+ process.exit(1);
170
+ }
171
+
172
+ checkJwtTokens();
173
+
174
+ await keys.reviewSelfSignedCert();
175
+ }
176
+ /**
177
+ * Starts Harper DB threads
178
+ * If the hdbBootProps file is not found, it is assumed an install needs to be performed.
179
+ * @param calledByInstall - If run is called by install we want to ignore any
180
+ * cmd/env args as they would have already been written to config on install.
181
+ * @returns {Promise<void>}
182
+ */
183
+ async function main(calledByInstall = false) {
184
+ try {
185
+ cmdArgs = minimist(process.argv);
186
+ if (cmdArgs.ROOTPATH) {
187
+ let harperConfigPath = path.join(cmdArgs.ROOTPATH, hdbTerms.HARPER_CONFIG_FILE);
188
+ if (!fs.existsSync(harperConfigPath) && fs.existsSync(path.join(cmdArgs.ROOTPATH, hdbTerms.HARPER_CONFIG_FILE)))
189
+ harperConfigPath = path.join(cmdArgs.ROOTPATH, hdbTerms.HDB_CONFIG_FILE);
190
+ configUtils.updateConfigObject('settings_path', harperConfigPath);
191
+ }
192
+ await initialize(calledByInstall, true);
193
+
194
+ if (env.get(terms.CONFIG_PARAMS.STORAGE_COMPACTONSTART)) await compactOnStart();
195
+
196
+ const isScripted = process.env.IS_SCRIPTED_SERVICE && !cmdArgs.service;
197
+
198
+ await startHTTPThreads(
199
+ process.env.DEV_MODE
200
+ ? 1
201
+ : (env.get(hdbTerms.CONFIG_PARAMS.THREADS_COUNT) ?? env.get(hdbTerms.CONFIG_PARAMS.THREADS))
202
+ );
203
+
204
+ if (!isScripted) started();
205
+ } catch (err) {
206
+ console.error(err);
207
+ hdbLogger.error(err);
208
+ process.exit(1);
209
+ }
210
+ }
211
+ function started() {
212
+ // Console log Harper dog logo
213
+ hdbLogger.suppressLogging(() => {
214
+ console.log(chalk.magenta(`Harper ${packageJson.version} successfully started`));
215
+ });
216
+ hdbLogger.notify(HDB_STARTED);
217
+ }
218
+ /**
219
+ * Launches a separate process for Harper and then exits. This is an unusual practice and is anathema
220
+ * to the way processes are typically handled, both in terminal and for services (systemd), but this functionality
221
+ * is retained for legacy purposes.
222
+ * @returns {Promise<void>} // ha ha, it doesn't!
223
+ */
224
+ async function launch(exit = true) {
225
+ skipExitListeners = !exit;
226
+ try {
227
+ if (pmUtils === undefined) pmUtils = require('../utility/processManagement/processManagement.js');
228
+ hdbLogger.debug('initializing processManagement...');
229
+ await initialize();
230
+ hdbLogger.debug('Starting new main process');
231
+
232
+ await pmUtils.startService(terms.PROCESS_DESCRIPTORS.HDB, true);
233
+ started();
234
+ if (exit) process.exit(0);
235
+ } catch (err) {
236
+ console.error(err);
237
+ hdbLogger.error(err);
238
+ process.exit(1);
239
+ }
240
+ }
241
+
242
+ exports.launch = launch;
243
+ exports.main = main;
244
+ exports.startupLog = startupLog;
245
+
246
+ /**
247
+ * Logs running services and relevant ports/information.
248
+ * Called by worker thread 1 once all servers have started
249
+ * @param portResolutions
250
+ */
251
+ function startupLog(portResolutions) {
252
+ // Adds padding to a string
253
+ const padding = 20;
254
+ const pad = (param) => param.padEnd(padding);
255
+ let logMsg = '\n';
256
+
257
+ logMsg += `${pad('Hostname:')}${env.get(CONFIG_PARAMS.NODE_HOSTNAME)}\n`;
258
+
259
+ logMsg += `${pad('Worker Threads:')}${env.get(CONFIG_PARAMS.THREADS_COUNT)}\n`;
260
+
261
+ logMsg += `${pad('Root Path:')}${env.get(CONFIG_PARAMS.ROOTPATH)}\n`;
262
+
263
+ if (env.get(CONFIG_PARAMS.THREADS_DEBUG) !== false) {
264
+ logMsg += `${pad('Debugging:')}enabled: true`;
265
+ logMsg += env.get(CONFIG_PARAMS.THREADS_DEBUG_PORT)
266
+ ? `, TCP: ${env.get(CONFIG_PARAMS.THREADS_DEBUG_PORT)}\n`
267
+ : '\n';
268
+ }
269
+ const logFilePath = path.join(env.get(CONFIG_PARAMS.LOGGING_ROOT), 'hdb.log');
270
+ logMsg += `${pad('Logging:')}level: ${env.get(CONFIG_PARAMS.LOGGING_LEVEL)}, location: ${
271
+ logFilePath + (env.get(CONFIG_PARAMS.LOGGING_STDSTREAMS) ? ', stdout/err' : '')
272
+ }\n`;
273
+
274
+ // Database Log aka Applications API aka http (in config)
275
+ logMsg += pad('Default:');
276
+ logMsg += env.get(CONFIG_PARAMS.HTTP_PORT) ? `HTTP (and WS): ${env.get(CONFIG_PARAMS.HTTP_PORT)}, ` : '';
277
+ logMsg += env.get(CONFIG_PARAMS.HTTP_SECUREPORT) ? `HTTPS (and WS): ${env.get(CONFIG_PARAMS.HTTP_SECUREPORT)}, ` : '';
278
+ logMsg += `CORS: ${
279
+ env.get(CONFIG_PARAMS.HTTP_CORS) ? `enabled for ${env.get(CONFIG_PARAMS.HTTP_CORSACCESSLIST)}` : 'disabled'
280
+ }\n`;
281
+
282
+ // Operations API Log
283
+ logMsg += pad('Operations API:');
284
+ logMsg += env.get(CONFIG_PARAMS.OPERATIONSAPI_NETWORK_PORT)
285
+ ? `HTTP: ${env.get(CONFIG_PARAMS.OPERATIONSAPI_NETWORK_PORT)}, `
286
+ : '';
287
+ logMsg += env.get(CONFIG_PARAMS.OPERATIONSAPI_NETWORK_SECUREPORT)
288
+ ? `HTTPS: ${env.get(CONFIG_PARAMS.OPERATIONSAPI_NETWORK_SECUREPORT)}, `
289
+ : '';
290
+ logMsg += `CORS: ${
291
+ env.get(CONFIG_PARAMS.OPERATIONSAPI_NETWORK_CORS)
292
+ ? `enabled for ${env.get(CONFIG_PARAMS.OPERATIONSAPI_NETWORK_CORSACCESSLIST)}`
293
+ : 'disabled'
294
+ }`;
295
+ logMsg += `, unix socket: ${env.get(CONFIG_PARAMS.OPERATIONSAPI_NETWORK_DOMAINSOCKET)}\n`;
296
+ if (env.get(CONFIG_PARAMS.OPERATIONSAPI_NETWORK_PORT)) {
297
+ logMsg +=
298
+ pad('') +
299
+ 'http://' +
300
+ env.get(CONFIG_PARAMS.NODE_HOSTNAME) +
301
+ ':' +
302
+ env.get(CONFIG_PARAMS.OPERATIONSAPI_NETWORK_PORT) +
303
+ '/\n';
304
+ }
305
+ if (env.get(CONFIG_PARAMS.OPERATIONSAPI_NETWORK_SECUREPORT)) {
306
+ logMsg +=
307
+ '\n' +
308
+ pad('') +
309
+ 'https://' +
310
+ env.get(CONFIG_PARAMS.NODE_HOSTNAME) +
311
+ ':' +
312
+ env.get(CONFIG_PARAMS.OPERATIONSAPI_NETWORK_SECUREPORT) +
313
+ '/\n';
314
+ }
315
+
316
+ // MQTT Log
317
+ logMsg += pad('MQTT:');
318
+ logMsg += env.get(CONFIG_PARAMS.MQTT_NETWORK_PORT) ? `TCP: ${env.get(CONFIG_PARAMS.MQTT_NETWORK_PORT)}, ` : '';
319
+ logMsg += env.get(CONFIG_PARAMS.MQTT_NETWORK_SECUREPORT)
320
+ ? `TLS: ${env.get(CONFIG_PARAMS.MQTT_NETWORK_SECUREPORT)}`
321
+ : '';
322
+ logMsg +=
323
+ env.get(CONFIG_PARAMS.MQTT_WEBSOCKET) && env.get(CONFIG_PARAMS.HTTP_PORT)
324
+ ? `, WS: ${env.get(CONFIG_PARAMS.HTTP_PORT)}`
325
+ : '';
326
+ logMsg +=
327
+ env.get(CONFIG_PARAMS.MQTT_WEBSOCKET) && env.get(CONFIG_PARAMS.HTTP_SECUREPORT)
328
+ ? `, WSS: ${env.get(CONFIG_PARAMS.HTTP_SECUREPORT)}\n`
329
+ : '\n';
330
+
331
+ if (env.get(CONFIG_PARAMS.REPLICATION_URL)) {
332
+ let repLog = `${pad('Replication:')}\n`;
333
+
334
+ repLog += `${pad('Replication Url:')}${env.get(CONFIG_PARAMS.REPLICATION_URL)}\n`;
335
+ // Replication log
336
+ const replicationPort =
337
+ env.get(CONFIG_PARAMS.REPLICATION_PORT) ?? env.get(CONFIG_PARAMS.OPERATIONSAPI_NETWORK_PORT);
338
+ const replicationSecurePort =
339
+ env.get(CONFIG_PARAMS.REPLICATION_SECUREPORT) ?? env.get(CONFIG_PARAMS.OPERATIONSAPI_NETWORK_SECUREPORT);
340
+
341
+ repLog += replicationPort ? `WS: ${replicationPort}, ` : '';
342
+ repLog += replicationSecurePort ? `WSS: ${replicationSecurePort} ` : '';
343
+ logMsg += `${repLog.slice(0, -2)}\n`;
344
+ }
345
+
346
+ // Extract all non-default components from the config file
347
+ let components = [];
348
+ const configObj = configUtils.getConfigObj();
349
+ for (const cfg in configObj) {
350
+ if (configObj[cfg].package) components.push(cfg);
351
+ }
352
+
353
+ // portResolutions is a Map of port to protocol name and component name built in threadServer.js
354
+ // we iterate through the map to build a log for REST and for any components that are using custom ports
355
+ let comps = {};
356
+ let restHostnames = [];
357
+ let restLog = `${pad('REST:')}`;
358
+ for (const [key, values] of portResolutions) {
359
+ for (const value of values) {
360
+ const name = value.name;
361
+ const pair = `${value.protocol_name}: ${key}, `;
362
+ if (!restLog.includes(pair) && name === 'rest') {
363
+ restLog += pair;
364
+ if (value.protocol_name === 'HTTP' || value.protocol_name === 'HTTPS') {
365
+ restHostnames.push(`${value.protocol_name.toLowerCase()}://${env.get(CONFIG_PARAMS.NODE_HOSTNAME)}:${key}/`);
366
+ }
367
+ }
368
+
369
+ if (components.includes(name)) {
370
+ if (comps[name]) {
371
+ comps[name] += pair;
372
+ } else {
373
+ comps[name] = pair;
374
+ }
375
+ }
376
+ }
377
+ }
378
+
379
+ // Remove the trailing comma and space
380
+ if (restLog.length > padding + 1) {
381
+ restLog = restLog.slice(0, -2);
382
+ logMsg += `${restLog}\n`;
383
+ for (const restHostname of restHostnames) {
384
+ logMsg += pad('') + restHostname + '\n';
385
+ }
386
+ }
387
+
388
+ let appPortsLog = env.get(CONFIG_PARAMS.HTTP_PORT) ? `HTTP: ${env.get(CONFIG_PARAMS.HTTP_PORT)}, ` : '';
389
+ appPortsLog += env.get(CONFIG_PARAMS.HTTP_SECUREPORT) ? `HTTPS: ${env.get(CONFIG_PARAMS.HTTP_SECUREPORT)}, ` : '';
390
+ if (appPortsLog.length > padding + 1) appPortsLog = appPortsLog.slice(0, -2);
391
+
392
+ // Build logs for all components
393
+ for (const c of components) {
394
+ if (comps[c]) {
395
+ logMsg += `${pad(c + ': ')}${comps[c].slice(0, -2)}\n`;
396
+ } else {
397
+ logMsg += `${pad(c + ': ')}${appPortsLog}\n`;
398
+ }
399
+ }
400
+
401
+ console.log(logMsg);
402
+ if (env.get(CONFIG_PARAMS.LOGGING_STDSTREAMS) && hdbLogger.logsAtLevel('info')) {
403
+ hdbLogger.suppressLogging(() => {
404
+ console.log(
405
+ `Note that log messages are being sent to the console (stdout and stderr) in addition to the log file ${logFilePath}. This can be disabled by setting logging.stdStreams to false, and the log file can be directly monitored/tailed.`
406
+ );
407
+ });
408
+ }
409
+ }
package/bin/status.js ADDED
@@ -0,0 +1,65 @@
1
+ 'use strict';
2
+
3
+ const fs = require('fs-extra');
4
+ const path = require('path');
5
+ const YAML = require('yaml');
6
+
7
+ const hdbTerms = require('../utility/hdbTerms.ts');
8
+ const hdbLog = require('../utility/logging/harper_logger.js');
9
+ const sysInfo = require('../utility/environment/systemInformation.js');
10
+ const envMgr = require('../utility/environment/environmentManager.js');
11
+ const installation = require('../utility/installation.ts');
12
+ envMgr.initSync();
13
+
14
+ const STATUSES = {
15
+ RUNNING: 'running',
16
+ STOPPED: 'stopped',
17
+ ERRORED: 'errored',
18
+ NOT_INSTALLED: 'not installed',
19
+ };
20
+
21
+ let hdbRoot;
22
+
23
+ module.exports = status;
24
+
25
+ async function status() {
26
+ let status = {
27
+ harperdb: {
28
+ status: STATUSES.STOPPED,
29
+ },
30
+ };
31
+
32
+ if (!installation.isHdbInstalled(envMgr, hdbLog)) {
33
+ status.harperdb.status = STATUSES.NOT_INSTALLED;
34
+ console.log(YAML.stringify(status));
35
+ return;
36
+ }
37
+
38
+ hdbRoot = envMgr.get(hdbTerms.CONFIG_PARAMS.ROOTPATH);
39
+ let hdbPid;
40
+ try {
41
+ hdbPid = Number.parseInt(await fs.readFile(path.join(hdbRoot, hdbTerms.HDB_PID_FILE), 'utf8'));
42
+ } catch (err) {
43
+ if (err.code === hdbTerms.NODE_ERROR_CODES.ENOENT) {
44
+ hdbLog.info('`harperdb status` did not find a hdb.pid file');
45
+ status.harperdb.status = STATUSES.STOPPED;
46
+ console.log(YAML.stringify(status));
47
+ return;
48
+ }
49
+
50
+ throw err;
51
+ }
52
+
53
+ // Check the saved pid against any running hdb processes
54
+ const hdbSysInfo = await sysInfo.getHDBProcessInfo();
55
+ for (const proc of hdbSysInfo.core) {
56
+ if (proc.pid === hdbPid) {
57
+ status.harperdb.status = STATUSES.RUNNING;
58
+ status.harperdb.pid = hdbPid;
59
+ break;
60
+ }
61
+ }
62
+
63
+ console.log(YAML.stringify(status));
64
+ process.exit();
65
+ }
package/bin/stop.js ADDED
@@ -0,0 +1,22 @@
1
+ 'use strict';
2
+
3
+ const hdbLogger = require('../utility/logging/harper_logger.js');
4
+ const util = require('util');
5
+ const childProcess = require('child_process');
6
+ const exec = util.promisify(childProcess.exec);
7
+ const sysInfo = require('../utility/environment/systemInformation.js');
8
+
9
+ const STOP_MSG = 'Stopping Harper.';
10
+
11
+ module.exports = stop;
12
+
13
+ async function stop() {
14
+ console.log(STOP_MSG);
15
+ hdbLogger.notify(STOP_MSG);
16
+
17
+ const processes = await sysInfo.getHDBProcessInfo();
18
+
19
+ processes.core.forEach((p) => {
20
+ exec(`kill ${p.pid}`);
21
+ });
22
+ }