ufiber
Version:
Next-gen webserver for node-js developer
52 lines (50 loc) • 1.36 kB
JavaScript
import { MESSAGE_MATCHER_IS_ALREADY_BUILT } from "../consts.js";
import { UnsupportedPathError } from "./error.js";
//#region src/router/smart.ts
var SmartRouter = class {
name = "SmartRouter";
#routers = [];
#routes = [];
constructor(init) {
this.#routers = init.routers;
}
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 = this.#routers;
const routes = this.#routes;
const len = routers.length;
let i = 0;
let res;
for (; i < len; i++) {
const router = routers[i];
try {
for (let i$1 = 0, len$1 = routes.length; i$1 < len$1; i$1++) router.add(...routes[i$1]);
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];
}
};
//#endregion
export { SmartRouter };