domotz-remote-pawn
Version:
Domotz Agent
114 lines (100 loc) • 3.67 kB
JavaScript
/** This file is part of Domotz Agent.
* Copyright (C) 2016 Domotz Ltd
*
* Domotz Agent is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Domotz Agent is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Domotz Agent. If not, see <http://www.gnu.org/licenses/>.
**/
/**
*
* Created by Tommaso Latini <ipapalini@domotz.com> on 17/09/15.
*/
const BASE_RETRY_INTERVAL = 10000;
const MAX_RETRY_INTERVAL = 60 * 1000 * 5; // 5 minutes
var factory = function (connectionManager, consumer, resourceLocator) {
var myConsole = resourceLocator.log.decorateLogs();
var status = resourceLocator.status;
var event = resourceLocator.event;
var amqpConnection;
var retryInterval = BASE_RETRY_INTERVAL;
function retryConnection() {
myConsole.info('Retrying connection in ' + retryInterval + ' ms');
setTimeout(function () {
listen();
}, retryInterval);
}
function setAgentStatus() {
if (status.get() === status.RESTRICTED) {
status.set(status.CONFIGURED);
}
retryInterval = BASE_RETRY_INTERVAL;
}
function setConnectionEventHandler(conn) {
amqpConnection = conn;
conn.on('error', function (err) {
myConsole.error('Connection Error ' + err.message);
});
conn.on('close', function (err) {
myConsole.error('Connection Close ' + err.message);
});
return conn;
}
function onChannelClose() {
myConsole.warn('Channel closed for any reason');
event.amqpConnectionClose();
}
function onChannelError(err) {
myConsole.error('onChannelError Connection refused with error: ' + err.message);
myConsole.error(err.stack);
amqpConnection.close();
}
function setChannelEventHandler(channel) {
channel.on('close', onChannelClose);
channel.on('error', onChannelError);
return channel;
}
function createChannel(conn) {
myConsole.debug('Creating channel for connection');
return conn.createChannel();
}
function listen() {
var url = connectionManager.createConnectionUrl();
return connectionManager
.connect(url)
.then(setConnectionEventHandler)
.then(connectionManager.setSignalHandler)
.then(createChannel)
.then(setChannelEventHandler)
.then(consumer.consume)
.then(setAgentStatus)
.catch(function (err) {
myConsole.error('Connection refused with error: ' + err.message);
if (err.message.indexOf('403') > -1) {
status.set(status.RESTRICTED);
if (retryInterval < MAX_RETRY_INTERVAL) {
retryInterval += BASE_RETRY_INTERVAL;
}
}
myConsole.error(err.stack);
retryConnection();
});
}
return {
retryConnection: retryConnection,
listen: listen,
/* unit test only */
_getRetryInterval: function _getRetryInterval() {
return retryInterval;
},
};
};
module.exports.factory = factory;