onvif
Version:
Client to ONVIF NVT devices Profile S: cameras
162 lines (135 loc) • 4.36 kB
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 <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 && 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 && 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>