Size: a a a

JavaScript.Ninja

2020 July 11

AS

Azat S. in JavaScript.Ninja
Привет!

Кто-нибудь реализовывал обновление токена, если тот протух в Apollo?

Можно ли это реализовать на уровне apollo-link-error? Или это как-то иначе делать стоит?
источник

AS

Azat S. in JavaScript.Ninja
Абстрактный пример кода:

const errorLink = onError(
 ({ graphQLErrors, networkError, operation, forward }) => {
   const refreshToken = () => {
     // Необходимо выполнить этот запрос в случае ошибки,
     // если токен протух
     const refreshTokenQuery = ({
       query: gql`mutation($fingerprint: String!) {
         updateToken(fingerprint: $fingerprint) {
           token
           refreshToken
         }
       }`,
       variables: {
         fingerprint,
       },
     })
   }
   const checkGraphQLErrors = unless(
     isNil,
     forEach(({ extensions: { code } }) => {
       // Если получаем ошибку UNAUTHENTICATED, вызываем
       // функцию выше
       return (
         equals('UNAUTHENTICATED', code) &&
         promiseToObservable(refreshToken()).flatMap(() => forward(operation))
       )
     }),
   )
   checkGraphQLErrors(graphQLErrors)
 },
)
источник

DS

Denis Sakharov in JavaScript.Ninja
Azat S.
Абстрактный пример кода:

const errorLink = onError(
 ({ graphQLErrors, networkError, operation, forward }) => {
   const refreshToken = () => {
     // Необходимо выполнить этот запрос в случае ошибки,
     // если токен протух
     const refreshTokenQuery = ({
       query: gql`mutation($fingerprint: String!) {
         updateToken(fingerprint: $fingerprint) {
           token
           refreshToken
         }
       }`,
       variables: {
         fingerprint,
       },
     })
   }
   const checkGraphQLErrors = unless(
     isNil,
     forEach(({ extensions: { code } }) => {
       // Если получаем ошибку UNAUTHENTICATED, вызываем
       // функцию выше
       return (
         equals('UNAUTHENTICATED', code) &&
         promiseToObservable(refreshToken()).flatMap(() => forward(operation))
       )
     }),
   )
   checkGraphQLErrors(graphQLErrors)
 },
)
Я делал примерно такую же обработку + дополнительный линк на получение токена в случае если кука с токеном протухла/исчезла, но рефреш токен остался
источник
2020 July 12

AS

Azat S. in JavaScript.Ninja
Denis Sakharov
Я делал примерно такую же обработку + дополнительный линк на получение токена в случае если кука с токеном протухла/исчезла, но рефреш токен остался
Понял. Я пока что единственное, что надумал, как решить проблему, это разобрать access Token, и через таймаут запрашивать новый. Типа компонент такой с сайлент апдейтом
источник

AS

Azat S. in JavaScript.Ninja
Azat S.
Понял. Я пока что единственное, что надумал, как решить проблему, это разобрать access Token, и через таймаут запрашивать новый. Типа компонент такой с сайлент апдейтом
Ну а при 401 логаут
источник

DS

Denis Sakharov in JavaScript.Ninja
Azat S.
Понял. Я пока что единственное, что надумал, как решить проблему, это разобрать access Token, и через таймаут запрашивать новый. Типа компонент такой с сайлент апдейтом
Не совсем понял зачем тайм-аут
источник

DS

Denis Sakharov in JavaScript.Ninja
Можно разобрать при получении, узнать срок протухания и записать куку с этим сроком. Если перед запросом кука пропадёт, то в линке запросить токен заново. Минимум движений и максимум пользы ))
источник

AS

Azat S. in JavaScript.Ninja
Denis Sakharov
Не совсем понял зачем тайм-аут
Ну типа я получаю токена. Разбираю. Узнаю время протухания в поле exp. Выставляю таймаут и к моменту протухания запрашиваю заново
источник

DS

Denis Sakharov in JavaScript.Ninja
Azat S.
Ну типа я получаю токена. Разбираю. Узнаю время протухания в поле exp. Выставляю таймаут и к моменту протухания запрашиваю заново
Рабочая схема. Правда мне кажется это сложнее, чем проверять состояние токена перед каждым запросом
источник

V

Valentin in JavaScript.Ninja
Azat S.
Ну типа я получаю токена. Разбираю. Узнаю время протухания в поле exp. Выставляю таймаут и к моменту протухания запрашиваю заново
нет, проверяй перед каждым запросом
источник

S

Subaru in JavaScript.Ninja
источник

VS

Vitaliy Stoliarov in JavaScript.Ninja
Azat S.
Понял. Я пока что единственное, что надумал, как решить проблему, это разобрать access Token, и через таймаут запрашивать новый. Типа компонент такой с сайлент апдейтом
В идеале лучше при получении по любому из запросов ответа  "token is expired" получать токен заново и повторять запрос. Это хорошо ложится на Rx.js, но не подскажу насчёт других готовых решений
источник

DS

D S in JavaScript.Ninja
Всем привет. Подскажите - начал работать в проекте на React, проекту два года. Как можно его «померить» проверить, что компоненты работают эффективно. Какие есть инструменты для этого?
источник

A

A A in JavaScript.Ninja
D S
Всем привет. Подскажите - начал работать в проекте на React, проекту два года. Как можно его «померить» проверить, что компоненты работают эффективно. Какие есть инструменты для этого?
Сам еще не матерый, но надо наверное начать с размера чанок. Поставь bundle-analyzer, замерь в Profilere время загрузки
источник

DS

D S in JavaScript.Ninja
A A
Сам еще не матерый, но надо наверное начать с размера чанок. Поставь bundle-analyzer, замерь в Profilere время загрузки
Ок. Thx. Ещё что-то?
источник

A

A A in JavaScript.Ninja
D S
Ок. Thx. Ещё что-то?
Тебе именно быстродействие?
источник

DS

D S in JavaScript.Ninja
И его тоже
источник

A

A A in JavaScript.Ninja
Начни с блок схемы, раздели роуты, основные компоненты, бизнес логику, стейт менеджер и что там хранится. Может быть обращение в стор в некоторых местах и не нужен вовсе. Может в классовых компонентах из стейта только isToggled, тогда есть смысл переписать на функциональный компонент. Но это уже частные случаи)
источник

A

A A in JavaScript.Ninja
Если в проекте много hoc, имеет смысл зарефакторить, т.к. это влияет на производительность. На старых проектах наверняка есть отдельная папка HOCs =)))
источник

DS

D S in JavaScript.Ninja
Спасибо.. а есть инструменты проверить производительность до и после рефакторинга
источник