@rangojs/router 0.5.1 → 0.5.2

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 (448) hide show
  1. package/README.md +5 -1
  2. package/dist/types/browser/event-controller.d.ts +6 -0
  3. package/dist/types/cache/cf/cf-cache-constants.d.ts +8 -1
  4. package/dist/types/cache/cf/cf-cache-store.d.ts +15 -1
  5. package/dist/types/cache/cf/cf-cache-types.d.ts +1 -1
  6. package/dist/types/cache/cf/cf-kv-utils.d.ts +21 -0
  7. package/dist/types/handles/is-thenable.d.ts +2 -4
  8. package/dist/types/rsc/helpers.d.ts +3 -0
  9. package/dist/types/rsc/render-pipeline.d.ts +9 -0
  10. package/dist/types/rsc/routine-plan.d.ts +124 -0
  11. package/dist/types/rsc/shell-capture-constants.d.ts +17 -0
  12. package/dist/types/server/request-context.d.ts +4 -1
  13. package/dist/types/vite/encryption-key.d.ts +2 -0
  14. package/dist/types/vite/plugins/expose-internal-ids.d.ts +10 -0
  15. package/dist/types/vite/plugins/server-ref-hashing.d.ts +24 -0
  16. package/dist/types/vite/plugins/server-reference-pattern.d.ts +1 -0
  17. package/dist/types/vite/utils/shared-utils.d.ts +12 -0
  18. package/dist/vite/index.js +154 -57
  19. package/package.json +3 -3
  20. package/skills/caching/SKILL.md +1 -1
  21. package/skills/mime-routes/SKILL.md +3 -1
  22. package/skills/response-routes/SKILL.md +4 -2
  23. package/skills/typesafety/generated-files-and-cli.md +16 -9
  24. package/skills/typesafety/route-types.md +5 -1
  25. package/skills/use-cache/SKILL.md +47 -0
  26. package/src/browser/event-controller.ts +40 -15
  27. package/src/browser/partial-update.ts +26 -11
  28. package/src/browser/react/NavigationProvider.tsx +7 -0
  29. package/src/cache/cache-runtime.ts +89 -15
  30. package/src/cache/cf/cf-cache-constants.ts +8 -1
  31. package/src/cache/cf/cf-cache-store.ts +41 -64
  32. package/src/cache/cf/cf-cache-types.ts +1 -1
  33. package/src/cache/cf/cf-kv-utils.ts +38 -0
  34. package/src/cache/segment-codec.ts +21 -5
  35. package/src/handles/is-thenable.ts +2 -4
  36. package/src/router/match-middleware/cache-lookup.ts +24 -15
  37. package/src/rsc/handler.ts +26 -5
  38. package/src/rsc/helpers.ts +13 -0
  39. package/src/rsc/progressive-enhancement.ts +247 -70
  40. package/src/rsc/render-pipeline.ts +68 -24
  41. package/src/rsc/routine-plan.ts +359 -0
  42. package/src/rsc/rsc-rendering.ts +555 -302
  43. package/src/rsc/server-action.ts +180 -71
  44. package/src/rsc/shell-capture-constants.ts +18 -0
  45. package/src/rsc/shell-capture.ts +92 -21
  46. package/src/server/request-context.ts +6 -0
  47. package/src/ssr/ssr-root.tsx +1 -0
  48. package/src/vite/encryption-key.ts +29 -0
  49. package/src/vite/plugins/expose-action-id.ts +2 -2
  50. package/src/vite/plugins/expose-internal-ids.ts +46 -0
  51. package/src/vite/plugins/server-ref-hashing.ts +74 -0
  52. package/src/vite/plugins/server-reference-pattern.ts +10 -0
  53. package/src/vite/rango.ts +9 -0
  54. package/src/vite/router-discovery.ts +21 -2
  55. package/src/vite/utils/shared-utils.ts +12 -7
  56. package/dist/types.backup/__internal.d.ts +0 -127
  57. package/dist/types.backup/bin/rango.d.ts +0 -1
  58. package/dist/types.backup/browser/action-coordinator.d.ts +0 -57
  59. package/dist/types.backup/browser/action-fence.d.ts +0 -33
  60. package/dist/types.backup/browser/app-shell.d.ts +0 -34
  61. package/dist/types.backup/browser/app-version.d.ts +0 -6
  62. package/dist/types.backup/browser/connection-warmup.d.ts +0 -31
  63. package/dist/types.backup/browser/cookie-name.d.ts +0 -66
  64. package/dist/types.backup/browser/event-controller.d.ts +0 -221
  65. package/dist/types.backup/browser/history-state.d.ts +0 -26
  66. package/dist/types.backup/browser/index.d.ts +0 -1
  67. package/dist/types.backup/browser/intercept-utils.d.ts +0 -30
  68. package/dist/types.backup/browser/invalidate-client-cache.d.ts +0 -17
  69. package/dist/types.backup/browser/link-interceptor.d.ts +0 -43
  70. package/dist/types.backup/browser/logging.d.ts +0 -33
  71. package/dist/types.backup/browser/merge-segment-loaders.d.ts +0 -38
  72. package/dist/types.backup/browser/navigation-bridge.d.ts +0 -27
  73. package/dist/types.backup/browser/navigation-client.d.ts +0 -17
  74. package/dist/types.backup/browser/navigation-store-handle.d.ts +0 -25
  75. package/dist/types.backup/browser/navigation-store.d.ts +0 -95
  76. package/dist/types.backup/browser/navigation-transaction.d.ts +0 -75
  77. package/dist/types.backup/browser/network-error-handler.d.ts +0 -35
  78. package/dist/types.backup/browser/partial-update.d.ts +0 -61
  79. package/dist/types.backup/browser/prefetch/cache.d.ts +0 -183
  80. package/dist/types.backup/browser/prefetch/fetch.d.ts +0 -52
  81. package/dist/types.backup/browser/prefetch/observer.d.ts +0 -27
  82. package/dist/types.backup/browser/prefetch/policy.d.ts +0 -13
  83. package/dist/types.backup/browser/prefetch/queue.d.ts +0 -48
  84. package/dist/types.backup/browser/prefetch/resource-ready.d.ts +0 -28
  85. package/dist/types.backup/browser/rango-state.d.ts +0 -52
  86. package/dist/types.backup/browser/react/Link.d.ts +0 -140
  87. package/dist/types.backup/browser/react/NavigationProvider.d.ts +0 -88
  88. package/dist/types.backup/browser/react/ScrollRestoration.d.ts +0 -78
  89. package/dist/types.backup/browser/react/context.d.ts +0 -54
  90. package/dist/types.backup/browser/react/filter-segment-order.d.ts +0 -35
  91. package/dist/types.backup/browser/react/index.d.ts +0 -1
  92. package/dist/types.backup/browser/react/location-state-shared.d.ts +0 -162
  93. package/dist/types.backup/browser/react/location-state.d.ts +0 -29
  94. package/dist/types.backup/browser/react/mount-context.d.ts +0 -23
  95. package/dist/types.backup/browser/react/nonce-context.d.ts +0 -14
  96. package/dist/types.backup/browser/react/shallow-equal.d.ts +0 -5
  97. package/dist/types.backup/browser/react/use-action.d.ts +0 -61
  98. package/dist/types.backup/browser/react/use-handle.d.ts +0 -21
  99. package/dist/types.backup/browser/react/use-href.d.ts +0 -32
  100. package/dist/types.backup/browser/react/use-link-status.d.ts +0 -36
  101. package/dist/types.backup/browser/react/use-mount.d.ts +0 -24
  102. package/dist/types.backup/browser/react/use-navigation.d.ts +0 -15
  103. package/dist/types.backup/browser/react/use-params.d.ts +0 -21
  104. package/dist/types.backup/browser/react/use-pathname.d.ts +0 -13
  105. package/dist/types.backup/browser/react/use-reverse.d.ts +0 -40
  106. package/dist/types.backup/browser/react/use-router.d.ts +0 -23
  107. package/dist/types.backup/browser/react/use-search-params.d.ts +0 -19
  108. package/dist/types.backup/browser/react/use-segments.d.ts +0 -29
  109. package/dist/types.backup/browser/response-adapter.d.ts +0 -58
  110. package/dist/types.backup/browser/rsc-router.d.ts +0 -141
  111. package/dist/types.backup/browser/scroll-restoration.d.ts +0 -103
  112. package/dist/types.backup/browser/segment-reconciler.d.ts +0 -74
  113. package/dist/types.backup/browser/segment-structure-assert.d.ts +0 -16
  114. package/dist/types.backup/browser/server-action-bridge.d.ts +0 -29
  115. package/dist/types.backup/browser/types.d.ts +0 -530
  116. package/dist/types.backup/browser/validate-redirect-origin.d.ts +0 -28
  117. package/dist/types.backup/build/collect-fallback-refs.d.ts +0 -5
  118. package/dist/types.backup/build/generate-manifest.d.ts +0 -100
  119. package/dist/types.backup/build/generate-route-types.d.ts +0 -8
  120. package/dist/types.backup/build/index.d.ts +0 -21
  121. package/dist/types.backup/build/prefix-tree-utils.d.ts +0 -56
  122. package/dist/types.backup/build/route-trie.d.ts +0 -89
  123. package/dist/types.backup/build/route-types/ast-helpers.d.ts +0 -3
  124. package/dist/types.backup/build/route-types/ast-route-extraction.d.ts +0 -13
  125. package/dist/types.backup/build/route-types/codegen.d.ts +0 -16
  126. package/dist/types.backup/build/route-types/include-resolution.d.ts +0 -74
  127. package/dist/types.backup/build/route-types/param-extraction.d.ts +0 -13
  128. package/dist/types.backup/build/route-types/per-module-writer.d.ts +0 -18
  129. package/dist/types.backup/build/route-types/router-processing.d.ts +0 -82
  130. package/dist/types.backup/build/route-types/scan-filter.d.ts +0 -17
  131. package/dist/types.backup/build/route-types/source-scan.d.ts +0 -13
  132. package/dist/types.backup/build/runtime-discovery.d.ts +0 -24
  133. package/dist/types.backup/cache/background-task.d.ts +0 -21
  134. package/dist/types.backup/cache/cache-error.d.ts +0 -71
  135. package/dist/types.backup/cache/cache-key-utils.d.ts +0 -35
  136. package/dist/types.backup/cache/cache-policy.d.ts +0 -59
  137. package/dist/types.backup/cache/cache-runtime.d.ts +0 -51
  138. package/dist/types.backup/cache/cache-scope.d.ts +0 -134
  139. package/dist/types.backup/cache/cache-tag.d.ts +0 -79
  140. package/dist/types.backup/cache/cf/cf-base64.d.ts +0 -4
  141. package/dist/types.backup/cache/cf/cf-cache-constants.d.ts +0 -105
  142. package/dist/types.backup/cache/cf/cf-cache-store.d.ts +0 -481
  143. package/dist/types.backup/cache/cf/cf-cache-types.d.ts +0 -300
  144. package/dist/types.backup/cache/cf/cf-kv-utils.d.ts +0 -22
  145. package/dist/types.backup/cache/cf/cf-tag-marker-memo.d.ts +0 -15
  146. package/dist/types.backup/cache/cf/index.d.ts +0 -3
  147. package/dist/types.backup/cache/document-cache.d.ts +0 -69
  148. package/dist/types.backup/cache/handle-capture.d.ts +0 -23
  149. package/dist/types.backup/cache/handle-snapshot.d.ts +0 -39
  150. package/dist/types.backup/cache/index.d.ts +0 -7
  151. package/dist/types.backup/cache/memory-segment-store.d.ts +0 -163
  152. package/dist/types.backup/cache/profile-registry.d.ts +0 -40
  153. package/dist/types.backup/cache/read-through-swr.d.ts +0 -60
  154. package/dist/types.backup/cache/segment-codec.d.ts +0 -78
  155. package/dist/types.backup/cache/shell-snapshot.d.ts +0 -162
  156. package/dist/types.backup/cache/tag-invalidation.d.ts +0 -74
  157. package/dist/types.backup/cache/taint.d.ts +0 -71
  158. package/dist/types.backup/cache/types.d.ts +0 -407
  159. package/dist/types.backup/cache/vercel/index.d.ts +0 -1
  160. package/dist/types.backup/cache/vercel/vercel-cache-store.d.ts +0 -267
  161. package/dist/types.backup/client.d.ts +0 -184
  162. package/dist/types.backup/client.rsc.d.ts +0 -39
  163. package/dist/types.backup/cloudflare/index.d.ts +0 -7
  164. package/dist/types.backup/cloudflare/tracing.d.ts +0 -53
  165. package/dist/types.backup/component-utils.d.ts +0 -46
  166. package/dist/types.backup/components/DefaultDocument.d.ts +0 -13
  167. package/dist/types.backup/context-var.d.ts +0 -84
  168. package/dist/types.backup/debug.d.ts +0 -57
  169. package/dist/types.backup/decode-loader-results.d.ts +0 -5
  170. package/dist/types.backup/default-error-boundary.d.ts +0 -10
  171. package/dist/types.backup/defer.d.ts +0 -89
  172. package/dist/types.backup/deps/browser.d.ts +0 -1
  173. package/dist/types.backup/deps/html-stream-client.d.ts +0 -1
  174. package/dist/types.backup/deps/html-stream-server.d.ts +0 -1
  175. package/dist/types.backup/deps/rsc.d.ts +0 -1
  176. package/dist/types.backup/deps/ssr.d.ts +0 -1
  177. package/dist/types.backup/encode-kv.d.ts +0 -35
  178. package/dist/types.backup/errors.d.ts +0 -226
  179. package/dist/types.backup/escape-script.d.ts +0 -44
  180. package/dist/types.backup/handle.d.ts +0 -93
  181. package/dist/types.backup/handles/MetaTags.d.ts +0 -17
  182. package/dist/types.backup/handles/Scripts.d.ts +0 -38
  183. package/dist/types.backup/handles/breadcrumbs.d.ts +0 -43
  184. package/dist/types.backup/handles/deferred-resolution.d.ts +0 -53
  185. package/dist/types.backup/handles/is-thenable.d.ts +0 -12
  186. package/dist/types.backup/handles/meta.d.ts +0 -43
  187. package/dist/types.backup/handles/script.d.ts +0 -139
  188. package/dist/types.backup/host/cookie-handler.d.ts +0 -8
  189. package/dist/types.backup/host/errors.d.ts +0 -40
  190. package/dist/types.backup/host/index.d.ts +0 -33
  191. package/dist/types.backup/host/pattern-matcher.d.ts +0 -30
  192. package/dist/types.backup/host/router.d.ts +0 -12
  193. package/dist/types.backup/host/testing.d.ts +0 -41
  194. package/dist/types.backup/host/types.d.ts +0 -148
  195. package/dist/types.backup/host/utils.d.ts +0 -20
  196. package/dist/types.backup/href-client.d.ts +0 -214
  197. package/dist/types.backup/index.d.ts +0 -112
  198. package/dist/types.backup/index.rsc.d.ts +0 -51
  199. package/dist/types.backup/internal-debug.d.ts +0 -1
  200. package/dist/types.backup/loader-store.d.ts +0 -193
  201. package/dist/types.backup/loader.d.ts +0 -18
  202. package/dist/types.backup/loader.rsc.d.ts +0 -18
  203. package/dist/types.backup/missing-id-error.d.ts +0 -1
  204. package/dist/types.backup/outlet-context.d.ts +0 -12
  205. package/dist/types.backup/outlet-provider.d.ts +0 -12
  206. package/dist/types.backup/prerender/build-shell-capture.d.ts +0 -104
  207. package/dist/types.backup/prerender/param-hash.d.ts +0 -6
  208. package/dist/types.backup/prerender/shell-manifest-key.d.ts +0 -18
  209. package/dist/types.backup/prerender/store.d.ts +0 -62
  210. package/dist/types.backup/prerender.d.ts +0 -292
  211. package/dist/types.backup/redirect-origin.d.ts +0 -55
  212. package/dist/types.backup/regex-escape.d.ts +0 -6
  213. package/dist/types.backup/render-error-thrower.d.ts +0 -13
  214. package/dist/types.backup/response-utils.d.ts +0 -35
  215. package/dist/types.backup/reverse.d.ts +0 -206
  216. package/dist/types.backup/root-error-boundary.d.ts +0 -32
  217. package/dist/types.backup/route-content-wrapper.d.ts +0 -40
  218. package/dist/types.backup/route-definition/dsl-helpers.d.ts +0 -130
  219. package/dist/types.backup/route-definition/helper-factories.d.ts +0 -22
  220. package/dist/types.backup/route-definition/helpers-types.d.ts +0 -392
  221. package/dist/types.backup/route-definition/index.d.ts +0 -7
  222. package/dist/types.backup/route-definition/redirect.d.ts +0 -48
  223. package/dist/types.backup/route-definition/resolve-handler-use.d.ts +0 -19
  224. package/dist/types.backup/route-definition/use-item-types.d.ts +0 -1
  225. package/dist/types.backup/route-definition.d.ts +0 -1
  226. package/dist/types.backup/route-map-builder.d.ts +0 -127
  227. package/dist/types.backup/route-name.d.ts +0 -27
  228. package/dist/types.backup/route-types.d.ts +0 -172
  229. package/dist/types.backup/router/basename.d.ts +0 -10
  230. package/dist/types.backup/router/content-negotiation.d.ts +0 -91
  231. package/dist/types.backup/router/debug-manifest.d.ts +0 -7
  232. package/dist/types.backup/router/error-handling.d.ts +0 -76
  233. package/dist/types.backup/router/find-match.d.ts +0 -19
  234. package/dist/types.backup/router/handler-context.d.ts +0 -41
  235. package/dist/types.backup/router/instrument.d.ts +0 -161
  236. package/dist/types.backup/router/intercept-resolution.d.ts +0 -79
  237. package/dist/types.backup/router/lazy-includes.d.ts +0 -26
  238. package/dist/types.backup/router/loader-resolution.d.ts +0 -63
  239. package/dist/types.backup/router/logging.d.ts +0 -41
  240. package/dist/types.backup/router/manifest.d.ts +0 -8
  241. package/dist/types.backup/router/match-api.d.ts +0 -19
  242. package/dist/types.backup/router/match-context.d.ts +0 -184
  243. package/dist/types.backup/router/match-handlers.d.ts +0 -49
  244. package/dist/types.backup/router/match-middleware/background-revalidation.d.ts +0 -113
  245. package/dist/types.backup/router/match-middleware/cache-lookup.d.ts +0 -113
  246. package/dist/types.backup/router/match-middleware/cache-store.d.ts +0 -112
  247. package/dist/types.backup/router/match-middleware/index.d.ts +0 -80
  248. package/dist/types.backup/router/match-middleware/intercept-resolution.d.ts +0 -116
  249. package/dist/types.backup/router/match-middleware/segment-resolution.d.ts +0 -94
  250. package/dist/types.backup/router/match-pipelines.d.ts +0 -103
  251. package/dist/types.backup/router/match-result.d.ts +0 -114
  252. package/dist/types.backup/router/metrics.d.ts +0 -6
  253. package/dist/types.backup/router/middleware-types.d.ts +0 -74
  254. package/dist/types.backup/router/middleware.d.ts +0 -116
  255. package/dist/types.backup/router/navigation-snapshot.d.ts +0 -22
  256. package/dist/types.backup/router/params-util.d.ts +0 -8
  257. package/dist/types.backup/router/parse-pattern.d.ts +0 -38
  258. package/dist/types.backup/router/pattern-matching.d.ts +0 -169
  259. package/dist/types.backup/router/prefetch-cache-ttl.d.ts +0 -27
  260. package/dist/types.backup/router/prefetch-limits.d.ts +0 -20
  261. package/dist/types.backup/router/prerender-match.d.ts +0 -50
  262. package/dist/types.backup/router/preview-match.d.ts +0 -22
  263. package/dist/types.backup/router/request-classification.d.ts +0 -104
  264. package/dist/types.backup/router/revalidation.d.ts +0 -57
  265. package/dist/types.backup/router/route-snapshot.d.ts +0 -112
  266. package/dist/types.backup/router/router-context.d.ts +0 -137
  267. package/dist/types.backup/router/router-interfaces.d.ts +0 -432
  268. package/dist/types.backup/router/router-options.d.ts +0 -738
  269. package/dist/types.backup/router/router-registry.d.ts +0 -15
  270. package/dist/types.backup/router/segment-resolution/fresh.d.ts +0 -55
  271. package/dist/types.backup/router/segment-resolution/helpers.d.ts +0 -93
  272. package/dist/types.backup/router/segment-resolution/loader-cache.d.ts +0 -33
  273. package/dist/types.backup/router/segment-resolution/loader-mask.d.ts +0 -44
  274. package/dist/types.backup/router/segment-resolution/loader-snapshot.d.ts +0 -90
  275. package/dist/types.backup/router/segment-resolution/mask-nested.d.ts +0 -53
  276. package/dist/types.backup/router/segment-resolution/revalidation.d.ts +0 -85
  277. package/dist/types.backup/router/segment-resolution/static-store.d.ts +0 -17
  278. package/dist/types.backup/router/segment-resolution/streamed-handler-telemetry.d.ts +0 -16
  279. package/dist/types.backup/router/segment-resolution/view-transition-default.d.ts +0 -28
  280. package/dist/types.backup/router/segment-resolution.d.ts +0 -3
  281. package/dist/types.backup/router/segment-wrappers.d.ts +0 -53
  282. package/dist/types.backup/router/state-cookie-name.d.ts +0 -1
  283. package/dist/types.backup/router/substitute-pattern-params.d.ts +0 -23
  284. package/dist/types.backup/router/telemetry-otel.d.ts +0 -113
  285. package/dist/types.backup/router/telemetry.d.ts +0 -215
  286. package/dist/types.backup/router/timeout.d.ts +0 -68
  287. package/dist/types.backup/router/tracing.d.ts +0 -125
  288. package/dist/types.backup/router/trie-matching.d.ts +0 -32
  289. package/dist/types.backup/router/types.d.ts +0 -98
  290. package/dist/types.backup/router/url-params.d.ts +0 -26
  291. package/dist/types.backup/router.d.ts +0 -7
  292. package/dist/types.backup/rsc/capture-queue.d.ts +0 -6
  293. package/dist/types.backup/rsc/full-payload.d.ts +0 -22
  294. package/dist/types.backup/rsc/handler-context.d.ts +0 -31
  295. package/dist/types.backup/rsc/handler.d.ts +0 -9
  296. package/dist/types.backup/rsc/helpers.d.ts +0 -213
  297. package/dist/types.backup/rsc/index.d.ts +0 -17
  298. package/dist/types.backup/rsc/json-route-result.d.ts +0 -20
  299. package/dist/types.backup/rsc/loader-fetch.d.ts +0 -14
  300. package/dist/types.backup/rsc/manifest-init.d.ts +0 -18
  301. package/dist/types.backup/rsc/nonce.d.ts +0 -28
  302. package/dist/types.backup/rsc/origin-guard.d.ts +0 -50
  303. package/dist/types.backup/rsc/progressive-enhancement.d.ts +0 -19
  304. package/dist/types.backup/rsc/redirect-guard.d.ts +0 -35
  305. package/dist/types.backup/rsc/response-cache-serve.d.ts +0 -46
  306. package/dist/types.backup/rsc/response-error.d.ts +0 -19
  307. package/dist/types.backup/rsc/response-route-handler.d.ts +0 -29
  308. package/dist/types.backup/rsc/rsc-rendering.d.ts +0 -23
  309. package/dist/types.backup/rsc/runtime-warnings.d.ts +0 -22
  310. package/dist/types.backup/rsc/server-action.d.ts +0 -68
  311. package/dist/types.backup/rsc/shell-build-manifest.d.ts +0 -84
  312. package/dist/types.backup/rsc/shell-capture-constants.d.ts +0 -27
  313. package/dist/types.backup/rsc/shell-capture.d.ts +0 -374
  314. package/dist/types.backup/rsc/shell-serve.d.ts +0 -136
  315. package/dist/types.backup/rsc/ssr-setup.d.ts +0 -48
  316. package/dist/types.backup/rsc/transition-gate.d.ts +0 -27
  317. package/dist/types.backup/rsc/types.d.ts +0 -290
  318. package/dist/types.backup/runtime-env.d.ts +0 -1
  319. package/dist/types.backup/search-params.d.ts +0 -125
  320. package/dist/types.backup/segment-content-promise.d.ts +0 -13
  321. package/dist/types.backup/segment-fragments.d.ts +0 -56
  322. package/dist/types.backup/segment-loader-promise.d.ts +0 -22
  323. package/dist/types.backup/segment-system.d.ts +0 -84
  324. package/dist/types.backup/serialize.d.ts +0 -164
  325. package/dist/types.backup/server/context.d.ts +0 -494
  326. package/dist/types.backup/server/cookie-parse.d.ts +0 -10
  327. package/dist/types.backup/server/cookie-store.d.ts +0 -107
  328. package/dist/types.backup/server/fetchable-loader-store.d.ts +0 -20
  329. package/dist/types.backup/server/handle-store.d.ts +0 -100
  330. package/dist/types.backup/server/loader-registry.d.ts +0 -32
  331. package/dist/types.backup/server/request-context.d.ts +0 -596
  332. package/dist/types.backup/server/root-layout.d.ts +0 -3
  333. package/dist/types.backup/server.d.ts +0 -15
  334. package/dist/types.backup/ssr/index.d.ts +0 -233
  335. package/dist/types.backup/ssr/inject-rsc-eager.d.ts +0 -3
  336. package/dist/types.backup/ssr/preinit-client-references.d.ts +0 -71
  337. package/dist/types.backup/ssr/ssr-root.d.ts +0 -69
  338. package/dist/types.backup/static-handler.d.ts +0 -57
  339. package/dist/types.backup/testing/cache-status.d.ts +0 -63
  340. package/dist/types.backup/testing/collect-handle.d.ts +0 -20
  341. package/dist/types.backup/testing/dispatch.d.ts +0 -123
  342. package/dist/types.backup/testing/dom.entry.d.ts +0 -15
  343. package/dist/types.backup/testing/e2e/fixture.d.ts +0 -37
  344. package/dist/types.backup/testing/e2e/index.d.ts +0 -30
  345. package/dist/types.backup/testing/e2e/matchers.d.ts +0 -17
  346. package/dist/types.backup/testing/e2e/page-helpers.d.ts +0 -62
  347. package/dist/types.backup/testing/e2e/parity.d.ts +0 -111
  348. package/dist/types.backup/testing/e2e/server.d.ts +0 -35
  349. package/dist/types.backup/testing/flight-matchers.d.ts +0 -55
  350. package/dist/types.backup/testing/flight-normalize.d.ts +0 -1
  351. package/dist/types.backup/testing/flight-tree.d.ts +0 -192
  352. package/dist/types.backup/testing/flight.d.ts +0 -115
  353. package/dist/types.backup/testing/flight.entry.d.ts +0 -27
  354. package/dist/types.backup/testing/generated-routes.d.ts +0 -66
  355. package/dist/types.backup/testing/index.d.ts +0 -52
  356. package/dist/types.backup/testing/internal/context.d.ts +0 -225
  357. package/dist/types.backup/testing/internal/flight-client-globals.d.ts +0 -1
  358. package/dist/types.backup/testing/internal/seed-vars.d.ts +0 -30
  359. package/dist/types.backup/testing/render-handler.d.ts +0 -160
  360. package/dist/types.backup/testing/render-route.d.ts +0 -246
  361. package/dist/types.backup/testing/run-loader.d.ts +0 -186
  362. package/dist/types.backup/testing/run-middleware.d.ts +0 -132
  363. package/dist/types.backup/testing/run-transition-when.d.ts +0 -77
  364. package/dist/types.backup/testing/vitest-stubs/cloudflare-email.d.ts +0 -6
  365. package/dist/types.backup/testing/vitest-stubs/cloudflare-workers.d.ts +0 -13
  366. package/dist/types.backup/testing/vitest-stubs/plugin-rsc.d.ts +0 -7
  367. package/dist/types.backup/testing/vitest-stubs/version.d.ts +0 -1
  368. package/dist/types.backup/testing/vitest.d.ts +0 -205
  369. package/dist/types.backup/theme/ThemeProvider.d.ts +0 -13
  370. package/dist/types.backup/theme/ThemeScript.d.ts +0 -45
  371. package/dist/types.backup/theme/constants.d.ts +0 -39
  372. package/dist/types.backup/theme/index.d.ts +0 -29
  373. package/dist/types.backup/theme/theme-context.d.ts +0 -21
  374. package/dist/types.backup/theme/theme-script.d.ts +0 -26
  375. package/dist/types.backup/theme/types.d.ts +0 -162
  376. package/dist/types.backup/theme/use-theme.d.ts +0 -8
  377. package/dist/types.backup/types/boundaries.d.ts +0 -93
  378. package/dist/types.backup/types/cache-types.d.ts +0 -191
  379. package/dist/types.backup/types/error-types.d.ts +0 -114
  380. package/dist/types.backup/types/global-namespace.d.ts +0 -90
  381. package/dist/types.backup/types/handler-context.d.ts +0 -658
  382. package/dist/types.backup/types/index.d.ts +0 -11
  383. package/dist/types.backup/types/loader-types.d.ts +0 -182
  384. package/dist/types.backup/types/request-scope.d.ts +0 -93
  385. package/dist/types.backup/types/route-config.d.ts +0 -105
  386. package/dist/types.backup/types/route-entry.d.ts +0 -95
  387. package/dist/types.backup/types/segments.d.ts +0 -234
  388. package/dist/types.backup/types.d.ts +0 -1
  389. package/dist/types.backup/urls/include-helper.d.ts +0 -17
  390. package/dist/types.backup/urls/include-provider.d.ts +0 -27
  391. package/dist/types.backup/urls/index.d.ts +0 -6
  392. package/dist/types.backup/urls/path-helper-types.d.ts +0 -197
  393. package/dist/types.backup/urls/path-helper.d.ts +0 -12
  394. package/dist/types.backup/urls/pattern-types.d.ts +0 -166
  395. package/dist/types.backup/urls/response-types.d.ts +0 -67
  396. package/dist/types.backup/urls/type-extraction.d.ts +0 -157
  397. package/dist/types.backup/urls/urls-function.d.ts +0 -24
  398. package/dist/types.backup/urls.d.ts +0 -1
  399. package/dist/types.backup/use-loader.d.ts +0 -150
  400. package/dist/types.backup/vercel/index.d.ts +0 -10
  401. package/dist/types.backup/vercel/tracing.d.ts +0 -70
  402. package/dist/types.backup/vite/debug.d.ts +0 -80
  403. package/dist/types.backup/vite/discovery/bundle-postprocess.d.ts +0 -12
  404. package/dist/types.backup/vite/discovery/dev-prerender-cache.d.ts +0 -65
  405. package/dist/types.backup/vite/discovery/discover-routers.d.ts +0 -17
  406. package/dist/types.backup/vite/discovery/discovery-errors.d.ts +0 -113
  407. package/dist/types.backup/vite/discovery/gate-state.d.ts +0 -79
  408. package/dist/types.backup/vite/discovery/prerender-collection.d.ts +0 -24
  409. package/dist/types.backup/vite/discovery/route-types-writer.d.ts +0 -32
  410. package/dist/types.backup/vite/discovery/self-gen-tracking.d.ts +0 -22
  411. package/dist/types.backup/vite/discovery/shell-prerender-phase.d.ts +0 -40
  412. package/dist/types.backup/vite/discovery/state.d.ts +0 -162
  413. package/dist/types.backup/vite/discovery/virtual-module-codegen.d.ts +0 -15
  414. package/dist/types.backup/vite/index.d.ts +0 -11
  415. package/dist/types.backup/vite/inject-client-debug.d.ts +0 -56
  416. package/dist/types.backup/vite/plugin-types.d.ts +0 -298
  417. package/dist/types.backup/vite/plugins/cjs-to-esm.d.ts +0 -6
  418. package/dist/types.backup/vite/plugins/client-ref-dedup.d.ts +0 -40
  419. package/dist/types.backup/vite/plugins/client-ref-hashing.d.ts +0 -35
  420. package/dist/types.backup/vite/plugins/cloudflare-protocol-stub.d.ts +0 -64
  421. package/dist/types.backup/vite/plugins/expose-action-id.d.ts +0 -18
  422. package/dist/types.backup/vite/plugins/expose-id-utils.d.ts +0 -37
  423. package/dist/types.backup/vite/plugins/expose-ids/export-analysis.d.ts +0 -19
  424. package/dist/types.backup/vite/plugins/expose-ids/handler-transform.d.ts +0 -10
  425. package/dist/types.backup/vite/plugins/expose-ids/loader-transform.d.ts +0 -8
  426. package/dist/types.backup/vite/plugins/expose-ids/router-transform.d.ts +0 -13
  427. package/dist/types.backup/vite/plugins/expose-ids/types.d.ts +0 -29
  428. package/dist/types.backup/vite/plugins/expose-internal-ids.d.ts +0 -6
  429. package/dist/types.backup/vite/plugins/performance-tracks.d.ts +0 -25
  430. package/dist/types.backup/vite/plugins/refresh-cmd.d.ts +0 -20
  431. package/dist/types.backup/vite/plugins/use-cache-transform.d.ts +0 -20
  432. package/dist/types.backup/vite/plugins/vercel-output.d.ts +0 -85
  433. package/dist/types.backup/vite/plugins/version-injector.d.ts +0 -21
  434. package/dist/types.backup/vite/plugins/version-plugin.d.ts +0 -19
  435. package/dist/types.backup/vite/plugins/virtual-entries.d.ts +0 -36
  436. package/dist/types.backup/vite/plugins/virtual-stub-plugin.d.ts +0 -7
  437. package/dist/types.backup/vite/rango.d.ts +0 -29
  438. package/dist/types.backup/vite/router-discovery.d.ts +0 -23
  439. package/dist/types.backup/vite/utils/ast-handler-extract.d.ts +0 -64
  440. package/dist/types.backup/vite/utils/banner.d.ts +0 -2
  441. package/dist/types.backup/vite/utils/bundle-analysis.d.ts +0 -28
  442. package/dist/types.backup/vite/utils/client-chunks.d.ts +0 -55
  443. package/dist/types.backup/vite/utils/directive-prologue.d.ts +0 -16
  444. package/dist/types.backup/vite/utils/forward-user-plugins.d.ts +0 -37
  445. package/dist/types.backup/vite/utils/manifest-utils.d.ts +0 -7
  446. package/dist/types.backup/vite/utils/package-resolution.d.ts +0 -6
  447. package/dist/types.backup/vite/utils/prerender-utils.d.ts +0 -32
  448. package/dist/types.backup/vite/utils/shared-utils.d.ts +0 -55
