- storage-without-pocketbase закрыта как реализованная: приёмка сошлась по всем
пяти критериям записи и по двенадцати приёмочным свойствам рубрики ревью
дизайна, работа лежит коммитом c9b7765
- урожай триажа ревью развёрнут в одиннадцать записей с тегом партии
review-2026-08-23 и расставлен по зависимости, а не в конец списка
- находка про признак живости воркера слита в stalled-pipeline-metric: у неё та
же причина — вставший конвейер неотличим от простоя
3.6 KiB
3.6 KiB
🧹 Отдавать файл записи через http.ServeContent
- Тип: chore
- Категория: Очередь — Стандартная семантика диапазонов нужна проигрыванию записи на экране: браузер тянет звук именно диапазонами
- Зачем: Отдача файла считает диапазоны байт своей рукой — около 110 строк семантики HTTP, которую стандартная библиотека делает сама, и на этих строках стоит проигрывание записи на экране.
- Теги: review-2026-08-23
Отдача файла записи разбирает заголовок Range, считает границы, ставит
Content-Range и код 206 своей рукой — около 110 строк семантики HTTP.
http.ServeContent делает то же самое: диапазоны, If-Range, Last-Modified,
ETag, неверный диапазон с кодом 416.
Своя реализация стоит не тем, что длиннее, а тем, что расходится: браузер
проигрывает звук именно диапазонами, и задача play-recording-in-app встанет
поверх этих строк.
Нашёл проход review-architecture (вторая половина R2) ревью change
2026-08-23-storage-without-pocketbase.
Затрагивает
internal/controller/http/file.go— разборRange, ответ206и заголовки диапазона;- тип содержимого ответа: он выводится из закрытого перечня форматов и остаётся
за нами,
ServeContentего не выбирает; - открытие копии в
internal/adapter/repo/sqlite/store.go—ServeContentтребуетio.ReadSeekerи время последнего изменения; - публичный контракт HTTP: коды
200,206,416и заголовки ответа на запрос файла.
Критерии приёмки
- Диапазоны считает стандартная библиотека. Оракул:
grepпоinternal/controller/http— ни одного разбора заголовкаRangeруками, вызовhttp.ServeContentодин. - Ответы на диапазон не изменились. Оракул: тест контроллера — запрос без
Rangeотдаёт200и всю длину, запросbytes=0-99отдаёт206сContent-Range, запрос за пределом длины отдаёт416. - Тип содержимого по-прежнему выбирает сервис. Оракул: тест на записи с
расширением
.html— ответ несётapplication/octet-streamиattachment, а не тип из имени. - Чужой файл остаётся недостижимым. Оракул: прежний тест владения — чужая и несуществующая запись отвечают байт в байт одинаково.
Рамки
Раскладку каталога данных и имена копий не трогаем: она объявлена необратимой. Ответ на запрос чужого файла не меняется ни кодом, ни телом.