diff --git a/packages/core/src/envelope.ts b/packages/core/src/envelope.ts index 1a2f44fd82c6..2ae474dd99b0 100644 --- a/packages/core/src/envelope.ts +++ b/packages/core/src/envelope.ts @@ -63,7 +63,15 @@ export function createEventEnvelope( tunnel?: string, ): EventEnvelope { const sdkInfo = getSdkMetadataForEnvelopeHeader(metadata); - const eventType = event.type || 'event'; + + /* + Note: Due to TS, event.type may be `replay_event`, theoretically. + In practice, we never call `createEventEnvelope` with `replay_event` type, + and we'd have to adjut a looot of types to make this work properly. + We want to avoid casting this around, as that could lead to bugs (e.g. when we add another type) + So the safe choice is to really guard against the replay_event type here. + */ + const eventType = event.type && event.type !== 'replay_event' ? event.type : 'event'; enhanceEventWithSdkInfo(event, metadata && metadata.sdk); diff --git a/packages/core/src/hub.ts b/packages/core/src/hub.ts index 5036158e08eb..e5f161559d39 100644 --- a/packages/core/src/hub.ts +++ b/packages/core/src/hub.ts @@ -233,7 +233,7 @@ export class Hub implements HubInterface { */ public captureEvent(event: Event, hint?: EventHint): string { const eventId = hint && hint.event_id ? hint.event_id : uuid4(); - if (event.type !== 'transaction') { + if (!event.type) { this._lastEventId = eventId; } diff --git a/packages/hub/test/hub.test.ts b/packages/hub/test/hub.test.ts index 5ce521ead4c4..c97670c0e7cb 100644 --- a/packages/hub/test/hub.test.ts +++ b/packages/hub/test/hub.test.ts @@ -1,7 +1,7 @@ /* eslint-disable @typescript-eslint/unbound-method */ /* eslint-disable deprecation/deprecation */ -import { Client, Event } from '@sentry/types'; +import { Client, Event, EventType } from '@sentry/types'; import { getCurrentHub, Hub, Scope } from '../src'; @@ -358,10 +358,11 @@ describe('Hub', () => { expect(args[1].event_id).toEqual(hub.lastEventId()); }); - test('transactions do not set lastEventId', () => { + const eventTypesToIgnoreLastEventId: EventType[] = ['transaction', 'replay_event']; + it.each(eventTypesToIgnoreLastEventId)('eventType %s does not set lastEventId', eventType => { const event: Event = { extra: { b: 3 }, - type: 'transaction', + type: eventType, }; const testClient = makeClient(); const hub = new Hub(testClient); diff --git a/packages/replay/src/coreHandlers/handleGlobalEvent.ts b/packages/replay/src/coreHandlers/handleGlobalEvent.ts index 87dc6c790fad..59a286c3a770 100644 --- a/packages/replay/src/coreHandlers/handleGlobalEvent.ts +++ b/packages/replay/src/coreHandlers/handleGlobalEvent.ts @@ -12,10 +12,7 @@ import { isRrwebError } from '../util/isRrwebError'; export function handleGlobalEventListener(replay: ReplayContainer): (event: Event) => Event | null { return (event: Event) => { // Do not apply replayId to the root event - if ( - // @ts-ignore new event type - event.type === REPLAY_EVENT_NAME - ) { + if (event.type === REPLAY_EVENT_NAME) { // Replays have separate set of breadcrumbs, do not include breadcrumbs // from core SDK delete event.breadcrumbs; @@ -31,7 +28,7 @@ export function handleGlobalEventListener(replay: ReplayContainer): (event: Even // Only tag transactions with replayId if not waiting for an error // @ts-ignore private - if (event.type !== 'transaction' || replay.recordingMode === 'session') { + if (!event.type || replay.recordingMode === 'session') { event.tags = { ...event.tags, replayId: replay.session?.id }; } diff --git a/packages/types/src/datacategory.ts b/packages/types/src/datacategory.ts index a462957b3ccd..0968cefc752b 100644 --- a/packages/types/src/datacategory.ts +++ b/packages/types/src/datacategory.ts @@ -10,6 +10,8 @@ export type DataCategory = | 'error' // Transaction type event | 'transaction' + // Replay type event + | 'replay_event' // Events with `event_type` csp, hpkp, expectct, expectstaple | 'security' // Attachment bytes stored (unused for rate limiting diff --git a/packages/types/src/event.ts b/packages/types/src/event.ts index 3c8b27c49f10..e9df8d364c68 100644 --- a/packages/types/src/event.ts +++ b/packages/types/src/event.ts @@ -63,7 +63,7 @@ export interface Event { * Note that `ErrorEvent`s do not have a type (hence its undefined), * while all other events are required to have one. */ -export type EventType = 'transaction' | 'profile' | undefined; +export type EventType = 'transaction' | 'profile' | 'replay_event' | undefined; export interface ErrorEvent extends Event { type: undefined; diff --git a/packages/types/src/index.ts b/packages/types/src/index.ts index 56d5379f9e34..37857ce12155 100644 --- a/packages/types/src/index.ts +++ b/packages/types/src/index.ts @@ -25,7 +25,7 @@ export type { UserFeedbackItem, } from './envelope'; export type { ExtendedError } from './error'; -export type { Event, EventHint, ErrorEvent, TransactionEvent } from './event'; +export type { Event, EventHint, EventType, ErrorEvent, TransactionEvent } from './event'; export type { EventProcessor } from './eventprocessor'; export type { Exception } from './exception'; export type { Extra, Extras } from './extra';