2018-10-23 23:45:42 +08:00
|
|
|
'use strict';
|
|
|
|
|
2015-04-27 22:22:37 +08:00
|
|
|
var queue = require('queue-async');
|
|
|
|
|
2015-01-23 23:37:38 +08:00
|
|
|
/**
|
2015-04-27 22:22:37 +08:00
|
|
|
* @param {Array|Object} cacheBackends each backend backend should respond to `invalidate(cacheObject, callback)` method
|
2015-01-23 23:37:38 +08:00
|
|
|
* @constructor
|
|
|
|
*/
|
2015-04-27 22:22:37 +08:00
|
|
|
function SurrogateKeysCache(cacheBackends) {
|
|
|
|
this.cacheBackends = Array.isArray(cacheBackends) ? cacheBackends : [cacheBackends];
|
2015-01-23 23:37:38 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
module.exports = SurrogateKeysCache;
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @param response should respond to `header(key, value)` method
|
|
|
|
* @param cacheObject should respond to `key() -> String` method
|
|
|
|
*/
|
|
|
|
SurrogateKeysCache.prototype.tag = function(response, cacheObject) {
|
2015-07-13 22:15:34 +08:00
|
|
|
var newKey = cacheObject.key();
|
2015-09-17 08:03:09 +08:00
|
|
|
response.set('Surrogate-Key', appendSurrogateKey(
|
|
|
|
response.get('Surrogate-Key'),
|
2015-07-13 22:15:34 +08:00
|
|
|
Array.isArray(newKey) ? cacheObject.key().join(' ') : newKey
|
|
|
|
));
|
|
|
|
|
2015-01-23 23:37:38 +08:00
|
|
|
};
|
|
|
|
|
2015-07-13 22:15:34 +08:00
|
|
|
function appendSurrogateKey(currentKey, newKey) {
|
|
|
|
if (!!currentKey) {
|
|
|
|
newKey = currentKey + ' ' + newKey;
|
|
|
|
}
|
|
|
|
return newKey;
|
|
|
|
}
|
|
|
|
|
2015-01-23 23:37:38 +08:00
|
|
|
/**
|
|
|
|
* @param cacheObject should respond to `key() -> String` method
|
|
|
|
* @param {Function} callback
|
|
|
|
*/
|
|
|
|
SurrogateKeysCache.prototype.invalidate = function(cacheObject, callback) {
|
2015-04-27 22:22:37 +08:00
|
|
|
var invalidationQueue = queue(this.cacheBackends.length);
|
|
|
|
|
|
|
|
this.cacheBackends.forEach(function(cacheBackend) {
|
|
|
|
invalidationQueue.defer(function(cacheBackend, done) {
|
|
|
|
cacheBackend.invalidate(cacheObject, done);
|
|
|
|
}, cacheBackend);
|
|
|
|
});
|
|
|
|
|
|
|
|
invalidationQueue.awaitAll(function(err, result) {
|
|
|
|
if (err) {
|
|
|
|
return callback(err);
|
|
|
|
}
|
|
|
|
callback(null, result);
|
|
|
|
});
|
2015-01-23 23:37:38 +08:00
|
|
|
};
|