@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,369 @@
1
+ import { SessionType } from '@multiplayer-app/session-recorder-common';
2
+ import { Span } from '@opentelemetry/api';
3
+ import { PropagateTraceHeaderCorsUrls } from '@opentelemetry/sdk-trace-web';
4
+ import type { MaskTextFn, MaskInputFn, MaskInputOptions } from 'rrweb-snapshot';
5
+ import type { maskTextClass } from '@rrweb/types';
6
+ import { LogData } from '@rrweb/rrweb-plugin-console-record';
7
+ import { Observable } from 'lib0/observable';
8
+ import type { ISession } from './session';
9
+ import type { NavigationRecorderPublicApi } from '../navigation';
10
+ export declare enum WidgetButtonPlacement {
11
+ topLeft = "top-left",
12
+ topRight = "top-right",
13
+ bottomLeft = "bottom-left",
14
+ bottomRight = "bottom-right"
15
+ }
16
+ export interface SessionRecorderOptions {
17
+ /**
18
+ * The API key used to authenticate with the session debugger service.
19
+ */
20
+ apiKey: string;
21
+ /**
22
+ * The version of the application using the session debugger.
23
+ */
24
+ version: string;
25
+ /**
26
+ * The name of the application being debugged.
27
+ */
28
+ application: string;
29
+ /**
30
+ * The environment where the application is running (e.g., 'production', 'staging').
31
+ */
32
+ environment: string;
33
+ /**
34
+ * (Optional) OTLP collector endpoint.
35
+ */
36
+ exporterEndpoint?: string;
37
+ /**
38
+ * (Optional) Base URL for the API calls.
39
+ * This allows customization of the API endpoint for sending session data.
40
+ */
41
+ apiBaseUrl?: string;
42
+ /**
43
+ * (Optional) An array of URLs or regular expressions that should be ignored by the session debugger.
44
+ * Any URL that partially matches any regex in this array will not be traced.
45
+ * Additionally, URLs that exactly match any string in the array will also be ignored.
46
+ */
47
+ ignoreUrls?: Array<string | RegExp>;
48
+ /**
49
+ * (Optional) Determines where the record button should be placed on the screen.
50
+ * Possible values:
51
+ * - 'top-left'
52
+ * - 'top-right'
53
+ * - 'bottom-left'
54
+ * - 'bottom-right'
55
+ */
56
+ widgetButtonPlacement?: WidgetButtonPlacement;
57
+ /**
58
+ * (Optional) Enables the continuous recording feature and UI.
59
+ * If false, the UI toggle is hidden and attempts to start a continuous
60
+ * session are ignored.
61
+ * @default true
62
+ */
63
+ showContinuousRecording?: boolean;
64
+ /**
65
+ * (Optional) If false, the session recording widget will be hidden from the UI.
66
+ * Use this option if you want to enable session recording without a visible UI element.
67
+ * @default showWidget = true
68
+ */
69
+ showWidget?: boolean;
70
+ /**
71
+ * (Optional) If true, enables the recording and replaying of canvas elements.
72
+ * Pass `true` to capture canvas interactions in the session recording.
73
+ * @default recordCanvas = false
74
+ */
75
+ recordCanvas?: boolean;
76
+ /**
77
+ * (Optional) If true, records navigation changes via tracing spans.
78
+ * @default recordNavigation = true
79
+ */
80
+ recordNavigation?: boolean;
81
+ /**
82
+ * (Optional) Trace ID Ratio for sampling
83
+ * @default 0.15
84
+ */
85
+ sampleTraceRatio?: number;
86
+ /**
87
+ * (Optional) URLs or regex patterns for CORS trace header propagation
88
+ */
89
+ propagateTraceHeaderCorsUrls?: PropagateTraceHeaderCorsUrls;
90
+ /**
91
+ * (Optional) If true, schematizes document span payload
92
+ * @default true
93
+ */
94
+ schemifyDocSpanPayload?: boolean;
95
+ /**
96
+ * (Optional) Maximum size for capturing HTTP payload
97
+ * @default 100000
98
+ */
99
+ maxCapturingHttpPayloadSize?: number;
100
+ /**
101
+ * (Optional) If true, uses post message fallback
102
+ * @default false
103
+ */
104
+ usePostMessageFallback?: boolean;
105
+ /** If true, captures body in traces
106
+ * @default true
107
+ */
108
+ captureBody?: boolean;
109
+ /** If true, captures headers in traces
110
+ * @default true
111
+ */
112
+ captureHeaders?: boolean;
113
+ /**
114
+ * (Optional) Configuration for masking sensitive data in session recordings
115
+ * @default { maskAllInputs: true, isContentMaskingEnabled: true }
116
+ */
117
+ masking?: MaskingConfig;
118
+ /**
119
+ * (Optional) Configuration for customizable UI text and labels
120
+ * @default See PopoverTextConfig defaults
121
+ */
122
+ widgetTextOverrides?: WidgetTextOverridesConfig;
123
+ }
124
+ /**
125
+ * Interface for masking configuration
126
+ */
127
+ export interface MaskingConfig {
128
+ /** If true, masks all input fields in the recording
129
+ * @default true
130
+ */
131
+ maskAllInputs?: boolean;
132
+ /** Class-based masking configuration - can be string or RegExp */
133
+ maskTextClass?: maskTextClass;
134
+ /** CSS selector for elements that should be masked */
135
+ maskTextSelector?: string;
136
+ /** Specific options for masking different types of inputs */
137
+ maskInputOptions?: MaskInputOptions;
138
+ /** Custom function for input masking */
139
+ maskInput?: MaskInputFn;
140
+ /** Custom function for text masking */
141
+ maskText?: MaskTextFn;
142
+ /** Custom function for console event masking */
143
+ maskConsoleEvent?: (payload: LogData) => LogData;
144
+ /** If true, enables masking for debug span payload in traces
145
+ * @default true
146
+ */
147
+ isContentMaskingEnabled?: boolean;
148
+ /** Custom function for masking body in traces */
149
+ maskBody?: (payload: any, span: Span) => any;
150
+ /** Custom function for masking headers in traces */
151
+ maskHeaders?: (headers: any, span: any) => any;
152
+ /** List of body fields to mask in traces */
153
+ maskBodyFieldsList?: string[];
154
+ /** List of headers to mask in traces */
155
+ maskHeadersList?: string[];
156
+ /** List of headers to include in traces (if specified, only these headers will be captured) */
157
+ headersToInclude?: string[];
158
+ /** List of headers to exclude from traces */
159
+ headersToExclude?: string[];
160
+ }
161
+ /**
162
+ * Base configuration interface with common properties
163
+ */
164
+ export interface BaseConfig {
165
+ /** API key for authentication */
166
+ apiKey: string;
167
+ /** Base URL for the API calls */
168
+ apiBaseUrl: string;
169
+ /** Base URL for the API calls */
170
+ exporterEndpoint: string;
171
+ /** Whether to use post message fallback */
172
+ usePostMessageFallback?: boolean;
173
+ }
174
+ /**
175
+ * Configuration interface for the Tracer class
176
+ */
177
+ export type TracerBrowserMasking = Pick<MaskingConfig, 'isContentMaskingEnabled' | 'maskBody' | 'maskHeaders' | 'maskBodyFieldsList' | 'maskHeadersList' | 'headersToInclude' | 'headersToExclude'>;
178
+ export interface TracerBrowserConfig extends BaseConfig {
179
+ /** Application name */
180
+ application: string;
181
+ /** Application version */
182
+ version: string;
183
+ /** Environment (e.g., 'production', 'staging') */
184
+ environment: string;
185
+ /** URLs to ignore during tracing */
186
+ ignoreUrls: Array<string | RegExp>;
187
+ /** Trace ID ratio for sampling */
188
+ sampleTraceRatio: number;
189
+ /** URLs for CORS trace header propagation */
190
+ propagateTraceHeaderCorsUrls: PropagateTraceHeaderCorsUrls;
191
+ /** Whether to schematize document span payload */
192
+ schemifyDocSpanPayload: boolean;
193
+ /** Maximum size for capturing HTTP payload */
194
+ maxCapturingHttpPayloadSize: number;
195
+ /** If true, captures body in traces
196
+ * @default true
197
+ */
198
+ captureBody: boolean;
199
+ /** If true, captures headers in traces
200
+ * @default true
201
+ */
202
+ captureHeaders: boolean;
203
+ /** Configuration for masking sensitive data in session recordings */
204
+ masking: TracerBrowserMasking;
205
+ }
206
+ /**
207
+ * Configuration interface for the Recorder class
208
+ */
209
+ export type RecorderMasking = Pick<MaskingConfig, 'maskAllInputs' | 'maskTextClass' | 'maskTextSelector' | 'maskInputOptions' | 'maskInput' | 'maskText' | 'maskConsoleEvent'>;
210
+ export interface RecorderConfig extends BaseConfig {
211
+ /** Whether to enable canvas recording */
212
+ recordCanvas: boolean;
213
+ /** Configuration for masking sensitive data in session recordings */
214
+ masking?: RecorderMasking;
215
+ }
216
+ /**
217
+ * Configuration interface for the SessionWidget class
218
+ */
219
+ export interface SessionWidgetConfig {
220
+ /** Whether to show the widget */
221
+ showWidget: boolean;
222
+ /** Placement of the widget button */
223
+ widgetButtonPlacement: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right';
224
+ /** Whether continuous recording feature is enabled */
225
+ showContinuousRecording: boolean;
226
+ /** Configuration for customizable UI text and labels */
227
+ widgetTextOverrides: WidgetTextOverridesConfig;
228
+ }
229
+ /**
230
+ * Interface for customizable widget text configuration
231
+ */
232
+ export interface WidgetTextOverridesConfig {
233
+ /** Title for the initial popover when continuous recording is enabled */
234
+ initialTitleWithContinuous?: string;
235
+ /** Title for the initial popover when continuous recording is disabled */
236
+ initialTitleWithoutContinuous?: string;
237
+ /** Description for the initial popover when continuous recording is enabled */
238
+ initialDescriptionWithContinuous?: string;
239
+ /** Description for the initial popover when continuous recording is disabled */
240
+ initialDescriptionWithoutContinuous?: string;
241
+ /** Label for the continuous recording toggle */
242
+ continuousRecordingLabel?: string;
243
+ /** Text for the start recording button */
244
+ startRecordingButtonText?: string;
245
+ /** Title for the final popover */
246
+ finalTitle?: string;
247
+ /** Description for the final popover */
248
+ finalDescription?: string;
249
+ /** Placeholder text for the comment textarea */
250
+ commentPlaceholder?: string;
251
+ /** Text for the save button in final popover */
252
+ saveButtonText?: string;
253
+ /** Text for the cancel button in final popover */
254
+ cancelButtonText?: string;
255
+ /** Title for the continuous recording overlay */
256
+ continuousOverlayTitle?: string;
257
+ /** Description for the continuous recording overlay */
258
+ continuousOverlayDescription?: string;
259
+ /** Text for the save last snapshot button */
260
+ saveLastSnapshotButtonText?: string;
261
+ /** Title for the submit session dialog */
262
+ submitDialogTitle?: string;
263
+ /** Subtitle for the submit session dialog */
264
+ submitDialogSubtitle?: string;
265
+ /** Label for the comment field in submit dialog */
266
+ submitDialogCommentLabel?: string;
267
+ /** Placeholder for the comment field in submit dialog */
268
+ submitDialogCommentPlaceholder?: string;
269
+ /** Text for the submit button in dialog */
270
+ submitDialogSubmitText?: string;
271
+ /** Text for the cancel button in dialog */
272
+ submitDialogCancelText?: string;
273
+ }
274
+ /**
275
+ * Configuration interface for the ApiService class
276
+ */
277
+ export interface ApiServiceConfig extends BaseConfig {
278
+ }
279
+ export interface SessionRecorderConfigs extends Required<SessionRecorderOptions> {
280
+ }
281
+ export declare enum SessionState {
282
+ started = "2",
283
+ paused = "1",
284
+ stopped = "0"
285
+ }
286
+ export type SessionRecorderEvents = 'state-change' | 'init' | 'error';
287
+ export interface ISessionRecorder extends Observable<SessionRecorderEvents> {
288
+ /**
289
+ * The current session ID
290
+ */
291
+ readonly sessionId: string | null;
292
+ /**
293
+ * Whether continuous recording is enabled
294
+ */
295
+ readonly continuousRecording: boolean;
296
+ /**
297
+ * The current debug session object
298
+ */
299
+ readonly session: ISession | null;
300
+ /**
301
+ * The type of session (plain or continuous)
302
+ */
303
+ readonly sessionType: SessionType;
304
+ /**
305
+ * The current state of the session
306
+ */
307
+ readonly sessionState: SessionState | null;
308
+ /**
309
+ * Session attributes for additional context
310
+ */
311
+ readonly sessionAttributes: Record<string, any>;
312
+ /**
313
+ * Current error message
314
+ */
315
+ error: string;
316
+ /**
317
+ * The HTML button element for the session widget's recorder button
318
+ */
319
+ readonly sessionWidgetButtonElement: HTMLButtonElement;
320
+ /**
321
+ * Provides access to navigation recording helpers
322
+ */
323
+ readonly navigation: NavigationRecorderPublicApi;
324
+ /**
325
+ * Initialize the session debugger with custom configurations
326
+ * @param configs - custom configurations for session debugger
327
+ */
328
+ init(configs: SessionRecorderOptions): void;
329
+ /**
330
+ * Save the continuous recording session
331
+ * @returns Promise that resolves to the save response
332
+ */
333
+ save(): Promise<any>;
334
+ /**
335
+ * Start a new session
336
+ * @param type - the type of session to start
337
+ * @param session - optional existing session to start
338
+ */
339
+ start(type?: SessionType, session?: ISession): void;
340
+ /**
341
+ * Stop the current session with an optional comment
342
+ * @param comment - user-provided comment to include in session feedback metadata
343
+ */
344
+ stop(comment?: string): Promise<void>;
345
+ /**
346
+ * Cancel the current session
347
+ */
348
+ cancel(): Promise<void>;
349
+ /**
350
+ * Pause the current session
351
+ */
352
+ pause(): Promise<void>;
353
+ /**
354
+ * Resume the current session
355
+ */
356
+ resume(): Promise<void>;
357
+ /**
358
+ * Set the session metadata
359
+ * @param attributes - the attributes to set
360
+ */
361
+ setSessionAttributes(attributes: Record<string, any>): void;
362
+ /**
363
+ * Set a custom click handler for the recording button
364
+ * @param handler - function that will be invoked when the button is clicked
365
+ */
366
+ set recordingButtonClickHandler(handler: () => boolean | void);
367
+ }
368
+ export type Breaker = {};
369
+ //# sourceMappingURL=sessionRecorder.d.ts.map
@@ -0,0 +1,14 @@
1
+ export var WidgetButtonPlacement;
2
+ (function (WidgetButtonPlacement) {
3
+ WidgetButtonPlacement["topLeft"] = "top-left";
4
+ WidgetButtonPlacement["topRight"] = "top-right";
5
+ WidgetButtonPlacement["bottomLeft"] = "bottom-left";
6
+ WidgetButtonPlacement["bottomRight"] = "bottom-right";
7
+ })(WidgetButtonPlacement || (WidgetButtonPlacement = {}));
8
+ export var SessionState;
9
+ (function (SessionState) {
10
+ SessionState["started"] = "2";
11
+ SessionState["paused"] = "1";
12
+ SessionState["stopped"] = "0";
13
+ })(SessionState || (SessionState = {}));
14
+ //# sourceMappingURL=sessionRecorder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessionRecorder.js","sourceRoot":"","sources":["../../src/types/sessionRecorder.ts"],"names":[],"mappings":"AAeA,MAAM,CAAN,IAAY,qBAKX;AALD,WAAY,qBAAqB;IAC/B,6CAAoB,CAAA;IACpB,+CAAsB,CAAA;IACtB,mDAA0B,CAAA;IAC1B,qDAA4B,CAAA;AAC9B,CAAC,EALW,qBAAqB,KAArB,qBAAqB,QAKhC;AAgTD,MAAM,CAAN,IAAY,YAIX;AAJD,WAAY,YAAY;IACtB,6BAAa,CAAA;IACb,4BAAY,CAAA;IACZ,6BAAa,CAAA;AACf,CAAC,EAJW,YAAY,KAAZ,YAAY,QAIvB"}
@@ -0,0 +1,11 @@
1
+ export type ToastType = 'success' | 'error';
2
+ export interface ToastConfig {
3
+ type: ToastType;
4
+ message: string;
5
+ button?: {
6
+ text?: string;
7
+ url?: string;
8
+ onClick?: () => void;
9
+ };
10
+ }
11
+ //# sourceMappingURL=widget.d.ts.map
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=widget.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"widget.js","sourceRoot":"","sources":["../../src/types/widget.ts"],"names":[],"mappings":""}
@@ -0,0 +1,4 @@
1
+ export declare function eachArray<E = any>(obj: E[] | null | undefined, iterator: (value: E, key: number) => void | any, thisArg?: any): void;
2
+ export declare function each(obj: any, iterator: (value: any, key: any) => void | any, thisArg?: any): void;
3
+ export declare const isValidRegex: (str: string) => boolean;
4
+ //# sourceMappingURL=array.d.ts.map
@@ -0,0 +1,50 @@
1
+ import { isArray, isFormData, isNullish } from './type-utils';
2
+ import { nativeForEach } from './globals';
3
+ const breaker = {};
4
+ export function eachArray(obj, iterator, thisArg) {
5
+ if (isArray(obj)) {
6
+ if (nativeForEach && obj.forEach === nativeForEach) {
7
+ obj.forEach(iterator, thisArg);
8
+ }
9
+ else if ('length' in obj && obj.length === +obj.length) {
10
+ for (let i = 0, l = obj.length; i < l; i++) {
11
+ if (i in obj && iterator.call(thisArg, obj[i], i) === breaker) {
12
+ return;
13
+ }
14
+ }
15
+ }
16
+ }
17
+ }
18
+ export function each(obj, iterator, thisArg) {
19
+ if (isNullish(obj)) {
20
+ return;
21
+ }
22
+ if (isArray(obj)) {
23
+ return eachArray(obj, iterator, thisArg);
24
+ }
25
+ if (isFormData(obj)) {
26
+ for (const pair of obj.entries()) {
27
+ if (iterator.call(thisArg, pair[1], pair[0]) === breaker) {
28
+ return;
29
+ }
30
+ }
31
+ return;
32
+ }
33
+ for (const key in obj) {
34
+ if (Object.prototype.hasOwnProperty.call(obj, key)) {
35
+ if (iterator.call(thisArg, obj[key], key) === breaker) {
36
+ return;
37
+ }
38
+ }
39
+ }
40
+ }
41
+ export const isValidRegex = function (str) {
42
+ try {
43
+ new RegExp(str);
44
+ }
45
+ catch (_a) {
46
+ return false;
47
+ }
48
+ return true;
49
+ };
50
+ //# sourceMappingURL=array.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"array.js","sourceRoot":"","sources":["../../src/utils/array.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AAEzC,MAAM,OAAO,GAAQ,EAAE,CAAA;AAEvB,MAAM,UAAU,SAAS,CACvB,GAA2B,EAC3B,QAA+C,EAC/C,OAAa;IAEb,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACjB,IAAI,aAAa,IAAI,GAAG,CAAC,OAAO,KAAK,aAAa,EAAE,CAAC;YACnD,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;QAChC,CAAC;aAAM,IAAI,QAAQ,IAAI,GAAG,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;YACzD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC3C,IAAI,CAAC,IAAI,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,OAAO,EAAE,CAAC;oBAC9D,OAAM;gBACR,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,GAAQ,EAAE,QAA8C,EAAE,OAAa;IAC1F,IAAI,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;QACnB,OAAM;IACR,CAAC;IACD,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACjB,OAAO,SAAS,CAAC,GAAG,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAA;IAC1C,CAAC;IACD,IAAI,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACpB,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC;YACjC,IAAI,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,OAAO,EAAE,CAAC;gBACzD,OAAM;YACR,CAAC;QACH,CAAC;QACD,OAAM;IACR,CAAC;IACD,KAAK,MAAM,GAAG,IAAI,GAAG,EAAE,CAAC;QACtB,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC;YACnD,IAAI,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,KAAK,OAAO,EAAE,CAAC;gBACtD,OAAM;YACR,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,YAAY,GAAG,UAAU,GAAW;IAC/C,IAAI,CAAC;QACH,IAAI,MAAM,CAAC,GAAG,CAAC,CAAA;IACjB,CAAC;IAAC,WAAM,CAAC;QACP,OAAO,KAAK,CAAA;IACd,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC,CAAA"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * DOM utility functions
3
+ */
4
+ export declare function insertTrustedHTML(element: HTMLElement, html: string): void;
5
+ //# sourceMappingURL=dom.d.ts.map
@@ -0,0 +1,9 @@
1
+ import DOMPurify from 'dompurify';
2
+ /**
3
+ * DOM utility functions
4
+ */
5
+ export function insertTrustedHTML(element, html) {
6
+ const sanitizedHTML = DOMPurify.sanitize(html, { RETURN_DOM: true });
7
+ element.replaceChildren(...Array.from(sanitizedHTML.childNodes));
8
+ }
9
+ //# sourceMappingURL=dom.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dom.js","sourceRoot":"","sources":["../../src/utils/dom.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,WAAW,CAAA;AAEjC;;GAEG;AAEH,MAAM,UAAU,iBAAiB,CAAC,OAAoB,EAAE,IAAY;IAClE,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAA;IAEpE,OAAO,CAAC,eAAe,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,CAAA;AAClE,CAAC"}
@@ -0,0 +1,24 @@
1
+ declare const win: (Window & typeof globalThis) | undefined;
2
+ export declare const ArrayProto: any[];
3
+ export declare const nativeForEach: (callbackfn: (value: any, index: number, array: any[]) => void, thisArg?: any) => void;
4
+ export declare const nativeIndexOf: (searchElement: any, fromIndex?: number) => number;
5
+ export declare const navigator: Navigator | undefined;
6
+ export declare const document: Document | undefined;
7
+ export declare const location: Location | undefined;
8
+ export declare const fetch: typeof globalThis.fetch | undefined;
9
+ export declare const XMLHttpRequest: {
10
+ new (): XMLHttpRequest;
11
+ prototype: XMLHttpRequest;
12
+ readonly UNSENT: 0;
13
+ readonly OPENED: 1;
14
+ readonly HEADERS_RECEIVED: 2;
15
+ readonly LOADING: 3;
16
+ readonly DONE: 4;
17
+ } | undefined;
18
+ export declare const AbortController: {
19
+ new (): AbortController;
20
+ prototype: AbortController;
21
+ } | undefined;
22
+ export declare const userAgent: string | undefined;
23
+ export { win as window };
24
+ //# sourceMappingURL=globals.d.ts.map
@@ -0,0 +1,14 @@
1
+ const win = typeof window !== 'undefined' ? window : undefined;
2
+ const global = typeof globalThis !== 'undefined' ? globalThis : win;
3
+ export const ArrayProto = Array.prototype;
4
+ export const nativeForEach = ArrayProto.forEach;
5
+ export const nativeIndexOf = ArrayProto.indexOf;
6
+ export const navigator = global === null || global === void 0 ? void 0 : global.navigator;
7
+ export const document = global === null || global === void 0 ? void 0 : global.document;
8
+ export const location = global === null || global === void 0 ? void 0 : global.location;
9
+ export const fetch = global === null || global === void 0 ? void 0 : global.fetch;
10
+ export const XMLHttpRequest = (global === null || global === void 0 ? void 0 : global.XMLHttpRequest) && 'withCredentials' in new global.XMLHttpRequest() ? global.XMLHttpRequest : undefined;
11
+ export const AbortController = global === null || global === void 0 ? void 0 : global.AbortController;
12
+ export const userAgent = navigator === null || navigator === void 0 ? void 0 : navigator.userAgent;
13
+ export { win as window };
14
+ //# sourceMappingURL=globals.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"globals.js","sourceRoot":"","sources":["../../src/utils/globals.ts"],"names":[],"mappings":"AAAA,MAAM,GAAG,GAA6C,OAAO,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAA;AAExG,MAAM,MAAM,GAAkC,OAAO,UAAU,KAAK,WAAW,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAA;AAElG,MAAM,CAAC,MAAM,UAAU,GAAG,KAAK,CAAC,SAAS,CAAA;AACzC,MAAM,CAAC,MAAM,aAAa,GAAG,UAAU,CAAC,OAAO,CAAA;AAG/C,MAAM,CAAC,MAAM,aAAa,GAAG,UAAU,CAAC,OAAO,CAAA;AAE/C,MAAM,CAAC,MAAM,SAAS,GAAG,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,SAAS,CAAA;AAC1C,MAAM,CAAC,MAAM,QAAQ,GAAG,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,QAAQ,CAAA;AACxC,MAAM,CAAC,MAAM,QAAQ,GAAG,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,QAAQ,CAAA;AACxC,MAAM,CAAC,MAAM,KAAK,GAAG,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,KAAK,CAAA;AAClC,MAAM,CAAC,MAAM,cAAc,GACvB,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,cAAc,KAAI,iBAAiB,IAAI,IAAI,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,CAAA;AAClH,MAAM,CAAC,MAAM,eAAe,GAAG,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,eAAe,CAAA;AACtD,MAAM,CAAC,MAAM,SAAS,GAAG,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,SAAS,CAAA;AAG7C,OAAO,EAAE,GAAG,IAAI,MAAM,EAAE,CAAA"}
@@ -0,0 +1,9 @@
1
+ export * from './navigator';
2
+ export * from './storage';
3
+ export * from './time';
4
+ export * from './session';
5
+ export * from './dom';
6
+ export * from './array';
7
+ export * from './type-utils';
8
+ export * from './globals';
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,10 @@
1
+ // Export all utility functions
2
+ export * from './navigator';
3
+ export * from './storage';
4
+ export * from './time';
5
+ export * from './session';
6
+ export * from './dom';
7
+ export * from './array';
8
+ export * from './type-utils';
9
+ export * from './globals';
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,cAAc,aAAa,CAAA;AAC3B,cAAc,WAAW,CAAA;AACzB,cAAc,QAAQ,CAAA;AACtB,cAAc,WAAW,CAAA;AACzB,cAAc,OAAO,CAAA;AACrB,cAAc,SAAS,CAAA;AACvB,cAAc,cAAc,CAAA;AAC5B,cAAc,WAAW,CAAA"}
@@ -0,0 +1,3 @@
1
+ import { IResourceAttributes } from '../types';
2
+ export declare const getNavigatorInfo: () => IResourceAttributes;
3
+ //# sourceMappingURL=navigator.d.ts.map
@@ -0,0 +1,83 @@
1
+ import { PACKAGE_VERSION_EXPORT } from '../config/constants';
2
+ export const getNavigatorInfo = () => {
3
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
4
+ let browserInfo = 'Unknown';
5
+ let deviceInfo = 'Unknown';
6
+ let osInfo = 'Unknown';
7
+ if (navigator.userAgent) {
8
+ const userAgent = navigator.userAgent;
9
+ // Detect device type
10
+ if (/Mobi|Android|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(userAgent)) {
11
+ deviceInfo = 'Mobile';
12
+ }
13
+ else if (/Tablet|iPad/i.test(userAgent)) {
14
+ deviceInfo = 'Tablet';
15
+ }
16
+ else {
17
+ // Default to desktop for other cases
18
+ deviceInfo = 'Desktop';
19
+ }
20
+ // Detect browser and version
21
+ if (userAgent.includes('Firefox')) {
22
+ browserInfo = `Mozilla Firefox ${((_a = userAgent.match(/Firefox\/(\d+\.\d+)/)) === null || _a === void 0 ? void 0 : _a[1]) || ''}`;
23
+ }
24
+ else if (userAgent.includes('Chrome') && !userAgent.includes('Edg')) {
25
+ browserInfo = `Google Chrome ${((_b = userAgent.match(/Chrome\/(\d+\.\d+)/)) === null || _b === void 0 ? void 0 : _b[1]) || ''}`;
26
+ }
27
+ else if (userAgent.includes('Edg')) {
28
+ browserInfo = `Microsoft Edge ${((_c = userAgent.match(/Edg\/(\d+\.\d+)/)) === null || _c === void 0 ? void 0 : _c[1]) || ''}`;
29
+ }
30
+ else if (userAgent.includes('Safari') && !userAgent.includes('Chrome')) {
31
+ browserInfo = `Safari ${((_d = userAgent.match(/Version\/(\d+\.\d+)/)) === null || _d === void 0 ? void 0 : _d[1]) || ''}`;
32
+ }
33
+ else if (userAgent.includes('Opera') || userAgent.includes('OPR')) {
34
+ browserInfo = `Opera ${((_e = userAgent.match(/(Opera|OPR)\/(\d+\.\d+)/)) === null || _e === void 0 ? void 0 : _e[2]) || ''}`;
35
+ }
36
+ else if (userAgent.includes('Trident')) {
37
+ browserInfo = `Internet Explorer ${((_f = userAgent.match(/rv:(\d+\.\d+)/)) === null || _f === void 0 ? void 0 : _f[1]) || ''}`;
38
+ }
39
+ else {
40
+ browserInfo = 'Unknown browser';
41
+ }
42
+ // Detect OS and version
43
+ if (userAgent.includes('Win')) {
44
+ osInfo = `Windows ${((_g = userAgent.match(/Windows NT (\d+\.\d+)/)) === null || _g === void 0 ? void 0 : _g[1]) || ''}`;
45
+ }
46
+ else if (userAgent.includes('Mac')) {
47
+ osInfo = `MacOS ${((_h = userAgent.match(/Mac OS X (\d+_\d+)/)) === null || _h === void 0 ? void 0 : _h[1].replace('_', '.')) || ''}`;
48
+ }
49
+ else if (userAgent.includes('Linux')) {
50
+ osInfo = 'Linux';
51
+ }
52
+ else if (userAgent.includes('Android')) {
53
+ osInfo = `Android ${((_j = userAgent.match(/Android (\d+\.\d+)/)) === null || _j === void 0 ? void 0 : _j[1]) || ''}`;
54
+ }
55
+ else if (userAgent.includes('iPhone') || userAgent.includes('iPad')) {
56
+ osInfo = `iOS ${((_k = userAgent.match(/OS (\d+_\d+)/)) === null || _k === void 0 ? void 0 : _k[1].replace('_', '.')) || ''}`;
57
+ }
58
+ else {
59
+ osInfo = 'Unknown OS';
60
+ }
61
+ }
62
+ const hardwareConcurrency = navigator.hardwareConcurrency || 1;
63
+ const cookiesEnabled = navigator.cookieEnabled ? 'Yes' : 'No';
64
+ const pixelRatio = window.devicePixelRatio || 1;
65
+ const screenSize = `${window.screen.width}x${window.screen.height}`;
66
+ // Get package version from constants
67
+ const packageVersion = PACKAGE_VERSION_EXPORT;
68
+ return {
69
+ osInfo,
70
+ screenSize,
71
+ pixelRatio,
72
+ deviceInfo,
73
+ browserInfo,
74
+ cookiesEnabled,
75
+ hardwareConcurrency,
76
+ packageVersion,
77
+ // System type identifier (previously in system tags)
78
+ systemType: 'web',
79
+ // Platform identifier (previously in system tags)
80
+ platform: osInfo,
81
+ };
82
+ };
83
+ //# sourceMappingURL=navigator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"navigator.js","sourceRoot":"","sources":["../../src/utils/navigator.ts"],"names":[],"mappings":"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"}