Skip to content

Commit b3ad0c2

Browse files
committed
Depend on servie-http request interface
1 parent faa072e commit b3ad0c2

File tree

4 files changed

+74
-41
lines changed

4 files changed

+74
-41
lines changed

package-lock.json

Lines changed: 39 additions & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@
5252
"dependencies": {
5353
"bit-string-mask": "^1.0.0",
5454
"servie-errorhandler": "^1.2.0",
55-
"servie-finalhandler": "^1.1.0"
55+
"servie-finalhandler": "^1.1.0",
56+
"servie-http": "^1.1.0"
5657
}
5758
}

src/index.ts

Lines changed: 28 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { 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'
34
import { createBody } from 'servie/dist/body/node'
45
import { errorhandler } from 'servie-errorhandler'
56
import { 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
*/
104119
export 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

tsconfig.json

Lines changed: 5 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,15 @@
11
{
22
"compilerOptions": {
3-
"target": "es5",
4-
"lib": [
5-
"es2015"
6-
],
3+
"target": "es2015",
4+
"lib": ["es2015"],
75
"rootDir": "src",
86
"outDir": "dist",
97
"module": "commonjs",
108
"moduleResolution": "node",
9+
"strict": true,
10+
"stripInternal": true,
1111
"declaration": true,
12-
"alwaysStrict": true,
13-
"strictNullChecks": true,
14-
"noImplicitAny": true,
15-
"noImplicitThis": true,
16-
"noImplicitReturns": true,
17-
"noUnusedLocals": true,
18-
"noUnusedParameters": true,
19-
"removeComments": false,
2012
"sourceMap": true,
2113
"inlineSources": true
22-
},
23-
"include": [
24-
"src/**/*",
25-
"typings/**/*"
26-
]
14+
}
2715
}

0 commit comments

Comments
 (0)