1- /** @import { RemoteFunctionResponse } from 'types' */
21import { app_dir , base } from '$app/paths/internal/client' ;
32import { version } from '__sveltekit/environment' ;
43import * as devalue from 'devalue' ;
@@ -7,12 +6,12 @@ import { app, remote_responses } from '../client.js';
76import { create_remote_function , remote_request } from './shared.svelte.js' ;
87
98// Initialize Cache API for prerender functions
10- const CACHE_NAME = `sveltekit:${ version } ` ;
9+ const CACHE_NAME = DEV ? `sveltekit: ${ Date . now ( ) } ` : `sveltekit:${ version } ` ;
1110/** @type {Cache | undefined } */
1211let prerender_cache ;
1312
14- void ( async ( ) => {
15- if ( ! DEV && typeof caches !== 'undefined' ) {
13+ const prerender_cache_ready = ( async ( ) => {
14+ if ( typeof caches !== 'undefined' ) {
1615 try {
1716 prerender_cache = await caches . open ( CACHE_NAME ) ;
1817
@@ -111,53 +110,68 @@ class Prerender {
111110 }
112111}
113112
113+ /**
114+ * @param {string } url
115+ * @param {string } encoded
116+ */
117+ function put ( url , encoded ) {
118+ return /** @type {Cache } */ ( prerender_cache )
119+ . put (
120+ url ,
121+ // We need to create a new response because the original response is already consumed
122+ new Response ( encoded , {
123+ headers : {
124+ 'Content-Type' : 'application/json'
125+ }
126+ } )
127+ )
128+ . catch ( ( ) => {
129+ // Nothing we can do here
130+ } ) ;
131+ }
132+
114133/**
115134 * @param {string } id
116135 */
117136export function prerender ( id ) {
118137 return create_remote_function ( id , ( cache_key , payload ) => {
119138 return new Prerender ( async ( ) => {
120- if ( Object . hasOwn ( remote_responses , cache_key ) ) {
121- return remote_responses [ cache_key ] ;
122- }
139+ await prerender_cache_ready ;
123140
124141 const url = `${ base } /${ app_dir } /remote/${ id } ${ payload ? `/${ payload } ` : '' } ` ;
125142
143+ if ( Object . hasOwn ( remote_responses , cache_key ) ) {
144+ const data = remote_responses [ cache_key ] ;
145+
146+ if ( prerender_cache ) {
147+ void put ( url , devalue . stringify ( data , app . encoders ) ) ;
148+ }
149+
150+ return data ;
151+ }
152+
126153 // Check the Cache API first
127154 if ( prerender_cache ) {
128155 try {
129156 const cached_response = await prerender_cache . match ( url ) ;
157+
130158 if ( cached_response ) {
131- const cached_result = /** @type { RemoteFunctionResponse & { type: 'result' } } */ (
132- await cached_response . json ( )
133- ) ;
134- return devalue . parse ( cached_result . result , app . decoders ) ;
159+ const cached_result = await cached_response . text ( ) ;
160+ return devalue . parse ( cached_result , app . decoders ) ;
135161 }
136162 } catch {
137163 // Nothing we can do here
138164 }
139165 }
140166
141- const result = await remote_request ( url ) ;
167+ const encoded = await remote_request ( url ) ;
142168
143169 // For successful prerender requests, save to cache
144170 if ( prerender_cache ) {
145- try {
146- await prerender_cache . put (
147- url ,
148- // We need to create a new response because the original response is already consumed
149- new Response ( JSON . stringify ( result ) , {
150- headers : {
151- 'Content-Type' : 'application/json'
152- }
153- } )
154- ) ;
155- } catch {
156- // Nothing we can do here
157- }
171+ void put ( url , encoded ) ;
158172 }
159173
160- return result ;
174+ return devalue . parse ( encoded , app . decoders ) ;
161175 } ) ;
162176 } ) ;
163177}
0 commit comments