
Cкрипты и JS API
В Viinex встроен язык JavaScript, который может исполнять пользовательский код (объект «script» в Viinex), что позволяет нашим партнерам существенно упростить автоматическую реализацию логики для различных сценариев использования.
Скрипты могут использоваться для фильтрации или генерации новых событий, обработки внешних HTTP-запросов, а также управления другими объектами Viinex. Исполнение скрипта, как правило, инициируется событиями, которые приходят от других объектов. Кроме этих случаев мы реализовали также возможность вызывать скрипт, используя HTTP API, предоставляемый сервером Viinex. Таким образом, каждый скрипт может являться также «сервлетом», если это требуется. Иными словами, внешнее ПО, например, код, исполняемый веб-страницей в клиентском браузере, может вызывать скрипт в Viinex напрямую, отправляя ему HTTP-запросы, и получать HTTP-ответы, сформированные скриптом.
Использование скриптов особенно актуально, когда необходимо обеспечить надежность выполнения выбранной партнером логики, за счет минимизации риска потери событий в распределенных системах (потери связи, перезапуск одного из компонентов системы и т.д), на которых базируется эта логика.
Иллюстрацией таких сценариев может быть реализация с помощью скриптов приоритетов управления PTZ-камерой для различных операторов, возврат PTZ-камеры к определенным предустановкам (preset) через какое-то время после того, как ее перестал использовать оператор, или переключение на видеопоток с большим разрешением в случае, если получено ONVIF-событие детектора этой камеры и тп.
Кроме того, скрипт может также «опубликовать» некоторую информацию, которая в дальнейшем может быть отправлена клиентам в ответ на их HTTP-запросы без обращения к самому скрипту. Это важно для производительности: множество удаленных клиентов могут параллельно запросить информацию, опубликованную скриптом, и быстро получить ответ – а тем временем скрипт может продолжать обрабатывать новые события.
Разумеется, объект «script», поскольку он является контекстом исполнения JavaScript, сохраняет свое состояние между активациями, инициированными последовательными событиями или HTTP-запросами. Это означает, что с помощью скриптов может быть реализована более сложная логика, учитывающая историю получения событий (а не только одно событие, обрабатываемое в данный момент). Скрипт может накапливать информацию, осуществляя «свертку» по потоку входящих событий, и адаптировать свое поведение соответственно. Кроме этого, скрипт может генерировать новые события, которые Viinex отправляет в другие объекты, – в частности, в HTTP-сервер (таким образом, события, генерируемые скриптами, можно получать через предусмотренный в Viinex интерфейс WebSocket), либо в экземпляр объекта «внешний процесс», который может представлять точку сопряжения Viinex с произвольной внешней системой.
В качестве иллюстрации: используя такой механизм скриптов и связку с внешним процессом, мы реализовали решение по распознаванию номеров грузовых железнодорожных вагонов.