mirror of
https://github.com/hanzoai/sentinel.git
synced 2026-09-29 22:34:33 +00:00
39 lines
1.3 KiB
TypeScript
39 lines
1.3 KiB
TypeScript
import * as Sentry from '@sentry/react';
|
|
|
|
import type RequestError from 'sentry/utils/requestError/requestError';
|
|
|
|
export function handleXhrErrorResponse(message: string, err: RequestError): void {
|
|
// Sudo errors are handled separately elsewhere
|
|
// @ts-expect-error Property 'code' does not exist on type 'string'
|
|
if (!err || err.responseJSON?.detail?.code === 'sudo-required') {
|
|
return;
|
|
}
|
|
|
|
const {responseJSON, status, message: causeMessage} = err;
|
|
|
|
Sentry.withScope(scope => {
|
|
// Turn `GET /dogs/are/great 500` into just `GET /dogs/are/great`
|
|
const endpoint = causeMessage?.replace(new RegExp(` ${status}$`), '');
|
|
|
|
scope.setTags({
|
|
responseStatus: status,
|
|
endpoint,
|
|
});
|
|
|
|
// TODO: If we discover that undefind response bodies don't break anything,
|
|
// we can revert to bailing when `responseJSON` is falsy and always calling `setExtras`
|
|
if (err.name !== 'UndefinedResponseBodyError') {
|
|
scope.setExtras({
|
|
status,
|
|
responseJSON,
|
|
});
|
|
}
|
|
|
|
Sentry.captureException(
|
|
// We need to typecheck here even though `err` is typed in the function
|
|
// signature because TS doesn't type thrown or rejected errors
|
|
err instanceof Error ? new Error(message, {cause: err}) : new Error(message)
|
|
);
|
|
});
|
|
}
|