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

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 (446) 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/{resources/ResourceInterfaceV2.js → components/Logger.js} +1 -1
  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 +17 -10
  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/ResourceInterface.d.ts +1 -1
  145. package/dist/resources/RocksIndexStore.d.ts +3 -3
  146. package/dist/resources/RocksTransactionLogStore.d.ts +6 -3
  147. package/dist/resources/Table.d.ts +15 -6
  148. package/dist/resources/Table.js +12 -4
  149. package/dist/resources/Table.js.map +1 -1
  150. package/dist/resources/analytics/read.js +32 -22
  151. package/dist/resources/analytics/read.js.map +1 -1
  152. package/dist/resources/analytics/write.js +3 -6
  153. package/dist/resources/analytics/write.js.map +1 -1
  154. package/dist/resources/auditStore.d.ts +3 -3
  155. package/dist/resources/blob.d.ts +25 -2
  156. package/dist/resources/databases.d.ts +12 -2
  157. package/dist/resources/databases.js +22 -19
  158. package/dist/resources/databases.js.map +1 -1
  159. package/dist/resources/search.js +11 -5
  160. package/dist/resources/search.js.map +1 -1
  161. package/dist/resources/transaction.d.ts +2 -1
  162. package/dist/security/auth.js +1 -1
  163. package/dist/security/auth.js.map +1 -1
  164. package/dist/security/cryptoHash.d.ts +2 -2
  165. package/dist/security/jsLoader.js +265 -73
  166. package/dist/security/jsLoader.js.map +1 -1
  167. package/dist/security/keys.js +11 -12
  168. package/dist/security/keys.js.map +1 -1
  169. package/dist/security/user.js +3 -3
  170. package/dist/security/user.js.map +1 -1
  171. package/dist/server/REST.js +16 -2
  172. package/dist/server/REST.js.map +1 -1
  173. package/dist/server/Server.d.ts +2 -1
  174. package/dist/server/Server.js.map +1 -1
  175. package/dist/server/fastifyRoutes/plugins/hdbCore.d.ts +6 -1
  176. package/dist/server/fastifyRoutes.js +2 -0
  177. package/dist/server/fastifyRoutes.js.map +1 -1
  178. package/dist/server/http.js +12 -6
  179. package/dist/server/http.js.map +1 -1
  180. package/dist/server/jobs/JobObject.d.ts +3 -3
  181. package/dist/server/loadRootComponents.js +1 -0
  182. package/dist/server/loadRootComponents.js.map +1 -1
  183. package/dist/server/operationsServer.js +3 -1
  184. package/dist/server/operationsServer.js.map +1 -1
  185. package/dist/server/serverHelpers/JSONStream.d.ts +3 -3
  186. package/dist/server/serverHelpers/Request.d.ts +5 -5
  187. package/dist/server/serverHelpers/requestTimePlugin.d.ts +1 -1
  188. package/dist/server/threads/manageThreads.d.ts +2 -2
  189. package/dist/server/threads/manageThreads.js +52 -35
  190. package/dist/server/threads/manageThreads.js.map +1 -1
  191. package/dist/server/threads/socketRouter.d.ts +1 -1
  192. package/dist/sqlTranslator/deleteTranslator.d.ts +1 -1
  193. package/dist/utility/AWS/AWSConnector.d.ts +3 -2
  194. package/dist/utility/common_utils.d.ts +3 -3
  195. package/dist/utility/environment/systemInformation.d.ts +1 -0
  196. package/dist/utility/functions/date/dateFunctions.d.ts +11 -11
  197. package/dist/utility/globalSchema.d.ts +1 -1
  198. package/dist/utility/hdbTerms.d.ts +3 -0
  199. package/dist/utility/hdbTerms.js +3 -0
  200. package/dist/utility/hdbTerms.js.map +1 -1
  201. package/dist/utility/installation.d.ts +2 -4
  202. package/dist/utility/installation.js.map +1 -1
  203. package/dist/utility/lmdb/commonUtility.d.ts +2 -1
  204. package/dist/utility/lmdb/commonUtility.js +20 -13
  205. package/dist/utility/lmdb/commonUtility.js.map +1 -1
  206. package/dist/utility/lmdb/deleteUtility.d.ts +1 -0
  207. package/dist/utility/lmdb/environmentUtility.d.ts +1 -0
  208. package/dist/utility/lmdb/searchUtility.d.ts +2 -1
  209. package/dist/utility/lmdb/writeUtility.d.ts +1 -0
  210. package/dist/utility/logging/harper_logger.d.ts +6 -6
  211. package/dist/utility/processManagement/processManagement.d.ts +1 -1
  212. package/dist/utility/processManagement/servicesConfig.d.ts +12 -6
  213. package/dist/validation/common_validators.d.ts +4 -3
  214. package/dist/validation/configValidator.d.ts +3 -2
  215. package/index.d.ts +56 -0
  216. package/index.js +41 -0
  217. package/json/systemSchema.json +373 -0
  218. package/launchServiceScripts/launchHarperDB.js +3 -0
  219. package/launchServiceScripts/utility/checkNodeVersion.js +15 -0
  220. package/package.json +35 -16
  221. package/resources/DatabaseTransaction.ts +378 -0
  222. package/resources/ErrorResource.ts +57 -0
  223. package/resources/IterableEventQueue.ts +94 -0
  224. package/resources/LMDBTransaction.ts +349 -0
  225. package/resources/RecordEncoder.ts +702 -0
  226. package/resources/RequestTarget.ts +134 -0
  227. package/resources/Resource.ts +789 -0
  228. package/resources/ResourceInterface.ts +221 -0
  229. package/resources/Resources.ts +162 -0
  230. package/resources/RocksIndexStore.ts +70 -0
  231. package/resources/RocksTransactionLogStore.ts +352 -0
  232. package/resources/Table.ts +4531 -0
  233. package/resources/analytics/hostnames.ts +72 -0
  234. package/resources/analytics/metadata.ts +10 -0
  235. package/resources/analytics/read.ts +252 -0
  236. package/resources/analytics/write.ts +803 -0
  237. package/resources/auditStore.ts +556 -0
  238. package/resources/blob.ts +1268 -0
  239. package/resources/crdt.ts +125 -0
  240. package/resources/dataLoader.ts +527 -0
  241. package/resources/databases.ts +1290 -0
  242. package/resources/graphql.ts +221 -0
  243. package/resources/indexes/HierarchicalNavigableSmallWorld.ts +638 -0
  244. package/resources/indexes/customIndexes.ts +7 -0
  245. package/resources/indexes/vector.ts +38 -0
  246. package/resources/jsResource.ts +86 -0
  247. package/resources/loadEnv.ts +22 -0
  248. package/resources/login.ts +18 -0
  249. package/resources/openApi.ts +409 -0
  250. package/resources/registrationDeprecated.ts +8 -0
  251. package/resources/replayLogs.ts +136 -0
  252. package/resources/roles.ts +98 -0
  253. package/resources/search.ts +1301 -0
  254. package/resources/tracked.ts +584 -0
  255. package/resources/transaction.ts +89 -0
  256. package/resources/transactionBroadcast.ts +258 -0
  257. package/security/auth.ts +376 -0
  258. package/security/certificateVerification/certificateVerificationSource.ts +84 -0
  259. package/security/certificateVerification/configValidation.ts +107 -0
  260. package/security/certificateVerification/crlVerification.ts +623 -0
  261. package/security/certificateVerification/index.ts +121 -0
  262. package/security/certificateVerification/ocspVerification.ts +148 -0
  263. package/security/certificateVerification/pkijs-ed25519-patch.ts +188 -0
  264. package/security/certificateVerification/types.ts +128 -0
  265. package/security/certificateVerification/verificationConfig.ts +138 -0
  266. package/security/certificateVerification/verificationUtils.ts +447 -0
  267. package/security/cryptoHash.js +42 -0
  268. package/security/data_objects/PermissionAttributeResponseObject.js +15 -0
  269. package/security/data_objects/PermissionResponseObject.js +115 -0
  270. package/security/data_objects/PermissionTableResponseObject.js +20 -0
  271. package/security/fastifyAuth.js +169 -0
  272. package/security/impersonation.ts +160 -0
  273. package/security/jsLoader.ts +733 -0
  274. package/security/keys.js +948 -0
  275. package/security/permissionsTranslator.js +300 -0
  276. package/security/role.js +218 -0
  277. package/security/tokenAuthentication.ts +228 -0
  278. package/security/user.ts +449 -0
  279. package/server/DurableSubscriptionsSession.ts +503 -0
  280. package/server/REST.ts +407 -0
  281. package/server/Server.ts +89 -0
  282. package/server/fastifyRoutes/helpers/getCORSOptions.js +36 -0
  283. package/server/fastifyRoutes/helpers/getHeaderTimeoutConfig.js +15 -0
  284. package/server/fastifyRoutes/helpers/getServerOptions.js +33 -0
  285. package/server/fastifyRoutes/plugins/hdbCore.js +39 -0
  286. package/server/fastifyRoutes.ts +205 -0
  287. package/server/graphqlQuerying.ts +700 -0
  288. package/server/http.ts +640 -0
  289. package/server/itc/serverHandlers.js +161 -0
  290. package/server/itc/utility/ITCEventObject.js +10 -0
  291. package/server/jobs/JobObject.js +24 -0
  292. package/server/jobs/jobProcess.js +69 -0
  293. package/server/jobs/jobRunner.js +162 -0
  294. package/server/jobs/jobs.js +304 -0
  295. package/server/loadRootComponents.js +44 -0
  296. package/server/mqtt.ts +485 -0
  297. package/server/nodeName.ts +75 -0
  298. package/server/operationsServer.ts +313 -0
  299. package/server/serverHelpers/Headers.ts +108 -0
  300. package/server/serverHelpers/JSONStream.ts +269 -0
  301. package/server/serverHelpers/OperationFunctionObject.ts +13 -0
  302. package/server/serverHelpers/Request.ts +158 -0
  303. package/server/serverHelpers/contentTypes.ts +637 -0
  304. package/server/serverHelpers/requestTimePlugin.js +57 -0
  305. package/server/serverHelpers/serverHandlers.js +148 -0
  306. package/server/serverHelpers/serverUtilities.ts +473 -0
  307. package/server/serverRegistry.ts +8 -0
  308. package/server/static.ts +187 -0
  309. package/server/status/definitions.ts +37 -0
  310. package/server/status/index.ts +125 -0
  311. package/server/storageReclamation.ts +93 -0
  312. package/server/threads/itc.js +89 -0
  313. package/server/threads/manageThreads.js +596 -0
  314. package/server/threads/socketRouter.ts +360 -0
  315. package/server/threads/threadServer.js +279 -0
  316. package/server/throttle.ts +73 -0
  317. package/sqlTranslator/SelectValidator.js +330 -0
  318. package/sqlTranslator/alasqlFunctionImporter.js +62 -0
  319. package/sqlTranslator/deleteTranslator.js +67 -0
  320. package/sqlTranslator/index.js +242 -0
  321. package/sqlTranslator/sql_statement_bucket.js +472 -0
  322. package/static/defaultConfig.yaml +3 -0
  323. package/studio/web/HDBDogOnly.svg +78 -0
  324. package/studio/web/assets/PPRadioGrotesk-Bold-DDaUYG8E.woff +0 -0
  325. package/studio/web/assets/fa-brands-400-CEJbCg16.woff +0 -0
  326. package/studio/web/assets/fa-brands-400-CSYNqBb_.ttf +0 -0
  327. package/studio/web/assets/fa-brands-400-DnkPfk3o.eot +0 -0
  328. package/studio/web/assets/fa-brands-400-UxlILjvJ.woff2 +0 -0
  329. package/studio/web/assets/fa-brands-400-cH1MgKbP.svg +3717 -0
  330. package/studio/web/assets/fa-regular-400-BhTwtT8w.eot +0 -0
  331. package/studio/web/assets/fa-regular-400-D1vz6WBx.ttf +0 -0
  332. package/studio/web/assets/fa-regular-400-DFnMcJPd.woff +0 -0
  333. package/studio/web/assets/fa-regular-400-DGzu1beS.woff2 +0 -0
  334. package/studio/web/assets/fa-regular-400-gwj8Pxq-.svg +801 -0
  335. package/studio/web/assets/fa-solid-900-B4ZZ7kfP.svg +5034 -0
  336. package/studio/web/assets/fa-solid-900-B6Axprfb.eot +0 -0
  337. package/studio/web/assets/fa-solid-900-BUswJgRo.woff2 +0 -0
  338. package/studio/web/assets/fa-solid-900-DOXgCApm.woff +0 -0
  339. package/studio/web/assets/fa-solid-900-mxuxnBEa.ttf +0 -0
  340. package/studio/web/assets/index-C1G-Jo6n.js +37 -0
  341. package/studio/web/assets/index-C1G-Jo6n.js.map +1 -0
  342. package/studio/web/assets/index-D-CahN0-.js +2 -0
  343. package/studio/web/assets/index-D-CahN0-.js.map +1 -0
  344. package/studio/web/assets/index-DxlZI0PX.js +235 -0
  345. package/studio/web/assets/index-DxlZI0PX.js.map +1 -0
  346. package/studio/web/assets/index-Y2g_iFpU.css +1 -0
  347. package/studio/web/assets/index-jiPwkrsB.css +1 -0
  348. package/studio/web/assets/index.lazy-BUXDDqq9.js +266 -0
  349. package/studio/web/assets/index.lazy-BUXDDqq9.js.map +1 -0
  350. package/studio/web/assets/profiler-CU93QiSW.js +2 -0
  351. package/studio/web/assets/profiler-CU93QiSW.js.map +1 -0
  352. package/studio/web/assets/react-redux-B8k9Ep7e.js +6 -0
  353. package/studio/web/assets/react-redux-B8k9Ep7e.js.map +1 -0
  354. package/studio/web/assets/startRecording-DFeBXGk6.js +3 -0
  355. package/studio/web/assets/startRecording-DFeBXGk6.js.map +1 -0
  356. package/studio/web/fabric-signup-background.webp +0 -0
  357. package/studio/web/fabric-signup-text.png +0 -0
  358. package/studio/web/favicon_purple.png +0 -0
  359. package/studio/web/github-icon.svg +15 -0
  360. package/studio/web/harper-fabric_black.png +0 -0
  361. package/studio/web/harper-fabric_white.png +0 -0
  362. package/studio/web/harper-studio_white.png +0 -0
  363. package/studio/web/index.html +16 -0
  364. package/studio/web/running.css +148 -0
  365. package/studio/web/running.html +147 -0
  366. package/studio/web/running.js +111 -0
  367. package/upgrade/UpgradeObjects.js +13 -0
  368. package/upgrade/directives/directivesController.js +90 -0
  369. package/upgrade/directivesManager.js +139 -0
  370. package/upgrade/upgradePrompt.js +124 -0
  371. package/upgrade/upgradeUtilities.js +28 -0
  372. package/utility/AWS/AWSConnector.js +29 -0
  373. package/utility/OperationFunctionCaller.js +63 -0
  374. package/utility/assignCmdEnvVariables.js +62 -0
  375. package/utility/common_utils.js +867 -0
  376. package/utility/environment/environmentManager.js +208 -0
  377. package/utility/environment/systemInformation.js +355 -0
  378. package/utility/errors/commonErrors.js +267 -0
  379. package/utility/errors/hdbError.js +146 -0
  380. package/utility/functions/date/dateFunctions.js +65 -0
  381. package/utility/functions/geo.js +355 -0
  382. package/utility/functions/sql/alaSQLExtension.js +104 -0
  383. package/utility/globalSchema.js +35 -0
  384. package/utility/hdbTerms.ts +819 -0
  385. package/utility/install/checkJWTTokensExist.js +62 -0
  386. package/utility/install/harperdb.conf +15 -0
  387. package/utility/install/harperdb.service +14 -0
  388. package/utility/install/installer.js +635 -0
  389. package/utility/installation.ts +30 -0
  390. package/utility/lmdb/DBIDefinition.js +20 -0
  391. package/utility/lmdb/DeleteRecordsResponseObject.js +25 -0
  392. package/utility/lmdb/InsertRecordsResponseObject.js +22 -0
  393. package/utility/lmdb/OpenDBIObject.js +31 -0
  394. package/utility/lmdb/OpenEnvironmentObject.js +41 -0
  395. package/utility/lmdb/UpdateRecordsResponseObject.js +25 -0
  396. package/utility/lmdb/UpsertRecordsResponseObject.js +22 -0
  397. package/utility/lmdb/cleanLMDBMap.js +65 -0
  398. package/utility/lmdb/commonUtility.js +130 -0
  399. package/utility/lmdb/deleteUtility.js +128 -0
  400. package/utility/lmdb/environmentUtility.js +477 -0
  401. package/utility/lmdb/searchCursorFunctions.js +187 -0
  402. package/utility/lmdb/searchUtility.js +918 -0
  403. package/utility/lmdb/terms.js +57 -0
  404. package/utility/lmdb/writeUtility.js +407 -0
  405. package/utility/logging/harper_logger.js +876 -0
  406. package/utility/logging/logRotator.js +157 -0
  407. package/utility/logging/logger.ts +24 -0
  408. package/utility/logging/readLog.js +355 -0
  409. package/utility/logging/transactionLog.js +57 -0
  410. package/utility/mount_hdb.js +59 -0
  411. package/utility/npmUtilities.js +102 -0
  412. package/utility/operationPermissions.ts +112 -0
  413. package/utility/operation_authorization.js +836 -0
  414. package/utility/packageUtils.js +55 -0
  415. package/utility/password.ts +99 -0
  416. package/utility/processManagement/processManagement.js +187 -0
  417. package/utility/processManagement/servicesConfig.js +56 -0
  418. package/utility/scripts/restartHdb.js +24 -0
  419. package/utility/scripts/user_data.sh +13 -0
  420. package/utility/signalling.js +36 -0
  421. package/utility/terms/certificates.js +81 -0
  422. package/utility/when.ts +20 -0
  423. package/validation/bulkDeleteValidator.js +24 -0
  424. package/validation/check_permissions.js +19 -0
  425. package/validation/common_validators.js +95 -0
  426. package/validation/configValidator.js +331 -0
  427. package/validation/deleteValidator.js +15 -0
  428. package/validation/fileLoadValidator.js +153 -0
  429. package/validation/insertValidator.js +40 -0
  430. package/validation/installValidator.js +37 -0
  431. package/validation/readLogValidator.js +64 -0
  432. package/validation/role_validation.js +320 -0
  433. package/validation/schemaMetadataValidator.js +42 -0
  434. package/validation/searchValidator.js +166 -0
  435. package/validation/statusValidator.ts +66 -0
  436. package/validation/transactionLogValidator.js +33 -0
  437. package/validation/user_validation.js +55 -0
  438. package/validation/validationWrapper.js +105 -0
  439. package/dist/resources/ResourceInterfaceV2.d.ts +0 -21
  440. package/dist/resources/ResourceInterfaceV2.js.map +0 -1
  441. package/dist/resources/ResourceV2.d.ts +0 -30
  442. package/dist/resources/ResourceV2.js +0 -27
  443. package/dist/resources/ResourceV2.js.map +0 -1
  444. package/dist/resources/analytics/profile.d.ts +0 -2
  445. package/dist/resources/analytics/profile.js +0 -144
  446. package/dist/resources/analytics/profile.js.map +0 -1
