@harperfast/harper 5.2.13 → 5.3.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 (655) hide show
  1. package/agent/mcpTools.ts +1 -1
  2. package/agent/session.ts +25 -14
  3. package/bin/cliOperations.ts +58 -9
  4. package/bin/copyDb.ts +282 -59
  5. package/bin/deploySetup.ts +16 -5
  6. package/bin/harper.ts +1 -1
  7. package/bin/help.ts +4 -1
  8. package/bin/lite.ts +4 -1
  9. package/bin/restart.ts +120 -4
  10. package/bin/run.ts +6 -11
  11. package/bin/upgrade.js +7 -3
  12. package/bin/workloadIdentity.ts +119 -0
  13. package/components/Application.ts +3436 -242
  14. package/components/ApplicationScope.ts +8 -0
  15. package/components/EntryHandler.ts +59 -39
  16. package/components/OptionsWatcher.ts +440 -98
  17. package/components/RuntimeModuleTracker.ts +38 -7
  18. package/components/Scope.ts +56 -15
  19. package/components/awaitRestart.ts +84 -0
  20. package/components/componentLoader.ts +381 -32
  21. package/components/componentPreparationLock.ts +16 -5
  22. package/components/deploymentOperations.ts +4 -1
  23. package/components/deploymentRecorder.ts +9 -2
  24. package/components/mcp/adapters/harperHttp.ts +4 -0
  25. package/components/mcp/listChanged.ts +4 -0
  26. package/components/mcp/toolRegistry.ts +2 -0
  27. package/components/mcp/tools/operations.ts +9 -0
  28. package/components/mcp/tools/schemas/operationDescriptions.ts +2 -2
  29. package/components/operations.js +537 -113
  30. package/components/operationsValidation.js +98 -3
  31. package/components/packageComponent.ts +25 -1
  32. package/components/requestRestart.ts +11 -0
  33. package/components/status/ComponentStatusRegistry.ts +59 -0
  34. package/config/RootConfigWatcher.ts +240 -40
  35. package/config/configReadRetry.ts +62 -0
  36. package/config/configUtils.ts +357 -48
  37. package/config/harperConfigEnvVars.ts +170 -27
  38. package/config/parseConfigFile.ts +34 -0
  39. package/config/readConfigFileSync.ts +44 -0
  40. package/config/watcherArming.ts +59 -0
  41. package/config-root.schema.json +33 -0
  42. package/dataLayer/blobBackup.ts +160 -50
  43. package/dataLayer/delete.ts +6 -1
  44. package/dataLayer/harperBridge/ResourceBridge.ts +80 -10
  45. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/DeleteAuditLogsBeforeResults.js +3 -1
  46. package/dataLayer/hdbInfoController.ts +34 -1
  47. package/dataLayer/insert.ts +44 -1
  48. package/dataLayer/rocksdbBackup.ts +53 -10
  49. package/dataLayer/schema.ts +11 -1
  50. package/dataLayer/schemaDescribe.ts +8 -1
  51. package/dist/agent/mcpTools.js +1 -1
  52. package/dist/agent/mcpTools.js.map +1 -1
  53. package/dist/agent/session.d.ts +22 -0
  54. package/dist/agent/session.js +26 -15
  55. package/dist/agent/session.js.map +1 -1
  56. package/dist/bin/cliOperations.js +61 -9
  57. package/dist/bin/cliOperations.js.map +1 -1
  58. package/dist/bin/copyDb.d.ts +12 -1
  59. package/dist/bin/copyDb.js +248 -60
  60. package/dist/bin/copyDb.js.map +1 -1
  61. package/dist/bin/deploySetup.d.ts +2 -0
  62. package/dist/bin/deploySetup.js +11 -3
  63. package/dist/bin/deploySetup.js.map +1 -1
  64. package/dist/bin/harper.js +1 -1
  65. package/dist/bin/harper.js.map +1 -1
  66. package/dist/bin/help.js +4 -1
  67. package/dist/bin/help.js.map +1 -1
  68. package/dist/bin/lite.js +4 -1
  69. package/dist/bin/lite.js.map +1 -1
  70. package/dist/bin/restart.js +91 -6
  71. package/dist/bin/restart.js.map +1 -1
  72. package/dist/bin/run.js +4 -10
  73. package/dist/bin/run.js.map +1 -1
  74. package/dist/bin/upgrade.js +4 -3
  75. package/dist/bin/upgrade.js.map +1 -1
  76. package/dist/bin/workloadIdentity.d.ts +18 -0
  77. package/dist/bin/workloadIdentity.js +100 -0
  78. package/dist/bin/workloadIdentity.js.map +1 -0
  79. package/dist/components/Application.d.ts +235 -17
  80. package/dist/components/Application.js +3038 -238
  81. package/dist/components/Application.js.map +1 -1
  82. package/dist/components/ApplicationScope.d.ts +8 -0
  83. package/dist/components/ApplicationScope.js +7 -0
  84. package/dist/components/ApplicationScope.js.map +1 -1
  85. package/dist/components/EntryHandler.js +26 -10
  86. package/dist/components/EntryHandler.js.map +1 -1
  87. package/dist/components/OptionsWatcher.d.ts +4 -0
  88. package/dist/components/OptionsWatcher.js +440 -99
  89. package/dist/components/OptionsWatcher.js.map +1 -1
  90. package/dist/components/RuntimeModuleTracker.js +40 -6
  91. package/dist/components/RuntimeModuleTracker.js.map +1 -1
  92. package/dist/components/Scope.js +52 -13
  93. package/dist/components/Scope.js.map +1 -1
  94. package/dist/components/awaitRestart.d.ts +33 -0
  95. package/dist/components/awaitRestart.js +61 -0
  96. package/dist/components/awaitRestart.js.map +1 -0
  97. package/dist/components/componentLoader.d.ts +38 -1
  98. package/dist/components/componentLoader.js +313 -24
  99. package/dist/components/componentLoader.js.map +1 -1
  100. package/dist/components/componentPreparationLock.d.ts +5 -0
  101. package/dist/components/componentPreparationLock.js +14 -6
  102. package/dist/components/componentPreparationLock.js.map +1 -1
  103. package/dist/components/deploymentOperations.js +4 -1
  104. package/dist/components/deploymentOperations.js.map +1 -1
  105. package/dist/components/deploymentRecorder.d.ts +4 -2
  106. package/dist/components/deploymentRecorder.js +1 -0
  107. package/dist/components/deploymentRecorder.js.map +1 -1
  108. package/dist/components/mcp/adapters/harperHttp.js +4 -0
  109. package/dist/components/mcp/adapters/harperHttp.js.map +1 -1
  110. package/dist/components/mcp/listChanged.js +5 -0
  111. package/dist/components/mcp/listChanged.js.map +1 -1
  112. package/dist/components/mcp/toolRegistry.d.ts +1 -0
  113. package/dist/components/mcp/toolRegistry.js.map +1 -1
  114. package/dist/components/mcp/tools/operations.d.ts +5 -0
  115. package/dist/components/mcp/tools/operations.js +9 -0
  116. package/dist/components/mcp/tools/operations.js.map +1 -1
  117. package/dist/components/mcp/tools/schemas/operationDescriptions.js +2 -2
  118. package/dist/components/mcp/tools/schemas/operationDescriptions.js.map +1 -1
  119. package/dist/components/operations.d.ts +28 -0
  120. package/dist/components/operations.js +476 -113
  121. package/dist/components/operations.js.map +1 -1
  122. package/dist/components/operationsValidation.js +97 -3
  123. package/dist/components/operationsValidation.js.map +1 -1
  124. package/dist/components/packageComponent.js +24 -0
  125. package/dist/components/packageComponent.js.map +1 -1
  126. package/dist/components/requestRestart.d.ts +1 -0
  127. package/dist/components/requestRestart.js +7 -0
  128. package/dist/components/requestRestart.js.map +1 -1
  129. package/dist/components/status/ComponentStatusRegistry.d.ts +0 -4
  130. package/dist/components/status/ComponentStatusRegistry.js +63 -0
  131. package/dist/components/status/ComponentStatusRegistry.js.map +1 -1
  132. package/dist/config/RootConfigWatcher.d.ts +9 -1
  133. package/dist/config/RootConfigWatcher.js +228 -37
  134. package/dist/config/RootConfigWatcher.js.map +1 -1
  135. package/dist/config/configReadRetry.d.ts +8 -0
  136. package/dist/config/configReadRetry.js +62 -0
  137. package/dist/config/configReadRetry.js.map +1 -0
  138. package/dist/config/configUtils.d.ts +11 -2
  139. package/dist/config/configUtils.js +304 -47
  140. package/dist/config/configUtils.js.map +1 -1
  141. package/dist/config/harperConfigEnvVars.d.ts +16 -0
  142. package/dist/config/harperConfigEnvVars.js +162 -25
  143. package/dist/config/harperConfigEnvVars.js.map +1 -1
  144. package/dist/config/parseConfigFile.d.ts +4 -0
  145. package/dist/config/parseConfigFile.js +35 -0
  146. package/dist/config/parseConfigFile.js.map +1 -0
  147. package/dist/config/readConfigFileSync.d.ts +1 -0
  148. package/dist/config/readConfigFileSync.js +47 -0
  149. package/dist/config/readConfigFileSync.js.map +1 -0
  150. package/dist/config/watcherArming.d.ts +15 -0
  151. package/dist/config/watcherArming.js +59 -0
  152. package/dist/config/watcherArming.js.map +1 -0
  153. package/dist/dataLayer/blobBackup.d.ts +49 -20
  154. package/dist/dataLayer/blobBackup.js +139 -50
  155. package/dist/dataLayer/blobBackup.js.map +1 -1
  156. package/dist/dataLayer/delete.js +1 -1
  157. package/dist/dataLayer/delete.js.map +1 -1
  158. package/dist/dataLayer/harperBridge/ResourceBridge.d.ts +14 -1
  159. package/dist/dataLayer/harperBridge/ResourceBridge.js +72 -12
  160. package/dist/dataLayer/harperBridge/ResourceBridge.js.map +1 -1
  161. package/dist/dataLayer/harperBridge/lmdbBridge/lmdbMethods/DeleteAuditLogsBeforeResults.d.ts +3 -1
  162. package/dist/dataLayer/harperBridge/lmdbBridge/lmdbMethods/DeleteAuditLogsBeforeResults.js +3 -1
  163. package/dist/dataLayer/harperBridge/lmdbBridge/lmdbMethods/DeleteAuditLogsBeforeResults.js.map +1 -1
  164. package/dist/dataLayer/hdbInfoController.d.ts +10 -0
  165. package/dist/dataLayer/hdbInfoController.js +30 -1
  166. package/dist/dataLayer/hdbInfoController.js.map +1 -1
  167. package/dist/dataLayer/insert.d.ts +9 -1
  168. package/dist/dataLayer/insert.js +30 -0
  169. package/dist/dataLayer/insert.js.map +1 -1
  170. package/dist/dataLayer/rocksdbBackup.d.ts +2 -2
  171. package/dist/dataLayer/rocksdbBackup.js +45 -8
  172. package/dist/dataLayer/rocksdbBackup.js.map +1 -1
  173. package/dist/dataLayer/schema.js +8 -0
  174. package/dist/dataLayer/schema.js.map +1 -1
  175. package/dist/dataLayer/schemaDescribe.js +8 -1
  176. package/dist/dataLayer/schemaDescribe.js.map +1 -1
  177. package/dist/index.d.ts +2 -1
  178. package/dist/index.js +4 -1
  179. package/dist/index.js.map +1 -1
  180. package/dist/json/systemSchema.json +55 -0
  181. package/dist/resources/DatabaseTransaction.d.ts +77 -0
  182. package/dist/resources/DatabaseTransaction.js +586 -54
  183. package/dist/resources/DatabaseTransaction.js.map +1 -1
  184. package/dist/resources/LMDBTransaction.d.ts +2 -1
  185. package/dist/resources/LMDBTransaction.js +43 -6
  186. package/dist/resources/LMDBTransaction.js.map +1 -1
  187. package/dist/resources/PrimaryRocksDatabase.d.ts +1 -0
  188. package/dist/resources/PrimaryRocksDatabase.js +49 -5
  189. package/dist/resources/PrimaryRocksDatabase.js.map +1 -1
  190. package/dist/resources/RecordEncoder.d.ts +20 -0
  191. package/dist/resources/RecordEncoder.js +110 -9
  192. package/dist/resources/RecordEncoder.js.map +1 -1
  193. package/dist/resources/RequestTarget.d.ts +2 -0
  194. package/dist/resources/RequestTarget.js.map +1 -1
  195. package/dist/resources/Resource.js +117 -24
  196. package/dist/resources/Resource.js.map +1 -1
  197. package/dist/resources/ResourceInterface.d.ts +28 -1
  198. package/dist/resources/ResourceInterface.js.map +1 -1
  199. package/dist/resources/RocksIndexStore.d.ts +6 -1
  200. package/dist/resources/RocksIndexStore.js +24 -9
  201. package/dist/resources/RocksIndexStore.js.map +1 -1
  202. package/dist/resources/RocksTransactionLogStore.d.ts +24 -1
  203. package/dist/resources/RocksTransactionLogStore.js +160 -49
  204. package/dist/resources/RocksTransactionLogStore.js.map +1 -1
  205. package/dist/resources/Table.d.ts +165 -10
  206. package/dist/resources/Table.js +1805 -303
  207. package/dist/resources/Table.js.map +1 -1
  208. package/dist/resources/analytics/write.js +10 -3
  209. package/dist/resources/analytics/write.js.map +1 -1
  210. package/dist/resources/auditStore.d.ts +181 -2
  211. package/dist/resources/auditStore.js +640 -29
  212. package/dist/resources/auditStore.js.map +1 -1
  213. package/dist/resources/blob.d.ts +129 -9
  214. package/dist/resources/blob.js +992 -114
  215. package/dist/resources/blob.js.map +1 -1
  216. package/dist/resources/branchDatabase.d.ts +48 -0
  217. package/dist/resources/branchDatabase.js +892 -0
  218. package/dist/resources/branchDatabase.js.map +1 -0
  219. package/dist/resources/crdt.js +50 -12
  220. package/dist/resources/crdt.js.map +1 -1
  221. package/dist/resources/dataLoader.js +3 -4
  222. package/dist/resources/dataLoader.js.map +1 -1
  223. package/dist/resources/databases.d.ts +157 -14
  224. package/dist/resources/databases.js +1462 -325
  225. package/dist/resources/databases.js.map +1 -1
  226. package/dist/resources/defineTable.d.ts +10 -2
  227. package/dist/resources/defineTable.js +9 -1
  228. package/dist/resources/defineTable.js.map +1 -1
  229. package/dist/resources/derivedIndexRegistry.d.ts +5 -0
  230. package/dist/resources/derivedIndexRegistry.js +68 -0
  231. package/dist/resources/derivedIndexRegistry.js.map +1 -0
  232. package/dist/resources/derivedIndexRuntime.d.ts +215 -0
  233. package/dist/resources/derivedIndexRuntime.js +2027 -0
  234. package/dist/resources/derivedIndexRuntime.js.map +1 -0
  235. package/dist/resources/graphql.d.ts +1 -1
  236. package/dist/resources/graphql.js +52 -16
  237. package/dist/resources/graphql.js.map +1 -1
  238. package/dist/resources/indexes/HierarchicalNavigableSmallWorld.d.ts +103 -9
  239. package/dist/resources/indexes/HierarchicalNavigableSmallWorld.js +854 -41
  240. package/dist/resources/indexes/HierarchicalNavigableSmallWorld.js.map +1 -1
  241. package/dist/resources/indexes/hnswDerivedIndex.d.ts +67 -0
  242. package/dist/resources/indexes/hnswDerivedIndex.js +464 -0
  243. package/dist/resources/indexes/hnswDerivedIndex.js.map +1 -0
  244. package/dist/resources/indexes/hnswPlaneBinding.d.ts +65 -0
  245. package/dist/resources/indexes/hnswPlaneBinding.js +91 -0
  246. package/dist/resources/indexes/hnswPlaneBinding.js.map +1 -0
  247. package/dist/resources/longLivedTransactions.d.ts +71 -0
  248. package/dist/resources/longLivedTransactions.js +358 -0
  249. package/dist/resources/longLivedTransactions.js.map +1 -0
  250. package/dist/resources/models/backendRegistry.d.ts +26 -0
  251. package/dist/resources/models/backendRegistry.js +60 -2
  252. package/dist/resources/models/backendRegistry.js.map +1 -1
  253. package/dist/resources/models/bootstrap.d.ts +33 -1
  254. package/dist/resources/models/bootstrap.js +416 -31
  255. package/dist/resources/models/bootstrap.js.map +1 -1
  256. package/dist/resources/nodeIdMapping.d.ts +5 -0
  257. package/dist/resources/nodeIdMapping.js +49 -0
  258. package/dist/resources/nodeIdMapping.js.map +1 -1
  259. package/dist/resources/recordLock.d.ts +123 -0
  260. package/dist/resources/recordLock.js +315 -0
  261. package/dist/resources/recordLock.js.map +1 -0
  262. package/dist/resources/recordLockCoordinator.d.ts +557 -0
  263. package/dist/resources/recordLockCoordinator.js +2565 -0
  264. package/dist/resources/recordLockCoordinator.js.map +1 -0
  265. package/dist/resources/replayLogs.d.ts +14 -1
  266. package/dist/resources/replayLogs.js +157 -24
  267. package/dist/resources/replayLogs.js.map +1 -1
  268. package/dist/resources/replayLogsGuards.d.ts +94 -7
  269. package/dist/resources/replayLogsGuards.js +111 -7
  270. package/dist/resources/replayLogsGuards.js.map +1 -1
  271. package/dist/resources/replicatedApplyFailure.d.ts +16 -0
  272. package/dist/resources/replicatedApplyFailure.js +63 -0
  273. package/dist/resources/replicatedApplyFailure.js.map +1 -0
  274. package/dist/resources/scheduler/scheduler.js +3 -3
  275. package/dist/resources/scheduler/scheduler.js.map +1 -1
  276. package/dist/resources/search.d.ts +10 -4
  277. package/dist/resources/search.js +283 -37
  278. package/dist/resources/search.js.map +1 -1
  279. package/dist/resources/tracked.d.ts +5 -1
  280. package/dist/resources/tracked.js +74 -23
  281. package/dist/resources/tracked.js.map +1 -1
  282. package/dist/resources/transactionBroadcast.d.ts +1 -1
  283. package/dist/resources/transactionBroadcast.js +2 -2
  284. package/dist/resources/transactionBroadcast.js.map +1 -1
  285. package/dist/security/auth.js +61 -30
  286. package/dist/security/auth.js.map +1 -1
  287. package/dist/security/authn/oidc/claims.d.ts +22 -0
  288. package/dist/security/authn/oidc/claims.js +71 -0
  289. package/dist/security/authn/oidc/claims.js.map +1 -0
  290. package/dist/security/authn/oidc/identityToken.d.ts +27 -0
  291. package/dist/security/authn/oidc/identityToken.js +111 -0
  292. package/dist/security/authn/oidc/identityToken.js.map +1 -0
  293. package/dist/security/authn/oidc/jwks.d.ts +25 -0
  294. package/dist/security/authn/oidc/jwks.js +261 -0
  295. package/dist/security/authn/oidc/jwks.js.map +1 -0
  296. package/dist/security/authn/oidc/providers/generic.d.ts +13 -0
  297. package/dist/security/authn/oidc/providers/generic.js +34 -0
  298. package/dist/security/authn/oidc/providers/generic.js.map +1 -0
  299. package/dist/security/authn/oidc/providers/githubActions.d.ts +11 -0
  300. package/dist/security/authn/oidc/providers/githubActions.js +129 -0
  301. package/dist/security/authn/oidc/providers/githubActions.js.map +1 -0
  302. package/dist/security/authn/oidc/providers/index.d.ts +37 -0
  303. package/dist/security/authn/oidc/providers/index.js +24 -0
  304. package/dist/security/authn/oidc/providers/index.js.map +1 -0
  305. package/dist/security/authn/oidc/tokenExchange.d.ts +12 -0
  306. package/dist/security/authn/oidc/tokenExchange.js +306 -0
  307. package/dist/security/authn/oidc/tokenExchange.js.map +1 -0
  308. package/dist/security/authn/oidc/trustPolicyOperations.d.ts +49 -0
  309. package/dist/security/authn/oidc/trustPolicyOperations.js +358 -0
  310. package/dist/security/authn/oidc/trustPolicyOperations.js.map +1 -0
  311. package/dist/security/authn/oidc/types.d.ts +38 -0
  312. package/dist/security/authn/oidc/types.js +6 -0
  313. package/dist/security/authn/oidc/types.js.map +1 -0
  314. package/dist/security/certificateVerification/index.js +40 -11
  315. package/dist/security/certificateVerification/index.js.map +1 -1
  316. package/dist/security/certificateVerification/trustedIssuers.d.ts +24 -0
  317. package/dist/security/certificateVerification/trustedIssuers.js +79 -0
  318. package/dist/security/certificateVerification/trustedIssuers.js.map +1 -0
  319. package/dist/security/certificateVerification/types.d.ts +1 -0
  320. package/dist/security/credentialProvenance.d.ts +35 -0
  321. package/dist/security/credentialProvenance.js +51 -0
  322. package/dist/security/credentialProvenance.js.map +1 -0
  323. package/dist/security/credentialRejection.d.ts +4 -0
  324. package/dist/security/credentialRejection.js +24 -0
  325. package/dist/security/credentialRejection.js.map +1 -0
  326. package/dist/security/deferredAuthentication.d.ts +36 -0
  327. package/dist/security/deferredAuthentication.js +70 -0
  328. package/dist/security/deferredAuthentication.js.map +1 -0
  329. package/dist/security/impersonation.d.ts +21 -0
  330. package/dist/security/impersonation.js +108 -9
  331. package/dist/security/impersonation.js.map +1 -1
  332. package/dist/security/jsLoader.d.ts +6 -0
  333. package/dist/security/jsLoader.js +77 -15
  334. package/dist/security/jsLoader.js.map +1 -1
  335. package/dist/security/keys.js +301 -71
  336. package/dist/security/keys.js.map +1 -1
  337. package/dist/security/operationScope.d.ts +21 -0
  338. package/dist/security/operationScope.js +36 -0
  339. package/dist/security/operationScope.js.map +1 -0
  340. package/dist/security/permissionsTranslator.js +21 -0
  341. package/dist/security/permissionsTranslator.js.map +1 -1
  342. package/dist/security/tokenAuthentication.d.ts +19 -1
  343. package/dist/security/tokenAuthentication.js +191 -10
  344. package/dist/security/tokenAuthentication.js.map +1 -1
  345. package/dist/security/user.js +4 -3
  346. package/dist/security/user.js.map +1 -1
  347. package/dist/server/DurableSubscriptionsSession.d.ts +2 -2
  348. package/dist/server/DurableSubscriptionsSession.js +67 -10
  349. package/dist/server/DurableSubscriptionsSession.js.map +1 -1
  350. package/dist/server/REST.js +106 -2
  351. package/dist/server/REST.js.map +1 -1
  352. package/dist/server/graphqlQuerying.js +4 -0
  353. package/dist/server/graphqlQuerying.js.map +1 -1
  354. package/dist/server/http.d.ts +16 -1
  355. package/dist/server/http.js +122 -17
  356. package/dist/server/http.js.map +1 -1
  357. package/dist/server/itc/serverHandlers.js +8 -1
  358. package/dist/server/itc/serverHandlers.js.map +1 -1
  359. package/dist/server/jobs/jobProcess.js +6 -2
  360. package/dist/server/jobs/jobProcess.js.map +1 -1
  361. package/dist/server/jobs/jobs.js +4 -1
  362. package/dist/server/jobs/jobs.js.map +1 -1
  363. package/dist/server/liveSubscriptionAuth.d.ts +26 -4
  364. package/dist/server/liveSubscriptionAuth.js +105 -39
  365. package/dist/server/liveSubscriptionAuth.js.map +1 -1
  366. package/dist/server/loadRootComponents.js +49 -10
  367. package/dist/server/loadRootComponents.js.map +1 -1
  368. package/dist/server/mqtt.d.ts +2 -0
  369. package/dist/server/mqtt.js +165 -30
  370. package/dist/server/mqtt.js.map +1 -1
  371. package/dist/server/nodeName.d.ts +2 -0
  372. package/dist/server/nodeName.js +107 -23
  373. package/dist/server/nodeName.js.map +1 -1
  374. package/dist/server/serverHelpers/Headers.d.ts +27 -0
  375. package/dist/server/serverHelpers/Headers.js +145 -1
  376. package/dist/server/serverHelpers/Headers.js.map +1 -1
  377. package/dist/server/serverHelpers/NodeAdapterResponse.d.ts +48 -0
  378. package/dist/server/serverHelpers/NodeAdapterResponse.js +220 -0
  379. package/dist/server/serverHelpers/NodeAdapterResponse.js.map +1 -0
  380. package/dist/server/serverHelpers/Request.d.ts +5 -10
  381. package/dist/server/serverHelpers/Request.js +38 -136
  382. package/dist/server/serverHelpers/Request.js.map +1 -1
  383. package/dist/server/serverHelpers/contentTypes.d.ts +11 -0
  384. package/dist/server/serverHelpers/contentTypes.js +221 -40
  385. package/dist/server/serverHelpers/contentTypes.js.map +1 -1
  386. package/dist/server/serverHelpers/deployValidationState.d.ts +3 -0
  387. package/dist/server/serverHelpers/deployValidationState.js +9 -19
  388. package/dist/server/serverHelpers/deployValidationState.js.map +1 -1
  389. package/dist/server/serverHelpers/operationAuthorizationState.d.ts +12 -0
  390. package/dist/server/serverHelpers/operationAuthorizationState.js +24 -2
  391. package/dist/server/serverHelpers/operationAuthorizationState.js.map +1 -1
  392. package/dist/server/serverHelpers/registeredOperations.d.ts +5 -4
  393. package/dist/server/serverHelpers/registeredOperations.js +74 -21
  394. package/dist/server/serverHelpers/registeredOperations.js.map +1 -1
  395. package/dist/server/serverHelpers/requestSanitization.d.ts +11 -0
  396. package/dist/server/serverHelpers/requestSanitization.js +20 -0
  397. package/dist/server/serverHelpers/requestSanitization.js.map +1 -0
  398. package/dist/server/serverHelpers/serverHandlers.js +6 -3
  399. package/dist/server/serverHelpers/serverHandlers.js.map +1 -1
  400. package/dist/server/serverHelpers/serverUtilities.d.ts +18 -0
  401. package/dist/server/serverHelpers/serverUtilities.js +178 -29
  402. package/dist/server/serverHelpers/serverUtilities.js.map +1 -1
  403. package/dist/server/serverHelpers/sharedMessageEncoding.d.ts +67 -0
  404. package/dist/server/serverHelpers/sharedMessageEncoding.js +280 -0
  405. package/dist/server/serverHelpers/sharedMessageEncoding.js.map +1 -0
  406. package/dist/server/serverHelpers/uwsServer.js +19 -1
  407. package/dist/server/serverHelpers/uwsServer.js.map +1 -1
  408. package/dist/server/static.js +24 -28
  409. package/dist/server/static.js.map +1 -1
  410. package/dist/server/storageReclamation.d.ts +5 -0
  411. package/dist/server/storageReclamation.js +17 -1
  412. package/dist/server/storageReclamation.js.map +1 -1
  413. package/dist/server/threads/isolatedApplications.d.ts +47 -0
  414. package/dist/server/threads/isolatedApplications.js +171 -0
  415. package/dist/server/threads/isolatedApplications.js.map +1 -0
  416. package/dist/server/threads/itc.d.ts +7 -2
  417. package/dist/server/threads/itc.js +5 -1
  418. package/dist/server/threads/itc.js.map +1 -1
  419. package/dist/server/threads/logRotationTransport.d.ts +1 -0
  420. package/dist/server/threads/logRotationTransport.js +33 -0
  421. package/dist/server/threads/logRotationTransport.js.map +1 -0
  422. package/dist/server/threads/manageThreads.d.ts +83 -3
  423. package/dist/server/threads/manageThreads.js +769 -75
  424. package/dist/server/threads/manageThreads.js.map +1 -1
  425. package/dist/server/threads/socketRouter.d.ts +1 -0
  426. package/dist/server/threads/socketRouter.js +277 -31
  427. package/dist/server/threads/socketRouter.js.map +1 -1
  428. package/dist/server/threads/threadHeapMemory.d.ts +2 -0
  429. package/dist/server/threads/threadHeapMemory.js +31 -0
  430. package/dist/server/threads/threadHeapMemory.js.map +1 -0
  431. package/dist/server/threads/threadServer.js +76 -22
  432. package/dist/server/threads/threadServer.js.map +1 -1
  433. package/dist/sqlEngine/config.d.ts +1 -3
  434. package/dist/sqlEngine/config.js +19 -16
  435. package/dist/sqlEngine/config.js.map +1 -1
  436. package/dist/sqlTranslator/index.d.ts +1 -1
  437. package/dist/sqlTranslator/index.js +30 -7
  438. package/dist/sqlTranslator/index.js.map +1 -1
  439. package/dist/upgrade/directives/5-3-0.d.ts +7 -0
  440. package/dist/upgrade/directives/5-3-0.js +148 -0
  441. package/dist/upgrade/directives/5-3-0.js.map +1 -0
  442. package/dist/upgrade/directives/directivesController.js +2 -1
  443. package/dist/upgrade/directives/directivesController.js.map +1 -1
  444. package/dist/utility/OperationFunctionCaller.js +2 -1
  445. package/dist/utility/OperationFunctionCaller.js.map +1 -1
  446. package/dist/utility/common_utils.d.ts +16 -0
  447. package/dist/utility/common_utils.js +32 -6
  448. package/dist/utility/common_utils.js.map +1 -1
  449. package/dist/utility/componentNames.d.ts +8 -0
  450. package/dist/utility/componentNames.js +12 -1
  451. package/dist/utility/componentNames.js.map +1 -1
  452. package/dist/utility/environment/environmentManager.js +3 -6
  453. package/dist/utility/environment/environmentManager.js.map +1 -1
  454. package/dist/utility/environment/systemInformation.d.ts +1 -0
  455. package/dist/utility/environment/systemInformation.js +1 -0
  456. package/dist/utility/environment/systemInformation.js.map +1 -1
  457. package/dist/utility/errors/commonErrors.d.ts +2 -0
  458. package/dist/utility/errors/commonErrors.js +2 -0
  459. package/dist/utility/errors/commonErrors.js.map +1 -1
  460. package/dist/utility/errors/hdbError.d.ts +33 -0
  461. package/dist/utility/errors/hdbError.js +58 -1
  462. package/dist/utility/errors/hdbError.js.map +1 -1
  463. package/dist/utility/globalSchema.d.ts +18 -0
  464. package/dist/utility/hdbTerms.d.ts +18 -0
  465. package/dist/utility/hdbTerms.js +20 -2
  466. package/dist/utility/hdbTerms.js.map +1 -1
  467. package/dist/utility/logging/harper_logger.d.ts +2 -0
  468. package/dist/utility/logging/harper_logger.js +286 -30
  469. package/dist/utility/logging/harper_logger.js.map +1 -1
  470. package/dist/utility/logging/logGenerationCoordinator.d.ts +35 -0
  471. package/dist/utility/logging/logGenerationCoordinator.js +184 -0
  472. package/dist/utility/logging/logGenerationCoordinator.js.map +1 -0
  473. package/dist/utility/logging/logRotation.d.ts +46 -0
  474. package/dist/utility/logging/logRotation.js +365 -0
  475. package/dist/utility/logging/logRotation.js.map +1 -0
  476. package/dist/utility/logging/logRotator.d.ts +1 -1
  477. package/dist/utility/logging/logRotator.js +192 -85
  478. package/dist/utility/logging/logRotator.js.map +1 -1
  479. package/dist/utility/nodeIdentity.d.ts +9 -0
  480. package/dist/utility/nodeIdentity.js +58 -0
  481. package/dist/utility/nodeIdentity.js.map +1 -0
  482. package/dist/utility/npmUtilities.js +11 -7
  483. package/dist/utility/npmUtilities.js.map +1 -1
  484. package/dist/utility/operationPermissions.d.ts +3 -1
  485. package/dist/utility/operationPermissions.js +16 -1
  486. package/dist/utility/operationPermissions.js.map +1 -1
  487. package/dist/utility/operation_authorization.d.ts +10 -7
  488. package/dist/utility/operation_authorization.js +212 -41
  489. package/dist/utility/operation_authorization.js.map +1 -1
  490. package/dist/utility/watchPath.d.ts +29 -0
  491. package/dist/utility/watchPath.js +68 -0
  492. package/dist/utility/watchPath.js.map +1 -0
  493. package/dist/utility/watcherFallback.d.ts +41 -0
  494. package/dist/utility/watcherFallback.js +153 -0
  495. package/dist/utility/watcherFallback.js.map +1 -1
  496. package/dist/validation/configValidator.d.ts +12 -0
  497. package/dist/validation/configValidator.js +205 -75
  498. package/dist/validation/configValidator.js.map +1 -1
  499. package/dist/validation/installValidator.js +12 -0
  500. package/dist/validation/installValidator.js.map +1 -1
  501. package/dist/validation/validationWrapper.d.ts +11 -0
  502. package/dist/validation/validationWrapper.js +16 -3
  503. package/dist/validation/validationWrapper.js.map +1 -1
  504. package/index.ts +8 -0
  505. package/json/systemSchema.json +55 -0
  506. package/npm-shrinkwrap.json +286 -194
  507. package/package.json +15 -7
  508. package/resources/DESIGN.md +219 -52
  509. package/resources/DatabaseTransaction.ts +657 -52
  510. package/resources/LMDBTransaction.ts +46 -6
  511. package/resources/PrimaryRocksDatabase.ts +46 -7
  512. package/resources/RecordEncoder.ts +124 -9
  513. package/resources/RequestTarget.ts +2 -0
  514. package/resources/Resource.ts +114 -22
  515. package/resources/ResourceInterface.ts +31 -0
  516. package/resources/RocksIndexStore.ts +30 -9
  517. package/resources/RocksTransactionLogStore.ts +188 -51
  518. package/resources/Table.ts +1960 -301
  519. package/resources/analytics/write.ts +10 -3
  520. package/resources/auditStore.ts +647 -32
  521. package/resources/blob.ts +1029 -110
  522. package/resources/branchDatabase.ts +941 -0
  523. package/resources/crdt.ts +76 -12
  524. package/resources/dataLoader.ts +3 -4
  525. package/resources/databases.ts +1584 -320
  526. package/resources/defineTable.ts +18 -2
  527. package/resources/derivedIndexRegistry.ts +56 -0
  528. package/resources/derivedIndexRuntime.ts +2292 -0
  529. package/resources/graphql.ts +72 -17
  530. package/resources/indexes/HierarchicalNavigableSmallWorld.ts +911 -48
  531. package/resources/indexes/hnswDerivedIndex.ts +531 -0
  532. package/resources/indexes/hnswPlaneBinding.ts +174 -0
  533. package/resources/longLivedTransactions.ts +360 -0
  534. package/resources/models/backendRegistry.ts +84 -2
  535. package/resources/models/bootstrap.ts +473 -28
  536. package/resources/nodeIdMapping.ts +50 -0
  537. package/resources/recordLock.ts +419 -0
  538. package/resources/recordLockCoordinator.ts +3043 -0
  539. package/resources/replayLogs.ts +152 -26
  540. package/resources/replayLogsGuards.ts +171 -8
  541. package/resources/replicatedApplyFailure.ts +77 -0
  542. package/resources/scheduler/scheduler.ts +4 -4
  543. package/resources/search.ts +288 -46
  544. package/resources/tracked.ts +73 -22
  545. package/resources/transactionBroadcast.ts +3 -3
  546. package/security/auth.ts +68 -29
  547. package/security/authn/oidc/claims.ts +72 -0
  548. package/security/authn/oidc/identityToken.ts +129 -0
  549. package/security/authn/oidc/jwks.ts +260 -0
  550. package/security/authn/oidc/providers/generic.ts +40 -0
  551. package/security/authn/oidc/providers/githubActions.ts +137 -0
  552. package/security/authn/oidc/providers/index.ts +52 -0
  553. package/security/authn/oidc/tokenExchange.ts +300 -0
  554. package/security/authn/oidc/trustPolicyOperations.ts +343 -0
  555. package/security/authn/oidc/types.ts +41 -0
  556. package/security/certificateVerification/index.ts +54 -13
  557. package/security/certificateVerification/trustedIssuers.ts +76 -0
  558. package/security/certificateVerification/types.ts +1 -0
  559. package/security/credentialProvenance.ts +47 -0
  560. package/security/credentialRejection.ts +22 -0
  561. package/security/deferredAuthentication.ts +71 -0
  562. package/security/impersonation.ts +117 -12
  563. package/security/jsLoader.ts +83 -18
  564. package/security/keys.ts +298 -72
  565. package/security/operationScope.ts +33 -0
  566. package/security/permissionsTranslator.js +23 -0
  567. package/security/tokenAuthentication.ts +233 -12
  568. package/security/user.ts +4 -3
  569. package/server/DESIGN.md +194 -16
  570. package/server/DurableSubscriptionsSession.ts +71 -11
  571. package/server/REST.ts +115 -4
  572. package/server/graphqlQuerying.ts +4 -0
  573. package/server/http.ts +133 -20
  574. package/server/itc/serverHandlers.js +8 -1
  575. package/server/jobs/jobProcess.ts +8 -2
  576. package/server/jobs/jobs.ts +4 -1
  577. package/server/liveSubscriptionAuth.ts +129 -46
  578. package/server/loadRootComponents.js +50 -8
  579. package/server/mqtt.ts +179 -38
  580. package/server/nodeName.ts +103 -21
  581. package/server/serverHelpers/Headers.ts +135 -0
  582. package/server/serverHelpers/NodeAdapterResponse.ts +221 -0
  583. package/server/serverHelpers/Request.ts +33 -131
  584. package/server/serverHelpers/contentTypes.ts +217 -36
  585. package/server/serverHelpers/deployValidationState.ts +24 -13
  586. package/server/serverHelpers/operationAuthorizationState.ts +34 -3
  587. package/server/serverHelpers/registeredOperations.ts +79 -22
  588. package/server/serverHelpers/requestSanitization.ts +15 -0
  589. package/server/serverHelpers/serverHandlers.js +6 -3
  590. package/server/serverHelpers/serverUtilities.ts +232 -40
  591. package/server/serverHelpers/sharedMessageEncoding.ts +307 -0
  592. package/server/serverHelpers/uwsServer.ts +17 -2
  593. package/server/static.ts +23 -29
  594. package/server/storageReclamation.ts +15 -2
  595. package/server/threads/isolatedApplications.ts +157 -0
  596. package/server/threads/itc.js +11 -1
  597. package/server/threads/logRotationTransport.ts +40 -0
  598. package/server/threads/manageThreads.js +771 -66
  599. package/server/threads/socketRouter.ts +291 -30
  600. package/server/threads/threadHeapMemory.ts +26 -0
  601. package/server/threads/threadServer.js +73 -22
  602. package/sqlTranslator/index.ts +31 -8
  603. package/studio/web/assets/{Chat-4RrB5134.js → Chat-D3j-1yY1.js} +1 -1
  604. package/studio/web/assets/{FloatingChat-omlNMDcJ.js → FloatingChat-BxJGYcfB.js} +3 -3
  605. package/studio/web/assets/{apiToken-Bke3wvfZ.js → apiToken-CT55oWOe.js} +1 -1
  606. package/studio/web/assets/{applications-DvFDYJgK.js → applications-D9Ct9_vm.js} +1 -1
  607. package/studio/web/assets/{cssMode-C1vRa7zh.js → cssMode-DV8H7VwA.js} +1 -1
  608. package/studio/web/assets/{editor-3XRWEDWX.js → editor-uatc0unt.js} +1 -1
  609. package/studio/web/assets/{html-CTY5tdMr.js → html-Bm6D6paN.js} +1 -1
  610. package/studio/web/assets/{htmlMode-CG1vSD9t.js → htmlMode-CEn7tpLG.js} +1 -1
  611. package/studio/web/assets/{index-Dfpeofdu.js → index-BIXW6Pu4.js} +5 -5
  612. package/studio/web/assets/{index.lazy-B1VOIv-t.js → index.lazy-UI7L-Vrk.js} +1 -1
  613. package/studio/web/assets/{javascript-CJeJzGnI.js → javascript-CJ0G3AFZ.js} +1 -1
  614. package/studio/web/assets/{jsonMode-CYPBwM82.js → jsonMode-DQADAYEa.js} +1 -1
  615. package/studio/web/assets/{languageServices-IKH4GUHl.js → languageServices-CAQJXWcI.js} +1 -1
  616. package/studio/web/assets/{lspLanguageFeatures-BC8_gxKG.js → lspLanguageFeatures-CCQ8P5sY.js} +1 -1
  617. package/studio/web/assets/{notifications-BfKBpYcq.js → notifications-BbxTU6Aw.js} +1 -1
  618. package/studio/web/assets/{notifications-DFbArTfC.js → notifications-Cvb3P1lB.js} +1 -1
  619. package/studio/web/assets/{profile-Q4-T6c-S.js → profile-Yyb7gsvL.js} +1 -1
  620. package/studio/web/assets/{regions-CtkV0xje.js → regions-OgjGHlU5.js} +1 -1
  621. package/studio/web/assets/{register-1ZZuMsiA.js → register-6qwNEOY3.js} +2 -2
  622. package/studio/web/assets/{setComponentFile-ZWLcWv5X.js → setComponentFile-BilDMtgB.js} +1 -1
  623. package/studio/web/assets/{setup-DWprJyJy.js → setup-J6qJ7OIU.js} +2 -2
  624. package/studio/web/assets/{status--aNm8isn.js → status-0RWGcfyD.js} +1 -1
  625. package/studio/web/assets/{toggleHighContrast-Cq_lt3XD.js → toggleHighContrast-BIn-vErT.js} +1 -1
  626. package/studio/web/assets/{tsMode-pjgytARx.js → tsMode-DgUXku4d.js} +1 -1
  627. package/studio/web/assets/{typescript-Cdg0mqUh.js → typescript-C9orXcsM.js} +1 -1
  628. package/studio/web/assets/{useEntityRestURL-RZhaY8Rn.js → useEntityRestURL-BEoXXbUB.js} +1 -1
  629. package/studio/web/assets/{workers-BgoXIqQe.js → workers-JVzSDmgx.js} +1 -1
  630. package/studio/web/assets/{xml-BwSeDMiP.js → xml-Cq-S8S4X.js} +1 -1
  631. package/studio/web/assets/{yaml-DotCUG5l.js → yaml-sfoRdh1M.js} +1 -1
  632. package/studio/web/index.html +1 -1
  633. package/upgrade/directives/5-3-0.ts +132 -0
  634. package/upgrade/directives/directivesController.ts +2 -1
  635. package/utility/OperationFunctionCaller.ts +2 -1
  636. package/utility/common_utils.ts +30 -5
  637. package/utility/componentNames.ts +12 -0
  638. package/utility/environment/environmentManager.ts +3 -7
  639. package/utility/environment/systemInformation.ts +7 -0
  640. package/utility/errors/commonErrors.ts +4 -0
  641. package/utility/errors/hdbError.ts +57 -0
  642. package/utility/hdbTerms.ts +19 -0
  643. package/utility/logging/harper_logger.ts +278 -26
  644. package/utility/logging/logGenerationCoordinator.ts +196 -0
  645. package/utility/logging/logRotation.ts +367 -0
  646. package/utility/logging/logRotator.ts +213 -81
  647. package/utility/nodeIdentity.ts +45 -0
  648. package/utility/npmUtilities.ts +12 -8
  649. package/utility/operationPermissions.ts +18 -1
  650. package/utility/operation_authorization.ts +231 -42
  651. package/utility/watchPath.ts +63 -0
  652. package/utility/watcherFallback.ts +148 -0
  653. package/validation/configValidator.ts +215 -75
  654. package/validation/installValidator.ts +15 -0
  655. package/validation/validationWrapper.ts +18 -4
