UNPKG

hmpps-open-layers-map

Version:

A native Web Component for displaying maps using OpenLayers.

48 lines (47 loc) 1.83 kB
// helpers/map.ts export function startTokenRefresh({ tokenUrl, initialExpiresIn, onTokenUpdate, }) { let timer; const CHECK_INTERVAL = 30_000; const MAX_DRIFT = 60_000; let lastChecked = Date.now(); const scheduleRefresh = async () => { try { const { token, expiresIn } = await fetchAccessToken(tokenUrl); onTokenUpdate(token); const refreshDelay = Math.max((expiresIn - 60) * 1000, 10_000); timer = setTimeout(scheduleRefresh, refreshDelay); lastChecked = Date.now(); } catch (err) { console.error('Failed to refresh OS access token:', err); } }; const initialDelay = Math.max((initialExpiresIn - 60) * 1000, 10_000); timer = setTimeout(scheduleRefresh, initialDelay); const detectIdleInterval = setInterval(() => { const now = Date.now(); const drift = now - lastChecked; if (drift > CHECK_INTERVAL + MAX_DRIFT) { console.warn('[map] Detected system sleep or long pause. Forcing early token refresh.'); clearTimeout(timer); scheduleRefresh(); } lastChecked = now; }, CHECK_INTERVAL); return () => { clearTimeout(timer); clearInterval(detectIdleInterval); }; } export async function fetchAccessToken(url) { const response = await fetch(url); if (!response.ok) { throw new Error(`Failed to fetch access token: ${response.statusText}`); } const { access_token: accessToken, expires_in: initialExpiresIn } = await response.json(); const expiresIn = Number(initialExpiresIn); if (!accessToken || Number.isNaN(expiresIn)) { throw new Error(`Invalid access_token or expires_in from token response`); } return { token: accessToken, expiresIn }; }