@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,658 @@
1
+ 'use strict';
2
+
3
+ const path = require('node:path');
4
+ const { isMainThread } = require('node:worker_threads');
5
+ const fs = require('fs-extra');
6
+ const fg = require('fast-glob');
7
+ const normalize = require('normalize-path');
8
+ const validator = require('./operationsValidation.js');
9
+ const log = require('../utility/logging/harper_logger.js');
10
+ const hdbTerms = require('../utility/hdbTerms.ts');
11
+ const env = require('../utility/environment/environmentManager.js');
12
+ const configUtils = require('../config/configUtils.js');
13
+ const hdbUtils = require('../utility/common_utils.js');
14
+ const { handleHDBError, hdbErrors } = require('../utility/errors/hdbError.js');
15
+ const { HDB_ERROR_MSGS, HTTP_STATUS_CODES } = hdbErrors;
16
+ const manageThreads = require('../server/threads/manageThreads.js');
17
+ const { packageDirectory } = require('../components/packageComponent.ts');
18
+ const { Resources } = require('../resources/Resources.ts');
19
+ const { Application, prepareApplication } = require('./Application.ts');
20
+ const { server } = require('../server/Server.ts');
21
+
22
+ /**
23
+ * Read the settings.js file and return the
24
+ *
25
+ * @return Object.<String>
26
+ */
27
+ function customFunctionsStatus() {
28
+ log.trace(`getting custom api status`);
29
+ let response = {};
30
+
31
+ try {
32
+ response = {
33
+ port: env.get(hdbTerms.CONFIG_PARAMS.HTTP_PORT),
34
+ directory: env.get(hdbTerms.CONFIG_PARAMS.COMPONENTSROOT),
35
+ is_enabled: true,
36
+ };
37
+ } catch (err) {
38
+ throw handleHDBError(
39
+ new Error(),
40
+ HDB_ERROR_MSGS.FUNCTION_STATUS,
41
+ HTTP_STATUS_CODES.INTERNAL_SERVER_ERROR,
42
+ log.ERR,
43
+ err
44
+ );
45
+ }
46
+ return response;
47
+ }
48
+
49
+ /**
50
+ * Read the user-defined custom_functions/routes directory and return the file names
51
+ *
52
+ * @return Array.<String>
53
+ */
54
+ function getCustomFunctions() {
55
+ log.trace(`getting custom api endpoints`);
56
+ let response = {};
57
+ const dir = env.get(hdbTerms.CONFIG_PARAMS.COMPONENTSROOT);
58
+
59
+ try {
60
+ const projectFolders = fg.sync(normalize(`${dir}/*`), { onlyDirectories: true });
61
+
62
+ projectFolders.forEach((projectFolder) => {
63
+ const folderName = projectFolder.split('/').pop();
64
+ response[folderName] = {
65
+ routes: fg
66
+ .sync(normalize(`${projectFolder}/routes/*.js`))
67
+ .map((filepath) => filepath.split('/').pop().split('.js')[0]),
68
+ helpers: fg
69
+ .sync(normalize(`${projectFolder}/helpers/*.js`))
70
+ .map((filepath) => filepath.split('/').pop().split('.js')[0]),
71
+ };
72
+ });
73
+ } catch (err) {
74
+ throw handleHDBError(
75
+ new Error(),
76
+ HDB_ERROR_MSGS.GET_FUNCTIONS,
77
+ HTTP_STATUS_CODES.INTERNAL_SERVER_ERROR,
78
+ log.ERR,
79
+ err
80
+ );
81
+ }
82
+ return response;
83
+ }
84
+
85
+ /**
86
+ * Read the specified functionName file in the custom_functions/routes directory and return the file content
87
+ *
88
+ * @param {NodeObject} req
89
+ * @returns {string}
90
+ */
91
+ function getCustomFunction(req) {
92
+ if (req.project) {
93
+ req.project = path.parse(req.project).name;
94
+ }
95
+
96
+ if (req.file) {
97
+ req.file = path.parse(req.file).name;
98
+ }
99
+
100
+ const validation = validator.getDropCustomFunctionValidator(req);
101
+ if (validation) {
102
+ throw handleHDBError(validation, validation.message, HTTP_STATUS_CODES.BAD_REQUEST);
103
+ }
104
+
105
+ log.trace(`getting custom api endpoint file content`);
106
+ const cfDir = env.get(hdbTerms.CONFIG_PARAMS.COMPONENTSROOT);
107
+ const { project, type, file } = req;
108
+ const fileLocation = path.join(cfDir, project, type, file + '.js');
109
+
110
+ try {
111
+ return fs.readFileSync(fileLocation, { encoding: 'utf8' });
112
+ } catch (err) {
113
+ throw handleHDBError(
114
+ new Error(),
115
+ HDB_ERROR_MSGS.GET_FUNCTION,
116
+ HTTP_STATUS_CODES.INTERNAL_SERVER_ERROR,
117
+ log.ERR,
118
+ err
119
+ );
120
+ }
121
+ }
122
+
123
+ /**
124
+ * Write the supplied function_content to the provided functionName file in the custom_functions/routes directory
125
+ *
126
+ * @param {NodeObject} req
127
+ * @returns {{message:string}}
128
+ */
129
+ async function setCustomFunction(req) {
130
+ if (req.project) {
131
+ req.project = path.parse(req.project).name;
132
+ }
133
+
134
+ if (req.file) {
135
+ req.file = path.parse(req.file).name;
136
+ }
137
+
138
+ const validation = validator.setCustomFunctionValidator(req);
139
+ if (validation) {
140
+ throw handleHDBError(validation, validation.message, HTTP_STATUS_CODES.BAD_REQUEST);
141
+ }
142
+
143
+ log.trace(`setting custom function file content`);
144
+ const cfDir = env.get(hdbTerms.CONFIG_PARAMS.COMPONENTSROOT);
145
+ const { project, type, file, function_content } = req;
146
+
147
+ try {
148
+ fs.outputFileSync(path.join(cfDir, project, type, file + '.js'), function_content);
149
+ let response = await server.replication.replicateOperation(req);
150
+ response.message = `Successfully updated custom function: ${file}.js`;
151
+ return response;
152
+ } catch (err) {
153
+ throw handleHDBError(
154
+ new Error(),
155
+ HDB_ERROR_MSGS.SET_FUNCTION,
156
+ HTTP_STATUS_CODES.INTERNAL_SERVER_ERROR,
157
+ log.ERR,
158
+ err
159
+ );
160
+ }
161
+ }
162
+
163
+ /**
164
+ * Delete the provided functionName file from the custom_functions/routes directory
165
+ *
166
+ * @param {NodeObject} req
167
+ * @returns {{message:string}}
168
+ */
169
+ async function dropCustomFunction(req) {
170
+ if (req.project) {
171
+ req.project = path.parse(req.project).name;
172
+ }
173
+
174
+ if (req.file) {
175
+ req.file = path.parse(req.file).name;
176
+ }
177
+
178
+ const validation = validator.getDropCustomFunctionValidator(req);
179
+ if (validation) {
180
+ throw handleHDBError(validation, validation.message, HTTP_STATUS_CODES.BAD_REQUEST);
181
+ }
182
+
183
+ log.trace(`dropping custom function file`);
184
+ const cfDir = env.get(hdbTerms.CONFIG_PARAMS.COMPONENTSROOT);
185
+ const { project, type, file } = req;
186
+
187
+ try {
188
+ fs.unlinkSync(path.join(cfDir, project, type, file + '.js'));
189
+ let response = await server.replication.replicateOperation(req);
190
+ response.message = `Successfully deleted custom function: ${file}.js`;
191
+ return response;
192
+ } catch (err) {
193
+ throw handleHDBError(
194
+ new Error(),
195
+ HDB_ERROR_MSGS.DROP_FUNCTION,
196
+ HTTP_STATUS_CODES.INTERNAL_SERVER_ERROR,
197
+ log.ERR,
198
+ err
199
+ );
200
+ }
201
+ }
202
+
203
+ /**
204
+ * Create a new project folder in the components folder and copy the template into it
205
+ * @param {NodeObject} req
206
+ * @returns {{message:string}}
207
+ */
208
+ async function addComponent(req) {
209
+ if (req.project) {
210
+ req.project = path.parse(req.project).name;
211
+ }
212
+
213
+ const validation = validator.addComponentValidator(req);
214
+ if (validation) {
215
+ throw handleHDBError(validation, validation.message, HTTP_STATUS_CODES.BAD_REQUEST);
216
+ }
217
+
218
+ log.trace(`adding component`);
219
+ const cfDir = env.get(hdbTerms.CONFIG_PARAMS.COMPONENTSROOT);
220
+ const { project, install_command, install_timeout } = req;
221
+
222
+ const template = req.template || 'https://github.com/harperdb/application-template';
223
+
224
+ try {
225
+ const projectDir = path.join(cfDir, project);
226
+ fs.mkdirSync(projectDir, { recursive: true });
227
+ const application = new Application({
228
+ name: project,
229
+ packageIdentifier: template,
230
+ install: {
231
+ command: install_command,
232
+ timeout: install_timeout,
233
+ },
234
+ });
235
+ await prepareApplication(application);
236
+ let response = await server.replication.replicateOperation(req);
237
+ response.message = `Successfully added project: ${project}`;
238
+ return response;
239
+ } catch (err) {
240
+ throw handleHDBError(
241
+ new Error(),
242
+ HDB_ERROR_MSGS.ADD_FUNCTION,
243
+ HTTP_STATUS_CODES.INTERNAL_SERVER_ERROR,
244
+ log.ERR,
245
+ err
246
+ );
247
+ }
248
+ }
249
+
250
+ /**
251
+ * Remove a project folder from the custom_functions folder
252
+ *
253
+ * @param {NodeObject} req
254
+ * @returns {string}
255
+ */
256
+ async function dropCustomFunctionProject(req) {
257
+ if (req.project) {
258
+ req.project = path.parse(req.project).name;
259
+ }
260
+
261
+ const validation = validator.dropCustomFunctionProjectValidator(req);
262
+ if (validation) {
263
+ throw handleHDBError(validation, validation.message, HTTP_STATUS_CODES.BAD_REQUEST);
264
+ }
265
+
266
+ log.trace(`dropping custom function project`);
267
+ const cfDir = env.get(hdbTerms.CONFIG_PARAMS.COMPONENTSROOT);
268
+ const { project } = req;
269
+
270
+ let apps = env.get(hdbTerms.CONFIG_PARAMS.APPS);
271
+ if (!hdbUtils.isEmptyOrZeroLength(apps)) {
272
+ let appFound = false;
273
+ for (const [i, app] of apps.entries()) {
274
+ if (app.name === project) {
275
+ apps.splice(i, 1);
276
+ appFound = true;
277
+ break;
278
+ }
279
+ }
280
+
281
+ if (appFound) {
282
+ configUtils.updateConfigValue(hdbTerms.CONFIG_PARAMS.APPS, apps);
283
+
284
+ return `Successfully deleted project: ${project}`;
285
+ }
286
+ }
287
+
288
+ try {
289
+ const projectDir = path.join(cfDir, project);
290
+ fs.rmSync(projectDir, { recursive: true });
291
+ let response = await server.replication.replicateOperation(req);
292
+ response.message = `Successfully deleted project: ${project}`;
293
+ return response;
294
+ } catch (err) {
295
+ throw handleHDBError(
296
+ new Error(),
297
+ HDB_ERROR_MSGS.DROP_FUNCTION_PROJECT,
298
+ HTTP_STATUS_CODES.INTERNAL_SERVER_ERROR,
299
+ log.ERR,
300
+ err
301
+ );
302
+ }
303
+ }
304
+
305
+ /**
306
+ * Will package a component into a temp tar file then output that file as a base64 string.
307
+ * Req can accept a skip_node_modules boolean which will skip the node mods when creating temp tar file.
308
+ * @param req
309
+ * @returns {Promise<{payload: *, project}>}
310
+ */
311
+ async function packageComponent(req) {
312
+ if (req.project) {
313
+ req.project = path.parse(req.project).name;
314
+ }
315
+
316
+ const validation = validator.packageComponentValidator(req);
317
+ if (validation) {
318
+ throw handleHDBError(validation, validation.message, HTTP_STATUS_CODES.BAD_REQUEST);
319
+ }
320
+
321
+ const cfDir = env.get(hdbTerms.CONFIG_PARAMS.COMPONENTSROOT);
322
+ const { project } = req;
323
+ log.trace(`packaging component`, project);
324
+
325
+ let pathToProject;
326
+ try {
327
+ pathToProject = await fs.realpath(path.join(cfDir, project));
328
+ } catch (err) {
329
+ if (err.code !== hdbTerms.NODE_ERROR_CODES.ENOENT) throw err;
330
+ try {
331
+ pathToProject = await fs.realpath(path.join(env.get(hdbTerms.CONFIG_PARAMS.ROOTPATH), 'node_modules', project));
332
+ } catch (err) {
333
+ if (err.code === hdbTerms.NODE_ERROR_CODES.ENOENT) throw new Error(`Unable to locate project '${project}'`);
334
+ }
335
+ }
336
+
337
+ const payload = (await packageDirectory(pathToProject, req)).toString('base64');
338
+
339
+ // return the package payload as base64-encoded string
340
+ return { project, payload };
341
+ }
342
+
343
+ /**
344
+ * Can deploy a component in multiple ways. If a 'package' is provided all it will do is write that package to
345
+ * harperdb-config, when HDB is restarted the package will be installed in hdb/nodeModules. If a base64 encoded string is passed it
346
+ * will write string to a temp tar file and extract that file into the deployed project in hdb/components.
347
+ * @param req
348
+ * @returns {Promise<string>}
349
+ */
350
+ async function deployComponent(req) {
351
+ if (req.project) {
352
+ req.project = path.parse(req.project).name;
353
+ } else if (req.package) {
354
+ req.project = getProjectNameFromPackage(req.package);
355
+ }
356
+
357
+ const validation = validator.deployComponentValidator(req);
358
+ if (validation) {
359
+ throw handleHDBError(validation, validation.message, HTTP_STATUS_CODES.BAD_REQUEST);
360
+ }
361
+
362
+ // Write to root config if the request contains a package identifier
363
+ // TODO: how can we keep record of the `payload`? Its often too large to stuff into a config file; especially the root config. Maybe we can write it to a file and reference that way?
364
+ if (req.package) {
365
+ // Check if trying to overwrite a core component (requires force)
366
+ // Lazy-load to avoid circular dependency with componentLoader
367
+ const { TRUSTED_RESOURCE_PLUGINS } = require('./componentLoader.ts');
368
+ if (TRUSTED_RESOURCE_PLUGINS[req.project] && !req.force) {
369
+ throw handleHDBError(
370
+ new Error(),
371
+ `Cannot deploy component with name '${req.project}': this is a protected core component name. Use force: true to overwrite.`,
372
+ HTTP_STATUS_CODES.CONFLICT
373
+ );
374
+ }
375
+
376
+ const applicationConfig = { package: req.package };
377
+ // Avoid writing an empty `install:` block
378
+ if (req.install_command || req.install_timeout) {
379
+ applicationConfig.install = {
380
+ command: req.install_command,
381
+ timeout: req.install_timeout,
382
+ };
383
+ }
384
+ await configUtils.addConfig(req.project, applicationConfig);
385
+ }
386
+
387
+ const application = new Application({
388
+ name: req.project,
389
+ payload: req.payload,
390
+ packageIdentifier: req.package,
391
+ install: {
392
+ command: req.install_command,
393
+ timeout: req.install_timeout,
394
+ },
395
+ });
396
+
397
+ await prepareApplication(application);
398
+
399
+ // the main thread should never actually load component, just do a deploy
400
+ if (isMainThread) return;
401
+
402
+ // now we attempt to actually load the component in case there is
403
+ // an error we can immediately detect and report
404
+ const pseudoResources = new Resources();
405
+ pseudoResources.isWorker = true;
406
+
407
+ if (!process.env.HARPER_SAFE_MODE) {
408
+ const componentLoader = require('./componentLoader.ts');
409
+ let lastError;
410
+ componentLoader.setErrorReporter((error) => (lastError = error));
411
+ await componentLoader.loadComponent(
412
+ application.dirPath,
413
+ pseudoResources,
414
+ undefined,
415
+ false,
416
+ undefined,
417
+ false,
418
+ req.project
419
+ );
420
+
421
+ if (lastError) throw lastError;
422
+ }
423
+ const rollingRestart = req.restart === 'rolling';
424
+ // if doing a rolling restart set restart to false so that other nodes don't also restart.
425
+ req.restart = rollingRestart ? false : req.restart;
426
+ let response = await server.replication.replicateOperation(req);
427
+ if (req.restart === true) {
428
+ manageThreads.restartWorkers('http');
429
+ response.message = `Successfully deployed: ${application.name}, restarting Harper`;
430
+ } else if (rollingRestart) {
431
+ const serverUtilities = require('../server/serverHelpers/serverUtilities.ts');
432
+ const jobResponse = await serverUtilities.executeJob({
433
+ operation: 'restart_service',
434
+ service: 'http',
435
+ replicated: true,
436
+ });
437
+
438
+ response.restartJobId = jobResponse.job_id;
439
+ response.message = `Successfully deployed: ${application.name}, restarting Harper`;
440
+ } else response.message = `Successfully deployed: ${application.name}`;
441
+
442
+ return response;
443
+ }
444
+
445
+ /**
446
+ * Extracts a project name from the specified package name or URL
447
+ * @param {string} pkg - Package name or URL
448
+ * @returns {string} The project name
449
+ */
450
+ function getProjectNameFromPackage(pkg) {
451
+ if (pkg.startsWith('git+ssh://')) {
452
+ return path.basename(pkg.split('#')[0].replace(/\.git$/, ''));
453
+ }
454
+
455
+ if (pkg.startsWith('http://') || pkg.startsWith('https://')) {
456
+ return path.basename(new URL(pkg.replace(/\.git$/, '')).pathname);
457
+ }
458
+
459
+ if (pkg.startsWith('file://')) {
460
+ try {
461
+ const { name } = JSON.parse(fs.readFileSync(path.join(pkg, 'package.json'), 'utf8'));
462
+ return path.basename(name);
463
+ } catch {
464
+ //
465
+ }
466
+ }
467
+
468
+ return path.basename(pkg);
469
+ }
470
+
471
+ /**
472
+ * Gets a JSON directory tree of the components dir and all nested files/folders
473
+ * @returns {Promise<*>}
474
+ */
475
+ async function getComponents() {
476
+ // Recursive function that will traverse the components dir and build json
477
+ // directory tree as it goes.
478
+ const rootConfig = configUtils.getConfiguration();
479
+ const walkDir = async (dir, result) => {
480
+ try {
481
+ const list = await fs.readdir(dir, { withFileTypes: true });
482
+ for (let item of list) {
483
+ const itemName = item.name;
484
+ if (itemName === 'node_modules') continue;
485
+ const itemPath = path.join(dir, itemName);
486
+ if (item.isDirectory() || item.isSymbolicLink()) {
487
+ let res = {
488
+ name: itemName,
489
+ entries: [],
490
+ };
491
+ result.entries.push(res);
492
+ await walkDir(itemPath, res);
493
+ } else {
494
+ const stats = await fs.stat(itemPath);
495
+ const res = {
496
+ name: path.basename(itemName),
497
+ mtime: stats.mtime,
498
+ size: stats.size,
499
+ };
500
+ result.entries.push(res);
501
+ }
502
+ }
503
+ return result;
504
+ } catch (error) {
505
+ log.warn('Error loading package', error);
506
+ return { error: error.toString(), entries: [] };
507
+ }
508
+ };
509
+
510
+ const results = await walkDir(env.get(hdbTerms.CONFIG_PARAMS.COMPONENTSROOT), {
511
+ name: env.get(hdbTerms.CONFIG_PARAMS.COMPONENTSROOT).split(path.sep).slice(-1).pop(),
512
+ entries: [],
513
+ });
514
+ for (let entry of results.entries) {
515
+ const sourcePackage = rootConfig[entry.name]?.package;
516
+ if (sourcePackage) entry.package = sourcePackage;
517
+ }
518
+
519
+ const { internal: statusInternal } = require('./status/index.ts');
520
+ let consolidatedStatuses;
521
+
522
+ try {
523
+ consolidatedStatuses = await statusInternal.ComponentStatusRegistry.getAggregatedFromAllThreads(
524
+ statusInternal.componentStatusRegistry
525
+ );
526
+ } catch (error) {
527
+ // If we can't get status from threads, continue with unknown statuses
528
+ log.debug(`Failed to get component status from threads: ${error.message}`);
529
+ }
530
+
531
+ for (const component of results.entries) {
532
+ try {
533
+ component.status = await statusInternal.componentStatusRegistry.getAggregatedStatusFor(
534
+ component.name,
535
+ consolidatedStatuses
536
+ );
537
+ } catch (error) {
538
+ log.debug(`Failed to get aggregated status for component ${component.name}: ${error.message}`);
539
+ component.status = {
540
+ status: 'unknown',
541
+ message: 'Failed to retrieve component status',
542
+ lastChecked: { workers: {} },
543
+ };
544
+ }
545
+ }
546
+ return results;
547
+ }
548
+
549
+ /**
550
+ * Gets the contents of a component file
551
+ * @param req
552
+ * @returns {Promise<*>}
553
+ */
554
+ async function getComponentFile(req) {
555
+ const validation = validator.getComponentFileValidator(req);
556
+ if (validation) {
557
+ throw handleHDBError(validation, validation.message, HTTP_STATUS_CODES.BAD_REQUEST);
558
+ }
559
+
560
+ const compRoot = env.get(hdbTerms.CONFIG_PARAMS.COMPONENTSROOT);
561
+ const options = req.encoding ? { encoding: req.encoding } : { encoding: 'utf8' };
562
+
563
+ try {
564
+ const stats = await fs.stat(path.join(compRoot, req.project, req.file));
565
+ return {
566
+ message: await fs.readFile(path.join(compRoot, req.project, req.file), options),
567
+ size: stats.size,
568
+ birthtime: stats.birthtime,
569
+ mtime: stats.mtime,
570
+ };
571
+ } catch (err) {
572
+ if (err.code === hdbTerms.NODE_ERROR_CODES.ENOENT) {
573
+ throw new Error(`Component file not found '${path.join(req.project, req.file)}'`);
574
+ }
575
+ throw err;
576
+ }
577
+ }
578
+
579
+ /**
580
+ * Used to update or create a component file
581
+ * @param req
582
+ * @returns {Promise<{message:string}>}
583
+ */
584
+ async function setComponentFile(req) {
585
+ const validation = validator.setComponentFileValidator(req);
586
+ if (validation) {
587
+ throw handleHDBError(validation, validation.message, HTTP_STATUS_CODES.BAD_REQUEST);
588
+ }
589
+
590
+ const options = req.encoding ? { encoding: req.encoding } : { encoding: 'utf8' };
591
+ const pathToComp = path.join(env.get(hdbTerms.CONFIG_PARAMS.COMPONENTSROOT), req.project, req.file);
592
+ if (req.payload !== undefined) {
593
+ await fs.ensureFile(pathToComp);
594
+ await fs.outputFile(pathToComp, req.payload, options);
595
+ } else {
596
+ await fs.ensureDir(pathToComp);
597
+ }
598
+ let response = await server.replication.replicateOperation(req);
599
+ response.message = `Successfully set component: ` + req.file;
600
+ return response;
601
+ }
602
+
603
+ /**
604
+ * Deletes a component dir/file
605
+ * @param req
606
+ * @returns {Promise<{message:string}>}
607
+ */
608
+ async function dropComponent(req) {
609
+ const validation = validator.dropComponentFileValidator(req);
610
+ if (validation) {
611
+ throw handleHDBError(validation, validation.message, HTTP_STATUS_CODES.BAD_REQUEST);
612
+ }
613
+
614
+ const { project, file } = req;
615
+ const projectPath = req.file ? path.join(project, file) : project;
616
+ const pathToComponent = path.join(env.get(hdbTerms.CONFIG_PARAMS.COMPONENTSROOT), projectPath);
617
+
618
+ const componentSymlink = path.join(env.get(hdbTerms.CONFIG_PARAMS.ROOTPATH), 'node_modules', project);
619
+ if (await fs.pathExists(componentSymlink)) {
620
+ await fs.unlink(componentSymlink);
621
+ }
622
+
623
+ if (await fs.pathExists(pathToComponent)) {
624
+ await fs.remove(pathToComponent);
625
+ }
626
+
627
+ // Remove the component from the package.json file
628
+ const packageJsonPath = path.join(env.get(hdbTerms.CONFIG_PARAMS.ROOTPATH), 'package.json');
629
+ if (await fs.pathExists(packageJsonPath)) {
630
+ const packageJson = JSON.parse(await fs.readFile(packageJsonPath, 'utf8'));
631
+ if (packageJson?.dependencies?.[project]) {
632
+ delete packageJson.dependencies[project];
633
+ }
634
+ await fs.writeFile(packageJsonPath, JSON.stringify(packageJson, null, 2), 'utf8');
635
+ }
636
+
637
+ configUtils.deleteConfigFromFile([project]);
638
+ let response = await server.replication.replicateOperation(req);
639
+ if (req.restart === true) {
640
+ manageThreads.restartWorkers('http');
641
+ response.message = `Successfully dropped: ${projectPath}, restarting Harper`;
642
+ } else response.message = `Successfully dropped: ${projectPath}`;
643
+ return response;
644
+ }
645
+
646
+ exports.customFunctionsStatus = customFunctionsStatus;
647
+ exports.getCustomFunctions = getCustomFunctions;
648
+ exports.getCustomFunction = getCustomFunction;
649
+ exports.setCustomFunction = setCustomFunction;
650
+ exports.dropCustomFunction = dropCustomFunction;
651
+ exports.addComponent = addComponent;
652
+ exports.dropCustomFunctionProject = dropCustomFunctionProject;
653
+ exports.packageComponent = packageComponent;
654
+ exports.deployComponent = deployComponent;
655
+ exports.getComponents = getComponents;
656
+ exports.getComponentFile = getComponentFile;
657
+ exports.setComponentFile = setComponentFile;
658
+ exports.dropComponent = dropComponent;