Press n or j to go to the next uncovered block, b, p or k for the previous block.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | 1x | import { decodeJwt } from 'jose'; import moize from 'moize'; export function parseJwtExp(accessToken: string) { const { exp } = decodeJwt(accessToken); if (!exp) throw Error('JWT exp is undefined. except type is string'); return exp; } declare global { interface Window { flutter_inappwebview: any; } } function originalGetNewAccessToken(prevToken: string): Promise<string | null> { window.flutter_inappwebview.callHandler('mobile_refreshToken', []); return new Promise((resolve) => { (function recursive() { const accessToken = window.localStorage.getItem('Realworld.accessToken'); if (!accessToken || prevToken === accessToken) { setTimeout(recursive); } else { resolve(accessToken); } })(); }); } export const getNewAccessToken = moize(originalGetNewAccessToken, { isPromise: true, maxAge: 5000 }); export async function mobileInterceptRequest(config: any) { let token: string | undefined; try { const accessToken = window.localStorage.getItem('Realworld.accessToken'); if ( !accessToken || Date.parse(new Date(parseJwtExp(accessToken) * 1000).toISOString()) - 60 * 1000 < Date.now() ) { const refreshed = await getNewAccessToken(accessToken || ''); if (!refreshed) { throw new Error('No token'); } token = refreshed; } else { token = accessToken; } } catch (e) { alert('계정 오류! 게임을 재시작 해 주세요!'); } config.headers.Authorization = `Bearer ${token}`; return config; } |