@multiplayer-app/session-recorder-react-native 1.3.34 → 1.3.35

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.
Files changed (42) hide show
  1. package/ios/SessionRecorderNative.swift +4 -2
  2. package/lib/module/config/defaults.js +2 -1
  3. package/lib/module/config/defaults.js.map +1 -1
  4. package/lib/module/config/session-recorder.js +2 -1
  5. package/lib/module/config/session-recorder.js.map +1 -1
  6. package/lib/module/recorder/index.js +14 -9
  7. package/lib/module/recorder/index.js.map +1 -1
  8. package/lib/module/recorder/{navigationTracker.js → navigationRecorder.js} +16 -6
  9. package/lib/module/recorder/navigationRecorder.js.map +1 -0
  10. package/lib/module/recorder/screenRecorder.js +53 -10
  11. package/lib/module/recorder/screenRecorder.js.map +1 -1
  12. package/lib/module/services/api.service.js +50 -55
  13. package/lib/module/services/api.service.js.map +1 -1
  14. package/lib/module/session-recorder.js.map +1 -1
  15. package/lib/module/types/session-recorder.js.map +1 -1
  16. package/lib/typescript/src/config/defaults.d.ts.map +1 -1
  17. package/lib/typescript/src/config/session-recorder.d.ts.map +1 -1
  18. package/lib/typescript/src/recorder/index.d.ts +3 -3
  19. package/lib/typescript/src/recorder/index.d.ts.map +1 -1
  20. package/lib/typescript/src/recorder/{navigationTracker.d.ts → navigationRecorder.d.ts} +2 -2
  21. package/lib/typescript/src/recorder/navigationRecorder.d.ts.map +1 -0
  22. package/lib/typescript/src/recorder/screenRecorder.d.ts +10 -0
  23. package/lib/typescript/src/recorder/screenRecorder.d.ts.map +1 -1
  24. package/lib/typescript/src/services/api.service.d.ts +9 -8
  25. package/lib/typescript/src/services/api.service.d.ts.map +1 -1
  26. package/lib/typescript/src/session-recorder.d.ts.map +1 -1
  27. package/lib/typescript/src/types/configs.d.ts +6 -0
  28. package/lib/typescript/src/types/configs.d.ts.map +1 -1
  29. package/lib/typescript/src/types/session-recorder.d.ts +2 -0
  30. package/lib/typescript/src/types/session-recorder.d.ts.map +1 -1
  31. package/package.json +2 -2
  32. package/src/config/defaults.ts +1 -0
  33. package/src/config/session-recorder.ts +4 -0
  34. package/src/recorder/index.ts +25 -12
  35. package/src/recorder/{navigationTracker.ts → navigationRecorder.ts} +17 -5
  36. package/src/recorder/screenRecorder.ts +69 -18
  37. package/src/services/api.service.ts +58 -70
  38. package/src/session-recorder.ts +2 -0
  39. package/src/types/configs.ts +6 -0
  40. package/src/types/session-recorder.ts +2 -0
  41. package/lib/module/recorder/navigationTracker.js.map +0 -1
  42. package/lib/typescript/src/recorder/navigationTracker.d.ts.map +0 -1
@@ -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
- // this._startPeriodicCapture()
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
- // Use incremental snapshot if we have an existing image node, otherwise create full snapshot
135
- if (this.currentImageNodeId !== null && this.lastScreenCapture) {
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 - create full snapshot
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
- quality: this.captureQuality,
178
- scale: this.captureScale,
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
- async createErrorSession(
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
- async updateSessionAttributes(
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
- async exportEvents(
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
- async startSession(
137
+ startSession(
183
138
  request: StartSessionRequest,
184
139
  signal?: AbortSignal
185
140
  ): Promise<any> {
186
- try {
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
- async stopSession(
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
- async cancelSession(sessionId: string): Promise<any> {
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
- async startContinuousDebugSession(
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
- async saveContinuousDebugSession(
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
- async stopContinuousDebugSession(sessionId: string): Promise<any> {
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
- async checkRemoteSession(
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
  }
@@ -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, {
@@ -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"}