import { Agent } from "agents";
import type { GeneratedEnv } from "@ayjnt/env";
type Reminder = { id: string; text: string; due: number; firedAt?: number };
type State = { pending: Reminder[]; fired: Reminder[] };
export default class ReminderAgent extends Agent<GeneratedEnv, State> {
override initialState: State = { pending: [], fired: [] };
/** Scheduled callback. The name must match the second arg to schedule(). */
async fire(reminder: Reminder): Promise<void> {
this.setState({
pending: this.state.pending.filter((r) => r.id !== reminder.id),
fired: [...this.state.fired, { ...reminder, firedAt: Date.now() }],
});
}
override async onRequest(request: Request): Promise<Response> {
if (request.method !== "POST") {
return Response.json({ instance: this.name, ...this.state });
}
const body = (await request.json()) as { text: string; in?: number; at?: string };
const due = body.at ? new Date(body.at) : new Date(Date.now() + (body.in ?? 0) * 1000);
const reminder: Reminder = { id: crypto.randomUUID(), text: body.text, due: due.getTime() };
await this.schedule(due, "fire", reminder); // ← persists an alarm on the DO
this.setState({ ...this.state, pending: [...this.state.pending, reminder] });
return Response.json({ ok: true, scheduled: reminder });
}
}