@sailfish-ai/recorder 1.10.13 → 1.11.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (100) hide show
  1. package/README.md +309 -7
  2. package/dist/babel-plugin-sailfish-source.cjs.br +0 -0
  3. package/dist/babel-plugin-sailfish-source.cjs.gz +0 -0
  4. package/dist/babel-plugin-sailfish-source.js.br +0 -0
  5. package/dist/babel-plugin-sailfish-source.js.gz +0 -0
  6. package/dist/chunkSerializer.js.br +0 -0
  7. package/dist/chunkSerializer.js.gz +0 -0
  8. package/dist/chunks/{chunkSerializer-Dk1eF3S8.js → chunkSerializer-BiemuRlf.js} +1 -1
  9. package/dist/chunks/chunkSerializer-BiemuRlf.js.br +0 -0
  10. package/dist/chunks/chunkSerializer-BiemuRlf.js.gz +0 -0
  11. package/dist/chunks/{chunkSerializer-CodMnuS3.js → chunkSerializer-CJQCxiLD.js} +1 -1
  12. package/dist/chunks/chunkSerializer-CJQCxiLD.js.br +0 -0
  13. package/dist/chunks/chunkSerializer-CJQCxiLD.js.gz +0 -0
  14. package/dist/chunks/{index-DW416eVj.js → index-Cfj4Epfd.js} +126 -96
  15. package/dist/chunks/index-Cfj4Epfd.js.br +0 -0
  16. package/dist/chunks/index-Cfj4Epfd.js.gz +0 -0
  17. package/dist/chunks/{index-DvLh2k6O.js → index-CuXHImrI.js} +126 -94
  18. package/dist/chunks/index-CuXHImrI.js.br +0 -0
  19. package/dist/chunks/index-CuXHImrI.js.gz +0 -0
  20. package/dist/constants.js.br +0 -0
  21. package/dist/constants.js.gz +0 -0
  22. package/dist/deviceInfo.js.br +0 -0
  23. package/dist/deviceInfo.js.gz +0 -0
  24. package/dist/env.js.br +0 -0
  25. package/dist/env.js.gz +0 -0
  26. package/dist/errorInterceptor.js.br +0 -0
  27. package/dist/errorInterceptor.js.gz +0 -0
  28. package/dist/eventStore.js.br +0 -0
  29. package/dist/eventStore.js.gz +0 -0
  30. package/dist/exponentialBackoff.js.br +0 -0
  31. package/dist/exponentialBackoff.js.gz +0 -0
  32. package/dist/fiberHook.js.br +0 -0
  33. package/dist/fiberHook.js.gz +0 -0
  34. package/dist/frameworkDetection.js.br +0 -0
  35. package/dist/frameworkDetection.js.gz +0 -0
  36. package/dist/graphql.js.br +0 -0
  37. package/dist/graphql.js.gz +0 -0
  38. package/dist/headlessDetection.js.br +0 -0
  39. package/dist/headlessDetection.js.gz +0 -0
  40. package/dist/inAppReportIssueModal/index.js +15 -14
  41. package/dist/inAppReportIssueModal/index.js.br +0 -0
  42. package/dist/inAppReportIssueModal/index.js.gz +0 -0
  43. package/dist/inAppReportIssueModal/integrations.js +56 -4
  44. package/dist/inAppReportIssueModal/integrations.js.br +0 -0
  45. package/dist/inAppReportIssueModal/integrations.js.gz +0 -0
  46. package/dist/inAppReportIssueModal/state.js.br +0 -0
  47. package/dist/inAppReportIssueModal/state.js.gz +0 -0
  48. package/dist/inAppReportIssueModal/ui.js.br +0 -0
  49. package/dist/inAppReportIssueModal/ui.js.gz +0 -0
  50. package/dist/index.js +98 -73
  51. package/dist/index.js.br +0 -0
  52. package/dist/index.js.gz +0 -0
  53. package/dist/notifyEventStore.js.br +0 -0
  54. package/dist/notifyEventStore.js.gz +0 -0
  55. package/dist/recorder.cjs +2 -2
  56. package/dist/recorder.cjs.br +0 -0
  57. package/dist/recorder.cjs.gz +0 -0
  58. package/dist/recorder.js +26 -25
  59. package/dist/recorder.js.br +0 -0
  60. package/dist/recorder.js.gz +0 -0
  61. package/dist/recorder.umd.cjs +8909 -0
  62. package/dist/recorder.umd.cjs.br +0 -0
  63. package/dist/recorder.umd.cjs.gz +0 -0
  64. package/dist/recording.js +2 -2
  65. package/dist/recording.js.br +0 -0
  66. package/dist/recording.js.gz +0 -0
  67. package/dist/segmentHelpers.js.br +0 -0
  68. package/dist/segmentHelpers.js.gz +0 -0
  69. package/dist/sendSailfishMessages.js +4 -0
  70. package/dist/sendSailfishMessages.js.br +0 -0
  71. package/dist/sendSailfishMessages.js.gz +0 -0
  72. package/dist/session.js.br +0 -0
  73. package/dist/session.js.gz +0 -0
  74. package/dist/snippet-auto-init.js +173 -0
  75. package/dist/snippet-auto-init.js.br +0 -0
  76. package/dist/snippet-auto-init.js.gz +0 -0
  77. package/dist/sourceLocation.js.br +0 -0
  78. package/dist/sourceLocation.js.gz +0 -0
  79. package/dist/types/inAppReportIssueModal/integrations.d.ts +7 -0
  80. package/dist/types/index.d.ts +5 -1
  81. package/dist/types/sendSailfishMessages.d.ts +4 -0
  82. package/dist/types/snippet-auto-init.d.ts +31 -0
  83. package/dist/types/types.d.ts +1 -0
  84. package/dist/types/umd-entry.d.ts +9 -0
  85. package/dist/umd-entry.js +11 -0
  86. package/dist/utils.js.br +0 -0
  87. package/dist/utils.js.gz +0 -0
  88. package/dist/uuid.js.br +0 -0
  89. package/dist/uuid.js.gz +0 -0
  90. package/dist/websocket.js.br +0 -0
  91. package/dist/websocket.js.gz +0 -0
  92. package/package.json +9 -5
  93. package/dist/chunks/chunkSerializer-CodMnuS3.js.br +0 -0
  94. package/dist/chunks/chunkSerializer-CodMnuS3.js.gz +0 -0
  95. package/dist/chunks/chunkSerializer-Dk1eF3S8.js.br +0 -0
  96. package/dist/chunks/chunkSerializer-Dk1eF3S8.js.gz +0 -0
  97. package/dist/chunks/index-DW416eVj.js.br +0 -0
  98. package/dist/chunks/index-DW416eVj.js.gz +0 -0
  99. package/dist/chunks/index-DvLh2k6O.js.br +0 -0
  100. package/dist/chunks/index-DvLh2k6O.js.gz +0 -0
