ctucx.git: trainsearch

web based trip-planner, fork of https://cyberchaos.dev/yuka/trainsearch

1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 
32 
33 
34 
35 
36 
37 
38 
39 
40 
41 
42 
43 
44 
45 
46 
47 
48 
49 
50 
51 
52 
53 
54 
55 
import { padZeros, sleep } from '../helpers.js';
import { mapInformation } from './DB/DBMapping.js';

const dbCoachSequenceTimeout    = 1000;
export const coachSequenceCache = {};

const rawDBCoachSequence = async (category, number, evaNumber, date, retry = 2) => {
	try {
		const searchParams = new URLSearchParams();

		searchParams.append("category",  category);
		searchParams.append("date",      `${date.getFullYear()}-${padZeros(date.getMonth()+1)}-${padZeros(date.getDate())}`);
		searchParams.append("time",      `${date.getFullYear()}-${padZeros(date.getMonth()+1)}-${padZeros(date.getDate())}T${padZeros(date.getHours())}:${padZeros(date.getMinutes())}:${padZeros(date.getSeconds())}Z`);
		searchParams.append("evaNumber", evaNumber);
		searchParams.append("number",    number);


		return await fetch(`/db/vehicle-sequence?${searchParams}`).then(x => x.json());
	} catch (e) {
		sleep(dbCoachSequenceTimeout);
		if (retry) return rawDBCoachSequence(category, number, evaNumber, date, retry - 1);
	}
}

const DBCoachSequence = async (category, number, evaNumber, date) => {
  const rawSequence = await rawDBCoachSequence(category, number, evaNumber, date);

  if (!rawSequence) return undefined;

  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) => {
	const key = coachSequenceCacheKey(category, number, evaNumber, departure);

	if (!key) return;

	if (coachSequenceCache[key] === undefined) {
		coachSequenceCache[key] = (async () => {
			try {
				const info = await DBCoachSequence(category, number, evaNumber, departure);
				coachSequenceCache[key] = info;
				return info;
			} catch (e) {}
			coachSequenceCache[key] = null;
		}) ();
	}

	return coachSequenceCache[key];
};