effective-rsc 0.1.0
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/LICENSE +21 -0
- package/LLMS.md +382 -0
- package/README.md +235 -0
- package/bin/ersc.js +3 -0
- package/dist/application/component.d.ts +15 -0
- package/dist/application/component.js +20 -0
- package/dist/application/component.js.map +1 -0
- package/dist/application/definition.d.ts +31 -0
- package/dist/application/definition.js +57 -0
- package/dist/application/definition.js.map +1 -0
- package/dist/application/ersc-identity.d.ts +25 -0
- package/dist/application/ersc-identity.js +23 -0
- package/dist/application/ersc-identity.js.map +1 -0
- package/dist/application/ersc.d.ts +28 -0
- package/dist/application/ersc.js +72 -0
- package/dist/application/ersc.js.map +1 -0
- package/dist/application/layout.d.ts +18 -0
- package/dist/application/layout.js +17 -0
- package/dist/application/layout.js.map +1 -0
- package/dist/application/loading.d.ts +17 -0
- package/dist/application/loading.js +14 -0
- package/dist/application/loading.js.map +1 -0
- package/dist/application/middleware.d.ts +36 -0
- package/dist/application/middleware.js +46 -0
- package/dist/application/middleware.js.map +1 -0
- package/dist/application/page.d.ts +58 -0
- package/dist/application/page.js +50 -0
- package/dist/application/page.js.map +1 -0
- package/dist/application/render-runtime.d.ts +9 -0
- package/dist/application/render-runtime.js +28 -0
- package/dist/application/render-runtime.js.map +1 -0
- package/dist/application/route-graph.d.ts +22 -0
- package/dist/application/route-graph.js +68 -0
- package/dist/application/route-graph.js.map +1 -0
- package/dist/application/route-path.d.ts +31 -0
- package/dist/application/route-path.js +67 -0
- package/dist/application/route-path.js.map +1 -0
- package/dist/application/routes.d.ts +66 -0
- package/dist/application/routes.js +159 -0
- package/dist/application/routes.js.map +1 -0
- package/dist/application/server-fn.d.ts +30 -0
- package/dist/application/server-fn.js +58 -0
- package/dist/application/server-fn.js.map +1 -0
- package/dist/build/build.d.ts +26 -0
- package/dist/build/build.js +59 -0
- package/dist/build/build.js.map +1 -0
- package/dist/build/compiled-server.d.ts +53 -0
- package/dist/build/compiled-server.js +77 -0
- package/dist/build/compiled-server.js.map +1 -0
- package/dist/build/contract.d.ts +23 -0
- package/dist/build/contract.js +41 -0
- package/dist/build/contract.js.map +1 -0
- package/dist/build/dev-channel.d.ts +20 -0
- package/dist/build/dev-channel.js +71 -0
- package/dist/build/dev-channel.js.map +1 -0
- package/dist/build/dev.d.ts +41 -0
- package/dist/build/dev.js +186 -0
- package/dist/build/dev.js.map +1 -0
- package/dist/build/rsc-entry.d.ts +4 -0
- package/dist/build/rsc-entry.js +17 -0
- package/dist/build/rsc-entry.js.map +1 -0
- package/dist/build/rspack-config.d.ts +17 -0
- package/dist/build/rspack-config.js +259 -0
- package/dist/build/rspack-config.js.map +1 -0
- package/dist/build/rspack.d.ts +45 -0
- package/dist/build/rspack.js +231 -0
- package/dist/build/rspack.js.map +1 -0
- package/dist/build/terminal.d.ts +9 -0
- package/dist/build/terminal.js +17 -0
- package/dist/build/terminal.js.map +1 -0
- package/dist/cli.d.ts +14 -0
- package/dist/cli.js +116 -0
- package/dist/cli.js.map +1 -0
- package/dist/client/application.d.ts +2 -0
- package/dist/client/application.js +73 -0
- package/dist/client/application.js.map +1 -0
- package/dist/client/browser-capabilities.d.ts +9 -0
- package/dist/client/browser-capabilities.js +20 -0
- package/dist/client/browser-capabilities.js.map +1 -0
- package/dist/client/browser-effect-runner.d.ts +13 -0
- package/dist/client/browser-effect-runner.js +13 -0
- package/dist/client/browser-effect-runner.js.map +1 -0
- package/dist/client/browser-renderer.d.ts +70 -0
- package/dist/client/browser-renderer.js +159 -0
- package/dist/client/browser-renderer.js.map +1 -0
- package/dist/client/browser-screen.d.ts +2 -0
- package/dist/client/browser-screen.js +215 -0
- package/dist/client/browser-screen.js.map +1 -0
- package/dist/client/call-server.d.ts +8 -0
- package/dist/client/call-server.js +151 -0
- package/dist/client/call-server.js.map +1 -0
- package/dist/client/client-router.d.ts +6 -0
- package/dist/client/client-router.js +588 -0
- package/dist/client/client-router.js.map +1 -0
- package/dist/client/entry.d.ts +1 -0
- package/dist/client/entry.js +12 -0
- package/dist/client/entry.js.map +1 -0
- package/dist/client/flight-client.d.ts +83 -0
- package/dist/client/flight-client.js +146 -0
- package/dist/client/flight-client.js.map +1 -0
- package/dist/client/initial-flight-stream.d.ts +18 -0
- package/dist/client/initial-flight-stream.js +60 -0
- package/dist/client/initial-flight-stream.js.map +1 -0
- package/dist/client/navigation-api.d.ts +34 -0
- package/dist/client/navigation-api.js +25 -0
- package/dist/client/navigation-api.js.map +1 -0
- package/dist/client/navigation-routing.d.ts +3 -0
- package/dist/client/navigation-routing.js +8 -0
- package/dist/client/navigation-routing.js.map +1 -0
- package/dist/client/react-dom-renderer.d.ts +20 -0
- package/dist/client/react-dom-renderer.js +101 -0
- package/dist/client/react-dom-renderer.js.map +1 -0
- package/dist/client/route-loader.d.ts +81 -0
- package/dist/client/route-loader.js +128 -0
- package/dist/client/route-loader.js.map +1 -0
- package/dist/client/route-refresh.d.ts +31 -0
- package/dist/client/route-refresh.js +132 -0
- package/dist/client/route-refresh.js.map +1 -0
- package/dist/client/route-tree.d.ts +7 -0
- package/dist/client/route-tree.js +34 -0
- package/dist/client/route-tree.js.map +1 -0
- package/dist/dev/channel.d.ts +18 -0
- package/dist/dev/channel.js +30 -0
- package/dist/dev/channel.js.map +1 -0
- package/dist/dev/client.d.ts +3 -0
- package/dist/dev/client.js +132 -0
- package/dist/dev/client.js.map +1 -0
- package/dist/dev/hmr-update.d.ts +20 -0
- package/dist/dev/hmr-update.js +28 -0
- package/dist/dev/hmr-update.js.map +1 -0
- package/dist/dev/panel.d.ts +41 -0
- package/dist/dev/panel.js +9946 -0
- package/dist/dev/panel.js.map +1 -0
- package/dist/dev/runtime-failure.d.ts +11 -0
- package/dist/dev/runtime-failure.js +32 -0
- package/dist/dev/runtime-failure.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/rsc/flight.d.ts +16 -0
- package/dist/rsc/flight.js +6 -0
- package/dist/rsc/flight.js.map +1 -0
- package/dist/rsc/render-route-tree.d.ts +11 -0
- package/dist/rsc/render-route-tree.js +52 -0
- package/dist/rsc/render-route-tree.js.map +1 -0
- package/dist/rsc/route-tree.d.ts +6 -0
- package/dist/rsc/route-tree.js +5 -0
- package/dist/rsc/route-tree.js.map +1 -0
- package/dist/server/application.d.ts +17 -0
- package/dist/server/application.js +178 -0
- package/dist/server/application.js.map +1 -0
- package/dist/server/flight-html-stream.d.ts +19 -0
- package/dist/server/flight-html-stream.js +193 -0
- package/dist/server/flight-html-stream.js.map +1 -0
- package/dist/server/flight-renderer.d.ts +31 -0
- package/dist/server/flight-renderer.js +47 -0
- package/dist/server/flight-renderer.js.map +1 -0
- package/dist/server/html-renderer.d.ts +28 -0
- package/dist/server/html-renderer.js +82 -0
- package/dist/server/html-renderer.js.map +1 -0
- package/dist/server/request-outcome.d.ts +8 -0
- package/dist/server/request-outcome.js +5 -0
- package/dist/server/request-outcome.js.map +1 -0
- package/dist/server/server-config.d.ts +17 -0
- package/dist/server/server-config.js +18 -0
- package/dist/server/server-config.js.map +1 -0
- package/dist/server/server-fn-outcome.d.ts +13 -0
- package/dist/server/server-fn-outcome.js +24 -0
- package/dist/server/server-fn-outcome.js.map +1 -0
- package/dist/server/server-fn-request.d.ts +24 -0
- package/dist/server/server-fn-request.js +160 -0
- package/dist/server/server-fn-request.js.map +1 -0
- package/dist/unsupported.d.ts +0 -0
- package/dist/unsupported.js +5 -0
- package/dist/unsupported.js.map +1 -0
- package/docs/01-getting-started/01_first-application.tsx +26 -0
- package/docs/01-getting-started/20_styling.tsx +6 -0
- package/docs/01-getting-started/index.md +27 -0
- package/docs/01-getting-started/styles.css +1 -0
- package/docs/02-guides/01-server-functions/10_ersc.ts +6 -0
- package/docs/02-guides/01-server-functions/20_follow-author.ts +15 -0
- package/docs/02-guides/01-server-functions/30_follow-author-button.tsx +19 -0
- package/docs/02-guides/01-server-functions/40_application.tsx +30 -0
- package/docs/02-guides/01-server-functions/index.md +19 -0
- package/docs/02-guides/02-services/10_catalog.ts +22 -0
- package/docs/02-guides/02-services/20_application.tsx +44 -0
- package/docs/02-guides/02-services/index.md +17 -0
- package/docs/02-guides/03-routing/10_ersc.ts +6 -0
- package/docs/02-guides/03-routing/10_layouts.tsx +36 -0
- package/docs/02-guides/03-routing/20_pages.tsx +23 -0
- package/docs/02-guides/03-routing/30_routes.tsx +17 -0
- package/docs/02-guides/03-routing/40_application.ts +7 -0
- package/docs/02-guides/03-routing/index.md +22 -0
- package/docs/02-guides/04-middleware/10_auth.ts +27 -0
- package/docs/02-guides/04-middleware/20_account-page.tsx +13 -0
- package/docs/02-guides/04-middleware/30_update-profile.ts +16 -0
- package/docs/02-guides/04-middleware/40_application.tsx +20 -0
- package/docs/02-guides/04-middleware/index.md +25 -0
- package/docs/02-guides/05-http/10_application-layer.tsx +60 -0
- package/docs/02-guides/05-http/index.md +23 -0
- package/docs/02-guides/index.md +11 -0
- package/docs/03-advanced/01-request-runtime-and-lifetimes/index.md +13 -0
- package/docs/03-advanced/02-client-navigation/index.md +61 -0
- package/docs/03-advanced/03-server-function-execution-and-refresh/index.md +17 -0
- package/docs/03-advanced/index.md +11 -0
- package/docs/04-api-reference/01-application/index.md +8 -0
- package/docs/04-api-reference/02-page/index.md +12 -0
- package/docs/04-api-reference/03-layout/index.md +4 -0
- package/docs/04-api-reference/04-loading/index.md +4 -0
- package/docs/04-api-reference/05-component/10_component.tsx +18 -0
- package/docs/04-api-reference/05-component/index.md +10 -0
- package/docs/04-api-reference/06-middleware/index.md +33 -0
- package/docs/04-api-reference/07-routes/index.md +20 -0
- package/docs/04-api-reference/08-server-fn/index.md +43 -0
- package/docs/04-api-reference/index.md +17 -0
- package/docs/environment.d.ts +1 -0
- package/docs/index.md +15 -0
- package/logo-dark.svg +6 -0
- package/logo.svg +6 -0
- package/package.json +87 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client/client-router.js","sources":["../../src/client/client-router.ts"],"sourcesContent":["import { Effect, Exit, MutableRef } from 'effect';\nimport { addTransitionType, startTransition } from 'react';\n\nimport { BrowserEffectRunner } from './browser-effect-runner';\nimport { BrowserRenderer, type BrowserRendererNavigation } from './browser-renderer';\nimport { NavigationApi } from './navigation-api';\nimport {\n isRoutedNavigation,\n NativeDocumentNavigationInfo,\n preserveRequestedHash,\n} from './navigation-routing';\nimport { RouteLoader, type RouteLoad } from './route-loader';\n\ntype NavigationGeneration = symbol;\ntype RouteResource = Extract<RouteLoad, { readonly _tag: 'Route' }>;\n\nconst getNavigationTransitionTypes = (\n event: NavigateEvent,\n fromIndex: number | null,\n): ReadonlyArray<string> => {\n const types = [\n 'navigation',\n `navigation-${event.navigationType}`,\n ...(event.hasUAVisualTransition ? ['navigation-ua-visual-transition'] : []),\n ];\n if (event.navigationType === 'push') {\n return [...types, 'navigation-forward'];\n }\n if (event.navigationType !== 'traverse') {\n return types;\n }\n\n if (fromIndex === null || fromIndex === event.destination.index) {\n return types;\n }\n return [\n ...types,\n event.destination.index < fromIndex ? 'navigation-backward' : 'navigation-forward',\n ];\n};\n\ntype NavigationEntryState =\n | { readonly _tag: 'PendingCommit' }\n | {\n readonly _tag: 'Committed';\n readonly entry: NavigationHistoryEntry | null;\n };\n\ntype NavigationFlightState =\n | { readonly _tag: 'Streaming'; readonly resource: RouteResource }\n | { readonly _tag: 'Completed'; readonly cache: RouteResource['cache'] };\n\ntype NavigationCandidate =\n | {\n readonly _tag: 'Loading';\n readonly generation: NavigationGeneration;\n readonly lifetime: AbortController;\n }\n | {\n readonly _tag: 'Publishing';\n readonly generation: NavigationGeneration;\n readonly lifetime: AbortController;\n readonly resource: RouteResource;\n }\n | {\n readonly _tag: 'Rendering';\n readonly generation: NavigationGeneration;\n readonly lifetime: AbortController;\n readonly rendererNavigation: BrowserRendererNavigation;\n readonly resource: RouteResource;\n };\n\ntype VisibleNavigation =\n | { readonly _tag: 'Settled' }\n | {\n readonly _tag: 'Navigation';\n readonly entry: NavigationEntryState;\n readonly flight: NavigationFlightState;\n readonly generation: NavigationGeneration;\n };\n\ntype RouterState =\n | { readonly _tag: 'Ready'; readonly visible: VisibleNavigation }\n | {\n readonly _tag: 'Navigating';\n readonly candidate: NavigationCandidate;\n readonly visible: VisibleNavigation;\n };\n\ntype RouterEvent =\n | {\n readonly _tag: 'BeginNavigation';\n readonly generation: NavigationGeneration;\n readonly lifetime: AbortController;\n }\n | { readonly _tag: 'DocumentLoaded'; readonly generation: NavigationGeneration }\n | {\n readonly _tag: 'RouteLoaded';\n readonly generation: NavigationGeneration;\n readonly resource: RouteResource;\n }\n | {\n readonly _tag: 'RenderScheduled';\n readonly generation: NavigationGeneration;\n readonly rendererNavigation: BrowserRendererNavigation;\n readonly resource: RouteResource;\n }\n | { readonly _tag: 'RenderCommitted'; readonly generation: NavigationGeneration }\n | { readonly _tag: 'RenderRetired'; readonly generation: NavigationGeneration }\n | {\n readonly _tag: 'HistoryCommitted';\n readonly entry: NavigationHistoryEntry | null;\n readonly generation: NavigationGeneration;\n }\n | { readonly _tag: 'FlightCompleted'; readonly generation: NavigationGeneration }\n | { readonly _tag: 'FlightFailed'; readonly generation: NavigationGeneration }\n | { readonly _tag: 'NavigationAborted'; readonly generation: NavigationGeneration };\n\ntype RouterCommand =\n | { readonly _tag: 'SupersedeCandidate'; readonly candidate: NavigationCandidate }\n | {\n readonly _tag: 'PublishRoute';\n readonly generation: NavigationGeneration;\n readonly resource: RouteResource;\n }\n | { readonly _tag: 'ReleaseRoute'; readonly resource: RouteResource }\n | {\n readonly _tag: 'CacheRoute';\n readonly cache: RouteResource['cache'];\n readonly entry: NavigationHistoryEntry;\n }\n | {\n readonly _tag: 'CacheAndReleaseRoute';\n readonly entry: NavigationHistoryEntry;\n readonly resource: RouteResource;\n }\n | {\n readonly _tag: 'DiscardRoute';\n readonly rendererNavigation: BrowserRendererNavigation;\n readonly resource: RouteResource;\n };\n\ntype RouterTransition = {\n readonly command: RouterCommand | null;\n readonly state: RouterState;\n};\n\nconst reduceRouterState = (state: RouterState, event: RouterEvent): RouterTransition => {\n if (state.visible._tag === 'Navigation' && state.visible.generation === event.generation) {\n const visible = state.visible;\n switch (event._tag) {\n case 'RenderRetired':\n return {\n command:\n visible.flight._tag === 'Streaming'\n ? { _tag: 'ReleaseRoute', resource: visible.flight.resource }\n : null,\n state: { ...state, visible: { _tag: 'Settled' } },\n };\n case 'HistoryCommitted':\n if (visible.entry._tag === 'Committed') {\n throw new TypeError('A visible navigation history entry cannot commit twice.');\n }\n if (visible.flight._tag === 'Streaming') {\n return {\n command: null,\n state: {\n ...state,\n visible: {\n ...visible,\n entry: { _tag: 'Committed', entry: event.entry },\n },\n },\n };\n }\n return {\n command:\n event.entry === null\n ? null\n : { _tag: 'CacheRoute', cache: visible.flight.cache, entry: event.entry },\n state: { ...state, visible: { _tag: 'Settled' } },\n };\n case 'FlightCompleted':\n if (visible.flight._tag === 'Completed') {\n throw new TypeError('A visible navigation Flight stream cannot complete twice.');\n }\n if (visible.entry._tag === 'PendingCommit') {\n return {\n command: { _tag: 'ReleaseRoute', resource: visible.flight.resource },\n state: {\n ...state,\n visible: {\n ...visible,\n flight: { _tag: 'Completed', cache: visible.flight.resource.cache },\n },\n },\n };\n }\n return {\n command:\n visible.entry.entry === null\n ? { _tag: 'ReleaseRoute', resource: visible.flight.resource }\n : {\n _tag: 'CacheAndReleaseRoute',\n entry: visible.entry.entry,\n resource: visible.flight.resource,\n },\n state: { ...state, visible: { _tag: 'Settled' } },\n };\n case 'FlightFailed':\n if (visible.flight._tag === 'Completed') {\n throw new TypeError('A completed visible Flight stream cannot fail.');\n }\n return {\n command: { _tag: 'ReleaseRoute', resource: visible.flight.resource },\n state: { ...state, visible: { _tag: 'Settled' } },\n };\n }\n }\n\n if (\n event._tag === 'RenderRetired' ||\n event._tag === 'HistoryCommitted' ||\n event._tag === 'FlightCompleted'\n ) {\n return { command: null, state };\n }\n\n if (event._tag === 'BeginNavigation') {\n const nextState: RouterState = {\n _tag: 'Navigating',\n candidate: {\n _tag: 'Loading',\n generation: event.generation,\n lifetime: event.lifetime,\n },\n visible: state.visible,\n };\n if (state._tag === 'Ready') {\n return { command: null, state: nextState };\n }\n return {\n command: { _tag: 'SupersedeCandidate', candidate: state.candidate },\n state: nextState,\n };\n }\n\n if (state._tag === 'Ready' || state.candidate.generation !== event.generation) {\n switch (event._tag) {\n case 'RouteLoaded':\n return { command: { _tag: 'ReleaseRoute', resource: event.resource }, state };\n case 'RenderScheduled':\n return {\n command: {\n _tag: 'DiscardRoute',\n rendererNavigation: event.rendererNavigation,\n resource: event.resource,\n },\n state,\n };\n default:\n return { command: null, state };\n }\n }\n\n switch (event._tag) {\n case 'DocumentLoaded':\n case 'FlightFailed':\n if (state.candidate._tag !== 'Loading') {\n throw new TypeError(`${event._tag} cannot follow ${state.candidate._tag}.`);\n }\n return { command: null, state: { _tag: 'Ready', visible: state.visible } };\n case 'RouteLoaded':\n if (state.candidate._tag !== 'Loading') {\n throw new TypeError(`RouteLoaded cannot follow ${state.candidate._tag}.`);\n }\n return {\n command: {\n _tag: 'PublishRoute',\n generation: event.generation,\n resource: event.resource,\n },\n state: {\n _tag: 'Navigating',\n candidate: {\n _tag: 'Publishing',\n generation: event.generation,\n lifetime: state.candidate.lifetime,\n resource: event.resource,\n },\n visible: state.visible,\n },\n };\n case 'RenderScheduled':\n if (state.candidate._tag !== 'Publishing') {\n throw new TypeError(`RenderScheduled cannot follow ${state.candidate._tag}.`);\n }\n if (state.candidate.resource !== event.resource) {\n throw new TypeError('RenderScheduled must use the published route resource.');\n }\n return {\n command: null,\n state: {\n _tag: 'Navigating',\n candidate: {\n _tag: 'Rendering',\n generation: event.generation,\n lifetime: state.candidate.lifetime,\n rendererNavigation: event.rendererNavigation,\n resource: event.resource,\n },\n visible: state.visible,\n },\n };\n case 'RenderCommitted':\n if (state.candidate._tag !== 'Rendering') {\n throw new TypeError(`RenderCommitted cannot follow ${state.candidate._tag}.`);\n }\n return {\n command: null,\n state: {\n _tag: 'Ready',\n visible: {\n _tag: 'Navigation',\n entry: { _tag: 'PendingCommit' },\n flight: { _tag: 'Streaming', resource: state.candidate.resource },\n generation: event.generation,\n },\n },\n };\n case 'NavigationAborted':\n if (state.candidate._tag === 'Loading') {\n return { command: null, state: { _tag: 'Ready', visible: state.visible } };\n }\n if (state.candidate._tag === 'Publishing') {\n return {\n command: { _tag: 'ReleaseRoute', resource: state.candidate.resource },\n state: { _tag: 'Ready', visible: state.visible },\n };\n }\n return {\n command: {\n _tag: 'DiscardRoute',\n rendererNavigation: state.candidate.rendererNavigation,\n resource: state.candidate.resource,\n },\n state: { _tag: 'Ready', visible: state.visible },\n };\n }\n};\n\ntype NavigationPreparation =\n | { readonly _tag: 'Handled' }\n | {\n readonly _tag: 'Rendered';\n readonly rendererNavigation: BrowserRendererNavigation;\n readonly resolvedDestination: URL;\n readonly resource: RouteResource;\n };\n\nexport const installClientRouter = Effect.gen(function* () {\n const browserRenderer = yield* BrowserRenderer;\n const navigationApi = yield* NavigationApi;\n const routeLoader = yield* RouteLoader;\n const run = yield* BrowserEffectRunner;\n const routerState = MutableRef.make<RouterState>({\n _tag: 'Ready',\n visible: { _tag: 'Settled' },\n });\n\n const dispatch = (event: RouterEvent) => {\n const transition = reduceRouterState(MutableRef.get(routerState), event);\n MutableRef.set(routerState, transition.state);\n return transition;\n };\n\n const executeRouterCommand = Effect.fnUntraced(function* (command: RouterCommand | null) {\n if (command === null) {\n return;\n }\n switch (command._tag) {\n case 'SupersedeCandidate': {\n const candidate = command.candidate;\n yield* Effect.sync(() => candidate.lifetime.abort());\n if (candidate._tag === 'Loading') {\n break;\n }\n if (candidate._tag === 'Publishing') {\n yield* candidate.resource.release;\n break;\n }\n yield* Effect.promise(() => candidate.rendererNavigation.discard()).pipe(\n Effect.ensuring(candidate.resource.release),\n );\n break;\n }\n case 'ReleaseRoute':\n yield* command.resource.release;\n break;\n case 'CacheRoute':\n yield* Effect.sync(() => command.cache(command.entry));\n break;\n case 'CacheAndReleaseRoute':\n yield* Effect.sync(() => command.resource.cache(command.entry));\n yield* command.resource.release;\n break;\n case 'DiscardRoute':\n yield* Effect.promise(() => command.rendererNavigation.discard()).pipe(\n Effect.ensuring(command.resource.release),\n );\n break;\n default:\n throw new TypeError(`Cannot execute the ${command._tag} lifecycle command here.`);\n }\n });\n\n const openDocument = (event: NavigateEvent, destination: URL) => {\n if (event.navigationType === 'traverse') {\n navigationApi.replaceDocument(destination.href);\n return;\n }\n navigationApi.navigate(destination.href, {\n history: event.navigationType === 'replace' ? 'replace' : 'push',\n info: NativeDocumentNavigationInfo,\n });\n };\n\n const onNavigate = (event: NavigateEvent) => {\n if (!isRoutedNavigation(event)) {\n return;\n }\n\n const destination = new URL(event.destination.url);\n const generation: NavigationGeneration = Symbol('NavigationGeneration');\n const lifetime = new AbortController();\n const navigationSignal = AbortSignal.any([event.signal, lifetime.signal]);\n const begin = dispatch({\n _tag: 'BeginNavigation',\n generation,\n lifetime,\n });\n void run(executeRouterCommand(begin.command)).catch(() => undefined);\n // oxlint-disable-next-line effecttsgo/async-function -- Navigation handlers are native Promise boundaries.\n const handler = async (precommitController?: NavigationPrecommitController) => {\n const preparation = Promise.withResolvers<NavigationPreparation>();\n\n const navigationAction = Effect.gen(function* () {\n const resource = yield* routeLoader\n .load({\n destination: event.destination,\n navigationType: event.navigationType,\n })\n .pipe(\n Effect.onError(() =>\n Effect.sync(() => {\n dispatch({ _tag: 'FlightFailed', generation });\n }),\n ),\n );\n\n if (resource._tag === 'Document') {\n dispatch({ _tag: 'DocumentLoaded', generation });\n yield* resource.release;\n openDocument(event, destination);\n return { _tag: 'Handled' } as const;\n }\n\n const resolvedDestination = preserveRequestedHash(destination, resource.resolvedUrl);\n if (resolvedDestination.origin !== destination.origin) {\n dispatch({ _tag: 'DocumentLoaded', generation });\n yield* resource.release;\n openDocument(event, resolvedDestination);\n return { _tag: 'Handled' } as const;\n }\n\n if (\n destination.href !== resolvedDestination.href &&\n (precommitController === undefined || event.navigationType === 'traverse')\n ) {\n dispatch({ _tag: 'DocumentLoaded', generation });\n yield* resource.release;\n navigationApi.replaceDocument(resolvedDestination.href);\n return { _tag: 'Handled' } as const;\n }\n\n const transition = dispatch({ _tag: 'RouteLoaded', generation, resource });\n const command = transition.command;\n if (command?._tag === 'ReleaseRoute') {\n yield* command.resource.release;\n return { _tag: 'Handled' } as const;\n }\n if (command?._tag === 'PublishRoute') {\n const rendererNavigation = yield* Effect.sync(() => {\n let navigation!: BrowserRendererNavigation;\n startTransition(() => {\n const fromIndex =\n navigationApi.getTransition()?.from.index ??\n navigationApi.getCurrentEntry()?.index ??\n null;\n for (const type of getNavigationTransitionTypes(event, fromIndex)) {\n addTransitionType(type);\n }\n navigation = browserRenderer.navigate(command.resource.routeTree);\n });\n return navigation;\n });\n const scheduled = dispatch({\n _tag: 'RenderScheduled',\n generation: command.generation,\n rendererNavigation,\n resource: command.resource,\n });\n if (scheduled.command !== null) {\n yield* executeRouterCommand(scheduled.command);\n return { _tag: 'Handled' } as const;\n }\n return {\n _tag: 'Rendered',\n rendererNavigation,\n resolvedDestination,\n resource: command.resource,\n } as const;\n }\n\n throw new TypeError('A loaded route must be published or released.');\n });\n\n // oxlint-disable-next-line effecttsgo/async-function -- React Transition Actions are a native Promise boundary.\n startTransition(async () => {\n await run(navigationAction, { signal: navigationSignal })\n .then(preparation.resolve)\n .catch(preparation.reject);\n });\n\n const abortNavigation = Effect.suspend(() => {\n const transition = dispatch({ _tag: 'NavigationAborted', generation });\n return executeRouterCommand(transition.command);\n });\n const outcome = await preparation.promise.catch((cause) => {\n if (navigationSignal.aborted) {\n return run(abortNavigation.pipe(Effect.as({ _tag: 'Handled' } as NavigationPreparation)));\n }\n if (!event.cancelable && event.navigationType === 'traverse') {\n navigationApi.reloadDocument();\n return { _tag: 'Handled' } as NavigationPreparation;\n }\n throw cause;\n });\n if (outcome._tag === 'Handled') {\n return;\n }\n\n const { rendererNavigation, resolvedDestination, resource } = outcome;\n const waitForNavigationCommit = Effect.uninterruptibleMask((restore) =>\n restore(Effect.promise(() => rendererNavigation.committed)).pipe(\n Effect.tap(\n Effect.suspend(() => {\n const transition = dispatch({\n _tag: 'RenderCommitted',\n generation,\n });\n return executeRouterCommand(transition.command);\n }),\n ),\n Effect.onExit((exit) => (Exit.isFailure(exit) ? abortNavigation : Effect.void)),\n ),\n );\n try {\n await run(waitForNavigationCommit, { signal: navigationSignal });\n } catch (cause) {\n if (navigationSignal.aborted) {\n return;\n }\n throw cause;\n }\n\n const waitForRenderRetirement = Effect.gen(function* () {\n yield* Effect.promise(() => rendererNavigation.retired);\n const transition = dispatch({ _tag: 'RenderRetired', generation });\n yield* executeRouterCommand(transition.command);\n }).pipe(Effect.ignore);\n void run(waitForRenderRetirement).catch(() => undefined);\n\n const waitForFlightCompletion = Effect.gen(function* () {\n const flightExit = yield* Effect.exit(resource.completed);\n const transition = dispatch({\n _tag: Exit.isSuccess(flightExit) ? 'FlightCompleted' : 'FlightFailed',\n generation,\n });\n yield* executeRouterCommand(transition.command);\n });\n void run(waitForFlightCompletion).catch(() => undefined);\n\n if (destination.href !== resolvedDestination.href && precommitController !== undefined) {\n precommitController.redirect(resolvedDestination.href, { history: 'auto' });\n }\n const commitHistory = Effect.suspend(() => {\n const transition = dispatch({\n _tag: 'HistoryCommitted',\n entry: navigationApi.getCurrentEntry(),\n generation,\n });\n return executeRouterCommand(transition.command);\n });\n if (precommitController === undefined) {\n await run(commitHistory);\n } else {\n precommitController.addHandler(() => run(commitHistory));\n }\n };\n\n event.intercept(\n event.cancelable\n ? { precommitHandler: handler }\n : {\n // Browsers make some traversals non-cancelable so an application cannot trap users.\n handler,\n },\n );\n };\n\n yield* Effect.acquireRelease(\n Effect.sync(() => navigationApi.subscribe(onNavigate)),\n (unsubscribe) => Effect.sync(unsubscribe),\n );\n});\n"],"names":["Effect","Exit","MutableRef","addTransitionType","startTransition","BrowserEffectRunner","BrowserRenderer","NavigationApi","isRoutedNavigation","NativeDocumentNavigationInfo","preserveRequestedHash","RouteLoader","getNavigationTransitionTypes","event","fromIndex","types","reduceRouterState","state","visible","TypeError","nextState","installClientRouter","browserRenderer","navigationApi","routeLoader","run","routerState","dispatch","transition","executeRouterCommand","command","candidate","openDocument","destination","onNavigate","URL","generation","Symbol","lifetime","AbortController","navigationSignal","AbortSignal","begin","undefined","handler","precommitController","preparation","Promise","navigationAction","resource","resolvedDestination","rendererNavigation","navigation","type","scheduled","abortNavigation","outcome","cause","waitForNavigationCommit","restore","exit","waitForRenderRetirement","waitForFlightCompletion","flightExit","commitHistory","unsubscribe"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { browserMain } from "./application.js";
|
|
2
|
+
|
|
3
|
+
import * as __rspack_external__effect_platform_browser_BrowserRuntime_eaea6a97 from "@effect/platform-browser/BrowserRuntime";
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
__rspack_external__effect_platform_browser_BrowserRuntime_eaea6a97.runMain(browserMain);
|
|
9
|
+
|
|
10
|
+
export {};
|
|
11
|
+
|
|
12
|
+
//# sourceMappingURL=entry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client/entry.js","sources":["../../src/client/entry.ts"],"sourcesContent":["import * as BrowserRuntime from '@effect/platform-browser/BrowserRuntime';\n\nimport { browserMain } from './application';\n\nBrowserRuntime.runMain(browserMain);\n"],"names":["BrowserRuntime","browserMain"],"mappings":";;;;;AAA0E;AAE9B;AAE5CA,0EAAsB,CAACC,WAAWA"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { Context, Effect, Layer, Schema, Scope } from 'effect';
|
|
2
|
+
import { HttpClient } from 'effect/unstable/http';
|
|
3
|
+
import { type TemporaryReferenceSet } from 'react-server-dom-rspack/client.browser';
|
|
4
|
+
import { type FlightPayload } from '../rsc/flight.js';
|
|
5
|
+
import { InitialFlightStream } from './initial-flight-stream.js';
|
|
6
|
+
declare const FlightLoadError_base: Schema.Class<FlightLoadError, Schema.TaggedStruct<"FlightLoadError", {
|
|
7
|
+
readonly cause: Schema.Defect;
|
|
8
|
+
readonly reason: Schema.Literals<readonly ["RequestFailed", "UnexpectedResponse", "DecodeFailed"]>;
|
|
9
|
+
}>, import("effect/Cause").YieldableError>;
|
|
10
|
+
export declare class FlightLoadError extends FlightLoadError_base {
|
|
11
|
+
}
|
|
12
|
+
export type FlightRequest = {
|
|
13
|
+
readonly _tag: 'Navigation';
|
|
14
|
+
readonly destination: URL;
|
|
15
|
+
} | {
|
|
16
|
+
readonly _tag: 'ServerFunction';
|
|
17
|
+
readonly body: BodyInit;
|
|
18
|
+
readonly destination: URL;
|
|
19
|
+
readonly id: string;
|
|
20
|
+
readonly temporaryReferences: TemporaryReferenceSet;
|
|
21
|
+
};
|
|
22
|
+
declare const FlightClient_base: Context.ServiceClass<FlightClient, "ersc/client/FlightClient", {
|
|
23
|
+
load: (flightRequest: FlightRequest) => Effect.Effect<{
|
|
24
|
+
_tag: "Document";
|
|
25
|
+
release: Effect.Effect<void, never, never>;
|
|
26
|
+
completed?: never;
|
|
27
|
+
payload?: never;
|
|
28
|
+
resolvedUrl?: never;
|
|
29
|
+
} | {
|
|
30
|
+
_tag: "Flight";
|
|
31
|
+
completed: Effect.Effect<void, FlightLoadError, never>;
|
|
32
|
+
payload: FlightPayload;
|
|
33
|
+
release: Effect.Effect<void, never, never>;
|
|
34
|
+
resolvedUrl: URL;
|
|
35
|
+
}, FlightLoadError, Scope.Scope>;
|
|
36
|
+
loadInitial: Effect.Effect<{
|
|
37
|
+
completed: Effect.Effect<void, never, never>;
|
|
38
|
+
payload: FlightPayload;
|
|
39
|
+
}, FlightLoadError, never>;
|
|
40
|
+
}> & {
|
|
41
|
+
readonly make: Effect.Effect<{
|
|
42
|
+
load: (flightRequest: FlightRequest) => Effect.Effect<{
|
|
43
|
+
_tag: "Document";
|
|
44
|
+
release: Effect.Effect<void, never, never>;
|
|
45
|
+
completed?: never;
|
|
46
|
+
payload?: never;
|
|
47
|
+
resolvedUrl?: never;
|
|
48
|
+
} | {
|
|
49
|
+
_tag: "Flight";
|
|
50
|
+
completed: Effect.Effect<void, FlightLoadError, never>;
|
|
51
|
+
payload: FlightPayload;
|
|
52
|
+
release: Effect.Effect<void, never, never>;
|
|
53
|
+
resolvedUrl: URL;
|
|
54
|
+
}, FlightLoadError, Scope.Scope>;
|
|
55
|
+
loadInitial: Effect.Effect<{
|
|
56
|
+
completed: Effect.Effect<void, never, never>;
|
|
57
|
+
payload: FlightPayload;
|
|
58
|
+
}, FlightLoadError, never>;
|
|
59
|
+
}, never, HttpClient.HttpClient | InitialFlightStream>;
|
|
60
|
+
};
|
|
61
|
+
export declare class FlightClient extends FlightClient_base {
|
|
62
|
+
static readonly layer: Layer.Layer<FlightClient, never, HttpClient.HttpClient | InitialFlightStream>;
|
|
63
|
+
static readonly layerTest: (implementation: {
|
|
64
|
+
load?: (flightRequest: FlightRequest) => Effect.Effect<{
|
|
65
|
+
_tag: "Document";
|
|
66
|
+
release: Effect.Effect<void, never, never>;
|
|
67
|
+
completed?: never;
|
|
68
|
+
payload?: never;
|
|
69
|
+
resolvedUrl?: never;
|
|
70
|
+
} | {
|
|
71
|
+
_tag: "Flight";
|
|
72
|
+
completed: Effect.Effect<void, FlightLoadError, never>;
|
|
73
|
+
payload: FlightPayload;
|
|
74
|
+
release: Effect.Effect<void, never, never>;
|
|
75
|
+
resolvedUrl: URL;
|
|
76
|
+
}, FlightLoadError, Scope.Scope>;
|
|
77
|
+
loadInitial?: Effect.Effect<{
|
|
78
|
+
completed: Effect.Effect<void, never, never>;
|
|
79
|
+
payload: FlightPayload;
|
|
80
|
+
}, FlightLoadError, never>;
|
|
81
|
+
}) => Layer.Layer<FlightClient, never, never>;
|
|
82
|
+
}
|
|
83
|
+
export {};
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { Context, Deferred, Effect, Exit, Layer, Schema, Scope, Stream } from "effect";
|
|
2
|
+
import { HttpBody, HttpClient, HttpClientRequest } from "effect/unstable/http";
|
|
3
|
+
import { createFromReadableStream } from "react-server-dom-rspack/client.browser";
|
|
4
|
+
import { FlightMediaType, ServerFnIdHeader } from "../rsc/flight.js";
|
|
5
|
+
import { InitialFlightStream } from "./initial-flight-stream.js";
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
// oxlint-disable effecttsgo/process-env-in-effect -- Rspack replaces NODE_ENV at compile time.
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class FlightLoadError extends Schema.TaggedError()('FlightLoadError', {
|
|
19
|
+
cause: Schema.Defect(),
|
|
20
|
+
reason: Schema.Literals([
|
|
21
|
+
'RequestFailed',
|
|
22
|
+
'UnexpectedResponse',
|
|
23
|
+
'DecodeFailed'
|
|
24
|
+
])
|
|
25
|
+
}) {
|
|
26
|
+
}
|
|
27
|
+
class FlightClient extends Context.Service()('ersc/client/FlightClient', {
|
|
28
|
+
make: Effect.gen(function*() {
|
|
29
|
+
const httpClient = yield* HttpClient.HttpClient;
|
|
30
|
+
const initialFlight = yield* InitialFlightStream;
|
|
31
|
+
const loadInitial = Effect.gen(function*() {
|
|
32
|
+
const completed = Promise.withResolvers();
|
|
33
|
+
const stream = initialFlight.stream.pipeThrough(new TransformStream({
|
|
34
|
+
flush: ()=>completed.resolve(),
|
|
35
|
+
transform: (chunk, controller)=>controller.enqueue(chunk)
|
|
36
|
+
}));
|
|
37
|
+
const payload = yield* Effect.tryPromise({
|
|
38
|
+
try: ()=>createFromReadableStream(stream, process.env.NODE_ENV === 'development' ? {
|
|
39
|
+
startTime: 0
|
|
40
|
+
} : undefined),
|
|
41
|
+
catch: (cause)=>new FlightLoadError({
|
|
42
|
+
cause,
|
|
43
|
+
reason: 'DecodeFailed'
|
|
44
|
+
})
|
|
45
|
+
});
|
|
46
|
+
return {
|
|
47
|
+
completed: Effect.promise(()=>completed.promise),
|
|
48
|
+
payload
|
|
49
|
+
};
|
|
50
|
+
});
|
|
51
|
+
const load = Effect.fnUntraced(function*(flightRequest) {
|
|
52
|
+
const parentScope = yield* Effect.scope;
|
|
53
|
+
const responseScope = yield* Scope.fork(parentScope);
|
|
54
|
+
const release = Scope.close(responseScope, Exit["void"]);
|
|
55
|
+
return yield* Effect.gen(function*() {
|
|
56
|
+
const client = httpClient.pipe(HttpClient.withScope);
|
|
57
|
+
const request = flightRequest._tag === 'Navigation' ? HttpClientRequest.get(flightRequest.destination).pipe(HttpClientRequest.setHeader('accept', FlightMediaType)) : HttpClientRequest.post(flightRequest.destination).pipe(HttpClientRequest.setHeaders({
|
|
58
|
+
accept: FlightMediaType,
|
|
59
|
+
[ServerFnIdHeader]: flightRequest.id
|
|
60
|
+
}), HttpClientRequest.setBody(HttpBody.raw(flightRequest.body)));
|
|
61
|
+
const requestStartTime = process.env.NODE_ENV === 'development' ? performance.now() : 0;
|
|
62
|
+
const response = yield* client.execute(request).pipe(Scope.provide(responseScope), Effect.mapError((cause)=>new FlightLoadError({
|
|
63
|
+
cause,
|
|
64
|
+
reason: 'RequestFailed'
|
|
65
|
+
})));
|
|
66
|
+
if (response.status < 200 || response.status >= 300) {
|
|
67
|
+
if (flightRequest._tag === 'Navigation') {
|
|
68
|
+
return {
|
|
69
|
+
_tag: 'Document',
|
|
70
|
+
release
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
return yield* new FlightLoadError({
|
|
74
|
+
cause: new Error(`Flight request failed with status ${response.status}.`),
|
|
75
|
+
reason: 'RequestFailed'
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
const contentType = response.headers['content-type']?.split(';', 1)[0]?.trim().toLowerCase();
|
|
79
|
+
if (contentType !== FlightMediaType) {
|
|
80
|
+
if (flightRequest._tag === 'Navigation') {
|
|
81
|
+
return {
|
|
82
|
+
_tag: 'Document',
|
|
83
|
+
release
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
return yield* new FlightLoadError({
|
|
87
|
+
cause: new Error(`Expected a ${FlightMediaType} response, received ${response.headers['content-type'] ?? 'no content type'}.`),
|
|
88
|
+
reason: 'UnexpectedResponse'
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
const contentLocation = response.headers['content-location'];
|
|
92
|
+
if (contentLocation === undefined) {
|
|
93
|
+
return yield* new FlightLoadError({
|
|
94
|
+
cause: new Error('Expected the Flight response to include a Content-Location header.'),
|
|
95
|
+
reason: 'UnexpectedResponse'
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
const resolvedUrl = yield* Effect["try"]({
|
|
99
|
+
try: ()=>new URL(contentLocation, flightRequest.destination),
|
|
100
|
+
catch: (cause)=>new FlightLoadError({
|
|
101
|
+
cause,
|
|
102
|
+
reason: 'UnexpectedResponse'
|
|
103
|
+
})
|
|
104
|
+
});
|
|
105
|
+
const completed = yield* Deferred.make();
|
|
106
|
+
const responseBody = yield* Stream.toReadableStreamEffect(response.stream.pipe(Stream.onExit((exit)=>Deferred.done(completed, exit.pipe(Exit.mapError((cause)=>new FlightLoadError({
|
|
107
|
+
cause,
|
|
108
|
+
reason: 'RequestFailed'
|
|
109
|
+
})), Exit.asVoid))), Stream.ensuring(release)));
|
|
110
|
+
const decodeOptions = flightRequest._tag === 'ServerFunction' ? process.env.NODE_ENV === 'development' ? {
|
|
111
|
+
startTime: requestStartTime,
|
|
112
|
+
temporaryReferences: flightRequest.temporaryReferences
|
|
113
|
+
} : {
|
|
114
|
+
temporaryReferences: flightRequest.temporaryReferences
|
|
115
|
+
} : process.env.NODE_ENV === 'development' ? {
|
|
116
|
+
startTime: requestStartTime
|
|
117
|
+
} : undefined;
|
|
118
|
+
const payload = yield* Effect.tryPromise({
|
|
119
|
+
try: ()=>createFromReadableStream(responseBody, decodeOptions),
|
|
120
|
+
catch: (cause)=>new FlightLoadError({
|
|
121
|
+
cause,
|
|
122
|
+
reason: 'DecodeFailed'
|
|
123
|
+
})
|
|
124
|
+
});
|
|
125
|
+
return {
|
|
126
|
+
_tag: 'Flight',
|
|
127
|
+
completed: Deferred["await"](completed),
|
|
128
|
+
payload,
|
|
129
|
+
release,
|
|
130
|
+
resolvedUrl
|
|
131
|
+
};
|
|
132
|
+
}).pipe(Effect.onError(()=>release));
|
|
133
|
+
});
|
|
134
|
+
return {
|
|
135
|
+
load,
|
|
136
|
+
loadInitial
|
|
137
|
+
};
|
|
138
|
+
})
|
|
139
|
+
}) {
|
|
140
|
+
static layer = Layer.effect(this, this.make);
|
|
141
|
+
static layerTest = Layer.mock(this);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
export { FlightClient, FlightLoadError };
|
|
145
|
+
|
|
146
|
+
//# sourceMappingURL=flight-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client/flight-client.js","sources":["../../src/client/flight-client.ts"],"sourcesContent":["// oxlint-disable effecttsgo/process-env-in-effect -- Rspack replaces NODE_ENV at compile time.\nimport { Context, Deferred, Effect, Exit, Layer, Schema, Scope, Stream } from 'effect';\nimport { HttpBody, HttpClient, HttpClientRequest } from 'effect/unstable/http';\nimport {\n createFromReadableStream,\n type TemporaryReferenceSet,\n} from 'react-server-dom-rspack/client.browser';\n\nimport { FlightMediaType, ServerFnIdHeader, type FlightPayload } from '../rsc/flight';\nimport { InitialFlightStream } from './initial-flight-stream';\n\nexport class FlightLoadError extends Schema.TaggedError<FlightLoadError>()('FlightLoadError', {\n cause: Schema.Defect(),\n reason: Schema.Literals(['RequestFailed', 'UnexpectedResponse', 'DecodeFailed']),\n}) {}\n\nexport type FlightRequest =\n | {\n readonly _tag: 'Navigation';\n readonly destination: URL;\n }\n | {\n readonly _tag: 'ServerFunction';\n readonly body: BodyInit;\n readonly destination: URL;\n readonly id: string;\n readonly temporaryReferences: TemporaryReferenceSet;\n };\n\ntype DecodedFlight = {\n readonly completed: Effect.Effect<void, FlightLoadError>;\n readonly payload: FlightPayload;\n};\n\ntype FlightResource = DecodedFlight & {\n readonly _tag: 'Flight';\n readonly release: Effect.Effect<void>;\n readonly resolvedUrl: URL;\n};\n\ntype DocumentResource = {\n readonly _tag: 'Document';\n readonly release: Effect.Effect<void>;\n};\n\nexport class FlightClient extends Context.Service<FlightClient>()('ersc/client/FlightClient', {\n make: Effect.gen(function* () {\n const httpClient = yield* HttpClient.HttpClient;\n const initialFlight = yield* InitialFlightStream;\n\n const loadInitial = Effect.gen(function* () {\n const completed = Promise.withResolvers<void>();\n const stream = initialFlight.stream.pipeThrough(\n new TransformStream({\n flush: () => completed.resolve(),\n transform: (chunk, controller) => controller.enqueue(chunk),\n }),\n );\n const payload = yield* Effect.tryPromise({\n try: () =>\n createFromReadableStream<FlightPayload>(\n stream,\n process.env.NODE_ENV === 'development' ? { startTime: 0 } : undefined,\n ),\n catch: (cause) => new FlightLoadError({ cause, reason: 'DecodeFailed' }),\n });\n\n return {\n completed: Effect.promise(() => completed.promise),\n payload,\n } satisfies DecodedFlight;\n });\n\n const load = Effect.fnUntraced(function* (flightRequest: FlightRequest) {\n const parentScope = yield* Effect.scope;\n const responseScope = yield* Scope.fork(parentScope);\n const release = Scope.close(responseScope, Exit.void);\n\n return yield* Effect.gen(function* () {\n const client = httpClient.pipe(HttpClient.withScope);\n const request =\n flightRequest._tag === 'Navigation'\n ? HttpClientRequest.get(flightRequest.destination).pipe(\n HttpClientRequest.setHeader('accept', FlightMediaType),\n )\n : HttpClientRequest.post(flightRequest.destination).pipe(\n HttpClientRequest.setHeaders({\n accept: FlightMediaType,\n [ServerFnIdHeader]: flightRequest.id,\n }),\n HttpClientRequest.setBody(HttpBody.raw(flightRequest.body)),\n );\n const requestStartTime = process.env.NODE_ENV === 'development' ? performance.now() : 0;\n const response = yield* client.execute(request).pipe(\n Scope.provide(responseScope),\n Effect.mapError(\n (cause) =>\n new FlightLoadError({\n cause,\n reason: 'RequestFailed',\n }),\n ),\n );\n if (response.status < 200 || response.status >= 300) {\n if (flightRequest._tag === 'Navigation') {\n return { _tag: 'Document', release } satisfies DocumentResource;\n }\n return yield* new FlightLoadError({\n cause: new Error(`Flight request failed with status ${response.status}.`),\n reason: 'RequestFailed',\n });\n }\n const contentType = response.headers['content-type']\n ?.split(';', 1)[0]\n ?.trim()\n .toLowerCase();\n if (contentType !== FlightMediaType) {\n if (flightRequest._tag === 'Navigation') {\n return { _tag: 'Document', release } satisfies DocumentResource;\n }\n return yield* new FlightLoadError({\n cause: new Error(\n `Expected a ${FlightMediaType} response, received ${response.headers['content-type'] ?? 'no content type'}.`,\n ),\n reason: 'UnexpectedResponse',\n });\n }\n\n const contentLocation = response.headers['content-location'];\n if (contentLocation === undefined) {\n return yield* new FlightLoadError({\n cause: new Error('Expected the Flight response to include a Content-Location header.'),\n reason: 'UnexpectedResponse',\n });\n }\n const resolvedUrl = yield* Effect.try({\n try: () => new URL(contentLocation, flightRequest.destination),\n catch: (cause) =>\n new FlightLoadError({\n cause,\n reason: 'UnexpectedResponse',\n }),\n });\n\n const completed = yield* Deferred.make<void, FlightLoadError>();\n const responseBody = yield* Stream.toReadableStreamEffect(\n response.stream.pipe(\n Stream.onExit((exit) =>\n Deferred.done(\n completed,\n exit.pipe(\n Exit.mapError(\n (cause) =>\n new FlightLoadError({\n cause,\n reason: 'RequestFailed',\n }),\n ),\n Exit.asVoid,\n ),\n ),\n ),\n Stream.ensuring(release),\n ),\n );\n const decodeOptions =\n flightRequest._tag === 'ServerFunction'\n ? process.env.NODE_ENV === 'development'\n ? {\n startTime: requestStartTime,\n temporaryReferences: flightRequest.temporaryReferences,\n }\n : { temporaryReferences: flightRequest.temporaryReferences }\n : process.env.NODE_ENV === 'development'\n ? {\n startTime: requestStartTime,\n }\n : undefined;\n const payload = yield* Effect.tryPromise({\n try: () => createFromReadableStream<FlightPayload>(responseBody, decodeOptions),\n catch: (cause) =>\n new FlightLoadError({\n cause,\n reason: 'DecodeFailed',\n }),\n });\n\n return {\n _tag: 'Flight',\n completed: Deferred.await(completed),\n payload,\n release,\n resolvedUrl,\n } satisfies FlightResource;\n }).pipe(Effect.onError(() => release));\n });\n\n return { load, loadInitial };\n }),\n}) {\n static readonly layer = Layer.effect(this, this.make);\n\n static readonly layerTest = Layer.mock(this);\n}\n"],"names":["Context","Deferred","Effect","Exit","Layer","Schema","Scope","Stream","HttpBody","HttpClient","HttpClientRequest","createFromReadableStream","FlightMediaType","ServerFnIdHeader","InitialFlightStream","FlightLoadError","FlightClient","httpClient","initialFlight","loadInitial","completed","Promise","stream","TransformStream","chunk","controller","payload","process","undefined","cause","load","flightRequest","parentScope","responseScope","release","client","request","requestStartTime","performance","response","Error","contentType","contentLocation","resolvedUrl","URL","responseBody","exit","decodeOptions"],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { Context, Effect, Layer } from 'effect';
|
|
2
|
+
export type EmbeddedFlightChunk = string | Uint8Array;
|
|
3
|
+
type EmbeddedFlightQueue = Array<EmbeddedFlightChunk>;
|
|
4
|
+
export declare const makeInitialFlightStream: (queue: EmbeddedFlightQueue, closeWhenReady: (close: () => void) => void) => ReadableStream<Uint8Array<ArrayBufferLike>>;
|
|
5
|
+
declare const InitialFlightStream_base: Context.ServiceClass<InitialFlightStream, "ersc/client/initial-flight-stream/InitialFlightStream", {
|
|
6
|
+
stream: ReadableStream<Uint8Array<ArrayBufferLike>>;
|
|
7
|
+
}> & {
|
|
8
|
+
readonly make: Effect.Effect<{
|
|
9
|
+
stream: ReadableStream<Uint8Array<ArrayBufferLike>>;
|
|
10
|
+
}, never, never>;
|
|
11
|
+
};
|
|
12
|
+
export declare class InitialFlightStream extends InitialFlightStream_base {
|
|
13
|
+
static readonly layer: Layer.Layer<InitialFlightStream, never, never>;
|
|
14
|
+
static readonly layerTest: (implementation: {
|
|
15
|
+
stream: ReadableStream<Uint8Array<ArrayBufferLike>>;
|
|
16
|
+
}) => Layer.Layer<InitialFlightStream, never, never>;
|
|
17
|
+
}
|
|
18
|
+
export {};
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { Context, Effect, Layer } from "effect";
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
// Adapted from rsc-html-stream by Devon Govett.
|
|
5
|
+
// Copyright (c) 2024-present Devon Govett. Licensed under the MIT License; see vendor/rsc-html-stream/LICENSE.
|
|
6
|
+
|
|
7
|
+
const Encoder = new TextEncoder();
|
|
8
|
+
const makeInitialFlightStream = (queue, closeWhenReady)=>{
|
|
9
|
+
let streamController;
|
|
10
|
+
const stream = new ReadableStream({
|
|
11
|
+
start (controller) {
|
|
12
|
+
const enqueue = (chunk)=>{
|
|
13
|
+
controller.enqueue(typeof chunk === 'string' ? Encoder.encode(chunk) : chunk);
|
|
14
|
+
};
|
|
15
|
+
for (const chunk of queue){
|
|
16
|
+
enqueue(chunk);
|
|
17
|
+
}
|
|
18
|
+
queue.length = 0;
|
|
19
|
+
queue.push = (...chunks)=>{
|
|
20
|
+
for (const chunk of chunks){
|
|
21
|
+
enqueue(chunk);
|
|
22
|
+
}
|
|
23
|
+
return 0;
|
|
24
|
+
};
|
|
25
|
+
streamController = controller;
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
closeWhenReady(()=>streamController?.close());
|
|
29
|
+
return stream;
|
|
30
|
+
};
|
|
31
|
+
const makeBrowserInitialFlightStream = ()=>{
|
|
32
|
+
const flightWindow = window;
|
|
33
|
+
const queue = flightWindow.__FLIGHT_DATA ??= [];
|
|
34
|
+
return makeInitialFlightStream(queue, (close)=>{
|
|
35
|
+
if (document.readyState === 'loading') {
|
|
36
|
+
document.addEventListener('DOMContentLoaded', close, {
|
|
37
|
+
once: true
|
|
38
|
+
});
|
|
39
|
+
} else {
|
|
40
|
+
close();
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
};
|
|
44
|
+
const makeServerInitialFlightStream = ()=>new ReadableStream({
|
|
45
|
+
start (controller) {
|
|
46
|
+
controller.close();
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
class InitialFlightStream extends Context.Service()('ersc/client/initial-flight-stream/InitialFlightStream', {
|
|
50
|
+
make: Effect.sync(()=>({
|
|
51
|
+
stream: typeof window === 'undefined' ? makeServerInitialFlightStream() : makeBrowserInitialFlightStream()
|
|
52
|
+
}))
|
|
53
|
+
}) {
|
|
54
|
+
static layer = Layer.effect(this, this.make);
|
|
55
|
+
static layerTest = Layer.mock(this);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export { InitialFlightStream, makeInitialFlightStream };
|
|
59
|
+
|
|
60
|
+
//# sourceMappingURL=initial-flight-stream.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client/initial-flight-stream.js","sources":["../../src/client/initial-flight-stream.ts"],"sourcesContent":["// Adapted from rsc-html-stream by Devon Govett.\n// Copyright (c) 2024-present Devon Govett. Licensed under the MIT License; see vendor/rsc-html-stream/LICENSE.\nimport { Context, Effect, Layer } from 'effect';\n\nconst Encoder = new TextEncoder();\n\nexport type EmbeddedFlightChunk = string | Uint8Array;\ntype EmbeddedFlightQueue = Array<EmbeddedFlightChunk>;\ntype FlightWindow = Window & { __FLIGHT_DATA?: EmbeddedFlightQueue };\n\nexport const makeInitialFlightStream = (\n queue: EmbeddedFlightQueue,\n closeWhenReady: (close: () => void) => void,\n) => {\n let streamController: ReadableStreamDefaultController<Uint8Array> | undefined;\n const stream = new ReadableStream<Uint8Array>({\n start(controller) {\n const enqueue = (chunk: EmbeddedFlightChunk) => {\n controller.enqueue(typeof chunk === 'string' ? Encoder.encode(chunk) : chunk);\n };\n for (const chunk of queue) {\n enqueue(chunk);\n }\n queue.length = 0;\n queue.push = (...chunks) => {\n for (const chunk of chunks) {\n enqueue(chunk);\n }\n return 0;\n };\n streamController = controller;\n },\n });\n closeWhenReady(() => streamController?.close());\n return stream;\n};\n\nconst makeBrowserInitialFlightStream = () => {\n const flightWindow = window as FlightWindow;\n const queue = (flightWindow.__FLIGHT_DATA ??= []);\n return makeInitialFlightStream(queue, (close) => {\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', close, { once: true });\n } else {\n close();\n }\n });\n};\n\nconst makeServerInitialFlightStream = () =>\n new ReadableStream<Uint8Array>({\n start(controller) {\n controller.close();\n },\n });\n\nexport class InitialFlightStream extends Context.Service<InitialFlightStream>()(\n 'ersc/client/initial-flight-stream/InitialFlightStream',\n {\n make: Effect.sync(() => ({\n stream:\n typeof window === 'undefined'\n ? makeServerInitialFlightStream()\n : makeBrowserInitialFlightStream(),\n })),\n },\n) {\n static readonly layer = Layer.effect(this, this.make);\n\n static readonly layerTest = Layer.mock(this);\n}\n"],"names":["Context","Effect","Layer","Encoder","TextEncoder","makeInitialFlightStream","queue","closeWhenReady","streamController","stream","ReadableStream","controller","enqueue","chunk","chunks","makeBrowserInitialFlightStream","flightWindow","window","close","document","makeServerInitialFlightStream","InitialFlightStream"],"mappings":";;;AAAA,gDAAgD;AAChD,+GAA+G;AAC/D;AAEhD,MAAMG,OAAOA,GAAG,IAAIC;AAMb,MAAMC,uBAAuBA,GAAG,CACrCC,OACAC;IAEA,IAAIC;IACJ,MAAMC,SAAS,IAAIC,eAA2B;QAC5C,OAAMC,UAAU;YACd,MAAMC,UAAU,CAACC;gBACfF,WAAW,OAAO,CAAC,OAAOE,UAAU,WAAWV,OAAOA,CAAC,MAAM,CAACU,SAASA;YACzE;YACA,KAAK,MAAMA,SAASP,MAAO;gBACzBM,QAAQC;YACV;YACAP,MAAM,MAAM,GAAG;YACfA,MAAM,IAAI,GAAG,CAAC,GAAGQ;gBACf,KAAK,MAAMD,SAASC,OAAQ;oBAC1BF,QAAQC;gBACV;gBACA,OAAO;YACT;YACAL,mBAAmBG;QACrB;IACF;IACAJ,eAAe,IAAMC,kBAAkB;IACvC,OAAOC;AACT,EAAE;AAEF,MAAMM,8BAA8BA,GAAG;IACrC,MAAMC,eAAeC;IACrB,MAAMX,QAASU,aAAa,aAAa,KAAK,EAAE;IAChD,OAAOX,uBAAuBA,CAACC,OAAO,CAACY;QACrC,IAAIC,SAAS,UAAU,KAAK,WAAW;YACrCA,SAAS,gBAAgB,CAAC,oBAAoBD,OAAO;gBAAE,MAAM;YAAK;QACpE,OAAO;YACLA;QACF;IACF;AACF;AAEA,MAAME,6BAA6BA,GAAG,IACpC,IAAIV,eAA2B;QAC7B,OAAMC,UAAU;YACdA,WAAW,KAAK;QAClB;IACF;AAEK,MAAMU,mBAAmBA,SAASrB,eAAe,GACtD,yDACA;IACE,MAAMC,WAAW,CAAC,IAAO;YACvB,QACE,OAAOgB,WAAW,cACdG,6BAA6BA,KAC7BL,8BAA8BA;QACtC;AACF;IAEA,OAAgB,QAAQb,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE;IAEtD,OAAgB,YAAYA,UAAU,CAAC,IAAI,EAAE;AAC/C"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { Context, Effect, Layer } from 'effect';
|
|
2
|
+
type NavigateListener = (event: NavigateEvent) => void;
|
|
3
|
+
declare const NavigationApi_base: Context.ServiceClass<NavigationApi, "ersc/client/NavigationApi", {
|
|
4
|
+
getCurrentEntry: () => NavigationHistoryEntry | null;
|
|
5
|
+
getCurrentUrl: () => string;
|
|
6
|
+
getTransition: () => NavigationTransition | null;
|
|
7
|
+
navigate: (url: string | URL, options?: NavigationNavigateOptions) => NavigationResult;
|
|
8
|
+
reloadDocument: () => void;
|
|
9
|
+
replaceDocument: (url: string) => void;
|
|
10
|
+
subscribe: (listener: NavigateListener) => () => void;
|
|
11
|
+
}> & {
|
|
12
|
+
readonly make: Effect.Effect<{
|
|
13
|
+
getCurrentEntry: () => NavigationHistoryEntry | null;
|
|
14
|
+
getCurrentUrl: () => string;
|
|
15
|
+
getTransition: () => NavigationTransition | null;
|
|
16
|
+
navigate: (url: string | URL, options?: NavigationNavigateOptions) => NavigationResult;
|
|
17
|
+
reloadDocument: () => void;
|
|
18
|
+
replaceDocument: (url: string) => void;
|
|
19
|
+
subscribe: (listener: NavigateListener) => () => void;
|
|
20
|
+
}, never, never>;
|
|
21
|
+
};
|
|
22
|
+
export declare class NavigationApi extends NavigationApi_base {
|
|
23
|
+
static readonly layer: Layer.Layer<NavigationApi, never, never>;
|
|
24
|
+
static readonly layerTest: (implementation: {
|
|
25
|
+
getCurrentEntry: () => NavigationHistoryEntry | null;
|
|
26
|
+
getCurrentUrl: () => string;
|
|
27
|
+
getTransition: () => NavigationTransition | null;
|
|
28
|
+
navigate: (url: string | URL, options?: NavigationNavigateOptions) => NavigationResult;
|
|
29
|
+
reloadDocument: () => void;
|
|
30
|
+
replaceDocument: (url: string) => void;
|
|
31
|
+
subscribe: (listener: NavigateListener) => () => void;
|
|
32
|
+
}) => Layer.Layer<NavigationApi, never, never>;
|
|
33
|
+
}
|
|
34
|
+
export {};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { Context, Effect, Layer } from "effect";
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
class NavigationApi extends Context.Service()('ersc/client/NavigationApi', {
|
|
6
|
+
make: Effect.succeed({
|
|
7
|
+
getCurrentEntry: ()=>window.navigation.currentEntry,
|
|
8
|
+
getCurrentUrl: ()=>window.location.href,
|
|
9
|
+
getTransition: ()=>window.navigation.transition,
|
|
10
|
+
navigate: (url, options)=>window.navigation.navigate(url, options),
|
|
11
|
+
reloadDocument: ()=>window.location.reload(),
|
|
12
|
+
replaceDocument: (url)=>window.location.replace(url),
|
|
13
|
+
subscribe: (listener)=>{
|
|
14
|
+
window.navigation.addEventListener('navigate', listener);
|
|
15
|
+
return ()=>window.navigation.removeEventListener('navigate', listener);
|
|
16
|
+
}
|
|
17
|
+
})
|
|
18
|
+
}) {
|
|
19
|
+
static layer = Layer.effect(this, this.make);
|
|
20
|
+
static layerTest = Layer.mock(this);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export { NavigationApi };
|
|
24
|
+
|
|
25
|
+
//# sourceMappingURL=navigation-api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client/navigation-api.js","sources":["../../src/client/navigation-api.ts"],"sourcesContent":["import { Context, Effect, Layer } from 'effect';\n\ntype NavigateListener = (event: NavigateEvent) => void;\n\nexport class NavigationApi extends Context.Service<NavigationApi>()('ersc/client/NavigationApi', {\n make: Effect.succeed({\n getCurrentEntry: () => window.navigation.currentEntry,\n getCurrentUrl: () => window.location.href,\n getTransition: () => window.navigation.transition,\n navigate: (url: string | URL, options?: NavigationNavigateOptions) =>\n window.navigation.navigate(url, options),\n reloadDocument: () => window.location.reload(),\n replaceDocument: (url: string) => window.location.replace(url),\n subscribe: (listener: NavigateListener) => {\n window.navigation.addEventListener('navigate', listener);\n return () => window.navigation.removeEventListener('navigate', listener);\n },\n }),\n}) {\n static readonly layer = Layer.effect(this, this.make);\n\n static readonly layerTest = Layer.mock(this);\n}\n"],"names":["Context","Effect","Layer","NavigationApi","window","url","options","listener"],"mappings":";;;AAAgD;AAIzC,MAAMG,aAAaA,SAASH,eAAe,GAAkB,6BAA6B;IAC/F,MAAMC,cAAc,CAAC;QACnB,iBAAiB,IAAMG,OAAO,UAAU,CAAC,YAAY;QACrD,eAAe,IAAMA,OAAO,QAAQ,CAAC,IAAI;QACzC,eAAe,IAAMA,OAAO,UAAU,CAAC,UAAU;QACjD,UAAU,CAACC,KAAmBC,UAC5BF,OAAO,UAAU,CAAC,QAAQ,CAACC,KAAKC;QAClC,gBAAgB,IAAMF,OAAO,QAAQ,CAAC,MAAM;QAC5C,iBAAiB,CAACC,MAAgBD,OAAO,QAAQ,CAAC,OAAO,CAACC;QAC1D,WAAW,CAACE;YACVH,OAAO,UAAU,CAAC,gBAAgB,CAAC,YAAYG;YAC/C,OAAO,IAAMH,OAAO,UAAU,CAAC,mBAAmB,CAAC,YAAYG;QACjE;IACF;AACF;IACE,OAAgB,QAAQL,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE;IAEtD,OAAgB,YAAYA,UAAU,CAAC,IAAI,EAAE;AAC/C"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
const ReactTransitionNavigationInfo = 'react-transition';
|
|
2
|
+
const NativeDocumentNavigationInfo = 'ersc-native-document';
|
|
3
|
+
const isRoutedNavigation = (event)=>event.canIntercept && !event.hashChange && event.downloadRequest === null && event.formData === null && event.info !== ReactTransitionNavigationInfo && event.info !== NativeDocumentNavigationInfo && event.navigationType !== 'reload';
|
|
4
|
+
const preserveRequestedHash = (requested, resolved)=>resolved.hash === '' && resolved.origin === requested.origin && resolved.pathname === requested.pathname && resolved.search === requested.search ? new URL(`${resolved.href}${requested.hash}`) : resolved;
|
|
5
|
+
|
|
6
|
+
export { NativeDocumentNavigationInfo, isRoutedNavigation, preserveRequestedHash };
|
|
7
|
+
|
|
8
|
+
//# sourceMappingURL=navigation-routing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client/navigation-routing.js","sources":["../../src/client/navigation-routing.ts"],"sourcesContent":["const ReactTransitionNavigationInfo = 'react-transition';\n\nexport const NativeDocumentNavigationInfo = 'ersc-native-document';\n\nexport const isRoutedNavigation = (event: NavigateEvent) =>\n event.canIntercept &&\n !event.hashChange &&\n event.downloadRequest === null &&\n event.formData === null &&\n event.info !== ReactTransitionNavigationInfo &&\n event.info !== NativeDocumentNavigationInfo &&\n event.navigationType !== 'reload';\n\nexport const preserveRequestedHash = (requested: URL, resolved: URL) =>\n resolved.hash === '' &&\n resolved.origin === requested.origin &&\n resolved.pathname === requested.pathname &&\n resolved.search === requested.search\n ? new URL(`${resolved.href}${requested.hash}`)\n : resolved;\n"],"names":["ReactTransitionNavigationInfo","NativeDocumentNavigationInfo","isRoutedNavigation","event","preserveRequestedHash","requested","resolved","URL"],"mappings":"AAAA,MAAMA,6BAA6BA,GAAG;AAE/B,MAAMC,4BAA4BA,GAAG,uBAAuB;AAE5D,MAAMC,kBAAkBA,GAAG,CAACC,QACjCA,MAAM,YAAY,IAClB,CAACA,MAAM,UAAU,IACjBA,MAAM,eAAe,KAAK,QAC1BA,MAAM,QAAQ,KAAK,QACnBA,MAAM,IAAI,KAAKH,6BAA6BA,IAC5CG,MAAM,IAAI,KAAKF,4BAA4BA,IAC3CE,MAAM,cAAc,KAAK,SAAS;AAE7B,MAAMC,qBAAqBA,GAAG,CAACC,WAAgBC,WACpDA,SAAS,IAAI,KAAK,MAClBA,SAAS,MAAM,KAAKD,UAAU,MAAM,IACpCC,SAAS,QAAQ,KAAKD,UAAU,QAAQ,IACxCC,SAAS,MAAM,KAAKD,UAAU,MAAM,GAChC,IAAIE,IAAI,GAAGD,SAAS,IAAI,GAAGD,UAAU,IAAI,EAAE,IAC3CC,SAAS"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Context, Effect, Layer, Schema } from 'effect';
|
|
2
|
+
import type { FlightPayload } from '../rsc/flight.js';
|
|
3
|
+
import { BrowserEffectRunner } from './browser-effect-runner.js';
|
|
4
|
+
import { BrowserRenderer } from './browser-renderer.js';
|
|
5
|
+
declare const ReactDOMHydrationError_base: Schema.Class<ReactDOMHydrationError, Schema.TaggedStruct<"ReactDOMHydrationError", {
|
|
6
|
+
readonly cause: Schema.Defect;
|
|
7
|
+
}>, import("effect/Cause").YieldableError>;
|
|
8
|
+
export declare class ReactDOMHydrationError extends ReactDOMHydrationError_base {
|
|
9
|
+
}
|
|
10
|
+
declare const ReactDOMRenderer_base: Context.ServiceClass<ReactDOMRenderer, "ersc/client/ReactDOMRenderer", {
|
|
11
|
+
hydrate: (container: Document | Element, initialPayload: FlightPayload) => Effect.Effect<void, ReactDOMHydrationError, import("effect/Scope").Scope>;
|
|
12
|
+
}> & {
|
|
13
|
+
readonly make: Effect.Effect<{
|
|
14
|
+
hydrate: (container: Document | Element, initialPayload: FlightPayload) => Effect.Effect<void, ReactDOMHydrationError, import("effect/Scope").Scope>;
|
|
15
|
+
}, never, BrowserEffectRunner | BrowserRenderer>;
|
|
16
|
+
};
|
|
17
|
+
export declare class ReactDOMRenderer extends ReactDOMRenderer_base {
|
|
18
|
+
static readonly layer: Layer.Layer<ReactDOMRenderer, never, BrowserEffectRunner | BrowserRenderer>;
|
|
19
|
+
}
|
|
20
|
+
export {};
|