@multiplayer-app/session-recorder-react-native 1.3.34 → 1.3.36
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ios/SessionRecorderNative.swift +4 -2
- package/lib/module/config/defaults.js +2 -1
- package/lib/module/config/defaults.js.map +1 -1
- package/lib/module/config/session-recorder.js +2 -1
- package/lib/module/config/session-recorder.js.map +1 -1
- package/lib/module/recorder/index.js +14 -9
- package/lib/module/recorder/index.js.map +1 -1
- package/lib/module/recorder/{navigationTracker.js → navigationRecorder.js} +16 -6
- package/lib/module/recorder/navigationRecorder.js.map +1 -0
- package/lib/module/recorder/screenRecorder.js +53 -10
- package/lib/module/recorder/screenRecorder.js.map +1 -1
- package/lib/module/services/api.service.js +50 -55
- package/lib/module/services/api.service.js.map +1 -1
- package/lib/module/services/socket.service.js +3 -1
- package/lib/module/services/socket.service.js.map +1 -1
- package/lib/module/session-recorder.js.map +1 -1
- package/lib/module/types/session-recorder.js.map +1 -1
- package/lib/typescript/src/config/defaults.d.ts.map +1 -1
- package/lib/typescript/src/config/session-recorder.d.ts.map +1 -1
- package/lib/typescript/src/recorder/index.d.ts +3 -3
- package/lib/typescript/src/recorder/index.d.ts.map +1 -1
- package/lib/typescript/src/recorder/{navigationTracker.d.ts → navigationRecorder.d.ts} +2 -2
- package/lib/typescript/src/recorder/navigationRecorder.d.ts.map +1 -0
- package/lib/typescript/src/recorder/screenRecorder.d.ts +10 -0
- package/lib/typescript/src/recorder/screenRecorder.d.ts.map +1 -1
- package/lib/typescript/src/services/api.service.d.ts +9 -8
- package/lib/typescript/src/services/api.service.d.ts.map +1 -1
- package/lib/typescript/src/services/socket.service.d.ts +1 -0
- package/lib/typescript/src/services/socket.service.d.ts.map +1 -1
- package/lib/typescript/src/session-recorder.d.ts.map +1 -1
- package/lib/typescript/src/types/configs.d.ts +6 -0
- package/lib/typescript/src/types/configs.d.ts.map +1 -1
- package/lib/typescript/src/types/session-recorder.d.ts +2 -0
- package/lib/typescript/src/types/session-recorder.d.ts.map +1 -1
- package/package.json +2 -2
- package/src/config/defaults.ts +1 -0
- package/src/config/session-recorder.ts +4 -0
- package/src/recorder/index.ts +25 -12
- package/src/recorder/{navigationTracker.ts → navigationRecorder.ts} +17 -5
- package/src/recorder/screenRecorder.ts +69 -18
- package/src/services/api.service.ts +58 -70
- package/src/services/socket.service.ts +3 -2
- package/src/session-recorder.ts +2 -0
- package/src/types/configs.ts +6 -0
- package/src/types/session-recorder.ts +2 -0
- package/lib/module/recorder/navigationTracker.js.map +0 -1
- package/lib/typescript/src/recorder/navigationTracker.d.ts.map +0 -1
package/src/recorder/index.ts
CHANGED
|
@@ -1,19 +1,21 @@
|
|
|
1
|
+
import { EventType, type eventWithTime } from '@rrweb/types';
|
|
1
2
|
import { SessionType } from '@multiplayer-app/session-recorder-common';
|
|
2
|
-
|
|
3
|
+
|
|
4
|
+
import { logger } from '../utils';
|
|
5
|
+
import { type RecorderConfig, type EventRecorder } from '../types';
|
|
3
6
|
import { SocketService } from '../services/socket.service';
|
|
4
7
|
import { CrashBufferService } from '../services/crashBuffer.service';
|
|
5
|
-
|
|
8
|
+
|
|
6
9
|
import { ScreenRecorder } from './screenRecorder';
|
|
7
10
|
import { GestureRecorder } from './gestureRecorder';
|
|
8
|
-
import {
|
|
9
|
-
|
|
10
|
-
import { type eventWithTime } from '@rrweb/types';
|
|
11
|
+
import { NavigationRecorder } from './navigationRecorder';
|
|
12
|
+
|
|
11
13
|
export class RecorderReactNativeSDK implements EventRecorder {
|
|
12
14
|
private isRecording = false;
|
|
13
15
|
private config?: RecorderConfig;
|
|
14
16
|
private screenRecorder: ScreenRecorder;
|
|
15
17
|
private gestureRecorder: GestureRecorder;
|
|
16
|
-
private
|
|
18
|
+
private navigationRecorder: NavigationRecorder;
|
|
17
19
|
private recordedEvents: eventWithTime[] = [];
|
|
18
20
|
private socketService!: SocketService;
|
|
19
21
|
private crashBuffer?: CrashBufferService;
|
|
@@ -25,7 +27,7 @@ export class RecorderReactNativeSDK implements EventRecorder {
|
|
|
25
27
|
constructor() {
|
|
26
28
|
this.screenRecorder = new ScreenRecorder();
|
|
27
29
|
this.gestureRecorder = new GestureRecorder();
|
|
28
|
-
this.
|
|
30
|
+
this.navigationRecorder = new NavigationRecorder();
|
|
29
31
|
}
|
|
30
32
|
|
|
31
33
|
init(
|
|
@@ -43,7 +45,7 @@ export class RecorderReactNativeSDK implements EventRecorder {
|
|
|
43
45
|
buffering?.windowMs || 0.5 * 60 * 1000
|
|
44
46
|
);
|
|
45
47
|
this.screenRecorder.init(config, this);
|
|
46
|
-
this.
|
|
48
|
+
this.navigationRecorder.init(config, this.screenRecorder);
|
|
47
49
|
this.gestureRecorder.init(config, this, this.screenRecorder);
|
|
48
50
|
}
|
|
49
51
|
|
|
@@ -61,6 +63,9 @@ export class RecorderReactNativeSDK implements EventRecorder {
|
|
|
61
63
|
// Emit recording started meta event
|
|
62
64
|
|
|
63
65
|
if (this.config.recordScreen) {
|
|
66
|
+
this.screenRecorder.setBufferOnlyMode(
|
|
67
|
+
!sessionId && this.bufferingEnabled
|
|
68
|
+
);
|
|
64
69
|
this.screenRecorder.start();
|
|
65
70
|
}
|
|
66
71
|
|
|
@@ -69,20 +74,20 @@ export class RecorderReactNativeSDK implements EventRecorder {
|
|
|
69
74
|
}
|
|
70
75
|
|
|
71
76
|
if (this.config.recordNavigation) {
|
|
72
|
-
this.
|
|
77
|
+
this.navigationRecorder.start();
|
|
73
78
|
}
|
|
74
79
|
}
|
|
75
80
|
|
|
76
81
|
stop(): void {
|
|
77
82
|
this.isRecording = false;
|
|
78
83
|
this.gestureRecorder.stop();
|
|
79
|
-
this.
|
|
84
|
+
this.navigationRecorder.stop();
|
|
80
85
|
this.screenRecorder.stop();
|
|
81
86
|
this.socketService?.close();
|
|
82
87
|
}
|
|
83
88
|
|
|
84
89
|
setNavigationRef(ref: any): void {
|
|
85
|
-
this.
|
|
90
|
+
this.navigationRecorder.setNavigationRef(ref);
|
|
86
91
|
}
|
|
87
92
|
|
|
88
93
|
/**
|
|
@@ -105,7 +110,15 @@ export class RecorderReactNativeSDK implements EventRecorder {
|
|
|
105
110
|
// Buffer-only mode (no active debug session): persist locally.
|
|
106
111
|
if (!this.sessionId && this.crashBuffer && this.bufferingEnabled) {
|
|
107
112
|
void this.crashBuffer.appendEvent(
|
|
108
|
-
{
|
|
113
|
+
{
|
|
114
|
+
ts: event.timestamp,
|
|
115
|
+
isFullSnapshot: event.type === EventType.FullSnapshot,
|
|
116
|
+
event: {
|
|
117
|
+
event: event,
|
|
118
|
+
eventType: event.type,
|
|
119
|
+
timestamp: event.timestamp,
|
|
120
|
+
},
|
|
121
|
+
},
|
|
109
122
|
this.bufferWindowMs
|
|
110
123
|
);
|
|
111
124
|
return;
|
|
@@ -2,7 +2,7 @@ import { type NavigationEvent, type RecorderConfig } from '../types';
|
|
|
2
2
|
import { trace, SpanStatusCode } from '@opentelemetry/api';
|
|
3
3
|
import { logger } from '../utils';
|
|
4
4
|
|
|
5
|
-
export class
|
|
5
|
+
export class NavigationRecorder {
|
|
6
6
|
private config?: RecorderConfig;
|
|
7
7
|
private isRecording = false;
|
|
8
8
|
private navigationRef: any = null;
|
|
@@ -15,13 +15,22 @@ export class NavigationTracker {
|
|
|
15
15
|
init(config: RecorderConfig, screenRecorder?: any): void {
|
|
16
16
|
this.config = config;
|
|
17
17
|
this.screenRecorder = screenRecorder;
|
|
18
|
-
logger.info('
|
|
18
|
+
logger.info('NavigationRecorder', 'Navigation tracker initialized', {
|
|
19
19
|
config: this.config,
|
|
20
20
|
screenRecorder: this.screenRecorder,
|
|
21
21
|
});
|
|
22
22
|
}
|
|
23
23
|
|
|
24
24
|
setNavigationRef(ref: any): void {
|
|
25
|
+
if (this.navigationRef === ref) {
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// Clean up listeners attached to the previous ref before switching.
|
|
30
|
+
if (this.isRecording && this.navigationRef) {
|
|
31
|
+
this._removeNavigationListener();
|
|
32
|
+
}
|
|
33
|
+
|
|
25
34
|
this.navigationRef = ref;
|
|
26
35
|
if (this.isRecording) {
|
|
27
36
|
this._setupNavigationListener();
|
|
@@ -29,10 +38,11 @@ export class NavigationTracker {
|
|
|
29
38
|
}
|
|
30
39
|
|
|
31
40
|
start(): void {
|
|
32
|
-
logger.info('
|
|
41
|
+
logger.info('NavigationRecorder', 'Navigation tracking started');
|
|
33
42
|
this.isRecording = true;
|
|
34
43
|
this.navigationStack = [];
|
|
35
44
|
this.navigationStartTime = Date.now();
|
|
45
|
+
|
|
36
46
|
this._setupNavigationListener();
|
|
37
47
|
// Navigation tracking started
|
|
38
48
|
}
|
|
@@ -53,6 +63,8 @@ export class NavigationTracker {
|
|
|
53
63
|
}
|
|
54
64
|
|
|
55
65
|
private _setupNavigationListener(): void {
|
|
66
|
+
// Ensure we never accumulate duplicate listeners across restarts.
|
|
67
|
+
this._removeNavigationListener();
|
|
56
68
|
if (!this.navigationRef) {
|
|
57
69
|
// Navigation ref not set - silently continue
|
|
58
70
|
return;
|
|
@@ -104,8 +116,8 @@ export class NavigationTracker {
|
|
|
104
116
|
try {
|
|
105
117
|
// Remove all listeners
|
|
106
118
|
this.navigationListeners.forEach((listener, _) => {
|
|
107
|
-
if (listener && typeof listener
|
|
108
|
-
listener
|
|
119
|
+
if (listener && typeof listener === 'function') {
|
|
120
|
+
listener();
|
|
109
121
|
}
|
|
110
122
|
});
|
|
111
123
|
this.navigationListeners.clear();
|
|
@@ -22,8 +22,11 @@ const isWeb = Platform.OS === 'web';
|
|
|
22
22
|
export class ScreenRecorder implements EventRecorder {
|
|
23
23
|
private config?: RecorderConfig;
|
|
24
24
|
private isRecording = false;
|
|
25
|
+
private isBufferOnlyMode = false;
|
|
26
|
+
private needsFullSnapshot = true;
|
|
25
27
|
private events: ScreenEvent[] = [];
|
|
26
28
|
private captureInterval?: any;
|
|
29
|
+
private bufferSnapshotInterval?: any;
|
|
27
30
|
private captureCount: number = 0;
|
|
28
31
|
private maxCaptures: number = 100; // Limit captures to prevent memory issues
|
|
29
32
|
private captureQuality: number = 0.2;
|
|
@@ -57,38 +60,55 @@ export class ScreenRecorder implements EventRecorder {
|
|
|
57
60
|
|
|
58
61
|
start(): void {
|
|
59
62
|
this.isRecording = true;
|
|
63
|
+
this.needsFullSnapshot = true;
|
|
60
64
|
this.events = [];
|
|
61
65
|
this.captureCount = 0;
|
|
62
66
|
this.lastScreenCapture = null;
|
|
63
67
|
this.lastScreenHash = null;
|
|
64
68
|
this.currentImageNodeId = null; // Reset image node ID for new session
|
|
65
69
|
logger.info('ScreenRecorder', 'Screen recording started');
|
|
66
|
-
// Emit screen recording started meta event
|
|
67
|
-
|
|
68
|
-
this.recordEvent(createRecordingMetaEvent());
|
|
69
70
|
|
|
70
71
|
this._startPeriodicCapture();
|
|
71
|
-
|
|
72
|
+
this._startBufferSnapshotInterval();
|
|
72
73
|
// Capture initial screen immediately
|
|
73
74
|
this._captureScreen();
|
|
74
|
-
|
|
75
|
-
// Screen recording started
|
|
76
75
|
}
|
|
77
76
|
|
|
78
77
|
stop(): void {
|
|
79
78
|
this.isRecording = false;
|
|
80
79
|
this._stopPeriodicCapture();
|
|
80
|
+
this._stopBufferSnapshotInterval();
|
|
81
81
|
// Screen recording stopped
|
|
82
82
|
}
|
|
83
83
|
|
|
84
84
|
pause(): void {
|
|
85
85
|
this.isRecording = false;
|
|
86
86
|
this._stopPeriodicCapture();
|
|
87
|
+
this._stopBufferSnapshotInterval();
|
|
87
88
|
}
|
|
88
89
|
|
|
89
90
|
resume(): void {
|
|
90
91
|
this.isRecording = true;
|
|
91
|
-
|
|
92
|
+
this._startPeriodicCapture();
|
|
93
|
+
this._startBufferSnapshotInterval();
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Enables behavior specific to crash-buffer-only mode.
|
|
98
|
+
* In this mode we periodically force a full snapshot anchor for replayability.
|
|
99
|
+
*/
|
|
100
|
+
setBufferOnlyMode(enabled: boolean): void {
|
|
101
|
+
this.isBufferOnlyMode = enabled;
|
|
102
|
+
if (!enabled) {
|
|
103
|
+
this.needsFullSnapshot = false;
|
|
104
|
+
this._stopBufferSnapshotInterval();
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
this.needsFullSnapshot = true;
|
|
109
|
+
if (this.isRecording) {
|
|
110
|
+
this._startBufferSnapshotInterval();
|
|
111
|
+
}
|
|
92
112
|
}
|
|
93
113
|
|
|
94
114
|
private _getScreenDimensions(): void {
|
|
@@ -118,6 +138,29 @@ export class ScreenRecorder implements EventRecorder {
|
|
|
118
138
|
}
|
|
119
139
|
}
|
|
120
140
|
|
|
141
|
+
private _startBufferSnapshotInterval(): void {
|
|
142
|
+
this._stopBufferSnapshotInterval();
|
|
143
|
+
if (!this.isBufferOnlyMode) {
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
const configuredInterval =
|
|
148
|
+
this.config?.buffering?.snapshotIntervalMs || 20000;
|
|
149
|
+
const intervalMs = Math.max(5000, configuredInterval);
|
|
150
|
+
this.bufferSnapshotInterval = setInterval(() => {
|
|
151
|
+
// Force a fresh full snapshot anchor in buffer-only mode.
|
|
152
|
+
this.needsFullSnapshot = true;
|
|
153
|
+
void this._captureScreen();
|
|
154
|
+
}, intervalMs);
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
private _stopBufferSnapshotInterval(): void {
|
|
158
|
+
if (this.bufferSnapshotInterval) {
|
|
159
|
+
clearInterval(this.bufferSnapshotInterval);
|
|
160
|
+
this.bufferSnapshotInterval = undefined;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
121
164
|
private async _captureScreen(timestamp?: number): Promise<void> {
|
|
122
165
|
if (!this.isRecording || this.captureCount >= this.maxCaptures) return;
|
|
123
166
|
|
|
@@ -131,8 +174,13 @@ export class ScreenRecorder implements EventRecorder {
|
|
|
131
174
|
: true;
|
|
132
175
|
|
|
133
176
|
if (hasChanged) {
|
|
134
|
-
//
|
|
135
|
-
|
|
177
|
+
// Keep replay segments anchored: buffer-only mode can force a full snapshot.
|
|
178
|
+
const shouldEmitFullSnapshot =
|
|
179
|
+
this.needsFullSnapshot ||
|
|
180
|
+
this.currentImageNodeId === null ||
|
|
181
|
+
!this.lastScreenCapture;
|
|
182
|
+
|
|
183
|
+
if (!shouldEmitFullSnapshot) {
|
|
136
184
|
const success = this.updateScreenWithIncrementalSnapshot(
|
|
137
185
|
base64Image,
|
|
138
186
|
timestamp
|
|
@@ -140,10 +188,12 @@ export class ScreenRecorder implements EventRecorder {
|
|
|
140
188
|
if (!success) {
|
|
141
189
|
// Fallback to full snapshot if incremental update fails
|
|
142
190
|
this._createAndEmitFullSnapshotEvent(base64Image, timestamp);
|
|
191
|
+
this.needsFullSnapshot = false;
|
|
143
192
|
}
|
|
144
193
|
} else {
|
|
145
|
-
// First capture or no existing image node
|
|
194
|
+
// First capture, forced anchor, or no existing image node.
|
|
146
195
|
this._createAndEmitFullSnapshotEvent(base64Image, timestamp);
|
|
196
|
+
this.needsFullSnapshot = false;
|
|
147
197
|
}
|
|
148
198
|
|
|
149
199
|
this.lastScreenCapture = base64Image;
|
|
@@ -173,10 +223,12 @@ export class ScreenRecorder implements EventRecorder {
|
|
|
173
223
|
'ScreenRecorder',
|
|
174
224
|
'Using native masking for screen capture'
|
|
175
225
|
);
|
|
176
|
-
const recordingImage = await screenRecordingService.captureMaskedScreen(
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
226
|
+
const recordingImage = await screenRecordingService.captureMaskedScreen(
|
|
227
|
+
{
|
|
228
|
+
quality: this.captureQuality,
|
|
229
|
+
scale: this.captureScale,
|
|
230
|
+
}
|
|
231
|
+
);
|
|
180
232
|
|
|
181
233
|
if (recordingImage) {
|
|
182
234
|
return recordingImage;
|
|
@@ -188,8 +240,6 @@ export class ScreenRecorder implements EventRecorder {
|
|
|
188
240
|
);
|
|
189
241
|
}
|
|
190
242
|
|
|
191
|
-
|
|
192
|
-
|
|
193
243
|
// // Fallback to react-native-view-shot
|
|
194
244
|
if (!this.viewShotRef) {
|
|
195
245
|
logger.warn(
|
|
@@ -231,6 +281,9 @@ export class ScreenRecorder implements EventRecorder {
|
|
|
231
281
|
): void {
|
|
232
282
|
if (!this.screenDimensions) return;
|
|
233
283
|
|
|
284
|
+
// Keep replay anchors valid: each full snapshot is explicitly preceded by meta.
|
|
285
|
+
this.recordEvent(createRecordingMetaEvent());
|
|
286
|
+
|
|
234
287
|
// Use the new createFullSnapshot method
|
|
235
288
|
const fullSnapshotEvent = this.createFullSnapshot(base64Image, timestamp);
|
|
236
289
|
this.recordEvent(fullSnapshotEvent);
|
|
@@ -400,8 +453,6 @@ export class ScreenRecorder implements EventRecorder {
|
|
|
400
453
|
}
|
|
401
454
|
}
|
|
402
455
|
|
|
403
|
-
|
|
404
|
-
|
|
405
456
|
// Configuration methods
|
|
406
457
|
setCaptureInterval(intervalMs: number): void {
|
|
407
458
|
if (this.captureInterval) {
|
|
@@ -78,7 +78,7 @@ export class ApiService {
|
|
|
78
78
|
* @param request - Session create error span request data
|
|
79
79
|
* @param signal - Optional AbortSignal for request cancellation
|
|
80
80
|
*/
|
|
81
|
-
|
|
81
|
+
createErrorSession(
|
|
82
82
|
request: CreateErrorSpanSessionRequest,
|
|
83
83
|
signal?: AbortSignal
|
|
84
84
|
): Promise<any> {
|
|
@@ -90,9 +90,10 @@ export class ApiService {
|
|
|
90
90
|
);
|
|
91
91
|
}
|
|
92
92
|
|
|
93
|
-
|
|
93
|
+
updateSessionAttributes(
|
|
94
94
|
sessionId: string,
|
|
95
95
|
requestBody: {
|
|
96
|
+
name?: string;
|
|
96
97
|
startedAt?: string;
|
|
97
98
|
stoppedAt?: string;
|
|
98
99
|
userAttributes?: IUserAttributes;
|
|
@@ -115,7 +116,7 @@ export class ApiService {
|
|
|
115
116
|
* @param requestBody - Request body containing events
|
|
116
117
|
* @param signal - Optional AbortSignal for request cancellation
|
|
117
118
|
*/
|
|
118
|
-
|
|
119
|
+
exportEvents(
|
|
119
120
|
sessionId: string,
|
|
120
121
|
requestBody: { events: eventWithTime[] },
|
|
121
122
|
signal?: AbortSignal
|
|
@@ -128,72 +129,16 @@ export class ApiService {
|
|
|
128
129
|
);
|
|
129
130
|
}
|
|
130
131
|
|
|
131
|
-
/**
|
|
132
|
-
* Make a request to the session debugger API
|
|
133
|
-
* @param path - API endpoint path (relative to the base URL)
|
|
134
|
-
* @param method - HTTP method (GET, POST, PATCH, etc.)
|
|
135
|
-
* @param body - request payload
|
|
136
|
-
* @param signal - AbortSignal to set request's signal
|
|
137
|
-
*/
|
|
138
|
-
private async makeRequest(
|
|
139
|
-
path: string,
|
|
140
|
-
method: string,
|
|
141
|
-
body?: any,
|
|
142
|
-
signal?: AbortSignal
|
|
143
|
-
): Promise<any> {
|
|
144
|
-
const url = `${this.baseUrl}/v0/radar${path}`;
|
|
145
|
-
const params = {
|
|
146
|
-
method,
|
|
147
|
-
body: body ? JSON.stringify(body) : null,
|
|
148
|
-
headers: {
|
|
149
|
-
'Content-Type': 'application/json',
|
|
150
|
-
...(this.config?.apiKey && { 'X-Api-Key': this.config.apiKey }),
|
|
151
|
-
},
|
|
152
|
-
};
|
|
153
|
-
|
|
154
|
-
try {
|
|
155
|
-
const response = await fetch(url, {
|
|
156
|
-
...params,
|
|
157
|
-
signal,
|
|
158
|
-
});
|
|
159
|
-
|
|
160
|
-
if (!response.ok) {
|
|
161
|
-
throw new Error('Network response was not ok: ' + response.statusText);
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
if (response.status === 204) {
|
|
165
|
-
return null;
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
return await response.json();
|
|
169
|
-
} catch (error: any) {
|
|
170
|
-
if (error?.name === 'AbortError') {
|
|
171
|
-
throw new Error('Request aborted');
|
|
172
|
-
}
|
|
173
|
-
throw new Error('Error making request: ' + error.message);
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
|
|
177
132
|
/**
|
|
178
133
|
* Start a new debug session
|
|
179
134
|
* @param request - Session start request data
|
|
180
135
|
* @param signal - Optional AbortSignal for request cancellation
|
|
181
136
|
*/
|
|
182
|
-
|
|
137
|
+
startSession(
|
|
183
138
|
request: StartSessionRequest,
|
|
184
139
|
signal?: AbortSignal
|
|
185
140
|
): Promise<any> {
|
|
186
|
-
|
|
187
|
-
const res = await this.makeRequest(
|
|
188
|
-
'/debug-sessions/start',
|
|
189
|
-
'POST',
|
|
190
|
-
request,
|
|
191
|
-
signal
|
|
192
|
-
);
|
|
193
|
-
return res;
|
|
194
|
-
} catch (error: any) {
|
|
195
|
-
throw error;
|
|
196
|
-
}
|
|
141
|
+
return this.makeRequest('/debug-sessions/start', 'POST', request, signal);
|
|
197
142
|
}
|
|
198
143
|
|
|
199
144
|
/**
|
|
@@ -201,10 +146,7 @@ export class ApiService {
|
|
|
201
146
|
* @param sessionId - ID of the session to stop
|
|
202
147
|
* @param request - Session stop request data
|
|
203
148
|
*/
|
|
204
|
-
|
|
205
|
-
sessionId: string,
|
|
206
|
-
request: StopSessionRequest
|
|
207
|
-
): Promise<any> {
|
|
149
|
+
stopSession(sessionId: string, request: StopSessionRequest): Promise<any> {
|
|
208
150
|
return this.makeRequest(
|
|
209
151
|
`/debug-sessions/${sessionId}/stop`,
|
|
210
152
|
'PATCH',
|
|
@@ -216,7 +158,7 @@ export class ApiService {
|
|
|
216
158
|
* Cancel an active debug session
|
|
217
159
|
* @param sessionId - ID of the session to cancel
|
|
218
160
|
*/
|
|
219
|
-
|
|
161
|
+
cancelSession(sessionId: string): Promise<any> {
|
|
220
162
|
return this.makeRequest(`/debug-sessions/${sessionId}/cancel`, 'DELETE');
|
|
221
163
|
}
|
|
222
164
|
|
|
@@ -225,7 +167,7 @@ export class ApiService {
|
|
|
225
167
|
* @param request - Session start request data
|
|
226
168
|
* @param signal - Optional AbortSignal for request cancellation
|
|
227
169
|
*/
|
|
228
|
-
|
|
170
|
+
startContinuousDebugSession(
|
|
229
171
|
request: StartSessionRequest,
|
|
230
172
|
signal?: AbortSignal
|
|
231
173
|
): Promise<any> {
|
|
@@ -243,7 +185,7 @@ export class ApiService {
|
|
|
243
185
|
* @param request - Session save request data
|
|
244
186
|
* @param signal - Optional AbortSignal for request cancellation
|
|
245
187
|
*/
|
|
246
|
-
|
|
188
|
+
saveContinuousDebugSession(
|
|
247
189
|
sessionId: string,
|
|
248
190
|
request: StartSessionRequest,
|
|
249
191
|
signal?: AbortSignal
|
|
@@ -260,7 +202,7 @@ export class ApiService {
|
|
|
260
202
|
* Stop an active continuous debug session
|
|
261
203
|
* @param sessionId - ID of the session to stop
|
|
262
204
|
*/
|
|
263
|
-
|
|
205
|
+
stopContinuousDebugSession(sessionId: string): Promise<any> {
|
|
264
206
|
return this.makeRequest(
|
|
265
207
|
`/continuous-debug-sessions/${sessionId}/cancel`,
|
|
266
208
|
'DELETE'
|
|
@@ -270,7 +212,7 @@ export class ApiService {
|
|
|
270
212
|
/**
|
|
271
213
|
* Check debug session should be started remotely
|
|
272
214
|
*/
|
|
273
|
-
|
|
215
|
+
checkRemoteSession(
|
|
274
216
|
requestBody: CheckRemoteSessionRequest,
|
|
275
217
|
signal?: AbortSignal
|
|
276
218
|
): Promise<{ state: 'START' | 'STOP' }> {
|
|
@@ -281,4 +223,50 @@ export class ApiService {
|
|
|
281
223
|
signal
|
|
282
224
|
);
|
|
283
225
|
}
|
|
226
|
+
|
|
227
|
+
/**
|
|
228
|
+
* Make a request to the session debugger API
|
|
229
|
+
* @param path - API endpoint path (relative to the base URL)
|
|
230
|
+
* @param method - HTTP method (GET, POST, PATCH, etc.)
|
|
231
|
+
* @param body - request payload
|
|
232
|
+
* @param signal - AbortSignal to set request's signal
|
|
233
|
+
*/
|
|
234
|
+
private async makeRequest(
|
|
235
|
+
path: string,
|
|
236
|
+
method: string,
|
|
237
|
+
body?: any,
|
|
238
|
+
signal?: AbortSignal
|
|
239
|
+
): Promise<any> {
|
|
240
|
+
const url = `${this.baseUrl}/v0/radar${path}`;
|
|
241
|
+
const params = {
|
|
242
|
+
method,
|
|
243
|
+
body: body ? JSON.stringify(body) : null,
|
|
244
|
+
headers: {
|
|
245
|
+
'Content-Type': 'application/json',
|
|
246
|
+
...(this.config?.apiKey && { 'X-Api-Key': this.config.apiKey }),
|
|
247
|
+
},
|
|
248
|
+
};
|
|
249
|
+
|
|
250
|
+
try {
|
|
251
|
+
const response = await fetch(url, {
|
|
252
|
+
...params,
|
|
253
|
+
signal,
|
|
254
|
+
});
|
|
255
|
+
|
|
256
|
+
if (!response.ok) {
|
|
257
|
+
throw new Error('Network response was not ok: ' + response.statusText);
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
if (response.status === 204) {
|
|
261
|
+
return null;
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
return await response.json();
|
|
265
|
+
} catch (error: any) {
|
|
266
|
+
if (error?.name === 'AbortError') {
|
|
267
|
+
throw new Error('Request aborted');
|
|
268
|
+
}
|
|
269
|
+
throw new Error('Error making request: ' + error.message);
|
|
270
|
+
}
|
|
271
|
+
}
|
|
284
272
|
}
|
|
@@ -45,7 +45,7 @@ export class SocketService extends Observable<SocketServiceEvents> {
|
|
|
45
45
|
private attempts: number = 0;
|
|
46
46
|
private sessionId: string | null = null;
|
|
47
47
|
private options: SocketServiceOptions;
|
|
48
|
-
|
|
48
|
+
private isInitialized: boolean = false;
|
|
49
49
|
constructor() {
|
|
50
50
|
super();
|
|
51
51
|
this.options = {
|
|
@@ -64,6 +64,7 @@ export class SocketService extends Observable<SocketServiceEvents> {
|
|
|
64
64
|
...this.options,
|
|
65
65
|
...config,
|
|
66
66
|
};
|
|
67
|
+
this.isInitialized = true;
|
|
67
68
|
if (
|
|
68
69
|
this.options.keepAlive &&
|
|
69
70
|
this.options.socketUrl &&
|
|
@@ -104,7 +105,7 @@ export class SocketService extends Observable<SocketServiceEvents> {
|
|
|
104
105
|
}
|
|
105
106
|
|
|
106
107
|
private _initConnection(): void {
|
|
107
|
-
if (this.isConnecting || this.isConnected) return;
|
|
108
|
+
if (this.isConnecting || this.isConnected || !this.isInitialized) return;
|
|
108
109
|
this.attempts++;
|
|
109
110
|
this.isConnecting = true;
|
|
110
111
|
this.socket = io(this.options.socketUrl, {
|
package/src/session-recorder.ts
CHANGED
|
@@ -192,12 +192,14 @@ class SessionRecorder
|
|
|
192
192
|
}
|
|
193
193
|
|
|
194
194
|
this._isFlushingBuffer = true;
|
|
195
|
+
|
|
195
196
|
try {
|
|
196
197
|
const { events, spans, startedAt, stoppedAt } =
|
|
197
198
|
await this._crashBuffer.snapshot();
|
|
198
199
|
if (events.length === 0 && spans.length === 0) {
|
|
199
200
|
return null;
|
|
200
201
|
}
|
|
202
|
+
|
|
201
203
|
await Promise.all([
|
|
202
204
|
this._tracer.exportTraces(spans.map((s) => s.span)),
|
|
203
205
|
this._apiService.exportEvents(sessionId, {
|
package/src/types/configs.ts
CHANGED
|
@@ -107,6 +107,12 @@ export interface RecorderConfig extends BaseConfig {
|
|
|
107
107
|
recordNavigation?: boolean;
|
|
108
108
|
/** Whether to record screen */
|
|
109
109
|
recordScreen?: boolean;
|
|
110
|
+
/** Buffering options used by recorder runtime behavior */
|
|
111
|
+
buffering?: {
|
|
112
|
+
enabled?: boolean;
|
|
113
|
+
windowMinutes?: number;
|
|
114
|
+
snapshotIntervalMs?: number;
|
|
115
|
+
};
|
|
110
116
|
/** Configuration for masking sensitive data in screen recordings */
|
|
111
117
|
masking?: RecorderMaskingConfig;
|
|
112
118
|
}
|
|
@@ -176,6 +176,8 @@ export interface SessionRecorderOptions {
|
|
|
176
176
|
enabled?: boolean;
|
|
177
177
|
/** Rolling window size (minutes). @default 0.5 */
|
|
178
178
|
windowMinutes?: number;
|
|
179
|
+
/** Force a fresh full snapshot at this interval (ms). @default 20000 */
|
|
180
|
+
snapshotIntervalMs?: number;
|
|
179
181
|
};
|
|
180
182
|
}
|
|
181
183
|
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":["trace","SpanStatusCode","logger","NavigationTracker","isRecording","navigationRef","navigationListeners","Map","currentRoute","navigationStack","navigationStartTime","init","config","screenRecorder","info","setNavigationRef","ref","_setupNavigationListener","start","Date","now","stop","_removeNavigationListener","pause","resume","stateListener","addListener","e","_recordNavigationEvent","data","focusListener","blurListener","beforeRemoveListener","set","error","forEach","listener","_","remove","clear","_getFriendlyRouteTitle","current","getCurrentRoute","titleFromParams","params","title","name","raw","withoutGroups","replace","lastSegment","split","filter","Boolean","slice","join","withoutParams","trim","spaced","titleCase","map","w","charAt","toUpperCase","eventType","event","type","timestamp","metadata","navigationDuration","stackDepth","length","friendlyTitle","routeName","key","_updateNavigationStack","routeKey","friendlyRouteName","_recordOpenTelemetrySpan","push","index","indexOf","splice","span","getTracer","startSpan","attributes","setAttribute","JSON","stringify","Object","entries","value","String","setStatus","code","OK","end","getNavigationStack","getNavigationDepth","isRecordingEnabled","getNavigationDuration"],"sourceRoot":"../../../src","sources":["recorder/navigationTracker.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"navigationTracker.d.ts","sourceRoot":"","sources":["../../../../src/recorder/navigationTracker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwB,KAAK,cAAc,EAAE,MAAM,UAAU,CAAC;AAIrE,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,MAAM,CAAC,CAAiB;IAChC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,aAAa,CAAa;IAClC,OAAO,CAAC,mBAAmB,CAA+B;IAC1D,OAAO,CAAC,YAAY,CAAuB;IAC3C,OAAO,CAAC,eAAe,CAAgB;IACvC,OAAO,CAAC,mBAAmB,CAAa;IACxC,OAAO,CAAC,cAAc,CAAC,CAAM;IAE7B,IAAI,CAAC,MAAM,EAAE,cAAc,EAAE,cAAc,CAAC,EAAE,GAAG,GAAG,IAAI;IASxD,gBAAgB,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI;IAOhC,KAAK,IAAI,IAAI;IASb,IAAI,IAAI,IAAI;IAMZ,KAAK,IAAI,IAAI;IAIb,MAAM,IAAI,IAAI;IAKd,OAAO,CAAC,wBAAwB;IAgDhC,OAAO,CAAC,yBAAyB;IAejC,OAAO,CAAC,sBAAsB;IA2C9B,OAAO,CAAC,sBAAsB;IAsC9B,OAAO,CAAC,sBAAsB;IAc9B,OAAO,CAAC,wBAAwB;IAkChC,eAAe,IAAI,MAAM,GAAG,IAAI;IAIhC,kBAAkB,IAAI,MAAM,EAAE;IAI9B,kBAAkB,IAAI,MAAM;IAK5B,kBAAkB,IAAI,OAAO;IAK7B,qBAAqB,IAAI,MAAM;CAGhC"}
|