diff --git a/src/repositories/shuttle/eta/ETAGetterRepository.ts b/src/repositories/shuttle/eta/ETAGetterRepository.ts new file mode 100644 index 0000000..a1f8255 --- /dev/null +++ b/src/repositories/shuttle/eta/ETAGetterRepository.ts @@ -0,0 +1,37 @@ +import { EventEmitter } from "stream"; +import { IEta } from "../../../entities/ShuttleRepositoryEntities"; + +// TODO: Remove these events in ShuttleGetterRepository + +export const ETARepositoryEvent = { + ETA_UPDATED: "etaUpdated", + ETA_REMOVED: "etaRemoved", + ETA_DATA_CLEARED: "etaDataCleared", +} as const; + +export type ETARepositoryEventName = typeof ETARepositoryEvent[keyof typeof ETARepositoryEvent]; + +export type EtaRemovedEventPayload = IEta; +export type EtaDataClearedEventPayload = IEta[]; + +export interface ETARepositoryEventPayloads { + [ETARepositoryEvent.ETA_UPDATED]: IEta; + [ETARepositoryEvent.ETA_REMOVED]: EtaRemovedEventPayload; + [ETARepositoryEvent.ETA_DATA_CLEARED]: EtaDataClearedEventPayload; +} + +export type ETARepositoryEventListener = ( + payload: ETARepositoryEventPayloads[T], +) => void; + +export interface ETAGetterRepository extends EventEmitter { + on(event: T, listener: ETARepositoryEventListener): this; + once(event: T, listener: ETARepositoryEventListener): this; + off(event: T, listener: ETARepositoryEventListener): this; + addListener(event: T, listener: ETARepositoryEventListener): this; + removeListener(event: T, listener: ETARepositoryEventListener): this; + + getEtasForShuttleId(shuttleId: string): Promise; + getEtasForStopId(stopId: string): Promise; + getEtaForShuttleAndStopId(shuttleId: string, stopId: string): Promise; +} diff --git a/src/repositories/shuttle/eta/ETAGetterSetterRepository.ts b/src/repositories/shuttle/eta/ETAGetterSetterRepository.ts new file mode 100644 index 0000000..53dfe5d --- /dev/null +++ b/src/repositories/shuttle/eta/ETAGetterSetterRepository.ts @@ -0,0 +1,11 @@ +import { IEta } from "../../../entities/ShuttleRepositoryEntities"; +import { ETAGetterRepository } from "./ETAGetterRepository"; + +export interface ExternalSourceETARepository extends ETAGetterRepository { + /** + * Add or update an ETA from an external source (e.g., API or test data). + */ + addOrUpdateEtaFromExternalSource(eta: IEta): Promise; + + removeEtaIfExists(shuttleId: string, stopId: string): Promise; +} diff --git a/src/repositories/shuttle/eta/SelfUpdatingETARepository.ts b/src/repositories/shuttle/eta/SelfUpdatingETARepository.ts new file mode 100644 index 0000000..7f2c9f0 --- /dev/null +++ b/src/repositories/shuttle/eta/SelfUpdatingETARepository.ts @@ -0,0 +1,9 @@ +import { ETAGetterRepository } from "./ETAGetterRepository"; + +export interface SelfUpdatingETARepository extends ETAGetterRepository { + /** + * Attach a event listener to the shuttle repository, listening to + * shuttle updates + */ + startListeningForUpdates(): void; +}