@sentry/utils
Version:
Utilities for all Sentry JavaScript SDKs
141 lines (123 loc) • 3.67 kB
JavaScript
import { isError, isPlainObject } from './is.js';
import { addExceptionTypeValue, addExceptionMechanism } from './misc.js';
import { normalizeToSize } from './normalize.js';
import { extractExceptionKeysForMessage } from './object.js';
/**
* Extracts stack frames from the error.stack string
*/
function parseStackFrames(stackParser, error) {
return stackParser(error.stack || '', 1);
}
/**
* Extracts stack frames from the error and builds a Sentry Exception
*/
function exceptionFromError(stackParser, error) {
const exception = {
type: error.name || error.constructor.name,
value: error.message,
};
const frames = parseStackFrames(stackParser, error);
if (frames.length) {
exception.stacktrace = { frames };
}
return exception;
}
function getMessageForObject(exception) {
if ('name' in exception && typeof exception.name === 'string') {
let message = `'${exception.name}' captured as exception`;
if ('message' in exception && typeof exception.message === 'string') {
message += ` with message '${exception.message}'`;
}
return message;
} else if ('message' in exception && typeof exception.message === 'string') {
return exception.message;
} else {
// This will allow us to group events based on top-level keys
// which is much better than creating new group when any key/value change
return `Object captured as exception with keys: ${extractExceptionKeysForMessage(
exception ,
)}`;
}
}
/**
* Builds and Event from a Exception
* @hidden
*/
function eventFromUnknownInput(
getCurrentHub,
stackParser,
exception,
hint,
) {
let ex = exception;
const providedMechanism =
hint && hint.data && (hint.data ).mechanism;
const mechanism = providedMechanism || {
handled: true,
type: 'generic',
};
if (!isError(exception)) {
if (isPlainObject(exception)) {
const hub = getCurrentHub();
const client = hub.getClient();
const normalizeDepth = client && client.getOptions().normalizeDepth;
hub.configureScope(scope => {
scope.setExtra('__serialized__', normalizeToSize(exception, normalizeDepth));
});
const message = getMessageForObject(exception);
ex = (hint && hint.syntheticException) || new Error(message);
(ex ).message = message;
} else {
// This handles when someone does: `throw "something awesome";`
// We use synthesized Error here so we can extract a (rough) stack trace.
ex = (hint && hint.syntheticException) || new Error(exception );
(ex ).message = exception ;
}
mechanism.synthetic = true;
}
const event = {
exception: {
values: [exceptionFromError(stackParser, ex )],
},
};
addExceptionTypeValue(event, undefined, undefined);
addExceptionMechanism(event, mechanism);
return {
...event,
event_id: hint && hint.event_id,
};
}
/**
* Builds and Event from a Message
* @hidden
*/
function eventFromMessage(
stackParser,
message,
// eslint-disable-next-line deprecation/deprecation
level = 'info',
hint,
attachStacktrace,
) {
const event = {
event_id: hint && hint.event_id,
level,
message,
};
if (attachStacktrace && hint && hint.syntheticException) {
const frames = parseStackFrames(stackParser, hint.syntheticException);
if (frames.length) {
event.exception = {
values: [
{
value: message,
stacktrace: { frames },
},
],
};
}
}
return event;
}
export { eventFromMessage, eventFromUnknownInput, exceptionFromError, parseStackFrames };
//# sourceMappingURL=eventbuilder.js.map