Use cases/Reset on logout — чистим состояние сервиса
Use cases · 42 流
Reset on logout — чистим состояние сервиса
Паттерн
После logout приложение не должно продолжать получать данные старого пользователя. Все user-specific потоки (интервал обновления нотификаций, WebSocket, кеш профиля) должны остановиться и обнулиться.
Какую проблему решаем
Если оставить старый интервал работающим, после logout он продолжит дёргать API «как Ada», а на экране уже другой пользователь. Или ещё хуже — anonymous экран показывает приватные данные. Императивный cleanup в обработчике logout легко забыть, особенно когда новых сервисов добавляется много.
Операторы и зачем они нужны
switchMap(login => userStream$) — для каждого login создаёт свежий user-specific stream. Новый login автоматически отменит старый.
takeUntil(logout$) — на logout завершает user-specific inner stream.
startWith('anonymous') — задаёт начальное состояние ДО первого login.
Подводные камни
mergeMap вместо switchMap — старый user-stream продолжит жить параллельно новому login. Приватные данные одного пользователя попадут другому.
Сброс только UI без остановки upstream — поздние ответы старого пользователя всё равно дойдут и могут перезаписать новое состояние.
shareReplay-кеши в singleton service надо явно инвалидировать на logout. Без этого они переживут logout.
Что в итоге получаем
Logout атомарно останавливает приватные потоки и возвращает приложение в anonymous-состояние.