3.2 KiB
3.2 KiB
Линтинг архива функции — flow (май 2026)
Назначение
Пользователь может загрузить zip-архив с кодом функции. Перед сохранением или после загрузки — архив можно прогнать через линтер, чтобы убедиться что код синтаксически корректен.
Линтинг выполняется на сервере (в Kubernetes), а не на машине пользователя.
Endpoint
POST /console/api/ai/lint-archive
Authorization: X-Auth-Token: <sub>
Content-Type: multipart/form-data
Поле: archive — zip-файл.
Ограничения
- Максимальный размер zip-архива: 100 KB
- Максимальный суммарный размер распакованных файлов: 100 KB (защита от zip bomb)
- При превышении — HTTP 413
Response (200 OK)
{
"ok": true,
"results": [
{"file": "hello.py", "ok": true},
{"file": "bad.js", "ok": false, "output": "SyntaxError: Unexpected token (2:0)"}
]
}
Response (ошибка)
{"error": "архив слишком большой: максимум 100 KB"}
Поддерживаемые языки
| Расширение | Язык | Линтер |
|---|---|---|
.py |
Python | python3 -m py_compile |
.js |
Node.js | node --check |
.rb |
Ruby | ruby -c |
.php |
PHP | php -l |
Файлы с другими расширениями (.json, .txt, .md, .yaml и т.д.) — пропускаются.
Если в архиве нет ни одного поддерживаемого файла — HTTP 400.
Реализация (backend)
Файл: console/internal/api/lint_archive.go
- Архив читается в память (
bytes.Buffer), без записи на диск. - zip открывается через
archive/zip.Readerиз буфера в памяти. - Проверяется суммарный распакованный размер — защита от zip bomb.
- Каждый поддерживаемый файл читается из zip в память.
- Записывается во временный файл в
/dev/shm(RAM-backed tmpfs), fallback —/tmp. - Линтер запускается с таймаутом 10 секунд на файл.
- Временный файл удаляется сразу после линтинга.
- Путь к tmp-файлу скрыт от пользователя в выводе линтера.
Что ещё нужно сделать
- UI: кнопка "Проверить архив" рядом с полем загрузки архива в форме создания функции
- Показывать результаты в UI (список файлов, статус, ошибки)
- Тесты:
scripts/test_fn_archives.sh— добавить вызов lint-archive endpoint