diff --git a/modules/pws.js b/modules/pws.js new file mode 100644 index 0000000..b305fe0 --- /dev/null +++ b/modules/pws.js @@ -0,0 +1,79 @@ +/* + Сервис интеграции ПП Парус 8 с WEB API + Дополнительный модуль: Parus WEB Service (PWS) +*/ + +//---------------------- +// Подключение библиотек +//---------------------- +const xmlParser = require("xml2js").parseString; //Конвертация XML в JSON +const js2xmlparser = require("js2xmlparser"); //Конвертация JSON в XML + +//--------------------- +// Глобальные константы +//--------------------- + +//Наименования XML-элементов +const SREQEST_ROOT = "XREQEST"; //Корневой элемент XML-представления входящего запроса + +//Поля заголовка сообщения +const SHEADER_CONTENT_TYPE_JSON = "application/json"; //Значение "content-type" для JSON + +//------------ +// Тело модуля +//------------ + +//Разбор XML +const parseXML = xmlDoc => { + return new Promise((resolve, reject) => { + xmlParser(xmlDoc, { explicitArray: false, mergeAttrs: true }, (err, result) => { + if (err) reject(err); + else resolve(result); + }); + }); +}; + +//Обработчик "До" для полученного сообщения +const before = async prms => { + //Если пришел запрос в JSON + if (prms.options.headers["content-type"] == SHEADER_CONTENT_TYPE_JSON) { + //Конвертируем полученный в JSON-запрос в XML, понятный серверной части + let request = {}; + let requestXML = ""; + try { + request = JSON.parse(prms.queue.blMsg.toString()); + requestXML = js2xmlparser.parse(SREQEST_ROOT, request); + } catch (e) { + requestXML = ""; + } + //Возвращаем отконвертированное в качестве тела запроса + return { + blMsg: new Buffer(requestXML) + }; + } +}; + +//Обработчик "После" для полученного сообщения +const after = async prms => { + //Если пришел запрос в JSON + if (prms.options.headers["content-type"] == SHEADER_CONTENT_TYPE_JSON) { + //Конвертируем ответ, подготовленный сервером в JSON + parseRes = await parseXML(prms.queue.blResp.toString()); + //Вернём его клиенту в таком виде + return { + optionsResp: { + headers: { + "content-type": SHEADER_CONTENT_TYPE_JSON + } + }, + blResp: new Buffer(JSON.stringify(parseRes)) + }; + } +}; + +//----------------- +// Интерфейс модуля +//----------------- + +exports.before = before; +exports.after = after;