@timber-js/app 0.2.0-alpha.12 → 0.2.0-alpha.120
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.
- package/dist/_chunks/actions-Cw-7NfJJ.js +1101 -0
- package/dist/_chunks/actions-Cw-7NfJJ.js.map +1 -0
- package/dist/_chunks/build-output-helper-DhxiT18k.js +61 -0
- package/dist/_chunks/build-output-helper-DhxiT18k.js.map +1 -0
- package/dist/_chunks/cli-schema-sync-XV0I47Gj.js +2 -0
- package/dist/_chunks/cli-schema-sync-q2wB0DyJ.js +358 -0
- package/dist/_chunks/cli-schema-sync-q2wB0DyJ.js.map +1 -0
- package/dist/_chunks/codec-registry-V7ARyeLN.js +21 -0
- package/dist/_chunks/codec-registry-V7ARyeLN.js.map +1 -0
- package/dist/_chunks/define-8zQ8Vm7x.js +195 -0
- package/dist/_chunks/define-8zQ8Vm7x.js.map +1 -0
- package/dist/_chunks/define-zQX6e1tN.js +124 -0
- package/dist/_chunks/define-zQX6e1tN.js.map +1 -0
- package/dist/_chunks/format-CR6v1pWE.js +14 -0
- package/dist/_chunks/format-CR6v1pWE.js.map +1 -0
- package/dist/_chunks/handler-store-iqnt2ghN.js +54 -0
- package/dist/_chunks/handler-store-iqnt2ghN.js.map +1 -0
- package/dist/_chunks/logger-DDmK5skc.js +291 -0
- package/dist/_chunks/logger-DDmK5skc.js.map +1 -0
- package/dist/_chunks/merge-search-params-CwxJzBLS.js +41 -0
- package/dist/_chunks/merge-search-params-CwxJzBLS.js.map +1 -0
- package/dist/_chunks/navigation-root-DKsJ5Di7.js +96 -0
- package/dist/_chunks/navigation-root-DKsJ5Di7.js.map +1 -0
- package/dist/_chunks/registry-Dp_hJL4s.js +20 -0
- package/dist/_chunks/registry-Dp_hJL4s.js.map +1 -0
- package/dist/_chunks/resolve-schema-23Mc8aLi.js +65 -0
- package/dist/_chunks/resolve-schema-23Mc8aLi.js.map +1 -0
- package/dist/_chunks/router-ref-sektkr-t.js +28 -0
- package/dist/_chunks/router-ref-sektkr-t.js.map +1 -0
- package/dist/_chunks/scanner-DmfoB7iK.js +336 -0
- package/dist/_chunks/scanner-DmfoB7iK.js.map +1 -0
- package/dist/_chunks/schema-bridge-eL5vQDSA.js +86 -0
- package/dist/_chunks/schema-bridge-eL5vQDSA.js.map +1 -0
- package/dist/_chunks/segment-classify-CnfLLvir.js +137 -0
- package/dist/_chunks/segment-classify-CnfLLvir.js.map +1 -0
- package/dist/_chunks/segment-context-Bg0pFbLT.js +34 -0
- package/dist/_chunks/segment-context-Bg0pFbLT.js.map +1 -0
- package/dist/_chunks/{ssr-data-MjmprTmO.js → ssr-data-BO5OvEvg.js} +1 -1
- package/dist/_chunks/ssr-data-BO5OvEvg.js.map +1 -0
- package/dist/_chunks/stale-reload-BCPRG0Cv.js +64 -0
- package/dist/_chunks/stale-reload-BCPRG0Cv.js.map +1 -0
- package/dist/_chunks/tracing-DvKLzCFa.js +329 -0
- package/dist/_chunks/tracing-DvKLzCFa.js.map +1 -0
- package/dist/_chunks/{use-query-states-D5KaffOK.js → use-query-states-D9SBlAfp.js} +7 -20
- package/dist/_chunks/use-query-states-D9SBlAfp.js.map +1 -0
- package/dist/_chunks/use-segment-params-CskiK-59.js +185 -0
- package/dist/_chunks/use-segment-params-CskiK-59.js.map +1 -0
- package/dist/_chunks/validation-Bm3Je-09.js +84 -0
- package/dist/_chunks/validation-Bm3Je-09.js.map +1 -0
- package/dist/_chunks/walkers-DgOXkTts.js +609 -0
- package/dist/_chunks/walkers-DgOXkTts.js.map +1 -0
- package/dist/_chunks/{format-DviM89f0.js → warnings-B30wpfaS.js} +6 -45
- package/dist/_chunks/warnings-B30wpfaS.js.map +1 -0
- package/dist/adapters/build-output-helper.d.ts +28 -0
- package/dist/adapters/build-output-helper.d.ts.map +1 -0
- package/dist/adapters/cloudflare-dev.d.ts +109 -0
- package/dist/adapters/cloudflare-dev.d.ts.map +1 -0
- package/dist/adapters/cloudflare-dev.js +73 -0
- package/dist/adapters/cloudflare-dev.js.map +1 -0
- package/dist/adapters/cloudflare-kv-cache.d.ts +64 -0
- package/dist/adapters/cloudflare-kv-cache.d.ts.map +1 -0
- package/dist/adapters/cloudflare-kv-cache.js +95 -0
- package/dist/adapters/cloudflare-kv-cache.js.map +1 -0
- package/dist/adapters/cloudflare.d.ts +148 -12
- package/dist/adapters/cloudflare.d.ts.map +1 -1
- package/dist/adapters/cloudflare.js +142 -38
- package/dist/adapters/cloudflare.js.map +1 -1
- package/dist/adapters/compress-module.d.ts.map +1 -1
- package/dist/adapters/nitro.d.ts +17 -1
- package/dist/adapters/nitro.d.ts.map +1 -1
- package/dist/adapters/nitro.js +143 -45
- package/dist/adapters/nitro.js.map +1 -1
- package/dist/adapters/shared.d.ts +16 -0
- package/dist/adapters/shared.d.ts.map +1 -0
- package/dist/cache/cache-api.d.ts +24 -0
- package/dist/cache/cache-api.d.ts.map +1 -0
- package/dist/cache/handler-store.d.ts +31 -0
- package/dist/cache/handler-store.d.ts.map +1 -0
- package/dist/cache/index.d.ts +23 -7
- package/dist/cache/index.d.ts.map +1 -1
- package/dist/cache/index.js +151 -81
- package/dist/cache/index.js.map +1 -1
- package/dist/cache/singleflight.d.ts +18 -1
- package/dist/cache/singleflight.d.ts.map +1 -1
- package/dist/cache/sizeof.d.ts +22 -0
- package/dist/cache/sizeof.d.ts.map +1 -0
- package/dist/cache/timber-cache.d.ts +1 -1
- package/dist/cache/timber-cache.d.ts.map +1 -1
- package/dist/cli-schema-sync.d.ts +37 -0
- package/dist/cli-schema-sync.d.ts.map +1 -0
- package/dist/cli.d.ts +14 -2
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +42 -6
- package/dist/cli.js.map +1 -1
- package/dist/client/browser-dev.d.ts +34 -1
- package/dist/client/browser-dev.d.ts.map +1 -1
- package/dist/client/browser-entry/action-dispatch.d.ts +17 -0
- package/dist/client/browser-entry/action-dispatch.d.ts.map +1 -0
- package/dist/client/browser-entry/hmr.d.ts +21 -0
- package/dist/client/browser-entry/hmr.d.ts.map +1 -0
- package/dist/client/browser-entry/hydrate.d.ts +46 -0
- package/dist/client/browser-entry/hydrate.d.ts.map +1 -0
- package/dist/client/browser-entry/index.d.ts +30 -0
- package/dist/client/browser-entry/index.d.ts.map +1 -0
- package/dist/client/browser-entry/post-hydration.d.ts +26 -0
- package/dist/client/browser-entry/post-hydration.d.ts.map +1 -0
- package/dist/client/browser-entry/router-init.d.ts +23 -0
- package/dist/client/browser-entry/router-init.d.ts.map +1 -0
- package/dist/client/browser-entry/rsc-stream.d.ts +24 -0
- package/dist/client/browser-entry/rsc-stream.d.ts.map +1 -0
- package/dist/client/browser-entry/scroll.d.ts +19 -0
- package/dist/client/browser-entry/scroll.d.ts.map +1 -0
- package/dist/client/error-boundary.d.ts +12 -5
- package/dist/client/error-boundary.d.ts.map +1 -1
- package/dist/client/error-boundary.js +29 -6
- package/dist/client/error-boundary.js.map +1 -1
- package/dist/client/error-reconstituter.d.ts +54 -0
- package/dist/client/error-reconstituter.d.ts.map +1 -0
- package/dist/client/form.d.ts +16 -27
- package/dist/client/form.d.ts.map +1 -1
- package/dist/client/history.d.ts +19 -4
- package/dist/client/history.d.ts.map +1 -1
- package/dist/client/index.d.ts +9 -24
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +172 -1100
- package/dist/client/index.js.map +1 -1
- package/dist/client/internal.d.ts +19 -0
- package/dist/client/internal.d.ts.map +1 -0
- package/dist/client/internal.js +964 -0
- package/dist/client/internal.js.map +1 -0
- package/dist/client/link-pending-store.d.ts +63 -0
- package/dist/client/link-pending-store.d.ts.map +1 -0
- package/dist/client/link.d.ts +62 -55
- package/dist/client/link.d.ts.map +1 -1
- package/dist/client/nav-link-store.d.ts +36 -0
- package/dist/client/nav-link-store.d.ts.map +1 -0
- package/dist/client/navigation-api-types.d.ts +90 -0
- package/dist/client/navigation-api-types.d.ts.map +1 -0
- package/dist/client/navigation-api.d.ts +115 -0
- package/dist/client/navigation-api.d.ts.map +1 -0
- package/dist/client/navigation-context.d.ts +13 -2
- package/dist/client/navigation-context.d.ts.map +1 -1
- package/dist/client/{transition-root.d.ts → navigation-root.d.ts} +42 -8
- package/dist/client/navigation-root.d.ts.map +1 -0
- package/dist/client/nuqs-adapter.d.ts.map +1 -1
- package/dist/client/router-ref.d.ts +1 -1
- package/dist/client/router.d.ts +70 -4
- package/dist/client/router.d.ts.map +1 -1
- package/dist/client/rsc-fetch.d.ts +38 -3
- package/dist/client/rsc-fetch.d.ts.map +1 -1
- package/dist/client/segment-cache.d.ts +1 -1
- package/dist/client/segment-cache.d.ts.map +1 -1
- package/dist/client/segment-outlet.d.ts +63 -0
- package/dist/client/segment-outlet.d.ts.map +1 -0
- package/dist/client/ssr-data.d.ts +13 -4
- package/dist/client/ssr-data.d.ts.map +1 -1
- package/dist/client/stale-reload.d.ts +15 -0
- package/dist/client/stale-reload.d.ts.map +1 -1
- package/dist/client/state.d.ts +1 -1
- package/dist/client/top-loader.d.ts +5 -5
- package/dist/client/top-loader.d.ts.map +1 -1
- package/dist/client/use-cookie.d.ts +12 -0
- package/dist/client/use-cookie.d.ts.map +1 -1
- package/dist/client/use-link-status.d.ts +5 -5
- package/dist/client/use-link-status.d.ts.map +1 -1
- package/dist/client/{use-navigation-pending.d.ts → use-pending-navigation.d.ts} +4 -4
- package/dist/client/use-pending-navigation.d.ts.map +1 -0
- package/dist/client/use-query-states.d.ts +1 -1
- package/dist/client/use-query-states.d.ts.map +1 -1
- package/dist/client/use-router.d.ts +1 -1
- package/dist/client/{use-params.d.ts → use-segment-params.d.ts} +8 -6
- package/dist/client/use-segment-params.d.ts.map +1 -0
- package/dist/codec.d.ts +51 -0
- package/dist/codec.d.ts.map +1 -0
- package/dist/codec.js +46 -0
- package/dist/codec.js.map +1 -0
- package/dist/config-types.d.ts +294 -0
- package/dist/config-types.d.ts.map +1 -0
- package/dist/config-validation.d.ts +51 -0
- package/dist/config-validation.d.ts.map +1 -0
- package/dist/content/index.d.ts +1 -10
- package/dist/content/index.d.ts.map +1 -1
- package/dist/content/index.js +0 -2
- package/dist/cookies/define-cookie.d.ts +58 -25
- package/dist/cookies/define-cookie.d.ts.map +1 -1
- package/dist/cookies/index.d.ts +2 -1
- package/dist/cookies/index.d.ts.map +1 -1
- package/dist/cookies/index.js +251 -36
- package/dist/cookies/index.js.map +1 -1
- package/dist/cookies/json-cookie.d.ts +64 -0
- package/dist/cookies/json-cookie.d.ts.map +1 -0
- package/dist/cookies/validation.d.ts +46 -0
- package/dist/cookies/validation.d.ts.map +1 -0
- package/dist/dev-tools/404-page.d.ts +46 -0
- package/dist/dev-tools/404-page.d.ts.map +1 -0
- package/dist/dev-tools/browser-logs.d.ts +84 -0
- package/dist/dev-tools/browser-logs.d.ts.map +1 -0
- package/dist/dev-tools/error-page.d.ts +58 -0
- package/dist/dev-tools/error-page.d.ts.map +1 -0
- package/dist/dev-tools/holding-server.d.ts +54 -0
- package/dist/dev-tools/holding-server.d.ts.map +1 -0
- package/dist/dev-tools/index.d.ts +31 -0
- package/dist/dev-tools/index.d.ts.map +1 -0
- package/dist/{server/dev-span-processor.d.ts → dev-tools/instrumentation.d.ts} +26 -6
- package/dist/dev-tools/instrumentation.d.ts.map +1 -0
- package/dist/{server/dev-logger.d.ts → dev-tools/logger.d.ts} +1 -1
- package/dist/dev-tools/logger.d.ts.map +1 -0
- package/dist/{plugins/dev-logs.d.ts → dev-tools/logs.d.ts} +2 -2
- package/dist/dev-tools/logs.d.ts.map +1 -0
- package/dist/dev-tools/overlay.d.ts +91 -0
- package/dist/dev-tools/overlay.d.ts.map +1 -0
- package/dist/dev-tools/stack-classifier.d.ts +34 -0
- package/dist/dev-tools/stack-classifier.d.ts.map +1 -0
- package/dist/dev-tools/terminal.d.ts +28 -0
- package/dist/dev-tools/terminal.d.ts.map +1 -0
- package/dist/{server/dev-warnings.d.ts → dev-tools/warnings.d.ts} +2 -22
- package/dist/dev-tools/warnings.d.ts.map +1 -0
- package/dist/fonts/ast.d.ts +98 -6
- package/dist/fonts/ast.d.ts.map +1 -1
- package/dist/fonts/bundle.d.ts +48 -0
- package/dist/fonts/bundle.d.ts.map +1 -0
- package/dist/fonts/dev-middleware.d.ts +22 -0
- package/dist/fonts/dev-middleware.d.ts.map +1 -0
- package/dist/fonts/local.d.ts +1 -1
- package/dist/fonts/pipeline.d.ts +167 -0
- package/dist/fonts/pipeline.d.ts.map +1 -0
- package/dist/fonts/transform.d.ts +78 -0
- package/dist/fonts/transform.d.ts.map +1 -0
- package/dist/fonts/types.d.ts +45 -1
- package/dist/fonts/types.d.ts.map +1 -1
- package/dist/fonts/virtual-modules.d.ts +94 -0
- package/dist/fonts/virtual-modules.d.ts.map +1 -0
- package/dist/index.d.ts +46 -190
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4799 -12730
- package/dist/index.js.map +1 -1
- package/dist/params/codec-registry.d.ts +26 -0
- package/dist/params/codec-registry.d.ts.map +1 -0
- package/dist/params/define-schema.d.ts +53 -0
- package/dist/params/define-schema.d.ts.map +1 -0
- package/dist/params/index.d.ts +5 -0
- package/dist/params/index.d.ts.map +1 -0
- package/dist/params/index.js +34 -0
- package/dist/params/index.js.map +1 -0
- package/dist/params/resolve-schema.d.ts +34 -0
- package/dist/params/resolve-schema.d.ts.map +1 -0
- package/dist/plugin-context.d.ts +107 -0
- package/dist/plugin-context.d.ts.map +1 -0
- package/dist/plugins/adapter-build.d.ts +1 -1
- package/dist/plugins/adapter-build.d.ts.map +1 -1
- package/dist/plugins/build-manifest.d.ts +2 -2
- package/dist/plugins/build-manifest.d.ts.map +1 -1
- package/dist/plugins/build-report.d.ts +9 -7
- package/dist/plugins/build-report.d.ts.map +1 -1
- package/dist/plugins/client-chunks.d.ts +32 -0
- package/dist/plugins/client-chunks.d.ts.map +1 -0
- package/dist/plugins/content.d.ts +1 -1
- package/dist/plugins/content.d.ts.map +1 -1
- package/dist/plugins/dev-server.d.ts +1 -1
- package/dist/plugins/dev-server.d.ts.map +1 -1
- package/dist/plugins/entries.d.ts +1 -1
- package/dist/plugins/entries.d.ts.map +1 -1
- package/dist/plugins/fonts.d.ts +17 -73
- package/dist/plugins/fonts.d.ts.map +1 -1
- package/dist/plugins/mdx.d.ts +1 -1
- package/dist/plugins/mdx.d.ts.map +1 -1
- package/dist/plugins/routing.d.ts +1 -1
- package/dist/plugins/routing.d.ts.map +1 -1
- package/dist/plugins/server-bundle.d.ts.map +1 -1
- package/dist/plugins/shims.d.ts +6 -5
- package/dist/plugins/shims.d.ts.map +1 -1
- package/dist/plugins/static-build.d.ts +5 -26
- package/dist/plugins/static-build.d.ts.map +1 -1
- package/dist/routing/codegen-shared.d.ts +63 -0
- package/dist/routing/codegen-shared.d.ts.map +1 -0
- package/dist/routing/codegen-types.d.ts +60 -0
- package/dist/routing/codegen-types.d.ts.map +1 -0
- package/dist/routing/codegen.d.ts +7 -2
- package/dist/routing/codegen.d.ts.map +1 -1
- package/dist/routing/convention-lint.d.ts +41 -0
- package/dist/routing/convention-lint.d.ts.map +1 -0
- package/dist/routing/index.d.ts +5 -1
- package/dist/routing/index.d.ts.map +1 -1
- package/dist/routing/index.js +4 -2
- package/dist/routing/link-codegen.d.ts +90 -0
- package/dist/routing/link-codegen.d.ts.map +1 -0
- package/dist/routing/scanner.d.ts +1 -10
- package/dist/routing/scanner.d.ts.map +1 -1
- package/dist/routing/segment-classify.d.ts +75 -0
- package/dist/routing/segment-classify.d.ts.map +1 -0
- package/dist/routing/segment-codegen.d.ts +38 -0
- package/dist/routing/segment-codegen.d.ts.map +1 -0
- package/dist/routing/types.d.ts +77 -25
- package/dist/routing/types.d.ts.map +1 -1
- package/dist/routing/walkers.d.ts +51 -0
- package/dist/routing/walkers.d.ts.map +1 -0
- package/dist/rsc-runtime/rsc.d.ts +1 -1
- package/dist/rsc-runtime/rsc.d.ts.map +1 -1
- package/dist/rsc-runtime/ssr.d.ts +12 -0
- package/dist/rsc-runtime/ssr.d.ts.map +1 -1
- package/dist/schema-bridge.d.ts +76 -0
- package/dist/schema-bridge.d.ts.map +1 -0
- package/dist/search-params/define.d.ts +157 -0
- package/dist/search-params/define.d.ts.map +1 -0
- package/dist/search-params/index.d.ts +4 -7
- package/dist/search-params/index.d.ts.map +1 -1
- package/dist/search-params/index.js +34 -441
- package/dist/search-params/index.js.map +1 -1
- package/dist/search-params/registry.d.ts +2 -2
- package/dist/search-params/registry.d.ts.map +1 -1
- package/dist/search-params/wrappers.d.ts +53 -0
- package/dist/search-params/wrappers.d.ts.map +1 -0
- package/dist/segment-params/define.d.ts +95 -0
- package/dist/segment-params/define.d.ts.map +1 -0
- package/dist/segment-params/index.d.ts +3 -0
- package/dist/segment-params/index.d.ts.map +1 -0
- package/dist/segment-params/index.js +2 -0
- package/dist/server/access-gate.d.ts +8 -3
- package/dist/server/access-gate.d.ts.map +1 -1
- package/dist/server/action-client.d.ts +41 -6
- package/dist/server/action-client.d.ts.map +1 -1
- package/dist/server/action-encryption.d.ts +76 -0
- package/dist/server/action-encryption.d.ts.map +1 -0
- package/dist/server/action-handler.d.ts +35 -1
- package/dist/server/action-handler.d.ts.map +1 -1
- package/dist/server/actions.d.ts +3 -6
- package/dist/server/actions.d.ts.map +1 -1
- package/dist/server/als-registry.d.ts +53 -5
- package/dist/server/als-registry.d.ts.map +1 -1
- package/dist/server/asset-headers.d.ts +1 -15
- package/dist/server/asset-headers.d.ts.map +1 -1
- package/dist/server/build-manifest.d.ts +2 -2
- package/dist/server/build-manifest.d.ts.map +1 -1
- package/dist/server/coalesce-tick.d.ts +40 -0
- package/dist/server/coalesce-tick.d.ts.map +1 -0
- package/dist/server/cookie-context.d.ts +170 -0
- package/dist/server/cookie-context.d.ts.map +1 -0
- package/dist/server/cookie-parsing.d.ts +51 -0
- package/dist/server/cookie-parsing.d.ts.map +1 -0
- package/dist/server/debug.d.ts +1 -1
- package/dist/server/default-logger.d.ts +22 -0
- package/dist/server/default-logger.d.ts.map +1 -0
- package/dist/server/deny-boundary.d.ts +90 -0
- package/dist/server/deny-boundary.d.ts.map +1 -0
- package/dist/server/deny-renderer.d.ts.map +1 -1
- package/dist/server/dev-source-map.d.ts +22 -0
- package/dist/server/dev-source-map.d.ts.map +1 -0
- package/dist/server/early-hints-sender.d.ts.map +1 -1
- package/dist/server/early-hints.d.ts +13 -5
- package/dist/server/early-hints.d.ts.map +1 -1
- package/dist/server/error-boundary-wrapper.d.ts +7 -1
- package/dist/server/error-boundary-wrapper.d.ts.map +1 -1
- package/dist/server/fallback-error.d.ts +12 -7
- package/dist/server/fallback-error.d.ts.map +1 -1
- package/dist/server/flight-injection-state.d.ts +66 -0
- package/dist/server/flight-injection-state.d.ts.map +1 -0
- package/dist/server/flight-scripts.d.ts +42 -0
- package/dist/server/flight-scripts.d.ts.map +1 -0
- package/dist/server/flush.d.ts.map +1 -1
- package/dist/server/form-data.d.ts +29 -0
- package/dist/server/form-data.d.ts.map +1 -1
- package/dist/server/html-injector-core.d.ts +213 -0
- package/dist/server/html-injector-core.d.ts.map +1 -0
- package/dist/server/html-injectors.d.ts +81 -41
- package/dist/server/html-injectors.d.ts.map +1 -1
- package/dist/server/index.d.ts +10 -46
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +155 -2905
- package/dist/server/index.js.map +1 -1
- package/dist/server/internal.d.ts +48 -0
- package/dist/server/internal.d.ts.map +1 -0
- package/dist/server/internal.js +2947 -0
- package/dist/server/internal.js.map +1 -0
- package/dist/server/logger.d.ts +39 -7
- package/dist/server/logger.d.ts.map +1 -1
- package/dist/server/middleware-runner.d.ts +36 -4
- package/dist/server/middleware-runner.d.ts.map +1 -1
- package/dist/server/node-stream-transforms.d.ts +112 -0
- package/dist/server/node-stream-transforms.d.ts.map +1 -0
- package/dist/server/param-coercion.d.ts +54 -0
- package/dist/server/param-coercion.d.ts.map +1 -0
- package/dist/server/pipeline-helpers.d.ts +95 -0
- package/dist/server/pipeline-helpers.d.ts.map +1 -0
- package/dist/server/pipeline-interception.d.ts +1 -1
- package/dist/server/pipeline-interception.d.ts.map +1 -1
- package/dist/server/pipeline-metadata.d.ts +6 -0
- package/dist/server/pipeline-metadata.d.ts.map +1 -1
- package/dist/server/pipeline-outcome.d.ts +49 -0
- package/dist/server/pipeline-outcome.d.ts.map +1 -0
- package/dist/server/pipeline-phases.d.ts +52 -0
- package/dist/server/pipeline-phases.d.ts.map +1 -0
- package/dist/server/pipeline.d.ts +118 -23
- package/dist/server/pipeline.d.ts.map +1 -1
- package/dist/server/port-resolution.d.ts +117 -0
- package/dist/server/port-resolution.d.ts.map +1 -0
- package/dist/server/primitives.d.ts +69 -18
- package/dist/server/primitives.d.ts.map +1 -1
- package/dist/server/render-timeout.d.ts +51 -0
- package/dist/server/render-timeout.d.ts.map +1 -0
- package/dist/server/request-context.d.ts +62 -107
- package/dist/server/request-context.d.ts.map +1 -1
- package/dist/server/route-element-builder.d.ts +27 -1
- package/dist/server/route-element-builder.d.ts.map +1 -1
- package/dist/server/route-handler.d.ts.map +1 -1
- package/dist/server/route-matcher.d.ts +21 -34
- package/dist/server/route-matcher.d.ts.map +1 -1
- package/dist/server/rsc-entry/action-middleware-runner.d.ts +66 -0
- package/dist/server/rsc-entry/action-middleware-runner.d.ts.map +1 -0
- package/dist/server/rsc-entry/api-handler.d.ts +2 -2
- package/dist/server/rsc-entry/api-handler.d.ts.map +1 -1
- package/dist/server/rsc-entry/error-renderer.d.ts +26 -13
- package/dist/server/rsc-entry/error-renderer.d.ts.map +1 -1
- package/dist/server/rsc-entry/helpers.d.ts +49 -6
- package/dist/server/rsc-entry/helpers.d.ts.map +1 -1
- package/dist/server/rsc-entry/index.d.ts +19 -8
- package/dist/server/rsc-entry/index.d.ts.map +1 -1
- package/dist/server/rsc-entry/render-route.d.ts +50 -0
- package/dist/server/rsc-entry/render-route.d.ts.map +1 -0
- package/dist/server/rsc-entry/rsc-payload.d.ts +3 -3
- package/dist/server/rsc-entry/rsc-payload.d.ts.map +1 -1
- package/dist/server/rsc-entry/rsc-stream.d.ts +17 -1
- package/dist/server/rsc-entry/rsc-stream.d.ts.map +1 -1
- package/dist/server/rsc-entry/ssr-bridge.d.ts +1 -1
- package/dist/server/rsc-entry/ssr-bridge.d.ts.map +1 -1
- package/dist/server/rsc-entry/ssr-renderer.d.ts +19 -4
- package/dist/server/rsc-entry/ssr-renderer.d.ts.map +1 -1
- package/dist/server/rsc-entry/wrap-action-dispatch.d.ts +119 -0
- package/dist/server/rsc-entry/wrap-action-dispatch.d.ts.map +1 -0
- package/dist/server/safe-load.d.ts +46 -0
- package/dist/server/safe-load.d.ts.map +1 -0
- package/dist/server/sensitive-fields.d.ts +74 -0
- package/dist/server/sensitive-fields.d.ts.map +1 -0
- package/dist/server/sitemap-generator.d.ts +129 -0
- package/dist/server/sitemap-generator.d.ts.map +1 -0
- package/dist/server/sitemap-handler.d.ts +22 -0
- package/dist/server/sitemap-handler.d.ts.map +1 -0
- package/dist/server/slot-resolver.d.ts +1 -1
- package/dist/server/slot-resolver.d.ts.map +1 -1
- package/dist/server/ssr-entry.d.ts +30 -0
- package/dist/server/ssr-entry.d.ts.map +1 -1
- package/dist/server/ssr-render.d.ts +39 -21
- package/dist/server/ssr-render.d.ts.map +1 -1
- package/dist/server/ssr-wrappers.d.ts +50 -0
- package/dist/server/ssr-wrappers.d.ts.map +1 -0
- package/dist/server/state-tree-diff.d.ts.map +1 -1
- package/dist/server/status-code-resolver.d.ts +16 -11
- package/dist/server/status-code-resolver.d.ts.map +1 -1
- package/dist/server/stream-utils.d.ts +36 -0
- package/dist/server/stream-utils.d.ts.map +1 -0
- package/dist/server/tracing.d.ts +5 -5
- package/dist/server/tracing.d.ts.map +1 -1
- package/dist/server/tree-builder.d.ts +62 -30
- package/dist/server/tree-builder.d.ts.map +1 -1
- package/dist/server/tree-match.d.ts +41 -0
- package/dist/server/tree-match.d.ts.map +1 -0
- package/dist/server/types.d.ts +49 -4
- package/dist/server/types.d.ts.map +1 -1
- package/dist/server/utils/escape-html.d.ts +14 -0
- package/dist/server/utils/escape-html.d.ts.map +1 -0
- package/dist/server/version-skew.d.ts +61 -0
- package/dist/server/version-skew.d.ts.map +1 -0
- package/dist/shared/merge-search-params.d.ts +22 -0
- package/dist/shared/merge-search-params.d.ts.map +1 -0
- package/dist/shims/font-google.d.ts +1 -1
- package/dist/shims/font-google.d.ts.map +1 -1
- package/dist/shims/font-google.js +42 -0
- package/dist/shims/font-google.js.map +1 -0
- package/dist/shims/font-local.d.ts +26 -0
- package/dist/shims/font-local.d.ts.map +1 -0
- package/dist/shims/font-local.js +20 -0
- package/dist/shims/font-local.js.map +1 -0
- package/dist/shims/headers.d.ts +2 -1
- package/dist/shims/headers.d.ts.map +1 -1
- package/dist/shims/navigation-client.d.ts +3 -1
- package/dist/shims/navigation-client.d.ts.map +1 -1
- package/dist/shims/navigation.d.ts +11 -5
- package/dist/shims/navigation.d.ts.map +1 -1
- package/dist/utils/state-machine.d.ts +80 -0
- package/dist/utils/state-machine.d.ts.map +1 -0
- package/package.json +56 -16
- package/src/adapters/build-output-helper.ts +77 -0
- package/src/adapters/cloudflare-dev.ts +177 -0
- package/src/adapters/cloudflare-kv-cache.ts +142 -0
- package/src/adapters/cloudflare.ts +350 -76
- package/src/adapters/compress-module.ts +24 -4
- package/src/adapters/nitro.ts +142 -59
- package/src/adapters/shared.ts +40 -0
- package/src/adapters/wrangler.d.ts +7 -0
- package/src/cache/cache-api.ts +38 -0
- package/src/cache/handler-store.ts +68 -0
- package/src/cache/index.ts +81 -18
- package/src/cache/singleflight.ts +62 -4
- package/src/cache/sizeof.ts +33 -0
- package/src/cache/timber-cache.ts +25 -20
- package/src/cli-schema-sync.ts +207 -0
- package/src/cli.ts +65 -8
- package/src/client/browser-dev.ts +153 -1
- package/src/client/browser-entry/action-dispatch.ts +126 -0
- package/src/client/browser-entry/hmr.ts +81 -0
- package/src/client/browser-entry/hydrate.ts +145 -0
- package/src/client/browser-entry/index.ts +149 -0
- package/src/client/browser-entry/post-hydration.ts +119 -0
- package/src/client/browser-entry/router-init.ts +193 -0
- package/src/client/browser-entry/rsc-stream.ts +157 -0
- package/src/client/browser-entry/scroll.ts +27 -0
- package/src/client/error-boundary.tsx +99 -22
- package/src/client/error-reconstituter.tsx +65 -0
- package/src/client/form.tsx +31 -32
- package/src/client/history.ts +26 -4
- package/src/client/index.ts +69 -44
- package/src/client/internal.ts +58 -0
- package/src/client/link-pending-store.ts +111 -0
- package/src/client/link.tsx +366 -113
- package/src/client/nav-link-store.ts +47 -0
- package/src/client/navigation-api-types.ts +112 -0
- package/src/client/navigation-api.ts +332 -0
- package/src/client/navigation-context.ts +31 -6
- package/src/client/navigation-root.tsx +342 -0
- package/src/client/nuqs-adapter.tsx +16 -3
- package/src/client/router-ref.ts +1 -1
- package/src/client/router.ts +300 -73
- package/src/client/rsc-fetch.ts +112 -8
- package/src/client/segment-cache.ts +1 -1
- package/src/client/segment-outlet.tsx +86 -0
- package/src/client/ssr-data.ts +13 -5
- package/src/client/stale-reload.ts +72 -3
- package/src/client/state.ts +2 -2
- package/src/client/top-loader.tsx +18 -6
- package/src/client/use-cookie.ts +31 -2
- package/src/client/use-link-status.ts +7 -7
- package/src/client/{use-navigation-pending.ts → use-pending-navigation.ts} +6 -6
- package/src/client/use-query-states.ts +9 -3
- package/src/client/use-router.ts +1 -1
- package/src/client/{use-params.ts → use-segment-params.ts} +8 -6
- package/src/codec.ts +97 -0
- package/src/config-types.ts +292 -0
- package/src/config-validation.ts +303 -0
- package/src/content/index.ts +5 -13
- package/src/cookies/define-cookie.ts +233 -53
- package/src/cookies/index.ts +12 -1
- package/src/cookies/json-cookie.ts +105 -0
- package/src/cookies/validation.ts +134 -0
- package/src/dev-tools/404-page.ts +387 -0
- package/src/dev-tools/browser-logs.ts +291 -0
- package/src/dev-tools/error-page.ts +506 -0
- package/src/dev-tools/holding-server.ts +187 -0
- package/src/dev-tools/index.ts +90 -0
- package/src/dev-tools/instrumentation.ts +176 -0
- package/src/{plugins/dev-logs.ts → dev-tools/logs.ts} +9 -5
- package/src/dev-tools/overlay.ts +469 -0
- package/src/dev-tools/stack-classifier.ts +75 -0
- package/src/dev-tools/terminal.ts +183 -0
- package/src/{server/dev-warnings.ts → dev-tools/warnings.ts} +5 -50
- package/src/fonts/ast.ts +525 -16
- package/src/fonts/bundle.ts +142 -0
- package/src/fonts/dev-middleware.ts +74 -0
- package/src/fonts/local.ts +1 -1
- package/src/fonts/pipeline.ts +314 -0
- package/src/fonts/transform.ts +317 -0
- package/src/fonts/types.ts +50 -1
- package/src/fonts/virtual-modules.ts +233 -0
- package/src/index.ts +409 -357
- package/src/params/codec-registry.ts +34 -0
- package/src/params/define-schema.ts +73 -0
- package/src/params/index.ts +11 -0
- package/src/params/resolve-schema.ts +88 -0
- package/src/plugin-context.ts +240 -0
- package/src/plugins/adapter-build.ts +12 -4
- package/src/plugins/build-manifest.ts +13 -2
- package/src/plugins/build-report.ts +16 -25
- package/src/plugins/client-chunks.ts +65 -0
- package/src/plugins/content.ts +1 -1
- package/src/plugins/dev-server.ts +175 -35
- package/src/plugins/entries.ts +111 -9
- package/src/plugins/fonts.ts +157 -654
- package/src/plugins/mdx.ts +47 -10
- package/src/plugins/routing.ts +374 -45
- package/src/plugins/server-bundle.ts +32 -1
- package/src/plugins/shims.ts +136 -35
- package/src/plugins/static-build.ts +15 -89
- package/src/routing/codegen-shared.ts +109 -0
- package/src/routing/codegen-types.ts +61 -0
- package/src/routing/codegen.ts +269 -179
- package/src/routing/convention-lint.ts +357 -0
- package/src/routing/index.ts +5 -1
- package/src/routing/interception.ts +1 -1
- package/src/routing/link-codegen.ts +308 -0
- package/src/routing/scanner.ts +107 -110
- package/src/routing/segment-classify.ts +188 -0
- package/src/routing/segment-codegen.ts +98 -0
- package/src/routing/types.ts +78 -25
- package/src/routing/walkers.ts +90 -0
- package/src/rsc-runtime/rsc.ts +2 -0
- package/src/rsc-runtime/ssr.ts +50 -0
- package/src/rsc-runtime/vendor-types.d.ts +7 -0
- package/src/{search-params/codecs.ts → schema-bridge.ts} +57 -20
- package/src/search-params/define.ts +538 -0
- package/src/search-params/index.ts +14 -20
- package/src/search-params/registry.ts +2 -2
- package/src/search-params/wrappers.ts +92 -0
- package/src/segment-params/define.ts +336 -0
- package/src/segment-params/index.ts +9 -0
- package/src/server/access-gate.tsx +76 -34
- package/src/server/action-client.ts +88 -15
- package/src/server/action-encryption.ts +144 -0
- package/src/server/action-handler.ts +112 -14
- package/src/server/actions.ts +10 -9
- package/src/server/als-registry.ts +55 -7
- package/src/server/asset-headers.ts +8 -34
- package/src/server/build-manifest.ts +10 -4
- package/src/server/coalesce-tick.ts +75 -0
- package/src/server/compress.ts +25 -7
- package/src/server/cookie-context.ts +468 -0
- package/src/server/cookie-parsing.ts +135 -0
- package/src/server/debug.ts +1 -1
- package/src/server/default-logger.ts +99 -0
- package/src/server/deny-boundary.ts +218 -0
- package/src/server/deny-renderer.ts +31 -50
- package/src/server/dev-source-map.ts +31 -0
- package/src/server/early-hints-sender.ts +3 -2
- package/src/server/early-hints.ts +36 -15
- package/src/server/error-boundary-wrapper.ts +74 -22
- package/src/server/fallback-error.ts +74 -102
- package/src/server/flight-injection-state.ts +113 -0
- package/src/server/flight-scripts.ts +62 -0
- package/src/server/flush.ts +2 -1
- package/src/server/form-data.ts +76 -0
- package/src/server/html-injector-core.ts +417 -0
- package/src/server/html-injectors.ts +235 -223
- package/src/server/index.ts +29 -183
- package/src/server/internal.ts +176 -0
- package/src/server/logger.ts +67 -36
- package/src/server/middleware-runner.ts +75 -4
- package/src/server/node-stream-transforms.ts +361 -0
- package/src/server/param-coercion.ts +206 -0
- package/src/server/pipeline-helpers.ts +204 -0
- package/src/server/pipeline-interception.ts +17 -16
- package/src/server/pipeline-metadata.ts +13 -0
- package/src/server/pipeline-outcome.ts +176 -0
- package/src/server/pipeline-phases.ts +460 -0
- package/src/server/pipeline.ts +154 -394
- package/src/server/port-resolution.ts +215 -0
- package/src/server/primitives.ts +111 -28
- package/src/server/render-timeout.ts +108 -0
- package/src/server/request-context.ts +168 -333
- package/src/server/route-element-builder.ts +309 -195
- package/src/server/route-handler.ts +24 -4
- package/src/server/route-matcher.ts +50 -231
- package/src/server/rsc-entry/action-middleware-runner.ts +167 -0
- package/src/server/rsc-entry/api-handler.ts +16 -17
- package/src/server/rsc-entry/error-renderer.ts +305 -89
- package/src/server/rsc-entry/helpers.ts +137 -12
- package/src/server/rsc-entry/index.ts +316 -352
- package/src/server/rsc-entry/render-route.ts +307 -0
- package/src/server/rsc-entry/rsc-payload.ts +65 -18
- package/src/server/rsc-entry/rsc-stream.ts +85 -13
- package/src/server/rsc-entry/ssr-bridge.ts +14 -5
- package/src/server/rsc-entry/ssr-renderer.ts +187 -38
- package/src/server/rsc-entry/wrap-action-dispatch.ts +449 -0
- package/src/server/safe-load.ts +60 -0
- package/src/server/sensitive-fields.ts +230 -0
- package/src/server/sitemap-generator.ts +338 -0
- package/src/server/sitemap-handler.ts +126 -0
- package/src/server/slot-resolver.ts +228 -246
- package/src/server/ssr-entry.ts +229 -32
- package/src/server/ssr-render.ts +289 -67
- package/src/server/ssr-wrappers.tsx +139 -0
- package/src/server/state-tree-diff.ts +4 -1
- package/src/server/status-code-resolver.ts +112 -128
- package/src/server/stream-utils.ts +213 -0
- package/src/server/tracing.ts +21 -10
- package/src/server/tree-builder.ts +202 -90
- package/src/server/tree-match.ts +198 -0
- package/src/server/types.ts +55 -6
- package/src/server/utils/escape-html.ts +20 -0
- package/src/server/version-skew.ts +104 -0
- package/src/shared/merge-search-params.ts +55 -0
- package/src/shims/font-google.ts +1 -1
- package/src/shims/font-local.ts +34 -0
- package/src/shims/headers.ts +5 -1
- package/src/shims/navigation-client.ts +4 -3
- package/src/shims/navigation.ts +14 -7
- package/src/utils/state-machine.ts +111 -0
- package/dist/_chunks/als-registry-B7DbZ2hS.js +0 -41
- package/dist/_chunks/als-registry-B7DbZ2hS.js.map +0 -1
- package/dist/_chunks/debug-gwlJkDuf.js +0 -108
- package/dist/_chunks/debug-gwlJkDuf.js.map +0 -1
- package/dist/_chunks/format-DviM89f0.js.map +0 -1
- package/dist/_chunks/interception-BOoWmLUA.js +0 -676
- package/dist/_chunks/interception-BOoWmLUA.js.map +0 -1
- package/dist/_chunks/request-context-DIkVh_jG.js +0 -330
- package/dist/_chunks/request-context-DIkVh_jG.js.map +0 -1
- package/dist/_chunks/ssr-data-MjmprTmO.js.map +0 -1
- package/dist/_chunks/tracing-CemImE6h.js +0 -187
- package/dist/_chunks/tracing-CemImE6h.js.map +0 -1
- package/dist/_chunks/use-cookie-DX-l1_5E.js +0 -91
- package/dist/_chunks/use-cookie-DX-l1_5E.js.map +0 -1
- package/dist/_chunks/use-query-states-D5KaffOK.js.map +0 -1
- package/dist/cache/register-cached-function.d.ts +0 -17
- package/dist/cache/register-cached-function.d.ts.map +0 -1
- package/dist/client/browser-entry.d.ts +0 -21
- package/dist/client/browser-entry.d.ts.map +0 -1
- package/dist/client/link-status-provider.d.ts +0 -11
- package/dist/client/link-status-provider.d.ts.map +0 -1
- package/dist/client/transition-root.d.ts.map +0 -1
- package/dist/client/use-navigation-pending.d.ts.map +0 -1
- package/dist/client/use-params.d.ts.map +0 -1
- package/dist/plugins/cache-transform.d.ts +0 -36
- package/dist/plugins/cache-transform.d.ts.map +0 -1
- package/dist/plugins/dev-error-overlay.d.ts +0 -60
- package/dist/plugins/dev-error-overlay.d.ts.map +0 -1
- package/dist/plugins/dev-logs.d.ts.map +0 -1
- package/dist/plugins/dynamic-transform.d.ts +0 -72
- package/dist/plugins/dynamic-transform.d.ts.map +0 -1
- package/dist/plugins/server-action-exports.d.ts +0 -26
- package/dist/plugins/server-action-exports.d.ts.map +0 -1
- package/dist/routing/status-file-lint.d.ts +0 -33
- package/dist/routing/status-file-lint.d.ts.map +0 -1
- package/dist/search-params/analyze.d.ts +0 -54
- package/dist/search-params/analyze.d.ts.map +0 -1
- package/dist/search-params/builtin-codecs.d.ts +0 -105
- package/dist/search-params/builtin-codecs.d.ts.map +0 -1
- package/dist/search-params/codecs.d.ts +0 -53
- package/dist/search-params/codecs.d.ts.map +0 -1
- package/dist/search-params/create.d.ts +0 -106
- package/dist/search-params/create.d.ts.map +0 -1
- package/dist/server/dev-fetch-instrumentation.d.ts +0 -22
- package/dist/server/dev-fetch-instrumentation.d.ts.map +0 -1
- package/dist/server/dev-logger.d.ts.map +0 -1
- package/dist/server/dev-span-processor.d.ts.map +0 -1
- package/dist/server/dev-warnings.d.ts.map +0 -1
- package/dist/server/manifest-status-resolver.d.ts +0 -58
- package/dist/server/manifest-status-resolver.d.ts.map +0 -1
- package/dist/server/prerender.d.ts +0 -77
- package/dist/server/prerender.d.ts.map +0 -1
- package/dist/server/response-cache.d.ts +0 -54
- package/dist/server/response-cache.d.ts.map +0 -1
- package/dist/utils/directive-parser.d.ts +0 -70
- package/dist/utils/directive-parser.d.ts.map +0 -1
- package/src/cache/register-cached-function.ts +0 -103
- package/src/client/browser-entry.ts +0 -678
- package/src/client/link-status-provider.tsx +0 -30
- package/src/client/transition-root.tsx +0 -166
- package/src/plugins/cache-transform.ts +0 -199
- package/src/plugins/dev-error-overlay.ts +0 -230
- package/src/plugins/dynamic-transform.ts +0 -161
- package/src/plugins/server-action-exports.ts +0 -220
- package/src/routing/status-file-lint.ts +0 -112
- package/src/search-params/analyze.ts +0 -192
- package/src/search-params/builtin-codecs.ts +0 -228
- package/src/search-params/create.ts +0 -321
- package/src/server/dev-fetch-instrumentation.ts +0 -96
- package/src/server/dev-span-processor.ts +0 -78
- package/src/server/manifest-status-resolver.ts +0 -215
- package/src/server/prerender.ts +0 -139
- package/src/server/response-cache.ts +0 -410
- package/src/utils/directive-parser.ts +0 -529
- /package/src/{server/dev-logger.ts → dev-tools/logger.ts} +0 -0
|
@@ -5,6 +5,12 @@
|
|
|
5
5
|
* correct file to render by walking the fallback chain described in
|
|
6
6
|
* design/10-error-handling.md §"Status-Code Files".
|
|
7
7
|
*
|
|
8
|
+
* **Generic over `TFile`** (TIM-848). Walks `SegmentNode<TFile>` trees
|
|
9
|
+
* regardless of whether `TFile` is the build-time `RouteFile` or the
|
|
10
|
+
* runtime `ManifestFile`. Before TIM-848 there were two near-identical
|
|
11
|
+
* resolvers — one for the Map-based scanner output and one for the
|
|
12
|
+
* object-based runtime manifest. Now there is one.
|
|
13
|
+
*
|
|
8
14
|
* Supports two format families:
|
|
9
15
|
* - 'component' (default): .tsx/.jsx/.mdx status files → React rendering pipeline
|
|
10
16
|
* - 'json': .json status files → raw JSON response, no React
|
|
@@ -17,17 +23,16 @@
|
|
|
17
23
|
* Pass 3 — error.tsx (leaf → root)
|
|
18
24
|
* Pass 4 — framework default (returns null)
|
|
19
25
|
*
|
|
20
|
-
* **JSON chain (4xx):**
|
|
21
|
-
* Pass 1 — json status files (leaf → root): {status}.json →
|
|
26
|
+
* **JSON chain (4xx and 5xx):**
|
|
27
|
+
* Pass 1 — json status files (leaf → root): {status}.json → {category}.json
|
|
22
28
|
* Pass 2 — framework default JSON (returns null, caller provides bare JSON)
|
|
23
29
|
*
|
|
24
|
-
* **5xx
|
|
30
|
+
* **5xx component:**
|
|
25
31
|
* Per-segment (leaf → root): {status}.tsx → 5xx.tsx → error.tsx
|
|
26
|
-
* Then global-error.tsx (future)
|
|
27
32
|
* Then framework default (returns null)
|
|
28
33
|
*/
|
|
29
34
|
|
|
30
|
-
import type { SegmentNode
|
|
35
|
+
import type { SegmentNode } from '../routing/types.js';
|
|
31
36
|
|
|
32
37
|
// ─── Types ───────────────────────────────────────────────────────────────────
|
|
33
38
|
|
|
@@ -42,9 +47,9 @@ export type StatusFileKind =
|
|
|
42
47
|
export type StatusFileFormat = 'component' | 'json';
|
|
43
48
|
|
|
44
49
|
/** Result of resolving a status-code file for a segment chain. */
|
|
45
|
-
export interface StatusFileResolution {
|
|
50
|
+
export interface StatusFileResolution<TFile> {
|
|
46
51
|
/** The matched route file. */
|
|
47
|
-
file:
|
|
52
|
+
file: TFile;
|
|
48
53
|
/** The HTTP status code (always the original status, not the file's code). */
|
|
49
54
|
status: number;
|
|
50
55
|
/** How the file was matched. */
|
|
@@ -57,9 +62,9 @@ export interface StatusFileResolution {
|
|
|
57
62
|
export type SlotDeniedKind = 'denied' | 'default';
|
|
58
63
|
|
|
59
64
|
/** Result of resolving a slot denied file. */
|
|
60
|
-
export interface SlotDeniedResolution {
|
|
65
|
+
export interface SlotDeniedResolution<TFile> {
|
|
61
66
|
/** The matched route file (denied.tsx or default.tsx). */
|
|
62
|
-
file:
|
|
67
|
+
file: TFile;
|
|
63
68
|
/** Slot name without @ prefix. */
|
|
64
69
|
slotName: string;
|
|
65
70
|
/** How the file was matched. */
|
|
@@ -78,6 +83,52 @@ const LEGACY_FILE_TO_STATUS: Record<string, number> = {
|
|
|
78
83
|
'unauthorized': 401,
|
|
79
84
|
};
|
|
80
85
|
|
|
86
|
+
/** Reverse index: status code → legacy file name. Built once at module load. */
|
|
87
|
+
const STATUS_TO_LEGACY_FILE: Record<number, string> = Object.fromEntries(
|
|
88
|
+
Object.entries(LEGACY_FILE_TO_STATUS).map(([name, status]) => [status, name])
|
|
89
|
+
);
|
|
90
|
+
|
|
91
|
+
// ─── Lookup Helpers ──────────────────────────────────────────────────────
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Look up `{statusStr}` then `{categoryKey}` (e.g. "4xx" / "5xx") in a
|
|
95
|
+
* status-file group on a single segment. Shared by all three fallback
|
|
96
|
+
* chains — the only structural difference between component 4xx,
|
|
97
|
+
* component 5xx, and JSON resolution is *which* group is searched and
|
|
98
|
+
* how the per-segment loop is layered around it.
|
|
99
|
+
*/
|
|
100
|
+
function lookupInGroup<TFile>(
|
|
101
|
+
group: Record<string, TFile> | undefined,
|
|
102
|
+
statusStr: string,
|
|
103
|
+
categoryKey: string,
|
|
104
|
+
segmentIndex: number,
|
|
105
|
+
status: number
|
|
106
|
+
): StatusFileResolution<TFile> | null {
|
|
107
|
+
if (!group) return null;
|
|
108
|
+
const exact = group[statusStr];
|
|
109
|
+
if (exact) return { file: exact, status, kind: 'exact', segmentIndex };
|
|
110
|
+
const category = group[categoryKey];
|
|
111
|
+
if (category) return { file: category, status, kind: 'category', segmentIndex };
|
|
112
|
+
return null;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Look up the legacy convention file (`not-found.tsx` / `forbidden.tsx` /
|
|
117
|
+
* `unauthorized.tsx`) for `status` on a single segment. Returns null if
|
|
118
|
+
* `status` has no legacy mapping or the file isn't present.
|
|
119
|
+
*/
|
|
120
|
+
function lookupLegacy<TFile>(
|
|
121
|
+
group: Record<string, TFile> | undefined,
|
|
122
|
+
status: number,
|
|
123
|
+
segmentIndex: number
|
|
124
|
+
): StatusFileResolution<TFile> | null {
|
|
125
|
+
if (!group) return null;
|
|
126
|
+
const name = STATUS_TO_LEGACY_FILE[status];
|
|
127
|
+
if (!name) return null;
|
|
128
|
+
const file = group[name];
|
|
129
|
+
return file ? { file, status, kind: 'legacy', segmentIndex } : null;
|
|
130
|
+
}
|
|
131
|
+
|
|
81
132
|
// ─── Resolver ────────────────────────────────────────────────────────────────
|
|
82
133
|
|
|
83
134
|
/**
|
|
@@ -91,101 +142,50 @@ const LEGACY_FILE_TO_STATUS: Record<string, number> = {
|
|
|
91
142
|
* @param segments - The matched segment chain from root (index 0) to leaf (last).
|
|
92
143
|
* @param format - The response format family ('component' or 'json'). Defaults to 'component'.
|
|
93
144
|
*/
|
|
94
|
-
export function resolveStatusFile(
|
|
145
|
+
export function resolveStatusFile<TFile>(
|
|
95
146
|
status: number,
|
|
96
|
-
segments: ReadonlyArray<SegmentNode
|
|
147
|
+
segments: ReadonlyArray<SegmentNode<TFile>>,
|
|
97
148
|
format: StatusFileFormat = 'component'
|
|
98
|
-
): StatusFileResolution | null {
|
|
99
|
-
if (status
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
// JSON format for 5xx uses the same json chain pattern
|
|
104
|
-
return format === 'json' ? resolve5xxJson(status, segments) : resolve5xx(status, segments);
|
|
105
|
-
}
|
|
106
|
-
return null;
|
|
149
|
+
): StatusFileResolution<TFile> | null {
|
|
150
|
+
if (status < 400 || status > 599) return null;
|
|
151
|
+
if (format === 'json') return resolveJson(status, segments);
|
|
152
|
+
if (status <= 499) return resolve4xx(status, segments);
|
|
153
|
+
return resolve5xx(status, segments);
|
|
107
154
|
}
|
|
108
155
|
|
|
109
156
|
/**
|
|
110
|
-
* 4xx component fallback chain
|
|
111
|
-
*
|
|
112
|
-
*
|
|
113
|
-
*
|
|
157
|
+
* 4xx component fallback chain — three separate full passes leaf→root.
|
|
158
|
+
*
|
|
159
|
+
* The passes must be separate (not interleaved per-segment) so that a
|
|
160
|
+
* root-level `404.tsx` beats a leaf-level `error.tsx`. The 5xx chain
|
|
161
|
+
* inverts this and is per-segment: a leaf's `error.tsx` beats a root's
|
|
162
|
+
* `5xx.tsx`. This asymmetry is the only reason these two functions exist
|
|
163
|
+
* separately.
|
|
164
|
+
*
|
|
165
|
+
* Pass 1 — {status}.tsx → 4xx.tsx (statusFiles)
|
|
166
|
+
* Pass 2 — not-found / forbidden / unauthorized (legacyStatusFiles)
|
|
167
|
+
* Pass 3 — error.tsx (error)
|
|
114
168
|
*/
|
|
115
|
-
function resolve4xx(
|
|
169
|
+
function resolve4xx<TFile>(
|
|
116
170
|
status: number,
|
|
117
|
-
segments: ReadonlyArray<SegmentNode
|
|
118
|
-
): StatusFileResolution | null {
|
|
171
|
+
segments: ReadonlyArray<SegmentNode<TFile>>
|
|
172
|
+
): StatusFileResolution<TFile> | null {
|
|
119
173
|
const statusStr = String(status);
|
|
120
174
|
|
|
121
|
-
// Pass 1: status files across all segments (leaf → root)
|
|
122
|
-
for (let i = segments.length - 1; i >= 0; i--) {
|
|
123
|
-
const segment = segments[i];
|
|
124
|
-
if (!segment.statusFiles) continue;
|
|
125
|
-
|
|
126
|
-
// Exact match first
|
|
127
|
-
const exact = segment.statusFiles.get(statusStr);
|
|
128
|
-
if (exact) {
|
|
129
|
-
return { file: exact, status, kind: 'exact', segmentIndex: i };
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
// Category catch-all
|
|
133
|
-
const category = segment.statusFiles.get('4xx');
|
|
134
|
-
if (category) {
|
|
135
|
-
return { file: category, status, kind: 'category', segmentIndex: i };
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
// Pass 2: legacy compat files (leaf → root)
|
|
140
175
|
for (let i = segments.length - 1; i >= 0; i--) {
|
|
141
|
-
const
|
|
142
|
-
if (
|
|
143
|
-
|
|
144
|
-
for (const [name, legacyStatus] of Object.entries(LEGACY_FILE_TO_STATUS)) {
|
|
145
|
-
if (legacyStatus === status) {
|
|
146
|
-
const file = segment.legacyStatusFiles.get(name);
|
|
147
|
-
if (file) {
|
|
148
|
-
return { file, status, kind: 'legacy', segmentIndex: i };
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
}
|
|
176
|
+
const r = lookupInGroup(segments[i].statusFiles, statusStr, '4xx', i, status);
|
|
177
|
+
if (r) return r;
|
|
152
178
|
}
|
|
153
179
|
|
|
154
|
-
// Pass 3: error.tsx (leaf → root)
|
|
155
180
|
for (let i = segments.length - 1; i >= 0; i--) {
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
}
|
|
181
|
+
const r = lookupLegacy(segments[i].legacyStatusFiles, status, i);
|
|
182
|
+
if (r) return r;
|
|
159
183
|
}
|
|
160
184
|
|
|
161
|
-
return null;
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
/**
|
|
165
|
-
* 4xx JSON fallback chain (single pass):
|
|
166
|
-
* Pass 1 — json status files (leaf → root): {status}.json → 4xx.json
|
|
167
|
-
* No legacy compat, no error.tsx — JSON chain terminates at category catch-all.
|
|
168
|
-
*/
|
|
169
|
-
function resolve4xxJson(
|
|
170
|
-
status: number,
|
|
171
|
-
segments: ReadonlyArray<SegmentNode>
|
|
172
|
-
): StatusFileResolution | null {
|
|
173
|
-
const statusStr = String(status);
|
|
174
|
-
|
|
175
185
|
for (let i = segments.length - 1; i >= 0; i--) {
|
|
176
|
-
const
|
|
177
|
-
if (
|
|
178
|
-
|
|
179
|
-
// Exact match first
|
|
180
|
-
const exact = segment.jsonStatusFiles.get(statusStr);
|
|
181
|
-
if (exact) {
|
|
182
|
-
return { file: exact, status, kind: 'exact', segmentIndex: i };
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
// Category catch-all
|
|
186
|
-
const category = segment.jsonStatusFiles.get('4xx');
|
|
187
|
-
if (category) {
|
|
188
|
-
return { file: category, status, kind: 'category', segmentIndex: i };
|
|
186
|
+
const errorFile = segments[i].error;
|
|
187
|
+
if (errorFile) {
|
|
188
|
+
return { file: errorFile, status, kind: 'error', segmentIndex: i };
|
|
189
189
|
}
|
|
190
190
|
}
|
|
191
191
|
|
|
@@ -193,33 +193,22 @@ function resolve4xxJson(
|
|
|
193
193
|
}
|
|
194
194
|
|
|
195
195
|
/**
|
|
196
|
-
* 5xx component fallback chain
|
|
197
|
-
*
|
|
196
|
+
* 5xx component fallback chain — single pass, per-segment leaf→root.
|
|
197
|
+
*
|
|
198
|
+
* At each segment: {status}.tsx → 5xx.tsx → error.tsx. A leaf's
|
|
199
|
+
* `error.tsx` therefore beats a root's `5xx.tsx`, which is the
|
|
200
|
+
* intentional inverse of the 4xx chain.
|
|
198
201
|
*/
|
|
199
|
-
function resolve5xx(
|
|
202
|
+
function resolve5xx<TFile>(
|
|
200
203
|
status: number,
|
|
201
|
-
segments: ReadonlyArray<SegmentNode
|
|
202
|
-
): StatusFileResolution | null {
|
|
204
|
+
segments: ReadonlyArray<SegmentNode<TFile>>
|
|
205
|
+
): StatusFileResolution<TFile> | null {
|
|
203
206
|
const statusStr = String(status);
|
|
204
207
|
|
|
205
208
|
for (let i = segments.length - 1; i >= 0; i--) {
|
|
206
209
|
const segment = segments[i];
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
if (segment.statusFiles) {
|
|
210
|
-
const exact = segment.statusFiles.get(statusStr);
|
|
211
|
-
if (exact) {
|
|
212
|
-
return { file: exact, status, kind: 'exact', segmentIndex: i };
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
// Category catch-all
|
|
216
|
-
const category = segment.statusFiles.get('5xx');
|
|
217
|
-
if (category) {
|
|
218
|
-
return { file: category, status, kind: 'category', segmentIndex: i };
|
|
219
|
-
}
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
// error.tsx at this segment level (for 5xx, checked per-segment)
|
|
210
|
+
const r = lookupInGroup(segment.statusFiles, statusStr, '5xx', i, status);
|
|
211
|
+
if (r) return r;
|
|
223
212
|
if (segment.error) {
|
|
224
213
|
return { file: segment.error, status, kind: 'error', segmentIndex: i };
|
|
225
214
|
}
|
|
@@ -229,29 +218,22 @@ function resolve5xx(
|
|
|
229
218
|
}
|
|
230
219
|
|
|
231
220
|
/**
|
|
232
|
-
*
|
|
233
|
-
*
|
|
234
|
-
*
|
|
221
|
+
* JSON fallback chain (for both 4xx and 5xx) — single pass leaf→root.
|
|
222
|
+
*
|
|
223
|
+
* At each segment: {status}.json → {category}.json. No legacy compat,
|
|
224
|
+
* no error.tsx — the JSON chain terminates at the category catch-all
|
|
225
|
+
* and the caller falls back to a bare-JSON framework default.
|
|
235
226
|
*/
|
|
236
|
-
function
|
|
227
|
+
function resolveJson<TFile>(
|
|
237
228
|
status: number,
|
|
238
|
-
segments: ReadonlyArray<SegmentNode
|
|
239
|
-
): StatusFileResolution | null {
|
|
229
|
+
segments: ReadonlyArray<SegmentNode<TFile>>
|
|
230
|
+
): StatusFileResolution<TFile> | null {
|
|
240
231
|
const statusStr = String(status);
|
|
232
|
+
const categoryKey = status >= 500 ? '5xx' : '4xx';
|
|
241
233
|
|
|
242
234
|
for (let i = segments.length - 1; i >= 0; i--) {
|
|
243
|
-
const
|
|
244
|
-
if (
|
|
245
|
-
|
|
246
|
-
const exact = segment.jsonStatusFiles.get(statusStr);
|
|
247
|
-
if (exact) {
|
|
248
|
-
return { file: exact, status, kind: 'exact', segmentIndex: i };
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
const category = segment.jsonStatusFiles.get('5xx');
|
|
252
|
-
if (category) {
|
|
253
|
-
return { file: category, status, kind: 'category', segmentIndex: i };
|
|
254
|
-
}
|
|
235
|
+
const r = lookupInGroup(segments[i].jsonStatusFiles, statusStr, categoryKey, i, status);
|
|
236
|
+
if (r) return r;
|
|
255
237
|
}
|
|
256
238
|
|
|
257
239
|
return null;
|
|
@@ -267,7 +249,9 @@ function resolve5xxJson(
|
|
|
267
249
|
*
|
|
268
250
|
* @param slotNode - The segment node for the slot (segmentType === 'slot').
|
|
269
251
|
*/
|
|
270
|
-
export function resolveSlotDenied(
|
|
252
|
+
export function resolveSlotDenied<TFile>(
|
|
253
|
+
slotNode: SegmentNode<TFile>
|
|
254
|
+
): SlotDeniedResolution<TFile> | null {
|
|
271
255
|
const slotName = slotNode.segmentName.replace(/^@/, '');
|
|
272
256
|
|
|
273
257
|
if (slotNode.denied) {
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stream utilities for the RSC rendering pipeline.
|
|
3
|
+
*
|
|
4
|
+
* teeWithErrorPropagation — wraps native ReadableStream.tee() with:
|
|
5
|
+
* 1. Cross-branch error propagation (error on one branch cancels the other)
|
|
6
|
+
* 2. Buffer divergence monitoring (warns + cancels when threshold exceeded)
|
|
7
|
+
*
|
|
8
|
+
* This prevents two classes of bugs:
|
|
9
|
+
* - Silent stalls when one tee branch errors and the other hangs indefinitely
|
|
10
|
+
* - Unbounded memory growth when one consumer (SSR) is much slower than the other
|
|
11
|
+
*
|
|
12
|
+
* Design doc: 02-rendering-pipeline.md §"RSC → SSR → Client Hydration"
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
/** Default maximum buffer divergence before cancellation (5MB). */
|
|
16
|
+
const DEFAULT_MAX_BUFFER_BYTES = 5 * 1024 * 1024;
|
|
17
|
+
|
|
18
|
+
export interface TeeOptions {
|
|
19
|
+
/**
|
|
20
|
+
* Maximum byte divergence between the two branches before both are
|
|
21
|
+
* cancelled. When one branch has consumed this many more bytes than
|
|
22
|
+
* the other, the tee's internal buffer is at least this large.
|
|
23
|
+
*
|
|
24
|
+
* Default: 5MB.
|
|
25
|
+
*/
|
|
26
|
+
maxBufferBytes?: number;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Tee a ReadableStream with error propagation and buffer monitoring.
|
|
31
|
+
*
|
|
32
|
+
* Delegates to the native `stream.tee()` for the actual forking, then wraps
|
|
33
|
+
* each branch in a ReadableStream that:
|
|
34
|
+
* - Tracks bytes consumed per branch
|
|
35
|
+
* - Cancels both branches if byte divergence exceeds `maxBufferBytes`
|
|
36
|
+
* - Cancels the other branch if either branch is cancelled or errors
|
|
37
|
+
*
|
|
38
|
+
* The returned streams are drop-in replacements for the native tee branches.
|
|
39
|
+
*/
|
|
40
|
+
export function teeWithErrorPropagation(
|
|
41
|
+
stream: ReadableStream<Uint8Array>,
|
|
42
|
+
options?: TeeOptions
|
|
43
|
+
): [ReadableStream<Uint8Array>, ReadableStream<Uint8Array>] {
|
|
44
|
+
const maxBuffer = options?.maxBufferBytes ?? DEFAULT_MAX_BUFFER_BYTES;
|
|
45
|
+
const [rawBranch1, rawBranch2] = stream.tee();
|
|
46
|
+
|
|
47
|
+
// Shared state for cross-branch coordination
|
|
48
|
+
let consumed1 = 0;
|
|
49
|
+
let consumed2 = 0;
|
|
50
|
+
let cancelled = false;
|
|
51
|
+
|
|
52
|
+
// Readers and controllers are assigned when wrapBranch creates the wrapped
|
|
53
|
+
// streams. We store them so cancelBoth can cancel raw tee branches AND
|
|
54
|
+
// error the wrapped stream controllers for cross-branch propagation.
|
|
55
|
+
let rawReader1: ReadableStreamDefaultReader<Uint8Array> | undefined;
|
|
56
|
+
let rawReader2: ReadableStreamDefaultReader<Uint8Array> | undefined;
|
|
57
|
+
let controller1: ReadableStreamDefaultController<Uint8Array> | undefined;
|
|
58
|
+
let controller2: ReadableStreamDefaultController<Uint8Array> | undefined;
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Cancel both tee branches. `initiator` is the branch index (0 or 1)
|
|
62
|
+
* that triggered the cancellation — its controller is already being
|
|
63
|
+
* closed/errored by the pull/cancel that triggered this, so we skip it.
|
|
64
|
+
* Pass -1 to cancel+error both (e.g., from the buffer divergence guard).
|
|
65
|
+
*
|
|
66
|
+
* Both raw readers are always canceled regardless of initiator, because
|
|
67
|
+
* the tee source stream is only released when both branches are canceled.
|
|
68
|
+
* ReadableStreamDefaultReader.cancel() is idempotent, so double-cancel
|
|
69
|
+
* is safe.
|
|
70
|
+
*/
|
|
71
|
+
function cancelBoth(reason: unknown, initiator: number = -1): void {
|
|
72
|
+
if (cancelled) return;
|
|
73
|
+
cancelled = true;
|
|
74
|
+
// Cancel both raw readers — tee source requires both branches canceled.
|
|
75
|
+
rawReader1?.cancel(reason).catch(() => {});
|
|
76
|
+
rawReader2?.cancel(reason).catch(() => {});
|
|
77
|
+
// Error wrapped controllers so consumers see the failure.
|
|
78
|
+
// Skip the initiator's controller — it's already being closed/errored.
|
|
79
|
+
if (initiator !== 0) {
|
|
80
|
+
try {
|
|
81
|
+
controller1?.error(reason);
|
|
82
|
+
} catch {
|
|
83
|
+
/* already closed/errored */
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
if (initiator !== 1) {
|
|
87
|
+
try {
|
|
88
|
+
controller2?.error(reason);
|
|
89
|
+
} catch {
|
|
90
|
+
/* already closed/errored */
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
function wrapBranch(
|
|
96
|
+
branchIndex: number,
|
|
97
|
+
rawBranch: ReadableStream<Uint8Array>,
|
|
98
|
+
assignReader: (r: ReadableStreamDefaultReader<Uint8Array>) => void,
|
|
99
|
+
assignController: (c: ReadableStreamDefaultController<Uint8Array>) => void,
|
|
100
|
+
addConsumed: (n: number) => void,
|
|
101
|
+
getSelfConsumed: () => number,
|
|
102
|
+
getOtherConsumed: () => number
|
|
103
|
+
): ReadableStream<Uint8Array> {
|
|
104
|
+
const reader = rawBranch.getReader();
|
|
105
|
+
assignReader(reader);
|
|
106
|
+
|
|
107
|
+
return new ReadableStream<Uint8Array>({
|
|
108
|
+
start(controller) {
|
|
109
|
+
assignController(controller);
|
|
110
|
+
},
|
|
111
|
+
|
|
112
|
+
async pull(controller) {
|
|
113
|
+
if (cancelled) {
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
try {
|
|
118
|
+
const { done, value } = await reader.read();
|
|
119
|
+
|
|
120
|
+
// Re-check after await — cancelBoth may have fired while we
|
|
121
|
+
// were waiting on the raw reader.
|
|
122
|
+
if (cancelled) return;
|
|
123
|
+
|
|
124
|
+
if (done) {
|
|
125
|
+
try {
|
|
126
|
+
controller.close();
|
|
127
|
+
} catch {
|
|
128
|
+
/* controller already errored by cancelBoth */
|
|
129
|
+
}
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
addConsumed(value.byteLength);
|
|
134
|
+
|
|
135
|
+
// Check buffer divergence: the difference in consumed bytes
|
|
136
|
+
// approximates the tee's internal buffer size.
|
|
137
|
+
const divergence = getSelfConsumed() - getOtherConsumed();
|
|
138
|
+
if (divergence > maxBuffer) {
|
|
139
|
+
const error = new Error(
|
|
140
|
+
`RSC stream tee buffer exceeded ${formatBytes(maxBuffer)} ` +
|
|
141
|
+
`(divergence: ${formatBytes(divergence)}). ` +
|
|
142
|
+
`This usually means SSR is much slower than the inline stream consumer. ` +
|
|
143
|
+
`Consider reducing RSC payload size or increasing the tee buffer limit.`
|
|
144
|
+
);
|
|
145
|
+
console.warn(`[timber] ${error.message}`);
|
|
146
|
+
cancelBoth(error);
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
controller.enqueue(value);
|
|
151
|
+
} catch (err) {
|
|
152
|
+
if (!cancelled) {
|
|
153
|
+
// Source stream errored — propagate to both branches.
|
|
154
|
+
// cancelBoth with initiator skips our own controller,
|
|
155
|
+
// so we error it explicitly here.
|
|
156
|
+
cancelBoth(err, branchIndex);
|
|
157
|
+
try {
|
|
158
|
+
controller.error(err);
|
|
159
|
+
} catch {
|
|
160
|
+
/* already closed/errored */
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
},
|
|
165
|
+
|
|
166
|
+
cancel(reason) {
|
|
167
|
+
// Consumer cancelled this branch — propagate to the other
|
|
168
|
+
cancelBoth(reason, branchIndex);
|
|
169
|
+
},
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
const wrapped1 = wrapBranch(
|
|
174
|
+
0,
|
|
175
|
+
rawBranch1,
|
|
176
|
+
(r) => {
|
|
177
|
+
rawReader1 = r;
|
|
178
|
+
},
|
|
179
|
+
(c) => {
|
|
180
|
+
controller1 = c;
|
|
181
|
+
},
|
|
182
|
+
(n) => {
|
|
183
|
+
consumed1 += n;
|
|
184
|
+
},
|
|
185
|
+
() => consumed1,
|
|
186
|
+
() => consumed2
|
|
187
|
+
);
|
|
188
|
+
|
|
189
|
+
const wrapped2 = wrapBranch(
|
|
190
|
+
1,
|
|
191
|
+
rawBranch2,
|
|
192
|
+
(r) => {
|
|
193
|
+
rawReader2 = r;
|
|
194
|
+
},
|
|
195
|
+
(c) => {
|
|
196
|
+
controller2 = c;
|
|
197
|
+
},
|
|
198
|
+
(n) => {
|
|
199
|
+
consumed2 += n;
|
|
200
|
+
},
|
|
201
|
+
() => consumed2,
|
|
202
|
+
() => consumed1
|
|
203
|
+
);
|
|
204
|
+
|
|
205
|
+
return [wrapped1, wrapped2];
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
/** Format bytes as human-readable string (e.g., "5.00 MB"). */
|
|
209
|
+
function formatBytes(bytes: number): string {
|
|
210
|
+
if (bytes < 1024) return `${bytes} B`;
|
|
211
|
+
if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(2)} KB`;
|
|
212
|
+
return `${(bytes / (1024 * 1024)).toFixed(2)} MB`;
|
|
213
|
+
}
|
package/src/server/tracing.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Tracing — per-request trace ID via AsyncLocalStorage, OTEL span helpers.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
4
|
+
* getTraceId() is always available in server code (middleware, access, components, actions).
|
|
5
5
|
* Returns a 32-char lowercase hex string — the OTEL trace ID when an SDK is active,
|
|
6
6
|
* or a crypto.randomUUID()-derived fallback otherwise.
|
|
7
7
|
*
|
|
@@ -24,11 +24,11 @@ export type { TraceStore } from './als-registry.js';
|
|
|
24
24
|
*
|
|
25
25
|
* Throws if called outside a request context (no ALS store).
|
|
26
26
|
*/
|
|
27
|
-
export function
|
|
27
|
+
export function getTraceId(): string {
|
|
28
28
|
const store = traceAls.getStore();
|
|
29
29
|
if (!store) {
|
|
30
30
|
throw new Error(
|
|
31
|
-
'[timber]
|
|
31
|
+
'[timber] getTraceId() called outside of a request context. ' +
|
|
32
32
|
'It can only be used in middleware, access checks, server components, and server actions.'
|
|
33
33
|
);
|
|
34
34
|
}
|
|
@@ -38,7 +38,7 @@ export function traceId(): string {
|
|
|
38
38
|
/**
|
|
39
39
|
* Returns the current OTEL span ID if available, undefined otherwise.
|
|
40
40
|
*/
|
|
41
|
-
export function
|
|
41
|
+
export function getSpanId(): string | undefined {
|
|
42
42
|
return traceAls.getStore()?.spanId;
|
|
43
43
|
}
|
|
44
44
|
|
|
@@ -86,7 +86,7 @@ export function updateSpanId(newSpanId: string | undefined): void {
|
|
|
86
86
|
|
|
87
87
|
/**
|
|
88
88
|
* Get the current trace store, or undefined if outside a request context.
|
|
89
|
-
* Framework-internal — use
|
|
89
|
+
* Framework-internal — use getTraceId()/getSpanId() in user code.
|
|
90
90
|
*/
|
|
91
91
|
export function getTraceStore(): TraceStore | undefined {
|
|
92
92
|
return traceAls.getStore();
|
|
@@ -105,14 +105,25 @@ export function getTraceStore(): TraceStore | undefined {
|
|
|
105
105
|
* Only called in dev mode — zero overhead in production.
|
|
106
106
|
*/
|
|
107
107
|
export async function initDevTracing(
|
|
108
|
-
config: import('
|
|
108
|
+
config: import('../dev-tools/logger.js').DevLoggerConfig
|
|
109
109
|
): Promise<void> {
|
|
110
110
|
const api = await getOtelApi();
|
|
111
111
|
if (!api) return;
|
|
112
112
|
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
113
|
+
let DevSpanProcessor: typeof import('../dev-tools/instrumentation.js').DevSpanProcessor;
|
|
114
|
+
let BasicTracerProvider: typeof import('@opentelemetry/sdk-trace-base').BasicTracerProvider;
|
|
115
|
+
let AsyncLocalStorageContextManager: typeof import('@opentelemetry/context-async-hooks').AsyncLocalStorageContextManager;
|
|
116
|
+
|
|
117
|
+
try {
|
|
118
|
+
({ DevSpanProcessor } = await import('../dev-tools/instrumentation.js'));
|
|
119
|
+
({ BasicTracerProvider } = await import('@opentelemetry/sdk-trace-base'));
|
|
120
|
+
({ AsyncLocalStorageContextManager } = await import('@opentelemetry/context-async-hooks'));
|
|
121
|
+
} catch (err) {
|
|
122
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
123
|
+
console.warn(`[timber] Dev tracing disabled — failed to load OTEL packages:\n ${msg}`);
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
|
|
116
127
|
const processor = new DevSpanProcessor(config);
|
|
117
128
|
|
|
118
129
|
// Register a context manager so OTEL can propagate the active span
|
|
@@ -199,7 +210,7 @@ export async function withSpan<T>(
|
|
|
199
210
|
|
|
200
211
|
const api = (await getOtelApi())!;
|
|
201
212
|
return tracer.startActiveSpan(name, { attributes }, async (span) => {
|
|
202
|
-
const prevSpanId =
|
|
213
|
+
const prevSpanId = getSpanId();
|
|
203
214
|
updateSpanId(span.spanContext().spanId);
|
|
204
215
|
try {
|
|
205
216
|
const result = await fn();
|