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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (444) hide show
  1. package/bin/BinObjects.js +17 -0
  2. package/bin/cliOperations.js +157 -0
  3. package/bin/copyDb.ts +280 -0
  4. package/bin/harper.js +156 -0
  5. package/bin/install.js +15 -0
  6. package/bin/lite.js +5 -0
  7. package/bin/restart.js +201 -0
  8. package/bin/run.js +409 -0
  9. package/bin/status.js +65 -0
  10. package/bin/stop.js +22 -0
  11. package/bin/upgrade.js +134 -0
  12. package/components/Application.ts +646 -0
  13. package/components/ApplicationScope.ts +49 -0
  14. package/components/Component.ts +53 -0
  15. package/components/ComponentV1.ts +342 -0
  16. package/components/DEFAULT_CONFIG.ts +18 -0
  17. package/components/EntryHandler.ts +227 -0
  18. package/components/Logger.ts +14 -0
  19. package/components/OptionsWatcher.ts +354 -0
  20. package/components/PluginModule.ts +6 -0
  21. package/components/Scope.ts +329 -0
  22. package/components/componentLoader.ts +529 -0
  23. package/components/deriveCommonPatternBase.ts +31 -0
  24. package/components/deriveGlobOptions.ts +44 -0
  25. package/components/deriveURLPath.ts +57 -0
  26. package/components/operations.js +658 -0
  27. package/components/operationsValidation.js +246 -0
  28. package/components/packageComponent.ts +39 -0
  29. package/components/requestRestart.ts +26 -0
  30. package/components/resolveBaseURLPath.ts +38 -0
  31. package/components/status/ComponentStatus.ts +110 -0
  32. package/components/status/ComponentStatusRegistry.ts +251 -0
  33. package/components/status/api.ts +153 -0
  34. package/components/status/crossThread.ts +405 -0
  35. package/components/status/errors.ts +152 -0
  36. package/components/status/index.ts +44 -0
  37. package/components/status/internal.ts +65 -0
  38. package/components/status/registry.ts +12 -0
  39. package/components/status/types.ts +96 -0
  40. package/config/RootConfigWatcher.ts +59 -0
  41. package/config/configHelpers.ts +11 -0
  42. package/config/configUtils.js +967 -0
  43. package/config/harperConfigEnvVars.ts +641 -0
  44. package/dataLayer/CreateAttributeObject.js +25 -0
  45. package/dataLayer/CreateTableObject.js +11 -0
  46. package/dataLayer/DataLayerObjects.js +43 -0
  47. package/dataLayer/DeleteBeforeObject.js +22 -0
  48. package/dataLayer/DeleteObject.js +25 -0
  49. package/dataLayer/DropAttributeObject.js +11 -0
  50. package/dataLayer/GetBackupObject.js +22 -0
  51. package/dataLayer/InsertObject.js +24 -0
  52. package/dataLayer/ReadAuditLogObject.js +24 -0
  53. package/dataLayer/SQLSearch.js +1335 -0
  54. package/dataLayer/SearchByConditionsObject.js +61 -0
  55. package/dataLayer/SearchByHashObject.js +21 -0
  56. package/dataLayer/SearchObject.js +45 -0
  57. package/dataLayer/SqlSearchObject.js +14 -0
  58. package/dataLayer/UpdateObject.js +23 -0
  59. package/dataLayer/UpsertObject.js +23 -0
  60. package/dataLayer/bulkLoad.js +813 -0
  61. package/dataLayer/dataObjects/BulkLoadObjects.js +27 -0
  62. package/dataLayer/dataObjects/UpsertObject.js +23 -0
  63. package/dataLayer/delete.js +164 -0
  64. package/dataLayer/export.js +381 -0
  65. package/dataLayer/getBackup.js +40 -0
  66. package/dataLayer/harperBridge/BridgeMethods.js +81 -0
  67. package/dataLayer/harperBridge/ResourceBridge.ts +633 -0
  68. package/dataLayer/harperBridge/bridgeUtility/insertUpdateReturnObj.js +28 -0
  69. package/dataLayer/harperBridge/bridgeUtility/insertUpdateValidate.js +88 -0
  70. package/dataLayer/harperBridge/harperBridge.js +21 -0
  71. package/dataLayer/harperBridge/lmdbBridge/LMDBBridge.js +119 -0
  72. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/DeleteAuditLogsBeforeResults.js +19 -0
  73. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateAttribute.js +112 -0
  74. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateRecords.js +67 -0
  75. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateSchema.js +31 -0
  76. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateTable.js +94 -0
  77. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDeleteAuditLogsBefore.js +98 -0
  78. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDeleteRecords.js +89 -0
  79. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDropAttribute.js +109 -0
  80. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDropSchema.js +107 -0
  81. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDropTable.js +137 -0
  82. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbFlush.js +35 -0
  83. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbGetBackup.js +111 -0
  84. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbGetDataByHash.js +28 -0
  85. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbGetDataByValue.js +29 -0
  86. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbReadAuditLog.js +207 -0
  87. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbSearchByConditions.js +156 -0
  88. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbSearchByHash.js +21 -0
  89. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbSearchByValue.js +30 -0
  90. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbTransaction.js +19 -0
  91. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbUpdateRecords.js +64 -0
  92. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbUpsertRecords.js +70 -0
  93. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBCreateAttributeObject.js +22 -0
  94. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBDeleteTransactionObject.js +23 -0
  95. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBInsertTransactionObject.js +22 -0
  96. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBTransactionObject.js +23 -0
  97. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBUpdateTransactionObject.js +24 -0
  98. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBUpsertTransactionObject.js +24 -0
  99. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/TableSizeObject.js +25 -0
  100. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/initializeHashSearch.js +21 -0
  101. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/initializePaths.js +157 -0
  102. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbCheckForNewAttributes.js +94 -0
  103. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbCreateTransactionsAuditEnvironment.js +39 -0
  104. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbGetTableSize.js +34 -0
  105. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbProcessRows.js +100 -0
  106. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbSearch.js +371 -0
  107. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbWriteTransaction.js +109 -0
  108. package/dataLayer/hdbInfoController.js +254 -0
  109. package/dataLayer/insert.js +266 -0
  110. package/dataLayer/readAuditLog.js +59 -0
  111. package/dataLayer/schema.js +366 -0
  112. package/dataLayer/schemaDescribe.js +289 -0
  113. package/dataLayer/search.js +60 -0
  114. package/dataLayer/transaction.js +17 -0
  115. package/dataLayer/update.js +124 -0
  116. package/dist/components/Logger.d.ts +12 -0
  117. package/dist/components/Logger.js +3 -0
  118. package/dist/components/Logger.js.map +1 -0
  119. package/dist/components/Scope.d.ts +14 -4
  120. package/dist/components/Scope.js +18 -10
  121. package/dist/components/Scope.js.map +1 -1
  122. package/dist/components/componentLoader.js +16 -9
  123. package/dist/components/componentLoader.js.map +1 -1
  124. package/dist/components/operations.js +2 -2
  125. package/dist/components/operations.js.map +1 -1
  126. package/dist/config/configUtils.d.ts +1 -1
  127. package/dist/config/configUtils.js +1 -1
  128. package/dist/config/configUtils.js.map +1 -1
  129. package/dist/dataLayer/CreateTableObject.d.ts +2 -2
  130. package/dist/dataLayer/CreateTableObject.js +2 -2
  131. package/dist/dataLayer/CreateTableObject.js.map +1 -1
  132. package/dist/dataLayer/delete.d.ts +1 -1
  133. package/dist/dataLayer/schema.js +6 -5
  134. package/dist/dataLayer/schema.js.map +1 -1
  135. package/dist/dataLayer/schemaDescribe.js +1 -1
  136. package/dist/dataLayer/schemaDescribe.js.map +1 -1
  137. package/dist/index.d.ts +1 -1
  138. package/dist/index.js +2 -0
  139. package/dist/index.js.map +1 -1
  140. package/dist/resources/DatabaseTransaction.d.ts +1 -1
  141. package/dist/resources/IterableEventQueue.d.ts +1 -1
  142. package/dist/resources/LMDBTransaction.d.ts +5 -1
  143. package/dist/resources/Resource.d.ts +1 -1
  144. package/dist/resources/RocksIndexStore.d.ts +3 -3
  145. package/dist/resources/RocksTransactionLogStore.d.ts +6 -3
  146. package/dist/resources/Table.d.ts +15 -6
  147. package/dist/resources/Table.js +4 -1
  148. package/dist/resources/Table.js.map +1 -1
  149. package/dist/resources/analytics/read.js +32 -22
  150. package/dist/resources/analytics/read.js.map +1 -1
  151. package/dist/resources/analytics/write.js +3 -6
  152. package/dist/resources/analytics/write.js.map +1 -1
  153. package/dist/resources/auditStore.d.ts +3 -3
  154. package/dist/resources/blob.d.ts +25 -2
  155. package/dist/resources/databases.d.ts +12 -2
  156. package/dist/resources/databases.js +22 -19
  157. package/dist/resources/databases.js.map +1 -1
  158. package/dist/resources/search.js +11 -5
  159. package/dist/resources/search.js.map +1 -1
  160. package/dist/resources/transaction.d.ts +2 -1
  161. package/dist/security/auth.js +1 -1
  162. package/dist/security/auth.js.map +1 -1
  163. package/dist/security/cryptoHash.d.ts +2 -2
  164. package/dist/security/jsLoader.js +243 -66
  165. package/dist/security/jsLoader.js.map +1 -1
  166. package/dist/security/keys.js +4 -5
  167. package/dist/security/keys.js.map +1 -1
  168. package/dist/security/user.js +3 -3
  169. package/dist/security/user.js.map +1 -1
  170. package/dist/server/REST.js +16 -2
  171. package/dist/server/REST.js.map +1 -1
  172. package/dist/server/Server.d.ts +2 -1
  173. package/dist/server/Server.js.map +1 -1
  174. package/dist/server/fastifyRoutes/plugins/hdbCore.d.ts +6 -1
  175. package/dist/server/fastifyRoutes.js +2 -0
  176. package/dist/server/fastifyRoutes.js.map +1 -1
  177. package/dist/server/http.js +12 -6
  178. package/dist/server/http.js.map +1 -1
  179. package/dist/server/jobs/JobObject.d.ts +3 -3
  180. package/dist/server/loadRootComponents.js +1 -0
  181. package/dist/server/loadRootComponents.js.map +1 -1
  182. package/dist/server/operationsServer.js +3 -1
  183. package/dist/server/operationsServer.js.map +1 -1
  184. package/dist/server/serverHelpers/JSONStream.d.ts +3 -3
  185. package/dist/server/serverHelpers/Request.d.ts +5 -5
  186. package/dist/server/serverHelpers/requestTimePlugin.d.ts +1 -1
  187. package/dist/server/threads/manageThreads.d.ts +2 -2
  188. package/dist/server/threads/manageThreads.js +50 -35
  189. package/dist/server/threads/manageThreads.js.map +1 -1
  190. package/dist/server/threads/socketRouter.d.ts +1 -1
  191. package/dist/sqlTranslator/deleteTranslator.d.ts +1 -1
  192. package/dist/utility/AWS/AWSConnector.d.ts +3 -2
  193. package/dist/utility/common_utils.d.ts +3 -3
  194. package/dist/utility/environment/systemInformation.d.ts +1 -0
  195. package/dist/utility/functions/date/dateFunctions.d.ts +11 -11
  196. package/dist/utility/globalSchema.d.ts +1 -1
  197. package/dist/utility/hdbTerms.d.ts +3 -0
  198. package/dist/utility/hdbTerms.js +3 -0
  199. package/dist/utility/hdbTerms.js.map +1 -1
  200. package/dist/utility/installation.d.ts +2 -4
  201. package/dist/utility/installation.js.map +1 -1
  202. package/dist/utility/lmdb/commonUtility.d.ts +1 -0
  203. package/dist/utility/lmdb/deleteUtility.d.ts +1 -0
  204. package/dist/utility/lmdb/environmentUtility.d.ts +1 -0
  205. package/dist/utility/lmdb/searchUtility.d.ts +2 -1
  206. package/dist/utility/lmdb/writeUtility.d.ts +1 -0
  207. package/dist/utility/logging/harper_logger.d.ts +6 -6
  208. package/dist/utility/processManagement/processManagement.d.ts +1 -1
  209. package/dist/utility/processManagement/servicesConfig.d.ts +12 -6
  210. package/dist/validation/common_validators.d.ts +4 -3
  211. package/dist/validation/configValidator.d.ts +3 -2
  212. package/index.d.ts +56 -0
  213. package/index.js +41 -0
  214. package/json/systemSchema.json +373 -0
  215. package/launchServiceScripts/launchHarperDB.js +3 -0
  216. package/launchServiceScripts/utility/checkNodeVersion.js +15 -0
  217. package/package.json +21 -3
  218. package/resources/DatabaseTransaction.ts +378 -0
  219. package/resources/ErrorResource.ts +57 -0
  220. package/resources/IterableEventQueue.ts +94 -0
  221. package/resources/LMDBTransaction.ts +349 -0
  222. package/resources/RecordEncoder.ts +702 -0
  223. package/resources/RequestTarget.ts +134 -0
  224. package/resources/Resource.ts +789 -0
  225. package/resources/ResourceInterface.ts +221 -0
  226. package/resources/ResourceInterfaceV2.ts +53 -0
  227. package/resources/ResourceV2.ts +67 -0
  228. package/resources/Resources.ts +162 -0
  229. package/resources/RocksIndexStore.ts +70 -0
  230. package/resources/RocksTransactionLogStore.ts +352 -0
  231. package/resources/Table.ts +4527 -0
  232. package/resources/analytics/hostnames.ts +72 -0
  233. package/resources/analytics/metadata.ts +10 -0
  234. package/resources/analytics/read.ts +252 -0
  235. package/resources/analytics/write.ts +803 -0
  236. package/resources/auditStore.ts +556 -0
  237. package/resources/blob.ts +1268 -0
  238. package/resources/crdt.ts +125 -0
  239. package/resources/dataLoader.ts +527 -0
  240. package/resources/databases.ts +1290 -0
  241. package/resources/graphql.ts +221 -0
  242. package/resources/indexes/HierarchicalNavigableSmallWorld.ts +638 -0
  243. package/resources/indexes/customIndexes.ts +7 -0
  244. package/resources/indexes/vector.ts +38 -0
  245. package/resources/jsResource.ts +86 -0
  246. package/resources/loadEnv.ts +22 -0
  247. package/resources/login.ts +18 -0
  248. package/resources/openApi.ts +409 -0
  249. package/resources/registrationDeprecated.ts +8 -0
  250. package/resources/replayLogs.ts +136 -0
  251. package/resources/roles.ts +98 -0
  252. package/resources/search.ts +1301 -0
  253. package/resources/tracked.ts +584 -0
  254. package/resources/transaction.ts +89 -0
  255. package/resources/transactionBroadcast.ts +258 -0
  256. package/security/auth.ts +376 -0
  257. package/security/certificateVerification/certificateVerificationSource.ts +84 -0
  258. package/security/certificateVerification/configValidation.ts +107 -0
  259. package/security/certificateVerification/crlVerification.ts +623 -0
  260. package/security/certificateVerification/index.ts +121 -0
  261. package/security/certificateVerification/ocspVerification.ts +148 -0
  262. package/security/certificateVerification/pkijs-ed25519-patch.ts +188 -0
  263. package/security/certificateVerification/types.ts +128 -0
  264. package/security/certificateVerification/verificationConfig.ts +138 -0
  265. package/security/certificateVerification/verificationUtils.ts +447 -0
  266. package/security/cryptoHash.js +42 -0
  267. package/security/data_objects/PermissionAttributeResponseObject.js +15 -0
  268. package/security/data_objects/PermissionResponseObject.js +115 -0
  269. package/security/data_objects/PermissionTableResponseObject.js +20 -0
  270. package/security/fastifyAuth.js +169 -0
  271. package/security/impersonation.ts +160 -0
  272. package/security/jsLoader.ts +716 -0
  273. package/security/keys.js +948 -0
  274. package/security/permissionsTranslator.js +300 -0
  275. package/security/role.js +218 -0
  276. package/security/tokenAuthentication.ts +228 -0
  277. package/security/user.ts +449 -0
  278. package/server/DurableSubscriptionsSession.ts +503 -0
  279. package/server/REST.ts +407 -0
  280. package/server/Server.ts +89 -0
  281. package/server/fastifyRoutes/helpers/getCORSOptions.js +36 -0
  282. package/server/fastifyRoutes/helpers/getHeaderTimeoutConfig.js +15 -0
  283. package/server/fastifyRoutes/helpers/getServerOptions.js +33 -0
  284. package/server/fastifyRoutes/plugins/hdbCore.js +39 -0
  285. package/server/fastifyRoutes.ts +205 -0
  286. package/server/graphqlQuerying.ts +700 -0
  287. package/server/http.ts +640 -0
  288. package/server/itc/serverHandlers.js +161 -0
  289. package/server/itc/utility/ITCEventObject.js +10 -0
  290. package/server/jobs/JobObject.js +24 -0
  291. package/server/jobs/jobProcess.js +69 -0
  292. package/server/jobs/jobRunner.js +162 -0
  293. package/server/jobs/jobs.js +304 -0
  294. package/server/loadRootComponents.js +44 -0
  295. package/server/mqtt.ts +485 -0
  296. package/server/nodeName.ts +75 -0
  297. package/server/operationsServer.ts +313 -0
  298. package/server/serverHelpers/Headers.ts +108 -0
  299. package/server/serverHelpers/JSONStream.ts +269 -0
  300. package/server/serverHelpers/OperationFunctionObject.ts +13 -0
  301. package/server/serverHelpers/Request.ts +158 -0
  302. package/server/serverHelpers/contentTypes.ts +637 -0
  303. package/server/serverHelpers/requestTimePlugin.js +57 -0
  304. package/server/serverHelpers/serverHandlers.js +148 -0
  305. package/server/serverHelpers/serverUtilities.ts +473 -0
  306. package/server/serverRegistry.ts +8 -0
  307. package/server/static.ts +187 -0
  308. package/server/status/definitions.ts +37 -0
  309. package/server/status/index.ts +125 -0
  310. package/server/storageReclamation.ts +93 -0
  311. package/server/threads/itc.js +89 -0
  312. package/server/threads/manageThreads.js +594 -0
  313. package/server/threads/socketRouter.ts +360 -0
  314. package/server/threads/threadServer.js +279 -0
  315. package/server/throttle.ts +73 -0
  316. package/sqlTranslator/SelectValidator.js +330 -0
  317. package/sqlTranslator/alasqlFunctionImporter.js +62 -0
  318. package/sqlTranslator/deleteTranslator.js +67 -0
  319. package/sqlTranslator/index.js +242 -0
  320. package/sqlTranslator/sql_statement_bucket.js +472 -0
  321. package/static/defaultConfig.yaml +3 -0
  322. package/studio/web/HDBDogOnly.svg +78 -0
  323. package/studio/web/assets/PPRadioGrotesk-Bold-DDaUYG8E.woff +0 -0
  324. package/studio/web/assets/fa-brands-400-CEJbCg16.woff +0 -0
  325. package/studio/web/assets/fa-brands-400-CSYNqBb_.ttf +0 -0
  326. package/studio/web/assets/fa-brands-400-DnkPfk3o.eot +0 -0
  327. package/studio/web/assets/fa-brands-400-UxlILjvJ.woff2 +0 -0
  328. package/studio/web/assets/fa-brands-400-cH1MgKbP.svg +3717 -0
  329. package/studio/web/assets/fa-regular-400-BhTwtT8w.eot +0 -0
  330. package/studio/web/assets/fa-regular-400-D1vz6WBx.ttf +0 -0
  331. package/studio/web/assets/fa-regular-400-DFnMcJPd.woff +0 -0
  332. package/studio/web/assets/fa-regular-400-DGzu1beS.woff2 +0 -0
  333. package/studio/web/assets/fa-regular-400-gwj8Pxq-.svg +801 -0
  334. package/studio/web/assets/fa-solid-900-B4ZZ7kfP.svg +5034 -0
  335. package/studio/web/assets/fa-solid-900-B6Axprfb.eot +0 -0
  336. package/studio/web/assets/fa-solid-900-BUswJgRo.woff2 +0 -0
  337. package/studio/web/assets/fa-solid-900-DOXgCApm.woff +0 -0
  338. package/studio/web/assets/fa-solid-900-mxuxnBEa.ttf +0 -0
  339. package/studio/web/assets/index-BTgXJX9d.js +235 -0
  340. package/studio/web/assets/index-BTgXJX9d.js.map +1 -0
  341. package/studio/web/assets/index-C-GXfcup.js +37 -0
  342. package/studio/web/assets/index-C-GXfcup.js.map +1 -0
  343. package/studio/web/assets/index-PFlNdimM.js +2 -0
  344. package/studio/web/assets/index-PFlNdimM.js.map +1 -0
  345. package/studio/web/assets/index-Y2g_iFpU.css +1 -0
  346. package/studio/web/assets/index-jiPwkrsB.css +1 -0
  347. package/studio/web/assets/index.lazy-C3TJZJ4o.js +266 -0
  348. package/studio/web/assets/index.lazy-C3TJZJ4o.js.map +1 -0
  349. package/studio/web/assets/profiler-DotzgiCJ.js +2 -0
  350. package/studio/web/assets/profiler-DotzgiCJ.js.map +1 -0
  351. package/studio/web/assets/react-redux-VxUEx_mU.js +6 -0
  352. package/studio/web/assets/react-redux-VxUEx_mU.js.map +1 -0
  353. package/studio/web/assets/startRecording-B_9J9Csd.js +3 -0
  354. package/studio/web/assets/startRecording-B_9J9Csd.js.map +1 -0
  355. package/studio/web/fabric-signup-background.webp +0 -0
  356. package/studio/web/fabric-signup-text.png +0 -0
  357. package/studio/web/favicon_purple.png +0 -0
  358. package/studio/web/github-icon.svg +15 -0
  359. package/studio/web/harper-fabric_black.png +0 -0
  360. package/studio/web/harper-fabric_white.png +0 -0
  361. package/studio/web/harper-studio_white.png +0 -0
  362. package/studio/web/index.html +16 -0
  363. package/studio/web/running.css +148 -0
  364. package/studio/web/running.html +147 -0
  365. package/studio/web/running.js +111 -0
  366. package/upgrade/UpgradeObjects.js +13 -0
  367. package/upgrade/directives/directivesController.js +90 -0
  368. package/upgrade/directivesManager.js +139 -0
  369. package/upgrade/upgradePrompt.js +124 -0
  370. package/upgrade/upgradeUtilities.js +28 -0
  371. package/utility/AWS/AWSConnector.js +29 -0
  372. package/utility/OperationFunctionCaller.js +63 -0
  373. package/utility/assignCmdEnvVariables.js +62 -0
  374. package/utility/common_utils.js +867 -0
  375. package/utility/environment/environmentManager.js +208 -0
  376. package/utility/environment/systemInformation.js +355 -0
  377. package/utility/errors/commonErrors.js +267 -0
  378. package/utility/errors/hdbError.js +146 -0
  379. package/utility/functions/date/dateFunctions.js +65 -0
  380. package/utility/functions/geo.js +355 -0
  381. package/utility/functions/sql/alaSQLExtension.js +104 -0
  382. package/utility/globalSchema.js +35 -0
  383. package/utility/hdbTerms.ts +819 -0
  384. package/utility/install/checkJWTTokensExist.js +62 -0
  385. package/utility/install/harperdb.conf +15 -0
  386. package/utility/install/harperdb.service +14 -0
  387. package/utility/install/installer.js +635 -0
  388. package/utility/installation.ts +30 -0
  389. package/utility/lmdb/DBIDefinition.js +20 -0
  390. package/utility/lmdb/DeleteRecordsResponseObject.js +25 -0
  391. package/utility/lmdb/InsertRecordsResponseObject.js +22 -0
  392. package/utility/lmdb/OpenDBIObject.js +31 -0
  393. package/utility/lmdb/OpenEnvironmentObject.js +41 -0
  394. package/utility/lmdb/UpdateRecordsResponseObject.js +25 -0
  395. package/utility/lmdb/UpsertRecordsResponseObject.js +22 -0
  396. package/utility/lmdb/cleanLMDBMap.js +65 -0
  397. package/utility/lmdb/commonUtility.js +119 -0
  398. package/utility/lmdb/deleteUtility.js +128 -0
  399. package/utility/lmdb/environmentUtility.js +477 -0
  400. package/utility/lmdb/searchCursorFunctions.js +187 -0
  401. package/utility/lmdb/searchUtility.js +918 -0
  402. package/utility/lmdb/terms.js +57 -0
  403. package/utility/lmdb/writeUtility.js +407 -0
  404. package/utility/logging/harper_logger.js +876 -0
  405. package/utility/logging/logRotator.js +157 -0
  406. package/utility/logging/logger.ts +24 -0
  407. package/utility/logging/readLog.js +355 -0
  408. package/utility/logging/transactionLog.js +57 -0
  409. package/utility/mount_hdb.js +59 -0
  410. package/utility/npmUtilities.js +102 -0
  411. package/utility/operationPermissions.ts +112 -0
  412. package/utility/operation_authorization.js +836 -0
  413. package/utility/packageUtils.js +55 -0
  414. package/utility/password.ts +99 -0
  415. package/utility/processManagement/processManagement.js +187 -0
  416. package/utility/processManagement/servicesConfig.js +56 -0
  417. package/utility/scripts/restartHdb.js +24 -0
  418. package/utility/scripts/user_data.sh +13 -0
  419. package/utility/signalling.js +36 -0
  420. package/utility/terms/certificates.js +81 -0
  421. package/utility/when.ts +20 -0
  422. package/v1.d.ts +39 -0
  423. package/v1.js +41 -0
  424. package/v2.d.ts +39 -0
  425. package/v2.js +41 -0
  426. package/validation/bulkDeleteValidator.js +24 -0
  427. package/validation/check_permissions.js +19 -0
  428. package/validation/common_validators.js +95 -0
  429. package/validation/configValidator.js +331 -0
  430. package/validation/deleteValidator.js +15 -0
  431. package/validation/fileLoadValidator.js +153 -0
  432. package/validation/insertValidator.js +40 -0
  433. package/validation/installValidator.js +37 -0
  434. package/validation/readLogValidator.js +64 -0
  435. package/validation/role_validation.js +320 -0
  436. package/validation/schemaMetadataValidator.js +42 -0
  437. package/validation/searchValidator.js +166 -0
  438. package/validation/statusValidator.ts +66 -0
  439. package/validation/transactionLogValidator.js +33 -0
  440. package/validation/user_validation.js +55 -0
  441. package/validation/validationWrapper.js +105 -0
  442. package/dist/resources/analytics/profile.d.ts +0 -2
  443. package/dist/resources/analytics/profile.js +0 -144
  444. package/dist/resources/analytics/profile.js.map +0 -1
