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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (444) hide show
  1. package/bin/BinObjects.js +17 -0
  2. package/bin/cliOperations.js +157 -0
  3. package/bin/copyDb.ts +280 -0
  4. package/bin/harper.js +156 -0
  5. package/bin/install.js +15 -0
  6. package/bin/lite.js +5 -0
  7. package/bin/restart.js +201 -0
  8. package/bin/run.js +409 -0
  9. package/bin/status.js +65 -0
  10. package/bin/stop.js +22 -0
  11. package/bin/upgrade.js +134 -0
  12. package/components/Application.ts +646 -0
  13. package/components/ApplicationScope.ts +49 -0
  14. package/components/Component.ts +53 -0
  15. package/components/ComponentV1.ts +342 -0
  16. package/components/DEFAULT_CONFIG.ts +18 -0
  17. package/components/EntryHandler.ts +227 -0
  18. package/components/Logger.ts +14 -0
  19. package/components/OptionsWatcher.ts +354 -0
  20. package/components/PluginModule.ts +6 -0
  21. package/components/Scope.ts +329 -0
  22. package/components/componentLoader.ts +529 -0
  23. package/components/deriveCommonPatternBase.ts +31 -0
  24. package/components/deriveGlobOptions.ts +44 -0
  25. package/components/deriveURLPath.ts +57 -0
  26. package/components/operations.js +658 -0
  27. package/components/operationsValidation.js +246 -0
  28. package/components/packageComponent.ts +39 -0
  29. package/components/requestRestart.ts +26 -0
  30. package/components/resolveBaseURLPath.ts +38 -0
  31. package/components/status/ComponentStatus.ts +110 -0
  32. package/components/status/ComponentStatusRegistry.ts +251 -0
  33. package/components/status/api.ts +153 -0
  34. package/components/status/crossThread.ts +405 -0
  35. package/components/status/errors.ts +152 -0
  36. package/components/status/index.ts +44 -0
  37. package/components/status/internal.ts +65 -0
  38. package/components/status/registry.ts +12 -0
  39. package/components/status/types.ts +96 -0
  40. package/config/RootConfigWatcher.ts +59 -0
  41. package/config/configHelpers.ts +11 -0
  42. package/config/configUtils.js +967 -0
  43. package/config/harperConfigEnvVars.ts +641 -0
  44. package/dataLayer/CreateAttributeObject.js +25 -0
  45. package/dataLayer/CreateTableObject.js +11 -0
  46. package/dataLayer/DataLayerObjects.js +43 -0
  47. package/dataLayer/DeleteBeforeObject.js +22 -0
  48. package/dataLayer/DeleteObject.js +25 -0
  49. package/dataLayer/DropAttributeObject.js +11 -0
  50. package/dataLayer/GetBackupObject.js +22 -0
  51. package/dataLayer/InsertObject.js +24 -0
  52. package/dataLayer/ReadAuditLogObject.js +24 -0
  53. package/dataLayer/SQLSearch.js +1335 -0
  54. package/dataLayer/SearchByConditionsObject.js +61 -0
  55. package/dataLayer/SearchByHashObject.js +21 -0
  56. package/dataLayer/SearchObject.js +45 -0
  57. package/dataLayer/SqlSearchObject.js +14 -0
  58. package/dataLayer/UpdateObject.js +23 -0
  59. package/dataLayer/UpsertObject.js +23 -0
  60. package/dataLayer/bulkLoad.js +813 -0
  61. package/dataLayer/dataObjects/BulkLoadObjects.js +27 -0
  62. package/dataLayer/dataObjects/UpsertObject.js +23 -0
  63. package/dataLayer/delete.js +164 -0
  64. package/dataLayer/export.js +381 -0
  65. package/dataLayer/getBackup.js +40 -0
  66. package/dataLayer/harperBridge/BridgeMethods.js +81 -0
  67. package/dataLayer/harperBridge/ResourceBridge.ts +633 -0
  68. package/dataLayer/harperBridge/bridgeUtility/insertUpdateReturnObj.js +28 -0
  69. package/dataLayer/harperBridge/bridgeUtility/insertUpdateValidate.js +88 -0
  70. package/dataLayer/harperBridge/harperBridge.js +21 -0
  71. package/dataLayer/harperBridge/lmdbBridge/LMDBBridge.js +119 -0
  72. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/DeleteAuditLogsBeforeResults.js +19 -0
  73. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateAttribute.js +112 -0
  74. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateRecords.js +67 -0
  75. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateSchema.js +31 -0
  76. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateTable.js +94 -0
  77. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDeleteAuditLogsBefore.js +98 -0
  78. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDeleteRecords.js +89 -0
  79. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDropAttribute.js +109 -0
  80. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDropSchema.js +107 -0
  81. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDropTable.js +137 -0
  82. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbFlush.js +35 -0
  83. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbGetBackup.js +111 -0
  84. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbGetDataByHash.js +28 -0
  85. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbGetDataByValue.js +29 -0
  86. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbReadAuditLog.js +207 -0
  87. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbSearchByConditions.js +156 -0
  88. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbSearchByHash.js +21 -0
  89. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbSearchByValue.js +30 -0
  90. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbTransaction.js +19 -0
  91. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbUpdateRecords.js +64 -0
  92. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbUpsertRecords.js +70 -0
  93. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBCreateAttributeObject.js +22 -0
  94. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBDeleteTransactionObject.js +23 -0
  95. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBInsertTransactionObject.js +22 -0
  96. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBTransactionObject.js +23 -0
  97. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBUpdateTransactionObject.js +24 -0
  98. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBUpsertTransactionObject.js +24 -0
  99. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/TableSizeObject.js +25 -0
  100. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/initializeHashSearch.js +21 -0
  101. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/initializePaths.js +157 -0
  102. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbCheckForNewAttributes.js +94 -0
  103. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbCreateTransactionsAuditEnvironment.js +39 -0
  104. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbGetTableSize.js +34 -0
  105. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbProcessRows.js +100 -0
  106. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbSearch.js +371 -0
  107. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbWriteTransaction.js +109 -0
  108. package/dataLayer/hdbInfoController.js +254 -0
  109. package/dataLayer/insert.js +266 -0
  110. package/dataLayer/readAuditLog.js +59 -0
  111. package/dataLayer/schema.js +366 -0
  112. package/dataLayer/schemaDescribe.js +289 -0
  113. package/dataLayer/search.js +60 -0
  114. package/dataLayer/transaction.js +17 -0
  115. package/dataLayer/update.js +124 -0
  116. package/dist/components/Logger.d.ts +12 -0
  117. package/dist/components/Logger.js +3 -0
  118. package/dist/components/Logger.js.map +1 -0
  119. package/dist/components/Scope.d.ts +14 -4
  120. package/dist/components/Scope.js +18 -10
  121. package/dist/components/Scope.js.map +1 -1
  122. package/dist/components/componentLoader.js +16 -9
  123. package/dist/components/componentLoader.js.map +1 -1
  124. package/dist/components/operations.js +2 -2
  125. package/dist/components/operations.js.map +1 -1
  126. package/dist/config/configUtils.d.ts +1 -1
  127. package/dist/config/configUtils.js +1 -1
  128. package/dist/config/configUtils.js.map +1 -1
  129. package/dist/dataLayer/CreateTableObject.d.ts +2 -2
  130. package/dist/dataLayer/CreateTableObject.js +2 -2
  131. package/dist/dataLayer/CreateTableObject.js.map +1 -1
  132. package/dist/dataLayer/delete.d.ts +1 -1
  133. package/dist/dataLayer/schema.js +6 -5
  134. package/dist/dataLayer/schema.js.map +1 -1
  135. package/dist/dataLayer/schemaDescribe.js +1 -1
  136. package/dist/dataLayer/schemaDescribe.js.map +1 -1
  137. package/dist/index.d.ts +1 -1
  138. package/dist/index.js +2 -0
  139. package/dist/index.js.map +1 -1
  140. package/dist/resources/DatabaseTransaction.d.ts +1 -1
  141. package/dist/resources/IterableEventQueue.d.ts +1 -1
  142. package/dist/resources/LMDBTransaction.d.ts +5 -1
  143. package/dist/resources/Resource.d.ts +1 -1
  144. package/dist/resources/RocksIndexStore.d.ts +3 -3
  145. package/dist/resources/RocksTransactionLogStore.d.ts +6 -3
  146. package/dist/resources/Table.d.ts +15 -6
  147. package/dist/resources/Table.js +4 -1
  148. package/dist/resources/Table.js.map +1 -1
  149. package/dist/resources/analytics/read.js +32 -22
  150. package/dist/resources/analytics/read.js.map +1 -1
  151. package/dist/resources/analytics/write.js +3 -6
  152. package/dist/resources/analytics/write.js.map +1 -1
  153. package/dist/resources/auditStore.d.ts +3 -3
  154. package/dist/resources/blob.d.ts +25 -2
  155. package/dist/resources/databases.d.ts +12 -2
  156. package/dist/resources/databases.js +22 -19
  157. package/dist/resources/databases.js.map +1 -1
  158. package/dist/resources/search.js +11 -5
  159. package/dist/resources/search.js.map +1 -1
  160. package/dist/resources/transaction.d.ts +2 -1
  161. package/dist/security/auth.js +1 -1
  162. package/dist/security/auth.js.map +1 -1
  163. package/dist/security/cryptoHash.d.ts +2 -2
  164. package/dist/security/jsLoader.js +243 -66
  165. package/dist/security/jsLoader.js.map +1 -1
  166. package/dist/security/keys.js +4 -5
  167. package/dist/security/keys.js.map +1 -1
  168. package/dist/security/user.js +3 -3
  169. package/dist/security/user.js.map +1 -1
  170. package/dist/server/REST.js +16 -2
  171. package/dist/server/REST.js.map +1 -1
  172. package/dist/server/Server.d.ts +2 -1
  173. package/dist/server/Server.js.map +1 -1
  174. package/dist/server/fastifyRoutes/plugins/hdbCore.d.ts +6 -1
  175. package/dist/server/fastifyRoutes.js +2 -0
  176. package/dist/server/fastifyRoutes.js.map +1 -1
  177. package/dist/server/http.js +12 -6
  178. package/dist/server/http.js.map +1 -1
  179. package/dist/server/jobs/JobObject.d.ts +3 -3
  180. package/dist/server/loadRootComponents.js +1 -0
  181. package/dist/server/loadRootComponents.js.map +1 -1
  182. package/dist/server/operationsServer.js +3 -1
  183. package/dist/server/operationsServer.js.map +1 -1
  184. package/dist/server/serverHelpers/JSONStream.d.ts +3 -3
  185. package/dist/server/serverHelpers/Request.d.ts +5 -5
  186. package/dist/server/serverHelpers/requestTimePlugin.d.ts +1 -1
  187. package/dist/server/threads/manageThreads.d.ts +2 -2
  188. package/dist/server/threads/manageThreads.js +50 -35
  189. package/dist/server/threads/manageThreads.js.map +1 -1
  190. package/dist/server/threads/socketRouter.d.ts +1 -1
  191. package/dist/sqlTranslator/deleteTranslator.d.ts +1 -1
  192. package/dist/utility/AWS/AWSConnector.d.ts +3 -2
  193. package/dist/utility/common_utils.d.ts +3 -3
  194. package/dist/utility/environment/systemInformation.d.ts +1 -0
  195. package/dist/utility/functions/date/dateFunctions.d.ts +11 -11
  196. package/dist/utility/globalSchema.d.ts +1 -1
  197. package/dist/utility/hdbTerms.d.ts +3 -0
  198. package/dist/utility/hdbTerms.js +3 -0
  199. package/dist/utility/hdbTerms.js.map +1 -1
  200. package/dist/utility/installation.d.ts +2 -4
  201. package/dist/utility/installation.js.map +1 -1
  202. package/dist/utility/lmdb/commonUtility.d.ts +1 -0
  203. package/dist/utility/lmdb/deleteUtility.d.ts +1 -0
  204. package/dist/utility/lmdb/environmentUtility.d.ts +1 -0
  205. package/dist/utility/lmdb/searchUtility.d.ts +2 -1
  206. package/dist/utility/lmdb/writeUtility.d.ts +1 -0
  207. package/dist/utility/logging/harper_logger.d.ts +6 -6
  208. package/dist/utility/processManagement/processManagement.d.ts +1 -1
  209. package/dist/utility/processManagement/servicesConfig.d.ts +12 -6
  210. package/dist/validation/common_validators.d.ts +4 -3
  211. package/dist/validation/configValidator.d.ts +3 -2
  212. package/index.d.ts +56 -0
  213. package/index.js +41 -0
  214. package/json/systemSchema.json +373 -0
  215. package/launchServiceScripts/launchHarperDB.js +3 -0
  216. package/launchServiceScripts/utility/checkNodeVersion.js +15 -0
  217. package/package.json +21 -3
  218. package/resources/DatabaseTransaction.ts +378 -0
  219. package/resources/ErrorResource.ts +57 -0
  220. package/resources/IterableEventQueue.ts +94 -0
  221. package/resources/LMDBTransaction.ts +349 -0
  222. package/resources/RecordEncoder.ts +702 -0
  223. package/resources/RequestTarget.ts +134 -0
  224. package/resources/Resource.ts +789 -0
  225. package/resources/ResourceInterface.ts +221 -0
  226. package/resources/ResourceInterfaceV2.ts +53 -0
  227. package/resources/ResourceV2.ts +67 -0
  228. package/resources/Resources.ts +162 -0
  229. package/resources/RocksIndexStore.ts +70 -0
  230. package/resources/RocksTransactionLogStore.ts +352 -0
  231. package/resources/Table.ts +4527 -0
  232. package/resources/analytics/hostnames.ts +72 -0
  233. package/resources/analytics/metadata.ts +10 -0
  234. package/resources/analytics/read.ts +252 -0
  235. package/resources/analytics/write.ts +803 -0
  236. package/resources/auditStore.ts +556 -0
  237. package/resources/blob.ts +1268 -0
  238. package/resources/crdt.ts +125 -0
  239. package/resources/dataLoader.ts +527 -0
  240. package/resources/databases.ts +1290 -0
  241. package/resources/graphql.ts +221 -0
  242. package/resources/indexes/HierarchicalNavigableSmallWorld.ts +638 -0
  243. package/resources/indexes/customIndexes.ts +7 -0
  244. package/resources/indexes/vector.ts +38 -0
  245. package/resources/jsResource.ts +86 -0
  246. package/resources/loadEnv.ts +22 -0
  247. package/resources/login.ts +18 -0
  248. package/resources/openApi.ts +409 -0
  249. package/resources/registrationDeprecated.ts +8 -0
  250. package/resources/replayLogs.ts +136 -0
  251. package/resources/roles.ts +98 -0
  252. package/resources/search.ts +1301 -0
  253. package/resources/tracked.ts +584 -0
  254. package/resources/transaction.ts +89 -0
  255. package/resources/transactionBroadcast.ts +258 -0
  256. package/security/auth.ts +376 -0
  257. package/security/certificateVerification/certificateVerificationSource.ts +84 -0
  258. package/security/certificateVerification/configValidation.ts +107 -0
  259. package/security/certificateVerification/crlVerification.ts +623 -0
  260. package/security/certificateVerification/index.ts +121 -0
  261. package/security/certificateVerification/ocspVerification.ts +148 -0
  262. package/security/certificateVerification/pkijs-ed25519-patch.ts +188 -0
  263. package/security/certificateVerification/types.ts +128 -0
  264. package/security/certificateVerification/verificationConfig.ts +138 -0
  265. package/security/certificateVerification/verificationUtils.ts +447 -0
  266. package/security/cryptoHash.js +42 -0
  267. package/security/data_objects/PermissionAttributeResponseObject.js +15 -0
  268. package/security/data_objects/PermissionResponseObject.js +115 -0
  269. package/security/data_objects/PermissionTableResponseObject.js +20 -0
  270. package/security/fastifyAuth.js +169 -0
  271. package/security/impersonation.ts +160 -0
  272. package/security/jsLoader.ts +716 -0
  273. package/security/keys.js +948 -0
  274. package/security/permissionsTranslator.js +300 -0
  275. package/security/role.js +218 -0
  276. package/security/tokenAuthentication.ts +228 -0
  277. package/security/user.ts +449 -0
  278. package/server/DurableSubscriptionsSession.ts +503 -0
  279. package/server/REST.ts +407 -0
  280. package/server/Server.ts +89 -0
  281. package/server/fastifyRoutes/helpers/getCORSOptions.js +36 -0
  282. package/server/fastifyRoutes/helpers/getHeaderTimeoutConfig.js +15 -0
  283. package/server/fastifyRoutes/helpers/getServerOptions.js +33 -0
  284. package/server/fastifyRoutes/plugins/hdbCore.js +39 -0
  285. package/server/fastifyRoutes.ts +205 -0
  286. package/server/graphqlQuerying.ts +700 -0
  287. package/server/http.ts +640 -0
  288. package/server/itc/serverHandlers.js +161 -0
  289. package/server/itc/utility/ITCEventObject.js +10 -0
  290. package/server/jobs/JobObject.js +24 -0
  291. package/server/jobs/jobProcess.js +69 -0
  292. package/server/jobs/jobRunner.js +162 -0
  293. package/server/jobs/jobs.js +304 -0
  294. package/server/loadRootComponents.js +44 -0
  295. package/server/mqtt.ts +485 -0
  296. package/server/nodeName.ts +75 -0
  297. package/server/operationsServer.ts +313 -0
  298. package/server/serverHelpers/Headers.ts +108 -0
  299. package/server/serverHelpers/JSONStream.ts +269 -0
  300. package/server/serverHelpers/OperationFunctionObject.ts +13 -0
  301. package/server/serverHelpers/Request.ts +158 -0
  302. package/server/serverHelpers/contentTypes.ts +637 -0
  303. package/server/serverHelpers/requestTimePlugin.js +57 -0
  304. package/server/serverHelpers/serverHandlers.js +148 -0
  305. package/server/serverHelpers/serverUtilities.ts +473 -0
  306. package/server/serverRegistry.ts +8 -0
  307. package/server/static.ts +187 -0
  308. package/server/status/definitions.ts +37 -0
  309. package/server/status/index.ts +125 -0
  310. package/server/storageReclamation.ts +93 -0
  311. package/server/threads/itc.js +89 -0
  312. package/server/threads/manageThreads.js +594 -0
  313. package/server/threads/socketRouter.ts +360 -0
  314. package/server/threads/threadServer.js +279 -0
  315. package/server/throttle.ts +73 -0
  316. package/sqlTranslator/SelectValidator.js +330 -0
  317. package/sqlTranslator/alasqlFunctionImporter.js +62 -0
  318. package/sqlTranslator/deleteTranslator.js +67 -0
  319. package/sqlTranslator/index.js +242 -0
  320. package/sqlTranslator/sql_statement_bucket.js +472 -0
  321. package/static/defaultConfig.yaml +3 -0
  322. package/studio/web/HDBDogOnly.svg +78 -0
  323. package/studio/web/assets/PPRadioGrotesk-Bold-DDaUYG8E.woff +0 -0
  324. package/studio/web/assets/fa-brands-400-CEJbCg16.woff +0 -0
  325. package/studio/web/assets/fa-brands-400-CSYNqBb_.ttf +0 -0
  326. package/studio/web/assets/fa-brands-400-DnkPfk3o.eot +0 -0
  327. package/studio/web/assets/fa-brands-400-UxlILjvJ.woff2 +0 -0
  328. package/studio/web/assets/fa-brands-400-cH1MgKbP.svg +3717 -0
  329. package/studio/web/assets/fa-regular-400-BhTwtT8w.eot +0 -0
  330. package/studio/web/assets/fa-regular-400-D1vz6WBx.ttf +0 -0
  331. package/studio/web/assets/fa-regular-400-DFnMcJPd.woff +0 -0
  332. package/studio/web/assets/fa-regular-400-DGzu1beS.woff2 +0 -0
  333. package/studio/web/assets/fa-regular-400-gwj8Pxq-.svg +801 -0
  334. package/studio/web/assets/fa-solid-900-B4ZZ7kfP.svg +5034 -0
  335. package/studio/web/assets/fa-solid-900-B6Axprfb.eot +0 -0
  336. package/studio/web/assets/fa-solid-900-BUswJgRo.woff2 +0 -0
  337. package/studio/web/assets/fa-solid-900-DOXgCApm.woff +0 -0
  338. package/studio/web/assets/fa-solid-900-mxuxnBEa.ttf +0 -0
  339. package/studio/web/assets/index-BTgXJX9d.js +235 -0
  340. package/studio/web/assets/index-BTgXJX9d.js.map +1 -0
  341. package/studio/web/assets/index-C-GXfcup.js +37 -0
  342. package/studio/web/assets/index-C-GXfcup.js.map +1 -0
  343. package/studio/web/assets/index-PFlNdimM.js +2 -0
  344. package/studio/web/assets/index-PFlNdimM.js.map +1 -0
  345. package/studio/web/assets/index-Y2g_iFpU.css +1 -0
  346. package/studio/web/assets/index-jiPwkrsB.css +1 -0
  347. package/studio/web/assets/index.lazy-C3TJZJ4o.js +266 -0
  348. package/studio/web/assets/index.lazy-C3TJZJ4o.js.map +1 -0
  349. package/studio/web/assets/profiler-DotzgiCJ.js +2 -0
  350. package/studio/web/assets/profiler-DotzgiCJ.js.map +1 -0
  351. package/studio/web/assets/react-redux-VxUEx_mU.js +6 -0
  352. package/studio/web/assets/react-redux-VxUEx_mU.js.map +1 -0
  353. package/studio/web/assets/startRecording-B_9J9Csd.js +3 -0
  354. package/studio/web/assets/startRecording-B_9J9Csd.js.map +1 -0
  355. package/studio/web/fabric-signup-background.webp +0 -0
  356. package/studio/web/fabric-signup-text.png +0 -0
  357. package/studio/web/favicon_purple.png +0 -0
  358. package/studio/web/github-icon.svg +15 -0
  359. package/studio/web/harper-fabric_black.png +0 -0
  360. package/studio/web/harper-fabric_white.png +0 -0
  361. package/studio/web/harper-studio_white.png +0 -0
  362. package/studio/web/index.html +16 -0
  363. package/studio/web/running.css +148 -0
  364. package/studio/web/running.html +147 -0
  365. package/studio/web/running.js +111 -0
  366. package/upgrade/UpgradeObjects.js +13 -0
  367. package/upgrade/directives/directivesController.js +90 -0
  368. package/upgrade/directivesManager.js +139 -0
  369. package/upgrade/upgradePrompt.js +124 -0
  370. package/upgrade/upgradeUtilities.js +28 -0
  371. package/utility/AWS/AWSConnector.js +29 -0
  372. package/utility/OperationFunctionCaller.js +63 -0
  373. package/utility/assignCmdEnvVariables.js +62 -0
  374. package/utility/common_utils.js +867 -0
  375. package/utility/environment/environmentManager.js +208 -0
  376. package/utility/environment/systemInformation.js +355 -0
  377. package/utility/errors/commonErrors.js +267 -0
  378. package/utility/errors/hdbError.js +146 -0
  379. package/utility/functions/date/dateFunctions.js +65 -0
  380. package/utility/functions/geo.js +355 -0
  381. package/utility/functions/sql/alaSQLExtension.js +104 -0
  382. package/utility/globalSchema.js +35 -0
  383. package/utility/hdbTerms.ts +819 -0
  384. package/utility/install/checkJWTTokensExist.js +62 -0
  385. package/utility/install/harperdb.conf +15 -0
  386. package/utility/install/harperdb.service +14 -0
  387. package/utility/install/installer.js +635 -0
  388. package/utility/installation.ts +30 -0
  389. package/utility/lmdb/DBIDefinition.js +20 -0
  390. package/utility/lmdb/DeleteRecordsResponseObject.js +25 -0
  391. package/utility/lmdb/InsertRecordsResponseObject.js +22 -0
  392. package/utility/lmdb/OpenDBIObject.js +31 -0
  393. package/utility/lmdb/OpenEnvironmentObject.js +41 -0
  394. package/utility/lmdb/UpdateRecordsResponseObject.js +25 -0
  395. package/utility/lmdb/UpsertRecordsResponseObject.js +22 -0
  396. package/utility/lmdb/cleanLMDBMap.js +65 -0
  397. package/utility/lmdb/commonUtility.js +119 -0
  398. package/utility/lmdb/deleteUtility.js +128 -0
  399. package/utility/lmdb/environmentUtility.js +477 -0
  400. package/utility/lmdb/searchCursorFunctions.js +187 -0
  401. package/utility/lmdb/searchUtility.js +918 -0
  402. package/utility/lmdb/terms.js +57 -0
  403. package/utility/lmdb/writeUtility.js +407 -0
  404. package/utility/logging/harper_logger.js +876 -0
  405. package/utility/logging/logRotator.js +157 -0
  406. package/utility/logging/logger.ts +24 -0
  407. package/utility/logging/readLog.js +355 -0
  408. package/utility/logging/transactionLog.js +57 -0
  409. package/utility/mount_hdb.js +59 -0
  410. package/utility/npmUtilities.js +102 -0
  411. package/utility/operationPermissions.ts +112 -0
  412. package/utility/operation_authorization.js +836 -0
  413. package/utility/packageUtils.js +55 -0
  414. package/utility/password.ts +99 -0
  415. package/utility/processManagement/processManagement.js +187 -0
  416. package/utility/processManagement/servicesConfig.js +56 -0
  417. package/utility/scripts/restartHdb.js +24 -0
  418. package/utility/scripts/user_data.sh +13 -0
  419. package/utility/signalling.js +36 -0
  420. package/utility/terms/certificates.js +81 -0
  421. package/utility/when.ts +20 -0
  422. package/v1.d.ts +39 -0
  423. package/v1.js +41 -0
  424. package/v2.d.ts +39 -0
  425. package/v2.js +41 -0
  426. package/validation/bulkDeleteValidator.js +24 -0
  427. package/validation/check_permissions.js +19 -0
  428. package/validation/common_validators.js +95 -0
  429. package/validation/configValidator.js +331 -0
  430. package/validation/deleteValidator.js +15 -0
  431. package/validation/fileLoadValidator.js +153 -0
  432. package/validation/insertValidator.js +40 -0
  433. package/validation/installValidator.js +37 -0
  434. package/validation/readLogValidator.js +64 -0
  435. package/validation/role_validation.js +320 -0
  436. package/validation/schemaMetadataValidator.js +42 -0
  437. package/validation/searchValidator.js +166 -0
  438. package/validation/statusValidator.ts +66 -0
  439. package/validation/transactionLogValidator.js +33 -0
  440. package/validation/user_validation.js +55 -0
  441. package/validation/validationWrapper.js +105 -0
  442. package/dist/resources/analytics/profile.d.ts +0 -2
  443. package/dist/resources/analytics/profile.js +0 -144
  444. package/dist/resources/analytics/profile.js.map +0 -1
