UNPKG

onvif

Version:

Client to ONVIF NVT devices Profile S: cameras

162 lines (135 loc) 4.36 kB
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <title>JSDoc: Source: utils.js</title> <script src="scripts/prettify/prettify.js"> </script> <script src="scripts/prettify/lang-css.js"> </script> <!--[if lt IE 9]> <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script> <![endif]--> <link type="text/css" rel="stylesheet" href="styles/prettify-tomorrow.css"> <link type="text/css" rel="stylesheet" href="styles/jsdoc-default.css"> </head> <body> <div id="main"> <h1 class="page-title">Source: utils.js</h1> <section> <article> <pre class="prettyprint source linenums"><code>/** * @namespace utils * @description Common utils module * @author Andrew D.Laptev &lt;a.d.laptev@gmail.com> * @licence MIT */ const xml2js = require('xml2js') , numberRE = /^-?([1-9]\d*|0)(\.\d*)?$/ , dateRE = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(.\d+)?Z$/ , prefixMatch = /(?!xmlns)^.*:/ ; /** * Parse SOAP object to pretty JS-object * @param {object} xml * @returns {object} */ const linerase = function(xml) { if (Array.isArray(xml)) { if (xml.length > 1) { return xml.map(linerase); } else { xml = xml[0]; } } if (typeof xml === 'object') { var obj = {}; Object.keys(xml).forEach(function(key) { if (key === '$') { obj.$ = linerase(xml.$); } else { obj[key] = linerase(xml[key]); } }); return obj; } else { if (xml === 'true') { return true; } if (xml === 'false') { return false; } if (numberRE.test(xml)) { return parseFloat(xml); } if (dateRE.test(xml)) { return new Date(xml); } return xml; } }; /** * @callback ParseSOAPStringCallback * @property {?Error} error * @property {object} SOAP response * @property {string} raw XML */ /** * Parse SOAP response * @param {string} xml * @param {ParseSOAPStringCallback} callback */ const parseSOAPString = function(xml, callback) { /* Filter out xml name spaces */ xml = xml.replace(/xmlns(.*?)=(".*?")/g,''); xml2js.parseString( xml , { tagNameProcessors: [function(str) { str = str.replace(prefixMatch, ''); var secondLetter = str.charAt(1); if (secondLetter &amp;&amp; secondLetter.toUpperCase() !== secondLetter) { return str.charAt(0).toLowerCase() + str.slice(1); } else { return str; } }] } , function(err, result) { if (!result || !result['envelope'] || !result['envelope']['body']) { callback(new Error('Wrong ONVIF SOAP response'), null, xml); } else { if (!err &amp;&amp; result['envelope']['body'][0]['fault']) { err = new Error( 'ONVIF SOAP Fault: ' + ( result['envelope']['body'][0]['fault'][0]['reason'][0]['text'][0]._ || JSON.stringify(linerase(result['envelope']['body'][0]['fault'][0]['code'][0])) ) ); } callback(err, result['envelope']['body'], xml); } }); }; const s4 = function() { return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1); }; /** * Generate GUID * @returns {string} */ const guid = function() { return (s4() + s4() + '-' + s4() + '-' + s4() + '-' + s4() + '-' + s4() + s4() + s4()); }; module.exports = { linerase: linerase , parseSOAPString: parseSOAPString , guid: guid }; </code></pre> </article> </section> </div> <nav> <h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="Cam_.html">Cam</a></li><li><a href="Discovery_.html">Discovery</a></li></ul><h3>Events</h3><ul><li><a href="Cam_.html#event:event">event</a></li><li><a href="Cam_.html#event:rawResponse">rawResponse</a></li><li><a href="Discovery_.html#event:device">device</a></li><li><a href="Discovery_.html#event:error">error</a></li></ul><h3>Namespaces</h3><ul><li><a href="cam.html">cam</a></li><li><a href="discovery.html">discovery</a></li><li><a href="utils.html">utils</a></li></ul><h3>Global</h3><ul><li><a href="global.html#guid">guid</a></li><li><a href="global.html#linerase">linerase</a></li><li><a href="global.html#parseSOAPString">parseSOAPString</a></li></ul> </nav> <br class="clear"> <footer> Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.0</a> on Mon Jun 20 2016 15:42:17 GMT+0300 (MSK) </footer> <script> prettyPrint(); </script> <script src="scripts/linenumber.js"> </script> </body> </html>