DRY up the static cache

This commit is contained in:
John Crepezzi 2011-11-21 22:53:50 -05:00
parent 83cb68ada2
commit 1382ec47b2
2 changed files with 35 additions and 26 deletions

1
TODO
View File

@ -5,7 +5,6 @@ add feedback for errors to UI - esp. too long
add about page add about page
make asset caching optional make asset caching optional
todo store buffer instead of string while grabbing contents (if possible) todo store buffer instead of string while grabbing contents (if possible)
write cache to use callback instead of using non-DRY code
# shared version only # shared version only
some way to do announcements easily (and use for ads) some way to do announcements easily (and use for ads)

View File

@ -35,40 +35,50 @@ StaticHandler.prototype.handle = function(incPath, response) {
// Go to index if not found or / // Go to index if not found or /
if (!this.availablePaths[incPath]) incPath = this.defaultPath; if (!this.availablePaths[incPath]) incPath = this.defaultPath;
var filePath = this.basePath + (incPath == '/' ? this.defaultPath : incPath); var filePath = this.basePath + (incPath == '/' ? this.defaultPath : incPath);
// And then stream the file back // And then stream the file back - either from the cache or from source
if (StaticHandler.cache[filePath]) { var cached = this.isCached(filePath);
this.serveCached(filePath, response); var method = cached ? this.serveCached : this.retrieve;
} // Run!
else { method(filePath, function(error, content) {
this.retrieve(filePath, response); // Get the content
} if (content) {
};
// Retrieve from the file
StaticHandler.prototype.retrieve = function(filePath, response) {
var _this = this;
fs.readFile(filePath, function(error, content) {
if (error) {
winston.error('unable to read file', { path: filePath, error: error.message });
response.writeHead(500, { 'content-type': 'application/json' });
response.end(JSON.stringify({ message: 'IO: Unable to read file' }));
}
else {
var contentType = StaticHandler.contentTypeFor(path.extname(filePath)); var contentType = StaticHandler.contentTypeFor(path.extname(filePath));
response.writeHead(200, { 'content-type': contentType }); response.writeHead(200, { 'content-type': contentType });
response.end(content, 'utf-8'); response.end(content, 'utf-8');
// Stick it in the cache // Stick it in the cache if its not in there
if (!cached) {
StaticHandler.cache[filePath] = content; StaticHandler.cache[filePath] = content;
} }
}
// Or break down and cry
else {
winston.error('unable to read file', { path: filePath, error: error });
response.writeHead(500, { 'content-type': 'application/json' });
response.end(JSON.stringify({ message: 'IO: Unable to read file' }));
// If it was cached, bust the cache
if (cached) {
StaticHandler.cache[filePath] = null;
}
}
}); });
}; };
// Retrieve from memory cache // Retrieve from the file
StaticHandler.prototype.serveCached = function(filePath, response) { StaticHandler.prototype.retrieve = function(filePath, callback) {
var contentType = StaticHandler.contentTypeFor(path.extname(filePath)); var _this = this;
response.writeHead(200, { 'content-type': contentType }); fs.readFile(filePath, function(error, content) {
response.end(StaticHandler.cache[filePath], 'utf-8'); callback(error, content);
});
}; };
// Retrieve from memory cache
StaticHandler.prototype.serveCached = function(filePath, callback) {
callback(undefined, StaticHandler.cache[filePath]);
};
// Determine if a given filePath is cached or not
StaticHandler.prototype.isCached = function(filePath) {
return !!StaticHandler.cache[filePath];
};
module.exports = StaticHandler; module.exports = StaticHandler;