From 74937fd3bb50a968ed96e057f67cc81769728482 Mon Sep 17 00:00:00 2001 From: Chew Tee Ming Date: Fri, 7 Feb 2025 11:53:25 +0800 Subject: [PATCH] remove cast and ensure headers are added to response --- packages/kit/src/runtime/server/respond.js | 64 ++++++++++++++-------- 1 file changed, 42 insertions(+), 22 deletions(-) diff --git a/packages/kit/src/runtime/server/respond.js b/packages/kit/src/runtime/server/respond.js index f61d6fd08269..cded5c5b5c4f 100644 --- a/packages/kit/src/runtime/server/respond.js +++ b/packages/kit/src/runtime/server/respond.js @@ -59,9 +59,7 @@ const allowed_page_methods = new Set(['GET', 'HEAD', 'OPTIONS']); * @returns {Promise} */ export async function respond(request, options, manifest, state) { - // this will always return a Response object unless we set the upgrade param to true - // and an endpoint with a socket handler exists - return /** @type {Promise} */ (handle_request(request, options, manifest, state)); + return handle_request(request, options, manifest, state); } /** @@ -94,6 +92,23 @@ export function resolve_websocket_hooks(options, manifest, state) { }; } +/** + * @overload + * @param {Request} request + * @param {import('types').SSROptions} options + * @param {import('@sveltejs/kit').SSRManifest} manifest + * @param {import('types').SSRState} state + * @returns {Promise} + */ +/** + * @overload + * @param {Request} request + * @param {import('types').SSROptions} options + * @param {import('@sveltejs/kit').SSRManifest} manifest + * @param {import('types').SSRState} state + * @param {boolean} upgrade + * @returns {Promise>} + */ /** * @param {Request} request * @param {import('types').SSROptions} options @@ -102,7 +117,7 @@ export function resolve_websocket_hooks(options, manifest, state) { * @param {boolean=} upgrade * @returns {Promise>} */ -async function handle_request(request, options, manifest, state, upgrade = false) { +async function handle_request(request, options, manifest, state, upgrade) { /** URL but stripped from the potential `/__data.json` suffix and its search param */ const url = new URL(request.url); @@ -390,6 +405,27 @@ async function handle_request(request, options, manifest, state, upgrade = false if (state.prerendering && !state.prerendering.fallback) disable_search(url); + /** + * @param {Response} response + * @returns {Response} + */ + const after_resolve = (response) => { + // add headers/cookies here, rather than inside `resolve`, so that we + // can do it once for all responses instead of once per `return` + for (const key in headers) { + const value = headers[key]; + response.headers.set(key, /** @type {string} */ (value)); + } + + add_cookies_to_headers(response.headers, Object.values(cookies_to_add)); + + if (state.prerendering && event.route.id !== null) { + response.headers.set('x-sveltekit-routeid', encodeURI(event.route.id)); + } + + return response; + }; + if (upgrade && route?.endpoint) { const node = await route.endpoint(); return { @@ -399,7 +435,7 @@ async function handle_request(request, options, manifest, state, upgrade = false event, resolve: async () => { const init = (await node.socket?.upgrade?.(req)) ?? undefined; - return new Response(undefined, init); + return after_resolve(new Response(undefined, init)); } }); } @@ -408,23 +444,7 @@ async function handle_request(request, options, manifest, state, upgrade = false const response = await options.hooks.handle({ event, - resolve: (event, opts) => - resolve(event, opts).then((response) => { - // add headers/cookies here, rather than inside `resolve`, so that we - // can do it once for all responses instead of once per `return` - for (const key in headers) { - const value = headers[key]; - response.headers.set(key, /** @type {string} */ (value)); - } - - add_cookies_to_headers(response.headers, Object.values(cookies_to_add)); - - if (state.prerendering && event.route.id !== null) { - response.headers.set('x-sveltekit-routeid', encodeURI(event.route.id)); - } - - return response; - }) + resolve: (event, opts) => resolve(event, opts).then(after_resolve) }); // respond with 304 if etag matches