export const DEFAULT_SESSION_RENEW_THRESHOLD_MS = 10 * 60 * 1000; export const DEFAULT_SESSION_RENEW_THROTTLE_MS = 30 * 1000; export type SessionRenewDecisionParams = { expiresAtSec?: number | null; nowMs: number; isEnabled: boolean; isAuthenticated: boolean; isLoading: boolean; isRenewInFlight: boolean; lastAttemptAtMs: number; thresholdMs?: number; throttleMs?: number; }; function hasRenewPreconditions({ isAuthenticated, isLoading, isRenewInFlight, }: SessionRenewDecisionParams) { return isAuthenticated && !isLoading && !isRenewInFlight; } function isRenewWindowOpen({ expiresAtSec, nowMs, lastAttemptAtMs, thresholdMs = DEFAULT_SESSION_RENEW_THRESHOLD_MS, throttleMs = DEFAULT_SESSION_RENEW_THROTTLE_MS, }: SessionRenewDecisionParams) { if (typeof expiresAtSec !== "number") { return false; } const remainingMs = expiresAtSec * 1000 - nowMs; if (remainingMs <= 0 || remainingMs > thresholdMs) { return false; } if (nowMs - lastAttemptAtMs < throttleMs) { return false; } return true; } export function shouldAttemptSlidingSessionRenew( params: SessionRenewDecisionParams, ) { if (!params.isEnabled || !hasRenewPreconditions(params)) { return false; } return isRenewWindowOpen(params); } export function shouldAttemptUnlimitedSessionRenew( params: SessionRenewDecisionParams, ) { if (params.isEnabled || !hasRenewPreconditions(params)) { return false; } return isRenewWindowOpen(params); }