Advertisement
Guest User

Untitled

a guest
Sep 16th, 2019
154
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.82 KB | None | 0 0
  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;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement