@timber-js/app 0.2.0-alpha.13 → 0.2.0-alpha.132
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-BNhpxrnV.js +1104 -0
- package/dist/_chunks/actions-BNhpxrnV.js.map +1 -0
- package/dist/_chunks/build-output-helper-K7oUCRqU.js +102 -0
- package/dist/_chunks/build-output-helper-K7oUCRqU.js.map +1 -0
- package/dist/_chunks/cli-schema-sync-CObqjGWF.js +2 -0
- package/dist/_chunks/cli-schema-sync-q-Ce6-iG.js +785 -0
- package/dist/_chunks/cli-schema-sync-q-Ce6-iG.js.map +1 -0
- package/dist/_chunks/codec-registry-DqkeAydt.js +21 -0
- package/dist/_chunks/codec-registry-DqkeAydt.js.map +1 -0
- package/dist/_chunks/define-DMq-Yjp7.js +112 -0
- package/dist/_chunks/define-DMq-Yjp7.js.map +1 -0
- package/dist/_chunks/define-jeHDXZGq.js +195 -0
- package/dist/_chunks/define-jeHDXZGq.js.map +1 -0
- package/dist/_chunks/format-BjN9HLu9.js +14 -0
- package/dist/_chunks/format-BjN9HLu9.js.map +1 -0
- package/dist/_chunks/handler-store-bIAstrxQ.js +54 -0
- package/dist/_chunks/handler-store-bIAstrxQ.js.map +1 -0
- package/dist/_chunks/logger-CMd9P1xQ.js +291 -0
- package/dist/_chunks/logger-CMd9P1xQ.js.map +1 -0
- package/dist/_chunks/merge-search-params-Cm1j99HC.js +41 -0
- package/dist/_chunks/merge-search-params-Cm1j99HC.js.map +1 -0
- package/dist/_chunks/{metadata-routes-Cjmvi3rQ.js → metadata-routes-DESG8uk5.js} +32 -19
- package/dist/_chunks/metadata-routes-DESG8uk5.js.map +1 -0
- package/dist/_chunks/navigation-root-B5-RmsPi.js +103 -0
- package/dist/_chunks/navigation-root-B5-RmsPi.js.map +1 -0
- package/dist/_chunks/registry-BI9cgCt7.js +20 -0
- package/dist/_chunks/registry-BI9cgCt7.js.map +1 -0
- package/dist/_chunks/resolve-schema-DU2nbVOi.js +77 -0
- package/dist/_chunks/resolve-schema-DU2nbVOi.js.map +1 -0
- package/dist/_chunks/router-ref-B2-2kIIC.js +28 -0
- package/dist/_chunks/router-ref-B2-2kIIC.js.map +1 -0
- package/dist/_chunks/schema-bridge-o0SwFtXW.js +86 -0
- package/dist/_chunks/schema-bridge-o0SwFtXW.js.map +1 -0
- package/dist/_chunks/segment-classify-BjfuctV2.js +137 -0
- package/dist/_chunks/segment-classify-BjfuctV2.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-DVX8S7vj.js} +1 -1
- package/dist/_chunks/ssr-data-DVX8S7vj.js.map +1 -0
- package/dist/_chunks/stale-reload-CCqb62Z3.js +84 -0
- package/dist/_chunks/stale-reload-CCqb62Z3.js.map +1 -0
- package/dist/_chunks/tracing-DP5djRq5.js +358 -0
- package/dist/_chunks/tracing-DP5djRq5.js.map +1 -0
- package/dist/_chunks/{use-query-states-D5KaffOK.js → use-query-states-C9G6LP0F.js} +7 -20
- package/dist/_chunks/use-query-states-C9G6LP0F.js.map +1 -0
- package/dist/_chunks/use-segment-params-CIeinIx2.js +151 -0
- package/dist/_chunks/use-segment-params-CIeinIx2.js.map +1 -0
- package/dist/_chunks/validation-AfEFM5ze.js +84 -0
- package/dist/_chunks/validation-AfEFM5ze.js.map +1 -0
- package/dist/_chunks/walkers-BbEu2_Pp.js +724 -0
- package/dist/_chunks/walkers-BbEu2_Pp.js.map +1 -0
- package/dist/_chunks/{format-DviM89f0.js → warnings-CAzunaGo.js} +6 -45
- package/dist/_chunks/warnings-CAzunaGo.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 +39 -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 +48 -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 +26 -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 +10 -24
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +180 -1119
- 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 +845 -0
- package/dist/client/internal.js.map +1 -0
- package/dist/client/link-pending-store.d.ts +65 -0
- package/dist/client/link-pending-store.d.ts.map +1 -0
- package/dist/client/link.d.ts +67 -56
- package/dist/client/link.d.ts.map +1 -1
- package/dist/client/nav-link-store.d.ts +27 -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 +14 -2
- package/dist/client/navigation-context.d.ts.map +1 -1
- package/dist/client/{transition-root.d.ts → navigation-root.d.ts} +46 -9
- 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 +79 -10
- package/dist/client/router.d.ts.map +1 -1
- package/dist/client/rsc-fetch.d.ts +46 -3
- package/dist/client/rsc-fetch.d.ts.map +1 -1
- package/dist/client/segment-cache.d.ts +3 -1
- package/dist/client/segment-cache.d.ts.map +1 -1
- package/dist/client/segment-outlet.d.ts +49 -0
- package/dist/client/segment-outlet.d.ts.map +1 -0
- package/dist/client/segment-update-context.d.ts +21 -0
- package/dist/client/segment-update-context.d.ts.map +1 -0
- package/dist/client/shallow-url.d.ts +10 -0
- package/dist/client/shallow-url.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-pending-navigation.d.ts +23 -0
- 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-search-params.d.ts +7 -5
- package/dist/client/use-search-params.d.ts.map +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 +69 -0
- package/dist/codec.d.ts.map +1 -0
- package/dist/codec.js +75 -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 -164
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5584 -13386
- 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 +81 -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/cloudflare-wasm.d.ts +18 -0
- package/dist/plugins/cloudflare-wasm.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 +67 -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 +7 -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/schema-validation.d.ts +35 -0
- package/dist/routing/schema-validation.d.ts.map +1 -0
- 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 +89 -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 +6 -14
- package/dist/server/actions.d.ts.map +1 -1
- package/dist/server/als-registry.d.ts +70 -11
- 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 +8 -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 +1 -1
- 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 +3073 -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/metadata-routes.d.ts +23 -7
- package/dist/server/metadata-routes.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 +28 -2
- 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 +25 -36
- 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 +50 -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 +5 -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-bridge-types.d.ts +121 -0
- package/dist/server/ssr-bridge-types.d.ts.map +1 -0
- package/dist/server/ssr-entry.d.ts +2 -43
- package/dist/server/ssr-entry.d.ts.map +1 -1
- package/dist/server/ssr-render.d.ts +64 -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 +12 -5
- 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 +49 -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 +139 -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 +295 -0
- package/src/cli.ts +76 -8
- package/src/client/browser-dev.ts +153 -1
- package/src/client/browser-entry/action-dispatch.ts +125 -0
- package/src/client/browser-entry/hmr.ts +81 -0
- package/src/client/browser-entry/hydrate.ts +153 -0
- package/src/client/browser-entry/index.ts +151 -0
- package/src/client/browser-entry/post-hydration.ts +113 -0
- package/src/client/browser-entry/router-init.ts +219 -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 +66 -45
- package/src/client/internal.ts +58 -0
- package/src/client/link-pending-store.ts +116 -0
- package/src/client/link.tsx +336 -119
- package/src/client/nav-link-store.ts +37 -0
- package/src/client/navigation-api-types.ts +112 -0
- package/src/client/navigation-api.ts +332 -0
- package/src/client/navigation-context.ts +33 -7
- package/src/client/navigation-root.tsx +347 -0
- package/src/client/nuqs-adapter.tsx +16 -3
- package/src/client/router-ref.ts +1 -1
- package/src/client/router.ts +418 -128
- package/src/client/rsc-fetch.ts +208 -10
- package/src/client/segment-cache.ts +6 -3
- package/src/client/segment-outlet.tsx +77 -0
- package/src/client/segment-update-context.ts +42 -0
- package/src/client/shallow-url.ts +22 -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 +11 -9
- package/src/client/use-cookie.ts +31 -2
- package/src/client/use-link-status.ts +7 -7
- package/src/client/use-pending-navigation.ts +40 -0
- package/src/client/use-query-states.ts +9 -3
- package/src/client/use-router.ts +1 -1
- package/src/client/use-search-params.ts +25 -44
- package/src/client/{use-params.ts → use-segment-params.ts} +8 -6
- package/src/codec.ts +147 -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 +411 -329
- package/src/params/codec-registry.ts +34 -0
- package/src/params/define-schema.ts +114 -0
- package/src/params/index.ts +17 -0
- package/src/params/resolve-schema.ts +116 -0
- package/src/plugin-context.ts +240 -0
- package/src/plugins/adapter-build.ts +12 -4
- package/src/plugins/build-manifest.ts +69 -6
- package/src/plugins/build-report.ts +16 -25
- package/src/plugins/client-chunks.ts +65 -0
- package/src/plugins/cloudflare-wasm.ts +103 -0
- package/src/plugins/content.ts +1 -1
- package/src/plugins/dev-server.ts +179 -37
- package/src/plugins/entries.ts +111 -8
- package/src/plugins/fonts.ts +165 -654
- package/src/plugins/mdx.ts +47 -10
- package/src/plugins/routing.ts +386 -47
- package/src/plugins/server-bundle.ts +59 -3
- package/src/plugins/shims.ts +136 -35
- package/src/plugins/static-build.ts +15 -89
- package/src/routing/codegen-shared.ts +115 -0
- package/src/routing/codegen-types.ts +61 -0
- package/src/routing/codegen.ts +321 -177
- package/src/routing/convention-lint.ts +357 -0
- package/src/routing/index.ts +10 -1
- package/src/routing/interception.ts +1 -1
- package/src/routing/link-codegen.ts +308 -0
- package/src/routing/scanner.ts +165 -110
- package/src/routing/schema-validation.ts +149 -0
- 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 +309 -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 +14 -23
- package/src/server/als-registry.ts +108 -20
- package/src/server/asset-headers.ts +8 -34
- package/src/server/build-manifest.ts +17 -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 +32 -51
- 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 +101 -5
- 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 +182 -0
- package/src/server/logger.ts +67 -36
- package/src/server/metadata-routes.ts +44 -19
- 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 +31 -18
- package/src/server/pipeline-metadata.ts +13 -0
- package/src/server/pipeline-outcome.ts +197 -0
- package/src/server/pipeline-phases.ts +497 -0
- package/src/server/pipeline.ts +194 -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 -337
- package/src/server/route-element-builder.ts +435 -208
- package/src/server/route-handler.ts +24 -4
- package/src/server/route-matcher.ts +128 -277
- 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 +315 -89
- package/src/server/rsc-entry/helpers.ts +155 -26
- package/src/server/rsc-entry/index.ts +316 -327
- package/src/server/rsc-entry/render-route.ts +313 -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 +18 -5
- package/src/server/rsc-entry/ssr-renderer.ts +195 -41
- 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-bridge-types.ts +124 -0
- package/src/server/ssr-entry.ts +217 -78
- package/src/server/ssr-render.ts +344 -71
- package/src/server/ssr-wrappers.tsx +139 -0
- package/src/server/state-tree-diff.ts +30 -23
- 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 +210 -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/metadata-routes-Cjmvi3rQ.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/segment-merger.d.ts +0 -119
- package/dist/client/segment-merger.d.ts.map +0 -1
- package/dist/client/transition-root.d.ts.map +0 -1
- package/dist/client/use-navigation-pending.d.ts +0 -26
- 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/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/segment-merger.ts +0 -339
- package/src/client/transition-root.tsx +0 -166
- package/src/client/use-navigation-pending.ts +0 -38
- 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/utils/directive-parser.ts +0 -529
- /package/src/{server/dev-logger.ts → dev-tools/logger.ts} +0 -0
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Port resolution for the dev server, Vite preview, and the Node
|
|
3
|
+
* production preview server.
|
|
4
|
+
*
|
|
5
|
+
* Behavior (see TIM-842):
|
|
6
|
+
*
|
|
7
|
+
* 1. Default port is **3000** for both dev and prod.
|
|
8
|
+
* 2. If the user did NOT set an explicit port, auto-bump from 3000
|
|
9
|
+
* until a free port is found (3000 → 3001 → 3002 → …).
|
|
10
|
+
* 3. If the user DID set an explicit port (via `--port`, `PORT` env
|
|
11
|
+
* var, or `vite.config.ts` `server.port`), use it as-is and let
|
|
12
|
+
* the bind fail loudly on conflict (`strictPort: true`).
|
|
13
|
+
*
|
|
14
|
+
* The port-bump probe is performed by binding the **actual** server
|
|
15
|
+
* (e.g. the dev holding server) — not a throwaway probe — so there is
|
|
16
|
+
* no time-of-check / time-of-use race between probing and listening.
|
|
17
|
+
*
|
|
18
|
+
* Design doc: 21-dev-server.md §"Default Port and Auto-Bump".
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
/** Default port used by `timber dev` and `timber preview`. */
|
|
22
|
+
export const DEFAULT_PORT = 3000;
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* A function that attempts to bind to a given port.
|
|
26
|
+
*
|
|
27
|
+
* Resolves with the bound port on success. Rejects with an error
|
|
28
|
+
* (typically with `code === 'EADDRINUSE'`) on failure.
|
|
29
|
+
*/
|
|
30
|
+
export type ListenFn = (port: number) => Promise<number>;
|
|
31
|
+
|
|
32
|
+
// ── Pure resolution ────────────────────────────────────────────────────
|
|
33
|
+
|
|
34
|
+
export interface ResolvePortInput {
|
|
35
|
+
/**
|
|
36
|
+
* Port read from `vite.config.ts` `server.port` or the `--port` CLI
|
|
37
|
+
* flag (Vite merges `--port` into `userConfig.server.port` before
|
|
38
|
+
* plugins see it).
|
|
39
|
+
*/
|
|
40
|
+
configPort?: number | undefined;
|
|
41
|
+
/** Raw value of `process.env.PORT`. */
|
|
42
|
+
envPort?: string | undefined;
|
|
43
|
+
/** Default port to use when neither `configPort` nor `envPort` is set. */
|
|
44
|
+
defaultPort?: number;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export interface ResolvedPortInput {
|
|
48
|
+
/** Port to start binding from. */
|
|
49
|
+
port: number;
|
|
50
|
+
/**
|
|
51
|
+
* `true` if the port came from an explicit user override (config or
|
|
52
|
+
* env). When `true`, callers must NOT auto-bump and must surface
|
|
53
|
+
* `EADDRINUSE` to the user.
|
|
54
|
+
*/
|
|
55
|
+
explicit: boolean;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Pure: compute the starting port from config / env / defaults.
|
|
60
|
+
*
|
|
61
|
+
* Performs no I/O — pair with {@link bindWithBump} to actually listen.
|
|
62
|
+
*/
|
|
63
|
+
export function resolveStartPort(input: ResolvePortInput): ResolvedPortInput {
|
|
64
|
+
const defaultPort = input.defaultPort ?? DEFAULT_PORT;
|
|
65
|
+
|
|
66
|
+
// `configPort` wins over `envPort`. This matches Vite's behavior:
|
|
67
|
+
// `vite --port 4000` overrides `PORT=5000` in the environment.
|
|
68
|
+
if (typeof input.configPort === 'number' && Number.isFinite(input.configPort)) {
|
|
69
|
+
return { port: input.configPort, explicit: true };
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
if (input.envPort != null && input.envPort !== '') {
|
|
73
|
+
const parsed = Number(input.envPort);
|
|
74
|
+
if (Number.isFinite(parsed) && parsed > 0) {
|
|
75
|
+
return { port: parsed, explicit: true };
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
return { port: defaultPort, explicit: false };
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// ── Bind with auto-bump ────────────────────────────────────────────────
|
|
83
|
+
|
|
84
|
+
export interface BindWithBumpOptions {
|
|
85
|
+
/** First port to attempt. */
|
|
86
|
+
startPort: number;
|
|
87
|
+
/**
|
|
88
|
+
* If `true`, increment the port and retry on `EADDRINUSE`. If
|
|
89
|
+
* `false`, attempt once and let the error propagate.
|
|
90
|
+
*/
|
|
91
|
+
autoBump: boolean;
|
|
92
|
+
/** Maximum number of port attempts when `autoBump` is `true`. */
|
|
93
|
+
maxAttempts?: number;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
export interface BindWithBumpResult {
|
|
97
|
+
/** Port that was actually bound. */
|
|
98
|
+
port: number;
|
|
99
|
+
/** `true` if the bound port differs from `startPort`. */
|
|
100
|
+
bumped: boolean;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Bind a server starting at `startPort`, optionally bumping the port
|
|
105
|
+
* on `EADDRINUSE` until a free one is found.
|
|
106
|
+
*
|
|
107
|
+
* Use this with the actual server you intend to keep listening (e.g.
|
|
108
|
+
* the dev holding server). Pairing the probe with the real listen
|
|
109
|
+
* eliminates the TOCTOU race that a throwaway probe would introduce.
|
|
110
|
+
*/
|
|
111
|
+
export async function bindWithBump(
|
|
112
|
+
listen: ListenFn,
|
|
113
|
+
options: BindWithBumpOptions
|
|
114
|
+
): Promise<BindWithBumpResult> {
|
|
115
|
+
const maxAttempts = options.autoBump ? (options.maxAttempts ?? 100) : 1;
|
|
116
|
+
let lastErr: unknown = null;
|
|
117
|
+
|
|
118
|
+
for (let i = 0; i < maxAttempts; i++) {
|
|
119
|
+
const port = options.startPort + i;
|
|
120
|
+
try {
|
|
121
|
+
const bound = await listen(port);
|
|
122
|
+
return { port: bound, bumped: i > 0 };
|
|
123
|
+
} catch (err) {
|
|
124
|
+
lastErr = err;
|
|
125
|
+
// Only retry on EADDRINUSE — other errors (EACCES, etc.) are
|
|
126
|
+
// permanent and must surface immediately.
|
|
127
|
+
if (!isAddrInUse(err)) throw err;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
throw lastErr ?? new Error(`Could not bind to a free port starting at ${options.startPort}`);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/** True if `err` is a Node `EADDRINUSE` error from `server.listen()`. */
|
|
135
|
+
export function isAddrInUse(err: unknown): boolean {
|
|
136
|
+
return (
|
|
137
|
+
typeof err === 'object' && err !== null && (err as { code?: string }).code === 'EADDRINUSE'
|
|
138
|
+
);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
// ── High-level helper used by the rootSync plugin ────────────────────
|
|
142
|
+
|
|
143
|
+
export interface StartDevServerPortInput {
|
|
144
|
+
/** Resolved port from `userConfig.server?.port` (or `--port`), or undefined. */
|
|
145
|
+
configPort: number | undefined;
|
|
146
|
+
/** Raw `process.env.PORT` value. */
|
|
147
|
+
envPort: string | undefined;
|
|
148
|
+
/** ListenFn for the holding server (or any pre-bind probe target). */
|
|
149
|
+
listen: ListenFn;
|
|
150
|
+
/** Logger — defaults to `console`. Injected for tests. */
|
|
151
|
+
log?: (msg: string) => void;
|
|
152
|
+
warn?: (msg: string) => void;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
export interface StartDevServerPortResult {
|
|
156
|
+
/** Port chosen for both the holding server and Vite's dev server. */
|
|
157
|
+
port: number;
|
|
158
|
+
/** True if the user explicitly set the port (=> Vite must `strictPort: true`). */
|
|
159
|
+
explicit: boolean;
|
|
160
|
+
/** True if the holding server actually bound the port. */
|
|
161
|
+
bound: boolean;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* Run the full dev-server port resolution + holding-server bind sequence.
|
|
166
|
+
*
|
|
167
|
+
* Resolves the port from config / env / default, attempts to bind the
|
|
168
|
+
* holding server (auto-bumping when the port came from the default),
|
|
169
|
+
* and logs the chosen URL. On a clean failure for an explicit port, it
|
|
170
|
+
* warns and falls back to the requested port so Vite can surface the
|
|
171
|
+
* conflict via `strictPort: true`.
|
|
172
|
+
*
|
|
173
|
+
* Extracted from `index.ts` so the rootSync `config()` hook stays
|
|
174
|
+
* focused on plugin assembly.
|
|
175
|
+
*/
|
|
176
|
+
export async function startDevServerPort(
|
|
177
|
+
input: StartDevServerPortInput
|
|
178
|
+
): Promise<StartDevServerPortResult> {
|
|
179
|
+
const log = input.log ?? ((msg: string) => console.log(msg));
|
|
180
|
+
const warn = input.warn ?? ((msg: string) => console.warn(msg));
|
|
181
|
+
|
|
182
|
+
const start = resolveStartPort({
|
|
183
|
+
configPort: input.configPort,
|
|
184
|
+
envPort: input.envPort,
|
|
185
|
+
defaultPort: DEFAULT_PORT,
|
|
186
|
+
});
|
|
187
|
+
|
|
188
|
+
try {
|
|
189
|
+
const result = await bindWithBump(input.listen, {
|
|
190
|
+
startPort: start.port,
|
|
191
|
+
autoBump: !start.explicit,
|
|
192
|
+
});
|
|
193
|
+
if (result.bumped) {
|
|
194
|
+
log(`\n \x1b[33m[timber]\x1b[0m Port ${start.port} in use, using ${result.port}\n`);
|
|
195
|
+
}
|
|
196
|
+
log(
|
|
197
|
+
`\n \x1b[2m\u{1FAB5} timber.js dev server starting at\x1b[0m ` +
|
|
198
|
+
`\x1b[36mhttp://localhost:${result.port}\x1b[0m\n`
|
|
199
|
+
);
|
|
200
|
+
return { port: result.port, explicit: start.explicit, bound: true };
|
|
201
|
+
} catch (err) {
|
|
202
|
+
// Holding server failed to bind. For explicit ports we leave the
|
|
203
|
+
// bound state false and let Vite fail loudly via strictPort: true.
|
|
204
|
+
// For implicit ports this is essentially unreachable (auto-bump
|
|
205
|
+
// tries 100 ports), but if we hit it we still want Vite to surface
|
|
206
|
+
// the error.
|
|
207
|
+
if (start.explicit && isAddrInUse(err)) {
|
|
208
|
+
warn(
|
|
209
|
+
`\n \x1b[33m[timber]\x1b[0m Port ${start.port} is already in use. ` +
|
|
210
|
+
`Set PORT (or remove the override) to pick another port.\n`
|
|
211
|
+
);
|
|
212
|
+
}
|
|
213
|
+
return { port: start.port, explicit: start.explicit, bound: false };
|
|
214
|
+
}
|
|
215
|
+
}
|
package/src/server/primitives.ts
CHANGED
|
@@ -6,6 +6,8 @@
|
|
|
6
6
|
import type { JsonSerializable } from './types.js';
|
|
7
7
|
import { getWaitUntil as _getWaitUntil } from './waituntil-bridge.js';
|
|
8
8
|
import { isDebug } from './debug.js';
|
|
9
|
+
import { getRequestSearchString } from './request-context.js';
|
|
10
|
+
import { mergePreservedSearchParams } from '../shared/merge-search-params.js';
|
|
9
11
|
|
|
10
12
|
// ─── Dev-mode validation ────────────────────────────────────────────────────
|
|
11
13
|
|
|
@@ -143,37 +145,65 @@ export class DenySignal extends Error {
|
|
|
143
145
|
}
|
|
144
146
|
}
|
|
145
147
|
|
|
148
|
+
/** Options for deny() when using the object form. */
|
|
149
|
+
export interface DenyOptions {
|
|
150
|
+
/** HTTP status code (4xx or 5xx). Default: 403. */
|
|
151
|
+
status?: number;
|
|
152
|
+
/** Human-readable message (logged server-side, not sent to client). */
|
|
153
|
+
message?: string;
|
|
154
|
+
/** JSON-serializable data passed as `dangerouslyPassData` prop to status-code files. */
|
|
155
|
+
data?: JsonSerializable;
|
|
156
|
+
}
|
|
157
|
+
|
|
146
158
|
/**
|
|
147
|
-
* Universal denial primitive. Throws a `DenySignal` that the framework catches.
|
|
159
|
+
* Universal denial/error primitive. Throws a `DenySignal` that the framework catches.
|
|
148
160
|
*
|
|
149
161
|
* - In segment context (outside Suspense): produces HTTP status code
|
|
150
162
|
* - In slot context: graceful degradation → denied.tsx → default.tsx → null
|
|
151
163
|
* - Inside Suspense (hold window): promoted to pre-flush behavior
|
|
152
164
|
* - Inside Suspense (after flush): error boundary + noindex meta
|
|
153
165
|
*
|
|
154
|
-
*
|
|
155
|
-
*
|
|
166
|
+
* Supports both positional and object signatures:
|
|
167
|
+
* ```ts
|
|
168
|
+
* deny() // 403 (default)
|
|
169
|
+
* deny(404) // 404
|
|
170
|
+
* deny(503, { retry: true }) // 503 with data
|
|
171
|
+
* deny({ status: 503, message: 'Maintenance' }) // object form
|
|
172
|
+
* ```
|
|
173
|
+
*
|
|
174
|
+
* Accepts any 4xx or 5xx status code. This replaces the need for
|
|
175
|
+
* `throw new RenderError(...)` in user code — RenderError is now an
|
|
176
|
+
* internal pipeline detail.
|
|
177
|
+
*
|
|
178
|
+
* @param statusOrOptions - Status code (number) or options object. Default: 403.
|
|
179
|
+
* @param data - Optional JSON-serializable data (positional form only).
|
|
156
180
|
*/
|
|
157
|
-
export function deny(
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
181
|
+
export function deny(statusOrOptions?: number | DenyOptions, data?: JsonSerializable): never {
|
|
182
|
+
let status: number;
|
|
183
|
+
let resolvedData: JsonSerializable | undefined;
|
|
184
|
+
|
|
185
|
+
if (typeof statusOrOptions === 'object' && statusOrOptions !== null) {
|
|
186
|
+
status = statusOrOptions.status ?? 403;
|
|
187
|
+
resolvedData = statusOrOptions.data;
|
|
188
|
+
} else {
|
|
189
|
+
status = statusOrOptions ?? 403;
|
|
190
|
+
resolvedData = data;
|
|
163
191
|
}
|
|
164
|
-
|
|
165
|
-
|
|
192
|
+
|
|
193
|
+
if (status < 400 || status > 599) {
|
|
194
|
+
throw new Error(`deny() requires a 4xx or 5xx status code, got ${status}.`);
|
|
195
|
+
}
|
|
196
|
+
warnIfNotSerializable(resolvedData, 'deny()');
|
|
197
|
+
throw new DenySignal(status, resolvedData);
|
|
166
198
|
}
|
|
167
199
|
|
|
168
200
|
/**
|
|
169
|
-
*
|
|
170
|
-
*
|
|
171
|
-
*
|
|
172
|
-
* call `notFound()` from `next/navigation` get the same behavior as
|
|
173
|
-
* `deny(404)` in timber.
|
|
201
|
+
* @deprecated Use `deny(404)` instead.
|
|
202
|
+
* Kept for internal use by the Next.js shim layer.
|
|
203
|
+
* @internal
|
|
174
204
|
*/
|
|
175
205
|
export function notFound(): never {
|
|
176
|
-
|
|
206
|
+
deny(404);
|
|
177
207
|
}
|
|
178
208
|
|
|
179
209
|
/**
|
|
@@ -209,14 +239,63 @@ export class RedirectSignal extends Error {
|
|
|
209
239
|
/** Pattern matching absolute URLs: http(s):// or protocol-relative // */
|
|
210
240
|
const ABSOLUTE_URL_RE = /^(?:[a-zA-Z][a-zA-Z\d+\-.]*:|\/\/)/;
|
|
211
241
|
|
|
242
|
+
/**
|
|
243
|
+
* Options for redirect() — alternative to passing a bare status code.
|
|
244
|
+
*/
|
|
245
|
+
export interface RedirectOptions {
|
|
246
|
+
/** HTTP redirect status code (3xx). Defaults to 302 (or 308 when `permanent: true`). */
|
|
247
|
+
status?: number;
|
|
248
|
+
/**
|
|
249
|
+
* When true, defaults the status to 308 (Permanent Redirect, preserves HTTP method).
|
|
250
|
+
* If `status` is also provided, `status` takes precedence.
|
|
251
|
+
*
|
|
252
|
+
* @example
|
|
253
|
+
* redirect('/new-path', { permanent: true }); // 308
|
|
254
|
+
* redirect('/new-path', { permanent: true, status: 301 }); // 301
|
|
255
|
+
*/
|
|
256
|
+
permanent?: boolean;
|
|
257
|
+
/**
|
|
258
|
+
* Preserve search params from the current request URL on the redirect target.
|
|
259
|
+
*
|
|
260
|
+
* - `true` — preserve ALL current search params (target params take precedence)
|
|
261
|
+
* - `string[]` — preserve only the named params (e.g. `['private', 'token']`)
|
|
262
|
+
*
|
|
263
|
+
* Target path's own query params always take precedence over preserved ones.
|
|
264
|
+
*/
|
|
265
|
+
preserveSearchParams?: true | string[];
|
|
266
|
+
}
|
|
267
|
+
|
|
212
268
|
/**
|
|
213
269
|
* Redirect to a relative path. Rejects absolute and protocol-relative URLs.
|
|
214
270
|
* Use `redirectExternal()` for external redirects with an allow-list.
|
|
215
271
|
*
|
|
216
272
|
* @param path - Relative path (e.g. '/login', 'settings', '/login?returnTo=/dash')
|
|
217
|
-
* @param
|
|
273
|
+
* @param statusOrOptions - HTTP status code (3xx, default 302) or options object.
|
|
274
|
+
*
|
|
275
|
+
* @example
|
|
276
|
+
* // Simple redirect
|
|
277
|
+
* redirect('/login');
|
|
278
|
+
*
|
|
279
|
+
* // With status code
|
|
280
|
+
* redirect('/login', 301);
|
|
281
|
+
*
|
|
282
|
+
* // With preserved search params
|
|
283
|
+
* redirect(`/docs/${version}/${slug}`, { preserveSearchParams: ['foo'] });
|
|
218
284
|
*/
|
|
219
|
-
export function redirect(path: string,
|
|
285
|
+
export function redirect(path: string, statusOrOptions?: number | RedirectOptions): never {
|
|
286
|
+
let status: number;
|
|
287
|
+
let preserveSearchParams: true | string[] | undefined;
|
|
288
|
+
|
|
289
|
+
if (typeof statusOrOptions === 'number') {
|
|
290
|
+
status = statusOrOptions;
|
|
291
|
+
} else if (statusOrOptions) {
|
|
292
|
+
// Explicit status wins. Otherwise permanent: true → 308, default → 302.
|
|
293
|
+
status = statusOrOptions.status ?? (statusOrOptions.permanent ? 308 : 302);
|
|
294
|
+
preserveSearchParams = statusOrOptions.preserveSearchParams;
|
|
295
|
+
} else {
|
|
296
|
+
status = 302;
|
|
297
|
+
}
|
|
298
|
+
|
|
220
299
|
if (status < 300 || status > 399) {
|
|
221
300
|
throw new Error(`redirect() requires a 3xx status code, got ${status}.`);
|
|
222
301
|
}
|
|
@@ -226,19 +305,23 @@ export function redirect(path: string, status: number = 302): never {
|
|
|
226
305
|
'Use redirectExternal(url, allowList) for external redirects.'
|
|
227
306
|
);
|
|
228
307
|
}
|
|
229
|
-
|
|
308
|
+
|
|
309
|
+
let resolvedPath = path;
|
|
310
|
+
if (preserveSearchParams) {
|
|
311
|
+
const currentSearch = getRequestSearchString();
|
|
312
|
+
resolvedPath = mergePreservedSearchParams(path, currentSearch, preserveSearchParams);
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
throw new RedirectSignal(resolvedPath, status);
|
|
230
316
|
}
|
|
231
317
|
|
|
232
318
|
/**
|
|
233
|
-
*
|
|
234
|
-
*
|
|
235
|
-
*
|
|
236
|
-
* will replay POST requests to the new location. This matches Next.js behavior.
|
|
237
|
-
*
|
|
238
|
-
* @param path - Relative path (e.g. '/new-page', '/dashboard')
|
|
319
|
+
* @deprecated Use `redirect(path, { permanent: true })` instead.
|
|
320
|
+
* Kept for internal use by the Next.js shim layer.
|
|
321
|
+
* @internal
|
|
239
322
|
*/
|
|
240
|
-
export function permanentRedirect(path: string): never {
|
|
241
|
-
redirect(path,
|
|
323
|
+
export function permanentRedirect(path: string, options?: Omit<RedirectOptions, 'status'>): never {
|
|
324
|
+
redirect(path, { permanent: true, ...options });
|
|
242
325
|
}
|
|
243
326
|
|
|
244
327
|
/**
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Render timeout utilities for SSR streaming pipeline.
|
|
3
|
+
*
|
|
4
|
+
* Provides a RenderTimeoutError class and a helper to create
|
|
5
|
+
* timeout-guarded AbortSignals. Used to defend against hung RSC
|
|
6
|
+
* streams and infinite SSR renders.
|
|
7
|
+
*
|
|
8
|
+
* Design doc: 02-rendering-pipeline.md §"Streaming Constraints"
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Error thrown when an SSR render or RSC stream read exceeds the
|
|
13
|
+
* configured timeout. Callers can check `instanceof RenderTimeoutError`
|
|
14
|
+
* to distinguish timeout from other errors and return a 504 or close
|
|
15
|
+
* the connection cleanly.
|
|
16
|
+
*/
|
|
17
|
+
export class RenderTimeoutError extends Error {
|
|
18
|
+
readonly timeoutMs: number;
|
|
19
|
+
|
|
20
|
+
constructor(timeoutMs: number, context?: string) {
|
|
21
|
+
const message = context
|
|
22
|
+
? `Render timeout after ${timeoutMs}ms: ${context}`
|
|
23
|
+
: `Render timeout after ${timeoutMs}ms`;
|
|
24
|
+
super(message);
|
|
25
|
+
this.name = 'RenderTimeoutError';
|
|
26
|
+
this.timeoutMs = timeoutMs;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Result of createRenderTimeout — an AbortSignal that fires after
|
|
32
|
+
* the given duration, plus a cancel function to clear the timer
|
|
33
|
+
* when the render completes normally.
|
|
34
|
+
*/
|
|
35
|
+
export interface RenderTimeout {
|
|
36
|
+
/** AbortSignal that aborts after timeoutMs. */
|
|
37
|
+
signal: AbortSignal;
|
|
38
|
+
/** Cancel the timeout timer. Call this when the render completes. */
|
|
39
|
+
cancel: () => void;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Create a render timeout that aborts after the given duration.
|
|
44
|
+
*
|
|
45
|
+
* Returns an AbortSignal and a cancel function. The signal fires
|
|
46
|
+
* with a RenderTimeoutError as the abort reason after `timeoutMs`.
|
|
47
|
+
* Call `cancel()` when the render completes to prevent the timeout
|
|
48
|
+
* from firing.
|
|
49
|
+
*
|
|
50
|
+
* If an existing `parentSignal` is provided, the returned signal
|
|
51
|
+
* aborts when either the parent signal or the timeout fires —
|
|
52
|
+
* whichever comes first.
|
|
53
|
+
*/
|
|
54
|
+
export function createRenderTimeout(timeoutMs: number, parentSignal?: AbortSignal): RenderTimeout {
|
|
55
|
+
const controller = new AbortController();
|
|
56
|
+
const reason = new RenderTimeoutError(timeoutMs, 'RSC stream read timed out');
|
|
57
|
+
|
|
58
|
+
const timer = setTimeout(() => controller.abort(reason), timeoutMs);
|
|
59
|
+
|
|
60
|
+
let onParentAbort: (() => void) | null = null;
|
|
61
|
+
|
|
62
|
+
if (parentSignal) {
|
|
63
|
+
if (parentSignal.aborted) {
|
|
64
|
+
clearTimeout(timer);
|
|
65
|
+
controller.abort(parentSignal.reason);
|
|
66
|
+
} else {
|
|
67
|
+
onParentAbort = () => {
|
|
68
|
+
clearTimeout(timer);
|
|
69
|
+
controller.abort(parentSignal.reason);
|
|
70
|
+
};
|
|
71
|
+
parentSignal.addEventListener('abort', onParentAbort, { once: true });
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
return {
|
|
76
|
+
signal: controller.signal,
|
|
77
|
+
cancel: () => {
|
|
78
|
+
clearTimeout(timer);
|
|
79
|
+
if (onParentAbort && parentSignal) {
|
|
80
|
+
parentSignal.removeEventListener('abort', onParentAbort);
|
|
81
|
+
onParentAbort = null;
|
|
82
|
+
}
|
|
83
|
+
},
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Race a promise against a timeout. Rejects with RenderTimeoutError
|
|
89
|
+
* if the promise does not resolve within `timeoutMs`.
|
|
90
|
+
*
|
|
91
|
+
* Used to guard individual `rscReader.read()` calls inside pullLoop.
|
|
92
|
+
*/
|
|
93
|
+
export function withTimeout<T>(
|
|
94
|
+
promise: Promise<T>,
|
|
95
|
+
timeoutMs: number,
|
|
96
|
+
context?: string
|
|
97
|
+
): Promise<T> {
|
|
98
|
+
let timer: ReturnType<typeof setTimeout>;
|
|
99
|
+
const timeoutPromise = new Promise<never>((_resolve, reject) => {
|
|
100
|
+
timer = setTimeout(() => {
|
|
101
|
+
reject(new RenderTimeoutError(timeoutMs, context));
|
|
102
|
+
}, timeoutMs);
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
return Promise.race([promise, timeoutPromise]).finally(() => {
|
|
106
|
+
clearTimeout(timer!);
|
|
107
|
+
});
|
|
108
|
+
}
|