32 lines · 1.0 KB
import { env } from "cloudflare:workers";

function inbox(userId: string) {
  return env.USER_INBOX.get(env.USER_INBOX.idFromName(userId));
}

export function unreadNotifications(userId: string): Promise<number> {
  return inbox(userId).unread(userId);
}

/** Call after inserting or marking notifications for these users; failures only delay the badge by the TTL. */
export async function invalidateUnread(userIds: Iterable<string>): Promise<void> {
  await Promise.all(
    [...new Set(userIds)].map(async (userId) => {
      try {
        await inbox(userId).invalidate();
      } catch (error) {
        console.error("Inbox invalidate failed", userId, error);
      }
    }),
  );
}

/** Per-user hourly email budget, held in the user's inbox object rather than a D1 upsert per email. */
export function takeInboxEmailBudget(userId: string, limit: number, windowMs: number): Promise<boolean> {
  return inbox(userId).takeEmailBudget(limit, windowMs);
}

export function userInbox(userId: string) {
  return inbox(userId);
}