UNPKG

@sentry/remix

Version:
73 lines (70 loc) • 2.38 kB
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