Skip to content

Commit b877c10

Browse files
authored
chore: Add missing fields into Replay NetworkRequestData type (#8284)
Before submitting a pull request, please take a look at our [Contributing](https://github.com/getsentry/sentry-javascript/blob/master/CONTRIBUTING.md) guidelines and verify: - [ ] If you've added code that should be tested, please add tests. - [ ] Ensure your code lints and the test suite passes (`yarn lint`) & (`yarn test`).
1 parent 1b37517 commit b877c10

File tree

9 files changed

+109
-68
lines changed

9 files changed

+109
-68
lines changed

packages/replay/src/index.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,13 @@ export { Replay } from './integration';
22
export type {
33
BreadcrumbFrame,
44
BreadcrumbFrameEvent,
5+
OptionFrameEvent,
56
ReplayFrame,
67
ReplayFrameEvent,
78
SpanFrame,
89
SpanFrameEvent,
9-
} from './types/replayFrame';
10+
} from './types';
11+
export { EventType } from '@sentry-internal/rrweb';
12+
export { NodeType } from '@sentry-internal/rrweb-snapshot';
13+
export type { eventWithTime, fullSnapshotEvent } from '@sentry-internal/rrweb';
14+
export type { serializedNodeWithId } from '@sentry-internal/rrweb-snapshot';

packages/replay/src/types/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
export * from './performance';
22
export * from './replay';
33
export * from './replayFrame';
4+
export * from './request';
45
export * from './rrweb';

packages/replay/src/types/performance.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import type { ReplayNetworkRequestOrResponse } from './request';
2+
13
export type AllPerformanceEntry = PerformancePaintTiming | PerformanceResourceTiming | PerformanceNavigationTiming;
24

35
// PerformancePaintTiming and PerformanceNavigationTiming are only available with TS 4.4 and newer
@@ -124,6 +126,8 @@ export interface NetworkRequestData {
124126
statusCode?: number;
125127
requestBodySize?: number;
126128
responseBodySize?: number;
129+
request?: ReplayNetworkRequestOrResponse;
130+
response?: ReplayNetworkRequestOrResponse;
127131
}
128132

129133
export interface HistoryData {

packages/replay/src/types/replay.ts

Lines changed: 1 addition & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import type {
1111
import type { SKIPPED, THROTTLED } from '../util/throttle';
1212
import type { AllPerformanceEntry } from './performance';
1313
import type { ReplayFrameEvent } from './replayFrame';
14+
import type { ReplayNetworkRequestOrResponse } from './request';
1415
import type { eventWithTime, recordOptions } from './rrweb';
1516

1617
export type RecordingEvent = ReplayFrameEvent | eventWithTime;
@@ -452,24 +453,6 @@ export type FetchHint = FetchBreadcrumbHint & {
452453
response: Response;
453454
};
454455

455-
type JsonObject = Record<string, unknown>;
456-
type JsonArray = unknown[];
457-
458-
export type NetworkBody = JsonObject | JsonArray | string;
459-
460-
export type NetworkMetaWarning = 'JSON_TRUNCATED' | 'TEXT_TRUNCATED' | 'INVALID_JSON' | 'URL_SKIPPED';
461-
462-
interface NetworkMeta {
463-
warnings?: NetworkMetaWarning[];
464-
}
465-
466-
export interface ReplayNetworkRequestOrResponse {
467-
size?: number;
468-
body?: NetworkBody;
469-
headers: Record<string, string>;
470-
_meta?: NetworkMeta;
471-
}
472-
473456
export type ReplayNetworkRequestData = {
474457
startTimestamp: number;
475458
endTimestamp: number;

packages/replay/src/types/replayFrame.ts

Lines changed: 76 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,17 @@
1-
import type { Breadcrumb, FetchBreadcrumbData, XhrBreadcrumbData } from '@sentry/types';
2-
3-
import type { AllEntryData } from './performance';
4-
import type { EventType } from './rrweb';
5-
6-
interface BaseReplayFrame {
1+
import type { EventType } from '@sentry-internal/rrweb';
2+
import type { Breadcrumb } from '@sentry/types';
3+
4+
import type {
5+
HistoryData,
6+
LargestContentfulPaintData,
7+
MemoryData,
8+
NavigationData,
9+
NetworkRequestData,
10+
PaintData,
11+
ResourceData,
12+
} from './performance';
13+
14+
interface BaseBreadcrumbFrame {
715
timestamp: number;
816
/**
917
* For compatibility reasons
@@ -29,43 +37,31 @@ interface ConsoleFrameData {
2937
logger: string;
3038
arguments?: unknown[];
3139
}
32-
interface ConsoleFrame extends BaseReplayFrame {
40+
interface ConsoleFrame extends BaseBreadcrumbFrame {
3341
category: 'console';
3442
level: Breadcrumb['level'];
3543
message: string;
3644
data: ConsoleFrameData;
3745
}
3846

3947
type ClickFrameData = BaseDomFrameData;
40-
interface ClickFrame extends BaseReplayFrame {
48+
interface ClickFrame extends BaseBreadcrumbFrame {
4149
category: 'ui.click';
4250
message: string;
4351
data: ClickFrameData;
4452
}
4553

46-
interface FetchFrame extends BaseReplayFrame {
47-
category: 'fetch';
48-
type: 'http';
49-
data: FetchBreadcrumbData;
50-
}
51-
52-
interface InputFrame extends BaseReplayFrame {
54+
interface InputFrame extends BaseBreadcrumbFrame {
5355
category: 'ui.input';
5456
message: string;
5557
}
5658

57-
interface XhrFrame extends BaseReplayFrame {
58-
category: 'xhr';
59-
type: 'http';
60-
data: XhrBreadcrumbData;
61-
}
62-
6359
/* Breadcrumbs from Replay */
6460
interface MutationFrameData {
6561
count: number;
6662
limit: boolean;
6763
}
68-
interface MutationFrame extends BaseReplayFrame {
64+
interface MutationFrame extends BaseBreadcrumbFrame {
6965
category: 'replay.mutations';
7066
data: MutationFrameData;
7167
}
@@ -77,16 +73,16 @@ interface KeyboardEventFrameData extends BaseDomFrameData {
7773
altKey: boolean;
7874
key: string;
7975
}
80-
interface KeyboardEventFrame extends BaseReplayFrame {
76+
interface KeyboardEventFrame extends BaseBreadcrumbFrame {
8177
category: 'ui.keyDown';
8278
data: KeyboardEventFrameData;
8379
}
8480

85-
interface BlurFrame extends BaseReplayFrame {
81+
interface BlurFrame extends BaseBreadcrumbFrame {
8682
category: 'ui.blur';
8783
}
8884

89-
interface FocusFrame extends BaseReplayFrame {
85+
interface FocusFrame extends BaseBreadcrumbFrame {
9086
category: 'ui.focus';
9187
}
9288

@@ -95,46 +91,89 @@ interface SlowClickFrameData extends ClickFrameData {
9591
timeAfterClickFs: number;
9692
endReason: string;
9793
}
98-
interface SlowClickFrame extends BaseReplayFrame {
94+
interface SlowClickFrame extends BaseBreadcrumbFrame {
9995
category: 'ui.slowClickDetected';
10096
data: SlowClickFrameData;
10197
}
10298

10399
interface OptionFrame {
104-
sessionSampleRate: number;
105-
errorSampleRate: number;
106-
useCompressionOption: boolean;
107100
blockAllMedia: boolean;
108-
maskAllText: boolean;
101+
errorSampleRate: number;
109102
maskAllInputs: boolean;
110-
useCompression: boolean;
111-
networkDetailHasUrls: boolean;
103+
maskAllText: boolean;
112104
networkCaptureBodies: boolean;
105+
networkDetailHasUrls: boolean;
113106
networkRequestHasHeaders: boolean;
114107
networkResponseHasHeaders: boolean;
108+
sessionSampleRate: number;
109+
useCompression: boolean;
110+
useCompressionOption: boolean;
115111
}
116112

117113
export type BreadcrumbFrame =
118114
| ConsoleFrame
119115
| ClickFrame
120-
| FetchFrame
121116
| InputFrame
122-
| XhrFrame
123117
| KeyboardEventFrame
124118
| BlurFrame
125119
| FocusFrame
126120
| SlowClickFrame
127121
| MutationFrame
128-
| BaseReplayFrame;
122+
| BaseBreadcrumbFrame;
129123

130-
export interface SpanFrame {
124+
interface BaseSpanFrame {
131125
op: string;
132126
description: string;
133127
startTimestamp: number;
134128
endTimestamp: number;
135-
data: AllEntryData;
129+
data?: undefined | Record<string, any>;
130+
}
131+
132+
interface HistoryFrame extends BaseSpanFrame {
133+
data: HistoryData;
134+
op: 'navigation.push';
135+
}
136+
137+
interface LargestContentfulPaintFrame extends BaseSpanFrame {
138+
data: LargestContentfulPaintData;
139+
op: 'largest-contentful-paint';
140+
}
141+
142+
interface MemoryFrame extends BaseSpanFrame {
143+
data: MemoryData;
144+
op: 'memory';
145+
}
146+
147+
interface NavigationFrame extends BaseSpanFrame {
148+
data: NavigationData;
149+
op: 'navigation.navigate' | 'navigation.reload' | 'navigation.back_forward';
150+
}
151+
152+
interface PaintFrame extends BaseSpanFrame {
153+
data: PaintData;
154+
op: 'paint';
155+
}
156+
157+
interface RequestFrame extends BaseSpanFrame {
158+
data: NetworkRequestData;
159+
op: 'resource.fetch' | 'resource.xhr';
160+
}
161+
162+
interface ResourceFrame extends BaseSpanFrame {
163+
data: ResourceData;
164+
op: 'resource.css' | 'resource.iframe' | 'resource.img' | 'resource.link' | 'resource.other' | 'resource.script';
136165
}
137166

167+
export type SpanFrame =
168+
| BaseSpanFrame
169+
| HistoryFrame
170+
| RequestFrame
171+
| LargestContentfulPaintFrame
172+
| MemoryFrame
173+
| NavigationFrame
174+
| PaintFrame
175+
| ResourceFrame;
176+
138177
export type ReplayFrame = BreadcrumbFrame | SpanFrame;
139178

140179
interface RecordingCustomEvent {

packages/replay/src/types/request.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
type JsonObject = Record<string, unknown>;
2+
type JsonArray = unknown[];
3+
4+
export type NetworkBody = JsonObject | JsonArray | string;
5+
6+
export type NetworkMetaWarning = 'JSON_TRUNCATED' | 'TEXT_TRUNCATED' | 'INVALID_JSON' | 'URL_SKIPPED';
7+
8+
interface NetworkMeta {
9+
warnings?: NetworkMetaWarning[];
10+
}
11+
12+
export interface ReplayNetworkRequestOrResponse {
13+
size?: number;
14+
body?: NetworkBody;
15+
headers: Record<string, string>;
16+
_meta?: NetworkMeta;
17+
}

packages/replay/src/types/rrweb.ts

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,10 @@
11
/* eslint-disable @typescript-eslint/naming-convention */
22

3+
import type { EventType } from '@sentry-internal/rrweb';
4+
35
type blockClass = string | RegExp;
46
type maskTextClass = string | RegExp;
57

6-
export enum EventType {
7-
DomContentLoaded = 0,
8-
Load = 1,
9-
FullSnapshot = 2,
10-
IncrementalSnapshot = 3,
11-
Meta = 4,
12-
Custom = 5,
13-
Plugin = 6,
14-
}
15-
168
/**
179
* This is a partial copy of rrweb's eventWithTime type which only contains the properties
1810
* we specifcally need in the SDK.

packages/replay/src/util/addEvent.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1+
import { EventType } from '@sentry-internal/rrweb';
12
import { getCurrentHub } from '@sentry/core';
23
import { logger } from '@sentry/utils';
34

45
import type { AddEventResult, RecordingEvent, ReplayContainer, ReplayFrameEvent } from '../types';
5-
import { EventType } from '../types/rrweb';
66
import { timestampToMs } from './timestampToMs';
77

88
function isCustomEvent(event: RecordingEvent): event is ReplayFrameEvent {

packages/replay/src/util/handleRecordingEmit.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1+
import { EventType } from '@sentry-internal/rrweb';
12
import { logger } from '@sentry/utils';
23

34
import { saveSession } from '../session/saveSession';
45
import type { AddEventResult, OptionFrameEvent, RecordingEvent, ReplayContainer } from '../types';
5-
import { EventType } from '../types/rrweb';
66
import { addEvent } from './addEvent';
77

88
type RecordingEmitCallback = (event: RecordingEvent, isCheckout?: boolean) => void;

0 commit comments

Comments
 (0)