Месяц назад на Hacker News в топ вышел пост про сервис AnyRoom: простенький бэкенд на Go, который позволяет создавать телефонные конференции. Рейтинг больше ста, обсуждения в комментах, Исходный код на github, подписки по 50 долларов в месяц — в общем, всё как у взрослых. После первого удивления «неужели это кому-то нужно?!?» я немного погуглил «голосовая конференция без регистраций и sms недорого», подивился дороговизне приложений и понял что таки да, нужно. А на Voximplant такую штуку можно собрать за полчаса и десяток строк JavaScript-кода. Кто хочет создать стартап и попиариться на Hacker News? Под катом рассказываю, как.
Как работает AnyRoom?
На Go и Twilio. С точки зрения пользователя это выглядит следующим образом: организатор конференции рассылает участникам номер телефона (он один на весь сервис) и несколько цифр номера конференции. Все участники звонят, вводят номер конференции — и могут общаться друг с другом. Как скайп, только работает. Под капотом бэкенд на Go общается с Twilio HTTP-запросами и передает XML'ки, объясняющие, что делать со звонками.
Как это повторить на Voximplant?
У нашего облака есть «изюминка». Логика работы со звонками задается JavaScript-кодом, который выполняется параллельно со звонком. Нет задержек общения с бэкендом, да и сам бэкенд для большинства сценариев не нужен: JavaScript можно написать в нашем Web IDE и отладить в Web Debugger (да-да, вы звоните на номер или облако само звонит, куда скажете, после чего можно прямо в браузере пошагово ходить по JavaScript и смотреть, что происходит со звонками). А можно загрузить по HTTP API, например из GitLab в рамках Continuous Integration.
Чтобы повторить AnyRoom в минимальной версии, достаточно привязать к номеру телефона JavaScript-сценарий, который сделает следующее:
- Примет звонок (специфика телефонии, пока не сделано answer, звонок не тарифицируется и можно, например, играть в него мелодию ожидания. А вот получить из него голосовой поток никто не даст).
- Синтезирует приветствие и предлагает ввести код конференции.
- Считывает цифры, которые пользователь нажимает на клавиатуре (она называются DTMF или «донабор»).
- По нажатию на что-нибудь специальное, например, решетку, отправляет пользователя в конференцию с именем, состоящим из введенных цифр.
Такая реализация будет тем самым MVP: пользоваться уже можно, но есть большой простор для улучшений. Что будет, если два пользователя хотят разные конференции, но придумают один и тот же номер, например «111»? Веб-интерфейс с генератором номеров конференций не помешает. А реализуется MVP вот таким сценарием, который можно привязать как к арендованному на Voximplant номеру (пишите в личку, я пополню баланс, чтобы вы могли поэкспериментировать) либо к отладочному номеру в Готем-Сити, аренда которого стоит один цент в месяц и позволяет тестировать входящие звонки без трат на номер:
Обратите внимание, что звонок отправляется в конференцию. Это еще один JavaScript-сценарий, который нужно добавить в то же приложение, что и сценарий обработки входящего звонка.
Правило входящего звонка должно содержать регулярное выражение 'conf_.*' для срабатывания только на звонки в конференцию. Это правило нужно расположить перед правилом для входящих звонков, которое срабатывает вообще не все звонки:
JavaScript-сценарий самой конференции в этом примере примитивен. Так как сценарии конференции — это единственные сценарии, которые могут принять более одного входящего звонка, то создается один микшер конференции, а все звонки микшируют через него голосовые потоки. Микшер конференции отличается от обычного микшера тем, что отдает пользователю все голосовые потоки, кроме его собственного:
Что можно сделать лучше?
Как я уже писал, это очень простой клон популярного сервиса. Нелишним будет веб-интерфейс для генерации ID конференции, возможность позвонить с веб сайта (у нас есть Web SDK), мобильное приложение (у нас есть Android и iOS SDK), проигрывание музыки в конференции (через объект Player), синтез приветствия, информирование о подключившихся и отключившихся пользователях, интеграция оплаты (через HTTP API) и многое другое.
О чем я хотел рассказать. О том, что есть множество незакрытых потребностей, связанных с телефонией и видеосвязью. Всё это можно быстро и очень недорого собрать в облачных коммуникационных платформах. Быстро проверять идеи, быстро делать модификации и пивоты. И конечно же использовать для этого JavaScript. Потому что любой веб-разработчик может JavaScript.
Автор: mdnsresponder