Добавить максимальную глубину вложенности для сворачиваемых деталей

Хотел бы предложить установить максимальную глубину вложенности для встроенной функции [details] или ввести настройку сайта, позволяющую администраторам настраивать этот лимит.

Проблема

Недавно пользователь на моём форуме Discourse создал сообщение, содержащее 24 уровня вложенных секций [details].

Это привело к нескольким проблемам:

  1. Производительность браузера: Пользователи сообщали, что раскрытие нескольких уровней приводило к тому, что Firefox становился крайне медленным или переставал реагировать.
  2. Тайм-ауты Markdown-эндпоинта: Доступ к эндпоинту .md темы стал крайне медленным. Мы наблюдали запросы, занимавшие 19,8 и 31,1 секунды.
  3. Ошибки сервера: Эндпоинт Markdown иногда возвращал страницу ошибки «Oops». В логах Discourse также появлялись предупреждения о тайм-аутах воркеров Pitchfork во время конвертации Markdown.
  4. Потенциальное истощение ресурсов: Поскольку поисковые системы и ИИ-краулеры часто запрашивают эндпоинты .md, сообщение с глубокой вложенностью могло многократно запускать ресурсоёмкую обработку и потреблять ресурсы сервера.

После удаления проблемного сообщения эндпоинт Markdown возвращал HTTP 200 и отвечал примерно за 1,7 секунды.

Затронутая тема:

https://meta.appinn.net/t/topic/87672

(Проблемный ответ уже удалён.)

Предлагаемое улучшение

Я считаю, что было бы полезно либо:

  • Ограничить вложенность [details] разумной глубиной, например 2 или 3 уровнями.
  • Добавить настройку сайта, такую как details_max_nesting_depth, позволяющую администраторам настраивать максимальную глубину вложенности.

Для обратной совместимости значение по умолчанию для этой настройки может быть установлено как «без ограничений», при этом администраторы смогут устанавливать лимит при необходимости.

Если пользователи превышают настроенный лимит, Discourse может отклонять сообщение с ясным сообщением об ошибке валидации.

Временное решение: плагин

Я создал небольшой плагин, который ограничивает вложенность [details] максимум 2 уровнями:

GitHub - scavin/discourse-details-depth-limit · GitHub

Плагин выполняет валидацию сообщений на стороне сервера и отклоняет сообщения, содержащие более двух уровней вложенных сворачиваемых секций.

Я успешно протестировал его в своей локальной среде разработки Discourse.

Для администраторов, сталкивающихся с аналогичными проблемами, этот плагин может служить временным решением до появления официального решения.

Я считаю, что настраиваемый лимит во встроенном плагине Details будет полезной мерой предосторожности против случайной или чрезмерной вложенности.

2 лайка