@rangojs/router 0.5.1 → 0.5.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/README.md +5 -1
- package/dist/types/browser/event-controller.d.ts +6 -0
- package/dist/types/cache/cf/cf-cache-constants.d.ts +8 -1
- package/dist/types/cache/cf/cf-cache-store.d.ts +15 -1
- package/dist/types/cache/cf/cf-cache-types.d.ts +1 -1
- package/dist/types/cache/cf/cf-kv-utils.d.ts +21 -0
- package/dist/types/handles/is-thenable.d.ts +2 -4
- package/dist/types/rsc/helpers.d.ts +3 -0
- package/dist/types/rsc/render-pipeline.d.ts +9 -0
- package/dist/types/rsc/routine-plan.d.ts +124 -0
- package/dist/types/rsc/shell-capture-constants.d.ts +17 -0
- package/dist/types/server/request-context.d.ts +4 -1
- package/dist/types/vite/encryption-key.d.ts +2 -0
- package/dist/types/vite/plugins/expose-internal-ids.d.ts +10 -0
- package/dist/types/vite/plugins/server-ref-hashing.d.ts +24 -0
- package/dist/types/vite/plugins/server-reference-pattern.d.ts +1 -0
- package/dist/types/vite/utils/shared-utils.d.ts +12 -0
- package/dist/vite/index.js +154 -57
- package/package.json +3 -3
- package/skills/caching/SKILL.md +1 -1
- package/skills/mime-routes/SKILL.md +3 -1
- package/skills/response-routes/SKILL.md +4 -2
- package/skills/typesafety/generated-files-and-cli.md +16 -9
- package/skills/typesafety/route-types.md +5 -1
- package/skills/use-cache/SKILL.md +47 -0
- package/src/browser/event-controller.ts +40 -15
- package/src/browser/partial-update.ts +26 -11
- package/src/browser/react/NavigationProvider.tsx +7 -0
- package/src/cache/cache-runtime.ts +89 -15
- package/src/cache/cf/cf-cache-constants.ts +8 -1
- package/src/cache/cf/cf-cache-store.ts +41 -64
- package/src/cache/cf/cf-cache-types.ts +1 -1
- package/src/cache/cf/cf-kv-utils.ts +38 -0
- package/src/cache/segment-codec.ts +21 -5
- package/src/handles/is-thenable.ts +2 -4
- package/src/router/match-middleware/cache-lookup.ts +24 -15
- package/src/rsc/handler.ts +26 -5
- package/src/rsc/helpers.ts +13 -0
- package/src/rsc/progressive-enhancement.ts +247 -70
- package/src/rsc/render-pipeline.ts +68 -24
- package/src/rsc/routine-plan.ts +359 -0
- package/src/rsc/rsc-rendering.ts +555 -302
- package/src/rsc/server-action.ts +180 -71
- package/src/rsc/shell-capture-constants.ts +18 -0
- package/src/rsc/shell-capture.ts +92 -21
- package/src/server/request-context.ts +6 -0
- package/src/ssr/ssr-root.tsx +1 -0
- package/src/vite/encryption-key.ts +29 -0
- package/src/vite/plugins/expose-action-id.ts +2 -2
- package/src/vite/plugins/expose-internal-ids.ts +46 -0
- package/src/vite/plugins/server-ref-hashing.ts +74 -0
- package/src/vite/plugins/server-reference-pattern.ts +10 -0
- package/src/vite/rango.ts +9 -0
- package/src/vite/router-discovery.ts +21 -2
- package/src/vite/utils/shared-utils.ts +12 -7
- package/dist/types.backup/__internal.d.ts +0 -127
- package/dist/types.backup/bin/rango.d.ts +0 -1
- package/dist/types.backup/browser/action-coordinator.d.ts +0 -57
- package/dist/types.backup/browser/action-fence.d.ts +0 -33
- package/dist/types.backup/browser/app-shell.d.ts +0 -34
- package/dist/types.backup/browser/app-version.d.ts +0 -6
- package/dist/types.backup/browser/connection-warmup.d.ts +0 -31
- package/dist/types.backup/browser/cookie-name.d.ts +0 -66
- package/dist/types.backup/browser/event-controller.d.ts +0 -221
- package/dist/types.backup/browser/history-state.d.ts +0 -26
- package/dist/types.backup/browser/index.d.ts +0 -1
- package/dist/types.backup/browser/intercept-utils.d.ts +0 -30
- package/dist/types.backup/browser/invalidate-client-cache.d.ts +0 -17
- package/dist/types.backup/browser/link-interceptor.d.ts +0 -43
- package/dist/types.backup/browser/logging.d.ts +0 -33
- package/dist/types.backup/browser/merge-segment-loaders.d.ts +0 -38
- package/dist/types.backup/browser/navigation-bridge.d.ts +0 -27
- package/dist/types.backup/browser/navigation-client.d.ts +0 -17
- package/dist/types.backup/browser/navigation-store-handle.d.ts +0 -25
- package/dist/types.backup/browser/navigation-store.d.ts +0 -95
- package/dist/types.backup/browser/navigation-transaction.d.ts +0 -75
- package/dist/types.backup/browser/network-error-handler.d.ts +0 -35
- package/dist/types.backup/browser/partial-update.d.ts +0 -61
- package/dist/types.backup/browser/prefetch/cache.d.ts +0 -183
- package/dist/types.backup/browser/prefetch/fetch.d.ts +0 -52
- package/dist/types.backup/browser/prefetch/observer.d.ts +0 -27
- package/dist/types.backup/browser/prefetch/policy.d.ts +0 -13
- package/dist/types.backup/browser/prefetch/queue.d.ts +0 -48
- package/dist/types.backup/browser/prefetch/resource-ready.d.ts +0 -28
- package/dist/types.backup/browser/rango-state.d.ts +0 -52
- package/dist/types.backup/browser/react/Link.d.ts +0 -140
- package/dist/types.backup/browser/react/NavigationProvider.d.ts +0 -88
- package/dist/types.backup/browser/react/ScrollRestoration.d.ts +0 -78
- package/dist/types.backup/browser/react/context.d.ts +0 -54
- package/dist/types.backup/browser/react/filter-segment-order.d.ts +0 -35
- package/dist/types.backup/browser/react/index.d.ts +0 -1
- package/dist/types.backup/browser/react/location-state-shared.d.ts +0 -162
- package/dist/types.backup/browser/react/location-state.d.ts +0 -29
- package/dist/types.backup/browser/react/mount-context.d.ts +0 -23
- package/dist/types.backup/browser/react/nonce-context.d.ts +0 -14
- package/dist/types.backup/browser/react/shallow-equal.d.ts +0 -5
- package/dist/types.backup/browser/react/use-action.d.ts +0 -61
- package/dist/types.backup/browser/react/use-handle.d.ts +0 -21
- package/dist/types.backup/browser/react/use-href.d.ts +0 -32
- package/dist/types.backup/browser/react/use-link-status.d.ts +0 -36
- package/dist/types.backup/browser/react/use-mount.d.ts +0 -24
- package/dist/types.backup/browser/react/use-navigation.d.ts +0 -15
- package/dist/types.backup/browser/react/use-params.d.ts +0 -21
- package/dist/types.backup/browser/react/use-pathname.d.ts +0 -13
- package/dist/types.backup/browser/react/use-reverse.d.ts +0 -40
- package/dist/types.backup/browser/react/use-router.d.ts +0 -23
- package/dist/types.backup/browser/react/use-search-params.d.ts +0 -19
- package/dist/types.backup/browser/react/use-segments.d.ts +0 -29
- package/dist/types.backup/browser/response-adapter.d.ts +0 -58
- package/dist/types.backup/browser/rsc-router.d.ts +0 -141
- package/dist/types.backup/browser/scroll-restoration.d.ts +0 -103
- package/dist/types.backup/browser/segment-reconciler.d.ts +0 -74
- package/dist/types.backup/browser/segment-structure-assert.d.ts +0 -16
- package/dist/types.backup/browser/server-action-bridge.d.ts +0 -29
- package/dist/types.backup/browser/types.d.ts +0 -530
- package/dist/types.backup/browser/validate-redirect-origin.d.ts +0 -28
- package/dist/types.backup/build/collect-fallback-refs.d.ts +0 -5
- package/dist/types.backup/build/generate-manifest.d.ts +0 -100
- package/dist/types.backup/build/generate-route-types.d.ts +0 -8
- package/dist/types.backup/build/index.d.ts +0 -21
- package/dist/types.backup/build/prefix-tree-utils.d.ts +0 -56
- package/dist/types.backup/build/route-trie.d.ts +0 -89
- package/dist/types.backup/build/route-types/ast-helpers.d.ts +0 -3
- package/dist/types.backup/build/route-types/ast-route-extraction.d.ts +0 -13
- package/dist/types.backup/build/route-types/codegen.d.ts +0 -16
- package/dist/types.backup/build/route-types/include-resolution.d.ts +0 -74
- package/dist/types.backup/build/route-types/param-extraction.d.ts +0 -13
- package/dist/types.backup/build/route-types/per-module-writer.d.ts +0 -18
- package/dist/types.backup/build/route-types/router-processing.d.ts +0 -82
- package/dist/types.backup/build/route-types/scan-filter.d.ts +0 -17
- package/dist/types.backup/build/route-types/source-scan.d.ts +0 -13
- package/dist/types.backup/build/runtime-discovery.d.ts +0 -24
- package/dist/types.backup/cache/background-task.d.ts +0 -21
- package/dist/types.backup/cache/cache-error.d.ts +0 -71
- package/dist/types.backup/cache/cache-key-utils.d.ts +0 -35
- package/dist/types.backup/cache/cache-policy.d.ts +0 -59
- package/dist/types.backup/cache/cache-runtime.d.ts +0 -51
- package/dist/types.backup/cache/cache-scope.d.ts +0 -134
- package/dist/types.backup/cache/cache-tag.d.ts +0 -79
- package/dist/types.backup/cache/cf/cf-base64.d.ts +0 -4
- package/dist/types.backup/cache/cf/cf-cache-constants.d.ts +0 -105
- package/dist/types.backup/cache/cf/cf-cache-store.d.ts +0 -481
- package/dist/types.backup/cache/cf/cf-cache-types.d.ts +0 -300
- package/dist/types.backup/cache/cf/cf-kv-utils.d.ts +0 -22
- package/dist/types.backup/cache/cf/cf-tag-marker-memo.d.ts +0 -15
- package/dist/types.backup/cache/cf/index.d.ts +0 -3
- package/dist/types.backup/cache/document-cache.d.ts +0 -69
- package/dist/types.backup/cache/handle-capture.d.ts +0 -23
- package/dist/types.backup/cache/handle-snapshot.d.ts +0 -39
- package/dist/types.backup/cache/index.d.ts +0 -7
- package/dist/types.backup/cache/memory-segment-store.d.ts +0 -163
- package/dist/types.backup/cache/profile-registry.d.ts +0 -40
- package/dist/types.backup/cache/read-through-swr.d.ts +0 -60
- package/dist/types.backup/cache/segment-codec.d.ts +0 -78
- package/dist/types.backup/cache/shell-snapshot.d.ts +0 -162
- package/dist/types.backup/cache/tag-invalidation.d.ts +0 -74
- package/dist/types.backup/cache/taint.d.ts +0 -71
- package/dist/types.backup/cache/types.d.ts +0 -407
- package/dist/types.backup/cache/vercel/index.d.ts +0 -1
- package/dist/types.backup/cache/vercel/vercel-cache-store.d.ts +0 -267
- package/dist/types.backup/client.d.ts +0 -184
- package/dist/types.backup/client.rsc.d.ts +0 -39
- package/dist/types.backup/cloudflare/index.d.ts +0 -7
- package/dist/types.backup/cloudflare/tracing.d.ts +0 -53
- package/dist/types.backup/component-utils.d.ts +0 -46
- package/dist/types.backup/components/DefaultDocument.d.ts +0 -13
- package/dist/types.backup/context-var.d.ts +0 -84
- package/dist/types.backup/debug.d.ts +0 -57
- package/dist/types.backup/decode-loader-results.d.ts +0 -5
- package/dist/types.backup/default-error-boundary.d.ts +0 -10
- package/dist/types.backup/defer.d.ts +0 -89
- package/dist/types.backup/deps/browser.d.ts +0 -1
- package/dist/types.backup/deps/html-stream-client.d.ts +0 -1
- package/dist/types.backup/deps/html-stream-server.d.ts +0 -1
- package/dist/types.backup/deps/rsc.d.ts +0 -1
- package/dist/types.backup/deps/ssr.d.ts +0 -1
- package/dist/types.backup/encode-kv.d.ts +0 -35
- package/dist/types.backup/errors.d.ts +0 -226
- package/dist/types.backup/escape-script.d.ts +0 -44
- package/dist/types.backup/handle.d.ts +0 -93
- package/dist/types.backup/handles/MetaTags.d.ts +0 -17
- package/dist/types.backup/handles/Scripts.d.ts +0 -38
- package/dist/types.backup/handles/breadcrumbs.d.ts +0 -43
- package/dist/types.backup/handles/deferred-resolution.d.ts +0 -53
- package/dist/types.backup/handles/is-thenable.d.ts +0 -12
- package/dist/types.backup/handles/meta.d.ts +0 -43
- package/dist/types.backup/handles/script.d.ts +0 -139
- package/dist/types.backup/host/cookie-handler.d.ts +0 -8
- package/dist/types.backup/host/errors.d.ts +0 -40
- package/dist/types.backup/host/index.d.ts +0 -33
- package/dist/types.backup/host/pattern-matcher.d.ts +0 -30
- package/dist/types.backup/host/router.d.ts +0 -12
- package/dist/types.backup/host/testing.d.ts +0 -41
- package/dist/types.backup/host/types.d.ts +0 -148
- package/dist/types.backup/host/utils.d.ts +0 -20
- package/dist/types.backup/href-client.d.ts +0 -214
- package/dist/types.backup/index.d.ts +0 -112
- package/dist/types.backup/index.rsc.d.ts +0 -51
- package/dist/types.backup/internal-debug.d.ts +0 -1
- package/dist/types.backup/loader-store.d.ts +0 -193
- package/dist/types.backup/loader.d.ts +0 -18
- package/dist/types.backup/loader.rsc.d.ts +0 -18
- package/dist/types.backup/missing-id-error.d.ts +0 -1
- package/dist/types.backup/outlet-context.d.ts +0 -12
- package/dist/types.backup/outlet-provider.d.ts +0 -12
- package/dist/types.backup/prerender/build-shell-capture.d.ts +0 -104
- package/dist/types.backup/prerender/param-hash.d.ts +0 -6
- package/dist/types.backup/prerender/shell-manifest-key.d.ts +0 -18
- package/dist/types.backup/prerender/store.d.ts +0 -62
- package/dist/types.backup/prerender.d.ts +0 -292
- package/dist/types.backup/redirect-origin.d.ts +0 -55
- package/dist/types.backup/regex-escape.d.ts +0 -6
- package/dist/types.backup/render-error-thrower.d.ts +0 -13
- package/dist/types.backup/response-utils.d.ts +0 -35
- package/dist/types.backup/reverse.d.ts +0 -206
- package/dist/types.backup/root-error-boundary.d.ts +0 -32
- package/dist/types.backup/route-content-wrapper.d.ts +0 -40
- package/dist/types.backup/route-definition/dsl-helpers.d.ts +0 -130
- package/dist/types.backup/route-definition/helper-factories.d.ts +0 -22
- package/dist/types.backup/route-definition/helpers-types.d.ts +0 -392
- package/dist/types.backup/route-definition/index.d.ts +0 -7
- package/dist/types.backup/route-definition/redirect.d.ts +0 -48
- package/dist/types.backup/route-definition/resolve-handler-use.d.ts +0 -19
- package/dist/types.backup/route-definition/use-item-types.d.ts +0 -1
- package/dist/types.backup/route-definition.d.ts +0 -1
- package/dist/types.backup/route-map-builder.d.ts +0 -127
- package/dist/types.backup/route-name.d.ts +0 -27
- package/dist/types.backup/route-types.d.ts +0 -172
- package/dist/types.backup/router/basename.d.ts +0 -10
- package/dist/types.backup/router/content-negotiation.d.ts +0 -91
- package/dist/types.backup/router/debug-manifest.d.ts +0 -7
- package/dist/types.backup/router/error-handling.d.ts +0 -76
- package/dist/types.backup/router/find-match.d.ts +0 -19
- package/dist/types.backup/router/handler-context.d.ts +0 -41
- package/dist/types.backup/router/instrument.d.ts +0 -161
- package/dist/types.backup/router/intercept-resolution.d.ts +0 -79
- package/dist/types.backup/router/lazy-includes.d.ts +0 -26
- package/dist/types.backup/router/loader-resolution.d.ts +0 -63
- package/dist/types.backup/router/logging.d.ts +0 -41
- package/dist/types.backup/router/manifest.d.ts +0 -8
- package/dist/types.backup/router/match-api.d.ts +0 -19
- package/dist/types.backup/router/match-context.d.ts +0 -184
- package/dist/types.backup/router/match-handlers.d.ts +0 -49
- package/dist/types.backup/router/match-middleware/background-revalidation.d.ts +0 -113
- package/dist/types.backup/router/match-middleware/cache-lookup.d.ts +0 -113
- package/dist/types.backup/router/match-middleware/cache-store.d.ts +0 -112
- package/dist/types.backup/router/match-middleware/index.d.ts +0 -80
- package/dist/types.backup/router/match-middleware/intercept-resolution.d.ts +0 -116
- package/dist/types.backup/router/match-middleware/segment-resolution.d.ts +0 -94
- package/dist/types.backup/router/match-pipelines.d.ts +0 -103
- package/dist/types.backup/router/match-result.d.ts +0 -114
- package/dist/types.backup/router/metrics.d.ts +0 -6
- package/dist/types.backup/router/middleware-types.d.ts +0 -74
- package/dist/types.backup/router/middleware.d.ts +0 -116
- package/dist/types.backup/router/navigation-snapshot.d.ts +0 -22
- package/dist/types.backup/router/params-util.d.ts +0 -8
- package/dist/types.backup/router/parse-pattern.d.ts +0 -38
- package/dist/types.backup/router/pattern-matching.d.ts +0 -169
- package/dist/types.backup/router/prefetch-cache-ttl.d.ts +0 -27
- package/dist/types.backup/router/prefetch-limits.d.ts +0 -20
- package/dist/types.backup/router/prerender-match.d.ts +0 -50
- package/dist/types.backup/router/preview-match.d.ts +0 -22
- package/dist/types.backup/router/request-classification.d.ts +0 -104
- package/dist/types.backup/router/revalidation.d.ts +0 -57
- package/dist/types.backup/router/route-snapshot.d.ts +0 -112
- package/dist/types.backup/router/router-context.d.ts +0 -137
- package/dist/types.backup/router/router-interfaces.d.ts +0 -432
- package/dist/types.backup/router/router-options.d.ts +0 -738
- package/dist/types.backup/router/router-registry.d.ts +0 -15
- package/dist/types.backup/router/segment-resolution/fresh.d.ts +0 -55
- package/dist/types.backup/router/segment-resolution/helpers.d.ts +0 -93
- package/dist/types.backup/router/segment-resolution/loader-cache.d.ts +0 -33
- package/dist/types.backup/router/segment-resolution/loader-mask.d.ts +0 -44
- package/dist/types.backup/router/segment-resolution/loader-snapshot.d.ts +0 -90
- package/dist/types.backup/router/segment-resolution/mask-nested.d.ts +0 -53
- package/dist/types.backup/router/segment-resolution/revalidation.d.ts +0 -85
- package/dist/types.backup/router/segment-resolution/static-store.d.ts +0 -17
- package/dist/types.backup/router/segment-resolution/streamed-handler-telemetry.d.ts +0 -16
- package/dist/types.backup/router/segment-resolution/view-transition-default.d.ts +0 -28
- package/dist/types.backup/router/segment-resolution.d.ts +0 -3
- package/dist/types.backup/router/segment-wrappers.d.ts +0 -53
- package/dist/types.backup/router/state-cookie-name.d.ts +0 -1
- package/dist/types.backup/router/substitute-pattern-params.d.ts +0 -23
- package/dist/types.backup/router/telemetry-otel.d.ts +0 -113
- package/dist/types.backup/router/telemetry.d.ts +0 -215
- package/dist/types.backup/router/timeout.d.ts +0 -68
- package/dist/types.backup/router/tracing.d.ts +0 -125
- package/dist/types.backup/router/trie-matching.d.ts +0 -32
- package/dist/types.backup/router/types.d.ts +0 -98
- package/dist/types.backup/router/url-params.d.ts +0 -26
- package/dist/types.backup/router.d.ts +0 -7
- package/dist/types.backup/rsc/capture-queue.d.ts +0 -6
- package/dist/types.backup/rsc/full-payload.d.ts +0 -22
- package/dist/types.backup/rsc/handler-context.d.ts +0 -31
- package/dist/types.backup/rsc/handler.d.ts +0 -9
- package/dist/types.backup/rsc/helpers.d.ts +0 -213
- package/dist/types.backup/rsc/index.d.ts +0 -17
- package/dist/types.backup/rsc/json-route-result.d.ts +0 -20
- package/dist/types.backup/rsc/loader-fetch.d.ts +0 -14
- package/dist/types.backup/rsc/manifest-init.d.ts +0 -18
- package/dist/types.backup/rsc/nonce.d.ts +0 -28
- package/dist/types.backup/rsc/origin-guard.d.ts +0 -50
- package/dist/types.backup/rsc/progressive-enhancement.d.ts +0 -19
- package/dist/types.backup/rsc/redirect-guard.d.ts +0 -35
- package/dist/types.backup/rsc/response-cache-serve.d.ts +0 -46
- package/dist/types.backup/rsc/response-error.d.ts +0 -19
- package/dist/types.backup/rsc/response-route-handler.d.ts +0 -29
- package/dist/types.backup/rsc/rsc-rendering.d.ts +0 -23
- package/dist/types.backup/rsc/runtime-warnings.d.ts +0 -22
- package/dist/types.backup/rsc/server-action.d.ts +0 -68
- package/dist/types.backup/rsc/shell-build-manifest.d.ts +0 -84
- package/dist/types.backup/rsc/shell-capture-constants.d.ts +0 -27
- package/dist/types.backup/rsc/shell-capture.d.ts +0 -374
- package/dist/types.backup/rsc/shell-serve.d.ts +0 -136
- package/dist/types.backup/rsc/ssr-setup.d.ts +0 -48
- package/dist/types.backup/rsc/transition-gate.d.ts +0 -27
- package/dist/types.backup/rsc/types.d.ts +0 -290
- package/dist/types.backup/runtime-env.d.ts +0 -1
- package/dist/types.backup/search-params.d.ts +0 -125
- package/dist/types.backup/segment-content-promise.d.ts +0 -13
- package/dist/types.backup/segment-fragments.d.ts +0 -56
- package/dist/types.backup/segment-loader-promise.d.ts +0 -22
- package/dist/types.backup/segment-system.d.ts +0 -84
- package/dist/types.backup/serialize.d.ts +0 -164
- package/dist/types.backup/server/context.d.ts +0 -494
- package/dist/types.backup/server/cookie-parse.d.ts +0 -10
- package/dist/types.backup/server/cookie-store.d.ts +0 -107
- package/dist/types.backup/server/fetchable-loader-store.d.ts +0 -20
- package/dist/types.backup/server/handle-store.d.ts +0 -100
- package/dist/types.backup/server/loader-registry.d.ts +0 -32
- package/dist/types.backup/server/request-context.d.ts +0 -596
- package/dist/types.backup/server/root-layout.d.ts +0 -3
- package/dist/types.backup/server.d.ts +0 -15
- package/dist/types.backup/ssr/index.d.ts +0 -233
- package/dist/types.backup/ssr/inject-rsc-eager.d.ts +0 -3
- package/dist/types.backup/ssr/preinit-client-references.d.ts +0 -71
- package/dist/types.backup/ssr/ssr-root.d.ts +0 -69
- package/dist/types.backup/static-handler.d.ts +0 -57
- package/dist/types.backup/testing/cache-status.d.ts +0 -63
- package/dist/types.backup/testing/collect-handle.d.ts +0 -20
- package/dist/types.backup/testing/dispatch.d.ts +0 -123
- package/dist/types.backup/testing/dom.entry.d.ts +0 -15
- package/dist/types.backup/testing/e2e/fixture.d.ts +0 -37
- package/dist/types.backup/testing/e2e/index.d.ts +0 -30
- package/dist/types.backup/testing/e2e/matchers.d.ts +0 -17
- package/dist/types.backup/testing/e2e/page-helpers.d.ts +0 -62
- package/dist/types.backup/testing/e2e/parity.d.ts +0 -111
- package/dist/types.backup/testing/e2e/server.d.ts +0 -35
- package/dist/types.backup/testing/flight-matchers.d.ts +0 -55
- package/dist/types.backup/testing/flight-normalize.d.ts +0 -1
- package/dist/types.backup/testing/flight-tree.d.ts +0 -192
- package/dist/types.backup/testing/flight.d.ts +0 -115
- package/dist/types.backup/testing/flight.entry.d.ts +0 -27
- package/dist/types.backup/testing/generated-routes.d.ts +0 -66
- package/dist/types.backup/testing/index.d.ts +0 -52
- package/dist/types.backup/testing/internal/context.d.ts +0 -225
- package/dist/types.backup/testing/internal/flight-client-globals.d.ts +0 -1
- package/dist/types.backup/testing/internal/seed-vars.d.ts +0 -30
- package/dist/types.backup/testing/render-handler.d.ts +0 -160
- package/dist/types.backup/testing/render-route.d.ts +0 -246
- package/dist/types.backup/testing/run-loader.d.ts +0 -186
- package/dist/types.backup/testing/run-middleware.d.ts +0 -132
- package/dist/types.backup/testing/run-transition-when.d.ts +0 -77
- package/dist/types.backup/testing/vitest-stubs/cloudflare-email.d.ts +0 -6
- package/dist/types.backup/testing/vitest-stubs/cloudflare-workers.d.ts +0 -13
- package/dist/types.backup/testing/vitest-stubs/plugin-rsc.d.ts +0 -7
- package/dist/types.backup/testing/vitest-stubs/version.d.ts +0 -1
- package/dist/types.backup/testing/vitest.d.ts +0 -205
- package/dist/types.backup/theme/ThemeProvider.d.ts +0 -13
- package/dist/types.backup/theme/ThemeScript.d.ts +0 -45
- package/dist/types.backup/theme/constants.d.ts +0 -39
- package/dist/types.backup/theme/index.d.ts +0 -29
- package/dist/types.backup/theme/theme-context.d.ts +0 -21
- package/dist/types.backup/theme/theme-script.d.ts +0 -26
- package/dist/types.backup/theme/types.d.ts +0 -162
- package/dist/types.backup/theme/use-theme.d.ts +0 -8
- package/dist/types.backup/types/boundaries.d.ts +0 -93
- package/dist/types.backup/types/cache-types.d.ts +0 -191
- package/dist/types.backup/types/error-types.d.ts +0 -114
- package/dist/types.backup/types/global-namespace.d.ts +0 -90
- package/dist/types.backup/types/handler-context.d.ts +0 -658
- package/dist/types.backup/types/index.d.ts +0 -11
- package/dist/types.backup/types/loader-types.d.ts +0 -182
- package/dist/types.backup/types/request-scope.d.ts +0 -93
- package/dist/types.backup/types/route-config.d.ts +0 -105
- package/dist/types.backup/types/route-entry.d.ts +0 -95
- package/dist/types.backup/types/segments.d.ts +0 -234
- package/dist/types.backup/types.d.ts +0 -1
- package/dist/types.backup/urls/include-helper.d.ts +0 -17
- package/dist/types.backup/urls/include-provider.d.ts +0 -27
- package/dist/types.backup/urls/index.d.ts +0 -6
- package/dist/types.backup/urls/path-helper-types.d.ts +0 -197
- package/dist/types.backup/urls/path-helper.d.ts +0 -12
- package/dist/types.backup/urls/pattern-types.d.ts +0 -166
- package/dist/types.backup/urls/response-types.d.ts +0 -67
- package/dist/types.backup/urls/type-extraction.d.ts +0 -157
- package/dist/types.backup/urls/urls-function.d.ts +0 -24
- package/dist/types.backup/urls.d.ts +0 -1
- package/dist/types.backup/use-loader.d.ts +0 -150
- package/dist/types.backup/vercel/index.d.ts +0 -10
- package/dist/types.backup/vercel/tracing.d.ts +0 -70
- package/dist/types.backup/vite/debug.d.ts +0 -80
- package/dist/types.backup/vite/discovery/bundle-postprocess.d.ts +0 -12
- package/dist/types.backup/vite/discovery/dev-prerender-cache.d.ts +0 -65
- package/dist/types.backup/vite/discovery/discover-routers.d.ts +0 -17
- package/dist/types.backup/vite/discovery/discovery-errors.d.ts +0 -113
- package/dist/types.backup/vite/discovery/gate-state.d.ts +0 -79
- package/dist/types.backup/vite/discovery/prerender-collection.d.ts +0 -24
- package/dist/types.backup/vite/discovery/route-types-writer.d.ts +0 -32
- package/dist/types.backup/vite/discovery/self-gen-tracking.d.ts +0 -22
- package/dist/types.backup/vite/discovery/shell-prerender-phase.d.ts +0 -40
- package/dist/types.backup/vite/discovery/state.d.ts +0 -162
- package/dist/types.backup/vite/discovery/virtual-module-codegen.d.ts +0 -15
- package/dist/types.backup/vite/index.d.ts +0 -11
- package/dist/types.backup/vite/inject-client-debug.d.ts +0 -56
- package/dist/types.backup/vite/plugin-types.d.ts +0 -298
- package/dist/types.backup/vite/plugins/cjs-to-esm.d.ts +0 -6
- package/dist/types.backup/vite/plugins/client-ref-dedup.d.ts +0 -40
- package/dist/types.backup/vite/plugins/client-ref-hashing.d.ts +0 -35
- package/dist/types.backup/vite/plugins/cloudflare-protocol-stub.d.ts +0 -64
- package/dist/types.backup/vite/plugins/expose-action-id.d.ts +0 -18
- package/dist/types.backup/vite/plugins/expose-id-utils.d.ts +0 -37
- package/dist/types.backup/vite/plugins/expose-ids/export-analysis.d.ts +0 -19
- package/dist/types.backup/vite/plugins/expose-ids/handler-transform.d.ts +0 -10
- package/dist/types.backup/vite/plugins/expose-ids/loader-transform.d.ts +0 -8
- package/dist/types.backup/vite/plugins/expose-ids/router-transform.d.ts +0 -13
- package/dist/types.backup/vite/plugins/expose-ids/types.d.ts +0 -29
- package/dist/types.backup/vite/plugins/expose-internal-ids.d.ts +0 -6
- package/dist/types.backup/vite/plugins/performance-tracks.d.ts +0 -25
- package/dist/types.backup/vite/plugins/refresh-cmd.d.ts +0 -20
- package/dist/types.backup/vite/plugins/use-cache-transform.d.ts +0 -20
- package/dist/types.backup/vite/plugins/vercel-output.d.ts +0 -85
- package/dist/types.backup/vite/plugins/version-injector.d.ts +0 -21
- package/dist/types.backup/vite/plugins/version-plugin.d.ts +0 -19
- package/dist/types.backup/vite/plugins/virtual-entries.d.ts +0 -36
- package/dist/types.backup/vite/plugins/virtual-stub-plugin.d.ts +0 -7
- package/dist/types.backup/vite/rango.d.ts +0 -29
- package/dist/types.backup/vite/router-discovery.d.ts +0 -23
- package/dist/types.backup/vite/utils/ast-handler-extract.d.ts +0 -64
- package/dist/types.backup/vite/utils/banner.d.ts +0 -2
- package/dist/types.backup/vite/utils/bundle-analysis.d.ts +0 -28
- package/dist/types.backup/vite/utils/client-chunks.d.ts +0 -55
- package/dist/types.backup/vite/utils/directive-prologue.d.ts +0 -16
- package/dist/types.backup/vite/utils/forward-user-plugins.d.ts +0 -37
- package/dist/types.backup/vite/utils/manifest-utils.d.ts +0 -7
- package/dist/types.backup/vite/utils/package-resolution.d.ts +0 -6
- package/dist/types.backup/vite/utils/prerender-utils.d.ts +0 -32
- package/dist/types.backup/vite/utils/shared-utils.d.ts +0 -55
|
@@ -7,6 +7,7 @@ import type { RenderMode, RenderPhase } from "../router/timeout.js";
|
|
|
7
7
|
import type { HandlerContext } from "./handler-context.js";
|
|
8
8
|
import { createResponseWithMergedHeaders } from "./helpers.js";
|
|
9
9
|
import type { RscPayload } from "./types.js";
|
|
10
|
+
import type { RoutineTrace, RoutineTraceEntry } from "./routine-plan.js";
|
|
10
11
|
|
|
11
12
|
// Canonical unions live in router/timeout.ts (the dependency-free leaf); these
|
|
12
13
|
// aliases keep the render-pipeline names stable for existing importers.
|
|
@@ -191,6 +192,34 @@ function expectCommandResult(
|
|
|
191
192
|
return result.value;
|
|
192
193
|
}
|
|
193
194
|
|
|
195
|
+
/**
|
|
196
|
+
* Step helpers: each yields one command and returns its narrowed result, so a
|
|
197
|
+
* plan body reads imperatively while the yielded value stays the plain command
|
|
198
|
+
* the driver interprets (yield-before-execute, exact identity — see
|
|
199
|
+
* docs/design/render-stage-driver.md).
|
|
200
|
+
*/
|
|
201
|
+
function* flightStep<TEnv>(
|
|
202
|
+
execute: () => RscFlightStage,
|
|
203
|
+
recordSerializeMetric: boolean,
|
|
204
|
+
): Generator<RscRenderCommand<TEnv>, RscFlightStage, RscRenderCommandResult> {
|
|
205
|
+
return expectCommandResult(
|
|
206
|
+
yield { type: "flight", execute, recordSerializeMetric },
|
|
207
|
+
"flight",
|
|
208
|
+
);
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
function* htmlStep<TEnv>(
|
|
212
|
+
prepare: () => RscPreparedHtmlRender | Promise<RscPreparedHtmlRender>,
|
|
213
|
+
): Generator<RscRenderCommand<TEnv>, RscHtmlResult, RscRenderCommandResult> {
|
|
214
|
+
return expectCommandResult(yield { type: "html", prepare }, "html");
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
function* responseStep<TEnv>(
|
|
218
|
+
execute: () => Response,
|
|
219
|
+
): Generator<RscRenderCommand<TEnv>, Response, RscRenderCommandResult> {
|
|
220
|
+
return expectCommandResult(yield { type: "response", execute }, "response");
|
|
221
|
+
}
|
|
222
|
+
|
|
194
223
|
/**
|
|
195
224
|
* Describe the foreground response-construction work without executing it.
|
|
196
225
|
* Each command is yielded before its work starts; the driver owns execution,
|
|
@@ -200,36 +229,24 @@ export function* createRscRenderPlan<TEnv>(
|
|
|
200
229
|
input: RscRenderInput<TEnv>,
|
|
201
230
|
options: RscRenderOptions = {},
|
|
202
231
|
): RscRenderPlan<TEnv> {
|
|
203
|
-
const flight =
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
recordSerializeMetric: input.recordSerializeMetric ?? true,
|
|
207
|
-
execute: () => createFlightStage(input, input.init),
|
|
208
|
-
},
|
|
209
|
-
"flight",
|
|
232
|
+
const flight = yield* flightStep<TEnv>(
|
|
233
|
+
() => createFlightStage(input, input.init),
|
|
234
|
+
input.recordSerializeMetric ?? true,
|
|
210
235
|
);
|
|
211
236
|
|
|
212
|
-
let body: BodyInit | null = flight.stream;
|
|
213
|
-
let init = input.init;
|
|
214
|
-
|
|
215
237
|
if (options.html) {
|
|
216
|
-
const html =
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
238
|
+
const html = options.html;
|
|
239
|
+
const page = yield* htmlStep<TEnv>(() => html(flight));
|
|
240
|
+
return yield* responseStep<TEnv>(() =>
|
|
241
|
+
createResponseWithMergedHeaders(page.body, {
|
|
242
|
+
...input.init,
|
|
243
|
+
...page.init,
|
|
244
|
+
}),
|
|
222
245
|
);
|
|
223
|
-
body = html.body;
|
|
224
|
-
init = { ...init, ...html.init };
|
|
225
246
|
}
|
|
226
247
|
|
|
227
|
-
return
|
|
228
|
-
|
|
229
|
-
type: "response",
|
|
230
|
-
execute: () => createResponseWithMergedHeaders(body, init),
|
|
231
|
-
},
|
|
232
|
-
"response",
|
|
248
|
+
return yield* responseStep<TEnv>(() =>
|
|
249
|
+
createResponseWithMergedHeaders(flight.stream, input.init),
|
|
233
250
|
);
|
|
234
251
|
}
|
|
235
252
|
|
|
@@ -546,6 +563,33 @@ export function renderRscFlightStage<TEnv>(
|
|
|
546
563
|
}
|
|
547
564
|
}
|
|
548
565
|
|
|
566
|
+
/**
|
|
567
|
+
* Feed this driver's stage events (flight/html/response) into a routine flow
|
|
568
|
+
* trace as child entries of the currently running plan step. Stages are
|
|
569
|
+
* strictly sequential, so one `current` slot suffices. Depth is captured at
|
|
570
|
+
* creation: the bridge is built while the caller's render step executes, so
|
|
571
|
+
* children sit one level under it.
|
|
572
|
+
*/
|
|
573
|
+
export function createRenderStageTraceBridge(
|
|
574
|
+
trace: RoutineTrace,
|
|
575
|
+
): (event: RscRenderStageEvent) => void {
|
|
576
|
+
const depth = trace.currentDepth() + 1;
|
|
577
|
+
let current: RoutineTraceEntry | undefined;
|
|
578
|
+
return (event) => {
|
|
579
|
+
if (event.type === "stage:start") {
|
|
580
|
+
current = trace.begin(event.context.phase, "step", depth);
|
|
581
|
+
return;
|
|
582
|
+
}
|
|
583
|
+
if (!current) return;
|
|
584
|
+
if (event.type === "stage:complete") {
|
|
585
|
+
trace.end(current);
|
|
586
|
+
} else {
|
|
587
|
+
trace.fail(current, event.error);
|
|
588
|
+
}
|
|
589
|
+
current = undefined;
|
|
590
|
+
};
|
|
591
|
+
}
|
|
592
|
+
|
|
549
593
|
export function createRscStageDebugSink(
|
|
550
594
|
log: (message: string, details?: Record<string, unknown>) => void = (
|
|
551
595
|
message,
|
|
@@ -0,0 +1,359 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Routine plans — the request-level extension of the render stage driver
|
|
3
|
+
* (docs/design/routine-plans.md; protocol lineage in render-stage-driver.md).
|
|
4
|
+
* A plan is a synchronous generator that EMITS instructions before their work
|
|
5
|
+
* runs; the runner is the only code that executes them. Two effect shapes:
|
|
6
|
+
*
|
|
7
|
+
* step(name, fn) — sequential work; the plan suspends until its result.
|
|
8
|
+
* handoff(name, fn) — background registration (waitUntil-shaped); completes
|
|
9
|
+
* at scheduling and returns nothing.
|
|
10
|
+
*
|
|
11
|
+
* Plans compose by level: `yield* scope(name, plan)` flattens a nested plan
|
|
12
|
+
* into the same instruction stream while the trace records the scope. Tracking
|
|
13
|
+
* is derived, not declared — "what is running" is the instruction in hand.
|
|
14
|
+
*
|
|
15
|
+
* Deliberate boundaries (see the design doc's "Not built yet, on purpose"):
|
|
16
|
+
* the runner opens no observability spans — effects own their own
|
|
17
|
+
* instrumentation, and the render driver keeps PHASES.ssr — and there is no
|
|
18
|
+
* plan.return abort/cleanup path; the render driver's cleanup rules are the
|
|
19
|
+
* template if a caller ever needs one.
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
import { isThenable } from "../handles/is-thenable.js";
|
|
23
|
+
|
|
24
|
+
export type RoutineEffectKind = "step" | "handoff";
|
|
25
|
+
|
|
26
|
+
export type RoutineCommand =
|
|
27
|
+
| { kind: "step"; name: string; execute: () => unknown }
|
|
28
|
+
| { kind: "handoff"; name: string; execute: () => unknown }
|
|
29
|
+
| { kind: "enter"; name: string }
|
|
30
|
+
| { kind: "exit"; outcome: "done" | "failed"; error?: unknown };
|
|
31
|
+
|
|
32
|
+
export type RoutineCommandResult =
|
|
33
|
+
| { kind: "step"; value: unknown }
|
|
34
|
+
| { kind: "handoff" }
|
|
35
|
+
| { kind: "enter" }
|
|
36
|
+
| { kind: "exit" };
|
|
37
|
+
|
|
38
|
+
/** One imperative step: yields a command, returns its typed result. */
|
|
39
|
+
export type RoutineStep<T> = Generator<RoutineCommand, T, RoutineCommandResult>;
|
|
40
|
+
|
|
41
|
+
/** A full plan is shaped like a step; the alias marks intent at call sites. */
|
|
42
|
+
export type RoutinePlan<TReturn> = RoutineStep<TReturn>;
|
|
43
|
+
|
|
44
|
+
function expectResultKind<K extends RoutineCommandResult["kind"]>(
|
|
45
|
+
result: RoutineCommandResult,
|
|
46
|
+
kind: K,
|
|
47
|
+
name: string,
|
|
48
|
+
): Extract<RoutineCommandResult, { kind: K }> {
|
|
49
|
+
if (result.kind !== kind) {
|
|
50
|
+
throw new Error(
|
|
51
|
+
`[routine] step "${name}" expected ${kind} result, received ${result.kind}`,
|
|
52
|
+
);
|
|
53
|
+
}
|
|
54
|
+
return result as Extract<RoutineCommandResult, { kind: K }>;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Sequential work. The `as Awaited<T>` narrow is the trust boundary with the
|
|
59
|
+
* runner, which resumes with the exact value `execute` produced.
|
|
60
|
+
*/
|
|
61
|
+
export function* step<T>(
|
|
62
|
+
name: string,
|
|
63
|
+
execute: () => T | Promise<T>,
|
|
64
|
+
): RoutineStep<Awaited<T>> {
|
|
65
|
+
const result = yield { kind: "step", name, execute };
|
|
66
|
+
return expectResultKind(result, "step", name).value as Awaited<T>;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Background handoff: successful registration completes the foreground step.
|
|
71
|
+
* A synchronous registration failure is thrown back into the plan, matching a
|
|
72
|
+
* direct waitUntil/scheduler call. A returned promise settles in the background;
|
|
73
|
+
* its rejection marks the trace but never fails the foreground response.
|
|
74
|
+
*
|
|
75
|
+
* Settlement tracking follows the RETURNED value: a returned promise is
|
|
76
|
+
* observed until it settles; a scheduler that fires-and-forgets internally
|
|
77
|
+
* (e.g. scheduleShellCapture via runBackground) returns void, so its trace
|
|
78
|
+
* entry settles at the scheduling call, not at background completion. That is
|
|
79
|
+
* deliberate — the plan's contract ends at the handoff.
|
|
80
|
+
*/
|
|
81
|
+
export function* handoff(
|
|
82
|
+
name: string,
|
|
83
|
+
execute: () => unknown,
|
|
84
|
+
): RoutineStep<void> {
|
|
85
|
+
const result = yield { kind: "handoff", name, execute };
|
|
86
|
+
expectResultKind(result, "handoff", name);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Run a nested plan as a named scope. `yield*` flattens its instructions into
|
|
91
|
+
* the parent stream; enter/exit only inform the trace. The scope reports its
|
|
92
|
+
* terminal outcome after internal recovery has either succeeded or escaped.
|
|
93
|
+
*/
|
|
94
|
+
export function* scope<TReturn>(
|
|
95
|
+
name: string,
|
|
96
|
+
plan: RoutinePlan<TReturn>,
|
|
97
|
+
): RoutineStep<TReturn> {
|
|
98
|
+
yield { kind: "enter", name };
|
|
99
|
+
try {
|
|
100
|
+
const value = yield* plan;
|
|
101
|
+
assertSynchronousReturn(value);
|
|
102
|
+
yield { kind: "exit", outcome: "done" };
|
|
103
|
+
return value;
|
|
104
|
+
} catch (error) {
|
|
105
|
+
yield { kind: "exit", outcome: "failed", error };
|
|
106
|
+
throw error;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
export interface RoutineTraceEntry {
|
|
111
|
+
name: string;
|
|
112
|
+
kind: RoutineEffectKind | "scope";
|
|
113
|
+
depth: number;
|
|
114
|
+
/** step/scope: running -> done|failed. handoff: pending -> settled|failed. */
|
|
115
|
+
state: "running" | "pending" | "done" | "settled" | "failed";
|
|
116
|
+
startedAt: number;
|
|
117
|
+
endedAt?: number;
|
|
118
|
+
settledAt?: number;
|
|
119
|
+
error?: unknown;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
export interface RoutineTrace {
|
|
123
|
+
readonly name: string;
|
|
124
|
+
readonly entries: readonly RoutineTraceEntry[];
|
|
125
|
+
enterScope(name: string): void;
|
|
126
|
+
exitScope(outcome: "done" | "failed", error?: unknown): void;
|
|
127
|
+
/** Scope depth entries currently record at. Bridges (e.g. render stage
|
|
128
|
+
* events feeding child entries under a running step) capture this once and
|
|
129
|
+
* pass `depth + 1` explicitly. */
|
|
130
|
+
currentDepth(): number;
|
|
131
|
+
begin(
|
|
132
|
+
name: string,
|
|
133
|
+
kind: RoutineEffectKind,
|
|
134
|
+
depth?: number,
|
|
135
|
+
): RoutineTraceEntry;
|
|
136
|
+
end(entry: RoutineTraceEntry): void;
|
|
137
|
+
fail(entry: RoutineTraceEntry, error: unknown): void;
|
|
138
|
+
settle(
|
|
139
|
+
entry: RoutineTraceEntry,
|
|
140
|
+
outcome: { status: "fulfilled" } | { status: "rejected"; error: unknown },
|
|
141
|
+
): void;
|
|
142
|
+
/** Running scopes plus the foreground instruction currently in hand. */
|
|
143
|
+
active(): RoutineTraceEntry[];
|
|
144
|
+
format(): string;
|
|
145
|
+
formatActive(
|
|
146
|
+
entries?: readonly RoutineTraceEntry[],
|
|
147
|
+
activeAt?: number,
|
|
148
|
+
): string;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
export function createRoutineTrace(
|
|
152
|
+
name: string,
|
|
153
|
+
now: () => number = () => performance.now(),
|
|
154
|
+
): RoutineTrace {
|
|
155
|
+
const entries: RoutineTraceEntry[] = [];
|
|
156
|
+
const scopes: RoutineTraceEntry[] = [];
|
|
157
|
+
|
|
158
|
+
const push = (
|
|
159
|
+
name: string,
|
|
160
|
+
kind: RoutineTraceEntry["kind"],
|
|
161
|
+
state: RoutineTraceEntry["state"],
|
|
162
|
+
depth: number = scopes.length,
|
|
163
|
+
): RoutineTraceEntry => {
|
|
164
|
+
const entry: RoutineTraceEntry = {
|
|
165
|
+
name,
|
|
166
|
+
kind,
|
|
167
|
+
depth,
|
|
168
|
+
state,
|
|
169
|
+
startedAt: now(),
|
|
170
|
+
};
|
|
171
|
+
entries.push(entry);
|
|
172
|
+
return entry;
|
|
173
|
+
};
|
|
174
|
+
|
|
175
|
+
const active = (): RoutineTraceEntry[] =>
|
|
176
|
+
entries.filter((entry) => entry.state === "running");
|
|
177
|
+
|
|
178
|
+
return {
|
|
179
|
+
name,
|
|
180
|
+
entries,
|
|
181
|
+
enterScope(name) {
|
|
182
|
+
scopes.push(push(name, "scope", "running"));
|
|
183
|
+
},
|
|
184
|
+
exitScope(outcome, error) {
|
|
185
|
+
const scope = scopes.pop();
|
|
186
|
+
if (scope) {
|
|
187
|
+
scope.state = outcome;
|
|
188
|
+
scope.endedAt = now();
|
|
189
|
+
if (outcome === "failed") scope.error = error;
|
|
190
|
+
}
|
|
191
|
+
},
|
|
192
|
+
currentDepth() {
|
|
193
|
+
return scopes.length;
|
|
194
|
+
},
|
|
195
|
+
begin(name, kind, depth) {
|
|
196
|
+
return push(name, kind, kind === "step" ? "running" : "pending", depth);
|
|
197
|
+
},
|
|
198
|
+
end(entry) {
|
|
199
|
+
entry.state = "done";
|
|
200
|
+
entry.endedAt = now();
|
|
201
|
+
},
|
|
202
|
+
fail(entry, error) {
|
|
203
|
+
entry.state = "failed";
|
|
204
|
+
entry.endedAt = now();
|
|
205
|
+
entry.error = error;
|
|
206
|
+
},
|
|
207
|
+
settle(entry, outcome) {
|
|
208
|
+
entry.settledAt = now();
|
|
209
|
+
if (outcome.status === "fulfilled") {
|
|
210
|
+
entry.state = "settled";
|
|
211
|
+
} else {
|
|
212
|
+
entry.state = "failed";
|
|
213
|
+
entry.error = outcome.error;
|
|
214
|
+
}
|
|
215
|
+
},
|
|
216
|
+
active,
|
|
217
|
+
format() {
|
|
218
|
+
return entries
|
|
219
|
+
.map((entry) => {
|
|
220
|
+
const indent = " ".repeat(entry.depth);
|
|
221
|
+
const duration =
|
|
222
|
+
entry.endedAt !== undefined
|
|
223
|
+
? ` ${(entry.endedAt - entry.startedAt).toFixed(1)}ms`
|
|
224
|
+
: "";
|
|
225
|
+
const settled =
|
|
226
|
+
entry.settledAt !== undefined
|
|
227
|
+
? ` [${entry.state} +${(entry.settledAt - entry.startedAt).toFixed(1)}ms]`
|
|
228
|
+
: entry.state === "pending"
|
|
229
|
+
? " [pending]"
|
|
230
|
+
: "";
|
|
231
|
+
const status =
|
|
232
|
+
entry.state === "failed" && entry.settledAt === undefined
|
|
233
|
+
? " FAILED"
|
|
234
|
+
: "";
|
|
235
|
+
return `${indent}${entry.kind} ${entry.name}${duration}${settled}${status}`;
|
|
236
|
+
})
|
|
237
|
+
.join("\n");
|
|
238
|
+
},
|
|
239
|
+
formatActive(activeEntries = active(), activeAt = now()) {
|
|
240
|
+
return activeEntries
|
|
241
|
+
.map((entry) => {
|
|
242
|
+
const indent = " ".repeat(entry.depth);
|
|
243
|
+
const duration = (activeAt - entry.startedAt).toFixed(1);
|
|
244
|
+
return `${indent}${entry.kind} ${entry.name} ${duration}ms RUNNING`;
|
|
245
|
+
})
|
|
246
|
+
.join("\n");
|
|
247
|
+
},
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
export interface RoutineTraceOwner {
|
|
252
|
+
_activeRoutine?: RoutineTrace;
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
export interface RoutineRunnerOptions {
|
|
256
|
+
trace?: RoutineTrace;
|
|
257
|
+
owner?: RoutineTraceOwner;
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
function assertSynchronousReturn(value: unknown): void {
|
|
261
|
+
if (isThenable(value)) {
|
|
262
|
+
throw new Error(
|
|
263
|
+
"[routine] plans cannot return promises; await asynchronous work with step()",
|
|
264
|
+
);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
function observeSettlement(
|
|
269
|
+
handle: Promise<unknown>,
|
|
270
|
+
trace: RoutineTrace | undefined,
|
|
271
|
+
entry: RoutineTraceEntry | undefined,
|
|
272
|
+
): void {
|
|
273
|
+
// Attaching both callbacks marks the rejection handled on this branch, so a
|
|
274
|
+
// fire-and-forget failure never surfaces as an unhandled rejection.
|
|
275
|
+
handle.then(
|
|
276
|
+
() => {
|
|
277
|
+
if (trace && entry) trace.settle(entry, { status: "fulfilled" });
|
|
278
|
+
},
|
|
279
|
+
(error) => {
|
|
280
|
+
if (trace && entry) {
|
|
281
|
+
trace.settle(entry, { status: "rejected", error });
|
|
282
|
+
}
|
|
283
|
+
},
|
|
284
|
+
);
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
/**
|
|
288
|
+
* Interpret a plan. Invariants shared with driveRscRenderPlan: a command is
|
|
289
|
+
* observable before its work runs, `execute` runs exactly once, results and
|
|
290
|
+
* errors resume the plan with exact identity, and a plan-level try/catch
|
|
291
|
+
* around a step is the recovery mechanism.
|
|
292
|
+
*/
|
|
293
|
+
export async function runRoutine<TReturn>(
|
|
294
|
+
plan: RoutinePlan<TReturn>,
|
|
295
|
+
options: RoutineRunnerOptions = {},
|
|
296
|
+
): Promise<TReturn> {
|
|
297
|
+
const trace = options.trace;
|
|
298
|
+
const owner = options.owner;
|
|
299
|
+
const previousTrace = owner?._activeRoutine;
|
|
300
|
+
if (trace && owner) owner._activeRoutine = trace;
|
|
301
|
+
|
|
302
|
+
try {
|
|
303
|
+
let current = plan.next();
|
|
304
|
+
while (!current.done) {
|
|
305
|
+
const command = current.value;
|
|
306
|
+
switch (command.kind) {
|
|
307
|
+
case "enter": {
|
|
308
|
+
trace?.enterScope(command.name);
|
|
309
|
+
current = plan.next({ kind: "enter" });
|
|
310
|
+
break;
|
|
311
|
+
}
|
|
312
|
+
case "exit": {
|
|
313
|
+
trace?.exitScope(command.outcome, command.error);
|
|
314
|
+
current = plan.next({ kind: "exit" });
|
|
315
|
+
break;
|
|
316
|
+
}
|
|
317
|
+
case "step": {
|
|
318
|
+
const entry = trace?.begin(command.name, "step");
|
|
319
|
+
let value: unknown;
|
|
320
|
+
try {
|
|
321
|
+
value = await command.execute();
|
|
322
|
+
} catch (error) {
|
|
323
|
+
if (trace && entry) trace.fail(entry, error);
|
|
324
|
+
// Throw INTO the plan: a catching plan branches to recovery; an
|
|
325
|
+
// uncaught error propagates out of plan.throw with exact identity.
|
|
326
|
+
current = plan.throw(error);
|
|
327
|
+
break;
|
|
328
|
+
}
|
|
329
|
+
if (trace && entry) trace.end(entry);
|
|
330
|
+
current = plan.next({ kind: "step", value });
|
|
331
|
+
break;
|
|
332
|
+
}
|
|
333
|
+
case "handoff": {
|
|
334
|
+
const entry = trace?.begin(command.name, "handoff");
|
|
335
|
+
try {
|
|
336
|
+
const result = command.execute();
|
|
337
|
+
if (isThenable(result)) {
|
|
338
|
+
observeSettlement(Promise.resolve(result), trace, entry);
|
|
339
|
+
} else if (trace && entry) {
|
|
340
|
+
trace.settle(entry, { status: "fulfilled" });
|
|
341
|
+
}
|
|
342
|
+
} catch (error) {
|
|
343
|
+
if (trace && entry) trace.fail(entry, error);
|
|
344
|
+
current = plan.throw(error);
|
|
345
|
+
break;
|
|
346
|
+
}
|
|
347
|
+
current = plan.next({ kind: "handoff" });
|
|
348
|
+
break;
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
assertSynchronousReturn(current.value);
|
|
353
|
+
return current.value;
|
|
354
|
+
} finally {
|
|
355
|
+
if (trace && owner?._activeRoutine === trace) {
|
|
356
|
+
owner._activeRoutine = previousTrace;
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
}
|