UNPKG

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
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)))); } };