From ef16a6405178d4ad16470de19867cb948d135fd6 Mon Sep 17 00:00:00 2001 From: Hiroshi Ogawa Date: Sat, 8 Jun 2024 18:40:08 +0900 Subject: [PATCH 1/2] refactor: encode flight params in url --- .../src/features/server-component/utils.tsx | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/packages/react-server/src/features/server-component/utils.tsx b/packages/react-server/src/features/server-component/utils.tsx index e72d53542..0287265ab 100644 --- a/packages/react-server/src/features/server-component/utils.tsx +++ b/packages/react-server/src/features/server-component/utils.tsx @@ -1,6 +1,6 @@ // encode flight request as path for the ease of ssg deployment export const RSC_PATH = "__f.data"; -const RSC_PARAM = "x-flight-meta"; +const RSC_PARAM = "__f"; type StreamRequestParam = { actionId?: string; @@ -12,11 +12,8 @@ type StreamRequestParam = { export function createStreamRequest(href: string, param: StreamRequestParam) { const url = new URL(href, window.location.href); url.pathname = posixJoin(url.pathname, RSC_PATH); - return new Request(url, { - headers: { - [RSC_PARAM]: JSON.stringify(param), - }, - }); + url.searchParams.set(RSC_PARAM, JSON.stringify(param)); + return new Request(url); } export function unwrapStreamRequest(request: Request) { @@ -26,15 +23,14 @@ export function unwrapStreamRequest(request: Request) { return { url, request, isStream }; } url.pathname = url.pathname.slice(0, -RSC_PATH.length) || "/"; - const headers = new Headers(request.headers); - const rawParam = headers.get(RSC_PARAM); - headers.delete(RSC_PARAM); + const rawParam = url.searchParams.get(RSC_PARAM); + url.searchParams.delete(RSC_PARAM); return { url, request: new Request(url, { method: request.method, - headers, + headers: request.headers, body: request.body, // @ts-ignore undici ...("duplex" in request ? { duplex: "half" } : {}), From f45d22b35852a3adb29116868af6242aa660c46a Mon Sep 17 00:00:00 2001 From: Hiroshi Ogawa Date: Sat, 8 Jun 2024 18:51:12 +0900 Subject: [PATCH 2/2] fix: set flight params for preload --- packages/react-server/src/entry/browser.tsx | 2 +- packages/react-server/src/features/router/client.tsx | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/packages/react-server/src/entry/browser.tsx b/packages/react-server/src/entry/browser.tsx index b7aa9767b..2d53b95eb 100644 --- a/packages/react-server/src/entry/browser.tsx +++ b/packages/react-server/src/entry/browser.tsx @@ -129,7 +129,7 @@ export async function start() { }); const request = createStreamRequest(location.href, { lastPathname, - revalidate: ROUTER_REVALIDATE_KEY in location.state, + revalidate: ROUTER_REVALIDATE_KEY in location.state ? true : undefined, }); startTransition(() => { $__setLayout( diff --git a/packages/react-server/src/features/router/client.tsx b/packages/react-server/src/features/router/client.tsx index 03bcadac9..9e995ec57 100644 --- a/packages/react-server/src/features/router/client.tsx +++ b/packages/react-server/src/features/router/client.tsx @@ -78,6 +78,7 @@ export function usePreloadHandlers({ preload, }: { href: string; preload?: boolean | "data" }) { const routeManifest = React.useContext(RouteManifestContext); + const currentPathname = useRouter((s) => s.location.pathname); const callback = React.useCallback(() => { if (!preload) return; @@ -85,8 +86,10 @@ export function usePreloadHandlers({ const deps = getRouteAssetDeps(routeManifest, url.pathname); preloadAssetDeps(deps); - if (preload === "data") { - const { url } = createStreamRequest(href, {}); + if (preload === "data" && url.pathname !== currentPathname) { + const { url } = createStreamRequest(href, { + lastPathname: currentPathname, + }); ReactDom.preload(url.slice(window.location.origin.length), { as: "fetch", crossOrigin: "",