123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504 |
- Object.defineProperty(exports, '__esModule', { value: true });
- const utils = require('@sentry/utils');
- const constants = require('./constants.js');
- const debugBuild = require('./debug-build.js');
- const hub = require('./hub.js');
- const session = require('./session.js');
- const prepareEvent = require('./utils/prepareEvent.js');
- /**
- * Captures an exception event and sends it to Sentry.
- *
- * @param exception The exception to capture.
- * @param hint Optional additional data to attach to the Sentry event.
- * @returns the id of the captured Sentry event.
- */
- function captureException(
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
- exception,
- hint,
- ) {
- // eslint-disable-next-line deprecation/deprecation
- return hub.getCurrentHub().captureException(exception, prepareEvent.parseEventHintOrCaptureContext(hint));
- }
- /**
- * Captures a message event and sends it to Sentry.
- *
- * @param exception The exception to capture.
- * @param captureContext Define the level of the message or pass in additional data to attach to the message.
- * @returns the id of the captured message.
- */
- function captureMessage(
- message,
- // eslint-disable-next-line deprecation/deprecation
- captureContext,
- ) {
- // This is necessary to provide explicit scopes upgrade, without changing the original
- // arity of the `captureMessage(message, level)` method.
- const level = typeof captureContext === 'string' ? captureContext : undefined;
- const context = typeof captureContext !== 'string' ? { captureContext } : undefined;
- // eslint-disable-next-line deprecation/deprecation
- return hub.getCurrentHub().captureMessage(message, level, context);
- }
- /**
- * Captures a manually created event and sends it to Sentry.
- *
- * @param exception The event to send to Sentry.
- * @param hint Optional additional data to attach to the Sentry event.
- * @returns the id of the captured event.
- */
- function captureEvent(event, hint) {
- // eslint-disable-next-line deprecation/deprecation
- return hub.getCurrentHub().captureEvent(event, hint);
- }
- /**
- * Callback to set context information onto the scope.
- * @param callback Callback function that receives Scope.
- *
- * @deprecated Use getCurrentScope() directly.
- */
- function configureScope(callback) {
- // eslint-disable-next-line deprecation/deprecation
- hub.getCurrentHub().configureScope(callback);
- }
- /**
- * Records a new breadcrumb which will be attached to future events.
- *
- * Breadcrumbs will be added to subsequent events to provide more context on
- * user's actions prior to an error or crash.
- *
- * @param breadcrumb The breadcrumb to record.
- */
- function addBreadcrumb(breadcrumb, hint) {
- // eslint-disable-next-line deprecation/deprecation
- hub.getCurrentHub().addBreadcrumb(breadcrumb, hint);
- }
- /**
- * Sets context data with the given name.
- * @param name of the context
- * @param context Any kind of data. This data will be normalized.
- */
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
- function setContext(name, context) {
- // eslint-disable-next-line deprecation/deprecation
- hub.getCurrentHub().setContext(name, context);
- }
- /**
- * Set an object that will be merged sent as extra data with the event.
- * @param extras Extras object to merge into current context.
- */
- function setExtras(extras) {
- // eslint-disable-next-line deprecation/deprecation
- hub.getCurrentHub().setExtras(extras);
- }
- /**
- * Set key:value that will be sent as extra data with the event.
- * @param key String of extra
- * @param extra Any kind of data. This data will be normalized.
- */
- function setExtra(key, extra) {
- // eslint-disable-next-line deprecation/deprecation
- hub.getCurrentHub().setExtra(key, extra);
- }
- /**
- * Set an object that will be merged sent as tags data with the event.
- * @param tags Tags context object to merge into current context.
- */
- function setTags(tags) {
- // eslint-disable-next-line deprecation/deprecation
- hub.getCurrentHub().setTags(tags);
- }
- /**
- * Set key:value that will be sent as tags data with the event.
- *
- * Can also be used to unset a tag, by passing `undefined`.
- *
- * @param key String key of tag
- * @param value Value of tag
- */
- function setTag(key, value) {
- // eslint-disable-next-line deprecation/deprecation
- hub.getCurrentHub().setTag(key, value);
- }
- /**
- * Updates user context information for future events.
- *
- * @param user User context object to be set in the current context. Pass `null` to unset the user.
- */
- function setUser(user) {
- // eslint-disable-next-line deprecation/deprecation
- hub.getCurrentHub().setUser(user);
- }
- /**
- * Creates a new scope with and executes the given operation within.
- * The scope is automatically removed once the operation
- * finishes or throws.
- *
- * This is essentially a convenience function for:
- *
- * pushScope();
- * callback();
- * popScope();
- */
- /**
- * Either creates a new active scope, or sets the given scope as active scope in the given callback.
- */
- function withScope(
- ...rest
- ) {
- // eslint-disable-next-line deprecation/deprecation
- const hub$1 = hub.getCurrentHub();
- // If a scope is defined, we want to make this the active scope instead of the default one
- if (rest.length === 2) {
- const [scope, callback] = rest;
- if (!scope) {
- // eslint-disable-next-line deprecation/deprecation
- return hub$1.withScope(callback);
- }
- // eslint-disable-next-line deprecation/deprecation
- return hub$1.withScope(() => {
- // eslint-disable-next-line deprecation/deprecation
- hub$1.getStackTop().scope = scope ;
- return callback(scope );
- });
- }
- // eslint-disable-next-line deprecation/deprecation
- return hub$1.withScope(rest[0]);
- }
- /**
- * Attempts to fork the current isolation scope and the current scope based on the current async context strategy. If no
- * async context strategy is set, the isolation scope and the current scope will not be forked (this is currently the
- * case, for example, in the browser).
- *
- * Usage of this function in environments without async context strategy is discouraged and may lead to unexpected behaviour.
- *
- * This function is intended for Sentry SDK and SDK integration development. It is not recommended to be used in "normal"
- * applications directly because it comes with pitfalls. Use at your own risk!
- *
- * @param callback The callback in which the passed isolation scope is active. (Note: In environments without async
- * context strategy, the currently active isolation scope may change within execution of the callback.)
- * @returns The same value that `callback` returns.
- */
- function withIsolationScope(callback) {
- return hub.runWithAsyncContext(() => {
- return callback(hub.getIsolationScope());
- });
- }
- /**
- * Forks the current scope and sets the provided span as active span in the context of the provided callback.
- *
- * @param span Spans started in the context of the provided callback will be children of this span.
- * @param callback Execution context in which the provided span will be active. Is passed the newly forked scope.
- * @returns the value returned from the provided callback function.
- */
- function withActiveSpan(span, callback) {
- return withScope(scope => {
- // eslint-disable-next-line deprecation/deprecation
- scope.setSpan(span);
- return callback(scope);
- });
- }
- /**
- * Starts a new `Transaction` and returns it. This is the entry point to manual tracing instrumentation.
- *
- * A tree structure can be built by adding child spans to the transaction, and child spans to other spans. To start a
- * new child span within the transaction or any span, call the respective `.startChild()` method.
- *
- * Every child span must be finished before the transaction is finished, otherwise the unfinished spans are discarded.
- *
- * The transaction must be finished with a call to its `.end()` method, at which point the transaction with all its
- * finished child spans will be sent to Sentry.
- *
- * NOTE: This function should only be used for *manual* instrumentation. Auto-instrumentation should call
- * `startTransaction` directly on the hub.
- *
- * @param context Properties of the new `Transaction`.
- * @param customSamplingContext Information given to the transaction sampling function (along with context-dependent
- * default values). See {@link Options.tracesSampler}.
- *
- * @returns The transaction which was just started
- *
- * @deprecated Use `startSpan()`, `startSpanManual()` or `startInactiveSpan()` instead.
- */
- function startTransaction(
- context,
- customSamplingContext,
- ) {
- // eslint-disable-next-line deprecation/deprecation
- return hub.getCurrentHub().startTransaction({ ...context }, customSamplingContext);
- }
- /**
- * Create a cron monitor check in and send it to Sentry.
- *
- * @param checkIn An object that describes a check in.
- * @param upsertMonitorConfig An optional object that describes a monitor config. Use this if you want
- * to create a monitor automatically when sending a check in.
- */
- function captureCheckIn(checkIn, upsertMonitorConfig) {
- const scope = getCurrentScope();
- const client = getClient();
- if (!client) {
- debugBuild.DEBUG_BUILD && utils.logger.warn('Cannot capture check-in. No client defined.');
- } else if (!client.captureCheckIn) {
- debugBuild.DEBUG_BUILD && utils.logger.warn('Cannot capture check-in. Client does not support sending check-ins.');
- } else {
- return client.captureCheckIn(checkIn, upsertMonitorConfig, scope);
- }
- return utils.uuid4();
- }
- /**
- * Wraps a callback with a cron monitor check in. The check in will be sent to Sentry when the callback finishes.
- *
- * @param monitorSlug The distinct slug of the monitor.
- * @param upsertMonitorConfig An optional object that describes a monitor config. Use this if you want
- * to create a monitor automatically when sending a check in.
- */
- function withMonitor(
- monitorSlug,
- callback,
- upsertMonitorConfig,
- ) {
- const checkInId = captureCheckIn({ monitorSlug, status: 'in_progress' }, upsertMonitorConfig);
- const now = utils.timestampInSeconds();
- function finishCheckIn(status) {
- captureCheckIn({ monitorSlug, status, checkInId, duration: utils.timestampInSeconds() - now });
- }
- let maybePromiseResult;
- try {
- maybePromiseResult = callback();
- } catch (e) {
- finishCheckIn('error');
- throw e;
- }
- if (utils.isThenable(maybePromiseResult)) {
- Promise.resolve(maybePromiseResult).then(
- () => {
- finishCheckIn('ok');
- },
- () => {
- finishCheckIn('error');
- },
- );
- } else {
- finishCheckIn('ok');
- }
- return maybePromiseResult;
- }
- /**
- * Call `flush()` on the current client, if there is one. See {@link Client.flush}.
- *
- * @param timeout Maximum time in ms the client should wait to flush its event queue. Omitting this parameter will cause
- * the client to wait until all events are sent before resolving the promise.
- * @returns A promise which resolves to `true` if the queue successfully drains before the timeout, or `false` if it
- * doesn't (or if there's no client defined).
- */
- async function flush(timeout) {
- const client = getClient();
- if (client) {
- return client.flush(timeout);
- }
- debugBuild.DEBUG_BUILD && utils.logger.warn('Cannot flush events. No client defined.');
- return Promise.resolve(false);
- }
- /**
- * Call `close()` on the current client, if there is one. See {@link Client.close}.
- *
- * @param timeout Maximum time in ms the client should wait to flush its event queue before shutting down. Omitting this
- * parameter will cause the client to wait until all events are sent before disabling itself.
- * @returns A promise which resolves to `true` if the queue successfully drains before the timeout, or `false` if it
- * doesn't (or if there's no client defined).
- */
- async function close(timeout) {
- const client = getClient();
- if (client) {
- return client.close(timeout);
- }
- debugBuild.DEBUG_BUILD && utils.logger.warn('Cannot flush events and disable SDK. No client defined.');
- return Promise.resolve(false);
- }
- /**
- * This is the getter for lastEventId.
- *
- * @returns The last event id of a captured event.
- * @deprecated This function will be removed in the next major version of the Sentry SDK.
- */
- function lastEventId() {
- // eslint-disable-next-line deprecation/deprecation
- return hub.getCurrentHub().lastEventId();
- }
- /**
- * Get the currently active client.
- */
- function getClient() {
- // eslint-disable-next-line deprecation/deprecation
- return hub.getCurrentHub().getClient();
- }
- /**
- * Returns true if Sentry has been properly initialized.
- */
- function isInitialized() {
- return !!getClient();
- }
- /**
- * Get the currently active scope.
- */
- function getCurrentScope() {
- // eslint-disable-next-line deprecation/deprecation
- return hub.getCurrentHub().getScope();
- }
- /**
- * Start a session on the current isolation scope.
- *
- * @param context (optional) additional properties to be applied to the returned session object
- *
- * @returns the new active session
- */
- function startSession(context) {
- const client = getClient();
- const isolationScope = hub.getIsolationScope();
- const currentScope = getCurrentScope();
- const { release, environment = constants.DEFAULT_ENVIRONMENT } = (client && client.getOptions()) || {};
- // Will fetch userAgent if called from browser sdk
- const { userAgent } = utils.GLOBAL_OBJ.navigator || {};
- const session$1 = session.makeSession({
- release,
- environment,
- user: currentScope.getUser() || isolationScope.getUser(),
- ...(userAgent && { userAgent }),
- ...context,
- });
- // End existing session if there's one
- const currentSession = isolationScope.getSession();
- if (currentSession && currentSession.status === 'ok') {
- session.updateSession(currentSession, { status: 'exited' });
- }
- endSession();
- // Afterwards we set the new session on the scope
- isolationScope.setSession(session$1);
- // TODO (v8): Remove this and only use the isolation scope(?).
- // For v7 though, we can't "soft-break" people using getCurrentHub().getScope().setSession()
- currentScope.setSession(session$1);
- return session$1;
- }
- /**
- * End the session on the current isolation scope.
- */
- function endSession() {
- const isolationScope = hub.getIsolationScope();
- const currentScope = getCurrentScope();
- const session$1 = currentScope.getSession() || isolationScope.getSession();
- if (session$1) {
- session.closeSession(session$1);
- }
- _sendSessionUpdate();
- // the session is over; take it off of the scope
- isolationScope.setSession();
- // TODO (v8): Remove this and only use the isolation scope(?).
- // For v7 though, we can't "soft-break" people using getCurrentHub().getScope().setSession()
- currentScope.setSession();
- }
- /**
- * Sends the current Session on the scope
- */
- function _sendSessionUpdate() {
- const isolationScope = hub.getIsolationScope();
- const currentScope = getCurrentScope();
- const client = getClient();
- // TODO (v8): Remove currentScope and only use the isolation scope(?).
- // For v7 though, we can't "soft-break" people using getCurrentHub().getScope().setSession()
- const session = currentScope.getSession() || isolationScope.getSession();
- if (session && client && client.captureSession) {
- client.captureSession(session);
- }
- }
- /**
- * Sends the current session on the scope to Sentry
- *
- * @param end If set the session will be marked as exited and removed from the scope.
- * Defaults to `false`.
- */
- function captureSession(end = false) {
- // both send the update and pull the session from the scope
- if (end) {
- endSession();
- return;
- }
- // only send the update
- _sendSessionUpdate();
- }
- exports.addBreadcrumb = addBreadcrumb;
- exports.captureCheckIn = captureCheckIn;
- exports.captureEvent = captureEvent;
- exports.captureException = captureException;
- exports.captureMessage = captureMessage;
- exports.captureSession = captureSession;
- exports.close = close;
- exports.configureScope = configureScope;
- exports.endSession = endSession;
- exports.flush = flush;
- exports.getClient = getClient;
- exports.getCurrentScope = getCurrentScope;
- exports.isInitialized = isInitialized;
- exports.lastEventId = lastEventId;
- exports.setContext = setContext;
- exports.setExtra = setExtra;
- exports.setExtras = setExtras;
- exports.setTag = setTag;
- exports.setTags = setTags;
- exports.setUser = setUser;
- exports.startSession = startSession;
- exports.startTransaction = startTransaction;
- exports.withActiveSpan = withActiveSpan;
- exports.withIsolationScope = withIsolationScope;
- exports.withMonitor = withMonitor;
- exports.withScope = withScope;
- //# sourceMappingURL=exports.js.map
|