Вопреки распространенному мнению, облако Voximplant не использует Node.js, чтобы выполнять JavaScript код клиентов параллельно с голосовыми и видеозвонками. Каждый наш сервер одновременно управляет сотнями звонков: переключение голосовых и видеопотоков между звонками, запись, распознавание голоса, синтез, HTTP-запросы к внешним серверам, — вся вот эта история. А Node.js создана, чтобы работать в одиночку. Несколько сотен изолированных инстансов — это не про нее. Передерутся за память, ресурсы и все закончится очень печально. Поэтому у нас сильно изолированная и ограниченная по ресурсам песочница, которая не дает клиентскому JavaScript-коду в одной маленькой сессии нарушать работу целых серверов. Asterisk у нас тоже не используется по похожим причинам.
До недавнего времени мы поддерживали синтаксис ES5. Типовой сценарий работы с коммуникациями — это несколько сотен, максимум, тысяч строк кода. Сложные штуки клиенты все равно выносят на собственный backend, а если нужен современный синтаксис, всегда можно воспользоваться транспайлером и автоматически отгрузить собранный JavaScript с помощью Continuous Integration.
Но 2017 год обязывает, да и Web-редактор и отладчик клиенты любят и используют для быстрого создания нужных решений. Поэтому мы запилили поддержку ES2017 (не с нуля, естественно, а готовыми компонентами) и переделали обучающие материалы на современный лад. Под катом я хочу показать, насколько короче и понятнее становится код, если пользоваться современной нотацией JavaScript. Разница впечатляет.
async и await
Так как наше API уже довольно давно возвращает промисы, где это возможно, то цепочка then с передачей параметров превращается в хорошо читаемый линейный код:
стрелочные функции и destructuring
Просто сокращают код. Особенно destructuring, который убирает временные идентификаторы и оставляет только то, что нам нужно:
let и const
Хорошо когда есть линтер, автобилд, автотест и автодеплой. Но в реальности часто нужно быстро зайти в скрипт и что-нибудь поменять из веб-редактора. Новые let и const позволяют писать код, который сам защитит разработчика от «детских» ошибок:
строковые литералы с интерполяцией
Делают код читаемым и защищают от множества детских ошибок при отсутствии тулчейна. Да, мы знаем, что разрабатывать на JS без тулчейна — это моветон. Но когда у сервиса тысячи клиентов и у многих основной бизнес никак не связан с программированием, хочется их защитить уже на этапе примеров и первых экспериментов. Одна из “фишек” Voximplant в том, что компания может взять своего штатного веб-разработчика, можно не очень крутого, и он за несколько часов без проблем соберет из “кубиков лего” нужную телефонную автоматику. Очень хочется, чтобы кубики при этом не пытались взорваться у него в руках:
of-циклы, классы, хелперы и другие мелочи
Большинство сценариев для нашей платформы довольно “легковесны”: запросы к backend, роутинг звонка, куда надо, и отображение в CRM, чего не надо, автоматические звонки с подтверждениями покупки или доставки, выбор нужного контрагента по ряду условий и тому подобное. Но всегда велик обойтись без собственного backend вообще и заставить наше облако делать всю работу не только с коммуникациями, но и с бизнес-логикой этих коммуникаций. Мы в целом не против, до тех пор пока сценарий укладывается в границы песочницы и не пытается откушать слишком много ресурсов сервера. “Родная” поддержка всего синтаксического сахара ES2017 позволяет быстро добавлять логику в сценарии без необходимости настраивать у себя компилятор из какого-нибудь TypeScript, тесты и деплой. Потом это все, конечно, не повредит — но возможность сделать сложную штуку здесь и сейчас в онлайн-редакторе с минимумом строк кода очень помогает.
Комментарии (7)
mamont80
16.10.2017 18:09+1Вы не сказали или я не понял самого главного. Вы не используете Node JS для выполнения JS кода, а используете что вместо него? Изоляция между юзерами: не используете множество инстансов, следовательно используете один, тогда как ограничить ОЗУ на юзера и избегать зависаний всего инстанса из-за одного юзера? У меня похожие задачи, использую N штук nodeJS инстансов, чтоб каждый юзер в отдельном процессе и сам себе злобный буратино. Плюс 1 наблюдатель за всеми.
aylarov
17.10.2017 00:04Мы используем другой популярный open source продукт, доработанный под наши цели. Мы не используем множество инстансов, распределение ресурсов контролируется и сервер не позволяет одной сессии получить их больше чем разрешено
SuperPaintman
Григорий, хотел бы я написать вам "С подключением", не знай я про вас и ваши отличные доклады на конференциях. Но зачем мусолить эту тему по ES20xx, ведь уже есть тысячи однотипных статей про новый (уже не самый новый) стандарт?
defaultvoice
Они добавили поддержку ES2017 в свой клиентский модуль и web-редактор, плюс дали несколько примеров использования. Под капотом не используется Node.js, о чем сказано в статье, так что в данном контексте это вполне себе новость, разве нет?
aylarov
Мы добавили в свой серверный модуль, который отвечает за управление звонками и бизнес-логикой на стороне бэкенда в Voximplant. Для многих наших клиентов и разработчиков — это несомненно новость :)
SuperPaintman
Оу, если речь шла, что ваш сервис начал поддерживать ES2017, тогда прошу прощения. Я прочел по-горизонтали и подумал, что это очередное водолейство на тему "Breaking news: появились промисы"
eyeofhell Автор
На мой взгляд, рассказывать о том, что этот стандарт постепенно проникает не только в браузеры и ноду — полезно. Опять же, в комментах могут задать каверзные вопросы, на которые мы отвечаем :)