hono
Version:
Web framework built on Web Standards
58 lines (57 loc) • 1.42 kB
JavaScript
// src/router/smart-router/router.ts
import { MESSAGE_MATCHER_IS_ALREADY_BUILT, UnsupportedPathError } from "../../router.js";
var SmartRouter = class {
name = "SmartRouter";
routers = [];
routes = [];
constructor(init) {
Object.assign(this, init);
}
add(method, path, handler) {
if (!this.routes) {
throw new Error(MESSAGE_MATCHER_IS_ALREADY_BUILT);
}
this.routes.push([method, path, handler]);
}
match(method, path) {
if (!this.routes) {
throw new Error("Fatal error");
}
const { routers, routes } = this;
const len = routers.length;
let i = 0;
let res;
for (; i < len; i++) {
const router = routers[i];
try {
routes.forEach((args) => {
router.add(...args);
});
res = router.match(method, path);
} catch (e) {
if (e instanceof UnsupportedPathError) {
continue;
}
throw e;
}
this.match = router.match.bind(router);
this.routers = [router];
this.routes = void 0;
break;
}
if (i === len) {
throw new Error("Fatal error");
}
this.name = `SmartRouter + ${this.activeRouter.name}`;
return res;
}
get activeRouter() {
if (this.routes || this.routers.length !== 1) {
throw new Error("No active router has been determined yet.");
}
return this.routers[0];
}
};
export {
SmartRouter
};