From ccbd4a96ea61401d2cdfa24e799071b4dae5abe1 Mon Sep 17 00:00:00 2001 From: Nic Polumeyv <162764842+Nic-Polumeyv@users.noreply.github.com> Date: Sat, 18 Jul 2026 11:07:43 -0400 Subject: [PATCH] perf: build transport encoders once instead of on every response --- .changeset/plenty-camels-shave.md | 5 +++++ .../kit/src/runtime/server/page/actions.js | 10 +++++----- .../src/runtime/server/page/data_serializer.js | 5 ++--- packages/kit/src/runtime/server/utils.js | 18 ++++++++++++++++++ 4 files changed, 30 insertions(+), 8 deletions(-) create mode 100644 .changeset/plenty-camels-shave.md diff --git a/.changeset/plenty-camels-shave.md b/.changeset/plenty-camels-shave.md new file mode 100644 index 000000000000..d1196aded331 --- /dev/null +++ b/.changeset/plenty-camels-shave.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +perf: build transport encoders once instead of on every response diff --git a/packages/kit/src/runtime/server/page/actions.js b/packages/kit/src/runtime/server/page/actions.js index 4ec4ecaade43..a54e2eed9088 100644 --- a/packages/kit/src/runtime/server/page/actions.js +++ b/packages/kit/src/runtime/server/page/actions.js @@ -7,7 +7,7 @@ import { HttpError, Redirect, ActionFailure, SvelteKitError } from '@sveltejs/ki import { with_request_store, merge_tracing } from '@sveltejs/kit/internal/server'; import { normalize_error } from '../../../utils/error.js'; import { is_form_content_type, negotiate } from '../../../utils/http.js'; -import { create_replacer, handle_error_and_jsonify } from '../utils.js'; +import { create_replacer, get_encoders, handle_error_and_jsonify } from '../utils.js'; import { record_span } from '../../telemetry/record_span.js'; /** @param {RequestEvent} event */ @@ -328,11 +328,11 @@ export function uneval_action_response(data, route_id, transport) { * @param {ServerHooks['transport']} transport */ function stringify_action_response(data, route_id, transport) { - const encoders = Object.fromEntries( - Object.entries(transport).map(([key, value]) => [key, value.encode]) + return try_serialize( + data, + (value) => devalue.stringify(value, get_encoders(transport)), + route_id ); - - return try_serialize(data, (value) => devalue.stringify(value, encoders), route_id); } /** diff --git a/packages/kit/src/runtime/server/page/data_serializer.js b/packages/kit/src/runtime/server/page/data_serializer.js index 5525fde60699..10a549d70612 100644 --- a/packages/kit/src/runtime/server/page/data_serializer.js +++ b/packages/kit/src/runtime/server/page/data_serializer.js @@ -3,6 +3,7 @@ import { compact } from '../../../utils/array.js'; import { create_async_iterator } from '../../../utils/streaming.js'; import { clarify_devalue_error, + get_encoders, get_global_name, handle_error_and_jsonify, serialize_uses @@ -137,9 +138,7 @@ export function server_data_serializer_json(event, event_state, options) { const iterator = create_async_iterator(); const reducers = { - ...Object.fromEntries( - Object.entries(options.hooks.transport).map(([key, value]) => [key, value.encode]) - ), + ...get_encoders(options.hooks.transport), /** @param {any} thing */ Promise: (thing) => { if (typeof thing?.then !== 'function') { diff --git a/packages/kit/src/runtime/server/utils.js b/packages/kit/src/runtime/server/utils.js index 1148245158a0..a7f4f2ee4141 100644 --- a/packages/kit/src/runtime/server/utils.js +++ b/packages/kit/src/runtime/server/utils.js @@ -285,6 +285,24 @@ export function count_non_ssi_comments(str) { return (str.match(/