arch/realtime-tree: единый restriction-aware emit + единый снапшот move-аудитории (emitTreeEvent дублирует emitCommentEvent; окно гонки на move) #93
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Найдено в multi-aspect code review (грань: architecture, forward-looking, не блокирует мерж).
Область: apps/server/src/ws/ws.service.ts + ws-tree.service.ts
Наблюдение
Правка делает emitTreeEvent (ws.service.ts:82-103) побайтовой копией emitCommentEvent (50-71): идентичный резолв комнаты, кэш-гейт spaceHasRestrictions, hasRestrictedAncestor, fallback. Дополнительно restricted-move путь размазан по 3 методам (broadcastPageMoved → emitToAuthorizedUsers + emitDeleteToUnauthorized): два независимых fetchSockets/getUserIdsWithPageAccess с окном гонки между ними.
Значимость
Forward-looking, низкая вероятность, но высокая цена ровно для целевой угрозы (утечка ограниченного узла). Restriction-routing — тот код, где будущая правка опасна.
Опции
emitRestrictedAwareToSpace(spaceId, pageId, data); comment/tree — тонкие алиасы. Pros: один restriction-гейт. Cons: минимально.Рекомендация
Для concurrency-heavy фичи с целью «не утекать ограниченные узлы» — Option 1 (единый emit) + Option 2 (единый снапшот move-аудитории) делают свойство безопасным конструктивно.
Связанные: #53