Как общаться между вкладками браузера js?

Здравствуйте, у меня есть необходимость синхронизировать обновление access токена между вкладками, так как когда токен будет обновлен, и этот токен попытается обновить другая вкладка, сервер ответ что refresh токен был не найден.

Я пробывал использовать синхронизацию через localStorage и window.postMessage, но это не сработало в моем случае.
Так как у меня несколько вкладок могут начать обновлять токен одновременно, и тогда начинаются проблемы.

Первая вкладка проверяет в localStorage обновляет токен, в ответе isLoading = false. Вторая вкладка тоже в это время проверяет, и isLoading = false. В итоге обе вкладки отправит запросы для обновления токена на сервер, один токен обновится, а во второй вкладке ответ от сервера будет 404, и тогда либо делать редирект на страницу аутентификации, либо выводишь ошибку и просить повторить попытку.

Нужно что бы хранилище было однопоточное, что если будет отправлено одновременно 2 запроса, то сначала обработается первый запрос, затем только следующий.

Как можно реализовать это, какое хранилище можно использовать?
  • Вопрос задан
  • 1161 просмотр
Решения вопроса 1
profesor08
@profesor08 Куратор тега JavaScript
https://developer.mozilla.org/ru/docs/Web/API/Wind...

Получаешь токен, пихаешь в localStorage, при этом все остальные вкладки получают событие storage. А значит, просто слушая этот ивент, ты сможешь обновить токен где тебе надо, на всех вкладках.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@rPman
в похожей ситуации я реализовывал семафор следующим способом
if(localstorage['имя_семафора']++>1)
{ // значит этот семафор уже кто то занял,
  localstorage['имя_семафора']--;
  //  ждем некоторое время и повторяем попытку
}  else
{ // никто семафор не занял можно работать
  ...
  // по окончанию работы семафор надо освободить
  localstorage['имя_семафора']--;
}
смысл в том что localstorage[]++ это атомарная операция (вот в этом месте я скорее всего не прав), а благодаря тому что единственная опасная операция, которая могла бы вклиниться между работай с localstorage и if - это --, и она проихойдет когда семафор и так должен освободиться, т.е. проблем это не создаст.

p.s. почему говорю семафор а не мьютекс, потому что можно сравнивать не только с 1 но и большим числом - это определит, сколько одновременно можно ресурс занимать
p.p.s. в интернете гуляет реализацию мьютекс на javascrit как раз на localstorage но она какая то переусложненная и я не понимаю зачем
если кто то по умнее, объясните пожалуйста
Ответ написан
Комментировать
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы