@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
@@ -31,6 +31,10 @@ export class Headers extends Map<string, [string, string | string[]]> {
31
31
  if (typeof name !== 'string') name = '' + name;
32
32
  return super.has(name.toLowerCase());
33
33
  }
34
+ delete(name) {
35
+ if (typeof name !== 'string') name = '' + name;
36
+ return super.delete(name.toLowerCase());
37
+ }
34
38
  setIfNone(name, value) {
35
39
  if (typeof name !== 'string') name = '' + name;
36
40
  if (typeof value !== 'string') value = '' + value;
@@ -159,3 +163,134 @@ export function toWriteHeadHeaders(headers: any): any {
159
163
  }
160
164
  return result;
161
165
  }
166
+
167
+ // RFC 9111 cache-scope directives; boundaries on both sides so a token like `public-foo` doesn't match.
168
+ export const SHARED_CACHE_OPTIN = /(^|[,\s])(public|s-maxage)($|[\s,;=])/i;
169
+ export const PRIVATE_SCOPE = /(^|[,\s])(private|no-store)($|[\s,;=])/i;
170
+
171
+ function headerValueString(value: unknown): string {
172
+ if (value == null) return '';
173
+ return Array.isArray(value) ? value.join(', ') : String(value);
174
+ }
175
+
176
+ /**
177
+ * Folds the middleware chain's response headers into the headers a fallback server produced for the
178
+ * same request.
179
+ *
180
+ * Bun and uWS construct a new response from legacy Fastify when the chain declines a request, so the
181
+ * chain's credential-dependent cache policy must be merged explicitly. Fastify wins headers it set,
182
+ * `Vary` is unioned, and private cache scope is re-applied unless the final response explicitly opts
183
+ * into RFC 9111 shared caching with `public` or `s-maxage`.
184
+ */
185
+ export function mergeChainHeadersIntoFallback<
186
+ T extends {
187
+ get(name: string): any;
188
+ set(name: string, value: any): any;
189
+ has(name: string): boolean;
190
+ append?(name: string, value: any): any;
191
+ },
192
+ >(chainHeaders: any, finalHeaders: T): T {
193
+ if (!chainHeaders?.[Symbol.iterator]) return finalHeaders;
194
+ const chainVary = headerValueString(chainHeaders.get('Vary'));
195
+ const chainCacheControl = headerValueString(chainHeaders.get('Cache-Control'));
196
+ for (const [name, value] of chainHeaders) {
197
+ const lowerName = String(name).toLowerCase();
198
+ if (lowerName === 'vary' || lowerName === 'cache-control') continue;
199
+ if (finalHeaders.has(name)) {
200
+ if (lowerName === 'set-cookie') {
201
+ const existing = (finalHeaders as any).getSetCookie?.() ?? finalHeaders.get(name);
202
+ const existingValues = new Set((Array.isArray(existing) ? existing : [existing]).map(String));
203
+ const values = Array.isArray(value) ? value : [value];
204
+ for (const single of values) {
205
+ if (!existingValues.has(String(single))) appendHeader(finalHeaders, name, single, false);
206
+ }
207
+ }
208
+ continue;
209
+ }
210
+ if (Array.isArray(value)) {
211
+ for (const single of value) appendHeader(finalHeaders, name, single, lowerName !== 'set-cookie');
212
+ } else finalHeaders.set(name, value);
213
+ }
214
+ for (const token of chainVary.split(',')) {
215
+ const trimmed = token.trim();
216
+ if (trimmed) addVaryHeader(finalHeaders as any, trimmed);
217
+ }
218
+ if (chainCacheControl) {
219
+ const finalCacheControl = headerValueString(finalHeaders.get('Cache-Control'));
220
+ if (!finalCacheControl) finalHeaders.set('Cache-Control', chainCacheControl);
221
+ else if (
222
+ PRIVATE_SCOPE.test(chainCacheControl) &&
223
+ !PRIVATE_SCOPE.test(finalCacheControl) &&
224
+ !SHARED_CACHE_OPTIN.test(finalCacheControl)
225
+ )
226
+ finalHeaders.set('Cache-Control', finalCacheControl + ', private');
227
+ }
228
+ return finalHeaders;
229
+ }
230
+
231
+ function nodeResponseHeaders(nodeResponse: any) {
232
+ return {
233
+ get: (name: string) => nodeResponse.getHeader(name),
234
+ set: (name: string, value: any) => nodeResponse.setHeader(name, value),
235
+ has: (name: string) => nodeResponse.hasHeader(name),
236
+ append: (name: string, value: any, commaDelimited?: boolean) => {
237
+ const existing = nodeResponse.getHeader(name);
238
+ if (existing == null) return nodeResponse.setHeader(name, value);
239
+ if (commaDelimited)
240
+ return nodeResponse.setHeader(name, (Array.isArray(existing) ? existing.join(', ') : existing) + ', ' + value);
241
+ return nodeResponse.setHeader(name, Array.isArray(existing) ? [...existing, value] : [existing, value]);
242
+ },
243
+ };
244
+ }
245
+
246
+ export function applyWriteHeadHeaders(nodeResponse: any, headers: any): void {
247
+ const suppliedHeaders = new Map<string, { name: string; value: any }>();
248
+ const addHeader = (name: string, value: any) => {
249
+ const key = String(name).toLowerCase();
250
+ const supplied = suppliedHeaders.get(key);
251
+ if (!supplied) {
252
+ suppliedHeaders.set(key, { name, value });
253
+ return;
254
+ }
255
+ const values = Array.isArray(supplied.value) ? supplied.value : [supplied.value];
256
+ supplied.value = Array.isArray(value) ? values.concat(value) : values.concat([value]);
257
+ };
258
+ if (Array.isArray(headers)) {
259
+ if (Array.isArray(headers[0])) {
260
+ for (const [name, value] of headers) addHeader(name, value);
261
+ } else {
262
+ for (let i = 0; i + 1 < headers.length; i += 2) addHeader(headers[i], headers[i + 1]);
263
+ }
264
+ } else {
265
+ for (const name of Object.keys(headers)) {
266
+ const value = headers[name];
267
+ if (value != null) addHeader(name, value);
268
+ }
269
+ }
270
+ for (const { name, value } of suppliedHeaders.values()) nodeResponse.setHeader(name, value);
271
+ }
272
+
273
+ /**
274
+ * Node's counterpart to the Bun and uWS fallback bridges: the chain's headers go onto the
275
+ * `ServerResponse` before legacy Fastify runs, so a Fastify route that sets `Cache-Control` or `Vary`
276
+ * replaces them outright and can make a credential-dependent response shared-cacheable (#1565).
277
+ * Reconciliation therefore runs at `writeHead` — the last point the header set is still mutable, and
278
+ * the one Node also routes implicit headers through — using the same policy as the other two bridges.
279
+ */
280
+ export function bridgeChainHeadersToNodeResponse(chainHeaders: any, nodeResponse: any): void {
281
+ if (!chainHeaders?.[Symbol.iterator]) return;
282
+ for (const [name, value] of chainHeaders) nodeResponse.setHeader(name, value);
283
+ const originalWriteHead = nodeResponse.writeHead;
284
+ nodeResponse.writeHead = function (statusCode: number, statusMessage?: any, headers?: any) {
285
+ if (this.headersSent) return originalWriteHead.apply(this, arguments as any);
286
+ if (statusMessage != null && typeof statusMessage !== 'string') {
287
+ headers = statusMessage;
288
+ statusMessage = undefined;
289
+ }
290
+ if (headers) applyWriteHeadHeaders(this, headers);
291
+ mergeChainHeadersIntoFallback(chainHeaders, nodeResponseHeaders(this));
292
+ return statusMessage === undefined
293
+ ? originalWriteHead.call(this, statusCode)
294
+ : originalWriteHead.call(this, statusCode, statusMessage);
295
+ };
296
+ }
@@ -0,0 +1,221 @@
1
+ import { STATUS_CODES } from 'node:http';
2
+ import type {
3
+ IncomingMessage as NodeIncomingMessage,
4
+ OutgoingHttpHeader,
5
+ OutgoingHttpHeaders,
6
+ ServerResponse as NodeServerResponse,
7
+ } from 'node:http';
8
+ import type { Socket } from 'node:net';
9
+ import { PassThrough } from 'node:stream';
10
+ import { Headers as ResponseHeaders, applyWriteHeadHeaders } from './Headers.ts';
11
+
12
+ export interface AdaptedResponse {
13
+ status: number;
14
+ headers: ResponseHeaders;
15
+ body: PassThrough;
16
+ }
17
+
18
+ class HeadersSentError extends Error {
19
+ code = 'ERR_HTTP_HEADERS_SENT';
20
+ constructor(action: string) {
21
+ super(`Cannot ${action} headers after they are sent to the client`);
22
+ }
23
+ }
24
+
25
+ class UnsupportedResponseMethodError extends Error {
26
+ constructor(method: string) {
27
+ super(`${method}() is not supported on a withNodeAdapter() response`);
28
+ }
29
+ }
30
+
31
+ const ignoreError = () => {};
32
+
33
+ export class NodeAdapterResponse extends PassThrough implements NodeServerResponse {
34
+ statusCode = 200;
35
+ statusMessage = '';
36
+ strictContentLength = false;
37
+ chunkedEncoding = false;
38
+ shouldKeepAlive = true;
39
+ useChunkedEncodingByDefault = true;
40
+ sendDate = true;
41
+ readonly req: NodeIncomingMessage;
42
+ readonly socket: Socket | null;
43
+ #headers = new ResponseHeaders();
44
+ #committedStatus: number | undefined;
45
+ #headerText: string | undefined;
46
+ #nodeResponse: NodeServerResponse | undefined;
47
+ #resolve: (response: AdaptedResponse) => void;
48
+ #reject: (reason: unknown) => void;
49
+
50
+ constructor(
51
+ req: NodeIncomingMessage,
52
+ nodeResponse: NodeServerResponse | undefined,
53
+ resolve: (response: AdaptedResponse) => void,
54
+ reject: (reason: unknown) => void
55
+ ) {
56
+ super();
57
+ this.req = req;
58
+ this.socket = req.socket ?? null;
59
+ this.#nodeResponse = nodeResponse;
60
+ this.#resolve = resolve;
61
+ this.#reject = reject;
62
+ this.on('error', ignoreError);
63
+ if (typeof nodeResponse?.on === 'function') {
64
+ const forward = (...args: any[]) => this.emit('timeout', ...args);
65
+ let forwarding = false;
66
+ const syncForwarding = (wanted: boolean) => {
67
+ if (wanted === forwarding) return;
68
+ forwarding = wanted;
69
+ if (wanted) nodeResponse.on('timeout', forward);
70
+ else nodeResponse.removeListener('timeout', forward);
71
+ };
72
+ const onNewListener = (event: string | symbol) => event === 'timeout' && syncForwarding(true);
73
+ const onRemoveListener = (event: string | symbol) =>
74
+ event === 'timeout' && syncForwarding(this.listenerCount('timeout') > 0);
75
+ this.on('newListener', onNewListener);
76
+ this.on('removeListener', onRemoveListener);
77
+ this.once('close', () => {
78
+ syncForwarding(false);
79
+ this.removeListener('newListener', onNewListener);
80
+ this.removeListener('removeListener', onRemoveListener);
81
+ });
82
+ }
83
+ }
84
+
85
+ get headersSent() {
86
+ return this.#committedStatus !== undefined;
87
+ }
88
+ get finished() {
89
+ return this.writableEnded;
90
+ }
91
+ get connection() {
92
+ return this.socket;
93
+ }
94
+ get _header(): string | null {
95
+ if (this.#committedStatus === undefined) return null;
96
+ if (this.#headerText === undefined) {
97
+ let text = `HTTP/1.1 ${this.#committedStatus} ${this.statusMessage}\r\n`;
98
+ for (const [name, value] of this.#headers) {
99
+ if (Array.isArray(value)) for (const entry of value) text += `${name}: ${entry}\r\n`;
100
+ else text += `${name}: ${value}\r\n`;
101
+ }
102
+ this.#headerText = text + '\r\n';
103
+ }
104
+ return this.#headerText;
105
+ }
106
+
107
+ setHeader(name: string, value: number | string | readonly string[]) {
108
+ if (this.headersSent) throw new HeadersSentError('set');
109
+ this.#headers.set(name, value);
110
+ return this;
111
+ }
112
+ setHeaders(headers: Headers | Map<string, number | string | readonly string[]> | ResponseHeaders) {
113
+ let cookies: string[] | undefined;
114
+ for (const [name, value] of headers) {
115
+ if (name.toLowerCase() !== 'set-cookie') this.setHeader(name, value);
116
+ else if (Array.isArray(value)) (cookies ??= []).push(...value);
117
+ else (cookies ??= []).push(String(value));
118
+ }
119
+ if (cookies) this.setHeader('set-cookie', cookies);
120
+ return this;
121
+ }
122
+ appendHeader(name: string, value: string | readonly string[]) {
123
+ if (this.headersSent) throw new HeadersSentError('append');
124
+ if (Array.isArray(value)) for (const entry of value) this.#headers.append(name, entry);
125
+ else this.#headers.append(name, value);
126
+ return this;
127
+ }
128
+ getHeader(name: string) {
129
+ return this.#headers.get(name);
130
+ }
131
+ getHeaders() {
132
+ const headers: OutgoingHttpHeaders = Object.create(null);
133
+ for (const [name, value] of this.#headers) headers[name.toLowerCase()] = value;
134
+ return headers;
135
+ }
136
+ getHeaderNames() {
137
+ return [...this.#headers.keys()];
138
+ }
139
+ hasHeader(name: string) {
140
+ return this.#headers.has(name);
141
+ }
142
+ removeHeader(name: string) {
143
+ if (this.headersSent) throw new HeadersSentError('remove');
144
+ this.#headers.delete(name);
145
+ }
146
+
147
+ writeHead(statusCode: number, statusMessage?: string, headers?: OutgoingHttpHeaders | OutgoingHttpHeader[]): this;
148
+ writeHead(statusCode: number, headers?: OutgoingHttpHeaders | OutgoingHttpHeader[]): this;
149
+ writeHead(
150
+ statusCode: number,
151
+ statusMessageOrHeaders?: string | OutgoingHttpHeaders | OutgoingHttpHeader[],
152
+ headers?: OutgoingHttpHeaders | OutgoingHttpHeader[]
153
+ ) {
154
+ if (this.headersSent) throw new HeadersSentError('write');
155
+ this.statusCode = statusCode;
156
+ if (typeof statusMessageOrHeaders === 'string') this.statusMessage = statusMessageOrHeaders;
157
+ else {
158
+ this.statusMessage ||= STATUS_CODES[statusCode] || 'unknown';
159
+ // writeHead(302, undefined, headers) is the three-argument form with the status message
160
+ // omitted; the hole must not erase the headers the third argument carries.
161
+ headers ??= statusMessageOrHeaders;
162
+ }
163
+ if (headers) applyWriteHeadHeaders(this, headers);
164
+ this.#committedStatus = statusCode;
165
+ this.#resolve({ status: statusCode, headers: this.#headers, body: this });
166
+ return this;
167
+ }
168
+ _implicitHeader() {
169
+ this.writeHead(this.statusCode);
170
+ }
171
+ flushHeaders() {
172
+ if (!this.headersSent) this._implicitHeader();
173
+ }
174
+
175
+ write(
176
+ chunk: unknown,
177
+ encoding?: BufferEncoding | ((error?: Error | null) => void),
178
+ callback?: (error?: Error | null) => void
179
+ ) {
180
+ if (!this.headersSent) this._implicitHeader();
181
+ return super.write(chunk, encoding as BufferEncoding, callback);
182
+ }
183
+ end(chunk?: unknown, encoding?: BufferEncoding | (() => void), callback?: () => void) {
184
+ if (!this.headersSent) this._implicitHeader();
185
+ return super.end(chunk, encoding as BufferEncoding, callback);
186
+ }
187
+ _destroy(error: Error | null, callback: (error?: Error | null) => void) {
188
+ if (!this.headersSent) this.#reject(error ?? new Error('Response destroyed before headers were sent'));
189
+ callback(error);
190
+ }
191
+
192
+ setTimeout(msecs: number, callback?: () => void) {
193
+ if (callback) this.on('timeout', callback);
194
+ const nodeResponse = this.#nodeResponse;
195
+ if (typeof nodeResponse?.setTimeout !== 'function') return this;
196
+ nodeResponse.setTimeout(msecs);
197
+ return this;
198
+ }
199
+ writeContinue(callback?: () => void) {
200
+ if (typeof this.#nodeResponse?.writeContinue === 'function') this.#nodeResponse.writeContinue(callback);
201
+ else callback?.();
202
+ }
203
+ writeProcessing(callback?: () => void) {
204
+ if (typeof this.#nodeResponse?.writeProcessing === 'function') this.#nodeResponse.writeProcessing(callback);
205
+ else callback?.();
206
+ }
207
+ writeEarlyHints(hints: Record<string, string | string[]>, callback?: () => void) {
208
+ if (typeof this.#nodeResponse?.writeEarlyHints === 'function') this.#nodeResponse.writeEarlyHints(hints, callback);
209
+ else callback?.();
210
+ }
211
+ // Trailers need chunked encoding on the wire, which Harper's response layer owns; dropping one silently (a Digest, say) is worse than failing.
212
+ addTrailers(): never {
213
+ throw new UnsupportedResponseMethodError('addTrailers');
214
+ }
215
+ assignSocket(): never {
216
+ throw new UnsupportedResponseMethodError('assignSocket');
217
+ }
218
+ detachSocket(): never {
219
+ throw new UnsupportedResponseMethodError('detachSocket');
220
+ }
221
+ }
@@ -1,10 +1,11 @@
1
1
  import type { IncomingMessage as NodeIncomingMessage, ServerResponse as NodeServerResponse } from 'node:http';
2
2
  import type { Socket } from 'node:net';
3
3
  import { TLSSocket } from 'node:tls';
4
- import { EventEmitter } from 'node:events';
5
- import { Readable, PassThrough } from 'node:stream';
4
+ import { Readable } from 'node:stream';
6
5
  import { Headers as ResponseHeaders } from './Headers.ts';
6
+ import { NodeAdapterResponse, type AdaptedResponse } from './NodeAdapterResponse.ts';
7
7
  import type { ConnectionInfo } from './proxyProtocol.ts';
8
+ import harperLogger from '../../utility/logging/harper_logger.ts';
8
9
 
9
10
  export const isBun = typeof globalThis.Bun !== 'undefined';
10
11
 
@@ -178,10 +179,8 @@ export class Request {
178
179
  * status, headers, and body, resolving the returned promise as soon as headers are available with a
179
180
  * streaming body that can be piped back through the Harper middleware chain.
180
181
  *
181
- * **Important:** The resolved `body` PassThrough must have an `error` listener attached (or be piped
182
- * to a destination that handles errors) before it is consumed. If the underlying connection is reset
183
- * after headers are sent, the body stream is destroyed with an error — without a listener, Node.js
184
- * will throw an uncaught exception.
182
+ * Consume the returned body with `pipeline()`, `finished()` or async iteration so stored stream errors
183
+ * and premature closes are reported.
185
184
  *
186
185
  * Example:
187
186
  * server.http((request, next) =>
@@ -190,11 +189,13 @@ export class Request {
190
189
  */
191
190
  withNodeAdapter(
192
191
  handler: (request: NodeIncomingMessage, response: NodeServerResponse) => void | Promise<void>
193
- ): Promise<{ status: number; headers: ResponseHeaders; body: PassThrough }> {
194
- // Flat headers object matching IncomingMessage.headers format (lowercase keys)
195
- const reqHeaders: Record<string, string | string[]> = Object.create(null);
192
+ ): Promise<AdaptedResponse> {
193
+ const reqHeaders: Record<string, string | string[]> = {};
196
194
  for (const [key, value] of this.headers) {
197
- reqHeaders[key.toLowerCase()] = value;
195
+ const lowerKey = key.toLowerCase();
196
+ if (lowerKey === '__proto__')
197
+ Object.defineProperty(reqHeaders, lowerKey, { value, configurable: true, enumerable: true, writable: true });
198
+ else reqHeaders[lowerKey] = value;
198
199
  }
199
200
 
200
201
  // Proxy the underlying IncomingMessage so body streaming works, but expose
@@ -209,131 +210,32 @@ export class Request {
209
210
  },
210
211
  }) as NodeIncomingMessage;
211
212
 
212
- let resolveResponse!: (value: { status: number; headers: ResponseHeaders; body: PassThrough }) => void;
213
- let rejectResponse!: (reason: unknown) => void;
214
- const response = new Promise<{ status: number; headers: ResponseHeaders; body: PassThrough }>((resolve, reject) => {
215
- resolveResponse = resolve;
216
- rejectResponse = reject;
213
+ let nodeRes!: NodeAdapterResponse;
214
+ const response = new Promise<AdaptedResponse>((resolve, reject) => {
215
+ nodeRes = new NodeAdapterResponse(nodeReq, this._nodeResponse, resolve, reject);
217
216
  });
218
217
 
219
- const responseBody = new PassThrough();
220
- const capturedHeaders = new ResponseHeaders();
221
- let headersFlushed = false;
222
- let nodeRes: ReturnType<typeof Object.assign> & NodeServerResponse;
218
+ const signal = this.signal;
219
+ const onAbort = () => nodeRes.destroy(nodeRes.headersSent ? undefined : signal.reason);
220
+ if (signal.aborted) onAbort();
221
+ else {
222
+ signal.addEventListener('abort', onAbort, { once: true });
223
+ nodeRes.once('close', () => signal.removeEventListener('abort', onAbort));
224
+ }
223
225
 
224
- const flushHeaders = () => {
225
- if (!headersFlushed) {
226
- headersFlushed = true;
227
- nodeRes.headersSent = true;
228
- resolveResponse({ status: nodeRes.statusCode as number, headers: capturedHeaders, body: responseBody });
229
- }
226
+ const onHandlerFailure = (error: Error) => {
227
+ if (!nodeRes.writableEnded) nodeRes.destroy(error);
228
+ else harperLogger.warn('withNodeAdapter handler failed after ending its response', error);
230
229
  };
231
-
232
- const applyHeaders = (hdrs: object | unknown[]) => {
233
- if (Array.isArray(hdrs)) {
234
- if (hdrs.length > 0 && Array.isArray(hdrs[0])) {
235
- for (const [name, value] of hdrs as [string, string][]) capturedHeaders.set(name, value);
236
- } else {
237
- for (let i = 0; i < hdrs.length; i += 2) capturedHeaders.set(hdrs[i] as string, hdrs[i + 1] as string);
238
- }
239
- } else {
240
- for (const [k, v] of Object.entries(hdrs)) capturedHeaders.set(k, v as string);
241
- }
242
- };
243
-
244
- nodeRes = Object.assign(new EventEmitter(), {
245
- statusCode: 200 as number,
246
- statusMessage: '',
247
- headersSent: false,
248
- writable: true,
249
- writableEnded: false,
250
- writableFinished: false,
251
- socket: this._nodeRequest.socket,
252
-
253
- setHeader(name: string, value: string | number | string[]) {
254
- if (Array.isArray(value)) {
255
- // Use set() for first value (overwrites any existing entry) then append() for
256
- // the rest so multiple values — critical for Set-Cookie — are preserved as an
257
- // array rather than collapsed into a single comma-joined string.
258
- if (value.length > 0) {
259
- capturedHeaders.set(name, String(value[0]));
260
- for (let i = 1; i < value.length; i++) capturedHeaders.append(name, String(value[i]));
261
- }
262
- } else {
263
- capturedHeaders.set(name, String(value));
264
- }
265
- return nodeRes;
266
- },
267
- getHeader(name: string) {
268
- return capturedHeaders.get(name);
269
- },
270
- getHeaders() {
271
- return Object.fromEntries(capturedHeaders);
272
- },
273
- hasHeader(name: string) {
274
- return capturedHeaders.has(name);
275
- },
276
- removeHeader(name: string) {
277
- capturedHeaders.delete(name);
278
- },
279
- flushHeaders() {
280
- flushHeaders();
281
- },
282
- writeHead(statusCode: number, statusMessageOrHeaders?: string | object, maybeHeaders?: object) {
283
- if (headersFlushed) return nodeRes;
284
- nodeRes.statusCode = statusCode;
285
- const hdrs = typeof statusMessageOrHeaders === 'string' ? maybeHeaders : statusMessageOrHeaders;
286
- if (hdrs) applyHeaders(hdrs as object | unknown[]);
287
- flushHeaders();
288
- return nodeRes;
289
- },
290
- write(
291
- chunk: unknown,
292
- encoding?: BufferEncoding | ((error?: Error | null) => void),
293
- callback?: (error?: Error | null) => void
294
- ) {
295
- flushHeaders();
296
- if (typeof encoding === 'function') return responseBody.write(chunk as any, encoding);
297
- return responseBody.write(chunk as any, encoding, callback);
298
- },
299
- end(chunk?: unknown, encoding?: BufferEncoding | (() => void), callback?: () => void) {
300
- flushHeaders();
301
- nodeRes.writableEnded = true;
302
- if (typeof chunk === 'function') responseBody.end(chunk as () => void);
303
- else if (typeof encoding === 'function') responseBody.end(chunk as any, encoding);
304
- else responseBody.end(chunk as any, encoding, callback);
305
- return nodeRes;
306
- },
307
- destroy(error?: Error) {
308
- if (!headersFlushed) {
309
- if (error) rejectResponse(error);
310
- else rejectResponse(new Error('Response destroyed before headers were sent'));
311
- // The error has been forwarded to the response promise; suppress the
312
- // PassThrough 'error' event for this one destroy call so Node doesn't
313
- // throw due to having no other listeners.
314
- responseBody.once('error', () => {});
315
- }
316
- responseBody.destroy(error);
317
- return nodeRes;
318
- },
319
- }) as unknown as NodeServerResponse;
320
-
321
- responseBody.on('finish', () => {
322
- nodeRes.writableFinished = true;
323
- (nodeRes as unknown as EventEmitter).emit('finish');
324
- });
325
- responseBody.on('drain', () => {
326
- (nodeRes as unknown as EventEmitter).emit('drain');
327
- });
328
- responseBody.on('close', () => {
329
- (nodeRes as unknown as EventEmitter).emit('close');
330
- });
331
-
332
- const handlerResult = handler(nodeReq, nodeRes);
333
- if (handlerResult != null && typeof (handlerResult as unknown as Promise<void>).then === 'function') {
334
- (handlerResult as unknown as Promise<void>).catch((err: unknown) => {
335
- if (!headersFlushed) rejectResponse(err);
336
- });
230
+ let handlerResult: void | Promise<void>;
231
+ try {
232
+ handlerResult = handler(nodeReq, nodeRes);
233
+ } catch (error) {
234
+ onHandlerFailure(error as Error);
235
+ return response;
236
+ }
237
+ if (typeof (handlerResult as Promise<void>)?.then === 'function') {
238
+ Promise.resolve(handlerResult).catch(onHandlerFailure);
337
239
  }
338
240
  return response;
339
241
  }