Вопреки распространенному мнению, облако 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)


  1. SuperPaintman
    16.10.2017 14:52
    +1

    Григорий, хотел бы я написать вам "С подключением", не знай я про вас и ваши отличные доклады на конференциях. Но зачем мусолить эту тему по ES20xx, ведь уже есть тысячи однотипных статей про новый (уже не самый новый) стандарт?


    1. defaultvoice
      16.10.2017 15:04
      +1

      Они добавили поддержку ES2017 в свой клиентский модуль и web-редактор, плюс дали несколько примеров использования. Под капотом не используется Node.js, о чем сказано в статье, так что в данном контексте это вполне себе новость, разве нет?


      1. aylarov
        16.10.2017 15:06

        Мы добавили в свой серверный модуль, который отвечает за управление звонками и бизнес-логикой на стороне бэкенда в Voximplant. Для многих наших клиентов и разработчиков — это несомненно новость :)


        1. SuperPaintman
          16.10.2017 20:00

          Оу, если речь шла, что ваш сервис начал поддерживать ES2017, тогда прошу прощения. Я прочел по-горизонтали и подумал, что это очередное водолейство на тему "Breaking news: появились промисы"


    1. eyeofhell Автор
      16.10.2017 16:05

      На мой взгляд, рассказывать о том, что этот стандарт постепенно проникает не только в браузеры и ноду — полезно. Опять же, в комментах могут задать каверзные вопросы, на которые мы отвечаем :)


  1. mamont80
    16.10.2017 18:09
    +1

    Вы не сказали или я не понял самого главного. Вы не используете Node JS для выполнения JS кода, а используете что вместо него? Изоляция между юзерами: не используете множество инстансов, следовательно используете один, тогда как ограничить ОЗУ на юзера и избегать зависаний всего инстанса из-за одного юзера? У меня похожие задачи, использую N штук nodeJS инстансов, чтоб каждый юзер в отдельном процессе и сам себе злобный буратино. Плюс 1 наблюдатель за всеми.


    1. aylarov
      17.10.2017 00:04

      Мы используем другой популярный open source продукт, доработанный под наши цели. Мы не используем множество инстансов, распределение ресурсов контролируется и сервер не позволяет одной сессии получить их больше чем разрешено