UNPKG

@babak2000ir/navbc-proxy

Version:

Helps connecting to Dynamics NAV / Business Central backend.

149 lines (135 loc) 6.84 kB
const fetch = require('node-fetch'); const parser = require('xml2json'); const js2xmlparser = require("js2xmlparser"); const { escapeXML } = require('ejs'); const httpntlm = require('httpntlm'); const BaseError = require('@thenavpeople/base-app').BaseError(); const navbcParams = { "webserviceBaseUrl": "", "authorizationType": "Basic", //Basic, Ntlm "username": "", "password": "", "domain": "", "debugMode": false } function setParams(navbcParameters) { navbcParams.webserviceBaseUrl = navbcParameters.webserviceBaseUrl; navbcParams.authorizationType = 'basic' || navbcParameters.authorizationType; navbcParams.username = navbcParameters.username; navbcParams.password = navbcParameters.password; navbcParams.domain = navbcParameters.domain; navbcParams.debugMode = false || navbcParameters.debugMode; } function navFetch(requestBody, navbcCompany, navbcObject, navbcServiceName, navbcServiceFunction, ignoreSSL) { return new Promise(function(resolve, reject) { let url = navbcParams.webserviceBaseUrl + `/WS/${navbcCompany}/${navbcObject}/${navbcServiceName}`; if (ignoreSSL) { process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0"; } var requestHeaders = { 'Content-Type': 'application/xml; charset=utf-8', 'soapaction': `urn:microsoft-dynamics-schemas/${navbcObject}/${navbcServiceName}:${navbcServiceFunction}` } switch (navbcParams.authorizationType.toLowerCase()) { case 'basic': requestHeaders['authorization'] = 'Basic ' + Buffer.from(`${navbcParams.username}:${navbcParams.password}`).toString("base64"); fetch(url, { method: 'POST', // *GET, POST, PUT, DELETE, etc. mode: 'cors', // no-cors, *cors, same-origin cache: 'no-cache', // *default, no-cache, reload, force-cache, only-if-cached //credentials: 'same-origin', // include, *same-origin, omit headers: requestHeaders, redirect: 'follow', // manual, *follow, error referrerPolicy: 'no-referrer', // no-referrer, *no-referrer-when-downgrade, origin, origin-when-cross-origin, same-origin, strict-origin, strict-origin-when-cross-origin, unsafe-url body: requestBody }) .then((response) => { if (response.ok) { response.text().then((data) => { if (navbcParams.debugMode) console.log(`navbc-proxy: Backend Response: ${data}`); isNavError(data).then( navError => { return reject(navError) }, response => { return resolve(response) }); }) .catch((error) => { return reject(new BaseError(`${error.name}: ${error.message}`, { logLevel: "error", displayType: "standard", severity: "normal" })); }); } else { response.text().then(error => { isNavError(error).then( navError => { return reject(navError) }, error => { return reject(new BaseError(`${response.statusText}: ${error}`, { logLevel: "error", displayType: "standard", severity: "normal" })); }); }) } }) .catch(error => { return reject(new BaseError(`${error.name}: ${error.message}`, { logLevel: "error", displayType: "standard", severity: "normal" })); }) break; case 'ntlm': httpntlm.post({ url, username: navbcParams.username, password: navbcParams.password, workstation: '', domain: navbcParams.domain, body: requestBody, headers: requestHeaders }, function(error, response) { if (error || response.statusCode != 200) { isNavError(error).then( navError => { return reject(navError) }, error => { return reject(new BaseError(`${response.statusText}: ${error}`, { logLevel: "error", displayType: "standard", severity: "normal" })); }); } isNavError(response.body).then( navError => { return reject(navError) }, response => { return resolve(response) }); }); break; } }); } function isNavError(data) { return new Promise(function(resolve, reject) { let json = ''; let soapMesage = ''; try { json = parser.toJson(data, { object: true }); } catch { return reject(data); } if (json['Soap:Envelope']) { soapMesage = json['Soap:Envelope']['Soap:Body']; } else if (json['s:Envelope']) { soapMesage = json['s:Envelope']['s:Body']; } else { return reject(data); } if (soapMesage['s:Fault']) { return resolve(new BaseError(`${soapMesage['s:Fault'].faultstring.$t}`, { logLevel: "error", displayType: "standard", severity: "normal" })) } else if (soapMesage['Soap:Fault']) { return resolve(new BaseError(`${soapMesage['Soap:Fault'].faultstring.$t}`, { logLevel: "error", displayType: "standard", severity: "normal" })) } else { return reject(data); } }); } module.exports.setParams = setParams; module.exports.navFetch = navFetch;