collab: незащищённый workspaceRepo.findById в onStoreDocument может потерять финальное сохранение страницы #76

Closed
opened 2026-06-21 02:33:10 +03:00 by Ghost · 0 comments

Найдено в multi-aspect code review всех изменений с коммита 053a9c0d (ветка develop).

Грань: stability · Severity: warning
Где: apps/server/src/collaboration/extensions/persistence.extension.ts:155-157

Проблема
await this.workspaceRepo.findById(...) добавлен в начало onStoreDocument, ВНЕ try/catch транзакции персистенции (начинается на ~строке 198, глотает свои ошибки). Merged ydoc-снапшот уже вычислен в памяти (tiptapJson, строка 123). Если этот lookup упадёт (транзиентная ошибка БД, исчерпание пула, сеть), весь промис onStoreDocument отклонится до записи контента. При unloadImmediately:false + debounce отклонение на финальном unload-store (последний клиент отключился / shutdown) теряет правки этого окна после вытеснения документа из памяти. Подтверждено чтением кода: lookup вне try.

Предлагаемый фикс
Обернуть lookup настроек воркспейса в свой try/catch и fail-closed в "feature disabled": let htmlEmbedEnabled=false; try { htmlEmbedEnabled = isHtmlEmbedFeatureEnabled((await this.workspaceRepo.findById(...))?.settings); } catch (err) { this.logger.warn(...); } — чтобы сбой lookup стрипал embed, а не срывал весь store.

Найдено в multi-aspect code review всех изменений с коммита `053a9c0d` (ветка develop). **Грань:** stability · **Severity:** warning **Где:** `apps/server/src/collaboration/extensions/persistence.extension.ts:155-157` **Проблема** `await this.workspaceRepo.findById(...)` добавлен в начало onStoreDocument, ВНЕ try/catch транзакции персистенции (начинается на ~строке 198, глотает свои ошибки). Merged ydoc-снапшот уже вычислен в памяти (tiptapJson, строка 123). Если этот lookup упадёт (транзиентная ошибка БД, исчерпание пула, сеть), весь промис onStoreDocument отклонится до записи контента. При unloadImmediately:false + debounce отклонение на финальном unload-store (последний клиент отключился / shutdown) теряет правки этого окна после вытеснения документа из памяти. Подтверждено чтением кода: lookup вне try. **Предлагаемый фикс** Обернуть lookup настроек воркспейса в свой try/catch и fail-closed в "feature disabled": `let htmlEmbedEnabled=false; try { htmlEmbedEnabled = isHtmlEmbedFeatureEnabled((await this.workspaceRepo.findById(...))?.settings); } catch (err) { this.logger.warn(...); }` — чтобы сбой lookup стрипал embed, а не срывал весь store.
Ghost closed this issue 2026-06-21 03:02:10 +03:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: vvzvlad/gitmost#76