Review a recurring reminder scheduler

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+}