fix(offline): address PR #120 review (cross-user leak, Yjs title dup, i18n, docs, guards)
Security: - Clear the offline IndexedDB cache on sign-in (not only logout) so a previous user's persisted query cache and Yjs page bodies cannot leak to the next user on a shared device when the prior session ended without an explicit logout. Regressions: - Remove the double Yjs title write from the AI title-generation path: the title editor is bound to the Yjs `title` fragment and the server REST update reseeds it, so the local setContent raced that reseed and doubled/garbled the title. Conventions / i18n / docs: - Remove the unused showAiMenuAtom. - Register the 3 offline-fallback strings in en-US and ru-RU. - Fix the 5 broken links to the nonexistent docs/offline-sync-plan.md. Stability / simplification: - warmInfiniteAll now reports truncation (returns false) when it hits maxPages with a cursor still pending instead of silently succeeding. - space-tree make-offline catch logs the raw error and surfaces the real cause. - Move the Offline/Mobile/CORS CHANGELOG entries from the released 0.93.0 section into [Unreleased] (CORS is a documented breaking change). - Drop the pass-through sync-flag forwarders in use-page-collab-providers; set the atoms directly. - Collapse the three isSwaggerEnabled true-cases into it.each. Tests / architecture: - Extract collabTokenNeedsRefresh (pure) and cover all four token states. - Extract shouldPropagateTitleChange and cover the collab-origin skip; add a TitleEditor render test for the static-h1 vs collaborative-editor switch. - Add a use-auth test asserting the sign-in cache purge runs before login. - Add an OFFLINE_PERSIST_ROOTS guard test asserting every persisted root maps to an exported query-key factory; route make-offline's currentUser warm through a new userKeys factory. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -31,9 +31,9 @@
|
||||
нативную оболочку (iOS + Android из одного кода), добавить нативные плагины
|
||||
(push, биометрия, share, файлы). Эволюция в гибрид (нативная навигация +
|
||||
WebView-редактор) делается потом инкрементально, без переписывания.
|
||||
6. **Оффлайн-будущее уже заложено** (Yjs + `y-indexeddb`). Детальный план —
|
||||
в [offline-sync-plan.md](offline-sync-plan.md); мобильное приложение этот
|
||||
план переиспользует, а не дублирует.
|
||||
6. **Оффлайн-будущее уже заложено** (Yjs + `y-indexeddb`). Детальный план
|
||||
оффлайн-синхронизации (этапы M0…M4) ведётся отдельно; мобильное приложение
|
||||
этот план переиспользует, а не дублирует.
|
||||
7. **Главный блокер — не технический, а лицензионный.** AGPL форка несовместима
|
||||
с условиями App Store, если зашивать веб-клиент в бинарник: DRM/usage-rules
|
||||
Apple = «дополнительные ограничения», запрещённые AGPLv3 §10. Развязки —
|
||||
@@ -133,8 +133,8 @@
|
||||
одновременно, без второй команды.
|
||||
- Адаптивная вёрстка уже есть (см. §2.3) — переверстывать под телефон с нуля
|
||||
не нужно; работа смещается в нативную обвязку.
|
||||
- Оффлайн-будущее подготовлено (Yjs + `y-indexeddb`); см.
|
||||
[offline-sync-plan.md](offline-sync-plan.md).
|
||||
- Оффлайн-будущее подготовлено (Yjs + `y-indexeddb`); оффлайн-синхронизация
|
||||
ведётся отдельным планом (этапы M0…M4).
|
||||
- Когда упрётесь в UX отдельных экранов — их по одному выносят в нативную
|
||||
оболочку, оставив редактор в WebView. То есть B → C делается инкрементально.
|
||||
|
||||
@@ -322,7 +322,7 @@ aggregation» — не катит: зашитый бандл это комбин
|
||||
копия и автослияние правок работают, в том числе в WebView.
|
||||
- «Полностью онлайн» — это всё вокруг тела (навигация, заголовки, комментарии,
|
||||
CRUD, вложения, авторизация). Их оффлайн-синхронизация описана отдельным
|
||||
планом с этапами M0…M4 — см. [offline-sync-plan.md](offline-sync-plan.md).
|
||||
планом с этапами M0…M4.
|
||||
- Мобильное приложение **переиспользует** этот план, а не строит оффлайн заново.
|
||||
Нюанс Android: System WebView под нехваткой места может чистить хранилище →
|
||||
для оффлайна, возможно, понадобится дублировать критичные данные в нативное
|
||||
@@ -338,7 +338,7 @@ aggregation» — не катит: зашитый бандл это комбин
|
||||
Keystore + Bearer (рекомендуется) или попытка работать через cookie в WebView?
|
||||
- **Q3.** Push: APNs + FCM сразу или iOS-first?
|
||||
- **Q4.** Подключать ли OpenAPI/Swagger для генерации мобильного клиента?
|
||||
- **Q5.** Когда включать оффлайн (M0…M4 из offline-sync-plan.md) относительно
|
||||
- **Q5.** Когда включать оффлайн (этапы M0…M4) относительно
|
||||
первого мобильного релиза?
|
||||
- **Q6.** iOS-дистрибуция при AGPL (§9): App Store через `server.url`
|
||||
(онлайн-клиент, без зашитого AGPL), PWA или sideload/EU-маркетплейсы? Этот
|
||||
|
||||
@@ -20,8 +20,8 @@ mobile app for Gitmost, per the first-step checklist in
|
||||
as `NetworkOnly` — offline reads are served by the persisted TanStack Query
|
||||
cache (IndexedDB) and `y-indexeddb` for the page Yjs doc, not by an SW HTTP
|
||||
cache. This lets the existing responsive web UI be installed and run as a
|
||||
Progressive Web App. See [docs/offline-sync-plan.md](./offline-sync-plan.md) for
|
||||
the full offline/sync design.
|
||||
Progressive Web App. The offline/sync design (stages M0…M4) is summarized in
|
||||
[mobile-app-plan.md](./mobile-app-plan.md).
|
||||
- **Backend mobile auth**: opt-in token return from the login flow. The login
|
||||
request accepts a `returnToken` flag (must be sent as a JSON boolean) that makes
|
||||
the server include the auth token in the response body, and the server already
|
||||
|
||||
Reference in New Issue
Block a user