@chaffity/drowsy-server
Version:
Server library for Drowsy
67 lines (49 loc) • 1.74 kB
JavaScript
;
const http = require('http');
const methodRefs = {};
for (const method of ['GET', 'POST', 'PUT', 'PATCH', 'DELETE']) {
methodRefs[method] = Symbol(`${method} Method Reference`);
}
const handlerRef = Symbol('Handler Reference');
module.exports = () => {
const routes = {};
const methods = {};
const middlewares = [];
let server = http.createServer((req, res) => {
const urlParts = req.url.split(/\//).filter(_ => _).map(_ => _.toLowerCase());
let handlerLookup = routes;
for (let i = 0, n = urlParts.length; i < n; i++) {
handlerLookup = handlerLookup[urlParts[i]];
if (!handlerLookup) {
break;
}
}
if (handlerLookup && handlerLookup[handlerRef] && handlerLookup[handlerRef][methodRefs[req.method]]) {
for (let i = 0, n = middlewares.length; i < n; i++) {
middlewares[i](req, res);
}
return handlerLookup[handlerRef][methodRefs[req.method]](req, res);
} else {
res.end('Not found');
}
});
for (const method in methodRefs) {
methods[method.toLowerCase()] = (url, handler) => {
const urlParts = url.split(/\//).filter(_ => _).map(_ => _.toLowerCase());
let handlerLookup = routes;
for (let i = 0, n = urlParts.length; i < n; i++) {
handlerLookup = handlerLookup[urlParts[i]] || (handlerLookup[urlParts[i]] = {});
}
handlerLookup[handlerRef] = handlerLookup[handlerRef] || {};
handlerLookup[handlerRef][methodRefs[method]] = handler;
};
}
methods.use = (middleware) => {
if (typeof middleware === 'function') {
middlewares.push(middleware);
} else {
throw Error('Invalid middleware');
}
}
return Object.assign(server, methods);
};