Skip to content

Commit a23bda5

Browse files
authored
feat(types): Upstream some replay types (#6506)
1 parent b16ea89 commit a23bda5

14 files changed

+71
-32
lines changed

packages/replay/jest.setup.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
22
import { getCurrentHub } from '@sentry/core';
3-
import { Transport } from '@sentry/types';
3+
import { ReplayRecordingData,Transport } from '@sentry/types';
44

55
import type { ReplayContainer, Session } from './src/types';
66

@@ -55,7 +55,7 @@ type SentReplayExpected = {
5555
replayEventPayload?: ReplayEventPayload;
5656
recordingHeader?: RecordingHeader;
5757
recordingPayloadHeader?: RecordingPayloadHeader;
58-
events?: string | Uint8Array;
58+
events?: ReplayRecordingData;
5959
};
6060

6161
// eslint-disable-next-line @typescript-eslint/explicit-function-return-type

packages/replay/src/eventBuffer.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// TODO: figure out member access types and remove the line above
33

44
import { captureException } from '@sentry/core';
5+
import { ReplayRecordingData } from '@sentry/types';
56
import { logger } from '@sentry/utils';
67

78
import type { EventBuffer, RecordingEvent, WorkerRequest, WorkerResponse } from './types';
@@ -95,7 +96,7 @@ export class EventBufferCompressionWorker implements EventBuffer {
9596
return this._eventBufferItemLength;
9697
}
9798

98-
public async addEvent(event: RecordingEvent, isCheckout?: boolean): Promise<string | Uint8Array> {
99+
public async addEvent(event: RecordingEvent, isCheckout?: boolean): Promise<ReplayRecordingData> {
99100
if (isCheckout) {
100101
// This event is a checkout, make sure worker buffer is cleared before
101102
// proceeding.
@@ -159,7 +160,7 @@ export class EventBufferCompressionWorker implements EventBuffer {
159160
});
160161
}
161162

162-
private _sendEventToWorker(event: RecordingEvent): Promise<string | Uint8Array> {
163+
private _sendEventToWorker(event: RecordingEvent): Promise<ReplayRecordingData> {
163164
const promise = this._postMessage({
164165
id: this._getAndIncrementId(),
165166
method: 'addEvent',

packages/replay/src/replay.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/* eslint-disable max-lines */ // TODO: We might want to split this file up
22
import { addGlobalEventProcessor, captureException, getCurrentHub, setContext } from '@sentry/core';
3-
import { Breadcrumb, Event } from '@sentry/types';
3+
import { Breadcrumb, ReplayEvent } from '@sentry/types';
44
import { addInstrumentationHandler, logger } from '@sentry/utils';
55
import debounce from 'lodash.debounce';
66
import { EventType, record } from 'rrweb';
@@ -927,7 +927,7 @@ export class ReplayContainer implements ReplayContainerInterface {
927927
return;
928928
}
929929

930-
const baseEvent: Event = {
930+
const baseEvent: ReplayEvent = {
931931
// @ts-ignore private api
932932
type: REPLAY_EVENT_NAME,
933933
...(includeReplayStartTimestamp ? { replay_start_timestamp: initialTimestamp / 1000 } : {}),

packages/replay/src/types.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import { ReplayRecordingData } from '@sentry/types';
2+
13
import type { eventWithTime, recordOptions } from './types/rrweb';
24

35
export type RecordingEvent = eventWithTime;
@@ -47,7 +49,7 @@ export interface WorkerResponse {
4749
id: number;
4850
method: string;
4951
success: boolean;
50-
response: string | Uint8Array;
52+
response: ReplayRecordingData;
5153
}
5254

5355
export interface SampleRates {
@@ -211,7 +213,7 @@ export interface EventBuffer {
211213
readonly length: number;
212214
destroy(): void;
213215
addEvent(event: RecordingEvent, isCheckout?: boolean): void;
214-
finish(): Promise<string | Uint8Array>;
216+
finish(): Promise<ReplayRecordingData>;
215217
}
216218

217219
export type AddUpdateCallback = () => boolean | void;

packages/replay/src/util/createPayload.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import { ReplayRecordingData } from '@sentry/types';
2+
13
import type { RecordedEvents } from '../types';
24

35
export function createPayload({
@@ -6,7 +8,7 @@ export function createPayload({
68
}: {
79
events: RecordedEvents;
810
headers: Record<string, unknown>;
9-
}): string | Uint8Array {
11+
}): ReplayRecordingData {
1012
let payloadWithSequence;
1113

1214
// XXX: newline is needed to separate sequence id from events

packages/replay/src/util/createReplayEnvelope.ts

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,22 @@
1-
import { DsnComponents, Envelope, Event } from '@sentry/types';
1+
import { DsnComponents, ReplayEnvelope, ReplayEvent, ReplayRecordingData } from '@sentry/types';
22
import { createEnvelope, createEventEnvelopeHeaders, getSdkMetadataForEnvelopeHeader } from '@sentry/utils';
33

44
export function createReplayEnvelope(
5-
replayEvent: Event,
6-
payloadWithSequence: string | Uint8Array,
5+
replayEvent: ReplayEvent,
6+
recordingData: ReplayRecordingData,
77
dsn: DsnComponents,
88
tunnel?: string,
9-
): Envelope {
10-
return createEnvelope(
9+
): ReplayEnvelope {
10+
return createEnvelope<ReplayEnvelope>(
1111
createEventEnvelopeHeaders(replayEvent, getSdkMetadataForEnvelopeHeader(replayEvent), tunnel, dsn),
1212
[
13-
// @ts-ignore New types
1413
[{ type: 'replay_event' }, replayEvent],
1514
[
1615
{
17-
// @ts-ignore setting envelope
1816
type: 'replay_recording',
19-
length: payloadWithSequence.length,
17+
length: recordingData.length,
2018
},
21-
// @ts-ignore: Type 'string' is not assignable to type 'ClientReport'.ts(2322)
22-
payloadWithSequence,
19+
recordingData,
2320
],
2421
],
2522
);

packages/replay/src/util/getReplayEvent.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { Scope } from '@sentry/core';
2-
import { Client, Event } from '@sentry/types';
2+
import { Client, ReplayEvent } from '@sentry/types';
33

44
export async function getReplayEvent({
55
client,
@@ -10,11 +10,11 @@ export async function getReplayEvent({
1010
client: Client;
1111
scope: Scope;
1212
replayId: string;
13-
event: Event;
14-
}): Promise<Event | null> {
13+
event: ReplayEvent;
14+
}): Promise<ReplayEvent | null> {
1515
// XXX: This event does not trigger `beforeSend` in SDK
1616
// @ts-ignore private api
17-
const preparedEvent: Event | null = await client._prepareEvent(event, { event_id }, scope);
17+
const preparedEvent: ReplayEvent | null = await client._prepareEvent(event, { event_id }, scope);
1818

1919
if (preparedEvent) {
2020
// extract the SDK name because `client._prepareEvent` doesn't add it to the event

packages/replay/test/unit/util/createReplayEnvelope.test.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
1-
import { Event } from '@sentry/types';
1+
import { ReplayEvent } from '@sentry/types';
22
import { makeDsn } from '@sentry/utils';
33

44
import { createReplayEnvelope } from '../../../src/util/createReplayEnvelope';
55

66
describe('createReplayEnvelope', () => {
77
const REPLAY_ID = 'MY_REPLAY_ID';
88

9-
const replayEvent = {
9+
const replayEvent: ReplayEvent = {
10+
// @ts-ignore private api
1011
type: 'replay_event',
1112
timestamp: 1670837008.634,
1213
error_ids: ['errorId'],
@@ -41,7 +42,7 @@ describe('createReplayEnvelope', () => {
4142
});
4243

4344
it('creates an envelope for a given Replay event', () => {
44-
const envelope = createReplayEnvelope(replayEvent as Event, payloadWithSequence, dsn);
45+
const envelope = createReplayEnvelope(replayEvent, payloadWithSequence, dsn);
4546

4647
expect(envelope).toEqual([
4748
{
@@ -73,7 +74,7 @@ describe('createReplayEnvelope', () => {
7374
});
7475

7576
it('creates an envelope with the `dsn` key in the header if `tunnel` is specified', () => {
76-
const envelope = createReplayEnvelope(replayEvent as Event, payloadWithSequence, dsn, '/my-tunnel-endpoint');
77+
const envelope = createReplayEnvelope(replayEvent, payloadWithSequence, dsn, '/my-tunnel-endpoint');
7778

7879
expect(envelope).toEqual([
7980
{

packages/replay/test/unit/util/getReplayEvent.test.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { BrowserClient } from '@sentry/browser';
22
import { getCurrentHub, Hub, Scope } from '@sentry/core';
3-
import { Client, Event } from '@sentry/types';
3+
import { Client, ReplayEvent } from '@sentry/types';
44

55
import { REPLAY_EVENT_NAME } from '../../../src/constants';
66
import { getReplayEvent } from '../../../src/util/getReplayEvent';
@@ -25,14 +25,15 @@ describe('getReplayEvent', () => {
2525
expect(scope).toBeDefined();
2626

2727
const replayId = 'replay-ID';
28-
const event: Event = {
28+
const event: ReplayEvent = {
2929
// @ts-ignore private api
3030
type: REPLAY_EVENT_NAME,
3131
timestamp: 1670837008.634,
3232
error_ids: ['error-ID'],
3333
trace_ids: ['trace-ID'],
3434
urls: ['https://sentry.io/'],
3535
replay_id: replayId,
36+
event_id: replayId,
3637
segment_id: 3,
3738
};
3839

packages/types/src/datacategory.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,4 +19,7 @@ export type DataCategory =
1919
// SDK internal event, like client_reports
2020
| 'internal'
2121
// Profile event type
22-
| 'profile';
22+
| 'profile'
23+
// Replay event types
24+
| 'replay_event'
25+
| 'replay_recording';

packages/types/src/envelope.ts

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { ClientReport } from './clientreport';
22
import { DsnComponents } from './dsn';
33
import { Event } from './event';
4+
import { ReplayEvent, ReplayRecordingData } from './replay';
45
import { SdkInfo } from './sdkinfo';
56
import { Session, SessionAggregates } from './session';
67
import { Transaction } from './transaction';
@@ -27,7 +28,9 @@ export type EnvelopeItemType =
2728
| 'transaction'
2829
| 'attachment'
2930
| 'event'
30-
| 'profile';
31+
| 'profile'
32+
| 'replay_event'
33+
| 'replay_recording';
3134

3235
export type BaseEnvelopeHeaders = {
3336
[key: string]: unknown;
@@ -62,6 +65,8 @@ type UserFeedbackItemHeaders = { type: 'user_report' };
6265
type SessionItemHeaders = { type: 'session' };
6366
type SessionAggregatesItemHeaders = { type: 'sessions' };
6467
type ClientReportItemHeaders = { type: 'client_report' };
68+
type ReplayEventItemHeaders = { type: 'replay_event' };
69+
type ReplayRecordingItemHeaders = { type: 'replay_recording'; length: number };
6570

6671
export type EventItem = BaseEnvelopeItem<EventItemHeaders, Event>;
6772
export type AttachmentItem = BaseEnvelopeItem<AttachmentItemHeaders, string | Uint8Array>;
@@ -70,14 +75,18 @@ export type SessionItem =
7075
| BaseEnvelopeItem<SessionItemHeaders, Session>
7176
| BaseEnvelopeItem<SessionAggregatesItemHeaders, SessionAggregates>;
7277
export type ClientReportItem = BaseEnvelopeItem<ClientReportItemHeaders, ClientReport>;
78+
type ReplayEventItem = BaseEnvelopeItem<ReplayEventItemHeaders, ReplayEvent>;
79+
type ReplayRecordingItem = BaseEnvelopeItem<ReplayRecordingItemHeaders, ReplayRecordingData>;
7380

7481
export type EventEnvelopeHeaders = { event_id: string; sent_at: string; trace?: DynamicSamplingContext };
7582
type SessionEnvelopeHeaders = { sent_at: string };
7683
type ClientReportEnvelopeHeaders = BaseEnvelopeHeaders;
84+
type ReplayEnvelopeHeaders = BaseEnvelopeHeaders;
7785

7886
export type EventEnvelope = BaseEnvelope<EventEnvelopeHeaders, EventItem | AttachmentItem | UserFeedbackItem>;
7987
export type SessionEnvelope = BaseEnvelope<SessionEnvelopeHeaders, SessionItem>;
8088
export type ClientReportEnvelope = BaseEnvelope<ClientReportEnvelopeHeaders, ClientReportItem>;
89+
export type ReplayEnvelope = [ReplayEnvelopeHeaders, [ReplayEventItem, ReplayRecordingItem]];
8190

82-
export type Envelope = EventEnvelope | SessionEnvelope | ClientReportEnvelope;
91+
export type Envelope = EventEnvelope | SessionEnvelope | ClientReportEnvelope | ReplayEnvelope;
8392
export type EnvelopeItem = Envelope[1][number];

packages/types/src/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ export type {
1919
EventEnvelope,
2020
EventEnvelopeHeaders,
2121
EventItem,
22+
ReplayEnvelope,
2223
SessionEnvelope,
2324
SessionItem,
2425
UserFeedbackItem,
@@ -39,6 +40,7 @@ export type { ExtractedNodeRequestData, HttpHeaderValue, Primitive, WorkerLocati
3940
export type { ClientOptions, Options } from './options';
4041
export type { Package } from './package';
4142
export type { PolymorphicEvent, PolymorphicRequest } from './polymorphics';
43+
export type { ReplayEvent, ReplayRecordingData } from './replay';
4244
export type { QueryParams, Request } from './request';
4345
export type { Runtime } from './runtime';
4446
export type { CaptureContext, Scope, ScopeContext } from './scope';

packages/types/src/replay.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import { Event } from './event';
2+
3+
/**
4+
* NOTE: These types are still considered Beta and subject to change.
5+
* @hidden
6+
*/
7+
export interface ReplayEvent extends Event {
8+
urls: string[];
9+
error_ids: string[];
10+
trace_ids: string[];
11+
replay_id: string;
12+
segment_id: number;
13+
}
14+
15+
/**
16+
* NOTE: These types are still considered Beta and subject to change.
17+
* @hidden
18+
*/
19+
export type ReplayRecordingData = string | Uint8Array;

packages/utils/src/envelope.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,8 @@ const ITEM_TYPE_TO_DATA_CATEGORY_MAP: Record<EnvelopeItemType, DataCategory> = {
187187
client_report: 'internal',
188188
user_report: 'default',
189189
profile: 'profile',
190+
replay_event: 'replay_event',
191+
replay_recording: 'replay_recording',
190192
};
191193

192194
/**

0 commit comments

Comments
 (0)