import {HTTPKernel} from '../HTTPKernel' import {Request} from '../../lifecycle/Request' import {ActivatedRoute} from '../../routing/ActivatedRoute' import {http} from '../../response/HTTPErrorResponseFactory' import {HTTPStatus, withErrorContext} from '../../../util' import {AbstractResolvedRouteHandlerHTTPModule} from './AbstractResolvedRouteHandlerHTTPModule' /** * HTTP kernel module that runs the handler for the request's route. * * In most cases, this is the controller method defined by the route. */ export class ExecuteResolvedRouteHandlerHTTPModule extends AbstractResolvedRouteHandlerHTTPModule { public static register(kernel: HTTPKernel): void { kernel.register(this).core() } public async apply(request: Request): Promise { if ( request.hasInstance(ActivatedRoute) ) { const route = > request.make(ActivatedRoute) const params = route.resolvedParameters if ( !params ) { throw new Error('Attempted to call route handler without resolved parameters.') } await withErrorContext(async () => { const result = await route.handler .tap(handler => handler(...params)) .apply(request) await this.applyResponseObject(result, request) }, { route, }) } else { await http(HTTPStatus.NOT_FOUND).write(request) request.response.blockingWriteback(true) } return request } }