solid-start-create-api-graphql-handler
Version:
A simple parser of an incoming event in solid-start to support a GraphQL endpoint
42 lines (41 loc) • 1.79 kB
JavaScript
import { newErrorResult, newSuccessfulResult, mapHeadersToMap, isErrorBody, } from './utils';
import { parseBody } from './parseBody';
import url from 'node:url';
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const defaultContextThunk = async () => ({});
export const createApiGraphQLHandler = (options) => async (event) => {
try {
options.server.assertStarted('graphqlHandler');
const bodyResult = await parseBody(event.request.body);
if (!bodyResult.success) {
return options.handler(bodyResult);
}
const httpGraphQLRequest = {
method: event.request.method,
search: url.parse(event.request.url).search ?? '',
headers: mapHeadersToMap(event.request.headers),
body: bodyResult.data,
};
const context = options?.context ?? defaultContextThunk;
const httpGraphQLRequestResponse = await options.server.executeHTTPGraphQLRequest({
httpGraphQLRequest,
context,
});
if (httpGraphQLRequestResponse.body.kind === 'complete') {
const responseBody = JSON.parse(httpGraphQLRequestResponse.body.string);
if (isErrorBody(responseBody)) {
const [e] = responseBody.errors;
return options.handler(newErrorResult(e));
}
return options.handler(newSuccessfulResult(responseBody));
}
// Implement logic to handle asyncronous iterators
throw new Error('error: asynchronous iterators are not supported at the moment');
}
catch (e) {
if (e instanceof Error) {
return options.handler(newErrorResult(e));
}
return options.handler(newErrorResult(new Error(String(e))));
}
};