diff --git a/package.json b/package.json index d277597b..84af72a4 100644 --- a/package.json +++ b/package.json @@ -55,19 +55,19 @@ "e2e": "cross-env TS_NODE_PROJECT=tsconfig.test.json xvfb-maybe mocha --require ts-node/register/transpile-only --retries 3 ./test/e2e/*.ts" }, "dependencies": { - "@sentry/browser": "7.90.0", - "@sentry/core": "7.90.0", - "@sentry/node": "7.90.0", - "@sentry/types": "7.90.0", - "@sentry/utils": "7.90.0", + "@sentry/browser": "7.92.0", + "@sentry/core": "7.92.0", + "@sentry/node": "7.92.0", + "@sentry/types": "7.92.0", + "@sentry/utils": "7.92.0", "deepmerge": "4.3.0", "tslib": "^2.5.0" }, "devDependencies": { "@rollup/plugin-node-resolve": "^15.2.1", "@rollup/plugin-typescript": "^11.1.4", - "@sentry-internal/eslint-config-sdk": "7.90.0", - "@sentry-internal/typescript": "7.90.0", + "@sentry-internal/eslint-config-sdk": "7.92.0", + "@sentry-internal/typescript": "7.92.0", "@types/busboy": "^0.2.3", "@types/chai": "^4.2.10", "@types/chai-as-promised": "^7.1.5", diff --git a/src/common/normalize.ts b/src/common/normalize.ts index c2eda157..ab191b89 100644 --- a/src/common/normalize.ts +++ b/src/common/normalize.ts @@ -1,32 +1,5 @@ import { Envelope, Event, Profile, ReplayEvent } from '@sentry/types'; -import { addItemToEnvelope, createEnvelope, forEachEnvelopeItem } from '@sentry/utils'; - -/** - * Normalizes URLs in exceptions and stacktraces so Sentry can fingerprint - * across platforms. - * - * @param url The URL to be normalized. - * @param basePath The application base path. - * @returns The normalized URL. - */ -export function normalizeUrl(url: string, basePath: string): string { - const escapedBase = basePath - // Backslash to forward - .replace(/\\/g, '/') - // Escape RegExp special characters - .replace(/[|\\{}()[\]^$+*?.]/g, '\\$&'); - - let newUrl = url; - try { - newUrl = decodeURI(url); - } catch (_Oo) { - // Sometime this breaks - } - return newUrl - .replace(/\\/g, '/') - .replace(/webpack:\/?/g, '') // Remove intermediate base path - .replace(new RegExp(`(file://)?/*${escapedBase}/*`, 'ig'), 'app:///'); -} +import { addItemToEnvelope, createEnvelope, forEachEnvelopeItem, normalizeUrlToBase } from '@sentry/utils'; /** * Normalizes all URLs in an event. See {@link normalizeUrl} for more @@ -40,7 +13,7 @@ export function normalizeEvent(event: Event, basePath: string): Event { for (const exception of event.exception?.values || []) { for (const frame of exception.stacktrace?.frames || []) { if (frame.filename) { - frame.filename = normalizeUrl(frame.filename, basePath); + frame.filename = normalizeUrlToBase(frame.filename, basePath); } } } @@ -48,17 +21,17 @@ export function normalizeEvent(event: Event, basePath: string): Event { // We need to normalize debug ID images the same way as the stack frames for symbolicator to match them correctly for (const debugImage of event.debug_meta?.images || []) { if (debugImage.type === 'sourcemap') { - debugImage.code_file = normalizeUrl(debugImage.code_file, basePath); + debugImage.code_file = normalizeUrlToBase(debugImage.code_file, basePath); } } if (event.transaction) { - event.transaction = normalizeUrl(event.transaction, basePath); + event.transaction = normalizeUrlToBase(event.transaction, basePath); } const { request = {} } = event; if (request.url) { - request.url = normalizeUrl(request.url, basePath); + request.url = normalizeUrlToBase(request.url, basePath); } event.contexts = { @@ -96,11 +69,11 @@ export function normalizeUrlsInReplayEnvelope(envelope: Envelope, basePath: stri const [headers, event] = item as [{ type: 'replay_event' }, ReplayEvent]; if (Array.isArray(event.urls)) { - event.urls = event.urls.map((url) => normalizeUrl(url, basePath)); + event.urls = event.urls.map((url) => normalizeUrlToBase(url, basePath)); } if (event?.request?.url) { - event.request.url = normalizeUrl(event.request.url, basePath); + event.request.url = normalizeUrlToBase(event.request.url, basePath); } modifiedEnvelope = addItemToEnvelope(modifiedEnvelope, [headers, event]); @@ -118,7 +91,7 @@ export function normalizeUrlsInReplayEnvelope(envelope: Envelope, basePath: stri export function normaliseProfile(profile: Profile, basePath: string): void { for (const frame of profile.profile.frames) { if (frame.abs_path) { - frame.abs_path = normalizeUrl(frame.abs_path, basePath); + frame.abs_path = normalizeUrlToBase(frame.abs_path, basePath); } } } diff --git a/src/index.ts b/src/index.ts index 5887fe37..aaf4462a 100644 --- a/src/index.ts +++ b/src/index.ts @@ -44,7 +44,10 @@ export { getCurrentHub, getClient, getCurrentScope, + getGlobalScope, + getIsolationScope, Hub, + // eslint-disable-next-line deprecation/deprecation lastEventId, makeMain, runWithAsyncContext, @@ -57,6 +60,7 @@ export { setTags, setUser, spanStatusfromHttpCode, + // eslint-disable-next-line deprecation/deprecation trace, withScope, captureCheckIn, @@ -88,6 +92,7 @@ interface ProcessEntryPoint { init: (options: Partial) => void; close?: (timeout?: number) => Promise; flush?: (timeout?: number) => Promise; + // eslint-disable-next-line deprecation/deprecation enableMainProcessAnrDetection?(options: Parameters[0]): Promise; } @@ -194,28 +199,18 @@ export async function flush(timeout?: number): Promise { } /** - * **Note** This feature is still in beta so there may be breaking changes in future releases. - * - * Starts a child process that detects Application Not Responding (ANR) errors. - * - * It's important to await on the returned promise before your app code to ensure this code does not run in the ANR - * child process. + * @deprecated Use `Anr` integration instead. * * ```js - * import { init, enableMainProcessAnrDetection } from '@sentry/electron'; - * - * init({ dsn: "__DSN__" }); + * import { init, Integrations } from '@sentry/electron'; * - * // with ESM + Electron v28+ - * await enableMainProcessAnrDetection({ captureStackTrace: true }); - * runApp(); - * - * // with CJS - * enableMainProcessAnrDetection({ captureStackTrace: true }).then(() => { - * runApp(); + * init({ + * dsn: "__DSN__", + * integrations: [new Integrations.Anr({ captureStackTrace: true })], * }); * ``` */ +// eslint-disable-next-line deprecation/deprecation export function enableMainProcessAnrDetection(options: Parameters[0]): Promise { const entryPoint = getEntryPoint(); diff --git a/src/main/anr.ts b/src/main/anr.ts index e6de9047..250b524c 100644 --- a/src/main/anr.ts +++ b/src/main/anr.ts @@ -1,16 +1,10 @@ -import { - captureEvent, - enableAnrDetection as enableNodeAnrDetection, - getCurrentHub, - getModuleFromFilename, - StackFrame, -} from '@sentry/node'; +import { captureEvent, getClient, getCurrentHub, getModuleFromFilename, NodeClient, StackFrame } from '@sentry/node'; import { Event } from '@sentry/types'; -import { createDebugPauseMessageHandler, logger, watchdogTimer } from '@sentry/utils'; -import { app, WebContents } from 'electron'; +import { callFrameToStackFrame, logger, stripSentryFramesAndReverse, watchdogTimer } from '@sentry/utils'; +import { WebContents } from 'electron'; import { RendererStatus } from '../common'; -import { ELECTRON_MAJOR_VERSION } from './electron-normalize'; +import { Anr } from './integrations/anr'; import { ElectronMainOptions } from './sdk'; import { sessionAnr } from './sessions'; @@ -47,17 +41,60 @@ function sendRendererAnrEvent(contents: WebContents, blockedMs: number, frames?: captureEvent(event); } +interface ScriptParsedEventDataType { + scriptId: string; + url: string; +} + +interface Location { + scriptId: string; + lineNumber: number; + columnNumber?: number; +} + +interface CallFrame { + functionName: string; + location: Location; + url: string; +} + +interface PausedEventDataType { + callFrames: CallFrame[]; + reason: string; +} + function rendererDebugger(contents: WebContents, pausedStack: (frames: StackFrame[]) => void): () => void { contents.debugger.attach('1.3'); - const messageHandler = createDebugPauseMessageHandler( - (cmd) => contents.debugger.sendCommand(cmd), - getModuleFromFilename, - pausedStack, - ); + // Collect scriptId -> url map so we can look up the filenames later + const scripts = new Map(); contents.debugger.on('message', (_, method, params) => { - messageHandler({ method, params } as Parameters[0]); + if (method === 'Debugger.scriptParsed') { + const param = params as ScriptParsedEventDataType; + scripts.set(param.scriptId, param.url); + } else if (method === 'Debugger.paused') { + const param = params as PausedEventDataType; + + if (param.reason !== 'other') { + return; + } + + // copy the frames + const callFrames = [...param.callFrames]; + + contents.debugger.sendCommand('Debugger.resume').then(null, () => { + // ignore + }); + + const stackFrames = stripSentryFramesAndReverse( + callFrames.map((frame) => + callFrameToStackFrame(frame, scripts.get(frame.location.scriptId), getModuleFromFilename), + ), + ); + + pausedStack(stackFrames); + } }); // In node, we enable just before pausing but for Chrome, the debugger must be enabled before he ANR event occurs @@ -86,11 +123,6 @@ function createHrTimer(): { getTimeMs: () => number; reset: () => void } { }; } -/** Are we currently running in the ANR child process */ -export function isAnrChildProcess(): boolean { - return !!process.env.SENTRY_ANR_CHILD_PROCESS; -} - /** Creates a renderer ANR status hook */ export function createRendererAnrStatusHandler(): (status: RendererStatus, contents: WebContents) => void { function log(message: string, ...args: unknown[]): void { @@ -141,38 +173,29 @@ export function createRendererAnrStatusHandler(): (status: RendererStatus, conte }; } +interface LegacyOptions { + entryScript: string; + pollInterval: number; + anrThreshold: number; + captureStackTrace: boolean; + debug: boolean; +} + /** - * **Note** This feature is still in beta so there may be breaking changes in future releases. - * - * Starts a child process that detects Application Not Responding (ANR) errors. - * - * It's important to await on the returned promise before your app code to ensure this code does not run in the ANR - * child process. + * @deprecated Use `Anr` integration instead. * * ```js - * import { init, enableMainProcessAnrDetection } from '@sentry/electron'; + * import { init, Integrations } from '@sentry/electron'; * - * init({ dsn: "__DSN__" }); - * - * // with ESM + Electron v28+ - * await enableMainProcessAnrDetection({ captureStackTrace: true }); - * runApp(); - * - * // with CJS - * enableMainProcessAnrDetection({ captureStackTrace: true }).then(() => { - * runApp(); + * init({ + * dsn: "__DSN__", + * integrations: [new Integrations.Anr({ captureStackTrace: true })], * }); * ``` */ -export function enableMainProcessAnrDetection(options: Parameters[0]): Promise { - if (ELECTRON_MAJOR_VERSION < 4) { - throw new Error('Main process ANR detection is only supported on Electron v4+'); - } - - const mainOptions = { - entryScript: app.getAppPath(), - ...options, - }; - - return enableNodeAnrDetection(mainOptions); +export function enableMainProcessAnrDetection(options: Partial = {}): Promise { + const integration = new Anr(options); + const client = getClient() as NodeClient; + integration.setup?.(client); + return Promise.resolve(); } diff --git a/src/main/context.ts b/src/main/context.ts index 6bff27e9..0a5f9786 100644 --- a/src/main/context.ts +++ b/src/main/context.ts @@ -297,7 +297,6 @@ export function getDefaultEnvironment(): string { */ async function _getEventDefaults(release?: string, environment?: string): Promise { return { - sdk: getSdkInfo(), contexts: await getContexts(), environment: environment || getDefaultEnvironment(), release: release || getDefaultReleaseName(), diff --git a/src/main/index.ts b/src/main/index.ts index 0b55870c..c9ee1017 100644 --- a/src/main/index.ts +++ b/src/main/index.ts @@ -45,6 +45,8 @@ export { getCurrentHub, getClient, getCurrentScope, + getGlobalScope, + getIsolationScope, Hub, makeMain, runWithAsyncContext, @@ -57,6 +59,7 @@ export { setTags, setUser, spanStatusfromHttpCode, + // eslint-disable-next-line deprecation/deprecation trace, withScope, captureCheckIn, @@ -74,13 +77,15 @@ export { export type { SpanStatusType } from '@sentry/core'; export type { NodeOptions } from '@sentry/node'; +// eslint-disable-next-line deprecation/deprecation export { flush, close, NodeClient, lastEventId } from '@sentry/node'; export { makeElectronTransport } from './transports/electron-net'; export { makeElectronOfflineTransport } from './transports/electron-offline-net'; -export const Integrations = { ...ElectronMainIntegrations, ...NodeIntegrations }; +export const Integrations = { ...NodeIntegrations, ...ElectronMainIntegrations }; export type { ElectronMainOptions } from './sdk'; export { init, defaultIntegrations } from './sdk'; export { IPCMode } from '../common'; +// eslint-disable-next-line deprecation/deprecation export { enableMainProcessAnrDetection } from './anr'; diff --git a/src/main/integrations/anr.ts b/src/main/integrations/anr.ts new file mode 100644 index 00000000..090ebdd3 --- /dev/null +++ b/src/main/integrations/anr.ts @@ -0,0 +1,66 @@ +import { Integrations } from '@sentry/node'; +import { Primitive } from '@sentry/types'; +import { app } from 'electron'; + +import { ELECTRON_MAJOR_VERSION } from '../electron-normalize'; + +/** + * ConstructorParameters doesn't work below because integration constructor types are broken here: + * https://github.com/getsentry/sentry-javascript/blob/f28f3a968c52075694ecef4efef354f806fec100/packages/node/src/index.ts#L100-L116 + */ +interface Options { + /** + * Interval to send heartbeat messages to the ANR worker. + * + * Defaults to 50ms. + */ + pollInterval: number; + /** + * Threshold in milliseconds to trigger an ANR event. + * + * Defaults to 5000ms. + */ + anrThreshold: number; + /** + * Whether to capture a stack trace when the ANR event is triggered. + * + * Defaults to `false`. + * + * This uses the node debugger which enables the inspector API and opens the required ports. + */ + captureStackTrace: boolean; + /** + * Tags to include with ANR events. + */ + staticTags: { [key: string]: Primitive }; + /** + * @ignore Internal use only. + * + * If this is supplied, stack frame filenames will be rewritten to be relative to this path. + */ + appRootPath: string | undefined; +} + +// We can't use the functional style of integration until they are exported as functions... + +/** + * Starts a worker thread to detect App Not Responding (ANR) events + */ +export class Anr extends Integrations.Anr { + public constructor(options: Partial = {}) { + if (ELECTRON_MAJOR_VERSION < 15) { + throw new Error('Main process ANR detection requires Electron >= v15'); + } + + super({ + ...options, + staticTags: { + 'event.environment': 'javascript', + 'event.origin': 'electron', + 'event.process': 'browser', + ...options.staticTags, + }, + appRootPath: app.getAppPath(), + }); + } +} diff --git a/src/main/integrations/electron-minidump.ts b/src/main/integrations/electron-minidump.ts index 3b2be5c8..434d41d9 100644 --- a/src/main/integrations/electron-minidump.ts +++ b/src/main/integrations/electron-minidump.ts @@ -1,11 +1,11 @@ import { applyScopeDataToEvent, convertIntegrationFnToClass, getCurrentScope } from '@sentry/core'; import { NodeClient, NodeOptions } from '@sentry/node'; import { Event, IntegrationFn, ScopeData } from '@sentry/types'; -import { logger, makeDsn, SentryError } from '@sentry/utils'; +import { logger, makeDsn, SentryError, uuid4 } from '@sentry/utils'; import { app, crashReporter } from 'electron'; import { mergeEvents, normalizeEvent } from '../../common'; -import { getEventDefaults } from '../context'; +import { getEventDefaults, getSdkInfo } from '../context'; import { CRASH_REASONS, onRendererProcessGone, @@ -102,6 +102,8 @@ const electronMinidump: IntegrationFn = () => { async function getNativeUploaderEvent(scope: ScopeData): Promise { const event = mergeEvents(await getEventDefaults(customRelease), { + sdk: getSdkInfo(), + event_id: uuid4(), level: 'fatal', platform: 'native', tags: { 'event.environment': 'native', event_type: 'native' }, diff --git a/src/main/integrations/index.ts b/src/main/integrations/index.ts index 9c3a5fd3..c21649fe 100644 --- a/src/main/integrations/index.ts +++ b/src/main/integrations/index.ts @@ -11,3 +11,4 @@ export { Net } from './net-breadcrumbs'; export { ChildProcess } from './child-process'; export { Screenshots } from './screenshots'; export { RendererProfiling } from './renderer-profiling'; +export { Anr } from './anr'; diff --git a/src/main/renderers.ts b/src/main/renderers.ts index 37e3cd6d..463f8cee 100644 --- a/src/main/renderers.ts +++ b/src/main/renderers.ts @@ -1,6 +1,6 @@ +import { normalizeUrlToBase } from '@sentry/utils'; import { app } from 'electron'; -import { normalizeUrl } from '../common'; import { onWebContentsCreated } from './electron-normalize'; interface Renderer { @@ -25,7 +25,7 @@ export function trackRendererProperties(): void { function updateUrl(id: number, url: string): void { const state = renderers.get(id) || { id }; - state.url = normalizeUrl(url, app.getAppPath()); + state.url = normalizeUrlToBase(url, app.getAppPath()); renderers.set(id, state); } diff --git a/src/main/sdk.ts b/src/main/sdk.ts index 81755ff6..cfd6d2ba 100644 --- a/src/main/sdk.ts +++ b/src/main/sdk.ts @@ -3,10 +3,9 @@ ensureProcess('main'); import { defaultIntegrations as defaultNodeIntegrations, init as nodeInit, NodeOptions } from '@sentry/node'; import { Integration, Options } from '@sentry/types'; -import { app, Session, session, WebContents } from 'electron'; +import { Session, session, WebContents } from 'electron'; -import { isAnrChildProcess } from './anr'; -import { getDefaultEnvironment, getDefaultReleaseName } from './context'; +import { getDefaultEnvironment, getDefaultReleaseName, getSdkInfo } from './context'; import { AdditionalContext, ChildProcess, @@ -23,7 +22,6 @@ import { import { configureIPC } from './ipc'; import { defaultStackParser } from './stack-parse'; import { ElectronOfflineTransportOptions, makeElectronOfflineTransport } from './transports/electron-offline-net'; -import { SDK_VERSION } from './version'; export const defaultIntegrations: Integration[] = [ new SentryMinidump(), @@ -94,7 +92,7 @@ export type ElectronMainOptions = Pick, 'ge NodeOptions; const defaultOptions: ElectronMainOptionsInternal = { - _metadata: { sdk: { name: 'sentry.javascript.electron', version: SDK_VERSION } }, + _metadata: { sdk: getSdkInfo() }, ipcMode: IPCMode.Both, getSessions: () => [session.defaultSession], }; @@ -106,12 +104,6 @@ export function init(userOptions: ElectronMainOptions): void { const options: ElectronMainOptionsInternal = Object.assign(defaultOptions, userOptions); const defaults = defaultIntegrations; - if (isAnrChildProcess()) { - app.dock?.hide(); - options.autoSessionTracking = false; - options.tracesSampleRate = 0; - } - // If we don't set a release, @sentry/node will automatically fetch from environment variables if (options.release === undefined) { options.release = getDefaultReleaseName(); diff --git a/src/main/sessions.ts b/src/main/sessions.ts index ac0ae9c9..d0632289 100644 --- a/src/main/sessions.ts +++ b/src/main/sessions.ts @@ -4,7 +4,6 @@ import { SerializedSession, Session, SessionContext, SessionStatus } from '@sent import { logger } from '@sentry/utils'; import { app } from 'electron'; -import { isAnrChildProcess } from './anr'; import { getSentryCachePath } from './fs'; import { Store } from './store'; @@ -106,11 +105,6 @@ export async function unreportedDuringLastSession(crashDate: Date | undefined): export async function checkPreviousSession(crashed: boolean): Promise { const client = getCurrentHub().getClient(); - // We should not check the session storage if we are in an ANR child process - if (isAnrChildProcess()) { - return; - } - const previous = await previousSession; if (previous && client) { diff --git a/src/main/stack-parse.ts b/src/main/stack-parse.ts index 78f51a0d..0e36632c 100644 --- a/src/main/stack-parse.ts +++ b/src/main/stack-parse.ts @@ -1,17 +1,15 @@ import { getModuleFromFilename as getModuleFromFilenameNode } from '@sentry/node'; import { StackParser } from '@sentry/types'; -import { createStackParser, nodeStackLineParser } from '@sentry/utils'; +import { createStackParser, nodeStackLineParser, normalizeUrlToBase } from '@sentry/utils'; import { app } from 'electron'; -import { normalizeUrl } from '../common'; - /** Parses the module name form a filename */ function getModuleFromFilename(filename: string | undefined): string | undefined { if (!filename) { return; } - const normalizedFilename = normalizeUrl(filename, app.getAppPath()); + const normalizedFilename = normalizeUrlToBase(filename, app.getAppPath()); return getModuleFromFilenameNode(normalizedFilename); } diff --git a/src/renderer/index.ts b/src/renderer/index.ts index 03cdc3ef..34211124 100644 --- a/src/renderer/index.ts +++ b/src/renderer/index.ts @@ -42,6 +42,8 @@ export { getCurrentHub, getClient, getCurrentScope, + getGlobalScope, + getIsolationScope, Hub, makeMain, runWithAsyncContext, @@ -54,6 +56,7 @@ export { setTags, setUser, spanStatusfromHttpCode, + // eslint-disable-next-line deprecation/deprecation trace, withScope, captureCheckIn, @@ -75,10 +78,12 @@ export { BrowserClient, BrowserTracing, BrowserProfilingIntegration, + // eslint-disable-next-line deprecation/deprecation lastEventId, showReportDialog, Replay, } from '@sentry/browser'; +// eslint-disable-next-line deprecation/deprecation export type { BrowserOptions, ReportDialogOptions } from '@sentry/browser'; export const Integrations = { ...ElectronRendererIntegrations, ...BrowserIntegrations }; diff --git a/src/renderer/sdk.ts b/src/renderer/sdk.ts index d22e92ef..38b05809 100644 --- a/src/renderer/sdk.ts +++ b/src/renderer/sdk.ts @@ -40,7 +40,7 @@ interface ElectronRendererOptions extends BrowserOptions { export function init( options: ElectronRendererOptions & O = {} as ElectronRendererOptions & O, // This parameter name ensures that TypeScript error messages contain a hint for fixing SDK version mismatches - originalInit: (if_you_get_a_typescript_error_ensure_sdks_use_version_v7_90_0: O) => void = browserInit, + originalInit: (if_you_get_a_typescript_error_ensure_sdks_use_version_v7_92_0: O) => void = browserInit, ): void { ensureProcess('renderer'); diff --git a/test/e2e/recipe/normalize.ts b/test/e2e/recipe/normalize.ts index 69a1bb46..535ec10c 100644 --- a/test/e2e/recipe/normalize.ts +++ b/test/e2e/recipe/normalize.ts @@ -152,17 +152,24 @@ function normalizeEvent(event: Event & ReplayEvent): void { for (const frame of event.exception?.values?.[0].stacktrace?.frames || []) { frame.colno = 0; frame.lineno = 0; - frame.function = '{{function}}'; + if (frame.function !== 'longWork') { + frame.function = '{{function}}'; + } frame.filename = frame.filename?.replace(/\.mjs$/, '.js'); } } - event.timestamp = 0; + if (event.timestamp) { + event.timestamp = 0; + } + if ((event as any).start_timestamp) { (event as any).start_timestamp = 0; } - event.event_id = '{{id}}'; + if (event.event_id) { + event.event_id = '{{id}}'; + } if (event.spans) { for (const span of event.spans) { diff --git a/test/e2e/test-apps/anr/anr-main/event.json b/test/e2e/test-apps/anr/anr-main/event.json index 58c95e39..7305ef1a 100644 --- a/test/e2e/test-apps/anr/anr-main/event.json +++ b/test/e2e/test-apps/anr/anr-main/event.json @@ -31,13 +31,9 @@ "arch": "{{arch}}", "family": "Desktop", "memory_size": 0, - "free_memory": 0, "processor_count": 0, "processor_frequency": 0, - "cpu_description": "{{cpu}}", - "screen_resolution": "{{screen}}", - "screen_density": 1, - "language": "{{language}}" + "cpu_description": "{{cpu}}" }, "node": { "name": "Node", @@ -51,13 +47,14 @@ "runtime": { "name": "Electron", "version": "{{version}}" + }, + "trace": { + "span_id": "{{id}}", + "trace_id": "{{id}}" } }, "release": "anr-main@1.0.0", "environment": "development", - "user": { - "ip_address": "{{auto}}" - }, "exception": { "values": [ { @@ -68,10 +65,9 @@ "frames": [ { "colno": 0, - "function": "{{function}}", - "in_app": false, - "lineno": 0, - "module": "pbkdf2" + "function": "longWork", + "in_app": true, + "lineno": 0 } ] } @@ -79,16 +75,11 @@ ] }, "level": "error", - "event_id": "{{id}}", "platform": "node", - "timestamp": 0, - "breadcrumbs": [], "tags": { "event.environment": "javascript", "event.origin": "electron", - "event.process": "browser", - "event_type": "javascript", - "process.name": "ANR" + "event.process": "browser" } } } diff --git a/test/e2e/test-apps/anr/anr-main/recipe.yml b/test/e2e/test-apps/anr/anr-main/recipe.yml index db0bca0a..707d3ad6 100644 --- a/test/e2e/test-apps/anr/anr-main/recipe.yml +++ b/test/e2e/test-apps/anr/anr-main/recipe.yml @@ -1,4 +1,4 @@ description: ANR Main Event category: ANR command: yarn -condition: version.major >= 13 +condition: version.major >= 15 diff --git a/test/e2e/test-apps/anr/anr-main/src/main.js b/test/e2e/test-apps/anr/anr-main/src/main.js index df404fc1..d30d2748 100644 --- a/test/e2e/test-apps/anr/anr-main/src/main.js +++ b/test/e2e/test-apps/anr/anr-main/src/main.js @@ -1,12 +1,13 @@ const crypto = require('crypto'); const { app } = require('electron'); -const { init, enableMainProcessAnrDetection } = require('@sentry/electron/main'); +const { init, Integrations } = require('@sentry/electron/main'); init({ dsn: '__DSN__', debug: true, onFatalError: () => {}, + integrations: [new Integrations.Anr({ captureStackTrace: true, anrThreshold: 1000 })], }); function longWork() { @@ -17,10 +18,8 @@ function longWork() { } } -enableMainProcessAnrDetection({ anrThreshold: 1000, captureStackTrace: true }).then(() => { - app.on('ready', () => { - setTimeout(() => { - longWork(); - }, 1000); - }); +app.on('ready', () => { + setTimeout(() => { + longWork(); + }, 2000); }); diff --git a/test/e2e/test-apps/anr/anr-renderer/recipe.yml b/test/e2e/test-apps/anr/anr-renderer/recipe.yml index e88f26b5..da97fae8 100644 --- a/test/e2e/test-apps/anr/anr-renderer/recipe.yml +++ b/test/e2e/test-apps/anr/anr-renderer/recipe.yml @@ -1,4 +1,4 @@ description: ANR Renderer Event category: ANR command: yarn -condition: version.major >= 13 +condition: version.major >= 15 diff --git a/test/e2e/test-apps/native-electron/gpu/event.json b/test/e2e/test-apps/native-electron/gpu/event.json index 6b57887b..27a6d484 100644 --- a/test/e2e/test-apps/native-electron/gpu/event.json +++ b/test/e2e/test-apps/native-electron/gpu/event.json @@ -2,7 +2,7 @@ "method": "minidump", "namespacedData": { "initialScope": { - "release":"native-electron-gpu@1.0.0", + "release": "native-electron-gpu@1.0.0", "user": { "username": "some_user" } @@ -10,9 +10,6 @@ }, "sentryKey": "37f8a2ee37c0409d8970bc7559c7c7e4", "appId": "277345", - "data": { - "event_id": "{{id}}", - "timestamp": 0 - }, - "attachments": [ { "attachment_type": "event.minidump" } ] + "data": {}, + "attachments": [{ "attachment_type": "event.minidump" }] } diff --git a/test/e2e/test-apps/native-electron/main-custom-release/event-no-crashpad.json b/test/e2e/test-apps/native-electron/main-custom-release/event-no-crashpad.json index ed7efbf5..cf221085 100644 --- a/test/e2e/test-apps/native-electron/main-custom-release/event-no-crashpad.json +++ b/test/e2e/test-apps/native-electron/main-custom-release/event-no-crashpad.json @@ -3,9 +3,6 @@ "method": "minidump", "sentryKey": "37f8a2ee37c0409d8970bc7559c7c7e4", "appId": "277345", - "data": { - "event_id": "{{id}}", - "timestamp": 0 - }, - "attachments": [ { "attachment_type": "event.minidump" } ] + "data": {}, + "attachments": [{ "attachment_type": "event.minidump" }] } diff --git a/test/e2e/test-apps/native-electron/main-custom-release/event.json b/test/e2e/test-apps/native-electron/main-custom-release/event.json index 6d76eff8..d3b2587a 100644 --- a/test/e2e/test-apps/native-electron/main-custom-release/event.json +++ b/test/e2e/test-apps/native-electron/main-custom-release/event.json @@ -61,7 +61,6 @@ "username": "some_user" }, "event_id": "{{id}}", - "timestamp": 0, "breadcrumbs": [], "tags": { "event.environment": "native", diff --git a/test/e2e/test-apps/native-electron/main/event-no-crashpad.json b/test/e2e/test-apps/native-electron/main/event-no-crashpad.json index ed7efbf5..cf221085 100644 --- a/test/e2e/test-apps/native-electron/main/event-no-crashpad.json +++ b/test/e2e/test-apps/native-electron/main/event-no-crashpad.json @@ -3,9 +3,6 @@ "method": "minidump", "sentryKey": "37f8a2ee37c0409d8970bc7559c7c7e4", "appId": "277345", - "data": { - "event_id": "{{id}}", - "timestamp": 0 - }, - "attachments": [ { "attachment_type": "event.minidump" } ] + "data": {}, + "attachments": [{ "attachment_type": "event.minidump" }] } diff --git a/test/e2e/test-apps/native-electron/main/event.json b/test/e2e/test-apps/native-electron/main/event.json index e39ccb85..1a9cb412 100644 --- a/test/e2e/test-apps/native-electron/main/event.json +++ b/test/e2e/test-apps/native-electron/main/event.json @@ -61,7 +61,6 @@ "username": "some_user" }, "event_id": "{{id}}", - "timestamp": 0, "breadcrumbs": [], "tags": { "event.environment": "native", diff --git a/test/e2e/test-apps/native-electron/renderer-custom-release/event-no-crashpad.json b/test/e2e/test-apps/native-electron/renderer-custom-release/event-no-crashpad.json index ed7efbf5..cf221085 100644 --- a/test/e2e/test-apps/native-electron/renderer-custom-release/event-no-crashpad.json +++ b/test/e2e/test-apps/native-electron/renderer-custom-release/event-no-crashpad.json @@ -3,9 +3,6 @@ "method": "minidump", "sentryKey": "37f8a2ee37c0409d8970bc7559c7c7e4", "appId": "277345", - "data": { - "event_id": "{{id}}", - "timestamp": 0 - }, - "attachments": [ { "attachment_type": "event.minidump" } ] + "data": {}, + "attachments": [{ "attachment_type": "event.minidump" }] } diff --git a/test/e2e/test-apps/native-electron/renderer-custom-release/event.json b/test/e2e/test-apps/native-electron/renderer-custom-release/event.json index 752eb8e9..fc396348 100644 --- a/test/e2e/test-apps/native-electron/renderer-custom-release/event.json +++ b/test/e2e/test-apps/native-electron/renderer-custom-release/event.json @@ -11,9 +11,6 @@ }, "sentryKey": "37f8a2ee37c0409d8970bc7559c7c7e4", "appId": "277345", - "data": { - "event_id": "{{id}}", - "timestamp": 0 - }, - "attachments": [ { "attachment_type": "event.minidump" } ] + "data": {}, + "attachments": [{ "attachment_type": "event.minidump" }] } diff --git a/test/e2e/test-apps/native-electron/renderer/event.json b/test/e2e/test-apps/native-electron/renderer/event.json index 019d319f..8e88d6bf 100644 --- a/test/e2e/test-apps/native-electron/renderer/event.json +++ b/test/e2e/test-apps/native-electron/renderer/event.json @@ -3,7 +3,7 @@ "method": "minidump", "namespacedData": { "initialScope": { - "release":"native-electron-renderer@1.0.0", + "release": "native-electron-renderer@1.0.0", "user": { "username": "some_user" } @@ -11,9 +11,6 @@ }, "sentryKey": "37f8a2ee37c0409d8970bc7559c7c7e4", "appId": "277345", - "data": { - "event_id": "{{id}}", - "timestamp": 0 - }, - "attachments": [ { "attachment_type": "event.minidump" } ] + "data": {}, + "attachments": [{ "attachment_type": "event.minidump" }] } diff --git a/test/e2e/test-apps/sessions/native-crash-main-electron-uploader/event.json b/test/e2e/test-apps/sessions/native-crash-main-electron-uploader/event.json index 2acac19b..4eee4824 100644 --- a/test/e2e/test-apps/sessions/native-crash-main-electron-uploader/event.json +++ b/test/e2e/test-apps/sessions/native-crash-main-electron-uploader/event.json @@ -60,7 +60,6 @@ "username": "some_user" }, "event_id": "{{id}}", - "timestamp": 0, "breadcrumbs": [], "tags": { "event.environment": "native", diff --git a/test/e2e/test-apps/sessions/native-crash-renderer-electron-uploader/event-no-crashpad.json b/test/e2e/test-apps/sessions/native-crash-renderer-electron-uploader/event-no-crashpad.json index ed7efbf5..cf221085 100644 --- a/test/e2e/test-apps/sessions/native-crash-renderer-electron-uploader/event-no-crashpad.json +++ b/test/e2e/test-apps/sessions/native-crash-renderer-electron-uploader/event-no-crashpad.json @@ -3,9 +3,6 @@ "method": "minidump", "sentryKey": "37f8a2ee37c0409d8970bc7559c7c7e4", "appId": "277345", - "data": { - "event_id": "{{id}}", - "timestamp": 0 - }, - "attachments": [ { "attachment_type": "event.minidump" } ] + "data": {}, + "attachments": [{ "attachment_type": "event.minidump" }] } diff --git a/test/e2e/test-apps/sessions/native-crash-renderer-electron-uploader/event.json b/test/e2e/test-apps/sessions/native-crash-renderer-electron-uploader/event.json index 844585f8..6332cefc 100644 --- a/test/e2e/test-apps/sessions/native-crash-renderer-electron-uploader/event.json +++ b/test/e2e/test-apps/sessions/native-crash-renderer-electron-uploader/event.json @@ -3,7 +3,7 @@ "method": "minidump", "namespacedData": { "initialScope": { - "release":"session-native-crash-renderer-electron-uploader@1.0.0", + "release": "session-native-crash-renderer-electron-uploader@1.0.0", "user": { "username": "some_user" } @@ -11,9 +11,6 @@ }, "sentryKey": "37f8a2ee37c0409d8970bc7559c7c7e4", "appId": "277345", - "data": { - "event_id": "{{id}}", - "timestamp": 0 - }, - "attachments": [ { "attachment_type": "event.minidump" } ] + "data": {}, + "attachments": [{ "attachment_type": "event.minidump" }] } diff --git a/test/unit/normalize.test.ts b/test/unit/normalize.test.ts deleted file mode 100644 index 3b79c849..00000000 --- a/test/unit/normalize.test.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { expect, should, use } from 'chai'; -import chaiAsPromised = require('chai-as-promised'); - -import { normalizeUrl } from '../../src/common/normalize'; - -should(); -use(chaiAsPromised); - -describe('Normalize URLs', () => { - it('Example app on Windows', () => { - const base = 'c:/Users/Username/sentry-electron/example'; - - expect(normalizeUrl('C:\\Users\\Username\\sentry-electron\\example\\renderer.js', base)).to.equal( - 'app:///renderer.js', - ); - - expect(normalizeUrl('C:\\Users\\Username\\sentry-electron\\example\\sub-directory\\renderer.js', base)).to.equal( - 'app:///sub-directory/renderer.js', - ); - - expect(normalizeUrl('file:///C:/Users/Username/sentry-electron/example/index.html', base)).to.equal( - 'app:///index.html', - ); - }); - - it('Example app with parentheses', () => { - const base = 'c:/Users/Username/sentry-electron (beta)/example'; - - expect(normalizeUrl('C:\\Users\\Username\\sentry-electron%20(beta)\\example\\renderer.js', base)).to.equal( - 'app:///renderer.js', - ); - - expect( - normalizeUrl('C:\\Users\\Username\\sentry-electron%20(beta)\\example\\sub-directory\\renderer.js', base), - ).to.equal('app:///sub-directory/renderer.js'); - - expect(normalizeUrl('file:///C:/Users/Username/sentry-electron%20(beta)/example/index.html', base)).to.equal( - 'app:///index.html', - ); - }); - - it('Asar packaged app in Windows Program Files', () => { - const base = 'C:/Program Files/My App/resources/app.asar'; - - expect(normalizeUrl('/C:/Program%20Files/My%20App/resources/app.asar/dist/bundle-app.js', base)).to.equal( - 'app:///dist/bundle-app.js', - ); - - expect(normalizeUrl('file:///C:/Program%20Files/My%20App/resources/app.asar/index.html', base)).to.equal( - 'app:///index.html', - ); - - expect(normalizeUrl('file:///C:/Program%20Files/My%20App/resources/app.asar/a/index.html', base)).to.equal( - 'app:///a/index.html', - ); - }); - - it('Webpack builds', () => { - const base = '/home/haza/Desktop/foo/app/'; - expect( - normalizeUrl('/home/haza/Desktop/foo/app/webpack:/electron/src/common/models/ipc-request.ts', base), - ).to.equal('app:///electron/src/common/models/ipc-request.ts'); - }); - - it('Only modifies file URLS', () => { - const base = 'c:/Users/Username/sentry-electron/example'; - expect(normalizeUrl('https://some.host/index.html', base)).to.equal('https://some.host/index.html'); - expect(normalizeUrl('http://localhost:43288/index.html', base)).to.equal('http://localhost:43288/index.html'); - }); -}); diff --git a/yarn.lock b/yarn.lock index c00e6ca3..50ea3561 100644 --- a/yarn.lock +++ b/yarn.lock @@ -164,13 +164,13 @@ estree-walker "^2.0.2" picomatch "^2.3.1" -"@sentry-internal/eslint-config-sdk@7.90.0": - version "7.90.0" - resolved "https://registry.yarnpkg.com/@sentry-internal/eslint-config-sdk/-/eslint-config-sdk-7.90.0.tgz#0a765a209ca3499bbc08856b8228613ee4e715f9" - integrity sha512-PvjJ/Dsp9eofcZz6wBaPEDfc5R9mLMgDR8WfWECiMhfYu7KBT2GgMx1dWe2g0ylqDzoBmY15+8gGELhf90kfrA== +"@sentry-internal/eslint-config-sdk@7.92.0": + version "7.92.0" + resolved "https://registry.yarnpkg.com/@sentry-internal/eslint-config-sdk/-/eslint-config-sdk-7.92.0.tgz#a4532463a22a59dfb115cd2392f02e27c95b7f66" + integrity sha512-1TtJkV4Wmqf/CbXUL8tkS/yxDAVbvUnvCQZguD6s1LZTWMJ+4coEkeSkgn1qRSjBz0YIREr1DXSmPbXU2TugiQ== dependencies: - "@sentry-internal/eslint-plugin-sdk" "7.90.0" - "@sentry-internal/typescript" "7.90.0" + "@sentry-internal/eslint-plugin-sdk" "7.92.0" + "@sentry-internal/typescript" "7.92.0" "@typescript-eslint/eslint-plugin" "^5.48.0" "@typescript-eslint/parser" "^5.48.0" eslint-config-prettier "^6.11.0" @@ -180,88 +180,88 @@ eslint-plugin-jsdoc "^30.0.3" eslint-plugin-simple-import-sort "^5.0.3" -"@sentry-internal/eslint-plugin-sdk@7.90.0": - version "7.90.0" - resolved "https://registry.yarnpkg.com/@sentry-internal/eslint-plugin-sdk/-/eslint-plugin-sdk-7.90.0.tgz#4e9238816011d8a22173644db7fe72ff54e1ceb4" - integrity sha512-4/1GA6KNyBm+721DGlVgKgUC8qbI9netOZLZetVOUQ2oNiJHHdYn0jHGZzB5zMcut+/S6Nr9MqiFgjLzI8E3PA== +"@sentry-internal/eslint-plugin-sdk@7.92.0": + version "7.92.0" + resolved "https://registry.yarnpkg.com/@sentry-internal/eslint-plugin-sdk/-/eslint-plugin-sdk-7.92.0.tgz#9c6dae628adecfd7047afa504cc8809276ad2bad" + integrity sha512-hccEHqZwO9kEsDOlPso7b7Tz+sSBiyyJ1KW+EOx65H3AAgGGHPkoU074fA0S+yyuRVEk0wCKR1xQ7jgfWxJSQw== dependencies: requireindex "~1.1.0" -"@sentry-internal/feedback@7.90.0": - version "7.90.0" - resolved "https://registry.yarnpkg.com/@sentry-internal/feedback/-/feedback-7.90.0.tgz#053e36b4d01dd94c948e5eb6902f264c1d4436e6" - integrity sha512-ZIdpwK9KmiE/UYGUgNE3N9A5MWm92rbC/0u04LxQfZh0tGqN2EchwivQpFCWuu5QsKMlsza7aO6YQXsKvwt1Ww== - dependencies: - "@sentry/core" "7.90.0" - "@sentry/types" "7.90.0" - "@sentry/utils" "7.90.0" - -"@sentry-internal/tracing@7.90.0": - version "7.90.0" - resolved "https://registry.yarnpkg.com/@sentry-internal/tracing/-/tracing-7.90.0.tgz#cd21662dbfa3d90d34e91eabd875a1616717d3d3" - integrity sha512-74jEtpdio9aRkiVBcrY1ZJXek0oFMqxDJK6BkJNCA+aUK1z96V9viehANRk3Nbxm01rWjmH1U4e1siuo9FhjuQ== - dependencies: - "@sentry/core" "7.90.0" - "@sentry/types" "7.90.0" - "@sentry/utils" "7.90.0" - -"@sentry-internal/typescript@7.90.0": - version "7.90.0" - resolved "https://registry.yarnpkg.com/@sentry-internal/typescript/-/typescript-7.90.0.tgz#fcf4e9c35f56b9331d4dc93ce1f35a89bd3ad361" - integrity sha512-m8VDDATpnBgLfFLl1tISA2B5Yw5UUcHdoYlOGAVFnIV22wzM4M7mO8PP6vZ2teA7Rh9TINiTgJu8ZN06mkmATw== - -"@sentry/browser@7.90.0": - version "7.90.0" - resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-7.90.0.tgz#a5a696a328364f3bf15405d03112c06f53bb2923" - integrity sha512-ik3Jwo+TYjoEesJlt3PlHDcPE9h//WwyUsVkV9ZsVx0MSXb8c1VC4uDMsyUqjA+gPImmw1l9KlWZtvaOooZEhg== - dependencies: - "@sentry-internal/feedback" "7.90.0" - "@sentry-internal/tracing" "7.90.0" - "@sentry/core" "7.90.0" - "@sentry/replay" "7.90.0" - "@sentry/types" "7.90.0" - "@sentry/utils" "7.90.0" - -"@sentry/core@7.90.0": - version "7.90.0" - resolved "https://registry.yarnpkg.com/@sentry/core/-/core-7.90.0.tgz#dfd8e3e4eec4b140681ddb21a3fea848fcab7a01" - integrity sha512-HolpdHjULCwehKPWHR6IPQM0NBjmORhlBU7FtCh/e8TtSkZ9ztPsuofNBomMS1+mdbL+yxOIc9KUYEl0zRfeAQ== - dependencies: - "@sentry/types" "7.90.0" - "@sentry/utils" "7.90.0" - -"@sentry/node@7.90.0": - version "7.90.0" - resolved "https://registry.yarnpkg.com/@sentry/node/-/node-7.90.0.tgz#083bbdc053426d491281bff6f8a238600dd93e99" - integrity sha512-VjDI2MCkidoFEzrMa1gqmwYt1sUhYnu+zoFF5P5jgapTVVJ5xc2b7k/lS62U6IsfxHNrIdTtQHsrbCS5+s0GvQ== - dependencies: - "@sentry-internal/tracing" "7.90.0" - "@sentry/core" "7.90.0" - "@sentry/types" "7.90.0" - "@sentry/utils" "7.90.0" +"@sentry-internal/feedback@7.92.0": + version "7.92.0" + resolved "https://registry.yarnpkg.com/@sentry-internal/feedback/-/feedback-7.92.0.tgz#1293b0a332f81cdf3970abd36894b9d25670c4e6" + integrity sha512-/jEALRtVqboxB9kcK2tag8QCO6XANTlGBb9RV3oeGXJe0DDNJXRq6wVZbfgztXJRrfgx4XVDcNt1pRVoGGG++g== + dependencies: + "@sentry/core" "7.92.0" + "@sentry/types" "7.92.0" + "@sentry/utils" "7.92.0" + +"@sentry-internal/tracing@7.92.0": + version "7.92.0" + resolved "https://registry.yarnpkg.com/@sentry-internal/tracing/-/tracing-7.92.0.tgz#505d94a93b5df965ec6bfb35da43389988259d4d" + integrity sha512-ur55vPcUUUWFUX4eVLNP71ohswK7ZZpleNZw9Y1GfLqyI+0ILQUwjtzqItJrdClvVsdRZJMRmDV40Hp9Lbb9mA== + dependencies: + "@sentry/core" "7.92.0" + "@sentry/types" "7.92.0" + "@sentry/utils" "7.92.0" + +"@sentry-internal/typescript@7.92.0": + version "7.92.0" + resolved "https://registry.yarnpkg.com/@sentry-internal/typescript/-/typescript-7.92.0.tgz#25196d80b127a8a22f32a4b95f691f512d0ad117" + integrity sha512-fCMKhG+J3VV+afyyWu6rsuhMppugKj8ubk8b2Ss7BggzPF5GEA6njTUBJYpFNkvy/RGLy6gDy3Qpqb/cH3NT2g== + +"@sentry/browser@7.92.0": + version "7.92.0" + resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-7.92.0.tgz#f4c65f2af6f38c2dd5e32153e9b358c0c80275f2" + integrity sha512-loMr02/zQ38u8aQhYLtIBg0i5n3ps2e3GUXrt3CdsJQdkRYfa62gcrE7SzvoEpMVHTk7VOI4fWGht8cWw/1k3A== + dependencies: + "@sentry-internal/feedback" "7.92.0" + "@sentry-internal/tracing" "7.92.0" + "@sentry/core" "7.92.0" + "@sentry/replay" "7.92.0" + "@sentry/types" "7.92.0" + "@sentry/utils" "7.92.0" + +"@sentry/core@7.92.0": + version "7.92.0" + resolved "https://registry.yarnpkg.com/@sentry/core/-/core-7.92.0.tgz#4e74c1959348b698226c49ead7a24e165502b55c" + integrity sha512-1Tly7YB2I1byI5xb0Cwrxs56Rhww+6mQ7m9P7rTmdC3/ijOzbEoohtYIUPwcooCEarpbEJe/tAayRx6BrH2UbQ== + dependencies: + "@sentry/types" "7.92.0" + "@sentry/utils" "7.92.0" + +"@sentry/node@7.92.0": + version "7.92.0" + resolved "https://registry.yarnpkg.com/@sentry/node/-/node-7.92.0.tgz#880d3be5cb8ef805a6856c619db3951b1678f726" + integrity sha512-LZeQL1r6kikEoOzA9K61OmMl32/lK/6PzmFNDH6z7UYwQopCZgVA6IP+CZuln8K2ys5c9hCyF7ICQMysXfpNJA== + dependencies: + "@sentry-internal/tracing" "7.92.0" + "@sentry/core" "7.92.0" + "@sentry/types" "7.92.0" + "@sentry/utils" "7.92.0" https-proxy-agent "^5.0.0" -"@sentry/replay@7.90.0": - version "7.90.0" - resolved "https://registry.yarnpkg.com/@sentry/replay/-/replay-7.90.0.tgz#98e181c495422a13b088dcb030556511824eaa95" - integrity sha512-fsABtzQ5JQI7G5CC4fg05lVI5DTbd1uwKi41xVKFRmCB5NVTHvK7bHgP8n6uSbnle+gp9rUxVPLLBIPjKfaTmw== +"@sentry/replay@7.92.0": + version "7.92.0" + resolved "https://registry.yarnpkg.com/@sentry/replay/-/replay-7.92.0.tgz#d94e9f6b72e540e73378a74ca1190068edd447f2" + integrity sha512-G1t9Uvc9cR8VpNkElwvHIMGzykjIKikb10n0tfVd3e+rBPMCCjCPWOduwG6jZYxcvCjTpqmJh6NSLXxL/Mt4JA== dependencies: - "@sentry-internal/tracing" "7.90.0" - "@sentry/core" "7.90.0" - "@sentry/types" "7.90.0" - "@sentry/utils" "7.90.0" + "@sentry-internal/tracing" "7.92.0" + "@sentry/core" "7.92.0" + "@sentry/types" "7.92.0" + "@sentry/utils" "7.92.0" -"@sentry/types@7.90.0": - version "7.90.0" - resolved "https://registry.yarnpkg.com/@sentry/types/-/types-7.90.0.tgz#72797abd790fc3de546d42600752004a7f7d07d0" - integrity sha512-dA0Mtba5jYlcQ6xBsGILZuFq4NGrWLfr2ys036z2JE4H1+3PxOVERlD3Di7p+WKYM5gjFw10Hn3EgUV979E3dA== +"@sentry/types@7.92.0": + version "7.92.0" + resolved "https://registry.yarnpkg.com/@sentry/types/-/types-7.92.0.tgz#4c308fdb316c0272f55f0816230fe87e7b9b551a" + integrity sha512-APmSOuZuoRGpbPpPeYIbMSplPjiWNLZRQa73QiXuTflW4Tu/ItDlU8hOa2+A6JKVkJCuD2EN6yUrxDGSMyNXeg== -"@sentry/utils@7.90.0": - version "7.90.0" - resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-7.90.0.tgz#d4eea6392af7498c7be03205151ad11ea8707915" - integrity sha512-6BpqAzONm/HQbdlL4TY2W2vBSmaG/eVvwUaHoz0wB49EkWwpF6j/SO9Kb/XkiA/qp9GoJVXpnGBFQLPx7kv/Yw== +"@sentry/utils@7.92.0": + version "7.92.0" + resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-7.92.0.tgz#20ed29742594eab007f9ff72e008b5262456a319" + integrity sha512-3nEfrQ1z28b/2zgFGANPh5yMVtgwXmrasZxTvKbrAj+KWJpjrJHrIR84r9W277J44NMeZ5RhRW2uoDmuBslPnA== dependencies: - "@sentry/types" "7.90.0" + "@sentry/types" "7.92.0" "@sindresorhus/is@^4.0.0": version "4.6.0"