API для разработчиков
Через API можно встроить комнату в своё приложение: получить токен, открыть сигнальный канал и отдать медиапотоки в готовый плеер. Ниже — минимум, чтобы собрать рабочее подключение.
Доступ к API включён на всех тарифах. Ключ комнаты выдаёт администратор вашей компании в кабинете — открытой выдачи ключей нет.
Как устроено соединение
Клиент держит один постоянный сигнальный канал на всю встречу. По нему приходят события комнаты — кто вошёл, кто включил экран, кто заговорил — и уходят ответы клиента. Медиа идёт отдельно и к сигнальному каналу не привязано.
Канал живёт от входа в комнату до выхода: это долгое соединение по замыслу, а не сбой. На переключении сети клиент переоткрывает канал по тому же адресу.
Адрес сигнального канала
Канал открывается по WebSocket. Ключ комнаты — часть пути, а не заголовок: так его проще прокинуть через прокси и балансировщик, которые заголовки могут срезать.
wss://voyanger.ru/api/ws/<ключ-комнаты>
Запрос без ключа или с неизвестным ключом канал не открывает — адрес отвечает как несуществующий. Это сделано нарочно: перебирать ключи по коду ответа не получится.
События комнаты
После открытия канала сервер шлёт события в формате JSON. Клиент отвечает тем же. Порядок гарантирован в пределах одного канала.
| Событие | Когда приходит |
|---|---|
peer.join | участник вошёл в комнату |
peer.leave | участник вышел или отвалился |
media.start | участник включил камеру, микрофон или показ экрана |
media.stop | участник выключил поток |
room.state | полный снимок комнаты, приходит сразу после входа |
Пример
Открыть канал и подписаться на события комнаты:
const room = new WebSocket(
"wss://voyanger.ru/api/ws/" + roomKey
);
room.onopen = () => {
room.send(JSON.stringify({ type: "hello", name: userName }));
};
room.onmessage = (e) => {
const ev = JSON.parse(e.data);
if (ev.type === "room.state") render(ev.peers);
if (ev.type === "peer.join") addPeer(ev.peer);
if (ev.type === "peer.leave") dropPeer(ev.peer);
};
Медиапотоки
Адрес медиасервера для комнаты приходит в событии room.state. Дальше поток
забирает любой WebRTC-плеер — своей библиотеки не требуется. Один участник может отдавать
несколько потоков: камера и показ экрана считаются разными.
Ограничения
Один ключ — одна комната. На число одновременных каналов действует лимит тарифа (см. тарифы). Медиапотоки в лимит по каналам не входят.
