commit c32227d9b2eef78bacd0ce5fe8bbd3d4c3ce34a0
parent 34e205dcf1c6f9fea8a9fb1553e29e9525f4bb09
Author: Katja (ctucx) <git@ctu.cx>
Date: Sat, 19 Apr 2025 20:41:17 +0200
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/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/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(); } } }