@rangojs/router 0.0.0-experimental.31 → 0.0.0-experimental.3232cd17
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 +4 -0
- package/README.md +198 -44
- package/dist/bin/rango.js +287 -105
- package/dist/testing/vitest.js +82 -0
- package/dist/vite/index.js +3248 -1117
- package/dist/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
- package/package.json +73 -21
- package/skills/api-client/SKILL.md +211 -0
- package/skills/breadcrumbs/SKILL.md +107 -1
- package/skills/bundle-analysis/SKILL.md +159 -0
- package/skills/cache-guide/SKILL.md +245 -21
- package/skills/caching/SKILL.md +302 -6
- package/skills/composability/SKILL.md +27 -2
- package/skills/css/SKILL.md +76 -0
- package/skills/document-cache/SKILL.md +78 -55
- package/skills/handler-use/SKILL.md +364 -0
- package/skills/hooks/SKILL.md +270 -30
- package/skills/host-router/SKILL.md +82 -22
- package/skills/i18n/SKILL.md +276 -0
- package/skills/intercept/SKILL.md +49 -5
- package/skills/layout/SKILL.md +35 -9
- package/skills/links/SKILL.md +249 -17
- package/skills/loader/SKILL.md +294 -30
- package/skills/middleware/SKILL.md +52 -13
- package/skills/migrate-nextjs/SKILL.md +584 -0
- package/skills/migrate-react-router/SKILL.md +769 -0
- package/skills/mime-routes/SKILL.md +27 -0
- package/skills/observability/SKILL.md +137 -0
- package/skills/parallel/SKILL.md +203 -7
- package/skills/prerender/SKILL.md +123 -100
- package/skills/rango/SKILL.md +250 -22
- package/skills/react-compiler/SKILL.md +168 -0
- package/skills/response-routes/SKILL.md +122 -47
- package/skills/route/SKILL.md +97 -5
- package/skills/router-setup/SKILL.md +90 -5
- package/skills/server-actions/SKILL.md +775 -0
- package/skills/streams-and-websockets/SKILL.md +283 -0
- package/skills/tailwind/SKILL.md +27 -3
- package/skills/testing/SKILL.md +129 -0
- package/skills/testing/bindings.md +89 -0
- package/skills/testing/cache-prerender.md +124 -0
- package/skills/testing/client-components.md +122 -0
- package/skills/testing/e2e-parity.md +125 -0
- package/skills/testing/flight.md +92 -0
- package/skills/testing/handles.md +129 -0
- package/skills/testing/loader.md +128 -0
- package/skills/testing/middleware.md +99 -0
- package/skills/testing/render-handler.md +121 -0
- package/skills/testing/response-routes.md +95 -0
- package/skills/testing/reverse-and-types.md +84 -0
- package/skills/testing/server-actions.md +107 -0
- package/skills/testing/server-tree.md +128 -0
- package/skills/testing/setup.md +120 -0
- package/skills/typesafety/SKILL.md +329 -27
- package/skills/use-cache/SKILL.md +36 -5
- package/skills/view-transitions/SKILL.md +294 -0
- package/src/__augment-tests__/augment.ts +81 -0
- package/src/__augment-tests__/augmented.check.ts +116 -0
- package/src/__internal.ts +67 -40
- package/src/browser/action-coordinator.ts +53 -36
- package/src/browser/action-fence.ts +47 -0
- package/src/browser/app-shell.ts +39 -0
- package/src/browser/app-version.ts +14 -0
- package/src/browser/cookie-name.ts +140 -0
- package/src/browser/event-controller.ts +86 -147
- package/src/browser/history-state.ts +21 -0
- package/src/browser/index.ts +3 -3
- package/src/browser/invalidate-client-cache.ts +52 -0
- package/src/browser/link-interceptor.ts +4 -0
- package/src/browser/navigation-bridge.ts +148 -19
- package/src/browser/navigation-client.ts +187 -67
- package/src/browser/navigation-store-handle.ts +38 -0
- package/src/browser/navigation-store.ts +76 -67
- package/src/browser/navigation-transaction.ts +18 -66
- package/src/browser/partial-update.ts +123 -94
- package/src/browser/prefetch/cache.ts +214 -36
- package/src/browser/prefetch/fetch.ts +260 -38
- package/src/browser/prefetch/policy.ts +6 -0
- package/src/browser/prefetch/queue.ts +126 -20
- package/src/browser/prefetch/resource-ready.ts +77 -0
- package/src/browser/rango-state.ts +158 -76
- package/src/browser/react/Link.tsx +93 -11
- package/src/browser/react/NavigationProvider.tsx +115 -34
- package/src/browser/react/ScrollRestoration.tsx +10 -6
- package/src/browser/react/context.ts +7 -2
- package/src/browser/react/filter-segment-order.ts +49 -7
- package/src/browser/react/index.ts +0 -48
- package/src/browser/react/location-state-shared.ts +166 -8
- package/src/browser/react/location-state.ts +39 -14
- package/src/browser/react/use-action.ts +6 -15
- package/src/browser/react/use-handle.ts +23 -69
- package/src/browser/react/use-link-status.ts +0 -4
- package/src/browser/react/use-navigation.ts +22 -5
- package/src/browser/react/use-params.ts +20 -10
- package/src/browser/react/use-reverse.ts +106 -0
- package/src/browser/react/use-router.ts +46 -11
- package/src/browser/react/use-search-params.ts +0 -5
- package/src/browser/react/use-segments.ts +11 -21
- package/src/browser/response-adapter.ts +52 -1
- package/src/browser/rsc-router.tsx +215 -76
- package/src/browser/scroll-restoration.ts +46 -39
- package/src/browser/segment-reconciler.ts +36 -9
- package/src/browser/segment-structure-assert.ts +2 -2
- package/src/browser/server-action-bridge.ts +176 -50
- package/src/browser/types.ts +95 -11
- package/src/browser/validate-redirect-origin.ts +43 -16
- package/src/build/collect-fallback-refs.ts +107 -0
- package/src/build/generate-manifest.ts +65 -40
- package/src/build/generate-route-types.ts +5 -0
- package/src/build/index.ts +8 -2
- package/src/build/prefix-tree-utils.ts +123 -0
- package/src/build/route-trie.ts +137 -32
- package/src/build/route-types/codegen.ts +4 -4
- package/src/build/route-types/include-resolution.ts +9 -2
- package/src/build/route-types/param-extraction.ts +6 -3
- package/src/build/route-types/per-module-writer.ts +7 -4
- package/src/build/route-types/router-processing.ts +278 -96
- package/src/build/route-types/scan-filter.ts +9 -2
- package/src/build/route-types/source-scan.ts +118 -0
- package/src/build/runtime-discovery.ts +9 -20
- package/src/cache/cache-error.ts +104 -0
- package/src/cache/cache-policy.ts +68 -28
- package/src/cache/cache-runtime.ts +149 -43
- package/src/cache/cache-scope.ts +148 -81
- package/src/cache/cache-tag.ts +98 -0
- package/src/cache/cf/cf-cache-store.ts +2550 -93
- package/src/cache/cf/index.ts +11 -17
- package/src/cache/document-cache.ts +78 -27
- package/src/cache/handle-snapshot.ts +63 -0
- package/src/cache/index.ts +23 -20
- package/src/cache/memory-segment-store.ts +136 -37
- package/src/cache/profile-registry.ts +6 -30
- package/src/cache/read-through-swr.ts +41 -11
- package/src/cache/segment-codec.ts +0 -16
- package/src/cache/tag-invalidation.ts +230 -0
- package/src/cache/taint.ts +55 -0
- package/src/cache/types.ts +33 -100
- package/src/cache/vercel/index.ts +11 -0
- package/src/cache/vercel/vercel-cache-store.ts +799 -0
- package/src/client.rsc.tsx +6 -21
- package/src/client.tsx +108 -290
- package/src/component-utils.ts +19 -0
- package/src/context-var.ts +84 -2
- package/src/debug.ts +2 -2
- package/src/decode-loader-results.ts +36 -0
- package/src/defer.ts +196 -0
- package/src/deps/ssr.ts +0 -1
- package/src/errors.ts +30 -4
- package/src/handle.ts +70 -22
- package/src/handles/MetaTags.tsx +0 -14
- package/src/handles/breadcrumbs.ts +16 -5
- package/src/handles/meta.ts +0 -39
- package/src/host/cookie-handler.ts +0 -36
- package/src/host/errors.ts +0 -24
- package/src/host/index.ts +8 -2
- package/src/host/pattern-matcher.ts +7 -50
- package/src/host/router.ts +107 -99
- package/src/host/testing.ts +40 -27
- package/src/host/types.ts +37 -4
- package/src/host/utils.ts +1 -1
- package/src/href-client.ts +137 -22
- package/src/index.rsc.ts +52 -26
- package/src/index.ts +100 -38
- package/src/internal-debug.ts +2 -4
- package/src/loader-store.ts +500 -0
- package/src/loader.rsc.ts +20 -13
- package/src/loader.ts +12 -11
- package/src/missing-id-error.ts +68 -0
- package/src/network-error-thrower.tsx +1 -6
- package/src/outlet-context.ts +1 -1
- package/src/outlet-provider.tsx +1 -5
- package/src/prerender/param-hash.ts +10 -11
- package/src/prerender/store.ts +37 -41
- package/src/prerender.ts +198 -82
- package/src/redirect-origin.ts +100 -0
- package/src/response-utils.ts +37 -0
- package/src/reverse.ts +65 -15
- package/src/root-error-boundary.tsx +1 -19
- package/src/route-content-wrapper.tsx +7 -72
- package/src/route-definition/dsl-helpers.ts +437 -274
- package/src/route-definition/helper-factories.ts +29 -139
- package/src/route-definition/helpers-types.ts +113 -37
- package/src/route-definition/index.ts +3 -0
- package/src/route-definition/redirect.ts +52 -10
- package/src/route-definition/resolve-handler-use.ts +161 -0
- package/src/route-definition/use-item-types.ts +32 -0
- package/src/route-map-builder.ts +7 -17
- package/src/route-types.ts +37 -41
- package/src/router/basename.ts +14 -0
- package/src/router/content-negotiation.ts +108 -9
- package/src/router/error-handling.ts +13 -17
- package/src/router/find-match.ts +45 -22
- package/src/router/handler-context.ts +83 -41
- package/src/router/intercept-resolution.ts +25 -23
- package/src/router/lazy-includes.ts +19 -53
- package/src/router/loader-resolution.ts +213 -30
- package/src/router/logging.ts +5 -8
- package/src/router/manifest.ts +49 -45
- package/src/router/match-api.ts +121 -205
- package/src/router/match-context.ts +0 -22
- package/src/router/match-handlers.ts +58 -58
- package/src/router/match-middleware/background-revalidation.ts +27 -6
- package/src/router/match-middleware/cache-lookup.ts +205 -249
- package/src/router/match-middleware/cache-store.ts +45 -32
- package/src/router/match-middleware/intercept-resolution.ts +8 -28
- package/src/router/match-middleware/segment-resolution.ts +52 -18
- package/src/router/match-pipelines.ts +1 -42
- package/src/router/match-result.ts +104 -40
- package/src/router/metrics.ts +5 -34
- package/src/router/middleware-types.ts +13 -142
- package/src/router/middleware.ts +173 -143
- package/src/router/navigation-snapshot.ts +131 -0
- package/src/router/params-util.ts +23 -0
- package/src/router/pattern-matching.ts +109 -63
- package/src/router/prerender-match.ts +192 -54
- package/src/router/preview-match.ts +32 -102
- package/src/router/request-classification.ts +276 -0
- package/src/router/revalidation.ts +63 -55
- package/src/router/route-snapshot.ts +244 -0
- package/src/router/router-context.ts +6 -28
- package/src/router/router-interfaces.ts +100 -35
- package/src/router/router-options.ts +91 -11
- package/src/router/router-registry.ts +2 -5
- package/src/router/segment-resolution/fresh.ts +242 -75
- package/src/router/segment-resolution/helpers.ts +64 -25
- package/src/router/segment-resolution/loader-cache.ts +41 -37
- package/src/router/segment-resolution/revalidation.ts +456 -372
- 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 +36 -0
- package/src/router/segment-resolution.ts +4 -1
- package/src/router/segment-wrappers.ts +2 -3
- package/src/router/state-cookie-name.ts +33 -0
- package/src/router/substitute-pattern-params.ts +56 -0
- package/src/router/telemetry-otel.ts +0 -20
- package/src/router/telemetry.ts +96 -19
- package/src/router/timeout.ts +0 -20
- package/src/router/trie-matching.ts +91 -46
- package/src/router/types.ts +10 -63
- package/src/router/url-params.ts +44 -0
- package/src/router.ts +134 -43
- package/src/rsc/handler-context.ts +3 -2
- package/src/rsc/handler.ts +492 -383
- package/src/rsc/helpers.ts +162 -46
- package/src/rsc/index.ts +1 -1
- package/src/rsc/json-route-result.ts +38 -0
- package/src/rsc/loader-fetch.ts +23 -3
- package/src/rsc/manifest-init.ts +33 -42
- package/src/rsc/origin-guard.ts +39 -25
- package/src/rsc/progressive-enhancement.ts +30 -3
- package/src/rsc/redirect-guard.ts +99 -0
- package/src/rsc/response-error.ts +79 -12
- package/src/rsc/response-route-handler.ts +90 -63
- package/src/rsc/rsc-rendering.ts +56 -54
- package/src/rsc/runtime-warnings.ts +23 -10
- package/src/rsc/server-action.ts +74 -67
- package/src/rsc/ssr-setup.ts +18 -2
- package/src/rsc/types.ts +25 -6
- package/src/runtime-env.ts +18 -0
- package/src/search-params.ts +4 -20
- package/src/segment-content-promise.ts +67 -0
- package/src/segment-loader-promise.ts +134 -0
- package/src/segment-system.tsx +272 -129
- package/src/serialize.ts +243 -0
- package/src/server/context.ts +309 -61
- package/src/server/cookie-store.ts +80 -5
- package/src/server/handle-store.ts +26 -24
- package/src/server/loader-registry.ts +10 -28
- package/src/server/request-context.ts +348 -128
- package/src/ssr/index.tsx +23 -15
- package/src/static-handler.ts +27 -18
- package/src/testing/cache-status.ts +162 -0
- package/src/testing/collect-handle.ts +40 -0
- package/src/testing/dispatch.ts +618 -0
- package/src/testing/dom.entry.ts +22 -0
- package/src/testing/e2e/fixture.ts +188 -0
- package/src/testing/e2e/index.ts +128 -0
- package/src/testing/e2e/matchers.ts +35 -0
- package/src/testing/e2e/page-helpers.ts +272 -0
- package/src/testing/e2e/parity.ts +387 -0
- package/src/testing/e2e/server.ts +195 -0
- package/src/testing/flight-matchers.ts +97 -0
- package/src/testing/flight-normalize.ts +11 -0
- package/src/testing/flight-runtime.d.ts +57 -0
- package/src/testing/flight-tree.ts +682 -0
- package/src/testing/flight.entry.ts +52 -0
- package/src/testing/flight.ts +232 -0
- package/src/testing/generated-routes.ts +183 -0
- package/src/testing/index.ts +99 -0
- package/src/testing/internal/context.ts +348 -0
- 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 +330 -0
- package/src/testing/render-route.tsx +566 -0
- package/src/testing/run-loader.ts +378 -0
- package/src/testing/run-middleware.ts +205 -0
- package/src/testing/vitest-stubs/cloudflare-email.ts +9 -0
- package/src/testing/vitest-stubs/cloudflare-workers.ts +21 -0
- package/src/testing/vitest-stubs/plugin-rsc.ts +16 -0
- package/src/testing/vitest-stubs/version.ts +5 -0
- package/src/testing/vitest.ts +305 -0
- package/src/theme/ThemeProvider.tsx +0 -52
- package/src/theme/ThemeScript.tsx +0 -6
- package/src/theme/constants.ts +0 -12
- package/src/theme/index.ts +0 -7
- package/src/theme/theme-context.ts +1 -5
- package/src/theme/theme-script.ts +0 -14
- package/src/theme/use-theme.ts +0 -3
- package/src/types/boundaries.ts +0 -35
- package/src/types/cache-types.ts +17 -8
- package/src/types/error-types.ts +30 -90
- package/src/types/global-namespace.ts +54 -41
- package/src/types/handler-context.ts +233 -81
- package/src/types/index.ts +1 -10
- package/src/types/loader-types.ts +44 -15
- package/src/types/request-scope.ts +107 -0
- package/src/types/route-config.ts +6 -50
- package/src/types/route-entry.ts +19 -7
- package/src/types/segments.ts +37 -14
- package/src/urls/include-helper.ts +33 -70
- package/src/urls/index.ts +1 -11
- package/src/urls/path-helper-types.ts +58 -11
- package/src/urls/path-helper.ts +57 -111
- package/src/urls/pattern-types.ts +48 -19
- package/src/urls/response-types.ts +25 -22
- package/src/urls/type-extraction.ts +58 -139
- package/src/urls/urls-function.ts +1 -18
- package/src/use-loader.tsx +346 -89
- package/src/vite/debug.ts +185 -0
- package/src/vite/discovery/bundle-postprocess.ts +36 -38
- package/src/vite/discovery/discover-routers.ts +130 -85
- package/src/vite/discovery/discovery-errors.ts +194 -0
- package/src/vite/discovery/gate-state.ts +171 -0
- package/src/vite/discovery/prerender-collection.ts +192 -99
- package/src/vite/discovery/route-types-writer.ts +40 -84
- package/src/vite/discovery/self-gen-tracking.ts +27 -1
- package/src/vite/discovery/state.ts +51 -6
- package/src/vite/discovery/virtual-module-codegen.ts +14 -34
- package/src/vite/index.ts +8 -0
- package/src/vite/plugin-types.ts +187 -69
- package/src/vite/plugins/cjs-to-esm.ts +8 -18
- package/src/vite/plugins/client-ref-dedup.ts +16 -11
- package/src/vite/plugins/client-ref-hashing.ts +28 -15
- package/src/vite/plugins/cloudflare-protocol-loader-hook.d.mts +23 -0
- package/src/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
- package/src/vite/plugins/cloudflare-protocol-stub.ts +194 -0
- package/src/vite/plugins/expose-action-id.ts +49 -98
- package/src/vite/plugins/expose-id-utils.ts +11 -50
- package/src/vite/plugins/expose-ids/export-analysis.ts +76 -34
- package/src/vite/plugins/expose-ids/handler-transform.ts +10 -48
- package/src/vite/plugins/expose-ids/loader-transform.ts +3 -20
- package/src/vite/plugins/expose-ids/router-transform.ts +20 -16
- package/src/vite/plugins/expose-internal-ids.ts +554 -317
- package/src/vite/plugins/performance-tracks.ts +89 -0
- package/src/vite/plugins/refresh-cmd.ts +89 -27
- package/src/vite/plugins/use-cache-transform.ts +73 -83
- package/src/vite/plugins/vercel-output.ts +258 -0
- package/src/vite/plugins/version-injector.ts +21 -25
- package/src/vite/plugins/version-plugin.ts +41 -20
- package/src/vite/plugins/virtual-entries.ts +2 -17
- package/src/vite/rango.ts +257 -289
- package/src/vite/router-discovery.ts +930 -140
- package/src/vite/utils/ast-handler-extract.ts +15 -31
- package/src/vite/utils/banner.ts +4 -4
- package/src/vite/utils/bundle-analysis.ts +10 -15
- package/src/vite/utils/client-chunks.ts +184 -0
- package/src/vite/utils/forward-user-plugins.ts +171 -0
- package/src/vite/utils/manifest-utils.ts +4 -59
- package/src/vite/utils/package-resolution.ts +20 -52
- package/src/vite/utils/prerender-utils.ts +27 -29
- package/src/vite/utils/shared-utils.ts +92 -42
- package/src/browser/action-response-classifier.ts +0 -99
- 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/router/middleware-cookies.ts +0 -55
|
@@ -33,10 +33,13 @@ import type { ErrorBoundaryHandler, NotFoundBoundaryHandler } from "../types";
|
|
|
33
33
|
import type { MiddlewareFn } from "./middleware.js";
|
|
34
34
|
import {
|
|
35
35
|
type TelemetrySink,
|
|
36
|
+
type CacheSegmentSignal,
|
|
36
37
|
safeEmit,
|
|
37
38
|
resolveSink,
|
|
38
39
|
getRequestId,
|
|
40
|
+
buildCacheSignalSegments,
|
|
39
41
|
} from "./telemetry.js";
|
|
42
|
+
import { _getRequestContext } from "../server/request-context.js";
|
|
40
43
|
|
|
41
44
|
export interface MatchHandlerDeps<TEnv = any> {
|
|
42
45
|
buildRouterContext: () => RouterContext<TEnv>;
|
|
@@ -51,6 +54,12 @@ export interface MatchHandlerDeps<TEnv = any> {
|
|
|
51
54
|
isAction: boolean,
|
|
52
55
|
) => { intercept: InterceptEntry; entry: EntryData } | null;
|
|
53
56
|
telemetry?: TelemetrySink;
|
|
57
|
+
/**
|
|
58
|
+
* DEVELOPMENT/TEST ONLY gate for the X-Rango-Cache debug header. When true,
|
|
59
|
+
* match/matchPartial stash a coarse route-level cache signal on the request
|
|
60
|
+
* context for the response-finalization path to emit. Default off.
|
|
61
|
+
*/
|
|
62
|
+
cacheSignalEnabled?: boolean;
|
|
54
63
|
}
|
|
55
64
|
|
|
56
65
|
export interface MatchHandlers<TEnv = any> {
|
|
@@ -80,20 +89,6 @@ export interface MatchHandlers<TEnv = any> {
|
|
|
80
89
|
negotiated?: boolean;
|
|
81
90
|
manifestEntry?: EntryData;
|
|
82
91
|
} | null>;
|
|
83
|
-
createMatchContextForFull: (
|
|
84
|
-
request: Request,
|
|
85
|
-
env: TEnv,
|
|
86
|
-
) => Promise<MatchContext<TEnv> | { type: "redirect"; redirectUrl: string }>;
|
|
87
|
-
createMatchContextForPartial: (
|
|
88
|
-
request: Request,
|
|
89
|
-
env: TEnv,
|
|
90
|
-
actionContext?: {
|
|
91
|
-
actionId?: string;
|
|
92
|
-
actionUrl?: URL;
|
|
93
|
-
actionResult?: any;
|
|
94
|
-
formData?: FormData;
|
|
95
|
-
},
|
|
96
|
-
) => Promise<MatchContext<TEnv> | null>;
|
|
97
92
|
}
|
|
98
93
|
|
|
99
94
|
/**
|
|
@@ -113,6 +108,20 @@ export function createMatchHandlers<TEnv = any>(
|
|
|
113
108
|
} = deps;
|
|
114
109
|
const hasTelemetry = !!deps.telemetry;
|
|
115
110
|
const telemetry = resolveSink(deps.telemetry);
|
|
111
|
+
const cacheSignalEnabled = !!deps.cacheSignalEnabled;
|
|
112
|
+
const buildSignal = (
|
|
113
|
+
routeKey: string,
|
|
114
|
+
state: {
|
|
115
|
+
cacheHit: boolean;
|
|
116
|
+
cacheSource?: "runtime" | "prerender";
|
|
117
|
+
shouldRevalidate?: boolean;
|
|
118
|
+
},
|
|
119
|
+
): CacheSegmentSignal[] => buildCacheSignalSegments(routeKey, state);
|
|
120
|
+
const recordSignalIfEnabled = (segments: CacheSegmentSignal[]): void => {
|
|
121
|
+
if (!cacheSignalEnabled) return;
|
|
122
|
+
const reqCtx = _getRequestContext();
|
|
123
|
+
if (reqCtx) reqCtx._cacheSignal = segments;
|
|
124
|
+
};
|
|
116
125
|
|
|
117
126
|
async function createMatchContextForFull(
|
|
118
127
|
request: Request,
|
|
@@ -145,15 +154,6 @@ export function createMatchHandlers<TEnv = any>(
|
|
|
145
154
|
);
|
|
146
155
|
}
|
|
147
156
|
|
|
148
|
-
/**
|
|
149
|
-
* Match request and return segments (document/SSR requests)
|
|
150
|
-
*
|
|
151
|
-
* Uses generator middleware pipeline for clean separation of concerns:
|
|
152
|
-
* - cache-lookup: Check cache first
|
|
153
|
-
* - segment-resolution: Resolve segments on cache miss
|
|
154
|
-
* - cache-store: Store results in cache
|
|
155
|
-
* - background-revalidation: SWR revalidation
|
|
156
|
-
*/
|
|
157
157
|
async function match(request: Request, env: TEnv): Promise<MatchResult> {
|
|
158
158
|
const requestId = hasTelemetry ? getRequestId(request) : undefined;
|
|
159
159
|
return runWithRouterLogContext({ request, transaction: "match" }, () => {
|
|
@@ -177,7 +177,6 @@ export function createMatchHandlers<TEnv = any>(
|
|
|
177
177
|
|
|
178
178
|
const result = await createMatchContextForFull(request, env);
|
|
179
179
|
|
|
180
|
-
// Handle redirect case
|
|
181
180
|
if ("type" in result && result.type === "redirect") {
|
|
182
181
|
if (hasTelemetry) {
|
|
183
182
|
safeEmit(telemetry, {
|
|
@@ -196,6 +195,7 @@ export function createMatchHandlers<TEnv = any>(
|
|
|
196
195
|
segments: [],
|
|
197
196
|
matched: [],
|
|
198
197
|
diff: [],
|
|
198
|
+
resolvedIds: [],
|
|
199
199
|
params: {},
|
|
200
200
|
redirect: result.redirectUrl,
|
|
201
201
|
};
|
|
@@ -207,17 +207,24 @@ export function createMatchHandlers<TEnv = any>(
|
|
|
207
207
|
const state = createPipelineState();
|
|
208
208
|
const pipeline = createMatchPartialPipeline(ctx, state);
|
|
209
209
|
const matchResult = await collectMatchResult(pipeline, ctx, state);
|
|
210
|
+
if (hasTelemetry || cacheSignalEnabled) {
|
|
211
|
+
const signalSegments = buildSignal(ctx.routeKey, state);
|
|
212
|
+
recordSignalIfEnabled(signalSegments);
|
|
213
|
+
if (hasTelemetry) {
|
|
214
|
+
safeEmit(telemetry, {
|
|
215
|
+
type: "cache.decision",
|
|
216
|
+
timestamp: performance.now(),
|
|
217
|
+
requestId,
|
|
218
|
+
pathname,
|
|
219
|
+
routeKey: ctx.routeKey,
|
|
220
|
+
hit: state.cacheHit,
|
|
221
|
+
shouldRevalidate: !!state.shouldRevalidate,
|
|
222
|
+
source: state.cacheSource,
|
|
223
|
+
segments: signalSegments,
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
}
|
|
210
227
|
if (hasTelemetry) {
|
|
211
|
-
safeEmit(telemetry, {
|
|
212
|
-
type: "cache.decision",
|
|
213
|
-
timestamp: performance.now(),
|
|
214
|
-
requestId,
|
|
215
|
-
pathname,
|
|
216
|
-
routeKey: ctx.routeKey,
|
|
217
|
-
hit: state.cacheHit,
|
|
218
|
-
shouldRevalidate: !!state.shouldRevalidate,
|
|
219
|
-
source: state.cacheSource,
|
|
220
|
-
});
|
|
221
228
|
safeEmit(telemetry, {
|
|
222
229
|
type: "request.end",
|
|
223
230
|
timestamp: performance.now(),
|
|
@@ -248,7 +255,6 @@ export function createMatchHandlers<TEnv = any>(
|
|
|
248
255
|
});
|
|
249
256
|
}
|
|
250
257
|
if (error instanceof Response) throw error;
|
|
251
|
-
// Report unhandled errors during full match pipeline
|
|
252
258
|
callOnError(error, "routing", {
|
|
253
259
|
request,
|
|
254
260
|
url: ctx.url,
|
|
@@ -283,16 +289,6 @@ export function createMatchHandlers<TEnv = any>(
|
|
|
283
289
|
);
|
|
284
290
|
}
|
|
285
291
|
|
|
286
|
-
/**
|
|
287
|
-
* Match partial request with revalidation
|
|
288
|
-
*
|
|
289
|
-
* Uses generator middleware pipeline for clean separation of concerns:
|
|
290
|
-
* - cache-lookup: Check cache first
|
|
291
|
-
* - segment-resolution: Resolve segments on cache miss
|
|
292
|
-
* - intercept-resolution: Handle intercept routes
|
|
293
|
-
* - cache-store: Store results in cache
|
|
294
|
-
* - background-revalidation: SWR revalidation
|
|
295
|
-
*/
|
|
296
292
|
async function matchPartial(
|
|
297
293
|
request: Request,
|
|
298
294
|
context: TEnv,
|
|
@@ -362,17 +358,24 @@ export function createMatchHandlers<TEnv = any>(
|
|
|
362
358
|
state,
|
|
363
359
|
);
|
|
364
360
|
flushRevalidationTrace();
|
|
361
|
+
if (hasTelemetry || cacheSignalEnabled) {
|
|
362
|
+
const signalSegments = buildSignal(ctx.routeKey, state);
|
|
363
|
+
recordSignalIfEnabled(signalSegments);
|
|
364
|
+
if (hasTelemetry) {
|
|
365
|
+
safeEmit(telemetry, {
|
|
366
|
+
type: "cache.decision",
|
|
367
|
+
timestamp: performance.now(),
|
|
368
|
+
requestId: partialRequestId,
|
|
369
|
+
pathname,
|
|
370
|
+
routeKey: ctx.routeKey,
|
|
371
|
+
hit: state.cacheHit,
|
|
372
|
+
shouldRevalidate: !!state.shouldRevalidate,
|
|
373
|
+
source: state.cacheSource,
|
|
374
|
+
segments: signalSegments,
|
|
375
|
+
});
|
|
376
|
+
}
|
|
377
|
+
}
|
|
365
378
|
if (hasTelemetry) {
|
|
366
|
-
safeEmit(telemetry, {
|
|
367
|
-
type: "cache.decision",
|
|
368
|
-
timestamp: performance.now(),
|
|
369
|
-
requestId: partialRequestId,
|
|
370
|
-
pathname,
|
|
371
|
-
routeKey: ctx.routeKey,
|
|
372
|
-
hit: state.cacheHit,
|
|
373
|
-
shouldRevalidate: !!state.shouldRevalidate,
|
|
374
|
-
source: state.cacheSource,
|
|
375
|
-
});
|
|
376
379
|
safeEmit(telemetry, {
|
|
377
380
|
type: "request.end",
|
|
378
381
|
timestamp: performance.now(),
|
|
@@ -405,7 +408,6 @@ export function createMatchHandlers<TEnv = any>(
|
|
|
405
408
|
});
|
|
406
409
|
}
|
|
407
410
|
if (error instanceof Response) throw error;
|
|
408
|
-
// Report unhandled errors during partial match pipeline
|
|
409
411
|
callOnError(error, actionContext ? "action" : "revalidation", {
|
|
410
412
|
request,
|
|
411
413
|
url: ctx.url,
|
|
@@ -434,7 +436,5 @@ export function createMatchHandlers<TEnv = any>(
|
|
|
434
436
|
matchPartial: matchPartial,
|
|
435
437
|
matchError: matchError,
|
|
436
438
|
previewMatch: previewMatch,
|
|
437
|
-
createMatchContextForFull: createMatchContextForFull,
|
|
438
|
-
createMatchContextForPartial: createMatchContextForPartial,
|
|
439
439
|
};
|
|
440
440
|
}
|
|
@@ -103,7 +103,8 @@ import type { ResolvedSegment } from "../../types.js";
|
|
|
103
103
|
import type { MatchContext, MatchPipelineState } from "../match-context.js";
|
|
104
104
|
import { getRouterContext } from "../router-context.js";
|
|
105
105
|
import type { GeneratorMiddleware } from "./cache-lookup.js";
|
|
106
|
-
import { debugLog, debugWarn } from "../logging.js";
|
|
106
|
+
import { debugLog, debugWarn, getOrCreateRequestId } from "../logging.js";
|
|
107
|
+
import { INTERNAL_RANGO_DEBUG } from "../../internal-debug.js";
|
|
107
108
|
|
|
108
109
|
/**
|
|
109
110
|
* Creates background revalidation middleware
|
|
@@ -143,8 +144,19 @@ export function withBackgroundRevalidation<TEnv>(
|
|
|
143
144
|
|
|
144
145
|
const requestCtx = getRequestContext();
|
|
145
146
|
const cacheScope = ctx.cacheScope;
|
|
147
|
+
const reqId = INTERNAL_RANGO_DEBUG
|
|
148
|
+
? getOrCreateRequestId(ctx.request)
|
|
149
|
+
: undefined;
|
|
146
150
|
|
|
147
151
|
requestCtx?.waitUntil(async () => {
|
|
152
|
+
// Prevent background metrics from polluting foreground timeline.
|
|
153
|
+
// The foreground uses its own metricsStore reference directly (via
|
|
154
|
+
// appendMetric), so nulling Store.metrics only affects track() calls
|
|
155
|
+
// inside this background Store.run() scope.
|
|
156
|
+
const savedMetrics = ctx.Store.metrics;
|
|
157
|
+
ctx.Store.metrics = undefined;
|
|
158
|
+
|
|
159
|
+
const start = performance.now();
|
|
148
160
|
debugLog("backgroundRevalidation", "revalidating stale route", {
|
|
149
161
|
pathname: ctx.pathname,
|
|
150
162
|
fullMatch: ctx.isFullMatch,
|
|
@@ -156,8 +168,6 @@ export function withBackgroundRevalidation<TEnv>(
|
|
|
156
168
|
requestCtx._handleStore = createHandleStore();
|
|
157
169
|
|
|
158
170
|
try {
|
|
159
|
-
// Create fresh handler context and loader promises to avoid
|
|
160
|
-
// reusing memoized results from the foreground pass
|
|
161
171
|
const freshHandlerContext = createHandlerContext(
|
|
162
172
|
ctx.matched.params,
|
|
163
173
|
ctx.request,
|
|
@@ -173,8 +183,6 @@ export function withBackgroundRevalidation<TEnv>(
|
|
|
173
183
|
const freshLoaderPromises = new Map<string, Promise<any>>();
|
|
174
184
|
setupLoaderAccess(freshHandlerContext, freshLoaderPromises);
|
|
175
185
|
|
|
176
|
-
// Resolve all segments fresh (without revalidation logic)
|
|
177
|
-
// to ensure complete components for caching
|
|
178
186
|
const freshSegments = await ctx.Store.run(() =>
|
|
179
187
|
resolveAllSegments(
|
|
180
188
|
ctx.entries,
|
|
@@ -182,10 +190,10 @@ export function withBackgroundRevalidation<TEnv>(
|
|
|
182
190
|
ctx.matched.params,
|
|
183
191
|
freshHandlerContext,
|
|
184
192
|
freshLoaderPromises,
|
|
193
|
+
{ skipLoaders: true },
|
|
185
194
|
),
|
|
186
195
|
);
|
|
187
196
|
|
|
188
|
-
// Also resolve intercept segments fresh if applicable
|
|
189
197
|
let freshInterceptSegments: ResolvedSegment[] = [];
|
|
190
198
|
if (ctx.interceptResult) {
|
|
191
199
|
freshInterceptSegments = await ctx.Store.run(() =>
|
|
@@ -207,16 +215,29 @@ export function withBackgroundRevalidation<TEnv>(
|
|
|
207
215
|
completeSegments,
|
|
208
216
|
ctx.isIntercept,
|
|
209
217
|
);
|
|
218
|
+
if (INTERNAL_RANGO_DEBUG) {
|
|
219
|
+
const dur = performance.now() - start;
|
|
220
|
+
console.log(
|
|
221
|
+
`[RSC Background][req:${reqId}] SWR revalidation ${ctx.pathname} (${dur.toFixed(2)}ms) segments=${completeSegments.length}`,
|
|
222
|
+
);
|
|
223
|
+
}
|
|
210
224
|
debugLog("backgroundRevalidation", "revalidation complete", {
|
|
211
225
|
pathname: ctx.pathname,
|
|
212
226
|
});
|
|
213
227
|
} catch (error) {
|
|
228
|
+
if (INTERNAL_RANGO_DEBUG) {
|
|
229
|
+
const dur = performance.now() - start;
|
|
230
|
+
console.log(
|
|
231
|
+
`[RSC Background][req:${reqId}] SWR revalidation ${ctx.pathname} FAILED (${dur.toFixed(2)}ms) error=${String(error)}`,
|
|
232
|
+
);
|
|
233
|
+
}
|
|
214
234
|
debugWarn("backgroundRevalidation", "revalidation failed", {
|
|
215
235
|
pathname: ctx.pathname,
|
|
216
236
|
error: String(error),
|
|
217
237
|
});
|
|
218
238
|
} finally {
|
|
219
239
|
requestCtx._handleStore = originalHandleStore;
|
|
240
|
+
ctx.Store.metrics = savedMetrics;
|
|
220
241
|
}
|
|
221
242
|
});
|
|
222
243
|
};
|