Osteon

API

Объектное хранилище

Единое пространство имён /api/v3/objects/ для наборов параметров, метаданных плит и передачи крупных объектов. Читающая часть открыта и не требует ключа.

Хранилище развёрнуто на двух узлах с одинаковым пространством имён. Узел solanaceae.top принимает запись, узел pi.solanaceae.top отдаёт чтение крупных объектов. Такое разнесение направлений сделано из-за асимметрии нагрузки: исходящий поток плит на порядок больше входящего потока результатов рендера, и держать их на одном хосте невыгодно.

Чтение метаданных

Ответы — обычный JSON, без пагинации и без авторизации. Кэширование обычное, по ETag.

ЗапросЧто возвращает
GET /api/v3/objects/index.jsonперечень всех объектов узла с типами и датами
GET /api/v3/objects/model-<slug>.jsonопределение семейства моделей: параметры, диапазоны, значения по умолчанию
GET /api/v3/objects/plate-<id>.jsonметаданные плиты, наборы параметров фигур, ссылки на растровые производные
GET /api/v3/objects/sequence-<id>.jsonметаданные покадровой последовательности
$ curl -s https://solanaceae.top/api/v3/objects/model-femur.json | head -20

Передача крупных объектов

Плиты в полном разрешении, тайловые пирамиды и наборы для выгрузки передаются не одним запросом, а последовательностью фрагментов в рамках сессии. Точка входа — /api/v3/objects/stream/.

Сессия обозначается параметром sid: это идентификатор, который клиент генерирует сам перед первым запросом и не меняет до конца передачи. Порядковый номер фрагмента передаётся в r и монотонно растёт; повтор запроса с тем же r идемпотентен, что позволяет продолжить прерванную передачу с любого места.

Метод и путьНаправлениеУзел
POST /api/v3/objects/stream/?sid=<id>&r=<n>клиент → хранилищеsolanaceae.top
GET /api/v3/objects/stream/?sid=<id>&r=<n>хранилище → клиентpi.solanaceae.top

Тело фрагмента — application/octet-stream. Соединение держится открытым на время передачи, тело отдаётся потоком без промежуточной буферизации, поэтому промежуточные прокси не должны включать сжатие на этом пути: поверх уже сжатого потока оно только добавляет задержку.

К каждому запросу добавляется поле выравнивания переменной длины. Оно не несёт данных и нужно, чтобы размеры фрагментов на проводе не повторяли структуру передаваемого объекта. Длина выбирается случайно в заданном диапазоне; получатель поле игнорирует.

Запись требует ключа. Ключи выдаются участникам, которые гоняют рендер на своих машинах, и запрашиваются в комнате проекта. Чтение крупных объектов ключа не требует, но на анонимные сессии действует ограничение по числу одновременных передач.

Совместимость. Пространство имён /api/v2/ обслуживалось до мая 2026 года и больше не отвечает. Отличия версии 3 — идентификатор сессии в параметрах запроса вместо заголовка и разнесение направлений по узлам.

Ограничения

ВеличинаЗначение
максимальный размер фрагмента1 МиБ
время жизни сессии без активности10 минут
одновременных сессий на адрес (без ключа)4
формат ответа при ошибкеapplication/json с полями error и sid