fix(reload): plugins are now reloaded instantly after config change

This commit is contained in:
Damian Mee 2014-09-01 02:09:20 +02:00
parent dd04fdc303
commit 78fc0d4360

View file

@ -11,13 +11,22 @@ var POLLING_RATE = 60 * 1000; // poll each minute
var db = null;
var tickerPlugin = null;
var traderPlugin = null;
var walletPlugin = null;
var idVerifierPlugin = null;
var currentlyUsedPlugins = {
ticker: null,
transfer: null,
trader: null,
idVerifier: null
};
var cachedConfig = null;
var deviceCurrency = 'USD'; // Can 'USD' be set as default?
var deviceCurrency = 'USD';
var lastBalances = null;
var lastRates = {};
@ -93,56 +102,65 @@ function loadPlugin(name, config) {
return plugin;
}
function loadOrConfigPlugin(pluginHandle, pluginType, currency, onChangeCb) {
var currentName = cachedConfig.exchanges.plugins.current[pluginType];
var pluginChanged = currentlyUsedPlugins[pluginType] !== currentName;
if (currentName) { // some plugins may be disabled
var pluginConfig = cachedConfig.exchanges.plugins.settings[currentName] || {};
if (currency) pluginConfig.currency = currency;
if (pluginHandle && !pluginChanged) pluginHandle.config(pluginConfig);
else pluginHandle = loadPlugin(currentName, pluginConfig);
}
if (typeof onChangeCb === 'function') onChangeCb(pluginHandle, currency);
return pluginHandle;
}
exports.configure = function configure(config) {
if (config.exchanges.settings.lowBalanceMargin < 1) {
throw new Error('`settings.lowBalanceMargin` has to be >= 1');
}
deviceCurrency = config.exchanges.settings.currency;
var plugins = config.exchanges.plugins;
// [required] configure (or load) ticker
var tickerName = plugins.current.ticker;
var tickerConfig = plugins.settings[tickerName] || {};
tickerConfig.currency = deviceCurrency;
if (tickerPlugin) tickerPlugin.config(tickerConfig);
else tickerPlugin = loadPlugin(tickerName, tickerConfig);
// [required] configure (or load) wallet
var walletName = plugins.current.transfer;
var walletConfig = plugins.settings[walletName] || {};
if (walletPlugin) walletPlugin.config(walletConfig);
else walletPlugin = loadPlugin(walletName, walletConfig);
// [optional] configure (or load) trader
var traderName = plugins.current.trade;
if (traderName) { // traderPlugin may be disabled
var traderConfig = plugins.settings[traderName] || {};
if (traderPlugin) traderPlugin.config(traderConfig);
else traderPlugin = loadPlugin(traderName, traderConfig);
}
// [optional] ID Verifier
var verifierName = plugins.current.idVerifier;
if (verifierName) { // idVerifierPlugin may be disabled
var verifierConfig = plugins.settings[verifierName] || {};
if (idVerifierPlugin) idVerifierPlugin.config(verifierConfig);
else idVerifierPlugin = loadPlugin(verifierName, verifierConfig);
}
cachedConfig = config;
pollBalance();
pollRate();
// TICKER [required] configure (or load)
loadOrConfigPlugin(
tickerPlugin,
'ticker',
config.exchanges.settings.currency, // device currency
function onTickerChange(newTicker, currency) {
tickerPlugin = newTicker;
pollRate();
}
);
// WALLET [required] configure (or load)
loadOrConfigPlugin(
walletPlugin,
'transfer',
null,
function onWalletChange(newWallet) {
walletPlugin = newWallet;
pollBalance();
}
);
// TRADER [optional] configure (or load)
traderPlugin = loadOrConfigPlugin(
traderPlugin,
'trade'
);
// ID VERIFIER [optional] configure (or load)
idVerifierPlugin = loadOrConfigPlugin(
idVerifierPlugin,
'idVerifier'
);
};
exports.getCachedConfig = function getCachedConfig() {
return cachedConfig;
@ -298,7 +316,7 @@ function pollBalance(callback) {
}
function pollRate(callback) {
logger.debug('polling for rates');
logger.debug('polling for rates (' + tickerPlugin.NAME + ')');
tickerPlugin.ticker(deviceCurrency, function(err, resRates) {
if (err) {