katja's git: oeffisearch

fast and simple tripplanner

commit c32227d9b2eef78bacd0ce5fe8bbd3d4c3ce34a0
parent 34e205dcf1c6f9fea8a9fb1553e29e9525f4bb09
Author: Katja (ctucx) <git@ctu.cx>
Date: Sat, 19 Apr 2025 20:41:17 +0200

improve handling of coach-sequence fetching and caching (using session cache to store responses)
9 files changed, 29 insertions(+), 27 deletions(-)
diff --git a/src/coach-sequence/DB/DBMapping.js b/src/coach-sequence/DBMapping.js
diff --git a/src/coach-sequence/DB/TrainNames.js b/src/coach-sequence/TrainNames.js
diff --git a/src/coach-sequence/DB/baureihe.js b/src/coach-sequence/baureihe.js
diff --git a/src/coach-sequence/DB/commonMapping.js b/src/coach-sequence/commonMapping.js
diff --git a/src/coach-sequence/index.js b/src/coach-sequence/index.js
@@ -1,8 +1,7 @@
 import { padZeros, sleep } from '../helpers.js';
-import { mapInformation } from './DB/DBMapping.js';
+import { mapInformation } from './DBMapping.js';
 
-const dbCoachSequenceTimeout    = 1500;
-export const coachSequenceCache = {};
+const dbCoachSequenceTimeout = 1500;
 
 const rawDBCoachSequence = async (category, number, evaNumber, date, retry = 2) => {
 	try {

@@ -14,7 +13,6 @@ const rawDBCoachSequence = async (category, number, evaNumber, date, retry = 2) 
 		searchParams.append("evaNumber", evaNumber);
 		searchParams.append("number",    number);
 
-
 		return await fetch(`/db/vehicle-sequence?${searchParams}`).then(x => x.json());
 	} catch (e) {
 		await sleep(dbCoachSequenceTimeout);

@@ -30,26 +28,28 @@ const DBCoachSequence = async (category, number, evaNumber, date) => {
   return mapInformation(rawSequence, category, number, evaNumber);
 }
 
-export const coachSequenceCacheKey = (category, number, evaNumber, departure) => {
-	if (!category || !number || !evaNumber || !departure) return;
-	return `${category}-${number}-${evaNumber}-${departure.toISOString()}`;
-};
+export const cachedCoachSequence = (category, number, evaNumber, departure, onlyCached) => {
+	if (!category || !number || !evaNumber || !departure) return null;
 
-export const cachedCoachSequence = (category, number, evaNumber, departure) => {
-	const key = coachSequenceCacheKey(category, number, evaNumber, departure);
+	const key  = `${category}-${number}-${evaNumber}-${departure.toISOString()}`;
+	let   data = sessionStorage.getItem(key);
 
-	if (!key) return;
+	if (data === null) {
+		if (onlyCached === true) return null;
 
-	if (coachSequenceCache[key] === undefined) {
-		coachSequenceCache[key] = (async () => {
+		data = (async () => {
 			try {
 				const info = await DBCoachSequence(category, number, evaNumber, departure);
-				coachSequenceCache[key] = info;
+				if (info === undefined) return null;
+				sessionStorage.setItem(key, JSON.stringify(info));
 				return info;
-			} catch (e) {}
-			coachSequenceCache[key] = null;
-		}) ();
+			} catch (e) {
+				return null;
+			}
+		})();
+	} else {
+		data = JSON.parse(data);
 	}
 
-	return coachSequenceCache[key];
+	return data;
 };
diff --git a/src/coach-sequence/DB/specialSeats.js b/src/coach-sequence/specialSeats.js
diff --git a/src/journeyView.js b/src/journeyView.js
@@ -211,7 +211,7 @@ class JourneyView extends BaseView {
 				for (const leg of this.viewState.legs) {
 					if (leg.line && leg.line.name) {
 						const [category, number] = leg.line.name.split(' ');
-						const info               = await cachedCoachSequence(category, leg.line.fahrtNr || number, leg.origin.id, leg.plannedDeparture);
+						const info               = cachedCoachSequence(category, leg.line.fahrtNr || number, leg.origin.id, leg.plannedDeparture);
 
 						if (info) leg.line.trainType = formatTrainTypes(info);
 						this.requestUpdate();
diff --git a/src/journeysCanvas.js b/src/journeysCanvas.js
@@ -2,9 +2,9 @@ import { html } from 'lit';
 import { ref, createRef } from 'lit/directives/ref.js';
 import { BaseView } from './baseView.js';
 
-import { CustomDate } from './helpers.js';
+import { CustomDate, sleep } from './helpers.js';
 import { formatTrainTypes, formatLineDisplayName } from './formatters.js'
-import { cachedCoachSequence, coachSequenceCache, coachSequenceCacheKey } from './coach-sequence/index.js';
+import { cachedCoachSequence } from './coach-sequence/index.js';
 
 export class JourneysCanvas extends BaseView {
 	static properties = {

@@ -228,7 +228,10 @@ export class JourneysCanvas extends BaseView {
 				if (!leg.line) continue;
 				const [category, number] = leg.line.name.split(" ");
 				if (category !== 'ICE') continue;
-				await cachedCoachSequence(category, leg.line.fahrtNr || number, leg.origin.id, leg.plannedDeparture);
+
+				await sleep(500);
+				cachedCoachSequence(category, leg.line.fahrtNr || number, leg.origin.id, leg.plannedDeparture);
+
 				this.renderCanvas();
 			}
 		}

@@ -238,11 +241,10 @@ export class JourneysCanvas extends BaseView {
 	getTrainTypeTexts = leg => {
 		if (!leg.line || !leg.line.name) return [];
 		const [category, number] = leg.line.name.split(" ");
-		const key = coachSequenceCacheKey(category, leg.line.fahrtNr || number, leg.origin.id, leg.plannedDeparture);
-		if (!key) return [];
-		const info = coachSequenceCache[key];
-		if (!info || info instanceof Promise) return [];
 
+		const info = cachedCoachSequence(category, leg.line.fahrtNr || number, leg.origin.id, leg.plannedDeparture, true);
+
+		if (!info) return [];
 		return formatTrainTypes(info).split(" + ");
 	};
 
diff --git a/src/journeysView.js b/src/journeysView.js
@@ -80,7 +80,7 @@ export class JourneysView extends JourneysCanvas {
 			this.connectCanvas();
 			if (previous.has('viewState') && this.viewState !== null) {
 				this.renderCanvas();
-				await this.getCoachSequences();
+				if (previous.get('viewState') !== undefined) await this.getCoachSequences();
 			}
 		}
 	}