SecurityCam.js/capture.js

154 lines
2.6 KiB
JavaScript
Raw Normal View History

2016-07-10 17:34:49 +00:00
var http = require('http');
var stream = require('stream');
2016-07-10 17:34:49 +00:00
var config = require('./config');
2016-07-10 17:34:49 +00:00
function runCommand(command, displayName, callback)
2016-07-10 17:34:49 +00:00
{
var wait = function()
2016-07-10 17:34:49 +00:00
{
if (command.wait)
{
setTimeout(callback, command.wait)
}
else
callback();
}
if (command.url)
{
console.log('Running command: ' + (command.displayName ? command.displayName : displayName));
req = http.request(command.url, function(res)
{
res.resume();
wait();
});
req.on('error', function(e)
{
console.log(e);
wait();
});
2016-07-10 17:34:49 +00:00
req.end();
}
else
wait();
}
2016-07-10 17:34:49 +00:00
function runCommands(commandArray, displayName, callback)
{
if (!commandArray || !commandArray.length)
{
callback();
return;
}
2016-07-10 17:34:49 +00:00
var commandIndex = 0;
(function runNextCommand()
{
if (commandIndex < commandArray.length)
2016-07-10 17:34:49 +00:00
{
runCommand(commandArray[commandIndex], displayName + ' #' + (commandIndex + 1), function()
2016-07-10 17:34:49 +00:00
{
runNextCommand();
});
commandIndex++;
}
else
callback();
})();
}
2016-07-10 17:34:49 +00:00
module.exports =
{
init: function(cams)
{
// Preload all modules to get error messages early
for (var camId in cams)
{
if (cams.hasOwnProperty(camId))
2016-07-10 17:34:49 +00:00
{
require('./output-' + cams[camId].output);
2016-07-10 17:34:49 +00:00
}
}
},
start: function(camId, cam, now)
{
var timer = null;
var req = null;
var output = new (require('./output-' + cam.output))(camId, cam.outputOptions, now);
var duringDone = false;
var queueAfter = false;
2016-07-10 17:34:49 +00:00
runCommands(cam.before, 'before', function()
2016-07-10 17:34:49 +00:00
{
var cleanup = function()
2016-07-10 17:34:49 +00:00
{
if (timer !== null)
{
clearTimeout(timer);
timer = null;
}
if (output !== null)
{
output.cleanup();
output = null;
}
// If the stream is cut short, or the time is configured
// to be less than the duration of the 'during' commands,
// queue it up.
if (duringDone)
runCommands(cam.after, 'after', function() { });
else
queueAfter = true;
};
2016-07-10 17:34:49 +00:00
req = http.request(cam.url, function(res)
2016-07-10 17:34:49 +00:00
{
runCommands(cam.during, 'during', function()
{
if (queueAfter)
runCommands(cam.after, 'after', function() { });
else
duringDone = true;
});
timer = setTimeout(function()
{
req.abort();
cleanup();
}, cam.time || config.defaultTime || 10000);
res.on('end', function()
{
cleanup();
});
res.pipe(output.getStream());
2016-07-10 17:34:49 +00:00
});
req.on('error', function(e)
2016-07-10 17:34:49 +00:00
{
console.log(e);
2016-07-10 17:34:49 +00:00
cleanup();
});
req.end();
2016-07-10 17:34:49 +00:00
});
}
};