@@ -0,0 +1,246 @@
1
+ 'use strict';
2
+
3
+ const Joi = require('joi');
4
+ const fs = require('fs-extra');
5
+ const path = require('path');
6
+ const validator = require('../validation/validationWrapper.js');
7
+ const envMangr = require('../utility/environment/environmentManager.js');
8
+ const hdbTerms = require('../utility/hdbTerms.ts');
9
+ const hdbLogger = require('../utility/logging/harper_logger.js');
10
+ const { hdbErrors } = require('../utility/errors/hdbError.js');
11
+ const { HDB_ERROR_MSGS } = hdbErrors;
12
+
13
+ // File name can only be alphanumeric, dash and underscores
14
+ const PROJECT_FILE_NAME_REGEX = /^[a-zA-Z0-9-_]+$/;
15
+
16
+ module.exports = {
17
+ getDropCustomFunctionValidator,
18
+ setCustomFunctionValidator,
19
+ addComponentValidator,
20
+ dropCustomFunctionProjectValidator,
21
+ packageComponentValidator,
22
+ deployComponentValidator,
23
+ setComponentFileValidator,
24
+ getComponentFileValidator,
25
+ dropComponentFileValidator,
26
+ };
27
+
28
+ /**
29
+ * Check to see if a project dir exists in the custom functions dir.
30
+ * @param checkExists - determine if validator returns error if exists or vice versa
31
+ * @param project
32
+ * @param helpers
33
+ * @returns {*}
34
+ */
35
+ function checkProjectExists(checkExists, project, helpers) {
36
+ try {
37
+ const cfDir = envMangr.get(hdbTerms.CONFIG_PARAMS.COMPONENTSROOT);
38
+ const projectDir = path.join(cfDir, project);
39
+
40
+ if (!fs.existsSync(projectDir)) {
41
+ if (checkExists) {
42
+ return helpers.message(HDB_ERROR_MSGS.NO_PROJECT);
43
+ }
44
+
45
+ return project;
46
+ }
47
+
48
+ if (checkExists) {
49
+ return project;
50
+ }
51
+
52
+ return helpers.message(HDB_ERROR_MSGS.PROJECT_EXISTS);
53
+ } catch (err) {
54
+ hdbLogger.error(err);
55
+ return helpers.message(HDB_ERROR_MSGS.VALIDATION_ERR);
56
+ }
57
+ }
58
+
59
+ function checkFilePath(path, helpers) {
60
+ if (path.includes('..')) return helpers.message('Invalid file path');
61
+ return path;
62
+ }
63
+
64
+ /**
65
+ * Check the custom functions dir to see if a file exists.
66
+ * @param project
67
+ * @param type
68
+ * @param file
69
+ * @param helpers
70
+ * @returns {*}
71
+ */
72
+ function checkFileExists(project, type, file, helpers) {
73
+ try {
74
+ const cfDir = envMangr.get(hdbTerms.CONFIG_PARAMS.COMPONENTSROOT);
75
+ const filePath = path.join(cfDir, project, type, file + '.js');
76
+ if (!fs.existsSync(filePath)) {
77
+ return helpers.message(HDB_ERROR_MSGS.NO_FILE);
78
+ }
79
+
80
+ return file;
81
+ } catch (err) {
82
+ hdbLogger.error(err);
83
+ return helpers.message(HDB_ERROR_MSGS.VALIDATION_ERR);
84
+ }
85
+ }
86
+
87
+ /**
88
+ * Used to validate getCustomFunction and dropCustomFunction
89
+ * @param req
90
+ * @returns {*}
91
+ */
92
+ function getDropCustomFunctionValidator(req) {
93
+ const getFuncSchema = Joi.object({
94
+ project: Joi.string()
95
+ .pattern(PROJECT_FILE_NAME_REGEX)
96
+ .custom(checkProjectExists.bind(null, true))
97
+ .required()
98
+ .messages({ 'string.pattern.base': HDB_ERROR_MSGS.BAD_PROJECT_NAME }),
99
+ type: Joi.string().valid('helpers', 'routes').required(),
100
+ file: Joi.string()
101
+ .pattern(PROJECT_FILE_NAME_REGEX)
102
+ .custom(checkFileExists.bind(null, req.project, req.type))
103
+ .custom(checkFilePath)
104
+ .required()
105
+ .messages({ 'string.pattern.base': HDB_ERROR_MSGS.BAD_FILE_NAME }),
106
+ });
107
+
108
+ return validator.validateBySchema(req, getFuncSchema);
109
+ }
110
+
111
+ /**
112
+ * Validate setCustomFunction requests.
113
+ * @param req
114
+ * @returns {*}
115
+ */
116
+ function setCustomFunctionValidator(req) {
117
+ const setFuncSchema = Joi.object({
118
+ project: Joi.string()
119
+ .pattern(PROJECT_FILE_NAME_REGEX)
120
+ .custom(checkProjectExists.bind(null, true))
121
+ .required()
122
+ .messages({ 'string.pattern.base': HDB_ERROR_MSGS.BAD_PROJECT_NAME }),
123
+ type: Joi.string().valid('helpers', 'routes').required(),
124
+ file: Joi.string().custom(checkFilePath).required(),
125
+ function_content: Joi.string().required(),
126
+ });
127
+
128
+ return validator.validateBySchema(req, setFuncSchema);
129
+ }
130
+
131
+ /**
132
+ * Validate set_component_file requests.
133
+ * @param req
134
+ * @returns {*}
135
+ */
136
+ function setComponentFileValidator(req) {
137
+ const setCompSchema = Joi.object({
138
+ project: Joi.string()
139
+ .pattern(PROJECT_FILE_NAME_REGEX)
140
+ .required()
141
+ .messages({ 'string.pattern.base': HDB_ERROR_MSGS.BAD_PROJECT_NAME }),
142
+ file: Joi.string().custom(checkFilePath).required(),
143
+ payload: Joi.string().allow('').optional(),
144
+ encoding: Joi.string().valid('utf8', 'ASCII', 'binary', 'hex', 'base64', 'utf16le', 'latin1', 'ucs2').optional(),
145
+ });
146
+
147
+ return validator.validateBySchema(req, setCompSchema);
148
+ }
149
+
150
+ function dropComponentFileValidator(req) {
151
+ const dropCompSchema = Joi.object({
152
+ project: Joi.string()
153
+ .pattern(PROJECT_FILE_NAME_REGEX)
154
+ .required()
155
+ .messages({ 'string.pattern.base': HDB_ERROR_MSGS.BAD_PROJECT_NAME }),
156
+ file: Joi.string().custom(checkFilePath).optional(),
157
+ });
158
+
159
+ return validator.validateBySchema(req, dropCompSchema);
160
+ }
161
+
162
+ function getComponentFileValidator(req) {
163
+ const getCompSchema = Joi.object({
164
+ project: Joi.string().required(),
165
+ file: Joi.string().custom(checkFilePath).required(),
166
+ encoding: Joi.string().valid('utf8', 'ASCII', 'binary', 'hex', 'base64', 'utf16le', 'latin1', 'ucs2').optional(),
167
+ });
168
+
169
+ return validator.validateBySchema(req, getCompSchema);
170
+ }
171
+
172
+ /**
173
+ * Validate addCustomFunctionProject requests.
174
+ * @param req
175
+ * @returns {*}
176
+ */
177
+ function addComponentValidator(req) {
178
+ const addFuncSchema = Joi.object({
179
+ project: Joi.string()
180
+ .pattern(PROJECT_FILE_NAME_REGEX)
181
+ .custom(checkProjectExists.bind(null, false))
182
+ .required()
183
+ .messages({ 'string.pattern.base': HDB_ERROR_MSGS.BAD_PROJECT_NAME }),
184
+ template: Joi.string().optional(),
185
+ install_command: Joi.string().optional(),
186
+ install_timeout: Joi.number().optional(),
187
+ });
188
+
189
+ return validator.validateBySchema(req, addFuncSchema);
190
+ }
191
+
192
+ /**
193
+ * Validate dropCustomFunctionProject requests.
194
+ * @param req
195
+ * @returns {*}
196
+ */
197
+ function dropCustomFunctionProjectValidator(req) {
198
+ const dropFuncSchema = Joi.object({
199
+ project: Joi.string()
200
+ .pattern(PROJECT_FILE_NAME_REGEX)
201
+ .custom(checkProjectExists.bind(null, true))
202
+ .required()
203
+ .messages({ 'string.pattern.base': HDB_ERROR_MSGS.BAD_PROJECT_NAME }),
204
+ });
205
+
206
+ return validator.validateBySchema(req, dropFuncSchema);
207
+ }
208
+
209
+ /**
210
+ * Validate packageCustomFunctionProject requests.
211
+ * @param req
212
+ * @returns {*}
213
+ */
214
+ function packageComponentValidator(req) {
215
+ const packageProjSchema = Joi.object({
216
+ project: Joi.string()
217
+ .pattern(PROJECT_FILE_NAME_REGEX)
218
+ .required()
219
+ .messages({ 'string.pattern.base': HDB_ERROR_MSGS.BAD_PROJECT_NAME }),
220
+ skip_node_modules: Joi.boolean(),
221
+ skip_symlinks: Joi.boolean(),
222
+ });
223
+
224
+ return validator.validateBySchema(req, packageProjSchema);
225
+ }
226
+
227
+ /**
228
+ * Validate deployComponent requests.
229
+ * @param req
230
+ * @returns {*}
231
+ */
232
+ function deployComponentValidator(req) {
233
+ const deployProjSchema = Joi.object({
234
+ project: Joi.string()
235
+ .pattern(PROJECT_FILE_NAME_REGEX)
236
+ .required()
237
+ .messages({ 'string.pattern.base': HDB_ERROR_MSGS.BAD_PROJECT_NAME }),
238
+ package: Joi.string().optional(),
239
+ restart: Joi.alternatives().try(Joi.boolean(), Joi.string().valid('rolling')).optional(),
240
+ install_command: Joi.string().optional(),
241
+ install_timeout: Joi.number().optional(),
242
+ force: Joi.boolean().optional(),
243
+ });
244
+
245
+ return validator.validateBySchema(req, deployProjSchema);
246
+ }
@@ -0,0 +1,39 @@
1
+ import { join } from 'path';
2
+ import tar from 'tar-fs';
3
+ import { createGzip } from 'node:zlib';
4
+
5
+ /**
6
+ * Package a directory into a tarball, base64 encoded
7
+ * @param directory
8
+ */
9
+ export function packageDirectory(
10
+ directory: string,
11
+ options: { skip_node_modules?: boolean; skip_symlinks?: boolean } = { skip_node_modules: false, skip_symlinks: false }
12
+ ): Promise<Buffer> {
13
+ return new Promise((resolve, reject) => {
14
+ // for deployComponent to a remote server, we need to tar the local directory
15
+ const chunks = [];
16
+ // pack the directory
17
+ tar
18
+ .pack(directory, {
19
+ dereference: !options.skip_symlinks,
20
+ ignore: options.skip_node_modules
21
+ ? (name: string) => {
22
+ return name.includes('node_modules') || name.includes(join('cache', 'webpack'));
23
+ }
24
+ : undefined,
25
+ map: (header) => {
26
+ if (header.type === 'directory') {
27
+ header.mode = 0o755;
28
+ }
29
+ return header;
30
+ },
31
+ })
32
+ .pipe(createGzip())
33
+ .on('data', (chunk: Buffer) => chunks.push(chunk))
34
+ .on('end', () => {
35
+ resolve(Buffer.concat(chunks));
36
+ })
37
+ .on('error', reject);
38
+ });
39
+ }
@@ -0,0 +1,26 @@
1
+ import { Status } from '../server/status/index.ts';
2
+
3
+ let restartArrayBuffer: ArrayBuffer;
4
+ let restartNeededArray: Uint8Array;
5
+
6
+ function ensureInitialized() {
7
+ if (!restartArrayBuffer) {
8
+ restartArrayBuffer = Status.primaryStore.getUserSharedBuffer('restart-needed', new ArrayBuffer(1));
9
+ restartNeededArray = new Uint8Array(restartArrayBuffer);
10
+ }
11
+ }
12
+
13
+ export function requestRestart() {
14
+ ensureInitialized();
15
+ restartNeededArray[0] = 1;
16
+ }
17
+
18
+ export function restartNeeded() {
19
+ ensureInitialized();
20
+ return restartNeededArray[0] === 1;
21
+ }
22
+
23
+ export function resetRestartNeeded() {
24
+ ensureInitialized();
25
+ restartNeededArray[0] = 0;
26
+ }
@@ -0,0 +1,38 @@
1
+ export class InvalidBaseURLPathError extends Error {
2
+ constructor(urlPath: string) {
3
+ super(`urlPath must not contain '..'. Received: '${urlPath}'`);
4
+ }
5
+ }
6
+
7
+ /**
8
+ * Resolve the base URL path based on the component name and `urlPath` configuration option.
9
+ *
10
+ * For example, resolving the component config `urlPath` value for component `test-component`:
11
+ * - `undefined`, `''`, `'/'` -> `'/'`
12
+ * - `'static'`, `'/static/'`, `'/static'`, `'static/'` -> `'/static/'`
13
+ * - `'v1/static'`, `'/v1/static/'`, `'/v1/static'`, `'v1/static/'` -> `'/v1/static/'`
14
+ * - `'./static'`, `'./static/'` -> `'/test-component/static/'`
15
+ * - `'.'`, `'./'` -> `'/test-component/'`
16
+ * - `'..'`, `'../'`, `'../static'`, `'./..'` -> Error
17
+ */
18
+ export function resolveBaseURLPath(name: string, urlPath?: string): string {
19
+ if (urlPath?.includes('..')) {
20
+ throw new InvalidBaseURLPathError(urlPath);
21
+ }
22
+
23
+ let baseURLPath = urlPath || '/';
24
+
25
+ if (baseURLPath === '.' || baseURLPath.startsWith('./')) {
26
+ baseURLPath = `/${name}${baseURLPath.slice(1)}`;
27
+ }
28
+
29
+ if (!baseURLPath.startsWith('/')) {
30
+ baseURLPath = `/${baseURLPath}`;
31
+ }
32
+
33
+ if (!baseURLPath.endsWith('/')) {
34
+ baseURLPath = `${baseURLPath}/`;
35
+ }
36
+
37
+ return baseURLPath;
38
+ }
@@ -0,0 +1,110 @@
1
+ /**
2
+ * ComponentStatus Class
3
+ *
4
+ * This module contains the ComponentStatus class which represents an individual
5
+ * component's status with methods for status management.
6
+ */
7
+
8
+ import { type ComponentStatusLevel, COMPONENT_STATUS_LEVELS } from './types.ts';
9
+
10
+ /**
11
+ * Component status information class
12
+ */
13
+ export class ComponentStatus {
14
+ /** Last time this status was checked/updated */
15
+ public lastChecked: Date;
16
+ /** Current status level */
17
+ public status: ComponentStatusLevel;
18
+ /** Human-readable status message */
19
+ public message?: string;
20
+ /** Error information if status is 'error' */
21
+ public error?: Error | string;
22
+
23
+ constructor(status: ComponentStatusLevel, message?: string, error?: Error | string) {
24
+ this.lastChecked = new Date();
25
+ this.status = status;
26
+ this.message = message;
27
+ this.error = error;
28
+ }
29
+
30
+ /**
31
+ * Update the status level and refresh the timestamp
32
+ */
33
+ public updateStatus(status: ComponentStatusLevel, message?: string): void {
34
+ this.status = status;
35
+ this.message = message;
36
+ this.lastChecked = new Date();
37
+ // Clear error when status is not ERROR
38
+ if (status !== COMPONENT_STATUS_LEVELS.ERROR) {
39
+ this.error = undefined;
40
+ }
41
+ }
42
+
43
+ /**
44
+ * Set status to healthy
45
+ */
46
+ public markHealthy(message?: string): void {
47
+ this.updateStatus(COMPONENT_STATUS_LEVELS.HEALTHY, message || 'Component is healthy');
48
+ }
49
+
50
+ /**
51
+ * Set status to error
52
+ */
53
+ public markError(error: Error | string, message?: string): void {
54
+ this.status = COMPONENT_STATUS_LEVELS.ERROR;
55
+ this.error = error;
56
+ this.message = message || (typeof error === 'string' ? error : error.message);
57
+ this.lastChecked = new Date();
58
+ }
59
+
60
+ /**
61
+ * Set status to warning
62
+ */
63
+ public markWarning(message: string): void {
64
+ this.updateStatus(COMPONENT_STATUS_LEVELS.WARNING, message);
65
+ }
66
+
67
+ /**
68
+ * Set status to loading
69
+ */
70
+ public markLoading(message?: string): void {
71
+ this.updateStatus(COMPONENT_STATUS_LEVELS.LOADING, message || 'Component is loading');
72
+ }
73
+
74
+ /**
75
+ * Check if component is healthy
76
+ */
77
+ public isHealthy(): boolean {
78
+ return this.status === COMPONENT_STATUS_LEVELS.HEALTHY;
79
+ }
80
+
81
+ /**
82
+ * Check if component has an error
83
+ */
84
+ public hasError(): boolean {
85
+ return this.status === COMPONENT_STATUS_LEVELS.ERROR;
86
+ }
87
+
88
+ /**
89
+ * Check if component is loading
90
+ */
91
+ public isLoading(): boolean {
92
+ return this.status === COMPONENT_STATUS_LEVELS.LOADING;
93
+ }
94
+
95
+ /**
96
+ * Check if component has a warning
97
+ */
98
+ public hasWarning(): boolean {
99
+ return this.status === COMPONENT_STATUS_LEVELS.WARNING;
100
+ }
101
+
102
+ /**
103
+ * Get a summary string of the component status
104
+ */
105
+ public getSummary(): string {
106
+ const statusText = this.status.toUpperCase();
107
+ const messageText = this.message ? `: ${this.message}` : '';
108
+ return `${statusText}${messageText}`;
109
+ }
110
+ }
@@ -0,0 +1,251 @@
1
+ /**
2
+ * ComponentStatusRegistry Class
3
+ *
4
+ * This module contains the ComponentStatusRegistry class which provides
5
+ * centralized management of component health status.
6
+ */
7
+
8
+ import { ComponentStatus } from './ComponentStatus.ts';
9
+ import {
10
+ type ComponentStatusLevel,
11
+ COMPONENT_STATUS_LEVELS,
12
+ type AggregatedComponentStatus,
13
+ type ComponentApplicationStatus,
14
+ } from './types.ts';
15
+ import { crossThreadCollector, StatusAggregator } from './crossThread.ts';
16
+ import { ComponentStatusOperationError } from './errors.ts';
17
+
18
+ /**
19
+ * Map of component names to their status information
20
+ */
21
+ export type ComponentStatusMap = Map<string, ComponentStatus>;
22
+
23
+ /**
24
+ * Component Status Registry Class
25
+ * Provides a centralized registry for managing component health status
26
+ */
27
+ export class ComponentStatusRegistry {
28
+ private statusMap: ComponentStatusMap = new Map();
29
+
30
+ /**
31
+ * Reset the component status registry, clearing all existing status data
32
+ * This should be called when the component system starts up
33
+ */
34
+ public reset(): void {
35
+ this.statusMap = new Map();
36
+ }
37
+
38
+ /**
39
+ * Register or update component health status
40
+ * This function allows components to report their own health status
41
+ */
42
+ public setStatus(
43
+ componentName: string,
44
+ status: ComponentStatusLevel,
45
+ message?: string,
46
+ error?: Error | string
47
+ ): void {
48
+ if (!componentName || typeof componentName !== 'string') {
49
+ throw new ComponentStatusOperationError(
50
+ String(componentName),
51
+ 'setStatus',
52
+ 'Component name must be a non-empty string'
53
+ );
54
+ }
55
+
56
+ if (!Object.values(COMPONENT_STATUS_LEVELS).includes(status)) {
57
+ throw new ComponentStatusOperationError(
58
+ componentName,
59
+ 'setStatus',
60
+ `Invalid status level: ${status}. Must be one of: ${Object.values(COMPONENT_STATUS_LEVELS).join(', ')}`
61
+ );
62
+ }
63
+
64
+ this.statusMap.set(componentName, new ComponentStatus(status, message, error));
65
+ }
66
+
67
+ /**
68
+ * Get the current status of a component
69
+ */
70
+ public getStatus(componentName: string): ComponentStatus | undefined {
71
+ return this.statusMap.get(componentName);
72
+ }
73
+
74
+ /**
75
+ * Get all component statuses
76
+ */
77
+ public getAllStatuses(): ComponentStatusMap {
78
+ return this.statusMap;
79
+ }
80
+
81
+ /**
82
+ * Report component as healthy
83
+ */
84
+ public reportHealthy(componentName: string, message?: string): void {
85
+ this.setStatus(componentName, COMPONENT_STATUS_LEVELS.HEALTHY, message);
86
+ }
87
+
88
+ /**
89
+ * Report component error
90
+ */
91
+ public reportError(componentName: string, error: Error | string, message?: string): void {
92
+ this.setStatus(componentName, COMPONENT_STATUS_LEVELS.ERROR, message, error);
93
+ }
94
+
95
+ /**
96
+ * Report component warning
97
+ */
98
+ public reportWarning(componentName: string, message: string): void {
99
+ this.setStatus(componentName, COMPONENT_STATUS_LEVELS.WARNING, message);
100
+ }
101
+
102
+ /**
103
+ * Component Lifecycle Management
104
+ */
105
+
106
+ /**
107
+ * Initialize component as loading - call this when component loading begins
108
+ */
109
+ public initializeLoading(componentName: string, message?: string): void {
110
+ this.setStatus(componentName, COMPONENT_STATUS_LEVELS.LOADING, message || 'Component is loading');
111
+ }
112
+
113
+ /**
114
+ * Mark component as successfully loaded
115
+ */
116
+ public markLoaded(componentName: string, message?: string): void {
117
+ this.setStatus(componentName, COMPONENT_STATUS_LEVELS.HEALTHY, message || 'Component loaded successfully');
118
+ }
119
+
120
+ /**
121
+ * Mark component as failed to load
122
+ */
123
+ public markFailed(componentName: string, error: Error | string, message?: string): void {
124
+ this.setStatus(componentName, COMPONENT_STATUS_LEVELS.ERROR, message, error);
125
+ }
126
+
127
+ /**
128
+ * Get all components with a specific status level
129
+ */
130
+ public getComponentsByStatus(statusLevel: ComponentStatusLevel): Array<{ name: string; status: ComponentStatus }> {
131
+ const result: Array<{ name: string; status: ComponentStatus }> = [];
132
+ for (const [name, status] of this.statusMap) {
133
+ if (status.status === statusLevel) {
134
+ result.push({ name, status });
135
+ }
136
+ }
137
+ return result;
138
+ }
139
+
140
+ /**
141
+ * Get a summary of all component statuses
142
+ */
143
+ public getStatusSummary(): Record<ComponentStatusLevel, number> {
144
+ const summary: Record<ComponentStatusLevel, number> = {
145
+ [COMPONENT_STATUS_LEVELS.HEALTHY]: 0,
146
+ [COMPONENT_STATUS_LEVELS.ERROR]: 0,
147
+ [COMPONENT_STATUS_LEVELS.WARNING]: 0,
148
+ [COMPONENT_STATUS_LEVELS.LOADING]: 0,
149
+ [COMPONENT_STATUS_LEVELS.UNKNOWN]: 0,
150
+ };
151
+
152
+ for (const status of this.statusMap.values()) {
153
+ summary[status.status]++;
154
+ }
155
+
156
+ return summary;
157
+ }
158
+
159
+ /**
160
+ * Static method to get aggregated component statuses from all threads
161
+ * Returns a Map with one entry per component showing overall status and thread distribution
162
+ */
163
+ public static async getAggregatedFromAllThreads(
164
+ registry: ComponentStatusRegistry
165
+ ): Promise<Map<string, AggregatedComponentStatus>> {
166
+ const allStatuses = await crossThreadCollector.collect(registry);
167
+ return StatusAggregator.aggregate(allStatuses);
168
+ }
169
+
170
+ /**
171
+ * Get aggregated status for a specific component and all its sub-components
172
+ * This method handles both exact matches and sub-component aggregation
173
+ *
174
+ * @param componentName - The component name to look up (e.g., "application-template", "http")
175
+ * @param consolidatedStatuses - Pre-fetched consolidated statuses from all threads (optional, will fetch if not provided)
176
+ * @returns Aggregated status information for the component
177
+ */
178
+ public async getAggregatedStatusFor(
179
+ componentName: string,
180
+ consolidatedStatuses?: Map<string, AggregatedComponentStatus>
181
+ ): Promise<ComponentApplicationStatus> {
182
+ // Get consolidated statuses from all threads if not provided
183
+ if (!consolidatedStatuses) {
184
+ consolidatedStatuses = await ComponentStatusRegistry.getAggregatedFromAllThreads(this);
185
+ }
186
+
187
+ // Collect all statuses related to this component
188
+ const allStatuses = [];
189
+ const componentPrefix = componentName + '.';
190
+
191
+ // Add exact match if exists
192
+ const exactMatch = consolidatedStatuses.get(componentName);
193
+ if (exactMatch) {
194
+ allStatuses.push({ key: componentName, ...exactMatch });
195
+ }
196
+
197
+ // Add sub-component statuses
198
+ for (const [statusKey, statusValue] of consolidatedStatuses) {
199
+ if (statusKey.startsWith(componentPrefix)) {
200
+ allStatuses.push({ key: statusKey, ...statusValue });
201
+ }
202
+ }
203
+
204
+ if (allStatuses.length === 0) {
205
+ // No status found at all
206
+ return {
207
+ status: COMPONENT_STATUS_LEVELS.UNKNOWN,
208
+ message: 'The component has not been loaded yet (may need a restart)',
209
+ lastChecked: { workers: {} },
210
+ };
211
+ }
212
+
213
+ // Aggregate all statuses
214
+ const hasErrors = allStatuses.some((s) => s.status === COMPONENT_STATUS_LEVELS.ERROR);
215
+ const hasLoading = allStatuses.some((s) => s.status === COMPONENT_STATUS_LEVELS.LOADING);
216
+
217
+ const overallStatus = hasErrors
218
+ ? COMPONENT_STATUS_LEVELS.ERROR
219
+ : hasLoading
220
+ ? COMPONENT_STATUS_LEVELS.LOADING
221
+ : COMPONENT_STATUS_LEVELS.HEALTHY;
222
+
223
+ // Show details if anything is not healthy
224
+ let overallMessage = 'All components loaded successfully';
225
+ const details: Record<string, { status: ComponentStatusLevel; message?: string }> = {};
226
+
227
+ if (hasErrors || hasLoading) {
228
+ const problemStatuses = allStatuses.filter(
229
+ (s) => s.status === COMPONENT_STATUS_LEVELS.ERROR || s.status === COMPONENT_STATUS_LEVELS.LOADING
230
+ );
231
+ overallMessage = problemStatuses.map((s) => `${s.key}: ${s.latestMessage || s.status}`).join('; ');
232
+
233
+ // Include details for debugging
234
+ for (const status of allStatuses) {
235
+ if (status.status !== COMPONENT_STATUS_LEVELS.HEALTHY) {
236
+ details[status.key] = {
237
+ status: status.status,
238
+ message: status.latestMessage,
239
+ };
240
+ }
241
+ }
242
+ }
243
+
244
+ return {
245
+ status: overallStatus,
246
+ message: overallMessage,
247
+ ...(Object.keys(details).length > 0 && { details }),
248
+ lastChecked: allStatuses[0]?.lastChecked || { workers: {} },
249
+ };
250
+ }
251
+ }