@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/REST.ts ADDED
@@ -0,0 +1,407 @@
1
+ import { serialize, serializeMessage, getDeserializer } from '../server/serverHelpers/contentTypes.ts';
2
+ import { addAnalyticsListener, recordAction, recordActionBinary } from '../resources/analytics/write.ts';
3
+ import * as harperLogger from '../utility/logging/harper_logger.js';
4
+ import { ServerOptions } from 'http';
5
+ import { ServerError, ClientError } from '../utility/errors/hdbError.js';
6
+ import { Resources } from '../resources/Resources.ts';
7
+ import { Resource } from '../resources/Resource.ts';
8
+ import { IterableEventQueue } from '../resources/IterableEventQueue.ts';
9
+ import { transaction } from '../resources/transaction.ts';
10
+ import { Headers, mergeHeaders } from '../server/serverHelpers/Headers.ts';
11
+ import { generateJsonApi } from '../resources/openApi.ts';
12
+ import type { Context } from '../resources/ResourceInterface.ts';
13
+ import { Request } from '../server/serverHelpers/Request.ts';
14
+ import { RequestTarget } from '../resources/RequestTarget';
15
+
16
+ const { errorToString } = harperLogger;
17
+ const etagBytes = new Uint8Array(8);
18
+ const etagFloat = new Float64Array(etagBytes.buffer, 0, 1);
19
+ let httpOptions = {};
20
+
21
+ const OPENAPI_DOMAIN = 'openapi';
22
+
23
+ async function http(request: Context & Request, nextHandler) {
24
+ const headersObject = request.headers.asObject;
25
+ const isSse = headersObject.accept === 'text/event-stream';
26
+ const method = isSse ? 'CONNECT' : request.method;
27
+ const headers = new Headers();
28
+ try {
29
+ request.responseHeaders = headers;
30
+ request.response = {
31
+ status: undefined,
32
+ headers,
33
+ };
34
+ const url = request.url.slice(1);
35
+
36
+ let target: RequestTarget;
37
+ let resource: typeof Resource;
38
+ if (url !== OPENAPI_DOMAIN) {
39
+ const entry = resources.getMatch(url, isSse ? 'sse' : 'rest');
40
+ if (!entry) return nextHandler(request); // no resource handler found
41
+ request.handlerPath = entry.path;
42
+ target = new RequestTarget(entry.relativeURL); // TODO: We don't want to have to remove the forward slash and then re-add it
43
+
44
+ target.async = true;
45
+ resource = entry.Resource;
46
+ }
47
+ if (resource?.isCaching) {
48
+ const cacheControl = headersObject['cache-control'];
49
+ if (cacheControl) {
50
+ const cacheControlParts = parseHeaderValue(cacheControl);
51
+ for (const part of cacheControlParts) {
52
+ switch (part.name) {
53
+ case 'max-age':
54
+ request.expiresAt = part.value * 1000 + Date.now();
55
+ break;
56
+ case 'only-if-cached':
57
+ request.onlyIfCached = true;
58
+ break;
59
+ case 'no-cache':
60
+ request.noCache = true;
61
+ break;
62
+ case 'no-store':
63
+ request.noCacheStore = true;
64
+ break;
65
+ case 'stale-if-error':
66
+ request.staleIfError = true;
67
+ break;
68
+ case 'must-revalidate':
69
+ request.mustRevalidate = true;
70
+ break;
71
+ }
72
+ }
73
+ }
74
+ }
75
+ const replicateTo = headersObject['x-replicate-to'];
76
+ if (replicateTo) {
77
+ const parsed = parseHeaderValue(replicateTo).map((node: { name: string }) => {
78
+ // we can use a component argument to indicate that number that should be confirmed
79
+ // for example, to replicate to three nodes and wait for confirmation from two: X-Replicate-To: 3;confirm=2
80
+ // or to specify nodes with confirm: X-Replicate-To: node-1, node-2, node-3;confirm=2
81
+ if (node.next?.name === 'confirm' && node.next.value >= 0) {
82
+ request.replicatedConfirmation = +node.next.value;
83
+ }
84
+ return node.name;
85
+ });
86
+ request.replicateTo =
87
+ parsed.length === 1 && +parsed[0] >= 0 ? +parsed[0] : parsed[0] === '*' ? undefined : parsed;
88
+ }
89
+ const replicateFrom = headersObject['x-replicate-from'];
90
+ if (replicateFrom === 'none') {
91
+ request.replicateFrom = false;
92
+ }
93
+ let responseData = await transaction(request, () => {
94
+ if (headersObject['content-length'] || headersObject['transfer-encoding']) {
95
+ // TODO: Support cancellation (if the request otherwise fails or takes too many bytes)
96
+ try {
97
+ request.data = getDeserializer(headersObject['content-type'], true)(request.body, request.headers);
98
+ } catch (error) {
99
+ throw new ClientError(error, 400);
100
+ }
101
+ }
102
+ request.authorize = true;
103
+
104
+ if (url === OPENAPI_DOMAIN && method === 'GET') {
105
+ target = {};
106
+ if (request?.user?.role?.permission?.super_user) {
107
+ return generateJsonApi(resources, `${request.protocol}://${request.hostname}`);
108
+ } else {
109
+ throw new ServerError(`Forbidden`, 403);
110
+ }
111
+ }
112
+ target.checkPermission = request.user?.role?.permission ?? {};
113
+
114
+ switch (method) {
115
+ case 'GET':
116
+ case 'HEAD':
117
+ return resource.get(target, request);
118
+ case 'POST':
119
+ return resource.post(target, request.data, request);
120
+ case 'PUT':
121
+ return resource.put(target, request.data, request);
122
+ case 'DELETE':
123
+ return resource.delete(target, request);
124
+ case 'PATCH':
125
+ return resource.patch(target, request.data, request);
126
+ case 'OPTIONS': // used primarily for CORS
127
+ headers.setIfNone('Allow', 'GET, HEAD, POST, PUT, DELETE, PATCH, OPTIONS, TRACE, QUERY, COPY, MOVE');
128
+ return;
129
+ case 'CONNECT':
130
+ // websockets? and event-stream
131
+ return resource.connect(target, null, request);
132
+ case 'TRACE':
133
+ return 'Harper is the terminating server';
134
+ case 'QUERY':
135
+ return resource.query(target, request.data, request);
136
+ case 'COPY': // methods suggested from webdav RFC 4918
137
+ return resource.copy(target, headersObject.destination, request);
138
+ case 'MOVE':
139
+ return resource.move(target, headersObject.destination, request);
140
+ case 'BREW': // RFC 2324
141
+ throw new ClientError("Harper is short and stout and can't brew coffee", 418);
142
+ default:
143
+ throw new ServerError(`Method ${method} is not recognized`, 501);
144
+ }
145
+ });
146
+ let status = request.response.status;
147
+ let lastModification = request.lastModified;
148
+ if (responseData == undefined) {
149
+ status ??= method === 'GET' || method === 'HEAD' ? 404 : 204;
150
+ // deleted entries can have a timestamp of when they were deleted
151
+ if (httpOptions.lastModified && isFinite(lastModification))
152
+ headers.setIfNone('Last-Modified', new Date(lastModification).toUTCString());
153
+ } else if (responseData.headers) {
154
+ // if response is a Response object, use it as the response
155
+ if (Object.isFrozen(responseData)) {
156
+ // make a copy if it is a frozen record
157
+ responseData = Object.assign({}, responseData);
158
+ }
159
+ // merge headers from response
160
+ const responseHeaders = mergeHeaders(responseData.headers, headers);
161
+ if (responseData.headers !== responseHeaders)
162
+ // if we rebuilt the headers, reassign it, but we don't want to assign to a Response object (which should already
163
+ // have a valid Headers object) or it will throw an error
164
+ responseData.headers = responseHeaders;
165
+ // if no body, look for provided data to serialize
166
+ if (!responseData.body) {
167
+ if ('data' in responseData) responseData.body = serialize(responseData.data, request, responseData);
168
+ else responseData.body = serialize(responseData, request, responseData);
169
+ }
170
+ responseData.status ??= status ?? 200;
171
+ return responseData;
172
+ } else if (isFinite(lastModification)) {
173
+ etagFloat[0] = lastModification;
174
+ // base64 encoding of the 64-bit float encoding of the date in ms (with quotes)
175
+ // very fast and efficient
176
+ const etag = String.fromCharCode(
177
+ 34,
178
+ (etagBytes[0] & 0x3f) + 62,
179
+ (etagBytes[0] >> 6) + ((etagBytes[1] << 2) & 0x3f) + 62,
180
+ (etagBytes[1] >> 4) + ((etagBytes[2] << 4) & 0x3f) + 62,
181
+ (etagBytes[2] >> 2) + 62,
182
+ (etagBytes[3] & 0x3f) + 62,
183
+ (etagBytes[3] >> 6) + ((etagBytes[4] << 2) & 0x3f) + 62,
184
+ (etagBytes[4] >> 4) + ((etagBytes[5] << 4) & 0x3f) + 62,
185
+ (etagBytes[5] >> 2) + 62,
186
+ (etagBytes[6] & 0x3f) + 62,
187
+ (etagBytes[6] >> 6) + ((etagBytes[7] << 2) & 0x3f) + 62,
188
+ 34
189
+ );
190
+ const lastEtag = headersObject['if-none-match'];
191
+ if (lastEtag && etag == lastEtag) {
192
+ if (responseData?.onDone) responseData.onDone();
193
+ status = 304;
194
+ responseData = undefined;
195
+ } else {
196
+ headers.setIfNone('ETag', etag);
197
+ }
198
+ if (httpOptions.lastModified) headers.setIfNone('Last-Modified', new Date(lastModification).toUTCString());
199
+ }
200
+ if (request.createdResource) status = 201;
201
+ if (request.newLocation) headers.setIfNone('Location', request.newLocation);
202
+
203
+ const responseObject = {
204
+ status: status ?? 200,
205
+ headers,
206
+ body: undefined,
207
+ };
208
+ const loadedFromSource = target.loadedFromSource;
209
+ if (loadedFromSource !== undefined) {
210
+ // this appears to be a caching table with a source
211
+ responseObject.wasCacheMiss = loadedFromSource; // indicate if it was a missed cache
212
+ if (!loadedFromSource && isFinite(lastModification)) {
213
+ headers.setIfNone('Age', Math.round((Date.now() - (request.lastRefreshed || lastModification)) / 1000));
214
+ }
215
+ }
216
+ // TODO: Handle 201 Created
217
+ if (responseData !== undefined) {
218
+ responseObject.body = serialize(responseData, request, responseObject);
219
+ if (method === 'HEAD') responseObject.body = undefined; // we want everything else to be the same as GET, but then omit the body
220
+ }
221
+ return responseObject;
222
+ } catch (error) {
223
+ error ??= new Error('Unknown error occurred');
224
+ let statusCode = error.statusCode ?? request.response.status;
225
+ if (statusCode) {
226
+ if (statusCode === 500) harperLogger.warn(error);
227
+ else harperLogger.info(error);
228
+ if (statusCode === 405) {
229
+ if (error.method) error.message += ` to handle HTTP method ${error.method.toUpperCase() || ''}`;
230
+ if (error.allow) {
231
+ error.allow.push('trace', 'head', 'options');
232
+ headers.setIfNone('Allow', error.allow.map((method) => method.toUpperCase()).join(', '));
233
+ }
234
+ }
235
+ } else harperLogger.error(error);
236
+
237
+ // RFC 9457 Problem Details
238
+ const status = statusCode || 500;
239
+ // we prefer to use error classes for error codes (constructor.name), but if there is a code, it is probably a node.js
240
+ // error that denotes error codes with a separate property
241
+ const code = error.code ?? error.constructor.name;
242
+ const problemDetail = {
243
+ type: `error:${code}`, // eventually we want this to be a resolvable URI to our docs
244
+ code,
245
+ title: error.message ?? error.toString(),
246
+ status,
247
+ detail: error.detail,
248
+ instance: request.url,
249
+ };
250
+
251
+ const responseObject = {
252
+ status,
253
+ headers,
254
+ body: undefined,
255
+ };
256
+ responseObject.body = serialize(problemDetail, request, responseObject);
257
+ return responseObject;
258
+ }
259
+ }
260
+
261
+ let started;
262
+ let resources: Resources;
263
+ let addedMetrics;
264
+ let connectionCount = 0;
265
+
266
+ export function start(options: ServerOptions & { path: string; port: number; server: any; resources: Resources }) {
267
+ httpOptions = options;
268
+ if (options.includeExpensiveRecordCountEstimates) {
269
+ // If they really want to enable expensive record count estimates
270
+ Request.prototype.includeExpensiveRecordCountEstimates = true;
271
+ }
272
+ if (started) return;
273
+ started = true;
274
+ resources = options.resources;
275
+ options.server.http(async (request: Request, nextHandler) => {
276
+ if (request.isWebSocket) return;
277
+ return http(request, nextHandler);
278
+ }, options);
279
+ if (options.webSocket === false) return;
280
+ options.server.ws(async (ws, request, chainCompletion) => {
281
+ connectionCount++;
282
+ const incomingMessages = new IterableEventQueue();
283
+ if (!addedMetrics) {
284
+ addedMetrics = true;
285
+ addAnalyticsListener((metrics) => {
286
+ if (connectionCount > 0)
287
+ metrics.push({
288
+ metric: 'ws-connections',
289
+ connections: connectionCount,
290
+ byThread: true,
291
+ });
292
+ });
293
+ }
294
+ // TODO: We should set a lower keep-alive ws.socket.setKeepAlive(600000);
295
+ let hasError;
296
+ ws.on('error', (error) => {
297
+ hasError = true;
298
+ harperLogger.warn(error);
299
+ });
300
+ let deserializer;
301
+ ws.on('message', function message(body) {
302
+ if (!deserializer)
303
+ deserializer = getDeserializer(request.requestedContentType ?? request.headers.asObject['content-type'], false);
304
+ const data = deserializer(body);
305
+ recordAction(body.length, 'bytes-received', request.handlerPath, 'message', 'ws');
306
+ incomingMessages.push(data);
307
+ });
308
+ let iterator;
309
+ ws.on('close', () => {
310
+ connectionCount--;
311
+ recordActionBinary(!hasError, 'connection', 'ws', 'disconnect');
312
+ incomingMessages.emit('close');
313
+ if (iterator) iterator.return();
314
+ });
315
+ try {
316
+ await chainCompletion;
317
+ const url = request.url.slice(1);
318
+ const entry = resources.getMatch(url, 'ws');
319
+ recordActionBinary(Boolean(entry), 'connection', 'ws', 'connect');
320
+ if (!entry) {
321
+ // TODO: Ideally we would like to have a 404 response before upgrading to WebSocket protocol, probably
322
+ return ws.close(1011, `No resource was found to handle ${request.pathname}`);
323
+ } else {
324
+ request.handlerPath = entry.path;
325
+ recordAction(
326
+ (action) => ({
327
+ count: action.count,
328
+ total: connectionCount,
329
+ }),
330
+ 'connections',
331
+ request.handlerPath,
332
+ 'connect',
333
+ 'ws'
334
+ );
335
+ request.authorize = true;
336
+ const resourceRequest = new RequestTarget(entry.relativeURL); // TODO: We don't want to have to remove the forward slash and then re-add it
337
+ resourceRequest.checkPermission = request.user?.role?.permission ?? {};
338
+ const resource = entry.Resource;
339
+ const responseStream = await transaction(request, () => {
340
+ return resource.connect(resourceRequest, incomingMessages, request);
341
+ });
342
+ iterator = responseStream[Symbol.asyncIterator]();
343
+
344
+ let result;
345
+ while (!(result = await iterator.next()).done) {
346
+ const messageBinary = await serializeMessage(result.value, request);
347
+ ws.send(messageBinary);
348
+ recordAction(messageBinary.length, 'bytes-sent', request.handlerPath, 'message', 'ws');
349
+ if (ws._socket.writableNeedDrain) {
350
+ await new Promise((resolve) => ws._socket.once('drain', resolve));
351
+ }
352
+ }
353
+ }
354
+ } catch (error) {
355
+ if (error.statusCode) {
356
+ if (error.statusCode === 500) harperLogger.warn(error);
357
+ else harperLogger.info(error);
358
+ } else harperLogger.error(error);
359
+ ws.close(
360
+ HTTP_TO_WEBSOCKET_CLOSE_CODES[error.statusCode] || // try to return a helpful code
361
+ 1011, // otherwise generic internal error
362
+ errorToString(error)
363
+ );
364
+ }
365
+ ws.close();
366
+ }, options);
367
+ }
368
+ const HTTP_TO_WEBSOCKET_CLOSE_CODES = {
369
+ 401: 3000,
370
+ 403: 3003,
371
+ };
372
+
373
+ /**
374
+ * This parser is used to parse header values.
375
+ *
376
+ * It is used within this file for parsing the `Cache-Control` and `X-Replicate-To` headers.
377
+ *
378
+ * @param value
379
+ */
380
+ export function parseHeaderValue(value: string) {
381
+ return value
382
+ .trim()
383
+ .split(',')
384
+ .map((part) => {
385
+ let parsed;
386
+ const components = part.trim().split(';');
387
+ let component;
388
+ while ((component = components.pop())) {
389
+ if (component.includes('=')) {
390
+ let [name, value] = component.trim().split('=');
391
+ name = name.trim();
392
+ if (value) value = value.trim();
393
+ parsed = {
394
+ name: name.toLowerCase(),
395
+ value,
396
+ next: parsed,
397
+ };
398
+ } else {
399
+ parsed = {
400
+ name: component.toLowerCase(),
401
+ next: parsed,
402
+ };
403
+ }
404
+ }
405
+ return parsed;
406
+ });
407
+ }
@@ -0,0 +1,89 @@
1
+ import { Socket } from 'net';
2
+ import { _assignPackageExport } from '../globals.js';
3
+ import type { Value } from '../resources/analytics/write.ts';
4
+ import type { Resources } from '../resources/Resources.ts';
5
+ import { OperationDefinition } from './serverHelpers/serverUtilities.ts';
6
+
7
+ /**
8
+ * This is the central interface by which we define entry points for different server protocol plugins to listen for
9
+ * incoming connections and requests.
10
+ */
11
+ export interface Server {
12
+ socket?(listener: (socket: Socket) => void, options: ServerOptions): void;
13
+ http?(listener: (request: Request, nextLayer: (request: Request) => Response) => void, options?: HttpOptions): void;
14
+ request?(
15
+ listener: (request: Request, nextLayer: (request: Request) => Response) => void,
16
+ options?: HttpOptions
17
+ ): void;
18
+ ws?(
19
+ listener: (ws: WebSocket, request: Request, requestCompletion: Promise<any>) => any,
20
+ options?: WebSocketOptions
21
+ ): void;
22
+ contentTypes: Map<string, ContentTypeHandler>;
23
+ getUser(username: string, password: string | null, request: Request): any;
24
+ authenticateUser(username: string, password: string, request: Request): any;
25
+ operation(operation: any, context: any, authorize?: boolean): Promise<any>;
26
+ registerOperation(operationDefinition: OperationDefinition): void;
27
+ recordAnalytics(value: Value, metric: string, path?: string, method?: string, type?: string): void;
28
+ nodes: Node[];
29
+ shards: Map<number, string[]>;
30
+ hostname: string;
31
+ resources: Resources;
32
+ replication: {
33
+ getThisNodeId(auditStore: any): number;
34
+ exportIdMapping(auditStore: any): any;
35
+ getIdOfRemoteNode(remoteNodeName: string, auditStore: any): number;
36
+ replicateOperation(operation: {
37
+ replicated: boolean;
38
+ [key: string]: any;
39
+ }): Promise<{ message: string; replicated?: unknown[] }>;
40
+ monitorNodeCAs(listener: () => void): void;
41
+ sendOperationToNode(node: string, operation: any, options: any): Promise<any>;
42
+ };
43
+ }
44
+ interface Node {
45
+ name: string;
46
+ shard: number;
47
+ url: string;
48
+ }
49
+ export interface ServerOptions {
50
+ port?: number;
51
+ securePort?: number;
52
+ mtls?: boolean;
53
+ usageType?: string;
54
+ }
55
+ interface WebSocketOptions extends ServerOptions {
56
+ subProtocol: string;
57
+ }
58
+ export interface HttpOptions extends ServerOptions {
59
+ runFirst?: boolean;
60
+ }
61
+ export interface ContentTypeHandler {
62
+ serialize(data: any): Buffer | string;
63
+ serializeStream(data: any): Buffer | string;
64
+ deserialize(data: any): Buffer | string;
65
+ q: number;
66
+ }
67
+
68
+ export const server: Server = {
69
+ replication: {
70
+ getThisNodeId() {
71
+ return 0;
72
+ },
73
+ exportIdMapping() {
74
+ return undefined;
75
+ },
76
+ replicateOperation(operation) {
77
+ return operation.replicated
78
+ ? Promise.reject(new Error('Replication not implemented.'))
79
+ : Promise.resolve({ message: '' });
80
+ },
81
+ monitorNodeCAs(_listener: () => void) {
82
+ throw new Error('Replication not implemented.');
83
+ },
84
+ sendOperationToNode() {
85
+ return Promise.reject(new Error('Replication not implemented.'));
86
+ },
87
+ },
88
+ };
89
+ _assignPackageExport('server', server);
@@ -0,0 +1,36 @@
1
+ 'use strict';
2
+
3
+ const env = require('../../../utility/environment/environmentManager.js');
4
+ env.initSync();
5
+ const { CONFIG_PARAMS } = require('../../../utility/hdbTerms.ts');
6
+
7
+ /**
8
+ * Builds CORS options object to pass to cors plugin when/if it needs to be registered with Fastify
9
+ *
10
+ * @returns {{credentials: boolean, origin: boolean, allowedHeaders: [string, string]}}
11
+ */
12
+ function getCORSOptions() {
13
+ let propsCorsAccesslist = env.get(CONFIG_PARAMS.HTTP_CORSACCESSLIST);
14
+ let propsCors = env.get(CONFIG_PARAMS.HTTP_CORS);
15
+ let corsOptions;
16
+ if (propsCors) {
17
+ corsOptions = {
18
+ origin: true,
19
+ allowedHeaders: ['Content-Type', 'Authorization', 'Accept'],
20
+ credentials: false,
21
+ };
22
+ if (
23
+ propsCorsAccesslist &&
24
+ propsCorsAccesslist.length > 0 &&
25
+ propsCorsAccesslist[0] !== null &&
26
+ propsCorsAccesslist[0] !== '*'
27
+ ) {
28
+ corsOptions.origin = (origin, callback) => {
29
+ return callback(null, propsCorsAccesslist.indexOf(origin) !== -1);
30
+ };
31
+ }
32
+ }
33
+ return corsOptions;
34
+ }
35
+
36
+ module.exports = getCORSOptions;
@@ -0,0 +1,15 @@
1
+ 'use strict';
2
+
3
+ const env = require('../../../utility/environment/environmentManager.js');
4
+ env.initSync();
5
+ const terms = require('../../../utility/hdbTerms.ts');
6
+
7
+ /**
8
+ * Returns header timeout value from config file
9
+ * @returns {*}
10
+ */
11
+ function getHeaderTimeoutConfig() {
12
+ return env.get(terms.CONFIG_PARAMS.HTTP_HEADERSTIMEOUT) ?? 60000;
13
+ }
14
+
15
+ module.exports = getHeaderTimeoutConfig;
@@ -0,0 +1,33 @@
1
+ 'use strict';
2
+
3
+ const env = require('../../../utility/environment/environmentManager.js');
4
+ env.initSync();
5
+ const { CONFIG_PARAMS } = require('../../../utility/hdbTerms.ts');
6
+
7
+ // eslint-disable-next-line no-magic-numbers
8
+ const REQ_MAX_BODY_SIZE = 1024 * 1024 * 1024; //this is 1GB in bytes
9
+
10
+ /**
11
+ * Builds server options object to pass to Fastify when using server factory.
12
+ * @param isHttps
13
+ * @returns {{keepAliveTimeout: (*), bodyLimit: number, ignoreTrailingSlash: boolean, connectionTimeout: (*)}}
14
+ */
15
+ function getServerOptions(isHttps) {
16
+ const server_timeout = env.get(CONFIG_PARAMS.HTTP_TIMEOUT);
17
+ const keep_alive_timeout = env.get(CONFIG_PARAMS.HTTP_KEEPALIVETIMEOUT);
18
+ return {
19
+ bodyLimit: REQ_MAX_BODY_SIZE,
20
+ connectionTimeout: server_timeout,
21
+ keepAliveTimeout: keep_alive_timeout,
22
+ return503OnClosing: false,
23
+ forceCloseConnections: true,
24
+ ignoreTrailingSlash: true,
25
+ maxParamLength: env.get(CONFIG_PARAMS.HTTP_MAXPARAMLENGTH) ?? 1000,
26
+ // http2: isHttps, // for now we are not enabling HTTP/2 since it seems to show slower performance
27
+ https: isHttps /* && {
28
+ allowHTTP1: true,
29
+ },*/,
30
+ };
31
+ }
32
+
33
+ module.exports = getServerOptions;
@@ -0,0 +1,39 @@
1
+ 'use strict';
2
+
3
+ const fp = require('fastify-plugin');
4
+
5
+ const {
6
+ handlePostRequest,
7
+ authHandler,
8
+ reqBodyValidationHandler,
9
+ } = require('../../../server/serverHelpers/serverHandlers.js');
10
+
11
+ /**
12
+ * Generates a fastify plugin containing three core methods
13
+ *
14
+ * @param server - a fastify server instance.
15
+ */
16
+ async function hdbCore(server) {
17
+ server.decorate('hdbCore', {
18
+ preValidation: [reqBodyValidationHandler, authHandler],
19
+ request: (request, reply) => convertAsyncIterators(handlePostRequest(request, reply)),
20
+ requestWithoutAuthentication: (request, response) =>
21
+ convertAsyncIterators(handlePostRequest(request, response, true)),
22
+ });
23
+ }
24
+ // We convert responses that can only be asynchronously iterated to (promises of) arrays for
25
+ // backwards compatibility, we do not assume custom functions can handle these.
26
+ async function convertAsyncIterators(response) {
27
+ response = await response;
28
+ if (response?.[Symbol.asyncIterator] && !response[Symbol.iterator]) {
29
+ // requires async iteration to access elements
30
+ let array = [];
31
+ for await (let element of response) {
32
+ array.push(element);
33
+ }
34
+ return array;
35
+ }
36
+ return response;
37
+ }
38
+
39
+ module.exports = fp(hdbCore);