SHARE
TWEET

Untitled

a guest Sep 16th, 2019 90 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import { onError } from 'apollo-link-error';
  2. import { Observable } from 'apollo-link';
  3.  
  4. import { buildAuthHeader } from 'utils/requests';
  5. import { getProvider as getGlobalProvider } from 'GlobalState';
  6.  
  7. let isFetchingToken = false;
  8. let tokenSubscribers = [];
  9. function subscribeTokenRefresh(cb) {
  10.   tokenSubscribers.push(cb);
  11. }
  12. function onTokenRefreshed(err) {
  13.   tokenSubscribers.map(cb => cb(err));
  14. }
  15.  
  16. /* eslint-disable consistent-return */
  17. const refreshAuthTokenLink = () =>
  18.   onError(
  19.     ({ graphQLErrors, networkError, operation, response, forward }) =>
  20.       new Observable(async observer => {
  21.         if (graphQLErrors) {
  22.           graphQLErrors.map(async ({ extensions }, index) => {
  23.             switch (extensions.code) {
  24.               case 'UNAUTHENTICATED': {
  25.                 const retryRequest = () => {
  26.                   operation.setContext({
  27.                     headers: {
  28.                       ...headers,
  29.                       Authorization: buildAuthHeader(
  30.                         globalProvider.authAccessToken(),
  31.                       ).Authorization,
  32.                     },
  33.                   });
  34.  
  35.                   const subscriber = {
  36.                     next: observer.next.bind(observer),
  37.                     error: observer.error.bind(observer),
  38.                     complete: observer.complete.bind(observer),
  39.                   };
  40.  
  41.                   return forward(operation).subscribe(subscriber);
  42.                 };
  43.  
  44.                 const { headers } = operation.getContext();
  45.                 const globalProvider = await getGlobalProvider();
  46.  
  47.                 if (!isFetchingToken) {
  48.                   isFetchingToken = true;
  49.  
  50.                   try {
  51.                     await globalProvider.refreshAccessTokenReq();
  52.  
  53.                     isFetchingToken = false;
  54.                     onTokenRefreshed(null);
  55.                     tokenSubscribers = [];
  56.  
  57.                     return retryRequest();
  58.                   } catch (e) {
  59.                     onTokenRefreshed(
  60.                       new Error('Unable to refresh access token'),
  61.                     );
  62.  
  63.                     tokenSubscribers = [];
  64.                     isFetchingToken = false;
  65.  
  66.                     await globalProvider.logOut({ isForced: true });
  67.                     return observer.error(graphQLErrors[index]);
  68.                   }
  69.                 }
  70.  
  71.                 const tokenSubscriber = new Promise(resolve => {
  72.                   subscribeTokenRefresh(errRefreshing => {
  73.                     if (!errRefreshing) return resolve(retryRequest());
  74.                   });
  75.                 });
  76.  
  77.                 return tokenSubscriber;
  78.               }
  79.               default:
  80.                 return observer.next(response);
  81.             }
  82.           });
  83.         }
  84.  
  85.         if (networkError) {
  86.           return observer.error(networkError);
  87.         }
  88.       }),
  89.   );
  90.  
  91. export default refreshAuthTokenLink;
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top