@@ -0,0 +1,15 @@
1
+ 'use strict';
2
+
3
+ const semverMajor = require('semver/functions/major');
4
+ const { packageJson } = require('../../utility/packageUtils.js');
5
+ const INSTALLED_NODE_VERSION = process.versions && process.versions.node ? process.versions.node : undefined;
6
+
7
+ module.exports = checkNodeVersion;
8
+
9
+ function checkNodeVersion() {
10
+ const minimumHdbNodeVersion = packageJson.engines['minimum-node'];
11
+ if (INSTALLED_NODE_VERSION && semverMajor(INSTALLED_NODE_VERSION) < semverMajor(minimumHdbNodeVersion)) {
12
+ const versionError = `The minimum version of Node.js Harper supports is: ${minimumHdbNodeVersion}, the currently installed Node.js version is: ${INSTALLED_NODE_VERSION}. Please install a version of Node.js that is withing the defined range.`;
13
+ return { error: versionError };
14
+ }
15
+ }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@harperfast/harper",
3
3
  "description": "Harper is an open-source Node.js performance platform that unifies database, cache, application, and messaging layers into one in-memory process.",
4
- "version": "5.0.0-alpha.10",
4
+ "version": "5.0.0-beta.3",
5
5
  "license": "Apache-2.0",
