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-плеер — своей библиотеки не требуется. Один участник может отдавать несколько потоков: камера и показ экрана считаются разными.

Ограничения

Один ключ — одна комната. На число одновременных каналов действует лимит тарифа (см. тарифы). Медиапотоки в лимит по каналам не входят.