solid-start-create-api-graphql-handler
Version:
A simple parser of an incoming event in solid-start to support a GraphQL endpoint
49 lines (48 loc) • 2.18 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.createApiGraphQLHandler = void 0;
const utils_1 = require("./utils");
const parseBody_1 = require("./parseBody");
const node_url_1 = __importDefault(require("node:url"));
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const defaultContextThunk = async () => ({});
const createApiGraphQLHandler = (options) => async (event) => {
try {
options.server.assertStarted('graphqlHandler');
const bodyResult = await (0, parseBody_1.parseBody)(event.request.body);
if (!bodyResult.success) {
return options.handler(bodyResult);
}
const httpGraphQLRequest = {
method: event.request.method,
search: node_url_1.default.parse(event.request.url).search ?? '',
headers: (0, utils_1.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 ((0, utils_1.isErrorBody)(responseBody)) {
const [e] = responseBody.errors;
return options.handler((0, utils_1.newErrorResult)(e));
}
return options.handler((0, utils_1.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((0, utils_1.newErrorResult)(e));
}
return options.handler((0, utils_1.newErrorResult)(new Error(String(e))));
}
};
exports.createApiGraphQLHandler = createApiGraphQLHandler;