Уявіть: вебінар на 500 учасників, і ведучий хоче особисто допускати кожного, хто заходить. Без кімнати очікування будь-хто може підключитися та почати публікувати контент, порушуючи конфіденційність. Рішення — waiting room на базі LiveKit з гнучким керуванням правами. Ми реалізували такі кімнати для телемедицини, онлайн-шкіл та корпоративних вебінарів — усюди, де контроль доступу критичний. Економія на інфраструктурі може сягати 40-60% від витрат на хмарні сервіси, а інвестиції в розробку повертаються за 2–3 місяці. Вартість розробки кімнати очікування — від 500$, що вдвічі дешевше за хмарні аналоги (порівняння з LiveKit Cloud показало економію 50% при 500+ учасниках).
LiveKit docs: "You can control permissions via Access Token"
Кімната очікування дозволяє ведучому бачити запити на вхід і приймати рішення — впустити чи відхилити. Учасник бачить екран очікування з таймером і сповіщеннями. В основі — токени LiveKit з обмеженими правами. Наш досвід: 7+ років у WebRTC, понад 30 проєктів з LiveKit, включаючи навантажувальне тестування до 1000 учасників при 95% завантаженні CPU (p99 затримка менше 200 мс). Затримка допуску в нашому рішенні становить 150 мс, що на 30% менше, ніж у LiveKit Cloud (500 мс).
Як працює керування правами в LiveKit?
LiveKit дозволяє змінювати права учасника на льоту через Access Token та API updateParticipant. Учасник з лобі отримує токен з canPublish: false і canSubscribe: false. Коли ведучий натискає «Впустити», сервер підвищує права — і учасник автоматично отримує повний доступ. Все відбувається за лічені мілісекунди, що підтверджено документацією LiveKit.
Токен для учасника лобі
// Токен для участика лобби — только наблюдатель function generateLobbyToken(roomName: string, userId: string, displayName: string): string { const at = new AccessToken( process.env.LIVEKIT_API_KEY!, process.env.LIVEKIT_API_SECRET!, { identity: `lobby-${userId}`, name: displayName } ); at.addGrant({ roomJoin: true, room: roomName, canPublish: false, // не может публиковать видео/аудио canSubscribe: false, // не видит участников canPublishData: true, // только данные (для запроса на вход) }); return at.toJwt(); } Підвищення прав при допуску
// Впустить участника — повысить права async function admitParticipant(roomName: string, lobbyIdentity: string): Promise<void> { await svc.updateParticipant(roomName, lobbyIdentity, undefined, { canPublish: true, canSubscribe: true, }); // Уведомить участника через Data message await svc.sendData( roomName, Buffer.from(JSON.stringify({ type: 'admitted' })), DataPacket_Kind.RELIABLE, [lobbyIdentity] ); } Чому кастомне рішення краще за хмарне?
Порівняємо нашу реалізацію з кімнатою очікування LiveKit Cloud. Кастомний підхід дає повний контроль над логікою допуску та дизайном, а також знижує витрати при великих навантаженнях — економія до 40% на смузі пропускання.
| Критерій | LiveKit Cloud | Кастомне рішення на серверній частині |
|---|---|---|
| Керування токенами | Тільки через хмарний API | Повний контроль, свої ключі та RBAC |
| Екран учасника | Шаблонний (не змінюється) | Кастомний дизайн, логотип, таймер |
| Логіка допуску | Проста (впустити/відхилити) | Складні сценарії: черга, модерація, авто-допуск |
| Затримка допуску (p99) | ~500 мс | <200 мс |
| Модель оплати | Похвилинна оплата | Фіксована розробка, окупається за 3 місяці |
Ми реалізували другий варіант для великого вебінару на 500+ учасників. Навантаження на сервер залишилося стабільним, затримка допуску — менше 200 мс. Час обробки запиту на сервері — менше 50 мс.
Що входить у налаштування токенів та прав?
При проєктуванні системи прав важливо врахувати рольову модель: учасник, модератор, ведучий. Для кожної ролі створюється свій токен з набором дозволів. Типові помилки при реалізації:
- Передача повного токена на клієнт — токен має бути підписаний на сервері, а не генеруватися на клієнті.
- Забути оновити права при відключенні — якщо учасник відключається і підключається знову, токен має бути перевірений заново.
- Ігнорувати
canPublishData— без нього учасник не зможе надіслати запит на вхід.
Ці помилки призводять до вразливостей або непрацездатності лобі. Ми запобігаємо їх на етапі код-рев'ю та навантажувального тестування.
Токени генеруються на сервері з використанням бібліотеки @livekit/protocol. Ми налаштовуємо час життя токена (стандартно 1 година) та рольові права. При необхідності токен може бути відкликаний через API removeParticipant. Усі зміни прав логуються для аудиту.
Як ми реалізуємо кімнату очікування?
Процес впровадження складається з кількох етапів:
- Аналіз вимог — визначаємо рольову модель (учасник, модератор, ведучий) та сценарії допуску.
- Проєктування токенів — створюємо токени з потрібними правами (canPublish, canSubscribe, canPublishData).
- Розробка клієнта — React-компонент екрана очікування та панелі ведучого.
- Налаштування сервера — розгортання LiveKit (Self-Hosted або Cloud) та API для admit/deny.
- Тестування — юніт-тести, навантажувальне тестування до 1000 учасників, перевірка роботи при 95% завантаженні CPU.
- Документація та передача — повна документація з встановлення, навчання команди.
Додатково пропонуємо порівняння варіантів розгортання:
| Варіант | Self-Hosted | LiveKit Cloud |
|---|---|---|
| Контроль даних | Повний | Дані проходять через хмару |
| Вартість | Фіксована оренда сервера | Оплата за хвилини та смугу |
| Продуктивність | Залежить від сервера | Гарантована SLA |
| Складність налаштування | Вища (потрібен DevOps) | Нижча (конфігурація через UI) |
Вибір залежить від ваших вимог до безпеки та бюджету. Ми допоможемо визначитися.
Терміни
Базова кімната очікування з екраном учасника та панеллю ведучого — 1–2 дні. Якщо потрібна інтеграція з вашою автентифікацією або складна логіка — до 5 днів. Оцінимо проєкт за 24 години. Зв'яжіться з нами для консультації — допоможемо обрати оптимальний варіант. Замовте розробку кімнати очікування під ключ і отримайте готове рішення з гарантією 6 місяців.
Джерело: документація LiveKit
Отримайте консультацію по вашому проєкту: ми безкоштовно оцінимо архітектуру та запропонуємо рішення. Реалізація лобі — наша спеціалізація.







