in src/router.ts [64:105]
private registerHandler(routeRecognizer: RouteRecognizer<any>, method: string, url: string, handler: IRouterHandler) {
const routeRecognizerHandler = (request: IExtendedRequest): Promise<IResponse> => {
const response = new Response();
return Promise.resolve(handler(request, response))
.then(x => response);
};
routeRecognizer.add([
{ path: url, handler: routeRecognizerHandler }
]);
const internalHandler = {
test(request: IRequest): boolean {
if (request.method !== method) {
return false;
}
const matchingRoutes = routeRecognizer.recognize(request.url);
if (matchingRoutes === undefined) {
return false;
}
/**
* Copy parameters from recognized route to the request so they can be used within the handler function
* This isn't ideal because it is side affect which modifies the request instead of strictly testing for true or false
* but I don't see a better place to put this. If we move it between the call to test and the handle it becomes part of the window post message proxy
* even though it's responsibility is related to routing.
*/
const route = matchingRoutes[0];
(<IExtendedRequest>request).params = route.params;
(<IExtendedRequest>request).queryParams = (<any>matchingRoutes).queryParams;
(<IExtendedRequest>request).handler = route.handler;
return true;
},
handle(request: IExtendedRequest): Promise<IResponse> {
return request.handler(request);
}
};
this.handlers.addHandler(internalHandler);
}