@sentry/remix
Version:
Official Sentry SDK for Remix
73 lines (70 loc) • 2.38 kB
JavaScript
import { isRouteErrorResponse } from '@remix-run/router';
import { debug, winterCGRequestToRequestData, objectify, captureException, addExceptionMechanism, handleCallbackErrors, getClient } from '@sentry/core';
import { DEBUG_BUILD } from '../utils/debug-build.js';
import { resolveFormDataCapture } from '../utils/formData.js';
import { storeFormDataKeys } from '../utils/utils.js';
import { isResponse, extractData } from '../utils/vendor/response.js';
async function captureRemixServerException(err, name, request) {
if (isRouteErrorResponse(err) && err.status < 500) {
return;
}
if (isResponse(err) && err.status < 500) {
return;
}
if (request.signal.aborted) {
DEBUG_BUILD && debug.warn("Skipping capture of aborted request");
return;
}
let normalizedRequest = {};
try {
normalizedRequest = winterCGRequestToRequestData(request);
} catch {
DEBUG_BUILD && debug.warn("Failed to normalize Remix request");
}
const objectifiedErr = objectify(err);
captureException(isResponse(objectifiedErr) ? await extractResponseError(objectifiedErr) : objectifiedErr, (scope) => {
scope.setSDKProcessingMetadata({ normalizedRequest });
scope.addEventProcessor((event) => {
addExceptionMechanism(event, {
type: "auto.function.remix.server",
handled: false,
data: {
function: name
}
});
return event;
});
return scope;
});
}
async function errorHandleDataFunction(origFn, name, args, span) {
return handleCallbackErrors(
async () => {
if (name === "action" && span) {
const formDataCapture = resolveFormDataCapture(getClient());
if (formDataCapture) {
await storeFormDataKeys(args, span, formDataCapture);
}
}
return origFn.call(this, args);
},
(err) => {
if (isResponse(err)) {
captureRemixServerException(err, name, args.request);
}
throw err;
}
);
}
async function extractResponseError(response) {
const responseData = await extractData(response);
if (typeof responseData === "string" && responseData.length > 0) {
return new Error(responseData);
}
if (response.statusText) {
return new Error(response.statusText);
}
return responseData;
}
export { captureRemixServerException, errorHandleDataFunction };
//# sourceMappingURL=errors.js.map