feat(pwa): надёжное оповещение об обновлении через version-watch #114

Merged
ant merged 1 commits from feat/pwa-version-watch into dev 2026-06-09 07:06:55 +00:00
Owner

Что и зачем

SW-оповещение об обновлении в desktop (PWA/SSR) не срабатывало в проде. Диагностика: вся цепочка (SW отдаётся корректно, register-service-worker шлёт событие, boot pwa-update показывает тост) собрана верно — но триггер висит на lifecycle service worker'а, который ненадёжен: не пробрасывает событие на iOS standalone PWA, при первой установке шлёт cached вместо updated, и молчит если бинарь SW не изменился.

Решение (фаза «сейчас»)

Развязка детекта обновления от SW. Сравнение версий:

  • запущенная версия = package-версия (CalVer, lockstep lerna), запечена в бандл как process.env.APP_VERSION — она же отображается в UI;
  • доступная версия = self-report SSR-ноды через GET /version (источник истины — сам контейнер фронта, не nginx-файл и не бэкенд);
  • при расхождении — существующий канон-тост (boot pwa-update, событие sw:update-available).

SW оставлен только для кэша/офлайн и применения обновления; applyUpdate сделан устойчивым (есть waiting-SW → SKIP_WAITING→reload, иначе прямой reload).

SPA

Ноды нет → /version отдаёт index.html → клиент видит не-JSON и молча no-op. Приложение не ломается; отображение версии работает (запечена в бандл).

Заложено под микрофронты

Стор useUpdateWatch — реестр компонентов (ключ → {running, available}). Сейчас только shell. Расширения добавятся ключами ext:*: их available придёт из getDesktop-реестра бэкенда, тост — контекстный (только для активного компонента).

Инфра

Codegen не нужен (GraphQL-схему не трогал). /version отдаёт сама нода — правок nginx не требуется.

Generated with Claude Code

## Что и зачем SW-оповещение об обновлении в desktop (PWA/SSR) не срабатывало в проде. Диагностика: вся цепочка (SW отдаётся корректно, register-service-worker шлёт событие, boot pwa-update показывает тост) собрана верно — но триггер висит на lifecycle service worker'а, который ненадёжен: не пробрасывает событие на iOS standalone PWA, при первой установке шлёт cached вместо updated, и молчит если бинарь SW не изменился. ## Решение (фаза «сейчас») Развязка детекта обновления от SW. Сравнение версий: - запущенная версия = package-версия (CalVer, lockstep lerna), запечена в бандл как process.env.APP_VERSION — она же отображается в UI; - доступная версия = self-report SSR-ноды через GET /version (источник истины — сам контейнер фронта, не nginx-файл и не бэкенд); - при расхождении — существующий канон-тост (boot pwa-update, событие sw:update-available). SW оставлен только для кэша/офлайн и применения обновления; applyUpdate сделан устойчивым (есть waiting-SW → SKIP_WAITING→reload, иначе прямой reload). ## SPA Ноды нет → /version отдаёт index.html → клиент видит не-JSON и молча no-op. Приложение не ломается; отображение версии работает (запечена в бандл). ## Заложено под микрофронты Стор useUpdateWatch — реестр компонентов (ключ → {running, available}). Сейчас только shell. Расширения добавятся ключами ext:*: их available придёт из getDesktop-реестра бэкенда, тост — контекстный (только для активного компонента). ## Инфра Codegen не нужен (GraphQL-схему не трогал). /version отдаёт сама нода — правок nginx не требуется. Generated with Claude Code
claude added 1 commit 2026-06-09 06:46:06 +00:00
feat(pwa): надёжное оповещение об обновлении через version-watch
Typecheck / desktop (pull_request) Successful in 15m5s
Typecheck / controller (pull_request) Successful in 13m12s
3ba3a867ad
Заменяет ненадёжный триггер от lifecycle service worker'а (не срабатывал
на iOS standalone PWA, при первой установке и когда бинарь SW не менялся)
на сравнение версий: запечённая в бандл package-версия (process.env.APP_VERSION)
сверяется с self-report SSR-ноды (/version). При расхождении — существующий тост.

- quasar.config: APP_VERSION из package.json в build.env; middleware 'version'
- src-ssr/middlewares/version.ts: self-report /version (JSON, no-store)
- entities/AppVersion: стор useUpdateWatch (реестр компонентов, сейчас shell),
  опрос /version раз в 5 мин + при возврате на вкладку; SPA-safe (нет ноды -> no-op)
- init-app: старт version-watch рядом с systemMonitoring
- register-service-worker: убран SW-триггер; applyUpdate устойчив (waiting -> SKIP_WAITING, иначе reload)
- LeftDrawerMenu: версия приложения в футере рейла

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
claude force-pushed feat/pwa-version-watch from 53095713c4 to 3ba3a867ad 2026-06-09 06:46:06 +00:00 Compare
ant merged commit c05daad8fd into dev 2026-06-09 07:06:55 +00:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: C9S/mono#114