/
http-handler.ts
83 lines (69 loc) · 2.22 KB
/
http-handler.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
// Copyright IBM Corp. 2017,2019. All Rights Reserved.
// Node module: @loopback/rest
// This file is licensed under the MIT License.
// License text available at https://opensource.org/licenses/MIT
import {Context} from '@loopback/context';
import {PathObject, SchemasObject} from '@loopback/openapi-v3-types';
import {ControllerSpec} from '@loopback/openapi-v3';
import {SequenceHandler} from './sequence';
import {
RoutingTable,
ResolvedRoute,
RouteEntry,
ControllerClass,
ControllerFactory,
} from './router';
import {Request, Response} from './types';
import {RestBindings} from './keys';
import {RequestContext} from './request-context';
import {RestServerResolvedConfig} from './rest.server';
export class HttpHandler {
protected _apiDefinitions: SchemasObject;
public handleRequest: (request: Request, response: Response) => Promise<void>;
constructor(
protected readonly _rootContext: Context,
protected readonly _serverConfig: RestServerResolvedConfig,
protected readonly _routes = new RoutingTable(),
) {
this.handleRequest = (req, res) => this._handleRequest(req, res);
}
registerController<T>(
spec: ControllerSpec,
controllerCtor: ControllerClass<T>,
controllerFactory?: ControllerFactory<T>,
) {
this._routes.registerController(spec, controllerCtor, controllerFactory);
}
registerRoute(route: RouteEntry) {
this._routes.registerRoute(route);
}
registerApiDefinitions(defs: SchemasObject) {
this._apiDefinitions = Object.assign({}, this._apiDefinitions, defs);
}
getApiDefinitions() {
return this._apiDefinitions;
}
describeApiPaths(): PathObject {
return this._routes.describeApiPaths();
}
findRoute(request: Request): ResolvedRoute {
const route = this._routes.find(request);
Object.assign(route.schemas, this.getApiDefinitions());
return route;
}
protected async _handleRequest(
request: Request,
response: Response,
): Promise<void> {
const requestContext = new RequestContext(
request,
response,
this._rootContext,
this._serverConfig,
);
const sequence = await requestContext.get<SequenceHandler>(
RestBindings.SEQUENCE,
);
await sequence.handle(requestContext);
}
}