@multiplayer-app/session-recorder-browser 1.2.22 → 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.
- 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 +7 -2
- 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,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 @@
|
|
|
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,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,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,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":"AACA,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAA;AAE5D,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAwB,EAAE;;IACxD,IAAI,WAAW,GAAW,SAAS,CAAA;IACnC,IAAI,UAAU,GAAW,SAAS,CAAA;IAClC,IAAI,MAAM,GAAW,SAAS,CAAA;IAE9B,IAAI,SAAS,CAAC,SAAS,EAAE,CAAC;QACxB,MAAM,SAAS,GAAG,SAAS,CAAC,SAAS,CAAA;QAErC,qBAAqB;QACrB,IAAI,+DAA+D,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;YACpF,UAAU,GAAG,QAAQ,CAAA;QACvB,CAAC;aAAM,IAAI,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;YAC1C,UAAU,GAAG,QAAQ,CAAA;QACvB,CAAC;aAAM,CAAC;YACN,qCAAqC;YACrC,UAAU,GAAG,SAAS,CAAA;QACxB,CAAC;QAED,6BAA6B;QAC7B,IAAI,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;YAClC,WAAW,GAAG,mBAAmB,CAAA,MAAA,SAAS,CAAC,KAAK,CAAC,qBAAqB,CAAC,0CAAG,CAAC,CAAC,KAAI,EAAE,EAAE,CAAA;QACtF,CAAC;aAAM,IAAI,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACtE,WAAW,GAAG,iBAAiB,CAAA,MAAA,SAAS,CAAC,KAAK,CAAC,oBAAoB,CAAC,0CAAG,CAAC,CAAC,KAAI,EAAE,EAAE,CAAA;QACnF,CAAC;aAAM,IAAI,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACrC,WAAW,GAAG,kBAAkB,CAAA,MAAA,SAAS,CAAC,KAAK,CAAC,iBAAiB,CAAC,0CAAG,CAAC,CAAC,KAAI,EAAE,EAAE,CAAA;QACjF,CAAC;aAAM,IAAI,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzE,WAAW,GAAG,UAAU,CAAA,MAAA,SAAS,CAAC,KAAK,CAAC,qBAAqB,CAAC,0CAAG,CAAC,CAAC,KAAI,EAAE,EAAE,CAAA;QAC7E,CAAC;aAAM,IAAI,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACpE,WAAW,GAAG,SAAS,CAAA,MAAA,SAAS,CAAC,KAAK,CAAC,yBAAyB,CAAC,0CAAG,CAAC,CAAC,KAAI,EAAE,EAAE,CAAA;QAChF,CAAC;aAAM,IAAI,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;YACzC,WAAW,GAAG,qBAAqB,CAAA,MAAA,SAAS,CAAC,KAAK,CAAC,eAAe,CAAC,0CAAG,CAAC,CAAC,KAAI,EAAE,EAAE,CAAA;QAClF,CAAC;aAAM,CAAC;YACN,WAAW,GAAG,iBAAiB,CAAA;QACjC,CAAC;QAED,wBAAwB;QACxB,IAAI,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9B,MAAM,GAAG,WAAW,CAAA,MAAA,SAAS,CAAC,KAAK,CAAC,uBAAuB,CAAC,0CAAG,CAAC,CAAC,KAAI,EAAE,EAAE,CAAA;QAC3E,CAAC;aAAM,IAAI,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACrC,MAAM,GAAG,SAAS,CAAA,MAAA,SAAS,CAAC,KAAK,CAAC,oBAAoB,CAAC,0CAAG,CAAC,EAAE,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,KAAI,EAAE,EAAE,CAAA;QACxF,CAAC;aAAM,IAAI,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YACvC,MAAM,GAAG,OAAO,CAAA;QAClB,CAAC;aAAM,IAAI,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;YACzC,MAAM,GAAG,WAAW,CAAA,MAAA,SAAS,CAAC,KAAK,CAAC,oBAAoB,CAAC,0CAAG,CAAC,CAAC,KAAI,EAAE,EAAE,CAAA;QACxE,CAAC;aAAM,IAAI,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YACtE,MAAM,GAAG,OAAO,CAAA,MAAA,SAAS,CAAC,KAAK,CAAC,cAAc,CAAC,0CAAG,CAAC,EAAE,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,KAAI,EAAE,EAAE,CAAA;QAChF,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,YAAY,CAAA;QACvB,CAAC;IACH,CAAC;IAED,MAAM,mBAAmB,GAAG,SAAS,CAAC,mBAAmB,IAAI,CAAC,CAAA;IAC9D,MAAM,cAAc,GAAG,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAA;IAC7D,MAAM,UAAU,GAAG,MAAM,CAAC,gBAAgB,IAAI,CAAC,CAAA;IAC/C,MAAM,UAAU,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,CAAA;IAEnE,qCAAqC;IACrC,MAAM,cAAc,GAAG,sBAAsB,CAAA;IAE7C,OAAO;QACL,MAAM;QACN,UAAU;QACV,UAAU;QACV,UAAU;QACV,WAAW;QACX,cAAc;QACd,mBAAmB;QACnB,cAAc;QACd,qDAAqD;QACrD,UAAU,EAAE,KAAK;QACjB,kDAAkD;QAClD,QAAQ,EAAE,MAAM;KACjB,CAAA;AACH,CAAC,CAAA"}
|