import { error, redirect } from '@sveltejs/kit'; import { createApiClient, extractErrorCode } from '$lib/shared/api.server'; import { getErrorMessage } from '$lib/shared/errors'; import { parsePanZoomParams } from '$lib/person/genealogy/panZoom'; export async function load({ fetch, url }) { const api = createApiClient(fetch); const result = await api.GET('/api/network'); if (result.response.status === 401) throw redirect(302, '/login'); if (!result.response.ok) { throw error(result.response.status, getErrorMessage(extractErrorCode(result.error))); } // Sanitise the shareable pan/zoom params server-side so a crafted link // (?z=Infinity, ?cx=NaN) degrades to a safe view before reaching layout // geometry (Nora #692). const initialView = parsePanZoomParams({ cx: url.searchParams.get('cx'), cy: url.searchParams.get('cy'), z: url.searchParams.get('z') }); const network = result.data!; return { nodes: network.nodes ?? [], edges: network.edges ?? [], initialView }; }