description and source-codefunction serve(root, opts) {
opts = opts || {};
assert(root, 'root directory is required to serve files');
// options
debug('static "%s" %j', root, opts);
opts.root = resolve(root);
if (opts.index !== false) opts.index = opts.index || 'index.html';
if (!opts.defer) {
return function serve(ctx, next){
if (ctx.method == 'HEAD' || ctx.method == 'GET') {
return send(ctx, ctx.path, opts).then(done => {
if (!done) {
return next();
}
});
}
return next();
};
}
return function serve(ctx, next){
return next().then(() => {
if (ctx.method != 'HEAD' && ctx.method != 'GET') return;
// response is already handled
if (ctx.body != null || ctx.status != 404) return;
return send(ctx, ctx.path, opts);
});
};
}