package/server/mqtt.ts ADDED
@@ -0,0 +1,485 @@
1
+ // for now we are using mqtt-packet, but we may implement some of this ourselves, particularly packet generation so that
2
+ // we can implement more efficient progressive buffer allocation.
3
+ import { parser as makeParser, generate } from 'mqtt-packet';
4
+ import { getSession, DurableSubscriptionsSession } from './DurableSubscriptionsSession.ts';
5
+ import { getSuperUser } from '../security/user.ts';
6
+ import { serializeMessage, getDeserializer } from './serverHelpers/contentTypes.ts';
7
+ import { recordAction, addAnalyticsListener, recordActionBinary } from '../resources/analytics/write.ts';
8
+ import { server } from '../server/Server.ts';
9
+ import { get } from '../utility/environment/environmentManager.js';
10
+ import { CONFIG_PARAMS, AUTH_AUDIT_STATUS, AUTH_AUDIT_TYPES } from '../utility/hdbTerms.ts';
11
+ import { loggerWithTag } from '../utility/logging/logger.ts';
12
+ import { forComponent as loggerForComponent } from '../utility/logging/harper_logger.js';
13
+ import { EventEmitter } from 'events';
14
+ import { verifyCertificate } from '../security/certificateVerification/index.ts';
15
+ const authEventLog = loggerWithTag('auth-event');
16
+ const mqttLog = loggerForComponent('mqtt');
17
+
18
+ let AUTHORIZE_LOCAL = get(CONFIG_PARAMS.AUTHENTICATION_AUTHORIZELOCAL) ?? process.env.DEV_MODE;
19
+ export function bypassAuth() {
20
+ AUTHORIZE_LOCAL = true;
21
+ }
22
+
23
+ const authorizeLocal = (remoteAddress: string) =>
24
+ AUTHORIZE_LOCAL && (remoteAddress.includes('127.0.0.') || remoteAddress === '::1');
25
+
26
+ export function start({ server, port, network, webSocket, securePort, requireAuthentication }) {
27
+ // here we basically normalize the different types of sockets to pass to our socket/message handler
28
+ if (!server.mqtt) {
29
+ server.mqtt = {
30
+ requireAuthentication,
31
+ sessions: new Set(),
32
+ events: new EventEmitter(),
33
+ };
34
+ // a no-op error handler to prevent unhandled error events from being rethrown
35
+ server.mqtt.events.on('error', () => {});
36
+ }
37
+ const mqttSettings = server.mqtt;
38
+ let serverInstances = [];
39
+ const mtls = network?.mtls;
40
+ if (webSocket)
41
+ serverInstances = server.ws(
42
+ (ws, request, chainCompletion, next) => {
43
+ if (request.headers.get('sec-websocket-protocol') !== 'mqtt') {
44
+ return next(ws, request, chainCompletion);
45
+ }
46
+
47
+ mqttSettings.events.emit('connection', ws);
48
+ mqttLog.debug?.('Received WebSocket connection for MQTT from', ws._socket.remoteAddress);
49
+ const { onMessage, onClose } = onSocket(
50
+ ws,
51
+ (message) => {
52
+ ws.send(message);
53
+ },
54
+ request,
55
+ Promise.resolve(chainCompletion).then(() => request?.user),
56
+ mqttSettings
57
+ );
58
+ ws.on('message', onMessage);
59
+ ws.on('close', onClose);
60
+ ws.on('error', (error) => {
61
+ mqttLog.info?.('WebSocket error', error);
62
+ });
63
+ },
64
+ { ...webSocket }
65
+ ); // if there is no port, we are piggy-backing off of default app http server
66
+ // standard TCP socket
67
+ if (port || securePort) {
68
+ serverInstances.push(
69
+ server.socket(
70
+ async (socket) => {
71
+ let user;
72
+ mqttSettings.events.emit('connection', socket);
73
+ mqttLog.debug?.(
74
+ `Received ${socket.getCertificate ? 'SSL' : 'TCP'} connection for MQTT from ${socket.remoteAddress}`
75
+ );
76
+ if (mtls) {
77
+ if (socket.authorized) {
78
+ try {
79
+ // Perform certificate verification
80
+ const peerCertificate = socket.getPeerCertificate(true);
81
+ if (peerCertificate?.subject) {
82
+ const verificationResult = await verifyCertificate(peerCertificate, mtls);
83
+ if (!verificationResult.valid) {
84
+ mqttLog.error?.(
85
+ 'Certificate verification failed:',
86
+ verificationResult.status,
87
+ 'for',
88
+ peerCertificate.subject.CN
89
+ );
90
+ throw new Error('Certificate revoked or verification failed');
91
+ }
92
+ }
93
+
94
+ let username = mtls.user;
95
+ if (username !== null) {
96
+ // null means no user is defined from certificate, need regular authentication as well
97
+ if (username === undefined || username === 'Common Name' || username === 'CN')
98
+ username = socket.getPeerCertificate().subject.CN;
99
+ try {
100
+ user = await server.getUser(username, null, null);
101
+ if (get(CONFIG_PARAMS.LOGGING_AUDITAUTHEVENTS_LOGSUCCESSFUL)) {
102
+ authEventLog.notify?.({
103
+ username: user?.username,
104
+ status: AUTH_AUDIT_STATUS.SUCCESS,
105
+ type: AUTH_AUDIT_TYPES.AUTHENTICATION,
106
+ authStrategy: 'MQTT mTLS',
107
+ remoteAddress: socket.remoteAddress,
108
+ });
109
+ }
110
+ } catch (error) {
111
+ if (get(CONFIG_PARAMS.LOGGING_AUDITAUTHEVENTS_LOGFAILED)) {
112
+ authEventLog.error?.({
113
+ username,
114
+ status: AUTH_AUDIT_STATUS.FAILURE,
115
+ type: AUTH_AUDIT_TYPES.AUTHENTICATION,
116
+ authStrategy: 'mqtt',
117
+ remoteAddress: socket.remoteAddress,
118
+ });
119
+ }
120
+ throw error;
121
+ }
122
+ } else {
123
+ mqttLog.debug?.(
124
+ 'MQTT mTLS authorized connection (mTLS did not authorize a user)',
125
+ 'from',
126
+ socket.remoteAddress
127
+ );
128
+ }
129
+ } catch (error) {
130
+ mqttSettings.events.emit('error', error, socket);
131
+ mqttLog.error?.(error);
132
+ }
133
+ } else if (mtls.required) {
134
+ mqttLog.info?.(
135
+ `Unauthorized connection attempt, no authorized client certificate provided, error: ${socket.authorizationError}`
136
+ );
137
+ return socket.end();
138
+ }
139
+ }
140
+ if (!user && authorizeLocal(socket.remoteAddress)) {
141
+ user = await getSuperUser();
142
+ mqttLog.debug?.('Auto-authorizing local connection', user?.username);
143
+ }
144
+
145
+ const { onMessage, onClose } = onSocket(socket, (message) => socket.write(message), null, user, mqttSettings);
146
+ socket.on('data', onMessage);
147
+ socket.on('close', onClose);
148
+ socket.on('error', (error) => {
149
+ mqttLog.info?.('Socket error', error);
150
+ });
151
+ },
152
+ { port, securePort, mtls }
153
+ )
154
+ );
155
+ }
156
+ return serverInstances;
157
+ }
158
+ let addingMetrics,
159
+ numberOfConnections = 0;
160
+ function onSocket(socket, send, request, user, mqttSettings) {
161
+ if (!addingMetrics) {
162
+ addingMetrics = true;
163
+ addAnalyticsListener((metrics) => {
164
+ if (numberOfConnections > 0)
165
+ metrics.push({
166
+ metric: 'mqtt-connections',
167
+ connections: numberOfConnections,
168
+ byThread: true,
169
+ });
170
+ });
171
+ }
172
+ let disconnected;
173
+ numberOfConnections++;
174
+ let session: DurableSubscriptionsSession;
175
+ const mqttOptions = { protocolVersion: 4 };
176
+ const parser = makeParser({ protocolVersion: 5 });
177
+ function onMessage(data) {
178
+ parser.parse(data);
179
+ }
180
+ function onClose() {
181
+ numberOfConnections--;
182
+ if (!disconnected) {
183
+ disconnected = true;
184
+ session?.disconnect?.();
185
+ mqttSettings.events.emit('disconnected', session, socket);
186
+ mqttSettings.sessions.delete(session);
187
+ recordActionBinary(false, 'connection', 'mqtt', 'disconnect');
188
+ mqttLog.debug?.('MQTT connection was closed', socket.remoteAddress);
189
+ }
190
+ }
191
+
192
+ parser.on('packet', async (packet) => {
193
+ try {
194
+ if (user?.then) user = await user;
195
+ } catch (error) {
196
+ socket.close?.(1008, 'Unauthorized');
197
+ mqttLog.info?.(error); // should already be handled elsewhere
198
+ return;
199
+ }
200
+ const command = packet.cmd;
201
+ if (session) {
202
+ if (session.then) await session;
203
+ } else if (command !== 'connect') {
204
+ mqttLog.info?.('Received packet before connection was established, closing connection');
205
+ if (socket?.destroy) socket.destroy();
206
+ else socket?.terminate();
207
+ return;
208
+ }
209
+ const topic = packet.topic;
210
+ const slashIndex = topic?.indexOf('/', 1);
211
+ const generalTopic = slashIndex > 0 ? topic.slice(0, slashIndex) : topic;
212
+ recordAction(packet.length, 'bytes-received', generalTopic, packetMethodName(packet), 'mqtt');
213
+
214
+ try {
215
+ session?.receivedPacket?.();
216
+ switch (command) {
217
+ case 'connect':
218
+ mqttOptions.protocolVersion = packet.protocolVersion;
219
+ if (packet.username) {
220
+ try {
221
+ user = await server.getUser(packet.username, packet.password.toString(), request);
222
+ if (get(CONFIG_PARAMS.LOGGING_AUDITAUTHEVENTS_LOGSUCCESSFUL)) {
223
+ authEventLog.notify?.({
224
+ username: user?.username,
225
+ status: AUTH_AUDIT_STATUS.SUCCESS,
226
+ type: AUTH_AUDIT_TYPES.AUTHENTICATION,
227
+ authStrategy: 'MQTT',
228
+ remoteAddress: socket.remoteAddress,
229
+ });
230
+ }
231
+ } catch (error) {
232
+ if (get(CONFIG_PARAMS.LOGGING_AUDITAUTHEVENTS_LOGFAILED)) {
233
+ authEventLog.error?.({
234
+ username: packet.username,
235
+ status: AUTH_AUDIT_STATUS.FAILURE,
236
+ type: AUTH_AUDIT_TYPES.AUTHENTICATION,
237
+ authStrategy: 'mqtt',
238
+ remoteAddress: socket.remoteAddress,
239
+ });
240
+ }
241
+ mqttSettings.events.emit('auth-failed', packet, socket, error);
242
+ recordActionBinary(false, 'connection', 'mqtt', 'connect');
243
+ return sendPacket({
244
+ // Send a connection acknowledgment with indication of auth failure
245
+ cmd: 'connack',
246
+ reasonCode: 0x04, // bad username or password, v3.1.1
247
+ returnCode: 0x86, // bad username or password, v5
248
+ });
249
+ }
250
+ }
251
+ if (!user && mqttSettings.requireAuthentication) {
252
+ mqttSettings.events.emit('auth-failed', packet, socket);
253
+ recordActionBinary(false, 'connection', 'mqtt', 'connect');
254
+ return sendPacket({
255
+ // Send a connection acknowledgment with indication of auth failure
256
+ cmd: 'connack',
257
+ reasonCode: 0x04, // bad username or password, v3.1.1
258
+ returnCode: 0x86, // bad username or password, v5
259
+ });
260
+ }
261
+ try {
262
+ // TODO: Do we want to prefix the user name to the client id (to prevent collisions when poor ids are used) or is this sufficient?
263
+ mqttSettings.authorizeClient?.(packet, user);
264
+
265
+ // TODO: Handle the will & testament, and possibly use the will's content type as a hint for expected content
266
+ if (packet.will) {
267
+ const deserialize =
268
+ socket.deserialize || (socket.deserialize = getDeserializer(request?.headers.get?.('content-type')));
269
+ packet.will.data = packet.will.payload?.length > 0 ? deserialize(packet.will.payload) : undefined;
270
+ delete packet.will.payload;
271
+ }
272
+ session = getSession({
273
+ user,
274
+ ...packet,
275
+ });
276
+ session = await session;
277
+ // the session is used in the context, and we want to make sure we can access this
278
+ session.socket = socket;
279
+ if (request) {
280
+ // if there a request, store it in the session so we can use it as part of the context
281
+ session.request = request;
282
+ }
283
+ mqttSettings.sessions.add(session);
284
+ } catch (error) {
285
+ mqttLog.error?.(error);
286
+ mqttSettings.events.emit('auth-failed', packet, socket, error);
287
+ recordActionBinary(false, 'connection', 'mqtt', 'connect');
288
+ return sendPacket({
289
+ // Send a connection acknowledgment with indication of auth failure
290
+ cmd: 'connack',
291
+ reasonCode: error.code || 0x05,
292
+ returnCode: error.code || 0x80, // generic error
293
+ });
294
+ }
295
+ mqttSettings.events.emit('connected', session, socket);
296
+ recordActionBinary(true, 'connection', 'mqtt', 'connect');
297
+ sendPacket({
298
+ // Send a connection acknowledgment
299
+ cmd: 'connack',
300
+ sessionPresent: session.sessionWasPresent,
301
+ reasonCode: 0,
302
+ returnCode: 0, // success
303
+ });
304
+ const listener = async (topic, message, messageId, subscription) => {
305
+ try {
306
+ if (disconnected) throw new Error('Session disconnected while trying to send message to', topic);
307
+ const slashIndex = topic.indexOf('/', 1);
308
+ const generalTopic = slashIndex > 0 ? topic.slice(0, slashIndex) : topic;
309
+ sendPacket(
310
+ {
311
+ cmd: 'publish',
312
+ topic,
313
+ payload: await serialize(message),
314
+ messageId: messageId || Math.floor(Math.random() * 100000000),
315
+ qos: subscription.qos,
316
+ },
317
+ generalTopic
318
+ );
319
+ // wait if there is back-pressure
320
+ const rawSocket = socket._socket ?? socket;
321
+ if (rawSocket.writableNeedDrain) {
322
+ return new Promise((resolve) => rawSocket.once('drain', resolve));
323
+ }
324
+ return !rawSocket.closed;
325
+ } catch (error) {
326
+ mqttLog.error?.(error);
327
+ session?.disconnect();
328
+ mqttSettings.sessions.delete(session);
329
+ return false;
330
+ }
331
+ };
332
+ session.setListener(listener);
333
+ if (session.sessionWasPresent) await session.resume();
334
+ break;
335
+ case 'subscribe':
336
+ const granted = [];
337
+ for (const subscription of packet.subscriptions) {
338
+ let grantedQos;
339
+ try {
340
+ const grantedSubscription = await session.addSubscription(subscription, subscription.qos >= 1);
341
+ grantedQos = grantedSubscription
342
+ ? grantedSubscription.qos || 0
343
+ : mqttOptions.protocolVersion < 5
344
+ ? 0x80 // only error code in v3.1.1
345
+ : 0x8f; // invalid topic indicated
346
+ } catch (error) {
347
+ mqttSettings.events.emit('error', error, socket, subscription, session);
348
+ if (error.statusCode) {
349
+ if (error.statusCode === 500) mqttLog.warn?.(error);
350
+ else mqttLog.info?.(error);
351
+ } else mqttLog.error?.(error);
352
+ grantedQos =
353
+ mqttOptions.protocolVersion < 5
354
+ ? 0x80 // the only error code in v3.1.1
355
+ : error.statusCode === 403
356
+ ? 0x87 // unauthorized
357
+ : error.statusCode === 404
358
+ ? 0x8f // invalid topic
359
+ : 0x80; // generic failure
360
+ }
361
+ granted.push(grantedQos);
362
+ }
363
+ await session.committed;
364
+ sendPacket({
365
+ // Send a subscription acknowledgment
366
+ cmd: 'suback',
367
+ granted,
368
+ messageId: packet.messageId,
369
+ });
370
+ break;
371
+ case 'unsubscribe': {
372
+ const granted = [];
373
+ for (const subscription of packet.unsubscriptions) {
374
+ granted.push(session.removeSubscription(subscription) ? 0 : 17);
375
+ }
376
+ sendPacket({
377
+ // Send a subscription acknowledgment
378
+ cmd: 'unsuback',
379
+ granted,
380
+ messageId: packet.messageId,
381
+ });
382
+ break;
383
+ }
384
+ case 'pubrel':
385
+ sendPacket({
386
+ // Send a publish response
387
+ cmd: 'pubcomp',
388
+ messageId: packet.messageId,
389
+ reasonCode: 0,
390
+ });
391
+ return;
392
+ case 'publish':
393
+ const responseCmd = packet.qos === 2 ? 'pubrec' : 'puback';
394
+ // deserialize
395
+ const deserialize =
396
+ socket.deserialize || (socket.deserialize = getDeserializer(request?.headers.get?.('content-type')));
397
+ const messageLength = packet.payload?.length || 0;
398
+ const data = messageLength > 0 ? deserialize(packet.payload) : undefined; // zero payload length maps to a delete
399
+ let published;
400
+ try {
401
+ published = await session.publish(packet, data);
402
+ } catch (error) {
403
+ mqttSettings.events.emit('error', error, socket, packet, session);
404
+ mqttLog.warn?.(error);
405
+ if (packet.qos > 0) {
406
+ sendPacket(
407
+ {
408
+ // Send a publish acknowledgment
409
+ cmd: responseCmd,
410
+ messageId: packet.messageId,
411
+ reasonCode: 0x80, // unspecified error (only MQTT v5 supports error codes)
412
+ },
413
+ packet.topic
414
+ );
415
+ }
416
+ break;
417
+ }
418
+ if (packet.qos > 0) {
419
+ sendPacket(
420
+ {
421
+ // Send a publish acknowledgment
422
+ cmd: responseCmd,
423
+ messageId: packet.messageId,
424
+ reasonCode:
425
+ published === false
426
+ ? 0x90 // Topic name invalid
427
+ : 0, //success
428
+ },
429
+ packet.topic
430
+ );
431
+ }
432
+ break;
433
+ case 'pubrec':
434
+ sendPacket({
435
+ // Send a publish response
436
+ cmd: 'pubrel',
437
+ messageId: packet.messageId,
438
+ reasonCode: 0,
439
+ });
440
+ break;
441
+ case 'pubcomp':
442
+ case 'puback':
443
+ session.acknowledge(packet.messageId);
444
+ break;
445
+ case 'pingreq':
446
+ sendPacket({ cmd: 'pingresp' });
447
+ break;
448
+ case 'disconnect':
449
+ disconnected = true;
450
+ session?.disconnect(true);
451
+ mqttSettings.events.emit('disconnected', session, socket);
452
+ mqttSettings.sessions.delete(session);
453
+ recordActionBinary(true, 'connection', 'mqtt', 'disconnect');
454
+ mqttLog.debug?.('Received disconnect command, closing MQTT session', socket.remoteAddress);
455
+ if (socket.close) socket.close();
456
+ else socket.end();
457
+ break;
458
+ }
459
+ } catch (error) {
460
+ mqttSettings.events.emit('error', error, socket, packet, session);
461
+ mqttLog.error?.(error);
462
+ sendPacket({
463
+ // Send a subscription acknowledgment
464
+ cmd: 'disconnect',
465
+ });
466
+ }
467
+ function sendPacket(packetData, path?) {
468
+ const send_packet = generate(packetData, mqttOptions);
469
+ send(send_packet);
470
+ recordAction(send_packet.length, 'bytes-sent', path, packetMethodName(packetData), 'mqtt');
471
+ }
472
+ function packetMethodName(packet) {
473
+ return packet.qos > 0 ? packet.cmd + ',qos=' + packet.qos : packet.cmd;
474
+ }
475
+ function serialize(data) {
476
+ return serializeMessage(data, request);
477
+ }
478
+ });
479
+ parser.on('error', (error) => {
480
+ mqttLog.warn('MQTT parsing error, closing connection:', error.message);
481
+ if (socket?.destroy) socket.destroy();
482
+ else socket?.terminate();
483
+ });
484
+ return { onMessage, onClose };
485
+ }
@@ -0,0 +1,75 @@
1
+ import { readFileSync } from 'node:fs';
2
+ import { X509Certificate } from 'node:crypto';
3
+ import { CONFIG_PARAMS } from '../utility/hdbTerms.ts';
4
+ import env from '../utility/environment/environmentManager.js';
5
+
6
+ Object.defineProperty(server, 'hostname', {
7
+ get() {
8
+ return getThisNodeName();
9
+ },
10
+ });
11
+
12
+ let commonNameFromCert: string | undefined;
13
+ function getCommonNameFromCert() {
14
+ if (commonNameFromCert !== undefined) return commonNameFromCert;
15
+ const certificatePath: string | undefined =
16
+ env.get(CONFIG_PARAMS.OPERATIONSAPI_TLS_CERTIFICATE) || env.get(CONFIG_PARAMS.TLS_CERTIFICATE);
17
+ if (certificatePath) {
18
+ // we can use this to get the hostname if it isn't provided by config
19
+ const certParsed = new X509Certificate(readFileSync(certificatePath));
20
+ const subject = certParsed.subject;
21
+ return (commonNameFromCert = subject?.match(/CN=(.*)/)?.[1] ?? null);
22
+ }
23
+ }
24
+
25
+ let nodeName: string | undefined;
26
+ export function getThisNodeName(): string {
27
+ return (
28
+ nodeName ||
29
+ (nodeName =
30
+ env.get(CONFIG_PARAMS.NODE_HOSTNAME) ??
31
+ env.get('replication_hostname') ?? // for backwards compatibility
32
+ urlToNodeName(env.get('replication_url') as string) ??
33
+ getCommonNameFromCert() ??
34
+ getHostFromListeningPort('operationsapi_network_secureport') ??
35
+ getHostFromListeningPort('operationsapi_network_port') ??
36
+ '127.0.0.1')
37
+ );
38
+ }
39
+
40
+ export function clearThisNodeName() {
41
+ nodeName = undefined;
42
+ }
43
+
44
+ function getHostFromListeningPort(key: string) {
45
+ const port: string | undefined = env.get(key);
46
+ const lastColon = port?.lastIndexOf?.(':');
47
+ if (lastColon > 0) return port.slice(0, lastColon);
48
+ }
49
+ function getPortFromListeningPort(key: string) {
50
+ const port: string | undefined = env.get(key);
51
+ const lastColon = port?.lastIndexOf?.(':');
52
+ if (lastColon > 0) return +port.slice(lastColon + 1).replace(/[[\]]/g, '');
53
+ return +port;
54
+ }
55
+
56
+ export function hostnameToUrl(hostname) {
57
+ let port = getPortFromListeningPort('replication_port');
58
+ if (port) return `ws://${hostname}:${port}`;
59
+ port = getPortFromListeningPort('replication_secureport');
60
+ if (port) return `wss://${hostname}:${port}`;
61
+ port = getPortFromListeningPort('operationsapi_network_port');
62
+ if (port) return `ws://${hostname}:${port}`;
63
+ port = getPortFromListeningPort('operationsapi_network_secureport');
64
+ if (port) return `wss://${hostname}:${port}`;
65
+ }
66
+
67
+ export function urlToNodeName(nodeUrl?: string | URL): string | undefined {
68
+ if (nodeUrl) return new URL(nodeUrl).hostname; // this the part of the URL that is the node name, as we want it to match common name in the certificate
69
+ }
70
+
71
+ export function getThisNodeUrl() {
72
+ const url: string | undefined = env.get(CONFIG_PARAMS.REPLICATION_URL);
73
+ if (url) return url;
74
+ return hostnameToUrl(getThisNodeName());
75
+ }