3.3 KiB
3.3 KiB
2026-09-06: Финальная фиксация состояния Слоя 2
Репозиторий
- Проект:
upload-platform. - Основная ветка:
master. - Рабочее дерево на момент фиксации чистое.
- Основной коммит реализации:
112c84f. - Изменения отправлены в
origin/master. - Контрольное состояние сохранено в ветке
checkpoint-layer2-complete, опубликованной в origin.
Реализованное состояние
В upload-platform реализованы и изолированы два API-слоя:
-
Слой 1: File Picker
- Выбор файлов и папок.
- Клиентская распаковка ZIP и вложенных архивов.
- Дедупликация, фильтрация и лимиты.
- Контракт:
picker.getFiles()возвращает плоский список объектов{ path, name, size, file }.
-
Слой 2: Per-file Transit
- Для каждого файла выполняется последовательность
PUTв буфер ВМ ->POST /api/upload_refs-> исходящий потоковыйGETв RAM сессии ->DELETEиз буфера ВМ. - Следующий файл начинает передаваться только после завершения текущего.
- В буфере ВМ одновременно находится не более одного файла.
- Файлы сессии хранятся только в оперативной памяти.
- URL буфера задаются конфигурацией через
vmUploadUrlиvmUploadPrefix; боевые домены не зашиваются в интеграционный код. - Входящие URL проходят SSRF-проверку, имена файлов санитизируются.
- Для будущего Слоя 3 предусмотрен callback
onFileReceived(sid, name, content).
- Для каждого файла выполняется последовательность
Автономный тестовый стенд
site/app.py содержит RAM-only mock WebDAV с операциями PUT, GET, DELETE и маршрутом статуса. Это позволяет тестировать полный транзит без внешней ВМ:
browser -> mock buffer -> upload_refs -> RAM session -> Layer 3 callback.
Проверка
npm run build: успешно.npm test: 9 тестов пройдены.pytest tests/ -v: 10 тестов пройдены.- Итого: 19 тестов, все пройдены.
- Приложение
site/app.pyимпортируется и регистрирует 11 маршрутов.
Версия и документация
- Версия платформы:
0.2.0. - Обновлены
README.mdиupload/README.md. - Техническое задание:
LAYER2-RESUME.md. - Подробный отчёт реализации:
HISTORY/2026-09-06-layer2-implementation-and-tests.md.
Слой 3 в текущую реализацию не входит; он подключается потребляющим сервисом через API сессии и callback-контракт.