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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (444) hide show
  1. package/bin/BinObjects.js +17 -0
  2. package/bin/cliOperations.js +157 -0
  3. package/bin/copyDb.ts +280 -0
  4. package/bin/harper.js +156 -0
  5. package/bin/install.js +15 -0
  6. package/bin/lite.js +5 -0
  7. package/bin/restart.js +201 -0
  8. package/bin/run.js +409 -0
  9. package/bin/status.js +65 -0
  10. package/bin/stop.js +22 -0
  11. package/bin/upgrade.js +134 -0
  12. package/components/Application.ts +646 -0
  13. package/components/ApplicationScope.ts +49 -0
  14. package/components/Component.ts +53 -0
  15. package/components/ComponentV1.ts +342 -0
  16. package/components/DEFAULT_CONFIG.ts +18 -0
  17. package/components/EntryHandler.ts +227 -0
  18. package/components/Logger.ts +14 -0
  19. package/components/OptionsWatcher.ts +354 -0
  20. package/components/PluginModule.ts +6 -0
  21. package/components/Scope.ts +329 -0
  22. package/components/componentLoader.ts +529 -0
  23. package/components/deriveCommonPatternBase.ts +31 -0
  24. package/components/deriveGlobOptions.ts +44 -0
  25. package/components/deriveURLPath.ts +57 -0
  26. package/components/operations.js +658 -0
  27. package/components/operationsValidation.js +246 -0
  28. package/components/packageComponent.ts +39 -0
  29. package/components/requestRestart.ts +26 -0
  30. package/components/resolveBaseURLPath.ts +38 -0
  31. package/components/status/ComponentStatus.ts +110 -0
  32. package/components/status/ComponentStatusRegistry.ts +251 -0
  33. package/components/status/api.ts +153 -0
  34. package/components/status/crossThread.ts +405 -0
  35. package/components/status/errors.ts +152 -0
  36. package/components/status/index.ts +44 -0
  37. package/components/status/internal.ts +65 -0
  38. package/components/status/registry.ts +12 -0
  39. package/components/status/types.ts +96 -0
  40. package/config/RootConfigWatcher.ts +59 -0
  41. package/config/configHelpers.ts +11 -0
  42. package/config/configUtils.js +967 -0
  43. package/config/harperConfigEnvVars.ts +641 -0
  44. package/dataLayer/CreateAttributeObject.js +25 -0
  45. package/dataLayer/CreateTableObject.js +11 -0
  46. package/dataLayer/DataLayerObjects.js +43 -0
  47. package/dataLayer/DeleteBeforeObject.js +22 -0
  48. package/dataLayer/DeleteObject.js +25 -0
  49. package/dataLayer/DropAttributeObject.js +11 -0
  50. package/dataLayer/GetBackupObject.js +22 -0
  51. package/dataLayer/InsertObject.js +24 -0
  52. package/dataLayer/ReadAuditLogObject.js +24 -0
  53. package/dataLayer/SQLSearch.js +1335 -0
  54. package/dataLayer/SearchByConditionsObject.js +61 -0
  55. package/dataLayer/SearchByHashObject.js +21 -0
  56. package/dataLayer/SearchObject.js +45 -0
  57. package/dataLayer/SqlSearchObject.js +14 -0
  58. package/dataLayer/UpdateObject.js +23 -0
  59. package/dataLayer/UpsertObject.js +23 -0
  60. package/dataLayer/bulkLoad.js +813 -0
  61. package/dataLayer/dataObjects/BulkLoadObjects.js +27 -0
  62. package/dataLayer/dataObjects/UpsertObject.js +23 -0
  63. package/dataLayer/delete.js +164 -0
  64. package/dataLayer/export.js +381 -0
  65. package/dataLayer/getBackup.js +40 -0
  66. package/dataLayer/harperBridge/BridgeMethods.js +81 -0
  67. package/dataLayer/harperBridge/ResourceBridge.ts +633 -0
  68. package/dataLayer/harperBridge/bridgeUtility/insertUpdateReturnObj.js +28 -0
  69. package/dataLayer/harperBridge/bridgeUtility/insertUpdateValidate.js +88 -0
  70. package/dataLayer/harperBridge/harperBridge.js +21 -0
  71. package/dataLayer/harperBridge/lmdbBridge/LMDBBridge.js +119 -0
  72. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/DeleteAuditLogsBeforeResults.js +19 -0
  73. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateAttribute.js +112 -0
  74. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateRecords.js +67 -0
  75. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateSchema.js +31 -0
  76. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateTable.js +94 -0
  77. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDeleteAuditLogsBefore.js +98 -0
  78. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDeleteRecords.js +89 -0
  79. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDropAttribute.js +109 -0
  80. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDropSchema.js +107 -0
  81. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDropTable.js +137 -0
  82. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbFlush.js +35 -0
  83. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbGetBackup.js +111 -0
  84. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbGetDataByHash.js +28 -0
  85. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbGetDataByValue.js +29 -0
  86. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbReadAuditLog.js +207 -0
  87. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbSearchByConditions.js +156 -0
  88. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbSearchByHash.js +21 -0
  89. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbSearchByValue.js +30 -0
  90. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbTransaction.js +19 -0
  91. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbUpdateRecords.js +64 -0
  92. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbUpsertRecords.js +70 -0
  93. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBCreateAttributeObject.js +22 -0
  94. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBDeleteTransactionObject.js +23 -0
  95. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBInsertTransactionObject.js +22 -0
  96. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBTransactionObject.js +23 -0
  97. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBUpdateTransactionObject.js +24 -0
  98. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBUpsertTransactionObject.js +24 -0
  99. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/TableSizeObject.js +25 -0
  100. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/initializeHashSearch.js +21 -0
  101. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/initializePaths.js +157 -0
  102. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbCheckForNewAttributes.js +94 -0
  103. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbCreateTransactionsAuditEnvironment.js +39 -0
  104. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbGetTableSize.js +34 -0
  105. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbProcessRows.js +100 -0
  106. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbSearch.js +371 -0
  107. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbWriteTransaction.js +109 -0
  108. package/dataLayer/hdbInfoController.js +254 -0
  109. package/dataLayer/insert.js +266 -0
  110. package/dataLayer/readAuditLog.js +59 -0
  111. package/dataLayer/schema.js +366 -0
  112. package/dataLayer/schemaDescribe.js +289 -0
  113. package/dataLayer/search.js +60 -0
  114. package/dataLayer/transaction.js +17 -0
  115. package/dataLayer/update.js +124 -0
  116. package/dist/components/Logger.d.ts +12 -0
  117. package/dist/components/Logger.js +3 -0
  118. package/dist/components/Logger.js.map +1 -0
  119. package/dist/components/Scope.d.ts +14 -4
  120. package/dist/components/Scope.js +18 -10
  121. package/dist/components/Scope.js.map +1 -1
  122. package/dist/components/componentLoader.js +16 -9
  123. package/dist/components/componentLoader.js.map +1 -1
  124. package/dist/components/operations.js +2 -2
  125. package/dist/components/operations.js.map +1 -1
  126. package/dist/config/configUtils.d.ts +1 -1
  127. package/dist/config/configUtils.js +1 -1
  128. package/dist/config/configUtils.js.map +1 -1
  129. package/dist/dataLayer/CreateTableObject.d.ts +2 -2
  130. package/dist/dataLayer/CreateTableObject.js +2 -2
  131. package/dist/dataLayer/CreateTableObject.js.map +1 -1
  132. package/dist/dataLayer/delete.d.ts +1 -1
  133. package/dist/dataLayer/schema.js +6 -5
  134. package/dist/dataLayer/schema.js.map +1 -1
  135. package/dist/dataLayer/schemaDescribe.js +1 -1
  136. package/dist/dataLayer/schemaDescribe.js.map +1 -1
  137. package/dist/index.d.ts +1 -1
  138. package/dist/index.js +2 -0
  139. package/dist/index.js.map +1 -1
  140. package/dist/resources/DatabaseTransaction.d.ts +1 -1
  141. package/dist/resources/IterableEventQueue.d.ts +1 -1
  142. package/dist/resources/LMDBTransaction.d.ts +5 -1
  143. package/dist/resources/Resource.d.ts +1 -1
  144. package/dist/resources/RocksIndexStore.d.ts +3 -3
  145. package/dist/resources/RocksTransactionLogStore.d.ts +6 -3
  146. package/dist/resources/Table.d.ts +15 -6
  147. package/dist/resources/Table.js +4 -1
  148. package/dist/resources/Table.js.map +1 -1
  149. package/dist/resources/analytics/read.js +32 -22
  150. package/dist/resources/analytics/read.js.map +1 -1
  151. package/dist/resources/analytics/write.js +3 -6
  152. package/dist/resources/analytics/write.js.map +1 -1
  153. package/dist/resources/auditStore.d.ts +3 -3
  154. package/dist/resources/blob.d.ts +25 -2
  155. package/dist/resources/databases.d.ts +12 -2
  156. package/dist/resources/databases.js +22 -19
  157. package/dist/resources/databases.js.map +1 -1
  158. package/dist/resources/search.js +11 -5
  159. package/dist/resources/search.js.map +1 -1
  160. package/dist/resources/transaction.d.ts +2 -1
  161. package/dist/security/auth.js +1 -1
  162. package/dist/security/auth.js.map +1 -1
  163. package/dist/security/cryptoHash.d.ts +2 -2
  164. package/dist/security/jsLoader.js +243 -66
  165. package/dist/security/jsLoader.js.map +1 -1
  166. package/dist/security/keys.js +4 -5
  167. package/dist/security/keys.js.map +1 -1
  168. package/dist/security/user.js +3 -3
  169. package/dist/security/user.js.map +1 -1
  170. package/dist/server/REST.js +16 -2
  171. package/dist/server/REST.js.map +1 -1
  172. package/dist/server/Server.d.ts +2 -1
  173. package/dist/server/Server.js.map +1 -1
  174. package/dist/server/fastifyRoutes/plugins/hdbCore.d.ts +6 -1
  175. package/dist/server/fastifyRoutes.js +2 -0
  176. package/dist/server/fastifyRoutes.js.map +1 -1
  177. package/dist/server/http.js +12 -6
  178. package/dist/server/http.js.map +1 -1
  179. package/dist/server/jobs/JobObject.d.ts +3 -3
  180. package/dist/server/loadRootComponents.js +1 -0
  181. package/dist/server/loadRootComponents.js.map +1 -1
  182. package/dist/server/operationsServer.js +3 -1
  183. package/dist/server/operationsServer.js.map +1 -1
  184. package/dist/server/serverHelpers/JSONStream.d.ts +3 -3
  185. package/dist/server/serverHelpers/Request.d.ts +5 -5
  186. package/dist/server/serverHelpers/requestTimePlugin.d.ts +1 -1
  187. package/dist/server/threads/manageThreads.d.ts +2 -2
  188. package/dist/server/threads/manageThreads.js +50 -35
  189. package/dist/server/threads/manageThreads.js.map +1 -1
  190. package/dist/server/threads/socketRouter.d.ts +1 -1
  191. package/dist/sqlTranslator/deleteTranslator.d.ts +1 -1
  192. package/dist/utility/AWS/AWSConnector.d.ts +3 -2
  193. package/dist/utility/common_utils.d.ts +3 -3
  194. package/dist/utility/environment/systemInformation.d.ts +1 -0
  195. package/dist/utility/functions/date/dateFunctions.d.ts +11 -11
  196. package/dist/utility/globalSchema.d.ts +1 -1
  197. package/dist/utility/hdbTerms.d.ts +3 -0
  198. package/dist/utility/hdbTerms.js +3 -0
  199. package/dist/utility/hdbTerms.js.map +1 -1
  200. package/dist/utility/installation.d.ts +2 -4
  201. package/dist/utility/installation.js.map +1 -1
  202. package/dist/utility/lmdb/commonUtility.d.ts +1 -0
  203. package/dist/utility/lmdb/deleteUtility.d.ts +1 -0
  204. package/dist/utility/lmdb/environmentUtility.d.ts +1 -0
  205. package/dist/utility/lmdb/searchUtility.d.ts +2 -1
  206. package/dist/utility/lmdb/writeUtility.d.ts +1 -0
  207. package/dist/utility/logging/harper_logger.d.ts +6 -6
  208. package/dist/utility/processManagement/processManagement.d.ts +1 -1
  209. package/dist/utility/processManagement/servicesConfig.d.ts +12 -6
  210. package/dist/validation/common_validators.d.ts +4 -3
  211. package/dist/validation/configValidator.d.ts +3 -2
  212. package/index.d.ts +56 -0
  213. package/index.js +41 -0
  214. package/json/systemSchema.json +373 -0
  215. package/launchServiceScripts/launchHarperDB.js +3 -0
  216. package/launchServiceScripts/utility/checkNodeVersion.js +15 -0
  217. package/package.json +21 -3
  218. package/resources/DatabaseTransaction.ts +378 -0
  219. package/resources/ErrorResource.ts +57 -0
  220. package/resources/IterableEventQueue.ts +94 -0
  221. package/resources/LMDBTransaction.ts +349 -0
  222. package/resources/RecordEncoder.ts +702 -0
  223. package/resources/RequestTarget.ts +134 -0
  224. package/resources/Resource.ts +789 -0
  225. package/resources/ResourceInterface.ts +221 -0
  226. package/resources/ResourceInterfaceV2.ts +53 -0
  227. package/resources/ResourceV2.ts +67 -0
  228. package/resources/Resources.ts +162 -0
  229. package/resources/RocksIndexStore.ts +70 -0
  230. package/resources/RocksTransactionLogStore.ts +352 -0
  231. package/resources/Table.ts +4527 -0
  232. package/resources/analytics/hostnames.ts +72 -0
  233. package/resources/analytics/metadata.ts +10 -0
  234. package/resources/analytics/read.ts +252 -0
  235. package/resources/analytics/write.ts +803 -0
  236. package/resources/auditStore.ts +556 -0
  237. package/resources/blob.ts +1268 -0
  238. package/resources/crdt.ts +125 -0
  239. package/resources/dataLoader.ts +527 -0
  240. package/resources/databases.ts +1290 -0
  241. package/resources/graphql.ts +221 -0
  242. package/resources/indexes/HierarchicalNavigableSmallWorld.ts +638 -0
  243. package/resources/indexes/customIndexes.ts +7 -0
  244. package/resources/indexes/vector.ts +38 -0
  245. package/resources/jsResource.ts +86 -0
  246. package/resources/loadEnv.ts +22 -0
  247. package/resources/login.ts +18 -0
  248. package/resources/openApi.ts +409 -0
  249. package/resources/registrationDeprecated.ts +8 -0
  250. package/resources/replayLogs.ts +136 -0
  251. package/resources/roles.ts +98 -0
  252. package/resources/search.ts +1301 -0
  253. package/resources/tracked.ts +584 -0
  254. package/resources/transaction.ts +89 -0
  255. package/resources/transactionBroadcast.ts +258 -0
  256. package/security/auth.ts +376 -0
  257. package/security/certificateVerification/certificateVerificationSource.ts +84 -0
  258. package/security/certificateVerification/configValidation.ts +107 -0
  259. package/security/certificateVerification/crlVerification.ts +623 -0
  260. package/security/certificateVerification/index.ts +121 -0
  261. package/security/certificateVerification/ocspVerification.ts +148 -0
  262. package/security/certificateVerification/pkijs-ed25519-patch.ts +188 -0
  263. package/security/certificateVerification/types.ts +128 -0
  264. package/security/certificateVerification/verificationConfig.ts +138 -0
  265. package/security/certificateVerification/verificationUtils.ts +447 -0
  266. package/security/cryptoHash.js +42 -0
  267. package/security/data_objects/PermissionAttributeResponseObject.js +15 -0
  268. package/security/data_objects/PermissionResponseObject.js +115 -0
  269. package/security/data_objects/PermissionTableResponseObject.js +20 -0
  270. package/security/fastifyAuth.js +169 -0
  271. package/security/impersonation.ts +160 -0
  272. package/security/jsLoader.ts +716 -0
  273. package/security/keys.js +948 -0
  274. package/security/permissionsTranslator.js +300 -0
  275. package/security/role.js +218 -0
  276. package/security/tokenAuthentication.ts +228 -0
  277. package/security/user.ts +449 -0
  278. package/server/DurableSubscriptionsSession.ts +503 -0
  279. package/server/REST.ts +407 -0
  280. package/server/Server.ts +89 -0
  281. package/server/fastifyRoutes/helpers/getCORSOptions.js +36 -0
  282. package/server/fastifyRoutes/helpers/getHeaderTimeoutConfig.js +15 -0
  283. package/server/fastifyRoutes/helpers/getServerOptions.js +33 -0
  284. package/server/fastifyRoutes/plugins/hdbCore.js +39 -0
  285. package/server/fastifyRoutes.ts +205 -0
  286. package/server/graphqlQuerying.ts +700 -0
  287. package/server/http.ts +640 -0
  288. package/server/itc/serverHandlers.js +161 -0
  289. package/server/itc/utility/ITCEventObject.js +10 -0
  290. package/server/jobs/JobObject.js +24 -0
  291. package/server/jobs/jobProcess.js +69 -0
  292. package/server/jobs/jobRunner.js +162 -0
  293. package/server/jobs/jobs.js +304 -0
  294. package/server/loadRootComponents.js +44 -0
  295. package/server/mqtt.ts +485 -0
  296. package/server/nodeName.ts +75 -0
  297. package/server/operationsServer.ts +313 -0
  298. package/server/serverHelpers/Headers.ts +108 -0
  299. package/server/serverHelpers/JSONStream.ts +269 -0
  300. package/server/serverHelpers/OperationFunctionObject.ts +13 -0
  301. package/server/serverHelpers/Request.ts +158 -0
  302. package/server/serverHelpers/contentTypes.ts +637 -0
  303. package/server/serverHelpers/requestTimePlugin.js +57 -0
  304. package/server/serverHelpers/serverHandlers.js +148 -0
  305. package/server/serverHelpers/serverUtilities.ts +473 -0
  306. package/server/serverRegistry.ts +8 -0
  307. package/server/static.ts +187 -0
  308. package/server/status/definitions.ts +37 -0
  309. package/server/status/index.ts +125 -0
  310. package/server/storageReclamation.ts +93 -0
  311. package/server/threads/itc.js +89 -0
  312. package/server/threads/manageThreads.js +594 -0
  313. package/server/threads/socketRouter.ts +360 -0
  314. package/server/threads/threadServer.js +279 -0
  315. package/server/throttle.ts +73 -0
  316. package/sqlTranslator/SelectValidator.js +330 -0
  317. package/sqlTranslator/alasqlFunctionImporter.js +62 -0
  318. package/sqlTranslator/deleteTranslator.js +67 -0
  319. package/sqlTranslator/index.js +242 -0
  320. package/sqlTranslator/sql_statement_bucket.js +472 -0
  321. package/static/defaultConfig.yaml +3 -0
  322. package/studio/web/HDBDogOnly.svg +78 -0
  323. package/studio/web/assets/PPRadioGrotesk-Bold-DDaUYG8E.woff +0 -0
  324. package/studio/web/assets/fa-brands-400-CEJbCg16.woff +0 -0
  325. package/studio/web/assets/fa-brands-400-CSYNqBb_.ttf +0 -0
  326. package/studio/web/assets/fa-brands-400-DnkPfk3o.eot +0 -0
  327. package/studio/web/assets/fa-brands-400-UxlILjvJ.woff2 +0 -0
  328. package/studio/web/assets/fa-brands-400-cH1MgKbP.svg +3717 -0
  329. package/studio/web/assets/fa-regular-400-BhTwtT8w.eot +0 -0
  330. package/studio/web/assets/fa-regular-400-D1vz6WBx.ttf +0 -0
  331. package/studio/web/assets/fa-regular-400-DFnMcJPd.woff +0 -0
  332. package/studio/web/assets/fa-regular-400-DGzu1beS.woff2 +0 -0
  333. package/studio/web/assets/fa-regular-400-gwj8Pxq-.svg +801 -0
  334. package/studio/web/assets/fa-solid-900-B4ZZ7kfP.svg +5034 -0
  335. package/studio/web/assets/fa-solid-900-B6Axprfb.eot +0 -0
  336. package/studio/web/assets/fa-solid-900-BUswJgRo.woff2 +0 -0
  337. package/studio/web/assets/fa-solid-900-DOXgCApm.woff +0 -0
  338. package/studio/web/assets/fa-solid-900-mxuxnBEa.ttf +0 -0
  339. package/studio/web/assets/index-BTgXJX9d.js +235 -0
  340. package/studio/web/assets/index-BTgXJX9d.js.map +1 -0
  341. package/studio/web/assets/index-C-GXfcup.js +37 -0
  342. package/studio/web/assets/index-C-GXfcup.js.map +1 -0
  343. package/studio/web/assets/index-PFlNdimM.js +2 -0
  344. package/studio/web/assets/index-PFlNdimM.js.map +1 -0
  345. package/studio/web/assets/index-Y2g_iFpU.css +1 -0
  346. package/studio/web/assets/index-jiPwkrsB.css +1 -0
  347. package/studio/web/assets/index.lazy-C3TJZJ4o.js +266 -0
  348. package/studio/web/assets/index.lazy-C3TJZJ4o.js.map +1 -0
  349. package/studio/web/assets/profiler-DotzgiCJ.js +2 -0
  350. package/studio/web/assets/profiler-DotzgiCJ.js.map +1 -0
  351. package/studio/web/assets/react-redux-VxUEx_mU.js +6 -0
  352. package/studio/web/assets/react-redux-VxUEx_mU.js.map +1 -0
  353. package/studio/web/assets/startRecording-B_9J9Csd.js +3 -0
  354. package/studio/web/assets/startRecording-B_9J9Csd.js.map +1 -0
  355. package/studio/web/fabric-signup-background.webp +0 -0
  356. package/studio/web/fabric-signup-text.png +0 -0
  357. package/studio/web/favicon_purple.png +0 -0
  358. package/studio/web/github-icon.svg +15 -0
  359. package/studio/web/harper-fabric_black.png +0 -0
  360. package/studio/web/harper-fabric_white.png +0 -0
  361. package/studio/web/harper-studio_white.png +0 -0
  362. package/studio/web/index.html +16 -0
  363. package/studio/web/running.css +148 -0
  364. package/studio/web/running.html +147 -0
  365. package/studio/web/running.js +111 -0
  366. package/upgrade/UpgradeObjects.js +13 -0
  367. package/upgrade/directives/directivesController.js +90 -0
  368. package/upgrade/directivesManager.js +139 -0
  369. package/upgrade/upgradePrompt.js +124 -0
  370. package/upgrade/upgradeUtilities.js +28 -0
  371. package/utility/AWS/AWSConnector.js +29 -0
  372. package/utility/OperationFunctionCaller.js +63 -0
  373. package/utility/assignCmdEnvVariables.js +62 -0
  374. package/utility/common_utils.js +867 -0
  375. package/utility/environment/environmentManager.js +208 -0
  376. package/utility/environment/systemInformation.js +355 -0
  377. package/utility/errors/commonErrors.js +267 -0
  378. package/utility/errors/hdbError.js +146 -0
  379. package/utility/functions/date/dateFunctions.js +65 -0
  380. package/utility/functions/geo.js +355 -0
  381. package/utility/functions/sql/alaSQLExtension.js +104 -0
  382. package/utility/globalSchema.js +35 -0
  383. package/utility/hdbTerms.ts +819 -0
  384. package/utility/install/checkJWTTokensExist.js +62 -0
  385. package/utility/install/harperdb.conf +15 -0
  386. package/utility/install/harperdb.service +14 -0
  387. package/utility/install/installer.js +635 -0
  388. package/utility/installation.ts +30 -0
  389. package/utility/lmdb/DBIDefinition.js +20 -0
  390. package/utility/lmdb/DeleteRecordsResponseObject.js +25 -0
  391. package/utility/lmdb/InsertRecordsResponseObject.js +22 -0
  392. package/utility/lmdb/OpenDBIObject.js +31 -0
  393. package/utility/lmdb/OpenEnvironmentObject.js +41 -0
  394. package/utility/lmdb/UpdateRecordsResponseObject.js +25 -0
  395. package/utility/lmdb/UpsertRecordsResponseObject.js +22 -0
  396. package/utility/lmdb/cleanLMDBMap.js +65 -0
  397. package/utility/lmdb/commonUtility.js +119 -0
  398. package/utility/lmdb/deleteUtility.js +128 -0
  399. package/utility/lmdb/environmentUtility.js +477 -0
  400. package/utility/lmdb/searchCursorFunctions.js +187 -0
  401. package/utility/lmdb/searchUtility.js +918 -0
  402. package/utility/lmdb/terms.js +57 -0
  403. package/utility/lmdb/writeUtility.js +407 -0
  404. package/utility/logging/harper_logger.js +876 -0
  405. package/utility/logging/logRotator.js +157 -0
  406. package/utility/logging/logger.ts +24 -0
  407. package/utility/logging/readLog.js +355 -0
  408. package/utility/logging/transactionLog.js +57 -0
  409. package/utility/mount_hdb.js +59 -0
  410. package/utility/npmUtilities.js +102 -0
  411. package/utility/operationPermissions.ts +112 -0
  412. package/utility/operation_authorization.js +836 -0
  413. package/utility/packageUtils.js +55 -0
  414. package/utility/password.ts +99 -0
  415. package/utility/processManagement/processManagement.js +187 -0
  416. package/utility/processManagement/servicesConfig.js +56 -0
  417. package/utility/scripts/restartHdb.js +24 -0
  418. package/utility/scripts/user_data.sh +13 -0
  419. package/utility/signalling.js +36 -0
  420. package/utility/terms/certificates.js +81 -0
  421. package/utility/when.ts +20 -0
  422. package/v1.d.ts +39 -0
  423. package/v1.js +41 -0
  424. package/v2.d.ts +39 -0
  425. package/v2.js +41 -0
  426. package/validation/bulkDeleteValidator.js +24 -0
  427. package/validation/check_permissions.js +19 -0
  428. package/validation/common_validators.js +95 -0
  429. package/validation/configValidator.js +331 -0
  430. package/validation/deleteValidator.js +15 -0
  431. package/validation/fileLoadValidator.js +153 -0
  432. package/validation/insertValidator.js +40 -0
  433. package/validation/installValidator.js +37 -0
  434. package/validation/readLogValidator.js +64 -0
  435. package/validation/role_validation.js +320 -0
  436. package/validation/schemaMetadataValidator.js +42 -0
  437. package/validation/searchValidator.js +166 -0
  438. package/validation/statusValidator.ts +66 -0
  439. package/validation/transactionLogValidator.js +33 -0
  440. package/validation/user_validation.js +55 -0
  441. package/validation/validationWrapper.js +105 -0
  442. package/dist/resources/analytics/profile.d.ts +0 -2
  443. package/dist/resources/analytics/profile.js +0 -144
  444. package/dist/resources/analytics/profile.js.map +0 -1
