@nifrajs/core 3.3.0 → 4.0.0

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 (331) hide show
  1. package/README.md +26 -0
  2. package/dist/assurance.d.ts +7 -0
  3. package/dist/assurance.d.ts.map +1 -1
  4. package/dist/assurance.js +39 -3
  5. package/dist/assurance.js.map +1 -1
  6. package/dist/capabilities.d.ts +20 -2
  7. package/dist/capabilities.d.ts.map +1 -1
  8. package/dist/capabilities.js +47 -15
  9. package/dist/capabilities.js.map +1 -1
  10. package/dist/diff.d.ts +6 -1
  11. package/dist/diff.d.ts.map +1 -1
  12. package/dist/diff.js +36 -2
  13. package/dist/diff.js.map +1 -1
  14. package/dist/durable-adapters.d.ts.map +1 -1
  15. package/dist/durable-adapters.js +16 -3
  16. package/dist/durable-adapters.js.map +1 -1
  17. package/dist/durable-effect.d.ts.map +1 -1
  18. package/dist/durable-effect.js +6 -3
  19. package/dist/durable-effect.js.map +1 -1
  20. package/dist/edge-kit.d.ts +2 -0
  21. package/dist/edge-kit.d.ts.map +1 -1
  22. package/dist/edge-kit.js +2 -0
  23. package/dist/edge-kit.js.map +1 -1
  24. package/dist/effect-lifecycle.d.ts.map +1 -1
  25. package/dist/effect-lifecycle.js +2 -1
  26. package/dist/effect-lifecycle.js.map +1 -1
  27. package/dist/effect-scope.d.ts.map +1 -1
  28. package/dist/effect-scope.js +1 -1
  29. package/dist/effect-scope.js.map +1 -1
  30. package/dist/errors.d.ts +1 -1
  31. package/dist/errors.d.ts.map +1 -1
  32. package/dist/errors.js.map +1 -1
  33. package/dist/evidence.d.ts +36 -1
  34. package/dist/evidence.d.ts.map +1 -1
  35. package/dist/evidence.js +219 -13
  36. package/dist/evidence.js.map +1 -1
  37. package/dist/idempotency.d.ts +31 -0
  38. package/dist/idempotency.d.ts.map +1 -1
  39. package/dist/idempotency.js +48 -9
  40. package/dist/idempotency.js.map +1 -1
  41. package/dist/index.d.ts +9 -6
  42. package/dist/index.d.ts.map +1 -1
  43. package/dist/index.js +6 -3
  44. package/dist/index.js.map +1 -1
  45. package/dist/internal/code-unit-order.d.ts +7 -0
  46. package/dist/internal/code-unit-order.d.ts.map +1 -0
  47. package/dist/internal/code-unit-order.js +9 -0
  48. package/dist/internal/code-unit-order.js.map +1 -0
  49. package/dist/internal/durable-saga-protocol.d.ts.map +1 -1
  50. package/dist/internal/durable-saga-protocol.js +2 -0
  51. package/dist/internal/durable-saga-protocol.js.map +1 -1
  52. package/dist/internal/route-catalog.d.ts +6 -6
  53. package/dist/internal/route-catalog.d.ts.map +1 -1
  54. package/dist/internal/route-catalog.js +20 -18
  55. package/dist/internal/route-catalog.js.map +1 -1
  56. package/dist/internal/route-compiler.d.ts +7 -6
  57. package/dist/internal/route-compiler.d.ts.map +1 -1
  58. package/dist/internal/route-compiler.js +36 -4
  59. package/dist/internal/route-compiler.js.map +1 -1
  60. package/dist/internal/route-execution.d.ts +7 -3
  61. package/dist/internal/route-execution.d.ts.map +1 -1
  62. package/dist/internal/route-execution.js.map +1 -1
  63. package/dist/internal/route-lanes.d.ts +1 -0
  64. package/dist/internal/route-lanes.d.ts.map +1 -1
  65. package/dist/internal/route-lanes.js +34 -29
  66. package/dist/internal/route-lanes.js.map +1 -1
  67. package/dist/internal/route-program.d.ts +8 -2
  68. package/dist/internal/route-program.d.ts.map +1 -1
  69. package/dist/internal/route-program.js +222 -20
  70. package/dist/internal/route-program.js.map +1 -1
  71. package/dist/ledger.d.ts.map +1 -1
  72. package/dist/ledger.js +8 -5
  73. package/dist/ledger.js.map +1 -1
  74. package/dist/manifest.d.ts +1 -1
  75. package/dist/manifest.d.ts.map +1 -1
  76. package/dist/manifest.js +52 -46
  77. package/dist/manifest.js.map +1 -1
  78. package/dist/mount.d.ts +36 -0
  79. package/dist/mount.d.ts.map +1 -1
  80. package/dist/mount.js +32 -0
  81. package/dist/mount.js.map +1 -1
  82. package/dist/reflection.d.ts +26 -0
  83. package/dist/reflection.d.ts.map +1 -1
  84. package/dist/reflection.js +65 -1
  85. package/dist/reflection.js.map +1 -1
  86. package/dist/response-observer.d.ts +1 -1
  87. package/dist/response-observer.d.ts.map +1 -1
  88. package/dist/response-observer.js.map +1 -1
  89. package/dist/router/overlap.d.ts +23 -0
  90. package/dist/router/overlap.d.ts.map +1 -0
  91. package/dist/router/overlap.js +224 -0
  92. package/dist/router/overlap.js.map +1 -0
  93. package/dist/router/pattern.d.ts +117 -2
  94. package/dist/router/pattern.d.ts.map +1 -1
  95. package/dist/router/pattern.js +283 -23
  96. package/dist/router/pattern.js.map +1 -1
  97. package/dist/router/router.d.ts +18 -4
  98. package/dist/router/router.d.ts.map +1 -1
  99. package/dist/router/router.js +51 -44
  100. package/dist/router/router.js.map +1 -1
  101. package/dist/server/auth.d.ts +53 -0
  102. package/dist/server/auth.d.ts.map +1 -0
  103. package/dist/server/auth.js +9 -0
  104. package/dist/server/auth.js.map +1 -0
  105. package/dist/server/bare-error-lane.d.ts +12 -7
  106. package/dist/server/bare-error-lane.d.ts.map +1 -1
  107. package/dist/server/bare-error-lane.js +13 -11
  108. package/dist/server/bare-error-lane.js.map +1 -1
  109. package/dist/server/body-lane.d.ts +20 -2
  110. package/dist/server/body-lane.d.ts.map +1 -1
  111. package/dist/server/body-lane.js +26 -7
  112. package/dist/server/body-lane.js.map +1 -1
  113. package/dist/server/body-parser.d.ts +68 -0
  114. package/dist/server/body-parser.d.ts.map +1 -0
  115. package/dist/server/body-parser.js +172 -0
  116. package/dist/server/body-parser.js.map +1 -0
  117. package/dist/server/body.d.ts.map +1 -1
  118. package/dist/server/body.js +62 -7
  119. package/dist/server/body.js.map +1 -1
  120. package/dist/server/client-ip.d.ts +8 -0
  121. package/dist/server/client-ip.d.ts.map +1 -1
  122. package/dist/server/client-ip.js +8 -0
  123. package/dist/server/client-ip.js.map +1 -1
  124. package/dist/server/context.d.ts +71 -6
  125. package/dist/server/context.d.ts.map +1 -1
  126. package/dist/server/contract.d.ts +15 -5
  127. package/dist/server/contract.d.ts.map +1 -1
  128. package/dist/server/contract.js +25 -4
  129. package/dist/server/contract.js.map +1 -1
  130. package/dist/server/cookies.d.ts +4 -1
  131. package/dist/server/cookies.d.ts.map +1 -1
  132. package/dist/server/cookies.js +40 -2
  133. package/dist/server/cookies.js.map +1 -1
  134. package/dist/server/core-copies.d.ts +2 -0
  135. package/dist/server/core-copies.d.ts.map +1 -0
  136. package/dist/server/core-copies.js +20 -0
  137. package/dist/server/core-copies.js.map +1 -0
  138. package/dist/server/edge.d.ts.map +1 -1
  139. package/dist/server/edge.js +2 -0
  140. package/dist/server/edge.js.map +1 -1
  141. package/dist/server/http.d.ts +11 -0
  142. package/dist/server/http.d.ts.map +1 -1
  143. package/dist/server/http.js +36 -0
  144. package/dist/server/http.js.map +1 -1
  145. package/dist/server/idempotency-lane.d.ts +6 -0
  146. package/dist/server/idempotency-lane.d.ts.map +1 -1
  147. package/dist/server/idempotency-lane.js +130 -73
  148. package/dist/server/idempotency-lane.js.map +1 -1
  149. package/dist/server/install.d.ts +4 -0
  150. package/dist/server/install.d.ts.map +1 -1
  151. package/dist/server/install.js +4 -0
  152. package/dist/server/install.js.map +1 -1
  153. package/dist/server/methods.d.ts +45 -0
  154. package/dist/server/methods.d.ts.map +1 -0
  155. package/dist/server/methods.js +37 -0
  156. package/dist/server/methods.js.map +1 -0
  157. package/dist/server/multipart.d.ts +63 -0
  158. package/dist/server/multipart.d.ts.map +1 -0
  159. package/dist/server/multipart.js +374 -0
  160. package/dist/server/multipart.js.map +1 -0
  161. package/dist/server/node-outcome-hook.d.ts +20 -0
  162. package/dist/server/node-outcome-hook.d.ts.map +1 -1
  163. package/dist/server/node-outcome-hook.js +15 -6
  164. package/dist/server/node-outcome-hook.js.map +1 -1
  165. package/dist/server/not-found-answer.d.ts +40 -0
  166. package/dist/server/not-found-answer.d.ts.map +1 -0
  167. package/dist/server/not-found-answer.js +56 -0
  168. package/dist/server/not-found-answer.js.map +1 -0
  169. package/dist/server/not-found.d.ts +23 -0
  170. package/dist/server/not-found.d.ts.map +1 -0
  171. package/dist/server/not-found.js +81 -0
  172. package/dist/server/not-found.js.map +1 -0
  173. package/dist/server/plugin.d.ts +26 -1
  174. package/dist/server/plugin.d.ts.map +1 -1
  175. package/dist/server/plugin.js.map +1 -1
  176. package/dist/server/proto-guard.d.ts +18 -5
  177. package/dist/server/proto-guard.d.ts.map +1 -1
  178. package/dist/server/proto-guard.js +114 -9
  179. package/dist/server/proto-guard.js.map +1 -1
  180. package/dist/server/query.d.ts +7 -0
  181. package/dist/server/query.d.ts.map +1 -1
  182. package/dist/server/query.js +47 -0
  183. package/dist/server/query.js.map +1 -1
  184. package/dist/server/registry.d.ts +13 -2
  185. package/dist/server/registry.d.ts.map +1 -1
  186. package/dist/server/request-context.d.ts +11 -0
  187. package/dist/server/request-context.d.ts.map +1 -1
  188. package/dist/server/request-context.js +33 -19
  189. package/dist/server/request-context.js.map +1 -1
  190. package/dist/server/request-lineage.d.ts +8 -0
  191. package/dist/server/request-lineage.d.ts.map +1 -0
  192. package/dist/server/request-lineage.js +14 -0
  193. package/dist/server/request-lineage.js.map +1 -0
  194. package/dist/server/request-target.d.ts +31 -0
  195. package/dist/server/request-target.d.ts.map +1 -0
  196. package/dist/server/request-target.js +44 -0
  197. package/dist/server/request-target.js.map +1 -0
  198. package/dist/server/respond.d.ts +1 -1
  199. package/dist/server/respond.d.ts.map +1 -1
  200. package/dist/server/respond.js +16 -4
  201. package/dist/server/respond.js.map +1 -1
  202. package/dist/server/response-contract-lane.d.ts +19 -1
  203. package/dist/server/response-contract-lane.d.ts.map +1 -1
  204. package/dist/server/response-contract-lane.js +59 -14
  205. package/dist/server/response-contract-lane.js.map +1 -1
  206. package/dist/server/response-observer-runtime.d.ts +9 -5
  207. package/dist/server/response-observer-runtime.d.ts.map +1 -1
  208. package/dist/server/response-observer-runtime.js +10 -6
  209. package/dist/server/response-observer-runtime.js.map +1 -1
  210. package/dist/server/runtime-core.d.ts +2 -0
  211. package/dist/server/runtime-core.d.ts.map +1 -1
  212. package/dist/server/runtime-core.js.map +1 -1
  213. package/dist/server/server-types.d.ts +55 -3
  214. package/dist/server/server-types.d.ts.map +1 -1
  215. package/dist/server/server.d.ts +194 -19
  216. package/dist/server/server.d.ts.map +1 -1
  217. package/dist/server/server.js +1342 -274
  218. package/dist/server/server.js.map +1 -1
  219. package/dist/server/sse.d.ts.map +1 -1
  220. package/dist/server/sse.js +10 -7
  221. package/dist/server/sse.js.map +1 -1
  222. package/dist/server/static-headers.d.ts +3 -0
  223. package/dist/server/static-headers.d.ts.map +1 -1
  224. package/dist/server/static-headers.js +19 -1
  225. package/dist/server/static-headers.js.map +1 -1
  226. package/dist/server/transport-lane.d.ts +8 -0
  227. package/dist/server/transport-lane.d.ts.map +1 -1
  228. package/dist/server/transport-lane.js +9 -8
  229. package/dist/server/transport-lane.js.map +1 -1
  230. package/dist/server/validation.d.ts.map +1 -1
  231. package/dist/server/validation.js +5 -1
  232. package/dist/server/validation.js.map +1 -1
  233. package/dist/server/websocket.d.ts +10 -3
  234. package/dist/server/websocket.d.ts.map +1 -1
  235. package/dist/server/websocket.js +7 -4
  236. package/dist/server/websocket.js.map +1 -1
  237. package/dist/server/ws-bun.d.ts +2 -0
  238. package/dist/server/ws-bun.d.ts.map +1 -1
  239. package/dist/server/ws-bun.js +6 -3
  240. package/dist/server/ws-bun.js.map +1 -1
  241. package/dist/server/ws-hook.d.ts +2 -1
  242. package/dist/server/ws-hook.d.ts.map +1 -1
  243. package/dist/server.d.ts +8 -5
  244. package/dist/server.d.ts.map +1 -1
  245. package/dist/server.js +5 -2
  246. package/dist/server.js.map +1 -1
  247. package/dist/single-copy-register.js +5 -0
  248. package/dist/single-copy-register.js.map +1 -1
  249. package/dist/single-copy.d.ts +46 -3
  250. package/dist/single-copy.d.ts.map +1 -1
  251. package/dist/single-copy.js +125 -12
  252. package/dist/single-copy.js.map +1 -1
  253. package/dist/tool-contract.d.ts +23 -0
  254. package/dist/tool-contract.d.ts.map +1 -1
  255. package/dist/tool-contract.js +37 -3
  256. package/dist/tool-contract.js.map +1 -1
  257. package/dist/transport-codec.d.ts.map +1 -1
  258. package/dist/transport-codec.js +2 -1
  259. package/dist/transport-codec.js.map +1 -1
  260. package/package.json +27 -2
  261. package/src/assurance.ts +52 -2
  262. package/src/capabilities.ts +81 -22
  263. package/src/diff.ts +54 -7
  264. package/src/durable-adapters.ts +20 -3
  265. package/src/durable-effect.ts +10 -3
  266. package/src/edge-kit.ts +7 -0
  267. package/src/effect-lifecycle.ts +5 -1
  268. package/src/effect-scope.ts +2 -1
  269. package/src/errors.ts +3 -0
  270. package/src/evidence.ts +302 -12
  271. package/src/idempotency.ts +80 -9
  272. package/src/index.ts +41 -3
  273. package/src/internal/code-unit-order.ts +8 -0
  274. package/src/internal/durable-saga-protocol.ts +2 -0
  275. package/src/internal/route-catalog.ts +19 -18
  276. package/src/internal/route-compiler.ts +62 -13
  277. package/src/internal/route-execution.ts +13 -3
  278. package/src/internal/route-lanes.ts +37 -28
  279. package/src/internal/route-program.ts +434 -20
  280. package/src/ledger.ts +11 -5
  281. package/src/manifest.ts +52 -46
  282. package/src/mount.ts +62 -0
  283. package/src/reflection.ts +84 -1
  284. package/src/response-observer.ts +1 -0
  285. package/src/router/overlap.ts +258 -0
  286. package/src/router/pattern.ts +349 -25
  287. package/src/router/router.ts +76 -51
  288. package/src/server/auth.ts +75 -0
  289. package/src/server/bare-error-lane.ts +12 -11
  290. package/src/server/body-lane.ts +46 -6
  291. package/src/server/body-parser.ts +241 -0
  292. package/src/server/body.ts +82 -9
  293. package/src/server/client-ip.ts +9 -0
  294. package/src/server/context.ts +219 -12
  295. package/src/server/contract.ts +54 -9
  296. package/src/server/cookies.ts +34 -2
  297. package/src/server/core-copies.ts +21 -0
  298. package/src/server/edge.ts +2 -0
  299. package/src/server/http.ts +34 -0
  300. package/src/server/idempotency-lane.ts +147 -72
  301. package/src/server/install.ts +6 -0
  302. package/src/server/methods.ts +143 -0
  303. package/src/server/multipart.ts +424 -0
  304. package/src/server/node-outcome-hook.ts +40 -7
  305. package/src/server/not-found-answer.ts +109 -0
  306. package/src/server/not-found.ts +121 -0
  307. package/src/server/plugin.ts +45 -1
  308. package/src/server/proto-guard.ts +128 -9
  309. package/src/server/query.ts +49 -0
  310. package/src/server/registry.ts +17 -2
  311. package/src/server/request-context.ts +44 -16
  312. package/src/server/request-lineage.ts +15 -0
  313. package/src/server/request-target.ts +46 -0
  314. package/src/server/respond.ts +14 -3
  315. package/src/server/response-contract-lane.ts +97 -16
  316. package/src/server/response-observer-runtime.ts +37 -8
  317. package/src/server/runtime-core.ts +2 -0
  318. package/src/server/server-types.ts +61 -2
  319. package/src/server/server.ts +1798 -355
  320. package/src/server/sse.ts +10 -8
  321. package/src/server/static-headers.ts +22 -1
  322. package/src/server/transport-lane.ts +17 -9
  323. package/src/server/validation.ts +7 -1
  324. package/src/server/websocket.ts +23 -9
  325. package/src/server/ws-bun.ts +8 -3
  326. package/src/server/ws-hook.ts +2 -1
  327. package/src/server.ts +39 -2
  328. package/src/single-copy-register.ts +5 -0
  329. package/src/single-copy.ts +160 -12
  330. package/src/tool-contract.ts +66 -3
  331. package/src/transport-codec.ts +2 -1
