UNPKG

@camar/http

Version:

To use __superconductor__ you need to build sources by `yarn build`

79 lines (78 loc) 2.93 kB
"use strict"; 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;