@rangojs/router 0.4.2 → 0.4.3
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/types/browser/prefetch/cache.d.ts +11 -8
- package/dist/types/cache/read-through-swr.d.ts +7 -6
- package/dist/types/cloudflare/tracing.d.ts +16 -12
- package/dist/types/router/instrument.d.ts +45 -15
- package/dist/types/router/telemetry-otel.d.ts +4 -4
- package/dist/types/router/timeout.d.ts +12 -1
- package/dist/types/router/tracing.d.ts +31 -17
- package/dist/types/rsc/capture-queue.d.ts +22 -1
- package/dist/types/rsc/shell-capture.d.ts +7 -1
- package/dist/types/rsc/stream-idle.d.ts +60 -0
- package/dist/types/server/request-context.d.ts +7 -1
- package/dist/types/vercel/tracing.d.ts +9 -8
- package/dist/vite/index.js +1 -1
- package/package.json +1 -1
- package/skills/observability/SKILL.md +33 -4
- package/src/browser/prefetch/cache.ts +22 -10
- package/src/cache/cache-runtime.ts +39 -25
- package/src/cache/document-cache.ts +39 -23
- package/src/cache/read-through-swr.ts +22 -16
- package/src/cloudflare/tracing.ts +16 -12
- package/src/router/instrument.ts +61 -15
- package/src/router/segment-resolution/loader-cache.ts +12 -1
- package/src/router/segment-resolution/revalidation.ts +16 -1
- package/src/router/telemetry-otel.ts +4 -4
- package/src/router/timeout.ts +12 -1
- package/src/router/tracing.ts +37 -17
- package/src/rsc/capture-queue.ts +72 -17
- package/src/rsc/handler.ts +171 -73
- package/src/rsc/shell-capture.ts +64 -12
- package/src/rsc/stream-idle.ts +137 -0
- package/src/server/request-context.ts +8 -0
- package/src/testing/dispatch.ts +55 -1
- package/src/vercel/tracing.ts +9 -8
- package/dist/__internal.d.ts +0 -83
- package/dist/__internal.d.ts.map +0 -1
- package/dist/__internal.js +0 -19
- package/dist/__internal.js.map +0 -1
- package/dist/__mocks__/version.d.ts +0 -7
- package/dist/__mocks__/version.d.ts.map +0 -1
- package/dist/__mocks__/version.js +0 -7
- package/dist/__mocks__/version.js.map +0 -1
- package/dist/__tests__/client-href.test.d.ts +0 -2
- package/dist/__tests__/client-href.test.d.ts.map +0 -1
- package/dist/__tests__/client-href.test.js +0 -74
- package/dist/__tests__/client-href.test.js.map +0 -1
- package/dist/__tests__/component-utils.test.d.ts +0 -2
- package/dist/__tests__/component-utils.test.d.ts.map +0 -1
- package/dist/__tests__/component-utils.test.js +0 -51
- package/dist/__tests__/component-utils.test.js.map +0 -1
- package/dist/__tests__/event-controller.test.d.ts +0 -2
- package/dist/__tests__/event-controller.test.d.ts.map +0 -1
- package/dist/__tests__/event-controller.test.js +0 -538
- package/dist/__tests__/event-controller.test.js.map +0 -1
- package/dist/__tests__/helpers/route-tree.d.ts +0 -118
- package/dist/__tests__/helpers/route-tree.d.ts.map +0 -1
- package/dist/__tests__/helpers/route-tree.js +0 -374
- package/dist/__tests__/helpers/route-tree.js.map +0 -1
- package/dist/__tests__/match-result.test.d.ts +0 -2
- package/dist/__tests__/match-result.test.d.ts.map +0 -1
- package/dist/__tests__/match-result.test.js +0 -154
- package/dist/__tests__/match-result.test.js.map +0 -1
- package/dist/__tests__/navigation-store.test.d.ts +0 -2
- package/dist/__tests__/navigation-store.test.d.ts.map +0 -1
- package/dist/__tests__/navigation-store.test.js +0 -440
- package/dist/__tests__/navigation-store.test.js.map +0 -1
- package/dist/__tests__/partial-update.test.d.ts +0 -2
- package/dist/__tests__/partial-update.test.d.ts.map +0 -1
- package/dist/__tests__/partial-update.test.js +0 -1009
- package/dist/__tests__/partial-update.test.js.map +0 -1
- package/dist/__tests__/reverse-types.test.d.ts +0 -8
- package/dist/__tests__/reverse-types.test.d.ts.map +0 -1
- package/dist/__tests__/reverse-types.test.js +0 -656
- package/dist/__tests__/reverse-types.test.js.map +0 -1
- package/dist/__tests__/route-definition.test.d.ts +0 -2
- package/dist/__tests__/route-definition.test.d.ts.map +0 -1
- package/dist/__tests__/route-definition.test.js +0 -55
- package/dist/__tests__/route-definition.test.js.map +0 -1
- package/dist/__tests__/router-helpers.test.d.ts +0 -2
- package/dist/__tests__/router-helpers.test.d.ts.map +0 -1
- package/dist/__tests__/router-helpers.test.js +0 -377
- package/dist/__tests__/router-helpers.test.js.map +0 -1
- package/dist/__tests__/router-integration-2.test.d.ts +0 -2
- package/dist/__tests__/router-integration-2.test.d.ts.map +0 -1
- package/dist/__tests__/router-integration-2.test.js +0 -426
- package/dist/__tests__/router-integration-2.test.js.map +0 -1
- package/dist/__tests__/router-integration.test.d.ts +0 -2
- package/dist/__tests__/router-integration.test.d.ts.map +0 -1
- package/dist/__tests__/router-integration.test.js +0 -1051
- package/dist/__tests__/router-integration.test.js.map +0 -1
- package/dist/__tests__/search-params.test.d.ts +0 -5
- package/dist/__tests__/search-params.test.d.ts.map +0 -1
- package/dist/__tests__/search-params.test.js +0 -306
- package/dist/__tests__/search-params.test.js.map +0 -1
- package/dist/__tests__/segment-system.test.d.ts +0 -2
- package/dist/__tests__/segment-system.test.d.ts.map +0 -1
- package/dist/__tests__/segment-system.test.js +0 -627
- package/dist/__tests__/segment-system.test.js.map +0 -1
- package/dist/__tests__/static-handler-types.test.d.ts +0 -8
- package/dist/__tests__/static-handler-types.test.d.ts.map +0 -1
- package/dist/__tests__/static-handler-types.test.js +0 -63
- package/dist/__tests__/static-handler-types.test.js.map +0 -1
- package/dist/__tests__/urls.test.d.ts +0 -2
- package/dist/__tests__/urls.test.d.ts.map +0 -1
- package/dist/__tests__/urls.test.js +0 -421
- package/dist/__tests__/urls.test.js.map +0 -1
- package/dist/__tests__/use-mount.test.d.ts +0 -2
- package/dist/__tests__/use-mount.test.d.ts.map +0 -1
- package/dist/__tests__/use-mount.test.js +0 -35
- package/dist/__tests__/use-mount.test.js.map +0 -1
- package/dist/bin/rango.d.ts +0 -2
- package/dist/bin/rango.d.ts.map +0 -1
- package/dist/bin/rango.js.map +0 -1
- package/dist/browser/event-controller.d.ts +0 -191
- package/dist/browser/event-controller.d.ts.map +0 -1
- package/dist/browser/event-controller.js +0 -559
- package/dist/browser/event-controller.js.map +0 -1
- package/dist/browser/index.d.ts +0 -2
- package/dist/browser/index.d.ts.map +0 -1
- package/dist/browser/index.js +0 -14
- package/dist/browser/index.js.map +0 -1
- package/dist/browser/link-interceptor.d.ts +0 -38
- package/dist/browser/link-interceptor.d.ts.map +0 -1
- package/dist/browser/link-interceptor.js +0 -99
- package/dist/browser/link-interceptor.js.map +0 -1
- package/dist/browser/logging.d.ts +0 -10
- package/dist/browser/logging.d.ts.map +0 -1
- package/dist/browser/logging.js +0 -29
- package/dist/browser/logging.js.map +0 -1
- package/dist/browser/lru-cache.d.ts +0 -17
- package/dist/browser/lru-cache.d.ts.map +0 -1
- package/dist/browser/lru-cache.js +0 -50
- package/dist/browser/lru-cache.js.map +0 -1
- package/dist/browser/merge-segment-loaders.d.ts +0 -39
- package/dist/browser/merge-segment-loaders.d.ts.map +0 -1
- package/dist/browser/merge-segment-loaders.js +0 -102
- package/dist/browser/merge-segment-loaders.js.map +0 -1
- package/dist/browser/navigation-bridge.d.ts +0 -102
- package/dist/browser/navigation-bridge.d.ts.map +0 -1
- package/dist/browser/navigation-bridge.js +0 -708
- package/dist/browser/navigation-bridge.js.map +0 -1
- package/dist/browser/navigation-client.d.ts +0 -25
- package/dist/browser/navigation-client.d.ts.map +0 -1
- package/dist/browser/navigation-client.js +0 -157
- package/dist/browser/navigation-client.js.map +0 -1
- package/dist/browser/navigation-store.d.ts +0 -101
- package/dist/browser/navigation-store.d.ts.map +0 -1
- package/dist/browser/navigation-store.js +0 -625
- package/dist/browser/navigation-store.js.map +0 -1
- package/dist/browser/partial-update.d.ts +0 -75
- package/dist/browser/partial-update.d.ts.map +0 -1
- package/dist/browser/partial-update.js +0 -426
- package/dist/browser/partial-update.js.map +0 -1
- package/dist/browser/react/Link.d.ts +0 -86
- package/dist/browser/react/Link.d.ts.map +0 -1
- package/dist/browser/react/Link.js +0 -128
- package/dist/browser/react/Link.js.map +0 -1
- package/dist/browser/react/NavigationProvider.d.ts +0 -63
- package/dist/browser/react/NavigationProvider.d.ts.map +0 -1
- package/dist/browser/react/NavigationProvider.js +0 -216
- package/dist/browser/react/NavigationProvider.js.map +0 -1
- package/dist/browser/react/ScrollRestoration.d.ts +0 -75
- package/dist/browser/react/ScrollRestoration.d.ts.map +0 -1
- package/dist/browser/react/ScrollRestoration.js +0 -57
- package/dist/browser/react/ScrollRestoration.js.map +0 -1
- package/dist/browser/react/context.d.ts +0 -46
- package/dist/browser/react/context.d.ts.map +0 -1
- package/dist/browser/react/context.js +0 -10
- package/dist/browser/react/context.js.map +0 -1
- package/dist/browser/react/index.d.ts +0 -11
- package/dist/browser/react/index.d.ts.map +0 -1
- package/dist/browser/react/index.js +0 -22
- package/dist/browser/react/index.js.map +0 -1
- package/dist/browser/react/location-state-shared.d.ts +0 -63
- package/dist/browser/react/location-state-shared.d.ts.map +0 -1
- package/dist/browser/react/location-state-shared.js +0 -81
- package/dist/browser/react/location-state-shared.js.map +0 -1
- package/dist/browser/react/location-state.d.ts +0 -23
- package/dist/browser/react/location-state.d.ts.map +0 -1
- package/dist/browser/react/location-state.js +0 -29
- package/dist/browser/react/location-state.js.map +0 -1
- package/dist/browser/react/mount-context.d.ts +0 -24
- package/dist/browser/react/mount-context.d.ts.map +0 -1
- package/dist/browser/react/mount-context.js +0 -24
- package/dist/browser/react/mount-context.js.map +0 -1
- package/dist/browser/react/use-action.d.ts +0 -64
- package/dist/browser/react/use-action.d.ts.map +0 -1
- package/dist/browser/react/use-action.js +0 -134
- package/dist/browser/react/use-action.js.map +0 -1
- package/dist/browser/react/use-client-cache.d.ts +0 -41
- package/dist/browser/react/use-client-cache.d.ts.map +0 -1
- package/dist/browser/react/use-client-cache.js +0 -39
- package/dist/browser/react/use-client-cache.js.map +0 -1
- package/dist/browser/react/use-handle.d.ts +0 -31
- package/dist/browser/react/use-handle.d.ts.map +0 -1
- package/dist/browser/react/use-handle.js +0 -144
- package/dist/browser/react/use-handle.js.map +0 -1
- package/dist/browser/react/use-href.d.ts +0 -33
- package/dist/browser/react/use-href.d.ts.map +0 -1
- package/dist/browser/react/use-href.js +0 -39
- package/dist/browser/react/use-href.js.map +0 -1
- package/dist/browser/react/use-link-status.d.ts +0 -37
- package/dist/browser/react/use-link-status.d.ts.map +0 -1
- package/dist/browser/react/use-link-status.js +0 -99
- package/dist/browser/react/use-link-status.js.map +0 -1
- package/dist/browser/react/use-mount.d.ts +0 -25
- package/dist/browser/react/use-mount.d.ts.map +0 -1
- package/dist/browser/react/use-mount.js +0 -30
- package/dist/browser/react/use-mount.js.map +0 -1
- package/dist/browser/react/use-navigation.d.ts +0 -27
- package/dist/browser/react/use-navigation.d.ts.map +0 -1
- package/dist/browser/react/use-navigation.js +0 -87
- package/dist/browser/react/use-navigation.js.map +0 -1
- package/dist/browser/react/use-segments.d.ts +0 -38
- package/dist/browser/react/use-segments.d.ts.map +0 -1
- package/dist/browser/react/use-segments.js +0 -130
- package/dist/browser/react/use-segments.js.map +0 -1
- package/dist/browser/request-controller.d.ts +0 -26
- package/dist/browser/request-controller.d.ts.map +0 -1
- package/dist/browser/request-controller.js +0 -147
- package/dist/browser/request-controller.js.map +0 -1
- package/dist/browser/rsc-router.d.ts +0 -129
- package/dist/browser/rsc-router.d.ts.map +0 -1
- package/dist/browser/rsc-router.js +0 -195
- package/dist/browser/rsc-router.js.map +0 -1
- package/dist/browser/scroll-restoration.d.ts +0 -93
- package/dist/browser/scroll-restoration.d.ts.map +0 -1
- package/dist/browser/scroll-restoration.js +0 -321
- package/dist/browser/scroll-restoration.js.map +0 -1
- package/dist/browser/segment-structure-assert.d.ts +0 -17
- package/dist/browser/segment-structure-assert.d.ts.map +0 -1
- package/dist/browser/segment-structure-assert.js +0 -59
- package/dist/browser/segment-structure-assert.js.map +0 -1
- package/dist/browser/server-action-bridge.d.ts +0 -26
- package/dist/browser/server-action-bridge.d.ts.map +0 -1
- package/dist/browser/server-action-bridge.js +0 -668
- package/dist/browser/server-action-bridge.js.map +0 -1
- package/dist/browser/shallow.d.ts +0 -12
- package/dist/browser/shallow.d.ts.map +0 -1
- package/dist/browser/shallow.js +0 -34
- package/dist/browser/shallow.js.map +0 -1
- package/dist/browser/types.d.ts +0 -369
- package/dist/browser/types.d.ts.map +0 -1
- package/dist/browser/types.js +0 -2
- package/dist/browser/types.js.map +0 -1
- package/dist/build/__tests__/generate-cli.test.d.ts +0 -2
- package/dist/build/__tests__/generate-cli.test.d.ts.map +0 -1
- package/dist/build/__tests__/generate-cli.test.js +0 -237
- package/dist/build/__tests__/generate-cli.test.js.map +0 -1
- package/dist/build/__tests__/generate-manifest.test.d.ts +0 -2
- package/dist/build/__tests__/generate-manifest.test.d.ts.map +0 -1
- package/dist/build/__tests__/generate-manifest.test.js +0 -119
- package/dist/build/__tests__/generate-manifest.test.js.map +0 -1
- package/dist/build/__tests__/generate-route-types.test.d.ts +0 -2
- package/dist/build/__tests__/generate-route-types.test.d.ts.map +0 -1
- package/dist/build/__tests__/generate-route-types.test.js +0 -620
- package/dist/build/__tests__/generate-route-types.test.js.map +0 -1
- package/dist/build/__tests__/per-router-manifest.test.d.ts +0 -2
- package/dist/build/__tests__/per-router-manifest.test.d.ts.map +0 -1
- package/dist/build/__tests__/per-router-manifest.test.js +0 -308
- package/dist/build/__tests__/per-router-manifest.test.js.map +0 -1
- package/dist/build/generate-manifest.d.ts +0 -81
- package/dist/build/generate-manifest.d.ts.map +0 -1
- package/dist/build/generate-manifest.js +0 -276
- package/dist/build/generate-manifest.js.map +0 -1
- package/dist/build/generate-route-types.d.ts +0 -115
- package/dist/build/generate-route-types.d.ts.map +0 -1
- package/dist/build/generate-route-types.js +0 -740
- package/dist/build/generate-route-types.js.map +0 -1
- package/dist/build/index.d.ts +0 -21
- package/dist/build/index.d.ts.map +0 -1
- package/dist/build/index.js +0 -21
- package/dist/build/index.js.map +0 -1
- package/dist/build/route-trie.d.ts +0 -71
- package/dist/build/route-trie.d.ts.map +0 -1
- package/dist/build/route-trie.js +0 -175
- package/dist/build/route-trie.js.map +0 -1
- package/dist/cache/__tests__/cache-scope.test.d.ts +0 -2
- package/dist/cache/__tests__/cache-scope.test.d.ts.map +0 -1
- package/dist/cache/__tests__/cache-scope.test.js +0 -208
- package/dist/cache/__tests__/cache-scope.test.js.map +0 -1
- package/dist/cache/__tests__/document-cache.test.d.ts +0 -2
- package/dist/cache/__tests__/document-cache.test.d.ts.map +0 -1
- package/dist/cache/__tests__/document-cache.test.js +0 -345
- package/dist/cache/__tests__/document-cache.test.js.map +0 -1
- package/dist/cache/__tests__/memory-segment-store.test.d.ts +0 -2
- package/dist/cache/__tests__/memory-segment-store.test.d.ts.map +0 -1
- package/dist/cache/__tests__/memory-segment-store.test.js +0 -425
- package/dist/cache/__tests__/memory-segment-store.test.js.map +0 -1
- package/dist/cache/__tests__/memory-store.test.d.ts +0 -2
- package/dist/cache/__tests__/memory-store.test.d.ts.map +0 -1
- package/dist/cache/__tests__/memory-store.test.js +0 -367
- package/dist/cache/__tests__/memory-store.test.js.map +0 -1
- package/dist/cache/cache-scope.d.ts +0 -102
- package/dist/cache/cache-scope.d.ts.map +0 -1
- package/dist/cache/cache-scope.js +0 -440
- package/dist/cache/cache-scope.js.map +0 -1
- package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts +0 -2
- package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts.map +0 -1
- package/dist/cache/cf/__tests__/cf-cache-store.test.js +0 -330
- package/dist/cache/cf/__tests__/cf-cache-store.test.js.map +0 -1
- package/dist/cache/cf/cf-cache-store.d.ts +0 -165
- package/dist/cache/cf/cf-cache-store.d.ts.map +0 -1
- package/dist/cache/cf/cf-cache-store.js +0 -242
- package/dist/cache/cf/cf-cache-store.js.map +0 -1
- package/dist/cache/cf/index.d.ts +0 -14
- package/dist/cache/cf/index.d.ts.map +0 -1
- package/dist/cache/cf/index.js +0 -17
- package/dist/cache/cf/index.js.map +0 -1
- package/dist/cache/document-cache.d.ts +0 -64
- package/dist/cache/document-cache.d.ts.map +0 -1
- package/dist/cache/document-cache.js +0 -228
- package/dist/cache/document-cache.js.map +0 -1
- package/dist/cache/index.d.ts +0 -19
- package/dist/cache/index.d.ts.map +0 -1
- package/dist/cache/index.js +0 -21
- package/dist/cache/index.js.map +0 -1
- package/dist/cache/memory-segment-store.d.ts +0 -110
- package/dist/cache/memory-segment-store.d.ts.map +0 -1
- package/dist/cache/memory-segment-store.js +0 -117
- package/dist/cache/memory-segment-store.js.map +0 -1
- package/dist/cache/memory-store.d.ts +0 -41
- package/dist/cache/memory-store.d.ts.map +0 -1
- package/dist/cache/memory-store.js +0 -191
- package/dist/cache/memory-store.js.map +0 -1
- package/dist/cache/types.d.ts +0 -317
- package/dist/cache/types.d.ts.map +0 -1
- package/dist/cache/types.js +0 -12
- package/dist/cache/types.js.map +0 -1
- package/dist/client.d.ts +0 -248
- package/dist/client.d.ts.map +0 -1
- package/dist/client.js +0 -367
- package/dist/client.js.map +0 -1
- package/dist/client.rsc.d.ts +0 -26
- package/dist/client.rsc.d.ts.map +0 -1
- package/dist/client.rsc.js +0 -46
- package/dist/client.rsc.js.map +0 -1
- package/dist/component-utils.d.ts +0 -36
- package/dist/component-utils.d.ts.map +0 -1
- package/dist/component-utils.js +0 -61
- package/dist/component-utils.js.map +0 -1
- package/dist/components/DefaultDocument.d.ts +0 -13
- package/dist/components/DefaultDocument.d.ts.map +0 -1
- package/dist/components/DefaultDocument.js +0 -15
- package/dist/components/DefaultDocument.js.map +0 -1
- package/dist/debug.d.ts +0 -58
- package/dist/debug.d.ts.map +0 -1
- package/dist/debug.js +0 -157
- package/dist/debug.js.map +0 -1
- package/dist/default-error-boundary.d.ts +0 -11
- package/dist/default-error-boundary.d.ts.map +0 -1
- package/dist/default-error-boundary.js +0 -45
- package/dist/default-error-boundary.js.map +0 -1
- package/dist/deps/browser.d.ts +0 -2
- package/dist/deps/browser.d.ts.map +0 -1
- package/dist/deps/browser.js +0 -3
- package/dist/deps/browser.js.map +0 -1
- package/dist/deps/html-stream-client.d.ts +0 -2
- package/dist/deps/html-stream-client.d.ts.map +0 -1
- package/dist/deps/html-stream-client.js +0 -3
- package/dist/deps/html-stream-client.js.map +0 -1
- package/dist/deps/html-stream-server.d.ts +0 -2
- package/dist/deps/html-stream-server.d.ts.map +0 -1
- package/dist/deps/html-stream-server.js +0 -3
- package/dist/deps/html-stream-server.js.map +0 -1
- package/dist/deps/rsc.d.ts +0 -2
- package/dist/deps/rsc.d.ts.map +0 -1
- package/dist/deps/rsc.js +0 -4
- package/dist/deps/rsc.js.map +0 -1
- package/dist/deps/ssr.d.ts +0 -2
- package/dist/deps/ssr.d.ts.map +0 -1
- package/dist/deps/ssr.js +0 -3
- package/dist/deps/ssr.js.map +0 -1
- package/dist/errors.d.ts +0 -174
- package/dist/errors.d.ts.map +0 -1
- package/dist/errors.js +0 -241
- package/dist/errors.js.map +0 -1
- package/dist/handle.d.ts +0 -78
- package/dist/handle.d.ts.map +0 -1
- package/dist/handle.js +0 -82
- package/dist/handle.js.map +0 -1
- package/dist/handles/MetaTags.d.ts +0 -14
- package/dist/handles/MetaTags.d.ts.map +0 -1
- package/dist/handles/MetaTags.js +0 -136
- package/dist/handles/MetaTags.js.map +0 -1
- package/dist/handles/index.d.ts +0 -6
- package/dist/handles/index.d.ts.map +0 -1
- package/dist/handles/index.js +0 -6
- package/dist/handles/index.js.map +0 -1
- package/dist/handles/meta.d.ts +0 -39
- package/dist/handles/meta.d.ts.map +0 -1
- package/dist/handles/meta.js +0 -202
- package/dist/handles/meta.js.map +0 -1
- package/dist/host/__tests__/errors.test.d.ts +0 -2
- package/dist/host/__tests__/errors.test.d.ts.map +0 -1
- package/dist/host/__tests__/errors.test.js +0 -76
- package/dist/host/__tests__/errors.test.js.map +0 -1
- package/dist/host/__tests__/pattern-comprehensive.test.d.ts +0 -2
- package/dist/host/__tests__/pattern-comprehensive.test.d.ts.map +0 -1
- package/dist/host/__tests__/pattern-comprehensive.test.js +0 -732
- package/dist/host/__tests__/pattern-comprehensive.test.js.map +0 -1
- package/dist/host/__tests__/pattern-matcher.test.d.ts +0 -2
- package/dist/host/__tests__/pattern-matcher.test.d.ts.map +0 -1
- package/dist/host/__tests__/pattern-matcher.test.js +0 -251
- package/dist/host/__tests__/pattern-matcher.test.js.map +0 -1
- package/dist/host/__tests__/router.test.d.ts +0 -2
- package/dist/host/__tests__/router.test.d.ts.map +0 -1
- package/dist/host/__tests__/router.test.js +0 -241
- package/dist/host/__tests__/router.test.js.map +0 -1
- package/dist/host/__tests__/testing.test.d.ts +0 -2
- package/dist/host/__tests__/testing.test.d.ts.map +0 -1
- package/dist/host/__tests__/testing.test.js +0 -64
- package/dist/host/__tests__/testing.test.js.map +0 -1
- package/dist/host/__tests__/utils.test.d.ts +0 -2
- package/dist/host/__tests__/utils.test.d.ts.map +0 -1
- package/dist/host/__tests__/utils.test.js +0 -29
- package/dist/host/__tests__/utils.test.js.map +0 -1
- package/dist/host/cookie-handler.d.ts +0 -34
- package/dist/host/cookie-handler.d.ts.map +0 -1
- package/dist/host/cookie-handler.js +0 -124
- package/dist/host/cookie-handler.js.map +0 -1
- package/dist/host/errors.d.ts +0 -56
- package/dist/host/errors.d.ts.map +0 -1
- package/dist/host/errors.js +0 -79
- package/dist/host/errors.js.map +0 -1
- package/dist/host/index.d.ts +0 -29
- package/dist/host/index.d.ts.map +0 -1
- package/dist/host/index.js +0 -32
- package/dist/host/index.js.map +0 -1
- package/dist/host/pattern-matcher.d.ts +0 -36
- package/dist/host/pattern-matcher.d.ts.map +0 -1
- package/dist/host/pattern-matcher.js +0 -172
- package/dist/host/pattern-matcher.js.map +0 -1
- package/dist/host/router.d.ts +0 -26
- package/dist/host/router.d.ts.map +0 -1
- package/dist/host/router.js +0 -218
- package/dist/host/router.js.map +0 -1
- package/dist/host/testing.d.ts +0 -36
- package/dist/host/testing.d.ts.map +0 -1
- package/dist/host/testing.js +0 -55
- package/dist/host/testing.js.map +0 -1
- package/dist/host/types.d.ts +0 -115
- package/dist/host/types.d.ts.map +0 -1
- package/dist/host/types.js +0 -7
- package/dist/host/types.js.map +0 -1
- package/dist/host/utils.d.ts +0 -21
- package/dist/host/utils.d.ts.map +0 -1
- package/dist/host/utils.js +0 -23
- package/dist/host/utils.js.map +0 -1
- package/dist/href-client.d.ts +0 -131
- package/dist/href-client.d.ts.map +0 -1
- package/dist/href-client.js +0 -64
- package/dist/href-client.js.map +0 -1
- package/dist/href-context.d.ts +0 -29
- package/dist/href-context.d.ts.map +0 -1
- package/dist/href-context.js +0 -21
- package/dist/href-context.js.map +0 -1
- package/dist/index.d.ts +0 -73
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -91
- package/dist/index.js.map +0 -1
- package/dist/index.rsc.d.ts +0 -32
- package/dist/index.rsc.d.ts.map +0 -1
- package/dist/index.rsc.js +0 -40
- package/dist/index.rsc.js.map +0 -1
- package/dist/internal-debug.d.ts +0 -2
- package/dist/internal-debug.d.ts.map +0 -1
- package/dist/internal-debug.js +0 -5
- package/dist/internal-debug.js.map +0 -1
- package/dist/loader.d.ts +0 -14
- package/dist/loader.d.ts.map +0 -1
- package/dist/loader.js +0 -20
- package/dist/loader.js.map +0 -1
- package/dist/loader.rsc.d.ts +0 -19
- package/dist/loader.rsc.d.ts.map +0 -1
- package/dist/loader.rsc.js +0 -99
- package/dist/loader.rsc.js.map +0 -1
- package/dist/network-error-thrower.d.ts +0 -17
- package/dist/network-error-thrower.d.ts.map +0 -1
- package/dist/network-error-thrower.js +0 -14
- package/dist/network-error-thrower.js.map +0 -1
- package/dist/outlet-context.d.ts +0 -13
- package/dist/outlet-context.d.ts.map +0 -1
- package/dist/outlet-context.js +0 -3
- package/dist/outlet-context.js.map +0 -1
- package/dist/prerender/__tests__/param-hash.test.d.ts +0 -2
- package/dist/prerender/__tests__/param-hash.test.d.ts.map +0 -1
- package/dist/prerender/__tests__/param-hash.test.js +0 -148
- package/dist/prerender/__tests__/param-hash.test.js.map +0 -1
- package/dist/prerender/param-hash.d.ts +0 -16
- package/dist/prerender/param-hash.d.ts.map +0 -1
- package/dist/prerender/param-hash.js +0 -36
- package/dist/prerender/param-hash.js.map +0 -1
- package/dist/prerender/store.d.ts +0 -38
- package/dist/prerender/store.d.ts.map +0 -1
- package/dist/prerender/store.js +0 -61
- package/dist/prerender/store.js.map +0 -1
- package/dist/prerender.d.ts +0 -66
- package/dist/prerender.d.ts.map +0 -1
- package/dist/prerender.js +0 -57
- package/dist/prerender.js.map +0 -1
- package/dist/reverse.d.ts +0 -196
- package/dist/reverse.d.ts.map +0 -1
- package/dist/reverse.js +0 -78
- package/dist/reverse.js.map +0 -1
- package/dist/root-error-boundary.d.ts +0 -33
- package/dist/root-error-boundary.d.ts.map +0 -1
- package/dist/root-error-boundary.js +0 -165
- package/dist/root-error-boundary.js.map +0 -1
- package/dist/route-content-wrapper.d.ts +0 -46
- package/dist/route-content-wrapper.d.ts.map +0 -1
- package/dist/route-content-wrapper.js +0 -77
- package/dist/route-content-wrapper.js.map +0 -1
- package/dist/route-definition.d.ts +0 -421
- package/dist/route-definition.d.ts.map +0 -1
- package/dist/route-definition.js +0 -868
- package/dist/route-definition.js.map +0 -1
- package/dist/route-map-builder.d.ts +0 -155
- package/dist/route-map-builder.d.ts.map +0 -1
- package/dist/route-map-builder.js +0 -237
- package/dist/route-map-builder.js.map +0 -1
- package/dist/route-types.d.ts +0 -165
- package/dist/route-types.d.ts.map +0 -1
- package/dist/route-types.js +0 -7
- package/dist/route-types.js.map +0 -1
- package/dist/router/__tests__/handler-context.test.d.ts +0 -2
- package/dist/router/__tests__/handler-context.test.d.ts.map +0 -1
- package/dist/router/__tests__/handler-context.test.js +0 -65
- package/dist/router/__tests__/handler-context.test.js.map +0 -1
- package/dist/router/__tests__/loader-cycle-detection.test.d.ts +0 -2
- package/dist/router/__tests__/loader-cycle-detection.test.d.ts.map +0 -1
- package/dist/router/__tests__/loader-cycle-detection.test.js +0 -221
- package/dist/router/__tests__/loader-cycle-detection.test.js.map +0 -1
- package/dist/router/__tests__/match-context.test.d.ts +0 -2
- package/dist/router/__tests__/match-context.test.d.ts.map +0 -1
- package/dist/router/__tests__/match-context.test.js +0 -92
- package/dist/router/__tests__/match-context.test.js.map +0 -1
- package/dist/router/__tests__/match-pipelines.test.d.ts +0 -2
- package/dist/router/__tests__/match-pipelines.test.d.ts.map +0 -1
- package/dist/router/__tests__/match-pipelines.test.js +0 -417
- package/dist/router/__tests__/match-pipelines.test.js.map +0 -1
- package/dist/router/__tests__/match-result.test.d.ts +0 -2
- package/dist/router/__tests__/match-result.test.d.ts.map +0 -1
- package/dist/router/__tests__/match-result.test.js +0 -457
- package/dist/router/__tests__/match-result.test.js.map +0 -1
- package/dist/router/__tests__/on-error.test.d.ts +0 -2
- package/dist/router/__tests__/on-error.test.d.ts.map +0 -1
- package/dist/router/__tests__/on-error.test.js +0 -678
- package/dist/router/__tests__/on-error.test.js.map +0 -1
- package/dist/router/__tests__/pattern-matching.test.d.ts +0 -2
- package/dist/router/__tests__/pattern-matching.test.d.ts.map +0 -1
- package/dist/router/__tests__/pattern-matching.test.js +0 -629
- package/dist/router/__tests__/pattern-matching.test.js.map +0 -1
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts +0 -2
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts.map +0 -1
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.js +0 -155
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.js.map +0 -1
- package/dist/router/error-handling.d.ts +0 -77
- package/dist/router/error-handling.d.ts.map +0 -1
- package/dist/router/error-handling.js +0 -202
- package/dist/router/error-handling.js.map +0 -1
- package/dist/router/handler-context.d.ts +0 -20
- package/dist/router/handler-context.d.ts.map +0 -1
- package/dist/router/handler-context.js +0 -198
- package/dist/router/handler-context.js.map +0 -1
- package/dist/router/intercept-resolution.d.ts +0 -66
- package/dist/router/intercept-resolution.d.ts.map +0 -1
- package/dist/router/intercept-resolution.js +0 -246
- package/dist/router/intercept-resolution.js.map +0 -1
- package/dist/router/loader-resolution.d.ts +0 -64
- package/dist/router/loader-resolution.d.ts.map +0 -1
- package/dist/router/loader-resolution.js +0 -284
- package/dist/router/loader-resolution.js.map +0 -1
- package/dist/router/logging.d.ts +0 -15
- package/dist/router/logging.d.ts.map +0 -1
- package/dist/router/logging.js +0 -99
- package/dist/router/logging.js.map +0 -1
- package/dist/router/manifest.d.ts +0 -22
- package/dist/router/manifest.d.ts.map +0 -1
- package/dist/router/manifest.js +0 -181
- package/dist/router/manifest.js.map +0 -1
- package/dist/router/match-api.d.ts +0 -35
- package/dist/router/match-api.d.ts.map +0 -1
- package/dist/router/match-api.js +0 -406
- package/dist/router/match-api.js.map +0 -1
- package/dist/router/match-context.d.ts +0 -206
- package/dist/router/match-context.d.ts.map +0 -1
- package/dist/router/match-context.js +0 -17
- package/dist/router/match-context.js.map +0 -1
- package/dist/router/match-middleware/background-revalidation.d.ts +0 -127
- package/dist/router/match-middleware/background-revalidation.d.ts.map +0 -1
- package/dist/router/match-middleware/background-revalidation.js +0 -75
- package/dist/router/match-middleware/background-revalidation.js.map +0 -1
- package/dist/router/match-middleware/cache-lookup.d.ts +0 -112
- package/dist/router/match-middleware/cache-lookup.d.ts.map +0 -1
- package/dist/router/match-middleware/cache-lookup.js +0 -257
- package/dist/router/match-middleware/cache-lookup.js.map +0 -1
- package/dist/router/match-middleware/cache-store.d.ts +0 -113
- package/dist/router/match-middleware/cache-store.d.ts.map +0 -1
- package/dist/router/match-middleware/cache-store.js +0 -108
- package/dist/router/match-middleware/cache-store.js.map +0 -1
- package/dist/router/match-middleware/index.d.ts +0 -81
- package/dist/router/match-middleware/index.d.ts.map +0 -1
- package/dist/router/match-middleware/index.js +0 -80
- package/dist/router/match-middleware/index.js.map +0 -1
- package/dist/router/match-middleware/intercept-resolution.d.ts +0 -117
- package/dist/router/match-middleware/intercept-resolution.d.ts.map +0 -1
- package/dist/router/match-middleware/intercept-resolution.js +0 -134
- package/dist/router/match-middleware/intercept-resolution.js.map +0 -1
- package/dist/router/match-middleware/segment-resolution.d.ts +0 -99
- package/dist/router/match-middleware/segment-resolution.d.ts.map +0 -1
- package/dist/router/match-middleware/segment-resolution.js +0 -53
- package/dist/router/match-middleware/segment-resolution.js.map +0 -1
- package/dist/router/match-pipelines.d.ts +0 -147
- package/dist/router/match-pipelines.d.ts.map +0 -1
- package/dist/router/match-pipelines.js +0 -82
- package/dist/router/match-pipelines.js.map +0 -1
- package/dist/router/match-result.d.ts +0 -126
- package/dist/router/match-result.d.ts.map +0 -1
- package/dist/router/match-result.js +0 -93
- package/dist/router/match-result.js.map +0 -1
- package/dist/router/metrics.d.ts +0 -20
- package/dist/router/metrics.d.ts.map +0 -1
- package/dist/router/metrics.js +0 -47
- package/dist/router/metrics.js.map +0 -1
- package/dist/router/middleware.d.ts +0 -249
- package/dist/router/middleware.d.ts.map +0 -1
- package/dist/router/middleware.js +0 -434
- package/dist/router/middleware.js.map +0 -1
- package/dist/router/middleware.test.d.ts +0 -2
- package/dist/router/middleware.test.d.ts.map +0 -1
- package/dist/router/middleware.test.js +0 -816
- package/dist/router/middleware.test.js.map +0 -1
- package/dist/router/pattern-matching.d.ts +0 -149
- package/dist/router/pattern-matching.d.ts.map +0 -1
- package/dist/router/pattern-matching.js +0 -349
- package/dist/router/pattern-matching.js.map +0 -1
- package/dist/router/revalidation.d.ts +0 -44
- package/dist/router/revalidation.d.ts.map +0 -1
- package/dist/router/revalidation.js +0 -147
- package/dist/router/revalidation.js.map +0 -1
- package/dist/router/router-context.d.ts +0 -135
- package/dist/router/router-context.d.ts.map +0 -1
- package/dist/router/router-context.js +0 -36
- package/dist/router/router-context.js.map +0 -1
- package/dist/router/segment-resolution.d.ts +0 -127
- package/dist/router/segment-resolution.d.ts.map +0 -1
- package/dist/router/segment-resolution.js +0 -919
- package/dist/router/segment-resolution.js.map +0 -1
- package/dist/router/trie-matching.d.ts +0 -40
- package/dist/router/trie-matching.d.ts.map +0 -1
- package/dist/router/trie-matching.js +0 -127
- package/dist/router/trie-matching.js.map +0 -1
- package/dist/router/types.d.ts +0 -136
- package/dist/router/types.d.ts.map +0 -1
- package/dist/router/types.js +0 -7
- package/dist/router/types.js.map +0 -1
- package/dist/router.d.ts +0 -753
- package/dist/router.d.ts.map +0 -1
- package/dist/router.gen.d.ts +0 -6
- package/dist/router.gen.d.ts.map +0 -1
- package/dist/router.gen.js +0 -6
- package/dist/router.gen.js.map +0 -1
- package/dist/router.js +0 -1304
- package/dist/router.js.map +0 -1
- package/dist/rsc/__tests__/helpers.test.d.ts +0 -2
- package/dist/rsc/__tests__/helpers.test.d.ts.map +0 -1
- package/dist/rsc/__tests__/helpers.test.js +0 -140
- package/dist/rsc/__tests__/helpers.test.js.map +0 -1
- package/dist/rsc/handler.d.ts +0 -45
- package/dist/rsc/handler.d.ts.map +0 -1
- package/dist/rsc/handler.js +0 -1172
- package/dist/rsc/handler.js.map +0 -1
- package/dist/rsc/helpers.d.ts +0 -16
- package/dist/rsc/helpers.d.ts.map +0 -1
- package/dist/rsc/helpers.js +0 -55
- package/dist/rsc/helpers.js.map +0 -1
- package/dist/rsc/index.d.ts +0 -22
- package/dist/rsc/index.d.ts.map +0 -1
- package/dist/rsc/index.js +0 -23
- package/dist/rsc/index.js.map +0 -1
- package/dist/rsc/nonce.d.ts +0 -9
- package/dist/rsc/nonce.d.ts.map +0 -1
- package/dist/rsc/nonce.js +0 -18
- package/dist/rsc/nonce.js.map +0 -1
- package/dist/rsc/types.d.ts +0 -206
- package/dist/rsc/types.d.ts.map +0 -1
- package/dist/rsc/types.js +0 -8
- package/dist/rsc/types.js.map +0 -1
- package/dist/search-params.d.ts +0 -103
- package/dist/search-params.d.ts.map +0 -1
- package/dist/search-params.js +0 -74
- package/dist/search-params.js.map +0 -1
- package/dist/segment-system.d.ts +0 -75
- package/dist/segment-system.d.ts.map +0 -1
- package/dist/segment-system.js +0 -336
- package/dist/segment-system.js.map +0 -1
- package/dist/server/context.d.ts +0 -245
- package/dist/server/context.d.ts.map +0 -1
- package/dist/server/context.js +0 -197
- package/dist/server/context.js.map +0 -1
- package/dist/server/fetchable-loader-store.d.ts +0 -18
- package/dist/server/fetchable-loader-store.d.ts.map +0 -1
- package/dist/server/fetchable-loader-store.js +0 -18
- package/dist/server/fetchable-loader-store.js.map +0 -1
- package/dist/server/handle-store.d.ts +0 -85
- package/dist/server/handle-store.d.ts.map +0 -1
- package/dist/server/handle-store.js +0 -142
- package/dist/server/handle-store.js.map +0 -1
- package/dist/server/loader-registry.d.ts +0 -55
- package/dist/server/loader-registry.d.ts.map +0 -1
- package/dist/server/loader-registry.js +0 -132
- package/dist/server/loader-registry.js.map +0 -1
- package/dist/server/request-context.d.ts +0 -226
- package/dist/server/request-context.d.ts.map +0 -1
- package/dist/server/request-context.js +0 -290
- package/dist/server/request-context.js.map +0 -1
- package/dist/server/root-layout.d.ts +0 -4
- package/dist/server/root-layout.d.ts.map +0 -1
- package/dist/server/root-layout.js +0 -5
- package/dist/server/root-layout.js.map +0 -1
- package/dist/server.d.ts +0 -15
- package/dist/server.d.ts.map +0 -1
- package/dist/server.js +0 -20
- package/dist/server.js.map +0 -1
- package/dist/ssr/__tests__/ssr-handler.test.d.ts +0 -2
- package/dist/ssr/__tests__/ssr-handler.test.d.ts.map +0 -1
- package/dist/ssr/__tests__/ssr-handler.test.js +0 -132
- package/dist/ssr/__tests__/ssr-handler.test.js.map +0 -1
- package/dist/ssr/index.d.ts +0 -98
- package/dist/ssr/index.d.ts.map +0 -1
- package/dist/ssr/index.js +0 -158
- package/dist/ssr/index.js.map +0 -1
- package/dist/static-handler.d.ts +0 -50
- package/dist/static-handler.d.ts.map +0 -1
- package/dist/static-handler.gen.d.ts +0 -5
- package/dist/static-handler.gen.d.ts.map +0 -1
- package/dist/static-handler.gen.js +0 -5
- package/dist/static-handler.gen.js.map +0 -1
- package/dist/static-handler.js +0 -29
- package/dist/static-handler.js.map +0 -1
- package/dist/theme/ThemeProvider.d.ts +0 -20
- package/dist/theme/ThemeProvider.d.ts.map +0 -1
- package/dist/theme/ThemeProvider.js +0 -240
- package/dist/theme/ThemeProvider.js.map +0 -1
- package/dist/theme/ThemeScript.d.ts +0 -48
- package/dist/theme/ThemeScript.d.ts.map +0 -1
- package/dist/theme/ThemeScript.js +0 -13
- package/dist/theme/ThemeScript.js.map +0 -1
- package/dist/theme/__tests__/theme.test.d.ts +0 -2
- package/dist/theme/__tests__/theme.test.d.ts.map +0 -1
- package/dist/theme/__tests__/theme.test.js +0 -103
- package/dist/theme/__tests__/theme.test.js.map +0 -1
- package/dist/theme/constants.d.ts +0 -29
- package/dist/theme/constants.d.ts.map +0 -1
- package/dist/theme/constants.js +0 -48
- package/dist/theme/constants.js.map +0 -1
- package/dist/theme/index.d.ts +0 -31
- package/dist/theme/index.d.ts.map +0 -1
- package/dist/theme/index.js +0 -36
- package/dist/theme/index.js.map +0 -1
- package/dist/theme/theme-context.d.ts +0 -40
- package/dist/theme/theme-context.d.ts.map +0 -1
- package/dist/theme/theme-context.js +0 -60
- package/dist/theme/theme-context.js.map +0 -1
- package/dist/theme/theme-script.d.ts +0 -27
- package/dist/theme/theme-script.d.ts.map +0 -1
- package/dist/theme/theme-script.js +0 -147
- package/dist/theme/theme-script.js.map +0 -1
- package/dist/theme/types.d.ts +0 -163
- package/dist/theme/types.d.ts.map +0 -1
- package/dist/theme/types.js +0 -11
- package/dist/theme/types.js.map +0 -1
- package/dist/theme/use-theme.d.ts +0 -12
- package/dist/theme/use-theme.d.ts.map +0 -1
- package/dist/theme/use-theme.js +0 -40
- package/dist/theme/use-theme.js.map +0 -1
- package/dist/types.d.ts +0 -1479
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -10
- package/dist/types.js.map +0 -1
- package/dist/urls.d.ts +0 -441
- package/dist/urls.d.ts.map +0 -1
- package/dist/urls.gen.d.ts +0 -8
- package/dist/urls.gen.d.ts.map +0 -1
- package/dist/urls.gen.js +0 -8
- package/dist/urls.gen.js.map +0 -1
- package/dist/urls.js +0 -443
- package/dist/urls.js.map +0 -1
- package/dist/use-loader.d.ts +0 -127
- package/dist/use-loader.d.ts.map +0 -1
- package/dist/use-loader.js +0 -237
- package/dist/use-loader.js.map +0 -1
- package/dist/vite/__tests__/ast-handler-extract.test.d.ts +0 -2
- package/dist/vite/__tests__/ast-handler-extract.test.d.ts.map +0 -1
- package/dist/vite/__tests__/ast-handler-extract.test.js +0 -294
- package/dist/vite/__tests__/ast-handler-extract.test.js.map +0 -1
- package/dist/vite/__tests__/expose-id-utils.test.d.ts +0 -2
- package/dist/vite/__tests__/expose-id-utils.test.d.ts.map +0 -1
- package/dist/vite/__tests__/expose-id-utils.test.js +0 -224
- package/dist/vite/__tests__/expose-id-utils.test.js.map +0 -1
- package/dist/vite/__tests__/expose-internal-ids.test.d.ts +0 -2
- package/dist/vite/__tests__/expose-internal-ids.test.d.ts.map +0 -1
- package/dist/vite/__tests__/expose-internal-ids.test.js +0 -647
- package/dist/vite/__tests__/expose-internal-ids.test.js.map +0 -1
- package/dist/vite/__tests__/expose-router-id.test.d.ts +0 -2
- package/dist/vite/__tests__/expose-router-id.test.d.ts.map +0 -1
- package/dist/vite/__tests__/expose-router-id.test.js +0 -39
- package/dist/vite/__tests__/expose-router-id.test.js.map +0 -1
- package/dist/vite/ast-handler-extract.d.ts +0 -49
- package/dist/vite/ast-handler-extract.d.ts.map +0 -1
- package/dist/vite/ast-handler-extract.js +0 -249
- package/dist/vite/ast-handler-extract.js.map +0 -1
- package/dist/vite/expose-action-id.d.ts +0 -19
- package/dist/vite/expose-action-id.d.ts.map +0 -1
- package/dist/vite/expose-action-id.js +0 -250
- package/dist/vite/expose-action-id.js.map +0 -1
- package/dist/vite/expose-id-utils.d.ts +0 -69
- package/dist/vite/expose-id-utils.d.ts.map +0 -1
- package/dist/vite/expose-id-utils.js +0 -289
- package/dist/vite/expose-id-utils.js.map +0 -1
- package/dist/vite/expose-internal-ids.d.ts +0 -22
- package/dist/vite/expose-internal-ids.d.ts.map +0 -1
- package/dist/vite/expose-internal-ids.js +0 -886
- package/dist/vite/expose-internal-ids.js.map +0 -1
- package/dist/vite/index.d.ts +0 -149
- package/dist/vite/index.d.ts.map +0 -1
- package/dist/vite/index.js.bak +0 -5448
- package/dist/vite/index.js.map +0 -1
- package/dist/vite/index.named-routes.gen.ts +0 -103
- package/dist/vite/package-resolution.d.ts +0 -43
- package/dist/vite/package-resolution.d.ts.map +0 -1
- package/dist/vite/package-resolution.js +0 -112
- package/dist/vite/package-resolution.js.map +0 -1
- package/dist/vite/virtual-entries.d.ts +0 -25
- package/dist/vite/virtual-entries.d.ts.map +0 -1
- package/dist/vite/virtual-entries.js +0 -110
- package/dist/vite/virtual-entries.js.map +0 -1
package/src/rsc/capture-queue.ts
CHANGED
|
@@ -36,6 +36,34 @@ export class CaptureQueueFullError extends Error {
|
|
|
36
36
|
}
|
|
37
37
|
}
|
|
38
38
|
|
|
39
|
+
/**
|
|
40
|
+
* Budget on how long a capture may WAIT in the queue before it is dropped
|
|
41
|
+
* instead of run. On workerd a queued capture rides the scheduling request's
|
|
42
|
+
* waitUntil, whose post-response lifetime is bounded (~30s): a capture that
|
|
43
|
+
* already burned 15s+ parked behind a slow predecessor would start its own
|
|
44
|
+
* up-to-15s attempt (captureTimeout) with no budget left and risk being
|
|
45
|
+
* killed mid-store-write. Dropping at the budget is safe — captures are
|
|
46
|
+
* best-effort by contract, and a later request re-probes the key (the drop
|
|
47
|
+
* does NOT mark backoff: the route is not doomed, the isolate was busy).
|
|
48
|
+
* Matches one attempt's SHELL_CAPTURE_MAX_WAIT_MS so wait + attempt fits the
|
|
49
|
+
* platform budget. Field-observed: a navigation-shell capture parked ~24s
|
|
50
|
+
* behind a predecessor's two-attempt cycle.
|
|
51
|
+
*/
|
|
52
|
+
export const CAPTURE_QUEUE_WAIT_BUDGET_MS: number = 15_000;
|
|
53
|
+
|
|
54
|
+
/** Thrown (async) when the queue wait exceeded the budget; the task never ran. */
|
|
55
|
+
export class CaptureQueueWaitTimeoutError extends Error {
|
|
56
|
+
readonly waitedMs: number;
|
|
57
|
+
constructor(waitedMs: number) {
|
|
58
|
+
super(
|
|
59
|
+
`shell capture waited ${Math.round(waitedMs)}ms in the queue ` +
|
|
60
|
+
`(budget ${CAPTURE_QUEUE_WAIT_BUDGET_MS}ms)`,
|
|
61
|
+
);
|
|
62
|
+
this.name = "CaptureQueueWaitTimeoutError";
|
|
63
|
+
this.waitedMs = waitedMs;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
39
67
|
/**
|
|
40
68
|
* Upper bound on how long one queue link may hold the queue. A capture task
|
|
41
69
|
* normally settles well inside this (attempt + in-place retry + writes), but
|
|
@@ -54,6 +82,7 @@ const QUEUE_LINK_CAP_MS = 60_000;
|
|
|
54
82
|
*/
|
|
55
83
|
export function enqueueSerializedCapture(
|
|
56
84
|
task: () => Promise<void>,
|
|
85
|
+
opts?: { maxQueueWaitMs?: number },
|
|
57
86
|
): Promise<void> {
|
|
58
87
|
if (admittedCaptures >= MAX_ADMITTED_CAPTURES) {
|
|
59
88
|
return Promise.reject(new CaptureQueueFullError());
|
|
@@ -65,25 +94,51 @@ export function enqueueSerializedCapture(
|
|
|
65
94
|
releaseQueue = resolve;
|
|
66
95
|
});
|
|
67
96
|
return (async () => {
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
})
|
|
97
|
+
const waitStart = performance.now();
|
|
98
|
+
const budget = opts?.maxQueueWaitMs ?? CAPTURE_QUEUE_WAIT_BUDGET_MS;
|
|
99
|
+
// The wait itself is budget-raced: the drop fires AT the budget, not once
|
|
100
|
+
// the predecessor eventually settles — a waiter parked behind a wedged
|
|
101
|
+
// link must not stay pending until that link's 60s cap just to learn it
|
|
102
|
+
// was already over budget.
|
|
103
|
+
let waitTimer: ReturnType<typeof setTimeout> | undefined;
|
|
104
|
+
const waitTimedOut = await Promise.race([
|
|
105
|
+
prior.catch(() => {}).then(() => false),
|
|
106
|
+
new Promise<boolean>((resolve) => {
|
|
107
|
+
waitTimer = setTimeout(() => resolve(true), budget);
|
|
108
|
+
(waitTimer as { unref?: () => void }).unref?.();
|
|
109
|
+
}),
|
|
110
|
+
]);
|
|
111
|
+
if (waitTimer) clearTimeout(waitTimer);
|
|
112
|
+
if (waitTimedOut) {
|
|
113
|
+
// Never started: hand the admission slot back here (the taskPromise
|
|
114
|
+
// finally below does it for tasks that ran). Serialization stays
|
|
115
|
+
// intact: THIS link releases only once the predecessor settles —
|
|
116
|
+
// releasing now would let a successor run concurrently with it.
|
|
117
|
+
admittedCaptures--;
|
|
118
|
+
prior.catch(() => {}).then(releaseQueue, releaseQueue);
|
|
119
|
+
throw new CaptureQueueWaitTimeoutError(performance.now() - waitStart);
|
|
120
|
+
}
|
|
77
121
|
try {
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
122
|
+
let capTimer: ReturnType<typeof setTimeout> | undefined;
|
|
123
|
+
const taskPromise = Promise.resolve()
|
|
124
|
+
.then(task)
|
|
125
|
+
.finally(() => {
|
|
126
|
+
// A timed-out link releases serialization, but its detached task still
|
|
127
|
+
// counts against admission until it actually settles.
|
|
128
|
+
admittedCaptures--;
|
|
129
|
+
});
|
|
130
|
+
try {
|
|
131
|
+
await Promise.race([
|
|
132
|
+
taskPromise,
|
|
133
|
+
new Promise<void>((resolve) => {
|
|
134
|
+
capTimer = setTimeout(resolve, QUEUE_LINK_CAP_MS);
|
|
135
|
+
(capTimer as { unref?: () => void }).unref?.();
|
|
136
|
+
}),
|
|
137
|
+
]);
|
|
138
|
+
} finally {
|
|
139
|
+
if (capTimer) clearTimeout(capTimer);
|
|
140
|
+
}
|
|
85
141
|
} finally {
|
|
86
|
-
if (capTimer) clearTimeout(capTimer);
|
|
87
142
|
releaseQueue();
|
|
88
143
|
}
|
|
89
144
|
})();
|
package/src/rsc/handler.ts
CHANGED
|
@@ -77,6 +77,7 @@ import {
|
|
|
77
77
|
type ActionContinuation,
|
|
78
78
|
} from "./server-action.js";
|
|
79
79
|
import { handleLoaderFetch } from "./loader-fetch.js";
|
|
80
|
+
import { applyStreamIdleTimeout } from "./stream-idle.js";
|
|
80
81
|
import {
|
|
81
82
|
checkRequestOrigin,
|
|
82
83
|
ORIGIN_CHECK_PHASE_BY_MODE,
|
|
@@ -618,88 +619,179 @@ export function createRSCHandler<
|
|
|
618
619
|
return coreRequestHandler(request, env, url, variables, nonce);
|
|
619
620
|
};
|
|
620
621
|
|
|
621
|
-
// Execute middleware chain if any, otherwise call core handler
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
622
|
+
// Execute middleware chain if any, otherwise call core handler
|
|
623
|
+
// directly; the response is finalized below, inside the response span.
|
|
624
|
+
const hasMiddleware = matchedMiddleware.length > 0;
|
|
625
|
+
const downstream = hasMiddleware
|
|
626
|
+
? await executeMiddleware(
|
|
627
|
+
matchedMiddleware,
|
|
628
|
+
request,
|
|
629
|
+
env,
|
|
630
|
+
variables,
|
|
631
|
+
coreHandler,
|
|
632
|
+
createReverseFunction(getRequiredRouteMap()),
|
|
633
|
+
)
|
|
634
|
+
: await coreHandler();
|
|
635
|
+
|
|
636
|
+
// Final response construction + host handoff, wrapped in rango.response
|
|
637
|
+
// — the explicit stream-handoff marker. The callback is synchronous, so
|
|
638
|
+
// the span ends immediately before the handler returns the response to
|
|
639
|
+
// the host; it never reads or wraps response.body. A downstream throw
|
|
640
|
+
// skips it entirely (no response exists to hand off).
|
|
641
|
+
return observePhase(PHASES.response, (responseSpan) => {
|
|
642
|
+
let response: Response;
|
|
643
|
+
if (hasMiddleware) {
|
|
644
|
+
if (
|
|
645
|
+
url.searchParams.has("_rsc_partial") ||
|
|
646
|
+
url.searchParams.has("_rsc_action")
|
|
647
|
+
) {
|
|
648
|
+
const intercepted = interceptRedirectForPartial(
|
|
649
|
+
downstream,
|
|
650
|
+
createRedirectFlightResponse,
|
|
651
|
+
{ requestOrigin: url.origin, basename: router.basename },
|
|
652
|
+
);
|
|
653
|
+
response = intercepted ?? finalizeResponse(downstream);
|
|
654
|
+
} else {
|
|
655
|
+
response = finalizeResponse(downstream);
|
|
656
|
+
}
|
|
657
|
+
} else {
|
|
658
|
+
response = downstream;
|
|
659
|
+
}
|
|
660
|
+
|
|
661
|
+
// Finalize metrics after all middleware (including post-next work)
|
|
662
|
+
// has completed so :post spans are captured in the timeline.
|
|
663
|
+
// Handler timing parts are always emitted (even without debug metrics)
|
|
664
|
+
// so non-debug requests still get bootstrap Server-Timing entries.
|
|
665
|
+
const handlerTimingArr: string[] = variables.__handlerTiming || [];
|
|
666
|
+
// Preserve any existing Server-Timing set by response routes or middleware
|
|
667
|
+
const existingTiming = response.headers.get("Server-Timing");
|
|
668
|
+
const timingParts = existingTiming
|
|
669
|
+
? [existingTiming, ...handlerTimingArr]
|
|
670
|
+
: [...handlerTimingArr];
|
|
671
|
+
|
|
672
|
+
const metricsStore = requestContext._metricsStore;
|
|
673
|
+
if (metricsStore) {
|
|
674
|
+
// When the store was created at handler start (earlyMetricsStore),
|
|
675
|
+
// handler:total covers the full request. When ctx.debugPerformance()
|
|
676
|
+
// created the store mid-request its requestStart is now the threaded
|
|
677
|
+
// _handlerStart (== handlerStart), so both branches yield the true
|
|
678
|
+
// request entry; reading the store's own anchor keeps this correct even
|
|
679
|
+
// if a store ever lands without the threading (falls back to its start).
|
|
680
|
+
const totalStart = earlyMetricsStore
|
|
681
|
+
? handlerStart
|
|
682
|
+
: metricsStore.requestStart;
|
|
683
|
+
appendMetric(
|
|
684
|
+
metricsStore,
|
|
685
|
+
"handler:total",
|
|
686
|
+
totalStart,
|
|
687
|
+
performance.now() - totalStart,
|
|
688
|
+
);
|
|
689
|
+
const metricsTiming = buildMetricsTiming(
|
|
690
|
+
request.method,
|
|
691
|
+
url.pathname,
|
|
692
|
+
metricsStore,
|
|
693
|
+
);
|
|
694
|
+
if (metricsTiming) timingParts.push(metricsTiming);
|
|
695
|
+
}
|
|
696
|
+
|
|
697
|
+
const fullTiming = timingParts.join(", ");
|
|
698
|
+
if (fullTiming && !isWebSocketUpgradeResponse(response)) {
|
|
699
|
+
try {
|
|
700
|
+
response.headers.set("Server-Timing", fullTiming);
|
|
701
|
+
} catch {
|
|
702
|
+
// Immutable headers (e.g. a passed-through platform Response) — drop
|
|
703
|
+
// the timing header, never the response. Instrumentation must not
|
|
704
|
+
// 500 a request.
|
|
705
|
+
}
|
|
706
|
+
}
|
|
707
|
+
|
|
708
|
+
// Single open-redirect chokepoint: every response (PE, full-page,
|
|
709
|
+
// middleware short-circuit, response-route) funnels through here, so
|
|
710
|
+
// guarding browser-followed (3xx) redirects once covers them all and any
|
|
711
|
+
// future redirect exit. Soft SPA/Flight redirects are 200/204 and pass
|
|
712
|
+
// through untouched (validated client-side instead).
|
|
713
|
+
const guarded = guardOutgoingRedirect(
|
|
714
|
+
response,
|
|
715
|
+
url.origin,
|
|
716
|
+
router.basename,
|
|
631
717
|
);
|
|
632
718
|
|
|
719
|
+
// Stream-idle watchdog (opt-in via timeouts.streamIdleMs): bounds
|
|
720
|
+
// end-to-end idle flow on the streamed body — see rsc/stream-idle.ts
|
|
721
|
+
// for the semantics. Applied at this finalization chokepoint so every
|
|
722
|
+
// streaming exit is covered; websocket upgrades must never be
|
|
723
|
+
// reconstructed and bodiless responses have nothing to bound. The
|
|
724
|
+
// trip fires POST-handoff (the request ALS may be gone), so it
|
|
725
|
+
// reports via the eagerly captured surfaces — callOnError +
|
|
726
|
+
// router.telemetry directly — mirroring handleStore.onError.
|
|
727
|
+
// onTimeout does NOT apply: the response already left the handler,
|
|
728
|
+
// so no replacement Response can be served mid-stream.
|
|
729
|
+
let finalResponse = guarded;
|
|
730
|
+
const streamIdleMs = router.timeouts.streamIdleMs;
|
|
731
|
+
// Websocket check FIRST: a workerd upgrade response must never have
|
|
732
|
+
// its body getter poked (same invariant as the body_kind attribute
|
|
733
|
+
// below).
|
|
633
734
|
if (
|
|
634
|
-
|
|
635
|
-
|
|
735
|
+
isTimeoutEnabled(streamIdleMs) &&
|
|
736
|
+
!isWebSocketUpgradeResponse(guarded) &&
|
|
737
|
+
guarded.body
|
|
636
738
|
) {
|
|
637
|
-
const
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
739
|
+
const routeKey = requestContext._routeName;
|
|
740
|
+
finalResponse = applyStreamIdleTimeout(
|
|
741
|
+
guarded,
|
|
742
|
+
streamIdleMs!,
|
|
743
|
+
(tripInfo) => {
|
|
744
|
+
callOnError(tripInfo.error, "handler", {
|
|
745
|
+
request,
|
|
746
|
+
url,
|
|
747
|
+
env,
|
|
748
|
+
routeKey,
|
|
749
|
+
handledByBoundary: false,
|
|
750
|
+
metadata: {
|
|
751
|
+
timeout: true,
|
|
752
|
+
phase: "stream-idle",
|
|
753
|
+
durationMs: tripInfo.totalMs,
|
|
754
|
+
},
|
|
755
|
+
});
|
|
756
|
+
if (router.telemetry) {
|
|
757
|
+
safeEmit(resolveSink(router.telemetry), {
|
|
758
|
+
type: "request.timeout",
|
|
759
|
+
timestamp: performance.now(),
|
|
760
|
+
requestId: getRequestId(request),
|
|
761
|
+
phase: "stream-idle",
|
|
762
|
+
pathname: url.pathname,
|
|
763
|
+
routeKey,
|
|
764
|
+
durationMs: tripInfo.totalMs,
|
|
765
|
+
customHandler: false,
|
|
766
|
+
});
|
|
767
|
+
}
|
|
768
|
+
},
|
|
641
769
|
);
|
|
642
|
-
response = intercepted ?? finalizeResponse(mwResponse);
|
|
643
|
-
} else {
|
|
644
|
-
response = finalizeResponse(mwResponse);
|
|
645
770
|
}
|
|
646
|
-
} else {
|
|
647
|
-
response = await coreHandler();
|
|
648
|
-
}
|
|
649
771
|
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
? [existingTiming, ...handlerTimingArr]
|
|
659
|
-
: [...handlerTimingArr];
|
|
660
|
-
|
|
661
|
-
const metricsStore = requestContext._metricsStore;
|
|
662
|
-
if (metricsStore) {
|
|
663
|
-
// When the store was created at handler start (earlyMetricsStore),
|
|
664
|
-
// handler:total covers the full request. When ctx.debugPerformance()
|
|
665
|
-
// created the store mid-request its requestStart is now the threaded
|
|
666
|
-
// _handlerStart (== handlerStart), so both branches yield the true
|
|
667
|
-
// request entry; reading the store's own anchor keeps this correct even
|
|
668
|
-
// if a store ever lands without the threading (falls back to its start).
|
|
669
|
-
const totalStart = earlyMetricsStore
|
|
670
|
-
? handlerStart
|
|
671
|
-
: metricsStore.requestStart;
|
|
672
|
-
appendMetric(
|
|
673
|
-
metricsStore,
|
|
674
|
-
"handler:total",
|
|
675
|
-
totalStart,
|
|
676
|
-
performance.now() - totalStart,
|
|
772
|
+
// Attributes describe the response actually handed to the host (after
|
|
773
|
+
// unsafe-redirect replacement), low-cardinality only. body_kind checks
|
|
774
|
+
// the websocket marker before the body getter so a workerd upgrade
|
|
775
|
+
// Response is never poked; `.body` is a getter access, not a read of
|
|
776
|
+
// the stream.
|
|
777
|
+
responseSpan.setAttribute(
|
|
778
|
+
"http.response.status_code",
|
|
779
|
+
finalResponse.status,
|
|
677
780
|
);
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
metricsStore,
|
|
781
|
+
responseSpan.setAttribute(
|
|
782
|
+
"rango.response.mode",
|
|
783
|
+
requestContext._requestMode ?? "middleware-short-circuit",
|
|
682
784
|
);
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
// 500 a request.
|
|
694
|
-
}
|
|
695
|
-
}
|
|
696
|
-
|
|
697
|
-
// Single open-redirect chokepoint: every response (PE, full-page,
|
|
698
|
-
// middleware short-circuit, response-route) funnels through here, so
|
|
699
|
-
// guarding browser-followed (3xx) redirects once covers them all and any
|
|
700
|
-
// future redirect exit. Soft SPA/Flight redirects are 200/204 and pass
|
|
701
|
-
// through untouched (validated client-side instead).
|
|
702
|
-
return guardOutgoingRedirect(response, url.origin, router.basename);
|
|
785
|
+
responseSpan.setAttribute(
|
|
786
|
+
"rango.response.body_kind",
|
|
787
|
+
isWebSocketUpgradeResponse(finalResponse)
|
|
788
|
+
? "websocket"
|
|
789
|
+
: finalResponse.body === null
|
|
790
|
+
? "empty"
|
|
791
|
+
: "stream",
|
|
792
|
+
);
|
|
793
|
+
return finalResponse;
|
|
794
|
+
});
|
|
703
795
|
}),
|
|
704
796
|
);
|
|
705
797
|
};
|
|
@@ -755,6 +847,12 @@ export function createRSCHandler<
|
|
|
755
847
|
const classifyDur = performance.now() - classifyStart;
|
|
756
848
|
handlerTiming.push(`handler-classify;dur=${classifyDur.toFixed(2)}`);
|
|
757
849
|
|
|
850
|
+
// Stash the classified mode for the rango.response span (rango.response.mode)
|
|
851
|
+
// — the outer handler tail cannot see the plan. Stays unset when middleware
|
|
852
|
+
// short-circuits before core execution runs (reported as
|
|
853
|
+
// "middleware-short-circuit").
|
|
854
|
+
getRequestContext()._requestMode = plan.mode;
|
|
855
|
+
|
|
758
856
|
// ---- 2. Terminal plans (no execution needed) ----
|
|
759
857
|
if (plan.mode === "redirect") {
|
|
760
858
|
// Redirects are handled by the pipeline (match/matchPartial),
|
package/src/rsc/shell-capture.ts
CHANGED
|
@@ -22,11 +22,13 @@ import { reportCacheError } from "../cache/cache-error.js";
|
|
|
22
22
|
import { runBackground } from "../cache/background-task.js";
|
|
23
23
|
import {
|
|
24
24
|
CaptureQueueFullError,
|
|
25
|
+
CaptureQueueWaitTimeoutError,
|
|
25
26
|
enqueueSerializedCapture,
|
|
26
27
|
} from "./capture-queue.js";
|
|
27
28
|
import { SHELL_CAPTURE_MAX_WAIT_MS } from "./shell-capture-constants.js";
|
|
28
29
|
import { INTERNAL_RANGO_DEBUG } from "../internal-debug.js";
|
|
29
30
|
import { observePhase, PHASES } from "../router/instrument.js";
|
|
31
|
+
import type { TraceSpan } from "../router/tracing.js";
|
|
30
32
|
import {
|
|
31
33
|
runWithRequestContext,
|
|
32
34
|
setRequestContextParams,
|
|
@@ -416,6 +418,10 @@ export interface ShellCaptureDebugEvent {
|
|
|
416
418
|
* - skip-backoff: the key is inside its refused-capture backoff window and
|
|
417
419
|
* the capture was not attempted
|
|
418
420
|
* - skip-capacity: the isolate capture queue is full; a later request may retry
|
|
421
|
+
* - skip-queue-timeout: the capture waited past CAPTURE_QUEUE_WAIT_BUDGET_MS
|
|
422
|
+
* behind other captures and was dropped unrun (no backoff — the route is
|
|
423
|
+
* not doomed, the isolate was busy; a later request re-probes). Carries
|
|
424
|
+
* queueWaitMs.
|
|
419
425
|
* - backoff: the key entered (or escalated) backoff after a terminal
|
|
420
426
|
* no-shell — carries the new backoff state
|
|
421
427
|
*/
|
|
@@ -428,6 +434,7 @@ export interface ShellCaptureDebugEvent {
|
|
|
428
434
|
| "skip-in-flight"
|
|
429
435
|
| "skip-backoff"
|
|
430
436
|
| "skip-capacity"
|
|
437
|
+
| "skip-queue-timeout"
|
|
431
438
|
| "backoff";
|
|
432
439
|
/** Attempt number (1 = first, 2 = in-place retry). Absent on skips. */
|
|
433
440
|
attempt?: number;
|
|
@@ -457,6 +464,8 @@ export interface ShellCaptureDebugEvent {
|
|
|
457
464
|
backoffFailures?: number;
|
|
458
465
|
/** Ms remaining in the key's backoff window, when one exists. */
|
|
459
466
|
backoffRemainingMs?: number;
|
|
467
|
+
/** Ms the capture waited in the serialized queue (skip-queue-timeout). */
|
|
468
|
+
queueWaitMs?: number;
|
|
460
469
|
}
|
|
461
470
|
|
|
462
471
|
/**
|
|
@@ -503,6 +512,9 @@ export function describeShellCaptureEvent(
|
|
|
503
512
|
if (event.backoffRemainingMs !== undefined) {
|
|
504
513
|
parts.push(`backoff-remaining=${event.backoffRemainingMs}ms`);
|
|
505
514
|
}
|
|
515
|
+
if (event.queueWaitMs !== undefined) {
|
|
516
|
+
parts.push(`queue-wait=${event.queueWaitMs}ms`);
|
|
517
|
+
}
|
|
506
518
|
return parts.join(" ");
|
|
507
519
|
}
|
|
508
520
|
|
|
@@ -853,7 +865,7 @@ export function scheduleShellCapture(
|
|
|
853
865
|
return;
|
|
854
866
|
}
|
|
855
867
|
inFlightCaptures.add(key);
|
|
856
|
-
const captureTask = async () => {
|
|
868
|
+
const captureTask = async (span: TraceSpan) => {
|
|
857
869
|
try {
|
|
858
870
|
const setupUrl = descriptor.navigationOnly
|
|
859
871
|
? stripInternalParams(url)
|
|
@@ -881,6 +893,7 @@ export function scheduleShellCapture(
|
|
|
881
893
|
resolvedSsrModule,
|
|
882
894
|
descriptor,
|
|
883
895
|
);
|
|
896
|
+
span.setAttribute("rango.background.outcome", outcome);
|
|
884
897
|
// Update the negative cache off the terminal outcome. A stored shell clears
|
|
885
898
|
// any prior backoff; a `no-shell` (after the in-place retry) backs the key
|
|
886
899
|
// off so the next requests don't re-probe it. A `redirect` has no shell but
|
|
@@ -899,6 +912,7 @@ export function scheduleShellCapture(
|
|
|
899
912
|
// context is gone. A genuine failure recurs, so back it off too (re-probe
|
|
900
913
|
// once per window, not every request) and report it once.
|
|
901
914
|
markCaptureBackoff(key);
|
|
915
|
+
span.setAttribute("rango.background.outcome", "error");
|
|
902
916
|
publishCaptureDebugEvent(descriptor, {
|
|
903
917
|
key,
|
|
904
918
|
outcome: "error",
|
|
@@ -914,20 +928,58 @@ export function scheduleShellCapture(
|
|
|
914
928
|
// capture makes the sibling freeze a trivial prelude and store nothing
|
|
915
929
|
// (rotating eternal-MISS victims on GH runners). The stampede guard above
|
|
916
930
|
// stays per-key (dedupe while queued); the queue is cross-key.
|
|
931
|
+
//
|
|
932
|
+
// The whole serialized task — queue wait INCLUDED — is wrapped in the
|
|
933
|
+
// rango.background span (kind=shell-capture). The span is the explanatory
|
|
934
|
+
// parent for the capture's platform KV/fetch/cache spans (the capture's own
|
|
935
|
+
// rango.* phase spans stay suppressed — deriveShellCaptureContext strips
|
|
936
|
+
// _tracing), and queue_wait_ms makes a capture parked behind a slow
|
|
937
|
+
// predecessor link visible instead of reading as an unexplained dead gap
|
|
938
|
+
// (observed in production: ~24s of zero I/O before capture start).
|
|
939
|
+
// observePhase reads tracing off the ALS context captured when runBackground
|
|
940
|
+
// registered the task — the foreground request context, tracing intact.
|
|
917
941
|
const serializedTask = async () => {
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
942
|
+
await observePhase(PHASES.background("shell-capture"), async (span) => {
|
|
943
|
+
span.setAttribute("rango.shell_key", key);
|
|
944
|
+
const queueStart = performance.now();
|
|
945
|
+
try {
|
|
946
|
+
await enqueueSerializedCapture(() => {
|
|
947
|
+
span.setAttribute(
|
|
948
|
+
"rango.background.queue_wait_ms",
|
|
949
|
+
Math.round(performance.now() - queueStart),
|
|
950
|
+
);
|
|
951
|
+
return captureTask(span);
|
|
926
952
|
});
|
|
927
|
-
|
|
953
|
+
} catch (error) {
|
|
954
|
+
if (error instanceof CaptureQueueFullError) {
|
|
955
|
+
inFlightCaptures.delete(key);
|
|
956
|
+
span.setAttribute("rango.background.outcome", "skip-capacity");
|
|
957
|
+
publishCaptureDebugEvent(descriptor, {
|
|
958
|
+
key,
|
|
959
|
+
outcome: "skip-capacity",
|
|
960
|
+
});
|
|
961
|
+
return;
|
|
962
|
+
}
|
|
963
|
+
if (error instanceof CaptureQueueWaitTimeoutError) {
|
|
964
|
+
// Dropped unrun after waiting past the queue budget: no backoff (the
|
|
965
|
+
// route is not doomed, the isolate was busy) — a later request
|
|
966
|
+
// re-probes the key.
|
|
967
|
+
inFlightCaptures.delete(key);
|
|
968
|
+
span.setAttribute("rango.background.outcome", "skip-queue-timeout");
|
|
969
|
+
span.setAttribute(
|
|
970
|
+
"rango.background.queue_wait_ms",
|
|
971
|
+
Math.round(error.waitedMs),
|
|
972
|
+
);
|
|
973
|
+
publishCaptureDebugEvent(descriptor, {
|
|
974
|
+
key,
|
|
975
|
+
outcome: "skip-queue-timeout",
|
|
976
|
+
queueWaitMs: Math.round(error.waitedMs),
|
|
977
|
+
});
|
|
978
|
+
return;
|
|
979
|
+
}
|
|
980
|
+
throw error;
|
|
928
981
|
}
|
|
929
|
-
|
|
930
|
-
}
|
|
982
|
+
});
|
|
931
983
|
};
|
|
932
984
|
// The capture's own task must NOT enter reqCtx._pendingBackgroundTasks: the
|
|
933
985
|
// capture drains that list before rendering (the write-barrier ordering edge),
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stream-idle timeout — the enforcement for `timeouts.streamIdleMs` (the
|
|
3
|
+
* "stream-idle" TimeoutPhase, reserved since the timeout API landed).
|
|
4
|
+
*
|
|
5
|
+
* WHY: nothing else bounds a streaming response body's lifetime.
|
|
6
|
+
* `renderStartMs` only bounds time-to-Response-construction; once the body is
|
|
7
|
+
* streaming, a single never-settling promise embedded in the payload (a
|
|
8
|
+
* deferred loader that never resolves, an orphaned ctx.rendered() barrier)
|
|
9
|
+
* holds the Flight/HTML stream — and the client's connection — open forever.
|
|
10
|
+
* Deferred HANDLES have a 10s auto-resolve net (defer.ts); loader promises
|
|
11
|
+
* and everything else have none. Field-observed as multi-second dead
|
|
12
|
+
* connections only closed by client cancellation.
|
|
13
|
+
*
|
|
14
|
+
* SEMANTICS — end-to-end idle flow, deliberately: the watchdog re-arms on
|
|
15
|
+
* every chunk that flows THROUGH to the client, so "idle" means "no bytes
|
|
16
|
+
* reached the wire for N ms". A stalled slow client counts as idle the same
|
|
17
|
+
* as a wedged producer — the two are indistinguishable here without buffering,
|
|
18
|
+
* and buffering is banned on the streaming path. Pick budgets accordingly
|
|
19
|
+
* (generous, seconds not millis); the feature is OPT-IN (unset = today's
|
|
20
|
+
* unbounded behavior, and the `timeout` shorthand deliberately does not apply
|
|
21
|
+
* to streamIdleMs — see resolveTimeouts).
|
|
22
|
+
*
|
|
23
|
+
* ON TRIP: the client-facing stream is errored with a RouterTimeoutError
|
|
24
|
+
* ("stream-idle") — the host terminates the response visibly (truncated
|
|
25
|
+
* chunked encoding), which is debuggable, unlike a silent clean close that
|
|
26
|
+
* would present a half-document as complete. Erroring the transform makes the
|
|
27
|
+
* pipe cancel its SOURCE, which aborts React's fizz/flight render — but only
|
|
28
|
+
* when the watchdog's branch is the sole consumer. When an upstream layer
|
|
29
|
+
* teed or cloned the body first (the document-cache MISS drain,
|
|
30
|
+
* response-cache clones), the watchdog holds one tee branch: tee semantics
|
|
31
|
+
* cancel the underlying source only once EVERY branch cancels, so the cache
|
|
32
|
+
* branch keeps the wedged render alive, bounded only by the platform's
|
|
33
|
+
* waitUntil budget — exactly as it was before this feature. The client-facing
|
|
34
|
+
* bound is unconditional; source teardown is best-effort. `onTimeout` does
|
|
35
|
+
* NOT apply: the response already left the handler, so no replacement
|
|
36
|
+
* Response can be served — the trip is reported via onError + the
|
|
37
|
+
* request.timeout telemetry event instead.
|
|
38
|
+
*
|
|
39
|
+
* COST: one identity TransformStream hop per chunk, only when the timeout is
|
|
40
|
+
* enabled. Never buffers, never reads ahead, adds no work when disabled.
|
|
41
|
+
*/
|
|
42
|
+
|
|
43
|
+
import { RouterTimeoutError } from "../router/timeout.js";
|
|
44
|
+
|
|
45
|
+
/** What the watchdog observed when it tripped. */
|
|
46
|
+
export interface StreamIdleTrip {
|
|
47
|
+
/** ms since the watchdog armed (response handoff) — the stream's lifetime. */
|
|
48
|
+
totalMs: number;
|
|
49
|
+
/** Chunks forwarded before the trip. */
|
|
50
|
+
chunks: number;
|
|
51
|
+
/** The error the client-facing stream was terminated with. */
|
|
52
|
+
error: RouterTimeoutError;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Wrap `response`'s body in an idle watchdog. Returns a NEW Response with the
|
|
57
|
+
* same status/headers whose body errors (and cancels the source) once no chunk
|
|
58
|
+
* has flowed for `idleMs`. Callers gate on isTimeoutEnabled + body presence +
|
|
59
|
+
* NOT a websocket upgrade (a 101/webSocket response must never be
|
|
60
|
+
* reconstructed); this function assumes those checks were made. `onTrip` fires
|
|
61
|
+
* at most once, after the client-facing stream has been errored.
|
|
62
|
+
*/
|
|
63
|
+
export function applyStreamIdleTimeout(
|
|
64
|
+
response: Response,
|
|
65
|
+
idleMs: number,
|
|
66
|
+
onTrip: (trip: StreamIdleTrip) => void,
|
|
67
|
+
): Response {
|
|
68
|
+
const source = response.body;
|
|
69
|
+
if (!source) return response;
|
|
70
|
+
|
|
71
|
+
const start = performance.now();
|
|
72
|
+
let timer: ReturnType<typeof setTimeout> | undefined;
|
|
73
|
+
let chunks = 0;
|
|
74
|
+
let settled = false;
|
|
75
|
+
let controllerRef!: TransformStreamDefaultController<unknown>;
|
|
76
|
+
|
|
77
|
+
const disarm = () => {
|
|
78
|
+
settled = true;
|
|
79
|
+
if (timer) clearTimeout(timer);
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
const trip = () => {
|
|
83
|
+
if (settled) return;
|
|
84
|
+
const error = new RouterTimeoutError(
|
|
85
|
+
"stream-idle",
|
|
86
|
+
performance.now() - start,
|
|
87
|
+
);
|
|
88
|
+
try {
|
|
89
|
+
controllerRef.error(error);
|
|
90
|
+
} catch {
|
|
91
|
+
// The stream already terminated (raced a close/cancel) — nothing was
|
|
92
|
+
// interrupted, so do not report a timeout.
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
// Erroring the transform makes the pipe abort and CANCEL the source
|
|
96
|
+
// stream (React aborts the wedged render). Mark settled AFTER the error
|
|
97
|
+
// took, then report.
|
|
98
|
+
disarm();
|
|
99
|
+
onTrip({ totalMs: error.durationMs, chunks, error });
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
const arm = () => {
|
|
103
|
+
if (settled) return;
|
|
104
|
+
if (timer) clearTimeout(timer);
|
|
105
|
+
timer = setTimeout(trip, idleMs);
|
|
106
|
+
(timer as { unref?: () => void }).unref?.();
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
// `cancel` is the spec's newer transformer hook (client-side cancellation);
|
|
110
|
+
// TS's lib.dom Transformer type lags it, hence the intersection. Runtimes
|
|
111
|
+
// without it fall back to the settled/try-catch guards in trip().
|
|
112
|
+
const transformer: Transformer<unknown, unknown> & { cancel?: () => void } = {
|
|
113
|
+
start(controller) {
|
|
114
|
+
controllerRef = controller;
|
|
115
|
+
arm();
|
|
116
|
+
},
|
|
117
|
+
transform(chunk, controller) {
|
|
118
|
+
controller.enqueue(chunk);
|
|
119
|
+
chunks++;
|
|
120
|
+
arm();
|
|
121
|
+
},
|
|
122
|
+
flush() {
|
|
123
|
+
// Natural end of the source stream.
|
|
124
|
+
disarm();
|
|
125
|
+
},
|
|
126
|
+
cancel() {
|
|
127
|
+
disarm();
|
|
128
|
+
},
|
|
129
|
+
};
|
|
130
|
+
const watchdog = new TransformStream<unknown, unknown>(transformer);
|
|
131
|
+
|
|
132
|
+
return new Response(source.pipeThrough(watchdog) as ReadableStream, {
|
|
133
|
+
status: response.status,
|
|
134
|
+
statusText: response.statusText,
|
|
135
|
+
headers: response.headers,
|
|
136
|
+
});
|
|
137
|
+
}
|