package/README.md CHANGED
@@ -1,12 +1,314 @@
1
- # JS/TS Record-Only Package
1
+ # @sailfish-ai/recorder
2
2
 
3
- ## Sailfish AI's frontend recorder
3
+ Frontend session recorder for [Sailfish](https://app.sailfishqa.com). Captures the DOM, console, network activity, errors, and user interactions so replay is available in the dashboard alongside the backend traces Sailfish already collects.
4
4
 
5
- ## Trigger build - 31112025 1150PM GMT+4
5
+ Works in any browser JavaScript or TypeScript app — React, Vue, Angular, Next.js, Nuxt, Svelte, Shopify, plain HTML. Ships UMD, ESM, and CJS builds; can be installed via npm or loaded as a single `<script>` tag from a CDN.
6
6
 
7
- ## Trigger build - 06112025 0854PM GMT+4
7
+ - **Signup / dashboard:** https://app.sailfishqa.com
8
+ - **Source:** [github.com/SailfishAI/sailfish](https://github.com/SailfishAI/sailfish) (internal)
8
9
 
9
- ## Trigger build - 11182025 1125AM GMT+4
10
+ ## Installation
10
11
 
11
- ## Trigger build - 02122025 0330PM GMT+4
12
- ## Trigger build - 26122025 0330PM GMT+4
12
+ ```bash
13
+ npm install @sailfish-ai/recorder
14
+ # or
15
+ yarn add @sailfish-ai/recorder
16
+ # or
17
+ pnpm add @sailfish-ai/recorder
18
+ ```
19
+
20
+ ## Quick start
21
+
22
+ ### ES modules / bundler (Vite, Webpack, Rollup, Next.js, etc.)
23
+
24
+ ```ts
25
+ import { initRecorder } from "@sailfish-ai/recorder";
26
+
27
+ // SSR guard — don't touch browser storage during server render.
28
+ if (typeof window !== "undefined") {
29
+ initRecorder({ apiKey: "YOUR_API_KEY" });
30
+ }
31
+ ```
32
+
33
+ ### CDN (single `<script>` tag, auto-init)
34
+
35
+ The UMD build auto-initializes from `data-*` attributes on the script tag — zero JavaScript needed on your side:
36
+
37
+ ```html
38
+ <script
39
+ src="https://cdn.jsdelivr.net/npm/@sailfish-ai/recorder@1/dist/recorder.umd.cjs"
40
+ data-api-key="YOUR_API_KEY"
41
+ data-service-identifier="my-app"
42
+ data-service-version="1.0.0"
43
+ crossorigin="anonymous"
44
+ ></script>
45
+ ```
46
+
47
+ Drop that into the `<head>` of any HTML page (Shopify, Webflow, WordPress, static sites, server-rendered templates) and recording starts automatically. Errors inside the recorder are swallowed — Sailfish never breaks the host page.
48
+
49
+ ### CDN (manual init)
50
+
51
+ If you'd rather call `initRecorder` yourself — for example to pass runtime options — omit `data-api-key` and use the `SailfishRecorder` global:
52
+
53
+ ```html
54
+ <script
55
+ src="https://cdn.jsdelivr.net/npm/@sailfish-ai/recorder@1/dist/recorder.umd.cjs"
56
+ crossorigin="anonymous"
57
+ ></script>
58
+ <script>
59
+ window.SailfishRecorder.initRecorder({
60
+ apiKey: "YOUR_API_KEY",
61
+ serviceIdentifier: "my-app",
62
+ serviceVersion: "1.0.0",
63
+ });
64
+ </script>
65
+ ```
66
+
67
+ ## CDN delivery and bundle size
68
+
69
+ `@sailfish-ai/recorder` is published publicly on npm, so any major JavaScript CDN can serve it — jsDelivr, unpkg, esm.sh, esm.run, jspm. The UMD bundle is self-contained (no external dependencies to resolve) and exposes the `SailfishRecorder` global.
70
+
71
+ ### What the browser actually downloads
72
+
73
+ The UMD file on disk is ~473 KB, but browsers never see that number. CDNs do HTTP content-negotiated compression: the browser advertises `Accept-Encoding: gzip, br` automatically, and the CDN returns the file with a `Content-Encoding: br` (or `gzip`) header. The browser decompresses on arrival. **No configuration needed by the site author — just include the `<script>` tag.**
74
+
75
+ | Encoding (delivered) | Size on the wire | Browsers |
76
+ |---|---:|---|
77
+ | **Brotli** (`br`) | **~84 KB** | Chrome, Firefox, Safari, Edge (all current versions) |
78
+ | **Gzip** (`gzip`) | **~117 KB** | Older browsers, curl without `--compressed`, crawlers |
79
+ | Uncompressed | ~473 KB | Only if the client explicitly sends `Accept-Encoding: identity` |
80
+
81
+ jsDelivr and unpkg set `Vary: Accept-Encoding`, so each encoding is cached independently at the edge — the first user per encoding per region pays a small compression cost, every subsequent request is served straight from the cache.
82
+
83
+ ### CDN options
84
+
85
+ | CDN | URL pattern | Notes |
86
+ |---|---|---|
87
+ | **jsDelivr** (recommended) | `https://cdn.jsdelivr.net/npm/@sailfish-ai/recorder@1/dist/recorder.umd.cjs` | Fastest p50 in our load tests, brotli over HTTP/2, global anycast. Cache stays warm across versions. |
88
+ | **unpkg** | `https://unpkg.com/@sailfish-ai/recorder@1/dist/recorder.umd.cjs` | Cloudflare-backed, also fast. Good fallback. |
89
+ | **esm.run** / **jsDelivr `+esm`** | `https://esm.run/@sailfish-ai/recorder@1` | Single-file ESM for `<script type="module">`. Pre-bundled (~31 KB brotli over-wire). |
90
+ | **esm.sh** | `https://esm.sh/@sailfish-ai/recorder@1` | ESM with separate dependency module graph (multiple HTTP requests — slower first load). |
91
+
92
+ Version pinning:
93
+
94
+ - `@sailfish-ai/recorder@1` — track the latest `1.x` (recommended; gets bug fixes).
95
+ - `@sailfish-ai/recorder@1.10.11` — pin exactly (longest CDN cache TTL; use for absolute stability).
96
+
97
+ ### Which build format should I use?
98
+
99
+ | You're building… | Use | How |
100
+ |---|---|---|
101
+ | Plain HTML, Shopify, Webflow, WordPress, server-rendered template | **UMD via CDN** | `<script src="…/recorder.umd.cjs" data-api-key="…">` |
102
+ | React / Vue / Next.js / Svelte app with a bundler | **ESM via npm** | `import { initRecorder } from "@sailfish-ai/recorder"` |
103
+ | Modern browser app with native ESM (no bundler) | **ESM via CDN** | `<script type="module">import { initRecorder } from "https://esm.run/@sailfish-ai/recorder@1"` |
104
+ | Node.js CommonJS (unusual — this is a browser package) | **CJS via npm** | `const { initRecorder } = require("@sailfish-ai/recorder")` |
105
+
106
+ ## API
107
+
108
+ All functions are top-level exports of `@sailfish-ai/recorder`. On the CDN build they're also available as `window.SailfishRecorder.*`.
109
+
110
+ ### `initRecorder(options)`
111
+
112
+ Initialize the recorder. Returns `Promise<void>`. Safe to call once per page load; concurrent calls are coalesced.
113
+
114
+ ```ts
115
+ await initRecorder({
116
+ apiKey: "YOUR_API_KEY", // required
117
+ serviceIdentifier: "my-app", // optional — your app name in the dashboard
118
+ serviceVersion: "1.0.0", // optional — your app version for filtering sessions
119
+ });
120
+ ```
121
+
122
+ #### Options
123
+
124
+ | Field | Type | Default | Purpose |
125
+ |---|---|---|---|
126
+ | `apiKey` | `string` | **required** | Your Sailfish API key (from the dashboard). |
127
+ | `backendApi` | `string` | `https://api-service.sailfishqa.com` | Backend endpoint. Override for self-hosted Sailfish deployments. |
128
+ | `serviceIdentifier` | `string` | — | Application name shown in the dashboard. |
129
+ | `serviceVersion` | `string` | — | Application version, used for session filtering. |
130
+ | `gitSha` | `string` | auto-detected | Build commit SHA for session filtering. |
131
+ | `serviceAdditionalMetadata` | `Record<string, any>` | — | Arbitrary metadata attached to every session. |
132
+ | `domainsToPropagateHeaderTo` | `string[]` | `[]` | Domains (wildcards allowed) that receive the `X-Sf3-Rid` tracing header, letting Sailfish join frontend sessions with backend traces. |
133
+ | `domainsToNotPropagateHeaderTo` | `string[]` | `[]` | Domains to exclude, appended to the built-in denylist. |
134
+ | `enableFiberTracking` | `boolean` | `false` | Adds `data-sf-source="file.tsx:42"` attributes to DOM nodes for source-mapped coverage (React only). Pairs with the Babel plugin. |
135
+ | `enableIpTracking` | `boolean` | `false` | Fetches the visitor IP asynchronously for session metadata. |
136
+ | `captureStreamingResponseBody` | `boolean` | `true` | Capture prefixes of streaming (SSE, ndjson, chunked) responses. |
137
+ | `captureResponseBodyMaxMb` | `number` | `10` | Max non-streaming response body to capture, in MB. `0` disables body capture. |
138
+ | `captureStreamPrefixKb` | `number` | `64` | Max streaming-body prefix to capture, in KB. |
139
+ | `captureStreamTimeoutMs` | `number` | `10000` | Timeout for reading streaming bodies, in ms. |
140
+ | `deferRecording` | `boolean` | `true` | Defers the initial DOM snapshot until after first paint / idle. |
141
+ | `chunkSnapshot` | `boolean` | `false` | Yield to the browser every 500 nodes during the initial snapshot (smoother on very large pages). |
142
+ | `useWsWorker` | `boolean` | `true` | Run the WebSocket sender in a Web Worker. Disable if your CSP blocks `worker-src blob:`. |
143
+ | `reportIssueShortcuts` | `ShortcutsConfig` | — | Custom keyboard shortcuts for the report-issue modal. |
144
+ | `showEngTicketFieldsInReportIssueModalDefault` | `boolean` | `false` | Pre-expand Jira / Linear fields in the in-app issue modal. |
145
+
146
+ ### `identify(userId, traits?, overwrite?)`
147
+
148
+ Tag the current session with a user identity. Subsequent calls with the same `userId` are deduplicated.
149
+
150
+ ```ts
151
+ identify("user_abc123", { email: "dana@example.com", plan: "pro" });
152
+ ```
153
+
154
+ ### `addOrUpdateMetadata(metadata)`
155
+
156
+ Attach arbitrary metadata to the current session. Values are merged with any previously-set metadata.
157
+
158
+ ```ts
159
+ addOrUpdateMetadata({ experiment: "pricing-v2", cohort: "B" });
160
+ ```
161
+
162
+ ### `getOrSetSessionId()`
163
+
164
+ Return the current session ID (generates one if none exists). Useful for correlating logs on your side with Sailfish recordings.
165
+
166
+ ```ts
167
+ const sessionId = getOrSetSessionId();
168
+ console.log("Sailfish session:", sessionId);
169
+ ```
170
+
171
+ ### `openReportIssueModal(options?)`
172
+
173
+ Open the in-app bug-report modal. If `showEngTicketFields: true` is passed (or set at init), Jira / Linear fields are shown by default.
174
+
175
+ ```ts
176
+ openReportIssueModal({ showEngTicketFields: true });
177
+ ```
178
+
179
+ ### `enableFunctionSpanTracking()` / `disableFunctionSpanTracking()` / `isFunctionSpanTrackingEnabled()`
180
+
181
+ Toggle per-session backend function-span tracing at runtime.
182
+
183
+ ```ts
184
+ if (isFunctionSpanTrackingEnabled()) disableFunctionSpanTracking();
185
+ enableFunctionSpanTracking();
186
+ ```
187
+
188
+ ## Framework examples
189
+
190
+ ### React / Vite
191
+
192
+ ```tsx
193
+ import { useEffect } from "react";
194
+ import { initRecorder } from "@sailfish-ai/recorder";
195
+
196
+ export function App() {
197
+ useEffect(() => {
198
+ initRecorder({ apiKey: import.meta.env.VITE_SAILFISH_KEY });
199
+ }, []);
200
+ return <Routes />;
201
+ }
202
+ ```
203
+
204
+ ### Next.js (App Router)
205
+
206
+ `'use client'` is required — `initRecorder` touches `localStorage` and must run in the browser.
207
+
208
+ ```tsx
209
+ "use client";
210
+ import { useEffect } from "react";
211
+ import { initRecorder } from "@sailfish-ai/recorder";
212
+
213
+ export function SailfishProvider({ children }: { children: React.ReactNode }) {
214
+ useEffect(() => {
215
+ initRecorder({ apiKey: process.env.NEXT_PUBLIC_SAILFISH_KEY! });
216
+ }, []);
217
+ return <>{children}</>;
218
+ }
219
+ ```
220
+
221
+ Place `<SailfishProvider>` in `app/layout.tsx`.
222
+
223
+ ### Plain HTML / Shopify / Webflow / WordPress
224
+
225
+ ```html
226
+ <script
227
+ src="https://cdn.jsdelivr.net/npm/@sailfish-ai/recorder@1/dist/recorder.umd.cjs"
228
+ data-api-key="YOUR_API_KEY"
229
+ crossorigin="anonymous"
230
+ ></script>
231
+ ```
232
+
233
+ ## Babel plugin — source-mapped coverage
234
+
235
+ `@sailfish-ai/recorder/babel-plugin` injects `data-sf-source="file.tsx:42"` attributes into your JSX at compile time so clicks and views in the Sailfish dashboard link back to the exact source line.
236
+
237
+ ### Vite + React
238
+
239
+ ```ts
240
+ // vite.config.ts
241
+ import { defineConfig } from "vite";
242
+ import react from "@vitejs/plugin-react";
243
+ import sailfishSourcePlugin from "@sailfish-ai/recorder/babel-plugin";
244
+
245
+ export default defineConfig({
246
+ plugins: [
247
+ react({ babel: { plugins: [sailfishSourcePlugin] } }),
248
+ ],
249
+ });
250
+ ```
251
+
252
+ ### Babel / CRA / Next.js
253
+
254
+ ```js
255
+ // babel.config.js
256
+ const sailfishSourcePlugin = require("@sailfish-ai/recorder/babel-plugin");
257
+ module.exports = {
258
+ plugins: [[sailfishSourcePlugin, { allElements: false }]],
259
+ };
260
+ ```
261
+
262
+ Pass `{ allElements: true }` to annotate every element (default annotates only interactive ones — buttons, inputs, links, form controls).
263
+
264
+ ## Configuration recipes
265
+
266
+ ```ts
267
+ // Self-hosted Sailfish backend
268
+ initRecorder({
269
+ apiKey: "YOUR_KEY",
270
+ backendApi: "https://sailfish.your-company.com",
271
+ });
272
+
273
+ // Join frontend sessions with backend traces across your API
274
+ initRecorder({
275
+ apiKey: "YOUR_KEY",
276
+ domainsToPropagateHeaderTo: ["api.mycompany.com", "*.mycompany.com"],
277
+ });
278
+
279
+ // Strict CSP (no blob: workers)
280
+ initRecorder({
281
+ apiKey: "YOUR_KEY",
282
+ useWsWorker: false,
283
+ });
284
+
285
+ // Capture more of streaming LLM response bodies
286
+ initRecorder({
287
+ apiKey: "YOUR_KEY",
288
+ captureStreamingResponseBody: true,
289
+ captureStreamPrefixKb: 256,
290
+ captureStreamTimeoutMs: 30_000,
291
+ });
292
+ ```
293
+
294
+ ## SSR / Next.js note
295
+
296
+ `initRecorder` touches `localStorage`, `sessionStorage`, and `window` — none of which exist during server-side rendering. Always guard with `typeof window !== "undefined"` or call from `useEffect` / `onMount` / client-only equivalents.
297
+
298
+ Without a guard, frameworks like Next.js (on Vercel) will fail at build/SSR with:
299
+
300
+ ```
301
+ ReferenceError: localStorage is not defined
302
+ ```
303
+
304
+ ## Troubleshooting
305
+
306
+ - **`window.SailfishRecorder` is undefined after the `<script>` loads.** You're probably using an ESM URL (`esm.run`, `esm.sh`) with a non-module `<script>`. Either use the UMD URL (`/dist/recorder.umd.cjs`) or add `type="module"` to the tag.
307
+ - **`Refused to create a worker from 'blob:...'` in the console.** Your Content-Security-Policy blocks blob workers. Either allow `worker-src blob:` or init with `useWsWorker: false`.
308
+ - **Recordings never reach the dashboard.** Verify the `apiKey` matches the project in the Sailfish dashboard, and that your ad-blocker isn't blocking `api-service.sailfishqa.com`. Open your browser devtools network tab and filter by `sailfish`.
309
+ - **SSR error: `localStorage is not defined`.** See the SSR note above — `initRecorder` must run in a browser-only code path.
310
+ - **Mixed-content warnings.** All Sailfish CDN and API URLs are HTTPS; make sure your page also serves over HTTPS.
311
+
312
+ ## License
313
+
314
+ Proprietary. See [sailfishqa.com/terms](https://sailfishqa.com) for terms of service.
Binary file
Binary file
@@ -1,4 +1,4 @@
1
- import { y as e } from "./index-DvLh2k6O.js";
1
+ import { y as e } from "./index-CuXHImrI.js";
2
2
  async function chunkedSnapshot(t, n, o = {}) {
3
3
  const s = o.chunkSize ?? 500, r = o.maxChunkMs ?? 16, { blockClass: c, blockSelector: a, maskTextClass: i, maskTextSelector: d } = o;
4
4
  let u = 100001, l = 0, N = performance.now();
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const e = require("./index-DW416eVj.js");
3
+ const e = require("./index-Cfj4Epfd.js");
4
4
  exports.chunkedSnapshot = async function chunkedSnapshot(t, n, o = {}) {
5
5
  const s = o.chunkSize ?? 500, r = o.maxChunkMs ?? 16, { blockClass: c, blockSelector: a, maskTextClass: i, maskTextSelector: d } = o;
6
6
  let u = 100001, l = 0, N = performance.now();