diff --git a/src/app.js b/src/app.js index d24a74a..65e63f9 100644 --- a/src/app.js +++ b/src/app.js @@ -1930,6 +1930,70 @@ function normalizeObsOverlaySettings(raw = {}) { }; } +function normalizeDriver(driver = {}) { + return { + id: String(driver?.id || uid("driver")), + name: String(driver?.name || "").trim(), + classId: String(driver?.classId || "").trim(), + transponder: String(driver?.transponder || "").trim(), + brand: String(driver?.brand || "").trim(), + }; +} + +function normalizeCar(car = {}) { + return { + id: String(car?.id || uid("car")), + name: String(car?.name || "").trim(), + transponder: String(car?.transponder || "").trim(), + brand: String(car?.brand || "").trim(), + }; +} + +function normalizeSession(session = {}) { + const type = SESSION_TYPES.includes(String(session?.type || "").toLowerCase()) + ? String(session.type).toLowerCase() + : "practice"; + const status = ["ready", "running", "stopped", "finished"].includes(String(session?.status || "").toLowerCase()) + ? String(session.status).toLowerCase() + : "ready"; + const seedMethod = ["best_sum", "average", "consecutive"].includes(String(session?.seedMethod || "").toLowerCase()) + ? String(session.seedMethod).toLowerCase() + : "best_sum"; + const assignments = Array.isArray(session?.assignments) + ? session.assignments + .map((assignment) => ({ + id: String(assignment?.id || uid("as")), + driverId: String(assignment?.driverId || "").trim(), + carId: String(assignment?.carId || "").trim(), + })) + .filter((assignment) => assignment.driverId || assignment.carId) + : []; + return { + ...session, + id: String(session?.id || uid("session")), + eventId: String(session?.eventId || "").trim(), + name: String(session?.name || "").trim(), + type, + durationMin: Math.max(1, Number(session?.durationMin || 1) || 1), + followUpSec: Math.max(0, Number(session?.followUpSec || 0) || 0), + startMode: normalizeStartMode(session?.startMode || "mass"), + seedBestLapCount: Math.max(0, Number(session?.seedBestLapCount || 0) || 0), + seedMethod, + staggerGapSec: Math.max(0, Number(session?.staggerGapSec || 0) || 0), + maxCars: session?.maxCars ? Math.max(1, Number(session.maxCars) || 1) : null, + mode: session?.mode === "track" ? "track" : "race", + status, + startedAt: Number.isFinite(Number(session?.startedAt)) ? Number(session.startedAt) : null, + endedAt: Number.isFinite(Number(session?.endedAt)) ? Number(session.endedAt) : null, + finishedByTimer: session?.finishedByTimer === true, + assignments, + driverIds: Array.isArray(session?.driverIds) ? session.driverIds.map(String).filter(Boolean) : [], + manualGridIds: Array.isArray(session?.manualGridIds) ? session.manualGridIds.map(String).filter(Boolean) : [], + gridCustomized: session?.gridCustomized === true, + generated: session?.generated === true, + }; +} + function parseOverlayBooleanParam(name, fallback) { const raw = urlParams.get(name); if (raw == null) {