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 2418649b5bda..7a345d4cd906 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 } from '../utils.js'; +import { create_replacer, get_encoders } from '../utils.js'; import { handle_error_and_jsonify } from '../errors.js'; import { record_span } from '../../telemetry/record_span.js'; @@ -329,11 +329,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 8c4dab90185d..002d60e9ace7 100644 --- a/packages/kit/src/runtime/server/page/data_serializer.js +++ b/packages/kit/src/runtime/server/page/data_serializer.js @@ -1,7 +1,7 @@ import * as devalue from 'devalue'; import { compact } from '../../../utils/array.js'; import { create_async_iterator } from '../../../utils/streaming.js'; -import { clarify_devalue_error, get_global_name, serialize_uses } from '../utils.js'; +import { clarify_devalue_error, get_encoders, get_global_name, serialize_uses } from '../utils.js'; import { handle_error_and_jsonify } from '../errors.js'; /** @@ -135,9 +135,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 8f9e41f7a2ea..7865ce697ced 100644 --- a/packages/kit/src/runtime/server/utils.js +++ b/packages/kit/src/runtime/server/utils.js @@ -130,6 +130,24 @@ export function count_non_ssi_comments(str) { return (str.match(/