58 lines
1.4 KiB
JavaScript
58 lines
1.4 KiB
JavaScript
// src/router/smart-router/router.ts
|
|
import { UnsupportedPathError, MESSAGE_MATCHER_IS_ALREADY_BUILT } 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
|
|
};
|