@@ -29,11 +29,22 @@ import {
29
29
  createSimpleRedirectResponse,
30
30
  interceptRedirectForPartial,
31
31
  attachLocationStateIfPresent,
32
+ matchAndRecordParams,
32
33
  } from "./helpers.js";
33
- import { renderRscResponse } from "./render-pipeline.js";
34
+ import {
35
+ createRenderStageTraceBridge,
36
+ renderRscResponse,
37
+ } from "./render-pipeline.js";
38
+ import {
39
+ createRoutineTrace,
40
+ runRoutine,
41
+ step,
42
+ type RoutinePlan,
43
+ } from "./routine-plan.js";
34
44
  import { warnNonRedirectActionResponse } from "./runtime-warnings.js";
35
45
  import type { HandlerContext } from "./handler-context.js";
36
46
  import type { MatchResult } from "../types.js";
47
+ import { INTERNAL_RANGO_DEBUG } from "../internal-debug.js";
37
48
 
38
49
  /**
39
50
  * Data flowing from action execution to the revalidation phase.
@@ -350,6 +361,17 @@ export function revalidateAfterAction<TEnv>(
350
361
  );
351
362
  }
352
363
 
364
+ interface ActionRevalidationInput<TEnv> {
365
+ ctx: HandlerContext<TEnv>;
366
+ request: Request;
367
+ env: TEnv;
368
+ url: URL;
369
+ handleStore: ReturnType<typeof getRequestContext>["_handleStore"];
370
+ continuation: ActionContinuation;
371
+ renderSpan: TraceSpan;
372
+ reqCtx: ReturnType<typeof getRequestContext>;
373
+ }
374
+
353
375
  async function revalidateAfterActionInner<TEnv>(
354
376
  ctx: HandlerContext<TEnv>,
355
377
  request: Request,
@@ -359,14 +381,8 @@ async function revalidateAfterActionInner<TEnv>(
359
381
  continuation: ActionContinuation,
360
382
  renderSpan: TraceSpan,
361
383
  ): Promise<Response> {
362
- const {
363
- returnValue,
364
- actionStatus,
365
- temporaryReferences,
366
- actionContext,
367
- errorBoundary,
368
- } = continuation;
369
384
  const reqCtx = getRequestContext();
385
+ const { actionContext } = continuation;
370
386
  // Expose the action that triggered this revalidation to the transition({ when })
371
387
  // gate (covers both the error-boundary and success gate calls below). Mirrors
372
388
  // the action fields a revalidate() predicate sees.
@@ -381,76 +397,63 @@ async function revalidateAfterActionInner<TEnv>(
381
397
  // in the background. See registerCachedFunction in cache/cache-runtime.ts.
382
398
  reqCtx._inActionRevalidation = true;
383
399
 
400
+ const trace = INTERNAL_RANGO_DEBUG
401
+ ? createRoutineTrace("action-revalidation")
402
+ : undefined;
403
+ const input: ActionRevalidationInput<TEnv> = {
404
+ ctx,
405
+ request,
406
+ env,
407
+ url,
408
+ handleStore,
409
+ continuation,
410
+ renderSpan,
411
+ reqCtx,
412
+ };
413
+ try {
414
+ return await runRoutine(actionRevalidationPlan(input), {
415
+ trace,
416
+ owner: reqCtx,
417
+ });
418
+ } finally {
419
+ if (trace) {
420
+ console.log(
421
+ `[routine] ${request.method} ${url.pathname} (${trace.name})\n${trace.format()}`,
422
+ );
423
+ }
424
+ }
425
+ }
426
+
427
+ /**
428
+ * The action-revalidation plan: render the deferred error boundary if the
429
+ * action threw and one matched, otherwise match affected segments (falling
430
+ * back to a full match for redirects) and render the partial payload.
431
+ */
432
+ function* actionRevalidationPlan<TEnv>(
433
+ input: ActionRevalidationInput<TEnv>,
434
+ ): RoutinePlan<Response> {
435
+ const { ctx, request, env, url, continuation } = input;
436
+ const { actionContext, errorBoundary } = continuation;
437
+
384
438
  // Action threw and a boundary matched: render the (already-matched) error
385
439
  // boundary here so it runs inside the route-middleware wrapper, exactly like
386
- // the success branch below. setRequestContextParams + the payload mirror the
387
- // pre-deferral render that executeServerAction used to do inline.
440
+ // the success branch below.
388
441
  if (errorBoundary) {
389
- setRequestContextParams(errorBoundary.params, errorBoundary.routeName);
390
-
391
- const errorPayload: RscPayload = {
392
- metadata: {
393
- pathname: url.pathname,
394
- // routerId exposed for the frontend (current app identity); see
395
- // rsc-rendering.ts partial branch.
396
- routerId: ctx.router.id,
397
- segments: gateTransitions(
398
- errorBoundary.segments,
399
- reqCtx,
400
- ctx.router.onError,
401
- ),
402
- isPartial: true,
403
- matched: errorBoundary.matched,
404
- diff: errorBoundary.diff,
405
- resolvedIds: errorBoundary.resolvedIds,
406
- params: errorBoundary.params,
407
- isError: true,
408
- handles: handleStore.stream(),
409
- version: ctx.version,
410
- },
411
- returnValue,
412
- };
413
-
414
- // Intentionally omit attachLocationState for error payloads: location state
415
- // is a success-only semantic. Error boundary responses update the error UI
416
- // but should not mutate browser history state.
417
-
418
- return renderRscResponse({
419
- ctx,
420
- request,
421
- env,
422
- url,
423
- payload: errorPayload,
424
- temporaryReferences,
425
- init: {
426
- status: actionStatus,
427
- headers: {
428
- "content-type": "text/x-component;charset=utf-8",
429
- // Router identity for the client's pre-decode integrity check (the
430
- // action apply path has no post-decode guard). See response-adapter.
431
- "X-RSC-Router-Id": ctx.router.id,
432
- },
433
- },
434
- tracking: {
435
- mode: "action-revalidation",
436
- routeKey: reqCtx._routeName,
437
- actionId: actionContext?.actionId,
438
- span: renderSpan,
439
- },
440
- });
442
+ return yield* step("render", () =>
443
+ renderActionBoundaryResponse(input, errorBoundary),
444
+ );
441
445
  }
442
446
 
443
- const matchResult = await ctx.router.matchPartial(
444
- request,
445
- { env },
446
- actionContext,
447
+ const matchResult = yield* step("match:partial", () =>
448
+ matchPartialAndRecord(ctx, request, env, actionContext),
447
449
  );
448
450
 
449
451
  if (!matchResult) {
450
452
  // matchPartial returns null when the route is a redirect or no previous-URL
451
453
  // context could be resolved. Check for redirect first.
452
- const fullMatch = await ctx.router.match(request, { env });
453
- setRequestContextParams(fullMatch.params, fullMatch.routeName);
454
+ const fullMatch = yield* step("match:fallback", () =>
455
+ matchAndRecordParams(ctx, request, env),
456
+ );
454
457
 
455
458
  if (fullMatch.redirect) {
456
459
  // Action context is always partial — use X-RSC-Redirect header so
@@ -476,8 +479,111 @@ async function revalidateAfterActionInner<TEnv>(
476
479
  );
477
480
  }
478
481
 
479
- // Return updated segments
480
- setRequestContextParams(matchResult.params, matchResult.routeName);
482
+ return yield* step("render", () =>
483
+ renderRevalidationResponse(input, matchResult),
484
+ );
485
+ }
486
+
487
+ /** matchPartial that stamps params/routeName when a result exists. */
488
+ async function matchPartialAndRecord<TEnv>(
489
+ ctx: HandlerContext<TEnv>,
490
+ request: Request,
491
+ env: TEnv,
492
+ actionContext: ActionContinuation["actionContext"],
493
+ ): Promise<
494
+ Awaited<ReturnType<HandlerContext<TEnv>["router"]["matchPartial"]>>
495
+ > {
496
+ const matchResult = await ctx.router.matchPartial(
497
+ request,
498
+ { env },
499
+ actionContext,
500
+ );
501
+ if (matchResult) {
502
+ setRequestContextParams(matchResult.params, matchResult.routeName);
503
+ }
504
+ return matchResult;
505
+ }
506
+
507
+ /**
508
+ * Render the deferred action error boundary. setRequestContextParams + the
509
+ * payload mirror the pre-deferral render that executeServerAction used to do
510
+ * inline.
511
+ */
512
+ function renderActionBoundaryResponse<TEnv>(
513
+ input: ActionRevalidationInput<TEnv>,
514
+ errorBoundary: MatchResult,
515
+ ): Promise<Response> {
516
+ const { ctx, request, env, url, handleStore, continuation, reqCtx } = input;
517
+ const { returnValue, actionStatus, temporaryReferences, actionContext } =
518
+ continuation;
519
+
520
+ setRequestContextParams(errorBoundary.params, errorBoundary.routeName);
521
+
522
+ const errorPayload: RscPayload = {
523
+ metadata: {
524
+ pathname: url.pathname,
525
+ // routerId exposed for the frontend (current app identity); see
526
+ // rsc-rendering.ts partial branch.
527
+ routerId: ctx.router.id,
528
+ segments: gateTransitions(
529
+ errorBoundary.segments,
530
+ reqCtx,
531
+ ctx.router.onError,
532
+ ),
533
+ isPartial: true,
534
+ matched: errorBoundary.matched,
535
+ diff: errorBoundary.diff,
536
+ resolvedIds: errorBoundary.resolvedIds,
537
+ params: errorBoundary.params,
538
+ isError: true,
539
+ handles: handleStore.stream(),
540
+ version: ctx.version,
541
+ },
542
+ returnValue,
543
+ };
544
+
545
+ // Intentionally omit attachLocationState for error payloads: location state
546
+ // is a success-only semantic. Error boundary responses update the error UI
547
+ // but should not mutate browser history state.
548
+
549
+ return renderRscResponse({
550
+ ctx,
551
+ request,
552
+ env,
553
+ url,
554
+ payload: errorPayload,
555
+ temporaryReferences,
556
+ init: {
557
+ status: actionStatus,
558
+ headers: {
559
+ "content-type": "text/x-component;charset=utf-8",
560
+ // Router identity for the client's pre-decode integrity check (the
561
+ // action apply path has no post-decode guard). See response-adapter.
562
+ "X-RSC-Router-Id": ctx.router.id,
563
+ },
564
+ },
565
+ tracking: {
566
+ mode: "action-revalidation",
567
+ routeKey: input.reqCtx._routeName,
568
+ actionId: actionContext?.actionId,
569
+ span: input.renderSpan,
570
+ onEvent:
571
+ reqCtx._activeRoutine &&
572
+ createRenderStageTraceBridge(reqCtx._activeRoutine),
573
+ },
574
+ });
575
+ }
576
+
577
+ /** Render the updated segments after a successful action. */
578
+ function renderRevalidationResponse<TEnv>(
579
+ input: ActionRevalidationInput<TEnv>,
580
+ matchResult: NonNullable<
581
+ Awaited<ReturnType<HandlerContext<TEnv>["router"]["matchPartial"]>>
582
+ >,
583
+ ): Promise<Response> {
584
+ const { ctx, request, env, url, handleStore, continuation, reqCtx } = input;
585
+ const { returnValue, actionStatus, temporaryReferences, actionContext } =
586
+ continuation;
481
587
 
482
588
  const payload: RscPayload = {
483
589
  metadata: {
@@ -524,7 +630,10 @@ async function revalidateAfterActionInner<TEnv>(
524
630
  mode: "action-revalidation",
525
631
  routeKey: reqCtx._routeName,
526
632
  actionId: actionContext?.actionId,
527
- span: renderSpan,
633
+ span: input.renderSpan,
634
+ onEvent:
635
+ reqCtx._activeRoutine &&
636
+ createRenderStageTraceBridge(reqCtx._activeRoutine),
528
637
  },
529
638
  });
530
639
  }
@@ -25,3 +25,21 @@
25
25
  * docs/design/ppr-shell-resume.md (Cost model).
26
26
  */
27
27
  export const SHELL_CAPTURE_MAX_WAIT_MS = 15_000;
28
+
29
+ /**
30
+ * Hard cap on one capture TASK — runShellCapture end to end (both attempts +
31
+ * the in-place retry delay). SHELL_CAPTURE_MAX_WAIT_MS arms only inside
32
+ * captureShellHTML, AFTER the capture's router.match(); a handler wedged on a
33
+ * never-settling upstream await (autobarn pilot: a 30s+ tarpitting fetch)
34
+ * wedges the task with no deadline in force. The task's settle path releases
35
+ * the per-key stampede guard and the serialized capture-queue slot, so an
36
+ * unbounded task strands BOTH for the isolate's lifetime.
37
+ *
38
+ * 25s: above one full-budget attempt plus overhead (cutting a second attempt
39
+ * short is an acceptable loss — every terminal path backs the key off anyway),
40
+ * and below workerd's ~30s waitUntil grace so the cap timer still fires in a
41
+ * live context. When workerd kills the context BEFORE the cap fires, the timer
42
+ * dies with it — that stranding is healed by scheduleShellCapture's staleness
43
+ * check on the stampede guard, keyed off the same constant.
44
+ */
45
+ export const SHELL_CAPTURE_TASK_HARD_CAP_MS = 25_000;
@@ -26,7 +26,10 @@ import {
26
26
  captureQueueDepths,
27
27
  enqueueSerializedCapture,
28
28
  } from "./capture-queue.js";
29
- import { SHELL_CAPTURE_MAX_WAIT_MS } from "./shell-capture-constants.js";
29
+ import {
30
+ SHELL_CAPTURE_MAX_WAIT_MS,
31
+ SHELL_CAPTURE_TASK_HARD_CAP_MS,
32
+ } from "./shell-capture-constants.js";
30
33
  import { INTERNAL_RANGO_DEBUG } from "../internal-debug.js";
31
34
  import { observePhase, PHASES } from "../router/instrument.js";
32
35
  import type { TraceSpan } from "../router/tracing.js";
@@ -185,15 +188,64 @@ function delay(ms: number): Promise<void> {
185
188
  }
186
189
 
187
190
  /**
188
- * Module-level in-flight key set: the stampede guard for background captures, and
191
+ * Bound one capture task at {@link SHELL_CAPTURE_TASK_HARD_CAP_MS}. Rejects on
192
+ * expiry so the caller's existing catch applies backoff + reporting and its
193
+ * settle path releases the stampede guard and queue slot; resolves/rejects
194
+ * transparently otherwise. The timer is unref'd so a pending cap never holds a
195
+ * Node dev process open.
196
+ */
197
+ function raceTaskHardCap<T>(task: Promise<T>, key: string): Promise<T> {
198
+ return new Promise<T>((resolve, reject) => {
199
+ const timer = setTimeout(() => {
200
+ reject(
201
+ new Error(
202
+ `capture task for ${key} exceeded the ${SHELL_CAPTURE_TASK_HARD_CAP_MS}ms hard cap; ` +
203
+ `a handler is likely wedged on a never-settling await`,
204
+ ),
205
+ );
206
+ }, SHELL_CAPTURE_TASK_HARD_CAP_MS);
207
+ (timer as { unref?: () => void }).unref?.();
208
+ task.then(
209
+ (value) => {
210
+ clearTimeout(timer);
211
+ resolve(value);
212
+ },
213
+ (error: unknown) => {
214
+ clearTimeout(timer);
215
+ reject(error);
216
+ },
217
+ );
218
+ });
219
+ }
220
+
221
+ /**
222
+ * Module-level in-flight key map: the stampede guard for background captures, and
189
223
  * its single owner. One capture runs per key per isolate; concurrent MISS/stale
190
224
  * requests for the same key coalesce onto the first (the rest see the key present
191
225
  * in scheduleShellCapture and skip). Added when a capture is scheduled and cleared
192
- * in the task's finally once it settles, so a later request can recapture when TTL
193
- * rolls. Living here (not split across the middleware) keeps the add/clear
194
- * lifecycle in one layer.
226
+ * in the task's settle paths via a token-guarded release, so a later request can
227
+ * recapture when TTL rolls. Living here (not split across the middleware) keeps
228
+ * the add/clear lifecycle in one layer.
229
+ *
230
+ * The value is the owning task's token ({@link CaptureGuardToken}) rather than
231
+ * a bare set entry: workerd can kill a capture's waitUntil context before its
232
+ * finally runs (or the task can wedge past every deadline), stranding the key.
233
+ * scheduleShellCapture treats an entry older than
234
+ * SHELL_CAPTURE_TASK_HARD_CAP_MS as abandoned and reclaims it; the token guard
235
+ * keeps a late-settling stale task from releasing its replacement's entry.
195
236
  */
196
- const inFlightCaptures = new Set<string>();
237
+ interface CaptureGuardToken {
238
+ startedAt: number;
239
+ }
240
+
241
+ const inFlightCaptures = new Map<string, CaptureGuardToken>();
242
+
243
+ /** Token-guarded release: only the entry's owning task may clear it. */
244
+ function releaseCaptureGuard(key: string, token: CaptureGuardToken): void {
245
+ if (inFlightCaptures.get(key) === token) {
246
+ inFlightCaptures.delete(key);
247
+ }
248
+ }
197
249
 
198
250
  /**
199
251
  * Refused-capture backoff bounds. The window is EXPONENTIAL in the consecutive
@@ -918,9 +970,17 @@ export function scheduleShellCapture(
918
970
  descriptor: ShellCaptureDescriptor,
919
971
  ): void {
920
972
  const key = descriptor.key;
921
- if (inFlightCaptures.has(key)) {
922
- publishCaptureDebugEvent(descriptor, { key, outcome: "skip-in-flight" });
923
- return;
973
+ const inFlight = inFlightCaptures.get(key);
974
+ if (inFlight) {
975
+ if (Date.now() - inFlight.startedAt <= SHELL_CAPTURE_TASK_HARD_CAP_MS) {
976
+ publishCaptureDebugEvent(descriptor, { key, outcome: "skip-in-flight" });
977
+ return;
978
+ }
979
+ // Older than the task hard cap: the owning task never settled (wedged
980
+ // render, or workerd killed its context before the release ran). Treat the
981
+ // key as abandoned and schedule a replacement — the set() below installs a
982
+ // new token, and the stale task's token-guarded release can no longer
983
+ // touch it.
924
984
  }
925
985
  // Refused/failed within the window → skip the doomed re-render (one probe per
926
986
  // key per window per isolate). Expired entries self-evict inside the check.
@@ -942,7 +1002,8 @@ export function scheduleShellCapture(
942
1002
  publishCaptureDebugEvent(descriptor, { key, outcome: "skip-inert-store" });
943
1003
  return;
944
1004
  }
945
- inFlightCaptures.add(key);
1005
+ const guardToken: CaptureGuardToken = { startedAt: Date.now() };
1006
+ inFlightCaptures.set(key, guardToken);
946
1007
  const captureTask = async (span: TraceSpan) => {
947
1008
  try {
948
1009
  const setupUrl = descriptor.navigationOnly
@@ -962,14 +1023,24 @@ export function scheduleShellCapture(
962
1023
  ) {
963
1024
  return;
964
1025
  }
965
- const outcome = await runShellCapture(
966
- ctx,
967
- request,
968
- env,
969
- url,
970
- reqCtx,
971
- resolvedSsrModule,
972
- descriptor,
1026
+ // Hard-capped: SHELL_CAPTURE_MAX_WAIT_MS arms only inside
1027
+ // captureShellHTML, AFTER the capture's router.match() — a handler
1028
+ // wedged on a never-settling upstream await has no deadline in force
1029
+ // and would strand the stampede guard and the queue slot (autobarn
1030
+ // pilot). The cap rejects, riding the existing catch: backoff +
1031
+ // reportCacheError + token-guarded release. The abandoned attempt keeps
1032
+ // running until its context dies; nothing awaits it.
1033
+ const outcome = await raceTaskHardCap(
1034
+ runShellCapture(
1035
+ ctx,
1036
+ request,
1037
+ env,
1038
+ url,
1039
+ reqCtx,
1040
+ resolvedSsrModule,
1041
+ descriptor,
1042
+ ),
1043
+ key,
973
1044
  );
974
1045
  span.setAttribute("rango.background.outcome", outcome);
975
1046
  // Update the negative cache off the terminal outcome. A stored shell clears
@@ -998,7 +1069,7 @@ export function scheduleShellCapture(
998
1069
  });
999
1070
  reportCacheError(error, "cache-write", "[ShellCache] capture", reqCtx);
1000
1071
  } finally {
1001
- inFlightCaptures.delete(key);
1072
+ releaseCaptureGuard(key, guardToken);
1002
1073
  }
1003
1074
  };
1004
1075
  // Serialize capture EXECUTION per isolate (capture-queue.ts): concurrent
@@ -1049,7 +1120,7 @@ export function scheduleShellCapture(
1049
1120
  );
1050
1121
  } catch (error) {
1051
1122
  if (error instanceof CaptureQueueFullError) {
1052
- inFlightCaptures.delete(key);
1123
+ releaseCaptureGuard(key, guardToken);
1053
1124
  span.setAttribute("rango.background.outcome", "skip-capacity");
1054
1125
  publishCaptureDebugEvent(descriptor, {
1055
1126
  key,
@@ -1061,7 +1132,7 @@ export function scheduleShellCapture(
1061
1132
  // Dropped unrun after waiting past the queue budget: no backoff (the
1062
1133
  // route is not doomed, the isolate was busy) — a later request
1063
1134
  // re-probes the key.
1064
- inFlightCaptures.delete(key);
1135
+ releaseCaptureGuard(key, guardToken);
1065
1136
  span.setAttribute("rango.background.outcome", "skip-queue-timeout");
1066
1137
  span.setAttribute(
1067
1138
  "rango.background.queue_wait_ms",
@@ -57,6 +57,7 @@ import {
57
57
  warnInvalidTheme,
58
58
  } from "../theme/constants.js";
59
59
  import type { LocationStateEntry } from "../browser/react/location-state-shared.js";
60
+ import type { RoutineTrace } from "../rsc/routine-plan.js";
60
61
  import { NOCACHE_SYMBOL, assertNotInsideCacheExec } from "../cache/taint.js";
61
62
  import {
62
63
  assertCachedHeaderWriteAllowed,
@@ -663,6 +664,9 @@ export interface RequestContext<
663
664
  */
664
665
  _renderForeground?: RenderForegroundCursor;
665
666
 
667
+ /** @internal Request routine currently executing, used by timeout diagnostics. */
668
+ _activeRoutine?: RoutineTrace;
669
+
666
670
  /** @internal Keep the render cursor active for timeout support. */
667
671
  _renderDiagnosticsEnabled?: boolean;
668
672
 
@@ -767,6 +771,7 @@ export type PublicRequestContext<
767
771
  | "_debugPerformance"
768
772
  | "_metricsStore"
769
773
  | "_renderForeground"
774
+ | "_activeRoutine"
770
775
  | "_renderDiagnosticsEnabled"
771
776
  | "_handlerStart"
772
777
  | "_tracing"
@@ -1323,6 +1328,7 @@ export function createRequestContext<TEnv>(
1323
1328
  _reportedErrors: new WeakSet<object>(),
1324
1329
  _metricsStore: undefined,
1325
1330
  _renderForeground: undefined,
1331
+ _activeRoutine: undefined,
1326
1332
  _renderDiagnosticsEnabled: undefined,
1327
1333
  _handlerStart: undefined,
1328
1334
 
@@ -97,6 +97,7 @@ function createSsrEventController(opts: {
97
97
  }),
98
98
  subscribeToAction: () => () => {},
99
99
  subscribeToHandles: () => () => {},
100
+ flushRouteState: () => {},
100
101
  setHandleData: () => {},
101
102
  getHandleState: () => handleState,
102
103
  setRouteSegmentIds: () => {},
@@ -0,0 +1,29 @@
1
+ import { randomBytes } from "node:crypto";
2
+
3
+ // plugin-rsc encrypts inline-action bound args with a key read from
4
+ // `virtual:vite-rsc/encryption-key`, which defaults to a fresh random key PER
5
+ // plugin instance. The build-discovery temp server (which renders Static/
6
+ // Prerender output) is a separate plugin instance from the main build, so by
7
+ // default it encrypts prerendered bound args with a key the runtime never has --
8
+ // `decryptActionBoundArgs` then fails on invocation. We hand both the SAME key
9
+ // via plugin-rsc's `defineEncryptionKey` so build-time-encrypted bound args
10
+ // decrypt at runtime.
11
+ //
12
+ // Cached per process so the temp server (created during the main build's
13
+ // buildStart) and the main build share one key. Overridable via
14
+ // RANGO_ENCRYPTION_KEY for a stable key across builds/deploys; otherwise a fresh
15
+ // key is generated per build (matching plugin-rsc's default posture, where the
16
+ // key is emitted into the build output regardless).
17
+ let cachedKey: string | undefined;
18
+
19
+ export function buildEncryptionKey(): string {
20
+ cachedKey ??=
21
+ process.env.RANGO_ENCRYPTION_KEY ?? randomBytes(32).toString("base64");
22
+ return cachedKey;
23
+ }
24
+
25
+ // The value plugin-rsc inlines as `export default () => (<expr>)`. A JSON string
26
+ // literal, so the emitted runtime key module is a plain base64 string.
27
+ export function defineEncryptionKeyExpr(): string {
28
+ return JSON.stringify(buildEncryptionKey());
29
+ }
@@ -3,6 +3,7 @@ import MagicString from "magic-string";
3
3
  import path from "node:path";
4
4
  import fs from "node:fs";
5
5
  import { normalizePath } from "./expose-id-utils.js";
6
+ import { registerServerReferenceRegex } from "./server-reference-pattern.js";
6
7
  import { createRangoDebugger, createCounter, NS } from "../debug.js";
7
8
 
8
9
  const debug = createRangoDebugger(NS.transform);
@@ -133,8 +134,7 @@ function applyRegisterReferenceWrapping(
133
134
  return false;
134
135
  }
135
136
 
136
- const pattern =
137
- /registerServerReference\(([^,]+),\s*"([^"]+)",\s*"([^"]+)"\)/g;
137
+ const pattern = registerServerReferenceRegex();
138
138
 
139
139
  let hasChanges = false;
140
140
  let match: RegExpExecArray | null;
@@ -68,6 +68,52 @@ const VIRTUAL_HANDLER_PREFIX = "virtual:handler-extract:";
68
68
  // Consolidated plugin
69
69
  // ---------------------------------------------------------------------------
70
70
 
71
+ interface RscScanPluginApi {
72
+ manager?: { isScanBuild?: boolean };
73
+ }
74
+
75
+ /**
76
+ * Stub export-only loader modules before plugin-rsc reduces scan modules to
77
+ * imports. The regular post transform remains authoritative outside scan builds.
78
+ *
79
+ * Handles and location-state definitions are intentionally excluded: handle
80
+ * collect functions run in the browser, and location-state definitions are
81
+ * callable browser objects. Their dependencies must remain visible to non-RSC
82
+ * validation rather than being hidden behind an opaque scan stub.
83
+ */
84
+ export function createLoaderScanStubPlugin(): Plugin {
85
+ let projectRoot = "";
86
+ let rscApi: RscScanPluginApi | undefined;
87
+
88
+ return {
89
+ name: "@rangojs/router:loader-scan-stubs",
90
+ apply: "build",
91
+ configResolved(config) {
92
+ projectRoot = config.root;
93
+ rscApi = config.plugins.find((plugin) => plugin.name === "rsc:minimal")
94
+ ?.api as RscScanPluginApi | undefined;
95
+ },
96
+ transform(code, id) {
97
+ if (
98
+ !rscApi?.manager?.isScanBuild ||
99
+ this.environment?.name === "rsc" ||
100
+ id.includes("/node_modules/") ||
101
+ !code.includes("createLoader") ||
102
+ !hasCreateLoaderImport(code)
103
+ ) {
104
+ return;
105
+ }
106
+
107
+ const fnNames = getImportedFnNames(code, "createLoader");
108
+ const bindings = collectCreateExportBindings(code, fnNames);
109
+ const filePath = normalizePath(path.relative(projectRoot, id));
110
+ return (
111
+ generateClientLoaderStubs(bindings, code, filePath, true) ?? undefined
112
+ );
113
+ },
114
+ };
115
+ }
116
+
71
117
  export function exposeInternalIds(options?: { forceBuild?: boolean }): Plugin {
72
118
  let config: ResolvedConfig;
73
119
  let isBuild = false;