Three issues fixed: 1. GPX parser used browser DOMParser which doesn't exist in Node/Vite SSR. Added async parseGpxAsync() using linkedom for server-side parsing. 2. Server-side session initialization stored waypoints in a Yjs doc instance separate from the Vite WebSocket plugin's doc store. Moved waypoint initialization to client-side: API returns parsed waypoints, client adds them to Yjs after sync. 3. GPX was encoded in URL params causing HTTP 431. Now the Journal creates a Planner session via API (POST body), and only passes compact waypoint coordinates in URL params. Verified: Journal route → Edit in Planner → 4 waypoints loaded, route computed (79.3km), elevation profile, Save to Journal ready. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
43 lines
1.1 KiB
TypeScript
43 lines
1.1 KiB
TypeScript
import { data } from "react-router";
|
|
import type { Route } from "./+types/api.sessions";
|
|
import { createSession, listSessions } from "~/lib/sessions";
|
|
import { parseGpxAsync } from "@trails-cool/gpx";
|
|
|
|
export async function action({ request }: Route.ActionArgs) {
|
|
if (request.method !== "POST") {
|
|
return data({ error: "Method not allowed" }, { status: 405 });
|
|
}
|
|
|
|
const body = await request.json();
|
|
const { callbackUrl, callbackToken, gpx } = body as {
|
|
callbackUrl?: string;
|
|
callbackToken?: string;
|
|
gpx?: string;
|
|
};
|
|
|
|
const session = await createSession({ callbackUrl, callbackToken });
|
|
|
|
let initialWaypoints: Array<{ lat: number; lon: number; name?: string }> | undefined;
|
|
if (gpx) {
|
|
try {
|
|
const gpxData = await parseGpxAsync(gpx);
|
|
initialWaypoints = gpxData.waypoints;
|
|
} catch (_e) {
|
|
// Continue with empty session if GPX is invalid
|
|
}
|
|
}
|
|
|
|
return data(
|
|
{
|
|
sessionId: session.id,
|
|
url: `/session/${session.id}`,
|
|
initialWaypoints,
|
|
},
|
|
{ status: 201 },
|
|
);
|
|
}
|
|
|
|
export async function loader(_args: Route.LoaderArgs) {
|
|
const sessions = await listSessions();
|
|
return data({ sessions });
|
|
}
|