onvif-nvt
Version:
Wrapper for ONVIF spec to control NVT (Network Video Transitter) devices.
301 lines (251 loc) • 8.84 kB
JavaScript
const EventEmitter = require('events').EventEmitter;
const Soap = require('../utils/soap');
const Util = require('../utils/util');
const URL = require('url-parse');
class Events extends EventEmitter {
constructor() {
super();
this.soap = new Soap();
this.timeDiff = 0;
this.serviceAddress = null;
this.username = null;
this.password = null;
this.namespaceAttributes = ['xmlns:tev="http://www.onvif.org/ver10/events/wsdl"'];
this.intervalId = null;
}
init(timeDiff, serviceAddress, username, password) {
this.timeDiff = timeDiff;
this.serviceAddress = serviceAddress;
this.username = username;
this.password = password;
}
createRequest(body, subscriptionId) {
const request = {
body: body,
xmlns: this.namespaceAttributes,
diff: this.timeDiff,
username: this.username,
password: this.password
};
if (subscriptionId) {
request.subscriptionId = subscriptionId;
}
const soapEnvelope = this.soap.createRequest(request);
return soapEnvelope;
}
buildRequest(methodName, xml, subscriptionId, callback) {
const promise = new Promise((resolve, reject) => {
let errMsg = '';
if (typeof callback !== 'undefined' && callback !== null) {
if (errMsg = Util.isInvalidValue(callback, 'function')) {
reject(new Error(`The "callback" argument for ${methodName} is invalid:` + errMsg));
return;
}
}
if (typeof methodName === 'undefined' || methodName === null) {
reject(new Error('The "methodName" argument for buildRequest is required.'));
return;
} else {
if (errMsg = Util.isInvalidValue(methodName, 'string')) {
reject(new Error('The "methodName" argument for buildRequest is invalid:' + errMsg));
return;
}
}
let soapBody = '';
if (methodName === 'PullMessages') {
soapBody = xml;
} else if (typeof xml === 'undefined' || xml === null || xml === '') {
soapBody += `<tev:${methodName}/>`;
} else {
soapBody += `<tev:${methodName}>`;
soapBody += xml;
soapBody += `</tev:${methodName}>`;
}
const soapEnvelope = this.createRequest(soapBody, subscriptionId);
let serviceAddress = this.serviceAddress;
if (methodName === 'PullMessages') {
serviceAddress = new URL(subscriptionId.Address);
}
this.soap.makeRequest('events', serviceAddress, methodName, soapEnvelope).then(results => {
resolve(results);
}).catch(error => {
reject(error);
});
});
if (Util.isValidCallback(callback)) {
promise.then(results => {
callback(null, results);
}).catch(error => {
callback(error);
});
} else {
return promise;
}
}
startPull(loopTimeMS, timeout, messageLimit) {
loopTimeMS = loopTimeMS || 10000;
timeout = timeout || 'PT1M';
messageLimit = messageLimit || 1;
const getAll = () => {
this._getMessages(timeout, messageLimit).then(results => {
this.emit('messages', results);
console.log(results);
}).catch(error => {
this.emit('messages:error', error);
});
};
this.intervalId = setInterval(() => {
getAll();
}, loopTimeMS);
}
stopPull() {
clearInterval(this.intervalId);
this.intervalId = null;
}
_getMessages(timeout, messageLimit) {
return new Promise((resolve, reject) => {
this._createPullPointSubscription().then(results => {
this._pullMessages(results, timeout, messageLimit).then(results => {
resolve(results);
}).catch(error => {
reject(error);
});
}).catch(error => {
reject(error);
});
});
}
_createPullPointSubscription() {
return new Promise((resolve, reject) => {
this.createPullPointSubscription().then(results => {
console.log('CreatePullPointSubscription successful');
const response = results.data.CreatePullPointSubscriptionResponse;
const reference = response.SubscriptionReference;
let subscriptionId = {};
if (reference.ReferenceParameters) {
subscriptionId = reference.ReferenceParameters.SubscriptionId;
}
subscriptionId.Address = reference.Address;
resolve(subscriptionId);
}).catch(error => {
reject(error);
});
});
}
_pullMessages(subscriptionId, timeout, messageLimit) {
return new Promise((resolve, reject) => {
this.pullMessages(subscriptionId, timeout, messageLimit).then(results => {
resolve(results);
}).catch(error => {
reject(error);
});
});
}
createPullPointSubscription(filter, initialTerminationTime, subscriptionPolicy, callback) {
const promise = new Promise((resolve, reject) => {
let errMsg = '';
if (typeof filter !== 'undefined' && filter !== null) {
if (errMsg = Util.isInvalidValue(filter, 'string')) {
reject(new Error('The "filter" argument for createPullPointSubscription is invalid: ' + errMsg));
return;
}
}
if (typeof initialTerminationTime !== 'undefined' && initialTerminationTime !== null) {
if (errMsg = Util.isInvalidValue(initialTerminationTime, 'string')) {
reject(new Error('The "initialTerminationTime" argument for createPullPointSubscription is invalid: ' + errMsg));
return;
}
}
if (typeof subscriptionPolicy !== 'undefined' && subscriptionPolicy !== null) {
if (errMsg = Util.isInvalidValue(subscriptionPolicy, 'string')) {
reject(new Error('The "subscriptionPolicy" argument for createPullPointSubscription is invalid: ' + errMsg));
return;
}
}
let soapBody = '';
if (typeof filter !== 'undefined' && filter !== null) {
soapBody += '<tev:Filter>' + filter + '</tev:Filter>';
}
if (typeof initialTerminationTime !== 'undefined' && initialTerminationTime !== null) {
soapBody += '<tev:InitialTerminationTime>' + 'PT' + initialTerminationTime / 1000 + 'S' + '</tev:InitialTerminationTime>';
}
if (typeof subscriptionPolicy !== 'undefined' && subscriptionPolicy !== null) {
soapBody += '<tev:SubscriptionPolicy>' + subscriptionPolicy + '</tev:SubscriptionPolicy>';
}
this.buildRequest('CreatePullPointSubscription', soapBody).then(results => {
resolve(results);
}).catch(error => {
reject(error);
});
});
if (Util.isValidCallback(callback)) {
promise.then(result => {
callback(null, result);
}).catch(error => {
callback(error);
});
} else {
return promise;
}
}
getEventProperties(callback) {
return this.buildRequest('GetEventProperties', null, null, callback);
}
getServiceCapabilities(callback) {
return this.buildRequest('GetServiceCapabilities', null, null, callback);
}
pullMessages(subscriptionId, timeout, messageLimit, callback) {
const promise = new Promise((resolve, reject) => {
let errMsg = '';
if (errMsg = Util.isInvalidValue(timeout, 'string')) {
reject(new Error('The "timeout" argument for pullMessages is invalid: ' + errMsg));
return;
}
if (errMsg = Util.isInvalidValue(messageLimit, 'integer')) {
reject(new Error('The "messageLimit" argument for pullMessages is invalid: ' + errMsg));
return;
}
let soapBody = '';
soapBody = '<tev:PullMessages>';
soapBody += '<tev:Timeout>';
soapBody += timeout;
soapBody += '</tev:Timeout>';
soapBody += '<tev:MessageLimit>';
soapBody += messageLimit.toString();
soapBody += '</tev:MessageLimit>';
soapBody += '</tev:PullMessages>';
this.buildRequest('PullMessages', soapBody, subscriptionId).then(results => {
resolve(results);
}).catch(error => {
reject(error);
});
});
if (Util.isValidCallback(callback)) {
promise.then(result => {
callback(null, result);
}).catch(error => {
callback(error);
});
} else {
return promise;
}
}
renew(callback) {
return this.buildRequest('Renew', null, null, callback);
}
seek(utcTime, reverse, callback) {
return new Promise((resolve, reject) => {
reject(new Error('Not implemented'));
});
}
subscribe(callback) {
return this.buildRequest('Subscribe', null, null, callback);
}
unsubscribe(callback) {
return this.buildRequest('Unsubscribe', null, null, callback);
}
setSynchronizationPoint(callback) {
return this.buildRequest('SetSynchronizationPoint', null, null, callback);
}
}
module.exports = Events;