@@ -16,7 +16,6 @@ import type {
1616 RSCPayload ,
1717 RSCRouteManifest ,
1818 RSCRenderPayload ,
19- CreateFromReadableStreamFunction ,
2019} from "./server.rsc" ;
2120import type {
2221 DataStrategyFunction ,
@@ -41,7 +40,19 @@ import {
4140} from "../dom/ssr/routes" ;
4241import { RSCRouterGlobalErrorBoundary } from "./errorBoundaries" ;
4342
44- export type EncodeReplyFunction = ( args : unknown [ ] ) => Promise < BodyInit > ;
43+ export type BrowserCreateFromReadableStreamFunction = (
44+ body : ReadableStream < Uint8Array > ,
45+ {
46+ temporaryReferences,
47+ } : {
48+ temporaryReferences : unknown ;
49+ }
50+ ) => Promise < unknown > ;
51+
52+ export type EncodeReplyFunction = (
53+ args : unknown [ ] ,
54+ options : { temporaryReferences : unknown }
55+ ) => Promise < BodyInit > ;
4556
4657declare global {
4758 interface Window {
@@ -53,10 +64,12 @@ declare global {
5364
5465export function createCallServer ( {
5566 createFromReadableStream,
67+ createTemporaryReferenceSet,
5668 encodeReply,
5769 fetch : fetchImplementation = fetch ,
5870} : {
59- createFromReadableStream : CreateFromReadableStreamFunction ;
71+ createFromReadableStream : BrowserCreateFromReadableStreamFunction ;
72+ createTemporaryReferenceSet : ( ) => unknown ;
6073 encodeReply : EncodeReplyFunction ;
6174 fetch ?: ( request : Request ) => Promise < Response > ;
6275} ) {
@@ -65,9 +78,10 @@ export function createCallServer({
6578 let actionId = ( window . __routerActionID =
6679 ( window . __routerActionID ??= 0 ) + 1 ) ;
6780
81+ const temporaryReferences = createTemporaryReferenceSet ( ) ;
6882 const response = await fetchImplementation (
6983 new Request ( location . href , {
70- body : await encodeReply ( args ) ,
84+ body : await encodeReply ( args , { temporaryReferences } ) ,
7185 method : "POST" ,
7286 headers : {
7387 Accept : "text/x-component" ,
@@ -78,9 +92,9 @@ export function createCallServer({
7892 if ( ! response . body ) {
7993 throw new Error ( "No response body" ) ;
8094 }
81- const payload = ( await createFromReadableStream (
82- response . body
83- ) ) as RSCPayload ;
95+ const payload = ( await createFromReadableStream ( response . body , {
96+ temporaryReferences ,
97+ } ) ) as RSCPayload ;
8498
8599 if ( payload . type === "redirect" ) {
86100 if ( payload . reload ) {
@@ -159,7 +173,7 @@ function createRouterFromPayload({
159173 payload,
160174} : {
161175 payload : RSCPayload ;
162- createFromReadableStream : CreateFromReadableStreamFunction ;
176+ createFromReadableStream : BrowserCreateFromReadableStreamFunction ;
163177 fetchImplementation : ( request : Request ) => Promise < Response > ;
164178} ) {
165179 if ( window . __router ) return window . __router ;
@@ -261,7 +275,7 @@ export function getRSCSingleFetchDataStrategy(
261275 getRouter : ( ) => DataRouter ,
262276 ssr : boolean ,
263277 basename : string | undefined ,
264- createFromReadableStream : CreateFromReadableStreamFunction ,
278+ createFromReadableStream : BrowserCreateFromReadableStreamFunction ,
265279 fetchImplementation : ( request : Request ) => Promise < Response >
266280) : DataStrategyFunction {
267281 // TODO: Clean this up with a shared type
@@ -345,7 +359,7 @@ export function getRSCSingleFetchDataStrategy(
345359}
346360
347361function getFetchAndDecodeViaRSC (
348- createFromReadableStream : CreateFromReadableStreamFunction ,
362+ createFromReadableStream : BrowserCreateFromReadableStreamFunction ,
349363 fetchImplementation : ( request : Request ) => Promise < Response >
350364) : FetchAndDecodeFunction {
351365 return async (
@@ -375,7 +389,9 @@ function getFetchAndDecodeViaRSC(
375389 invariant ( res . body , "No response body to decode" ) ;
376390
377391 try {
378- const payload = ( await createFromReadableStream ( res . body ) ) as RSCPayload ;
392+ const payload = ( await createFromReadableStream ( res . body , {
393+ temporaryReferences : undefined ,
394+ } ) ) as RSCPayload ;
379395 if ( payload . type === "redirect" ) {
380396 return {
381397 status : res . status ,
@@ -434,7 +450,7 @@ export function RSCHydratedRouter({
434450 payload,
435451 routeDiscovery = "eager" ,
436452} : {
437- createFromReadableStream : CreateFromReadableStreamFunction ;
453+ createFromReadableStream : BrowserCreateFromReadableStreamFunction ;
438454 fetch ?: ( request : Request ) => Promise < Response > ;
439455 payload : RSCPayload ;
440456 routeDiscovery ?: "eager" | "lazy" ;
@@ -733,7 +749,7 @@ function getManifestUrl(paths: string[]): URL | null {
733749
734750async function fetchAndApplyManifestPatches (
735751 paths : string [ ] ,
736- createFromReadableStream : CreateFromReadableStreamFunction ,
752+ createFromReadableStream : BrowserCreateFromReadableStreamFunction ,
737753 fetchImplementation : ( request : Request ) => Promise < Response > ,
738754 signal ?: AbortSignal
739755) {
@@ -755,7 +771,9 @@ async function fetchAndApplyManifestPatches(
755771 throw new Error ( "Unable to fetch new route matches from the server" ) ;
756772 }
757773
758- let payload = ( await createFromReadableStream ( response . body ) ) as RSCPayload ;
774+ let payload = ( await createFromReadableStream ( response . body , {
775+ temporaryReferences : undefined ,
776+ } ) ) as RSCPayload ;
759777 if ( payload . type !== "manifest" ) {
760778 throw new Error ( "Failed to patch routes" ) ;
761779 }
0 commit comments