@multiplayer-app/session-recorder-browser 1.2.22 → 1.2.24
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/dist/browser/index.js +48 -104
- package/dist/browser/index.js.map +1 -1
- package/dist/config/constants.d.ts +19 -0
- package/dist/config/constants.js +35 -0
- package/dist/config/constants.js.map +1 -0
- package/dist/config/defaults.d.ts +5 -0
- package/dist/config/defaults.js +60 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/index.d.ts +6 -0
- package/dist/config/index.js +7 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/masking.d.ts +3 -0
- package/dist/config/masking.js +30 -0
- package/dist/config/masking.js.map +1 -0
- package/dist/config/session-recorder.d.ts +3 -0
- package/dist/config/session-recorder.js +60 -0
- package/dist/config/session-recorder.js.map +1 -0
- package/dist/config/validators.d.ts +11 -0
- package/dist/config/validators.js +25 -0
- package/dist/config/validators.js.map +1 -0
- package/dist/eventBus.d.ts +3 -0
- package/dist/eventBus.js +3 -0
- package/dist/eventBus.js.map +1 -0
- package/dist/exporters/index.js +1 -1
- package/dist/exporters.d.ts +4 -0
- package/dist/exporters.js +8 -0
- package/dist/exporters.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +52 -104
- package/dist/index.js.map +1 -1
- package/dist/index.umd.js +48 -103
- package/dist/index.umd.js.map +1 -1
- package/dist/listeners.d.ts +3 -0
- package/dist/listeners.js +39 -0
- package/dist/listeners.js.map +1 -0
- package/dist/navigation/index.d.ts +3 -0
- package/dist/navigation/index.js +3 -0
- package/dist/navigation/index.js.map +1 -0
- package/dist/navigation/navigationRecorder.d.ts +22 -0
- package/dist/navigation/navigationRecorder.js +195 -0
- package/dist/navigation/navigationRecorder.js.map +1 -0
- package/dist/navigation/types.d.ts +32 -0
- package/dist/navigation/types.js +2 -0
- package/dist/navigation/types.js.map +1 -0
- package/dist/otel/helpers.d.ts +46 -0
- package/dist/otel/helpers.js +201 -0
- package/dist/otel/helpers.js.map +1 -0
- package/dist/otel/index.d.ts +18 -0
- package/dist/otel/index.js +186 -0
- package/dist/otel/index.js.map +1 -0
- package/dist/otel/types.d.ts +10 -0
- package/dist/otel/types.js +2 -0
- package/dist/otel/types.js.map +1 -0
- package/dist/patch/configs.d.ts +9 -0
- package/dist/patch/configs.js +16 -0
- package/dist/patch/configs.js.map +1 -0
- package/dist/patch/fetch.d.ts +2 -0
- package/dist/patch/fetch.js +123 -0
- package/dist/patch/fetch.js.map +1 -0
- package/dist/patch/index.d.ts +4 -0
- package/dist/patch/index.js +4 -0
- package/dist/patch/index.js.map +1 -0
- package/dist/patch/xhr.d.ts +2 -0
- package/dist/patch/xhr.js +85 -0
- package/dist/patch/xhr.js.map +1 -0
- package/dist/rrweb/exporter.d.ts +25 -0
- package/dist/rrweb/exporter.js +146 -0
- package/dist/rrweb/exporter.js.map +1 -0
- package/dist/rrweb/index.d.ts +39 -0
- package/dist/rrweb/index.js +139 -0
- package/dist/rrweb/index.js.map +1 -0
- package/dist/rrweb/indexedDbService.d.ts +9 -0
- package/dist/rrweb/indexedDbService.js +54 -0
- package/dist/rrweb/indexedDbService.js.map +1 -0
- package/dist/services/api.service.d.ts +81 -0
- package/dist/services/api.service.js +133 -0
- package/dist/services/api.service.js.map +1 -0
- package/dist/services/messaging.service.d.ts +16 -0
- package/dist/services/messaging.service.js +94 -0
- package/dist/services/messaging.service.js.map +1 -0
- package/dist/sessionRecorder.d.ts +148 -0
- package/dist/sessionRecorder.js +555 -0
- package/dist/sessionRecorder.js.map +1 -0
- package/dist/sessionWidget/UIManager.d.ts +76 -0
- package/dist/sessionWidget/UIManager.js +135 -0
- package/dist/sessionWidget/UIManager.js.map +1 -0
- package/dist/sessionWidget/buttonStateConfigs.d.ts +83 -0
- package/dist/sessionWidget/buttonStateConfigs.js +86 -0
- package/dist/sessionWidget/buttonStateConfigs.js.map +1 -0
- package/dist/sessionWidget/constants.d.ts +5 -0
- package/dist/sessionWidget/constants.js +5 -0
- package/dist/sessionWidget/constants.js.map +1 -0
- package/dist/sessionWidget/dragManager.d.ts +16 -0
- package/dist/sessionWidget/dragManager.js +114 -0
- package/dist/sessionWidget/dragManager.js.map +1 -0
- package/dist/sessionWidget/index.d.ts +86 -0
- package/dist/sessionWidget/index.js +564 -0
- package/dist/sessionWidget/index.js.map +1 -0
- package/dist/sessionWidget/templates/finalPopover.d.ts +3 -0
- package/dist/sessionWidget/templates/finalPopover.js +21 -0
- package/dist/sessionWidget/templates/finalPopover.js.map +1 -0
- package/dist/sessionWidget/templates/icons.d.ts +14 -0
- package/dist/sessionWidget/templates/icons.js +50 -0
- package/dist/sessionWidget/templates/icons.js.map +1 -0
- package/dist/sessionWidget/templates/initialPopover.d.ts +3 -0
- package/dist/sessionWidget/templates/initialPopover.js +41 -0
- package/dist/sessionWidget/templates/initialPopover.js.map +1 -0
- package/dist/sessionWidget/templates/recordingOverlay.d.ts +2 -0
- package/dist/sessionWidget/templates/recordingOverlay.js +16 -0
- package/dist/sessionWidget/templates/recordingOverlay.js.map +1 -0
- package/dist/sessionWidget/templates/submitSessionDialog.d.ts +3 -0
- package/dist/sessionWidget/templates/submitSessionDialog.js +17 -0
- package/dist/sessionWidget/templates/submitSessionDialog.js.map +1 -0
- package/dist/sessionWidget/templates/toast.d.ts +3 -0
- package/dist/sessionWidget/templates/toast.js +25 -0
- package/dist/sessionWidget/templates/toast.js.map +1 -0
- package/dist/types/client-type.enum.d.ts +6 -0
- package/dist/types/client-type.enum.js +7 -0
- package/dist/types/client-type.enum.js.map +1 -0
- package/dist/types/index.d.ts +4 -0
- package/dist/types/index.js +4 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/session.d.ts +72 -0
- package/dist/types/session.js +7 -0
- package/dist/types/session.js.map +1 -0
- package/dist/types/sessionRecorder.d.ts +369 -0
- package/dist/types/sessionRecorder.js +14 -0
- package/dist/types/sessionRecorder.js.map +1 -0
- package/dist/types/widget.d.ts +11 -0
- package/dist/types/widget.js +2 -0
- package/dist/types/widget.js.map +1 -0
- package/dist/utils/array.d.ts +4 -0
- package/dist/utils/array.js +50 -0
- package/dist/utils/array.js.map +1 -0
- package/dist/utils/dom.d.ts +5 -0
- package/dist/utils/dom.js +9 -0
- package/dist/utils/dom.js.map +1 -0
- package/dist/utils/globals.d.ts +24 -0
- package/dist/utils/globals.js +14 -0
- package/dist/utils/globals.js.map +1 -0
- package/dist/utils/index.d.ts +9 -0
- package/dist/utils/index.js +10 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/navigator.d.ts +3 -0
- package/dist/utils/navigator.js +83 -0
- package/dist/utils/navigator.js.map +1 -0
- package/dist/utils/request-utils.d.ts +10 -0
- package/dist/utils/request-utils.js +70 -0
- package/dist/utils/request-utils.js.map +1 -0
- package/dist/utils/session.d.ts +8 -0
- package/dist/utils/session.js +21 -0
- package/dist/utils/session.js.map +1 -0
- package/dist/utils/storage.d.ts +7 -0
- package/dist/utils/storage.js +19 -0
- package/dist/utils/storage.js.map +1 -0
- package/dist/utils/time.d.ts +7 -0
- package/dist/utils/time.js +25 -0
- package/dist/utils/time.js.map +1 -0
- package/dist/utils/type-utils.d.ts +18 -0
- package/dist/utils/type-utils.js +71 -0
- package/dist/utils/type-utils.js.map +1 -0
- package/package.json +8 -3
- package/dist/exports.d.ts.map +0 -1
- package/docs/img/header-js.png +0 -0
- 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":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,QAAQ,CAAA;AACzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAA;AAC5C,OAAO,EACL,aAAa,EACb,aAAa,EACb,gBAAgB,EAChB,gBAAgB,EAChB,0BAA0B,EAC1B,eAAe,GAChB,MAAM,SAAS,CAAA;AAChB,OAAO,EACL,YAAY,GAKb,MAAM,SAAS,CAAA;AAEhB,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,iBAAiB,EACjB,oBAAoB,EACpB,sBAAsB,EACtB,uBAAuB,EACvB,uCAAuC,EACvC,wBAAwB,EACxB,oBAAoB,EACpB,qBAAqB,EACrB,qBAAqB,EACtB,MAAM,UAAU,CAAA;AAEjB,OAAO,EAAE,uBAAuB,EAAE,8BAA8B,GAAG,MAAM,SAAS,CAAA;AAClF,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAC/C,OAAO,gBAAgB,MAAM,8BAA8B,CAAA;AAC3D,OAAO,EAAE,UAAU,EAA2C,MAAM,wBAAwB,CAAA;AAE5F,OAAO,cAAc,CAAA;AACrB,OAAO,EAAE,WAAW,EAAE,MAAM,0CAA0C,CAAA;AACtE,OAAO,EAAE,kCAAkC,EAAE,MAAM,oCAAoC,CAAA;AAEvF,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAC5C,OAAO,EAAE,kBAAkB,EAA+B,MAAM,cAAc,CAAA;AAI9E,MAAM,OAAO,eAAgB,SAAQ,UAAiC;IAUpE,IAAW,UAAU;QACnB,OAAO,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAA;IACrC,CAAC;IAGD,IAAI,aAAa;QACf,OAAO,IAAI,CAAC,cAAc,CAAA;IAC5B,CAAC;IAGD,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,UAAU,CAAA;IACxB,CAAC;IACD,IAAI,SAAS,CAAC,SAAwB;QACpC,IAAI,CAAC,UAAU,GAAG,SAAS,CAAA;QAC3B,aAAa,CAAC,oBAAoB,EAAE,SAAS,CAAC,CAAA;IAChD,CAAC;IAGD,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,YAAY,CAAA;IAC1B,CAAC;IACD,IAAI,WAAW,CAAC,WAAwB;QACtC,IAAI,CAAC,YAAY,GAAG,WAAW,CAAA;QAC/B,MAAM,mBAAmB,GAAG,WAAW,KAAK,WAAW,CAAC,UAAU,CAAA;QAClE,IAAI,CAAC,cAAc,CAAC,8BAA8B,CAAC,mBAAmB,CAAC,CAAA;QACvE,gBAAgB,CAAC,WAAW,CAAC,sBAAsB,EAAE,mBAAmB,CAAC,CAAA;QACzE,aAAa,CAAC,sBAAsB,EAAE,WAAW,CAAC,CAAA;IACpD,CAAC;IAGD,IAAI,mBAAmB;QACrB,OAAO,IAAI,CAAC,WAAW,KAAK,WAAW,CAAC,UAAU,CAAA;IACpD,CAAC;IAGD,IAAI,YAAY;QACd,OAAO,IAAI,CAAC,aAAa,IAAI,YAAY,CAAC,OAAO,CAAA;IACnD,CAAC;IACD,IAAI,YAAY,CAAC,KAA0B;QACzC,IAAI,CAAC,aAAa,GAAG,KAAK,CAAA;QAC1B,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,mBAAmB,CAAC,CAAA;QAC7E,gBAAgB,CAAC,WAAW,CAAC,cAAc,EAAE,IAAI,CAAC,aAAa,CAAC,CAAA;QAChE,aAAa,CAAC,uBAAuB,EAAE,KAAK,CAAC,CAAA;QAC7C,iDAAiD;QACjD,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,IAAI,CAAC,aAAa,IAAI,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,CAAA;IAC3F,CAAC;IAGD,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,QAAQ,CAAA;IACtB,CAAC;IACD,IAAI,OAAO,CAAC,OAAwB;QAClC,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAA;QACvB,aAAa,CAAC,iBAAiB,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAA;IACjD,CAAC;IAGD,IAAI,iBAAiB;QACnB,OAAO,IAAI,CAAC,kBAAkB,IAAI,EAAE,CAAA;IACtC,CAAC;IACD,IAAI,iBAAiB,CAAC,UAAsC;QAC1D,IAAI,CAAC,kBAAkB,GAAG,UAAU,CAAA;IACtC,CAAC;IAKD,IAAW,KAAK;QACd,OAAO,IAAI,CAAC,MAAM,CAAA;IACpB,CAAC;IAED,IAAW,KAAK,CAAC,CAAS;QACxB,IAAI,CAAC,MAAM,GAAG,CAAC,CAAA;QACf,IAAI,CAAC,cAAc,CAAC,KAAK,GAAG,CAAC,CAAA;QAC7B,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;IACzB,CAAC;IAED;;;;;;OAMG;IACH,IAAW,0BAA0B;QACnC,OAAO,IAAI,CAAC,cAAc,CAAC,cAAc,CAAA;IAC3C,CAAC;IACD;;OAEG;IACH;;QACE,KAAK,EAAE,CAAA;QAnGD,gBAAW,GAAG,IAAI,UAAU,EAAE,CAAA;QAC9B,YAAO,GAAG,IAAI,gBAAgB,EAAE,CAAA;QAChC,cAAS,GAAG,IAAI,kBAAkB,EAAE,CAAA;QACpC,mBAAc,GAAG,IAAI,aAAa,EAAE,CAAA;QACpC,wBAAmB,GAAG,IAAI,kBAAkB,EAAE,CAAA;QAC9C,4BAAuB,GAA2B,IAAI,CAAA;QAMtD,mBAAc,GAAG,KAAK,CAAA;QAI9B,kDAAkD;QAC1C,eAAU,GAAkB,IAAI,CAAA;QAShC,iBAAY,GAAgB,WAAW,CAAC,MAAM,CAAA;QAiB9C,kBAAa,GAAwB,IAAI,CAAA;QAazC,aAAQ,GAAoB,IAAI,CAAA;QAShC,uBAAkB,GAA+B,IAAI,CAAA;QAO7D;;WAEG;QACK,WAAM,GAAW,EAAE,CAAA;QA0BzB,MAAM,YAAY,GAAG,aAAa,CAAC,iBAAiB,EAAE,IAAI,CAAC,CAAA;QAC3D,MAAM,cAAc,GAAG,aAAa,CAAC,oBAAoB,CAAC,CAAA;QAC1D,MAAM,iBAAiB,GAAG,aAAa,CAAC,uBAAuB,CAAC,CAAA;QAChE,MAAM,gBAAgB,GAAG,aAAa,CAAC,sBAAsB,CAAC,CAAA;QAE9D,IAAI,eAAe,CAAC,YAAY,EAAE,gBAAgB,CAAC,EAAE,CAAC;YACpD,IAAI,CAAC,OAAO,GAAG,YAAY,CAAA;YAC3B,IAAI,CAAC,SAAS,GAAG,cAAc,CAAA;YAC/B,IAAI,CAAC,WAAW,GAAG,gBAAgB,CAAA;YACnC,IAAI,CAAC,YAAY,GAAG,iBAAiB,CAAA;QACvC,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,OAAO,GAAG,IAAI,CAAA;YACnB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAA;YACrB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAA;YACxB,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC,MAAM,CAAA;QACvC,CAAC;QAED,IAAI,CAAC,QAAQ,GAAG;YACd,GAAG,WAAW;YACd,MAAM,EAAE,CAAA,MAAA,IAAI,CAAC,OAAO,0CAAE,UAAU,KAAI,EAAE;SACvC,CAAA;IACH,CAAC;IAGD;;;OAGG;IACI,IAAI,CAAC,OAA+B;QACzC,IAAI,CAAC,QAAQ,GAAG,wBAAwB,CAAC,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,OAAO,EAAE,CAAC,CAAA;QAE1E,IAAI,CAAC,cAAc,GAAG,IAAI,CAAA;QAC1B,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAA;QAE5B,8BAA8B,CAAC,IAAI,CAAC,QAAQ,CAAC,2BAA2B,IAAI,uCAAuC,CAAC,CAAA;QACpH,uBAAuB,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAA;QAGhF,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QAChC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QACpC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QACvC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC;YAC5B,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,gBAAgB;YACvC,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,WAAW;YACtC,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,WAAW;YACtC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO;SAC/B,CAAC,CAAA;QAEF,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;YACzB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QACpC,CAAC;QAED,IAAI,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,YAAY,KAAK,YAAY,CAAC,OAAO,IAAI,IAAI,CAAC,YAAY,KAAK,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC;YAChH,IAAI,CAAC,MAAM,EAAE,CAAA;QACf,CAAC;QAED,IAAI,CAAC,qBAAqB,EAAE,CAAA;QAC5B,IAAI,CAAC,0BAA0B,EAAE,CAAA;QACjC,IAAI,CAAC,4BAA4B,EAAE,CAAA;QACnC,gBAAgB,CAAC,WAAW,CAAC,cAAc,EAAE,IAAI,CAAC,YAAY,CAAC,CAAA;QAC/D,6BAA6B;QAC7B,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,CAAA;IAC3B,CAAC;IAGD;;OAEG;IACI,KAAK,CAAC,IAAI;QACf,IAAI,CAAC;YACH,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAA;YAC5B,IAAI,CAAC,IAAI,CAAC,mBAAmB,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,uBAAuB,EAAE,CAAC;gBACxE,OAAM;YACR,CAAC;YACD,IAAI,CAAC,cAAc,CAAC,qCAAqC,CACvD,kCAAkC,CAAC,MAAM,CAC1C,CAAA;YACD,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,0BAA0B,CAC3D,IAAI,CAAC,SAAU,EACf;gBACE,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;gBACzC,kBAAkB,EAAE,gBAAgB,EAAE;gBACtC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS;gBACnC,IAAI,EAAE,IAAI,CAAC,iBAAiB,CAAC,QAAQ;oBACnC,CAAC,CAAC,GAAG,IAAI,CAAC,iBAAiB,CAAC,QAAQ,iBAAiB,gBAAgB,CACnE,IAAI,CAAC,GAAG,EAAE,EACV,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,CACnC,EAAE;oBACH,CAAC,CAAC,cAAc,gBAAgB,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE;aACjD,CACF,CAAA;YAED,IAAI,CAAC,cAAc,CAAC,qCAAqC,CACvD,kCAAkC,CAAC,KAAK,CACzC,CAAA;YAED,MAAM,UAAU,GAAG,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,GAAG,CAAA;YAC3B,IAAI,CAAC,cAAc,CAAC,SAAS,CAC3B;gBACE,IAAI,EAAE,SAAS;gBACf,OAAO,EAAE,wBAAwB;gBACjC,MAAM,EAAE;oBACN,IAAI,EAAE,cAAc,EAAE,GAAG,EAAE,UAAU;iBACtC;aACF,EACD,IAAI,CACL,CAAA;YAED,OAAO,GAAG,CAAA;QACZ,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,OAAO,CAAA;YAC1B,IAAI,CAAC,cAAc,CAAC,qCAAqC,CACvD,kCAAkC,CAAC,KAAK,CACzC,CAAA;QACH,CAAC;gBAAS,CAAC;YACT,UAAU,CAAC,GAAG,EAAE;gBACd,IAAI,CAAC,cAAc,CAAC,qCAAqC,CACvD,kCAAkC,CAAC,IAAI,CACxC,CAAA;YACH,CAAC,EAAE,IAAI,CAAC,CAAA;QACV,CAAC;IACH,CAAC;IAED;;;;OAIG;IACI,KAAK,CAAC,OAAoB,WAAW,CAAC,MAAM,EAAE,OAAkB;QACrE,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAA;QAC7B,wDAAwD;QACxD,IAAI,IAAI,KAAK,WAAW,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,uBAAuB,EAAE,CAAC;YAC9E,IAAI,GAAG,WAAW,CAAC,MAAM,CAAA;QAC3B,CAAC;QACD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAA;QACvB,IAAI,CAAC,uBAAuB,GAAG,IAAI,eAAe,EAAE,CAAA;QACpD,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,CAAC,qBAAqB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;QAC3C,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,sBAAsB,EAAE,CAAA;QAC/B,CAAC;IACH,CAAC;IACD;;;OAGG;IACI,KAAK,CAAC,IAAI,CAAC,OAAgB;QAChC,IAAI,CAAC;YACH,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAA;YAC5B,IAAI,CAAC,KAAK,EAAE,CAAA;YACZ,IAAI,IAAI,CAAC,mBAAmB,EAAE,CAAC;gBAC7B,MAAM,IAAI,CAAC,WAAW,CAAC,0BAA0B,CAAC,IAAI,CAAC,SAAU,CAAC,CAAA;gBAClE,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC,MAAM,CAAA;YACvC,CAAC;iBAAM,CAAC;gBACN,MAAM,OAAO,GAAuB;oBAClC,iBAAiB,EAAE,EAAE,OAAO,EAAE;oBAC9B,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS;iBACpC,CAAA;gBACD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,IAAI,CAAC,SAAU,EAAE,OAAO,CAAC,CAAA;gBAC7E,gBAAgB,CAAC,IAAI,CAAC,gBAAgB,EAAE,QAAQ,CAAC,CAAA;YACnD,CAAC;YACD,IAAI,CAAC,aAAa,EAAE,CAAA;QACtB,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,OAAO,CAAA;QAC5B,CAAC;IACH,CAAC;IACD;;OAEG;IACI,KAAK,CAAC,KAAK;QAChB,IAAI,CAAC;YACH,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAA;YAC7B,IAAI,CAAC,MAAM,EAAE,CAAA;QACf,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,OAAO,CAAA;QAC5B,CAAC;IACH,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,MAAM;QACjB,IAAI,CAAC;YACH,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAA;YAC9B,IAAI,CAAC,OAAO,EAAE,CAAA;QAChB,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,OAAO,CAAA;QAC5B,CAAC;IACH,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,MAAM;QACjB,IAAI,CAAC;YACH,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAA;YAC9B,IAAI,CAAC,KAAK,EAAE,CAAA;YACZ,IAAI,IAAI,CAAC,mBAAmB,EAAE,CAAC;gBAC7B,MAAM,IAAI,CAAC,WAAW,CAAC,0BAA0B,CAAC,IAAI,CAAC,SAAU,CAAC,CAAA;gBAClE,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC,MAAM,CAAA;YACvC,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,IAAI,CAAC,SAAU,CAAC,CAAA;YACvD,CAAC;YACD,IAAI,CAAC,aAAa,EAAE,CAAA;QACtB,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,OAAO,CAAA;QAC5B,CAAC;IACH,CAAC;IAED;;;MAGE;IACK,oBAAoB,CAAC,UAA+B;QACzD,IAAI,CAAC,kBAAkB,GAAG,UAAU,CAAA;IACtC,CAAC;IAED;;;;;;MAME;IACF,IAAW,2BAA2B,CAAC,OAA6B;QAClE,IAAI,CAAC,cAAc,CAAC,0BAA0B,GAAG,OAAO,CAAA;IAC1D,CAAC;IAED;;;;OAIG;IACI,KAAK,CAAC,4BAA4B,CACvC,cAAkD;QAElD,IAAI,CAAC,eAAe,CAAC,kCAAkC,CAAC,CAAA;QACxD,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,uBAAuB,EAAE,CAAC;YAC3C,OAAM;QACR,CAAC;QACD,MAAM,OAAO,GAAG;YACd,iBAAiB,EAAE;gBACjB,GAAG,IAAI,CAAC,iBAAiB;gBACzB,GAAG,CAAC,CAAA,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,iBAAiB,KAAI,EAAE,CAAC;aAC7C;YACD,kBAAkB,EAAE;gBAClB,GAAG,gBAAgB,EAAE;gBACrB,GAAG,CAAC,CAAA,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,kBAAkB,KAAI,EAAE,CAAC;aAC9C;SACF,CAAA;QAED,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAA;QAEpE,IAAI,KAAK,IAAI,OAAO,EAAE,CAAC;YACrB,IAAI,IAAI,CAAC,YAAY,KAAK,YAAY,CAAC,OAAO,EAAE,CAAC;gBAC/C,MAAM,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,UAAU,CAAC,CAAA;YAC1C,CAAC;QACH,CAAC;aAAM,IAAI,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,IAAI,IAAI,CAAC,YAAY,KAAK,YAAY,CAAC,OAAO,EAAE,CAAC;gBAC/C,MAAM,IAAI,CAAC,IAAI,EAAE,CAAA;YACnB,CAAC;QACH,CAAC;IACH,CAAC;IAGD;;OAEG;IACK,qBAAqB;QAC3B,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAc,EAAE,OAAgB,EAAE,EAAE;YACpE,IAAI,CAAC,KAAK,GAAG,EAAE,CAAA;YACf,IAAI,KAAK,EAAE,CAAC;gBACV,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAA;YAChC,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,IAAI,CAAC,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,IAAI,EAAE,CAAC,CAAA;YAC5B,CAAC;QACH,CAAC,CAAC,CAAA;QAEF,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YACnC,IAAI,CAAC,KAAK,GAAG,EAAE,CAAA;YACf,IAAI,CAAC,KAAK,EAAE,CAAA;QACd,CAAC,CAAC,CAAA;QAEF,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;YACpC,IAAI,CAAC,KAAK,GAAG,EAAE,CAAA;YACf,IAAI,CAAC,MAAM,EAAE,CAAA;QACf,CAAC,CAAC,CAAA;QAEF,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;YACpC,IAAI,CAAC,KAAK,GAAG,EAAE,CAAA;YACf,IAAI,CAAC,MAAM,EAAE,CAAA;QACf,CAAC,CAAC,CAAA;QAEF,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,sBAAsB,EAAE,CAAC,OAAgB,EAAE,EAAE;YAClE,IAAI,CAAC,KAAK,GAAG,EAAE,CAAA;YACf,IAAI,OAAO,EAAE,CAAC;gBACZ,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,UAAU,CAAC,CAAA;YACpC,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,IAAI,EAAE,CAAA;YACb,CAAC;QACH,CAAC,CAAC,CAAA;QAEF,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE;YAClC,IAAI,CAAC,KAAK,GAAG,EAAE,CAAA;YACf,IAAI,CAAC,IAAI,EAAE,CAAA;QACb,CAAC,CAAC,CAAA;IACJ,CAAC;IAED;;OAEG;IACK,0BAA0B;QAChC,gBAAgB,CAAC,EAAE,CAAC,qBAAqB,EAAE,GAAG,EAAE;YAC9C,IAAI,CAAC,KAAK,EAAE,CAAA;YACZ,IAAI,CAAC,aAAa,EAAE,CAAA;YACpB,IAAI,CAAC,cAAc,CAAC,gBAAgB,EAAE,CAAA;QACxC,CAAC,CAAC,CAAA;IACJ,CAAC;IAED;;OAEG;IACK,4BAA4B;QAClC,gBAAgB,CAAC,EAAE,CAAC,oBAAoB,EAAE,CAAC,OAAO,EAAE,EAAE;;YACpD,IAAI,CAAC,CAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,IAAI,CAAA;gBAAE,OAAM;YAC1B,IAAI,CAAC,cAAc,CAAC,SAAS,CAC3B;gBACE,IAAI,EAAE,SAAS;gBACf,OAAO,EAAE,6CAA6C;gBACtD,MAAM,EAAE;oBACN,IAAI,EAAE,cAAc;oBACpB,GAAG,EAAE,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,IAAI,0CAAE,GAAG;iBACxB;aACF,EACD,IAAI,CACL,CAAA;QACH,CAAC,CAAC,CAAA;IACJ,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,sBAAsB;;QAClC,MAAM,MAAM,GAAG,MAAA,IAAI,CAAC,uBAAuB,0CAAE,MAAM,CAAA;QACnD,IAAI,CAAC;YACH,MAAM,OAAO,GAAG;gBACd,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;gBACzC,kBAAkB,EAAE,gBAAgB,EAAE;gBACtC,IAAI,EAAE,IAAI,CAAC,iBAAiB,CAAC,QAAQ;oBACnC,CAAC,CAAC,GAAG,IAAI,CAAC,iBAAiB,CAAC,QAAQ,iBAAiB,gBAAgB,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,EAAE;oBACvH,CAAC,CAAC,cAAc,gBAAgB,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE;aACjD,CAAA;YACD,MAAM,OAAO,GAAwB,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;gBAC9D,OAAO,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,OAAO,EAAE,CAAA;YAEzC,MAAM,OAAO,GAAG,IAAI,CAAC,mBAAmB;gBACtC,CAAC,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,2BAA2B,CAAC,OAAO,EAAE,MAAM,CAAC;gBACrE,CAAC,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;YAExD,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,mBAAmB;oBAC5C,CAAC,CAAC,WAAW,CAAC,UAAU;oBACxB,CAAC,CAAC,WAAW,CAAC,MAAM,CAAA;gBACtB,IAAI,CAAC,qBAAqB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;YAC5C,CAAC;QACH,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,OAAO,CAAA;YAC1B,IAAI,IAAI,CAAC,mBAAmB,EAAE,CAAC;gBAC7B,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC,MAAM,CAAA;YACvC,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACK,MAAM;;QACZ,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC,OAAO,CAAA;QACxC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAA;QAEnC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,WAAW,CAAC,CAAA;QACpD,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,WAAW,CAAC,CAAA;QACtD,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,GAAG,CAAC,CAAA;QAE7F,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,gBAAgB,CAAC,IAAI,CAAC,qBAAqB,EAAE,IAAI,CAAC,OAAO,CAAC,CAAA;YAC1D,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;YAC/C,IAAI,CAAC,cAAc,CAAC,OAAO,GAAG,0BAA0B,CAAC,MAAA,IAAI,CAAC,OAAO,0CAAE,SAAS,CAAC,CAAA;QACnF,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK;QACX,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC,OAAO,CAAA;QACxC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAA;QACnB,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAA;QACrB,IAAI,CAAC,mBAAmB,CAAC,IAAI,EAAE,CAAA;IACjC,CAAC;IAED;;OAEG;IACK,MAAM;QACZ,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAA;QACnB,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAA;QACrB,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,CAAA;QAChC,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC,MAAM,CAAA;IACzC,CAAC;IAED;;OAEG;IACK,OAAO;QACb,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,WAAW,CAAC,CAAA;QACpD,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,WAAW,CAAC,CAAA;QACtD,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,CAAA;QACjC,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC,OAAO,CAAA;IAC1C,CAAC;IAEO,qBAAqB,CAAC,OAAiB,EAAE,qBAA8B,IAAI;QACjF,IAAI,kBAAkB,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;YAC7C,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,OAAO,CAAC,UAAU,CAAA;YACzC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;YAClC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;YAC1C,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAA;QAClE,CAAC;QAED,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAA;QACzB,IAAI,CAAC,MAAM,EAAE,CAAA;IACf,CAAC;IAED;;;OAGG;IACK,WAAW,CACjB,OAAiB;QAEjB,IAAI,CAAC,OAAO,GAAG,EAAE,GAAG,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAA;QACvF,IAAI,CAAC,SAAS,GAAG,CAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,OAAO,MAAI,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,GAAG,CAAA,CAAA;IACnD,CAAC;IAEO,aAAa;QACnB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAA;QACnB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAA;QACrB,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC,OAAO,CAAA;IAC1C,CAAC;IAED;;;OAGG;IACK,eAAe,CACrB,MAQsC,EACtC,OAAa;QAEb,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CACb,2EAA2E,CAC5E,CAAA;QACH,CAAC;QACD,QAAQ,MAAM,EAAE,CAAC;YACf,KAAK,OAAO;gBACV,IAAI,IAAI,CAAC,YAAY,KAAK,YAAY,CAAC,OAAO,EAAE,CAAC;oBAC/C,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAA;gBAChD,CAAC;gBACD,MAAK;YACP,KAAK,MAAM;gBACT,IAAI,IAAI,CAAC,YAAY,KAAK,YAAY,CAAC,MAAM,IAAI,IAAI,CAAC,YAAY,KAAK,YAAY,CAAC,OAAO,EAAE,CAAC;oBAC5F,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAA;gBACnE,CAAC;gBACD,MAAK;YACP,KAAK,QAAQ;gBACX,IAAI,IAAI,CAAC,YAAY,KAAK,YAAY,CAAC,OAAO,EAAE,CAAC;oBAC/C,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAA;gBACrE,CAAC;gBACD,MAAK;YACP,KAAK,OAAO;gBACV,IAAI,IAAI,CAAC,YAAY,KAAK,YAAY,CAAC,OAAO,EAAE,CAAC;oBAC/C,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAA;gBAC1D,CAAC;gBACD,MAAK;YACP,KAAK,QAAQ;gBACX,IAAI,IAAI,CAAC,YAAY,KAAK,YAAY,CAAC,MAAM,EAAE,CAAC;oBAC9C,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAA;gBAC1D,CAAC;gBACD,MAAK;YACP,KAAK,MAAM;gBACT,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,CAAC;oBAC9B,MAAM,IAAI,KAAK,CAAC,gFAAgF,CAAC,CAAA;gBACnG,CAAC;gBACD,IAAI,IAAI,CAAC,YAAY,KAAK,YAAY,CAAC,OAAO,EAAE,CAAC;oBAC/C,MAAM,IAAI,KAAK,CAAC,mEAAmE,CAAC,CAAA;gBACtF,CAAC;gBACD,MAAK;YACP,KAAK,kCAAkC;gBACrC,IAAI,IAAI,CAAC,YAAY,KAAK,YAAY,CAAC,OAAO,EAAE,CAAC;oBAC/C,MAAM,IAAI,KAAK,CAAC,iEAAiE,CAAC,CAAA;gBACpF,CAAC;gBACD,MAAK;QACT,CAAC;IACH,CAAC;CACF"}
|
|
@@ -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
|