Refresh token в Apollo
Парни всем привет, подскажите пожалуйста, не могу разобраться с рефреш токеном в аполло) нашел статью с реализацией, повторил и все работает, но есть моменты которые мне не понятны, хочу их разобраться, не хочу использовать то, что не могу понять) не осуждайте сильно только) оставил комментарии на русском в коде из статьи
import { onError } from 'apollo-link-error';
import { fromPromise } from 'apollo-link';
// ...
let isRefreshing = false;
let pendingRequests = [];
// как рабоает эта функия?
const resolvePendingRequests = () => {
pendingRequests.map(callback => callback());
pendingRequests = [];
};
const errorLink = onError(
({ graphQLErrors, networkError, operation, forward }) => {
if (graphQLErrors) {
for (let err of graphQLErrors) {
switch (err.extensions.code) {
case 'UNAUTHENTICATED':
// error code is set to UNAUTHENTICATED
// when AuthenticationError thrown in resolver
let forward$;
if (!isRefreshing) {
isRefreshing = true;
forward$ = fromPromise(
getNewToken()
.then(({ accessToken, refreshToken }) => {
// Store the new tokens for your auth link
resolvePendingRequests();
return accessToken;
})
.catch(error => {
pendingRequests = [];
// Handle token refresh errors e.g clear stored tokens, redirect to login, ...
return;
})
.finally(() => {
isRefreshing = false;
})
).filter(value => Boolean(value));
} else {
// Will only emit once the Promise is resolved
forward$ = fromPromise( // что делает вот этот блок кода, для чего мы создаем пустой промис и пушим его резолв в массив ожидающих запросов?
new Promise(resolve => {
pendingRequests.push(() => resolve());
})
);
}
return forward$.flatMap(() => forward(operation)); // для чего тут нужен flatMap
}
}
}
if (networkError) {
console.log(`[Network error]: ${networkError}`);
// if you would also like to retry automatically on
// network errors, we recommend that you use
// apollo-link-retry
}
}
);
const apolloLink = concat(errorLink, concat(authLink, httpLink));