UNPKG

hopjs

Version:

A RESTful declarative API framework, with stub generators for Shell, and Android

82 lines (69 loc) 2.33 kB
var Hop = require('./cache'); var crypto = require('crypto'); var redis = require("redis"); if(Hop.cacheOptions.redisClient==undefined){ var client = redis.createClient(); } else { var client = Hop.cacheOptions.redisClient; } client.on("error", function (err) { Hop.log("Error " + err); }); Hop.Cache.clear=function(onComplete){ onComplete=onComplete||function(){} client.flushdb(onComplete); } Hop.cacheLog=function(){ if(Hop.cacheOptions.log){ var args = Array.prototype.slice.call(arguments); args.unshift("Cache:"); Hop.log.apply(null,args); } } Hop.Cache.store=function(cacheId,duration,req,input,err,result,next,force){ var entry = { expiresAt: (duration*1000)+(new Date()).getTime(), cachedAt: new Date().getTime(), err: err, result: result }; var md5 = crypto.createHash('md5'); md5.update(cacheId+":"+entry.cachedAt); entry.etag = md5.digest('hex'); req.getResponse().set('ETag',entry.etag); if(force) req.getResponse().set('Cache-Control','max-age='+Math.floor((entry.expiresAt - (new Date()).getTime())/1000.0)); Hop.cacheLog("Saving object in cache with:",cacheId) client.setex(cacheId,duration,JSON.stringify(entry)); next(); } Hop.Cache.fetch=function(cacheId,duration,req,input,onComplete,next,force){ client.get(cacheId,function(err,data){ if(!err && data){ try { Hop.cacheLog("Cache: hit ",cacheId,JSON.parse(data)); var entry = JSON.parse(data.toString()); if(entry.expiresAt > (new Date()).getTime()){ var md5 = crypto.createHash('md5'); md5.update(cacheId+":"+entry.cachedAt); entry.etag = md5.digest('hex'); req.getResponse().set('ETag',entry.etag); if(force) req.getResponse().set('Cache-Control','max-age='+Math.floor((entry.expiresAt - (new Date()).getTime())/1000.0)); if(req.get('If-None-Match') == entry.etag){ return req.getResponse().send("Not modified",304); } else { return onComplete(entry.err,entry.result); } } else return next(); } catch(e){ Hop.error(e); return next(); } } else return next(); }); } Hop.Cache.invalidate=function(cacheId){ Hop.cacheLog("deleting",cacheId); client.del(cacheId); }