diff --git a/core/app.js b/core/app.js index e6baa63..5a9dba0 100644 --- a/core/app.js +++ b/core/app.js @@ -13,7 +13,7 @@ const oq = require("./out_queue"); //Прослушивание очереди const { ServerError } = require("./server_errors"); //Типовая ошибка const { validateObject } = require("./utils"); //Вспомогательные функции const { SERR_COMMON, SERR_OBJECT_BAD_INTERFACE } = require("./constants"); //Общесистемные константы -const objConfigSchema = require("../models/obj_config"); //Схема валидации файла настроек +const prmsAppSchema = require("../models/prms_app"); //Схема валидации параметров функций класса //------------ // Тело модуля //------------ @@ -43,16 +43,16 @@ class ParusAppServer { await this.logger.warn("Сервер приложений отключен от БД"); } //Инициализация сервера - async init(cfg) { + async init(prms) { await this.logger.info("Инициализация сервера приложений..."); //Проверяем структуру переданного объекта конфигурации - let sCheckResult = validateObject(cfg, objConfigSchema.config, "Настройки сервера приложений"); + let sCheckResult = validateObject(prms, prmsAppSchema.init, "Параметры инициализации"); //Если настройки верны - будем стартовать if (!sCheckResult) { //Создаём подключение к БД - this.dbConn = new db.DBConnector(cfg.dbConnect); + this.dbConn = new db.DBConnector({ connectSettings: prms.config.dbConnect }); //Создаём обработчик очереди исходящих - this.outQ = new oq.OutQueue(cfg.outgoing, this.dbConn, this.logger); + this.outQ = new oq.OutQueue({ outGoing: prms.config.outGoing, dbConn: this.dbConn, logger: this.logger }); //Скажем что инициализировали await this.logger.info("Сервер приложение инициализирован"); } else { diff --git a/core/db_connector.js b/core/db_connector.js index 7faec5e..870b3a5 100644 --- a/core/db_connector.js +++ b/core/db_connector.js @@ -9,7 +9,6 @@ const _ = require("lodash"); //Работа с массивами и объектами const EventEmitter = require("events"); //Обработчик пользовательских событий -const glConst = require("../core/constants"); //Глобальные константы const { ServerError } = require("../core/server_errors"); //Типовая ошибка const { makeModuleFullPath, validateObject } = require("../core/utils"); //Вспомогательные функции const prmsDBConnectorSchema = require("../models/prms_db_connector"); //Схемы валидации параметров функций модуля @@ -18,6 +17,11 @@ const objServicesSchema = require("../models/obj_services"); //Схема вал const objQueueSchema = require("../models/obj_queue"); //Схема валидации сообщения очереди обмена const objQueuesSchema = require("../models/obj_queues"); //Схема валидации списка сообщений очереди обмена const objLogSchema = require("../models/obj_log"); //Схема валидации записи журнала +const { + SERR_MODULES_BAD_INTERFACE, + SERR_OBJECT_BAD_INTERFACE, + SERR_MODULES_NO_MODULE_SPECIFIED +} = require("../core/constants"); //Глобальные константы //---------- // Константы @@ -51,31 +55,31 @@ class DBConnector extends EventEmitter { //Если структура объекта в норме if (!sCheckResult) { //Проверяем наличие модуля для работы с БД в настройках подключения - if (prms.sConnectorModule) { + if (prms.connectSettings.sConnectorModule) { //Подключим модуль - this.connector = require(makeModuleFullPath(prms.sConnectorModule)); + this.connector = require(makeModuleFullPath(prms.connectSettings.sConnectorModule)); //Проверим его интерфейс let sCheckResult = validateObject( this.connector, intfDBConnectorModuleSchema.dbConnectorModule, - "Модуль " + prms.sConnectorModule + "Модуль " + prms.connectSettings.sConnectorModule ); if (sCheckResult) { - throw new ServerError(glConst.SERR_MODULES_BAD_INTERFACE, sCheckResult); + throw new ServerError(SERR_MODULES_BAD_INTERFACE, sCheckResult); } //Всё успешно - сохраним настройки подключения - this.connectSettings = _.cloneDeep(prms); + this.connectSettings = _.cloneDeep(prms.connectSettings); //Инициализируем остальные свойства this.connection = null; this.bConnected = false; } else { throw new ServerError( - glConst.SERR_MODULES_NO_MODULE_SPECIFIED, + SERR_MODULES_NO_MODULE_SPECIFIED, "Не указано имя подключаемого модуля-коннектора!" ); } } else { - throw new ServerError(glConst.SERR_OBJECT_BAD_INTERFACE, sCheckResult); + throw new ServerError(SERR_OBJECT_BAD_INTERFACE, sCheckResult); } } //Подключиться к БД @@ -146,11 +150,11 @@ class DBConnector extends EventEmitter { //Валидируем финальный объект sCheckResult = validateObject({ services: res }, objServicesSchema.Services, "Список сервисов"); //Если валидация не прошла - if (sCheckResult) throw new ServerError(glConst.SERR_OBJECT_BAD_INTERFACE, sCheckResult); + if (sCheckResult) throw new ServerError(SERR_OBJECT_BAD_INTERFACE, sCheckResult); //Успешно - отдаём список сервисов return res; } else { - throw new ServerError(glConst.SERR_OBJECT_BAD_INTERFACE, sCheckResult); + throw new ServerError(SERR_OBJECT_BAD_INTERFACE, sCheckResult); } } catch (e) { if (e instanceof ServerError) throw e; @@ -180,14 +184,14 @@ class DBConnector extends EventEmitter { let res = await this.connector.log(logData); //Валидируем полученный ответ sCheckResult = validateObject(res, objLogSchema.Log, "Добавленная запись журнала работы"); - if (sCheckResult) throw new ServerError(glConst.SERR_OBJECT_BAD_INTERFACE, sCheckResult); + if (sCheckResult) throw new ServerError(SERR_OBJECT_BAD_INTERFACE, sCheckResult); //Вернём добавленную запись return res; } catch (e) { throw new ServerError(SERR_DB_EXECUTE, e.message); } } else { - throw new ServerError(glConst.SERR_OBJECT_BAD_INTERFACE, sCheckResult); + throw new ServerError(SERR_OBJECT_BAD_INTERFACE, sCheckResult); } } else { throw new ServerError(SERR_DB_EXECUTE, "Нет подключения к БД"); @@ -264,14 +268,14 @@ class DBConnector extends EventEmitter { objQueuesSchema.Queues, "Список сообщений очереди обмена" ); - if (sCheckResult) throw new ServerError(glConst.SERR_OBJECT_BAD_INTERFACE, sCheckResult); + if (sCheckResult) throw new ServerError(SERR_OBJECT_BAD_INTERFACE, sCheckResult); //Вернём сообщения очереди обмена return res; } catch (e) { throw new ServerError(SERR_DB_EXECUTE, e.message); } } else { - throw new ServerError(glConst.SERR_OBJECT_BAD_INTERFACE, sCheckResult); + throw new ServerError(SERR_OBJECT_BAD_INTERFACE, sCheckResult); } } else { throw new ServerError(SERR_DB_EXECUTE, "Нет подключения к БД"); @@ -292,7 +296,7 @@ class DBConnector extends EventEmitter { let res = await this.connector.setQueueState(setStateData); //Валидируем полученный ответ sCheckResult = validateObject(res, objQueueSchema.Queue, "Изменённое сообщение очереди обмена"); - if (sCheckResult) throw new ServerError(glConst.SERR_OBJECT_BAD_INTERFACE, sCheckResult); + if (sCheckResult) throw new ServerError(SERR_OBJECT_BAD_INTERFACE, sCheckResult); //Вернём измененную запись return res; } catch (e) { @@ -300,7 +304,7 @@ class DBConnector extends EventEmitter { else throw new ServerError(SERR_DB_EXECUTE, e.message); } } else { - throw new ServerError(glConst.SERR_OBJECT_BAD_INTERFACE, sCheckResult); + throw new ServerError(SERR_OBJECT_BAD_INTERFACE, sCheckResult); } } else { throw new ServerError(SERR_DB_EXECUTE, "Нет подключения к БД"); diff --git a/core/out_queue.js b/core/out_queue.js index e6e2c47..580f327 100644 --- a/core/out_queue.js +++ b/core/out_queue.js @@ -9,7 +9,10 @@ const _ = require("lodash"); //Работа с массивами и коллекциями const EventEmitter = require("events"); //Обработчик пользовательских событий -const { checkObject } = require("../core/utils"); //Вспомогательные функции +const { ServerError } = require("./server_errors"); //Типовая ошибка +const { SERR_OBJECT_BAD_INTERFACE } = require("./constants"); //Общесистемные константы +const { validateObject } = require("../core/utils"); //Вспомогательные функции +const prmsOutQueueSchema = require("../models/prms_out_queue"); //Схемы валидации параметров функций класса //-------------------------- // Глобальные идентификаторы @@ -24,14 +27,12 @@ const SEVT_OUT_QUEUE_NEW = "OUT_QUEUE_NEW"; //Новое сообщение в //Класс очереди сообщений class OutQueue extends EventEmitter { - //конструктор класса - constructor(prms, dbConn, logger) { + //Конструктор класса + constructor(prms) { //Создадим экземпляр родительского класса super(); - //Проверяем структуру переданного объекта с параметрами очереди - let sCheckResult = checkObject(prms, { - fields: [{ sName: "nPortionSize", bRequired: true }, { sName: "nCheckTimeout", bRequired: true }] - }); + //Проверяем структуру переданного объекта для подключения + let sCheckResult = validateObject(prms, prmsOutQueueSchema.OutQueue, "Параметры конструктора класса OutQueue"); //Если структура объекта в норме if (!sCheckResult) { //Хранилище очереди сообщений @@ -39,18 +40,15 @@ class OutQueue extends EventEmitter { //Признак функционирования обработчика this.bWorking = false; //Параметры очереди - _.extend(this, prms); + this.outGoing = _.cloneDeep(prms.outGoing); //Запомним подключение к БД - this.dbConn = dbConn; + this.dbConn = prms.dbConn; //Запомним логгер - this.logger = logger; + this.logger = prms.logger; //Привяжем методы к указателю на себя для использования в обработчиках событий this.outDetectingLoop = this.outDetectingLoop.bind(this); } else { - throw new ServerError( - glConst.SERR_OBJECT_BAD_INTERFACE, - "Объект имеет недопустимый интерфейс: " + sCheckResult - ); + throw new ServerError(SERR_OBJECT_BAD_INTERFACE, sCheckResult); } } //Добавление нового исходящего сообщения в очередь для отработки @@ -58,7 +56,7 @@ class OutQueue extends EventEmitter { //Cоздадим новый элемент очереди let tmp = {}; _.extend(tmp, message); - //добавим его в очередь + //Добавим его в очередь this.queue.push(tmp); } //Уведомление о получении нового сообщения @@ -71,13 +69,13 @@ class OutQueue extends EventEmitter { if (this.bWorking) setTimeout(() => { this.outDetectingLoop(); - }, this.nCheckTimeout); + }, this.outGoing.nCheckTimeout); } //Опрос очереди исходящих сообщений async outDetectingLoop() { //Сходим на сервер за очередным исходящим сообщением try { - let outMsgs = await this.dbConn.getOutgoing({ nPortionSize: this.nPortionSize }); + let outMsgs = await this.dbConn.getOutgoing({ nPortionSize: this.outGoing.nPortionSize }); if (Array.isArray(outMsgs) && outMsgs.length > 0) { let logAll = outMsgs.map(async msg => { await this.logger.info( diff --git a/index.js b/index.js index 41346e6..1d1b69d 100644 --- a/index.js +++ b/index.js @@ -41,7 +41,7 @@ process.on("SIGINT", () => { //Старутем appSrv - .init(cfg) + .init({ config: cfg }) .then(r => { appSrv .run()