lambda-response-template
Version:
💬 A tiny utility for creating AWS Lambda response objects.
70 lines (61 loc) • 2.17 kB
text/typescript
import { APIGatewayProxyResult } from 'aws-lambda';
import { oneLine } from 'common-tags';
import { ResponseTemplate } from './template';
import { Headers, MultiValueHeaders, ResponseOverrides } from './types';
import { isString } from './util';
const callbackNoop = (value: any): any => value;
export function make(self: ResponseTemplate, statusCode: number, body: any = '',
overrideLike?: ResponseOverrides | string): APIGatewayProxyResult {
let overrides: ResponseOverrides;
let headers: Headers | undefined;
let multiValueHeaders: MultiValueHeaders | undefined;
// Determine if third argument is content type, undefined, or options.
if (isString(overrideLike)) {
// Is a Content-Type header
overrides = {
headers: {
'content-type': overrideLike as string,
},
};
} else if (overrideLike instanceof Object) {
// Is an options object.
overrides = overrideLike as ResponseOverrides;
} else {
// Is unknown, set as empty.
overrides = {};
}
const hasTransformer = ('transform' in self) || ('transform' in overrides);
if (!hasTransformer && !isString(body)) {
const message = oneLine`
Attempted to pass type '${typeof body}' as a body. The body must be a
string.`;
throw new Error(message);
}
if (Object.keys(self.headers).length || ('headers' in overrides)) {
headers = {
...self.headers, // set defaults
...overrides.headers || {}, // spread specified headers
};
}
if (Object.keys(self.multiValueHeaders).length || ('multiValueHeaders' in overrides)) {
multiValueHeaders = {
...self.multiValueHeaders,
...overrides.multiValueHeaders || {},
};
}
const responseBody = (overrides.transform || self.transform || callbackNoop)(body);
if (!isString(responseBody)) {
const message = oneLine`
Transformation function returned type '${typeof responseBody}'. Resulting
body must be a string.
`;
throw new Error(message);
}
return {
statusCode,
body: responseBody,
headers,
multiValueHeaders,
isBase64Encoded: overrides.isBase64Encoded || self.isBase64Encoded,
};
}