import { GetterSetterRepository } from "../repositories/GetterSetterRepository"; import { IEta, IRoute, IShuttle, IStop, ISystem } from "../entities/entities"; import { ApiBasedRepositoryLoader } from "./ApiBasedRepositoryLoader"; // Ideas to break this into smaller pieces in the future: // Have one repository data loader running for each supported system // Each data loader independently updates data based on frequency of usage // Notes on this: we only need to reload ETA data frequently // Other data can be reloaded periodically // Detailed list: // - ETA: reload frequently or switch to write-through approach // - Shuttles: reload every minute // - Routes: reload every few minutes // - Stops: reload every few minutes // - OrderedStops: reload every few minutes // - Systems: reload once a day export class TimedApiBasedRepositoryLoader extends ApiBasedRepositoryLoader { private shouldBeRunning: boolean = false; private timer: any; readonly timeout = 10000; constructor( repository: GetterSetterRepository, ) { super(repository); this.startFetchDataAndUpdate = this.startFetchDataAndUpdate.bind(this); } public async start() { if (this.shouldBeRunning) { console.warn("DataLoader timer is already running"); return; } this.shouldBeRunning = true; await this.startFetchDataAndUpdate(); } public stop() { this.shouldBeRunning = false; } private async startFetchDataAndUpdate() { if (!this.shouldBeRunning) return; try { await this.repository.clearSystemData(); await this.fetchAndUpdateSystemData(); await this.repository.clearRouteData(); await this.fetchAndUpdateRouteDataForExistingSystemsInRepository(); await this.repository.clearStopData(); await this.fetchAndUpdateStopAndPolylineDataForRoutesInExistingSystemsInRepository(); await this.repository.clearShuttleData(); await this.fetchAndUpdateShuttleDataForExistingSystemsInRepository(); await this.repository.clearEtaData(); await this.fetchAndUpdateEtaDataForExistingStopsForSystemsInRepository(); } catch (e) { console.error(e); } this.timer = setTimeout(this.startFetchDataAndUpdate, this.timeout); } }