@@ -0,0 +1,221 @@
1
+ import type { User } from '../security/user.ts';
2
+ import type { OperationFunctionName } from '../server/serverHelpers/serverUtilities.ts';
3
+ import { DatabaseTransaction } from './DatabaseTransaction.ts';
4
+ import { IterableEventQueue } from './IterableEventQueue.ts';
5
+ import type { Entry, RecordObject } from './RecordEncoder.ts';
6
+ import { RequestTarget } from './RequestTarget.ts';
7
+
8
+ export interface ResourceInterface<Record extends object = any>
9
+ extends Partial<RecordObject>, Pick<UpdatableRecord<Record>, 'addTo' | 'subtractFrom'> {
10
+ allowRead(user: User, target: RequestTarget, context: Context): boolean | Promise<boolean>;
11
+ get?(
12
+ target?: RequestTargetOrId
13
+ ):
14
+ | (Record & Partial<RecordObject>)
15
+ | Promise<Record & Partial<RecordObject>>
16
+ | AsyncIterable<Record & Partial<RecordObject>>
17
+ | Promise<AsyncIterable<Record & Partial<RecordObject>>>;
18
+ search?(target: RequestTarget): AsyncIterable<Record & Partial<RecordObject>>;
19
+
20
+ allowCreate(user: User, record: Promise<Record & RecordObject>, context: Context): boolean | Promise<boolean>;
21
+ create?(
22
+ newRecord: Partial<Record & RecordObject>,
23
+ target: RequestTargetOrId
24
+ ): void | (Record & Partial<RecordObject>) | Promise<Record & Partial<RecordObject>>;
25
+ post?(
26
+ target: RequestTargetOrId,
27
+ newRecord: Partial<Record & RecordObject>
28
+ ): void | (Record & Partial<RecordObject>) | Promise<Record & Partial<RecordObject>>;
29
+
30
+ allowUpdate(user: User, record: Promise<Record & RecordObject>, context: Context): boolean | Promise<boolean>;
31
+ put?(
32
+ record: Record & RecordObject,
33
+ target: RequestTargetOrId
34
+ ): void | (Record & Partial<RecordObject>) | Promise<void | (Record & Partial<RecordObject>)>;
35
+ patch?(
36
+ record: Partial<Record & RecordObject>,
37
+ target: RequestTargetOrId
38
+ ): void | (Record & Partial<RecordObject>) | Promise<void | (Record & Partial<RecordObject>)>;
39
+ update?(updates: Record & RecordObject, fullUpdate: true): ResourceInterface<Record & Partial<RecordObject>>;
40
+ update?(
41
+ updates: Partial<Record & RecordObject>,
42
+ fullUpdate?: boolean
43
+ ):
44
+ | ResourceInterface<Record & Partial<RecordObject>>
45
+ | Promise<ResourceInterface<Record & Partial<RecordObject>> | UpdatableRecord<Record & Partial<RecordObject>>>;
46
+
47
+ allowDelete(user: User, target: RequestTarget, context: Context): boolean | Promise<boolean>;
48
+ delete?(target: RequestTargetOrId): boolean | Promise<boolean>;
49
+
50
+ invalidate(target: RequestTargetOrId): void | Promise<void>;
51
+
52
+ publish?(target: RequestTargetOrId, record: Record, options?: any): void;
53
+ subscribe?(request: SubscriptionRequest): AsyncIterable<Record> | Promise<AsyncIterable<Record>>;
54
+
55
+ doesExist(): boolean;
56
+ wasLoadedFromSource(): boolean | void;
57
+
58
+ getCurrentUser(): User | undefined;
59
+ }
60
+
61
+ export interface Session {
62
+ id?: any;
63
+ user?: User;
64
+ update: (updatedSession: any) => unknown;
65
+ delete: (id: any) => Promise<void>;
66
+ }
67
+
68
+ export interface Context {
69
+ /** The user making the request */
70
+ user?: User;
71
+ /** Check the username and password against the core user table to verify user identity */
72
+ login: (username: string, password: string) => Promise<string>;
73
+ /** Describes the current cookie-based session if it is present and grants the capacity to delete it. authentication.enableSessions must be turned on in the harperdb-config.yaml */
74
+ session?: Session;
75
+ /** The database transaction object */
76
+ transaction?: DatabaseTransaction;
77
+ /** If the operation that will be performed with this context should check user authorization */
78
+ authorize?: boolean;
79
+ /** The last modification time of any data that has been accessed with this context */
80
+ lastModified?: number;
81
+ /** The time at which a saved record should expire */
82
+ expiresAt?: number;
83
+ /** Indicates that caching should not be applied */
84
+ noCache?: boolean;
85
+ /** Indicates that values from the source data should be stored as a cached value */
86
+ noCacheStore?: boolean;
87
+ /** Only return values from the table, and don't use data from the source */
88
+ onlyIfCached?: boolean;
89
+ /** Allows data from a caching table to be used if there is an error retrieving data from the source */
90
+ staleIfError?: boolean;
91
+ /** Indicates any cached data must be revalidated */
92
+ mustRevalidate?: boolean;
93
+ /** An array of nodes to replicate to */
94
+ replicateTo?: string[];
95
+ replicateFrom?: boolean;
96
+ replicatedConfirmation?: number;
97
+ originatingOperation?: OperationFunctionName;
98
+ previousResidency?: string[];
99
+ loadedFromSource?: boolean;
100
+ nodeName?: string;
101
+ resourceCache?: Map<Id, any>;
102
+ _freezeRecords?: boolean; // until v5, we conditionally freeze records for back-compat
103
+ timestamp?: number;
104
+ }
105
+
106
+ export interface SourceContext<TRequestContext = Context, Record extends object = any> {
107
+ /** The original request context passed from the caching layer */
108
+ requestContext: TRequestContext;
109
+ /** The existing record, from the existing entry (if any) */
110
+ replacingRecord?: Record;
111
+ /** The existing database entry (if any) */
112
+ replacingEntry?: Entry;
113
+ /** The version/timestamp of the existing record */
114
+ replacingVersion?: number;
115
+ /** Indicates that values from the source data should NOT be stored as a cached value */
116
+ noCacheStore?: boolean;
117
+ /** Reference to the source Resource instance */
118
+ source?: ResourceInterface<Record>;
119
+ /** Shared resource cache from parent context for visibility of modifications */
120
+ resourceCache?: Map<Id, any>;
121
+ /** Database transaction for the context */
122
+ transaction?: DatabaseTransaction;
123
+ /** The time at which the cached entry should expire (ms since epoch) */
124
+ expiresAt?: number;
125
+ /** The last modification time of any data accessed with this context */
126
+ lastModified?: number;
127
+ }
128
+
129
+ export type Operator = 'and' | 'or';
130
+
131
+ export type Comparator =
132
+ | 'between'
133
+ | 'contains'
134
+ | 'ends_with'
135
+ | 'eq'
136
+ | 'equals'
137
+ | 'greater_than'
138
+ | 'greater_than_equal'
139
+ | 'less_than'
140
+ | 'less_than_equal'
141
+ | 'ne'
142
+ | 'not_equal'
143
+ | 'starts_with';
144
+
145
+ export type DirectCondition<Record extends object = any> = TypedDirectCondition<Record, keyof Record>;
146
+
147
+ interface TypedDirectCondition<Record extends object, Property extends keyof Record> {
148
+ attribute?: keyof Record | Array<keyof Record> | string | string[];
149
+ search_attribute?: keyof Record | Array<keyof Record> | string | string[];
150
+ comparator?: Comparator;
151
+ search_type?: Comparator;
152
+ value?: Record[Property];
153
+ search_value?: Record[Property];
154
+ }
155
+
156
+ interface ConditionGroup<Record extends object = any> {
157
+ conditions?: Conditions<Record>;
158
+ operator?: Operator;
159
+ }
160
+ export type Condition<Record extends object = any> = DirectCondition<Record> & ConditionGroup<Record>;
161
+ export type Conditions<Record extends object = any> = Condition<Record>[];
162
+
163
+ export interface Sort<Record extends object = any> {
164
+ attribute: keyof Record;
165
+ descending?: boolean;
166
+ next?: Sort<Record>;
167
+ }
168
+ export interface SubSelect {
169
+ name: string;
170
+ select: (string | SubSelect)[];
171
+ }
172
+ export type Select = (string | SubSelect)[];
173
+
174
+ export interface SubscriptionRequest extends RequestTarget {
175
+ /** The starting time of events to return (defaults to now) */
176
+ startTime?: number;
177
+ /** The count of previously recorded events to return */
178
+ previousCount?: number;
179
+ /** If the current record state should be omitted as the first event */
180
+ omitCurrent?: boolean;
181
+ onlyChildren?: boolean;
182
+ includeDescendants?: boolean;
183
+ supportsTransactions?: boolean;
184
+ rawEvents?: boolean;
185
+ listener?: Listener;
186
+ }
187
+
188
+ export type Query = RequestTarget; // for back-compat
189
+ export type RequestTargetOrId = RequestTarget | Id;
190
+
191
+ export type Id = number | string | (number | string | null)[] | null;
192
+
193
+ export type UpdatableRecord<Record extends object = any> = TypedUpdatableRecord<Record, keyof Record>;
194
+ interface TypedUpdatableRecord<Record extends object, Property extends keyof Record> extends RecordObject {
195
+ set(property: Property, value: Record[Property]): void;
196
+ getProperty(property: Property): Record[Property];
197
+ addTo(property: Property, value: Record[Property]): void;
198
+ subtractFrom(property: Property, value: Record[Property]): void;
199
+ }
200
+
201
+ export interface Subscription<Event extends object = any> extends IterableEventQueue<Event> {
202
+ new (listener: Listener<Event>);
203
+
204
+ listener: Listener<Event>;
205
+ subscriptions: Listener<Event>[];
206
+ startTime?: number;
207
+
208
+ end(): void;
209
+ toJSON(): { name: 'subscription' };
210
+ }
211
+
212
+ type Listener<Payload extends object = any> = (payload: ListenerPayload<Payload>) => void;
213
+
214
+ interface ListenerPayload<Payload extends object = any> {
215
+ id: Id;
216
+ localTime: number;
217
+ value: Payload;
218
+ version: number;
219
+ type: string;
220
+ beginTxn: boolean;
221
+ }
@@ -0,0 +1,53 @@
1
+ import type { User } from '../security/user.js';
2
+ import type { RecordObject } from './RecordEncoder.ts';
3
+ import { RequestTarget } from './RequestTarget.ts';
4
+ import { RequestTargetOrId, ResourceInterface, SubscriptionRequest, UpdatableRecord } from './ResourceInterface.ts';
5
+
6
+ // @ts-expect-error We changed the interface in v2 with breaking changes (by flipping target and newRecord/record)
7
+ export interface ResourceInterfaceV2<Record extends object = any> extends ResourceInterface<Record> {
8
+ get?(
9
+ target?: RequestTargetOrId
10
+ ):
11
+ | (Record & Partial<RecordObject>)
12
+ | Promise<Record & Partial<RecordObject>>
13
+ | AsyncIterable<Record & Partial<RecordObject>>
14
+ | Promise<AsyncIterable<Record & Partial<RecordObject>>>;
15
+ search?(target: RequestTarget): AsyncIterable<Record & Partial<RecordObject>>;
16
+
17
+ create?(
18
+ target: RequestTargetOrId,
19
+ newRecord: Partial<Record & RecordObject>
20
+ ): void | (Record & Partial<RecordObject>) | Promise<Record & Partial<RecordObject>>;
21
+ post?(
22
+ target: RequestTargetOrId,
23
+ newRecord: Partial<Record & RecordObject>
24
+ ): void | (Record & Partial<RecordObject>) | Promise<Record & Partial<RecordObject>>;
25
+
26
+ put?(
27
+ target: RequestTargetOrId,
28
+ record: Record & RecordObject
29
+ ): void | (Record & Partial<RecordObject>) | Promise<void | (Record & Partial<RecordObject>)>;
30
+ patch?(
31
+ target: RequestTargetOrId,
32
+ record: Partial<Record & RecordObject>
33
+ ): void | (Record & Partial<RecordObject>) | Promise<void | (Record & Partial<RecordObject>)>;
34
+ update?(updates: Record & RecordObject, fullUpdate: true): ResourceInterface<Record & Partial<RecordObject>>;
35
+ update?(
36
+ updates: Partial<Record & RecordObject>,
37
+ fullUpdate?: boolean
38
+ ):
39
+ | ResourceInterface<Record & Partial<RecordObject>>
40
+ | Promise<ResourceInterface<Record & Partial<RecordObject>> | UpdatableRecord<Record & Partial<RecordObject>>>;
41
+
42
+ delete?(target: RequestTargetOrId): boolean | Promise<boolean>;
43
+
44
+ invalidate(target: RequestTargetOrId): void | Promise<void>;
45
+
46
+ publish?(target: RequestTargetOrId, record: Record): void;
47
+ subscribe?(request: SubscriptionRequest): AsyncIterable<Record> | Promise<AsyncIterable<Record>>;
48
+
49
+ doesExist(): boolean;
50
+ wasLoadedFromSource(): boolean | void;
51
+
52
+ getCurrentUser(): User | undefined;
53
+ }
@@ -0,0 +1,67 @@
1
+ import { _assignPackageExport } from '../globals.js';
2
+ import { IterableEventQueue } from './IterableEventQueue.js';
3
+ import type { RecordObject } from './RecordEncoder.js';
4
+ import { RequestTarget } from './RequestTarget.js';
5
+ import { Resource } from './Resource.ts';
6
+ import { RequestTargetOrId } from './ResourceInterface.ts';
7
+
8
+ /**
9
+ * This is the main class that can be extended for any resource in HarperDB and provides the essential reusable
10
+ * uniform interface for interacting with data, defining the API for providing data (data sources) and for consuming
11
+ * data. This interface is used pervasively in HarperDB and is implemented by database tables and can be used to define
12
+ * sources for caching, real-data sources for messaging protocols, and RESTful endpoints, as well as any other types of
13
+ * data aggregation, processing, or monitoring.
14
+ *
15
+ * This base Resource class provides a set of static methods that are main entry points for querying and updating data
16
+ * in resources/tables. The static methods provide the default handling of arguments, context, and ensuring that
17
+ * internal actions are wrapped in a transaction. The base Resource class intended to be extended, and the instance
18
+ * methods can be overridden to provide specific implementations of actions like get, put, post, delete, and subscribe.
19
+ */
20
+ export class ResourceV2<Record extends object = any> extends Resource<Record> {
21
+ static loadAsInstance: boolean = false;
22
+
23
+ get?(
24
+ target?: RequestTargetOrId
25
+ ):
26
+ | (Record & Partial<RecordObject>)
27
+ | Promise<Record & Partial<RecordObject>>
28
+ | AsyncIterable<Record & Partial<RecordObject>>
29
+ | Promise<AsyncIterable<Record & Partial<RecordObject>>>;
30
+
31
+ search?(target: RequestTargetOrId): AsyncIterable<Record & Partial<RecordObject>>;
32
+
33
+ // @ts-expect-error We swapped the order of target and newRecord.
34
+ create?(
35
+ target: RequestTargetOrId,
36
+ newRecord: Partial<Record & RecordObject>
37
+ ): void | (Record & Partial<RecordObject>) | Promise<Record & Partial<RecordObject>>;
38
+
39
+ // @ts-expect-error In v2, we're adjusting the types.
40
+ post(
41
+ target: RequestTargetOrId,
42
+ newRecord: Partial<Record & RecordObject>
43
+ ): void | (Record & Partial<RecordObject>) | Promise<Record & Partial<RecordObject>> {
44
+ return super.post(target, newRecord);
45
+ }
46
+
47
+ // @ts-expect-error We swapped the order of target and record.
48
+ put?(
49
+ target: RequestTargetOrId,
50
+ record: Record & RecordObject
51
+ ): void | (Record & Partial<RecordObject>) | Promise<void | (Record & Partial<RecordObject>)>;
52
+
53
+ // @ts-expect-error We swapped the order of target and record.
54
+ patch?(
55
+ target: RequestTargetOrId,
56
+ record: Partial<Record & RecordObject>
57
+ ): void | (Record & Partial<RecordObject>) | Promise<void | (Record & Partial<RecordObject>)>;
58
+
59
+ delete?(target: RequestTargetOrId): boolean | Promise<boolean>;
60
+ invalidate?(target: RequestTargetOrId): void | Promise<void>;
61
+
62
+ // @ts-expect-error We swapped the order of target and record.
63
+ connect?(incomingMessages: IterableEventQueue<Record>, target: RequestTarget): AsyncIterable<Record>;
64
+ publish?(target: RequestTargetOrId, record: Record): void;
65
+ }
66
+
67
+ _assignPackageExport('ResourceV2', ResourceV2);
@@ -0,0 +1,162 @@
1
+ import { Resource } from './Resource.ts';
2
+ import { transaction } from './transaction.ts';
3
+ import { ErrorResource } from './ErrorResource.ts';
4
+ import logger from '../utility/logging/harper_logger.js';
5
+ import { ServerError } from '../utility/errors/hdbError.js';
6
+ import { server } from '../server/Server.ts';
7
+
8
+ interface ResourceEntry {
9
+ Resource: typeof Resource;
10
+ path: string;
11
+ exportTypes: any;
12
+ hasSubPaths: boolean;
13
+ relativeURL: string;
14
+ }
15
+
16
+ /**
17
+ * This is the global set of all resources that have been registered on this server.
18
+ */
19
+ export class Resources extends Map<string, ResourceEntry> {
20
+ isWorker = true;
21
+ loginPath?: (request) => string;
22
+
23
+ allTypes: Map<any, any> = new Map();
24
+
25
+ set(path, resource, exportTypes?: { [key: string]: boolean }, force?: boolean): void {
26
+ if (!resource) throw new Error('Must provide a resource');
27
+ if (path.startsWith('/')) path = path.replace(/^\/+/, '');
28
+ const entry = {
29
+ Resource: resource,
30
+ path,
31
+ exportTypes,
32
+ hasSubPaths: false,
33
+ relativeURL: '', // reset after each match
34
+ };
35
+ const existingEntry = super.get(path);
36
+ if (
37
+ existingEntry &&
38
+ (existingEntry.Resource.databaseName !== resource.databaseName ||
39
+ existingEntry.Resource.tableName !== resource.tableName) &&
40
+ !force
41
+ ) {
42
+ // there was a conflict in endpoint paths. We don't want this to be ignored, so we log it
43
+ // and create an error resource to make sure it is reported in any attempt to access this path.
44
+ // it was be a 500 error; clearly a server error (not client error), unfortunate that the 5xx errors
45
+ // don't provide anything more descriptive.
46
+ const error = new ServerError(`Conflicting paths for ${path}`);
47
+ logger.error(error);
48
+ entry.Resource = new ErrorResource(error);
49
+ }
50
+ super.set(path, entry);
51
+ // now mark any entries that have sub paths so we can efficiently route forward
52
+ for (const [path] of this) {
53
+ let slashIndex = 2;
54
+ while ((slashIndex = path.indexOf('/', slashIndex)) > -1) {
55
+ const parentEntry = this.get(path.slice(0, slashIndex));
56
+ if (parentEntry) parentEntry.hasSubPaths = true;
57
+ slashIndex += 2;
58
+ }
59
+ }
60
+ }
61
+
62
+ /**
63
+ * Find the best (longest) match resource path that matches the (beginning of the) provided path, in order to find
64
+ * the correct Resource to handle this URL path.
65
+ * @param path The URL Path
66
+ * @param exportType Optional request content or protocol type, allows control of which protocols can access a resource
67
+ * and future layering of resources (for defining HTML handlers
68
+ * that can further transform data from the main structured object resources).
69
+ * @return The matched Resource class. Note that the remaining path is "returned" by setting the relativeURL property
70
+ */
71
+ getMatch(url: string, exportType?: string): ResourceEntry | undefined {
72
+ let slashIndex = 2;
73
+ let prevSlashIndex = 0;
74
+ let foundEntry: ResourceEntry;
75
+
76
+ const urlLength = url.length;
77
+
78
+ while (slashIndex < urlLength) {
79
+ prevSlashIndex = slashIndex;
80
+ slashIndex = url.indexOf('/', slashIndex);
81
+
82
+ if (slashIndex === -1) {
83
+ slashIndex = urlLength;
84
+ }
85
+
86
+ const resourcePath = slashIndex === urlLength ? url : url.slice(0, slashIndex);
87
+ let entry = this.get(resourcePath);
88
+ let queryIndex = -1;
89
+ if (!entry && slashIndex === urlLength) {
90
+ // try to match the first part of the path if there's a query
91
+ queryIndex = resourcePath.indexOf('?', prevSlashIndex);
92
+ if (queryIndex !== -1) {
93
+ const pathPart = resourcePath.slice(0, queryIndex);
94
+ entry = this.get(pathPart);
95
+ }
96
+ }
97
+ if (entry && (!exportType || entry.exportTypes?.[exportType] !== false)) {
98
+ entry.relativeURL = url.slice(queryIndex !== -1 ? queryIndex : slashIndex);
99
+ if (!entry.hasSubPaths) {
100
+ return entry;
101
+ }
102
+ foundEntry = entry;
103
+ }
104
+
105
+ slashIndex += 2;
106
+ }
107
+
108
+ if (foundEntry) return foundEntry;
109
+
110
+ // try the exact path
111
+ const searchIndex = url.indexOf('?');
112
+ const path = searchIndex > -1 ? url.slice(0, searchIndex) : url;
113
+ foundEntry = this.get(path);
114
+ if (!foundEntry && path.indexOf('.') > -1) {
115
+ foundEntry = this.get(path.split('.')[0]);
116
+ }
117
+ if (foundEntry && (!exportType || foundEntry.exportTypes?.[exportType] !== false)) {
118
+ foundEntry.relativeURL = searchIndex > -1 ? url.slice(searchIndex) : '';
119
+ } else if (!foundEntry) {
120
+ // still not found, see if there is an explicit root path
121
+ foundEntry = this.get('');
122
+ if (foundEntry && (!exportType || foundEntry.exportTypes?.[exportType] !== false)) {
123
+ if (url.charAt(0) !== '/') url = '/' + url;
124
+ foundEntry.relativeURL = url;
125
+ }
126
+ }
127
+ return foundEntry;
128
+ }
129
+
130
+ getResource(path: string, resourceInfo) {
131
+ const entry = this.getMatch(path);
132
+ if (entry) {
133
+ path = entry.relativeURL;
134
+ return entry.Resource.getResource(this.pathToId(path, entry.Resource), resourceInfo);
135
+ }
136
+ }
137
+ call(path: string, request, callback: Function) {
138
+ return transaction(request, async () => {
139
+ const entry = this.getMatch(path);
140
+ if (entry) {
141
+ path = entry.relativeURL;
142
+ return callback(entry.Resource, entry.path, path);
143
+ }
144
+ });
145
+ }
146
+ // eslint-disable-next-line no-unused-vars
147
+ setRepresentation(path, type, representation) {}
148
+ }
149
+ export let resources: Resources;
150
+ export function resetResources() {
151
+ resources = new Resources();
152
+ server.resources = resources;
153
+ return resources;
154
+ }
155
+
156
+ export function keyArrayToString(key) {
157
+ if (Array.isArray(key)) {
158
+ if (key[key.length - 1] === null) return key.slice(0, -1).join('/') + '/';
159
+ else return key.join('/');
160
+ }
161
+ return key;
162
+ }
@@ -0,0 +1,70 @@
1
+ import {
2
+ DBI,
3
+ Store,
4
+ type StoreContext,
5
+ type StoreIteratorOptions,
6
+ type StorePutOptions,
7
+ type StoreRemoveOptions,
8
+ } from '@harperfast/rocksdb-js';
9
+ import { Id } from './ResourceInterface.ts';
10
+ import { MAXIMUM_KEY } from 'ordered-binary';
11
+
12
+ declare module '@harperfast/rocksdb-js' {
13
+ // eslint-disable-next-line no-unused-vars
14
+ interface DBI<T> {
15
+ getValuesCount(indexedValue: any): number;
16
+ }
17
+ }
18
+
19
+ export class RocksIndexStore extends Store {
20
+ /**
21
+ * Get all entries matching the range
22
+ * @param options
23
+ */
24
+ getRange(context: StoreContext, options: StoreIteratorOptions): Iterable<any> {
25
+ let { start, end, exclusiveStart, inclusiveEnd, reverse } = options;
26
+ if ((reverse ? !exclusiveStart : exclusiveStart) && start !== undefined) {
27
+ start = [start, MAXIMUM_KEY];
28
+ }
29
+ if ((reverse ? !inclusiveEnd : inclusiveEnd) && end !== undefined) {
30
+ end = [end, MAXIMUM_KEY];
31
+ }
32
+ const translatedOptions = { ...options, start, end };
33
+ return super.getRange(context, translatedOptions).map(({ key }) => {
34
+ return { key: key[0], value: key.length > 2 ? key.slice(1) : key[1] };
35
+ });
36
+ }
37
+
38
+ /**
39
+ * Translate a put with indexed value and primary key to an underlying put
40
+ * @param indexedValue - ignored, only used by LMDB
41
+ * @param primaryKey
42
+ * @param txnId
43
+ */
44
+ put(context: StoreContext, indexedValue: any, primaryKey: Id, options: StorePutOptions) {
45
+ return super.putSync(context, [indexedValue, primaryKey], null, options);
46
+ }
47
+
48
+ putSync(context: StoreContext, indexedValue: any, primaryKey: Id, options: StorePutOptions) {
49
+ return super.putSync(context, [indexedValue, primaryKey], null, options);
50
+ }
51
+
52
+ remove(context: StoreContext, indexedValue: any, primaryKey: Id, options?: StoreRemoveOptions) {
53
+ return super.removeSync(context, [indexedValue, primaryKey], options);
54
+ }
55
+
56
+ removeSync(context: StoreContext, indexedValue: any, primaryKey: Id, options?: StoreRemoveOptions) {
57
+ super.removeSync(context, [indexedValue, primaryKey], options);
58
+ }
59
+ }
60
+
61
+ /**
62
+ * Add `getValuesCount` to the DBI prototype which is used by the `RocksDatabase` and `Transaction`
63
+ * classes.
64
+ */
65
+ DBI.prototype.getValuesCount = function getValuesCount(indexedValue: any) {
66
+ if (this.store instanceof RocksIndexStore) {
67
+ return this.store.getCount(this._context, { start: indexedValue, end: [indexedValue, MAXIMUM_KEY] });
68
+ }
69
+ throw new Error('getValuesCount is only supported if dupSort=true');
70
+ };