pending-adoption-holder.ts

1.7 KB · raw

1import type { AdoptRequest } from "../shared/vault-adopt";2import { storageGet, storageRemove, storageSet } from "../shared/storage";34export const PENDING_ADOPTION_HOLDER_KEY = "peach_pending_adoption_holder_v1";56export type PendingAdoptionHolder = {7  request: AdoptRequest;8  createdAt: number;9};1011function isHolder(value: unknown): value is PendingAdoptionHolder {12  if (!value || typeof value !== "object") return false;13  const holder = value as Partial<PendingAdoptionHolder>;14  return typeof holder.createdAt === "number" && Number.isFinite(holder.createdAt)15    && !!holder.request && typeof holder.request === "object"16    && typeof (holder.request as Partial<AdoptRequest>).device_id === "string";17}1819export async function persistPendingAdoptionHolder(request: AdoptRequest): Promise<void> {20  await storageSet(PENDING_ADOPTION_HOLDER_KEY, JSON.stringify({ request, createdAt: Date.now() }));21}2223/** Returns null for absent or malformed data; malformed bytes remain for explicit recovery/removal. */24export async function readPendingAdoptionHolder(): Promise<PendingAdoptionHolder | null> {25  const raw = await storageGet(PENDING_ADOPTION_HOLDER_KEY);26  if (!raw) return null;27  try {28    const parsed: unknown = JSON.parse(raw);29    return isHolder(parsed) ? parsed : null;30  } catch {31    return null;32  }33}3435export async function listPendingAdoptionHolders(): Promise<PendingAdoptionHolder[]> {36  const holder = await readPendingAdoptionHolder();37  return holder ? [holder] : [];38}3940export async function removePendingAdoptionHolder(): Promise<void> {41  await storageRemove(PENDING_ADOPTION_HOLDER_KEY);42}4344export const revokePendingAdoptionHolder = removePendingAdoptionHolder;