Advertisement
Guest User

Untitled

a guest
Oct 14th, 2019
154
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import { ApolloLink, Observable, Operation, NextLink, FetchResult } from 'apollo-link';
  2. import { ApolloClient } from 'apollo-client';
  3. import auth from './helpers/auth';
  4. import unwrap from './helpers/unwrap';
  5. import events from './events';
  6.  
  7. export default class AuthLink extends ApolloLink {
  8.   tokenRefreshingPromise: Promise<boolean> | undefined;
  9.  
  10.   client: ApolloClient<{}> | undefined;
  11.  
  12.   injectClient = (client: ApolloClient<{}>): void => {
  13.     this.client = client;
  14.   };
  15.  
  16.   refreshToken = (): Promise<boolean> => {
  17.     if (!this.tokenRefreshingPromise) {
  18.       this.tokenRefreshingPromise = auth.exchangeToken();
  19.     }
  20.     return this.tokenRefreshingPromise;
  21.   };
  22.  
  23.   setTokenHeader = (operation: Operation): void => {
  24.     const { token } = auth;
  25.     if (token) {
  26.       operation.setContext({ headers: { authorization: `Bearer ${token}` } });
  27.     }
  28.   };
  29.  
  30.   request(operation: Operation, forward?: NextLink): Observable<FetchResult> {
  31.     // set token in header
  32.     this.setTokenHeader(operation);
  33.     const next = unwrap(forward);
  34.     // try refreshing token once if it has expired
  35.     return new Observable(observer => {
  36.       let subscription: ZenObservable.Subscription;
  37.       let innerSubscription: ZenObservable.Subscription;
  38.       try {
  39.         subscription = next(operation).subscribe({
  40.           next: observer.next.bind(observer),
  41.           complete: observer.complete.bind(observer),
  42.           error: networkError => {
  43.             if (networkError.statusCode === 401) {
  44.               this.refreshToken()
  45.                 .then(success => {
  46.                   if (success) {
  47.                     // set new token and retry operation
  48.                     this.setTokenHeader(operation);
  49.                     innerSubscription = next(operation).subscribe(observer);
  50.                   } else {
  51.                     // throw error
  52.                     observer.error(new Error('jwt refresh failed'));
  53.                   }
  54.                 })
  55.                 .catch(() => {
  56.                   events.emit('unauthorized');
  57.                 });
  58.             } else {
  59.               observer.error(networkError);
  60.             }
  61.           },
  62.         });
  63.       } catch (e) {
  64.         observer.error(e);
  65.       }
  66.       return () => {
  67.         if (subscription) subscription.unsubscribe();
  68.         if (innerSubscription) innerSubscription.unsubscribe();
  69.       };
  70.     });
  71.   }
  72. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement