@multiplayer-app/session-recorder-browser 1.2.21 → 1.2.23

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 (166) hide show
  1. package/dist/browser/index.js +48 -102
  2. package/dist/browser/index.js.map +1 -1
  3. package/dist/config/constants.d.ts +19 -0
  4. package/dist/config/constants.js +35 -0
  5. package/dist/config/constants.js.map +1 -0
  6. package/dist/config/defaults.d.ts +5 -0
  7. package/dist/config/defaults.js +60 -0
  8. package/dist/config/defaults.js.map +1 -0
  9. package/dist/config/index.d.ts +6 -0
  10. package/dist/config/index.js +7 -0
  11. package/dist/config/index.js.map +1 -0
  12. package/dist/config/masking.d.ts +3 -0
  13. package/dist/config/masking.js +30 -0
  14. package/dist/config/masking.js.map +1 -0
  15. package/dist/config/session-recorder.d.ts +3 -0
  16. package/dist/config/session-recorder.js +60 -0
  17. package/dist/config/session-recorder.js.map +1 -0
  18. package/dist/config/validators.d.ts +11 -0
  19. package/dist/config/validators.js +25 -0
  20. package/dist/config/validators.js.map +1 -0
  21. package/dist/eventBus.d.ts +3 -0
  22. package/dist/eventBus.js +3 -0
  23. package/dist/eventBus.js.map +1 -0
  24. package/dist/exporters/index.js +1 -1
  25. package/dist/exporters.d.ts +4 -0
  26. package/dist/exporters.js +8 -0
  27. package/dist/exporters.js.map +1 -0
  28. package/dist/index.d.ts +10 -0
  29. package/dist/index.d.ts.map +1 -1
  30. package/dist/index.js +53 -102
  31. package/dist/index.js.map +1 -1
  32. package/dist/index.umd.js +48 -101
  33. package/dist/index.umd.js.map +1 -1
  34. package/dist/listeners.d.ts +3 -0
  35. package/dist/listeners.js +39 -0
  36. package/dist/listeners.js.map +1 -0
  37. package/dist/navigation/index.d.ts +3 -0
  38. package/dist/navigation/index.js +3 -0
  39. package/dist/navigation/index.js.map +1 -0
  40. package/dist/navigation/navigationRecorder.d.ts +22 -0
  41. package/dist/navigation/navigationRecorder.js +195 -0
  42. package/dist/navigation/navigationRecorder.js.map +1 -0
  43. package/dist/navigation/types.d.ts +32 -0
  44. package/dist/navigation/types.js +2 -0
  45. package/dist/navigation/types.js.map +1 -0
  46. package/dist/otel/helpers.d.ts +46 -0
  47. package/dist/otel/helpers.js +201 -0
  48. package/dist/otel/helpers.js.map +1 -0
  49. package/dist/otel/index.d.ts +18 -0
  50. package/dist/otel/index.js +186 -0
  51. package/dist/otel/index.js.map +1 -0
  52. package/dist/otel/types.d.ts +10 -0
  53. package/dist/otel/types.js +2 -0
  54. package/dist/otel/types.js.map +1 -0
  55. package/dist/patch/configs.d.ts +9 -0
  56. package/dist/patch/configs.js +16 -0
  57. package/dist/patch/configs.js.map +1 -0
  58. package/dist/patch/fetch.d.ts +2 -0
  59. package/dist/patch/fetch.js +123 -0
  60. package/dist/patch/fetch.js.map +1 -0
  61. package/dist/patch/index.d.ts +4 -0
  62. package/dist/patch/index.js +4 -0
  63. package/dist/patch/index.js.map +1 -0
  64. package/dist/patch/xhr.d.ts +2 -0
  65. package/dist/patch/xhr.js +85 -0
  66. package/dist/patch/xhr.js.map +1 -0
  67. package/dist/rrweb/exporter.d.ts +25 -0
  68. package/dist/rrweb/exporter.js +146 -0
  69. package/dist/rrweb/exporter.js.map +1 -0
  70. package/dist/rrweb/index.d.ts +39 -0
  71. package/dist/rrweb/index.js +139 -0
  72. package/dist/rrweb/index.js.map +1 -0
  73. package/dist/rrweb/indexedDbService.d.ts +9 -0
  74. package/dist/rrweb/indexedDbService.js +54 -0
  75. package/dist/rrweb/indexedDbService.js.map +1 -0
  76. package/dist/services/api.service.d.ts +81 -0
  77. package/dist/services/api.service.js +133 -0
  78. package/dist/services/api.service.js.map +1 -0
  79. package/dist/services/messaging.service.d.ts +16 -0
  80. package/dist/services/messaging.service.js +94 -0
  81. package/dist/services/messaging.service.js.map +1 -0
  82. package/dist/sessionRecorder.d.ts +148 -0
  83. package/dist/sessionRecorder.js +555 -0
  84. package/dist/sessionRecorder.js.map +1 -0
  85. package/dist/sessionWidget/UIManager.d.ts +76 -0
  86. package/dist/sessionWidget/UIManager.js +135 -0
  87. package/dist/sessionWidget/UIManager.js.map +1 -0
  88. package/dist/sessionWidget/buttonStateConfigs.d.ts +83 -0
  89. package/dist/sessionWidget/buttonStateConfigs.js +86 -0
  90. package/dist/sessionWidget/buttonStateConfigs.js.map +1 -0
  91. package/dist/sessionWidget/constants.d.ts +5 -0
  92. package/dist/sessionWidget/constants.js +5 -0
  93. package/dist/sessionWidget/constants.js.map +1 -0
  94. package/dist/sessionWidget/dragManager.d.ts +16 -0
  95. package/dist/sessionWidget/dragManager.js +114 -0
  96. package/dist/sessionWidget/dragManager.js.map +1 -0
  97. package/dist/sessionWidget/index.d.ts +86 -0
  98. package/dist/sessionWidget/index.js +564 -0
  99. package/dist/sessionWidget/index.js.map +1 -0
  100. package/dist/sessionWidget/templates/finalPopover.d.ts +3 -0
  101. package/dist/sessionWidget/templates/finalPopover.js +21 -0
  102. package/dist/sessionWidget/templates/finalPopover.js.map +1 -0
  103. package/dist/sessionWidget/templates/icons.d.ts +14 -0
  104. package/dist/sessionWidget/templates/icons.js +50 -0
  105. package/dist/sessionWidget/templates/icons.js.map +1 -0
  106. package/dist/sessionWidget/templates/initialPopover.d.ts +3 -0
  107. package/dist/sessionWidget/templates/initialPopover.js +41 -0
  108. package/dist/sessionWidget/templates/initialPopover.js.map +1 -0
  109. package/dist/sessionWidget/templates/recordingOverlay.d.ts +2 -0
  110. package/dist/sessionWidget/templates/recordingOverlay.js +16 -0
  111. package/dist/sessionWidget/templates/recordingOverlay.js.map +1 -0
  112. package/dist/sessionWidget/templates/submitSessionDialog.d.ts +3 -0
  113. package/dist/sessionWidget/templates/submitSessionDialog.js +17 -0
  114. package/dist/sessionWidget/templates/submitSessionDialog.js.map +1 -0
  115. package/dist/sessionWidget/templates/toast.d.ts +3 -0
  116. package/dist/sessionWidget/templates/toast.js +25 -0
  117. package/dist/sessionWidget/templates/toast.js.map +1 -0
  118. package/dist/types/client-type.enum.d.ts +6 -0
  119. package/dist/types/client-type.enum.js +7 -0
  120. package/dist/types/client-type.enum.js.map +1 -0
  121. package/dist/types/index.d.ts +4 -0
  122. package/dist/types/index.js +4 -0
  123. package/dist/types/index.js.map +1 -0
  124. package/dist/types/session.d.ts +72 -0
  125. package/dist/types/session.js +7 -0
  126. package/dist/types/session.js.map +1 -0
  127. package/dist/types/sessionRecorder.d.ts +369 -0
  128. package/dist/types/sessionRecorder.js +14 -0
  129. package/dist/types/sessionRecorder.js.map +1 -0
  130. package/dist/types/widget.d.ts +11 -0
  131. package/dist/types/widget.js +2 -0
  132. package/dist/types/widget.js.map +1 -0
  133. package/dist/utils/array.d.ts +4 -0
  134. package/dist/utils/array.js +50 -0
  135. package/dist/utils/array.js.map +1 -0
  136. package/dist/utils/dom.d.ts +5 -0
  137. package/dist/utils/dom.js +9 -0
  138. package/dist/utils/dom.js.map +1 -0
  139. package/dist/utils/globals.d.ts +24 -0
  140. package/dist/utils/globals.js +14 -0
  141. package/dist/utils/globals.js.map +1 -0
  142. package/dist/utils/index.d.ts +9 -0
  143. package/dist/utils/index.js +10 -0
  144. package/dist/utils/index.js.map +1 -0
  145. package/dist/utils/navigator.d.ts +3 -0
  146. package/dist/utils/navigator.js +83 -0
  147. package/dist/utils/navigator.js.map +1 -0
  148. package/dist/utils/request-utils.d.ts +10 -0
  149. package/dist/utils/request-utils.js +70 -0
  150. package/dist/utils/request-utils.js.map +1 -0
  151. package/dist/utils/session.d.ts +8 -0
  152. package/dist/utils/session.js +21 -0
  153. package/dist/utils/session.js.map +1 -0
  154. package/dist/utils/storage.d.ts +7 -0
  155. package/dist/utils/storage.js +19 -0
  156. package/dist/utils/storage.js.map +1 -0
  157. package/dist/utils/time.d.ts +7 -0
  158. package/dist/utils/time.js +25 -0
  159. package/dist/utils/time.js.map +1 -0
  160. package/dist/utils/type-utils.d.ts +18 -0
  161. package/dist/utils/type-utils.js +71 -0
  162. package/dist/utils/type-utils.js.map +1 -0
  163. package/package.json +7 -2
  164. package/dist/exports.d.ts.map +0 -1
  165. package/docs/img/header-js.png +0 -0
  166. package/src/index.scss +0 -913
