amEnded - функція-обробник події зупинки потоку, onOfferSDP і onAnswerSDP - функції відправлення запитів і відповідей на запит підключення. Функція RTCPeerConnection при виклику створює об'єкт WebRTC-підключення, відправляє запит на підключення до іншому клієнту і потік, якщо він заданий. Після того, як клієнт підтвердить підключення і відправить відповідь, для установки з'єднання можна викликати функцію addAnswerSDP, яка зберігає SDP клієнта.
Малюнок 11 - Збереження SDP
Функції onOfferSDP і onAnswerSDP спочатку не задані в коді функції PeerConnection, вони задаються при її виклику. Це зроблено для того, щоб дана бібліотека була якомога більш переноситься. У WebRTC немає вбудованих функцій для обміну SDP-повідомленнями, тому програміст може сам вибрати, що використовувати для цього: web-сокети, базу даних або власний сигнальний сервер.
Друга важлива функція класу RTCPeerBroadcasting - функція Broadcasting. Ця функція є обгорткою для RTCPeerConnection, виконує роль шару абстракції і створена для спрощення створення конференц-зв'язку, коли підключених клієнтів більше одного. Приймає на вхід об'єкт, приклад якого показаний на малюнку 12.
Рисунок 12 - Об'єкт параметрів Broadcasting
В даному об'єкті openSocket - функція відкриття сокета, в якої необхідно задати функції обміну SDP-повідомленнями, onRemoteStream і onRemoteStreamEnded - функції-обробники початку і завершення потоків, connectToRoom - функція, яка буде викликана при підключенні до вже існуючої конференції. При виклику Broadcasting відправляє в сокет SDP і очікує відповідь. Якщо відповідь отримана, створюється новий об'єкт RTCPeerConnection для нового підключеного клієнта і встановлюється з'єднання. Broadcasting повертає об'єкт, що містить методи createRoom, joinRoom, leaveRoom. Метод createRoom створює нову конференцію з вказаним ім'ям, після виклику відправляє в сокет повідомлення з інформацією про нову конференції. Метод joinRoom відправляє запит на підключення до вже існуючої конференції, створює новий об'єкт RTCPeerConnection. Метод leaveRoom запускає цикл за списком всіх об'єктів RTCPeerConnection і на кожному викликає метод close , який закриває пряме підключення. У підсумку бібліотека має простий інтерфейс для створення конференц-підключень. Ця бібліотека є основою для WebRTC-додатки, яке буде довантажуватися розширенням на сторінку Вконтакте.
Для цього додатка ще необхідно було створити користувальницький інтерфейс і функціонал для створення деякого подібності викликів і відповідей на відеодзвінок. Так як структура цього додатка припускає, що додаток буде довантажуватися в iframe на сторінці з іншим доменом, то необхідно реалізувати механізм обміну даними між батьківським вікном і вмістом iframe. Для цього був обраний механізм POST-повідомлень. Вони відправляються у вигляді рядка. Щоб відправити масив з даними, можна закодувати його в JSON-рядок, а при отриманні декодувати.
Малюнок 13 - Вилов POST-повідомлення
При отриманні POST-повідомлення з необхідними даними (id дзвонить і приймає, посилання на фотографію, ім'я) скрипт запускає нову конференцію, викликаючи метод createRoom бібліотеки RTCPeerBroadcasting, в Як ім'я конференції буде вказаний id приймаючого користувача. Після того, як конференція створена, в базу даних буде записана інформація про виклику. Якщо приймає виклик користувач буде в режимі онлайн, то він от...