@@ -1 +1 @@
1
- {"version":3,"file":"node-outcome-hook.d.ts","sourceRoot":"","sources":["../../src/server/node-outcome-hook.ts"],"names":[],"mappings":"AAAA,qGAAqG;AAErG,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAA;AAE5C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AACzD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AACvD,OAAO,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAEvD;;;;;;;GAOG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAA;CACjD;AAED;;;;;;GAMG;AACH,MAAM,WAAW,mBAAmB;IAClC,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAA;IAChC,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAA;IAC1B,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACtC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACzC,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;CAC3B;AAED;;;;;;;;GAQG;AACH,MAAM,MAAM,mBAAmB,GAAG,CAChC,OAAO,EAAE,mBAAmB,EAC5B,GAAG,EAAE,kBAAkB,EACvB,MAAM,EAAE,MAAM,KACX,YAAY,CAAC,IAAI,CAAC,CAAA;AAEvB,0GAA0G;AAC1G,MAAM,MAAM,eAAe,GAAG,CAC5B,OAAO,EAAE,kBAAkB,EAC3B,QAAQ,CAAC,EAAE,QAAQ,KAChB,YAAY,CAAC,QAAQ,GAAG,SAAS,CAAC,CAAA;AAEvC;;;;;GAKG;AACH,MAAM,WAAW,mBAAmB;IAClC,mGAAmG;IACnG,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAAC,GAAG,SAAS,CAAA;IAC/D,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAA;IAC/C,qGAAqG;IACrG,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAAA;CACjC;AAED,oGAAoG;AACpG,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAAA;IAC1C,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CACzB;AAED;;;;;;;GAOG;AACH,MAAM,MAAM,gBAAgB,GAAG,CAC7B,IAAI,EAAE,MAAM,GAAG,UAAU,EACzB,OAAO,EAAE,mBAAmB,EAC5B,GAAG,EAAE,kBAAkB,EACvB,MAAM,EAAE,MAAM,KACX,YAAY,CAAC,MAAM,GAAG,UAAU,GAAG,uBAAuB,GAAG,SAAS,CAAC,CAAA;AAE5E,yGAAyG;AACzG,MAAM,MAAM,gBAAgB,GAAG,CAC7B,QAAQ,EAAE,mBAAmB,EAC7B,GAAG,EAAE,kBAAkB,KACpB,YAAY,CAAC,IAAI,CAAC,CAAA;AAwMvB,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,mBAAmB,GAAG,mBAAmB,CAQlF;AAED,MAAM,WAAW,kBAAkB;IACjC,SAAS,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,gBAAgB,CAAA;IACzD,qGAAqG;IACrG,UAAU,CAAC,OAAO,EAAE,gBAAgB,GAAG,QAAQ,CAAA;IAC/C,YAAY,CAAC,QAAQ,EAAE,QAAQ,GAAG,cAAc,GAAG,gBAAgB,CAAA;IACnE,OAAO,IAAI,gBAAgB,CAAA;IAC3B;;mFAE+E;IAC/E,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAA;CAClC"}
1
+ {"version":3,"file":"node-outcome-hook.d.ts","sourceRoot":"","sources":["../../src/server/node-outcome-hook.ts"],"names":[],"mappings":"AAAA,qGAAqG;AAErG,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAA;AAE5C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AACzD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AACvD,OAAO,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAEvD;;;;;;;GAOG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAA;CACjD;AAED;;;;;;GAMG;AACH,MAAM,WAAW,mBAAmB;IAClC,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAA;IAChC,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAA;IAC1B,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACtC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACzC,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;CAC3B;AAED;;;;;;;;GAQG;AACH,MAAM,MAAM,mBAAmB,GAAG,CAChC,OAAO,EAAE,mBAAmB,EAC5B,GAAG,EAAE,kBAAkB,EACvB,MAAM,EAAE,MAAM,KACX,YAAY,CAAC,IAAI,CAAC,CAAA;AAEvB,0GAA0G;AAC1G,MAAM,MAAM,eAAe,GAAG,CAC5B,OAAO,EAAE,kBAAkB,EAC3B,QAAQ,CAAC,EAAE,QAAQ,KAChB,YAAY,CAAC,QAAQ,GAAG,SAAS,CAAC,CAAA;AAEvC;;;;;GAKG;AACH,MAAM,WAAW,mBAAmB;IAClC,mGAAmG;IACnG,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAAC,GAAG,SAAS,CAAA;IAC/D,8FAA8F;IAC9F,QAAQ,CAAC,mBAAmB,CAAC,EAAE,OAAO,CAAA;IACtC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAA;IAC/C,qGAAqG;IACrG,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAAA;CACjC;AAED,oGAAoG;AACpG,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAAA;IAC1C,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CACzB;AAED;;;;;;;GAOG;AACH,MAAM,MAAM,gBAAgB,GAAG,CAC7B,IAAI,EAAE,MAAM,GAAG,UAAU,EACzB,OAAO,EAAE,mBAAmB,EAC5B,GAAG,EAAE,kBAAkB,EACvB,MAAM,EAAE,MAAM,KACX,YAAY,CAAC,MAAM,GAAG,UAAU,GAAG,uBAAuB,GAAG,SAAS,CAAC,CAAA;AAE5E;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,MAAM,oBAAoB,GAAG,CACjC,IAAI,EAAE,MAAM,GAAG,UAAU,EACzB,QAAQ,EAAE,mBAAmB,EAC7B,GAAG,EAAE,kBAAkB,EACvB,MAAM,EAAE,MAAM,KACX,YAAY,CAAC,MAAM,GAAG,UAAU,GAAG,uBAAuB,GAAG,SAAS,CAAC,CAAA;AAE5E,yGAAyG;AACzG,MAAM,MAAM,gBAAgB,GAAG,CAC7B,QAAQ,EAAE,mBAAmB,EAC7B,GAAG,EAAE,kBAAkB,KACpB,YAAY,CAAC,IAAI,CAAC,CAAA;AA+MvB,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,mBAAmB,GAAG,mBAAmB,CAQlF;AAED,MAAM,WAAW,kBAAkB;IACjC,SAAS,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,gBAAgB,CAAA;IACzD,qGAAqG;IACrG,UAAU,CAAC,OAAO,EAAE,gBAAgB,GAAG,QAAQ,CAAA;IAC/C,YAAY,CAAC,QAAQ,EAAE,QAAQ,GAAG,cAAc,GAAG,gBAAgB,CAAA;IACnE,OAAO,IAAI,gBAAgB,CAAA;IAC3B;;mFAE+E;IAC/E,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAA;CAClC"}
@@ -61,13 +61,18 @@ class RecordHeadersView {
61
61
  * a raw record write from a custom native twin uses lowercase names (the wire form the record
62
62
  * documents), so it stays visible without a scan. */
63
63
  #actual(lower) {
64
+ return this.#key(lower) ?? lower;
65
+ }
66
+ /** As {@link #actual}, but `undefined` when the record holds no such header: only an own property
67
+ * is a header, so an inherited `constructor` or `toString` never reads as one. */
68
+ #key(lower) {
64
69
  const record = this.#target.headers;