6
6
  "homepage": "https://harper.fast",
7
7
  "bugs": {
@@ -23,7 +23,25 @@
23
23
  },
24
24
  "files": [
25
25
  "dist",
26
+ "bin",
27
+ "components",
28
+ "config",
29
+ "dataLayer",
30
+ "json",
31
+ "launchServiceScripts",
32
+ "resources",
33
+ "security",
34
+ "server",
35
+ "sqlTranslator",
36
+ "upgrade",
37
+ "utility",
38
+ "validation",
39
+ "studio",
26
40
  "static",
41
+ "index.*",
42
+ "v1.*",
43
+ "v2.*",
44
+ "README.md",
27
45
  "SECURITY.md",
28
46
  "SUPPORT.md",
29
47
  "CODE_OF_CONDUCT.md"
@@ -31,7 +49,7 @@
31
49
  "scripts": {
32
50
  "build": "tsc --project tsconfig.build.json",
33
51
  "build:watch": "npm run build -- --watch --incremental",
34
- "package": "npm run build; npm shrinkwrap && npm pack",
52
+ "package": "./build-tools/build.sh",
35
53
  "lint": "oxlint --deny-warnings .",
36
54
  "lint:required": "oxlint --quiet .",
37
55
  "lint:fix": "npm run lint -- --fix",
@@ -115,7 +133,7 @@
115
133
  "globals": "^16.5.0",
116
134
  "intercept-stdout": "0.1.2",
117
135
  "mkcert": "^3.2.0",
118
- "mocha": "^11.7.4",
136
+ "mocha": "^11.7.5",
119
137
  "mqtt": "~4.3.8",
120
138
  "oxlint": "^1.31.0",
121
139
  "prettier": "~3.7.3",
@@ -126,20 +144,20 @@
126
144
  "tsx": "^4.20.6",
127
145
  "typescript": "^5.8.2",
128
146
  "typescript-eslint": "^8.45.0",
129
- "undici": "^7.16.0",
147
+ "undici": "^7.24.4",
130
148
  "why-is-node-still-running": "^1.0.0"
131
149
  },
132
150
  "dependencies": {
133
- "@aws-sdk/client-s3": "3.964.0",
151
+ "@aws-sdk/client-s3": "^3.1012.0",
134
152
  "@aws-sdk/lib-storage": "3.964.0",
135
153
  "@datadog/pprof": "^5.11.1",
136
154
  "@endo/static-module-record": "^1.1.2",
137
- "@fastify/autoload": "5.10.0",
138
- "@fastify/compress": "~6.5.0",
139
- "@fastify/cors": "~9.0.1",
140
- "@fastify/static": "~7.0.4",
155
+ "@fastify/autoload": "^6.3.1",
156
+ "@fastify/compress": "^8.3.1",
157
+ "@fastify/cors": "^11.2.0",
158
+ "@fastify/static": "^9.0.0",
141
159
  "@harperfast/extended-iterable": "^1.0.1",
142
- "@harperfast/rocksdb-js": "^0.1.11",
160
+ "@harperfast/rocksdb-js": "^0.1.12",
143
161
  "@turf/area": "6.5.0",
144
162
  "@turf/boolean-contains": "6.5.0",
145
163
  "@turf/boolean-disjoint": "6.5.0",
@@ -150,6 +168,7 @@
150
168
  "@turf/helpers": "6.5.0",
151
169
  "@turf/length": "6.5.0",
152
170
  "alasql": "4.6.6",
171
+ "amaro": "^1.1.8",
153
172
  "argon2": "0.44.0",
154
173
  "asn1js": "3.0.7",
155
174
  "cbor-x": "1.6.4",
@@ -160,8 +179,8 @@
160
179
  "dotenv": "^16.4.7",
161
180
  "easy-ocsp": "1.2.2",
162
181
  "fast-glob": "3.3.3",
163
- "fastify": "~4.29.0",
164
- "fastify-plugin": "~4.5.1",
182
+ "fastify": "^5.8.2",
183
+ "fastify-plugin": "^5.1.0",
165
184
  "fs-extra": "11.3.3",
166
185
  "graphql": "^16.10.0",
167
186
  "graphql-http": "^1.22.4",
@@ -174,8 +193,8 @@
174
193
  "json2csv": "5.0.7",
175
194
  "jsonata": "1.8.7",
176
195
  "jsonwebtoken": "9.0.3",
177
- "lmdb": "3.5.1",
178
- "lodash": "4.17.21",
196
+ "lmdb": "3.5.2",
197
+ "lodash": "^4.17.23",
179
198
  "mathjs": "11.12.0",
180
199
  "micromatch": "^4.0.8",
181
200
  "minimist": "1.2.8",
@@ -203,8 +222,8 @@
203
222
  "ses": "^1.14.0",
204
223
  "stream-chain": "2.2.5",
205
224
  "stream-json": "1.9.1",
206
- "systeminformation": "5.27.11",
207
- "tar-fs": "3.0.9",
225
+ "systeminformation": "^5.31.4",
226
+ "tar-fs": "^3.1.2",
208
227
  "ulidx": "0.5.0",
209
228
  "uuid": "11.1.0",
210
229
  "validate.js": "0.13.1",
@@ -0,0 +1,378 @@
1
+ import { Transaction as LMDBTransaction } from 'lmdb';
2
+ import { getNextMonotonicTime } from '../utility/lmdb/commonUtility.js';
3
+ import { ServerError } from '../utility/errors/hdbError.js';
4
+ import * as harperLogger from '../utility/logging/harper_logger.js';
5
+ import type { Context, Id } from './ResourceInterface.ts';
6
+ import * as envMngr from '../utility/environment/environmentManager.js';
7
+ import { CONFIG_PARAMS } from '../utility/hdbTerms.ts';
8
+ import { convertToMS } from '../utility/common_utils.js';
9
+ import { when } from '../utility/when.ts';
10
+ import { Transaction as RocksTransaction, type Store as RocksStore } from '@harperfast/rocksdb-js';
11
+ import type { RootDatabaseKind } from './databases.ts';
12
+ import type { Entry } from './RecordEncoder.ts';
13
+
14
+ const trackedTxns = new Set<DatabaseTransaction>();
15
+ const MAX_OUTSTANDING_TXN_DURATION = convertToMS(envMngr.get(CONFIG_PARAMS.STORAGE_MAXTRANSACTIONQUEUETIME)) || 45000; // Allow write transactions to be queued for up to 25 seconds before we start rejecting them
16
+ const DEBUG_LONG_TXNS = envMngr.get(CONFIG_PARAMS.STORAGE_DEBUGLONGTRANSACTIONS);
17
+ export const TRANSACTION_STATE = {
18
+ CLOSED: 0, // the transaction has been committed or aborted and can no longer be used for writes (if read txn is active, it can be used for reads)
19
+ OPEN: 1, // the transaction is open and can be used for reads and writes
20
+ LINGERING: 2, // the transaction has completed a read, but can be used for immediate writes
21
+ };
22
+ let outstandingCommit, outstandingCommitStart;
23
+ let confirmReplication;
24
+ export function replicationConfirmation(callback) {
25
+ confirmReplication = callback;
26
+ }
27
+ let txnExpiration = envMngr.get(CONFIG_PARAMS.STORAGE_MAXTRANSACTIONOPENTIME) ?? 30000;
28
+
29
+ class StartedTransaction extends Error {}
30
+
31
+ type MaybePromise<T> = T | Promise<T>;
32
+
33
+ export type CommitOptions = {
34
+ doneWriting?: boolean;
35
+ timestamp?: number;
36
+ retries?: number;
37
+ flush?: boolean;
38
+ };
39
+
40
+ type ReadTransaction = (LMDBTransaction | RocksTransaction) & {
41
+ openTimer?: number;
42
+ retryRisk?: number;
43
+ };
44
+
45
+ export type TransactionWrite = {
46
+ key: Id;
47
+ store: RootDatabaseKind;
48
+ invalidated?: boolean;
49
+ entry?: Partial<Entry>;
50
+ before?: () => void | Promise<void>;
51
+ beforeIntermediate?: () => void | Promise<void>;
52
+ commit?: (txnTime: number, existingEntry: Entry, retry: boolean, transaction: RocksTransaction) => void;
53
+ validate?: (txnTime: number) => void;
54
+ fullUpdate?: boolean;
55
+ saved?: boolean;
56
+ deferSave?: boolean;
57
+ };
58
+
59
+ type RocksTransactionWithRetry = RocksTransaction & { isRetry?: boolean };
60
+
61
+ export class DatabaseTransaction implements Transaction {
62
+ #context: Context;
63
+ writes: TransactionWrite[] = []; // the set of writes to commit if the conditions are met
64
+ completions: Promise<void>[] = []; // the set of outstanding async operations to complete
65
+ db: RootDatabaseKind;
66
+ transaction: RocksTransactionWithRetry;
67
+ readTxn: ReadTransaction;
68
+ readTxnRefCount: number;
69
+ readTxnsUsed: number;
70
+ timeout: number;
71
+ validated = 0;
72
+ timestamp = 0;
73
+ retries = 0;
74
+ declare next: DatabaseTransaction;
75
+ declare stale: boolean;
76
+ declare startedFrom?: {
77
+ resourceName: string;
78
+ method: string;
79
+ };
80
+ declare stackTraces?: StartedTransaction[];
81
+ overloadChecked: boolean;
82
+ open = TRANSACTION_STATE.OPEN;
83
+ replicatedConfirmation: number;
84
+
85
+ getReadTxn(): ReadTransaction {
86
+ this.readTxnRefCount = (this.readTxnRefCount || 0) + 1;
87
+ this.timeout = txnExpiration; // reset the timeout
88
+ if (this.transaction) {
89
+ if (this.transaction.openTimer) this.transaction.openTimer = 0;
90
+ return this.transaction;
91
+ }
92
+ if (this.open !== TRANSACTION_STATE.OPEN) return; // can not start a new read transaction as there is no future commit that will take place, just have to allow the read to latest database state
93
+
94
+ this.transaction = new RocksTransaction(this.db.store);
95
+ if (this.timestamp) {
96
+ this.transaction.setTimestamp(this.timestamp);
97
+ }
98
+
99
+ this.readTxnsUsed = 1;
100
+ if (DEBUG_LONG_TXNS) {
101
+ this.stackTraces = [new StartedTransaction()];
102
+ }
103
+ if (this.transaction.openTimer) this.transaction.openTimer = 0;
104
+ trackedTxns.add(this);
105
+ return this.transaction;
106
+ }
107
+
108
+ useReadTxn() {
109
+ const readTxn = this.getReadTxn();
110
+ if (DEBUG_LONG_TXNS) this.stackTraces.push(new StartedTransaction());
111
+ this.readTxnsUsed++;
112
+ return readTxn;
113
+ }
114
+
115
+ doneReadTxn() {
116
+ if (!this.transaction) return;
117
+ if (--this.readTxnsUsed === 0) {
118
+ trackedTxns.delete(this);
119
+ this.transaction?.abort();
120
+ this.transaction = null;
121
+ }
122
+ }
123
+
124
+ disregardReadTxn(): void {
125
+ if (--this.readTxnRefCount === 0 && this.readTxnsUsed === 1) {
126
+ this.doneReadTxn();
127
+ }
128
+ }
129
+
130
+ checkOverloaded() {
131
+ if (
132
+ outstandingCommit &&
133
+ !this.overloadChecked &&
134
+ performance.now() - outstandingCommitStart > MAX_OUTSTANDING_TXN_DURATION
135
+ ) {
136
+ throw new ServerError('Outstanding write transactions have too long of queue, please try again later', 503);
137
+ }
138
+ this.overloadChecked = true; // only check this once, don't interrupt ongoing transactions that have already made writes
139
+ }
140
+
141
+ addWrite(operation: TransactionWrite) {
142
+ if (this.open === TRANSACTION_STATE.CLOSED) {
143
+ throw new Error('Can not use a transaction that is no longer open');
144
+ }
145
+ this.writes.push(operation);
146
+ if (!operation.deferSave) {
147
+ // Setting saved to false means to defer saving
148
+ this.save(operation);
149
+ }
150
+ return operation;
151
+ }
152
+
153
+ save(operation: TransactionWrite, reloadEntry = false) {
154
+ let txnTime = this.timestamp;
155
+ if (!this.transaction) {
156
+ this.transaction = new RocksTransaction(this.db.store as RocksStore);
157
+ if (txnTime) {
158
+ this.transaction.setTimestamp(txnTime);
159
+ }
160
+ }
161
+ if (this.retries > 0) {
162
+ // this is marks the rocks transaction as a retry so we don't write the transaction log again
163
+ this.transaction.isRetry = true;
164
+ }
165
+ if (!txnTime) txnTime = this.timestamp = this.transaction.getTimestamp();
166
+ if (reloadEntry || operation.entry === undefined) {
167
+ operation.entry = operation.store.getEntry(operation.key, { transaction: this.transaction });
168
+ }
169
+ operation.saved = true;
170
+ // immediately execute in this transaction
171
+ if (operation.validate?.(txnTime) === false) return;
172
+ let result: Promise<void> = operation.before?.() as Promise<void>;
173
+ if (result?.then) this.completions.push(result);
174
+ result = operation.beforeIntermediate?.() as Promise<void>;
175
+ if (result?.then) this.completions.push(result);
176
+ operation.commit(txnTime, operation.entry, this.retries > 0, this.transaction);
177
+ }
178
+
179
+ /**
180
+ * Resolves with information on the timestamp and success of the commit
181
+ */
182
+ commit(options: CommitOptions = {}): MaybePromise<CommitResolution> {
183
+ for (let i = 0; i < this.writes.length; i++) {
184
+ let operation = this.writes[i];
185
+ if (this.retries === 0 && operation.saved) continue;
186
+ this.save(operation, i < this.validated);
187
+ }
188
+ this.validated = this.writes.length;
189
+ return when(this.completions.length > 0 ? Promise.all(this.completions) : null, () => {
190
+ let commitResolution: MaybePromise<void>;
191
+ if (--this.readTxnsUsed > 0) {
192
+ // we still have outstanding iterators using the transaction, we can't just commit/abort it, we will still
193
+ // need to use it
194
+ commitResolution =
195
+ this.writes.length > 0
196
+ ? this.transaction?.commit({ renewAfterCommit: true /* Try to use RocksDB's CommitAndTryCreateSnapshot */ })
197
+ : // don't abort, we still have outstanding reads to complete
198
+ null;
199
+ } else {
200
+ // no more reads need to be performed, just commit/abort based if there are any writes
201
+ trackedTxns.delete(this);
202
+ if (this.transaction) {
203
+ if (this.writes.length > 0) {
204
+ commitResolution = this.transaction.commit();
205
+ } else {
206
+ commitResolution = this.transaction.abort();
207
+ this.transaction = null; // immediately clear transaction, no need to wait
208
+ }
209
+ }
210
+ }
211
+
212
+ if (commitResolution) {
213
+ if (!outstandingCommit) {
214
+ outstandingCommit = commitResolution;
215
+ outstandingCommitStart = performance.now();
216
+ outstandingCommit.finally(() => {
217
+ outstandingCommit = null;
218
+ });
219
+ }
220
+ const completions = [];
221
+ return commitResolution.then(
222
+ () => {
223
+ this.transaction.onCommit?.();
224
+ this.transaction = null; // the native transaction is done (reset if needed)
225
+ if (this.next) {
226
+ completions.push(this.next.commit(options));
227
+ }
228
+ if (options?.flush) {
229
+ completions.push(this.writes[0].store.flushed);
230
+ }
231
+ if (this.replicatedConfirmation) {
232
+ // if we want to wait for replication confirmation, we need to track the transaction times
233
+ // and when replication notifications come in, we count the number of confirms until we reach the desired number
234
+ const databaseName = this.writes[0].store.rootStore.databaseName;
235
+ const lastWrite = this.writes[this.writes.length - 1];
236
+ if (confirmReplication && lastWrite) {
237
+ completions.push(
238
+ confirmReplication(
239
+ databaseName,
240
+ lastWrite.store.getEntry(lastWrite.key).version,
241
+ this.replicatedConfirmation
242
+ )
243
+ );
244
+ }
245
+ }
246
+ // now reset transactions tracking; this transaction be reused and committed again
247
+ this.writes = [];
248
+ if (this.#context?.resourceCache) this.#context.resourceCache = null;
249
+ this.next = null;
250
+ let txnTime = this.timestamp;
251
+ this.timestamp = 0; // reset the timestamp as well
252
+ return Promise.all(completions).then(() => {
253
+ return {
254
+ txnTime,
255
+ };
256
+ });
257
+ },
258
+ (error) => {
259
+ if (error.code === 'ERR_BUSY') {
260
+ // if the transaction failed due to concurrent changes, we need to retry. First record this as an increased risk of contention/retry
261
+ // for future transactions
262
+ this.retries++;
263
+ return this.commit(options); // try again
264
+ } else throw error;
265
+ }
266
+ );
267
+ }
268
+ const txnResolution: CommitResolution = {
269
+ txnTime: this.timestamp,
270
+ };
271
+ if (this.next) {
272
+ // now run any other transactions
273
+ options.timestamp = this.timestamp;
274
+ const nextResolution = this.next?.commit(options);
275
+ if (nextResolution?.then)
276
+ return nextResolution?.then((nextResolution) => ({
277
+ txnTime: this.timestamp,
278
+ next: nextResolution,
279
+ }));
280
+ txnResolution.next = nextResolution;
281
+ }
282
+ return txnResolution;
283
+ });
284
+ }
285
+ abort(): void {
286
+ while (this.readTxnsUsed > 0) this.doneReadTxn(); // release the read snapshot when we abort, we assume we don't need it
287
+ this.open = TRANSACTION_STATE.CLOSED;
288
+ // reset the transaction
289
+ this.writes = [];
290
+ if (this.#context?.resourceCache) this.#context.resourceCache = null;
291
+ }
292
+ directCommitSync(): void {
293
+ trackedTxns.delete(this);
294
+ this.transaction?.commitSync();
295
+ }
296
+ getContext() {
297
+ return this.#context;
298
+ }
299
+ setContext(context) {
300
+ this.#context = context;
301
+ }
302
+ }
303
+ export interface CommitResolution {
304
+ txnTime: number;
305
+ next?: CommitResolution;
306
+ }
307
+ export interface Transaction {
308
+ commit(options): MaybePromise<CommitResolution>;
309
+ abort?(): any;
310
+ }
311
+
312
+ export class ImmediateTransaction extends DatabaseTransaction {
313
+ isCommitting = false;
314
+ constructor(db: RootDatabaseKind) {
315
+ super();
316
+ this.db = db;
317
+ }
318
+ save(transaction: ImmediateTransaction) {
319
+ if (this.isCommitting) {
320
+ // if we are in the commit, do the save and force a reload so we get a read within the transaction
321
+ super.save(transaction, true);
322
+ } else {
323
+ this.isCommitting = true;
324
+ return when(this.commit(), () => {
325
+ this.isCommitting = false;
326
+ });
327
+ }
328
+ }
329
+
330
+ get timestamp() {
331
+ return this._timestamp || (this._timestamp = getNextMonotonicTime());
332
+ }
333
+ getReadTxn() {
334
+ return; // no transaction means read latest
335
+ }
336
+ }
337
+
338
+ let timer;
339
+
340
+ function startMonitoringTxns() {
341
+ timer = setInterval(function () {
342
+ for (const txn of trackedTxns) {
343
+ if (txn.timeout <= 0) {
344
+ const url = txn.getContext()?.url;
345
+ harperLogger.error(
346
+ `Transaction was open too long and has been committed, from table: ${
347
+ txn.db?.name + (url ? ' path: ' + url : '')
348
+ }`,
349
+ ...(txn.startedFrom ? [`was started from ${txn.startedFrom.resourceName}.${txn.startedFrom.method}`] : []),
350
+ ...(DEBUG_LONG_TXNS ? ['starting stack trace', txn.stackTraces] : [])
351
+ );
352
+ // reset the transaction
353
+ try {
354
+ const result = txn.commit();
355
+ if (result?.then) {
356
+ result.catch((error) => {
357
+ harperLogger.debug?.(`Error committing timed out transaction: ${error.message}`);
358
+ });
359
+ }
360
+ } catch (error) {
361
+ harperLogger.debug?.(`Error committing timed out transaction: ${error.message}`);
362
+ }
363
+ txn.timeout = txnExpiration;
364
+ } else {
365
+ txn.timeout -= txnExpiration;
366
+ }
367
+ }
368
+ }, txnExpiration).unref();
369
+ }
370
+
371
+ startMonitoringTxns();
372
+
373
+ export function setTxnExpiration(ms) {
374
+ clearInterval(timer);
375
+ txnExpiration = ms;
376
+ startMonitoringTxns();
377
+ return trackedTxns;
378
+ }
@@ -0,0 +1,57 @@
1
+ import { Resource } from './Resource.ts';
2
+ import type { Context } from './ResourceInterface.ts';
3
+ /**
4
+ * ErrorResource is a Resource that throws an error on any request, communicating to the client when attempts are made
5
+ * to access endpoints/resources that had an internal error in their configuration or setup. This helps ensure that
6
+ * if there is a problem with a resource, it is immediately apparent and can be fixed.
7
+ */
8
+ export class ErrorResource implements Resource {
9
+ error: Error;
10
+ constructor(error: Error) {
11
+ this.error = error;
12
+ }
13
+ isError = true;
14
+ allowRead(): never {
15
+ throw this.error;
16
+ }
17
+ allowUpdate(): never {
18
+ throw this.error;
19
+ }
20
+ allowCreate(): never {
21
+ throw this.error;
22
+ }
23
+ allowDelete(): never {
24
+ throw this.error;
25
+ }
26
+ getId(): never {
27
+ throw this.error;
28
+ }
29
+ getContext(): Context {
30
+ throw this.error;
31
+ }
32
+ get(): never {
33
+ throw this.error;
34
+ }
35
+ post(): never {
36
+ throw this.error;
37
+ }
38
+ put(): never {
39
+ throw this.error;
40
+ }
41
+ delete(): never {
42
+ throw this.error;
43
+ }
44
+ connect(): never {
45
+ throw this.error;
46
+ }
47
+ getResource() {
48
+ // all child paths resolve back to reporting this error
49
+ return this;
50
+ }
51
+ publish(): never {
52
+ throw this.error;
53
+ }
54
+ subscribe(): never {
55
+ throw this.error;
56
+ }
57
+ }
@@ -0,0 +1,94 @@
1
+ import { EventEmitter } from 'events';
2
+
3
+ export class IterableEventQueue<Event extends object = any> extends EventEmitter {
4
+ resolveNext: null | ((args: { value: Event }) => void) = null;
5
+ queue: any[];
6
+ hasDataListeners: boolean;
7
+ drainCloseListener: boolean;
8
+ currentDrainResolver: null | ((draining: boolean) => void) = null;
9
+ [Symbol.asyncIterator](): AsyncIterator<Event> {
10
+ const iterator = new EventQueueIterator<Event>();
11
+ iterator.queue = this;
12
+ // @ts-expect-error The EventQueueIterator is acceptable as an AsyncIterator
13
+ return iterator;
14
+ }
15
+ push(message: Event) {
16
+ this.send(message);
17
+ }
18
+ send(message: Event) {
19
+ if (this.resolveNext) {
20
+ this.resolveNext({ value: message });
21
+ this.resolveNext = null;
22
+ } else if (this.hasDataListeners) {
23
+ this.emit('data', message);
24
+ } else {
25
+ if (!this.queue) this.queue = [];
26
+ this.queue.push(message);
27
+ }
28
+ }
29
+ getNextMessage() {
30
+ const message = this.queue?.shift();
31
+ if (!message) this.emit('drained');
32
+ return message;
33
+ }
34
+
35
+ /**
36
+ * Wait for the queue to be drained, resolving to true to continue or false if the queue was closed before draining.
37
+ */
38
+ waitForDrain(): Promise<boolean> {
39
+ return new Promise((resolve) => {
40
+ if (!this.queue || this.queue.length === 0) resolve(true);
41
+ else {
42
+ this.once('drained', () => resolve(true));
43
+ this.currentDrainResolver = resolve;
44
+ if (!this.drainCloseListener) {
45
+ this.drainCloseListener = true;
46
+ this.on('close', () => {
47
+ this.currentDrainResolver?.(false);
48
+ });
49
+ }
50
+ }
51
+ });
52
+ }
53
+ on(eventName: 'data' | string, listener: ((data: Event) => void) | any) {
54
+ if (eventName === 'data' && !this.hasDataListeners) {
55
+ this.hasDataListeners = true;
56
+ while (this.queue?.length > 0) listener(this.queue.shift());
57
+ }
58
+ return super.on(eventName, listener);
59
+ }
60
+ }
61
+
62
+ class EventQueueIterator<Event extends object = any> implements AsyncIterator<Event> {
63
+ queue: IterableEventQueue<Event>;
64
+ push(message: Event) {
65
+ this.queue.send(message);
66
+ }
67
+ // @ts-expect-error TypeScript is wrong, the JS engine accepts MaybePromise<...>
68
+ next(): { value: Event } | Promise<{ value: Event }> {
69
+ const message = this.queue.getNextMessage();
70
+ if (message) {
71
+ return {
72
+ value: message,
73
+ };
74
+ } else {
75
+ return new Promise((resolve) => (this.queue.resolveNext = resolve));
76
+ }
77
+ }
78
+ // @ts-expect-error TypeScript is wrong, the JS engine accepts MaybePromise<...>
79
+ return(value: Event): { value: Event; done: true } {
80
+ this.queue.emit('close');
81
+ return {
82
+ value,
83
+ done: true,
84
+ };
85
+ }
86
+ // @ts-expect-error TypeScript is wrong, the JS engine accepts MaybePromise<...>
87
+ throw(error) {
88
+ this.queue.emit('close', error);
89
+ return {
90
+ done: true,
91
+ value: undefined,
92
+ };
93
+ }
94
+ }