All files / lib/apis index.ts

4.34% Statements 1/23
0% Branches 0/14
0% Functions 0/5
4.54% Lines 1/22

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