@camar/http
Version:
To use __superconductor__ you need to build sources by `yarn build`
79 lines (78 loc) • 2.93 kB
JavaScript
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
const url_1 = require("url");
const template_1 = require("./template");
const request_1 = require("./request");
class Router {
constructor() {
this.routes = new Map();
}
handleRequest(req, res) {
const set = this.getRoutesForMethod(req.method);
const url = new url_1.URL(req.url, 'http://localhost');
let longest;
for (const pair of set.entries()) {
const [template] = pair;
if (template.check(url.pathname) && (!longest || longest[0].length < template.length)) {
longest = pair;
}
}
if (longest) {
const params = longest[0].getParams(url.pathname);
const request = new request_1.Request(req, res, params, url);
this.executeHandler(request, res, longest[1]);
return;
}
else {
res.statusCode = 404;
res.write('not found');
res.end();
}
}
executeHandler(request, res, handler) {
return __awaiter(this, void 0, void 0, function* () {
try {
const result = yield handler(request);
if (result) {
res.writeHead(result.statusCode, result.headers);
res.statusMessage = result.statusMessage;
if (result.rawContent) {
res.write(result.rawContent);
}
res.end();
}
}
catch (e) {
console.error(e);
res.statusCode = 500;
res.write('error');
res.end();
}
});
}
getRoutesForMethod(method) {
if (this.routes.has(method)) {
return this.routes.get(method);
}
else {
const set = new Map();
this.routes.set(method, set);
return set;
}
}
registerHandler(template, handler, method = 'GET') {
const set = this.getRoutesForMethod(method);
const route = new template_1.default(template);
set.set(route, handler);
}
}
exports.default = Router;
;