|
|
@ -2,26 +2,35 @@ const url = require('url') |
|
|
|
const PathParser = require('path-parser').default |
|
|
|
|
|
|
|
const serve404 = require('./serve-404.js') |
|
|
|
const serveHelp = require('./serve-help.js') |
|
|
|
const serveBadge = require('./serve-badge.js') |
|
|
|
|
|
|
|
module.exports = function createHandler (schemes, handler, { help = '', examples = [] }) { |
|
|
|
const matchers = schemes.map(scheme => new PathParser(scheme)) |
|
|
|
|
|
|
|
module.exports = function createHandler (handlers, { help = '', examples = [] }) { |
|
|
|
return async function httpHandler (req, res) { |
|
|
|
const { pathname, query } = url.parse(req.url, true) |
|
|
|
|
|
|
|
// serve favicon
|
|
|
|
if (pathname === '/favicon.ico') { |
|
|
|
return serve404(req, res) |
|
|
|
} |
|
|
|
|
|
|
|
// serve help message
|
|
|
|
if (pathname.startsWith('/help')) { |
|
|
|
return serveHelp(req, res, help, examples) |
|
|
|
} |
|
|
|
|
|
|
|
// Lookup handler
|
|
|
|
let matchedArgs |
|
|
|
matchers.find(m => (matchedArgs = m.test(pathname))) |
|
|
|
const matchedScheme = Object.keys(handlers).find(scheme => { |
|
|
|
matchedArgs = new PathParser(scheme).test(pathname) |
|
|
|
return matchedArgs !== null |
|
|
|
}) |
|
|
|
|
|
|
|
if (matchedArgs) { |
|
|
|
const params = await handler(matchedArgs) |
|
|
|
if (matchedScheme) { |
|
|
|
const params = await handlers[matchedScheme](matchedArgs) |
|
|
|
return serveBadge(req, res, { params, query }) |
|
|
|
} else { |
|
|
|
return serve404(req, res) |
|
|
|
} |
|
|
|
|
|
|
|
return serve404(req, res) |
|
|
|
} |
|
|
|
} |
|
|
|