Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import 'fetch-polyfill'
- import router from '../router'
- const jsonHeaders = {
- 'Accept': 'application/json, text/plain, */*',
- 'Content-Type': 'application/json',
- };
- const getConfig = (path, data, method) => {
- let params = {
- method,
- headers: {...jsonHeaders},
- };
- let url = studio.api + path;
- if (Object.keys(data).length) {
- if (['POST', 'PATCH', 'DELETE'].includes(method)) {
- params.body = JSON.stringify(data)
- } else if (method === 'GET') {
- url = new URL(url);
- Object.keys(data).forEach(key => url.searchParams.append(key, data[key]))
- }
- }
- if (studio.token) {
- params.headers.Authorization = 'Bearer ' + studio.token
- }
- return [url, params]
- };
- const retryLater = (path, data, method, timeout = 500) => {
- return new Promise((resolve, reject) => {
- setTimeout(() => {
- studio.request(path, data, method).then(resolve, reject)
- }, timeout)
- })
- };
- const studio = {
- api: '/*THERE IS MY DOMAIN*/',
- refreshToken: sessionStorage.getItem('refreshToken'),
- token: sessionStorage.getItem('token'),
- expiration: sessionStorage.getItem('expiration'),
- request: async (path, data = {}, method = 'POST') => {
- if (studio.updatingToken) {
- return retryLater(path, data, method)
- }
- if (studio.token) {
- if (Date.now() >= studio.expiration) {
- await studio.updateToken()
- }
- }
- const [url, params] = getConfig(path, data, method);
- let response, responseJson;
- try {
- response = await fetch(url, params)
- } catch (error) {
- return Promise.reject(error)
- }
- if (response.status === 401) {
- await studio.updateToken();
- // .catch(() => {
- // router.push({path: '/login'});
- // })
- return retryLater(path, data, method, 0)
- }
- try {
- responseJson = await response.json()
- } catch (error) {
- return Promise.reject(error)
- }
- if (responseJson && response.status === 400) {
- return Promise.reject(responseJson);
- } else {
- if (isAuthRequest(path) && response.status === 200) {
- saveToken(responseJson);
- }
- return Promise.resolve(responseJson);
- }
- },
- updateToken: async () => {
- studio.updatingToken = true;
- let response;
- try {
- response = await fetch(studio.api + '/auth/refresh-token', {
- body: JSON.stringify({refreshToken: studio.refreshToken}),
- headers: {...jsonHeaders},
- method: 'POST'
- });
- } catch (error) {
- return Promise.reject()
- }
- if (response.status === 400) {
- // rejected, refresh token expired
- router.push({path: '/login'});
- return Promise.reject()
- }
- let responseJson = await response.json();
- saveToken(responseJson);
- studio.updatingToken = false
- },
- updatingToken: false,
- };
- const saveToken = (json) => {
- studio.token = json.result.token;
- studio.refreshToken = json.result.refreshToken;
- studio.expiration = getTokenExpiration();
- sessionStorage.setItem('token', studio.token);
- sessionStorage.setItem('refreshToken', studio.refreshToken);
- sessionStorage.setItem('expiration', studio.expiration)
- };
- const getTokenExpiration = () => {
- const date = new Date();
- date.setHours(date.getHours() + 2);
- return date.getTime()
- };
- const expire = () => {
- const date = new Date();
- date.setHours(date.getHours() - 10);
- sessionStorage.setItem('expiration', date.getTime())
- };
- // window.expire = expire;
- const isAuthRequest = (url) => {
- return ['/auth/login', '/auth/register/extended'].includes(url)
- };
- export default studio
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement