diff --git a/lib/commands/metadata.js b/lib/commands/metadata.js index 3d20f36e6..896c89f31 100644 --- a/lib/commands/metadata.js +++ b/lib/commands/metadata.js @@ -13,11 +13,19 @@ Data.getMetadataRaw = function (Env, channel /* channelName */, _cb) { var cached = Env.metadata_cache[channel]; if (HK.isMetadataMessage(cached)) { + Env.checkCache(channel); return void cb(void 0, cached); } Env.batchMetadata(channel, cb, function (done) { - Env.computeMetadata(channel, done); + Env.computeMetadata(channel, function (err, meta) { + if (!err && HK.isMetadataMessage(meta)) { + Env.metadata_cache[channel] = meta; + // clear metadata after a delay if nobody has joined the channel within 30s + Env.checkCache(channel); + } + done(err, meta); + }); }); }; diff --git a/lib/env.js b/lib/env.js index 3a876f1f7..322f629c6 100644 --- a/lib/env.js +++ b/lib/env.js @@ -42,6 +42,8 @@ module.exports.create = function (config) { metadata_cache: {}, channel_cache: {}, + cache_checks: {}, + queueStorage: WriteQueue(), queueDeletes: WriteQueue(), queueValidation: WriteQueue(), @@ -117,8 +119,14 @@ module.exports.create = function (config) { } }()); - - + Env.checkCache = function (channel) { + var f = Env.cache_checks[channel] || Util.throttle(function () { + delete Env.cache_checks[channel]; + if (Env.channel_cache[channel]) { return; } + delete Env.metadata_cache[channel]; + }, 30000); + f(); + }; (function () { var custom = config.customLimits;