UNPKG

@tsed/platform-http

Version:
61 lines (60 loc) 2 kB
import { inject, injectable, injector, ProviderScope } from "@tsed/di"; import { PlatformRouters } from "@tsed/platform-router"; import { application } from "../fn/application.js"; /** * `Platform` is used to provide all routes collected by annotation `@Controller`. * * @platform */ export class Platform { #layers; constructor() { this.platformRouters = inject(PlatformRouters); this.platformRouters.prebuild(); } get app() { return application(); } addRoutes(routes) { routes.forEach((routeSettings) => { this.addRoute(routeSettings.route, routeSettings.token); }); } addRoute(route, token) { const app = application(); const provider = injector().getProvider(token); if (!provider || provider.hasParent()) { return this; } const router = this.platformRouters.from(provider.token); app.use(route, router); return this; } getLayers() { this.#layers = this.#layers || this.platformRouters.getLayers(application()); return this.#layers; } /** * Get all controllers mounted on the application. * @returns {RouteController[]} */ getMountedControllers() { const controllers = this.getLayers().reduce((controllers, layer) => { if (layer.isProvider()) { const route = String(layer.getBasePath()); const key = `${layer.provider.toString()}:${route}`; if (!controllers.has(key)) { controllers.set(key, { route, routes: new Set(), provider: layer.provider }); } controllers.get(key).routes.add(String(layer.path)); } return controllers; }, new Map()); return [...controllers.values()]; } } injectable(Platform).scope(ProviderScope.SINGLETON);