116 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			116 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
(function (exports) {
 | 
						|
  'use strict';
 | 
						|
 | 
						|
    var JohnnyCache;
 | 
						|
    var Oauth3 = (exports.OAUTH3 || require('./oauth3'));
 | 
						|
 | 
						|
    /*
 | 
						|
    function batchApiCall(ids, url, handler) {
 | 
						|
      // freshIds, staleIds = ids.filter()
 | 
						|
      // get url but don't cache
 | 
						|
      handler(result, function (id, data) {
 | 
						|
        // put id into result set
 | 
						|
      });
 | 
						|
    }
 | 
						|
    */
 | 
						|
 | 
						|
    function create(opts) {
 | 
						|
      var myInstance = {};
 | 
						|
      var conf = {
 | 
						|
        config: opts.config
 | 
						|
      , storage: opts.storage
 | 
						|
      //, caches: {}
 | 
						|
      };
 | 
						|
 | 
						|
      Object.keys(JohnnyCache.api).forEach(function (key) {
 | 
						|
        myInstance[key] = function () {
 | 
						|
          var args = Array.prototype.slice.call(arguments);
 | 
						|
          args.unshift(conf);
 | 
						|
          return JohnnyCache.api[key].apply(null, args);
 | 
						|
        };
 | 
						|
      });
 | 
						|
 | 
						|
      return myInstance;
 | 
						|
    }
 | 
						|
 | 
						|
    function init(conf) {
 | 
						|
      return conf.storage.get('caches').then(function (result) {
 | 
						|
        conf.caches = result;
 | 
						|
      }, function () {
 | 
						|
        conf.caches = {};
 | 
						|
      });
 | 
						|
    }
 | 
						|
 | 
						|
    function read(conf, id, realFetch, opts) {
 | 
						|
      var refreshWait = conf.config.refreshWait;
 | 
						|
      var uselessWait = conf.config.uselessWait;
 | 
						|
      var fresh;
 | 
						|
      var usable;
 | 
						|
      var now;
 | 
						|
      var promise;
 | 
						|
 | 
						|
      function fetch() {
 | 
						|
        return realFetch().then(function (result) {
 | 
						|
          if ('string' === typeof result) {
 | 
						|
            // TODO explicit option for strings
 | 
						|
            return Oauth3.PromiseA.reject("expected json, but got a string, which is probably an error");
 | 
						|
          }
 | 
						|
          return fin(result);
 | 
						|
        });
 | 
						|
      }
 | 
						|
 | 
						|
      function fin(value) {
 | 
						|
        promise = null;
 | 
						|
        conf.caches[id] = Date.now();
 | 
						|
        return conf.storage.set(id, value).then(function () {
 | 
						|
          return conf.storage.set('caches', conf.caches).then(function () {
 | 
						|
            return { updated: conf.caches[id], value: value, stale: false };
 | 
						|
          });
 | 
						|
        });
 | 
						|
      }
 | 
						|
 | 
						|
      if (conf.caches[id] && !(opts && opts.expire)) {
 | 
						|
        now = Date.now();
 | 
						|
        usable = now - conf.caches[id] < uselessWait;
 | 
						|
        fresh = now - conf.caches[id] < refreshWait;
 | 
						|
        if (!fresh) {
 | 
						|
          promise = fetch();
 | 
						|
        }
 | 
						|
      }
 | 
						|
 | 
						|
      return conf.storage.get(id).then(function (result) {
 | 
						|
        if ('string' === typeof result) {
 | 
						|
          // TODO explicit option
 | 
						|
          return (promise || fetch());
 | 
						|
        }
 | 
						|
        if (usable) {
 | 
						|
          return Oauth3.PromiseA.resolve({ updated: conf.caches[id], value: result, stale: !fresh });
 | 
						|
        } else {
 | 
						|
          return (promise || fetch());
 | 
						|
        }
 | 
						|
      }, function () {
 | 
						|
        return (promise || fetch());
 | 
						|
      });
 | 
						|
    }
 | 
						|
 | 
						|
    function destroy(conf) {
 | 
						|
      conf.caches = {};
 | 
						|
      return conf.storage.clear();
 | 
						|
    }
 | 
						|
 | 
						|
    JohnnyCache = {
 | 
						|
      create: create
 | 
						|
    , api: {
 | 
						|
        init: init
 | 
						|
      , read: read
 | 
						|
      , destroy: destroy
 | 
						|
      , clear: destroy
 | 
						|
      }
 | 
						|
    };
 | 
						|
    exports.JohnnyCache = JohnnyCache.JohnnyCache = JohnnyCache;
 | 
						|
 | 
						|
    if ('undefined' !== typeof module) {
 | 
						|
      module.exports = JohnnyCache;
 | 
						|
    }
 | 
						|
}('undefined' !== typeof exports ? exports : window));
 |