diff options
Diffstat (limited to 'lib/history.js')
-rw-r--r-- | lib/history.js | 79 |
1 files changed, 46 insertions, 33 deletions
diff --git a/lib/history.js b/lib/history.js index bdc922d7..4a3bbe1e 100644 --- a/lib/history.js +++ b/lib/history.js @@ -2,7 +2,6 @@ //external modules var async = require('async'); var moment = require('moment'); -var childProcess = require('child_process'); //core var config = require("./config.js"); @@ -10,9 +9,6 @@ var logger = require("./logger.js"); var response = require("./response.js"); var models = require("./models"); -// workers -var historyUpdater = require("./workers/historyUpdater"); - //public var History = { historyGet: historyGet, @@ -24,50 +20,49 @@ var History = { var caches = {}; //update when the history is dirty -var updaterIsBusy = false; var updater = setInterval(function () { - if (updaterIsBusy) return; var deleted = []; - var _caches = {}; - Object.keys(caches).forEach(function (key) { + async.each(Object.keys(caches), function (key, callback) { var cache = caches[key]; if (cache.isDirty) { - _caches[key] = cache.history; - cache.isDirty = false; + if (config.debug) logger.info("history updater found dirty history: " + key); + var history = parseHistoryToArray(cache.history); + finishUpdateHistory(key, history, function (err, count) { + if (err) return callback(err, null); + if (!count) return callback(null, null); + cache.isDirty = false; + cache.updateAt = Date.now(); + return callback(null, null); + }); } else { if (moment().isAfter(moment(cache.updateAt).add(5, 'minutes'))) { deleted.push(key); } + return callback(null, null); } + }, function (err) { + if (err) return logger.error('history updater error', err); }); // delete specified caches for (var i = 0, l = deleted.length; i < l; i++) { caches[deleted[i]].history = {}; delete caches[deleted[i]]; } - if (Object.keys(_caches).length <= 0) return; - updaterIsBusy = true; - var worker = childProcess.fork("./lib/workers/historyUpdater.js"); - if (config.debug) logger.info('history updater worker process started'); - worker.send({ - msg: 'update history', - caches: _caches - }); - worker.on('message', function (data) { - if (!data || !data.msg || !data.userid) return; - var cache = caches[data.userid]; - if (!cache) return; - switch(data.msg) { - case 'check': - cache.updateAt = Date.now(); - break; +}, 1000); + +function finishUpdateHistory(userid, history, callback) { + models.User.update({ + history: JSON.stringify(history) + }, { + where: { + id: userid } + }).then(function (count) { + return callback(null, count); + }).catch(function (err) { + return callback(err, null); }); - worker.on('close', function (code) { - updaterIsBusy = false; - if (config.debug) logger.info('history updater worker process exited with code ' + code); - }); -}, 1000); +} function isReady() { var dirtyCount = 0; @@ -106,7 +101,7 @@ function getHistory(userid, callback) { } function setHistory(userid, history) { - if (Array.isArray(history)) history = historyUpdater.parseHistoryToObject(history); + if (Array.isArray(history)) history = parseHistoryToObject(history); if (!caches[userid]) { caches[userid] = { history: {}, @@ -135,13 +130,31 @@ function updateHistory(userid, noteId, document) { } } +function parseHistoryToArray(history) { + var _history = []; + Object.keys(history).forEach(function (key) { + var item = history[key]; + _history.push(item); + }); + return _history; +} + +function parseHistoryToObject(history) { + var _history = {}; + for (var i = 0, l = history.length; i < l; i++) { + var item = history[i]; + _history[item.id] = item; + } + return _history; +} + function historyGet(req, res) { if (req.isAuthenticated()) { getHistory(req.user.id, function (err, history) { if (err) return response.errorInternalError(res); if (!history) return response.errorNotFound(res); res.send({ - history: historyUpdater.parseHistoryToArray(history) + history: parseHistoryToArray(history) }); }); } else { |