-/** @import { RemoteFunctionResponse } from 'types' */
import { app_dir, base } from '$app/paths/internal/client';
import { version } from '__sveltekit/environment';
import * as devalue from 'devalue';
import { create_remote_function, remote_request } from './shared.svelte.js';
// Initialize Cache API for prerender functions
-const CACHE_NAME = `sveltekit:${version}`;
+const CACHE_NAME = DEV ? `sveltekit:${Date.now()}` : `sveltekit:${version}`;
/** @type {Cache | undefined} */
let prerender_cache;
-void (async () => {
- if (!DEV && typeof caches !== 'undefined') {
+const prerender_cache_ready = (async () => {
+ if (typeof caches !== 'undefined') {
try {
prerender_cache = await caches.open(CACHE_NAME);
}
}
+/**
+ * @param {string} url
+ * @param {string} encoded
+ */
+function put(url, encoded) {
+ return /** @type {Cache} */ (prerender_cache)
+ .put(
+ url,
+ // We need to create a new response because the original response is already consumed
+ new Response(encoded, {
+ headers: {
+ 'Content-Type': 'application/json'
+ }
+ })
+ )
+ .catch(() => {
+ // Nothing we can do here
+ });
+}
+
/**
* @param {string} id
*/
export function prerender(id) {
return create_remote_function(id, (cache_key, payload) => {
return new Prerender(async () => {
- if (Object.hasOwn(remote_responses, cache_key)) {
- return remote_responses[cache_key];
- }
+ await prerender_cache_ready;
const url = `${base}/${app_dir}/remote/${id}${payload ? `/${payload}` : ''}`;
+ if (Object.hasOwn(remote_responses, cache_key)) {
+ const data = remote_responses[cache_key];
+
+ if (prerender_cache) {
+ void put(url, devalue.stringify(data, app.encoders));
+ }
+
+ return data;
+ }
+
// Check the Cache API first
if (prerender_cache) {
try {
const cached_response = await prerender_cache.match(url);
+
if (cached_response) {
- const cached_result = /** @type { RemoteFunctionResponse & { type: 'result' } } */ (
- await cached_response.json()
- );
- return devalue.parse(cached_result.result, app.decoders);
+ const cached_result = await cached_response.text();
+ return devalue.parse(cached_result, app.decoders);
}
} catch {
// Nothing we can do here
}
}
- const result = await remote_request(url);
+ const encoded = await remote_request(url);
// For successful prerender requests, save to cache
if (prerender_cache) {
- try {
- await prerender_cache.put(
- url,
- // We need to create a new response because the original response is already consumed
- new Response(JSON.stringify(result), {
- headers: {
- 'Content-Type': 'application/json'
- }
- })
- );
- } catch {
- // Nothing we can do here
- }
+ void put(url, encoded);
}
- return result;
+ return devalue.parse(encoded, app.decoders);
});
});
}