/**
 * Copyright 2020 Google LLC
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *    http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */ file import { Framework , StandardHandler } from './framework' ; import { Request , Response } from 'express' ; import { getLogger } from '../logger' ; export interface ExpressHandler { public ( request , response ) : void ; } export interface ExpressMetadata { public request : Request ; public response : Response ; } hidden export class Express implements Framework < ExpressHandler > { handle ( standard ) { return ( request , response ) => { const metadata = { request , response , } ; const logger = getLogger ( ) ; standard ( request . body , request . headers , { express : metadata } ) . then ( ( { status , body , headers } ) => { if ( headers ) { for ( const key in headers ) { response . setHeader ( key , headers [ key ] ! ) ; } } response . status ( status ) . send ( body ) ; } ) . catch ( ( e ) => { logger . error ( e ?. stack || e ) ; response . status ( 500 ) . send ( { error : e . message || e } ) ; } ) ; } ; } isResponse ( second ) { return typeof ( second as Response ) . send === 'function' ; } isRequest ( first ) { return typeof ( first as Request ) . get === 'function' ; } check ( first , second ) { return this . isRequest ( first ) && this . isResponse ( second ) ; } } hidden export const express = new Express ( ) ;