diff --git a/mods/config/index.js b/mods/config/index.js index 9c8dc09..81e0e44 100644 --- a/mods/config/index.js +++ b/mods/config/index.js @@ -7,12 +7,18 @@ var notify = require('./notify') var watch = require('./watch') var config = module.exports = { use: [ - require('../settings'), + require('../settings') ], settings: { config: { config: 'log_config' + }, + pollTime: { + config: 'poll_time', + prop: { + default: 350 + } } }, @@ -42,5 +48,9 @@ var config = module.exports = { set: function(name) { if (name === 'log_config') config.update(this) + }, + + after: function () { + config.update(this); } } diff --git a/mods/config/watch.browser.js b/mods/config/watch.browser.js index 24ac2f8..b7e72c1 100644 --- a/mods/config/watch.browser.js +++ b/mods/config/watch.browser.js @@ -1,19 +1,59 @@ -var read = require('./read') -var update = require('./update') -var notify = require('./notify') +var read = require('./read'); +var update = require('./update'); +var notify = require('./notify'); + +var ulogs = new Set(); + +var minPollTime = 350; +var maxPollTime = 5000; +var defaultPollTime = 350; module.exports = function(ulog) { - // storage events unfortunately only fire on events triggered by other windows... - // so we need to poll here... - setInterval(function(){ + var delay = defaultPollTime; + var intervalId = null; + + if(!ulogs.has(ulog)) { + // storage events unfortunately only fire on events triggered by other windows... + // so we need to poll here... + startPolling(); + + ulogs.add(ulog); + } + + return stopPolling; + + function stopPolling() { + if(intervalId !== null) { + clearInterval(intervalId); + + intervalId = null; + } + } + function startPolling(){ + intervalId = setInterval(pollStorageConfig, delay) + } + + function pollStorageConfig(){ if (ulog.config) { - var cfg = read(ulog) - setTimeout(function(){ - var changed = update(ulog.config, cfg) - if (changed.length) setTimeout(function(){ - notify(ulog, changed) - }, 0) - }, 0) + var cfg = read(ulog); + + var changed = update(ulog.config, cfg); + + if (changed.length) { + notify(ulog, changed) + } + + var newDelay = parseInt(ulog.get('poll_time'), 10) || defaultPollTime; + if(newDelay < minPollTime) { + newDelay = minPollTime; + } else if(newDelay > maxPollTime) { + newDelay = maxPollTime; + } + if (newDelay !== delay) { + delay = newDelay; + stopPolling(); + startPolling(); + } } - }, 350) -} + } +}; diff --git a/mods/levels/test.js b/mods/levels/test.js index f2c8d15..54ace47 100644 --- a/mods/levels/test.js +++ b/mods/levels/test.js @@ -32,6 +32,8 @@ test('mod: levels', function (t) { t.test('levels.ext(logger: Function)', function (t) { ulog.use(levels) + //simple workaround to fix test problem in pull request #58 + ulog.set('level', 'info') var logger = ulog('test') t.equal(logger.NONE, 0, 'creates a property `NONE`') for (lvl in ulog.levels) {