src/reminder-scheduler-types.tsTypeScript
@@ -0,0 +1,42 @@
1+
export interface LocalTime {2+
hour: number;3+
minute: number;4+
}5+
6+
export interface Reminder {7+
id: string;8+
recipientId: string;9+
recipientTimeZone: string;10+
localTime: LocalTime;11+
nextRunAt: Date;12+
}13+
14+
export interface ZonedCalendar {15+
nextDateAfter(instant: Date, timeZone: string, time: LocalTime): string;16+
resolve(17+
date: string,18+
time: LocalTime,19+
timeZone: string,20+
policy: { ambiguous: "earlier" | "later"; nonexistent: "next-valid" | "reject" },21+
): Date;22+
}23+
24+
export interface ReminderRepository {25+
listDue(now: Date): Promise<Reminder[]>;26+
updateNextRunAt(reminderId: string, nextRunAt: Date): Promise<void>;27+
}28+
29+
export interface DeliveryQueue {30+
enqueue(message: {31+
reminderId: string;32+
recipientId: string;33+
scheduledFor: Date;34+
}): Promise<void>;35+
}36+
37+
export interface SchedulerDependencies {38+
calendar: ZonedCalendar;39+
queue: DeliveryQueue;40+
reminders: ReminderRepository;41+
serverTimeZone: string;42+
}