apollo-server/packages/apollo-server-lambda/src/lambdaApollo.ts

74 lines
1.8 KiB
TypeScript
Raw Normal View History

import * as lambda from 'aws-lambda';
import {
GraphQLOptions,
HttpQueryError,
runHttpQuery,
} from 'apollo-server-core';
import { Headers } from 'apollo-server-env';
export interface LambdaGraphQLOptionsFunction {
(event: lambda.APIGatewayProxyEvent, context: lambda.Context):
| GraphQLOptions
| Promise<GraphQLOptions>;
}
export function graphqlLambda(
options: GraphQLOptions | LambdaGraphQLOptionsFunction,
): lambda.APIGatewayProxyHandler {
if (!options) {
throw new Error('Apollo Server requires options.');
}
if (arguments.length > 1) {
throw new Error(
`Apollo Server expects exactly one argument, got ${arguments.length}`,
);
}
const graphqlHandler: lambda.APIGatewayProxyHandler = (
event,
context,
callback,
): void => {
context.callbackWaitsForEmptyEventLoop = false;
if (event.httpMethod === 'POST' && !event.body) {
return callback(null, {
body: 'POST body missing.',
statusCode: 500,
});
}
runHttpQuery([event, context], {
method: event.httpMethod,
options: options,
query:
event.httpMethod === 'POST'
? JSON.parse(event.body)
: (event.queryStringParameters as any),
request: {
url: event.path,
method: event.httpMethod,
headers: new Headers(event.headers),
},
}).then(
2018-06-21 15:07:01 -07:00
({ graphqlResponse, responseInit }) => {
callback(null, {
2018-06-21 15:07:01 -07:00
body: graphqlResponse,
statusCode: 200,
2018-06-21 15:07:01 -07:00
headers: responseInit.headers,
});
},
(error: HttpQueryError) => {
if ('HttpQueryError' !== error.name) return callback(error);
callback(null, {
body: error.message,
statusCode: error.statusCode,
headers: error.headers,
});
},
);
};
return graphqlHandler;
}