11import { format } from 'url'
2- import { Request , Response , Headers , createHeaders } from 'servie'
2+ import { Response , Headers , createHeaders } from 'servie'
3+ import { HttpRequest , HttpRequestOptions } from 'servie-http'
34import { createBody } from 'servie/dist/body/node'
45import { errorhandler } from 'servie-errorhandler'
56import { finalhandler } from 'servie-finalhandler'
@@ -78,16 +79,30 @@ export interface Result {
7879}
7980
8081/**
81- * Extend Servie Request with AWS Lambda context.
82+ * Extends HTTP requests with AWS lambda context.
8283 */
83- export interface LambdaRequest extends Request {
84+ export interface LambdaRequestOptions extends HttpRequestOptions {
8485 context : Context
8586}
8687
8788/**
88- * Valid Servie lambda application .
89+ * Extends HTTP requests with AWS Lambda context .
8990 */
90- export type App = ( req : Request , next : ( ) => Promise < Response > ) => Response | Promise < Response >
91+ export class LambdaRequest extends HttpRequest {
92+
93+ context : Context
94+
95+ constructor ( options : LambdaRequestOptions ) {
96+ super ( options )
97+ this . context = options . context
98+ }
99+
100+ }
101+
102+ /**
103+ * Valid AWS lambda server signature.
104+ */
105+ export type App = ( req : LambdaRequest , next : ( ) => Promise < Response > ) => Response | Promise < Response >
91106
92107/**
93108 * Lambda server options.
@@ -102,7 +117,7 @@ export interface Options {
102117 * Create a server for handling AWS Lambda requests.
103118 */
104119export function createHandler ( app : App , options : Options = { } ) {
105- return function ( event : Event , context : Context , cb : ( err : Error | null , res ? : Result ) => void ) : Promise < void > {
120+ return function ( event : Event , context : Context , cb : ( err : Error | null , res : Result ) => void ) : Promise < void > {
106121 const { httpMethod : method } = event
107122 const url = format ( { pathname : event . path , query : event . queryStringParameters } )
108123 const isBinary = options . isBinary || ( ( ) => false )
@@ -116,17 +131,13 @@ export function createHandler (app: App, options: Options = {}) {
116131 remoteAddress : event . requestContext . identity . sourceIp
117132 }
118133
119- const req = new Request ( { method, url, connection, headers, body } )
134+ const req = new LambdaRequest ( { method, url, connection, headers, body, context } )
120135
121136 const mapError = errorhandler ( req , {
122137 log : options . logError ,
123138 production : options . production
124139 } )
125140
126- function sendError ( err : Error ) {
127- return sendResponse ( mapError ( err ) )
128- }
129-
130141 function sendResponse ( res : Response ) : Promise < void > {
131142 if ( didRespond ) return Promise . resolve ( )
132143
@@ -136,7 +147,7 @@ export function createHandler (app: App, options: Options = {}) {
136147 return res . body . arrayBuffer ( )
137148 . then ( ( buffer ) => {
138149 const { statusCode } = res
139- const headers = getHeaders ( res . allHeaders )
150+ const headers = toHeaders ( res . allHeaders )
140151 const isBase64Encoded = isBinary ( res )
141152 const body = Buffer . from ( buffer ) . toString ( isBase64Encoded ? 'base64' : 'utf8' )
142153
@@ -148,30 +159,30 @@ export function createHandler (app: App, options: Options = {}) {
148159
149160 return cb ( null , { statusCode, headers, body, isBase64Encoded } )
150161 } )
151- . catch ( ( err ) => sendError ( err ) )
162+ . catch ( ( err ) => sendResponse ( mapError ( err ) ) )
152163 }
153164
154165 // Handle request and response errors.
155- req . events . on ( 'error' , ( err : Error ) => sendError ( err ) )
166+ req . events . on ( 'error' , ( err : Error ) => sendResponse ( mapError ( err ) ) )
156167 req . events . on ( 'abort' , ( ) => sendResponse ( new Response ( { statusCode : 444 } ) ) )
157168
158169 // Marked request as finished.
159170 req . started = true
160171 req . finished = true
161172 req . bytesTransferred = rawBody ? rawBody . byteLength : 0
162173
163- return Promise . resolve ( app ( Object . assign ( req , { context } ) , finalhandler ( req ) ) )
174+ return Promise . resolve ( app ( req , finalhandler ( req ) ) )
164175 . then (
165176 ( res ) => sendResponse ( res ) ,
166- ( err ) => sendError ( err )
177+ ( err ) => sendResponse ( mapError ( err ) )
167178 )
168179 }
169180}
170181
171182/**
172183 * Return a lambda compatible object of headers.
173184 */
174- function getHeaders ( headers : Headers ) {
185+ function toHeaders ( headers : Headers ) {
175186 const result = Object . create ( null )
176187 const obj = headers . asObject ( )
177188
0 commit comments