Advertisement
Guest User

Untitled

a guest
Jul 24th, 2019
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import 'fetch-polyfill'
  2. import router from '../router'
  3.  
  4. const jsonHeaders = {
  5.   'Accept': 'application/json, text/plain, */*',
  6.   'Content-Type': 'application/json',
  7. };
  8.  
  9. const getConfig = (path, data, method) => {
  10.   let params = {
  11.     method,
  12.     headers: {...jsonHeaders},
  13.   };
  14.   let url = studio.api + path;
  15.   if (Object.keys(data).length) {
  16.     if (['POST', 'PATCH', 'DELETE'].includes(method)) {
  17.       params.body = JSON.stringify(data)
  18.     } else if (method === 'GET') {
  19.       url = new URL(url);
  20.       Object.keys(data).forEach(key => url.searchParams.append(key, data[key]))
  21.     }
  22.   }
  23.  
  24.   if (studio.token) {
  25.     params.headers.Authorization = 'Bearer ' + studio.token
  26.   }
  27.   return [url, params]
  28. };
  29.  
  30. const retryLater = (path, data, method, timeout = 500) => {
  31.   return new Promise((resolve, reject) => {
  32.     setTimeout(() => {
  33.       studio.request(path, data, method).then(resolve, reject)
  34.     }, timeout)
  35.   })
  36. };
  37.  
  38. const studio = {
  39.   api: '/*THERE IS MY DOMAIN*/',
  40.   refreshToken: sessionStorage.getItem('refreshToken'),
  41.   token: sessionStorage.getItem('token'),
  42.   expiration: sessionStorage.getItem('expiration'),
  43.   request: async (path, data = {}, method = 'POST') => {
  44.  
  45.     if (studio.updatingToken) {
  46.       return retryLater(path, data, method)
  47.     }
  48.  
  49.     if (studio.token) {
  50.       if (Date.now() >= studio.expiration) {
  51.         await studio.updateToken()
  52.       }
  53.     }
  54.  
  55.     const [url, params] = getConfig(path, data, method);
  56.  
  57.     let response, responseJson;
  58.     try {
  59.       response = await fetch(url, params)
  60.     } catch (error) {
  61.       return Promise.reject(error)
  62.     }
  63.  
  64.     if (response.status === 401) {
  65.       await studio.updateToken();
  66.       //   .catch(() => {
  67.       //   router.push({path: '/login'});
  68.       // })
  69.       return retryLater(path, data, method, 0)
  70.     }
  71.  
  72.     try {
  73.       responseJson = await response.json()
  74.     } catch (error) {
  75.       return Promise.reject(error)
  76.     }
  77.  
  78.     if (responseJson && response.status === 400) {
  79.       return Promise.reject(responseJson);
  80.     } else {
  81.       if (isAuthRequest(path) && response.status === 200) {
  82.         saveToken(responseJson);
  83.       }
  84.       return Promise.resolve(responseJson);
  85.     }
  86.   },
  87.  
  88.   updateToken: async () => {
  89.     studio.updatingToken = true;
  90.  
  91.     let response;
  92.     try {
  93.       response = await fetch(studio.api + '/auth/refresh-token', {
  94.         body: JSON.stringify({refreshToken: studio.refreshToken}),
  95.         headers: {...jsonHeaders},
  96.         method: 'POST'
  97.       });
  98.     } catch (error) {
  99.       return Promise.reject()
  100.     }
  101.  
  102.     if (response.status === 400) {
  103.       // rejected, refresh token expired
  104.       router.push({path: '/login'});
  105.       return Promise.reject()
  106.     }
  107.  
  108.     let responseJson = await response.json();
  109.  
  110.     saveToken(responseJson);
  111.     studio.updatingToken = false
  112.   },
  113.  
  114.   updatingToken: false,
  115.  
  116. };
  117.  
  118. const saveToken = (json) => {
  119.   studio.token = json.result.token;
  120.   studio.refreshToken = json.result.refreshToken;
  121.   studio.expiration = getTokenExpiration();
  122.   sessionStorage.setItem('token', studio.token);
  123.   sessionStorage.setItem('refreshToken', studio.refreshToken);
  124.   sessionStorage.setItem('expiration', studio.expiration)
  125. };
  126.  
  127. const getTokenExpiration = () => {
  128.   const date = new Date();
  129.   date.setHours(date.getHours() + 2);
  130.   return date.getTime()
  131. };
  132.  
  133. const expire = () => {
  134.   const date = new Date();
  135.   date.setHours(date.getHours() - 10);
  136.   sessionStorage.setItem('expiration', date.getTime())
  137. };
  138.  
  139. // window.expire = expire;
  140.  
  141. const isAuthRequest = (url) => {
  142.   return ['/auth/login', '/auth/register/extended'].includes(url)
  143. };
  144.  
  145. export default studio
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement