/* | |
MIT License http://www.opensource.org/licenses/mit-license.php | |
Author Tobias Koppers @sokra | |
*/ | |
"use strict"; | |
function getCacheId(request, withContext) { | |
return JSON.stringify({ | |
context: withContext ? request.context : "", | |
path: request.path, | |
query: request.query, | |
request: request.request | |
}); | |
} | |
module.exports = class UnsafeCachePlugin { | |
constructor(source, filterPredicate, cache, withContext, target) { | |
this.source = source; | |
this.filterPredicate = filterPredicate; | |
this.withContext = withContext; | |
this.cache = cache || {}; | |
this.target = target; | |
} | |
apply(resolver) { | |
const target = resolver.ensureHook(this.target); | |
resolver.getHook(this.source).tapAsync("UnsafeCachePlugin", (request, resolveContext, callback) => { | |
if(!this.filterPredicate(request)) return callback(); | |
const cacheId = getCacheId(request, this.withContext); | |
const cacheEntry = this.cache[cacheId]; | |
if(cacheEntry) { | |
return callback(null, cacheEntry); | |
} | |
resolver.doResolve(target, request, null, resolveContext, (err, result) => { | |
if(err) return callback(err); | |
if(result) return callback(null, this.cache[cacheId] = result); | |
callback(); | |
}); | |
}); | |
} | |
}; |