65
- if (record !== undefined && Object.hasOwn(record, lower))
70
+ if (record === undefined)
71
+ return undefined;
72
+ if (Object.hasOwn(record, lower))
66
73
  return lower;
67
74
  const known = this.#alias?.get(lower);
68
- if (known !== undefined && record !== undefined && Object.hasOwn(record, known))
69
- return known;
70
- return lower;
75
+ return known !== undefined && Object.hasOwn(record, known) ? known : undefined;
71
76
  }
72
77
  /** The backing record if the outcome has one, prepared on first touch; `undefined` otherwise. */
73
78
  #readable() {
@@ -115,14 +120,18 @@ class RecordHeadersView {
115
120
  const headers = this.#readable();
116
121
  if (headers === undefined)
117
122
  return null;
118
- const value = headers[this.#actual(RecordHeadersView.#lower(name))];
123
+ const key = this.#key(RecordHeadersView.#lower(name));
124
+ const value = key === undefined ? undefined : headers[key];
119
125
  if (value === undefined)
120
126
  return null;
121
127
  return typeof value === "string" ? value : (value.join(", ") ?? null);
122
128
  }
123
129
  has(name) {
124
130
  const headers = this.#readable();
125
- return (headers !== undefined && headers[this.#actual(RecordHeadersView.#lower(name))] !== undefined);
131
+ if (headers === undefined)
132
+ return false;
133
+ const key = this.#key(RecordHeadersView.#lower(name));
134
+ return key !== undefined && headers[key] !== undefined;
126
135
  }
127
136
  set(name, value) {
128
137
  const headers = this.#writable();
@@ -1 +1 @@
1
- {"version":3,"file":"node-outcome-hook.js","sourceRoot":"","sources":["../../src/server/node-outcome-hook.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"node-outcome-hook.js","sourceRoot":"","sources":["../../src/server/node-outcome-hook.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ /** The not-found rules (see `./not-found.ts`), shared by `notFound()` and the edge server. */
2
+ import type { Platform } from "./context.js";
3
+ import { type ResponseResult } from "./runtime-core.js";
4
+ import type { MaybePromise, RequestSource } from "./server.js";
5
+ /** What a {@link NotFoundHandler} is given: the request line and headers of a request no route matched. */
6
+ export interface NotFoundInput<Env = unknown> {
7
+ /** The request method, exactly as received. Always a token a route could be registered under. */
8
+ readonly method: string;
9
+ /** The request URL, exactly as received. */
10
+ readonly url: string;
11
+ /** The path the router looked up, exactly as received: NOT percent-decoded, so `/a%2Fb` stays
12
+ * `/a%2Fb`. Escape it before writing it into a body. */
13
+ readonly pathname: string;
14
+ /** The request headers. */
15
+ readonly headers: Headers;
16
+ /** Read one request header (case-insensitive), or `null` when it is absent. */
17
+ header(name: string): string | null;
18
+ /** Aborts when the server's `requestTimeoutMs` elapses before the handler settles. Never aborts
19
+ * when no timeout is configured. */
20
+ readonly signal: AbortSignal;
21
+ /** The platform inputs (`env`, `waitUntil`, the caller address) the serving adapter supplied. */
22
+ readonly platform: Platform<Env> | undefined;
23
+ }
24
+ /**
25
+ * Answers a request no route matched. Return a `Response`, or `undefined` for the default `404`.
26
+ * May be async; a thrown `Response` is treated like a returned one.
27
+ */
28
+ export type NotFoundHandler<Env = unknown> = (input: NotFoundInput<Env>) => MaybePromise<Response | undefined>;
29
+ /** @internal The read-only view a {@link NotFoundHandler} receives. `url` and `headers` stay getters
30
+ * so a source that builds them on demand is not forced to for a handler that never reads them. */
31
+ export declare function notFoundInput<Env>(source: RequestSource, pathname: string, platform: Platform<Env> | undefined, signal?: AbortSignal): NotFoundInput<Env>;
32
+ /**
33
+ * @internal Run a {@link NotFoundHandler} and turn what it produced into the answer. One function
34
+ * for every server that has a `404` site, so the rules above hold identically on each of them.
35
+ * `wrap` lifts a response into the caller's output type; `failed` renders the fault answer.
36
+ */
37
+ export declare function answerNotFound<T, Env>(handler: NotFoundHandler<Env>, input: NotFoundInput<Env>, wrap: (response: Response | ResponseResult) => T, failed: (error: unknown) => T): MaybePromise<T>;
38
+ /** @internal What the kernel calls at its `404` site once a handler is installed. */
39
+ export type NotFoundLane = <T>(host: unknown, source: RequestSource, pathname: string, platform: Platform<unknown> | undefined, wrap: (response: Response | ResponseResult) => T, onTimeout: () => T) => MaybePromise<T>;
40
+ //# sourceMappingURL=not-found-answer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"not-found-answer.d.ts","sourceRoot":"","sources":["../../src/server/not-found-answer.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAC9F,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAA;AAE5C,OAAO,EAAiC,KAAK,cAAc,EAAE,MAAM,mBAAmB,CAAA;AACtF,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAE9D,2GAA2G;AAC3G,MAAM,WAAW,aAAa,CAAC,GAAG,GAAG,OAAO;IAC1C,iGAAiG;IACjG,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,4CAA4C;IAC5C,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB;4DACwD;IACxD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,2BAA2B;IAC3B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;IACzB,+EAA+E;IAC/E,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAA;IACnC;wCACoC;IACpC,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAA;IAC5B,iGAAiG;IACjG,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,GAAG,SAAS,CAAA;CAC7C;AAED;;;GAGG;AACH,MAAM,MAAM,eAAe,CAAC,GAAG,GAAG,OAAO,IAAI,CAC3C,KAAK,EAAE,aAAa,CAAC,GAAG,CAAC,KACtB,YAAY,CAAC,QAAQ,GAAG,SAAS,CAAC,CAAA;AAEvC;kGACkG;AAClG,wBAAgB,aAAa,CAAC,GAAG,EAC/B,MAAM,EAAE,aAAa,EACrB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,GAAG,SAAS,EACnC,MAAM,GAAE,WAAmC,GAC1C,aAAa,CAAC,GAAG,CAAC,CAcpB;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,GAAG,EACnC,OAAO,EAAE,eAAe,CAAC,GAAG,CAAC,EAC7B,KAAK,EAAE,aAAa,CAAC,GAAG,CAAC,EACzB,IAAI,EAAE,CAAC,QAAQ,EAAE,QAAQ,GAAG,cAAc,KAAK,CAAC,EAChD,MAAM,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,CAAC,GAC5B,YAAY,CAAC,CAAC,CAAC,CA+BjB;AAED,qFAAqF;AACrF,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,EAC3B,IAAI,EAAE,OAAO,EACb,MAAM,EAAE,aAAa,EACrB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,SAAS,EACvC,IAAI,EAAE,CAAC,QAAQ,EAAE,QAAQ,GAAG,cAAc,KAAK,CAAC,EAChD,SAAS,EAAE,MAAM,CAAC,KACf,YAAY,CAAC,CAAC,CAAC,CAAA"}
@@ -0,0 +1,56 @@
1
+ import { isRoutableMethod, plainError } from "./http.js";
2
+ import { getNeverAbortSignal, headerOf } from "./runtime-core.js";
3
+ /** @internal The read-only view a {@link NotFoundHandler} receives. `url` and `headers` stay getters
4
+ * so a source that builds them on demand is not forced to for a handler that never reads them. */
5
+ export function notFoundInput(source, pathname, platform, signal = getNeverAbortSignal()) {
6
+ return {
7
+ method: source.method,
8
+ pathname,
9
+ signal,
10
+ platform,
11
+ get url() {
12
+ return source.url;
13
+ },
14
+ get headers() {
15
+ return source.headers;
16
+ },
17
+ header: (name) => headerOf(source, name),
18
+ };
19
+ }
20
+ /**
21
+ * @internal Run a {@link NotFoundHandler} and turn what it produced into the answer. One function
22
+ * for every server that has a `404` site, so the rules above hold identically on each of them.
23
+ * `wrap` lifts a response into the caller's output type; `failed` renders the fault answer.
24
+ */
25
+ export function answerNotFound(handler, input, wrap, failed) {
26
+ if (!isRoutableMethod(input.method))
27
+ return wrap(plainError(404, "not_found"));
28
+ const settle = (value, thrown) => {
29
+ if (value instanceof Response) {
30
+ // A status below 200 is `Response.error()`: a network-error marker, not an answer.
31
+ if (value.bodyUsed || value.status < 200) {
32
+ return failed(new TypeError("notFound handler answered with an unusable Response"));
33
+ }
34
+ // A miss is never a success. The body and headers are the handler's; the status is not.
35
+ return wrap(value.status < 300
36
+ ? new Response(value.body, { status: 404, headers: value.headers })
37
+ : value);
38
+ }
39
+ if (thrown)
40
+ return failed(value);
41
+ if (value === undefined)
42
+ return wrap(plainError(404, "not_found"));
43
+ return failed(new TypeError("notFound handler must return a Response or undefined"));
44
+ };
45
+ let result;
46
+ try {
47
+ result = handler(input);
48
+ }
49
+ catch (error) {
50
+ return settle(error, true);
51
+ }
52
+ return result instanceof Promise
53
+ ? result.then((value) => settle(value, false), (error) => settle(error, true))
54
+ : settle(result, false);
55
+ }
56
+ //# sourceMappingURL=not-found-answer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"not-found-answer.js","sourceRoot":"","sources":["../../src/server/not-found-answer.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AACxD,OAAO,EAAE,mBAAmB,EAAE,QAAQ,EAAuB,MAAM,mBAAmB,CAAA;AA+BtF;kGACkG;AAClG,MAAM,UAAU,aAAa,CAC3B,MAAqB,EACrB,QAAgB,EAChB,QAAmC,EACnC,SAAsB,mBAAmB,EAAE;IAE3C,OAAO;QACL,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,QAAQ;QACR,MAAM;QACN,QAAQ;QACR,IAAI,GAAG;YACL,OAAO,MAAM,CAAC,GAAG,CAAA;QACnB,CAAC;QACD,IAAI,OAAO;YACT,OAAO,MAAM,CAAC,OAAO,CAAA;QACvB,CAAC;QACD,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC;KACzC,CAAA;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAC5B,OAA6B,EAC7B,KAAyB,EACzB,IAAgD,EAChD,MAA6B;IAE7B,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,MAAM,CAAC;QAAE,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC,CAAA;IAC9E,MAAM,MAAM,GAAG,CAAC,KAAc,EAAE,MAAe,EAAK,EAAE;QACpD,IAAI,KAAK,YAAY,QAAQ,EAAE,CAAC;YAC9B,mFAAmF;YACnF,IAAI,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;gBACzC,OAAO,MAAM,CAAC,IAAI,SAAS,CAAC,qDAAqD,CAAC,CAAC,CAAA;YACrF,CAAC;YACD,wFAAwF;YACxF,OAAO,IAAI,CACT,KAAK,CAAC,MAAM,GAAG,GAAG;gBAChB,CAAC,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;gBACnE,CAAC,CAAC,KAAK,CACV,CAAA;QACH,CAAC;QACD,IAAI,MAAM;YAAE,OAAO,MAAM,CAAC,KAAK,CAAC,CAAA;QAChC,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC,CAAA;QAClE,OAAO,MAAM,CAAC,IAAI,SAAS,CAAC,sDAAsD,CAAC,CAAC,CAAA;IACtF,CAAC,CAAA;IACD,IAAI,MAA0C,CAAA;IAC9C,IAAI,CAAC;QACH,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAA;IACzB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;IAC5B,CAAC;IACD,OAAO,MAAM,YAAY,OAAO;QAC9B,CAAC,CAAC,MAAM,CAAC,IAAI,CACT,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,EAC/B,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,CAC/B;QACH,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;AAC3B,CAAC"}
@@ -0,0 +1,23 @@
1
+ import { type NotFoundHandler } from "./not-found-answer.js";
2
+ import type { IdentityPlugin } from "./plugin.js";
3
+ export type { NotFoundHandler, NotFoundInput } from "./not-found-answer.js";
4
+ /**
5
+ * Answer requests no route matched with a handler of your own: `app.use(notFound(handler))`.
6
+ *
7
+ * ```ts
8
+ * import { notFound } from "@nifrajs/core/not-found"
9
+ *
10
+ * const app = server().use(
11
+ * notFound(({ pathname }) => Response.json({ ok: false, error: "no_such_route", pathname })),
12
+ * )
13
+ * ```
14
+ *
15
+ * The answer is a `404` whatever `2xx` status the handler gives it; see the module notes for the
16
+ * full rules. The server's `requestTimeoutMs` bounds an async handler and aborts `input.signal`.
17
+ *
18
+ * A server takes one handler, and it belongs to the server that listens: applying `notFound()` a
19
+ * second time throws, and so does applying it inside a `group()` (a miss has no prefix to scope it
20
+ * to). A server composed into another with `merge()` does not carry its handler along.
21
+ */
22
+ export declare function notFound<Env = unknown>(handler: NotFoundHandler<Env>): IdentityPlugin;
23
+ //# sourceMappingURL=not-found.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"not-found.d.ts","sourceRoot":"","sources":["../../src/server/not-found.ts"],"names":[],"mappings":"AAaA,OAAO,EAEL,KAAK,eAAe,EAGrB,MAAM,uBAAuB,CAAA;AAC9B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAIjD,YAAY,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAgB3E;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,QAAQ,CAAC,GAAG,GAAG,OAAO,EAAE,OAAO,EAAE,eAAe,CAAC,GAAG,CAAC,GAAG,cAAc,CA+DrF"}
@@ -0,0 +1,81 @@
1
+ /**
2
+ * The `notFound()` handler's rules:
3
+ * - Only for a `404`: a wrong method stays a `405`, a malformed path a `400`, a mount's `404` its own.
4
+ * - It sees the request line and headers, never the body: an unrouted request has no body limit.
5
+ * - A method token no route could take gets the default `404`, as it skips `onRequest` hooks.
6
+ * - A `2xx` is sent as a `404`; a `3xx`, `410` or other error status is sent as built.
7
+ * - Fails closed: a throw or an unsendable value is logged and answered with the plain `500`.
8
+ */
9
+ import { emitRequestErrorLog } from "./bare-error-lane.js";
10
+ import { plainError } from "./http.js";
11
+ import { INSTALL_NOT_FOUND } from "./install.js";
12
+ import { answerNotFound, notFoundInput, } from "./not-found-answer.js";
13
+ /**
14
+ * Answer requests no route matched with a handler of your own: `app.use(notFound(handler))`.
15
+ *
16
+ * ```ts
17
+ * import { notFound } from "@nifrajs/core/not-found"
18
+ *
19
+ * const app = server().use(
20
+ * notFound(({ pathname }) => Response.json({ ok: false, error: "no_such_route", pathname })),
21
+ * )
22
+ * ```
23
+ *
24
+ * The answer is a `404` whatever `2xx` status the handler gives it; see the module notes for the
25
+ * full rules. The server's `requestTimeoutMs` bounds an async handler and aborts `input.signal`.
26
+ *
27
+ * A server takes one handler, and it belongs to the server that listens: applying `notFound()` a
28
+ * second time throws, and so does applying it inside a `group()` (a miss has no prefix to scope it
29
+ * to). A server composed into another with `merge()` does not carry its handler along.
30
+ */
31
+ export function notFound(handler) {
32
+ if (typeof handler !== "function")
33
+ throw new TypeError("notFound() needs a handler function");
34
+ const lane = (host, source, pathname, platform, wrap, onTimeout) => {
35
+ const { requestTimeoutMs, logger, errorLogDetail } = host;
36
+ const env = platform;
37
+ const failed = (error) => {
38
+ // A logger that throws must not decide the answer: the fault is still the plain `500`.
39
+ try {
40
+ emitRequestErrorLog(logger, errorLogDetail, error, { req: source });
41
+ }
42
+ catch { }
43
+ return wrap(plainError(500, "internal_error"));
44
+ };
45
+ if (requestTimeoutMs === 0) {
46
+ return answerNotFound(handler, notFoundInput(source, pathname, env), wrap, failed);
47
+ }
48
+ const controller = new AbortController();
49
+ const answer = answerNotFound(handler, notFoundInput(source, pathname, env, controller.signal), wrap, failed);
50
+ if (!(answer instanceof Promise))
51
+ return answer;
52
+ // The same bound a matched route gets: abort the signal, answer the timeout, discard the late
53
+ // result. Both arms are attached, so a handler that settles after the deadline is still observed.
54
+ return new Promise((resolve, reject) => {
55
+ const timer = setTimeout(() => {
56
+ controller.abort();
57
+ resolve(onTimeout());
58
+ }, requestTimeoutMs);
59
+ answer.then((value) => {
60
+ clearTimeout(timer);
61
+ resolve(value);
62
+ }, (error) => {
63
+ clearTimeout(timer);
64
+ reject(error);
65
+ });
66
+ });
67
+ };
68
+ const apply = (app) => {
69
+ const host = app;
70
+ if (host.notFoundLane !== undefined) {
71
+ throw new TypeError("notFound() is already applied to this server");
72
+ }
73
+ if (host.routePrefix !== "") {
74
+ throw new TypeError("notFound() inside a group answers nothing - apply it to the parent server");
75
+ }
76
+ host[INSTALL_NOT_FOUND](lane);
77
+ return app;
78
+ };
79
+ return apply;
80
+ }
81
+ //# sourceMappingURL=not-found.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"not-found.js","sourceRoot":"","sources":["../../src/server/not-found.ts"],"names":[],"mappings":"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"}
@@ -3,7 +3,9 @@
3
3
  * `use`/`derive`/`decorate` and/or registering routes) and returns it; these helpers attach a name
4
4
  * for idempotent dedupe and pin the type-threading so `.use()` preserves the caller's typed server.
5
5
  */
6
- import type { Registry } from "./registry.js";
6
+ import type { Method } from "../router/router.js";
7
+ import type { RouteSchema } from "./context.js";
8
+ import type { AddRoute, Registry, RouteInfoFor } from "./registry.js";
7
9
  import type { AnyServer, Server } from "./server.js";
8
10
  /**
9
11
  * A nifra **plugin**: a function that augments an app - calling `use`/`derive`/`decorate` and/or
@@ -50,6 +52,29 @@ export type ContextPlugin<D extends object> = (<R extends Registry, Ctx>(app: Se
50
52
  * ```
51
53
  */
52
54
  export declare function defineContextPlugin<D extends object>(name: string, apply: <R extends Registry, Ctx>(app: Server<R, Ctx>) => Server<R, Ctx & D>): ContextPlugin<D>;
55
+ declare const METHOD_ROUTES: unique symbol;
56
+ /**
57
+ * What `all()` and `method()` from `@nifrajs/core/methods` return: a plugin for `app.use()` that
58
+ * registers one handler under the methods `M` of `Path`. It is opaque - apply it with `use`, which
59
+ * reads the route's types from it and adds them to the app's registry.
60
+ */
61
+ export interface MethodRoutesPlugin<M extends string, Path extends string, S extends RouteSchema, Output, Ctx> {
62
+ readonly [METHOD_ROUTES]: {
63
+ readonly methods: M;
64
+ readonly path: Path;
65
+ readonly schema: S;
66
+ readonly output: Output;
67
+ /** The context the handler was written against; the app must provide at least this. */
68
+ readonly context: (context: Ctx) => void;
69
+ };
70
+ }
71
+ /** The standard methods among `M`, as the registry keys them. A custom token contributes none. */
72
+ type StandardMethodOf<M extends string> = Extract<Uppercase<M>, Method>;
73
+ /**
74
+ * The registry after a {@link MethodRoutesPlugin} is applied: `Path` gains the standard methods
75
+ * among `M`. A method outside the standard set is served but not typed, so it adds nothing.
76
+ */
77
+ export type WithMethodRoutes<R extends Registry, M extends string, Path extends string, S extends RouteSchema, Output, HookOutput> = [StandardMethodOf<M>] extends [never] ? R : AddRoute<R, StandardMethodOf<M>, Path, RouteInfoFor<Path, S, Output, HookOutput>>;
53
78
  declare const COLLAPSED: unique symbol;
54
79
  /**
55
80
  * What {@link definePlugin} returns when its `apply` argument never pinned the input server type -
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../src/server/plugin.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../src/server/plugin.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/server/plugin.ts"],"names":[],"mappings":"AAyCA;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,mBAAmB,CACjC,IAAY,EACZ,KAA2E;IAE3E,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,CAAqB,CAAA;AACvE,CAAC;AA8DD,MAAM,UAAU,YAAY,CAC1B,IAAY,EACZ,KAAoC;IAEpC,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAA;AACnD,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,oBAAoB,CAClC,IAAY;AACZ,iGAAiG;AACjG,2FAA2F;AAC3F,mGAAmG;AACnG,8FAA8F;AAC9F,KAAqD;IAErD,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,CAAoC,CAAA;AACtF,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAgC,oBAAoB,CAAA"}
1
+ {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/server/plugin.ts"],"names":[],"mappings":"AA2CA;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,mBAAmB,CACjC,IAAY,EACZ,KAA2E;IAE3E,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,CAAqB,CAAA;AACvE,CAAC;AAwGD,MAAM,UAAU,YAAY,CAC1B,IAAY,EACZ,KAAoC;IAEpC,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAA;AACnD,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,oBAAoB,CAClC,IAAY;AACZ,iGAAiG;AACjG,2FAA2F;AAC3F,mGAAmG;AACnG,8FAA8F;AAC9F,KAAqD;IAErD,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,CAAoC,CAAA;AACtF,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAgC,oBAAoB,CAAA"}
@@ -20,11 +20,24 @@ export type ProtoPoisoning = "reject" | "strip" | "ignore";
20
20
  */
21
21
  export declare function parseJsonGuarded(text: string, policy: ProtoPoisoning): unknown;
22
22
  /**
23
- * The policy applied to an already-parsed value - the native-`json()` lane, which never holds the
24
- * raw text, and the transport codecs, which parse with their own decoder. Escapes are resolved by
25
- * the time a key is an own property, so a `\u`-spelled `__proto__` and a literal one look identical
26
- * here. Cost is one iterative pass over the value's object nodes; `"ignore"` skips even that.
27
- * Throws the reject singleton; callers map it to their lane's flat error.
23
+ * The policy applied to an already-parsed JSON value - the native-`json()` lane, which never holds
24
+ * the raw text. Escapes are resolved by the time a key is an own property, so a `\u`-spelled
25
+ * `__proto__` and a literal one look identical here. Cost is one iterative pass over the value's
26
+ * object nodes; `"ignore"` skips even that. The walk assumes a tree, which JSON always is; a
27
+ * transport codec's output goes through {@link guardDecodedValue}. Throws the reject singleton;
28
+ * callers map it to their lane's flat error.
28
29
  */
29
30
  export declare function guardParsedValue(value: unknown, policy: ProtoPoisoning): unknown;
31
+ /**
32
+ * The policy for a value a transport codec decoded. Unlike `JSON.parse` output that can be a graph -
33
+ * a codec that keeps references, as the rich wire codec does, returns shared nodes and cycles - while
34
+ * everything downstream (validators, handlers, serializers) walks a body as a tree. So a cycle is
35
+ * refused, and shared nodes may add at most {@link MAX_SHARED_EXPANSION} nodes to the tree they expand
36
+ * to: forty levels of doubled references fit in 2KB and expand to 2^40 paths. Map and Set members are
37
+ * walked like properties. These shape rules hold under every policy, `"ignore"` included.
38
+ *
39
+ * A `RegExp` is refused unless `patterns` allows it: a pattern from the client is code, and one with
40
+ * catastrophic backtracking stalls the event loop the moment anything runs it.
41
+ */
42
+ export declare function guardDecodedValue(value: unknown, policy: ProtoPoisoning, patterns?: boolean): unknown;
30
43
  //# sourceMappingURL=proto-guard.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"proto-guard.d.ts","sourceRoot":"","sources":["../../src/server/proto-guard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAAA;AAK1D;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,GAAG,OAAO,CAE9E;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,cAAc,GAAG,OAAO,CAGhF"}
1
+ {"version":3,"file":"proto-guard.d.ts","sourceRoot":"","sources":["../../src/server/proto-guard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAAA;AAK1D;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,GAAG,OAAO,CAE9E;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,cAAc,GAAG,OAAO,CAGhF;AAiGD;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,OAAO,EACd,MAAM,EAAE,cAAc,EACtB,QAAQ,UAAQ,GACf,OAAO,CAuBT"}
@@ -23,11 +23,12 @@ export function parseJsonGuarded(text, policy) {
23
23
  return guardParsedValue(JSON.parse(text), policy);
24
24
  }
25
25
  /**
26
- * The policy applied to an already-parsed value - the native-`json()` lane, which never holds the
27
- * raw text, and the transport codecs, which parse with their own decoder. Escapes are resolved by
28
- * the time a key is an own property, so a `\u`-spelled `__proto__` and a literal one look identical
29
- * here. Cost is one iterative pass over the value's object nodes; `"ignore"` skips even that.
30
- * Throws the reject singleton; callers map it to their lane's flat error.
26
+ * The policy applied to an already-parsed JSON value - the native-`json()` lane, which never holds
27
+ * the raw text. Escapes are resolved by the time a key is an own property, so a `\u`-spelled
28
+ * `__proto__` and a literal one look identical here. Cost is one iterative pass over the value's
29
+ * object nodes; `"ignore"` skips even that. The walk assumes a tree, which JSON always is; a
30
+ * transport codec's output goes through {@link guardDecodedValue}. Throws the reject singleton;
31
+ * callers map it to their lane's flat error.
31
32
  */
32
33
  export function guardParsedValue(value, policy) {
33
34
  if (policy === "ignore")
@@ -77,10 +78,10 @@ function sweep(root, policy) {
77
78
  // `for-in`, not `Object.keys()`: the keys array would be an allocation per node (~2x the whole
78
79
  // walk on measured bodies, both engines, at realistic widths; V8 only prefers `Object.keys` on
79
80
  // 200+-property dictionary-mode objects). On JSON.parse output the two enumerate identically -
80
- // own enumerable string keys, nothing enumerable on the prototype chain. A custom transport
81
- // codec could hand `guardParsedValue` an object with enumerable INHERITED properties; `for-in`
82
- // sweeps those too, which only over-sweeps - a poisoned inherited subtree rejects rather than
83
- // slips through. A *non-enumerable* own `__proto__` is the one shape this misses, and it is
81
+ // own enumerable string keys, nothing enumerable on the prototype chain. Were a value with
82
+ // enumerable INHERITED properties handed in, `for-in` would sweep those too, which only
83
+ // over-sweeps - a poisoned inherited subtree rejects rather than slips through. A
84
+ // *non-enumerable* own `__proto__` is the one shape this misses, and it is
84
85
  // not the poisoning shape: `JSON.parse` never produces one, and the merges that carry the
85
86
  // payload onward (spread, `Object.assign`, key loops) copy enumerable own keys only.
86
87
  for (const key in record) {
@@ -113,4 +114,108 @@ function sweep(root, policy) {
113
114
  }
114
115
  return root;
115
116
  }
117
+ /** How many nodes shared references may add to a decoded value, counted as a tree walk visits it. */
118
+ const MAX_SHARED_EXPANSION = 100_000;
119
+ /** Thrown (reused singleton, mapped like {@link POISONED}) for a decoded value no tree walk can finish,
120
+ * or one holding a pattern the caller did not allow. */
121
+ const NOT_A_TREE = /* @__PURE__ */ new Error("decoded_value_not_a_tree");
122
+ /** Marks a node whose subtree is still being walked: meeting it again then is a cycle. */
123
+ const ON_PATH = -1;
124
+ /**
125
+ * The policy for a value a transport codec decoded. Unlike `JSON.parse` output that can be a graph -
126
+ * a codec that keeps references, as the rich wire codec does, returns shared nodes and cycles - while
127
+ * everything downstream (validators, handlers, serializers) walks a body as a tree. So a cycle is
128
+ * refused, and shared nodes may add at most {@link MAX_SHARED_EXPANSION} nodes to the tree they expand
129
+ * to: forty levels of doubled references fit in 2KB and expand to 2^40 paths. Map and Set members are
130
+ * walked like properties. These shape rules hold under every policy, `"ignore"` included.
131
+ *
132
+ * A `RegExp` is refused unless `patterns` allows it: a pattern from the client is code, and one with
133
+ * catastrophic backtracking stalls the event loop the moment anything runs it.
134
+ */
135
+ export function guardDecodedValue(value, policy, patterns = false) {
136
+ if (value === null || typeof value !== "object")
137
+ return value;
138
+ const sizes = new Map();
139
+ const frames = [openDecoded(value, policy, patterns, sizes)];
140
+ let expanded = 0;
141
+ for (let frame = frames.at(-1); frame !== undefined; frame = frames.at(-1)) {
142
+ const child = frame.children[frame.next];
143
+ if (child !== undefined) {
144
+ frame.next++;
145
+ const known = sizes.get(child);
146
+ if (known === undefined)
147
+ frames.push(openDecoded(child, policy, patterns, sizes));
148
+ else if (known === ON_PATH)
149
+ throw NOT_A_TREE;
150
+ else
151
+ frame.size += known;
152
+ continue;
153
+ }
154
+ frames.pop();
155
+ sizes.set(frame.node, frame.size);
156
+ const parent = frames.at(-1);
157
+ if (parent === undefined)
158
+ expanded = frame.size;
159
+ else
160
+ parent.size += frame.size;
161
+ }
162
+ if (expanded - sizes.size > MAX_SHARED_EXPANSION)
163
+ throw NOT_A_TREE;
164
+ return value;
165
+ }
166
+ function openDecoded(node, policy, patterns, sizes) {
167
+ if (!patterns && node instanceof RegExp)
168
+ throw NOT_A_TREE;
169
+ sizes.set(node, ON_PATH);
170
+ return { node, children: decodedChildren(node, policy), next: 0, size: 1 };
171
+ }
172
+ function decodedChildren(node, policy) {
173
+ const children = [];
174
+ const add = (value) => {
175
+ if (value !== null && typeof value === "object")
176
+ children.push(value);
177
+ };
178
+ if (Array.isArray(node)) {
179
+ for (let i = 0; i < node.length; i++)
180
+ add(node[i]);
181
+ return children;
182
+ }
183
+ if (node instanceof Map) {
184
+ for (const [key, value] of node) {
185
+ add(key);
186
+ add(value);
187
+ }
188
+ return children;
189
+ }
190
+ if (node instanceof Set) {
191
+ for (const item of node)
192
+ add(item);
193
+ return children;
194
+ }
195
+ // Binary and scalar wrappers carry no keys to poison; `for-in` over a typed array would enumerate
196
+ // every index.
197
+ if (ArrayBuffer.isView(node) ||
198
+ node instanceof ArrayBuffer ||
199
+ node instanceof Date ||
200
+ node instanceof RegExp ||
201
+ node instanceof URL) {
202
+ return children;
203
+ }
204
+ for (const key in node) {
205
+ const value = Reflect.get(node, key);
206
+ if (policy !== "ignore" &&
207
+ (key === "__proto__" ||
208
+ (key === "constructor" &&
209
+ value !== null &&
210
+ typeof value === "object" &&
211
+ Object.hasOwn(value, "prototype")))) {
212
+ if (policy === "reject")
213
+ throw POISONED;
214
+ Reflect.deleteProperty(node, key);
215
+ continue;
216
+ }
217
+ add(value);
218
+ }
219
+ return children;
220
+ }
116
221
  //# sourceMappingURL=proto-guard.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"proto-guard.js","sourceRoot":"","sources":["../../src/server/proto-guard.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"proto-guard.js","sourceRoot":"","sources":["../../src/server/proto-guard.ts"],"names":[],"mappings":"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"}
@@ -10,6 +10,13 @@ export type QueryValue = string | string[];
10
10
  /** Return a value-equal, likely-internalized copy of a parsed record key. See the note above. */
11
11
  export declare function internParseKey(key: string): string;
12
12
  export declare function queryObjectOf(search: string): Record<string, QueryValue>;
13
+ /**
14
+ * `application/json` or an `application/*+json` type, with or without parameters, compared as a media
15
+ * type rather than searched as a substring. A substring test also matches `text/plain; x=application/json`,
16
+ * whose essence is `text/plain` - a type a browser sends cross-origin with credentials and no preflight,
17
+ * so a JSON route would parse a body no CORS policy ever saw.
18
+ */
19
+ export declare function isJsonMediaType(contentType: string): boolean;
13
20
  /** `application/x-www-form-urlencoded`, with or without a charset suffix. */
14
21
  export declare function isUrlEncodedForm(contentType: string): boolean;
15
22
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../src/server/query.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AACvD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAMhD,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE5C;AAED;;;;mDAImD;AACnD,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,MAAM,EAAE,CAAA;AAgB1C,iGAAiG;AACjG,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAOlD;AAsCD,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAyBxE;AAED,6EAA6E;AAC7E,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAK7D;AAID;;;;;;;;;GASG;AACH,wBAAsB,eAAe,CACnC,GAAG,EAAE,aAAa,EAClB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,cAAc,CAAC,CActD"}
1
+ {"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../src/server/query.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AACvD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAMhD,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE5C;AAED;;;;mDAImD;AACnD,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,MAAM,EAAE,CAAA;AAgB1C,iGAAiG;AACjG,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAOlD;AAsCD,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAyBxE;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAyC5D;AAED,6EAA6E;AAC7E,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAK7D;AAID;;;;;;;;;GASG;AACH,wBAAsB,eAAe,CACnC,GAAG,EAAE,aAAa,EAClB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,cAAc,CAAC,CActD"}