Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/large-chicken-obey.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@sveltejs/kit': patch
---

fix: keep serialized remote data alive until navigation
11 changes: 9 additions & 2 deletions packages/kit/src/runtime/client/client.js
Original file line number Diff line number Diff line change
Expand Up @@ -189,7 +189,10 @@ let target;
/** @type {import('./types.js').SvelteKitApp} */
export let app;

/** @type {Record<string, any>} */
/**
* Data that was serialized during SSR. This is cleared when the user first navigates
* @type {Record<string, any>}
*/
export let remote_responses = {};

/** @type {Array<((url: URL) => boolean)>} */
Expand Down Expand Up @@ -240,7 +243,7 @@ let current = {

/** this being true means we SSR'd */
let hydrated = false;
export let started = false;
let started = false;
let autoscroll = true;
let updating = false;
let is_navigating = false;
Expand Down Expand Up @@ -1488,6 +1491,8 @@ async function navigate({
block = noop,
event
}) {
remote_responses = {};

const prev_token = token;
token = nav_token;

Expand Down Expand Up @@ -2096,6 +2101,8 @@ export function refreshAll({ includeLoadFunctions = true } = {}) {
throw new Error('Cannot call refreshAll() on the server');
}

remote_responses = {};

force_invalidation = true;
return _invalidate(includeLoadFunctions, false);
}
Expand Down
11 changes: 2 additions & 9 deletions packages/kit/src/runtime/client/remote-functions/form.svelte.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,7 @@ import { app_dir, base } from '$app/paths/internal/client';
import * as devalue from 'devalue';
import { DEV } from 'esm-env';
import { HttpError } from '@sveltejs/kit/internal';
import {
app,
remote_responses,
started,
_goto,
set_nearest_error_page,
invalidateAll
} from '../client.js';
import { app, remote_responses, _goto, set_nearest_error_page, invalidateAll } from '../client.js';
import { tick } from 'svelte';
import { refresh_queries, release_overrides } from './shared.svelte.js';
import { createAttachmentKey } from 'svelte/attachments';
Expand Down Expand Up @@ -42,7 +35,7 @@ export function form(id) {
let issues = $state.raw({});

/** @type {any} */
let result = $state.raw(started ? undefined : remote_responses[action_id]);
let result = $state.raw(remote_responses[action_id]);

/** @type {number} */
let pending_count = $state(0);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { app_dir, base } from '$app/paths/internal/client';
import { version } from '__sveltekit/environment';
import * as devalue from 'devalue';
import { DEV } from 'esm-env';
import { app, remote_responses, started } from '../client.js';
import { app, remote_responses } from '../client.js';
import { create_remote_function, remote_request } from './shared.svelte.js';

// Initialize Cache API for prerender functions
Expand Down Expand Up @@ -117,11 +117,8 @@ class Prerender {
export function prerender(id) {
return create_remote_function(id, (cache_key, payload) => {
return new Prerender(async () => {
if (!started) {
const result = remote_responses[cache_key];
if (result) {
return result;
}
if (Object.hasOwn(remote_responses, cache_key)) {
return remote_responses[cache_key];
}

const url = `${base}/${app_dir}/remote/${id}${payload ? `/${payload}` : ''}`;
Expand Down
17 changes: 6 additions & 11 deletions packages/kit/src/runtime/client/remote-functions/query.svelte.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
/** @import { RemoteQueryFunction } from '@sveltejs/kit' */
/** @import { RemoteFunctionResponse } from 'types' */
import { app_dir, base } from '$app/paths/internal/client';
import { app, goto, remote_responses, started } from '../client.js';
import { app, goto, remote_responses } from '../client.js';
import { tick } from 'svelte';
import { create_remote_function, remote_request } from './shared.svelte.js';
import * as devalue from 'devalue';
Expand All @@ -14,11 +14,8 @@ import { HttpError, Redirect } from '@sveltejs/kit/internal';
export function query(id) {
return create_remote_function(id, (cache_key, payload) => {
return new Query(cache_key, async () => {
if (!started) {
const result = remote_responses[cache_key];
if (result) {
return result;
}
if (Object.hasOwn(remote_responses, cache_key)) {
return remote_responses[cache_key];
}

const url = `${base}/${app_dir}/remote/${id}${payload ? `?payload=${payload}` : ''}`;
Expand All @@ -38,11 +35,8 @@ export function query_batch(id) {

return create_remote_function(id, (cache_key, payload) => {
return new Query(cache_key, () => {
if (!started) {
const result = remote_responses[cache_key];
if (result) {
return result;
}
if (Object.hasOwn(remote_responses, cache_key)) {
return remote_responses[cache_key];
}

// Collect all the calls to the same query in the same macrotask,
Expand Down Expand Up @@ -277,6 +271,7 @@ export class Query {
* @returns {Promise<void>}
*/
refresh() {
delete remote_responses[this._key];
return (this.#promise = this.#run());
}

Expand Down
Loading