3.9 KiB
Ответ Sonnet по архитектуре
Важная поправка к вводным
Промпт устарел относительно реального кода.
zip/list_zip_files.jsне использует глобальнуюfflate— реально вызываетparseZip()изparse_zip.js, собственный ZIP-парсер без внешних зависимостей.- Защита от path traversal и лимит вложенности 20 реальны, но находятся в
list_zip_files.js(safeEntryParts,depth), а не в парсинге черезfflate. index.html:37всё ещё грузитstatic/vendor/fflate.min.jsс комментарием «ZIP-парсер использует global fflate» — это мёртвый код и ложный комментарий,fflateфактически не импортируется.- В
add_file_with_dedup.jsесть логикаmaxFileBytes/maxSessionBytes, ноconfig.jsonсодержит толькоallowedExt; лимиты сейчас нигде не задаются, код неактивен.
1. Архитектура
Направление верное: initFilePicker(config) с построением DOM внутри, конфигом для allowedExt/labels/layout, onChange и destroy соответствует цели «одна строка встраивания».
Переусложнение: бандл esbuild/rollup с вшитым fflate решает несуществующую проблему. Внешней зависимости fflate в JS-коде нет, есть только мёртвый script-тег. Нужен клинап, а не сборка ради вшивания отсутствующей зависимости.
Реальные жёсткие связи:
- абсолютный путь импорта
/upload-frontend/...; - захардкоженные подписи в
<thead>.
2. Более простой вариант
Оставить ES-модули без сборщика. Добавить в конфиг basePath или import map вместо хардкода /upload-frontend/..., чтобы интегратор (drhider) мог использовать произвольный route.
Подписи и колонки вынести в labels/layout.
Отдельно удалить мёртвый fflate script-тег и неактивные maxFileBytes/maxSessionBytes, если они не используются picker-only конфигом.
3. Custom Element
Бандл не нужен. Custom Element пока не делать: для единственного известного интегратора (drhider) достаточно фабричной функции.
Custom Element имеет смысл добавить при появлении второго реального потребителя, которому нужен декларативный <file-picker>.
4. Риски
- Главный риск — план основан на неверной предпосылке о глобальной
fflate-зависимости. - Нужно проверить защиту от ZIP-бомб:
parse_zip.jsразбирает central directory и делаетinflateRawбез очевидной проверки итогового размера entry. - Совместимость с managed Flask (
drhider) реально блокируется абсолютным route/upload-frontend/...; это главная связь для исправления.
Краткий вывод
Начать с basePath/import map, конфигурируемых labels/layout и удаления мёртвого fflate/неактивных лимитов. Не добавлять пока сборщик и Custom Element.