// Freshness never establishes completeness. Immutable ranges are planned by // their coverage owners; these TTLs apply only to mutable source snapshots. export const tbankSourceTtlMs = { membership: 3_600_000, portfolio: 3_600_000, quote: 3_600_000, candleTail: 3_600_000, } as const; export function tbankSourceNeedsRefresh( source: keyof typeof tbankSourceTtlMs, fetchedAt: Date | null, now: Date, force = false, ): boolean { return ( force || !fetchedAt || // eslint-disable-next-line security/detect-object-injection -- The key is a member of the closed TbankSource union. now.valueOf() - fetchedAt.valueOf() >= tbankSourceTtlMs[source] ); }