{ // BFCacheを有効にするために、ページ遷移するとき fetch を中断する // ref: https://web.dev/i18n/en/bfcache/#always-close-open-connections-before-the-user-navigates-away let controller = new AbortController(); // BFCacheから復帰したとき、controller が abort されているため、新しい controller を作成する window.addEventListener('pageshow', () => { controller = new AbortController(); }); const update_token = () => { fetch('/auth/token/refresh', { method: 'POST', headers: { 'Content-Type': 'text/plain; charset=UTF-8' }, signal: controller.signal, }).then(); }; // requestIdleCallbackはSafari非対応のため if (typeof requestIdleCallback === 'undefined') { setTimeout(update_token, 1000); } else { requestIdleCallback(update_token, { timeout: 1000 }); } // time interval: 10 minute setInterval(update_token, 600000); // ページ遷移するとき、abort する window.addEventListener('pagehide', () => { controller.abort(); }); };