@pydantic/logfire-session-replay 0.5.0 → 0.6.0
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/README.md +21 -5
- package/dist/{index-CGSeVpsY.d.cts → index-BxzwrVOz.d.cts} +56 -35
- package/dist/{index-CGSeVpsY.d.ts → index-BxzwrVOz.d.ts} +56 -35
- package/dist/index.cjs +1 -1
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +1 -1
- package/dist/integration.d.cts +8 -10
- package/dist/integration.d.ts +8 -10
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -158,6 +158,14 @@ configured cadence. After five minutes without activity, background events use
|
|
|
158
158
|
the greater of `flushIntervalMs` and five minutes. After the replay reaches its
|
|
159
159
|
minimum duration, reaching `maxBufferBytes` still flushes immediately.
|
|
160
160
|
|
|
161
|
+
Normal recording takes a full-DOM checkpoint on the first recorded incremental
|
|
162
|
+
event after five minutes since the previous full snapshot. Each checkpoint
|
|
163
|
+
starts a new upload chunk with its `Meta` and `FullSnapshot` pair. This does not
|
|
164
|
+
change the upload cadence. Error-buffered recording retains its two-minute
|
|
165
|
+
checkpoint interval. If `minSessionDurationMs` exceeds five minutes, normal
|
|
166
|
+
recording uses that longer checkpoint interval so replacement snapshots cannot
|
|
167
|
+
restart the minimum-duration gate before it completes.
|
|
168
|
+
|
|
161
169
|
Replays must contain at least `minSessionDurationMs` of recorded events (10
|
|
162
170
|
seconds by default) before they are uploaded. While waiting, events stay
|
|
163
171
|
buffered. The initial `Meta` and `FullSnapshot` anchor is retained even when it
|
|
@@ -267,8 +275,8 @@ The recorder uses a Sentry-style two-rate model:
|
|
|
267
275
|
|
|
268
276
|
- `sessionSampleRate`: records the current browser session continuously
|
|
269
277
|
- `onErrorSampleRate`: for sessions not selected by `sessionSampleRate`, keeps
|
|
270
|
-
an in-memory replay buffer and promotes it
|
|
271
|
-
or `
|
|
278
|
+
an in-memory replay buffer and promotes it for an uncaught `window.error` or
|
|
279
|
+
`unhandledrejection`, or for an error passed to `captureError()`
|
|
272
280
|
|
|
273
281
|
Buffer mode is bounded by `maxBufferBytes`, measured as the UTF-8 byte sum of
|
|
274
282
|
event JSON before envelope metadata and compression. It keeps the latest full
|
|
@@ -284,8 +292,14 @@ properties. A sampled-off session keeps only a lightweight session-id monitor;
|
|
|
284
292
|
it does not start rrweb or patch console, network, or navigation globals, and a
|
|
285
293
|
later sampled session can begin recording without reloading the page.
|
|
286
294
|
|
|
287
|
-
|
|
288
|
-
|
|
295
|
+
Pass a caught error to `replay.captureError(error)` to add it to the replay and
|
|
296
|
+
promote the buffer, as an uncaught error does. For an error that occurred
|
|
297
|
+
earlier, pass `{ timestamp }` in epoch milliseconds; the error event records it. An error object is added once,
|
|
298
|
+
even when it is also uncaught later. `console.error` does not promote the buffer.
|
|
299
|
+
|
|
300
|
+
Set `captureGlobalErrors: false` when another layer listens for uncaught errors
|
|
301
|
+
and forwards them through `captureError()`. The replay then installs no `error`
|
|
302
|
+
or `unhandledrejection` listeners.
|
|
289
303
|
|
|
290
304
|
`stop()` is awaitable and flushes the final chunk before resolving.
|
|
291
305
|
|
|
@@ -317,7 +331,9 @@ logfire.configure({
|
|
|
317
331
|
```
|
|
318
332
|
|
|
319
333
|
The browser package owns RUM session identity, span correlation attributes, and
|
|
320
|
-
cleanup ordering.
|
|
334
|
+
cleanup ordering. It also reports uncaught errors as spans and passes every
|
|
335
|
+
`reportError()` call to `captureError()`, so a handled error that the
|
|
336
|
+
application reports promotes an error-buffered replay. Call `startSessionReplay()` directly only for standalone or
|
|
321
337
|
advanced integrations that do not use `@pydantic/logfire-browser`.
|
|
322
338
|
|
|
323
339
|
## Local Development Notes
|
|
@@ -89,37 +89,39 @@ interface ChunkEnvelope {
|
|
|
89
89
|
events: RrwebEvent[];
|
|
90
90
|
}
|
|
91
91
|
/**
|
|
92
|
-
* Early Access session replay recorder configuration. Keep browser replay
|
|
93
|
-
* rollout behind an application flag.
|
|
94
|
-
*/
|
|
92
|
+
* Early Access session replay recorder configuration. Keep browser replay
|
|
93
|
+
* rollout behind an application flag.
|
|
94
|
+
*/
|
|
95
95
|
interface SessionReplayConfig {
|
|
96
96
|
/**
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
97
|
+
* Browser-safe replay upload endpoint, either direct Logfire ingest with a
|
|
98
|
+
* restricted frontend application token or an application-owned proxy. The
|
|
99
|
+
* SDK posts to `${replayUrl}/${recordingId}?seq=${seq}`. A replay continues
|
|
100
|
+
* across same-tab reloads/navigations; a new tab gets a separate recording id.
|
|
101
|
+
*/
|
|
101
102
|
replayUrl: string;
|
|
102
103
|
/**
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
104
|
+
* Headers added to each replay upload. Direct Logfire ingest uses the same
|
|
105
|
+
* restricted frontend application headers as traces and metrics.
|
|
106
|
+
*/
|
|
106
107
|
headers?: () => MaybePromise<Record<string, string>>;
|
|
107
108
|
/**
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
109
|
+
* Convenience token source. A non-empty value removes any case-insensitive
|
|
110
|
+
* Authorization entry returned by `headers`, then sets
|
|
111
|
+
* `Authorization: Bearer ${token}`. Only restricted frontend application
|
|
112
|
+
* tokens are safe in browsers.
|
|
113
|
+
*/
|
|
113
114
|
token?: string | (() => MaybePromise<string>);
|
|
114
115
|
/**
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
116
|
+
* Optional external session id source. The browser SDK integration should
|
|
117
|
+
* pass its RUM session id here. This controls sampling and session rotation;
|
|
118
|
+
* it is not used as the upload/playback id (see `getRecordingId()`).
|
|
119
|
+
*/
|
|
118
120
|
getSessionId?: () => string | undefined;
|
|
119
121
|
/**
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
122
|
+
* Returns low-cardinality, non-PII dimensions to snapshot once per replay
|
|
123
|
+
* session. Invalid or oversized entries are omitted.
|
|
124
|
+
*/
|
|
123
125
|
getSessionAttributes?: () => SessionAttributesInput;
|
|
124
126
|
/** Probability of recording each new browser session in full. */
|
|
125
127
|
sessionSampleRate?: number;
|
|
@@ -136,19 +138,26 @@ interface SessionReplayConfig {
|
|
|
136
138
|
/** Minimum recording duration before a replay is uploaded. Defaults to 10 seconds. */
|
|
137
139
|
minSessionDurationMs?: number;
|
|
138
140
|
sessionIdleTimeoutMs?: number;
|
|
141
|
+
/** Maximum recording duration before the session ID rotates. Defaults to 2 hours. */
|
|
139
142
|
maxSessionDurationMs?: number;
|
|
140
143
|
distinctId?: string;
|
|
141
144
|
getDistinctId?: () => string | undefined;
|
|
142
145
|
/**
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
146
|
+
* Returns the current user, snapshotted for every chunk as `meta.user`. Only
|
|
147
|
+
* a non-empty `id`, `name` and `email` are kept; name and email are optional
|
|
148
|
+
* personal data. Without `getDistinctId`, the same snapshot's `id` becomes
|
|
149
|
+
* `meta.distinctId`.
|
|
150
|
+
*/
|
|
148
151
|
getUser?: () => ReplayUser | undefined;
|
|
149
152
|
captureConsole?: boolean;
|
|
150
153
|
captureNetwork?: boolean;
|
|
151
154
|
captureNavigation?: boolean;
|
|
155
|
+
/**
|
|
156
|
+
* Listen for uncaught `error` and `unhandledrejection` events, add them to the replay, and
|
|
157
|
+
* promote an error-sampled buffer. Defaults to true. The browser SDK turns this off when it
|
|
158
|
+
* captures global errors itself and forwards them through `captureError()`.
|
|
159
|
+
*/
|
|
160
|
+
captureGlobalErrors?: boolean;
|
|
152
161
|
ignoreUrlPatterns?: RegExp[];
|
|
153
162
|
redactUrlPatterns?: RegExp[];
|
|
154
163
|
onError?: (error: unknown) => void;
|
|
@@ -159,10 +168,10 @@ interface SessionReplayConfig {
|
|
|
159
168
|
//#endregion
|
|
160
169
|
//#region src/uploadError.d.ts
|
|
161
170
|
/**
|
|
162
|
-
* - `unconfirmed`: retries ended after a request reached the network; the server may hold the chunk.
|
|
163
|
-
* - `rejected`: the server answered with a terminal HTTP status.
|
|
164
|
-
* - `not-sent`: no request reached the network (queue full, compression, headers or token failed).
|
|
165
|
-
*/
|
|
171
|
+
* - `unconfirmed`: retries ended after a request reached the network; the server may hold the chunk.
|
|
172
|
+
* - `rejected`: the server answered with a terminal HTTP status.
|
|
173
|
+
* - `not-sent`: no request reached the network (queue full, compression, headers or token failed).
|
|
174
|
+
*/
|
|
166
175
|
type ReplayUploadFailureReason = "unconfirmed" | "rejected" | "not-sent";
|
|
167
176
|
interface ReplayUploadErrorInit {
|
|
168
177
|
cause: unknown;
|
|
@@ -173,10 +182,10 @@ interface ReplayUploadErrorInit {
|
|
|
173
182
|
status?: number | undefined;
|
|
174
183
|
}
|
|
175
184
|
/**
|
|
176
|
-
* Reported through `onError` when a replay chunk is not confirmed by the server.
|
|
177
|
-
* Recording continues from a fresh full snapshot, so `droppedSeqs` lists the
|
|
178
|
-
* later chunks that were discarded because they depended on the lost one.
|
|
179
|
-
*/
|
|
185
|
+
* Reported through `onError` when a replay chunk is not confirmed by the server.
|
|
186
|
+
* Recording continues from a fresh full snapshot, so `droppedSeqs` lists the
|
|
187
|
+
* later chunks that were discarded because they depended on the lost one.
|
|
188
|
+
*/
|
|
180
189
|
declare class ReplayUploadError extends Error {
|
|
181
190
|
readonly droppedSeqs: readonly number[];
|
|
182
191
|
readonly reason: ReplayUploadFailureReason;
|
|
@@ -191,9 +200,21 @@ interface SessionReplay {
|
|
|
191
200
|
readonly recording: boolean;
|
|
192
201
|
readonly mode: "full" | "buffer" | "off";
|
|
193
202
|
getSessionId(): string;
|
|
203
|
+
/**
|
|
204
|
+
* Add an error to the replay and promote an error-sampled buffer, as an uncaught error does.
|
|
205
|
+
* The same error object is added once, however many times it is captured. Pass the time the
|
|
206
|
+
* error occurred, in epoch milliseconds, when it is captured later; the error event records it
|
|
207
|
+
* as `timestamp`.
|
|
208
|
+
*/
|
|
209
|
+
captureError(error: unknown, options?: CaptureErrorOptions): void;
|
|
210
|
+
/** The current DOM recording's upload/playback id; distinct from the RUM session id. */
|
|
211
|
+
getRecordingId(): string;
|
|
194
212
|
flush(): Promise<void>;
|
|
195
213
|
stop(): Promise<void>;
|
|
196
214
|
}
|
|
215
|
+
interface CaptureErrorOptions {
|
|
216
|
+
timestamp?: number;
|
|
217
|
+
}
|
|
197
218
|
declare function startSessionReplay(config: SessionReplayConfig): SessionReplay;
|
|
198
219
|
//#endregion
|
|
199
|
-
export { SessionReplayConfig as S,
|
|
220
|
+
export { SessionReplayConfig as C, SessionAttributesInput as S, ReplayUser as _, ReplayUploadErrorInit as a, SessionAttributeValue as b, ChunkEnvelope as c, CustomTag as d, EventType as f, NetworkPayload as g, NavigationPayload as h, ReplayUploadError as i, ChunkMeta as l, MouseInteractions as m, SessionReplay as n, ReplayUploadFailureReason as o, IncrementalSource as p, startSessionReplay as r, CHUNK_ENVELOPE_VERSION as s, CaptureErrorOptions as t, ConsolePayload as u, RrwebEvent as v, SessionAttributes as x, SamplingMode as y };
|
|
@@ -89,37 +89,39 @@ interface ChunkEnvelope {
|
|
|
89
89
|
events: RrwebEvent[];
|
|
90
90
|
}
|
|
91
91
|
/**
|
|
92
|
-
* Early Access session replay recorder configuration. Keep browser replay
|
|
93
|
-
* rollout behind an application flag.
|
|
94
|
-
*/
|
|
92
|
+
* Early Access session replay recorder configuration. Keep browser replay
|
|
93
|
+
* rollout behind an application flag.
|
|
94
|
+
*/
|
|
95
95
|
interface SessionReplayConfig {
|
|
96
96
|
/**
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
97
|
+
* Browser-safe replay upload endpoint, either direct Logfire ingest with a
|
|
98
|
+
* restricted frontend application token or an application-owned proxy. The
|
|
99
|
+
* SDK posts to `${replayUrl}/${recordingId}?seq=${seq}`. A replay continues
|
|
100
|
+
* across same-tab reloads/navigations; a new tab gets a separate recording id.
|
|
101
|
+
*/
|
|
101
102
|
replayUrl: string;
|
|
102
103
|
/**
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
104
|
+
* Headers added to each replay upload. Direct Logfire ingest uses the same
|
|
105
|
+
* restricted frontend application headers as traces and metrics.
|
|
106
|
+
*/
|
|
106
107
|
headers?: () => MaybePromise<Record<string, string>>;
|
|
107
108
|
/**
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
109
|
+
* Convenience token source. A non-empty value removes any case-insensitive
|
|
110
|
+
* Authorization entry returned by `headers`, then sets
|
|
111
|
+
* `Authorization: Bearer ${token}`. Only restricted frontend application
|
|
112
|
+
* tokens are safe in browsers.
|
|
113
|
+
*/
|
|
113
114
|
token?: string | (() => MaybePromise<string>);
|
|
114
115
|
/**
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
116
|
+
* Optional external session id source. The browser SDK integration should
|
|
117
|
+
* pass its RUM session id here. This controls sampling and session rotation;
|
|
118
|
+
* it is not used as the upload/playback id (see `getRecordingId()`).
|
|
119
|
+
*/
|
|
118
120
|
getSessionId?: () => string | undefined;
|
|
119
121
|
/**
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
122
|
+
* Returns low-cardinality, non-PII dimensions to snapshot once per replay
|
|
123
|
+
* session. Invalid or oversized entries are omitted.
|
|
124
|
+
*/
|
|
123
125
|
getSessionAttributes?: () => SessionAttributesInput;
|
|
124
126
|
/** Probability of recording each new browser session in full. */
|
|
125
127
|
sessionSampleRate?: number;
|
|
@@ -136,19 +138,26 @@ interface SessionReplayConfig {
|
|
|
136
138
|
/** Minimum recording duration before a replay is uploaded. Defaults to 10 seconds. */
|
|
137
139
|
minSessionDurationMs?: number;
|
|
138
140
|
sessionIdleTimeoutMs?: number;
|
|
141
|
+
/** Maximum recording duration before the session ID rotates. Defaults to 2 hours. */
|
|
139
142
|
maxSessionDurationMs?: number;
|
|
140
143
|
distinctId?: string;
|
|
141
144
|
getDistinctId?: () => string | undefined;
|
|
142
145
|
/**
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
146
|
+
* Returns the current user, snapshotted for every chunk as `meta.user`. Only
|
|
147
|
+
* a non-empty `id`, `name` and `email` are kept; name and email are optional
|
|
148
|
+
* personal data. Without `getDistinctId`, the same snapshot's `id` becomes
|
|
149
|
+
* `meta.distinctId`.
|
|
150
|
+
*/
|
|
148
151
|
getUser?: () => ReplayUser | undefined;
|
|
149
152
|
captureConsole?: boolean;
|
|
150
153
|
captureNetwork?: boolean;
|
|
151
154
|
captureNavigation?: boolean;
|
|
155
|
+
/**
|
|
156
|
+
* Listen for uncaught `error` and `unhandledrejection` events, add them to the replay, and
|
|
157
|
+
* promote an error-sampled buffer. Defaults to true. The browser SDK turns this off when it
|
|
158
|
+
* captures global errors itself and forwards them through `captureError()`.
|
|
159
|
+
*/
|
|
160
|
+
captureGlobalErrors?: boolean;
|
|
152
161
|
ignoreUrlPatterns?: RegExp[];
|
|
153
162
|
redactUrlPatterns?: RegExp[];
|
|
154
163
|
onError?: (error: unknown) => void;
|
|
@@ -159,10 +168,10 @@ interface SessionReplayConfig {
|
|
|
159
168
|
//#endregion
|
|
160
169
|
//#region src/uploadError.d.ts
|
|
161
170
|
/**
|
|
162
|
-
* - `unconfirmed`: retries ended after a request reached the network; the server may hold the chunk.
|
|
163
|
-
* - `rejected`: the server answered with a terminal HTTP status.
|
|
164
|
-
* - `not-sent`: no request reached the network (queue full, compression, headers or token failed).
|
|
165
|
-
*/
|
|
171
|
+
* - `unconfirmed`: retries ended after a request reached the network; the server may hold the chunk.
|
|
172
|
+
* - `rejected`: the server answered with a terminal HTTP status.
|
|
173
|
+
* - `not-sent`: no request reached the network (queue full, compression, headers or token failed).
|
|
174
|
+
*/
|
|
166
175
|
type ReplayUploadFailureReason = "unconfirmed" | "rejected" | "not-sent";
|
|
167
176
|
interface ReplayUploadErrorInit {
|
|
168
177
|
cause: unknown;
|
|
@@ -173,10 +182,10 @@ interface ReplayUploadErrorInit {
|
|
|
173
182
|
status?: number | undefined;
|
|
174
183
|
}
|
|
175
184
|
/**
|
|
176
|
-
* Reported through `onError` when a replay chunk is not confirmed by the server.
|
|
177
|
-
* Recording continues from a fresh full snapshot, so `droppedSeqs` lists the
|
|
178
|
-
* later chunks that were discarded because they depended on the lost one.
|
|
179
|
-
*/
|
|
185
|
+
* Reported through `onError` when a replay chunk is not confirmed by the server.
|
|
186
|
+
* Recording continues from a fresh full snapshot, so `droppedSeqs` lists the
|
|
187
|
+
* later chunks that were discarded because they depended on the lost one.
|
|
188
|
+
*/
|
|
180
189
|
declare class ReplayUploadError extends Error {
|
|
181
190
|
readonly droppedSeqs: readonly number[];
|
|
182
191
|
readonly reason: ReplayUploadFailureReason;
|
|
@@ -191,9 +200,21 @@ interface SessionReplay {
|
|
|
191
200
|
readonly recording: boolean;
|
|
192
201
|
readonly mode: "full" | "buffer" | "off";
|
|
193
202
|
getSessionId(): string;
|
|
203
|
+
/**
|
|
204
|
+
* Add an error to the replay and promote an error-sampled buffer, as an uncaught error does.
|
|
205
|
+
* The same error object is added once, however many times it is captured. Pass the time the
|
|
206
|
+
* error occurred, in epoch milliseconds, when it is captured later; the error event records it
|
|
207
|
+
* as `timestamp`.
|
|
208
|
+
*/
|
|
209
|
+
captureError(error: unknown, options?: CaptureErrorOptions): void;
|
|
210
|
+
/** The current DOM recording's upload/playback id; distinct from the RUM session id. */
|
|
211
|
+
getRecordingId(): string;
|
|
194
212
|
flush(): Promise<void>;
|
|
195
213
|
stop(): Promise<void>;
|
|
196
214
|
}
|
|
215
|
+
interface CaptureErrorOptions {
|
|
216
|
+
timestamp?: number;
|
|
217
|
+
}
|
|
197
218
|
declare function startSessionReplay(config: SessionReplayConfig): SessionReplay;
|
|
198
219
|
//#endregion
|
|
199
|
-
export { SessionReplayConfig as S,
|
|
220
|
+
export { SessionReplayConfig as C, SessionAttributesInput as S, ReplayUser as _, ReplayUploadErrorInit as a, SessionAttributeValue as b, ChunkEnvelope as c, CustomTag as d, EventType as f, NetworkPayload as g, NavigationPayload as h, ReplayUploadError as i, ChunkMeta as l, MouseInteractions as m, SessionReplay as n, ReplayUploadFailureReason as o, IncrementalSource as p, startSessionReplay as r, CHUNK_ENVELOPE_VERSION as s, CaptureErrorOptions as t, ConsolePayload as u, RrwebEvent as v, SessionAttributes as x, SamplingMode as y };
|
package/dist/index.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let e=require("@rrweb/record"),t=require("fflate");const n={DomContentLoaded:0,Load:1,FullSnapshot:2,IncrementalSnapshot:3,Meta:4,Custom:5,Plugin:6},r={Mutation:0,MouseMove:1,MouseInteraction:2,Scroll:3,ViewportResize:4,Input:5,TouchMove:6,MediaInteraction:7,Drag:12,Selection:14},i={MouseUp:0,MouseDown:1,Click:2,ContextMenu:3,DblClick:4},a={Error:`logfire.error`,Console:`logfire.console`,Network:`logfire.network`,Navigation:`logfire.navigation`},o={sessionSampleRate:1,onErrorSampleRate:1,maskAllText:!0,maskAllInputs:!0,maskTextSelector:``,blockSelector:``,flushIntervalMs:5e3,maxBufferBytes:1e6,minSessionDurationMs:1e4,sessionIdleTimeoutMs:18e5,maxSessionDurationMs:144e5,distinctId:``,captureConsole:!1,captureNetwork:!0,captureNavigation:!0,redactUrlPatterns:[/.+/u]},s=new Set([r.MouseMove,r.MouseInteraction,r.Scroll,r.ViewportResize,r.Input,r.TouchMove,r.MediaInteraction,r.Drag,r.Selection]);function c(e){return e.type!==n.IncrementalSnapshot||typeof e.data!=`object`||e.data===null||!(`source`in e.data)?!1:typeof e.data.source==`number`&&s.has(e.data.source)}function l(e,t){return t<3e4?e:t<3e5?Math.max(e,6e4):Math.max(e,3e5)}function u(e,t){return t.some(t=>new RegExp(t.source,t.flags).test(e))}function d(e,t,n){if(!u(e,t))return e;try{let t=new URL(e,n);return`${t.origin}${t.pathname}`}catch{let[t=e]=e.split(`?`),[n=t]=t.split(`#`);return n}}const f=[`log`,`info`,`warn`,`error`,`debug`],p=1024,m=()=>void 0;function h(e,t={}){let n=[],r=x(t.onError);try{for(let t of f)typeof console[t]==`function`&&n.push(S(console,t,(n,i)=>function(...o){return i()&&b(e,a.Console,{level:t,args:o.slice(0,10).map(re)},r),n.apply(this,o)}));return C(n)}catch(e){throw w(n),e}}function ee(e,t){let n=v(t),r={...n,onError:x(n.onError)},i=g(e,r);try{return C([i,_(e,r)])}catch(e){throw i(),e}}function te(e,t={redactUrlPatterns:[]}){let n=x(t.onError),r=r=>{let i=d(window.location.href,t.redactUrlPatterns??[],window.location.href);b(e,a.Navigation,{url:i,kind:r},n)},i=[];try{i.push(S(history,`pushState`,(e,t)=>function(...n){let i=e.apply(this,n);return t()&&r(`push`),i})),i.push(S(history,`replaceState`,(e,t)=>function(...n){let i=e.apply(this,n);return t()&&r(`replace`),i}));let e=!0,t=()=>{e&&r(`pop`)};return window.addEventListener(`popstate`,t),i.push(()=>{e=!1,window.removeEventListener(`popstate`,t)}),C(i)}catch(e){throw w(i),e}}function g(e,t){return typeof window.fetch==`function`?S(window,`fetch`,(n,r)=>{let i=async function(i,o){let s=n;if(!r())return s.call(this,i,o);let c=t.now(),l=ie(i,o),u=ae(i);if(O(u,t.ignoreUrlPatterns))return s.call(this,i,o);let f=d(u,t.redactUrlPatterns,window.location.href),p=D(o?.body);try{let n=await s.call(this,i,o);return r()&&b(e,a.Network,E({method:l,url:f,status:n.status,durationMs:Math.max(0,t.now()-c),reqBytes:p,resBytes:oe(n.headers)}),t.onError),n}catch(n){throw r()&&b(e,a.Network,E({method:l,url:f,status:0,durationMs:Math.max(0,t.now()-c),failed:!0,reqBytes:p}),t.onError),n}},o=Reflect.get(n,`__original`);return Object.defineProperty(i,"__original",{configurable:!0,value:typeof o==`function`?o:n,writable:!0}),i}):m}function _(e,t){let n=window.XMLHttpRequest.prototype,r=new WeakMap,i=[];try{return i.push(S(n,`open`,(e,n)=>function(...i){let[a,o]=i;if(!n())return e.apply(this,i);let s=o.toString();return O(s,t.ignoreUrlPatterns)?(r.delete(this),e.apply(this,i)):(r.set(this,{method:a.toUpperCase(),url:d(s,t.redactUrlPatterns,window.location.href),startedAt:0,reqBytes:0,failed:!1,emitted:!1}),e.apply(this,i))})),i.push(S(n,`send`,(n,i)=>function(...o){let[s]=o,c=i()?r.get(this):void 0;if(c===void 0)return n.apply(this,o);c.startedAt=t.now(),c.reqBytes=D(s);let l=()=>{c.failed=!0},u=()=>{c.emitted||(c.emitted=!0,this.removeEventListener(`error`,l),this.removeEventListener(`abort`,l),this.removeEventListener(`timeout`,l),i()&&b(e,a.Network,E({method:c.method,url:c.url,status:this.status,durationMs:Math.max(0,t.now()-c.startedAt),failed:c.failed||this.status===0,reqBytes:c.reqBytes,resBytes:se(this)}),t.onError))};this.addEventListener(`error`,l),this.addEventListener(`abort`,l),this.addEventListener(`timeout`,l),this.addEventListener(`loadend`,u,{once:!0});try{return n.apply(this,o)}catch(n){throw this.removeEventListener(`error`,l),this.removeEventListener(`abort`,l),this.removeEventListener(`timeout`,l),this.removeEventListener(`loadend`,u),i()&&b(e,a.Network,E({method:c.method,url:c.url,status:0,durationMs:Math.max(0,t.now()-c.startedAt),failed:!0,reqBytes:c.reqBytes}),t.onError),n}})),C(i)}catch(e){throw w(i),e}}function v(e){return{...e,ignoreUrlPatterns:y(e.ignoreUrlPatterns),redactUrlPatterns:y(e.redactUrlPatterns)}}function y(e){return e.map(e=>{let t=e.flags.replace(/[gy]/gu,``);return t===e.flags?e:new RegExp(e.source,t)})}function b(e,t,n,r){try{e(t,n)}catch(e){r?.(e)}}function x(e){let t=!1;return n=>{if(!t){t=!0;try{let t=e?.(n);ne(t)&&Promise.resolve(t).catch(()=>void 0)}catch{}finally{t=!1}}}}function ne(e){return typeof e==`object`&&!!e&&`then`in e&&typeof e.then==`function`}function S(e,t,n){let r=e,i=r[t];if(typeof i!=`function`)return m;let a=!0,o=n(i,()=>a);return r[t]=o,()=>{a&&(a=!1,r[t]===o&&(r[t]=i))}}function C(e){let t=!1;return()=>{t||(t=!0,w(e))}}function w(e){for(let t=e.length-1;t>=0;--t)try{e[t]?.()}catch{}}function re(e){if(e==null)return String(e);if(typeof e==`string`)return T(e);if(typeof e==`number`||typeof e==`boolean`||typeof e==`bigint`)return String(e);if(e instanceof Error)return T(e.stack??`${e.name}: ${e.message}`);try{return T(JSON.stringify(e))}catch{return Object.prototype.toString.call(e)}}function T(e){if(e.length<=p)return e;let t=e.charCodeAt(p-1),n=t>=55296&&t<=56319?p-1:p;return`${e.slice(0,n)}...(+${String(e.length-n)} chars)`}function ie(e,t){return(t?.method??(typeof e==`object`&&`method`in e?e.method:`GET`)).toUpperCase()}function ae(e){return typeof e==`string`||e instanceof URL?e.toString():e.url}function oe(e){let t=e.get(`content-length`);if(t===null)return;let n=Number.parseInt(t,10);return Number.isFinite(n)?n:void 0}function se(e){try{let t=e.getResponseHeader(`content-length`);if(t===null)return;let n=Number.parseInt(t,10);return Number.isFinite(n)?n:void 0}catch{return}}function E(e){return{method:e.method,url:e.url,status:e.status,durationMs:e.durationMs,...e.failed===void 0?{}:{failed:e.failed},...e.reqBytes===void 0?{}:{reqBytes:e.reqBytes},...e.resBytes===void 0?{}:{resBytes:e.resBytes}}}function D(e){if(e==null)return 0;if(typeof e==`string`)return new TextEncoder().encode(e).byteLength;if(e instanceof ArrayBuffer||ArrayBuffer.isView(e))return e.byteLength;if(e instanceof Blob)return e.size}function O(e,t){return u(e,t)}const ce=new Set([`action`,`formaction`,`href`,`src`]);function le(t){let n=()=>{t.beforeUserActivity?.()},r={emit:e=>{t.emit(ue(e,t.redactUrlPatterns))},maskAllInputs:t.maskAllInputs,recordCanvas:!1,collectFonts:!1,inlineImages:!1,recordCrossOriginIframes:!1,slimDOMOptions:`all`,hooks:{input:n,mediaInteaction:n,mouseInteraction:n,mousemove:n,scroll:n,selection:n,viewportResize:n},sampling:{mousemove:100,mouseInteraction:!0,scroll:250,media:800,input:`last`}};t.maskAllText?r.maskTextSelector=`*`:t.maskTextSelector!==void 0&&t.maskTextSelector.length>0&&(r.maskTextSelector=t.maskTextSelector),t.blockSelector!==void 0&&t.blockSelector.length>0&&(r.blockSelector=t.blockSelector),t.checkoutEveryNms!==void 0&&t.checkoutEveryNms>0&&(r.checkoutEveryNms=t.checkoutEveryNms);let i=(0,e.record)(r);if(i===void 0)throw Error(`logfire session replay: rrweb failed to start recording`);return{stop:()=>{i()},addCustomEvent:(t,n)=>{e.record.addCustomEvent(t,n)},takeFullSnapshot:()=>{e.record.takeFullSnapshot(!0)}}}function ue(e,t){if(typeof e.data!=`object`||e.data===null)return e;let i=e.data;if(e.type===n.Meta){if(typeof i.href!=`string`)return e;let n=d(i.href,t,window.location.href);return n===i.href?e:{...e,data:{...i,href:n}}}if(e.type!==n.FullSnapshot&&(e.type!==n.IncrementalSnapshot||i.source!==r.Mutation))return e;let a=k(i,t);return a===i?e:{...e,data:a}}function k(e,t){if(Array.isArray(e)){let n=!1,r=[];for(let i of e){let e=k(i,t);e!==i&&(n=!0),r.push(e)}return n?r:e}if(typeof e!=`object`||!e)return e;let n=e,r=!1,i={};for(let[e,a]of Object.entries(n)){let n=e===`attributes`&&!Array.isArray(a)?de(a,t):k(a,t);n!==a&&(r=!0),i[e]=n}return r?i:e}function de(e,t){if(typeof e!=`object`||!e||Array.isArray(e))return e;let n=e,r=!1,i={};for(let[e,a]of Object.entries(n)){if(!ce.has(e.toLowerCase())||typeof a!=`string`){i[e]=a;continue}let n=d(a,t,window.location.href);n!==a&&(r=!0),i[e]=n}return r?i:e}function A(e){return Number.isFinite(e)?Math.min(1,Math.max(0,e)):0}function fe(e){let t=e.random??Math.random;return t()<A(e.sessionSampleRate)?`full`:t()<A(e.onErrorSampleRate)?`buffer`:`off`}const pe=/^[a-z][a-z0-9_]{0,63}$/u;function me(e,t){let n=0;for(let r of e)if(n+=+(r.length>0),n>t)return!1;return!0}function he(e,t){if(e===void 0)return Object.freeze({});let n;try{n=e()}catch(e){return t(e),Object.freeze({})}if(typeof n!=`object`||!n||Array.isArray(n))return Object.freeze({});let r;try{r=Object.getPrototypeOf(n)}catch(e){return t(e),Object.freeze({})}if(r!==Object.prototype&&r!==null)return Object.freeze({});let i;try{i=Object.keys(n)}catch(e){return t(e),Object.freeze({})}let a={},o=0;for(let e of i){if(!pe.test(e))continue;let r;try{r=Reflect.get(n,e)}catch(e){t(e);continue}if((typeof r==`boolean`||typeof r==`number`&&Number.isFinite(r)||typeof r==`string`&&me(r,200))&&(Object.defineProperty(a,e,{configurable:!0,enumerable:!0,value:r,writable:!0}),o+=1,o===20))break}return Object.freeze(a)}function ge(e=Date.now){let t=e(),n=new Uint8Array(new ArrayBuffer(16));_e(n),n[0]=Math.floor(t/2**40)&255,n[1]=Math.floor(t/2**32)&255,n[2]=Math.floor(t/2**24)&255,n[3]=Math.floor(t/2**16)&255,n[4]=Math.floor(t/2**8)&255,n[5]=t&255,n[6]=(n[6]??0)&15|112,n[8]=(n[8]??0)&63|128;let r=``;for(let e of n)r+=e.toString(16).padStart(2,`0`);return`${r.slice(0,8)}-${r.slice(8,12)}-${r.slice(12,16)}-${r.slice(16,20)}-${r.slice(20)}`}function _e(e){let t=globalThis.crypto;if(typeof t?.getRandomValues==`function`){t.getRandomValues(e);return}for(let t=0;t<e.length;t++)e[t]=Math.floor(Math.random()*256)}const j=`lf_session_replay`;var ve=class{idleTimeoutMs;maxDurationMs;now;storage;memorySession;pendingSession;persistenceTimer;constructor(e){this.idleTimeoutMs=e.idleTimeoutMs,this.maxDurationMs=e.maxDurationMs,this.now=e.now??Date.now,this.storage=e.storage===void 0?M():e.storage}getSession(){let e=this.now();if(this.memorySession!==void 0&&!this.isExpired(this.memorySession,e))return this.memorySession;let t=this.read();return t!==void 0&&!this.isExpired(t,e)?t:this.createSession(e)}touch(){let e=this.now(),t={...this.getSession(),lastActivityAt:e};return this.memorySession=t,this.scheduleWrite(t),t}reset(){return this.createSession(this.now())}flushPendingStorage(){this.persistenceTimer!==void 0&&(clearTimeout(this.persistenceTimer),this.persistenceTimer=void 0);let e=this.pendingSession;this.pendingSession=void 0,e!==void 0&&this.writeNow(e)}isExpired(e,t){return t-e.lastActivityAt>this.idleTimeoutMs||t-e.startedAt>this.maxDurationMs}createSession(e){let t={id:ge(this.now),startedAt:e,lastActivityAt:e};return this.flushPendingStorage(),this.writeNow(t),t}read(){if(this.storage!==null)try{let e=this.storage.getItem(j);if(e!==null){let t=JSON.parse(e);if(ye(t))return this.memorySession=t,t}}catch{return this.memorySession}return this.memorySession}write(e){if(this.memorySession=e,this.storage!==null)try{this.storage.setItem(j,JSON.stringify(e))}catch{}}scheduleWrite(e){this.pendingSession=e,this.persistenceTimer===void 0&&(this.persistenceTimer=setTimeout(()=>{this.persistenceTimer=void 0;let e=this.pendingSession;this.pendingSession=void 0,e!==void 0&&this.writeNow(e)},1e3))}writeNow(e){this.memorySession=e,this.write(e)}};function M(){try{return globalThis.sessionStorage??null}catch{return null}}function ye(e){if(typeof e!=`object`||!e)return!1;let t=e;return typeof t.id==`string`&&t.id.length>0&&typeof t.startedAt==`number`&&Number.isFinite(t.startedAt)&&typeof t.lastActivityAt==`number`&&Number.isFinite(t.lastActivityAt)}function N(e){return typeof e==`object`&&e?e:void 0}function P(e){return typeof e==`string`&&e.length>0?e:void 0}function be(e){let t=N(e),n=P(t?.id);if(t===void 0||n===void 0)return;let r=P(t.name),i=P(t.email);return{id:n,...r===void 0?{}:{name:r},...i===void 0?{}:{email:i}}}function xe(e,t,o,s={},c){let l=1/0,u=0,d=0,f=0,p=0,m=!1,h=new Set;for(let e of t){e.timestamp<l&&(l=e.timestamp),e.timestamp>u&&(u=e.timestamp);let t=N(e.data);if(e.type===n.FullSnapshot)m=!0;else if(e.type===n.Meta){let e=P(t?.href);e!==void 0&&h.add(e)}else if(e.type===n.IncrementalSnapshot&&t!==void 0){let e=t.source;if(e===r.MouseInteraction){let e=t.type;(e===i.Click||e===i.DblClick)&&d++}else e===r.Input&&f++}else if(e.type===n.Custom&&t!==void 0){let e=P(t.tag),n=N(t.payload);if(e===a.Error)p++;else if(e===a.Console)n?.level===`error`&&p++;else if(e===a.Navigation){let e=P(n?.url);e!==void 0&&h.add(e)}}}return{seq:e,firstTimestamp:l===1/0?0:l,lastTimestamp:u,eventCount:t.length,clickCount:d,keypressCount:f,errorCount:p,hasFullSnapshot:m,urls:[...h],...o!==void 0&&o.length>0?{distinctId:o}:{},...c===void 0?{}:{user:{...c}},...Object.keys(s).length===0?{}:{sessionAttributes:{...s}}}}var F=class extends Error{droppedSeqs;reason;seq;sessionId;status;constructor(e){super(Se(e),{cause:e.cause}),this.name=`ReplayUploadError`,this.droppedSeqs=Object.freeze([...e.droppedSeqs??[]]),this.reason=e.reason,this.seq=e.seq,this.sessionId=e.sessionId,this.status=e.status}};function Se(e){let t=e.seq===void 0?`replay chunk`:`replay chunk seq=${String(e.seq)}`,n=e.cause instanceof Error?`: ${e.cause.message}`:``;return`${t} ${e.reason}${n}`}const I=`lf_session_replay_seq`,L=1e4,R=3e4,Ce={gzip:t.gzip,gzipSync:t.gzipSync};var we=class{buffer=[];bufferHasFullSnapshot=!1;pendingBytes=0;seq=0;timer;nextFlushAt;lastUserActivityAt;startedAt;started=!1;held;heldBufferIncomplete=!1;minimumBufferIncomplete=!1;minimumDurationSatisfied=!1;firstObservedTimestamp;lastObservedTimestamp;refreshingMinimumSnapshot=!1;mode;queue=[];retainedBytes=0;activeUpload;drainPromise;draining=!1;lifecycleFlights=new Set;closed=!1;shuttingDown=!1;retryAbort=new AbortController;deadlineAbort=new AbortController;resyncPending=!1;resyncTimer;lastResyncAt;reservedKeepaliveBytes=0;asyncCompressionAvailable=!0;config;compression;storage;sessionId;sessionAttributes;takeFullSnapshot;constructor(e,t,n,r=M(),i=Ce,a={},o={}){this.config=e,this.sessionId=t,this.sessionAttributes=Object.freeze({...a}),this.mode=n,this.storage=r,this.compression=i,this.held=o.holdUntilActivity===!0&&n===`full`,this.takeFullSnapshot=o.takeFullSnapshot,this.minimumDurationSatisfied=e.minSessionDurationMs===0,this.seq=this.loadSeq(t),this.startedAt=this.config.now(),this.lastUserActivityAt=this.startedAt}start(){this.started||this.mode!==`full`||(this.started=!0,this.scheduleFlush())}add(e){this.minimumDurationSatisfied||(this.firstObservedTimestamp??=e.timestamp,this.lastObservedTimestamp=Math.max(this.lastObservedTimestamp??e.timestamp,e.timestamp)),c(e)&&(this.lastUserActivityAt=this.config.now());let t=V(e);if(this.resyncPending){this.addDuringResync(e,t);return}if(this.refreshingMinimumSnapshot){this.buffer.push(e),this.pendingBytes+=t;return}let r=!this.minimumDurationSatisfied;if(this.mode===`buffer`||this.held||r){if(e.type===n.Meta){this.buffer=[e],this.bufferHasFullSnapshot=!1,this.minimumBufferIncomplete=!1,this.pendingBytes=t,r&&(this.mode===`full`&&(this.firstObservedTimestamp=e.timestamp),this.finishMinimumBufferingEvent());return}if(e.type===n.FullSnapshot){let i=!this.bufferHasFullSnapshot&&this.buffer.length===1&&this.buffer[0]?.type===n.Meta?this.buffer[0]:void 0;this.buffer=i===void 0?[e]:[i,e],this.bufferHasFullSnapshot=!0,this.pendingBytes=t+(i===void 0?0:V(i)),this.heldBufferIncomplete=!1,this.minimumBufferIncomplete=!1,r&&(this.mode===`full`&&(this.firstObservedTimestamp=i?.timestamp??e.timestamp),this.finishMinimumBufferingEvent());return}if(!this.bufferHasFullSnapshot||t>this.config.maxBufferBytes){this.heldBufferIncomplete||=this.held,this.minimumBufferIncomplete||=r,r&&this.finishMinimumBufferingEvent();return}if(this.pendingBytes+t>this.config.maxBufferBytes){this.heldBufferIncomplete||=this.held,this.minimumBufferIncomplete||=r,r&&this.finishMinimumBufferingEvent();return}}if(this.buffer.push(e),this.pendingBytes+=t,r&&this.minimumDurationReached()){this.flushAndReport();return}this.mode===`full`&&this.pendingBytes>=this.config.maxBufferBytes?this.flushAndReport():this.scheduleFlush()}addDuringResync(e,t){if(e.type===n.Meta){this.buffer=[e],this.pendingBytes=t;return}if(e.type!==n.FullSnapshot)return;let r=this.buffer.length===1&&this.buffer[0]?.type===n.Meta?this.buffer[0]:void 0;this.buffer=r===void 0?[e]:[r,e],this.pendingBytes=t+(r===void 0?0:V(r)),this.resyncPending=!1,this.clearResyncTimer(),this.pendingBytes>=this.config.maxBufferBytes?this.flushAndReport():this.scheduleFlush()}async triggerFlush(){return this.mode===`buffer`&&(this.bufferHasFullSnapshot||(this.buffer=[],this.pendingBytes=0),this.mode=`full`,this.start()),this.flush()}async flush(e={}){return this.flushInternal(e)}async flushInternal(e={}){if(this.closed||this.mode===`buffer`||this.held||this.buffer.length===0||!this.minimumDurationReached()||(this.clearScheduledFlush(),this.minimumBufferIncomplete&&!this.refreshMinimumBuffer()))return;this.minimumDurationSatisfied=!0;let t=this.buffer,n=this.pendingBytes;this.buffer=[],this.bufferHasFullSnapshot=!1,this.minimumBufferIncomplete=!1,this.pendingBytes=0;let r=this.sessionId,i=this.snapshotIdentity();if(e.keepalive===!0){let e=Oe(t),n=this.allocateSeq(e.length),a=this.deliverLifecycle(e,n,r,i);this.lifecycleFlights.add(a);let o=()=>{this.lifecycleFlights.delete(a)};a.then(o,o),await a;return}await this.enqueue(t,n,r,i)?.done}async shutdown(e={}){if(this.started=!1,this.clearScheduledFlush(),this.held||!this.minimumDurationReached()){this.discard(),await this.settleWithinDeadline([]);return}if(e.keepalive===!0){await this.flush(e),this.closed=!0,this.clearResyncTimer(),await this.settleWithinDeadline([]);return}let t=this.flushInternal();this.closed=!0,this.shuttingDown=!0,this.clearResyncTimer(),this.retryAbort.abort();let n=this.queue.filter(e=>e!==this.activeUpload).map(async e=>this.finalAttempt(e));await this.settleWithinDeadline([t,...n])}discard(){this.started=!1,this.closed=!0,this.clearScheduledFlush(),this.clearResyncTimer(),this.buffer=[],this.bufferHasFullSnapshot=!1,this.minimumBufferIncomplete=!1,this.pendingBytes=0}getMode(){return this.mode}isHeld(){return this.held}releaseHeld(e){this.held&&((this.heldBufferIncomplete||!this.bufferHasFullSnapshot)&&(this.buffer=[],this.bufferHasFullSnapshot=!1,this.pendingBytes=0,e()),this.held=!1,this.pendingBytes>=this.config.maxBufferBytes?this.flushAndReport():this.scheduleFlush())}flushAndReport(){this.flushInternal().catch(e=>{z(this.config.onError,e)})}scheduleFlush(){let e=this.config.now(),t=Math.max(0,this.config.minSessionDurationMs-(e-this.startedAt)),n=Math.max(l(this.config.flushIntervalMs,e-this.lastUserActivityAt),t);this.scheduleFlushIn(e,n)}scheduleFlushIn(e,t){if(!this.started||this.mode!==`full`||this.held||this.buffer.length===0)return;let n=e+t;this.timer!==void 0&&this.nextFlushAt!==void 0&&this.nextFlushAt<=n||(this.clearScheduledFlush(),this.nextFlushAt=n,this.timer=setTimeout(()=>{this.timer=void 0,this.nextFlushAt=void 0,this.flushAndReport()},t))}clearScheduledFlush(){this.timer!==void 0&&(clearTimeout(this.timer),this.timer=void 0),this.nextFlushAt=void 0}minimumDurationReached(){return this.minimumDurationSatisfied||this.config.minSessionDurationMs===0?!0:this.firstObservedTimestamp===void 0||this.lastObservedTimestamp===void 0?!1:this.lastObservedTimestamp-this.firstObservedTimestamp>=this.config.minSessionDurationMs}finishMinimumBufferingEvent(){this.minimumDurationReached()?this.flushAndReport():this.scheduleFlush()}refreshMinimumBuffer(){let e=this.buffer.length,t=this.pendingBytes;if(this.takeFullSnapshot!==void 0){this.refreshingMinimumSnapshot=!0;try{this.takeFullSnapshot()}catch(e){z(this.config.onError,e)}finally{this.refreshingMinimumSnapshot=!1}}return this.buffer.slice(e).some(e=>e.type===n.FullSnapshot)?(this.minimumBufferIncomplete=!1,!0):(this.buffer.length=e,this.pendingBytes=t,!1)}snapshotIdentity(){let e=this.snapshotUser(),t=this.config.distinctId;if(this.config.getDistinctId!==void 0)try{t=this.config.getDistinctId()??this.config.distinctId}catch(e){z(this.config.onError,e)}else e!==void 0&&(t=e.id);return{distinctId:t,user:e}}createEnvelope(e,t,n){return{version:1,meta:xe(t,e,n.distinctId,this.sessionAttributes,n.user),events:e}}snapshotUser(){if(this.config.getUser!==void 0)try{return be(this.config.getUser())}catch(e){z(this.config.onError,e);return}}allocateSeq(e){let t=this.seq;return this.seq+=e,this.saveSeq(this.sessionId,this.seq),t}enqueue(e,t,r,i){let a=Math.max(2e6,2*this.config.maxBufferBytes);if(this.queue.length>0&&this.retainedBytes+t>a){z(this.config.onError,new F({cause:Error(`replay upload queue is full`),reason:`not-sent`,seq:void 0,sessionId:r})),this.beginResync();return}let o=()=>void 0,s={body:void 0,done:new Promise(e=>{o=e}),events:e,hasFullSnapshot:e.some(e=>e.type===n.FullSnapshot),identity:i,reachedFetch:!1,resolve:o,retainedBytes:t,seq:this.allocateSeq(1),sessionId:r,settled:!1};return this.queue.push(s),this.retainedBytes+=t,this.draining||(this.draining=!0,this.drainPromise=this.drain()),s}async drain(){try{for(;!this.shuttingDown;){let e=this.queue[0];if(e===void 0)break;this.activeUpload=e;let t=await this.deliverQueued(e);this.activeUpload=void 0,this.settle(e,t)}}finally{this.activeUpload=void 0,this.draining=!1}}async deliverQueued(e){let t=await this.compressQueued(e);if(t!==void 0||e.settled)return t;let n=Date.now(),r;for(let t=1;;t++){let i=R-(Date.now()-n);if(t>1&&i<=0)return G(r,e.reachedFetch);let a=await this.attemptQueued(e,Math.min(L,i));if(a===void 0)return;r=a;let o=je(a,t,this.config.random);if(o===void 0||this.shuttingDown||Date.now()-n+o>=R)return G(a,e.reachedFetch);await this.backoff(o)}}async compressQueued(e){if(e.body!==void 0||e.events===void 0)return;let n=e.events;try{let r=(0,t.strToU8)(JSON.stringify(this.createEnvelope(n,e.seq,e.identity))),i=this.shuttingDown?this.compression.gzipSync(r):await this.compressOrdinary(r);if(e.events!==n)return await this.compressQueued(e);e.settled||(this.retainedBytes+=i.byteLength-e.retainedBytes,e.retainedBytes=i.byteLength,e.body=i,e.events=void 0);return}catch(e){return{cause:e,reason:`not-sent`}}}async attemptQueued(e,t=L){let n=e.body;if(n!==void 0)try{await this.send({body:n,requestKeepalive:!1,reservedBytes:0,seq:e.seq,sessionId:e.sessionId},()=>{e.reachedFetch=!0},t);return}catch(e){return e}}async finalAttempt(e){let t=await this.compressQueued(e);if(t!==void 0){this.settle(e,t);return}let n=await this.attemptQueued(e);this.settle(e,n===void 0?void 0:G(n,e.reachedFetch))}async settleWithinDeadline(e){let t=Promise.all([...e,this.drainPromise,...this.lifecycleFlights]).then(()=>void 0,()=>void 0),n,r=new Promise(e=>{n=setTimeout(e,L)});if(await Promise.race([t,r]),clearTimeout(n),this.shuttingDown){this.deadlineAbort.abort(Error(`replay upload did not finish before shutdown`));for(let e of[...this.queue])this.settle(e,{cause:Error(`replay upload did not finish before shutdown`),reason:e.reachedFetch?`unconfirmed`:`not-sent`})}}settle(e,t){if(e.settled)return;e.settled=!0,this.retainedBytes-=e.retainedBytes;let n=this.queue.indexOf(e);n>=0&&this.queue.splice(n,1),e.body=void 0,e.events=void 0,e.resolve(),t!==void 0&&this.handleSequencedLoss(e.seq,e.sessionId,t)}handleSequencedLoss(e,t,n){let r=[];if(!this.shuttingDown){let t=!1;for(let n of[...this.queue])if(!(n.seq<e)){if(n.events===void 0){if(n.hasFullSnapshot){t=!0;break}continue}if(n.hasFullSnapshot){let e=H(n.events),r=U(e);this.retainedBytes+=r-n.retainedBytes,n.retainedBytes=r,n.events=e,t=!0;break}r.push(n.seq),this.settle(n,void 0)}!t&&!this.trimBufferToAnchor()&&this.beginResync()}z(this.config.onError,new F({cause:n.cause,droppedSeqs:r,reason:n.reason,seq:e,sessionId:t,status:n.status}))}trimBufferToAnchor(){return this.buffer.some(e=>e.type===n.FullSnapshot)?(this.buffer=H(this.buffer),this.pendingBytes=U(this.buffer),!0):!1}beginResync(){this.closed||(this.resyncPending=!0,this.buffer=[],this.bufferHasFullSnapshot=!1,this.pendingBytes=0,this.clearScheduledFlush(),this.scheduleResyncSnapshot())}scheduleResyncSnapshot(){if(this.resyncTimer!==void 0||this.closed)return;let e=this.lastResyncAt===void 0?0:Math.max(0,this.lastResyncAt+6e4-this.config.now());this.resyncTimer=setTimeout(()=>{this.resyncTimer=void 0,this.takeResyncSnapshot()},e)}takeResyncSnapshot(){if(!(!this.resyncPending||this.closed||this.takeFullSnapshot===void 0)){this.lastResyncAt=this.config.now();try{this.takeFullSnapshot()}catch(e){z(this.config.onError,e),this.scheduleResyncSnapshot();return}this.isResyncPending()&&(z(this.config.onError,Error(`replay resync snapshot produced no full snapshot`)),this.scheduleResyncSnapshot())}}isResyncPending(){return this.resyncPending}clearResyncTimer(){this.resyncTimer!==void 0&&(clearTimeout(this.resyncTimer),this.resyncTimer=void 0)}async backoff(e){let t=this.retryAbort.signal;t.aborted||await new Promise(n=>{let r=()=>{clearTimeout(i),t.removeEventListener(`abort`,r),n()},i=setTimeout(r,e);t.addEventListener(`abort`,r)})}async deliverLifecycle(e,n,r,i){let a=[];for(let o=0;o<e.length;o++){let s=e[o];if(s===void 0){a.push(void 0);continue}let c=this.createEnvelope(s,n+o,i);try{a.push({body:this.compression.gzipSync((0,t.strToU8)(JSON.stringify(c))),requestKeepalive:!1,reservedBytes:0,seq:n+o,sessionId:r})}catch(e){this.handleSequencedLoss(n+o,r,{cause:e,reason:`not-sent`}),a.push(void 0)}}let o=!0,s=Math.max(0,48e3-this.reservedKeepaliveBytes);for(let e of a){if(e===void 0){o=!1;continue}o&&e.body.byteLength<=s?(e.requestKeepalive=!0,e.reservedBytes=e.body.byteLength,this.reservedKeepaliveBytes+=e.reservedBytes,s-=e.reservedBytes):o=!1}await Promise.all(a.map(async e=>{if(e===void 0)return;let t=!1;try{await this.send(e,()=>{t=!0})}catch(n){this.handleSequencedLoss(e.seq,e.sessionId,G(n,t))}}))}async compressOrdinary(e){if(!this.asyncCompressionAvailable)return this.compression.gzipSync(e);try{return await ke(this.compression,e)}catch{return this.asyncCompressionAvailable=!1,this.compression.gzipSync(e)}}async send(e,t,n=L){let r,i,a,o=new AbortController,s=setTimeout(()=>{o.abort(Error(`replay upload timed out after ${String(n)}ms`))},n),c=this.deadlineAbort.signal,l=()=>{o.abort(c.reason)};c.addEventListener(`abort`,l);try{let n=`${this.config.replayUrl.replace(/\/+$/u,``)}/${encodeURIComponent(e.sessionId)}?seq=${String(e.seq)}`,s=await De(this.getUploadHeaders(),o.signal);t();let c=this.config.fetchImpl(n,{method:`POST`,headers:s,body:e.body.slice(),keepalive:e.requestKeepalive,signal:o.signal});r=!0;let l=await c;if(i=!0,a=await Ae(l),!l.ok){let e=l.status===429||l.status===503?Me(l.headers.get(`retry-after`),Date.now()):void 0;throw new B(l.status,e)}}finally{clearTimeout(s),c.removeEventListener(`abort`,l),e.reservedBytes>0&&(r!==!0||i!==!0||a===!0)&&(this.reservedKeepaliveBytes=Math.max(0,this.reservedKeepaliveBytes-e.reservedBytes))}}async getUploadHeaders(){let e=this.config.headers===void 0?{}:await this.config.headers(),t=await Ee(this.config.token);return{...t===void 0||t.length===0?e:{...Object.fromEntries(Object.entries(e).filter(([e])=>e.toLowerCase()!==`authorization`)),Authorization:`Bearer ${t}`},"Content-Type":`application/json`,"Content-Encoding":`gzip`}}loadSeq(e){if(this.storage===null)return 0;try{let t=this.storage.getItem(I);if(t===null)return 0;let n=JSON.parse(t);if(typeof n!=`object`||!n)return 0;let r=n;return r.id===e&&typeof r.seq==`number`&&Number.isFinite(r.seq)?r.seq:0}catch{return 0}}saveSeq(e,t){if(this.storage!==null)try{this.storage.setItem(I,JSON.stringify({id:e,seq:t}))}catch{}}};function z(e,t){try{let n=e?.(t);Te(n)&&Promise.resolve(n).catch(()=>void 0)}catch{}}function Te(e){return typeof e==`object`&&!!e&&`then`in e&&typeof e.then==`function`}var B=class extends Error{retryAfter;status;constructor(e,t){super(`replay ingest failed: ${String(e)}`),this.status=e,this.retryAfter=t,this.name=`ReplayIngestError`}};async function Ee(e){return typeof e==`function`?e():e}async function De(e,t){if(t.aborted)throw t.reason;return new Promise((n,r)=>{let i=()=>{r(t.reason)};t.addEventListener(`abort`,i,{once:!0}),e.then(e=>{t.removeEventListener(`abort`,i),n(e)},e=>{t.removeEventListener(`abort`,i),r(e instanceof Error?e:Error(String(e)))})})}function V(e){try{return(0,t.strToU8)(JSON.stringify(e)).byteLength}catch{return 0}}function H(e){let t=e.findIndex(e=>e.type===n.FullSnapshot);if(t<0)return e;let r=t>0&&e[t-1]?.type===n.Meta?t-1:t;return e.slice(r)}function U(e){return e.reduce((e,t)=>e+V(t),0)}function Oe(e){let t=[],n=[],r=0;for(let i of e){let e=V(i);n.length>0&&r+e>48e3&&(t.push(n),n=[],r=0),n.push(i),r+=e}return n.length>0&&t.push(n),t}async function ke(e,t){return new Promise((n,r)=>{let i=[];typeof window<`u`&&i.push(window),typeof document<`u`&&i.push(document);let a=()=>{for(let e of i)e.removeEventListener(`securitypolicyviolation`,s)},o=(e,t)=>{if(a(),e!==null){r(e);return}n(t)},s=e=>{let t=e;(t.effectiveDirective.includes(`worker-src`)||t.violatedDirective.includes(`worker-src`))&&o(Error(`replay compression worker blocked by Content Security Policy`))};for(let e of i)e.addEventListener(`securitypolicyviolation`,s);try{e.gzip(t,{level:6},(e,t)=>{o(e,t)})}catch(e){a(),r(e instanceof Error?e:Error(String(e)))}})}async function Ae(e){if(e.body===null)return!0;try{return await e.body.cancel(),!0}catch{return!1}}function W(e){return e===408||e===425||e===429||e>=500}function je(e,t,n){if(e instanceof B&&!W(e.status))return;let r=Math.min(8e3,500*2**(t-1)),i=Math.round(r*(1-.5*n())),a=e instanceof B?e.retryAfter:void 0;return a===void 0?i:Math.max(a,i)}function G(e,t){let n=e instanceof B?e.status:void 0;return n!==void 0&&!W(n)?{cause:e,reason:`rejected`,status:n}:{cause:e,reason:t?`unconfirmed`:`not-sent`,status:n}}function Me(e,t){if(e===null)return;let n=e.trim();if(/^\d+$/u.test(n)){let e=Number(n);return Number.isSafeInteger(e)?e*1e3:void 0}let r=Ie(n,t);return r===void 0?void 0:Math.max(0,r-t)}const Ne=[`Jan`,`Feb`,`Mar`,`Apr`,`May`,`Jun`,`Jul`,`Aug`,`Sep`,`Oct`,`Nov`,`Dec`],Pe=[`Sun`,`Mon`,`Tue`,`Wed`,`Thu`,`Fri`,`Sat`],Fe=[`Sunday`,`Monday`,`Tuesday`,`Wednesday`,`Thursday`,`Friday`,`Saturday`];function Ie(e,t){let n=/^(Sun|Mon|Tue|Wed|Thu|Fri|Sat), (\d{2}) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) (\d{4}) (\d{2}):(\d{2}):(\d{2}) GMT$/u.exec(e);if(n!==null)return K(n[1],n[2],n[3],n[4],n[5],n[6],n[7]);let r=/^(Sunday|Monday|Tuesday|Wednesday|Thursday|Friday|Saturday), (\d{2})-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-(\d{2}) (\d{2}):(\d{2}):(\d{2}) GMT$/u.exec(e);if(r!==null){let e=new Date(t).getUTCFullYear(),n=Number(r[4]),i=Math.floor(e/100)*100+n;return i>e+50&&(i-=100),K(r[1],r[2],r[3],String(i),r[5],r[6],r[7])}let i=/^(Sun|Mon|Tue|Wed|Thu|Fri|Sat) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) (\d{2}| \d) (\d{2}):(\d{2}):(\d{2}) (\d{4})$/u.exec(e);if(i!==null)return K(i[1],i[3]?.trim(),i[2],i[7],i[4],i[5],i[6])}function K(e,t,n,r,i,a,o){let s=Number(t),c=Ne.indexOf(n),l=Number(r),u=Number(i),d=Number(a),f=Number(o);if(c<0||s<1||s>31||u>23||d>59||f>59)return;let p=new Date(0);if(p.setUTCFullYear(l,c,s),p.setUTCHours(u,d,f,0),p.getUTCFullYear()!==l||p.getUTCMonth()!==c||p.getUTCDate()!==s||p.getUTCHours()!==u||p.getUTCMinutes()!==d||p.getUTCSeconds()!==f)return;let m=Pe.indexOf(e),h=Fe.indexOf(e);return(m>=0?m:h)===p.getUTCDay()?p.getTime():void 0}const Le={mode:`off`,recording:!1,getSessionId:()=>``,flush:async()=>Promise.resolve(),stop:async()=>Promise.resolve()},q=`lf_session_replay_mode`,J=Symbol.for(`@pydantic/logfire-session-replay/controller`);function Re(e){if(typeof window>`u`||typeof document>`u`)return Le;let t=Ke();try{let n=Be(e),r=new ve({idleTimeoutMs:n.sessionIdleTimeoutMs,maxDurationMs:n.maxSessionDurationMs,now:n.now}),i=r.getSession().id,a=e=>{let t;try{t=n.getSessionId?.()}catch(e){return Q(n.onError,e),i}if(t!==void 0&&t.length>0)return i=t,t;let a=e?r.touch().id:r.getSession().id;return i=a,a},o=M(),s=a(!1),c,l=!1,u=Promise.resolve(),d,f=(e,t,r=!t)=>{let i=Ve(n,e,o);if(!(i===`off`||l||e!==s))try{c=ze({config:n,getSessionId:a,mode:i,onSessionChanged:p,samplingModeStorage:o,sessionId:e,holdUntilActivity:r})}catch(e){if(c=void 0,t)throw e;Q(n.onError,e)}},p=(e,t=!0)=>{if(l||e===s)return;s=e;let r=c;c=void 0;let i=r?.deactivate()??Promise.resolve();u=u.then(async()=>{await Z(i,n.onError),!l&&s===e&&f(e,!1,t)})},m;try{f(s,!0),m=setInterval(()=>{p(a(!1))},1e3)}catch(e){throw c?.discard(),c=void 0,e}return{get mode(){try{return c?.transport.getMode()??`off`}catch(e){return Q(n.onError,e),`off`}},get recording(){try{return c!==void 0}catch(e){return Q(n.onError,e),!1}},getSessionId:()=>a(!1),flush:async()=>{try{await u,await c?.transport.flush()}catch(e){Q(n.onError,e)}},stop:async()=>(d??=(async()=>{l=!0,clearInterval(m);let e=c;c=void 0,await Z(e?.deactivate()??Promise.resolve(),n.onError),await u,r.flushPendingStorage(),t()})(),d)}}catch(e){throw t(),e}}function ze(e){let{config:t,getSessionId:n,holdUntilActivity:r,mode:i,onSessionChanged:o,samplingModeStorage:s,sessionId:l}=e,u=he(t.getSessionAttributes,e=>{Q(t.onError,e)}),d,f=new we(t,l,i,void 0,void 0,u,{holdUntilActivity:r,takeFullSnapshot:()=>{d.takeFullSnapshot()}}),p=[],m=!0,g=()=>m,_;try{d=le({beforeUserActivity:()=>{if(!(!m||!f.isHeld()))try{let e=n(!0);if(e!==l){o(e,!1);return}f.releaseHeld(()=>{d.takeFullSnapshot()})}catch(e){Q(t.onError,e)}},emit:e=>{if(m)try{let t=n(c(e));if(t!==l){o(t,!1);return}f.add(e)}catch(e){Q(t.onError,e)}},maskAllText:t.maskAllText,maskAllInputs:t.maskAllInputs,maskTextSelector:t.maskTextSelector,blockSelector:t.blockSelector,checkoutEveryNms:i===`buffer`?12e4:0,redactUrlPatterns:t.redactUrlPatterns}),p.push(()=>{d.stop()});let e=(e,n)=>{if(m)try{d.addCustomEvent(e,n)}catch(e){Q(t.onError,e)}},r=n=>{g()&&(f.releaseHeld(()=>{d.takeFullSnapshot()}),e(a.Error,n),g()&&f.getMode()===`buffer`&&(Y(s,l,`full`),X(f.triggerFlush(),t.onError)))},u=e=>{e instanceof ErrorEvent&&r(qe(e.message,e.filename,We(e.error)))},v=e=>{let t=e.reason;r(qe(Je(t?.message??e.reason),void 0,typeof t?.stack==`string`?t.stack:void 0))},y=()=>{document.visibilityState===`hidden`&&X(f.flush({keepalive:!0}),t.onError)},b=()=>{X(f.flush({keepalive:!0}),t.onError)};return window.addEventListener(`error`,u,!0),p.push(()=>{window.removeEventListener(`error`,u,!0)}),window.addEventListener(`unhandledrejection`,v,!0),p.push(()=>{window.removeEventListener(`unhandledrejection`,v,!0)}),document.addEventListener(`visibilitychange`,y),p.push(()=>{document.removeEventListener(`visibilitychange`,y)}),window.addEventListener(`pagehide`,b),p.push(()=>{window.removeEventListener(`pagehide`,b)}),t.captureConsole&&p.push(h(e,{onError:t.onError})),t.captureNetwork&&p.push(ee(e,{ignoreUrlPatterns:t.ignoreUrlPatterns,now:t.now,onError:t.onError,redactUrlPatterns:t.redactUrlPatterns})),t.captureNavigation&&p.push(te(e,{onError:t.onError,redactUrlPatterns:t.redactUrlPatterns})),f.start(),{sessionId:l,transport:f,deactivate:async()=>(_??=(async()=>{let e=f.shutdown({keepalive:!1});m=!1,$(p),await e})(),_),discard:()=>{m=!1,$(p),f.discard()}}}catch(e){throw m=!1,$(p),f.discard(),e}}function Be(e){if(e.replayUrl.length===0)throw Error("logfire session replay: `replayUrl` is required");let t=new URL(e.replayUrl,`https://logfire.invalid/`);if(t.search!==``||t.hash!==``)throw Error("logfire session replay: `replayUrl` must not contain a query or fragment");let n=e.fetchImpl??(typeof fetch==`function`?fetch.bind(globalThis):void 0);if(n===void 0)throw Error("logfire session replay: no `fetch` available; pass `fetchImpl`");return{replayUrl:e.replayUrl,headers:e.headers,token:e.token,getSessionId:e.getSessionId,getSessionAttributes:e.getSessionAttributes,sessionSampleRate:e.sessionSampleRate??o.sessionSampleRate,onErrorSampleRate:e.onErrorSampleRate??o.onErrorSampleRate,maskAllText:e.maskAllText??o.maskAllText,maskAllInputs:e.maskAllInputs??o.maskAllInputs,maskTextSelector:e.maskTextSelector??o.maskTextSelector,blockSelector:e.blockSelector??o.blockSelector,flushIntervalMs:e.flushIntervalMs??o.flushIntervalMs,maxBufferBytes:e.maxBufferBytes??o.maxBufferBytes,minSessionDurationMs:e.minSessionDurationMs??o.minSessionDurationMs,sessionIdleTimeoutMs:e.sessionIdleTimeoutMs??o.sessionIdleTimeoutMs,maxSessionDurationMs:e.maxSessionDurationMs??o.maxSessionDurationMs,distinctId:e.distinctId??o.distinctId,getDistinctId:e.getDistinctId,getUser:e.getUser,captureConsole:e.captureConsole??o.captureConsole,captureNetwork:e.captureNetwork??o.captureNetwork,captureNavigation:e.captureNavigation??o.captureNavigation,ignoreUrlPatterns:e.ignoreUrlPatterns??[],redactUrlPatterns:e.redactUrlPatterns??[...o.redactUrlPatterns],onError:e.onError,fetchImpl:n,now:e.now??Date.now,random:e.random??Math.random}}function Ve(e,t,n){let r=He(n,t);if(r!==void 0)return r;let i=fe({sessionSampleRate:e.sessionSampleRate,onErrorSampleRate:e.onErrorSampleRate,random:e.random});return Y(n,t,i),i}function He(e,t){if(e!==null)try{let n=e.getItem(q);if(n===null)return;let r=JSON.parse(n);if(typeof r!=`object`||!r)return;let i=r;return i.id!==t||!Ue(i.mode)?void 0:i.mode}catch{return}}function Y(e,t,n){if(e!==null)try{e.setItem(q,JSON.stringify({id:t,mode:n}))}catch{}}function Ue(e){return e===`full`||e===`buffer`||e===`off`}function We(e){let t=typeof e==`object`&&e&&`stack`in e?e.stack:void 0;return typeof t==`string`?t:void 0}function X(e,t){e.catch(e=>{Q(t,e)})}async function Z(e,t){try{await e}catch(e){Q(t,e)}}function Q(e,t){try{let n=e?.(t);Ge(n)&&Promise.resolve(n).catch(()=>void 0)}catch{}}function Ge(e){return typeof e==`object`&&!!e&&`then`in e&&typeof e.then==`function`}function Ke(){let e=globalThis;if(e[J]!==void 0)throw Error(`logfire session replay: a replay controller is already active in this page`);let t={};Object.defineProperty(e,J,{configurable:!0,enumerable:!1,value:t,writable:!0});let n=!1;return()=>{n||(n=!0,e[J]===t&&Reflect.deleteProperty(e,J))}}function $(e){for(let t=e.length-1;t>=0;--t)try{e[t]?.()}catch{}e.length=0}function qe(e,t,n){return{message:e,...t===void 0||t.length===0?{}:{source:t},...n===void 0?{}:{stack:n}}}function Je(e){if(e==null)return`unhandledrejection`;if(typeof e==`string`)return e;if(typeof e==`number`||typeof e==`boolean`||typeof e==`bigint`||typeof e==`symbol`)return String(e);try{let t=JSON.stringify(e);return typeof t==`string`?t:Object.prototype.toString.call(e)}catch{return Object.prototype.toString.call(e)}}exports.CHUNK_ENVELOPE_VERSION=1,exports.CustomTag=a,exports.EventType=n,exports.IncrementalSource=r,exports.MouseInteractions=i,exports.ReplayUploadError=F,exports.startSessionReplay=Re;
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let e=require("@rrweb/record"),t=require("fflate");const n={DomContentLoaded:0,Load:1,FullSnapshot:2,IncrementalSnapshot:3,Meta:4,Custom:5,Plugin:6},r={Mutation:0,MouseMove:1,MouseInteraction:2,Scroll:3,ViewportResize:4,Input:5,TouchMove:6,MediaInteraction:7,Drag:12,Selection:14},i={MouseUp:0,MouseDown:1,Click:2,ContextMenu:3,DblClick:4},a={Error:`logfire.error`,Console:`logfire.console`,Network:`logfire.network`,Navigation:`logfire.navigation`},o={sessionSampleRate:1,onErrorSampleRate:1,maskAllText:!0,maskAllInputs:!0,maskTextSelector:``,blockSelector:``,flushIntervalMs:5e3,maxBufferBytes:1e6,minSessionDurationMs:1e4,sessionIdleTimeoutMs:18e5,maxSessionDurationMs:72e5,distinctId:``,captureConsole:!1,captureNetwork:!0,captureNavigation:!0,captureGlobalErrors:!0,redactUrlPatterns:[/.+/u]},s=/* @__PURE__ */ new Set([r.MouseMove,r.MouseInteraction,r.Scroll,r.ViewportResize,r.Input,r.TouchMove,r.MediaInteraction,r.Drag,r.Selection]);function c(e){return e.type!==n.IncrementalSnapshot||typeof e.data!=`object`||e.data===null||!(`source`in e.data)?!1:typeof e.data.source==`number`&&s.has(e.data.source)}function l(e,t){return t<3e4?e:t<3e5?Math.max(e,6e4):Math.max(e,3e5)}function u(e,t){return t.some(t=>new RegExp(t.source,t.flags).test(e))}function d(e,t,n){if(!u(e,t))return e;try{let t=new URL(e,n);return`${t.origin}${t.pathname}`}catch{let[t=e]=e.split(`?`),[n=t]=t.split(`#`);return n}}const f=[`log`,`info`,`warn`,`error`,`debug`],p=1024,m=()=>void 0;function h(e,t={}){let n=[],r=C(t.onError);try{for(let t of f)typeof console[t]==`function`&&n.push(T(console,t,(n,i)=>function(...o){return i()&&S(e,a.Console,{level:t,args:o.slice(0,10).map(ee)},r),n.apply(this,o)}));return E(n)}catch(e){throw D(n),e}}function g(e,t){let n=b(t),r={...n,onError:C(n.onError)},i=v(e,r);try{return E([i,y(e,r)])}catch(e){throw i(),e}}function _(e,t={redactUrlPatterns:[]}){let n=C(t.onError),r=r=>{let i=d(window.location.href,t.redactUrlPatterns??[],window.location.href);S(e,a.Navigation,{url:i,kind:r},n)},i=[];try{i.push(T(history,`pushState`,(e,t)=>function(...n){let i=e.apply(this,n);return t()&&r(`push`),i})),i.push(T(history,`replaceState`,(e,t)=>function(...n){let i=e.apply(this,n);return t()&&r(`replace`),i}));let e=!0,t=()=>{e&&r(`pop`)};return window.addEventListener(`popstate`,t),i.push(()=>{e=!1,window.removeEventListener(`popstate`,t)}),E(i)}catch(e){throw D(i),e}}function v(e,t){return typeof window.fetch==`function`?T(window,`fetch`,(n,r)=>{let i=async function(i,o){let s=n;if(!r())return s.call(this,i,o);let c=t.now(),l=te(i,o),u=ne(i);if(ae(u,t.ignoreUrlPatterns))return s.call(this,i,o);let f=d(u,t.redactUrlPatterns,window.location.href),p=A(o?.body);try{let n=await s.call(this,i,o);return r()&&S(e,a.Network,k({method:l,url:f,status:n.status,durationMs:Math.max(0,t.now()-c),reqBytes:p,resBytes:re(n.headers)}),t.onError),n}catch(n){throw r()&&S(e,a.Network,k({method:l,url:f,status:0,durationMs:Math.max(0,t.now()-c),failed:!0,reqBytes:p}),t.onError),n}},o=Reflect.get(n,`__original`);return Object.defineProperty(i,"__original",{configurable:!0,value:typeof o==`function`?o:n,writable:!0}),i}):m}function y(e,t){let n=window.XMLHttpRequest.prototype,r=/* @__PURE__ */ new WeakMap,i=[];try{return i.push(T(n,`open`,(e,n)=>function(...i){let[a,o]=i;if(!n())return e.apply(this,i);let s=o.toString();return ae(s,t.ignoreUrlPatterns)?(r.delete(this),e.apply(this,i)):(r.set(this,{method:a.toUpperCase(),url:d(s,t.redactUrlPatterns,window.location.href),startedAt:0,reqBytes:0,failed:!1,emitted:!1}),e.apply(this,i))})),i.push(T(n,`send`,(n,i)=>function(...o){let[s]=o,c=i()?r.get(this):void 0;if(c===void 0)return n.apply(this,o);c.startedAt=t.now(),c.reqBytes=A(s);let l=()=>{c.failed=!0},u=()=>{c.emitted||(c.emitted=!0,this.removeEventListener(`error`,l),this.removeEventListener(`abort`,l),this.removeEventListener(`timeout`,l),i()&&S(e,a.Network,k({method:c.method,url:c.url,status:this.status,durationMs:Math.max(0,t.now()-c.startedAt),failed:c.failed||this.status===0,reqBytes:c.reqBytes,resBytes:ie(this)}),t.onError))};this.addEventListener(`error`,l),this.addEventListener(`abort`,l),this.addEventListener(`timeout`,l),this.addEventListener(`loadend`,u,{once:!0});try{return n.apply(this,o)}catch(n){throw this.removeEventListener(`error`,l),this.removeEventListener(`abort`,l),this.removeEventListener(`timeout`,l),this.removeEventListener(`loadend`,u),i()&&S(e,a.Network,k({method:c.method,url:c.url,status:0,durationMs:Math.max(0,t.now()-c.startedAt),failed:!0,reqBytes:c.reqBytes}),t.onError),n}})),E(i)}catch(e){throw D(i),e}}function b(e){return{...e,ignoreUrlPatterns:x(e.ignoreUrlPatterns),redactUrlPatterns:x(e.redactUrlPatterns)}}function x(e){return e.map(e=>{let t=e.flags.replace(/[gy]/gu,``);return t===e.flags?e:new RegExp(e.source,t)})}function S(e,t,n,r){try{e(t,n)}catch(e){r?.(e)}}function C(e){let t=!1;return n=>{if(!t){t=!0;try{let t=e?.(n);w(t)&&Promise.resolve(t).catch(()=>void 0)}catch{}finally{t=!1}}}}function w(e){return typeof e==`object`&&!!e&&`then`in e&&typeof e.then==`function`}function T(e,t,n){let r=e,i=r[t];if(typeof i!=`function`)return m;let a=!0,o=n(i,()=>a);return r[t]=o,()=>{a&&(a=!1,r[t]===o&&(r[t]=i))}}function E(e){let t=!1;return()=>{t||(t=!0,D(e))}}function D(e){for(let t=e.length-1;t>=0;--t)try{e[t]?.()}catch{}}function ee(e){if(e==null)return String(e);if(typeof e==`string`)return O(e);if(typeof e==`number`||typeof e==`boolean`||typeof e==`bigint`)return String(e);if(e instanceof Error)return O(e.stack??`${e.name}: ${e.message}`);try{return O(JSON.stringify(e))}catch{return Object.prototype.toString.call(e)}}function O(e){if(e.length<=p)return e;let t=e.charCodeAt(1023),n=t>=55296&&t<=56319?1023:p;return`${e.slice(0,n)}...(+${String(e.length-n)} chars)`}function te(e,t){return(t?.method??(typeof e==`object`&&`method`in e?e.method:`GET`)).toUpperCase()}function ne(e){return typeof e==`string`||e instanceof URL?e.toString():e.url}function re(e){let t=e.get(`content-length`);if(t===null)return;let n=Number.parseInt(t,10);return Number.isFinite(n)?n:void 0}function ie(e){try{let t=e.getResponseHeader(`content-length`);if(t===null)return;let n=Number.parseInt(t,10);return Number.isFinite(n)?n:void 0}catch{return}}function k(e){return{method:e.method,url:e.url,status:e.status,durationMs:e.durationMs,...e.failed===void 0?{}:{failed:e.failed},...e.reqBytes===void 0?{}:{reqBytes:e.reqBytes},...e.resBytes===void 0?{}:{resBytes:e.resBytes}}}function A(e){if(e==null)return 0;if(typeof e==`string`)return new TextEncoder().encode(e).byteLength;if(e instanceof ArrayBuffer||ArrayBuffer.isView(e))return e.byteLength;if(e instanceof Blob)return e.size}function ae(e,t){return u(e,t)}const oe=/* @__PURE__ */ new Set([`action`,`formaction`,`href`,`src`]);function se(t){let n=()=>{t.beforeUserActivity?.()},r={emit:e=>{t.emit(ce(e,t.redactUrlPatterns))},maskAllInputs:t.maskAllInputs,recordCanvas:!1,collectFonts:!1,inlineImages:!1,recordCrossOriginIframes:!1,slimDOMOptions:`all`,hooks:{input:n,mediaInteaction:n,mouseInteraction:n,mousemove:n,scroll:n,selection:n,viewportResize:n},sampling:{mousemove:100,mouseInteraction:!0,scroll:250,media:800,input:`last`}};t.maskAllText?r.maskTextSelector=`*`:t.maskTextSelector!==void 0&&t.maskTextSelector.length>0&&(r.maskTextSelector=t.maskTextSelector),t.blockSelector!==void 0&&t.blockSelector.length>0&&(r.blockSelector=t.blockSelector),t.checkoutEveryNms!==void 0&&t.checkoutEveryNms>0&&(r.checkoutEveryNms=t.checkoutEveryNms);let i=(0,e.record)(r);if(i===void 0)throw Error(`logfire session replay: rrweb failed to start recording`);return{stop:()=>{i()},addCustomEvent:(t,n)=>{e.record.addCustomEvent(t,n)},takeFullSnapshot:()=>{e.record.takeFullSnapshot(!0)}}}function ce(e,t){if(typeof e.data!=`object`||e.data===null)return e;let i=e.data;if(e.type===n.Meta){if(typeof i.href!=`string`)return e;let n=d(i.href,t,window.location.href);return n===i.href?e:{...e,data:{...i,href:n}}}if(e.type!==n.FullSnapshot&&(e.type!==n.IncrementalSnapshot||i.source!==r.Mutation))return e;let a=j(i,t);return a===i?e:{...e,data:a}}function j(e,t){if(Array.isArray(e)){let n=!1,r=[];for(let i of e){let e=j(i,t);e!==i&&(n=!0),r.push(e)}return n?r:e}if(typeof e!=`object`||!e)return e;let n=e,r=!1,i={};for(let[e,a]of Object.entries(n)){let n=e===`attributes`&&!Array.isArray(a)?le(a,t):j(a,t);n!==a&&(r=!0),i[e]=n}return r?i:e}function le(e,t){if(typeof e!=`object`||!e||Array.isArray(e))return e;let n=e,r=!1,i={};for(let[e,a]of Object.entries(n)){if(!oe.has(e.toLowerCase())||typeof a!=`string`){i[e]=a;continue}let n=d(a,t,window.location.href);n!==a&&(r=!0),i[e]=n}return r?i:e}function M(e){return typeof e==`object`&&e?e:void 0}function N(e){return typeof e==`string`&&e.length>0?e:void 0}function ue(e){let t=M(e),n=N(t?.id);if(t===void 0||n===void 0)return;let r=N(t.name),i=N(t.email);return{id:n,...r===void 0?{}:{name:r},...i===void 0?{}:{email:i}}}function de(e,t,o,s={},c){let l=1/0,u=0,d=0,f=0,p=0,m=!1,h=/* @__PURE__ */ new Set;for(let e of t){e.timestamp<l&&(l=e.timestamp),e.timestamp>u&&(u=e.timestamp);let t=M(e.data);if(e.type===n.FullSnapshot)m=!0;else if(e.type===n.Meta){let e=N(t?.href);e!==void 0&&h.add(e)}else if(e.type===n.IncrementalSnapshot&&t!==void 0){let e=t.source;if(e===r.MouseInteraction){let e=t.type;(e===i.Click||e===i.DblClick)&&d++}else e===r.Input&&f++}else if(e.type===n.Custom&&t!==void 0){let e=N(t.tag),n=M(t.payload);if(e===a.Error)p++;else if(e===a.Console)n?.level===`error`&&p++;else if(e===a.Navigation){let e=N(n?.url);e!==void 0&&h.add(e)}}}return{seq:e,firstTimestamp:l===1/0?0:l,lastTimestamp:u,eventCount:t.length,clickCount:d,keypressCount:f,errorCount:p,hasFullSnapshot:m,urls:[...h],...o!==void 0&&o.length>0?{distinctId:o}:{},...c===void 0?{}:{user:{...c}},...Object.keys(s).length===0?{}:{sessionAttributes:{...s}}}}function P(e=Date.now){let t=e(),n=new Uint8Array(/* @__PURE__ */ new ArrayBuffer(16));fe(n),n[0]=Math.floor(t/2**40)&255,n[1]=Math.floor(t/2**32)&255,n[2]=Math.floor(t/2**24)&255,n[3]=Math.floor(t/2**16)&255,n[4]=Math.floor(t/256)&255,n[5]=t&255,n[6]=(n[6]??0)&15|112,n[8]=(n[8]??0)&63|128;let r=``;for(let e of n)r+=e.toString(16).padStart(2,`0`);return`${r.slice(0,8)}-${r.slice(8,12)}-${r.slice(12,16)}-${r.slice(16,20)}-${r.slice(20)}`}function fe(e){let t=globalThis.crypto;if(typeof t?.getRandomValues==`function`){t.getRandomValues(e);return}for(let t=0;t<e.length;t++)e[t]=Math.floor(Math.random()*256)}const pe=`lf_session_replay`;var me=class{idleTimeoutMs;maxDurationMs;now;storage;memorySession;pendingSession;persistenceTimer;constructor(e){this.idleTimeoutMs=e.idleTimeoutMs,this.maxDurationMs=e.maxDurationMs,this.now=e.now??Date.now,this.storage=e.storage===void 0?F():e.storage}getSession(){let e=this.now();if(this.memorySession!==void 0&&!this.isExpired(this.memorySession,e))return this.memorySession;let t=this.read();return t!==void 0&&!this.isExpired(t,e)?t:this.createSession(e)}touch(){let e=this.now(),t={...this.getSession(),lastActivityAt:e};return this.memorySession=t,this.scheduleWrite(t),t}reset(){return this.createSession(this.now())}flushPendingStorage(){this.persistenceTimer!==void 0&&(clearTimeout(this.persistenceTimer),this.persistenceTimer=void 0);let e=this.pendingSession;this.pendingSession=void 0,e!==void 0&&this.writeNow(e)}isExpired(e,t){return t-e.lastActivityAt>this.idleTimeoutMs||t-e.startedAt>this.maxDurationMs}createSession(e){let t={id:P(this.now),startedAt:e,lastActivityAt:e};return this.flushPendingStorage(),this.writeNow(t),t}read(){if(this.storage!==null)try{let e=this.storage.getItem(pe);if(e!==null){let t=JSON.parse(e);if(he(t))return this.memorySession=t,t}}catch{return this.memorySession}return this.memorySession}write(e){if(this.memorySession=e,this.storage!==null)try{this.storage.setItem(pe,JSON.stringify(e))}catch{}}scheduleWrite(e){this.pendingSession=e,this.persistenceTimer===void 0&&(this.persistenceTimer=setTimeout(()=>{this.persistenceTimer=void 0;let e=this.pendingSession;this.pendingSession=void 0,e!==void 0&&this.writeNow(e)},1e3))}writeNow(e){this.memorySession=e,this.write(e)}};function F(){try{return globalThis.sessionStorage??null}catch{return null}}function he(e){if(typeof e!=`object`||!e)return!1;let t=e;return typeof t.id==`string`&&t.id.length>0&&typeof t.startedAt==`number`&&Number.isFinite(t.startedAt)&&typeof t.lastActivityAt==`number`&&Number.isFinite(t.lastActivityAt)}var I=class extends Error{droppedSeqs;reason;seq;sessionId;status;constructor(e){super(ge(e),{cause:e.cause}),this.name=`ReplayUploadError`,this.droppedSeqs=Object.freeze([...e.droppedSeqs??[]]),this.reason=e.reason,this.seq=e.seq,this.sessionId=e.sessionId,this.status=e.status}};function ge(e){let t=e.seq===void 0?`replay chunk`:`replay chunk seq=${String(e.seq)}`,n=e.cause instanceof Error?`: ${e.cause.message}`:``;return`${t} ${e.reason}${n}`}const L=`lf_session_replay_seq`,R=1e4,z=3e4,_e={gzip:t.gzip,gzipSync:t.gzipSync};var ve=class{buffer=[];bufferHasFullSnapshot=!1;pendingBytes=0;seq=0;timer;nextFlushAt;lastUserActivityAt;startedAt;started=!1;held;heldBufferIncomplete=!1;minimumBufferIncomplete=!1;minimumDurationSatisfied=!1;firstObservedTimestamp;lastObservedTimestamp;refreshingMinimumSnapshot=!1;mode;queue=[];retainedBytes=0;activeUpload;drainPromise;draining=!1;lifecycleFlights=/* @__PURE__ */ new Set;closed=!1;shuttingDown=!1;retryAbort=new AbortController;deadlineAbort=new AbortController;resyncPending=!1;resyncTimer;lastResyncAt;reservedKeepaliveBytes=0;asyncCompressionAvailable=!0;config;compression;storage;sessionId;sessionAttributes;takeFullSnapshot;constructor(e,t,n,r=F(),i=_e,a={},o={}){this.config=e,this.sessionId=t,this.sessionAttributes=Object.freeze({...a}),this.mode=n,this.storage=r,this.compression=i,this.held=o.holdUntilActivity===!0&&n===`full`,this.takeFullSnapshot=o.takeFullSnapshot,this.minimumDurationSatisfied=e.minSessionDurationMs===0,this.seq=this.readPersistedSequence()??0,this.startedAt=this.config.now(),this.lastUserActivityAt=this.startedAt}start(){this.started||this.mode!==`full`||(this.started=!0,this.scheduleFlush())}add(e){this.minimumDurationSatisfied||(this.firstObservedTimestamp??=e.timestamp,this.lastObservedTimestamp=Math.max(this.lastObservedTimestamp??e.timestamp,e.timestamp)),c(e)&&(this.lastUserActivityAt=this.config.now());let t=H(e);if(this.resyncPending){this.addDuringResync(e,t);return}if(this.refreshingMinimumSnapshot){this.buffer.push(e),this.pendingBytes+=t;return}let r=!this.minimumDurationSatisfied;if(this.mode===`buffer`||this.held||r){if(e.type===n.Meta){this.buffer=[e],this.bufferHasFullSnapshot=!1,this.minimumBufferIncomplete=!1,this.pendingBytes=t,r&&(this.mode===`full`&&(this.firstObservedTimestamp=e.timestamp),this.finishMinimumBufferingEvent());return}if(e.type===n.FullSnapshot){let i=!this.bufferHasFullSnapshot&&this.buffer.length===1&&this.buffer[0]?.type===n.Meta?this.buffer[0]:void 0;this.buffer=i===void 0?[e]:[i,e],this.bufferHasFullSnapshot=!0,this.pendingBytes=t+(i===void 0?0:H(i)),this.heldBufferIncomplete=!1,this.minimumBufferIncomplete=!1,r&&(this.mode===`full`&&(this.firstObservedTimestamp=i?.timestamp??e.timestamp),this.finishMinimumBufferingEvent());return}if(!this.bufferHasFullSnapshot||t>this.config.maxBufferBytes){this.heldBufferIncomplete||=this.held,this.minimumBufferIncomplete||=r,r&&this.finishMinimumBufferingEvent();return}if(this.pendingBytes+t>this.config.maxBufferBytes){this.heldBufferIncomplete||=this.held,this.minimumBufferIncomplete||=r,r&&this.finishMinimumBufferingEvent();return}}if(e.type===n.Meta&&this.mode===`full`&&this.buffer.length>0&&this.flushAndReport(),this.buffer.push(e),this.pendingBytes+=t,r&&this.minimumDurationReached()){this.flushAndReport();return}this.mode===`full`&&this.pendingBytes>=this.config.maxBufferBytes&&e.type!==n.Meta?this.flushAndReport():this.scheduleFlush()}addDuringResync(e,t){if(e.type===n.Meta){this.buffer=[e],this.pendingBytes=t;return}if(e.type!==n.FullSnapshot)return;let r=this.buffer.length===1&&this.buffer[0]?.type===n.Meta?this.buffer[0]:void 0;this.buffer=r===void 0?[e]:[r,e],this.pendingBytes=t+(r===void 0?0:H(r)),this.resyncPending=!1,this.clearResyncTimer(),this.pendingBytes>=this.config.maxBufferBytes?this.flushAndReport():this.scheduleFlush()}async triggerFlush(){return this.mode===`buffer`&&(this.bufferHasFullSnapshot||(this.buffer=[],this.pendingBytes=0),this.mode=`full`,this.start()),this.flush()}async flush(e={}){return this.flushInternal(e)}async flushInternal(e={}){if(this.closed||this.mode===`buffer`||this.held||this.buffer.length===0||!this.minimumDurationReached()||(this.clearScheduledFlush(),this.minimumBufferIncomplete&&!this.refreshMinimumBuffer()))return;this.minimumDurationSatisfied=!0;let t=this.buffer,n=this.pendingBytes;this.buffer=[],this.bufferHasFullSnapshot=!1,this.minimumBufferIncomplete=!1,this.pendingBytes=0;let r=this.sessionId,i=this.snapshotIdentity();if(e.keepalive===!0){let e=Se(t),n=this.allocateSeq(e.length),a=this.deliverLifecycle(e,n,r,i);this.lifecycleFlights.add(a);let o=()=>{this.lifecycleFlights.delete(a)};a.then(o,o),await a;return}await this.enqueue(t,n,r,i)?.done}async shutdown(e={}){if(this.started=!1,this.clearScheduledFlush(),this.held||!this.minimumDurationReached()){this.discard(),await this.settleWithinDeadline([]);return}if(e.keepalive===!0){await this.flush(e),this.closed=!0,this.clearResyncTimer(),await this.settleWithinDeadline([]);return}let t=this.flushInternal();this.closed=!0,this.shuttingDown=!0,this.clearResyncTimer(),this.retryAbort.abort();let n=this.queue.filter(e=>e!==this.activeUpload).map(async e=>this.finalAttempt(e));await this.settleWithinDeadline([t,...n])}discard(){this.started=!1,this.closed=!0,this.clearScheduledFlush(),this.clearResyncTimer(),this.buffer=[],this.bufferHasFullSnapshot=!1,this.minimumBufferIncomplete=!1,this.pendingBytes=0}getMode(){return this.mode}isHeld(){return this.held}releaseHeld(e){this.held&&((this.heldBufferIncomplete||!this.bufferHasFullSnapshot)&&(this.buffer=[],this.bufferHasFullSnapshot=!1,this.pendingBytes=0,e()),this.held=!1,this.pendingBytes>=this.config.maxBufferBytes?this.flushAndReport():this.scheduleFlush())}flushAndReport(){this.flushInternal().catch(e=>{B(this.config.onError,e)})}scheduleFlush(){let e=this.config.now(),t=Math.max(0,this.config.minSessionDurationMs-(e-this.startedAt)),n=Math.max(l(this.config.flushIntervalMs,e-this.lastUserActivityAt),t);this.scheduleFlushIn(e,n)}scheduleFlushIn(e,t){if(!this.started||this.mode!==`full`||this.held||this.buffer.length===0)return;let n=e+t;this.timer!==void 0&&this.nextFlushAt!==void 0&&this.nextFlushAt<=n||(this.clearScheduledFlush(),this.nextFlushAt=n,this.timer=setTimeout(()=>{this.timer=void 0,this.nextFlushAt=void 0,this.flushAndReport()},t))}clearScheduledFlush(){this.timer!==void 0&&(clearTimeout(this.timer),this.timer=void 0),this.nextFlushAt=void 0}minimumDurationReached(){return this.minimumDurationSatisfied||this.config.minSessionDurationMs===0?!0:this.firstObservedTimestamp===void 0||this.lastObservedTimestamp===void 0?!1:this.lastObservedTimestamp-this.firstObservedTimestamp>=this.config.minSessionDurationMs}finishMinimumBufferingEvent(){this.minimumDurationReached()?this.flushAndReport():this.scheduleFlush()}refreshMinimumBuffer(){let e=this.buffer.length,t=this.pendingBytes;if(this.takeFullSnapshot!==void 0){this.refreshingMinimumSnapshot=!0;try{this.takeFullSnapshot()}catch(e){B(this.config.onError,e)}finally{this.refreshingMinimumSnapshot=!1}}return this.buffer.slice(e).some(e=>e.type===n.FullSnapshot)?(this.minimumBufferIncomplete=!1,!0):(this.buffer.length=e,this.pendingBytes=t,!1)}snapshotIdentity(){let e=this.snapshotUser(),t=this.config.distinctId;if(this.config.getDistinctId!==void 0)try{t=this.config.getDistinctId()??this.config.distinctId}catch(e){B(this.config.onError,e)}else e!==void 0&&(t=e.id);return{distinctId:t,user:e}}createEnvelope(e,t,n){return{version:1,meta:de(t,e,n.distinctId,this.sessionAttributes,n.user),events:e}}snapshotUser(){if(this.config.getUser!==void 0)try{return ue(this.config.getUser())}catch(e){B(this.config.onError,e);return}}allocateSeq(e){let t=this.seq;return this.seq+=e,this.saveSeq(this.sessionId,this.seq),t}enqueue(e,t,r,i){let a=Math.max(2e6,2*this.config.maxBufferBytes);if(this.queue.length>0&&this.retainedBytes+t>a){B(this.config.onError,new I({cause:/* @__PURE__ */ Error(`replay upload queue is full`),reason:`not-sent`,seq:void 0,sessionId:r})),this.beginResync();return}let o=()=>void 0,s={body:void 0,done:new Promise(e=>{o=e}),events:e,hasFullSnapshot:e.some(e=>e.type===n.FullSnapshot),identity:i,reachedFetch:!1,resolve:o,retainedBytes:t,seq:this.allocateSeq(1),sessionId:r,settled:!1};return this.queue.push(s),this.retainedBytes+=t,this.draining||(this.draining=!0,this.drainPromise=this.drain()),s}async drain(){try{for(;!this.shuttingDown;){let e=this.queue[0];if(e===void 0)break;this.activeUpload=e;let t=await this.deliverQueued(e);this.activeUpload=void 0,this.settle(e,t)}}finally{this.activeUpload=void 0,this.draining=!1}}async deliverQueued(e){let t=await this.compressQueued(e);if(t!==void 0||e.settled)return t;let n=Date.now(),r;for(let t=1;;t++){let i=z-(Date.now()-n);if(t>1&&i<=0)return G(r,e.reachedFetch);let a=await this.attemptQueued(e,Math.min(R,i));if(a===void 0)return;r=a;let o=Ee(a,t,this.config.random);if(o===void 0||this.shuttingDown||Date.now()-n+o>=z)return G(a,e.reachedFetch);await this.backoff(o)}}async compressQueued(e){if(e.body!==void 0||e.events===void 0)return;let n=e.events;try{let r=(0,t.strToU8)(JSON.stringify(this.createEnvelope(n,e.seq,e.identity))),i=this.shuttingDown?this.compression.gzipSync(r):await this.compressOrdinary(r);if(e.events!==n)return await this.compressQueued(e);e.settled||(this.retainedBytes+=i.byteLength-e.retainedBytes,e.retainedBytes=i.byteLength,e.body=i,e.events=void 0);return}catch(e){return{cause:e,reason:`not-sent`}}}async attemptQueued(e,t=R){let n=e.body;if(n!==void 0)try{await this.send({body:n,requestKeepalive:!1,reservedBytes:0,seq:e.seq,sessionId:e.sessionId},()=>{e.reachedFetch=!0},t);return}catch(e){return e}}async finalAttempt(e){let t=await this.compressQueued(e);if(t!==void 0){this.settle(e,t);return}let n=await this.attemptQueued(e);this.settle(e,n===void 0?void 0:G(n,e.reachedFetch))}async settleWithinDeadline(e){let t=Promise.all([...e,this.drainPromise,...this.lifecycleFlights]).then(()=>void 0,()=>void 0),n,r=new Promise(e=>{n=setTimeout(e,R)});if(await Promise.race([t,r]),clearTimeout(n),this.shuttingDown){this.deadlineAbort.abort(/* @__PURE__ */ Error(`replay upload did not finish before shutdown`));for(let e of[...this.queue])this.settle(e,{cause:/* @__PURE__ */ Error(`replay upload did not finish before shutdown`),reason:e.reachedFetch?`unconfirmed`:`not-sent`})}}settle(e,t){if(e.settled)return;e.settled=!0,this.retainedBytes-=e.retainedBytes;let n=this.queue.indexOf(e);n>=0&&this.queue.splice(n,1),e.body=void 0,e.events=void 0,e.resolve(),t!==void 0&&this.handleSequencedLoss(e.seq,e.sessionId,t)}handleSequencedLoss(e,t,n){let r=[];if(!this.shuttingDown){let t=!1;for(let n of[...this.queue])if(!(n.seq<e)){if(n.events===void 0){if(n.hasFullSnapshot){t=!0;break}continue}if(n.hasFullSnapshot){let e=U(n.events),r=W(e);this.retainedBytes+=r-n.retainedBytes,n.retainedBytes=r,n.events=e,t=!0;break}r.push(n.seq),this.settle(n,void 0)}!t&&!this.trimBufferToAnchor()&&this.beginResync()}B(this.config.onError,new I({cause:n.cause,droppedSeqs:r,reason:n.reason,seq:e,sessionId:t,status:n.status}))}trimBufferToAnchor(){return this.buffer.some(e=>e.type===n.FullSnapshot)?(this.buffer=U(this.buffer),this.pendingBytes=W(this.buffer),!0):!1}beginResync(){this.closed||(this.resyncPending=!0,this.buffer=[],this.bufferHasFullSnapshot=!1,this.pendingBytes=0,this.clearScheduledFlush(),this.scheduleResyncSnapshot())}scheduleResyncSnapshot(){if(this.resyncTimer!==void 0||this.closed)return;let e=this.lastResyncAt===void 0?0:Math.max(0,this.lastResyncAt+6e4-this.config.now());this.resyncTimer=setTimeout(()=>{this.resyncTimer=void 0,this.takeResyncSnapshot()},e)}takeResyncSnapshot(){if(this.resyncPending&&!this.closed&&this.takeFullSnapshot!==void 0){this.lastResyncAt=this.config.now();try{this.takeFullSnapshot()}catch(e){B(this.config.onError,e),this.scheduleResyncSnapshot();return}this.isResyncPending()&&(B(this.config.onError,/* @__PURE__ */ Error(`replay resync snapshot produced no full snapshot`)),this.scheduleResyncSnapshot())}}isResyncPending(){return this.resyncPending}clearResyncTimer(){this.resyncTimer!==void 0&&(clearTimeout(this.resyncTimer),this.resyncTimer=void 0)}async backoff(e){let t=this.retryAbort.signal;t.aborted||await new Promise(n=>{let r=()=>{clearTimeout(i),t.removeEventListener(`abort`,r),n()},i=setTimeout(r,e);t.addEventListener(`abort`,r)})}async deliverLifecycle(e,n,r,i){let a=[];for(let o=0;o<e.length;o++){let s=e[o];if(s===void 0){a.push(void 0);continue}let c=this.createEnvelope(s,n+o,i);try{a.push({body:this.compression.gzipSync((0,t.strToU8)(JSON.stringify(c))),requestKeepalive:!1,reservedBytes:0,seq:n+o,sessionId:r})}catch(e){this.handleSequencedLoss(n+o,r,{cause:e,reason:`not-sent`}),a.push(void 0)}}let o=!0,s=Math.max(0,48e3-this.reservedKeepaliveBytes);for(let e of a){if(e===void 0){o=!1;continue}o&&e.body.byteLength<=s?(e.requestKeepalive=!0,e.reservedBytes=e.body.byteLength,this.reservedKeepaliveBytes+=e.reservedBytes,s-=e.reservedBytes):o=!1}await Promise.all(a.map(async e=>{if(e===void 0)return;let t=!1;try{await this.send(e,()=>{t=!0})}catch(n){this.handleSequencedLoss(e.seq,e.sessionId,G(n,t))}}))}async compressOrdinary(e){if(!this.asyncCompressionAvailable)return this.compression.gzipSync(e);try{return await Ce(this.compression,e)}catch{return this.asyncCompressionAvailable=!1,this.compression.gzipSync(e)}}async send(e,t,n=R){let r,i,a,o=new AbortController,s=setTimeout(()=>{o.abort(/* @__PURE__ */ Error(`replay upload timed out after ${String(n)}ms`))},n),c=this.deadlineAbort.signal,l=()=>{o.abort(c.reason)};c.addEventListener(`abort`,l);try{let n=`${this.config.replayUrl.replace(/\/+$/u,``)}/${encodeURIComponent(e.sessionId)}?seq=${String(e.seq)}`,s=await xe(this.getUploadHeaders(),o.signal);t();let c=this.config.fetchImpl(n,{method:`POST`,headers:s,body:e.body.slice(),keepalive:e.requestKeepalive,signal:o.signal});r=!0;let l=await c;if(i=!0,a=await we(l),!l.ok){let e=l.status===429||l.status===503?De(l.headers.get(`retry-after`),Date.now()):void 0;throw new V(l.status,e)}}finally{clearTimeout(s),c.removeEventListener(`abort`,l),e.reservedBytes>0&&(r!==!0||i!==!0||a===!0)&&(this.reservedKeepaliveBytes=Math.max(0,this.reservedKeepaliveBytes-e.reservedBytes))}}async getUploadHeaders(){let e=this.config.headers===void 0?{}:await this.config.headers(),t=await be(this.config.token);return{...t===void 0||t.length===0?e:{...Object.fromEntries(Object.entries(e).filter(([e])=>e.toLowerCase()!==`authorization`)),Authorization:`Bearer ${t}`},"Content-Type":`application/json`,"Content-Encoding":`gzip`}}canResumeSequence(){return this.readPersistedSequence()===this.seq}readPersistedSequence(){if(this.storage!==null)try{let e=this.storage.getItem(L);if(e===null)return;let t=JSON.parse(e);if(typeof t!=`object`||!t)return;let n=t;return n.id===this.sessionId&&typeof n.seq==`number`&&Number.isSafeInteger(n.seq)&&n.seq>=0?n.seq:void 0}catch{return}}saveSeq(e,t){if(this.storage!==null)try{this.storage.setItem(L,JSON.stringify({id:e,seq:t}))}catch{}}};function B(e,t){try{let n=e?.(t);ye(n)&&Promise.resolve(n).catch(()=>void 0)}catch{}}function ye(e){return typeof e==`object`&&!!e&&`then`in e&&typeof e.then==`function`}var V=class extends Error{retryAfter;status;constructor(e,t){super(`replay ingest failed: ${String(e)}`),this.status=e,this.retryAfter=t,this.name=`ReplayIngestError`}};async function be(e){return typeof e==`function`?e():e}async function xe(e,t){if(t.aborted)throw t.reason;return new Promise((n,r)=>{let i=()=>{r(t.reason)};t.addEventListener(`abort`,i,{once:!0}),e.then(e=>{t.removeEventListener(`abort`,i),n(e)},e=>{t.removeEventListener(`abort`,i),r(e instanceof Error?e:Error(String(e)))})})}function H(e){try{return(0,t.strToU8)(JSON.stringify(e)).byteLength}catch{return 0}}function U(e){let t=e.findIndex(e=>e.type===n.FullSnapshot);if(t<0)return e;let r=t>0&&e[t-1]?.type===n.Meta?t-1:t;return e.slice(r)}function W(e){return e.reduce((e,t)=>e+H(t),0)}function Se(e){let t=[],n=[],r=0;for(let i of e){let e=H(i);n.length>0&&r+e>48e3&&(t.push(n),n=[],r=0),n.push(i),r+=e}return n.length>0&&t.push(n),t}async function Ce(e,t){return new Promise((n,r)=>{let i=[];typeof window<`u`&&i.push(window),typeof document<`u`&&i.push(document);let a=()=>{for(let e of i)e.removeEventListener(`securitypolicyviolation`,s)},o=(e,t)=>{if(a(),e!==null){r(e);return}n(t)},s=e=>{let t=e;(t.effectiveDirective.includes(`worker-src`)||t.violatedDirective.includes(`worker-src`))&&o(/* @__PURE__ */ Error(`replay compression worker blocked by Content Security Policy`))};for(let e of i)e.addEventListener(`securitypolicyviolation`,s);try{e.gzip(t,{level:6},(e,t)=>{o(e,t)})}catch(e){a(),r(e instanceof Error?e:Error(String(e)))}})}async function we(e){if(e.body===null)return!0;try{return await e.body.cancel(),!0}catch{return!1}}function Te(e){return e===408||e===425||e===429||e>=500}function Ee(e,t,n){if(e instanceof V&&!Te(e.status))return;let r=Math.min(8e3,500*2**(t-1)),i=Math.round(r*(1-.5*n())),a=e instanceof V?e.retryAfter:void 0;return a===void 0?i:Math.max(a,i)}function G(e,t){let n=e instanceof V?e.status:void 0;return n!==void 0&&!Te(n)?{cause:e,reason:`rejected`,status:n}:{cause:e,reason:t?`unconfirmed`:`not-sent`,status:n}}function De(e,t){if(e===null)return;let n=e.trim();if(/^\d+$/u.test(n)){let e=Number(n);return Number.isSafeInteger(e)?e*1e3:void 0}let r=je(n,t);return r===void 0?void 0:Math.max(0,r-t)}const Oe=[`Jan`,`Feb`,`Mar`,`Apr`,`May`,`Jun`,`Jul`,`Aug`,`Sep`,`Oct`,`Nov`,`Dec`],ke=[`Sun`,`Mon`,`Tue`,`Wed`,`Thu`,`Fri`,`Sat`],Ae=[`Sunday`,`Monday`,`Tuesday`,`Wednesday`,`Thursday`,`Friday`,`Saturday`];function je(e,t){let n=/^(Sun|Mon|Tue|Wed|Thu|Fri|Sat), (\d{2}) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) (\d{4}) (\d{2}):(\d{2}):(\d{2}) GMT$/u.exec(e);if(n!==null)return K(n[1],n[2],n[3],n[4],n[5],n[6],n[7]);let r=/^(Sunday|Monday|Tuesday|Wednesday|Thursday|Friday|Saturday), (\d{2})-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-(\d{2}) (\d{2}):(\d{2}):(\d{2}) GMT$/u.exec(e);if(r!==null){let e=new Date(t).getUTCFullYear(),n=Number(r[4]),i=Math.floor(e/100)*100+n;return i>e+50&&(i-=100),K(r[1],r[2],r[3],String(i),r[5],r[6],r[7])}let i=/^(Sun|Mon|Tue|Wed|Thu|Fri|Sat) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) (\d{2}| \d) (\d{2}):(\d{2}):(\d{2}) (\d{4})$/u.exec(e);if(i!==null)return K(i[1],i[3]?.trim(),i[2],i[7],i[4],i[5],i[6])}function K(e,t,n,r,i,a,o){let s=Number(t),c=Oe.indexOf(n),l=Number(r),u=Number(i),d=Number(a),f=Number(o);if(c<0||s<1||s>31||u>23||d>59||f>59)return;let p=/* @__PURE__ */ new Date(0);if(p.setUTCFullYear(l,c,s),p.setUTCHours(u,d,f,0),p.getUTCFullYear()!==l||p.getUTCMonth()!==c||p.getUTCDate()!==s||p.getUTCHours()!==u||p.getUTCMinutes()!==d||p.getUTCSeconds()!==f)return;let m=ke.indexOf(e),h=Ae.indexOf(e);return(m>=0?m:h)===p.getUTCDay()?p.getTime():void 0}const Me=`lf_session_replay_recording`,q=`lf_session_replay_recording_owner`;var Ne=class{state;storage;owner;now;maxDurationMs;readOpenerState;constructor(e,t,n,r=()=>null){this.storage=e,this.now=t,this.owner=P(t),this.maxDurationMs=Math.min(n,72e5),this.readOpenerState=r;try{e?.getItem(`lf_session_replay_recording_owner`)===null&&(this.state=this.readResumableState()),e?.setItem(q,this.owner),e?.getItem(`lf_session_replay_recording_owner`)!==this.owner&&(this.storage=null,this.state=void 0)}catch{this.storage=null,this.state=void 0}}get(e){if(this.state!==void 0&&this.isCurrent(this.state.id,e))return this.state.id;this.state={id:P(this.now),rumSessionId:e,startedAt:this.now()};try{this.storage?.setItem(Me,JSON.stringify(this.state))}catch{}return this.state.id}isCurrent(e,t){let n=this.state;if(n===void 0)return!1;let r=this.now();return n.id===e&&n.rumSessionId===t&&r>=n.startedAt&&r-n.startedAt<this.maxDurationMs}release(){try{this.storage?.getItem(`lf_session_replay_recording_owner`)===this.owner&&this.storage.removeItem(q)}catch{}}resume(){try{this.state=this.storage?.getItem(`lf_session_replay_recording_owner`)===null?this.readResumableState():void 0,this.storage?.setItem(q,this.owner),this.storage?.getItem(`lf_session_replay_recording_owner`)!==this.owner&&(this.state=void 0,this.storage=null)}catch{this.state=void 0,this.storage=null}}readResumableState(){let e=this.storage?.getItem(Me),t=this.storage?.getItem(L);if(e==null||t==null)return;let n=null;try{n=this.readOpenerState()}catch{}if(n!==e)return Pe(e,t)}};function Pe(e,t){let n=JSON.parse(e),r=JSON.parse(t);if(typeof n!=`object`||!n||typeof r!=`object`||!r)return;let i=n,a=r;if(!(typeof i.id!=`string`||i.id.length===0||typeof i.rumSessionId!=`string`||typeof i.startedAt!=`number`||!Number.isFinite(i.startedAt)||a.id!==i.id||typeof a.seq!=`number`||!Number.isSafeInteger(a.seq)||a.seq<0))return{id:i.id,rumSessionId:i.rumSessionId,startedAt:i.startedAt}}function Fe(e){return Number.isFinite(e)?Math.min(1,Math.max(0,e)):0}function Ie(e){let t=e.random??Math.random;return t()<Fe(e.sessionSampleRate)?`full`:t()<Fe(e.onErrorSampleRate)?`buffer`:`off`}const Le=/^[a-z][a-z0-9_]{0,63}$/u;function Re(e,t){let n=0;for(let r of e)if(n+=+(r.length>0),n>t)return!1;return!0}function ze(e,t){if(e===void 0)return Object.freeze({});let n;try{n=e()}catch(e){return t(e),Object.freeze({})}if(typeof n!=`object`||!n||Array.isArray(n))return Object.freeze({});let r;try{r=Object.getPrototypeOf(n)}catch(e){return t(e),Object.freeze({})}if(r!==Object.prototype&&r!==null)return Object.freeze({});let i;try{i=Object.keys(n)}catch(e){return t(e),Object.freeze({})}let a={},o=0;for(let e of i){if(!Le.test(e))continue;let r;try{r=Reflect.get(n,e)}catch(e){t(e);continue}if((typeof r==`boolean`||typeof r==`number`&&Number.isFinite(r)||typeof r==`string`&&Re(r,200))&&(Object.defineProperty(a,e,{configurable:!0,enumerable:!0,value:r,writable:!0}),o+=1,o===20))break}return Object.freeze(a)}const Be={mode:`off`,recording:!1,getSessionId:()=>``,captureError:()=>void 0,getRecordingId:()=>``,flush:async()=>Promise.resolve(),stop:async()=>Promise.resolve()},Ve=`lf_session_replay_mode`,J=Symbol.for(`@pydantic/logfire-session-replay/controller`);function He(e){if(typeof window>`u`||typeof document>`u`)return Be;let t=$e();try{let n=We(e),r=new me({idleTimeoutMs:n.sessionIdleTimeoutMs,maxDurationMs:n.maxSessionDurationMs,now:n.now}),i=r.getSession().id,a=e=>{let t;try{t=n.getSessionId?.()}catch(e){return Z(n.onError,e),i}if(t!==void 0&&t.length>0)return i=t,t;let a=e?r.touch().id:r.getSession().id;return i=a,a},o=F(),s=new Ne(o,n.now,n.maxSessionDurationMs,()=>window.opener?.sessionStorage.getItem(`lf_session_replay_recording`)??null),c=a(!1),l=s.get(c),u,d=!1,f=!1,p=0,m=!0,h=Promise.resolve(),g=Promise.resolve(),_,v=(e,t,r=!t)=>{let i=Ge(n,e,o);if(!(i===`off`||d||f||u!==void 0||e!==c))try{let t=l;u=Ue({config:n,getSessionId:a,mode:i,onSessionChanged:y,samplingModeStorage:o,sessionId:e,recordingId:t,isCurrentRecording:()=>s.isCurrent(t,a(!1)),holdUntilActivity:r})}catch(e){if(u=void 0,t)throw e;Z(n.onError,e)}},y=(e,t=!0)=>{if(d||f)return;let r=s.get(e);if(e===c&&r===l)return;c=e,l=r;let i=u;u=void 0;let a=i?.deactivate()??Promise.resolve(),o=p;h=h.then(async()=>{await X(a,n.onError),!d&&p===o&&c===e&&l===r&&v(e,!1,t)})},b;try{v(c,!0),b=setInterval(()=>{y(a(!1))},1e3)}catch(e){throw u?.discard(),u=void 0,s.release(),e}let x=()=>{f=!0,p+=1;let e=u;u=void 0;let t=e?.deactivate(!0)??Promise.resolve();g=Promise.all([g,h,X(t,n.onError)]).then(()=>void 0),h=Promise.resolve(),m=e?.transport.canResumeSequence()??m,m&&s.release()},S=e=>{if(!e.persisted||d)return;u?.discard(),u=void 0;let t=p;h=h.then(async()=>{await new Promise(e=>{setTimeout(e,0)}),!(d||p!==t)&&(f=!1,s.resume(),c=a(!1),l=s.get(c),m=!0,v(c,!1,!1))})};return window.addEventListener(`pagehide`,x),window.addEventListener(`pageshow`,S),{get mode(){try{return u?.transport.getMode()??`off`}catch(e){return Z(n.onError,e),`off`}},get recording(){try{return u!==void 0}catch(e){return Z(n.onError,e),!1}},getSessionId:()=>a(!1),captureError:(e,t)=>{try{u?.captureError(e,t)}catch(e){Z(n.onError,e)}},getRecordingId:()=>u!==void 0&&s.isCurrent(u.recordingId,a(!1))?u.recordingId:``,flush:async()=>{try{await h,await u?.transport.flush()}catch(e){Z(n.onError,e)}},stop:async()=>(_??=(async()=>{d=!0,p+=1,clearInterval(b),window.removeEventListener(`pagehide`,x),window.removeEventListener(`pageshow`,S);let e=u;u=void 0,await X(e?.deactivate()??Promise.resolve(),n.onError),await h,await g,r.flushPendingStorage(),m=e?.transport.canResumeSequence()??m,m&&s.release(),t()})(),_)}}catch(e){throw t(),e}}function Ue(e){let{config:t,getSessionId:n,holdUntilActivity:r,mode:i,onSessionChanged:o,samplingModeStorage:s,sessionId:l,recordingId:u,isCurrentRecording:d}=e,f=ze(t.getSessionAttributes,e=>{Z(t.onError,e)}),p,m=new ve(t,u,i,void 0,void 0,f,{holdUntilActivity:r,takeFullSnapshot:()=>{p.takeFullSnapshot()}}),v=[],y=!0,b=()=>y,x;try{p=se({beforeUserActivity:()=>{if(y&&m.isHeld())try{let e=n(!0);if(e!==l||!d()){o(e,!1);return}m.releaseHeld(()=>{p.takeFullSnapshot()})}catch(e){Z(t.onError,e)}},emit:e=>{if(y)try{let t=n(c(e));if(t!==l||!d()){o(t,!1);return}m.add(e)}catch(e){Z(t.onError,e)}},maskAllText:t.maskAllText,maskAllInputs:t.maskAllInputs,maskTextSelector:t.maskTextSelector,blockSelector:t.blockSelector,checkoutEveryNms:i===`buffer`?12e4:Math.max(3e5,t.minSessionDurationMs),redactUrlPatterns:t.redactUrlPatterns}),v.push(()=>{p.stop()});let e=(e,n)=>{if(y)try{p.addCustomEvent(e,n)}catch(e){Z(t.onError,e)}},r=n=>{b()&&(m.releaseHeld(()=>{p.takeFullSnapshot()}),e(a.Error,n),b()&&m.getMode()===`buffer`&&(qe(s,l,`full`),Y(m.triggerFlush(),t.onError)))},f=/* @__PURE__ */ new WeakSet,S=e=>typeof e!=`object`||!e||!f.has(e)&&(f.add(e),!0),C=(e,t)=>{if(S(e)){let n=$(Ye(e),void 0,Xe(e));r(typeof t?.timestamp==`number`?{...n,timestamp:t.timestamp}:n)}},w=e=>{e instanceof ErrorEvent&&S(e.error)&&r($(e.message,e.filename,Xe(e.error)))},T=e=>{C(e.reason)},E=()=>{document.visibilityState===`hidden`&&Y(m.flush({keepalive:!0}),t.onError)},D=()=>{Y(m.flush({keepalive:!0}),t.onError)};return t.captureGlobalErrors&&(window.addEventListener(`error`,w,!0),v.push(()=>{window.removeEventListener(`error`,w,!0)}),window.addEventListener(`unhandledrejection`,T,!0),v.push(()=>{window.removeEventListener(`unhandledrejection`,T,!0)})),document.addEventListener(`visibilitychange`,E),v.push(()=>{document.removeEventListener(`visibilitychange`,E)}),window.addEventListener(`pagehide`,D),v.push(()=>{window.removeEventListener(`pagehide`,D)}),t.captureConsole&&v.push(h(e,{onError:t.onError})),t.captureNetwork&&v.push(g(e,{ignoreUrlPatterns:t.ignoreUrlPatterns,now:t.now,onError:t.onError,redactUrlPatterns:t.redactUrlPatterns})),t.captureNavigation&&v.push(_(e,{onError:t.onError,redactUrlPatterns:t.redactUrlPatterns})),m.start(),{sessionId:l,recordingId:u,transport:m,captureError:C,deactivate:async(e=!1)=>(x??=(async()=>{let t=m.shutdown({keepalive:e});y=!1,Q(v),await t})(),x),discard:()=>{y=!1,Q(v),m.discard()}}}catch(e){throw y=!1,Q(v),m.discard(),e}}function We(e){if(e.replayUrl.length===0)throw Error("logfire session replay: `replayUrl` is required");let t=new URL(e.replayUrl,`https://logfire.invalid/`);if(t.search!==``||t.hash!==``)throw Error("logfire session replay: `replayUrl` must not contain a query or fragment");let n=e.fetchImpl??(typeof fetch==`function`?fetch.bind(globalThis):void 0);if(n===void 0)throw Error("logfire session replay: no `fetch` available; pass `fetchImpl`");return{replayUrl:e.replayUrl,headers:e.headers,token:e.token,getSessionId:e.getSessionId,getSessionAttributes:e.getSessionAttributes,sessionSampleRate:e.sessionSampleRate??o.sessionSampleRate,onErrorSampleRate:e.onErrorSampleRate??o.onErrorSampleRate,maskAllText:e.maskAllText??o.maskAllText,maskAllInputs:e.maskAllInputs??o.maskAllInputs,maskTextSelector:e.maskTextSelector??o.maskTextSelector,blockSelector:e.blockSelector??o.blockSelector,flushIntervalMs:e.flushIntervalMs??o.flushIntervalMs,maxBufferBytes:e.maxBufferBytes??o.maxBufferBytes,minSessionDurationMs:e.minSessionDurationMs??o.minSessionDurationMs,sessionIdleTimeoutMs:e.sessionIdleTimeoutMs??o.sessionIdleTimeoutMs,maxSessionDurationMs:e.maxSessionDurationMs??o.maxSessionDurationMs,distinctId:e.distinctId??o.distinctId,getDistinctId:e.getDistinctId,getUser:e.getUser,captureConsole:e.captureConsole??o.captureConsole,captureNetwork:e.captureNetwork??o.captureNetwork,captureNavigation:e.captureNavigation??o.captureNavigation,captureGlobalErrors:e.captureGlobalErrors??o.captureGlobalErrors,ignoreUrlPatterns:e.ignoreUrlPatterns??[],redactUrlPatterns:e.redactUrlPatterns??[...o.redactUrlPatterns],onError:e.onError,fetchImpl:n,now:e.now??Date.now,random:e.random??Math.random}}function Ge(e,t,n){let r=Ke(n,t);if(r!==void 0)return r;let i=Ie({sessionSampleRate:e.sessionSampleRate,onErrorSampleRate:e.onErrorSampleRate,random:e.random});return qe(n,t,i),i}function Ke(e,t){if(e!==null)try{let n=e.getItem(Ve);if(n===null)return;let r=JSON.parse(n);if(typeof r!=`object`||!r)return;let i=r;return i.id!==t||!Je(i.mode)?void 0:i.mode}catch{return}}function qe(e,t,n){if(e!==null)try{e.setItem(Ve,JSON.stringify({id:t,mode:n}))}catch{}}function Je(e){return e===`full`||e===`buffer`||e===`off`}function Ye(e){return et(Ze(e,`message`)??e)}function Xe(e){let t=Ze(e,`stack`);return typeof t==`string`?t:void 0}function Ze(e,t){try{return typeof e==`object`&&e&&t in e?e[t]:void 0}catch{return}}function Y(e,t){e.catch(e=>{Z(t,e)})}async function X(e,t){try{await e}catch(e){Z(t,e)}}function Z(e,t){try{let n=e?.(t);Qe(n)&&Promise.resolve(n).catch(()=>void 0)}catch{}}function Qe(e){return typeof e==`object`&&!!e&&`then`in e&&typeof e.then==`function`}function $e(){let e=globalThis;if(e[J]!==void 0)throw Error(`logfire session replay: a replay controller is already active in this page`);let t={};Object.defineProperty(e,J,{configurable:!0,enumerable:!1,value:t,writable:!0});let n=!1;return()=>{n||(n=!0,e[J]===t&&Reflect.deleteProperty(e,J))}}function Q(e){for(let t=e.length-1;t>=0;--t)try{e[t]?.()}catch{}e.length=0}function $(e,t,n){return{message:e,...t===void 0||t.length===0?{}:{source:t},...n===void 0?{}:{stack:n}}}function et(e){if(e==null)return`unhandledrejection`;if(typeof e==`string`)return e;if(typeof e==`number`||typeof e==`boolean`||typeof e==`bigint`||typeof e==`symbol`)return String(e);try{return Object.prototype.toString.call(e)}catch{return`[object Object]`}}exports.CHUNK_ENVELOPE_VERSION=1,exports.CustomTag=a,exports.EventType=n,exports.IncrementalSource=r,exports.MouseInteractions=i,exports.ReplayUploadError=I,exports.startSessionReplay=He;
|
package/dist/index.d.cts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export { CHUNK_ENVELOPE_VERSION, type ChunkEnvelope, type ChunkMeta, type ConsolePayload, CustomTag, EventType, IncrementalSource, MouseInteractions, type NavigationPayload, type NetworkPayload, ReplayUploadError, type ReplayUploadErrorInit, type ReplayUploadFailureReason, type ReplayUser, type RrwebEvent, type SamplingMode, type SessionAttributeValue, type SessionAttributes, type SessionAttributesInput, SessionReplay, type SessionReplayConfig, startSessionReplay };
|
|
1
|
+
import { C as SessionReplayConfig, S as SessionAttributesInput, _ as ReplayUser, a as ReplayUploadErrorInit, b as SessionAttributeValue, c as ChunkEnvelope, d as CustomTag, f as EventType, g as NetworkPayload, h as NavigationPayload, i as ReplayUploadError, l as ChunkMeta, m as MouseInteractions, n as SessionReplay, o as ReplayUploadFailureReason, p as IncrementalSource, r as startSessionReplay, s as CHUNK_ENVELOPE_VERSION, t as CaptureErrorOptions, u as ConsolePayload, v as RrwebEvent, x as SessionAttributes, y as SamplingMode } from "./index-BxzwrVOz.js";
|
|
2
|
+
export { CHUNK_ENVELOPE_VERSION, CaptureErrorOptions, type ChunkEnvelope, type ChunkMeta, type ConsolePayload, CustomTag, EventType, IncrementalSource, MouseInteractions, type NavigationPayload, type NetworkPayload, ReplayUploadError, type ReplayUploadErrorInit, type ReplayUploadFailureReason, type ReplayUser, type RrwebEvent, type SamplingMode, type SessionAttributeValue, type SessionAttributes, type SessionAttributesInput, SessionReplay, type SessionReplayConfig, startSessionReplay };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export { CHUNK_ENVELOPE_VERSION, type ChunkEnvelope, type ChunkMeta, type ConsolePayload, CustomTag, EventType, IncrementalSource, MouseInteractions, type NavigationPayload, type NetworkPayload, ReplayUploadError, type ReplayUploadErrorInit, type ReplayUploadFailureReason, type ReplayUser, type RrwebEvent, type SamplingMode, type SessionAttributeValue, type SessionAttributes, type SessionAttributesInput, SessionReplay, type SessionReplayConfig, startSessionReplay };
|
|
1
|
+
import { C as SessionReplayConfig, S as SessionAttributesInput, _ as ReplayUser, a as ReplayUploadErrorInit, b as SessionAttributeValue, c as ChunkEnvelope, d as CustomTag, f as EventType, g as NetworkPayload, h as NavigationPayload, i as ReplayUploadError, l as ChunkMeta, m as MouseInteractions, n as SessionReplay, o as ReplayUploadFailureReason, p as IncrementalSource, r as startSessionReplay, s as CHUNK_ENVELOPE_VERSION, t as CaptureErrorOptions, u as ConsolePayload, v as RrwebEvent, x as SessionAttributes, y as SamplingMode } from "./index-BxzwrVOz.js";
|
|
2
|
+
export { CHUNK_ENVELOPE_VERSION, CaptureErrorOptions, type ChunkEnvelope, type ChunkMeta, type ConsolePayload, CustomTag, EventType, IncrementalSource, MouseInteractions, type NavigationPayload, type NetworkPayload, ReplayUploadError, type ReplayUploadErrorInit, type ReplayUploadFailureReason, type ReplayUser, type RrwebEvent, type SamplingMode, type SessionAttributeValue, type SessionAttributes, type SessionAttributesInput, SessionReplay, type SessionReplayConfig, startSessionReplay };
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{record as e}from"@rrweb/record";import{gzip as t,gzipSync as n,strToU8 as r}from"fflate";const i={DomContentLoaded:0,Load:1,FullSnapshot:2,IncrementalSnapshot:3,Meta:4,Custom:5,Plugin:6},a={Mutation:0,MouseMove:1,MouseInteraction:2,Scroll:3,ViewportResize:4,Input:5,TouchMove:6,MediaInteraction:7,Drag:12,Selection:14},o={MouseUp:0,MouseDown:1,Click:2,ContextMenu:3,DblClick:4},s={Error:`logfire.error`,Console:`logfire.console`,Network:`logfire.network`,Navigation:`logfire.navigation`},c=1,l={sessionSampleRate:1,onErrorSampleRate:1,maskAllText:!0,maskAllInputs:!0,maskTextSelector:``,blockSelector:``,flushIntervalMs:5e3,maxBufferBytes:1e6,minSessionDurationMs:1e4,sessionIdleTimeoutMs:18e5,maxSessionDurationMs:144e5,distinctId:``,captureConsole:!1,captureNetwork:!0,captureNavigation:!0,redactUrlPatterns:[/.+/u]},u=new Set([a.MouseMove,a.MouseInteraction,a.Scroll,a.ViewportResize,a.Input,a.TouchMove,a.MediaInteraction,a.Drag,a.Selection]);function d(e){return e.type!==i.IncrementalSnapshot||typeof e.data!=`object`||e.data===null||!(`source`in e.data)?!1:typeof e.data.source==`number`&&u.has(e.data.source)}function f(e,t){return t<3e4?e:t<3e5?Math.max(e,6e4):Math.max(e,3e5)}function p(e,t){return t.some(t=>new RegExp(t.source,t.flags).test(e))}function m(e,t,n){if(!p(e,t))return e;try{let t=new URL(e,n);return`${t.origin}${t.pathname}`}catch{let[t=e]=e.split(`?`),[n=t]=t.split(`#`);return n}}const h=[`log`,`info`,`warn`,`error`,`debug`],g=1024,_=()=>void 0;function ee(e,t={}){let n=[],r=S(t.onError);try{for(let t of h)typeof console[t]==`function`&&n.push(C(console,t,(n,i)=>function(...a){return i()&&x(e,s.Console,{level:t,args:a.slice(0,10).map(ae)},r),n.apply(this,a)}));return w(n)}catch(e){throw T(n),e}}function te(e,t){let n=re(t),r={...n,onError:S(n.onError)},i=v(e,r);try{return w([i,y(e,r)])}catch(e){throw i(),e}}function ne(e,t={redactUrlPatterns:[]}){let n=S(t.onError),r=r=>{let i=m(window.location.href,t.redactUrlPatterns??[],window.location.href);x(e,s.Navigation,{url:i,kind:r},n)},i=[];try{i.push(C(history,`pushState`,(e,t)=>function(...n){let i=e.apply(this,n);return t()&&r(`push`),i})),i.push(C(history,`replaceState`,(e,t)=>function(...n){let i=e.apply(this,n);return t()&&r(`replace`),i}));let e=!0,t=()=>{e&&r(`pop`)};return window.addEventListener(`popstate`,t),i.push(()=>{e=!1,window.removeEventListener(`popstate`,t)}),w(i)}catch(e){throw T(i),e}}function v(e,t){return typeof window.fetch==`function`?C(window,`fetch`,(n,r)=>{let i=async function(i,a){let o=n;if(!r())return o.call(this,i,a);let c=t.now(),l=oe(i,a),u=se(i);if(ue(u,t.ignoreUrlPatterns))return o.call(this,i,a);let d=m(u,t.redactUrlPatterns,window.location.href),f=O(a?.body);try{let n=await o.call(this,i,a);return r()&&x(e,s.Network,D({method:l,url:d,status:n.status,durationMs:Math.max(0,t.now()-c),reqBytes:f,resBytes:ce(n.headers)}),t.onError),n}catch(n){throw r()&&x(e,s.Network,D({method:l,url:d,status:0,durationMs:Math.max(0,t.now()-c),failed:!0,reqBytes:f}),t.onError),n}},a=Reflect.get(n,`__original`);return Object.defineProperty(i,"__original",{configurable:!0,value:typeof a==`function`?a:n,writable:!0}),i}):_}function y(e,t){let n=window.XMLHttpRequest.prototype,r=new WeakMap,i=[];try{return i.push(C(n,`open`,(e,n)=>function(...i){let[a,o]=i;if(!n())return e.apply(this,i);let s=o.toString();return ue(s,t.ignoreUrlPatterns)?(r.delete(this),e.apply(this,i)):(r.set(this,{method:a.toUpperCase(),url:m(s,t.redactUrlPatterns,window.location.href),startedAt:0,reqBytes:0,failed:!1,emitted:!1}),e.apply(this,i))})),i.push(C(n,`send`,(n,i)=>function(...a){let[o]=a,c=i()?r.get(this):void 0;if(c===void 0)return n.apply(this,a);c.startedAt=t.now(),c.reqBytes=O(o);let l=()=>{c.failed=!0},u=()=>{c.emitted||(c.emitted=!0,this.removeEventListener(`error`,l),this.removeEventListener(`abort`,l),this.removeEventListener(`timeout`,l),i()&&x(e,s.Network,D({method:c.method,url:c.url,status:this.status,durationMs:Math.max(0,t.now()-c.startedAt),failed:c.failed||this.status===0,reqBytes:c.reqBytes,resBytes:le(this)}),t.onError))};this.addEventListener(`error`,l),this.addEventListener(`abort`,l),this.addEventListener(`timeout`,l),this.addEventListener(`loadend`,u,{once:!0});try{return n.apply(this,a)}catch(n){throw this.removeEventListener(`error`,l),this.removeEventListener(`abort`,l),this.removeEventListener(`timeout`,l),this.removeEventListener(`loadend`,u),i()&&x(e,s.Network,D({method:c.method,url:c.url,status:0,durationMs:Math.max(0,t.now()-c.startedAt),failed:!0,reqBytes:c.reqBytes}),t.onError),n}})),w(i)}catch(e){throw T(i),e}}function re(e){return{...e,ignoreUrlPatterns:b(e.ignoreUrlPatterns),redactUrlPatterns:b(e.redactUrlPatterns)}}function b(e){return e.map(e=>{let t=e.flags.replace(/[gy]/gu,``);return t===e.flags?e:new RegExp(e.source,t)})}function x(e,t,n,r){try{e(t,n)}catch(e){r?.(e)}}function S(e){let t=!1;return n=>{if(!t){t=!0;try{let t=e?.(n);ie(t)&&Promise.resolve(t).catch(()=>void 0)}catch{}finally{t=!1}}}}function ie(e){return typeof e==`object`&&!!e&&`then`in e&&typeof e.then==`function`}function C(e,t,n){let r=e,i=r[t];if(typeof i!=`function`)return _;let a=!0,o=n(i,()=>a);return r[t]=o,()=>{a&&(a=!1,r[t]===o&&(r[t]=i))}}function w(e){let t=!1;return()=>{t||(t=!0,T(e))}}function T(e){for(let t=e.length-1;t>=0;--t)try{e[t]?.()}catch{}}function ae(e){if(e==null)return String(e);if(typeof e==`string`)return E(e);if(typeof e==`number`||typeof e==`boolean`||typeof e==`bigint`)return String(e);if(e instanceof Error)return E(e.stack??`${e.name}: ${e.message}`);try{return E(JSON.stringify(e))}catch{return Object.prototype.toString.call(e)}}function E(e){if(e.length<=g)return e;let t=e.charCodeAt(g-1),n=t>=55296&&t<=56319?g-1:g;return`${e.slice(0,n)}...(+${String(e.length-n)} chars)`}function oe(e,t){return(t?.method??(typeof e==`object`&&`method`in e?e.method:`GET`)).toUpperCase()}function se(e){return typeof e==`string`||e instanceof URL?e.toString():e.url}function ce(e){let t=e.get(`content-length`);if(t===null)return;let n=Number.parseInt(t,10);return Number.isFinite(n)?n:void 0}function le(e){try{let t=e.getResponseHeader(`content-length`);if(t===null)return;let n=Number.parseInt(t,10);return Number.isFinite(n)?n:void 0}catch{return}}function D(e){return{method:e.method,url:e.url,status:e.status,durationMs:e.durationMs,...e.failed===void 0?{}:{failed:e.failed},...e.reqBytes===void 0?{}:{reqBytes:e.reqBytes},...e.resBytes===void 0?{}:{resBytes:e.resBytes}}}function O(e){if(e==null)return 0;if(typeof e==`string`)return new TextEncoder().encode(e).byteLength;if(e instanceof ArrayBuffer||ArrayBuffer.isView(e))return e.byteLength;if(e instanceof Blob)return e.size}function ue(e,t){return p(e,t)}const de=new Set([`action`,`formaction`,`href`,`src`]);function fe(t){let n=()=>{t.beforeUserActivity?.()},r={emit:e=>{t.emit(pe(e,t.redactUrlPatterns))},maskAllInputs:t.maskAllInputs,recordCanvas:!1,collectFonts:!1,inlineImages:!1,recordCrossOriginIframes:!1,slimDOMOptions:`all`,hooks:{input:n,mediaInteaction:n,mouseInteraction:n,mousemove:n,scroll:n,selection:n,viewportResize:n},sampling:{mousemove:100,mouseInteraction:!0,scroll:250,media:800,input:`last`}};t.maskAllText?r.maskTextSelector=`*`:t.maskTextSelector!==void 0&&t.maskTextSelector.length>0&&(r.maskTextSelector=t.maskTextSelector),t.blockSelector!==void 0&&t.blockSelector.length>0&&(r.blockSelector=t.blockSelector),t.checkoutEveryNms!==void 0&&t.checkoutEveryNms>0&&(r.checkoutEveryNms=t.checkoutEveryNms);let i=e(r);if(i===void 0)throw Error(`logfire session replay: rrweb failed to start recording`);return{stop:()=>{i()},addCustomEvent:(t,n)=>{e.addCustomEvent(t,n)},takeFullSnapshot:()=>{e.takeFullSnapshot(!0)}}}function pe(e,t){if(typeof e.data!=`object`||e.data===null)return e;let n=e.data;if(e.type===i.Meta){if(typeof n.href!=`string`)return e;let r=m(n.href,t,window.location.href);return r===n.href?e:{...e,data:{...n,href:r}}}if(e.type!==i.FullSnapshot&&(e.type!==i.IncrementalSnapshot||n.source!==a.Mutation))return e;let r=k(n,t);return r===n?e:{...e,data:r}}function k(e,t){if(Array.isArray(e)){let n=!1,r=[];for(let i of e){let e=k(i,t);e!==i&&(n=!0),r.push(e)}return n?r:e}if(typeof e!=`object`||!e)return e;let n=e,r=!1,i={};for(let[e,a]of Object.entries(n)){let n=e===`attributes`&&!Array.isArray(a)?me(a,t):k(a,t);n!==a&&(r=!0),i[e]=n}return r?i:e}function me(e,t){if(typeof e!=`object`||!e||Array.isArray(e))return e;let n=e,r=!1,i={};for(let[e,a]of Object.entries(n)){if(!de.has(e.toLowerCase())||typeof a!=`string`){i[e]=a;continue}let n=m(a,t,window.location.href);n!==a&&(r=!0),i[e]=n}return r?i:e}function A(e){return Number.isFinite(e)?Math.min(1,Math.max(0,e)):0}function he(e){let t=e.random??Math.random;return t()<A(e.sessionSampleRate)?`full`:t()<A(e.onErrorSampleRate)?`buffer`:`off`}const ge=/^[a-z][a-z0-9_]{0,63}$/u;function _e(e,t){let n=0;for(let r of e)if(n+=+(r.length>0),n>t)return!1;return!0}function ve(e,t){if(e===void 0)return Object.freeze({});let n;try{n=e()}catch(e){return t(e),Object.freeze({})}if(typeof n!=`object`||!n||Array.isArray(n))return Object.freeze({});let r;try{r=Object.getPrototypeOf(n)}catch(e){return t(e),Object.freeze({})}if(r!==Object.prototype&&r!==null)return Object.freeze({});let i;try{i=Object.keys(n)}catch(e){return t(e),Object.freeze({})}let a={},o=0;for(let e of i){if(!ge.test(e))continue;let r;try{r=Reflect.get(n,e)}catch(e){t(e);continue}if((typeof r==`boolean`||typeof r==`number`&&Number.isFinite(r)||typeof r==`string`&&_e(r,200))&&(Object.defineProperty(a,e,{configurable:!0,enumerable:!0,value:r,writable:!0}),o+=1,o===20))break}return Object.freeze(a)}function ye(e=Date.now){let t=e(),n=new Uint8Array(new ArrayBuffer(16));be(n),n[0]=Math.floor(t/2**40)&255,n[1]=Math.floor(t/2**32)&255,n[2]=Math.floor(t/2**24)&255,n[3]=Math.floor(t/2**16)&255,n[4]=Math.floor(t/2**8)&255,n[5]=t&255,n[6]=(n[6]??0)&15|112,n[8]=(n[8]??0)&63|128;let r=``;for(let e of n)r+=e.toString(16).padStart(2,`0`);return`${r.slice(0,8)}-${r.slice(8,12)}-${r.slice(12,16)}-${r.slice(16,20)}-${r.slice(20)}`}function be(e){let t=globalThis.crypto;if(typeof t?.getRandomValues==`function`){t.getRandomValues(e);return}for(let t=0;t<e.length;t++)e[t]=Math.floor(Math.random()*256)}const j=`lf_session_replay`;var xe=class{idleTimeoutMs;maxDurationMs;now;storage;memorySession;pendingSession;persistenceTimer;constructor(e){this.idleTimeoutMs=e.idleTimeoutMs,this.maxDurationMs=e.maxDurationMs,this.now=e.now??Date.now,this.storage=e.storage===void 0?M():e.storage}getSession(){let e=this.now();if(this.memorySession!==void 0&&!this.isExpired(this.memorySession,e))return this.memorySession;let t=this.read();return t!==void 0&&!this.isExpired(t,e)?t:this.createSession(e)}touch(){let e=this.now(),t={...this.getSession(),lastActivityAt:e};return this.memorySession=t,this.scheduleWrite(t),t}reset(){return this.createSession(this.now())}flushPendingStorage(){this.persistenceTimer!==void 0&&(clearTimeout(this.persistenceTimer),this.persistenceTimer=void 0);let e=this.pendingSession;this.pendingSession=void 0,e!==void 0&&this.writeNow(e)}isExpired(e,t){return t-e.lastActivityAt>this.idleTimeoutMs||t-e.startedAt>this.maxDurationMs}createSession(e){let t={id:ye(this.now),startedAt:e,lastActivityAt:e};return this.flushPendingStorage(),this.writeNow(t),t}read(){if(this.storage!==null)try{let e=this.storage.getItem(j);if(e!==null){let t=JSON.parse(e);if(Se(t))return this.memorySession=t,t}}catch{return this.memorySession}return this.memorySession}write(e){if(this.memorySession=e,this.storage!==null)try{this.storage.setItem(j,JSON.stringify(e))}catch{}}scheduleWrite(e){this.pendingSession=e,this.persistenceTimer===void 0&&(this.persistenceTimer=setTimeout(()=>{this.persistenceTimer=void 0;let e=this.pendingSession;this.pendingSession=void 0,e!==void 0&&this.writeNow(e)},1e3))}writeNow(e){this.memorySession=e,this.write(e)}};function M(){try{return globalThis.sessionStorage??null}catch{return null}}function Se(e){if(typeof e!=`object`||!e)return!1;let t=e;return typeof t.id==`string`&&t.id.length>0&&typeof t.startedAt==`number`&&Number.isFinite(t.startedAt)&&typeof t.lastActivityAt==`number`&&Number.isFinite(t.lastActivityAt)}function N(e){return typeof e==`object`&&e?e:void 0}function P(e){return typeof e==`string`&&e.length>0?e:void 0}function Ce(e){let t=N(e),n=P(t?.id);if(t===void 0||n===void 0)return;let r=P(t.name),i=P(t.email);return{id:n,...r===void 0?{}:{name:r},...i===void 0?{}:{email:i}}}function we(e,t,n,r={},c){let l=1/0,u=0,d=0,f=0,p=0,m=!1,h=new Set;for(let e of t){e.timestamp<l&&(l=e.timestamp),e.timestamp>u&&(u=e.timestamp);let t=N(e.data);if(e.type===i.FullSnapshot)m=!0;else if(e.type===i.Meta){let e=P(t?.href);e!==void 0&&h.add(e)}else if(e.type===i.IncrementalSnapshot&&t!==void 0){let e=t.source;if(e===a.MouseInteraction){let e=t.type;(e===o.Click||e===o.DblClick)&&d++}else e===a.Input&&f++}else if(e.type===i.Custom&&t!==void 0){let e=P(t.tag),n=N(t.payload);if(e===s.Error)p++;else if(e===s.Console)n?.level===`error`&&p++;else if(e===s.Navigation){let e=P(n?.url);e!==void 0&&h.add(e)}}}return{seq:e,firstTimestamp:l===1/0?0:l,lastTimestamp:u,eventCount:t.length,clickCount:d,keypressCount:f,errorCount:p,hasFullSnapshot:m,urls:[...h],...n!==void 0&&n.length>0?{distinctId:n}:{},...c===void 0?{}:{user:{...c}},...Object.keys(r).length===0?{}:{sessionAttributes:{...r}}}}var F=class extends Error{droppedSeqs;reason;seq;sessionId;status;constructor(e){super(Te(e),{cause:e.cause}),this.name=`ReplayUploadError`,this.droppedSeqs=Object.freeze([...e.droppedSeqs??[]]),this.reason=e.reason,this.seq=e.seq,this.sessionId=e.sessionId,this.status=e.status}};function Te(e){let t=e.seq===void 0?`replay chunk`:`replay chunk seq=${String(e.seq)}`,n=e.cause instanceof Error?`: ${e.cause.message}`:``;return`${t} ${e.reason}${n}`}const I=`lf_session_replay_seq`,L=1e4,R=3e4,Ee={gzip:t,gzipSync:n};var De=class{buffer=[];bufferHasFullSnapshot=!1;pendingBytes=0;seq=0;timer;nextFlushAt;lastUserActivityAt;startedAt;started=!1;held;heldBufferIncomplete=!1;minimumBufferIncomplete=!1;minimumDurationSatisfied=!1;firstObservedTimestamp;lastObservedTimestamp;refreshingMinimumSnapshot=!1;mode;queue=[];retainedBytes=0;activeUpload;drainPromise;draining=!1;lifecycleFlights=new Set;closed=!1;shuttingDown=!1;retryAbort=new AbortController;deadlineAbort=new AbortController;resyncPending=!1;resyncTimer;lastResyncAt;reservedKeepaliveBytes=0;asyncCompressionAvailable=!0;config;compression;storage;sessionId;sessionAttributes;takeFullSnapshot;constructor(e,t,n,r=M(),i=Ee,a={},o={}){this.config=e,this.sessionId=t,this.sessionAttributes=Object.freeze({...a}),this.mode=n,this.storage=r,this.compression=i,this.held=o.holdUntilActivity===!0&&n===`full`,this.takeFullSnapshot=o.takeFullSnapshot,this.minimumDurationSatisfied=e.minSessionDurationMs===0,this.seq=this.loadSeq(t),this.startedAt=this.config.now(),this.lastUserActivityAt=this.startedAt}start(){this.started||this.mode!==`full`||(this.started=!0,this.scheduleFlush())}add(e){this.minimumDurationSatisfied||(this.firstObservedTimestamp??=e.timestamp,this.lastObservedTimestamp=Math.max(this.lastObservedTimestamp??e.timestamp,e.timestamp)),d(e)&&(this.lastUserActivityAt=this.config.now());let t=V(e);if(this.resyncPending){this.addDuringResync(e,t);return}if(this.refreshingMinimumSnapshot){this.buffer.push(e),this.pendingBytes+=t;return}let n=!this.minimumDurationSatisfied;if(this.mode===`buffer`||this.held||n){if(e.type===i.Meta){this.buffer=[e],this.bufferHasFullSnapshot=!1,this.minimumBufferIncomplete=!1,this.pendingBytes=t,n&&(this.mode===`full`&&(this.firstObservedTimestamp=e.timestamp),this.finishMinimumBufferingEvent());return}if(e.type===i.FullSnapshot){let r=!this.bufferHasFullSnapshot&&this.buffer.length===1&&this.buffer[0]?.type===i.Meta?this.buffer[0]:void 0;this.buffer=r===void 0?[e]:[r,e],this.bufferHasFullSnapshot=!0,this.pendingBytes=t+(r===void 0?0:V(r)),this.heldBufferIncomplete=!1,this.minimumBufferIncomplete=!1,n&&(this.mode===`full`&&(this.firstObservedTimestamp=r?.timestamp??e.timestamp),this.finishMinimumBufferingEvent());return}if(!this.bufferHasFullSnapshot||t>this.config.maxBufferBytes){this.heldBufferIncomplete||=this.held,this.minimumBufferIncomplete||=n,n&&this.finishMinimumBufferingEvent();return}if(this.pendingBytes+t>this.config.maxBufferBytes){this.heldBufferIncomplete||=this.held,this.minimumBufferIncomplete||=n,n&&this.finishMinimumBufferingEvent();return}}if(this.buffer.push(e),this.pendingBytes+=t,n&&this.minimumDurationReached()){this.flushAndReport();return}this.mode===`full`&&this.pendingBytes>=this.config.maxBufferBytes?this.flushAndReport():this.scheduleFlush()}addDuringResync(e,t){if(e.type===i.Meta){this.buffer=[e],this.pendingBytes=t;return}if(e.type!==i.FullSnapshot)return;let n=this.buffer.length===1&&this.buffer[0]?.type===i.Meta?this.buffer[0]:void 0;this.buffer=n===void 0?[e]:[n,e],this.pendingBytes=t+(n===void 0?0:V(n)),this.resyncPending=!1,this.clearResyncTimer(),this.pendingBytes>=this.config.maxBufferBytes?this.flushAndReport():this.scheduleFlush()}async triggerFlush(){return this.mode===`buffer`&&(this.bufferHasFullSnapshot||(this.buffer=[],this.pendingBytes=0),this.mode=`full`,this.start()),this.flush()}async flush(e={}){return this.flushInternal(e)}async flushInternal(e={}){if(this.closed||this.mode===`buffer`||this.held||this.buffer.length===0||!this.minimumDurationReached()||(this.clearScheduledFlush(),this.minimumBufferIncomplete&&!this.refreshMinimumBuffer()))return;this.minimumDurationSatisfied=!0;let t=this.buffer,n=this.pendingBytes;this.buffer=[],this.bufferHasFullSnapshot=!1,this.minimumBufferIncomplete=!1,this.pendingBytes=0;let r=this.sessionId,i=this.snapshotIdentity();if(e.keepalive===!0){let e=je(t),n=this.allocateSeq(e.length),a=this.deliverLifecycle(e,n,r,i);this.lifecycleFlights.add(a);let o=()=>{this.lifecycleFlights.delete(a)};a.then(o,o),await a;return}await this.enqueue(t,n,r,i)?.done}async shutdown(e={}){if(this.started=!1,this.clearScheduledFlush(),this.held||!this.minimumDurationReached()){this.discard(),await this.settleWithinDeadline([]);return}if(e.keepalive===!0){await this.flush(e),this.closed=!0,this.clearResyncTimer(),await this.settleWithinDeadline([]);return}let t=this.flushInternal();this.closed=!0,this.shuttingDown=!0,this.clearResyncTimer(),this.retryAbort.abort();let n=this.queue.filter(e=>e!==this.activeUpload).map(async e=>this.finalAttempt(e));await this.settleWithinDeadline([t,...n])}discard(){this.started=!1,this.closed=!0,this.clearScheduledFlush(),this.clearResyncTimer(),this.buffer=[],this.bufferHasFullSnapshot=!1,this.minimumBufferIncomplete=!1,this.pendingBytes=0}getMode(){return this.mode}isHeld(){return this.held}releaseHeld(e){this.held&&((this.heldBufferIncomplete||!this.bufferHasFullSnapshot)&&(this.buffer=[],this.bufferHasFullSnapshot=!1,this.pendingBytes=0,e()),this.held=!1,this.pendingBytes>=this.config.maxBufferBytes?this.flushAndReport():this.scheduleFlush())}flushAndReport(){this.flushInternal().catch(e=>{z(this.config.onError,e)})}scheduleFlush(){let e=this.config.now(),t=Math.max(0,this.config.minSessionDurationMs-(e-this.startedAt)),n=Math.max(f(this.config.flushIntervalMs,e-this.lastUserActivityAt),t);this.scheduleFlushIn(e,n)}scheduleFlushIn(e,t){if(!this.started||this.mode!==`full`||this.held||this.buffer.length===0)return;let n=e+t;this.timer!==void 0&&this.nextFlushAt!==void 0&&this.nextFlushAt<=n||(this.clearScheduledFlush(),this.nextFlushAt=n,this.timer=setTimeout(()=>{this.timer=void 0,this.nextFlushAt=void 0,this.flushAndReport()},t))}clearScheduledFlush(){this.timer!==void 0&&(clearTimeout(this.timer),this.timer=void 0),this.nextFlushAt=void 0}minimumDurationReached(){return this.minimumDurationSatisfied||this.config.minSessionDurationMs===0?!0:this.firstObservedTimestamp===void 0||this.lastObservedTimestamp===void 0?!1:this.lastObservedTimestamp-this.firstObservedTimestamp>=this.config.minSessionDurationMs}finishMinimumBufferingEvent(){this.minimumDurationReached()?this.flushAndReport():this.scheduleFlush()}refreshMinimumBuffer(){let e=this.buffer.length,t=this.pendingBytes;if(this.takeFullSnapshot!==void 0){this.refreshingMinimumSnapshot=!0;try{this.takeFullSnapshot()}catch(e){z(this.config.onError,e)}finally{this.refreshingMinimumSnapshot=!1}}return this.buffer.slice(e).some(e=>e.type===i.FullSnapshot)?(this.minimumBufferIncomplete=!1,!0):(this.buffer.length=e,this.pendingBytes=t,!1)}snapshotIdentity(){let e=this.snapshotUser(),t=this.config.distinctId;if(this.config.getDistinctId!==void 0)try{t=this.config.getDistinctId()??this.config.distinctId}catch(e){z(this.config.onError,e)}else e!==void 0&&(t=e.id);return{distinctId:t,user:e}}createEnvelope(e,t,n){return{version:1,meta:we(t,e,n.distinctId,this.sessionAttributes,n.user),events:e}}snapshotUser(){if(this.config.getUser!==void 0)try{return Ce(this.config.getUser())}catch(e){z(this.config.onError,e);return}}allocateSeq(e){let t=this.seq;return this.seq+=e,this.saveSeq(this.sessionId,this.seq),t}enqueue(e,t,n,r){let a=Math.max(2e6,2*this.config.maxBufferBytes);if(this.queue.length>0&&this.retainedBytes+t>a){z(this.config.onError,new F({cause:Error(`replay upload queue is full`),reason:`not-sent`,seq:void 0,sessionId:n})),this.beginResync();return}let o=()=>void 0,s={body:void 0,done:new Promise(e=>{o=e}),events:e,hasFullSnapshot:e.some(e=>e.type===i.FullSnapshot),identity:r,reachedFetch:!1,resolve:o,retainedBytes:t,seq:this.allocateSeq(1),sessionId:n,settled:!1};return this.queue.push(s),this.retainedBytes+=t,this.draining||(this.draining=!0,this.drainPromise=this.drain()),s}async drain(){try{for(;!this.shuttingDown;){let e=this.queue[0];if(e===void 0)break;this.activeUpload=e;let t=await this.deliverQueued(e);this.activeUpload=void 0,this.settle(e,t)}}finally{this.activeUpload=void 0,this.draining=!1}}async deliverQueued(e){let t=await this.compressQueued(e);if(t!==void 0||e.settled)return t;let n=Date.now(),r;for(let t=1;;t++){let i=R-(Date.now()-n);if(t>1&&i<=0)return G(r,e.reachedFetch);let a=await this.attemptQueued(e,Math.min(L,i));if(a===void 0)return;r=a;let o=Pe(a,t,this.config.random);if(o===void 0||this.shuttingDown||Date.now()-n+o>=R)return G(a,e.reachedFetch);await this.backoff(o)}}async compressQueued(e){if(e.body!==void 0||e.events===void 0)return;let t=e.events;try{let n=r(JSON.stringify(this.createEnvelope(t,e.seq,e.identity))),i=this.shuttingDown?this.compression.gzipSync(n):await this.compressOrdinary(n);if(e.events!==t)return await this.compressQueued(e);e.settled||(this.retainedBytes+=i.byteLength-e.retainedBytes,e.retainedBytes=i.byteLength,e.body=i,e.events=void 0);return}catch(e){return{cause:e,reason:`not-sent`}}}async attemptQueued(e,t=L){let n=e.body;if(n!==void 0)try{await this.send({body:n,requestKeepalive:!1,reservedBytes:0,seq:e.seq,sessionId:e.sessionId},()=>{e.reachedFetch=!0},t);return}catch(e){return e}}async finalAttempt(e){let t=await this.compressQueued(e);if(t!==void 0){this.settle(e,t);return}let n=await this.attemptQueued(e);this.settle(e,n===void 0?void 0:G(n,e.reachedFetch))}async settleWithinDeadline(e){let t=Promise.all([...e,this.drainPromise,...this.lifecycleFlights]).then(()=>void 0,()=>void 0),n,r=new Promise(e=>{n=setTimeout(e,L)});if(await Promise.race([t,r]),clearTimeout(n),this.shuttingDown){this.deadlineAbort.abort(Error(`replay upload did not finish before shutdown`));for(let e of[...this.queue])this.settle(e,{cause:Error(`replay upload did not finish before shutdown`),reason:e.reachedFetch?`unconfirmed`:`not-sent`})}}settle(e,t){if(e.settled)return;e.settled=!0,this.retainedBytes-=e.retainedBytes;let n=this.queue.indexOf(e);n>=0&&this.queue.splice(n,1),e.body=void 0,e.events=void 0,e.resolve(),t!==void 0&&this.handleSequencedLoss(e.seq,e.sessionId,t)}handleSequencedLoss(e,t,n){let r=[];if(!this.shuttingDown){let t=!1;for(let n of[...this.queue])if(!(n.seq<e)){if(n.events===void 0){if(n.hasFullSnapshot){t=!0;break}continue}if(n.hasFullSnapshot){let e=H(n.events),r=U(e);this.retainedBytes+=r-n.retainedBytes,n.retainedBytes=r,n.events=e,t=!0;break}r.push(n.seq),this.settle(n,void 0)}!t&&!this.trimBufferToAnchor()&&this.beginResync()}z(this.config.onError,new F({cause:n.cause,droppedSeqs:r,reason:n.reason,seq:e,sessionId:t,status:n.status}))}trimBufferToAnchor(){return this.buffer.some(e=>e.type===i.FullSnapshot)?(this.buffer=H(this.buffer),this.pendingBytes=U(this.buffer),!0):!1}beginResync(){this.closed||(this.resyncPending=!0,this.buffer=[],this.bufferHasFullSnapshot=!1,this.pendingBytes=0,this.clearScheduledFlush(),this.scheduleResyncSnapshot())}scheduleResyncSnapshot(){if(this.resyncTimer!==void 0||this.closed)return;let e=this.lastResyncAt===void 0?0:Math.max(0,this.lastResyncAt+6e4-this.config.now());this.resyncTimer=setTimeout(()=>{this.resyncTimer=void 0,this.takeResyncSnapshot()},e)}takeResyncSnapshot(){if(!(!this.resyncPending||this.closed||this.takeFullSnapshot===void 0)){this.lastResyncAt=this.config.now();try{this.takeFullSnapshot()}catch(e){z(this.config.onError,e),this.scheduleResyncSnapshot();return}this.isResyncPending()&&(z(this.config.onError,Error(`replay resync snapshot produced no full snapshot`)),this.scheduleResyncSnapshot())}}isResyncPending(){return this.resyncPending}clearResyncTimer(){this.resyncTimer!==void 0&&(clearTimeout(this.resyncTimer),this.resyncTimer=void 0)}async backoff(e){let t=this.retryAbort.signal;t.aborted||await new Promise(n=>{let r=()=>{clearTimeout(i),t.removeEventListener(`abort`,r),n()},i=setTimeout(r,e);t.addEventListener(`abort`,r)})}async deliverLifecycle(e,t,n,i){let a=[];for(let o=0;o<e.length;o++){let s=e[o];if(s===void 0){a.push(void 0);continue}let c=this.createEnvelope(s,t+o,i);try{a.push({body:this.compression.gzipSync(r(JSON.stringify(c))),requestKeepalive:!1,reservedBytes:0,seq:t+o,sessionId:n})}catch(e){this.handleSequencedLoss(t+o,n,{cause:e,reason:`not-sent`}),a.push(void 0)}}let o=!0,s=Math.max(0,48e3-this.reservedKeepaliveBytes);for(let e of a){if(e===void 0){o=!1;continue}o&&e.body.byteLength<=s?(e.requestKeepalive=!0,e.reservedBytes=e.body.byteLength,this.reservedKeepaliveBytes+=e.reservedBytes,s-=e.reservedBytes):o=!1}await Promise.all(a.map(async e=>{if(e===void 0)return;let t=!1;try{await this.send(e,()=>{t=!0})}catch(n){this.handleSequencedLoss(e.seq,e.sessionId,G(n,t))}}))}async compressOrdinary(e){if(!this.asyncCompressionAvailable)return this.compression.gzipSync(e);try{return await Me(this.compression,e)}catch{return this.asyncCompressionAvailable=!1,this.compression.gzipSync(e)}}async send(e,t,n=L){let r,i,a,o=new AbortController,s=setTimeout(()=>{o.abort(Error(`replay upload timed out after ${String(n)}ms`))},n),c=this.deadlineAbort.signal,l=()=>{o.abort(c.reason)};c.addEventListener(`abort`,l);try{let n=`${this.config.replayUrl.replace(/\/+$/u,``)}/${encodeURIComponent(e.sessionId)}?seq=${String(e.seq)}`,s=await Ae(this.getUploadHeaders(),o.signal);t();let c=this.config.fetchImpl(n,{method:`POST`,headers:s,body:e.body.slice(),keepalive:e.requestKeepalive,signal:o.signal});r=!0;let l=await c;if(i=!0,a=await Ne(l),!l.ok){let e=l.status===429||l.status===503?Fe(l.headers.get(`retry-after`),Date.now()):void 0;throw new B(l.status,e)}}finally{clearTimeout(s),c.removeEventListener(`abort`,l),e.reservedBytes>0&&(r!==!0||i!==!0||a===!0)&&(this.reservedKeepaliveBytes=Math.max(0,this.reservedKeepaliveBytes-e.reservedBytes))}}async getUploadHeaders(){let e=this.config.headers===void 0?{}:await this.config.headers(),t=await ke(this.config.token);return{...t===void 0||t.length===0?e:{...Object.fromEntries(Object.entries(e).filter(([e])=>e.toLowerCase()!==`authorization`)),Authorization:`Bearer ${t}`},"Content-Type":`application/json`,"Content-Encoding":`gzip`}}loadSeq(e){if(this.storage===null)return 0;try{let t=this.storage.getItem(I);if(t===null)return 0;let n=JSON.parse(t);if(typeof n!=`object`||!n)return 0;let r=n;return r.id===e&&typeof r.seq==`number`&&Number.isFinite(r.seq)?r.seq:0}catch{return 0}}saveSeq(e,t){if(this.storage!==null)try{this.storage.setItem(I,JSON.stringify({id:e,seq:t}))}catch{}}};function z(e,t){try{let n=e?.(t);Oe(n)&&Promise.resolve(n).catch(()=>void 0)}catch{}}function Oe(e){return typeof e==`object`&&!!e&&`then`in e&&typeof e.then==`function`}var B=class extends Error{retryAfter;status;constructor(e,t){super(`replay ingest failed: ${String(e)}`),this.status=e,this.retryAfter=t,this.name=`ReplayIngestError`}};async function ke(e){return typeof e==`function`?e():e}async function Ae(e,t){if(t.aborted)throw t.reason;return new Promise((n,r)=>{let i=()=>{r(t.reason)};t.addEventListener(`abort`,i,{once:!0}),e.then(e=>{t.removeEventListener(`abort`,i),n(e)},e=>{t.removeEventListener(`abort`,i),r(e instanceof Error?e:Error(String(e)))})})}function V(e){try{return r(JSON.stringify(e)).byteLength}catch{return 0}}function H(e){let t=e.findIndex(e=>e.type===i.FullSnapshot);if(t<0)return e;let n=t>0&&e[t-1]?.type===i.Meta?t-1:t;return e.slice(n)}function U(e){return e.reduce((e,t)=>e+V(t),0)}function je(e){let t=[],n=[],r=0;for(let i of e){let e=V(i);n.length>0&&r+e>48e3&&(t.push(n),n=[],r=0),n.push(i),r+=e}return n.length>0&&t.push(n),t}async function Me(e,t){return new Promise((n,r)=>{let i=[];typeof window<`u`&&i.push(window),typeof document<`u`&&i.push(document);let a=()=>{for(let e of i)e.removeEventListener(`securitypolicyviolation`,s)},o=(e,t)=>{if(a(),e!==null){r(e);return}n(t)},s=e=>{let t=e;(t.effectiveDirective.includes(`worker-src`)||t.violatedDirective.includes(`worker-src`))&&o(Error(`replay compression worker blocked by Content Security Policy`))};for(let e of i)e.addEventListener(`securitypolicyviolation`,s);try{e.gzip(t,{level:6},(e,t)=>{o(e,t)})}catch(e){a(),r(e instanceof Error?e:Error(String(e)))}})}async function Ne(e){if(e.body===null)return!0;try{return await e.body.cancel(),!0}catch{return!1}}function W(e){return e===408||e===425||e===429||e>=500}function Pe(e,t,n){if(e instanceof B&&!W(e.status))return;let r=Math.min(8e3,500*2**(t-1)),i=Math.round(r*(1-.5*n())),a=e instanceof B?e.retryAfter:void 0;return a===void 0?i:Math.max(a,i)}function G(e,t){let n=e instanceof B?e.status:void 0;return n!==void 0&&!W(n)?{cause:e,reason:`rejected`,status:n}:{cause:e,reason:t?`unconfirmed`:`not-sent`,status:n}}function Fe(e,t){if(e===null)return;let n=e.trim();if(/^\d+$/u.test(n)){let e=Number(n);return Number.isSafeInteger(e)?e*1e3:void 0}let r=ze(n,t);return r===void 0?void 0:Math.max(0,r-t)}const Ie=[`Jan`,`Feb`,`Mar`,`Apr`,`May`,`Jun`,`Jul`,`Aug`,`Sep`,`Oct`,`Nov`,`Dec`],Le=[`Sun`,`Mon`,`Tue`,`Wed`,`Thu`,`Fri`,`Sat`],Re=[`Sunday`,`Monday`,`Tuesday`,`Wednesday`,`Thursday`,`Friday`,`Saturday`];function ze(e,t){let n=/^(Sun|Mon|Tue|Wed|Thu|Fri|Sat), (\d{2}) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) (\d{4}) (\d{2}):(\d{2}):(\d{2}) GMT$/u.exec(e);if(n!==null)return K(n[1],n[2],n[3],n[4],n[5],n[6],n[7]);let r=/^(Sunday|Monday|Tuesday|Wednesday|Thursday|Friday|Saturday), (\d{2})-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-(\d{2}) (\d{2}):(\d{2}):(\d{2}) GMT$/u.exec(e);if(r!==null){let e=new Date(t).getUTCFullYear(),n=Number(r[4]),i=Math.floor(e/100)*100+n;return i>e+50&&(i-=100),K(r[1],r[2],r[3],String(i),r[5],r[6],r[7])}let i=/^(Sun|Mon|Tue|Wed|Thu|Fri|Sat) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) (\d{2}| \d) (\d{2}):(\d{2}):(\d{2}) (\d{4})$/u.exec(e);if(i!==null)return K(i[1],i[3]?.trim(),i[2],i[7],i[4],i[5],i[6])}function K(e,t,n,r,i,a,o){let s=Number(t),c=Ie.indexOf(n),l=Number(r),u=Number(i),d=Number(a),f=Number(o);if(c<0||s<1||s>31||u>23||d>59||f>59)return;let p=new Date(0);if(p.setUTCFullYear(l,c,s),p.setUTCHours(u,d,f,0),p.getUTCFullYear()!==l||p.getUTCMonth()!==c||p.getUTCDate()!==s||p.getUTCHours()!==u||p.getUTCMinutes()!==d||p.getUTCSeconds()!==f)return;let m=Le.indexOf(e),h=Re.indexOf(e);return(m>=0?m:h)===p.getUTCDay()?p.getTime():void 0}const Be={mode:`off`,recording:!1,getSessionId:()=>``,flush:async()=>Promise.resolve(),stop:async()=>Promise.resolve()},q=`lf_session_replay_mode`,J=Symbol.for(`@pydantic/logfire-session-replay/controller`);function Ve(e){if(typeof window>`u`||typeof document>`u`)return Be;let t=Xe();try{let n=Ue(e),r=new xe({idleTimeoutMs:n.sessionIdleTimeoutMs,maxDurationMs:n.maxSessionDurationMs,now:n.now}),i=r.getSession().id,a=e=>{let t;try{t=n.getSessionId?.()}catch(e){return Z(n.onError,e),i}if(t!==void 0&&t.length>0)return i=t,t;let a=e?r.touch().id:r.getSession().id;return i=a,a},o=M(),s=a(!1),c,l=!1,u=Promise.resolve(),d,f=(e,t,r=!t)=>{let i=We(n,e,o);if(!(i===`off`||l||e!==s))try{c=He({config:n,getSessionId:a,mode:i,onSessionChanged:p,samplingModeStorage:o,sessionId:e,holdUntilActivity:r})}catch(e){if(c=void 0,t)throw e;Z(n.onError,e)}},p=(e,t=!0)=>{if(l||e===s)return;s=e;let r=c;c=void 0;let i=r?.deactivate()??Promise.resolve();u=u.then(async()=>{await Je(i,n.onError),!l&&s===e&&f(e,!1,t)})},m;try{f(s,!0),m=setInterval(()=>{p(a(!1))},1e3)}catch(e){throw c?.discard(),c=void 0,e}return{get mode(){try{return c?.transport.getMode()??`off`}catch(e){return Z(n.onError,e),`off`}},get recording(){try{return c!==void 0}catch(e){return Z(n.onError,e),!1}},getSessionId:()=>a(!1),flush:async()=>{try{await u,await c?.transport.flush()}catch(e){Z(n.onError,e)}},stop:async()=>(d??=(async()=>{l=!0,clearInterval(m);let e=c;c=void 0,await Je(e?.deactivate()??Promise.resolve(),n.onError),await u,r.flushPendingStorage(),t()})(),d)}}catch(e){throw t(),e}}function He(e){let{config:t,getSessionId:n,holdUntilActivity:r,mode:i,onSessionChanged:a,samplingModeStorage:o,sessionId:c}=e,l=ve(t.getSessionAttributes,e=>{Z(t.onError,e)}),u,f=new De(t,c,i,void 0,void 0,l,{holdUntilActivity:r,takeFullSnapshot:()=>{u.takeFullSnapshot()}}),p=[],m=!0,h=()=>m,g;try{u=fe({beforeUserActivity:()=>{if(!(!m||!f.isHeld()))try{let e=n(!0);if(e!==c){a(e,!1);return}f.releaseHeld(()=>{u.takeFullSnapshot()})}catch(e){Z(t.onError,e)}},emit:e=>{if(m)try{let t=n(d(e));if(t!==c){a(t,!1);return}f.add(e)}catch(e){Z(t.onError,e)}},maskAllText:t.maskAllText,maskAllInputs:t.maskAllInputs,maskTextSelector:t.maskTextSelector,blockSelector:t.blockSelector,checkoutEveryNms:i===`buffer`?12e4:0,redactUrlPatterns:t.redactUrlPatterns}),p.push(()=>{u.stop()});let e=(e,n)=>{if(m)try{u.addCustomEvent(e,n)}catch(e){Z(t.onError,e)}},r=n=>{h()&&(f.releaseHeld(()=>{u.takeFullSnapshot()}),e(s.Error,n),h()&&f.getMode()===`buffer`&&(Y(o,c,`full`),X(f.triggerFlush(),t.onError)))},l=e=>{e instanceof ErrorEvent&&r($(e.message,e.filename,qe(e.error)))},_=e=>{let t=e.reason;r($(Ze(t?.message??e.reason),void 0,typeof t?.stack==`string`?t.stack:void 0))},v=()=>{document.visibilityState===`hidden`&&X(f.flush({keepalive:!0}),t.onError)},y=()=>{X(f.flush({keepalive:!0}),t.onError)};return window.addEventListener(`error`,l,!0),p.push(()=>{window.removeEventListener(`error`,l,!0)}),window.addEventListener(`unhandledrejection`,_,!0),p.push(()=>{window.removeEventListener(`unhandledrejection`,_,!0)}),document.addEventListener(`visibilitychange`,v),p.push(()=>{document.removeEventListener(`visibilitychange`,v)}),window.addEventListener(`pagehide`,y),p.push(()=>{window.removeEventListener(`pagehide`,y)}),t.captureConsole&&p.push(ee(e,{onError:t.onError})),t.captureNetwork&&p.push(te(e,{ignoreUrlPatterns:t.ignoreUrlPatterns,now:t.now,onError:t.onError,redactUrlPatterns:t.redactUrlPatterns})),t.captureNavigation&&p.push(ne(e,{onError:t.onError,redactUrlPatterns:t.redactUrlPatterns})),f.start(),{sessionId:c,transport:f,deactivate:async()=>(g??=(async()=>{let e=f.shutdown({keepalive:!1});m=!1,Q(p),await e})(),g),discard:()=>{m=!1,Q(p),f.discard()}}}catch(e){throw m=!1,Q(p),f.discard(),e}}function Ue(e){if(e.replayUrl.length===0)throw Error("logfire session replay: `replayUrl` is required");let t=new URL(e.replayUrl,`https://logfire.invalid/`);if(t.search!==``||t.hash!==``)throw Error("logfire session replay: `replayUrl` must not contain a query or fragment");let n=e.fetchImpl??(typeof fetch==`function`?fetch.bind(globalThis):void 0);if(n===void 0)throw Error("logfire session replay: no `fetch` available; pass `fetchImpl`");return{replayUrl:e.replayUrl,headers:e.headers,token:e.token,getSessionId:e.getSessionId,getSessionAttributes:e.getSessionAttributes,sessionSampleRate:e.sessionSampleRate??l.sessionSampleRate,onErrorSampleRate:e.onErrorSampleRate??l.onErrorSampleRate,maskAllText:e.maskAllText??l.maskAllText,maskAllInputs:e.maskAllInputs??l.maskAllInputs,maskTextSelector:e.maskTextSelector??l.maskTextSelector,blockSelector:e.blockSelector??l.blockSelector,flushIntervalMs:e.flushIntervalMs??l.flushIntervalMs,maxBufferBytes:e.maxBufferBytes??l.maxBufferBytes,minSessionDurationMs:e.minSessionDurationMs??l.minSessionDurationMs,sessionIdleTimeoutMs:e.sessionIdleTimeoutMs??l.sessionIdleTimeoutMs,maxSessionDurationMs:e.maxSessionDurationMs??l.maxSessionDurationMs,distinctId:e.distinctId??l.distinctId,getDistinctId:e.getDistinctId,getUser:e.getUser,captureConsole:e.captureConsole??l.captureConsole,captureNetwork:e.captureNetwork??l.captureNetwork,captureNavigation:e.captureNavigation??l.captureNavigation,ignoreUrlPatterns:e.ignoreUrlPatterns??[],redactUrlPatterns:e.redactUrlPatterns??[...l.redactUrlPatterns],onError:e.onError,fetchImpl:n,now:e.now??Date.now,random:e.random??Math.random}}function We(e,t,n){let r=Ge(n,t);if(r!==void 0)return r;let i=he({sessionSampleRate:e.sessionSampleRate,onErrorSampleRate:e.onErrorSampleRate,random:e.random});return Y(n,t,i),i}function Ge(e,t){if(e!==null)try{let n=e.getItem(q);if(n===null)return;let r=JSON.parse(n);if(typeof r!=`object`||!r)return;let i=r;return i.id!==t||!Ke(i.mode)?void 0:i.mode}catch{return}}function Y(e,t,n){if(e!==null)try{e.setItem(q,JSON.stringify({id:t,mode:n}))}catch{}}function Ke(e){return e===`full`||e===`buffer`||e===`off`}function qe(e){let t=typeof e==`object`&&e&&`stack`in e?e.stack:void 0;return typeof t==`string`?t:void 0}function X(e,t){e.catch(e=>{Z(t,e)})}async function Je(e,t){try{await e}catch(e){Z(t,e)}}function Z(e,t){try{let n=e?.(t);Ye(n)&&Promise.resolve(n).catch(()=>void 0)}catch{}}function Ye(e){return typeof e==`object`&&!!e&&`then`in e&&typeof e.then==`function`}function Xe(){let e=globalThis;if(e[J]!==void 0)throw Error(`logfire session replay: a replay controller is already active in this page`);let t={};Object.defineProperty(e,J,{configurable:!0,enumerable:!1,value:t,writable:!0});let n=!1;return()=>{n||(n=!0,e[J]===t&&Reflect.deleteProperty(e,J))}}function Q(e){for(let t=e.length-1;t>=0;--t)try{e[t]?.()}catch{}e.length=0}function $(e,t,n){return{message:e,...t===void 0||t.length===0?{}:{source:t},...n===void 0?{}:{stack:n}}}function Ze(e){if(e==null)return`unhandledrejection`;if(typeof e==`string`)return e;if(typeof e==`number`||typeof e==`boolean`||typeof e==`bigint`||typeof e==`symbol`)return String(e);try{let t=JSON.stringify(e);return typeof t==`string`?t:Object.prototype.toString.call(e)}catch{return Object.prototype.toString.call(e)}}export{c as CHUNK_ENVELOPE_VERSION,s as CustomTag,i as EventType,a as IncrementalSource,o as MouseInteractions,F as ReplayUploadError,Ve as startSessionReplay};
|
|
1
|
+
import{record as e}from"@rrweb/record";import{gzip as t,gzipSync as n,strToU8 as r}from"fflate";const i={DomContentLoaded:0,Load:1,FullSnapshot:2,IncrementalSnapshot:3,Meta:4,Custom:5,Plugin:6},a={Mutation:0,MouseMove:1,MouseInteraction:2,Scroll:3,ViewportResize:4,Input:5,TouchMove:6,MediaInteraction:7,Drag:12,Selection:14},o={MouseUp:0,MouseDown:1,Click:2,ContextMenu:3,DblClick:4},s={Error:`logfire.error`,Console:`logfire.console`,Network:`logfire.network`,Navigation:`logfire.navigation`},c=1,l={sessionSampleRate:1,onErrorSampleRate:1,maskAllText:!0,maskAllInputs:!0,maskTextSelector:``,blockSelector:``,flushIntervalMs:5e3,maxBufferBytes:1e6,minSessionDurationMs:1e4,sessionIdleTimeoutMs:18e5,maxSessionDurationMs:72e5,distinctId:``,captureConsole:!1,captureNetwork:!0,captureNavigation:!0,captureGlobalErrors:!0,redactUrlPatterns:[/.+/u]},u=/* @__PURE__ */ new Set([a.MouseMove,a.MouseInteraction,a.Scroll,a.ViewportResize,a.Input,a.TouchMove,a.MediaInteraction,a.Drag,a.Selection]);function d(e){return e.type!==i.IncrementalSnapshot||typeof e.data!=`object`||e.data===null||!(`source`in e.data)?!1:typeof e.data.source==`number`&&u.has(e.data.source)}function f(e,t){return t<3e4?e:t<3e5?Math.max(e,6e4):Math.max(e,3e5)}function p(e,t){return t.some(t=>new RegExp(t.source,t.flags).test(e))}function m(e,t,n){if(!p(e,t))return e;try{let t=new URL(e,n);return`${t.origin}${t.pathname}`}catch{let[t=e]=e.split(`?`),[n=t]=t.split(`#`);return n}}const h=[`log`,`info`,`warn`,`error`,`debug`],g=1024,_=()=>void 0;function v(e,t={}){let n=[],r=E(t.onError);try{for(let t of h)typeof console[t]==`function`&&n.push(O(console,t,(n,i)=>function(...a){return i()&&T(e,s.Console,{level:t,args:a.slice(0,10).map(ee)},r),n.apply(this,a)}));return k(n)}catch(e){throw A(n),e}}function y(e,t){let n=C(t),r={...n,onError:E(n.onError)},i=x(e,r);try{return k([i,S(e,r)])}catch(e){throw i(),e}}function b(e,t={redactUrlPatterns:[]}){let n=E(t.onError),r=r=>{let i=m(window.location.href,t.redactUrlPatterns??[],window.location.href);T(e,s.Navigation,{url:i,kind:r},n)},i=[];try{i.push(O(history,`pushState`,(e,t)=>function(...n){let i=e.apply(this,n);return t()&&r(`push`),i})),i.push(O(history,`replaceState`,(e,t)=>function(...n){let i=e.apply(this,n);return t()&&r(`replace`),i}));let e=!0,t=()=>{e&&r(`pop`)};return window.addEventListener(`popstate`,t),i.push(()=>{e=!1,window.removeEventListener(`popstate`,t)}),k(i)}catch(e){throw A(i),e}}function x(e,t){return typeof window.fetch==`function`?O(window,`fetch`,(n,r)=>{let i=async function(i,a){let o=n;if(!r())return o.call(this,i,a);let c=t.now(),l=te(i,a),u=ne(i);if(oe(u,t.ignoreUrlPatterns))return o.call(this,i,a);let d=m(u,t.redactUrlPatterns,window.location.href),f=ae(a?.body);try{let n=await o.call(this,i,a);return r()&&T(e,s.Network,M({method:l,url:d,status:n.status,durationMs:Math.max(0,t.now()-c),reqBytes:f,resBytes:re(n.headers)}),t.onError),n}catch(n){throw r()&&T(e,s.Network,M({method:l,url:d,status:0,durationMs:Math.max(0,t.now()-c),failed:!0,reqBytes:f}),t.onError),n}},a=Reflect.get(n,`__original`);return Object.defineProperty(i,"__original",{configurable:!0,value:typeof a==`function`?a:n,writable:!0}),i}):_}function S(e,t){let n=window.XMLHttpRequest.prototype,r=/* @__PURE__ */ new WeakMap,i=[];try{return i.push(O(n,`open`,(e,n)=>function(...i){let[a,o]=i;if(!n())return e.apply(this,i);let s=o.toString();return oe(s,t.ignoreUrlPatterns)?(r.delete(this),e.apply(this,i)):(r.set(this,{method:a.toUpperCase(),url:m(s,t.redactUrlPatterns,window.location.href),startedAt:0,reqBytes:0,failed:!1,emitted:!1}),e.apply(this,i))})),i.push(O(n,`send`,(n,i)=>function(...a){let[o]=a,c=i()?r.get(this):void 0;if(c===void 0)return n.apply(this,a);c.startedAt=t.now(),c.reqBytes=ae(o);let l=()=>{c.failed=!0},u=()=>{c.emitted||(c.emitted=!0,this.removeEventListener(`error`,l),this.removeEventListener(`abort`,l),this.removeEventListener(`timeout`,l),i()&&T(e,s.Network,M({method:c.method,url:c.url,status:this.status,durationMs:Math.max(0,t.now()-c.startedAt),failed:c.failed||this.status===0,reqBytes:c.reqBytes,resBytes:ie(this)}),t.onError))};this.addEventListener(`error`,l),this.addEventListener(`abort`,l),this.addEventListener(`timeout`,l),this.addEventListener(`loadend`,u,{once:!0});try{return n.apply(this,a)}catch(n){throw this.removeEventListener(`error`,l),this.removeEventListener(`abort`,l),this.removeEventListener(`timeout`,l),this.removeEventListener(`loadend`,u),i()&&T(e,s.Network,M({method:c.method,url:c.url,status:0,durationMs:Math.max(0,t.now()-c.startedAt),failed:!0,reqBytes:c.reqBytes}),t.onError),n}})),k(i)}catch(e){throw A(i),e}}function C(e){return{...e,ignoreUrlPatterns:w(e.ignoreUrlPatterns),redactUrlPatterns:w(e.redactUrlPatterns)}}function w(e){return e.map(e=>{let t=e.flags.replace(/[gy]/gu,``);return t===e.flags?e:new RegExp(e.source,t)})}function T(e,t,n,r){try{e(t,n)}catch(e){r?.(e)}}function E(e){let t=!1;return n=>{if(!t){t=!0;try{let t=e?.(n);D(t)&&Promise.resolve(t).catch(()=>void 0)}catch{}finally{t=!1}}}}function D(e){return typeof e==`object`&&!!e&&`then`in e&&typeof e.then==`function`}function O(e,t,n){let r=e,i=r[t];if(typeof i!=`function`)return _;let a=!0,o=n(i,()=>a);return r[t]=o,()=>{a&&(a=!1,r[t]===o&&(r[t]=i))}}function k(e){let t=!1;return()=>{t||(t=!0,A(e))}}function A(e){for(let t=e.length-1;t>=0;--t)try{e[t]?.()}catch{}}function ee(e){if(e==null)return String(e);if(typeof e==`string`)return j(e);if(typeof e==`number`||typeof e==`boolean`||typeof e==`bigint`)return String(e);if(e instanceof Error)return j(e.stack??`${e.name}: ${e.message}`);try{return j(JSON.stringify(e))}catch{return Object.prototype.toString.call(e)}}function j(e){if(e.length<=g)return e;let t=e.charCodeAt(1023),n=t>=55296&&t<=56319?1023:g;return`${e.slice(0,n)}...(+${String(e.length-n)} chars)`}function te(e,t){return(t?.method??(typeof e==`object`&&`method`in e?e.method:`GET`)).toUpperCase()}function ne(e){return typeof e==`string`||e instanceof URL?e.toString():e.url}function re(e){let t=e.get(`content-length`);if(t===null)return;let n=Number.parseInt(t,10);return Number.isFinite(n)?n:void 0}function ie(e){try{let t=e.getResponseHeader(`content-length`);if(t===null)return;let n=Number.parseInt(t,10);return Number.isFinite(n)?n:void 0}catch{return}}function M(e){return{method:e.method,url:e.url,status:e.status,durationMs:e.durationMs,...e.failed===void 0?{}:{failed:e.failed},...e.reqBytes===void 0?{}:{reqBytes:e.reqBytes},...e.resBytes===void 0?{}:{resBytes:e.resBytes}}}function ae(e){if(e==null)return 0;if(typeof e==`string`)return new TextEncoder().encode(e).byteLength;if(e instanceof ArrayBuffer||ArrayBuffer.isView(e))return e.byteLength;if(e instanceof Blob)return e.size}function oe(e,t){return p(e,t)}const se=/* @__PURE__ */ new Set([`action`,`formaction`,`href`,`src`]);function ce(t){let n=()=>{t.beforeUserActivity?.()},r={emit:e=>{t.emit(le(e,t.redactUrlPatterns))},maskAllInputs:t.maskAllInputs,recordCanvas:!1,collectFonts:!1,inlineImages:!1,recordCrossOriginIframes:!1,slimDOMOptions:`all`,hooks:{input:n,mediaInteaction:n,mouseInteraction:n,mousemove:n,scroll:n,selection:n,viewportResize:n},sampling:{mousemove:100,mouseInteraction:!0,scroll:250,media:800,input:`last`}};t.maskAllText?r.maskTextSelector=`*`:t.maskTextSelector!==void 0&&t.maskTextSelector.length>0&&(r.maskTextSelector=t.maskTextSelector),t.blockSelector!==void 0&&t.blockSelector.length>0&&(r.blockSelector=t.blockSelector),t.checkoutEveryNms!==void 0&&t.checkoutEveryNms>0&&(r.checkoutEveryNms=t.checkoutEveryNms);let i=e(r);if(i===void 0)throw Error(`logfire session replay: rrweb failed to start recording`);return{stop:()=>{i()},addCustomEvent:(t,n)=>{e.addCustomEvent(t,n)},takeFullSnapshot:()=>{e.takeFullSnapshot(!0)}}}function le(e,t){if(typeof e.data!=`object`||e.data===null)return e;let n=e.data;if(e.type===i.Meta){if(typeof n.href!=`string`)return e;let r=m(n.href,t,window.location.href);return r===n.href?e:{...e,data:{...n,href:r}}}if(e.type!==i.FullSnapshot&&(e.type!==i.IncrementalSnapshot||n.source!==a.Mutation))return e;let r=N(n,t);return r===n?e:{...e,data:r}}function N(e,t){if(Array.isArray(e)){let n=!1,r=[];for(let i of e){let e=N(i,t);e!==i&&(n=!0),r.push(e)}return n?r:e}if(typeof e!=`object`||!e)return e;let n=e,r=!1,i={};for(let[e,a]of Object.entries(n)){let n=e===`attributes`&&!Array.isArray(a)?ue(a,t):N(a,t);n!==a&&(r=!0),i[e]=n}return r?i:e}function ue(e,t){if(typeof e!=`object`||!e||Array.isArray(e))return e;let n=e,r=!1,i={};for(let[e,a]of Object.entries(n)){if(!se.has(e.toLowerCase())||typeof a!=`string`){i[e]=a;continue}let n=m(a,t,window.location.href);n!==a&&(r=!0),i[e]=n}return r?i:e}function P(e){return typeof e==`object`&&e?e:void 0}function F(e){return typeof e==`string`&&e.length>0?e:void 0}function de(e){let t=P(e),n=F(t?.id);if(t===void 0||n===void 0)return;let r=F(t.name),i=F(t.email);return{id:n,...r===void 0?{}:{name:r},...i===void 0?{}:{email:i}}}function fe(e,t,n,r={},c){let l=1/0,u=0,d=0,f=0,p=0,m=!1,h=/* @__PURE__ */ new Set;for(let e of t){e.timestamp<l&&(l=e.timestamp),e.timestamp>u&&(u=e.timestamp);let t=P(e.data);if(e.type===i.FullSnapshot)m=!0;else if(e.type===i.Meta){let e=F(t?.href);e!==void 0&&h.add(e)}else if(e.type===i.IncrementalSnapshot&&t!==void 0){let e=t.source;if(e===a.MouseInteraction){let e=t.type;(e===o.Click||e===o.DblClick)&&d++}else e===a.Input&&f++}else if(e.type===i.Custom&&t!==void 0){let e=F(t.tag),n=P(t.payload);if(e===s.Error)p++;else if(e===s.Console)n?.level===`error`&&p++;else if(e===s.Navigation){let e=F(n?.url);e!==void 0&&h.add(e)}}}return{seq:e,firstTimestamp:l===1/0?0:l,lastTimestamp:u,eventCount:t.length,clickCount:d,keypressCount:f,errorCount:p,hasFullSnapshot:m,urls:[...h],...n!==void 0&&n.length>0?{distinctId:n}:{},...c===void 0?{}:{user:{...c}},...Object.keys(r).length===0?{}:{sessionAttributes:{...r}}}}function I(e=Date.now){let t=e(),n=new Uint8Array(/* @__PURE__ */ new ArrayBuffer(16));pe(n),n[0]=Math.floor(t/2**40)&255,n[1]=Math.floor(t/2**32)&255,n[2]=Math.floor(t/2**24)&255,n[3]=Math.floor(t/2**16)&255,n[4]=Math.floor(t/256)&255,n[5]=t&255,n[6]=(n[6]??0)&15|112,n[8]=(n[8]??0)&63|128;let r=``;for(let e of n)r+=e.toString(16).padStart(2,`0`);return`${r.slice(0,8)}-${r.slice(8,12)}-${r.slice(12,16)}-${r.slice(16,20)}-${r.slice(20)}`}function pe(e){let t=globalThis.crypto;if(typeof t?.getRandomValues==`function`){t.getRandomValues(e);return}for(let t=0;t<e.length;t++)e[t]=Math.floor(Math.random()*256)}const me=`lf_session_replay`;var he=class{idleTimeoutMs;maxDurationMs;now;storage;memorySession;pendingSession;persistenceTimer;constructor(e){this.idleTimeoutMs=e.idleTimeoutMs,this.maxDurationMs=e.maxDurationMs,this.now=e.now??Date.now,this.storage=e.storage===void 0?L():e.storage}getSession(){let e=this.now();if(this.memorySession!==void 0&&!this.isExpired(this.memorySession,e))return this.memorySession;let t=this.read();return t!==void 0&&!this.isExpired(t,e)?t:this.createSession(e)}touch(){let e=this.now(),t={...this.getSession(),lastActivityAt:e};return this.memorySession=t,this.scheduleWrite(t),t}reset(){return this.createSession(this.now())}flushPendingStorage(){this.persistenceTimer!==void 0&&(clearTimeout(this.persistenceTimer),this.persistenceTimer=void 0);let e=this.pendingSession;this.pendingSession=void 0,e!==void 0&&this.writeNow(e)}isExpired(e,t){return t-e.lastActivityAt>this.idleTimeoutMs||t-e.startedAt>this.maxDurationMs}createSession(e){let t={id:I(this.now),startedAt:e,lastActivityAt:e};return this.flushPendingStorage(),this.writeNow(t),t}read(){if(this.storage!==null)try{let e=this.storage.getItem(me);if(e!==null){let t=JSON.parse(e);if(ge(t))return this.memorySession=t,t}}catch{return this.memorySession}return this.memorySession}write(e){if(this.memorySession=e,this.storage!==null)try{this.storage.setItem(me,JSON.stringify(e))}catch{}}scheduleWrite(e){this.pendingSession=e,this.persistenceTimer===void 0&&(this.persistenceTimer=setTimeout(()=>{this.persistenceTimer=void 0;let e=this.pendingSession;this.pendingSession=void 0,e!==void 0&&this.writeNow(e)},1e3))}writeNow(e){this.memorySession=e,this.write(e)}};function L(){try{return globalThis.sessionStorage??null}catch{return null}}function ge(e){if(typeof e!=`object`||!e)return!1;let t=e;return typeof t.id==`string`&&t.id.length>0&&typeof t.startedAt==`number`&&Number.isFinite(t.startedAt)&&typeof t.lastActivityAt==`number`&&Number.isFinite(t.lastActivityAt)}var R=class extends Error{droppedSeqs;reason;seq;sessionId;status;constructor(e){super(_e(e),{cause:e.cause}),this.name=`ReplayUploadError`,this.droppedSeqs=Object.freeze([...e.droppedSeqs??[]]),this.reason=e.reason,this.seq=e.seq,this.sessionId=e.sessionId,this.status=e.status}};function _e(e){let t=e.seq===void 0?`replay chunk`:`replay chunk seq=${String(e.seq)}`,n=e.cause instanceof Error?`: ${e.cause.message}`:``;return`${t} ${e.reason}${n}`}const z=`lf_session_replay_seq`,B=1e4,ve=3e4,ye={gzip:t,gzipSync:n};var be=class{buffer=[];bufferHasFullSnapshot=!1;pendingBytes=0;seq=0;timer;nextFlushAt;lastUserActivityAt;startedAt;started=!1;held;heldBufferIncomplete=!1;minimumBufferIncomplete=!1;minimumDurationSatisfied=!1;firstObservedTimestamp;lastObservedTimestamp;refreshingMinimumSnapshot=!1;mode;queue=[];retainedBytes=0;activeUpload;drainPromise;draining=!1;lifecycleFlights=/* @__PURE__ */ new Set;closed=!1;shuttingDown=!1;retryAbort=new AbortController;deadlineAbort=new AbortController;resyncPending=!1;resyncTimer;lastResyncAt;reservedKeepaliveBytes=0;asyncCompressionAvailable=!0;config;compression;storage;sessionId;sessionAttributes;takeFullSnapshot;constructor(e,t,n,r=L(),i=ye,a={},o={}){this.config=e,this.sessionId=t,this.sessionAttributes=Object.freeze({...a}),this.mode=n,this.storage=r,this.compression=i,this.held=o.holdUntilActivity===!0&&n===`full`,this.takeFullSnapshot=o.takeFullSnapshot,this.minimumDurationSatisfied=e.minSessionDurationMs===0,this.seq=this.readPersistedSequence()??0,this.startedAt=this.config.now(),this.lastUserActivityAt=this.startedAt}start(){this.started||this.mode!==`full`||(this.started=!0,this.scheduleFlush())}add(e){this.minimumDurationSatisfied||(this.firstObservedTimestamp??=e.timestamp,this.lastObservedTimestamp=Math.max(this.lastObservedTimestamp??e.timestamp,e.timestamp)),d(e)&&(this.lastUserActivityAt=this.config.now());let t=U(e);if(this.resyncPending){this.addDuringResync(e,t);return}if(this.refreshingMinimumSnapshot){this.buffer.push(e),this.pendingBytes+=t;return}let n=!this.minimumDurationSatisfied;if(this.mode===`buffer`||this.held||n){if(e.type===i.Meta){this.buffer=[e],this.bufferHasFullSnapshot=!1,this.minimumBufferIncomplete=!1,this.pendingBytes=t,n&&(this.mode===`full`&&(this.firstObservedTimestamp=e.timestamp),this.finishMinimumBufferingEvent());return}if(e.type===i.FullSnapshot){let r=!this.bufferHasFullSnapshot&&this.buffer.length===1&&this.buffer[0]?.type===i.Meta?this.buffer[0]:void 0;this.buffer=r===void 0?[e]:[r,e],this.bufferHasFullSnapshot=!0,this.pendingBytes=t+(r===void 0?0:U(r)),this.heldBufferIncomplete=!1,this.minimumBufferIncomplete=!1,n&&(this.mode===`full`&&(this.firstObservedTimestamp=r?.timestamp??e.timestamp),this.finishMinimumBufferingEvent());return}if(!this.bufferHasFullSnapshot||t>this.config.maxBufferBytes){this.heldBufferIncomplete||=this.held,this.minimumBufferIncomplete||=n,n&&this.finishMinimumBufferingEvent();return}if(this.pendingBytes+t>this.config.maxBufferBytes){this.heldBufferIncomplete||=this.held,this.minimumBufferIncomplete||=n,n&&this.finishMinimumBufferingEvent();return}}if(e.type===i.Meta&&this.mode===`full`&&this.buffer.length>0&&this.flushAndReport(),this.buffer.push(e),this.pendingBytes+=t,n&&this.minimumDurationReached()){this.flushAndReport();return}this.mode===`full`&&this.pendingBytes>=this.config.maxBufferBytes&&e.type!==i.Meta?this.flushAndReport():this.scheduleFlush()}addDuringResync(e,t){if(e.type===i.Meta){this.buffer=[e],this.pendingBytes=t;return}if(e.type!==i.FullSnapshot)return;let n=this.buffer.length===1&&this.buffer[0]?.type===i.Meta?this.buffer[0]:void 0;this.buffer=n===void 0?[e]:[n,e],this.pendingBytes=t+(n===void 0?0:U(n)),this.resyncPending=!1,this.clearResyncTimer(),this.pendingBytes>=this.config.maxBufferBytes?this.flushAndReport():this.scheduleFlush()}async triggerFlush(){return this.mode===`buffer`&&(this.bufferHasFullSnapshot||(this.buffer=[],this.pendingBytes=0),this.mode=`full`,this.start()),this.flush()}async flush(e={}){return this.flushInternal(e)}async flushInternal(e={}){if(this.closed||this.mode===`buffer`||this.held||this.buffer.length===0||!this.minimumDurationReached()||(this.clearScheduledFlush(),this.minimumBufferIncomplete&&!this.refreshMinimumBuffer()))return;this.minimumDurationSatisfied=!0;let t=this.buffer,n=this.pendingBytes;this.buffer=[],this.bufferHasFullSnapshot=!1,this.minimumBufferIncomplete=!1,this.pendingBytes=0;let r=this.sessionId,i=this.snapshotIdentity();if(e.keepalive===!0){let e=Ee(t),n=this.allocateSeq(e.length),a=this.deliverLifecycle(e,n,r,i);this.lifecycleFlights.add(a);let o=()=>{this.lifecycleFlights.delete(a)};a.then(o,o),await a;return}await this.enqueue(t,n,r,i)?.done}async shutdown(e={}){if(this.started=!1,this.clearScheduledFlush(),this.held||!this.minimumDurationReached()){this.discard(),await this.settleWithinDeadline([]);return}if(e.keepalive===!0){await this.flush(e),this.closed=!0,this.clearResyncTimer(),await this.settleWithinDeadline([]);return}let t=this.flushInternal();this.closed=!0,this.shuttingDown=!0,this.clearResyncTimer(),this.retryAbort.abort();let n=this.queue.filter(e=>e!==this.activeUpload).map(async e=>this.finalAttempt(e));await this.settleWithinDeadline([t,...n])}discard(){this.started=!1,this.closed=!0,this.clearScheduledFlush(),this.clearResyncTimer(),this.buffer=[],this.bufferHasFullSnapshot=!1,this.minimumBufferIncomplete=!1,this.pendingBytes=0}getMode(){return this.mode}isHeld(){return this.held}releaseHeld(e){this.held&&((this.heldBufferIncomplete||!this.bufferHasFullSnapshot)&&(this.buffer=[],this.bufferHasFullSnapshot=!1,this.pendingBytes=0,e()),this.held=!1,this.pendingBytes>=this.config.maxBufferBytes?this.flushAndReport():this.scheduleFlush())}flushAndReport(){this.flushInternal().catch(e=>{V(this.config.onError,e)})}scheduleFlush(){let e=this.config.now(),t=Math.max(0,this.config.minSessionDurationMs-(e-this.startedAt)),n=Math.max(f(this.config.flushIntervalMs,e-this.lastUserActivityAt),t);this.scheduleFlushIn(e,n)}scheduleFlushIn(e,t){if(!this.started||this.mode!==`full`||this.held||this.buffer.length===0)return;let n=e+t;this.timer!==void 0&&this.nextFlushAt!==void 0&&this.nextFlushAt<=n||(this.clearScheduledFlush(),this.nextFlushAt=n,this.timer=setTimeout(()=>{this.timer=void 0,this.nextFlushAt=void 0,this.flushAndReport()},t))}clearScheduledFlush(){this.timer!==void 0&&(clearTimeout(this.timer),this.timer=void 0),this.nextFlushAt=void 0}minimumDurationReached(){return this.minimumDurationSatisfied||this.config.minSessionDurationMs===0?!0:this.firstObservedTimestamp===void 0||this.lastObservedTimestamp===void 0?!1:this.lastObservedTimestamp-this.firstObservedTimestamp>=this.config.minSessionDurationMs}finishMinimumBufferingEvent(){this.minimumDurationReached()?this.flushAndReport():this.scheduleFlush()}refreshMinimumBuffer(){let e=this.buffer.length,t=this.pendingBytes;if(this.takeFullSnapshot!==void 0){this.refreshingMinimumSnapshot=!0;try{this.takeFullSnapshot()}catch(e){V(this.config.onError,e)}finally{this.refreshingMinimumSnapshot=!1}}return this.buffer.slice(e).some(e=>e.type===i.FullSnapshot)?(this.minimumBufferIncomplete=!1,!0):(this.buffer.length=e,this.pendingBytes=t,!1)}snapshotIdentity(){let e=this.snapshotUser(),t=this.config.distinctId;if(this.config.getDistinctId!==void 0)try{t=this.config.getDistinctId()??this.config.distinctId}catch(e){V(this.config.onError,e)}else e!==void 0&&(t=e.id);return{distinctId:t,user:e}}createEnvelope(e,t,n){return{version:1,meta:fe(t,e,n.distinctId,this.sessionAttributes,n.user),events:e}}snapshotUser(){if(this.config.getUser!==void 0)try{return de(this.config.getUser())}catch(e){V(this.config.onError,e);return}}allocateSeq(e){let t=this.seq;return this.seq+=e,this.saveSeq(this.sessionId,this.seq),t}enqueue(e,t,n,r){let a=Math.max(2e6,2*this.config.maxBufferBytes);if(this.queue.length>0&&this.retainedBytes+t>a){V(this.config.onError,new R({cause:/* @__PURE__ */ Error(`replay upload queue is full`),reason:`not-sent`,seq:void 0,sessionId:n})),this.beginResync();return}let o=()=>void 0,s={body:void 0,done:new Promise(e=>{o=e}),events:e,hasFullSnapshot:e.some(e=>e.type===i.FullSnapshot),identity:r,reachedFetch:!1,resolve:o,retainedBytes:t,seq:this.allocateSeq(1),sessionId:n,settled:!1};return this.queue.push(s),this.retainedBytes+=t,this.draining||(this.draining=!0,this.drainPromise=this.drain()),s}async drain(){try{for(;!this.shuttingDown;){let e=this.queue[0];if(e===void 0)break;this.activeUpload=e;let t=await this.deliverQueued(e);this.activeUpload=void 0,this.settle(e,t)}}finally{this.activeUpload=void 0,this.draining=!1}}async deliverQueued(e){let t=await this.compressQueued(e);if(t!==void 0||e.settled)return t;let n=Date.now(),r;for(let t=1;;t++){let i=ve-(Date.now()-n);if(t>1&&i<=0)return W(r,e.reachedFetch);let a=await this.attemptQueued(e,Math.min(B,i));if(a===void 0)return;r=a;let o=Ae(a,t,this.config.random);if(o===void 0||this.shuttingDown||Date.now()-n+o>=ve)return W(a,e.reachedFetch);await this.backoff(o)}}async compressQueued(e){if(e.body!==void 0||e.events===void 0)return;let t=e.events;try{let n=r(JSON.stringify(this.createEnvelope(t,e.seq,e.identity))),i=this.shuttingDown?this.compression.gzipSync(n):await this.compressOrdinary(n);if(e.events!==t)return await this.compressQueued(e);e.settled||(this.retainedBytes+=i.byteLength-e.retainedBytes,e.retainedBytes=i.byteLength,e.body=i,e.events=void 0);return}catch(e){return{cause:e,reason:`not-sent`}}}async attemptQueued(e,t=B){let n=e.body;if(n!==void 0)try{await this.send({body:n,requestKeepalive:!1,reservedBytes:0,seq:e.seq,sessionId:e.sessionId},()=>{e.reachedFetch=!0},t);return}catch(e){return e}}async finalAttempt(e){let t=await this.compressQueued(e);if(t!==void 0){this.settle(e,t);return}let n=await this.attemptQueued(e);this.settle(e,n===void 0?void 0:W(n,e.reachedFetch))}async settleWithinDeadline(e){let t=Promise.all([...e,this.drainPromise,...this.lifecycleFlights]).then(()=>void 0,()=>void 0),n,r=new Promise(e=>{n=setTimeout(e,B)});if(await Promise.race([t,r]),clearTimeout(n),this.shuttingDown){this.deadlineAbort.abort(/* @__PURE__ */ Error(`replay upload did not finish before shutdown`));for(let e of[...this.queue])this.settle(e,{cause:/* @__PURE__ */ Error(`replay upload did not finish before shutdown`),reason:e.reachedFetch?`unconfirmed`:`not-sent`})}}settle(e,t){if(e.settled)return;e.settled=!0,this.retainedBytes-=e.retainedBytes;let n=this.queue.indexOf(e);n>=0&&this.queue.splice(n,1),e.body=void 0,e.events=void 0,e.resolve(),t!==void 0&&this.handleSequencedLoss(e.seq,e.sessionId,t)}handleSequencedLoss(e,t,n){let r=[];if(!this.shuttingDown){let t=!1;for(let n of[...this.queue])if(!(n.seq<e)){if(n.events===void 0){if(n.hasFullSnapshot){t=!0;break}continue}if(n.hasFullSnapshot){let e=we(n.events),r=Te(e);this.retainedBytes+=r-n.retainedBytes,n.retainedBytes=r,n.events=e,t=!0;break}r.push(n.seq),this.settle(n,void 0)}!t&&!this.trimBufferToAnchor()&&this.beginResync()}V(this.config.onError,new R({cause:n.cause,droppedSeqs:r,reason:n.reason,seq:e,sessionId:t,status:n.status}))}trimBufferToAnchor(){return this.buffer.some(e=>e.type===i.FullSnapshot)?(this.buffer=we(this.buffer),this.pendingBytes=Te(this.buffer),!0):!1}beginResync(){this.closed||(this.resyncPending=!0,this.buffer=[],this.bufferHasFullSnapshot=!1,this.pendingBytes=0,this.clearScheduledFlush(),this.scheduleResyncSnapshot())}scheduleResyncSnapshot(){if(this.resyncTimer!==void 0||this.closed)return;let e=this.lastResyncAt===void 0?0:Math.max(0,this.lastResyncAt+6e4-this.config.now());this.resyncTimer=setTimeout(()=>{this.resyncTimer=void 0,this.takeResyncSnapshot()},e)}takeResyncSnapshot(){if(this.resyncPending&&!this.closed&&this.takeFullSnapshot!==void 0){this.lastResyncAt=this.config.now();try{this.takeFullSnapshot()}catch(e){V(this.config.onError,e),this.scheduleResyncSnapshot();return}this.isResyncPending()&&(V(this.config.onError,/* @__PURE__ */ Error(`replay resync snapshot produced no full snapshot`)),this.scheduleResyncSnapshot())}}isResyncPending(){return this.resyncPending}clearResyncTimer(){this.resyncTimer!==void 0&&(clearTimeout(this.resyncTimer),this.resyncTimer=void 0)}async backoff(e){let t=this.retryAbort.signal;t.aborted||await new Promise(n=>{let r=()=>{clearTimeout(i),t.removeEventListener(`abort`,r),n()},i=setTimeout(r,e);t.addEventListener(`abort`,r)})}async deliverLifecycle(e,t,n,i){let a=[];for(let o=0;o<e.length;o++){let s=e[o];if(s===void 0){a.push(void 0);continue}let c=this.createEnvelope(s,t+o,i);try{a.push({body:this.compression.gzipSync(r(JSON.stringify(c))),requestKeepalive:!1,reservedBytes:0,seq:t+o,sessionId:n})}catch(e){this.handleSequencedLoss(t+o,n,{cause:e,reason:`not-sent`}),a.push(void 0)}}let o=!0,s=Math.max(0,48e3-this.reservedKeepaliveBytes);for(let e of a){if(e===void 0){o=!1;continue}o&&e.body.byteLength<=s?(e.requestKeepalive=!0,e.reservedBytes=e.body.byteLength,this.reservedKeepaliveBytes+=e.reservedBytes,s-=e.reservedBytes):o=!1}await Promise.all(a.map(async e=>{if(e===void 0)return;let t=!1;try{await this.send(e,()=>{t=!0})}catch(n){this.handleSequencedLoss(e.seq,e.sessionId,W(n,t))}}))}async compressOrdinary(e){if(!this.asyncCompressionAvailable)return this.compression.gzipSync(e);try{return await De(this.compression,e)}catch{return this.asyncCompressionAvailable=!1,this.compression.gzipSync(e)}}async send(e,t,n=B){let r,i,a,o=new AbortController,s=setTimeout(()=>{o.abort(/* @__PURE__ */ Error(`replay upload timed out after ${String(n)}ms`))},n),c=this.deadlineAbort.signal,l=()=>{o.abort(c.reason)};c.addEventListener(`abort`,l);try{let n=`${this.config.replayUrl.replace(/\/+$/u,``)}/${encodeURIComponent(e.sessionId)}?seq=${String(e.seq)}`,s=await Ce(this.getUploadHeaders(),o.signal);t();let c=this.config.fetchImpl(n,{method:`POST`,headers:s,body:e.body.slice(),keepalive:e.requestKeepalive,signal:o.signal});r=!0;let l=await c;if(i=!0,a=await Oe(l),!l.ok){let e=l.status===429||l.status===503?je(l.headers.get(`retry-after`),Date.now()):void 0;throw new H(l.status,e)}}finally{clearTimeout(s),c.removeEventListener(`abort`,l),e.reservedBytes>0&&(r!==!0||i!==!0||a===!0)&&(this.reservedKeepaliveBytes=Math.max(0,this.reservedKeepaliveBytes-e.reservedBytes))}}async getUploadHeaders(){let e=this.config.headers===void 0?{}:await this.config.headers(),t=await Se(this.config.token);return{...t===void 0||t.length===0?e:{...Object.fromEntries(Object.entries(e).filter(([e])=>e.toLowerCase()!==`authorization`)),Authorization:`Bearer ${t}`},"Content-Type":`application/json`,"Content-Encoding":`gzip`}}canResumeSequence(){return this.readPersistedSequence()===this.seq}readPersistedSequence(){if(this.storage!==null)try{let e=this.storage.getItem(z);if(e===null)return;let t=JSON.parse(e);if(typeof t!=`object`||!t)return;let n=t;return n.id===this.sessionId&&typeof n.seq==`number`&&Number.isSafeInteger(n.seq)&&n.seq>=0?n.seq:void 0}catch{return}}saveSeq(e,t){if(this.storage!==null)try{this.storage.setItem(z,JSON.stringify({id:e,seq:t}))}catch{}}};function V(e,t){try{let n=e?.(t);xe(n)&&Promise.resolve(n).catch(()=>void 0)}catch{}}function xe(e){return typeof e==`object`&&!!e&&`then`in e&&typeof e.then==`function`}var H=class extends Error{retryAfter;status;constructor(e,t){super(`replay ingest failed: ${String(e)}`),this.status=e,this.retryAfter=t,this.name=`ReplayIngestError`}};async function Se(e){return typeof e==`function`?e():e}async function Ce(e,t){if(t.aborted)throw t.reason;return new Promise((n,r)=>{let i=()=>{r(t.reason)};t.addEventListener(`abort`,i,{once:!0}),e.then(e=>{t.removeEventListener(`abort`,i),n(e)},e=>{t.removeEventListener(`abort`,i),r(e instanceof Error?e:Error(String(e)))})})}function U(e){try{return r(JSON.stringify(e)).byteLength}catch{return 0}}function we(e){let t=e.findIndex(e=>e.type===i.FullSnapshot);if(t<0)return e;let n=t>0&&e[t-1]?.type===i.Meta?t-1:t;return e.slice(n)}function Te(e){return e.reduce((e,t)=>e+U(t),0)}function Ee(e){let t=[],n=[],r=0;for(let i of e){let e=U(i);n.length>0&&r+e>48e3&&(t.push(n),n=[],r=0),n.push(i),r+=e}return n.length>0&&t.push(n),t}async function De(e,t){return new Promise((n,r)=>{let i=[];typeof window<`u`&&i.push(window),typeof document<`u`&&i.push(document);let a=()=>{for(let e of i)e.removeEventListener(`securitypolicyviolation`,s)},o=(e,t)=>{if(a(),e!==null){r(e);return}n(t)},s=e=>{let t=e;(t.effectiveDirective.includes(`worker-src`)||t.violatedDirective.includes(`worker-src`))&&o(/* @__PURE__ */ Error(`replay compression worker blocked by Content Security Policy`))};for(let e of i)e.addEventListener(`securitypolicyviolation`,s);try{e.gzip(t,{level:6},(e,t)=>{o(e,t)})}catch(e){a(),r(e instanceof Error?e:Error(String(e)))}})}async function Oe(e){if(e.body===null)return!0;try{return await e.body.cancel(),!0}catch{return!1}}function ke(e){return e===408||e===425||e===429||e>=500}function Ae(e,t,n){if(e instanceof H&&!ke(e.status))return;let r=Math.min(8e3,500*2**(t-1)),i=Math.round(r*(1-.5*n())),a=e instanceof H?e.retryAfter:void 0;return a===void 0?i:Math.max(a,i)}function W(e,t){let n=e instanceof H?e.status:void 0;return n!==void 0&&!ke(n)?{cause:e,reason:`rejected`,status:n}:{cause:e,reason:t?`unconfirmed`:`not-sent`,status:n}}function je(e,t){if(e===null)return;let n=e.trim();if(/^\d+$/u.test(n)){let e=Number(n);return Number.isSafeInteger(e)?e*1e3:void 0}let r=Fe(n,t);return r===void 0?void 0:Math.max(0,r-t)}const Me=[`Jan`,`Feb`,`Mar`,`Apr`,`May`,`Jun`,`Jul`,`Aug`,`Sep`,`Oct`,`Nov`,`Dec`],Ne=[`Sun`,`Mon`,`Tue`,`Wed`,`Thu`,`Fri`,`Sat`],Pe=[`Sunday`,`Monday`,`Tuesday`,`Wednesday`,`Thursday`,`Friday`,`Saturday`];function Fe(e,t){let n=/^(Sun|Mon|Tue|Wed|Thu|Fri|Sat), (\d{2}) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) (\d{4}) (\d{2}):(\d{2}):(\d{2}) GMT$/u.exec(e);if(n!==null)return G(n[1],n[2],n[3],n[4],n[5],n[6],n[7]);let r=/^(Sunday|Monday|Tuesday|Wednesday|Thursday|Friday|Saturday), (\d{2})-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-(\d{2}) (\d{2}):(\d{2}):(\d{2}) GMT$/u.exec(e);if(r!==null){let e=new Date(t).getUTCFullYear(),n=Number(r[4]),i=Math.floor(e/100)*100+n;return i>e+50&&(i-=100),G(r[1],r[2],r[3],String(i),r[5],r[6],r[7])}let i=/^(Sun|Mon|Tue|Wed|Thu|Fri|Sat) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) (\d{2}| \d) (\d{2}):(\d{2}):(\d{2}) (\d{4})$/u.exec(e);if(i!==null)return G(i[1],i[3]?.trim(),i[2],i[7],i[4],i[5],i[6])}function G(e,t,n,r,i,a,o){let s=Number(t),c=Me.indexOf(n),l=Number(r),u=Number(i),d=Number(a),f=Number(o);if(c<0||s<1||s>31||u>23||d>59||f>59)return;let p=/* @__PURE__ */ new Date(0);if(p.setUTCFullYear(l,c,s),p.setUTCHours(u,d,f,0),p.getUTCFullYear()!==l||p.getUTCMonth()!==c||p.getUTCDate()!==s||p.getUTCHours()!==u||p.getUTCMinutes()!==d||p.getUTCSeconds()!==f)return;let m=Ne.indexOf(e),h=Pe.indexOf(e);return(m>=0?m:h)===p.getUTCDay()?p.getTime():void 0}const Ie=`lf_session_replay_recording`,K=`lf_session_replay_recording_owner`;var Le=class{state;storage;owner;now;maxDurationMs;readOpenerState;constructor(e,t,n,r=()=>null){this.storage=e,this.now=t,this.owner=I(t),this.maxDurationMs=Math.min(n,72e5),this.readOpenerState=r;try{e?.getItem(`lf_session_replay_recording_owner`)===null&&(this.state=this.readResumableState()),e?.setItem(K,this.owner),e?.getItem(`lf_session_replay_recording_owner`)!==this.owner&&(this.storage=null,this.state=void 0)}catch{this.storage=null,this.state=void 0}}get(e){if(this.state!==void 0&&this.isCurrent(this.state.id,e))return this.state.id;this.state={id:I(this.now),rumSessionId:e,startedAt:this.now()};try{this.storage?.setItem(Ie,JSON.stringify(this.state))}catch{}return this.state.id}isCurrent(e,t){let n=this.state;if(n===void 0)return!1;let r=this.now();return n.id===e&&n.rumSessionId===t&&r>=n.startedAt&&r-n.startedAt<this.maxDurationMs}release(){try{this.storage?.getItem(`lf_session_replay_recording_owner`)===this.owner&&this.storage.removeItem(K)}catch{}}resume(){try{this.state=this.storage?.getItem(`lf_session_replay_recording_owner`)===null?this.readResumableState():void 0,this.storage?.setItem(K,this.owner),this.storage?.getItem(`lf_session_replay_recording_owner`)!==this.owner&&(this.state=void 0,this.storage=null)}catch{this.state=void 0,this.storage=null}}readResumableState(){let e=this.storage?.getItem(Ie),t=this.storage?.getItem(z);if(e==null||t==null)return;let n=null;try{n=this.readOpenerState()}catch{}if(n!==e)return Re(e,t)}};function Re(e,t){let n=JSON.parse(e),r=JSON.parse(t);if(typeof n!=`object`||!n||typeof r!=`object`||!r)return;let i=n,a=r;if(!(typeof i.id!=`string`||i.id.length===0||typeof i.rumSessionId!=`string`||typeof i.startedAt!=`number`||!Number.isFinite(i.startedAt)||a.id!==i.id||typeof a.seq!=`number`||!Number.isSafeInteger(a.seq)||a.seq<0))return{id:i.id,rumSessionId:i.rumSessionId,startedAt:i.startedAt}}function ze(e){return Number.isFinite(e)?Math.min(1,Math.max(0,e)):0}function Be(e){let t=e.random??Math.random;return t()<ze(e.sessionSampleRate)?`full`:t()<ze(e.onErrorSampleRate)?`buffer`:`off`}const Ve=/^[a-z][a-z0-9_]{0,63}$/u;function He(e,t){let n=0;for(let r of e)if(n+=+(r.length>0),n>t)return!1;return!0}function Ue(e,t){if(e===void 0)return Object.freeze({});let n;try{n=e()}catch(e){return t(e),Object.freeze({})}if(typeof n!=`object`||!n||Array.isArray(n))return Object.freeze({});let r;try{r=Object.getPrototypeOf(n)}catch(e){return t(e),Object.freeze({})}if(r!==Object.prototype&&r!==null)return Object.freeze({});let i;try{i=Object.keys(n)}catch(e){return t(e),Object.freeze({})}let a={},o=0;for(let e of i){if(!Ve.test(e))continue;let r;try{r=Reflect.get(n,e)}catch(e){t(e);continue}if((typeof r==`boolean`||typeof r==`number`&&Number.isFinite(r)||typeof r==`string`&&He(r,200))&&(Object.defineProperty(a,e,{configurable:!0,enumerable:!0,value:r,writable:!0}),o+=1,o===20))break}return Object.freeze(a)}const We={mode:`off`,recording:!1,getSessionId:()=>``,captureError:()=>void 0,getRecordingId:()=>``,flush:async()=>Promise.resolve(),stop:async()=>Promise.resolve()},Ge=`lf_session_replay_mode`,q=Symbol.for(`@pydantic/logfire-session-replay/controller`);function Ke(e){if(typeof window>`u`||typeof document>`u`)return We;let t=nt();try{let n=Je(e),r=new he({idleTimeoutMs:n.sessionIdleTimeoutMs,maxDurationMs:n.maxSessionDurationMs,now:n.now}),i=r.getSession().id,a=e=>{let t;try{t=n.getSessionId?.()}catch(e){return Z(n.onError,e),i}if(t!==void 0&&t.length>0)return i=t,t;let a=e?r.touch().id:r.getSession().id;return i=a,a},o=L(),s=new Le(o,n.now,n.maxSessionDurationMs,()=>window.opener?.sessionStorage.getItem(`lf_session_replay_recording`)??null),c=a(!1),l=s.get(c),u,d=!1,f=!1,p=0,m=!0,h=Promise.resolve(),g=Promise.resolve(),_,v=(e,t,r=!t)=>{let i=Ye(n,e,o);if(!(i===`off`||d||f||u!==void 0||e!==c))try{let t=l;u=qe({config:n,getSessionId:a,mode:i,onSessionChanged:y,samplingModeStorage:o,sessionId:e,recordingId:t,isCurrentRecording:()=>s.isCurrent(t,a(!1)),holdUntilActivity:r})}catch(e){if(u=void 0,t)throw e;Z(n.onError,e)}},y=(e,t=!0)=>{if(d||f)return;let r=s.get(e);if(e===c&&r===l)return;c=e,l=r;let i=u;u=void 0;let a=i?.deactivate()??Promise.resolve(),o=p;h=h.then(async()=>{await X(a,n.onError),!d&&p===o&&c===e&&l===r&&v(e,!1,t)})},b;try{v(c,!0),b=setInterval(()=>{y(a(!1))},1e3)}catch(e){throw u?.discard(),u=void 0,s.release(),e}let x=()=>{f=!0,p+=1;let e=u;u=void 0;let t=e?.deactivate(!0)??Promise.resolve();g=Promise.all([g,h,X(t,n.onError)]).then(()=>void 0),h=Promise.resolve(),m=e?.transport.canResumeSequence()??m,m&&s.release()},S=e=>{if(!e.persisted||d)return;u?.discard(),u=void 0;let t=p;h=h.then(async()=>{await new Promise(e=>{setTimeout(e,0)}),!(d||p!==t)&&(f=!1,s.resume(),c=a(!1),l=s.get(c),m=!0,v(c,!1,!1))})};return window.addEventListener(`pagehide`,x),window.addEventListener(`pageshow`,S),{get mode(){try{return u?.transport.getMode()??`off`}catch(e){return Z(n.onError,e),`off`}},get recording(){try{return u!==void 0}catch(e){return Z(n.onError,e),!1}},getSessionId:()=>a(!1),captureError:(e,t)=>{try{u?.captureError(e,t)}catch(e){Z(n.onError,e)}},getRecordingId:()=>u!==void 0&&s.isCurrent(u.recordingId,a(!1))?u.recordingId:``,flush:async()=>{try{await h,await u?.transport.flush()}catch(e){Z(n.onError,e)}},stop:async()=>(_??=(async()=>{d=!0,p+=1,clearInterval(b),window.removeEventListener(`pagehide`,x),window.removeEventListener(`pageshow`,S);let e=u;u=void 0,await X(e?.deactivate()??Promise.resolve(),n.onError),await h,await g,r.flushPendingStorage(),m=e?.transport.canResumeSequence()??m,m&&s.release(),t()})(),_)}}catch(e){throw t(),e}}function qe(e){let{config:t,getSessionId:n,holdUntilActivity:r,mode:i,onSessionChanged:a,samplingModeStorage:o,sessionId:c,recordingId:l,isCurrentRecording:u}=e,f=Ue(t.getSessionAttributes,e=>{Z(t.onError,e)}),p,m=new be(t,l,i,void 0,void 0,f,{holdUntilActivity:r,takeFullSnapshot:()=>{p.takeFullSnapshot()}}),h=[],g=!0,_=()=>g,x;try{p=ce({beforeUserActivity:()=>{if(g&&m.isHeld())try{let e=n(!0);if(e!==c||!u()){a(e,!1);return}m.releaseHeld(()=>{p.takeFullSnapshot()})}catch(e){Z(t.onError,e)}},emit:e=>{if(g)try{let t=n(d(e));if(t!==c||!u()){a(t,!1);return}m.add(e)}catch(e){Z(t.onError,e)}},maskAllText:t.maskAllText,maskAllInputs:t.maskAllInputs,maskTextSelector:t.maskTextSelector,blockSelector:t.blockSelector,checkoutEveryNms:i===`buffer`?12e4:Math.max(3e5,t.minSessionDurationMs),redactUrlPatterns:t.redactUrlPatterns}),h.push(()=>{p.stop()});let e=(e,n)=>{if(g)try{p.addCustomEvent(e,n)}catch(e){Z(t.onError,e)}},r=n=>{_()&&(m.releaseHeld(()=>{p.takeFullSnapshot()}),e(s.Error,n),_()&&m.getMode()===`buffer`&&(Ze(o,c,`full`),Y(m.triggerFlush(),t.onError)))},f=/* @__PURE__ */ new WeakSet,S=e=>typeof e!=`object`||!e||!f.has(e)&&(f.add(e),!0),C=(e,t)=>{if(S(e)){let n=$($e(e),void 0,J(e));r(typeof t?.timestamp==`number`?{...n,timestamp:t.timestamp}:n)}},w=e=>{e instanceof ErrorEvent&&S(e.error)&&r($(e.message,e.filename,J(e.error)))},T=e=>{C(e.reason)},E=()=>{document.visibilityState===`hidden`&&Y(m.flush({keepalive:!0}),t.onError)},D=()=>{Y(m.flush({keepalive:!0}),t.onError)};return t.captureGlobalErrors&&(window.addEventListener(`error`,w,!0),h.push(()=>{window.removeEventListener(`error`,w,!0)}),window.addEventListener(`unhandledrejection`,T,!0),h.push(()=>{window.removeEventListener(`unhandledrejection`,T,!0)})),document.addEventListener(`visibilitychange`,E),h.push(()=>{document.removeEventListener(`visibilitychange`,E)}),window.addEventListener(`pagehide`,D),h.push(()=>{window.removeEventListener(`pagehide`,D)}),t.captureConsole&&h.push(v(e,{onError:t.onError})),t.captureNetwork&&h.push(y(e,{ignoreUrlPatterns:t.ignoreUrlPatterns,now:t.now,onError:t.onError,redactUrlPatterns:t.redactUrlPatterns})),t.captureNavigation&&h.push(b(e,{onError:t.onError,redactUrlPatterns:t.redactUrlPatterns})),m.start(),{sessionId:c,recordingId:l,transport:m,captureError:C,deactivate:async(e=!1)=>(x??=(async()=>{let t=m.shutdown({keepalive:e});g=!1,Q(h),await t})(),x),discard:()=>{g=!1,Q(h),m.discard()}}}catch(e){throw g=!1,Q(h),m.discard(),e}}function Je(e){if(e.replayUrl.length===0)throw Error("logfire session replay: `replayUrl` is required");let t=new URL(e.replayUrl,`https://logfire.invalid/`);if(t.search!==``||t.hash!==``)throw Error("logfire session replay: `replayUrl` must not contain a query or fragment");let n=e.fetchImpl??(typeof fetch==`function`?fetch.bind(globalThis):void 0);if(n===void 0)throw Error("logfire session replay: no `fetch` available; pass `fetchImpl`");return{replayUrl:e.replayUrl,headers:e.headers,token:e.token,getSessionId:e.getSessionId,getSessionAttributes:e.getSessionAttributes,sessionSampleRate:e.sessionSampleRate??l.sessionSampleRate,onErrorSampleRate:e.onErrorSampleRate??l.onErrorSampleRate,maskAllText:e.maskAllText??l.maskAllText,maskAllInputs:e.maskAllInputs??l.maskAllInputs,maskTextSelector:e.maskTextSelector??l.maskTextSelector,blockSelector:e.blockSelector??l.blockSelector,flushIntervalMs:e.flushIntervalMs??l.flushIntervalMs,maxBufferBytes:e.maxBufferBytes??l.maxBufferBytes,minSessionDurationMs:e.minSessionDurationMs??l.minSessionDurationMs,sessionIdleTimeoutMs:e.sessionIdleTimeoutMs??l.sessionIdleTimeoutMs,maxSessionDurationMs:e.maxSessionDurationMs??l.maxSessionDurationMs,distinctId:e.distinctId??l.distinctId,getDistinctId:e.getDistinctId,getUser:e.getUser,captureConsole:e.captureConsole??l.captureConsole,captureNetwork:e.captureNetwork??l.captureNetwork,captureNavigation:e.captureNavigation??l.captureNavigation,captureGlobalErrors:e.captureGlobalErrors??l.captureGlobalErrors,ignoreUrlPatterns:e.ignoreUrlPatterns??[],redactUrlPatterns:e.redactUrlPatterns??[...l.redactUrlPatterns],onError:e.onError,fetchImpl:n,now:e.now??Date.now,random:e.random??Math.random}}function Ye(e,t,n){let r=Xe(n,t);if(r!==void 0)return r;let i=Be({sessionSampleRate:e.sessionSampleRate,onErrorSampleRate:e.onErrorSampleRate,random:e.random});return Ze(n,t,i),i}function Xe(e,t){if(e!==null)try{let n=e.getItem(Ge);if(n===null)return;let r=JSON.parse(n);if(typeof r!=`object`||!r)return;let i=r;return i.id!==t||!Qe(i.mode)?void 0:i.mode}catch{return}}function Ze(e,t,n){if(e!==null)try{e.setItem(Ge,JSON.stringify({id:t,mode:n}))}catch{}}function Qe(e){return e===`full`||e===`buffer`||e===`off`}function $e(e){return rt(et(e,`message`)??e)}function J(e){let t=et(e,`stack`);return typeof t==`string`?t:void 0}function et(e,t){try{return typeof e==`object`&&e&&t in e?e[t]:void 0}catch{return}}function Y(e,t){e.catch(e=>{Z(t,e)})}async function X(e,t){try{await e}catch(e){Z(t,e)}}function Z(e,t){try{let n=e?.(t);tt(n)&&Promise.resolve(n).catch(()=>void 0)}catch{}}function tt(e){return typeof e==`object`&&!!e&&`then`in e&&typeof e.then==`function`}function nt(){let e=globalThis;if(e[q]!==void 0)throw Error(`logfire session replay: a replay controller is already active in this page`);let t={};Object.defineProperty(e,q,{configurable:!0,enumerable:!1,value:t,writable:!0});let n=!1;return()=>{n||(n=!0,e[q]===t&&Reflect.deleteProperty(e,q))}}function Q(e){for(let t=e.length-1;t>=0;--t)try{e[t]?.()}catch{}e.length=0}function $(e,t,n){return{message:e,...t===void 0||t.length===0?{}:{source:t},...n===void 0?{}:{stack:n}}}function rt(e){if(e==null)return`unhandledrejection`;if(typeof e==`string`)return e;if(typeof e==`number`||typeof e==`boolean`||typeof e==`bigint`||typeof e==`symbol`)return String(e);try{return Object.prototype.toString.call(e)}catch{return`[object Object]`}}export{c as CHUNK_ENVELOPE_VERSION,s as CustomTag,i as EventType,a as IncrementalSource,o as MouseInteractions,R as ReplayUploadError,Ke as startSessionReplay};
|
package/dist/integration.d.cts
CHANGED
|
@@ -1,16 +1,14 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
1
|
+
import { C as SessionReplayConfig, r as startSessionReplay } from "./index-BxzwrVOz.js";
|
|
3
2
|
//#region src/integration.d.ts
|
|
4
|
-
type SessionReplayIntegrationOptions = Omit<SessionReplayConfig, "getSessionAttributes" | "getSessionId" | "getUser" | "headers" | "maxSessionDurationMs" | "now" | "random" | "replayUrl" | "sessionIdleTimeoutMs" | "token">;
|
|
5
|
-
interface SessionReplayIntegration extends SessionReplayIntegrationOptions {
|
|
3
|
+
export type SessionReplayIntegrationOptions = Omit<SessionReplayConfig, "getSessionAttributes" | "getSessionId" | "getUser" | "headers" | "maxSessionDurationMs" | "now" | "random" | "replayUrl" | "sessionIdleTimeoutMs" | "token">;
|
|
4
|
+
export interface SessionReplayIntegration extends SessionReplayIntegrationOptions {
|
|
6
5
|
load: () => Promise<{
|
|
7
6
|
startSessionReplay: typeof startSessionReplay;
|
|
8
7
|
}>;
|
|
9
8
|
}
|
|
10
9
|
/**
|
|
11
|
-
* Configure the optional browser SDK integration without eagerly bundling the
|
|
12
|
-
* session replay recorder.
|
|
13
|
-
*/
|
|
14
|
-
declare function sessionReplayIntegration(options?: SessionReplayIntegrationOptions): SessionReplayIntegration;
|
|
15
|
-
//#endregion
|
|
16
|
-
export { SessionReplayIntegration, SessionReplayIntegrationOptions, sessionReplayIntegration };
|
|
10
|
+
* Configure the optional browser SDK integration without eagerly bundling the
|
|
11
|
+
* session replay recorder.
|
|
12
|
+
*/
|
|
13
|
+
export declare function sessionReplayIntegration(options?: SessionReplayIntegrationOptions): SessionReplayIntegration;
|
|
14
|
+
//#endregion
|
package/dist/integration.d.ts
CHANGED
|
@@ -1,16 +1,14 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
1
|
+
import { C as SessionReplayConfig, r as startSessionReplay } from "./index-BxzwrVOz.js";
|
|
3
2
|
//#region src/integration.d.ts
|
|
4
|
-
type SessionReplayIntegrationOptions = Omit<SessionReplayConfig, "getSessionAttributes" | "getSessionId" | "getUser" | "headers" | "maxSessionDurationMs" | "now" | "random" | "replayUrl" | "sessionIdleTimeoutMs" | "token">;
|
|
5
|
-
interface SessionReplayIntegration extends SessionReplayIntegrationOptions {
|
|
3
|
+
export type SessionReplayIntegrationOptions = Omit<SessionReplayConfig, "getSessionAttributes" | "getSessionId" | "getUser" | "headers" | "maxSessionDurationMs" | "now" | "random" | "replayUrl" | "sessionIdleTimeoutMs" | "token">;
|
|
4
|
+
export interface SessionReplayIntegration extends SessionReplayIntegrationOptions {
|
|
6
5
|
load: () => Promise<{
|
|
7
6
|
startSessionReplay: typeof startSessionReplay;
|
|
8
7
|
}>;
|
|
9
8
|
}
|
|
10
9
|
/**
|
|
11
|
-
* Configure the optional browser SDK integration without eagerly bundling the
|
|
12
|
-
* session replay recorder.
|
|
13
|
-
*/
|
|
14
|
-
declare function sessionReplayIntegration(options?: SessionReplayIntegrationOptions): SessionReplayIntegration;
|
|
15
|
-
//#endregion
|
|
16
|
-
export { SessionReplayIntegration, SessionReplayIntegrationOptions, sessionReplayIntegration };
|
|
10
|
+
* Configure the optional browser SDK integration without eagerly bundling the
|
|
11
|
+
* session replay recorder.
|
|
12
|
+
*/
|
|
13
|
+
export declare function sessionReplayIntegration(options?: SessionReplayIntegrationOptions): SessionReplayIntegration;
|
|
14
|
+
//#endregion
|
package/package.json
CHANGED
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
"rum",
|
|
25
25
|
"rrweb"
|
|
26
26
|
],
|
|
27
|
-
"version": "0.
|
|
27
|
+
"version": "0.6.0",
|
|
28
28
|
"type": "module",
|
|
29
29
|
"main": "./dist/index.cjs",
|
|
30
30
|
"module": "./dist/index.js",
|
|
@@ -60,7 +60,7 @@
|
|
|
60
60
|
"@rrweb/replay": "2.1.1",
|
|
61
61
|
"@types/node": "^22.5.1",
|
|
62
62
|
"jsdom": "^29.1.1",
|
|
63
|
-
"vitest": "
|
|
63
|
+
"vitest": "5.0.1"
|
|
64
64
|
},
|
|
65
65
|
"files": [
|
|
66
66
|
"dist",
|