define([ // XXX Load util and use mkAsync '/bower_components/localforage/dist/localforage.min.js', ], function (localForage) { var S = {}; var cache = localForage.createInstance({ name: "cp_cache" }); // id: channel ID or blob ID // returns array of messages S.getChannelCache = function (id, cb) { cache.getItem(id, function (err, obj) { if (err || !obj || !Array.isArray(obj.c)) { return void cb(err || 'EINVAL'); } cb(null, obj); }); }; var checkCheckpoints = function (array) { if (!Array.isArray(array)) { return; } var cp = 0; // XXX check sliceCpIndex from hk-util: use the same logic for forks for (var i = array.length - 1; i >= 0; i--) { if (array[i].isCheckpoint) { cp++; } if (cp === 2) { array.splice(0, i); break; } } }; S.storeCache = function (id, validateKey, val, cb) { cb = cb || function () {}; if (!Array.isArray(val) || !validateKey) { return void cb('EINVAL'); } checkCheckpoints(val); cache.setItem(id, { k: validateKey, c: val // XXX add "time" here +new Date() ==> we want to store the time when it was updated in our indexeddb in case we want to remove inactive entries from indexeddb later // XXX we would also need to update the time when we "getChannelCache" }, function (err) { cb(err); }); }; S.clearChannel = function (id, cb) { cb = cb || function () {}; cache.removeItem(id, cb); }; S.clear = function () { cache.clear(); }; return S; });