@paroicms/server
Version:
The ParoiCMS server
50 lines • 1.79 kB
JavaScript
import { ApiError } from "@paroicms/public-server-lib";
import { platformLogger } from "../context.js";
import { getActiveSiteContext } from "../site-context/site-context.js";
export function createErrorConverterPlugin() {
return {
async requestDidStart(ctx) {
return Promise.resolve({
async didEncounterErrors({ errors }) {
const logger = getLogger(getFqdnFromGraphqlPluginContext(ctx));
for (const error of errors) {
logger.error("GraphQL error:", error);
const { originalError } = error;
if (!(originalError instanceof ApiError))
return;
error.extensions.code = statusToGraphqlErrorCode(originalError.status);
}
},
});
},
};
}
function statusToGraphqlErrorCode(status) {
switch (status) {
case 404:
return "NOT_FOUND";
case 500:
return "INTERNAL_SERVER_ERROR";
case 400:
return "BAD_REQUEST";
case 401:
return "UNAUTHORIZED";
case 403:
return "FORBIDDEN";
case 409:
return "CONFLICT";
default:
throw new Error(`Unknown graphql error status "${status}"`);
}
}
function getLogger(fqdn) {
const siteContext = fqdn ? getActiveSiteContext(fqdn, { returnsUndef: true }) : undefined;
return siteContext ? siteContext.logger : platformLogger;
}
function getFqdnFromGraphqlPluginContext(ctx) {
const hostname = ctx.request.http?.headers.get("host");
if (!hostname)
return;
return hostname.split(":")[0];
}
//# sourceMappingURL=error-converter-plugin.js.map