@@ -0,0 +1,555 @@
1
+ import { TracerBrowserSDK } from './otel';
2
+ import { RecorderBrowserSDK } from './rrweb';
3
+ import { getStoredItem, setStoredItem, getNavigatorInfo, getFormattedDate, getTimeDifferenceInSeconds, isSessionActive, } from './utils';
4
+ import { SessionState, } from './types';
5
+ import { BASE_CONFIG, SESSION_RESPONSE, SESSION_PROP_NAME, SESSION_ID_PROP_NAME, SESSION_TYPE_PROP_NAME, SESSION_STATE_PROP_NAME, DEFAULT_MAX_HTTP_CAPTURING_PAYLOAD_SIZE, getSessionRecorderConfig, SESSION_AUTO_CREATED, SESSION_STOPPED_EVENT, SESSION_STARTED_EVENT } from './config';
6
+ import { setShouldRecordHttpData, setMaxCapturingHttpPayloadSize, } from './patch';
7
+ import { recorderEventBus } from './eventBus';
8
+ import { SessionWidget } from './sessionWidget';
9
+ import messagingService from './services/messaging.service';
10
+ import { ApiService } from './services/api.service';
11
+ import './index.scss';
12
+ import { SessionType } from '@multiplayer-app/session-recorder-common';
13
+ import { ContinuousRecordingSaveButtonState } from './sessionWidget/buttonStateConfigs';
14
+ import { Observable } from 'lib0/observable';
15
+ import { NavigationRecorder } from './navigation';
16
+ export class SessionRecorder extends Observable {
17
+ get navigation() {
18
+ return this._navigationRecorder.api;
19
+ }
20
+ get isInitialized() {
21
+ return this._isInitialized;
22
+ }
23
+ get sessionId() {
24
+ return this._sessionId;
25
+ }
26
+ set sessionId(sessionId) {
27
+ this._sessionId = sessionId;
28
+ setStoredItem(SESSION_ID_PROP_NAME, sessionId);
29
+ }
30
+ get sessionType() {
31
+ return this._sessionType;
32
+ }
33
+ set sessionType(sessionType) {
34
+ this._sessionType = sessionType;
35
+ const continuousRecording = sessionType === SessionType.CONTINUOUS;
36
+ this._sessionWidget.updateContinuousRecordingState(continuousRecording);
37
+ messagingService.sendMessage('continuous-debugging', continuousRecording);
38
+ setStoredItem(SESSION_TYPE_PROP_NAME, sessionType);
39
+ }
40
+ get continuousRecording() {
41
+ return this.sessionType === SessionType.CONTINUOUS;
42
+ }
43
+ get sessionState() {
44
+ return this._sessionState || SessionState.stopped;
45
+ }
46
+ set sessionState(state) {
47
+ this._sessionState = state;
48
+ this._sessionWidget.updateState(this._sessionState, this.continuousRecording);
49
+ messagingService.sendMessage('state-change', this._sessionState);
50
+ setStoredItem(SESSION_STATE_PROP_NAME, state);
51
+ // Emit observable event to support React wrapper
52
+ this.emit('state-change', [this._sessionState || SessionState.stopped, this.sessionType]);
53
+ }
54
+ get session() {
55
+ return this._session;
56
+ }
57
+ set session(session) {
58
+ this._session = session;
59
+ setStoredItem(SESSION_PROP_NAME, this._session);
60
+ }
61
+ get sessionAttributes() {
62
+ return this._sessionAttributes || {};
63
+ }
64
+ set sessionAttributes(attributes) {
65
+ this._sessionAttributes = attributes;
66
+ }
67
+ get error() {
68
+ return this._error;
69
+ }
70
+ set error(v) {
71
+ this._error = v;
72
+ this._sessionWidget.error = v;
73
+ this.emit('error', [v]);
74
+ }
75
+ /**
76
+ * Returns the HTML button element for the session widget's recorder button.
77
+ *
78
+ * This element is used to control the start/stop recording functionality in the session widget UI.
79
+ *
80
+ * @returns {HTMLButtonElement} The recorder button element from the session widget.
81
+ */
82
+ get sessionWidgetButtonElement() {
83
+ return this._sessionWidget.recorderButton;
84
+ }
85
+ /**
86
+ * Initialize debugger with default or custom configurations
87
+ */
88
+ constructor() {
89
+ var _a;
90
+ super();
91
+ this._apiService = new ApiService();
92
+ this._tracer = new TracerBrowserSDK();
93
+ this._recorder = new RecorderBrowserSDK();
94
+ this._sessionWidget = new SessionWidget();
95
+ this._navigationRecorder = new NavigationRecorder();
96
+ this._startRequestController = null;
97
+ this._isInitialized = false;
98
+ // Session ID and state are stored in localStorage
99
+ this._sessionId = null;
100
+ this._sessionType = SessionType.MANUAL;
101
+ this._sessionState = null;
102
+ this._session = null;
103
+ this._sessionAttributes = null;
104
+ /**
105
+ * Error message getter and setter
106
+ */
107
+ this._error = '';
108
+ const sessionLocal = getStoredItem(SESSION_PROP_NAME, true);
109
+ const sessionIdLocal = getStoredItem(SESSION_ID_PROP_NAME);
110
+ const sessionStateLocal = getStoredItem(SESSION_STATE_PROP_NAME);
111
+ const sessionTypeLocal = getStoredItem(SESSION_TYPE_PROP_NAME);
112
+ if (isSessionActive(sessionLocal, sessionTypeLocal)) {
113
+ this.session = sessionLocal;
114
+ this.sessionId = sessionIdLocal;
115
+ this.sessionType = sessionTypeLocal;
116
+ this.sessionState = sessionStateLocal;
117
+ }
118
+ else {
119
+ this.session = null;
120
+ this.sessionId = null;
121
+ this.sessionState = null;
122
+ this.sessionType = SessionType.MANUAL;
123
+ }
124
+ this._configs = {
125
+ ...BASE_CONFIG,
126
+ apiKey: ((_a = this.session) === null || _a === void 0 ? void 0 : _a.tempApiKey) || '',
127
+ };
128
+ }
129
+ /**
130
+ * Initialize the session debugger
131
+ * @param configs - custom configurations for session debugger
132
+ */
133
+ init(configs) {
134
+ this._configs = getSessionRecorderConfig({ ...this._configs, ...configs });
135
+ this._isInitialized = true;
136
+ this._checkOperation('init');
137
+ setMaxCapturingHttpPayloadSize(this._configs.maxCapturingHttpPayloadSize || DEFAULT_MAX_HTTP_CAPTURING_PAYLOAD_SIZE);
138
+ setShouldRecordHttpData(this._configs.captureBody, this._configs.captureHeaders);
139
+ this._tracer.init(this._configs);
140
+ this._apiService.init(this._configs);
141
+ this._sessionWidget.init(this._configs);
142
+ this._navigationRecorder.init({
143
+ enabled: this._configs.recordNavigation,
144
+ application: this._configs.application,
145
+ environment: this._configs.environment,
146
+ version: this._configs.version,
147
+ });
148
+ if (this._configs.apiKey) {
149
+ this._recorder.init(this._configs);
150
+ }
151
+ if (this.sessionId && (this.sessionState === SessionState.started || this.sessionState === SessionState.paused)) {
152
+ this._start();
153
+ }
154
+ this._registerWidgetEvents();
155
+ this._registerSessionLimitReach();
156
+ this._registerSessionAutoCreation();
157
+ messagingService.sendMessage('state-change', this.sessionState);
158
+ // Emit init observable event
159
+ this.emit('init', [this]);
160
+ }
161
+ /**
162
+ * Save the continuous recording session
163
+ */
164
+ async save() {
165
+ try {
166
+ this._checkOperation('save');
167
+ if (!this.continuousRecording || !this._configs.showContinuousRecording) {
168
+ return;
169
+ }
170
+ this._sessionWidget.updateSaveContinuousDebugSessionState(ContinuousRecordingSaveButtonState.SAVING);
171
+ const res = await this._apiService.saveContinuousDebugSession(this.sessionId, {
172
+ sessionAttributes: this.sessionAttributes,
173
+ resourceAttributes: getNavigatorInfo(),
174
+ stoppedAt: this._recorder.stoppedAt,
175
+ name: this.sessionAttributes.userName
176
+ ? `${this.sessionAttributes.userName}'s session on ${getFormattedDate(Date.now(), { month: 'short', day: 'numeric' })}`
177
+ : `Session on ${getFormattedDate(Date.now())}`,
178
+ });
179
+ this._sessionWidget.updateSaveContinuousDebugSessionState(ContinuousRecordingSaveButtonState.SAVED);
180
+ const sessionUrl = res === null || res === void 0 ? void 0 : res.url;
181
+ this._sessionWidget.showToast({
182
+ type: 'success',
183
+ message: 'Your session was saved',
184
+ button: {
185
+ text: 'Open session', url: sessionUrl,
186
+ },
187
+ }, 5000);
188
+ return res;
189
+ }
190
+ catch (error) {
191
+ this.error = error.message;
192
+ this._sessionWidget.updateSaveContinuousDebugSessionState(ContinuousRecordingSaveButtonState.ERROR);
193
+ }
194
+ finally {
195
+ setTimeout(() => {
196
+ this._sessionWidget.updateSaveContinuousDebugSessionState(ContinuousRecordingSaveButtonState.IDLE);
197
+ }, 3000);
198
+ }
199
+ }
200
+ /**
201
+ * Start a new session
202
+ * @param type - the type of session to start
203
+ * @param session - the session to start
204
+ */
205
+ start(type = SessionType.MANUAL, session) {
206
+ this._checkOperation('start');
207
+ // If continuous recording is disabled, force plain mode
208
+ if (type === SessionType.CONTINUOUS && !this._configs.showContinuousRecording) {
209
+ type = SessionType.MANUAL;
210
+ }
211
+ this.sessionType = type;
212
+ this._startRequestController = new AbortController();
213
+ if (session) {
214
+ this._setupSessionAndStart(session, true);
215
+ }
216
+ else {
217
+ this._createSessionAndStart();
218
+ }
219
+ }
220
+ /**
221
+ * Stop the current session with an optional comment
222
+ * @param comment - user-provided comment to include in session session attributes
223
+ */
224
+ async stop(comment) {
225
+ try {
226
+ this._checkOperation('stop');
227
+ this._stop();
228
+ if (this.continuousRecording) {
229
+ await this._apiService.stopContinuousDebugSession(this.sessionId);
230
+ this.sessionType = SessionType.MANUAL;
231
+ }
232
+ else {
233
+ const request = {
234
+ sessionAttributes: { comment },
235
+ stoppedAt: this._recorder.stoppedAt,
236
+ };
237
+ const response = await this._apiService.stopSession(this.sessionId, request);
238
+ recorderEventBus.emit(SESSION_RESPONSE, response);
239
+ }
240
+ this._clearSession();
241
+ }
242
+ catch (error) {
243
+ this.error = error.message;
244
+ }
245
+ }
246
+ /**
247
+ * Pause the current session
248
+ */
249
+ async pause() {
250
+ try {
251
+ this._checkOperation('pause');
252
+ this._pause();
253
+ }
254
+ catch (error) {
255
+ this.error = error.message;
256
+ }
257
+ }
258
+ /**
259
+ * Resume the current session
260
+ */
261
+ async resume() {
262
+ try {
263
+ this._checkOperation('resume');
264
+ this._resume();
265
+ }
266
+ catch (error) {
267
+ this.error = error.message;
268
+ }
269
+ }
270
+ /**
271
+ * Cancel the current session
272
+ */
273
+ async cancel() {
274
+ try {
275
+ this._checkOperation('cancel');
276
+ this._stop();
277
+ if (this.continuousRecording) {
278
+ await this._apiService.stopContinuousDebugSession(this.sessionId);
279
+ this.sessionType = SessionType.MANUAL;
280
+ }
281
+ else {
282
+ await this._apiService.cancelSession(this.sessionId);
283
+ }
284
+ this._clearSession();
285
+ }
286
+ catch (error) {
287
+ this.error = error.message;
288
+ }
289
+ }
290
+ /**
291
+ * Set the session attributes
292
+ * @param attributes - the attributes to set
293
+ */
294
+ setSessionAttributes(attributes) {
295
+ this._sessionAttributes = attributes;
296
+ }
297
+ /**
298
+ * Updates the button click handler in the library.
299
+ * @param handler - A function that will be invoked when the button is clicked.
300
+ * The function receives the click event as its parameter and
301
+ * should return `false` to prevent the default button action,
302
+ * or `true` (or nothing) to allow it.
303
+ */
304
+ set recordingButtonClickHandler(handler) {
305
+ this._sessionWidget.buttonClickExternalHandler = handler;
306
+ }
307
+ /**
308
+ * @description Check if session should be started/stopped automatically
309
+ * @param {ISession} [sessionPayload]
310
+ * @returns {Promise<void>}
311
+ */
312
+ async checkRemoteContinuousSession(sessionPayload) {
313
+ this._checkOperation('autoStartRemoteContinuousSession');
314
+ if (!this._configs.showContinuousRecording) {
315
+ return;
316
+ }
317
+ const payload = {
318
+ sessionAttributes: {
319
+ ...this.sessionAttributes,
320
+ ...((sessionPayload === null || sessionPayload === void 0 ? void 0 : sessionPayload.sessionAttributes) || {}),
321
+ },
322
+ resourceAttributes: {
323
+ ...getNavigatorInfo(),
324
+ ...((sessionPayload === null || sessionPayload === void 0 ? void 0 : sessionPayload.resourceAttributes) || {}),
325
+ },
326
+ };
327
+ const { state } = await this._apiService.checkRemoteSession(payload);
328
+ if (state == 'START') {
329
+ if (this.sessionState !== SessionState.started) {
330
+ await this.start(SessionType.CONTINUOUS);
331
+ }
332
+ }
333
+ else if (state == 'STOP') {
334
+ if (this.sessionState !== SessionState.stopped) {
335
+ await this.stop();
336
+ }
337
+ }
338
+ }
339
+ /**
340
+ * Register session widget event listeners for controlling session actions
341
+ */
342
+ _registerWidgetEvents() {
343
+ this._sessionWidget.on('toggle', (state, comment) => {
344
+ this.error = '';
345
+ if (state) {
346
+ this.start(SessionType.MANUAL);
347
+ }
348
+ else {
349
+ this.stop(comment === null || comment === void 0 ? void 0 : comment.trim());
350
+ }
351
+ });
352
+ this._sessionWidget.on('pause', () => {
353
+ this.error = '';
354
+ this.pause();
355
+ });
356
+ this._sessionWidget.on('resume', () => {
357
+ this.error = '';
358
+ this.resume();
359
+ });
360
+ this._sessionWidget.on('cancel', () => {
361
+ this.error = '';
362
+ this.cancel();
363
+ });
364
+ this._sessionWidget.on('continuous-debugging', (enabled) => {
365
+ this.error = '';
366
+ if (enabled) {
367
+ this.start(SessionType.CONTINUOUS);
368
+ }
369
+ else {
370
+ this.stop();
371
+ }
372
+ });
373
+ this._sessionWidget.on('save', () => {
374
+ this.error = '';
375
+ this.save();
376
+ });
377
+ }
378
+ /**
379
+ * Register session limit reaching listeners for controlling session end
380
+ */
381
+ _registerSessionLimitReach() {
382
+ recorderEventBus.on(SESSION_STOPPED_EVENT, () => {
383
+ this._stop();
384
+ this._clearSession();
385
+ this._sessionWidget.handleUIReseting();
386
+ });
387
+ }
388
+ /**
389
+ * Register session auto creation listeners during continuous recording
390
+ */
391
+ _registerSessionAutoCreation() {
392
+ recorderEventBus.on(SESSION_AUTO_CREATED, (payload) => {
393
+ var _a;
394
+ if (!(payload === null || payload === void 0 ? void 0 : payload.data))
395
+ return;
396
+ this._sessionWidget.showToast({
397
+ type: 'success',
398
+ message: 'Your session was auto-saved due to an error',
399
+ button: {
400
+ text: 'Open session',
401
+ url: (_a = payload === null || payload === void 0 ? void 0 : payload.data) === null || _a === void 0 ? void 0 : _a.url,
402
+ },
403
+ }, 5000);
404
+ });
405
+ }
406
+ /**
407
+ * Create a new session and start it
408
+ */
409
+ async _createSessionAndStart() {
410
+ var _a;
411
+ const signal = (_a = this._startRequestController) === null || _a === void 0 ? void 0 : _a.signal;
412
+ try {
413
+ const payload = {
414
+ sessionAttributes: this.sessionAttributes,
415
+ resourceAttributes: getNavigatorInfo(),
416
+ name: this.sessionAttributes.userName
417
+ ? `${this.sessionAttributes.userName}'s session on ${getFormattedDate(Date.now(), { month: 'short', day: 'numeric' })}`
418
+ : `Session on ${getFormattedDate(Date.now())}`,
419
+ };
420
+ const request = !this.continuousRecording ?
421
+ payload : { debugSessionData: payload };
422
+ const session = this.continuousRecording
423
+ ? await this._apiService.startContinuousDebugSession(request, signal)
424
+ : await this._apiService.startSession(request, signal);
425
+ if (session) {
426
+ session.sessionType = this.continuousRecording
427
+ ? SessionType.CONTINUOUS
428
+ : SessionType.MANUAL;
429
+ this._setupSessionAndStart(session, false);
430
+ }
431
+ }
432
+ catch (error) {
433
+ this.error = error.message;
434
+ if (this.continuousRecording) {
435
+ this.sessionType = SessionType.MANUAL;
436
+ }
437
+ }
438
+ }
439
+ /**
440
+ * Start tracing and recording for the session
441
+ */
442
+ _start() {
443
+ var _a;
444
+ this.sessionState = SessionState.started;
445
+ this.sessionType = this.sessionType;
446
+ this._tracer.start(this.sessionId, this.sessionType);
447
+ this._recorder.start(this.sessionId, this.sessionType);
448
+ this._navigationRecorder.start({ sessionId: this.sessionId, sessionType: this.sessionType, });
449
+ if (this.session) {
450
+ recorderEventBus.emit(SESSION_STARTED_EVENT, this.session);
451
+ this._recorder.subscribeToSession(this.session);
452
+ this._sessionWidget.seconds = getTimeDifferenceInSeconds((_a = this.session) === null || _a === void 0 ? void 0 : _a.startedAt);
453
+ }
454
+ }
455
+ /**
456
+ * Stop tracing and recording for the session
457
+ */
458
+ _stop() {
459
+ this.sessionState = SessionState.stopped;
460
+ this._tracer.stop();
461
+ this._recorder.stop();
462
+ this._navigationRecorder.stop();
463
+ }
464
+ /**
465
+ * Pause the session tracing and recording
466
+ */
467
+ _pause() {
468
+ this._tracer.stop();
469
+ this._recorder.stop();
470
+ this._navigationRecorder.pause();
471
+ this.sessionState = SessionState.paused;
472
+ }
473
+ /**
474
+ * Resume the session tracing and recording
475
+ */
476
+ _resume() {
477
+ this._tracer.start(this.sessionId, this.sessionType);
478
+ this._recorder.start(this.sessionId, this.sessionType);
479
+ this._navigationRecorder.resume();
480
+ this.sessionState = SessionState.started;
481
+ }
482
+ _setupSessionAndStart(session, configureExporters = true) {
483
+ if (configureExporters && session.tempApiKey) {
484
+ this._configs.apiKey = session.tempApiKey;
485
+ this._recorder.init(this._configs);
486
+ this._tracer.setApiKey(session.tempApiKey);
487
+ this._apiService.updateConfigs({ apiKey: this._configs.apiKey });
488
+ }
489
+ this._setSession(session);
490
+ this._start();
491
+ }
492
+ /**
493
+ * Set the session ID in localStorage
494
+ * @param sessionId - the session ID to set or clear
495
+ */
496
+ _setSession(session) {
497
+ this.session = { ...session, startedAt: session.startedAt || new Date().toISOString() };
498
+ this.sessionId = (session === null || session === void 0 ? void 0 : session.shortId) || (session === null || session === void 0 ? void 0 : session._id);
499
+ }
500
+ _clearSession() {
501
+ this.session = null;
502
+ this.sessionId = null;
503
+ this.sessionState = SessionState.stopped;
504
+ }
505
+ /**
506
+ * Check the operation validity based on the session state and action
507
+ * @param action - action being checked ('init', 'start', 'stop', 'cancel', 'pause', 'resume')
508
+ */
509
+ _checkOperation(action, payload) {
510
+ if (!this._isInitialized) {
511
+ throw new Error('Configuration not initialized. Call init() before performing any actions.');
512
+ }
513
+ switch (action) {
514
+ case 'start':
515
+ if (this.sessionState === SessionState.started) {
516
+ throw new Error('Session is already started.');
517
+ }
518
+ break;
519
+ case 'stop':
520
+ if (this.sessionState !== SessionState.paused && this.sessionState !== SessionState.started) {
521
+ throw new Error('Cannot stop. Session is not currently started.');
522
+ }
523
+ break;
524
+ case 'cancel':
525
+ if (this.sessionState === SessionState.stopped) {
526
+ throw new Error('Cannot cancel. Session has already been stopped.');
527
+ }
528
+ break;
529
+ case 'pause':
530
+ if (this.sessionState !== SessionState.started) {
531
+ throw new Error('Cannot pause. Session is not running.');
532
+ }
533
+ break;
534
+ case 'resume':
535
+ if (this.sessionState !== SessionState.paused) {
536
+ throw new Error('Cannot resume. Session is not paused.');
537
+ }
538
+ break;
539
+ case 'save':
540
+ if (!this.continuousRecording) {
541
+ throw new Error('Cannot save continuous recording session. Continuous recording is not enabled.');
542
+ }
543
+ if (this.sessionState !== SessionState.started) {
544
+ throw new Error('Cannot save continuous recording session. Session is not started.');
545
+ }
546
+ break;
547
+ case 'autoStartRemoteContinuousSession':
548
+ if (this.sessionState !== SessionState.stopped) {
549
+ throw new Error('Cannot start remote continuous session. Session is not stopped.');
550
+ }
551
+ break;
552
+ }
553
+ }
554
+ }
555
+ //# sourceMappingURL=sessionRecorder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessionRecorder.js","sourceRoot":"","sources":["../src/sessionRecorder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,76 @@
1
+ import { ToastConfig, WidgetTextOverridesConfig } from '../types';
2
+ export declare class UIManager {
3
+ private recorderButton;
4
+ private initialPopover;
5
+ private finalPopover;
6
+ private recordingOverlay;
7
+ private submitSessionDialog;
8
+ private toast;
9
+ private toastTimeout;
10
+ private widgetTextOverrides;
11
+ private showContinuousRecording;
12
+ /**
13
+ * Constructor initializes the UIManager with necessary DOM elements
14
+ * @param recorderButton - The main button to start recording
15
+ * @param initialPopover - Popover shown when starting the session
16
+ * @param finalPopover - Popover shown when the session ends
17
+ * @param previewModal - Modal to preview the recorded session
18
+ * @param recordingOverlay - Overlay element for recording indication in extension
19
+ * @param submitSessionDialog - Dialog that opens when recording is stopped from extension
20
+ * @param toast - Toast element for showing success messages
21
+ * @param widgetTextOverrides - Configuration for customizable text
22
+ * @param showContinuousRecording - Whether continuous recording is enabled
23
+ */
24
+ constructor(recorderButton: HTMLButtonElement, initialPopover: HTMLElement, finalPopover: HTMLElement, recordingOverlay: HTMLElement, submitSessionDialog: HTMLElement, toast: HTMLElement, widgetTextOverrides: WidgetTextOverridesConfig, showContinuousRecording: boolean);
25
+ /**
26
+ * Sets the properties for the recorder button, including its class,
27
+ * tooltip, and inner HTML content (Record icon)
28
+ */
29
+ setRecorderButtonProps(): void;
30
+ /**
31
+ * Sets the properties for the recording overlay, including its classes,
32
+ * tooltip, and inner HTML content
33
+ */
34
+ setOverlayProps(): void;
35
+ /**
36
+ * Sets the properties for the session submission dialog, including its classes,
37
+ * tooltip, and inner HTML content
38
+ */
39
+ setSubmitSessionDialogProps(): void;
40
+ /**
41
+ * Sets up the initial popover with its class and inner HTML structure.
42
+ * The popover includes a logo, heading, and start recording button.
43
+ */
44
+ setInitialPopoverProps(): void;
45
+ /**
46
+ * Sets up the final popover with its class and inner HTML structure.
47
+ * The popover allows the user to preview or send the bug report after recording.
48
+ */
49
+ setFinalPopoverProps(): void;
50
+ /**
51
+ * Updates the popover button to reflect a loading state.
52
+ *
53
+ * When `isLoading` is true, the button is disabled and shows a loading message.
54
+ * When `isLoading` is false, the button is enabled and resets to its default label.
55
+ *
56
+ * @param isLoading - Whether the popover button should show a loading state.
57
+ */
58
+ setPopoverLoadingState(isLoading: boolean): void;
59
+ setTimerValue(time: string): void;
60
+ /**
61
+ * Sets the properties for the toast element, including its classes
62
+ */
63
+ setToastProps(): void;
64
+ /**
65
+ * Shows a toast message with optional session URL
66
+ * @param message - The message to display
67
+ * @param sessionUrl - Optional URL to open when clicking the button
68
+ * @param duration - Duration in milliseconds to show the toast (default: 10000ms)
69
+ */
70
+ showToast(config: ToastConfig, duration?: number): void;
71
+ /**
72
+ * Hides the toast message
73
+ */
74
+ hideToast(): void;
75
+ }
76
+ //# sourceMappingURL=UIManager.d.ts.map