# video-utils

Содержит общие вспомогательные модули модули для сервисов "Видеосвязь" и "Вебинары"

## logger

Нужен для логирования работы приложения. Логи пишутся в консоль и отправляются в админку облака.

### Инициализация

    var
        cfg = {
            appName: 'my-super-app',  // имя приложения
            extra: {
                cloudLogger: true,    // если false или не указан, то в админку логи не полетят
                port: 82              // порт, который слушает приложение (отображается в логах)
            },
            log: {
                address: 'http://dev-private.sbis.ru/log' // адрес центра логирования
            }
        },
        logger = require('video-utils-rabbit/logger)(
            cfg,                      // конфигурация
            function(log4js){         // функция расширяющая возможности логгера
                var myLogger = log4js.getLogger('myLog')
                log4js.addAppender(function (e) {
                   //do something
                }, 'myLog');

                return {
                    myLog: function(tag, msg){
                        myLogger.info(tag, msg);
                    }
                }
            }
        );

## sender

Нужен для отправки данных через RabbitMQ

### Инициализация

    var 
        cfg = {
            address: 'amqp://cloud_service:cloud_service@test-eventmq.unix.tensor.ru',
            exchanges: ['test-online.sbis.ru', 'test-inside.tensor.ru']    
        },
        logger = require('log4js').getLogger(),
        sender = require('video-utils-rabbit/sender)(cfg, logger);

Параметр **logger** является опциональным, по-умолчанию будет require('log4js').getLogger()

### Использование

    sender.send(userId, exchange, channel, data, cb);
    
где:

 * userId   - идентификатор пользователя, которому отправляется сообщение
 * exchange - имя обменника
 * channel  - имя канала
 * [data]   - передаваемые данные(опциональный)
 * [cb]     - callback(опциональный)
 
## subscriber

Нужен для подписки на события в RabbitMQ

### Инициализация

    var 
        cfg = {
            address: 'amqp://cloud_service:cloud_service@test-eventmq.unix.tensor.ru'    
        },
        logger = require('log4js').getLogger(),
        subscriber = require('video-utils-rabbit/subscriber)(cfg, logger);

Параметр **logger** является опциональным, по-умолчанию будет require('log4js').getLogger()

### Использование

    subscriber.subscribe(exchange, userId); // необходимо для подписки на сообщения в обменнике для конкретного пользователя
    
    subscriber.on('message', function (channel, data) { // подписка на сообщения
       // 
    });
    
где:

 * exchange - имя обменника
 * userId   - идентификатор пользователя, для которого мы хотим получать сообщения
 * channel  - имя канала, в который пришло сообщение
 * data     - переданные данные


## authorization

Мидлвара для express.js, валидирует заголовки запроса

### Использование
    
    var 
                cfg = {
                    hosts: {
                       allowed: ['test-online.sbis.ru', 'test-inside.tensor.ru'] 
                    }    
                },
                logger = require('log4js').getLogger(),
                authorization = require('video-utils-rabbit/authorization)(cfg, logger),
                app = require('express')();
    
    app.post('/some_url', authorization, nextMiddleware);
    
Параметр **logger** является опциональным, по-умолчанию будет require('log4js').getLogger()


## config

Модуль для получения конфигурации приложения из админки либо из локального файла

### Инициализация
    
    require('video-utils/config').init({
       cloudConfigPath: cloudConfigPath,
       debugConfigPath: debugConfigPath,
       port: port,
       cloudLogger: cloudLogger,
       extra: {
          webinar: {
                host       : 'СервисВидеосвязи.Вебинары.Чанкер.Хост',
                port       : 'СервисВидеосвязи.Вебинары.Чанкер.Порт',
                rhost      : 'СервисВидеосвязи.Вебинары.СерверЗаписи.Хост',
                rport      : 'СервисВидеосвязи.Вебинары.СерверЗаписи.Порт'
             }    
       }
    }).then(function(config) {
       startService(config);
    }).catch(function(e) {
       console.error('Error on main service startup: ' + e.message);
       process.exit(9);
    });
    
где:

 * [cloudConfigPath] - путь до файла cloud.json (опциональный)
 * [debugConfigPath] - путь до файла debug-config.json (опциональный)
 * [port] - порт, на тором запускается приложение (опциональный) (по умолчанию 81)
 * [cloudLogger] - отсылать ли логи в админку облака (опциональный) (по умолчанию false)
 * [extra] - дополнительная конфигурация, которая должна быть получена из админки (опциональный)
 
 **Обязательно должен присутствовать либо cloudConfigPath, либо debugConfigPath**; в случае, когда придставлены оба,
 приоритетней будет **cloudConfigPath**
 
### Использование
 
Имеет следующие методы:
 * getConfig() - получить всю конфигурацию
 * get(key) - получить конфигурацию по ключу
 * update(cfg) - обновить конфигурацию
 
## shutdownManager
 
 Выполнит переданные функции перед завершением процесса. Если функция вернет Promise, то процесс не завершится, пока не выполнится Promise.
 Таймаут ожидания выполнения Promise - 5 сек.
 
### Использование
 
    var shutdownManager = require('video-utils/shutdownManager');
    
    shutdownManager.addHandler(function () {
       var deferred = Q.defer();
       setTimeout(function() {
          deferred.resolve();
       }, 1000);
       return deferred.promise;
    })
    