@@ -4,6 +4,7 @@ import { DatabaseTransaction } from './DatabaseTransaction.ts';
4
4
  import { IterableEventQueue } from './IterableEventQueue.ts';
5
5
  import type { Entry, RecordObject } from './RecordEncoder.ts';
6
6
  import { RequestTarget } from './RequestTarget.ts';
7
+ import type { RecordLockOptions } from './recordLock.ts';
7
8
 
8
9
  export interface ResourceInterface<Record extends object = any>
9
10
  extends Partial<RecordObject>, Pick<UpdatableRecord<Record>, 'addTo' | 'subtractFrom'> {
@@ -45,6 +46,11 @@ export interface ResourceInterface<Record extends object = any>
45
46
 
46
47
  invalidate(target: RequestTargetOrId): void | Promise<void>;
47
48
 
49
+ /** Acquire an exclusive lock on a record and return it ready for updates (see `RecordLockOptions`) */
50
+ lock?(target?: RequestTargetOrId | RecordLockOptions, options?: RecordLockOptions): Promise<WritableRecord<Record>>;
51
+ /** Release the lock this instance holds; resolves true when this call cleared it */
52
+ unlock?(): Promise<boolean>;
53
+
48
54
  publish?(target: RequestTargetOrId, record: Record, options?: any): void;
49
55
  subscribe?(request: SubscriptionRequest): AsyncIterable<Record> | Promise<AsyncIterable<Record>>;
50
56
 
@@ -195,6 +201,10 @@ interface TypedDirectCondition<Record extends object, Property extends keyof Rec
195
201
  search_type?: Comparator;
196
202
  value?: Record[Property] | Record[Property][];
197
203
  search_value?: Record[Property] | Record[Property][];
204
+ /** Native HNSW coverage tolerance in milliseconds; defaults to 3000, with 0 requiring current coverage. */
205
+ maxIndexLagMilliseconds?: number;
206
+ /** Wait for coverage of prior committed writes, up to 30,000 ms; 0 (default) does not wait. */
207
+ waitForIndexMilliseconds?: number;
198
208
  /**
199
209
  * If true, the condition is negated. Phase 1: filter-only — forces a
200
210
  * full scan unless paired with another indexed condition.
@@ -217,6 +227,10 @@ export type Conditions<Record extends object = any> = Condition<Record>[];
217
227
 
218
228
  export interface Sort<Record extends object = any> {
219
229
  attribute: keyof Record;
230
+ /** Native HNSW coverage tolerance in milliseconds; defaults to 3000, with 0 requiring current coverage. */
231
+ maxIndexLagMilliseconds?: number;
232
+ /** Wait for coverage of prior committed writes, up to 30,000 ms; 0 (default) does not wait. */
233
+ waitForIndexMilliseconds?: number;
220
234
  descending?: boolean;
221
235
  next?: Sort<Record>;
222
236
  }
