@rangojs/router 0.0.0-experimental.bd6e11bc → 0.0.0-experimental.bdaf10aa
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/AGENTS.md +8 -4
- package/README.md +296 -887
- package/dist/bin/rango.js +459 -91
- package/dist/testing/vitest.js +36 -2
- package/dist/vite/index.js +1708 -414
- package/package.json +35 -10
- package/skills/api-client/SKILL.md +211 -0
- package/skills/breadcrumbs/SKILL.md +82 -5
- package/skills/bundle-analysis/SKILL.md +2 -2
- package/skills/cache-guide/SKILL.md +14 -9
- package/skills/caching/SKILL.md +221 -12
- package/skills/catalog.json +271 -0
- package/skills/comparison/SKILL.md +50 -0
- package/skills/comparison/agents/openai.yaml +4 -0
- package/skills/comparison/references/framework-comparison.md +837 -0
- package/skills/composability/SKILL.md +83 -2
- package/skills/css/SKILL.md +76 -0
- package/skills/debug-manifest/SKILL.md +5 -3
- package/skills/defer-hydration/SKILL.md +235 -0
- package/skills/document-cache/SKILL.md +11 -3
- package/skills/fonts/SKILL.md +1 -1
- package/skills/handler-use/SKILL.md +9 -9
- package/skills/hooks/SKILL.md +73 -900
- package/skills/hooks/data.md +273 -0
- package/skills/hooks/handle-and-actions.md +103 -0
- package/skills/hooks/navigation.md +110 -0
- package/skills/hooks/outlets.md +41 -0
- package/skills/hooks/state.md +228 -0
- package/skills/hooks/urls.md +135 -0
- package/skills/host-router/SKILL.md +84 -7
- package/skills/i18n/SKILL.md +1 -1
- package/skills/intercept/SKILL.md +51 -17
- package/skills/layout/SKILL.md +38 -16
- package/skills/links/SKILL.md +1 -1
- package/skills/loader/SKILL.md +48 -20
- package/skills/middleware/SKILL.md +11 -5
- package/skills/migrate-nextjs/SKILL.md +203 -20
- package/skills/migrate-react-router/SKILL.md +59 -675
- package/skills/migrate-react-router/cloudflare-workers.md +129 -0
- package/skills/migrate-react-router/component-migration.md +196 -0
- package/skills/migrate-react-router/data-and-actions.md +225 -0
- package/skills/migrate-react-router/route-mapping.md +271 -0
- package/skills/mime-routes/SKILL.md +3 -3
- package/skills/observability/SKILL.md +70 -5
- package/skills/parallel/SKILL.md +32 -8
- package/skills/ppr/SKILL.md +622 -0
- package/skills/prerender/SKILL.md +59 -28
- package/skills/rango/SKILL.md +124 -50
- package/skills/response-routes/SKILL.md +78 -46
- package/skills/route/SKILL.md +85 -6
- package/skills/router-setup/SKILL.md +41 -6
- package/skills/scripts/SKILL.md +179 -0
- package/skills/server-actions/SKILL.md +28 -3
- package/skills/shell-manifest/SKILL.md +185 -0
- package/skills/streams-and-websockets/SKILL.md +1 -1
- package/skills/tailwind/SKILL.md +28 -4
- package/skills/testing/SKILL.md +68 -654
- package/skills/testing/bindings.md +103 -0
- package/skills/testing/cache-prerender.md +127 -0
- package/skills/testing/client-components.md +124 -0
- package/skills/testing/e2e-parity.md +125 -0
- package/skills/testing/flight.md +91 -0
- package/skills/testing/handles.md +131 -0
- package/skills/testing/loader.md +128 -0
- package/skills/testing/middleware.md +99 -0
- package/skills/testing/render-handler.md +122 -0
- package/skills/testing/response-routes.md +95 -0
- package/skills/testing/reverse-and-types.md +85 -0
- package/skills/testing/server-actions.md +107 -0
- package/skills/testing/server-tree.md +128 -0
- package/skills/testing/setup.md +123 -0
- package/skills/theme/SKILL.md +1 -1
- package/skills/typesafety/SKILL.md +45 -918
- package/skills/typesafety/env-and-bindings.md +254 -0
- package/skills/typesafety/generated-files-and-cli.md +335 -0
- package/skills/typesafety/params-and-search.md +153 -0
- package/skills/typesafety/route-types.md +209 -0
- package/skills/use-cache/SKILL.md +47 -17
- package/skills/vercel/SKILL.md +128 -0
- package/skills/view-transitions/SKILL.md +44 -1
- package/src/__augment-tests__/augmented.check.ts +2 -3
- package/src/__internal.ts +0 -65
- package/src/browser/action-coordinator.ts +1 -1
- package/src/browser/action-fence.ts +47 -0
- package/src/browser/app-shell.ts +14 -27
- package/src/browser/connection-warmup.ts +134 -0
- package/src/browser/cookie-name.ts +140 -0
- package/src/browser/event-controller.ts +178 -100
- package/src/browser/invalidate-client-cache.ts +52 -0
- package/src/browser/logging.ts +28 -0
- package/src/browser/merge-segment-loaders.ts +6 -4
- package/src/browser/navigation-bridge.ts +81 -68
- package/src/browser/navigation-client.ts +115 -70
- package/src/browser/navigation-store-handle.ts +38 -0
- package/src/browser/navigation-store.ts +153 -88
- package/src/browser/navigation-transaction.ts +0 -32
- package/src/browser/network-error-handler.ts +34 -7
- package/src/browser/partial-update.ts +157 -144
- package/src/browser/prefetch/cache.ts +148 -81
- package/src/browser/prefetch/fetch.ts +231 -51
- package/src/browser/prefetch/queue.ts +25 -7
- package/src/browser/rango-state.ts +157 -115
- package/src/browser/react/Link.tsx +40 -7
- package/src/browser/react/NavigationProvider.tsx +140 -99
- package/src/browser/react/ScrollRestoration.tsx +10 -6
- package/src/browser/react/filter-segment-order.ts +17 -2
- package/src/browser/react/index.ts +0 -51
- package/src/browser/react/location-state-shared.ts +14 -15
- package/src/browser/react/location-state.ts +0 -1
- package/src/browser/react/use-action.ts +6 -15
- package/src/browser/react/use-handle.ts +0 -5
- package/src/browser/react/use-href.tsx +8 -1
- package/src/browser/react/use-link-status.ts +33 -8
- package/src/browser/react/use-navigation.ts +10 -5
- package/src/browser/react/use-params.ts +0 -2
- package/src/browser/react/use-router.ts +6 -4
- package/src/browser/react/use-search-params.ts +0 -5
- package/src/browser/react/use-segments.ts +0 -13
- package/src/browser/response-adapter.ts +74 -8
- package/src/browser/rsc-router.tsx +97 -22
- package/src/browser/scroll-restoration.ts +15 -8
- package/src/browser/segment-reconciler.ts +31 -21
- package/src/browser/server-action-bridge.ts +216 -38
- package/src/browser/types.ts +94 -22
- package/src/browser/validate-redirect-origin.ts +43 -16
- package/src/build/generate-manifest.ts +155 -131
- package/src/build/generate-route-types.ts +1 -1
- package/src/build/index.ts +11 -5
- package/src/build/prefix-tree-utils.ts +123 -0
- package/src/build/route-trie.ts +152 -22
- package/src/build/route-types/ast-route-extraction.ts +15 -8
- package/src/build/route-types/codegen.ts +12 -1
- package/src/build/route-types/include-resolution.ts +455 -61
- package/src/build/route-types/param-extraction.ts +6 -3
- package/src/build/route-types/per-module-writer.ts +15 -2
- package/src/build/route-types/router-processing.ts +77 -41
- package/src/build/route-types/source-scan.ts +105 -7
- package/src/build/runtime-discovery.ts +4 -1
- package/src/cache/cache-error.ts +104 -0
- package/src/cache/cache-key-utils.ts +58 -13
- package/src/cache/cache-policy.ts +108 -34
- package/src/cache/cache-runtime.ts +454 -101
- package/src/cache/cache-scope.ts +159 -54
- package/src/cache/cache-tag.ts +149 -0
- package/src/cache/cf/cf-base64.ts +33 -0
- package/src/cache/cf/cf-cache-constants.ts +127 -0
- package/src/cache/cf/cf-cache-store.ts +2170 -377
- package/src/cache/cf/cf-cache-types.ts +349 -0
- package/src/cache/cf/cf-kv-utils.ts +46 -0
- package/src/cache/cf/cf-tag-marker-memo.ts +105 -0
- package/src/cache/cf/index.ts +6 -16
- package/src/cache/document-cache.ts +126 -41
- package/src/cache/handle-snapshot.ts +70 -0
- package/src/cache/index.ts +23 -20
- package/src/cache/memory-segment-store.ts +243 -37
- package/src/cache/profile-registry.ts +46 -31
- package/src/cache/read-through-swr.ts +56 -12
- package/src/cache/segment-codec.ts +13 -21
- package/src/cache/shell-snapshot.ts +417 -0
- package/src/cache/tag-invalidation.ts +230 -0
- package/src/cache/types.ts +194 -99
- package/src/cache/vercel/index.ts +11 -0
- package/src/cache/vercel/vercel-cache-store.ts +1132 -0
- package/src/client.rsc.tsx +39 -22
- package/src/client.tsx +28 -58
- package/src/cloudflare/index.ts +11 -0
- package/src/cloudflare/tracing.ts +108 -0
- package/src/component-utils.ts +19 -0
- package/src/components/DefaultDocument.tsx +8 -2
- package/src/context-var.ts +13 -1
- package/src/decode-loader-results.ts +18 -2
- package/src/defer.ts +185 -0
- package/src/deps/ssr.ts +0 -1
- package/src/encode-kv.ts +49 -0
- package/src/errors.ts +0 -3
- package/src/escape-script.ts +52 -0
- package/src/handle.ts +57 -40
- package/src/handles/MetaTags.tsx +24 -53
- package/src/handles/Scripts.tsx +183 -0
- package/src/handles/breadcrumbs.ts +35 -8
- package/src/handles/deferred-resolution.ts +127 -0
- package/src/handles/is-thenable.ts +18 -0
- package/src/handles/meta.ts +14 -40
- package/src/handles/script.ts +244 -0
- package/src/host/cookie-handler.ts +9 -60
- package/src/host/errors.ts +13 -22
- package/src/host/index.ts +7 -0
- package/src/host/pattern-matcher.ts +23 -52
- package/src/host/router.ts +1 -65
- package/src/host/testing.ts +40 -27
- package/src/host/types.ts +6 -2
- package/src/href-client.ts +7 -12
- package/src/index.rsc.ts +88 -8
- package/src/index.ts +90 -16
- package/src/internal-debug.ts +11 -10
- package/src/loader.rsc.ts +19 -9
- package/src/loader.ts +12 -4
- package/src/outlet-provider.tsx +1 -5
- package/src/prerender/param-hash.ts +16 -16
- package/src/prerender/store.ts +32 -37
- package/src/prerender.ts +75 -7
- package/src/redirect-origin.ts +114 -0
- package/src/regex-escape.ts +8 -0
- package/src/render-error-thrower.tsx +20 -0
- package/src/response-utils.ts +25 -0
- package/src/root-error-boundary.tsx +1 -19
- package/src/route-content-wrapper.tsx +13 -49
- package/src/route-definition/dsl-helpers.ts +60 -53
- package/src/route-definition/helper-factories.ts +0 -2
- package/src/route-definition/helpers-types.ts +46 -46
- package/src/route-definition/index.ts +1 -2
- package/src/route-definition/redirect.ts +44 -11
- package/src/route-definition/resolve-handler-use.ts +6 -1
- package/src/route-definition/use-item-types.ts +3 -6
- package/src/route-map-builder.ts +41 -20
- package/src/route-types.ts +0 -5
- package/src/router/content-negotiation.ts +58 -23
- package/src/router/error-handling.ts +44 -17
- package/src/router/find-match.ts +129 -30
- package/src/router/handler-context.ts +6 -1
- package/src/router/instrument.ts +355 -0
- package/src/router/intercept-resolution.ts +35 -2
- package/src/router/lazy-includes.ts +79 -56
- package/src/router/loader-resolution.ts +151 -73
- package/src/router/logging.ts +0 -6
- package/src/router/manifest.ts +74 -40
- package/src/router/match-api.ts +76 -52
- package/src/router/match-context.ts +0 -22
- package/src/router/match-handlers.ts +181 -178
- package/src/router/match-middleware/background-revalidation.ts +40 -24
- package/src/router/match-middleware/cache-lookup.ts +115 -194
- package/src/router/match-middleware/cache-store.ts +61 -50
- package/src/router/match-middleware/intercept-resolution.ts +0 -22
- package/src/router/match-middleware/segment-resolution.ts +0 -22
- package/src/router/match-pipelines.ts +1 -42
- package/src/router/match-result.ts +36 -67
- package/src/router/metrics.ts +0 -34
- package/src/router/middleware-types.ts +0 -116
- package/src/router/middleware.ts +231 -120
- package/src/router/navigation-snapshot.ts +7 -56
- package/src/router/params-util.ts +23 -0
- package/src/router/parse-pattern.ts +115 -0
- package/src/router/pattern-matching.ts +99 -152
- package/src/router/prefetch-cache-ttl.ts +51 -0
- package/src/router/prefetch-limits.ts +37 -0
- package/src/router/prerender-match.ts +111 -66
- package/src/router/preview-match.ts +3 -1
- package/src/router/request-classification.ts +47 -42
- package/src/router/revalidation.ts +75 -81
- package/src/router/route-snapshot.ts +14 -3
- package/src/router/router-context.ts +6 -29
- package/src/router/router-interfaces.ts +70 -8
- package/src/router/router-options.ts +126 -4
- package/src/router/segment-resolution/fresh.ts +104 -80
- package/src/router/segment-resolution/helpers.ts +86 -6
- package/src/router/segment-resolution/loader-cache.ts +155 -39
- package/src/router/segment-resolution/loader-mask.ts +60 -0
- package/src/router/segment-resolution/loader-snapshot.ts +259 -0
- package/src/router/segment-resolution/mask-nested.ts +83 -0
- package/src/router/segment-resolution/revalidation.ts +215 -304
- package/src/router/segment-resolution/static-store.ts +19 -5
- package/src/router/segment-resolution/streamed-handler-telemetry.ts +52 -0
- package/src/router/segment-resolution/view-transition-default.ts +35 -15
- package/src/router/segment-resolution.ts +5 -1
- package/src/router/segment-wrappers.ts +6 -5
- package/src/router/state-cookie-name.ts +33 -0
- package/src/router/substitute-pattern-params.ts +54 -35
- package/src/router/telemetry-otel.ts +160 -200
- package/src/router/telemetry.ts +9 -23
- package/src/router/timeout.ts +0 -20
- package/src/router/tracing.ts +215 -0
- package/src/router/trie-matching.ts +171 -64
- package/src/router/types.ts +1 -63
- package/src/router/url-params.ts +13 -5
- package/src/router.ts +119 -48
- package/src/rsc/full-payload.ts +70 -0
- package/src/rsc/handler-context.ts +1 -0
- package/src/rsc/handler.ts +267 -152
- package/src/rsc/helpers.ts +78 -4
- package/src/rsc/index.ts +1 -4
- package/src/rsc/json-route-result.ts +38 -0
- package/src/rsc/loader-fetch.ts +114 -38
- package/src/rsc/manifest-init.ts +29 -42
- package/src/rsc/nonce.ts +10 -1
- package/src/rsc/origin-guard.ts +11 -15
- package/src/rsc/progressive-enhancement.ts +120 -13
- package/src/rsc/redirect-guard.ts +100 -0
- package/src/rsc/response-cache-serve.ts +238 -0
- package/src/rsc/response-error.ts +79 -12
- package/src/rsc/response-route-handler.ts +58 -141
- package/src/rsc/rsc-rendering.ts +492 -49
- package/src/rsc/runtime-warnings.ts +14 -0
- package/src/rsc/server-action.ts +268 -82
- package/src/rsc/shell-capture.ts +1190 -0
- package/src/rsc/shell-serve.ts +181 -0
- package/src/rsc/transition-gate.ts +89 -0
- package/src/rsc/types.ts +45 -3
- package/src/runtime-env.ts +18 -0
- package/src/search-params.ts +31 -26
- package/src/segment-loader-promise.ts +49 -4
- package/src/segment-system.tsx +260 -95
- package/src/server/context.ts +99 -9
- package/src/server/cookie-parse.ts +32 -0
- package/src/server/cookie-store.ts +125 -2
- package/src/server/handle-store.ts +21 -38
- package/src/server/loader-registry.ts +33 -42
- package/src/server/request-context.ts +379 -138
- package/src/ssr/index.tsx +491 -182
- package/src/ssr/inject-rsc-eager.ts +167 -0
- package/src/ssr/ssr-root.tsx +228 -0
- package/src/static-handler.ts +10 -13
- package/src/testing/cache-status.ts +44 -48
- package/src/testing/collect-handle.ts +14 -31
- package/src/testing/dispatch.ts +533 -160
- package/src/testing/e2e/fixture.ts +45 -11
- package/src/testing/e2e/index.ts +1 -22
- package/src/testing/e2e/matchers.ts +0 -16
- package/src/testing/e2e/parity.ts +85 -4
- package/src/testing/e2e/server.ts +12 -0
- package/src/testing/flight-matchers.ts +7 -14
- package/src/testing/flight-normalize.ts +11 -0
- package/src/testing/flight-runtime.d.ts +36 -0
- package/src/testing/flight-tree.ts +682 -0
- package/src/testing/flight.entry.ts +30 -0
- package/src/testing/flight.ts +145 -70
- package/src/testing/generated-routes.ts +26 -50
- package/src/testing/index.ts +18 -19
- package/src/testing/internal/context.ts +184 -68
- package/src/testing/internal/flight-client-globals.ts +30 -0
- package/src/testing/internal/seed-vars.ts +54 -0
- package/src/testing/render-handler.ts +357 -0
- package/src/testing/render-route.tsx +134 -115
- package/src/testing/run-loader.ts +140 -51
- package/src/testing/run-middleware.ts +59 -33
- package/src/testing/run-transition-when.ts +164 -0
- package/src/testing/vitest-stubs/cloudflare-email.ts +1 -1
- package/src/testing/vitest-stubs/cloudflare-workers.ts +1 -1
- package/src/testing/vitest.ts +138 -16
- package/src/theme/ThemeProvider.tsx +56 -84
- package/src/theme/ThemeScript.tsx +7 -9
- package/src/theme/constants.ts +52 -13
- package/src/theme/index.ts +0 -7
- package/src/theme/theme-context.ts +1 -5
- package/src/theme/theme-script.ts +22 -21
- package/src/theme/use-theme.ts +0 -3
- package/src/types/boundaries.ts +0 -35
- package/src/types/cache-types.ts +13 -4
- package/src/types/error-types.ts +30 -90
- package/src/types/global-namespace.ts +15 -15
- package/src/types/handler-context.ts +45 -15
- package/src/types/index.ts +2 -10
- package/src/types/loader-types.ts +6 -3
- package/src/types/request-scope.ts +8 -22
- package/src/types/route-config.ts +20 -52
- package/src/types/route-entry.ts +0 -6
- package/src/types/segments.ts +100 -13
- package/src/urls/include-helper.ts +10 -12
- package/src/urls/include-provider.ts +71 -0
- package/src/urls/index.ts +2 -8
- package/src/urls/path-helper-types.ts +52 -14
- package/src/urls/path-helper.ts +5 -54
- package/src/urls/pattern-types.ts +36 -0
- package/src/urls/type-extraction.ts +76 -42
- package/src/urls/urls-function.ts +0 -14
- package/src/use-loader.tsx +0 -186
- package/src/vercel/index.ts +11 -0
- package/src/vercel/tracing.ts +88 -0
- package/src/vite/discovery/bundle-postprocess.ts +2 -1
- package/src/vite/discovery/dev-prerender-cache.ts +117 -0
- package/src/vite/discovery/discover-routers.ts +34 -43
- package/src/vite/discovery/discovery-errors.ts +61 -0
- package/src/vite/discovery/prerender-collection.ts +33 -46
- package/src/vite/discovery/state.ts +12 -1
- package/src/vite/discovery/virtual-module-codegen.ts +1 -11
- package/src/vite/index.ts +9 -0
- package/src/vite/inject-client-debug.ts +88 -0
- package/src/vite/plugin-types.ts +143 -10
- package/src/vite/plugins/cjs-to-esm.ts +8 -12
- package/src/vite/plugins/client-ref-dedup.ts +0 -11
- package/src/vite/plugins/client-ref-hashing.ts +0 -10
- package/src/vite/plugins/cloudflare-protocol-stub.ts +0 -20
- package/src/vite/plugins/expose-action-id.ts +2 -73
- package/src/vite/plugins/expose-id-utils.ts +85 -56
- package/src/vite/plugins/expose-ids/export-analysis.ts +30 -43
- package/src/vite/plugins/expose-ids/handler-transform.ts +5 -31
- package/src/vite/plugins/expose-ids/loader-transform.ts +12 -20
- package/src/vite/plugins/expose-ids/router-transform.ts +98 -26
- package/src/vite/plugins/expose-internal-ids.ts +10 -1
- package/src/vite/plugins/performance-tracks.ts +0 -3
- package/src/vite/plugins/refresh-cmd.ts +1 -1
- package/src/vite/plugins/use-cache-transform.ts +21 -46
- package/src/vite/plugins/vercel-output.ts +384 -0
- package/src/vite/plugins/version-injector.ts +22 -27
- package/src/vite/plugins/version-plugin.ts +6 -66
- package/src/vite/plugins/virtual-entries.ts +137 -26
- package/src/vite/rango.ts +146 -135
- package/src/vite/router-discovery.ts +189 -48
- package/src/vite/utils/ast-handler-extract.ts +11 -20
- package/src/vite/utils/bundle-analysis.ts +6 -13
- package/src/vite/utils/client-chunks.ts +0 -6
- package/src/vite/utils/directive-prologue.ts +40 -0
- package/src/vite/utils/forward-user-plugins.ts +0 -22
- package/src/vite/utils/manifest-utils.ts +4 -75
- package/src/vite/utils/package-resolution.ts +1 -73
- package/src/vite/utils/prerender-utils.ts +71 -44
- package/src/vite/utils/shared-utils.ts +55 -37
- package/src/browser/react/use-client-cache.ts +0 -58
- package/src/browser/shallow.ts +0 -40
- package/src/handles/index.ts +0 -7
- package/src/network-error-thrower.tsx +0 -23
- package/src/router/middleware-cookies.ts +0 -55
|
@@ -41,6 +41,109 @@ import {
|
|
|
41
41
|
} from "./telemetry.js";
|
|
42
42
|
import { _getRequestContext } from "../server/request-context.js";
|
|
43
43
|
|
|
44
|
+
/**
|
|
45
|
+
* Per-call telemetry lifecycle emitter for match()/matchPartial(). Each method
|
|
46
|
+
* reproduces the exact event object the two functions used to emit inline and is
|
|
47
|
+
* gated on the same per-call flag (`enabled` = the request's `emitTelemetry`), so
|
|
48
|
+
* a PPR shell-capture run (enabled=false) emits nothing while a foreground run
|
|
49
|
+
* emits byte-identical events. Extracted so the two transactions can't drift;
|
|
50
|
+
* pinned by thrown-response-telemetry.test.ts and
|
|
51
|
+
* shell-capture-telemetry-suppression.test.ts.
|
|
52
|
+
*/
|
|
53
|
+
interface LifecycleEmitter {
|
|
54
|
+
start(): void;
|
|
55
|
+
end(segmentCount: number, cacheHit: boolean, status?: number): void;
|
|
56
|
+
cacheDecision(
|
|
57
|
+
routeKey: string,
|
|
58
|
+
state: {
|
|
59
|
+
cacheHit: boolean;
|
|
60
|
+
cacheSource?: "runtime" | "prerender";
|
|
61
|
+
shouldRevalidate?: boolean;
|
|
62
|
+
},
|
|
63
|
+
segments: CacheSegmentSignal[],
|
|
64
|
+
): void;
|
|
65
|
+
error(error: Error, phase: string): void;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function createLifecycleEmitter(args: {
|
|
69
|
+
enabled: boolean;
|
|
70
|
+
sink: TelemetrySink;
|
|
71
|
+
requestId: string | undefined;
|
|
72
|
+
method: string;
|
|
73
|
+
pathname: string;
|
|
74
|
+
transaction: "match" | "matchPartial";
|
|
75
|
+
isPartial: boolean;
|
|
76
|
+
matchStart: number;
|
|
77
|
+
}): LifecycleEmitter {
|
|
78
|
+
return {
|
|
79
|
+
start(): void {
|
|
80
|
+
if (!args.enabled) return;
|
|
81
|
+
safeEmit(args.sink, {
|
|
82
|
+
type: "request.start",
|
|
83
|
+
timestamp: args.matchStart,
|
|
84
|
+
requestId: args.requestId,
|
|
85
|
+
method: args.method,
|
|
86
|
+
pathname: args.pathname,
|
|
87
|
+
transaction: args.transaction,
|
|
88
|
+
isPartial: args.isPartial,
|
|
89
|
+
});
|
|
90
|
+
},
|
|
91
|
+
end(segmentCount: number, cacheHit: boolean, status?: number): void {
|
|
92
|
+
if (!args.enabled) return;
|
|
93
|
+
safeEmit(args.sink, {
|
|
94
|
+
type: "request.end",
|
|
95
|
+
timestamp: performance.now(),
|
|
96
|
+
requestId: args.requestId,
|
|
97
|
+
method: args.method,
|
|
98
|
+
pathname: args.pathname,
|
|
99
|
+
transaction: args.transaction,
|
|
100
|
+
durationMs: performance.now() - args.matchStart,
|
|
101
|
+
segmentCount,
|
|
102
|
+
cacheHit,
|
|
103
|
+
// Only a thrown-Response short-circuit passes a status; a normal render
|
|
104
|
+
// completion omits it (the Response is built after match()).
|
|
105
|
+
...(status !== undefined && { status }),
|
|
106
|
+
});
|
|
107
|
+
},
|
|
108
|
+
cacheDecision(
|
|
109
|
+
routeKey: string,
|
|
110
|
+
state: {
|
|
111
|
+
cacheHit: boolean;
|
|
112
|
+
cacheSource?: "runtime" | "prerender";
|
|
113
|
+
shouldRevalidate?: boolean;
|
|
114
|
+
},
|
|
115
|
+
segments: CacheSegmentSignal[],
|
|
116
|
+
): void {
|
|
117
|
+
if (!args.enabled) return;
|
|
118
|
+
safeEmit(args.sink, {
|
|
119
|
+
type: "cache.decision",
|
|
120
|
+
timestamp: performance.now(),
|
|
121
|
+
requestId: args.requestId,
|
|
122
|
+
pathname: args.pathname,
|
|
123
|
+
routeKey,
|
|
124
|
+
hit: state.cacheHit,
|
|
125
|
+
shouldRevalidate: !!state.shouldRevalidate,
|
|
126
|
+
source: state.cacheSource,
|
|
127
|
+
segments,
|
|
128
|
+
});
|
|
129
|
+
},
|
|
130
|
+
error(error: Error, phase: string): void {
|
|
131
|
+
if (!args.enabled) return;
|
|
132
|
+
safeEmit(args.sink, {
|
|
133
|
+
type: "request.error",
|
|
134
|
+
timestamp: performance.now(),
|
|
135
|
+
requestId: args.requestId,
|
|
136
|
+
method: args.method,
|
|
137
|
+
pathname: args.pathname,
|
|
138
|
+
transaction: args.transaction,
|
|
139
|
+
error,
|
|
140
|
+
phase,
|
|
141
|
+
durationMs: performance.now() - args.matchStart,
|
|
142
|
+
});
|
|
143
|
+
},
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
|
|
44
147
|
export interface MatchHandlerDeps<TEnv = any> {
|
|
45
148
|
buildRouterContext: () => RouterContext<TEnv>;
|
|
46
149
|
callOnError: (error: unknown, phase: ErrorPhase, context: any) => void;
|
|
@@ -89,20 +192,6 @@ export interface MatchHandlers<TEnv = any> {
|
|
|
89
192
|
negotiated?: boolean;
|
|
90
193
|
manifestEntry?: EntryData;
|
|
91
194
|
} | null>;
|
|
92
|
-
createMatchContextForFull: (
|
|
93
|
-
request: Request,
|
|
94
|
-
env: TEnv,
|
|
95
|
-
) => Promise<MatchContext<TEnv> | { type: "redirect"; redirectUrl: string }>;
|
|
96
|
-
createMatchContextForPartial: (
|
|
97
|
-
request: Request,
|
|
98
|
-
env: TEnv,
|
|
99
|
-
actionContext?: {
|
|
100
|
-
actionId?: string;
|
|
101
|
-
actionUrl?: URL;
|
|
102
|
-
actionResult?: any;
|
|
103
|
-
formData?: FormData;
|
|
104
|
-
},
|
|
105
|
-
) => Promise<MatchContext<TEnv> | null>;
|
|
106
195
|
}
|
|
107
196
|
|
|
108
197
|
/**
|
|
@@ -123,9 +212,6 @@ export function createMatchHandlers<TEnv = any>(
|
|
|
123
212
|
const hasTelemetry = !!deps.telemetry;
|
|
124
213
|
const telemetry = resolveSink(deps.telemetry);
|
|
125
214
|
const cacheSignalEnabled = !!deps.cacheSignalEnabled;
|
|
126
|
-
// Compute the coarse cache signal when EITHER telemetry needs it (for the
|
|
127
|
-
// cache.decision event) OR the debug header gate is on. When neither is set,
|
|
128
|
-
// this is never called — zero extra work on the hot path.
|
|
129
215
|
const buildSignal = (
|
|
130
216
|
routeKey: string,
|
|
131
217
|
state: {
|
|
@@ -134,8 +220,6 @@ export function createMatchHandlers<TEnv = any>(
|
|
|
134
220
|
shouldRevalidate?: boolean;
|
|
135
221
|
},
|
|
136
222
|
): CacheSegmentSignal[] => buildCacheSignalSegments(routeKey, state);
|
|
137
|
-
// Stash the signal on the request context for the response path to emit as
|
|
138
|
-
// the X-Rango-Cache header. Only when the debug gate is on.
|
|
139
223
|
const recordSignalIfEnabled = (segments: CacheSegmentSignal[]): void => {
|
|
140
224
|
if (!cacheSignalEnabled) return;
|
|
141
225
|
const reqCtx = _getRequestContext();
|
|
@@ -173,53 +257,44 @@ export function createMatchHandlers<TEnv = any>(
|
|
|
173
257
|
);
|
|
174
258
|
}
|
|
175
259
|
|
|
176
|
-
/**
|
|
177
|
-
* Match request and return segments (document/SSR requests)
|
|
178
|
-
*
|
|
179
|
-
* Uses generator middleware pipeline for clean separation of concerns:
|
|
180
|
-
* - cache-lookup: Check cache first
|
|
181
|
-
* - segment-resolution: Resolve segments on cache miss
|
|
182
|
-
* - cache-store: Store results in cache
|
|
183
|
-
* - background-revalidation: SWR revalidation
|
|
184
|
-
*/
|
|
185
260
|
async function match(request: Request, env: TEnv): Promise<MatchResult> {
|
|
186
|
-
|
|
261
|
+
// Silence telemetry for the PPR background shell capture: it re-runs match()
|
|
262
|
+
// under a derived request context flagged _shellCaptureRun (shell-capture.ts
|
|
263
|
+
// attemptCapture), re-using the foreground Request — a second request.start/
|
|
264
|
+
// cache.decision/request.end stamped with the same WeakMap-keyed requestId
|
|
265
|
+
// would double-count dashboards. Derived here (inside the capture's active
|
|
266
|
+
// request-context ALS) so the read sees the derived context, not module state.
|
|
267
|
+
const emitTelemetry =
|
|
268
|
+
hasTelemetry && !_getRequestContext()?._shellCaptureRun;
|
|
269
|
+
const requestId = emitTelemetry ? getRequestId(request) : undefined;
|
|
187
270
|
return runWithRouterLogContext({ request, transaction: "match" }, () => {
|
|
188
271
|
const routerCtx = buildRouterContext();
|
|
272
|
+
// Also mute in-pipeline observeEvent emitters (revalidation.decision,
|
|
273
|
+
// cache-lookup's cache.decision) which read routerCtx.telemetry.
|
|
274
|
+
if (!emitTelemetry) routerCtx.telemetry = undefined;
|
|
189
275
|
routerCtx.requestId = requestId;
|
|
190
276
|
return runWithRouterContext(routerCtx, async () =>
|
|
191
277
|
withRouterLogScope("match", async () => {
|
|
192
278
|
const matchStart = performance.now();
|
|
193
|
-
const pathname =
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
279
|
+
const pathname =
|
|
280
|
+
_getRequestContext()?.url?.pathname ??
|
|
281
|
+
new URL(request.url).pathname;
|
|
282
|
+
const emitter = createLifecycleEmitter({
|
|
283
|
+
enabled: emitTelemetry,
|
|
284
|
+
sink: telemetry,
|
|
285
|
+
requestId,
|
|
286
|
+
method: request.method,
|
|
287
|
+
pathname,
|
|
288
|
+
transaction: "match",
|
|
289
|
+
isPartial: false,
|
|
290
|
+
matchStart,
|
|
291
|
+
});
|
|
292
|
+
emitter.start();
|
|
205
293
|
|
|
206
294
|
const result = await createMatchContextForFull(request, env);
|
|
207
295
|
|
|
208
|
-
// Handle redirect case
|
|
209
296
|
if ("type" in result && result.type === "redirect") {
|
|
210
|
-
|
|
211
|
-
safeEmit(telemetry, {
|
|
212
|
-
type: "request.end",
|
|
213
|
-
timestamp: performance.now(),
|
|
214
|
-
requestId,
|
|
215
|
-
method: request.method,
|
|
216
|
-
pathname,
|
|
217
|
-
transaction: "match",
|
|
218
|
-
durationMs: performance.now() - matchStart,
|
|
219
|
-
segmentCount: 0,
|
|
220
|
-
cacheHit: false,
|
|
221
|
-
});
|
|
222
|
-
}
|
|
297
|
+
emitter.end(0, false);
|
|
223
298
|
return {
|
|
224
299
|
segments: [],
|
|
225
300
|
matched: [],
|
|
@@ -239,52 +314,26 @@ export function createMatchHandlers<TEnv = any>(
|
|
|
239
314
|
if (hasTelemetry || cacheSignalEnabled) {
|
|
240
315
|
const signalSegments = buildSignal(ctx.routeKey, state);
|
|
241
316
|
recordSignalIfEnabled(signalSegments);
|
|
242
|
-
|
|
243
|
-
safeEmit(telemetry, {
|
|
244
|
-
type: "cache.decision",
|
|
245
|
-
timestamp: performance.now(),
|
|
246
|
-
requestId,
|
|
247
|
-
pathname,
|
|
248
|
-
routeKey: ctx.routeKey,
|
|
249
|
-
hit: state.cacheHit,
|
|
250
|
-
shouldRevalidate: !!state.shouldRevalidate,
|
|
251
|
-
source: state.cacheSource,
|
|
252
|
-
segments: signalSegments,
|
|
253
|
-
});
|
|
254
|
-
}
|
|
255
|
-
}
|
|
256
|
-
if (hasTelemetry) {
|
|
257
|
-
safeEmit(telemetry, {
|
|
258
|
-
type: "request.end",
|
|
259
|
-
timestamp: performance.now(),
|
|
260
|
-
requestId,
|
|
261
|
-
method: request.method,
|
|
262
|
-
pathname,
|
|
263
|
-
transaction: "match",
|
|
264
|
-
durationMs: performance.now() - matchStart,
|
|
265
|
-
segmentCount: matchResult.segments.length,
|
|
266
|
-
cacheHit: state.cacheHit,
|
|
267
|
-
});
|
|
317
|
+
emitter.cacheDecision(ctx.routeKey, state, signalSegments);
|
|
268
318
|
}
|
|
319
|
+
emitter.end(matchResult.segments.length, state.cacheHit);
|
|
269
320
|
return matchResult;
|
|
270
321
|
} catch (error) {
|
|
271
|
-
if (
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
error: errorObj,
|
|
282
|
-
phase: error instanceof Response ? "redirect" : "routing",
|
|
283
|
-
durationMs: performance.now() - matchStart,
|
|
284
|
-
});
|
|
322
|
+
if (error instanceof Response) {
|
|
323
|
+
// A thrown Response (middleware short-circuit — redirect / auth
|
|
324
|
+
// gate) is a COMPLETED request from the consumer's seat, not an
|
|
325
|
+
// error: emit request.end (the same shape the non-thrown redirect
|
|
326
|
+
// result above already emits), never request.error with a
|
|
327
|
+
// synthetic "[object Response]" error. Rethrow so the caller
|
|
328
|
+
// drives the redirect. Carry the Response's status so a sink can
|
|
329
|
+
// tell a 3xx short-circuit from a 2xx completion.
|
|
330
|
+
emitter.end(0, false, error.status);
|
|
331
|
+
throw error;
|
|
285
332
|
}
|
|
286
|
-
|
|
287
|
-
|
|
333
|
+
emitter.error(
|
|
334
|
+
error instanceof Error ? error : new Error(String(error)),
|
|
335
|
+
"routing",
|
|
336
|
+
);
|
|
288
337
|
callOnError(error, "routing", {
|
|
289
338
|
request,
|
|
290
339
|
url: ctx.url,
|
|
@@ -319,42 +368,39 @@ export function createMatchHandlers<TEnv = any>(
|
|
|
319
368
|
);
|
|
320
369
|
}
|
|
321
370
|
|
|
322
|
-
/**
|
|
323
|
-
* Match partial request with revalidation
|
|
324
|
-
*
|
|
325
|
-
* Uses generator middleware pipeline for clean separation of concerns:
|
|
326
|
-
* - cache-lookup: Check cache first
|
|
327
|
-
* - segment-resolution: Resolve segments on cache miss
|
|
328
|
-
* - intercept-resolution: Handle intercept routes
|
|
329
|
-
* - cache-store: Store results in cache
|
|
330
|
-
* - background-revalidation: SWR revalidation
|
|
331
|
-
*/
|
|
332
371
|
async function matchPartial(
|
|
333
372
|
request: Request,
|
|
334
373
|
context: TEnv,
|
|
335
374
|
actionContext?: ActionContext,
|
|
336
375
|
): Promise<MatchResult | null> {
|
|
337
|
-
|
|
376
|
+
// See match() above: the PPR shell capture re-runs matchPartial() under a
|
|
377
|
+
// _shellCaptureRun context and must stay invisible to the sink.
|
|
378
|
+
const emitTelemetry =
|
|
379
|
+
hasTelemetry && !_getRequestContext()?._shellCaptureRun;
|
|
380
|
+
const partialRequestId = emitTelemetry ? getRequestId(request) : undefined;
|
|
338
381
|
return runWithRouterLogContext(
|
|
339
382
|
{ request, transaction: "matchPartial" },
|
|
340
383
|
() => {
|
|
341
384
|
const routerCtx = buildRouterContext();
|
|
385
|
+
if (!emitTelemetry) routerCtx.telemetry = undefined;
|
|
342
386
|
routerCtx.requestId = partialRequestId;
|
|
343
387
|
return runWithRouterContext(routerCtx, async () =>
|
|
344
388
|
withRouterLogScope("matchPartial", async () => {
|
|
345
389
|
const matchStart = performance.now();
|
|
346
|
-
const pathname =
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
390
|
+
const pathname =
|
|
391
|
+
_getRequestContext()?.url?.pathname ??
|
|
392
|
+
new URL(request.url).pathname;
|
|
393
|
+
const emitter = createLifecycleEmitter({
|
|
394
|
+
enabled: emitTelemetry,
|
|
395
|
+
sink: telemetry,
|
|
396
|
+
requestId: partialRequestId,
|
|
397
|
+
method: request.method,
|
|
398
|
+
pathname,
|
|
399
|
+
transaction: "matchPartial",
|
|
400
|
+
isPartial: true,
|
|
401
|
+
matchStart,
|
|
402
|
+
});
|
|
403
|
+
emitter.start();
|
|
358
404
|
|
|
359
405
|
const ctx = await createMatchContextForPartial(
|
|
360
406
|
request,
|
|
@@ -362,19 +408,7 @@ export function createMatchHandlers<TEnv = any>(
|
|
|
362
408
|
actionContext,
|
|
363
409
|
);
|
|
364
410
|
if (!ctx) {
|
|
365
|
-
|
|
366
|
-
safeEmit(telemetry, {
|
|
367
|
-
type: "request.end",
|
|
368
|
-
timestamp: performance.now(),
|
|
369
|
-
requestId: partialRequestId,
|
|
370
|
-
method: request.method,
|
|
371
|
-
pathname,
|
|
372
|
-
transaction: "matchPartial",
|
|
373
|
-
durationMs: performance.now() - matchStart,
|
|
374
|
-
segmentCount: 0,
|
|
375
|
-
cacheHit: false,
|
|
376
|
-
});
|
|
377
|
-
}
|
|
411
|
+
emitter.end(0, false);
|
|
378
412
|
return null;
|
|
379
413
|
}
|
|
380
414
|
|
|
@@ -401,54 +435,25 @@ export function createMatchHandlers<TEnv = any>(
|
|
|
401
435
|
if (hasTelemetry || cacheSignalEnabled) {
|
|
402
436
|
const signalSegments = buildSignal(ctx.routeKey, state);
|
|
403
437
|
recordSignalIfEnabled(signalSegments);
|
|
404
|
-
|
|
405
|
-
safeEmit(telemetry, {
|
|
406
|
-
type: "cache.decision",
|
|
407
|
-
timestamp: performance.now(),
|
|
408
|
-
requestId: partialRequestId,
|
|
409
|
-
pathname,
|
|
410
|
-
routeKey: ctx.routeKey,
|
|
411
|
-
hit: state.cacheHit,
|
|
412
|
-
shouldRevalidate: !!state.shouldRevalidate,
|
|
413
|
-
source: state.cacheSource,
|
|
414
|
-
segments: signalSegments,
|
|
415
|
-
});
|
|
416
|
-
}
|
|
417
|
-
}
|
|
418
|
-
if (hasTelemetry) {
|
|
419
|
-
safeEmit(telemetry, {
|
|
420
|
-
type: "request.end",
|
|
421
|
-
timestamp: performance.now(),
|
|
422
|
-
requestId: partialRequestId,
|
|
423
|
-
method: request.method,
|
|
424
|
-
pathname,
|
|
425
|
-
transaction: "matchPartial",
|
|
426
|
-
durationMs: performance.now() - matchStart,
|
|
427
|
-
segmentCount: matchResult.segments.length,
|
|
428
|
-
cacheHit: state.cacheHit,
|
|
429
|
-
});
|
|
438
|
+
emitter.cacheDecision(ctx.routeKey, state, signalSegments);
|
|
430
439
|
}
|
|
440
|
+
emitter.end(matchResult.segments.length, state.cacheHit);
|
|
431
441
|
return matchResult;
|
|
432
442
|
} catch (error) {
|
|
433
443
|
flushRevalidationTrace();
|
|
434
|
-
if (
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
method: request.method,
|
|
443
|
-
pathname,
|
|
444
|
-
transaction: "matchPartial",
|
|
445
|
-
error: errorObj,
|
|
446
|
-
phase: error instanceof Response ? "redirect" : phase,
|
|
447
|
-
durationMs: performance.now() - matchStart,
|
|
448
|
-
});
|
|
444
|
+
if (error instanceof Response) {
|
|
445
|
+
// A thrown Response (middleware short-circuit — redirect / auth
|
|
446
|
+
// gate) is a COMPLETED request, not an error: emit request.end
|
|
447
|
+
// (parity with match()), never request.error. Rethrow so the
|
|
448
|
+
// caller drives the redirect. Carry the Response's status so a
|
|
449
|
+
// sink can tell a 3xx short-circuit from a 2xx completion.
|
|
450
|
+
emitter.end(0, false, error.status);
|
|
451
|
+
throw error;
|
|
449
452
|
}
|
|
450
|
-
|
|
451
|
-
|
|
453
|
+
emitter.error(
|
|
454
|
+
error instanceof Error ? error : new Error(String(error)),
|
|
455
|
+
actionContext ? "action" : "revalidation",
|
|
456
|
+
);
|
|
452
457
|
callOnError(error, actionContext ? "action" : "revalidation", {
|
|
453
458
|
request,
|
|
454
459
|
url: ctx.url,
|
|
@@ -477,7 +482,5 @@ export function createMatchHandlers<TEnv = any>(
|
|
|
477
482
|
matchPartial: matchPartial,
|
|
478
483
|
matchError: matchError,
|
|
479
484
|
previewMatch: previewMatch,
|
|
480
|
-
createMatchContextForFull: createMatchContextForFull,
|
|
481
|
-
createMatchContextForPartial: createMatchContextForPartial,
|
|
482
485
|
};
|
|
483
486
|
}
|
|
@@ -105,6 +105,10 @@ import { getRouterContext } from "../router-context.js";
|
|
|
105
105
|
import type { GeneratorMiddleware } from "./cache-lookup.js";
|
|
106
106
|
import { debugLog, debugWarn, getOrCreateRequestId } from "../logging.js";
|
|
107
107
|
import { INTERNAL_RANGO_DEBUG } from "../../internal-debug.js";
|
|
108
|
+
import {
|
|
109
|
+
runWithRequestContext,
|
|
110
|
+
type RequestContext,
|
|
111
|
+
} from "../../server/request-context.js";
|
|
108
112
|
|
|
109
113
|
/**
|
|
110
114
|
* Creates background revalidation middleware
|
|
@@ -168,8 +172,6 @@ export function withBackgroundRevalidation<TEnv>(
|
|
|
168
172
|
requestCtx._handleStore = createHandleStore();
|
|
169
173
|
|
|
170
174
|
try {
|
|
171
|
-
// Create fresh handler context and loader promises to avoid
|
|
172
|
-
// reusing memoized results from the foreground pass
|
|
173
175
|
const freshHandlerContext = createHandlerContext(
|
|
174
176
|
ctx.matched.params,
|
|
175
177
|
ctx.request,
|
|
@@ -185,32 +187,46 @@ export function withBackgroundRevalidation<TEnv>(
|
|
|
185
187
|
const freshLoaderPromises = new Map<string, Promise<any>>();
|
|
186
188
|
setupLoaderAccess(freshHandlerContext, freshLoaderPromises);
|
|
187
189
|
|
|
188
|
-
//
|
|
189
|
-
//
|
|
190
|
-
//
|
|
191
|
-
//
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
ctx.
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
190
|
+
// Re-establish the request-context ALS around the re-render. ctx.Store
|
|
191
|
+
// is a different ALS (DSL build context); on workerd a waitUntil task
|
|
192
|
+
// runs detached from the request's I/O context, so a handler/component
|
|
193
|
+
// that reads the ambient getRequestContext() during this background
|
|
194
|
+
// re-render would otherwise throw "called outside of a request context".
|
|
195
|
+
const freshSegments = await runWithRequestContext(
|
|
196
|
+
requestCtx as RequestContext<TEnv>,
|
|
197
|
+
() =>
|
|
198
|
+
ctx.Store.run(() =>
|
|
199
|
+
resolveAllSegments(
|
|
200
|
+
ctx.entries,
|
|
201
|
+
ctx.routeKey,
|
|
202
|
+
ctx.matched.params,
|
|
203
|
+
freshHandlerContext,
|
|
204
|
+
freshLoaderPromises,
|
|
205
|
+
{ skipLoaders: true },
|
|
206
|
+
),
|
|
207
|
+
),
|
|
201
208
|
);
|
|
202
209
|
|
|
203
|
-
// Also resolve intercept segments fresh if applicable
|
|
204
210
|
let freshInterceptSegments: ResolvedSegment[] = [];
|
|
205
211
|
if (ctx.interceptResult) {
|
|
206
|
-
freshInterceptSegments = await
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
ctx.
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
212
|
+
freshInterceptSegments = await runWithRequestContext(
|
|
213
|
+
requestCtx as RequestContext<TEnv>,
|
|
214
|
+
() =>
|
|
215
|
+
ctx.Store.run(() =>
|
|
216
|
+
resolveInterceptEntry(
|
|
217
|
+
ctx.interceptResult!.intercept,
|
|
218
|
+
ctx.interceptResult!.entry,
|
|
219
|
+
ctx.matched.params,
|
|
220
|
+
freshHandlerContext,
|
|
221
|
+
true,
|
|
222
|
+
undefined,
|
|
223
|
+
// Skip intercept middleware: this is a post-response background
|
|
224
|
+
// re-render to refresh a stale cached route. The foreground
|
|
225
|
+
// already ran the middleware; re-running it would double its
|
|
226
|
+
// side effects and a short-circuit Response would abort the write.
|
|
227
|
+
{ skipMiddleware: true },
|
|
228
|
+
),
|
|
229
|
+
),
|
|
214
230
|
);
|
|
215
231
|
}
|
|
216
232
|
|