aws-lambda-create-request-response
Advanced tools
Comparing version 0.1.47 to 0.2.0
@@ -16,3 +16,3 @@ { | ||
], | ||
"version": "0.1.47", | ||
"version": "0.2.0", | ||
"main": "src/index.js", | ||
@@ -25,3 +25,3 @@ "repository": { | ||
"devDependencies": { | ||
"tap": "14.10.6" | ||
"tap": "14.10.8" | ||
}, | ||
@@ -28,0 +28,0 @@ "files": [ |
@@ -8,3 +8,2 @@ # aws-lambda-create-request-response | ||
[![downloads](https://img.shields.io/npm/dm/aws-lambda-create-request-response.svg)](https://npmjs.org/package/aws-lambda-create-request-response) | ||
[![Greenkeeper badge](https://badges.greenkeeper.io/JamesKyburz/aws-lambda-http-server.svg)](https://greenkeeper.io/) | ||
@@ -11,0 +10,0 @@ # usage |
@@ -7,22 +7,38 @@ 'use strict' | ||
module.exports = (event, callback) => { | ||
const base64Support = process.env.BINARY_SUPPORT === 'yes' | ||
const { version } = event | ||
if (version !== '1.0' && version !== '2.0') { | ||
return callback( | ||
new Error(`unsupported version ${version} ${JSON.stringify(event)}`) | ||
) | ||
} | ||
const isBase64Encoded = process.env.BINARY_SUPPORT === 'yes' | ||
const response = { | ||
body: Buffer.from(''), | ||
isBase64Encoded: base64Support, | ||
isBase64Encoded, | ||
statusCode: 200, | ||
multiValueHeaders: {} | ||
...(version === '1.0' && { multiValueHeaders: {} }), | ||
...(version === '2.0' && { headers: {} }) | ||
} | ||
const req = new Stream.Readable() | ||
req.url = (event.requestContext.path || event.path || '').replace( | ||
new RegExp('^/' + event.requestContext.stage), | ||
req.url = ( | ||
event.requestContext.path || | ||
event.path || | ||
event.rawPath || | ||
'' | ||
) | ||
).replace(new RegExp('^/' + event.requestContext.stage), '') | ||
req.finished = true | ||
if (event.multiValueQueryStringParameters) { | ||
req.url += | ||
'?' + queryString.stringify(event.multiValueQueryStringParameters) | ||
if (version === '1.0') { | ||
if (event.multiValueQueryStringParameters) { | ||
req.url += | ||
'?' + queryString.stringify(event.multiValueQueryStringParameters) | ||
} | ||
} else { | ||
if (event.rawQueryString) { | ||
req.url += '?' + event.rawQueryString | ||
} | ||
} | ||
req.method = event.httpMethod | ||
@@ -32,6 +48,8 @@ req.rawHeaders = [] | ||
const headers = event.multiValueHeaders || {} | ||
const headers = event.multiValueHeaders || event.headers || {} | ||
for (const key of Object.keys(headers)) { | ||
for (const value of headers[key]) { | ||
const headerValues = | ||
version === '1.0' ? headers[key] : headers[key].split(',') | ||
for (const value of headerValues) { | ||
req.rawHeaders.push(key) | ||
@@ -43,2 +61,12 @@ req.rawHeaders.push(value) | ||
if (version === '2.0') { | ||
if (event.cookies && event.cookies.length) { | ||
for (const value of event.cookies) { | ||
req.rawHeaders.push('cookie') | ||
req.rawHeaders.push(value) | ||
} | ||
req.headers.cookie = event.cookies.join('; ') | ||
} | ||
} | ||
req.getHeader = name => { | ||
@@ -69,6 +97,10 @@ return req.headers[name.toLowerCase()] | ||
res.headers = {} | ||
res.writeHead = (status, headers) => { | ||
res.writeHead = (status, headers = {}) => { | ||
headersSent = true | ||
response.statusCode = status | ||
res.headers = Object.assign(res.headers, headers) | ||
const lowerCaseHeaders = {} | ||
for (const key of Object.keys(headers)) { | ||
lowerCaseHeaders[key.toLowerCase()] = headers[key] | ||
} | ||
res.headers = Object.assign(res.headers, lowerCaseHeaders) | ||
} | ||
@@ -100,7 +132,11 @@ res.write = chunk => { | ||
response.body = Buffer.from(response.body).toString( | ||
base64Support ? 'base64' : undefined | ||
isBase64Encoded ? 'base64' : undefined | ||
) | ||
response.multiValueHeaders = res.headers | ||
if (version === '1.0') { | ||
response.multiValueHeaders = res.headers | ||
} else { | ||
response.headers = res.headers | ||
} | ||
res.writeHead(response.statusCode) | ||
fixApiGatewayMultipleHeaders() | ||
fixApiGatewayHeaders() | ||
callback(null, response) | ||
@@ -113,11 +149,23 @@ } | ||
function fixApiGatewayMultipleHeaders () { | ||
for (const key of Object.keys(response.multiValueHeaders)) { | ||
if (!Array.isArray(response.multiValueHeaders[key])) { | ||
response.multiValueHeaders[key] = [response.multiValueHeaders[key]] | ||
function fixApiGatewayHeaders () { | ||
if (version === '1.0') { | ||
for (const key of Object.keys(response.multiValueHeaders)) { | ||
if (!Array.isArray(response.multiValueHeaders[key])) { | ||
response.multiValueHeaders[key] = [response.multiValueHeaders[key]] | ||
} | ||
} | ||
} else { | ||
const cookies = response.headers['set-cookie'] | ||
if (cookies) { | ||
response.cookies = Array.isArray(cookies) ? cookies : [cookies] | ||
delete response.headers['set-cookie'] | ||
} | ||
for (const key of Object.keys(response.headers)) { | ||
if (Array.isArray(response.headers[key])) { | ||
response.headers[key] = response.headers[key].join(',') | ||
} | ||
} | ||
} | ||
} | ||
return { req, res } | ||
} |
28391
152
18