- Add debounced state updates for title and content (500ms delay) - Immediate UI updates with delayed history saving - Prevent one-letter-per-undo issue - Add cleanup for debounce timers on unmount
59 lines
1.5 KiB
JavaScript
59 lines
1.5 KiB
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) {
|
|
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 i2 = 0, len2 = routes.length; i2 < len2; i2++) {
|
|
router.add(...routes[i2]);
|
|
}
|
|
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
|
|
};
|