aboutsummaryrefslogtreecommitdiff
path: root/lib/router.js
blob: deb2a8cb755072b6fa87d20af034d1a8a02f863b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
"use strict" // https://github.com/mixu/minimal

const url = require("url");
const degroup = path => Object.assign(path, path.groups);

class Router {
  constructor() {
    this.routes = [];
  }

  route(req, res) {
    const pathname = url.parse(req.url).pathname;
    return this.routes.some(route => {
      const isMatch = route.method === req.method && route.re.test(pathname);
      if (isMatch) route.cb(req, res, degroup(route.re.exec(pathname)));
      return isMatch;
    });
  }

  gather(cb, max) { // Handle POST data
    return (req, res, match) => {
      let data = "";
      req.on("data", chunk => {
        if ((data += chunk).length > (max||1e6)) // ~1MB
          req.connection.destroy();
      }).on("end", () => cb(req, res, match, data));
    };
  }

  gpost(re, cb, max) { // Laziness
    this.post(re, this.gather(cb, max));
  }
}

["get", "post", "put", "delete"].forEach(method =>
  Router.prototype[method] = function(re, cb) {
    this.routes.push({method: method.toUpperCase(), cb,
      re: (re instanceof RegExp)? re : new RegExp(`^${re}$`)})});

module.exports = Router;