diff --git a/documentation/docs/98-reference/.generated/server-errors.md b/documentation/docs/98-reference/.generated/server-errors.md index 2901d7f682..b14a512c04 100644 --- a/documentation/docs/98-reference/.generated/server-errors.md +++ b/documentation/docs/98-reference/.generated/server-errors.md @@ -105,7 +105,7 @@ Values added to a `Warp` on the server may already be in use (or on their way to ### warp_serialization_failed ``` -Failed to serialize the value with key `%key%` in `Warp` `%id%`. +Failed to serialize data added to a `Warp`. `Warp` can serialize anything [`uneval` from `devalue`](https://npmjs.com/package/devalue) can, including promises. To serialize other values, pass a `replacer` to `render` or `withWarp`. diff --git a/documentation/docs/98-reference/.generated/server-warnings.md b/documentation/docs/98-reference/.generated/server-warnings.md index 1dfeaafc10..dcb8712803 100644 --- a/documentation/docs/98-reference/.generated/server-warnings.md +++ b/documentation/docs/98-reference/.generated/server-warnings.md @@ -3,14 +3,9 @@ ### unresolved_warp ``` -The value with key `%key%` in `Warp` `%id%` was created, but at least part of it was not used during the render. - -The value was set in: -%stack% +Part of the data added to `Warp` instances was not used during the render, so the response was delayed until it resolved. ``` -The server has to wait for this value to resolve before it can send the rendered HTML, which delays the response even though the value was not needed for the render. - The most likely cause of this is creating a value in the `script` block of your component and then `await`ing the result inside a `svelte:boundary` with a `pending` snippet: diff --git a/packages/svelte/messages/server-errors/errors.md b/packages/svelte/messages/server-errors/errors.md index f22f63e797..133546da10 100644 --- a/packages/svelte/messages/server-errors/errors.md +++ b/packages/svelte/messages/server-errors/errors.md @@ -78,7 +78,7 @@ Values added to a `Warp` on the server may already be in use (or on their way to ## warp_serialization_failed -> Failed to serialize the value with key `%key%` in `Warp` `%id%`. +> Failed to serialize data added to a `Warp`. > > `Warp` can serialize anything [`uneval` from `devalue`](https://npmjs.com/package/devalue) can, including promises. To serialize other values, pass a `replacer` to `render` or `withWarp`. > diff --git a/packages/svelte/messages/server-warnings/warnings.md b/packages/svelte/messages/server-warnings/warnings.md index f3d9f93d84..5dcd8db181 100644 --- a/packages/svelte/messages/server-warnings/warnings.md +++ b/packages/svelte/messages/server-warnings/warnings.md @@ -1,11 +1,6 @@ ## unresolved_warp -> The value with key `%key%` in `Warp` `%id%` was created, but at least part of it was not used during the render. -> -> The value was set in: -> %stack% - -The server has to wait for this value to resolve before it can send the rendered HTML, which delays the response even though the value was not needed for the render. +> Part of the data added to `Warp` instances was not used during the render, so the response was delayed until it resolved. The most likely cause of this is creating a value in the `script` block of your component and then `await`ing the result inside a `svelte:boundary` with a `pending` snippet: diff --git a/packages/svelte/src/internal/server/errors.js b/packages/svelte/src/internal/server/errors.js index 389ef6662d..a63876f87c 100644 --- a/packages/svelte/src/internal/server/errors.js +++ b/packages/svelte/src/internal/server/errors.js @@ -156,19 +156,17 @@ export function warp_method_unsupported(method) { } /** - * Failed to serialize the value with key `%key%` in `Warp` `%id%`. + * Failed to serialize data added to a `Warp`. * * `Warp` can serialize anything [`uneval` from `devalue`](https://npmjs.com/package/devalue) can, including promises. To serialize other values, pass a `replacer` to `render` or `withWarp`. * * Cause: * %stack% - * @param {string} key - * @param {string} id * @param {string} stack * @returns {never} */ -export function warp_serialization_failed(key, id, stack) { - const error = new Error(`warp_serialization_failed\nFailed to serialize the value with key \`${key}\` in \`Warp\` \`${id}\`. +export function warp_serialization_failed(stack) { + const error = new Error(`warp_serialization_failed\nFailed to serialize data added to a \`Warp\`. \`Warp\` can serialize anything [\`uneval\` from \`devalue\`](https://npmjs.com/package/devalue) can, including promises. To serialize other values, pass a \`replacer\` to \`render\` or \`withWarp\`. diff --git a/packages/svelte/src/internal/server/renderer.js b/packages/svelte/src/internal/server/renderer.js index 4cef8db7a4..c3778df4b4 100644 --- a/packages/svelte/src/internal/server/renderer.js +++ b/packages/svelte/src/internal/server/renderer.js @@ -13,11 +13,9 @@ import { BLOCK_CLOSE, BLOCK_OPEN } from './hydration.js'; import { HYDRATION_START_FAILED } from '../../constants.js'; import { attributes } from './index.js'; import { with_render_context } from './render-context.js'; -import { get_stack, is_promise } from './warp.js'; import { sha256 } from './crypto.js'; import * as devalue from 'devalue'; import { has_own_property, is_array, noop } from '../shared/utils.js'; -import { DEV } from 'esm-env'; import { escape_html } from '../../escaping.js'; /** @typedef {'head' | 'body'} RendererType */ @@ -869,8 +867,8 @@ export class Renderer { } /** - * Waits for the values added to `Warp` instances to resolve, then serializes them - * into a ` diff --git a/packages/svelte/tests/runtime-runes/samples/warp-rejected/_config.js b/packages/svelte/tests/runtime-runes/samples/warp-rejected/_config.js index 1fc35f8f4f..b70d612770 100644 --- a/packages/svelte/tests/runtime-runes/samples/warp-rejected/_config.js +++ b/packages/svelte/tests/runtime-runes/samples/warp-rejected/_config.js @@ -13,7 +13,10 @@ export default test({ test_ssr({ assert, warnings }) { assert.strictEqual(warnings.length, 1); - assert.include(warnings[0], 'The value with key `data` in `Warp` `app`'); + assert.include( + warnings[0], + 'Part of the data added to `Warp` instances was not used during the render' + ); }, async test({ assert, target }) { diff --git a/packages/svelte/tests/runtime-runes/samples/warp-rejected/main.svelte b/packages/svelte/tests/runtime-runes/samples/warp-rejected/main.svelte index edd1e0a9aa..939a8ae18d 100644 --- a/packages/svelte/tests/runtime-runes/samples/warp-rejected/main.svelte +++ b/packages/svelte/tests/runtime-runes/samples/warp-rejected/main.svelte @@ -6,7 +6,7 @@ const warp = new Warp>('app'); const data = warp.getOrInsertComputed( 'data', - () => new Promise((_, reject) => setTimeout(() => reject(new Error(`from ${environment}`)))) + () => new Promise((_, reject) => setTimeout(() => reject(new Error(`from ${environment}`)), 10)) ); diff --git a/packages/svelte/tests/runtime-runes/samples/warp-unresolved-partial/_config.js b/packages/svelte/tests/runtime-runes/samples/warp-unresolved-partial/_config.js index 78301a4717..dbb70a2c57 100644 --- a/packages/svelte/tests/runtime-runes/samples/warp-unresolved-partial/_config.js +++ b/packages/svelte/tests/runtime-runes/samples/warp-unresolved-partial/_config.js @@ -11,7 +11,10 @@ export default test({ test_ssr({ assert, warnings }) { assert.strictEqual(warnings.length, 1); - assert.include(warnings[0], 'The value with key `partially_used` in `Warp` `app`'); + assert.include( + warnings[0], + 'Part of the data added to `Warp` instances was not used during the render' + ); }, async test({ assert, target }) { diff --git a/packages/svelte/tests/runtime-runes/samples/warp-unresolved-partial/main.svelte b/packages/svelte/tests/runtime-runes/samples/warp-unresolved-partial/main.svelte index ee88a68c1b..c7ea55ba64 100644 --- a/packages/svelte/tests/runtime-runes/samples/warp-unresolved-partial/main.svelte +++ b/packages/svelte/tests/runtime-runes/samples/warp-unresolved-partial/main.svelte @@ -6,10 +6,10 @@ const warp = new Warp('app'); const partially_used = warp.getOrInsertComputed('partially_used', () => ({ used: new Promise( - (res, rej) => environment === 'server' ? setTimeout(() => res('did you ever hear the tragedy of darth plagueis the wise?'), 0) : rej('should not run') + (res, rej) => environment === 'server' ? setTimeout(() => res('did you ever hear the tragedy of darth plagueis the wise?'), 10) : rej('should not run') ), unused: new Promise( - (res, rej) => environment === 'server' ? setTimeout(() => res('no, sith daddy, please tell me'), 0) : rej('should not run') + (res, rej) => environment === 'server' ? setTimeout(() => res('no, sith daddy, please tell me'), 50) : rej('should not run') ), })); diff --git a/packages/svelte/tests/runtime-runes/samples/warp-unresolved/_config.js b/packages/svelte/tests/runtime-runes/samples/warp-unresolved/_config.js index d798a83085..74ae24871e 100644 --- a/packages/svelte/tests/runtime-runes/samples/warp-unresolved/_config.js +++ b/packages/svelte/tests/runtime-runes/samples/warp-unresolved/_config.js @@ -10,7 +10,10 @@ export default test({ test_ssr({ assert, warnings }) { assert.strictEqual(warnings.length, 1); - assert.include(warnings[0], 'The value with key `unused_key` in `Warp` `app`'); + assert.include( + warnings[0], + 'Part of the data added to `Warp` instances was not used during the render' + ); }, async test({ assert, target }) { diff --git a/packages/svelte/tests/runtime-runes/samples/warp-unresolved/main.svelte b/packages/svelte/tests/runtime-runes/samples/warp-unresolved/main.svelte index 5d6e28b8ab..6a9730ab78 100644 --- a/packages/svelte/tests/runtime-runes/samples/warp-unresolved/main.svelte +++ b/packages/svelte/tests/runtime-runes/samples/warp-unresolved/main.svelte @@ -5,7 +5,7 @@ const warp = new Warp('app'); const unresolved = warp.getOrInsertComputed('unused_key', () => new Promise( - (res, rej) => environment === 'server' ? setTimeout(() => res('did you ever hear the tragedy of darth plagueis the wise?'), 0) : rej('should not run') + (res, rej) => environment === 'server' ? setTimeout(() => res('did you ever hear the tragedy of darth plagueis the wise?'), 10) : rej('should not run') )); diff --git a/packages/svelte/tests/server-side-rendering/samples/csp-hash/_config.js b/packages/svelte/tests/server-side-rendering/samples/csp-hash/_config.js index 41f1627d99..c52af223f1 100644 --- a/packages/svelte/tests/server-side-rendering/samples/csp-hash/_config.js +++ b/packages/svelte/tests/server-side-rendering/samples/csp-hash/_config.js @@ -3,5 +3,5 @@ import { test } from '../../test'; export default test({ mode: ['async'], csp: { hash: true }, - script_hashes: ['sha256-kcOu9IHb0N7eeK7eTBoi3kn39HD0+3o4IiIQcydJV3U='] + script_hashes: ['sha256-/O9j+G/R3k/zGliNPs7Ausxs9KBZyprD7zlO4ivy2ME='] }); diff --git a/packages/svelte/tests/server-side-rendering/samples/csp-hash/_expected_head.html b/packages/svelte/tests/server-side-rendering/samples/csp-hash/_expected_head.html index 36054e479e..3cf424a6a6 100644 --- a/packages/svelte/tests/server-side-rendering/samples/csp-hash/_expected_head.html +++ b/packages/svelte/tests/server-side-rendering/samples/csp-hash/_expected_head.html @@ -3,7 +3,7 @@ { const w = (window.__svelte ??= {}).w ??= new Map(); - for (const [id, values] of new Map([["svelte:hydratable",new Map([["key",Promise.resolve("bar")]])]])) { + for (const [id, values] of (()=>{let n=window.__svelte.d||(window.__svelte.d={__proto__:null}),s=(n["w"]={o:[],p:[]});s.d=(i)=>{let p=new Promise((a,b)=>{s.p[i]=[a,b]});p.catch(()=>{});return p};s.r=(i,k,v)=>{s.p[i][k](v);delete s.p[i]};return (s.o[0]=new Map([["svelte:hydratable",(s.o[1]=new Map([["key",(s.o[2]=s.d(0))]]))]]))})()) { const existing = w.get(id); if (existing) { @@ -12,5 +12,6 @@ w.set(id, values); } } + ((s)=>{s.r(0,0,"bar");delete window.__svelte.d["w"]})(window.__svelte.d["w"]); } \ No newline at end of file diff --git a/packages/svelte/tests/server-side-rendering/samples/csp-nonce/_expected_head.html b/packages/svelte/tests/server-side-rendering/samples/csp-nonce/_expected_head.html index 78505b5626..49582a0efd 100644 --- a/packages/svelte/tests/server-side-rendering/samples/csp-nonce/_expected_head.html +++ b/packages/svelte/tests/server-side-rendering/samples/csp-nonce/_expected_head.html @@ -3,7 +3,7 @@ { const w = (window.__svelte ??= {}).w ??= new Map(); - for (const [id, values] of new Map([["svelte:hydratable",new Map([["key",Promise.resolve("bar")]])]])) { + for (const [id, values] of (()=>{let n=window.__svelte.d||(window.__svelte.d={__proto__:null}),s=(n["w"]={o:[],p:[]});s.d=(i)=>{let p=new Promise((a,b)=>{s.p[i]=[a,b]});p.catch(()=>{});return p};s.r=(i,k,v)=>{s.p[i][k](v);delete s.p[i]};return (s.o[0]=new Map([["svelte:hydratable",(s.o[1]=new Map([["key",(s.o[2]=s.d(0))]]))]]))})()) { const existing = w.get(id); if (existing) { @@ -12,5 +12,6 @@ w.set(id, values); } } + ((s)=>{s.r(0,0,"bar");delete window.__svelte.d["w"]})(window.__svelte.d["w"]); } \ No newline at end of file