private registerHandler()

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);
  }