zeta
Version:
Write node web app in an angular and unexpress way
102 lines (94 loc) • 3.27 kB
JavaScript
var swig = require('swig'),
fs = require('fs'),
mime = require('mime');
var cache = {},
cacheRender = {},
cacheTime = {},
cacheMime = {};
var render = function(file, json) {
var self = this,
path = this._public + file;
if (cacheTime[file]) {
fs.stat(path, function(err, stat) {
if (err)
self.status(500).end('Server Internal Error: ' + JSON.stringify(err));
else {
if (stat.mtime == cacheTime[file]) {
self.end(cacheRender[file](json));
} else {
cacheTime[file] = stat.mtime;
cacheRender[file] = swig.compileFile(path);
self.end(cacheRender[file](json));
}
}
});
} else {
fs.stat(path, function(err, stat) {
if (err)
self.status(500).end('Server Internal Error: ' + JSON.stringify(err));
else {
cacheTime[file] = stat.mtime;
cacheRender[file] = swig.compileFile(path);
self.end(cacheRender[file](json));
}
});
}
return this;
};
var sendFile = function(file) {
var self = this,
path = this._public + file;
if (cacheTime[file]) {
fs.stat(path, function(err, stat) {
if (err)
self.status(500).end('Server Internal Error: ' + JSON.stringify(err));
else {
if (stat.mtime == cacheTime[file]) {
self.head('Content-Type', cacheMime[file])
.end(cache[file]);
} else {
fs.readFile(path, function(err, data) {
if (err)
self.status(500).end('Server Internal Error: ' + JSON.stringify(err));
else {
cacheTime[file] = stat.mtime;
cacheMime[file] = mime.lookup(path);
cache[file] = data;
self.head('Content-Type', cacheMime[file])
.end(cache[file]);
}
});
}
}
});
} else {
fs.stat(path, function(err, stat) {
if (err)
self.status(500).end('Server Internal Error: ' + JSON.stringify(err));
else {
fs.readFile(path, function(err, data) {
if (err)
self.status(500).end('Server Internal Error: ' + JSON.stringify(err));
else {
cacheTime[file] = stat.mtime;
cacheMime[file] = mime.lookup(path);
cache[file] = data;
self.head('Content-Type', cacheMime[file])
.end(cache[file]);
}
});
}
});
}
return this;
};
var provider = function(k, v) {
if (arguments.length == 2) {
this._pvd[k] = v;
return this;
} else
return this._pvd[k];
};
exports.render = render;
exports.sendFile = sendFile;
exports.provider = provider;