@rangojs/router 0.4.1 → 0.4.2
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/__internal.d.ts +83 -0
- package/dist/__internal.d.ts.map +1 -0
- package/dist/__internal.js +19 -0
- package/dist/__internal.js.map +1 -0
- package/dist/__mocks__/version.d.ts +7 -0
- package/dist/__mocks__/version.d.ts.map +1 -0
- package/dist/__mocks__/version.js +7 -0
- package/dist/__mocks__/version.js.map +1 -0
- package/dist/__tests__/client-href.test.d.ts +2 -0
- package/dist/__tests__/client-href.test.d.ts.map +1 -0
- package/dist/__tests__/client-href.test.js +74 -0
- package/dist/__tests__/client-href.test.js.map +1 -0
- package/dist/__tests__/component-utils.test.d.ts +2 -0
- package/dist/__tests__/component-utils.test.d.ts.map +1 -0
- package/dist/__tests__/component-utils.test.js +51 -0
- package/dist/__tests__/component-utils.test.js.map +1 -0
- package/dist/__tests__/event-controller.test.d.ts +2 -0
- package/dist/__tests__/event-controller.test.d.ts.map +1 -0
- package/dist/__tests__/event-controller.test.js +538 -0
- package/dist/__tests__/event-controller.test.js.map +1 -0
- package/dist/__tests__/helpers/route-tree.d.ts +118 -0
- package/dist/__tests__/helpers/route-tree.d.ts.map +1 -0
- package/dist/__tests__/helpers/route-tree.js +374 -0
- package/dist/__tests__/helpers/route-tree.js.map +1 -0
- package/dist/__tests__/match-result.test.d.ts +2 -0
- package/dist/__tests__/match-result.test.d.ts.map +1 -0
- package/dist/__tests__/match-result.test.js +154 -0
- package/dist/__tests__/match-result.test.js.map +1 -0
- package/dist/__tests__/navigation-store.test.d.ts +2 -0
- package/dist/__tests__/navigation-store.test.d.ts.map +1 -0
- package/dist/__tests__/navigation-store.test.js +440 -0
- package/dist/__tests__/navigation-store.test.js.map +1 -0
- package/dist/__tests__/partial-update.test.d.ts +2 -0
- package/dist/__tests__/partial-update.test.d.ts.map +1 -0
- package/dist/__tests__/partial-update.test.js +1009 -0
- package/dist/__tests__/partial-update.test.js.map +1 -0
- package/dist/__tests__/reverse-types.test.d.ts +8 -0
- package/dist/__tests__/reverse-types.test.d.ts.map +1 -0
- package/dist/__tests__/reverse-types.test.js +656 -0
- package/dist/__tests__/reverse-types.test.js.map +1 -0
- package/dist/__tests__/route-definition.test.d.ts +2 -0
- package/dist/__tests__/route-definition.test.d.ts.map +1 -0
- package/dist/__tests__/route-definition.test.js +55 -0
- package/dist/__tests__/route-definition.test.js.map +1 -0
- package/dist/__tests__/router-helpers.test.d.ts +2 -0
- package/dist/__tests__/router-helpers.test.d.ts.map +1 -0
- package/dist/__tests__/router-helpers.test.js +377 -0
- package/dist/__tests__/router-helpers.test.js.map +1 -0
- package/dist/__tests__/router-integration-2.test.d.ts +2 -0
- package/dist/__tests__/router-integration-2.test.d.ts.map +1 -0
- package/dist/__tests__/router-integration-2.test.js +426 -0
- package/dist/__tests__/router-integration-2.test.js.map +1 -0
- package/dist/__tests__/router-integration.test.d.ts +2 -0
- package/dist/__tests__/router-integration.test.d.ts.map +1 -0
- package/dist/__tests__/router-integration.test.js +1051 -0
- package/dist/__tests__/router-integration.test.js.map +1 -0
- package/dist/__tests__/search-params.test.d.ts +5 -0
- package/dist/__tests__/search-params.test.d.ts.map +1 -0
- package/dist/__tests__/search-params.test.js +306 -0
- package/dist/__tests__/search-params.test.js.map +1 -0
- package/dist/__tests__/segment-system.test.d.ts +2 -0
- package/dist/__tests__/segment-system.test.d.ts.map +1 -0
- package/dist/__tests__/segment-system.test.js +627 -0
- package/dist/__tests__/segment-system.test.js.map +1 -0
- package/dist/__tests__/static-handler-types.test.d.ts +8 -0
- package/dist/__tests__/static-handler-types.test.d.ts.map +1 -0
- package/dist/__tests__/static-handler-types.test.js +63 -0
- package/dist/__tests__/static-handler-types.test.js.map +1 -0
- package/dist/__tests__/urls.test.d.ts +2 -0
- package/dist/__tests__/urls.test.d.ts.map +1 -0
- package/dist/__tests__/urls.test.js +421 -0
- package/dist/__tests__/urls.test.js.map +1 -0
- package/dist/__tests__/use-mount.test.d.ts +2 -0
- package/dist/__tests__/use-mount.test.d.ts.map +1 -0
- package/dist/__tests__/use-mount.test.js +35 -0
- package/dist/__tests__/use-mount.test.js.map +1 -0
- package/dist/bin/rango.d.ts +2 -0
- package/dist/bin/rango.d.ts.map +1 -0
- package/dist/bin/rango.js.map +1 -0
- package/dist/browser/event-controller.d.ts +191 -0
- package/dist/browser/event-controller.d.ts.map +1 -0
- package/dist/browser/event-controller.js +559 -0
- package/dist/browser/event-controller.js.map +1 -0
- package/dist/browser/index.d.ts +2 -0
- package/dist/browser/index.d.ts.map +1 -0
- package/dist/browser/index.js +14 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/browser/link-interceptor.d.ts +38 -0
- package/dist/browser/link-interceptor.d.ts.map +1 -0
- package/dist/browser/link-interceptor.js +99 -0
- package/dist/browser/link-interceptor.js.map +1 -0
- package/dist/browser/logging.d.ts +10 -0
- package/dist/browser/logging.d.ts.map +1 -0
- package/dist/browser/logging.js +29 -0
- package/dist/browser/logging.js.map +1 -0
- package/dist/browser/lru-cache.d.ts +17 -0
- package/dist/browser/lru-cache.d.ts.map +1 -0
- package/dist/browser/lru-cache.js +50 -0
- package/dist/browser/lru-cache.js.map +1 -0
- package/dist/browser/merge-segment-loaders.d.ts +39 -0
- package/dist/browser/merge-segment-loaders.d.ts.map +1 -0
- package/dist/browser/merge-segment-loaders.js +102 -0
- package/dist/browser/merge-segment-loaders.js.map +1 -0
- package/dist/browser/navigation-bridge.d.ts +102 -0
- package/dist/browser/navigation-bridge.d.ts.map +1 -0
- package/dist/browser/navigation-bridge.js +708 -0
- package/dist/browser/navigation-bridge.js.map +1 -0
- package/dist/browser/navigation-client.d.ts +25 -0
- package/dist/browser/navigation-client.d.ts.map +1 -0
- package/dist/browser/navigation-client.js +157 -0
- package/dist/browser/navigation-client.js.map +1 -0
- package/dist/browser/navigation-store.d.ts +101 -0
- package/dist/browser/navigation-store.d.ts.map +1 -0
- package/dist/browser/navigation-store.js +625 -0
- package/dist/browser/navigation-store.js.map +1 -0
- package/dist/browser/partial-update.d.ts +75 -0
- package/dist/browser/partial-update.d.ts.map +1 -0
- package/dist/browser/partial-update.js +426 -0
- package/dist/browser/partial-update.js.map +1 -0
- package/dist/browser/react/Link.d.ts +86 -0
- package/dist/browser/react/Link.d.ts.map +1 -0
- package/dist/browser/react/Link.js +128 -0
- package/dist/browser/react/Link.js.map +1 -0
- package/dist/browser/react/NavigationProvider.d.ts +63 -0
- package/dist/browser/react/NavigationProvider.d.ts.map +1 -0
- package/dist/browser/react/NavigationProvider.js +216 -0
- package/dist/browser/react/NavigationProvider.js.map +1 -0
- package/dist/browser/react/ScrollRestoration.d.ts +75 -0
- package/dist/browser/react/ScrollRestoration.d.ts.map +1 -0
- package/dist/browser/react/ScrollRestoration.js +57 -0
- package/dist/browser/react/ScrollRestoration.js.map +1 -0
- package/dist/browser/react/context.d.ts +46 -0
- package/dist/browser/react/context.d.ts.map +1 -0
- package/dist/browser/react/context.js +10 -0
- package/dist/browser/react/context.js.map +1 -0
- package/dist/browser/react/index.d.ts +11 -0
- package/dist/browser/react/index.d.ts.map +1 -0
- package/dist/browser/react/index.js +22 -0
- package/dist/browser/react/index.js.map +1 -0
- package/dist/browser/react/location-state-shared.d.ts +63 -0
- package/dist/browser/react/location-state-shared.d.ts.map +1 -0
- package/dist/browser/react/location-state-shared.js +81 -0
- package/dist/browser/react/location-state-shared.js.map +1 -0
- package/dist/browser/react/location-state.d.ts +23 -0
- package/dist/browser/react/location-state.d.ts.map +1 -0
- package/dist/browser/react/location-state.js +29 -0
- package/dist/browser/react/location-state.js.map +1 -0
- package/dist/browser/react/mount-context.d.ts +24 -0
- package/dist/browser/react/mount-context.d.ts.map +1 -0
- package/dist/browser/react/mount-context.js +24 -0
- package/dist/browser/react/mount-context.js.map +1 -0
- package/dist/browser/react/use-action.d.ts +64 -0
- package/dist/browser/react/use-action.d.ts.map +1 -0
- package/dist/browser/react/use-action.js +134 -0
- package/dist/browser/react/use-action.js.map +1 -0
- package/dist/browser/react/use-client-cache.d.ts +41 -0
- package/dist/browser/react/use-client-cache.d.ts.map +1 -0
- package/dist/browser/react/use-client-cache.js +39 -0
- package/dist/browser/react/use-client-cache.js.map +1 -0
- package/dist/browser/react/use-handle.d.ts +31 -0
- package/dist/browser/react/use-handle.d.ts.map +1 -0
- package/dist/browser/react/use-handle.js +144 -0
- package/dist/browser/react/use-handle.js.map +1 -0
- package/dist/browser/react/use-href.d.ts +33 -0
- package/dist/browser/react/use-href.d.ts.map +1 -0
- package/dist/browser/react/use-href.js +39 -0
- package/dist/browser/react/use-href.js.map +1 -0
- package/dist/browser/react/use-link-status.d.ts +37 -0
- package/dist/browser/react/use-link-status.d.ts.map +1 -0
- package/dist/browser/react/use-link-status.js +99 -0
- package/dist/browser/react/use-link-status.js.map +1 -0
- package/dist/browser/react/use-mount.d.ts +25 -0
- package/dist/browser/react/use-mount.d.ts.map +1 -0
- package/dist/browser/react/use-mount.js +30 -0
- package/dist/browser/react/use-mount.js.map +1 -0
- package/dist/browser/react/use-navigation.d.ts +27 -0
- package/dist/browser/react/use-navigation.d.ts.map +1 -0
- package/dist/browser/react/use-navigation.js +87 -0
- package/dist/browser/react/use-navigation.js.map +1 -0
- package/dist/browser/react/use-segments.d.ts +38 -0
- package/dist/browser/react/use-segments.d.ts.map +1 -0
- package/dist/browser/react/use-segments.js +130 -0
- package/dist/browser/react/use-segments.js.map +1 -0
- package/dist/browser/request-controller.d.ts +26 -0
- package/dist/browser/request-controller.d.ts.map +1 -0
- package/dist/browser/request-controller.js +147 -0
- package/dist/browser/request-controller.js.map +1 -0
- package/dist/browser/rsc-router.d.ts +129 -0
- package/dist/browser/rsc-router.d.ts.map +1 -0
- package/dist/browser/rsc-router.js +195 -0
- package/dist/browser/rsc-router.js.map +1 -0
- package/dist/browser/scroll-restoration.d.ts +93 -0
- package/dist/browser/scroll-restoration.d.ts.map +1 -0
- package/dist/browser/scroll-restoration.js +321 -0
- package/dist/browser/scroll-restoration.js.map +1 -0
- package/dist/browser/segment-structure-assert.d.ts +17 -0
- package/dist/browser/segment-structure-assert.d.ts.map +1 -0
- package/dist/browser/segment-structure-assert.js +59 -0
- package/dist/browser/segment-structure-assert.js.map +1 -0
- package/dist/browser/server-action-bridge.d.ts +26 -0
- package/dist/browser/server-action-bridge.d.ts.map +1 -0
- package/dist/browser/server-action-bridge.js +668 -0
- package/dist/browser/server-action-bridge.js.map +1 -0
- package/dist/browser/shallow.d.ts +12 -0
- package/dist/browser/shallow.d.ts.map +1 -0
- package/dist/browser/shallow.js +34 -0
- package/dist/browser/shallow.js.map +1 -0
- package/dist/browser/types.d.ts +369 -0
- package/dist/browser/types.d.ts.map +1 -0
- package/dist/browser/types.js +2 -0
- package/dist/browser/types.js.map +1 -0
- package/dist/build/__tests__/generate-cli.test.d.ts +2 -0
- package/dist/build/__tests__/generate-cli.test.d.ts.map +1 -0
- package/dist/build/__tests__/generate-cli.test.js +237 -0
- package/dist/build/__tests__/generate-cli.test.js.map +1 -0
- package/dist/build/__tests__/generate-manifest.test.d.ts +2 -0
- package/dist/build/__tests__/generate-manifest.test.d.ts.map +1 -0
- package/dist/build/__tests__/generate-manifest.test.js +119 -0
- package/dist/build/__tests__/generate-manifest.test.js.map +1 -0
- package/dist/build/__tests__/generate-route-types.test.d.ts +2 -0
- package/dist/build/__tests__/generate-route-types.test.d.ts.map +1 -0
- package/dist/build/__tests__/generate-route-types.test.js +620 -0
- package/dist/build/__tests__/generate-route-types.test.js.map +1 -0
- package/dist/build/__tests__/per-router-manifest.test.d.ts +2 -0
- package/dist/build/__tests__/per-router-manifest.test.d.ts.map +1 -0
- package/dist/build/__tests__/per-router-manifest.test.js +308 -0
- package/dist/build/__tests__/per-router-manifest.test.js.map +1 -0
- package/dist/build/generate-manifest.d.ts +81 -0
- package/dist/build/generate-manifest.d.ts.map +1 -0
- package/dist/build/generate-manifest.js +276 -0
- package/dist/build/generate-manifest.js.map +1 -0
- package/dist/build/generate-route-types.d.ts +115 -0
- package/dist/build/generate-route-types.d.ts.map +1 -0
- package/dist/build/generate-route-types.js +740 -0
- package/dist/build/generate-route-types.js.map +1 -0
- package/dist/build/index.d.ts +21 -0
- package/dist/build/index.d.ts.map +1 -0
- package/dist/build/index.js +21 -0
- package/dist/build/index.js.map +1 -0
- package/dist/build/route-trie.d.ts +71 -0
- package/dist/build/route-trie.d.ts.map +1 -0
- package/dist/build/route-trie.js +175 -0
- package/dist/build/route-trie.js.map +1 -0
- package/dist/cache/__tests__/cache-scope.test.d.ts +2 -0
- package/dist/cache/__tests__/cache-scope.test.d.ts.map +1 -0
- package/dist/cache/__tests__/cache-scope.test.js +208 -0
- package/dist/cache/__tests__/cache-scope.test.js.map +1 -0
- package/dist/cache/__tests__/document-cache.test.d.ts +2 -0
- package/dist/cache/__tests__/document-cache.test.d.ts.map +1 -0
- package/dist/cache/__tests__/document-cache.test.js +345 -0
- package/dist/cache/__tests__/document-cache.test.js.map +1 -0
- package/dist/cache/__tests__/memory-segment-store.test.d.ts +2 -0
- package/dist/cache/__tests__/memory-segment-store.test.d.ts.map +1 -0
- package/dist/cache/__tests__/memory-segment-store.test.js +425 -0
- package/dist/cache/__tests__/memory-segment-store.test.js.map +1 -0
- package/dist/cache/__tests__/memory-store.test.d.ts +2 -0
- package/dist/cache/__tests__/memory-store.test.d.ts.map +1 -0
- package/dist/cache/__tests__/memory-store.test.js +367 -0
- package/dist/cache/__tests__/memory-store.test.js.map +1 -0
- package/dist/cache/cache-scope.d.ts +102 -0
- package/dist/cache/cache-scope.d.ts.map +1 -0
- package/dist/cache/cache-scope.js +440 -0
- package/dist/cache/cache-scope.js.map +1 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts +2 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts.map +1 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.js +330 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.js.map +1 -0
- package/dist/cache/cf/cf-cache-store.d.ts +165 -0
- package/dist/cache/cf/cf-cache-store.d.ts.map +1 -0
- package/dist/cache/cf/cf-cache-store.js +242 -0
- package/dist/cache/cf/cf-cache-store.js.map +1 -0
- package/dist/cache/cf/index.d.ts +14 -0
- package/dist/cache/cf/index.d.ts.map +1 -0
- package/dist/cache/cf/index.js +17 -0
- package/dist/cache/cf/index.js.map +1 -0
- package/dist/cache/document-cache.d.ts +64 -0
- package/dist/cache/document-cache.d.ts.map +1 -0
- package/dist/cache/document-cache.js +228 -0
- package/dist/cache/document-cache.js.map +1 -0
- package/dist/cache/index.d.ts +19 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +21 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cache/memory-segment-store.d.ts +110 -0
- package/dist/cache/memory-segment-store.d.ts.map +1 -0
- package/dist/cache/memory-segment-store.js +117 -0
- package/dist/cache/memory-segment-store.js.map +1 -0
- package/dist/cache/memory-store.d.ts +41 -0
- package/dist/cache/memory-store.d.ts.map +1 -0
- package/dist/cache/memory-store.js +191 -0
- package/dist/cache/memory-store.js.map +1 -0
- package/dist/cache/types.d.ts +317 -0
- package/dist/cache/types.d.ts.map +1 -0
- package/dist/cache/types.js +12 -0
- package/dist/cache/types.js.map +1 -0
- package/dist/client.d.ts +248 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +367 -0
- package/dist/client.js.map +1 -0
- package/dist/client.rsc.d.ts +26 -0
- package/dist/client.rsc.d.ts.map +1 -0
- package/dist/client.rsc.js +46 -0
- package/dist/client.rsc.js.map +1 -0
- package/dist/component-utils.d.ts +36 -0
- package/dist/component-utils.d.ts.map +1 -0
- package/dist/component-utils.js +61 -0
- package/dist/component-utils.js.map +1 -0
- package/dist/components/DefaultDocument.d.ts +13 -0
- package/dist/components/DefaultDocument.d.ts.map +1 -0
- package/dist/components/DefaultDocument.js +15 -0
- package/dist/components/DefaultDocument.js.map +1 -0
- package/dist/debug.d.ts +58 -0
- package/dist/debug.d.ts.map +1 -0
- package/dist/debug.js +157 -0
- package/dist/debug.js.map +1 -0
- package/dist/default-error-boundary.d.ts +11 -0
- package/dist/default-error-boundary.d.ts.map +1 -0
- package/dist/default-error-boundary.js +45 -0
- package/dist/default-error-boundary.js.map +1 -0
- package/dist/deps/browser.d.ts +2 -0
- package/dist/deps/browser.d.ts.map +1 -0
- package/dist/deps/browser.js +3 -0
- package/dist/deps/browser.js.map +1 -0
- package/dist/deps/html-stream-client.d.ts +2 -0
- package/dist/deps/html-stream-client.d.ts.map +1 -0
- package/dist/deps/html-stream-client.js +3 -0
- package/dist/deps/html-stream-client.js.map +1 -0
- package/dist/deps/html-stream-server.d.ts +2 -0
- package/dist/deps/html-stream-server.d.ts.map +1 -0
- package/dist/deps/html-stream-server.js +3 -0
- package/dist/deps/html-stream-server.js.map +1 -0
- package/dist/deps/rsc.d.ts +2 -0
- package/dist/deps/rsc.d.ts.map +1 -0
- package/dist/deps/rsc.js +4 -0
- package/dist/deps/rsc.js.map +1 -0
- package/dist/deps/ssr.d.ts +2 -0
- package/dist/deps/ssr.d.ts.map +1 -0
- package/dist/deps/ssr.js +3 -0
- package/dist/deps/ssr.js.map +1 -0
- package/dist/errors.d.ts +174 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +241 -0
- package/dist/errors.js.map +1 -0
- package/dist/handle.d.ts +78 -0
- package/dist/handle.d.ts.map +1 -0
- package/dist/handle.js +82 -0
- package/dist/handle.js.map +1 -0
- package/dist/handles/MetaTags.d.ts +14 -0
- package/dist/handles/MetaTags.d.ts.map +1 -0
- package/dist/handles/MetaTags.js +136 -0
- package/dist/handles/MetaTags.js.map +1 -0
- package/dist/handles/index.d.ts +6 -0
- package/dist/handles/index.d.ts.map +1 -0
- package/dist/handles/index.js +6 -0
- package/dist/handles/index.js.map +1 -0
- package/dist/handles/meta.d.ts +39 -0
- package/dist/handles/meta.d.ts.map +1 -0
- package/dist/handles/meta.js +202 -0
- package/dist/handles/meta.js.map +1 -0
- package/dist/host/__tests__/errors.test.d.ts +2 -0
- package/dist/host/__tests__/errors.test.d.ts.map +1 -0
- package/dist/host/__tests__/errors.test.js +76 -0
- package/dist/host/__tests__/errors.test.js.map +1 -0
- package/dist/host/__tests__/pattern-comprehensive.test.d.ts +2 -0
- package/dist/host/__tests__/pattern-comprehensive.test.d.ts.map +1 -0
- package/dist/host/__tests__/pattern-comprehensive.test.js +732 -0
- package/dist/host/__tests__/pattern-comprehensive.test.js.map +1 -0
- package/dist/host/__tests__/pattern-matcher.test.d.ts +2 -0
- package/dist/host/__tests__/pattern-matcher.test.d.ts.map +1 -0
- package/dist/host/__tests__/pattern-matcher.test.js +251 -0
- package/dist/host/__tests__/pattern-matcher.test.js.map +1 -0
- package/dist/host/__tests__/router.test.d.ts +2 -0
- package/dist/host/__tests__/router.test.d.ts.map +1 -0
- package/dist/host/__tests__/router.test.js +241 -0
- package/dist/host/__tests__/router.test.js.map +1 -0
- package/dist/host/__tests__/testing.test.d.ts +2 -0
- package/dist/host/__tests__/testing.test.d.ts.map +1 -0
- package/dist/host/__tests__/testing.test.js +64 -0
- package/dist/host/__tests__/testing.test.js.map +1 -0
- package/dist/host/__tests__/utils.test.d.ts +2 -0
- package/dist/host/__tests__/utils.test.d.ts.map +1 -0
- package/dist/host/__tests__/utils.test.js +29 -0
- package/dist/host/__tests__/utils.test.js.map +1 -0
- package/dist/host/cookie-handler.d.ts +34 -0
- package/dist/host/cookie-handler.d.ts.map +1 -0
- package/dist/host/cookie-handler.js +124 -0
- package/dist/host/cookie-handler.js.map +1 -0
- package/dist/host/errors.d.ts +56 -0
- package/dist/host/errors.d.ts.map +1 -0
- package/dist/host/errors.js +79 -0
- package/dist/host/errors.js.map +1 -0
- package/dist/host/index.d.ts +29 -0
- package/dist/host/index.d.ts.map +1 -0
- package/dist/host/index.js +32 -0
- package/dist/host/index.js.map +1 -0
- package/dist/host/pattern-matcher.d.ts +36 -0
- package/dist/host/pattern-matcher.d.ts.map +1 -0
- package/dist/host/pattern-matcher.js +172 -0
- package/dist/host/pattern-matcher.js.map +1 -0
- package/dist/host/router.d.ts +26 -0
- package/dist/host/router.d.ts.map +1 -0
- package/dist/host/router.js +218 -0
- package/dist/host/router.js.map +1 -0
- package/dist/host/testing.d.ts +36 -0
- package/dist/host/testing.d.ts.map +1 -0
- package/dist/host/testing.js +55 -0
- package/dist/host/testing.js.map +1 -0
- package/dist/host/types.d.ts +115 -0
- package/dist/host/types.d.ts.map +1 -0
- package/dist/host/types.js +7 -0
- package/dist/host/types.js.map +1 -0
- package/dist/host/utils.d.ts +21 -0
- package/dist/host/utils.d.ts.map +1 -0
- package/dist/host/utils.js +23 -0
- package/dist/host/utils.js.map +1 -0
- package/dist/href-client.d.ts +131 -0
- package/dist/href-client.d.ts.map +1 -0
- package/dist/href-client.js +64 -0
- package/dist/href-client.js.map +1 -0
- package/dist/href-context.d.ts +29 -0
- package/dist/href-context.d.ts.map +1 -0
- package/dist/href-context.js +21 -0
- package/dist/href-context.js.map +1 -0
- package/dist/index.d.ts +73 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +91 -0
- package/dist/index.js.map +1 -0
- package/dist/index.rsc.d.ts +32 -0
- package/dist/index.rsc.d.ts.map +1 -0
- package/dist/index.rsc.js +40 -0
- package/dist/index.rsc.js.map +1 -0
- package/dist/internal-debug.d.ts +2 -0
- package/dist/internal-debug.d.ts.map +1 -0
- package/dist/internal-debug.js +5 -0
- package/dist/internal-debug.js.map +1 -0
- package/dist/loader.d.ts +14 -0
- package/dist/loader.d.ts.map +1 -0
- package/dist/loader.js +20 -0
- package/dist/loader.js.map +1 -0
- package/dist/loader.rsc.d.ts +19 -0
- package/dist/loader.rsc.d.ts.map +1 -0
- package/dist/loader.rsc.js +99 -0
- package/dist/loader.rsc.js.map +1 -0
- package/dist/network-error-thrower.d.ts +17 -0
- package/dist/network-error-thrower.d.ts.map +1 -0
- package/dist/network-error-thrower.js +14 -0
- package/dist/network-error-thrower.js.map +1 -0
- package/dist/outlet-context.d.ts +13 -0
- package/dist/outlet-context.d.ts.map +1 -0
- package/dist/outlet-context.js +3 -0
- package/dist/outlet-context.js.map +1 -0
- package/dist/prerender/__tests__/param-hash.test.d.ts +2 -0
- package/dist/prerender/__tests__/param-hash.test.d.ts.map +1 -0
- package/dist/prerender/__tests__/param-hash.test.js +148 -0
- package/dist/prerender/__tests__/param-hash.test.js.map +1 -0
- package/dist/prerender/param-hash.d.ts +16 -0
- package/dist/prerender/param-hash.d.ts.map +1 -0
- package/dist/prerender/param-hash.js +36 -0
- package/dist/prerender/param-hash.js.map +1 -0
- package/dist/prerender/store.d.ts +38 -0
- package/dist/prerender/store.d.ts.map +1 -0
- package/dist/prerender/store.js +61 -0
- package/dist/prerender/store.js.map +1 -0
- package/dist/prerender.d.ts +66 -0
- package/dist/prerender.d.ts.map +1 -0
- package/dist/prerender.js +57 -0
- package/dist/prerender.js.map +1 -0
- package/dist/reverse.d.ts +196 -0
- package/dist/reverse.d.ts.map +1 -0
- package/dist/reverse.js +78 -0
- package/dist/reverse.js.map +1 -0
- package/dist/root-error-boundary.d.ts +33 -0
- package/dist/root-error-boundary.d.ts.map +1 -0
- package/dist/root-error-boundary.js +165 -0
- package/dist/root-error-boundary.js.map +1 -0
- package/dist/route-content-wrapper.d.ts +46 -0
- package/dist/route-content-wrapper.d.ts.map +1 -0
- package/dist/route-content-wrapper.js +77 -0
- package/dist/route-content-wrapper.js.map +1 -0
- package/dist/route-definition.d.ts +421 -0
- package/dist/route-definition.d.ts.map +1 -0
- package/dist/route-definition.js +868 -0
- package/dist/route-definition.js.map +1 -0
- package/dist/route-map-builder.d.ts +155 -0
- package/dist/route-map-builder.d.ts.map +1 -0
- package/dist/route-map-builder.js +237 -0
- package/dist/route-map-builder.js.map +1 -0
- package/dist/route-types.d.ts +165 -0
- package/dist/route-types.d.ts.map +1 -0
- package/dist/route-types.js +7 -0
- package/dist/route-types.js.map +1 -0
- package/dist/router/__tests__/handler-context.test.d.ts +2 -0
- package/dist/router/__tests__/handler-context.test.d.ts.map +1 -0
- package/dist/router/__tests__/handler-context.test.js +65 -0
- package/dist/router/__tests__/handler-context.test.js.map +1 -0
- package/dist/router/__tests__/loader-cycle-detection.test.d.ts +2 -0
- package/dist/router/__tests__/loader-cycle-detection.test.d.ts.map +1 -0
- package/dist/router/__tests__/loader-cycle-detection.test.js +221 -0
- package/dist/router/__tests__/loader-cycle-detection.test.js.map +1 -0
- package/dist/router/__tests__/match-context.test.d.ts +2 -0
- package/dist/router/__tests__/match-context.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-context.test.js +92 -0
- package/dist/router/__tests__/match-context.test.js.map +1 -0
- package/dist/router/__tests__/match-pipelines.test.d.ts +2 -0
- package/dist/router/__tests__/match-pipelines.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-pipelines.test.js +417 -0
- package/dist/router/__tests__/match-pipelines.test.js.map +1 -0
- package/dist/router/__tests__/match-result.test.d.ts +2 -0
- package/dist/router/__tests__/match-result.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-result.test.js +457 -0
- package/dist/router/__tests__/match-result.test.js.map +1 -0
- package/dist/router/__tests__/on-error.test.d.ts +2 -0
- package/dist/router/__tests__/on-error.test.d.ts.map +1 -0
- package/dist/router/__tests__/on-error.test.js +678 -0
- package/dist/router/__tests__/on-error.test.js.map +1 -0
- package/dist/router/__tests__/pattern-matching.test.d.ts +2 -0
- package/dist/router/__tests__/pattern-matching.test.d.ts.map +1 -0
- package/dist/router/__tests__/pattern-matching.test.js +629 -0
- package/dist/router/__tests__/pattern-matching.test.js.map +1 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts +2 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts.map +1 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.js +155 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.js.map +1 -0
- package/dist/router/error-handling.d.ts +77 -0
- package/dist/router/error-handling.d.ts.map +1 -0
- package/dist/router/error-handling.js +202 -0
- package/dist/router/error-handling.js.map +1 -0
- package/dist/router/handler-context.d.ts +20 -0
- package/dist/router/handler-context.d.ts.map +1 -0
- package/dist/router/handler-context.js +198 -0
- package/dist/router/handler-context.js.map +1 -0
- package/dist/router/intercept-resolution.d.ts +66 -0
- package/dist/router/intercept-resolution.d.ts.map +1 -0
- package/dist/router/intercept-resolution.js +246 -0
- package/dist/router/intercept-resolution.js.map +1 -0
- package/dist/router/loader-resolution.d.ts +64 -0
- package/dist/router/loader-resolution.d.ts.map +1 -0
- package/dist/router/loader-resolution.js +284 -0
- package/dist/router/loader-resolution.js.map +1 -0
- package/dist/router/logging.d.ts +15 -0
- package/dist/router/logging.d.ts.map +1 -0
- package/dist/router/logging.js +99 -0
- package/dist/router/logging.js.map +1 -0
- package/dist/router/manifest.d.ts +22 -0
- package/dist/router/manifest.d.ts.map +1 -0
- package/dist/router/manifest.js +181 -0
- package/dist/router/manifest.js.map +1 -0
- package/dist/router/match-api.d.ts +35 -0
- package/dist/router/match-api.d.ts.map +1 -0
- package/dist/router/match-api.js +406 -0
- package/dist/router/match-api.js.map +1 -0
- package/dist/router/match-context.d.ts +206 -0
- package/dist/router/match-context.d.ts.map +1 -0
- package/dist/router/match-context.js +17 -0
- package/dist/router/match-context.js.map +1 -0
- package/dist/router/match-middleware/background-revalidation.d.ts +127 -0
- package/dist/router/match-middleware/background-revalidation.d.ts.map +1 -0
- package/dist/router/match-middleware/background-revalidation.js +75 -0
- package/dist/router/match-middleware/background-revalidation.js.map +1 -0
- package/dist/router/match-middleware/cache-lookup.d.ts +112 -0
- package/dist/router/match-middleware/cache-lookup.d.ts.map +1 -0
- package/dist/router/match-middleware/cache-lookup.js +257 -0
- package/dist/router/match-middleware/cache-lookup.js.map +1 -0
- package/dist/router/match-middleware/cache-store.d.ts +113 -0
- package/dist/router/match-middleware/cache-store.d.ts.map +1 -0
- package/dist/router/match-middleware/cache-store.js +108 -0
- package/dist/router/match-middleware/cache-store.js.map +1 -0
- package/dist/router/match-middleware/index.d.ts +81 -0
- package/dist/router/match-middleware/index.d.ts.map +1 -0
- package/dist/router/match-middleware/index.js +80 -0
- package/dist/router/match-middleware/index.js.map +1 -0
- package/dist/router/match-middleware/intercept-resolution.d.ts +117 -0
- package/dist/router/match-middleware/intercept-resolution.d.ts.map +1 -0
- package/dist/router/match-middleware/intercept-resolution.js +134 -0
- package/dist/router/match-middleware/intercept-resolution.js.map +1 -0
- package/dist/router/match-middleware/segment-resolution.d.ts +99 -0
- package/dist/router/match-middleware/segment-resolution.d.ts.map +1 -0
- package/dist/router/match-middleware/segment-resolution.js +53 -0
- package/dist/router/match-middleware/segment-resolution.js.map +1 -0
- package/dist/router/match-pipelines.d.ts +147 -0
- package/dist/router/match-pipelines.d.ts.map +1 -0
- package/dist/router/match-pipelines.js +82 -0
- package/dist/router/match-pipelines.js.map +1 -0
- package/dist/router/match-result.d.ts +126 -0
- package/dist/router/match-result.d.ts.map +1 -0
- package/dist/router/match-result.js +93 -0
- package/dist/router/match-result.js.map +1 -0
- package/dist/router/metrics.d.ts +20 -0
- package/dist/router/metrics.d.ts.map +1 -0
- package/dist/router/metrics.js +47 -0
- package/dist/router/metrics.js.map +1 -0
- package/dist/router/middleware.d.ts +249 -0
- package/dist/router/middleware.d.ts.map +1 -0
- package/dist/router/middleware.js +434 -0
- package/dist/router/middleware.js.map +1 -0
- package/dist/router/middleware.test.d.ts +2 -0
- package/dist/router/middleware.test.d.ts.map +1 -0
- package/dist/router/middleware.test.js +816 -0
- package/dist/router/middleware.test.js.map +1 -0
- package/dist/router/pattern-matching.d.ts +149 -0
- package/dist/router/pattern-matching.d.ts.map +1 -0
- package/dist/router/pattern-matching.js +349 -0
- package/dist/router/pattern-matching.js.map +1 -0
- package/dist/router/revalidation.d.ts +44 -0
- package/dist/router/revalidation.d.ts.map +1 -0
- package/dist/router/revalidation.js +147 -0
- package/dist/router/revalidation.js.map +1 -0
- package/dist/router/router-context.d.ts +135 -0
- package/dist/router/router-context.d.ts.map +1 -0
- package/dist/router/router-context.js +36 -0
- package/dist/router/router-context.js.map +1 -0
- package/dist/router/segment-resolution.d.ts +127 -0
- package/dist/router/segment-resolution.d.ts.map +1 -0
- package/dist/router/segment-resolution.js +919 -0
- package/dist/router/segment-resolution.js.map +1 -0
- package/dist/router/trie-matching.d.ts +40 -0
- package/dist/router/trie-matching.d.ts.map +1 -0
- package/dist/router/trie-matching.js +127 -0
- package/dist/router/trie-matching.js.map +1 -0
- package/dist/router/types.d.ts +136 -0
- package/dist/router/types.d.ts.map +1 -0
- package/dist/router/types.js +7 -0
- package/dist/router/types.js.map +1 -0
- package/dist/router.d.ts +753 -0
- package/dist/router.d.ts.map +1 -0
- package/dist/router.gen.d.ts +6 -0
- package/dist/router.gen.d.ts.map +1 -0
- package/dist/router.gen.js +6 -0
- package/dist/router.gen.js.map +1 -0
- package/dist/router.js +1304 -0
- package/dist/router.js.map +1 -0
- package/dist/rsc/__tests__/helpers.test.d.ts +2 -0
- package/dist/rsc/__tests__/helpers.test.d.ts.map +1 -0
- package/dist/rsc/__tests__/helpers.test.js +140 -0
- package/dist/rsc/__tests__/helpers.test.js.map +1 -0
- package/dist/rsc/handler.d.ts +45 -0
- package/dist/rsc/handler.d.ts.map +1 -0
- package/dist/rsc/handler.js +1172 -0
- package/dist/rsc/handler.js.map +1 -0
- package/dist/rsc/helpers.d.ts +16 -0
- package/dist/rsc/helpers.d.ts.map +1 -0
- package/dist/rsc/helpers.js +55 -0
- package/dist/rsc/helpers.js.map +1 -0
- package/dist/rsc/index.d.ts +22 -0
- package/dist/rsc/index.d.ts.map +1 -0
- package/dist/rsc/index.js +23 -0
- package/dist/rsc/index.js.map +1 -0
- package/dist/rsc/nonce.d.ts +9 -0
- package/dist/rsc/nonce.d.ts.map +1 -0
- package/dist/rsc/nonce.js +18 -0
- package/dist/rsc/nonce.js.map +1 -0
- package/dist/rsc/types.d.ts +206 -0
- package/dist/rsc/types.d.ts.map +1 -0
- package/dist/rsc/types.js +8 -0
- package/dist/rsc/types.js.map +1 -0
- package/dist/search-params.d.ts +103 -0
- package/dist/search-params.d.ts.map +1 -0
- package/dist/search-params.js +74 -0
- package/dist/search-params.js.map +1 -0
- package/dist/segment-system.d.ts +75 -0
- package/dist/segment-system.d.ts.map +1 -0
- package/dist/segment-system.js +336 -0
- package/dist/segment-system.js.map +1 -0
- package/dist/server/context.d.ts +245 -0
- package/dist/server/context.d.ts.map +1 -0
- package/dist/server/context.js +197 -0
- package/dist/server/context.js.map +1 -0
- package/dist/server/fetchable-loader-store.d.ts +18 -0
- package/dist/server/fetchable-loader-store.d.ts.map +1 -0
- package/dist/server/fetchable-loader-store.js +18 -0
- package/dist/server/fetchable-loader-store.js.map +1 -0
- package/dist/server/handle-store.d.ts +85 -0
- package/dist/server/handle-store.d.ts.map +1 -0
- package/dist/server/handle-store.js +142 -0
- package/dist/server/handle-store.js.map +1 -0
- package/dist/server/loader-registry.d.ts +55 -0
- package/dist/server/loader-registry.d.ts.map +1 -0
- package/dist/server/loader-registry.js +132 -0
- package/dist/server/loader-registry.js.map +1 -0
- package/dist/server/request-context.d.ts +226 -0
- package/dist/server/request-context.d.ts.map +1 -0
- package/dist/server/request-context.js +290 -0
- package/dist/server/request-context.js.map +1 -0
- package/dist/server/root-layout.d.ts +4 -0
- package/dist/server/root-layout.d.ts.map +1 -0
- package/dist/server/root-layout.js +5 -0
- package/dist/server/root-layout.js.map +1 -0
- package/dist/server.d.ts +15 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +20 -0
- package/dist/server.js.map +1 -0
- package/dist/ssr/__tests__/ssr-handler.test.d.ts +2 -0
- package/dist/ssr/__tests__/ssr-handler.test.d.ts.map +1 -0
- package/dist/ssr/__tests__/ssr-handler.test.js +132 -0
- package/dist/ssr/__tests__/ssr-handler.test.js.map +1 -0
- package/dist/ssr/index.d.ts +98 -0
- package/dist/ssr/index.d.ts.map +1 -0
- package/dist/ssr/index.js +158 -0
- package/dist/ssr/index.js.map +1 -0
- package/dist/static-handler.d.ts +50 -0
- package/dist/static-handler.d.ts.map +1 -0
- package/dist/static-handler.gen.d.ts +5 -0
- package/dist/static-handler.gen.d.ts.map +1 -0
- package/dist/static-handler.gen.js +5 -0
- package/dist/static-handler.gen.js.map +1 -0
- package/dist/static-handler.js +29 -0
- package/dist/static-handler.js.map +1 -0
- package/dist/theme/ThemeProvider.d.ts +20 -0
- package/dist/theme/ThemeProvider.d.ts.map +1 -0
- package/dist/theme/ThemeProvider.js +240 -0
- package/dist/theme/ThemeProvider.js.map +1 -0
- package/dist/theme/ThemeScript.d.ts +48 -0
- package/dist/theme/ThemeScript.d.ts.map +1 -0
- package/dist/theme/ThemeScript.js +13 -0
- package/dist/theme/ThemeScript.js.map +1 -0
- package/dist/theme/__tests__/theme.test.d.ts +2 -0
- package/dist/theme/__tests__/theme.test.d.ts.map +1 -0
- package/dist/theme/__tests__/theme.test.js +103 -0
- package/dist/theme/__tests__/theme.test.js.map +1 -0
- package/dist/theme/constants.d.ts +29 -0
- package/dist/theme/constants.d.ts.map +1 -0
- package/dist/theme/constants.js +48 -0
- package/dist/theme/constants.js.map +1 -0
- package/dist/theme/index.d.ts +31 -0
- package/dist/theme/index.d.ts.map +1 -0
- package/dist/theme/index.js +36 -0
- package/dist/theme/index.js.map +1 -0
- package/dist/theme/theme-context.d.ts +40 -0
- package/dist/theme/theme-context.d.ts.map +1 -0
- package/dist/theme/theme-context.js +60 -0
- package/dist/theme/theme-context.js.map +1 -0
- package/dist/theme/theme-script.d.ts +27 -0
- package/dist/theme/theme-script.d.ts.map +1 -0
- package/dist/theme/theme-script.js +147 -0
- package/dist/theme/theme-script.js.map +1 -0
- package/dist/theme/types.d.ts +163 -0
- package/dist/theme/types.d.ts.map +1 -0
- package/dist/theme/types.js +11 -0
- package/dist/theme/types.js.map +1 -0
- package/dist/theme/use-theme.d.ts +12 -0
- package/dist/theme/use-theme.d.ts.map +1 -0
- package/dist/theme/use-theme.js +40 -0
- package/dist/theme/use-theme.js.map +1 -0
- package/dist/types/browser/navigation-client.d.ts +1 -1
- package/dist/types/browser/prefetch/cache.d.ts +9 -0
- package/dist/types/cache/cf/cf-cache-store.d.ts +19 -8
- package/dist/types/cache/cf/cf-cache-types.d.ts +4 -2
- package/dist/types/rsc/shell-capture.d.ts +10 -8
- package/dist/types/segment-fragments.d.ts +27 -4
- package/dist/types/server/request-context.d.ts +21 -8
- package/dist/types.d.ts +1479 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +10 -0
- package/dist/types.js.map +1 -0
- package/dist/urls.d.ts +441 -0
- package/dist/urls.d.ts.map +1 -0
- package/dist/urls.gen.d.ts +8 -0
- package/dist/urls.gen.d.ts.map +1 -0
- package/dist/urls.gen.js +8 -0
- package/dist/urls.gen.js.map +1 -0
- package/dist/urls.js +443 -0
- package/dist/urls.js.map +1 -0
- package/dist/use-loader.d.ts +127 -0
- package/dist/use-loader.d.ts.map +1 -0
- package/dist/use-loader.js +237 -0
- package/dist/use-loader.js.map +1 -0
- package/dist/vite/__tests__/ast-handler-extract.test.d.ts +2 -0
- package/dist/vite/__tests__/ast-handler-extract.test.d.ts.map +1 -0
- package/dist/vite/__tests__/ast-handler-extract.test.js +294 -0
- package/dist/vite/__tests__/ast-handler-extract.test.js.map +1 -0
- package/dist/vite/__tests__/expose-id-utils.test.d.ts +2 -0
- package/dist/vite/__tests__/expose-id-utils.test.d.ts.map +1 -0
- package/dist/vite/__tests__/expose-id-utils.test.js +224 -0
- package/dist/vite/__tests__/expose-id-utils.test.js.map +1 -0
- package/dist/vite/__tests__/expose-internal-ids.test.d.ts +2 -0
- package/dist/vite/__tests__/expose-internal-ids.test.d.ts.map +1 -0
- package/dist/vite/__tests__/expose-internal-ids.test.js +647 -0
- package/dist/vite/__tests__/expose-internal-ids.test.js.map +1 -0
- package/dist/vite/__tests__/expose-router-id.test.d.ts +2 -0
- package/dist/vite/__tests__/expose-router-id.test.d.ts.map +1 -0
- package/dist/vite/__tests__/expose-router-id.test.js +39 -0
- package/dist/vite/__tests__/expose-router-id.test.js.map +1 -0
- package/dist/vite/ast-handler-extract.d.ts +49 -0
- package/dist/vite/ast-handler-extract.d.ts.map +1 -0
- package/dist/vite/ast-handler-extract.js +249 -0
- package/dist/vite/ast-handler-extract.js.map +1 -0
- package/dist/vite/expose-action-id.d.ts +19 -0
- package/dist/vite/expose-action-id.d.ts.map +1 -0
- package/dist/vite/expose-action-id.js +250 -0
- package/dist/vite/expose-action-id.js.map +1 -0
- package/dist/vite/expose-id-utils.d.ts +69 -0
- package/dist/vite/expose-id-utils.d.ts.map +1 -0
- package/dist/vite/expose-id-utils.js +289 -0
- package/dist/vite/expose-id-utils.js.map +1 -0
- package/dist/vite/expose-internal-ids.d.ts +22 -0
- package/dist/vite/expose-internal-ids.d.ts.map +1 -0
- package/dist/vite/expose-internal-ids.js +886 -0
- package/dist/vite/expose-internal-ids.js.map +1 -0
- package/dist/vite/index.d.ts +149 -0
- package/dist/vite/index.d.ts.map +1 -0
- package/dist/vite/index.js +1 -1
- package/dist/vite/index.js.bak +5448 -0
- package/dist/vite/index.js.map +1 -0
- package/dist/vite/index.named-routes.gen.ts +103 -0
- package/dist/vite/package-resolution.d.ts +43 -0
- package/dist/vite/package-resolution.d.ts.map +1 -0
- package/dist/vite/package-resolution.js +112 -0
- package/dist/vite/package-resolution.js.map +1 -0
- package/dist/vite/virtual-entries.d.ts +25 -0
- package/dist/vite/virtual-entries.d.ts.map +1 -0
- package/dist/vite/virtual-entries.js +110 -0
- package/dist/vite/virtual-entries.js.map +1 -0
- package/package.json +1 -1
- package/skills/cloudflare/SKILL.md +4 -2
- package/skills/ppr/SKILL.md +25 -9
- package/src/browser/navigation-client.ts +77 -27
- package/src/browser/prefetch/cache.ts +18 -0
- package/src/browser/prefetch/fetch.ts +5 -0
- package/src/browser/rsc-router.tsx +12 -6
- package/src/cache/cache-scope.ts +5 -1
- package/src/cache/cf/cf-cache-store.ts +423 -90
- package/src/cache/cf/cf-cache-types.ts +4 -2
- package/src/cache/document-cache.ts +24 -2
- package/src/rsc/rsc-rendering.ts +61 -6
- package/src/rsc/shell-capture.ts +19 -19
- package/src/segment-fragments.ts +45 -4
- package/src/server/request-context.ts +21 -8
|
@@ -42,6 +42,7 @@ import {
|
|
|
42
42
|
_getRequestContext,
|
|
43
43
|
type RequestContext,
|
|
44
44
|
} from "../../server/request-context.js";
|
|
45
|
+
import { INTERNAL_RANGO_DEBUG } from "../../internal-debug.js";
|
|
45
46
|
import { VERSION } from "@rangojs/router:version";
|
|
46
47
|
import {
|
|
47
48
|
isPerClientSignalHeader,
|
|
@@ -262,10 +263,10 @@ interface KVItemEnvelope {
|
|
|
262
263
|
}
|
|
263
264
|
|
|
264
265
|
/**
|
|
265
|
-
* KV envelope for PPR shell cache entries.
|
|
266
|
+
* Coupled Cache API/KV envelope for PPR shell cache entries.
|
|
266
267
|
* @internal
|
|
267
268
|
*/
|
|
268
|
-
interface
|
|
269
|
+
interface CFShellEnvelope {
|
|
269
270
|
/** base64-encoded prelude bytes */
|
|
270
271
|
p: string;
|
|
271
272
|
/** postponed state JSON, or null (DATA variant — no holes) */
|
|
@@ -309,6 +310,67 @@ interface KVShellEnvelope {
|
|
|
309
310
|
no?: true;
|
|
310
311
|
}
|
|
311
312
|
|
|
313
|
+
type CFShellDebugOutcome =
|
|
314
|
+
| "l1-hit"
|
|
315
|
+
| "l1-miss"
|
|
316
|
+
| "kv-hit"
|
|
317
|
+
| "kv-miss"
|
|
318
|
+
| "kv-promoted"
|
|
319
|
+
| "marker-invalidated"
|
|
320
|
+
| "l1-stored"
|
|
321
|
+
| "kv-stored"
|
|
322
|
+
| "write-invalidated";
|
|
323
|
+
|
|
324
|
+
interface CFShellDebugDetails {
|
|
325
|
+
tier?: "l1" | "kv";
|
|
326
|
+
reason?:
|
|
327
|
+
| "absent"
|
|
328
|
+
| "timeout"
|
|
329
|
+
| "error"
|
|
330
|
+
| "non-200"
|
|
331
|
+
| "corrupt"
|
|
332
|
+
| "malformed"
|
|
333
|
+
| "expired"
|
|
334
|
+
| "unavailable";
|
|
335
|
+
freshness?: "fresh" | "stale";
|
|
336
|
+
status?: number;
|
|
337
|
+
matchMs?: number;
|
|
338
|
+
bodyReadMs?: number;
|
|
339
|
+
markerMs?: number;
|
|
340
|
+
readMs?: number;
|
|
341
|
+
expiresAt?: number;
|
|
342
|
+
remainingTtl?: number;
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
/** Validate the coupled PPR shell envelope before any field reaches resume. */
|
|
346
|
+
function isShellEnvelope(value: unknown): value is CFShellEnvelope {
|
|
347
|
+
if (value == null || typeof value !== "object") return false;
|
|
348
|
+
const envelope = value as Partial<CFShellEnvelope>;
|
|
349
|
+
return (
|
|
350
|
+
typeof envelope.p === "string" &&
|
|
351
|
+
(envelope.po === null || typeof envelope.po === "string") &&
|
|
352
|
+
typeof envelope.rv === "string" &&
|
|
353
|
+
(envelope.bv === undefined || typeof envelope.bv === "string") &&
|
|
354
|
+
typeof envelope.c === "number" &&
|
|
355
|
+
Number.isFinite(envelope.c) &&
|
|
356
|
+
typeof envelope.s === "number" &&
|
|
357
|
+
Number.isFinite(envelope.s) &&
|
|
358
|
+
typeof envelope.e === "number" &&
|
|
359
|
+
Number.isFinite(envelope.e) &&
|
|
360
|
+
(envelope.t === undefined ||
|
|
361
|
+
(Array.isArray(envelope.t) &&
|
|
362
|
+
envelope.t.every((tag) => typeof tag === "string"))) &&
|
|
363
|
+
(envelope.ta === undefined ||
|
|
364
|
+
(typeof envelope.ta === "number" && Number.isFinite(envelope.ta))) &&
|
|
365
|
+
(envelope.i === undefined || typeof envelope.i === "string") &&
|
|
366
|
+
(envelope.sn === undefined || Array.isArray(envelope.sn)) &&
|
|
367
|
+
(envelope.dk === undefined || typeof envelope.dk === "string") &&
|
|
368
|
+
(envelope.lh === undefined || typeof envelope.lh === "boolean") &&
|
|
369
|
+
(envelope.tw === undefined || envelope.tw === true) &&
|
|
370
|
+
(envelope.no === undefined || envelope.no === true)
|
|
371
|
+
);
|
|
372
|
+
}
|
|
373
|
+
|
|
312
374
|
/**
|
|
313
375
|
* KV envelope for document cache entries.
|
|
314
376
|
* @internal
|
|
@@ -515,6 +577,36 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
515
577
|
}
|
|
516
578
|
}
|
|
517
579
|
|
|
580
|
+
/** Build-time-gated shell tier trace for deployed cross-colo diagnostics. */
|
|
581
|
+
private debugShell(
|
|
582
|
+
key: string,
|
|
583
|
+
outcome: CFShellDebugOutcome,
|
|
584
|
+
details: CFShellDebugDetails = {},
|
|
585
|
+
): void {
|
|
586
|
+
if (!INTERNAL_RANGO_DEBUG) return;
|
|
587
|
+
const request = _getRequestContext()?.request as
|
|
588
|
+
| (Request & { cf?: { colo?: unknown } })
|
|
589
|
+
| undefined;
|
|
590
|
+
const ray = request?.headers.get("cf-ray") ?? undefined;
|
|
591
|
+
const cfColo = request?.cf?.colo;
|
|
592
|
+
const colo =
|
|
593
|
+
typeof cfColo === "string"
|
|
594
|
+
? cfColo
|
|
595
|
+
: ray?.includes("-")
|
|
596
|
+
? ray.slice(ray.lastIndexOf("-") + 1)
|
|
597
|
+
: undefined;
|
|
598
|
+
console.log(
|
|
599
|
+
`[CFCacheStore][shell] ${JSON.stringify({
|
|
600
|
+
key,
|
|
601
|
+
outcome,
|
|
602
|
+
at: Date.now(),
|
|
603
|
+
ray,
|
|
604
|
+
colo,
|
|
605
|
+
...details,
|
|
606
|
+
})}`,
|
|
607
|
+
);
|
|
608
|
+
}
|
|
609
|
+
|
|
518
610
|
/**
|
|
519
611
|
* Resolve the cache-key base URL for the current cache operation.
|
|
520
612
|
* Prefers an explicit `baseUrl` option; otherwise derives it from the live
|
|
@@ -1765,17 +1857,18 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
1765
1857
|
}
|
|
1766
1858
|
|
|
1767
1859
|
// ============================================================================
|
|
1768
|
-
// Shell Cache Methods (PPR shell resume) — KV
|
|
1860
|
+
// Shell Cache Methods (PPR shell resume) — Cache API L1 + KV L2
|
|
1769
1861
|
// ============================================================================
|
|
1770
1862
|
//
|
|
1771
|
-
//
|
|
1772
|
-
//
|
|
1773
|
-
//
|
|
1774
|
-
//
|
|
1775
|
-
//
|
|
1776
|
-
//
|
|
1777
|
-
//
|
|
1778
|
-
//
|
|
1863
|
+
// KV remains the durable, cross-colo shell tier. Cache API is a per-colo
|
|
1864
|
+
// read-through accelerator: writes populate both tiers, and a valid KV hit
|
|
1865
|
+
// promotes the same coupled envelope into L1. The family still requires KV;
|
|
1866
|
+
// without it, getShell/putShell no-op and PPR fails open to a full HTML render.
|
|
1867
|
+
//
|
|
1868
|
+
// Shell L1 hits deliberately keep the KV generation-marker check even in
|
|
1869
|
+
// purge mode. A shell's taggedAt is its CAPTURE START, not its write time: an
|
|
1870
|
+
// invalidation can purge while an older capture is still running, then that
|
|
1871
|
+
// capture can land after the purge. The marker check rejects that resurrection.
|
|
1779
1872
|
|
|
1780
1873
|
/**
|
|
1781
1874
|
* Warn once per isolate that the shell family is inert: getShell/putShell
|
|
@@ -1799,10 +1892,10 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
1799
1892
|
}
|
|
1800
1893
|
|
|
1801
1894
|
/**
|
|
1802
|
-
* Get a cached PPR shell entry
|
|
1803
|
-
*
|
|
1804
|
-
*
|
|
1805
|
-
*
|
|
1895
|
+
* Get a cached PPR shell entry from Cache API, falling through to KV and
|
|
1896
|
+
* promoting a valid KV hit. Both tiers store one envelope so the prelude,
|
|
1897
|
+
* postponed state, snapshot, versions, and generation metadata cannot mix.
|
|
1898
|
+
* SWR remains a plain staleness flag; the capture scheduler's module-level
|
|
1806
1899
|
* in-flight set is the recapture stampede guard.
|
|
1807
1900
|
*/
|
|
1808
1901
|
async getShell(
|
|
@@ -1813,56 +1906,128 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
1813
1906
|
return null;
|
|
1814
1907
|
}
|
|
1815
1908
|
try {
|
|
1816
|
-
const
|
|
1817
|
-
const
|
|
1818
|
-
|
|
1819
|
-
|
|
1820
|
-
|
|
1821
|
-
|
|
1822
|
-
|
|
1823
|
-
|
|
1824
|
-
|
|
1825
|
-
|
|
1909
|
+
const cache = await this.getCache();
|
|
1910
|
+
const request = this.keyToRequest(`shell:${key}`);
|
|
1911
|
+
const matchStartedAt = INTERNAL_RANGO_DEBUG ? Date.now() : 0;
|
|
1912
|
+
const {
|
|
1913
|
+
response,
|
|
1914
|
+
timedOut,
|
|
1915
|
+
error: matchError,
|
|
1916
|
+
} = await this.matchWithTimeout(cache, request);
|
|
1917
|
+
const matchMs = INTERNAL_RANGO_DEBUG
|
|
1918
|
+
? Date.now() - matchStartedAt
|
|
1919
|
+
: undefined;
|
|
1920
|
+
|
|
1921
|
+
if (!response) {
|
|
1922
|
+
if (matchError) {
|
|
1923
|
+
reportCacheError(
|
|
1924
|
+
matchError,
|
|
1925
|
+
"cache-read",
|
|
1926
|
+
"[CFCacheStore] getShell L1 match",
|
|
1927
|
+
);
|
|
1928
|
+
}
|
|
1929
|
+
this.debugShell(key, "l1-miss", {
|
|
1930
|
+
reason: matchError ? "error" : timedOut ? "timeout" : "absent",
|
|
1931
|
+
matchMs,
|
|
1932
|
+
});
|
|
1933
|
+
return this.kvGetShell(key);
|
|
1934
|
+
}
|
|
1935
|
+
if (response.status !== 200) {
|
|
1936
|
+
this.debugShell(key, "l1-miss", {
|
|
1937
|
+
reason: "non-200",
|
|
1938
|
+
status: response.status,
|
|
1939
|
+
matchMs,
|
|
1940
|
+
});
|
|
1941
|
+
return this.kvGetShell(key);
|
|
1942
|
+
}
|
|
1943
|
+
|
|
1944
|
+
const bodyStartedAt = INTERNAL_RANGO_DEBUG ? Date.now() : 0;
|
|
1945
|
+
const { value, errored, error } =
|
|
1946
|
+
await this.readJsonWithTimeout<unknown>(response);
|
|
1947
|
+
const bodyReadMs = INTERNAL_RANGO_DEBUG
|
|
1948
|
+
? Date.now() - bodyStartedAt
|
|
1949
|
+
: undefined;
|
|
1950
|
+
if (value === undefined) {
|
|
1951
|
+
this.debugShell(key, "l1-miss", {
|
|
1952
|
+
reason: errored ? "corrupt" : "timeout",
|
|
1953
|
+
matchMs,
|
|
1954
|
+
bodyReadMs,
|
|
1955
|
+
});
|
|
1956
|
+
if (errored) {
|
|
1957
|
+
return this.healCorruptL1(cache, request, error, "getShell", () =>
|
|
1958
|
+
this.kvGetShell(key),
|
|
1959
|
+
);
|
|
1960
|
+
}
|
|
1961
|
+
return this.kvGetShell(key);
|
|
1962
|
+
}
|
|
1963
|
+
if (!isShellEnvelope(value)) {
|
|
1964
|
+
this.debugShell(key, "l1-miss", {
|
|
1965
|
+
reason: "malformed",
|
|
1966
|
+
matchMs,
|
|
1967
|
+
bodyReadMs,
|
|
1968
|
+
});
|
|
1969
|
+
return this.healCorruptL1(
|
|
1970
|
+
cache,
|
|
1971
|
+
request,
|
|
1972
|
+
new Error("malformed/partial L1 shell envelope"),
|
|
1826
1973
|
"getShell",
|
|
1974
|
+
() => this.kvGetShell(key),
|
|
1827
1975
|
);
|
|
1828
|
-
|
|
1829
|
-
if (timedOut || !envelope) return null;
|
|
1976
|
+
}
|
|
1830
1977
|
|
|
1831
1978
|
const now = Date.now();
|
|
1832
|
-
if (now >
|
|
1979
|
+
if (now > value.e) {
|
|
1980
|
+
this.debugShell(key, "l1-miss", {
|
|
1981
|
+
reason: "expired",
|
|
1982
|
+
matchMs,
|
|
1983
|
+
bodyReadMs,
|
|
1984
|
+
expiresAt: value.e,
|
|
1985
|
+
});
|
|
1986
|
+
return this.kvGetShell(key);
|
|
1987
|
+
}
|
|
1833
1988
|
|
|
1834
|
-
|
|
1989
|
+
// Unlike other L1 families, shells always check the durable generation
|
|
1990
|
+
// marker. See the capture-start/purge race documented above.
|
|
1991
|
+
const markerStartedAt = INTERNAL_RANGO_DEBUG ? Date.now() : 0;
|
|
1992
|
+
const invalidated = await this.isGloballyInvalidated(value.t, value.ta);
|
|
1993
|
+
const markerMs = INTERNAL_RANGO_DEBUG
|
|
1994
|
+
? Date.now() - markerStartedAt
|
|
1995
|
+
: undefined;
|
|
1996
|
+
if (invalidated) {
|
|
1997
|
+
this.debugShell(key, "marker-invalidated", {
|
|
1998
|
+
tier: "l1",
|
|
1999
|
+
matchMs,
|
|
2000
|
+
bodyReadMs,
|
|
2001
|
+
markerMs,
|
|
2002
|
+
});
|
|
1835
2003
|
return null;
|
|
1836
2004
|
}
|
|
1837
2005
|
|
|
1838
|
-
const shouldRevalidate =
|
|
2006
|
+
const shouldRevalidate = value.s > 0 && now > value.s;
|
|
2007
|
+
this.debugShell(key, "l1-hit", {
|
|
2008
|
+
freshness: shouldRevalidate ? "stale" : "fresh",
|
|
2009
|
+
matchMs,
|
|
2010
|
+
bodyReadMs,
|
|
2011
|
+
markerMs,
|
|
2012
|
+
expiresAt: value.e,
|
|
2013
|
+
});
|
|
1839
2014
|
return {
|
|
1840
|
-
entry:
|
|
1841
|
-
prelude: envelope.p,
|
|
1842
|
-
postponed: envelope.po,
|
|
1843
|
-
reactVersion: envelope.rv,
|
|
1844
|
-
buildVersion: envelope.bv,
|
|
1845
|
-
initialTheme: envelope.i,
|
|
1846
|
-
snapshot: envelope.sn,
|
|
1847
|
-
docKey: envelope.dk,
|
|
1848
|
-
handlerLiveHoles: envelope.lh,
|
|
1849
|
-
transitionWhen: envelope.tw,
|
|
1850
|
-
navigationOnly: envelope.no,
|
|
1851
|
-
createdAt: envelope.c,
|
|
1852
|
-
},
|
|
2015
|
+
entry: this.shellEnvelopeToEntry(value),
|
|
1853
2016
|
shouldRevalidate,
|
|
1854
2017
|
};
|
|
1855
2018
|
} catch (error) {
|
|
1856
2019
|
reportCacheError(error, "cache-read", "[CFCacheStore] getShell");
|
|
1857
|
-
|
|
2020
|
+
this.debugShell(key, "l1-miss", { reason: "error" });
|
|
2021
|
+
return this.kvGetShell(key);
|
|
1858
2022
|
}
|
|
1859
2023
|
}
|
|
1860
2024
|
|
|
1861
2025
|
/**
|
|
1862
|
-
* Store a PPR shell
|
|
1863
|
-
*
|
|
1864
|
-
*
|
|
1865
|
-
*
|
|
2026
|
+
* Store a PPR shell envelope in Cache API and, when its retention meets KV's
|
|
2027
|
+
* 60-second floor, KV. The shared write is registered with waitUntil and
|
|
2028
|
+
* awaited so invalidation rejection can be acknowledged to the capture
|
|
2029
|
+
* scheduler. Short-lived shells remain useful in L1 even though KV rejects
|
|
2030
|
+
* them.
|
|
1866
2031
|
*/
|
|
1867
2032
|
async putShell(
|
|
1868
2033
|
key: string,
|
|
@@ -1871,9 +2036,7 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
1871
2036
|
swrSeconds?: number,
|
|
1872
2037
|
tags?: string[],
|
|
1873
2038
|
): Promise<"stored" | "invalidated" | void> {
|
|
1874
|
-
// KV
|
|
1875
|
-
// registered for isolate lifetime and awaited so invalidation rejection can
|
|
1876
|
-
// be acknowledged to the capture scheduler.
|
|
2039
|
+
// KV remains required for durable generation markers and cross-colo reads.
|
|
1877
2040
|
if (!this.kv) {
|
|
1878
2041
|
this.warnShellFamilyInertOnce();
|
|
1879
2042
|
return;
|
|
@@ -1883,9 +2046,6 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
1883
2046
|
const ttl = resolveTtl(ttlSeconds, this.defaults, DEFAULT_FUNCTION_TTL);
|
|
1884
2047
|
const swrWindow = resolveSwrWindow(swrSeconds, this.defaults);
|
|
1885
2048
|
const totalTtl = ttl + swrWindow;
|
|
1886
|
-
// KV requires expirationTtl >= 60s; skip a shorter-lived shell rather than
|
|
1887
|
-
// letting kv.put reject inside waitUntil (mirrors setItem/kvSetSegment).
|
|
1888
|
-
if (totalTtl < 60) return;
|
|
1889
2049
|
|
|
1890
2050
|
const retentionTtl =
|
|
1891
2051
|
tags && tags.length > 0 && this.tagInvalidationTtl
|
|
@@ -1898,55 +2058,93 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
1898
2058
|
Array.isArray(tags) && tags.length > 0 ? entry.createdAt : undefined;
|
|
1899
2059
|
|
|
1900
2060
|
const kvKey = this.toKVKey(`shell:${key}`);
|
|
1901
|
-
|
|
1902
|
-
// and skip the doomed write (mirrors kvSetSegment).
|
|
2061
|
+
let writeKv = retentionTtl >= KV_MIN_EXPIRATION_TTL;
|
|
1903
2062
|
const kvKeyBytes = kvKeyByteLength(kvKey);
|
|
1904
2063
|
if (kvKeyBytes > KV_MAX_KEY_BYTES) {
|
|
1905
2064
|
reportCacheError(
|
|
1906
2065
|
new Error(
|
|
1907
2066
|
`shell cache key produces a ${kvKeyBytes}-byte KV key, over the ` +
|
|
1908
|
-
`${KV_MAX_KEY_BYTES}-byte limit; the shell was not persisted.`,
|
|
2067
|
+
`${KV_MAX_KEY_BYTES}-byte limit; the shell was not persisted to KV (L2).`,
|
|
1909
2068
|
),
|
|
1910
2069
|
"cache-write",
|
|
1911
2070
|
"[CFCacheStore] putShell",
|
|
1912
2071
|
);
|
|
1913
|
-
|
|
2072
|
+
writeKv = false;
|
|
1914
2073
|
}
|
|
1915
2074
|
|
|
1916
2075
|
const write = (async (): Promise<"stored" | "invalidated" | void> => {
|
|
1917
|
-
|
|
1918
|
-
|
|
1919
|
-
|
|
1920
|
-
|
|
1921
|
-
|
|
1922
|
-
)
|
|
1923
|
-
|
|
1924
|
-
|
|
1925
|
-
|
|
1926
|
-
|
|
1927
|
-
|
|
1928
|
-
|
|
1929
|
-
|
|
1930
|
-
|
|
1931
|
-
|
|
1932
|
-
|
|
1933
|
-
|
|
1934
|
-
|
|
1935
|
-
|
|
1936
|
-
|
|
1937
|
-
|
|
1938
|
-
|
|
1939
|
-
|
|
1940
|
-
|
|
1941
|
-
|
|
1942
|
-
|
|
1943
|
-
|
|
1944
|
-
|
|
1945
|
-
|
|
1946
|
-
|
|
1947
|
-
|
|
1948
|
-
|
|
2076
|
+
if (
|
|
2077
|
+
tags &&
|
|
2078
|
+
tags.length > 0 &&
|
|
2079
|
+
(await this.isGloballyInvalidated(tags, entry.createdAt))
|
|
2080
|
+
) {
|
|
2081
|
+
this.debugShell(key, "write-invalidated");
|
|
2082
|
+
return "invalidated";
|
|
2083
|
+
}
|
|
2084
|
+
|
|
2085
|
+
const envelope: CFShellEnvelope = {
|
|
2086
|
+
p: entry.prelude,
|
|
2087
|
+
po: entry.postponed,
|
|
2088
|
+
rv: entry.reactVersion,
|
|
2089
|
+
bv: entry.buildVersion,
|
|
2090
|
+
c: entry.createdAt,
|
|
2091
|
+
s: staleAt,
|
|
2092
|
+
e: expiresAt,
|
|
2093
|
+
t: tags,
|
|
2094
|
+
ta: taggedAt,
|
|
2095
|
+
i: entry.initialTheme,
|
|
2096
|
+
sn: entry.snapshot,
|
|
2097
|
+
dk: entry.docKey,
|
|
2098
|
+
lh: entry.handlerLiveHoles,
|
|
2099
|
+
tw: entry.transitionWhen,
|
|
2100
|
+
no: entry.navigationOnly,
|
|
2101
|
+
};
|
|
2102
|
+
const body = JSON.stringify(envelope);
|
|
2103
|
+
const writes: Promise<boolean>[] = [
|
|
2104
|
+
(async () => {
|
|
2105
|
+
try {
|
|
2106
|
+
const cache = await this.getCache();
|
|
2107
|
+
await cache.put(
|
|
2108
|
+
this.keyToRequest(`shell:${key}`),
|
|
2109
|
+
this.shellEnvelopeResponse(body, envelope),
|
|
2110
|
+
);
|
|
2111
|
+
this.debugShell(key, "l1-stored", {
|
|
2112
|
+
expiresAt: envelope.e,
|
|
2113
|
+
});
|
|
2114
|
+
return true;
|
|
2115
|
+
} catch (error) {
|
|
2116
|
+
reportCacheError(
|
|
2117
|
+
error,
|
|
2118
|
+
"cache-write",
|
|
2119
|
+
"[CFCacheStore] putShell L1",
|
|
2120
|
+
);
|
|
2121
|
+
return false;
|
|
2122
|
+
}
|
|
2123
|
+
})(),
|
|
2124
|
+
];
|
|
2125
|
+
if (writeKv) {
|
|
2126
|
+
writes.push(
|
|
2127
|
+
(async () => {
|
|
2128
|
+
try {
|
|
2129
|
+
await this.kv!.put(kvKey, body, {
|
|
2130
|
+
expirationTtl: retentionTtl,
|
|
2131
|
+
});
|
|
2132
|
+
this.debugShell(key, "kv-stored", {
|
|
2133
|
+
expiresAt: envelope.e,
|
|
2134
|
+
});
|
|
2135
|
+
return true;
|
|
2136
|
+
} catch (error) {
|
|
2137
|
+
reportCacheError(
|
|
2138
|
+
error,
|
|
2139
|
+
"cache-write",
|
|
2140
|
+
"[CFCacheStore] putShell L2",
|
|
2141
|
+
);
|
|
2142
|
+
return false;
|
|
2143
|
+
}
|
|
2144
|
+
})(),
|
|
2145
|
+
);
|
|
1949
2146
|
}
|
|
2147
|
+
return (await Promise.all(writes)).some(Boolean) ? "stored" : undefined;
|
|
1950
2148
|
})();
|
|
1951
2149
|
this.waitUntil(async () => {
|
|
1952
2150
|
await write;
|
|
@@ -1957,6 +2155,141 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
1957
2155
|
}
|
|
1958
2156
|
}
|
|
1959
2157
|
|
|
2158
|
+
/** Rebuild the public shell entry from its validated storage envelope. */
|
|
2159
|
+
private shellEnvelopeToEntry(envelope: CFShellEnvelope): ShellCacheEntry {
|
|
2160
|
+
return {
|
|
2161
|
+
prelude: envelope.p,
|
|
2162
|
+
postponed: envelope.po,
|
|
2163
|
+
reactVersion: envelope.rv,
|
|
2164
|
+
buildVersion: envelope.bv,
|
|
2165
|
+
initialTheme: envelope.i,
|
|
2166
|
+
snapshot: envelope.sn,
|
|
2167
|
+
docKey: envelope.dk,
|
|
2168
|
+
handlerLiveHoles: envelope.lh,
|
|
2169
|
+
transitionWhen: envelope.tw,
|
|
2170
|
+
navigationOnly: envelope.no,
|
|
2171
|
+
createdAt: envelope.c,
|
|
2172
|
+
};
|
|
2173
|
+
}
|
|
2174
|
+
|
|
2175
|
+
/** Build the Cache API representation of the coupled shell envelope. */
|
|
2176
|
+
private shellEnvelopeResponse(
|
|
2177
|
+
body: string,
|
|
2178
|
+
envelope: CFShellEnvelope,
|
|
2179
|
+
): Response {
|
|
2180
|
+
const remainingTtl = Math.max(
|
|
2181
|
+
1,
|
|
2182
|
+
Math.floor((envelope.e - Date.now()) / 1000),
|
|
2183
|
+
);
|
|
2184
|
+
return new Response(body, {
|
|
2185
|
+
headers: {
|
|
2186
|
+
"Content-Type": "application/json",
|
|
2187
|
+
"Cache-Control": `public, max-age=${remainingTtl}`,
|
|
2188
|
+
[CACHE_STALE_AT_HEADER]: String(envelope.s),
|
|
2189
|
+
[CACHE_EXPIRES_AT_HEADER]: String(envelope.e),
|
|
2190
|
+
[CACHE_STATUS_HEADER]: "HIT",
|
|
2191
|
+
...this.tagHeaderEntries(envelope.t, envelope.ta),
|
|
2192
|
+
},
|
|
2193
|
+
});
|
|
2194
|
+
}
|
|
2195
|
+
|
|
2196
|
+
/** KV shell fallback with corruption checks and background L1 promotion. */
|
|
2197
|
+
private async kvGetShell(
|
|
2198
|
+
key: string,
|
|
2199
|
+
): Promise<{ entry: ShellCacheEntry; shouldRevalidate?: boolean } | null> {
|
|
2200
|
+
if (!this.kv) return null;
|
|
2201
|
+
try {
|
|
2202
|
+
const readStartedAt = INTERNAL_RANGO_DEBUG ? Date.now() : 0;
|
|
2203
|
+
const kvKey = this.toKVKey(`shell:${key}`);
|
|
2204
|
+
const { value: envelope, timedOut } =
|
|
2205
|
+
await this.kvGetOrEvict<CFShellEnvelope>(
|
|
2206
|
+
kvKey,
|
|
2207
|
+
isShellEnvelope,
|
|
2208
|
+
"getShell",
|
|
2209
|
+
);
|
|
2210
|
+
const readMs = INTERNAL_RANGO_DEBUG
|
|
2211
|
+
? Date.now() - readStartedAt
|
|
2212
|
+
: undefined;
|
|
2213
|
+
if (timedOut || !envelope) {
|
|
2214
|
+
this.debugShell(key, "kv-miss", {
|
|
2215
|
+
reason: timedOut ? "timeout" : "unavailable",
|
|
2216
|
+
readMs,
|
|
2217
|
+
});
|
|
2218
|
+
return null;
|
|
2219
|
+
}
|
|
2220
|
+
|
|
2221
|
+
const now = Date.now();
|
|
2222
|
+
if (now > envelope.e) {
|
|
2223
|
+
this.debugShell(key, "kv-miss", {
|
|
2224
|
+
reason: "expired",
|
|
2225
|
+
readMs,
|
|
2226
|
+
expiresAt: envelope.e,
|
|
2227
|
+
});
|
|
2228
|
+
return null;
|
|
2229
|
+
}
|
|
2230
|
+
const markerStartedAt = INTERNAL_RANGO_DEBUG ? Date.now() : 0;
|
|
2231
|
+
const invalidated = await this.isGloballyInvalidated(
|
|
2232
|
+
envelope.t,
|
|
2233
|
+
envelope.ta,
|
|
2234
|
+
);
|
|
2235
|
+
const markerMs = INTERNAL_RANGO_DEBUG
|
|
2236
|
+
? Date.now() - markerStartedAt
|
|
2237
|
+
: undefined;
|
|
2238
|
+
if (invalidated) {
|
|
2239
|
+
this.debugShell(key, "marker-invalidated", {
|
|
2240
|
+
tier: "kv",
|
|
2241
|
+
readMs,
|
|
2242
|
+
markerMs,
|
|
2243
|
+
});
|
|
2244
|
+
return null;
|
|
2245
|
+
}
|
|
2246
|
+
|
|
2247
|
+
const shouldRevalidate = envelope.s > 0 && now > envelope.s;
|
|
2248
|
+
this.debugShell(key, "kv-hit", {
|
|
2249
|
+
freshness: shouldRevalidate ? "stale" : "fresh",
|
|
2250
|
+
readMs,
|
|
2251
|
+
markerMs,
|
|
2252
|
+
expiresAt: envelope.e,
|
|
2253
|
+
});
|
|
2254
|
+
this.promoteShellToL1(key, envelope);
|
|
2255
|
+
return {
|
|
2256
|
+
entry: this.shellEnvelopeToEntry(envelope),
|
|
2257
|
+
shouldRevalidate,
|
|
2258
|
+
};
|
|
2259
|
+
} catch (error) {
|
|
2260
|
+
reportCacheError(error, "cache-read", "[CFCacheStore] kvGetShell");
|
|
2261
|
+
this.debugShell(key, "kv-miss", { reason: "error" });
|
|
2262
|
+
return null;
|
|
2263
|
+
}
|
|
2264
|
+
}
|
|
2265
|
+
|
|
2266
|
+
/** Promote a valid KV shell into the per-colo Cache API tier. */
|
|
2267
|
+
private promoteShellToL1(key: string, envelope: CFShellEnvelope): void {
|
|
2268
|
+
if (!this.waitUntil) return;
|
|
2269
|
+
this.waitUntil(() =>
|
|
2270
|
+
reportingAsync(
|
|
2271
|
+
async () => {
|
|
2272
|
+
if (Date.now() > envelope.e) return;
|
|
2273
|
+
const cache = await this.getCache();
|
|
2274
|
+
const body = JSON.stringify(envelope);
|
|
2275
|
+
await cache.put(
|
|
2276
|
+
this.keyToRequest(`shell:${key}`),
|
|
2277
|
+
this.shellEnvelopeResponse(body, envelope),
|
|
2278
|
+
);
|
|
2279
|
+
this.debugShell(key, "kv-promoted", {
|
|
2280
|
+
remainingTtl: Math.max(
|
|
2281
|
+
1,
|
|
2282
|
+
Math.floor((envelope.e - Date.now()) / 1000),
|
|
2283
|
+
),
|
|
2284
|
+
expiresAt: envelope.e,
|
|
2285
|
+
});
|
|
2286
|
+
},
|
|
2287
|
+
"cache-write",
|
|
2288
|
+
"[CFCacheStore] promoteShellToL1",
|
|
2289
|
+
),
|
|
2290
|
+
);
|
|
2291
|
+
}
|
|
2292
|
+
|
|
1960
2293
|
// ============================================================================
|
|
1961
2294
|
// Key Helpers
|
|
1962
2295
|
// ============================================================================
|
|
@@ -228,8 +228,10 @@ export interface CFCacheStoreOptions<TEnv = unknown> {
|
|
|
228
228
|
* per-request memo is consulted (synchronously, no KV read), so a request
|
|
229
229
|
* that ran `updateTag()` still masks its own not-yet-purged entries
|
|
230
230
|
* (read-your-own-writes).
|
|
231
|
-
* - The KV tier and PPR
|
|
232
|
-
*
|
|
231
|
+
* - The KV tier and PPR shell reads still use the KV markers. Runtime shell
|
|
232
|
+
* L1 entries are purgeable, but their taggedAt is the capture-start time: a
|
|
233
|
+
* capture can finish after an invalidation purge, so eviction alone cannot
|
|
234
|
+
* reject that older generation. Keep `kv` configured for shell L2 + markers.
|
|
233
235
|
* Without `kv`, purge mode is the ONLY tag invalidation and the store is
|
|
234
236
|
* L1-only: a supported configuration (previously tag invalidation without
|
|
235
237
|
* KV had no read-side effect at all). One KV-less caveat: an entry whose
|