koa-lite/examples/streams-pipe.js

62 lines
1.0 KiB
JavaScript

var zlib = require('zlib');
var koa = require('..');
var fs = require('fs');
var app = koa();
// ignore favicons
app.use(function *(next){
if ('/favicon.ico' == this.path) this.status = 404;
yield next;
});
// logger
app.use(function *(next){
console.log('%s %s', this.method, this.url);
yield next;
});
// stream a file
app.use(function *(next){
var path = __dirname + this.path;
var exists = yield isFile(path);
if (!exists) return yield next;
this.body = fs.createReadStream(path);
yield next;
});
// gzip the response
app.use(function *(next){
var body = this.body;
if (!body || !body.readable) return yield next;
var gzip = zlib.createGzip();
this.set('Content-Encoding', 'gzip');
this.body = gzip;
body.pipe(gzip);
yield next;
});
app.listen(3000);
/**
* Stat regular file helper.
*/
function isFile(file) {
return function(done){
fs.stat(file, function(err, stat){
if (err && 'ENOENT' == err.code) return done(null, false);
if (err) return done(err);
done(null, stat.isFile());
});
}
}