UNPKG

domotz-remote-pawn

Version:

Domotz Agent

114 lines (100 loc) 3.67 kB
/** 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;