@@ -258,6 +272,23 @@ interface TypedUpdatableRecord<Record extends object, Property extends keyof Rec
258
272
  subtractFrom(property: Property, value: Record[Property]): void;
259
273
  }
260
274
 
275
+ export type { RecordLockOptions } from './recordLock.ts';
276
+
277
+ /**
278
+ * What `lock()` resolves with: the locked record, loaded after the lock committed and tracking
279
+ * changes for `save()`. Inside an explicit `transaction()` scope a scoped lock is released when
280
+ * that transaction commits or aborts. Outside any explicit scope (ImmediateTransaction context),
281
+ * a scoped lock persists until `unlock()` is called or the lease expires. A held lock
282
+ * (`{ hold: true }`) is always released by `unlock()` or its lease, regardless of scope.
283
+ */
284
+ export type WritableRecord<Record extends object = any> = UpdatableRecord<Record> & {
285
+ save(): void | Promise<void>;
286
+ update(updates?: Partial<Record>): unknown;
287
+ delete(target?: RequestTargetOrId): boolean | Promise<boolean>;
288
+ lock(target?: RequestTargetOrId | RecordLockOptions, options?: RecordLockOptions): Promise<WritableRecord<Record>>;
289
+ unlock(): Promise<boolean>;
290
+ };
291
+
261
292
  export interface Subscription<Event extends object = any> extends IterableEventQueue<Event> {
262
293
  new (listener: Listener<Event>);
263
294
 
@@ -1,5 +1,7 @@
1
1
  import { trackReadRange } from './DatabaseTransaction.ts';
2
2
  import {
3
+ type CountEstimate,
4
+ type CountEstimateOptions,
3
5
  DBI,
4
6
  type StoreIteratorOptions,
5
7
  type StorePutOptions,
@@ -15,6 +17,25 @@ declare module '@harperfast/rocksdb-js' {
15
17
  }
16
18
  }
17
19
 
20
+ /**
21
+ * Widen value-space bounds to `[value, MAXIMUM_KEY]` composite bounds. The base implementation's
22
+ * encoded-byte successor of the bare indexed value would exclude the wrong entries on composite
23
+ * `[indexedValue, primaryKey]` keys.
24
+ */
25
+ function translateIndexBounds<
26
+ T extends { start?: any; end?: any; exclusiveStart?: boolean; inclusiveEnd?: boolean; reverse?: boolean },
27
+ >(options: T): T {
28
+ let { start, end } = options;
29
+ const { exclusiveStart, inclusiveEnd, reverse } = options;
30
+ if ((reverse ? !exclusiveStart : exclusiveStart) && start !== undefined) {
31
+ start = [start, MAXIMUM_KEY];
32
+ }
33
+ if ((reverse ? !inclusiveEnd : inclusiveEnd) && end !== undefined) {
34
+ end = [end, MAXIMUM_KEY];
35
+ }
36
+ return { ...options, start, end };
37
+ }
38
+
18
39
  /**
19
40
  * A specialized RocksDB-based index store that maintains indexed references to primary keys.
20
41
  * This store uses composite keys consisting of indexed values and primary keys, enabling
@@ -28,19 +49,19 @@ export class RocksIndexStore extends RocksDatabase {
28
49
  * @param options
29
50
  */
30
51
  getRange(options: StoreIteratorOptions): Iterable<any> {
31
- let { start, end, exclusiveStart, inclusiveEnd, reverse } = options;
32
- if ((reverse ? !exclusiveStart : exclusiveStart) && start !== undefined) {
33
- start = [start, MAXIMUM_KEY];
34
- }
35
- if ((reverse ? !inclusiveEnd : inclusiveEnd) && end !== undefined) {
36
- end = [end, MAXIMUM_KEY];
37
- }
38
- const translatedOptions = { ...options, start, end };
39
- return trackReadRange(options.transaction, () => super.getRange(translatedOptions)).map(({ key }) => {
52
+ return trackReadRange(options.transaction, () => super.getRange(translateIndexBounds(options))).map(({ key }) => {
40
53
  return { key: key[0], value: key.length > 2 ? key.slice(1) : key[1] };
41
54
  });
42
55
  }
43
56
 
57
+ /**
58
+ * Estimate the entry count of a range of indexed values. Shares `getRange`'s bound translation
59
+ * so a planner estimate always covers exactly the range execution would iterate.
60
+ */
61
+ estimateCount(options?: CountEstimateOptions): CountEstimate {
62
+ return super.estimateCount(translateIndexBounds(options ?? {}));
63
+ }
64
+
44
65
  /**
45
66
  * Translate a put with indexed value and primary key to an underlying put
46
67
  * @param indexedValue - ignored, only used by LMDB
@@ -3,7 +3,12 @@ import { ExtendedIterable } from '@harperfast/extended-iterable';
3
3
  import { getIdOfRemoteNode } from './nodeIdMapping.ts';
4
4
  import { Decoder, readAuditEntry, ENTRY_DATAVIEW, AuditRecord, createAuditEntry } from './auditStore.ts';
5
5
  import { HAS_STRUCTURE_UPDATE } from './RecordEncoder.ts';
6
- import { endIteratorOnCorruptFrame } from './replayLogsGuards.ts';
6
+ import {
7
+ createCorruptFrameReporter,
8
+ endIteratorOnCorruptFrame,
9
+ isMidLogBreak,
10
+ type CorruptFrameStop,
11
+ } from './replayLogsGuards.ts';
7
12
  import { isMainThread } from 'node:worker_threads';
8
13
  import { EventEmitter } from 'node:events';
9
14
  import { asBinary } from 'lmdb';
@@ -23,12 +28,20 @@ type TransactionLogIterator = Iterator<TransactionEntry | number> & {
23
28
  removeLog(logName: string);
24
29
  };
25
30
 
26
- // Logs (once per log) when a corrupt frame ends a query iterator early; see
27
- // endIteratorOnCorruptFrame in replayLogsGuards.ts for why this is end-of-log, not a crash.
28
- function warnCorruptFrame(logName: string) {
29
- return (error: RangeError) =>
30
- harperLogger.warn(`Stopping transaction log "${logName}" at a corrupt entry during replay`, error);
31
- }
31
+ type TrackedIterator = IterableIterator<TransactionEntry> & { lastVersion?: number; lastEndTxn?: boolean };
32
+ type NamedTransactionEntry = TransactionEntry & { logName?: string };
33
+ export type ExactStartFailure = 'missing' | 'incomplete' | 'duplicate';
34
+
35
+ export type TransactionLogIterable = Iterable<AuditRecord> & {
36
+ /** Corrupt frames that ended a log's iteration during this range. */
37
+ corruptFrameStop: CorruptFrameStop;
38
+ /** Physical logs whose iterators ended with an unexpected, non-corruption error. */
39
+ failedLogs: Set<string>;
40
+ /** Physical logs whose requested exact transaction could not form one unambiguous resume boundary. */
41
+ exactStartFailures: Map<string, ExactStartFailure>;
42
+ };
43
+
44
+ const reportCorruptFrame = createCorruptFrameReporter(harperLogger);
32
45
 
33
46
  /**
34
47
  * Represents a transaction log store backed by RocksDB.
@@ -42,6 +55,7 @@ export class RocksTransactionLogStore extends EventEmitter {
42
55
  logByName: Map<string, TransactionLog> = new Map();
43
56
  updates = 0; // the number of updates to the list of logs that have occurred
44
57
  rootStore: RocksDatabase;
58
+ corruptFrameScope: string;
45
59
  reusableIterable = true; // flag indicating that iterable can be reused to resume iterating through audit log
46
60
  // Highest structureVersion appended to each per-node TransactionLog, tracked per tableId. Drives the
47
61
  // per-log HAS_STRUCTURE_UPDATE flag in put(). Keyed by (log, tableId): a per-node log interleaves entries
@@ -54,6 +68,10 @@ export class RocksTransactionLogStore extends EventEmitter {
54
68
  super();
55
69
  this.log = rootDatabase.useLog('local');
56
70
  this.rootStore = rootDatabase;
71
+ // Break reports are keyed per log name, but every store has its own 'local' log, so they
72
+ // need a scope. The path, not `databaseName`: one root store can back several logical
73
+ // databases and they share these logs, and `databaseName` is not set on it yet here.
74
+ this.corruptFrameScope = rootDatabase.path;
57
75
  }
58
76
 
59
77
  /**
@@ -119,9 +137,8 @@ export class RocksTransactionLogStore extends EventEmitter {
119
137
  }
120
138
  if (this.listenerCount('aftercommit')) {
121
139
  if (!(auditRecord instanceof Uint8Array)) {
122
- const txnTimestamp = options.transaction.getTimestamp?.();
123
- if (txnTimestamp != null) auditRecord.localTime = txnTimestamp;
124
- auditRecord.recordVersion = auditRecord.version;
140
+ const txnLogKey = options.transaction.getTimestamp?.();
141
+ if (txnLogKey != null) auditRecord.txnLogKey = txnLogKey;
125
142
  }
126
143
  (options.transaction.logEntries ??= []).push(auditRecord);
127
144
  }
@@ -172,7 +189,7 @@ export class RocksTransactionLogStore extends EventEmitter {
172
189
  if (entry.recordId === recordId && entry.tableId === tableId) {
173
190
  return entry;
174
191
  }
175
- if (entry.version !== key) return; // no longer in this transaction
192
+ if (entry.txnLogKey !== key) return; // no longer in this transaction
176
193
  }
177
194
  } else {
178
195
  // Harper puts some metadata in the database, we will just put this in the root store instead
@@ -231,6 +248,7 @@ export class RocksTransactionLogStore extends EventEmitter {
231
248
  getRange(options: {
232
249
  start?: number;
233
250
  exactStart?: boolean;
251
+ exclusiveStart?: boolean;
234
252
  end?: number;
235
253
  log?: string | number;
236
254
  excludeLogs?: string[];
@@ -238,9 +256,87 @@ export class RocksTransactionLogStore extends EventEmitter {
238
256
  startByLog?: Map<string, number>;
239
257
  startFromLastFlushed?: boolean;
240
258
  readUncommitted?: boolean;
241
- }): Iterable<AuditRecord> {
259
+ /** Include the source transaction-log name on each returned audit record. */
260
+ includeLogName?: boolean;
261
+ /** Validate and consume one complete exact-start transaction per entry in `startByLog`. */
262
+ resumeAfterExactStart?: boolean;
263
+ /**
264
+ * Track which version a break truncated, in `corruptFrameStop.truncatedVersions`. Costs two
265
+ * property stores per yielded entry (see below), so it defaults off: only boot replay reads
266
+ * `truncatedVersions`, but this range is also the always-on source for live subscriptions and
267
+ * replication, where every healthy entry would otherwise pay bookkeeping nothing consumes.
268
+ */
269
+ trackCorruptTransactions?: boolean;
270
+ }): TransactionLogIterable {
242
271
  let iterable = new ExtendedIterable<TransactionEntry>();
243
272
  let aggregateIterator: TransactionLogIterator;
273
+ let singleLogIterator: TrackedIterator;
274
+ const attributeCorruption = options.trackCorruptTransactions === true;
275
+ const corruptFrameStop: CorruptFrameStop = { breaks: 0, truncatedVersions: new Set(), midLogBreak: false };
276
+ const failedLogs = new Set<string>();
277
+ const exactStartFailures = new Map<string, ExactStartFailure>();
278
+ const failedIterators = new WeakSet<IterableIterator<TransactionEntry>>();
279
+ const safeNext = (iterator: IterableIterator<TransactionEntry>, log: TransactionLog) => {
280
+ if (failedIterators.has(iterator)) return { value: undefined, done: true } as IteratorResult<TransactionEntry>;
281
+ try {
282
+ return iterator.next();
283
+ } catch (error) {
284
+ failedIterators.add(iterator);
285
+ failedLogs.add(log.name);
286
+ harperLogger.error('Transaction log iterator failed; terminating this log', error, {
287
+ log: log.name,
288
+ });
289
+ return { value: undefined, done: true } as IteratorResult<TransactionEntry>;
290
+ }
291
+ };
292
+ const resumePastExactStart = (
293
+ result: IteratorResult<TransactionEntry>,
294
+ iterator: TrackedIterator,
295
+ log: TransactionLog,
296
+ expected: number
297
+ ): IteratorResult<TransactionEntry> => {
298
+ if (result.done || result.value.timestamp !== expected) {
299
+ exactStartFailures.set(log.name, 'missing');
300
+ return { value: undefined, done: true };
301
+ }
302
+ while (!result.value.endTxn) {
303
+ result = safeNext(iterator, log);
304
+ if (result.done || result.value.timestamp !== expected) {
305
+ exactStartFailures.set(log.name, 'incomplete');
306
+ return { value: undefined, done: true };
307
+ }
308
+ }
309
+ result = safeNext(iterator, log);
310
+ if (!result.done && result.value.timestamp === expected) {
311
+ exactStartFailures.set(log.name, 'duplicate');
312
+ return { value: undefined, done: true };
313
+ }
314
+ return result;
315
+ };
316
+ // Each log's iterator carries the version and endTxn of the last entry it yielded, so a break
317
+ // can be attributed to the source transaction whose remaining entries it swallowed — unless
318
+ // that entry's own endTxn already closed the transaction, in which case the break fell after
319
+ // it, not inside it. On the iterator itself, not in a map keyed by log: this is written per
320
+ // entry on the replay/broadcast path (when `attributeCorruption`), and it stays attached when a
321
+ // removed log is spliced out of the aggregate.
322
+ const trackCorruptFrames = (log: TransactionLog, queryOptions: typeof options): TrackedIterator => {
323
+ const report = reportCorruptFrame(`${this.corruptFrameScope}/${log.name}`);
324
+ const iterator: TrackedIterator = endIteratorOnCorruptFrame(log.query(queryOptions), (error) => {
325
+ corruptFrameStop.breaks++;
326
+ if (iterator.lastVersion !== undefined && iterator.lastEndTxn !== true) {
327
+ corruptFrameStop.truncatedVersions.add(iterator.lastVersion);
328
+ }
329
+ if (isMidLogBreak(error)) corruptFrameStop.midLogBreak = true;
330
+ report(error);
331
+ });
332
+ // Set here, once, rather than left for the per-entry write sites below to add these fields
333
+ // on their first call: every TrackedIterator then reaches its final shape before any entry
334
+ // is consumed, so the hot per-entry writes hit an already-stable shape instead of each
335
+ // triggering its own transition on that iterator's first entry.
336
+ iterator.lastVersion = undefined;
337
+ iterator.lastEndTxn = undefined;
338
+ return iterator;
339
+ };
244
340
  if (options.log !== undefined) {
245
341
  let log = typeof options.log === 'number' ? this.nodeLogs?.[options.log] : this.logByName.get(options.log);
246
342
  if (!log) {
@@ -254,39 +350,43 @@ export class RocksTransactionLogStore extends EventEmitter {
254
350
  log = this.rootStore.useLog(options.log);
255
351
  }
256
352
  }
257
- const queryIterator = endIteratorOnCorruptFrame(log.query(options), warnCorruptFrame(log.name));
258
- iterable.iterate = () => queryIterator;
353
+ const resumeAfterExactStart =
354
+ options.resumeAfterExactStart === true && options.exactStart === true && options.start !== undefined;
355
+ const queryOptions = resumeAfterExactStart ? { ...options, exclusiveStart: false } : options;
356
+ const queryIterator = trackCorruptFrames(log, queryOptions);
357
+ singleLogIterator = queryIterator;
358
+ let exactStartObserved = !resumeAfterExactStart;
359
+ iterable.iterate =
360
+ options.includeLogName || resumeAfterExactStart
361
+ ? () => ({
362
+ next: () => {
363
+ let result = safeNext(queryIterator, log);
364
+ if (!exactStartObserved) {
365
+ exactStartObserved = true;
366
+ if (resumeAfterExactStart) result = resumePastExactStart(result, queryIterator, log, options.start);
367
+ }
368
+ if (!result.done && options.includeLogName) (result.value as NamedTransactionEntry).logName = log.name;
369
+ return result;
370
+ },
371
+ [Symbol.iterator]() {
372
+ return this;
373
+ },
374
+ return: (value?: any) => queryIterator.return?.(value) ?? { value, done: true },
375
+ throw: (error?: any) => {
376
+ if (queryIterator.throw) return queryIterator.throw(error);
377
+ throw error;
378
+ },
379
+ })
380
+ : () => queryIterator;
259
381
  } else {
260
382
  const onlyKeys = options.onlyKeys;
261
383
  let logs: TransactionLog[] = [];
262
384
  // holds the queue of next entries from each iterator
263
385
  let nextEntries: any[];
264
386
  let latestUpdates: number;
265
- const iterators: IterableIterator<TransactionEntry>[] = [];
266
- // Iterators that have permanently failed (corrupt entry stuck at the same
267
- // position). Tracked by identity so the retry-poll path in next() and
268
- // updateIterators() never calls .next() on them again — otherwise every
269
- // subsequent drain cycle would re-throw the same RangeError, spamming logs
270
- // and burning CPU.
271
- const failedIterators = new WeakSet<IterableIterator<TransactionEntry>>();
272
- // Per-log advance that converts a thrown corrupt-entry error from rocksdb-js
273
- // into a clean `done: true` for that iterator. The reader's RangeError leaves
274
- // `position` at the bad entry; re-calling next() would re-throw indefinitely.
275
- // Terminating just this log lets the aggregate keep draining the other peers'
276
- // logs and prevents the throw from escaping into setImmediate-scheduled
277
- // consumers (notifyFromTransactionData) where it becomes an uncaughtException.
278
- const safeNext = (iterator: IterableIterator<TransactionEntry>, log?: TransactionLog) => {
279
- if (failedIterators.has(iterator)) return { value: undefined, done: true };
280
- try {
281
- return iterator.next();
282
- } catch (error) {
283
- failedIterators.add(iterator);
284
- harperLogger.error('Transaction log iterator failed; terminating this log', error, {
285
- log: log?.name,
286
- });
287
- return { value: undefined, done: true };
288
- }
289
- };
387
+ const iterators: TrackedIterator[] = [];
388
+ const expectedExactStarts: Array<number | undefined> = [];
389
+ const observedExactStarts = new Set<string>();
290
390
  const updateIterators = () => {
291
391
  if (latestUpdates !== this.updates) {
292
392
  const latestLogs = (this.nodeLogs || this.loadLogs()).filter(
@@ -296,16 +396,26 @@ export class RocksTransactionLogStore extends EventEmitter {
296
396
  if (!logs.includes(log)) {
297
397
  logs.push(log);
298
398
  let queryOptions = options;
399
+ let expectedExactStart: number | undefined;
299
400
  if (options.startByLog) {
300
- // if the startByLog is provided, we use that
301
- queryOptions = { ...options, start: options.startByLog.get(log.name) ?? 0 };
401
+ if (options.startByLog.has(log.name)) {
402
+ expectedExactStart = options.startByLog.get(log.name)!;
403
+ queryOptions = {
404
+ ...options,
405
+ start: expectedExactStart,
406
+ exclusiveStart: options.resumeAfterExactStart ? false : options.exclusiveStart,
407
+ };
408
+ } else {
409
+ queryOptions = { ...options, start: 0, exactStart: false, exclusiveStart: false };
410
+ }
302
411
  } else if (latestUpdates >= 0) {
303
412
  // if this is not the first update, that means that this is a brand new log and if start wasn't specified
304
413
  // that means we are taking all future requests, so we need to start at zero so we don't introduce a race
305
414
  // condition of potentially missing an initial update
306
415
  queryOptions = { ...options, start: options.start ?? 0 };
307
416
  }
308
- iterators.push(endIteratorOnCorruptFrame(log.query(queryOptions), warnCorruptFrame(log.name)));
417
+ iterators.push(trackCorruptFrames(log, queryOptions));
418
+ expectedExactStarts.push(expectedExactStart);
309
419
  }
310
420
  }
311
421
  latestUpdates = this.updates;
@@ -314,12 +424,22 @@ export class RocksTransactionLogStore extends EventEmitter {
314
424
  let log = logs[i];
315
425
  if (!latestLogs.includes(log)) {
316
426
  logs.splice(i, 1);
317
- iterators.splice(i--, 1);
427
+ iterators.splice(i, 1);
428
+ expectedExactStarts.splice(i--, 1);
318
429
  }
319
430
  }
320
431
  }
321
432
  }
322
- nextEntries = iterators.map((iterator, i) => safeNext(iterator, logs[i]));
433
+ nextEntries = iterators.map((iterator, i) => {
434
+ const result = safeNext(iterator, logs[i]);
435
+ const expected = expectedExactStarts[i];
436
+ if (expected !== undefined && !observedExactStarts.has(logs[i].name)) {
437
+ observedExactStarts.add(logs[i].name);
438
+ if (options.resumeAfterExactStart) return resumePastExactStart(result, iterator, logs[i], expected);
439
+ if (result.done || result.value.timestamp !== expected) exactStartFailures.set(logs[i].name, 'missing');
440
+ }
441
+ return result;
442
+ });
323
443
  };
324
444
  updateIterators();
325
445
 
@@ -362,7 +482,12 @@ export class RocksTransactionLogStore extends EventEmitter {
362
482
  }
363
483
  }
364
484
  if (earliestIndex >= 0) {
365
- // replace the entry with the next one from the iterator we pulled from
485
+ if (options.includeLogName) (earliest as NamedTransactionEntry).logName = logs[earliestIndex].name;
486
+ if (attributeCorruption) {
487
+ // before the refill, which is where a break surfaces and needs this entry's version
488
+ iterators[earliestIndex].lastVersion = earliest.timestamp;
489
+ iterators[earliestIndex].lastEndTxn = earliest.endTxn;
490
+ }
366
491
  nextEntries[earliestIndex] = safeNext(iterators[earliestIndex], logs[earliestIndex]);
367
492
  return {
368
493
  value: onlyKeys ? earliest.timestamp : earliest,
@@ -388,6 +513,7 @@ export class RocksTransactionLogStore extends EventEmitter {
388
513
  if (index >= 0) {
389
514
  logs.splice(index, 1);
390
515
  iterators.splice(index, 1);
516
+ expectedExactStarts.splice(index, 1);
391
517
  nextEntries.splice(index, 1);
392
518
  options.excludeLogs.push(logName);
393
519
  }
@@ -395,7 +521,14 @@ export class RocksTransactionLogStore extends EventEmitter {
395
521
  };
396
522
  iterable.iterate = () => aggregateIterator;
397
523
  }
398
- const mappedAggregateIterable = iterable.map(({ timestamp, data, endTxn }: TransactionEntry) => {
524
+ const mappedAggregateIterable = iterable.map(({ timestamp, data, endTxn, logName }: NamedTransactionEntry) => {
525
+ // A break surfaces on the pull after this entry, so recording it here is in time to attribute
526
+ // that break to this entry's transaction. The aggregate branch records its own, per source
527
+ // log, because there this callback cannot tell which log an entry came from.
528
+ if (attributeCorruption && singleLogIterator) {
529
+ singleLogIterator.lastVersion = timestamp;
530
+ singleLogIterator.lastEndTxn = endTxn;
531
+ }
399
532
  // Per-entry try/catch: a corrupt rocks prelude (first 4-16 bytes) would otherwise
400
533
  // throw a raw `RangeError: Offset is outside the bounds of the DataView` out
401
534
  // through `iterable.map`, escape the for-of consumer, and land as an
@@ -421,10 +554,8 @@ export class RocksTransactionLogStore extends EventEmitter {
421
554
  position += 8;
422
555
  }
423
556
  const auditRecord = readAuditEntry(data, position, undefined);
424
- // version stays the log key (replication resume relies on version === log key);
425
- // the record's own version survives as recordVersion
426
- auditRecord.version = timestamp;
427
- auditRecord.localTime = timestamp;
557
+ if (options.includeLogName) auditRecord.logName = logName;
558
+ auditRecord.txnLogKey = timestamp;
428
559
  auditRecord.endTxn = endTxn;
429
560
  auditRecord.previousResidencyId = previousResidencyId;
430
561
  auditRecord.previousVersion = previousVersion;
@@ -436,7 +567,10 @@ export class RocksTransactionLogStore extends EventEmitter {
436
567
  byteLength: data?.byteLength,
437
568
  });
438
569
  return {
570
+ // the log key is all this entry still yields; its record version is undecodable
439
571
  version: timestamp,
572
+ txnLogKey: timestamp,
573
+ logName: options.includeLogName ? logName : undefined,
440
574
  endTxn,
441
575
  type: undefined,
442
576
  tableId: undefined,
@@ -452,7 +586,10 @@ export class RocksTransactionLogStore extends EventEmitter {
452
586
  mappedAggregateIterable.addLog = aggregateIterator.addLog;
453
587
  mappedAggregateIterable.removeLog = aggregateIterator.removeLog;
454
588
  }
455
- return mappedAggregateIterable;
589
+ mappedAggregateIterable.corruptFrameStop = corruptFrameStop;
590
+ mappedAggregateIterable.failedLogs = failedLogs;
591
+ mappedAggregateIterable.exactStartFailures = exactStartFailures;
592
+ return mappedAggregateIterable as TransactionLogIterable;
456
593
  }
457
594
  getKeys(_options?: any) {
458
595
  return []; // TODO: implement this