_hydrate: async()

in kit/svelteKitCustomClient/client.js [1778:1866]


		_hydrate: async ({
			status = 200,
			error,
			node_ids,
			params,
			route,
			data: server_data_nodes,
			form,
		}) => {
			hydrated = true;

			const url = new URL(location.href);

			if (!__SVELTEKIT_EMBEDDED__) {
				// See https://github.com/sveltejs/kit/pull/4935#issuecomment-1328093358 for one motivation
				// of determining the params on the client side.
				({ params = {}, route = { id: null } } = get_navigation_intent(url, false) || {});
			}

			/** @type {import('./types').NavigationFinished | undefined} */
			let result;

			try {
				const branch_promises = node_ids.map(async (n, i) => {
					const server_data_node = server_data_nodes[i];
					// Type isn't completely accurate, we still need to deserialize uses
					if (server_data_node?.uses) {
						server_data_node.uses = deserialize_uses(server_data_node.uses);
					}

					return load_node({
						loader: app.nodes[n],
						url,
						params,
						route,
						parent: async () => {
							const data = {};
							for (let j = 0; j < i; j += 1) {
								Object.assign(data, (await branch_promises[j]).data);
							}
							return data;
						},
						server_data_node: create_data_node(server_data_node),
					});
				});

				/** @type {Array<import('./types').BranchNode | undefined>} */
				const branch = await Promise.all(branch_promises);

				const parsed_route = routes.find(({ id }) => id === route.id);

				// server-side will have compacted the branch, reinstate empty slots
				// so that error boundaries can be lined up correctly
				if (parsed_route) {
					const layouts = parsed_route.layouts;
					for (let i = 0; i < layouts.length; i++) {
						if (!layouts[i]) {
							branch.splice(i, 0, undefined);
						}
					}
				}

				result = await get_navigation_result_from_branch({
					url,
					params,
					branch,
					status,
					error,
					form,
					route: parsed_route ?? null,
				});
			} catch (error) {
				if (error instanceof Redirect) {
					// this is a real edge case — `load` would need to return
					// a redirect but only in the browser
					await native_navigation(new URL(error.location, location.href));
					return;
				}

				result = await load_root_error_page({
					status: error instanceof HttpError ? error.status : 500,
					error: await handle_error(error, { url, params, route }),
					url,
					route,
				});
			}

			initialize(result);
		},