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;
}
|