@pydantic/logfire-session-replay 0.1.0-alpha.0 → 0.1.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 CHANGED
@@ -34,9 +34,10 @@ const replay = startSessionReplay({
34
34
  sessionSampleRate: 0.1,
35
35
  onErrorSampleRate: 1,
36
36
 
37
+ // These are the privacy-safe defaults; they are shown for emphasis.
38
+ maskAllText: true,
37
39
  maskAllInputs: true,
38
40
  blockSelector: '[data-logfire-block]',
39
- maskTextSelector: '[data-logfire-mask]',
40
41
 
41
42
  distinctId: currentUser?.id,
42
43
  getTraceContext: () => getCurrentTraceContext(),
@@ -46,6 +47,39 @@ await replay.flush()
46
47
  await replay.stop()
47
48
  ```
48
49
 
50
+ ### OpenTelemetry fetch and XHR instrumentation
51
+
52
+ When standalone replay runs alongside OpenTelemetry browser HTTP
53
+ instrumentation, configure ignores in both directions. Replay's
54
+ `ignoreUrlPatterns` must include the trace, metric, and replay upload endpoints
55
+ so those requests are not recorded as replay events. OpenTelemetry fetch and
56
+ XHR `ignoreUrls` must include the replay upload URL so replay uploads do not
57
+ create HTTP spans.
58
+
59
+ ```ts
60
+ const telemetryUrls = [/\/client-traces(?:[?#]|$)/, /\/client-metrics(?:[?#]|$)/]
61
+ const replayUploads = [/\/client-replay\/[^/?#]+(?:\?|$)/]
62
+
63
+ getWebAutoInstrumentations({
64
+ '@opentelemetry/instrumentation-fetch': {
65
+ ignoreUrls: replayUploads,
66
+ },
67
+ '@opentelemetry/instrumentation-xml-http-request': {
68
+ ignoreUrls: replayUploads,
69
+ },
70
+ })
71
+
72
+ startSessionReplay({
73
+ replayUrl: '/client-replay',
74
+ ignoreUrlPatterns: [...telemetryUrls, ...replayUploads],
75
+ })
76
+ ```
77
+
78
+ The replay fetch wrapper preserves OpenTelemetry's `fetch.__original` exporter
79
+ escape hatch when OpenTelemetry is installed first. That protects direct
80
+ exporter bypass, but it cannot infer your independently configured endpoints;
81
+ the bidirectional ignore lists are still required in either startup order.
82
+
49
83
  Your proxy should forward the compressed request body and these headers to
50
84
  Logfire replay ingest:
51
85
 
@@ -89,26 +123,78 @@ startSessionReplay({
89
123
  Normal browser applications should not expose project write tokens in bundles.
90
124
  Use `replayUrl + headers` with a backend proxy when possible.
91
125
 
92
- ## Privacy
126
+ ## Lifecycle Delivery
127
+
128
+ Full-mode replay requests best-effort keepalive uploads when the page becomes
129
+ hidden or receives `pagehide`. Lifecycle chunks start independently of an
130
+ ordinary upload that is still in flight. The transport admits the earliest
131
+ contiguous prefix whose compressed bodies fit its 48,000-byte aggregate budget
132
+ across its own unfinished keepalive requests. Remaining lifecycle chunks are
133
+ attempted once as normal requests.
93
134
 
94
- The recorder masks input values by default, disables canvas recording, disables
95
- font collection, throttles media sampling, and never captures request or response
96
- bodies. Replay can still capture DOM text, full URLs, console output, fetch/XHR
97
- metadata, and navigation events depending on configuration.
135
+ That budget is deliberately below the browser limit, but the browser quota is
136
+ shared with other unfinished keepalive requests on the page. It cannot guarantee
137
+ delivery after page freeze or termination. One individually oversized replay
138
+ event also cannot be split safely.
139
+
140
+ `headers` and functional `token` values are resolved during each upload. An
141
+ asynchronous credential callback can therefore delay the final request beyond
142
+ the browser's page-freeze boundary. Prefer synchronously available proxy
143
+ credentials, and call `flush()` before a controlled navigation when delivery is
144
+ critical.
145
+
146
+ Ordinary uploads use asynchronous gzip when available. If a restrictive Content
147
+ Security Policy blocks fflate's worker compressor, replay retries the same batch
148
+ with synchronous gzip and remembers the fallback for that replay controller.
149
+ This preserves the batch, but compression may briefly use the main thread.
150
+
151
+ ## Privacy
98
152
 
99
- Use `blockSelector` to omit entire DOM subtrees, `maskTextSelector` to mask text
100
- content before events are recorded, `redactUrlPatterns` to strip query strings
101
- and fragments from matching network URLs, and `captureConsole`,
102
- `captureNetwork`, or `captureNavigation` to disable capture classes that are not
103
- appropriate for your application.
153
+ The recorder masks all rendered text and input values by default
154
+ (`maskAllText: true`, `maskAllInputs: true`). It also disables canvas recording
155
+ and font collection, throttles media sampling, never captures request or
156
+ response bodies, and leaves console capture off (`captureConsole: false`).
157
+ Network and navigation capture remain on, but query strings and fragments are
158
+ removed from rrweb page metadata and captured network/navigation URLs by the
159
+ default `redactUrlPatterns` value. Replay envelope `meta.urls` contains those
160
+ same sanitized captured URLs.
161
+
162
+ Use `blockSelector` to omit entire DOM subtrees. Set `maskAllText: false` only
163
+ when visible text recording is acceptable; `maskTextSelector` can then retain
164
+ selective text masking. Set `captureConsole: true` only after auditing console
165
+ arguments. An explicit `redactUrlPatterns: []` restores raw captured page,
166
+ network, and navigation URLs. `captureNetwork` and `captureNavigation` can
167
+ disable those capture classes completely.
168
+
169
+ Text masking does not scrub DOM attributes, CSS content, resource URLs, or
170
+ arbitrary custom-event payloads. Avoid placing secrets there, block affected
171
+ subtrees, and sanitize custom events before recording them.
104
172
 
105
173
  ## Sampling
106
174
 
107
175
  The recorder uses a Sentry-style two-rate model:
108
176
 
109
- - `sessionSampleRate`: records the full session continuously
177
+ - `sessionSampleRate`: records the current browser session continuously
110
178
  - `onErrorSampleRate`: for sessions not selected by `sessionSampleRate`, keeps
111
- an in-memory replay buffer and uploads it only if an error occurs
179
+ an in-memory replay buffer and promotes it only for an uncaught `window.error`
180
+ or `unhandledrejection`
181
+
182
+ Buffer mode is bounded by `maxBufferBytes`, measured as the UTF-8 byte sum of
183
+ event JSON before envelope metadata and compression. It keeps the latest full
184
+ snapshot and the earliest contiguous incremental events that fit; later
185
+ incrementals are dropped until rrweb emits another full snapshot. Incrementals
186
+ before an anchor or larger than the cap are dropped. If one full snapshot is
187
+ larger than the cap, that snapshot is retained alone so promoted replay remains
188
+ playable.
189
+
190
+ Sampling is resolved and persisted independently for each session id. When the
191
+ session id rotates, the returned handle updates its `mode` and `recording`
192
+ properties. A sampled-off session keeps only a lightweight session-id monitor;
193
+ it does not start rrweb or patch console, network, or navigation globals, and a
194
+ later sampled session can begin recording without reloading the page.
195
+
196
+ Caught exceptions, `console.error`, and errors reported through another API do
197
+ not automatically promote the replay buffer.
112
198
 
113
199
  `stop()` is awaitable and flushes the final chunk before resolving.
114
200
 
package/dist/index.cjs CHANGED
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let e=require("rrweb"),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},i={MouseUp:0,MouseDown:1,Click:2,ContextMenu:3,DblClick:4},a={Error:`logfire.error`,Trace:`logfire.trace`,Console:`logfire.console`,Network:`logfire.network`,Navigation:`logfire.navigation`},o={sessionSampleRate:1,onErrorSampleRate:1,maskAllInputs:!0,maskTextSelector:``,blockSelector:``,flushIntervalMs:5e3,maxBufferBytes:1e6,sessionIdleTimeoutMs:18e5,maxSessionDurationMs:144e5,distinctId:``,captureConsole:!0,captureNetwork:!0,captureNavigation:!0},s=[`log`,`info`,`warn`,`error`,`debug`],c=1024,l=()=>void 0;function u(e,t={}){let n=new Map,r=!1;for(let r of s){let i=console[r];if(typeof i!=`function`)continue;let o=i;n.set(r,o),console[r]=(...n)=>{_(e,a.Console,{level:r,args:n.slice(0,10).map(v)},t.onError),o.apply(console,n)}}return()=>{if(!r){r=!0;for(let[e,t]of n)console[e]=t}}}function d(e,t){let n=h(t),r=p(e,n),i=m(e,n),a=!1;return()=>{a||(a=!0,r(),i())}}function f(e,t={}){let n=history.pushState,r=history.replaceState,i=!1,o=n=>{_(e,a.Navigation,{url:window.location.href,kind:n},t.onError)};history.pushState=function(...e){n.apply(this,e),o(`push`)},history.replaceState=function(...e){r.apply(this,e),o(`replace`)};let s=()=>{o(`pop`)};return window.addEventListener(`popstate`,s),()=>{i||(i=!0,history.pushState=n,history.replaceState=r,window.removeEventListener(`popstate`,s))}}function p(e,t){let n=window.fetch;if(typeof n!=`function`)return l;let r=!1;return window.fetch=async(r,i)=>{let o=t.now(),s=b(r,i),c=x(r);if(D(c,t.ignoreUrlPatterns))return n(r,i);let l=E(c,t.redactUrlPatterns),u=T(i?.body);try{let c=await n(r,i);return _(e,a.Network,w({method:s,url:l,status:c.status,durationMs:Math.max(0,t.now()-o),reqBytes:u,resBytes:S(c.headers)}),t.onError),c}catch(n){throw _(e,a.Network,w({method:s,url:l,status:0,durationMs:Math.max(0,t.now()-o),failed:!0,reqBytes:u}),t.onError),n}},()=>{r||(r=!0,window.fetch=n)}}function m(e,t){let n=window.XMLHttpRequest.prototype,r=n.open,i=n.send,o=new WeakMap,s=!1;return n.open=function(e,n,i,a,s){let c=n.toString();if(D(c,t.ignoreUrlPatterns)){o.delete(this),r.call(this,e,n,i??!0,a??null,s??null);return}o.set(this,{method:e.toUpperCase(),url:E(c,t.redactUrlPatterns),startedAt:0,reqBytes:0,failed:!1,emitted:!1}),r.call(this,e,n,i??!0,a??null,s??null)},n.send=function(n){let r=o.get(this);if(r===void 0){i.call(this,n);return}r.startedAt=t.now(),r.reqBytes=T(n);let s=()=>{r.failed=!0},c=()=>{r.emitted||(r.emitted=!0,this.removeEventListener(`error`,s),this.removeEventListener(`abort`,s),this.removeEventListener(`timeout`,s),_(e,a.Network,w({method:r.method,url:r.url,status:this.status,durationMs:Math.max(0,t.now()-r.startedAt),failed:r.failed||this.status===0,reqBytes:r.reqBytes,resBytes:C(this)}),t.onError))};this.addEventListener(`error`,s),this.addEventListener(`abort`,s),this.addEventListener(`timeout`,s),this.addEventListener(`loadend`,c,{once:!0});try{i.call(this,n)}catch(n){throw this.removeEventListener(`error`,s),this.removeEventListener(`abort`,s),this.removeEventListener(`timeout`,s),this.removeEventListener(`loadend`,c),_(e,a.Network,w({method:r.method,url:r.url,status:0,durationMs:Math.max(0,t.now()-r.startedAt),failed:!0,reqBytes:r.reqBytes}),t.onError),n}},()=>{s||(s=!0,n.open=r,n.send=i)}}function h(e){return{...e,ignoreUrlPatterns:g(e.ignoreUrlPatterns),redactUrlPatterns:g(e.redactUrlPatterns)}}function g(e){return e.map(e=>{let t=e.flags.replace(/[gy]/gu,``);return t===e.flags?e:new RegExp(e.source,t)})}function _(e,t,n,r){try{e(t,n)}catch(e){try{r?.(e)}catch{}}}function v(e){if(e==null)return String(e);if(typeof e==`string`)return y(e);if(typeof e==`number`||typeof e==`boolean`||typeof e==`bigint`)return String(e);if(e instanceof Error)return y(e.stack??`${e.name}: ${e.message}`);try{return y(JSON.stringify(e))}catch{return Object.prototype.toString.call(e)}}function y(e){return e.length<=c?e:`${e.slice(0,c)}...(+${String(e.length-c)} chars)`}function b(e,t){return(t?.method??(typeof e==`object`&&`method`in e?e.method:`GET`)).toUpperCase()}function x(e){return typeof e==`string`||e instanceof URL?e.toString():e.url}function S(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 C(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 w(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 T(e){if(e==null)return 0;if(typeof e==`string`)return e.length;if(e instanceof ArrayBuffer||ArrayBuffer.isView(e))return e.byteLength;if(e instanceof Blob)return e.size}function E(e,t){if(t.length===0||!t.some(t=>t.test(e)))return e;try{let t=new URL(e,window.location.href);return`${t.origin}${t.pathname}`}catch{let[t=e]=e.split(`?`),[n=t]=t.split(`#`);return n}}function D(e,t){return t.some(t=>t.test(e))}const O=e.record;function ee(e){let t={emit:t=>{e.emit(t)},maskAllInputs:e.maskAllInputs,recordCanvas:!1,collectFonts:!1,sampling:{mousemove:!0,mouseInteraction:!0,scroll:150,media:800,input:`last`}};e.maskTextSelector!==void 0&&e.maskTextSelector.length>0&&(t.maskTextSelector=e.maskTextSelector),e.blockSelector!==void 0&&e.blockSelector.length>0&&(t.blockSelector=e.blockSelector),e.checkoutEveryNms!==void 0&&e.checkoutEveryNms>0&&(t.checkoutEveryNms=e.checkoutEveryNms);let n=O(t);return{stop:()=>{n?.()},addCustomEvent:(e,t)=>{O.addCustomEvent?.(e,t)},takeFullSnapshot:()=>{O.takeFullSnapshot?.(!0)}}}function k(e){return Number.isFinite(e)?Math.min(1,Math.max(0,e)):0}function A(e){let t=e.random??Math.random;return t()<k(e.sessionSampleRate)?`full`:t()<k(e.onErrorSampleRate)?`buffer`:`off`}function j(e=Date.now){let t=e(),n=new Uint8Array(new ArrayBuffer(16));te(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 te(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 M=`lf_session_replay`;var N=class{idleTimeoutMs;maxDurationMs;now;storage;memorySession;constructor(e){this.idleTimeoutMs=e.idleTimeoutMs,this.maxDurationMs=e.maxDurationMs,this.now=e.now??Date.now,this.storage=e.storage===void 0?P():e.storage}getSession(){let e=this.now(),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.write(t),t}reset(){return this.createSession(this.now())}isExpired(e,t){return t-e.lastActivityAt>this.idleTimeoutMs||t-e.startedAt>this.maxDurationMs}createSession(e){let t={id:j(this.now),startedAt:e,lastActivityAt:e};return this.write(t),t}read(){if(this.storage!==null)try{let e=this.storage.getItem(M);if(e!==null){let t=JSON.parse(e);if(F(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(M,JSON.stringify(e))}catch{}}};function P(){try{return globalThis.sessionStorage??null}catch{return null}}function F(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 I(e){return typeof e==`object`&&e?e:void 0}function L(e){return typeof e==`string`&&e.length>0?e:void 0}function ne(e,t,o){let s=1/0,c=0,l=0,u=0,d=0,f=!1,p=new Set,m=new Set;for(let e of t){e.timestamp<s&&(s=e.timestamp),e.timestamp>c&&(c=e.timestamp);let t=I(e.data);if(e.type===n.FullSnapshot)f=!0;else if(e.type===n.Meta){let e=L(t?.href);e!==void 0&&p.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)&&l++}else e===r.Input&&u++}else if(e.type===n.Custom&&t!==void 0){let e=L(t.tag),n=I(t.payload);if(e===a.Error)d++;else if(e===a.Trace){let e=L(n?.traceId);e!==void 0&&m.add(e)}else if(e===a.Console)n?.level===`error`&&d++;else if(e===a.Navigation){let e=L(n?.url);e!==void 0&&p.add(e)}}}return{seq:e,firstTimestamp:s===1/0?0:s,lastTimestamp:c,eventCount:t.length,clickCount:l,keypressCount:u,errorCount:d,hasFullSnapshot:f,urls:[...p],traceIds:[...m],...o!==void 0&&o.length>0?{distinctId:o}:{}}}const R=`lf_session_replay_seq`;var re=class{buffer=[];pendingBytes=0;seq=0;timer;mode;flushing;config;storage;sessionId;constructor(e,t,n,r=P()){this.config=e,this.sessionId=t,this.mode=n,this.storage=r,this.seq=this.loadSeq(t)}start(){this.timer!==void 0||this.mode!==`full`||(this.timer=setInterval(()=>{this.flushAndReport()},this.config.flushIntervalMs))}add(e){this.mode===`buffer`&&e.type===n.FullSnapshot&&(this.buffer=[],this.pendingBytes=0),this.buffer.push(e),this.pendingBytes+=H(e),this.mode===`full`&&this.pendingBytes>=this.config.maxBufferBytes&&this.flushAndReport()}async triggerFlush(){return this.mode===`buffer`&&(this.mode=`full`,this.start()),this.flush()}async flush(e={}){if(this.mode===`buffer`||this.buffer.length===0)return;let t=this.buffer;this.buffer=[],this.pendingBytes=0;let n=e.keepalive===!0?U(t):[t],r=this.seq;this.seq+=n.length;let i=this.sessionId;this.saveSeq(i,this.seq);let a=(this.flushing??Promise.resolve()).then(async()=>{for(let t=0;t<n.length;t++){let a=n[t];a!==void 0&&await this.deliver(a,r+t,i,e.keepalive??!1)}});this.flushing=a.catch(()=>void 0),await a}rotate(e){return e===this.sessionId?!1:(this.mode===`buffer`?(this.buffer=[],this.pendingBytes=0):this.flushAndReport(),this.sessionId=e,this.seq=this.loadSeq(e),!0)}async shutdown(e={}){this.timer!==void 0&&(clearInterval(this.timer),this.timer=void 0),await this.flush(e),await this.flushing}getMode(){return this.mode}flushAndReport(){this.flush().catch(e=>{this.config.onError?.(e)})}async deliver(e,n,r,i){let a={version:1,meta:ne(n,e,this.config.getDistinctId?.()??this.config.distinctId),events:e};try{let e=JSON.stringify(a),o=i?(0,t.gzipSync)((0,t.strToU8)(e)):await W(e),s=i&&o.byteLength<=6e4;await this.sendWithRetry(r,n,o,s)}catch(e){this.config.onError?.(e)}}async sendWithRetry(e,t,n,r){let i=r?1:3;for(let a=1;a<=i;a++)try{await this.send(e,t,n,r);return}catch(e){if(e instanceof z&&e.status<500||a>=i)throw e;await V(500*a)}}async send(e,t,n,r){let i=`${this.config.replayUrl.replace(/\/+$/u,``)}/${encodeURIComponent(e)}?seq=${String(t)}`,a=await this.getUploadHeaders(),o=await this.config.fetchImpl(i,{method:`POST`,headers:a,body:n.slice(),keepalive:r});if(!o.ok)throw new z(o.status)}async getUploadHeaders(){let e=this.config.headers===void 0?{}:await this.config.headers(),t=await B(this.config.token);return{...e,...t===void 0||t.length===0?{}:{Authorization:`Bearer ${t}`},"Content-Type":`application/json`,"Content-Encoding":`gzip`}}loadSeq(e){if(this.storage===null)return 0;try{let t=this.storage.getItem(R);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(R,JSON.stringify({id:e,seq:t}))}catch{}}},z=class extends Error{status;constructor(e){super(`replay ingest failed: ${String(e)}`),this.status=e,this.name=`ReplayIngestError`}};async function B(e){return typeof e==`function`?e():e}async function V(e){return new Promise(t=>{setTimeout(t,e)})}function H(e){try{return JSON.stringify(e).length}catch{return 0}}function U(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 W(e){return new Promise((n,r)=>{(0,t.gzip)((0,t.strToU8)(e),{level:6},(e,t)=>{if(e!==null){r(e);return}n(t)})})}const G={mode:`off`,recording:!1,getSessionId:()=>``,flush:async()=>Promise.resolve(),stop:async()=>Promise.resolve()},K=`lf_session_replay_mode`;function q(e){if(typeof window>`u`||typeof document>`u`)return G;let t=J(e),n=new N({idleTimeoutMs:t.sessionIdleTimeoutMs,maxDurationMs:t.maxSessionDurationMs,now:t.now}),r=e=>{let r=t.getSessionId?.();return r!==void 0&&r.length>0?r:e?n.touch().id:n.getSession().id},i=r(!1),o=P(),s=Y(t,i,o);if(s===`off`)return G;let c=new re(t,i,s),l={},p=ee({emit:e=>{let t=r(!0);c.rotate(t)&&l.current?.takeFullSnapshot(),c.add(e)},maskAllInputs:t.maskAllInputs,maskTextSelector:t.maskTextSelector,blockSelector:t.blockSelector,checkoutEveryNms:s===`buffer`?12e4:0});l.current=p;let m,h=t.getTraceContext===void 0?void 0:setInterval(()=>{let e=t.getTraceContext?.(),n=e?.traceId;n!==void 0&&n.length>0&&n!==m&&(m=n,p.addCustomEvent(a.Trace,{traceId:n,spanId:e?.spanId}))},1e3),g=e=>{p.addCustomEvent(a.Error,e),c.getMode()===`buffer`&&(X(o,r(!1),`full`),Q(c.triggerFlush(),t.onError))},_=e=>{g($(e.message,e.filename,oe(e.error)))},v=e=>{let t=e.reason;g($(t?.message??String(e.reason??`unhandledrejection`),void 0,t?.stack))},y=()=>{document.visibilityState===`hidden`&&Q(c.flush({keepalive:!0}),t.onError)};window.addEventListener(`error`,_,!0),window.addEventListener(`unhandledrejection`,v,!0),document.addEventListener(`visibilitychange`,y),window.addEventListener(`pagehide`,y);let b=(e,t)=>{p.addCustomEvent(e,t)},x=t.captureConsole?u(b,{onError:t.onError}):Z,S=t.captureNetwork?d(b,{ignoreUrlPatterns:t.ignoreUrlPatterns,now:t.now,onError:t.onError,redactUrlPatterns:t.redactUrlPatterns}):Z,C=t.captureNavigation?f(b,{onError:t.onError}):Z;c.start();let w;return{get mode(){return c.getMode()},recording:!0,getSessionId:()=>r(!1),flush:async()=>c.flush(),stop:async()=>(w??=(async()=>{h!==void 0&&clearInterval(h),window.removeEventListener(`error`,_,!0),window.removeEventListener(`unhandledrejection`,v,!0),document.removeEventListener(`visibilitychange`,y),window.removeEventListener(`pagehide`,y),x(),S(),C(),p.stop(),await c.shutdown({keepalive:!1})})(),w)}}function J(e){if(e.replayUrl.length===0)throw Error("logfire session replay: `replayUrl` is required");let t=e.fetchImpl??(typeof fetch==`function`?fetch.bind(globalThis):void 0);if(t===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,sessionSampleRate:e.sessionSampleRate??o.sessionSampleRate,onErrorSampleRate:e.onErrorSampleRate??o.onErrorSampleRate,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,sessionIdleTimeoutMs:e.sessionIdleTimeoutMs??o.sessionIdleTimeoutMs,maxSessionDurationMs:e.maxSessionDurationMs??o.maxSessionDurationMs,distinctId:e.distinctId??o.distinctId,getDistinctId:e.getDistinctId,getTraceContext:e.getTraceContext,captureConsole:e.captureConsole??o.captureConsole,captureNetwork:e.captureNetwork??o.captureNetwork,captureNavigation:e.captureNavigation??o.captureNavigation,ignoreUrlPatterns:e.ignoreUrlPatterns??[],redactUrlPatterns:e.redactUrlPatterns??[],onError:e.onError,fetchImpl:t,now:e.now??Date.now,random:e.random??Math.random}}function Y(e,t,n){let r=ie(n,t);if(r!==void 0)return r;let i=A({sessionSampleRate:e.sessionSampleRate,onErrorSampleRate:e.onErrorSampleRate,random:e.random});return X(n,t,i),i}function ie(e,t){if(e!==null)try{let n=e.getItem(K);if(n===null)return;let r=JSON.parse(n);if(typeof r!=`object`||!r)return;let i=r;return i.id!==t||!ae(i.mode)?void 0:i.mode}catch{return}}function X(e,t,n){if(e!==null)try{e.setItem(K,JSON.stringify({id:t,mode:n}))}catch{}}function ae(e){return e===`full`||e===`buffer`||e===`off`}function oe(e){let t=typeof e==`object`&&e&&`stack`in e?e.stack:void 0;return typeof t==`string`?t:void 0}function Z(){}function Q(e,t){e.catch(e=>{t?.(e)})}function $(e,t,n){return{message:e,...t===void 0||t.length===0?{}:{source:t},...n===void 0?{}:{stack:n}}}exports.CHUNK_ENVELOPE_VERSION=1,exports.CustomTag=a,exports.EventType=n,exports.IncrementalSource=r,exports.MouseInteractions=i,exports.startSessionReplay=q;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let e=require("rrweb"),t=require("fflate");function n(e,t){return t.some(t=>new RegExp(t.source,t.flags).test(e))}function r(e,t,r){if(!n(e,t))return e;try{let t=new URL(e,r);return`${t.origin}${t.pathname}`}catch{let[t=e]=e.split(`?`),[n=t]=t.split(`#`);return n}}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},o={MouseUp:0,MouseDown:1,Click:2,ContextMenu:3,DblClick:4},s={Error:`logfire.error`,Trace:`logfire.trace`,Console:`logfire.console`,Network:`logfire.network`,Navigation:`logfire.navigation`},c={sessionSampleRate:1,onErrorSampleRate:1,maskAllText:!0,maskAllInputs:!0,maskTextSelector:``,blockSelector:``,flushIntervalMs:5e3,maxBufferBytes:1e6,sessionIdleTimeoutMs:18e5,maxSessionDurationMs:144e5,distinctId:``,captureConsole:!1,captureNetwork:!0,captureNavigation:!0,redactUrlPatterns:[/.+/u]},l=[`log`,`info`,`warn`,`error`,`debug`],u=1024,d=()=>void 0;function f(e,t={}){let n=[],r=b(t.onError);try{for(let t of l)typeof console[t]==`function`&&n.push(S(console,t,(n,i)=>function(...a){return i()&&y(e,s.Console,{level:t,args:a.slice(0,10).map(T)},r),n.apply(this,a)}));return C(n)}catch(e){throw w(n),e}}function p(e,t){let n=_(t),r={...n,onError:b(n.onError)},i=h(e,r);try{return C([i,g(e,r)])}catch(e){throw i(),e}}function m(e,t={redactUrlPatterns:[]}){let n=b(t.onError),i=i=>{let a=r(window.location.href,t.redactUrlPatterns??[],window.location.href);y(e,s.Navigation,{url:a,kind:i},n)},a=[];try{a.push(S(history,`pushState`,(e,t)=>function(...n){let r=e.apply(this,n);return t()&&i(`push`),r})),a.push(S(history,`replaceState`,(e,t)=>function(...n){let r=e.apply(this,n);return t()&&i(`replace`),r}));let e=!0,t=()=>{e&&i(`pop`)};return window.addEventListener(`popstate`,t),a.push(()=>{e=!1,window.removeEventListener(`popstate`,t)}),C(a)}catch(e){throw w(a),e}}function h(e,t){return typeof window.fetch==`function`?S(window,`fetch`,(n,i)=>{let a=async function(a,o){let c=n;if(!i())return c.call(this,a,o);let l=t.now(),u=ee(a,o),d=te(a);if(k(d,t.ignoreUrlPatterns))return c.call(this,a,o);let f=r(d,t.redactUrlPatterns,window.location.href),p=O(o?.body);try{let n=await c.call(this,a,o);return i()&&y(e,s.Network,D({method:u,url:f,status:n.status,durationMs:Math.max(0,t.now()-l),reqBytes:p,resBytes:ne(n.headers)}),t.onError),n}catch(n){throw i()&&y(e,s.Network,D({method:u,url:f,status:0,durationMs:Math.max(0,t.now()-l),failed:!0,reqBytes:p}),t.onError),n}},o=Reflect.get(n,`__original`);return Object.defineProperty(a,"__original",{configurable:!0,value:typeof o==`function`?o:n,writable:!0}),a}):d}function g(e,t){let n=window.XMLHttpRequest.prototype,i=new WeakMap,a=[];try{return a.push(S(n,`open`,(e,n)=>function(...a){let[o,s]=a;if(!n())return e.apply(this,a);let c=s.toString();return k(c,t.ignoreUrlPatterns)?(i.delete(this),e.apply(this,a)):(i.set(this,{method:o.toUpperCase(),url:r(c,t.redactUrlPatterns,window.location.href),startedAt:0,reqBytes:0,failed:!1,emitted:!1}),e.apply(this,a))})),a.push(S(n,`send`,(n,r)=>function(...a){let[o]=a,c=r()?i.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),r()&&y(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:re(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),r()&&y(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}})),C(a)}catch(e){throw w(a),e}}function _(e){return{...e,ignoreUrlPatterns:v(e.ignoreUrlPatterns),redactUrlPatterns:v(e.redactUrlPatterns)}}function v(e){return e.map(e=>{let t=e.flags.replace(/[gy]/gu,``);return t===e.flags?e:new RegExp(e.source,t)})}function y(e,t,n,r){try{e(t,n)}catch(e){r?.(e)}}function b(e){let t=!1;return n=>{if(!t){t=!0;try{let t=e?.(n);x(t)&&Promise.resolve(t).catch(()=>void 0)}catch{}finally{t=!1}}}}function x(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 d;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 T(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){return e.length<=u?e:`${e.slice(0,u)}...(+${String(e.length-u)} chars)`}function ee(e,t){return(t?.method??(typeof e==`object`&&`method`in e?e.method:`GET`)).toUpperCase()}function te(e){return typeof e==`string`||e instanceof URL?e.toString():e.url}function ne(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 re(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 k(e,t){return n(e,t)}const A=e.record,ie=new Set([`action`,`formaction`,`href`,`src`]);function ae(e){let t={emit:t=>{e.emit(oe(t,e.redactUrlPatterns))},maskAllInputs:e.maskAllInputs,recordCanvas:!1,collectFonts:!1,sampling:{mousemove:!0,mouseInteraction:!0,scroll:150,media:800,input:`last`}};e.maskAllText?t.maskTextSelector=`*`:e.maskTextSelector!==void 0&&e.maskTextSelector.length>0&&(t.maskTextSelector=e.maskTextSelector),e.blockSelector!==void 0&&e.blockSelector.length>0&&(t.blockSelector=e.blockSelector),e.checkoutEveryNms!==void 0&&e.checkoutEveryNms>0&&(t.checkoutEveryNms=e.checkoutEveryNms);let n=A(t);if(n===void 0)throw Error(`logfire session replay: rrweb failed to start recording`);return{stop:()=>{n()},addCustomEvent:(e,t)=>{A.addCustomEvent?.(e,t)}}}function oe(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 i=r(n.href,t,window.location.href);return i===n.href?e:{...e,data:{...n,href:i}}}if(e.type!==i.FullSnapshot&&(e.type!==i.IncrementalSnapshot||n.source!==a.Mutation))return e;let o=j(n,t);return o===n?e:{...e,data:o}}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)?se(a,t):j(a,t);n!==a&&(r=!0),i[e]=n}return r?i:e}function se(e,t){if(typeof e!=`object`||!e||Array.isArray(e))return e;let n=e,i=!1,a={};for(let[e,o]of Object.entries(n)){if(!ie.has(e.toLowerCase())||typeof o!=`string`){a[e]=o;continue}let n=r(o,t,window.location.href);n!==o&&(i=!0),a[e]=n}return i?a:e}function M(e){return Number.isFinite(e)?Math.min(1,Math.max(0,e)):0}function ce(e){let t=e.random??Math.random;return t()<M(e.sessionSampleRate)?`full`:t()<M(e.onErrorSampleRate)?`buffer`:`off`}function le(e=Date.now){let t=e(),n=new Uint8Array(new ArrayBuffer(16));ue(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 ue(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 N=`lf_session_replay`;var de=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?P():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:le(this.now),startedAt:e,lastActivityAt:e};return this.flushPendingStorage(),this.writeNow(t),t}read(){if(this.storage!==null)try{let e=this.storage.getItem(N);if(e!==null){let t=JSON.parse(e);if(fe(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(N,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 P(){try{return globalThis.sessionStorage??null}catch{return null}}function fe(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 F(e){return typeof e==`object`&&e?e:void 0}function I(e){return typeof e==`string`&&e.length>0?e:void 0}function pe(e,t,n){let r=1/0,c=0,l=0,u=0,d=0,f=!1,p=new Set,m=new Set;for(let e of t){e.timestamp<r&&(r=e.timestamp),e.timestamp>c&&(c=e.timestamp);let t=F(e.data);if(e.type===i.FullSnapshot)f=!0;else if(e.type===i.Meta){let e=I(t?.href);e!==void 0&&p.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)&&l++}else e===a.Input&&u++}else if(e.type===i.Custom&&t!==void 0){let e=I(t.tag),n=F(t.payload);if(e===s.Error)d++;else if(e===s.Trace){let e=I(n?.traceId);e!==void 0&&m.add(e)}else if(e===s.Console)n?.level===`error`&&d++;else if(e===s.Navigation){let e=I(n?.url);e!==void 0&&p.add(e)}}}return{seq:e,firstTimestamp:r===1/0?0:r,lastTimestamp:c,eventCount:t.length,clickCount:l,keypressCount:u,errorCount:d,hasFullSnapshot:f,urls:[...p],traceIds:[...m],...n!==void 0&&n.length>0?{distinctId:n}:{}}}const L=`lf_session_replay_seq`,me={gzip:t.gzip,gzipSync:t.gzipSync};var R=class{buffer=[];pendingBytes=0;seq=0;timer;mode;flushing;reservedKeepaliveBytes=0;asyncCompressionAvailable=!0;config;compression;storage;sessionId;constructor(e,t,n,r=P(),i=me){this.config=e,this.sessionId=t,this.mode=n,this.storage=r,this.compression=i,this.seq=this.loadSeq(t)}start(){this.timer!==void 0||this.mode!==`full`||(this.timer=setInterval(()=>{this.flushAndReport()},this.config.flushIntervalMs))}add(e){let t=V(e);if(this.mode===`buffer`){if(e.type===i.FullSnapshot){this.buffer=[e],this.pendingBytes=t;return}if(this.buffer.length===0||t>this.config.maxBufferBytes||this.pendingBytes+t>this.config.maxBufferBytes)return}this.buffer.push(e),this.pendingBytes+=t,this.mode===`full`&&this.pendingBytes>=this.config.maxBufferBytes&&this.flushAndReport()}async triggerFlush(){return this.mode===`buffer`&&(this.mode=`full`,this.start()),this.flush()}async flush(e={}){if(this.mode===`buffer`||this.buffer.length===0)return;let t=this.buffer;this.buffer=[],this.pendingBytes=0;let n=e.keepalive===!0?ve(t):[t],r=this.seq;this.seq+=n.length;let i=this.sessionId;this.saveSeq(i,this.seq);let a=e.keepalive===!0?Promise.resolve():this.flushing??Promise.resolve(),o=e.keepalive===!0?this.deliverLifecycle(n,r,i):a.then(async()=>{for(let e=0;e<n.length;e++){let t=n[e];t!==void 0&&await this.deliverOrdinary(t,r+e,i)}}),s=this.flushing;this.flushing=e.keepalive===!0&&s!==void 0?Promise.all([s,o]).then(()=>void 0,()=>void 0):o.catch(()=>void 0),await o}async shutdown(e={}){this.timer!==void 0&&(clearInterval(this.timer),this.timer=void 0),await this.flush(e),await this.flushing}discard(){this.timer!==void 0&&(clearInterval(this.timer),this.timer=void 0),this.buffer=[],this.pendingBytes=0}getMode(){return this.mode}flushAndReport(){this.flush().catch(e=>{z(this.config.onError,e)})}createEnvelope(e,t){let n=this.config.distinctId;if(this.config.getDistinctId!==void 0)try{n=this.config.getDistinctId()??this.config.distinctId}catch(e){z(this.config.onError,e)}return{version:1,meta:pe(t,e,n),events:e}}async deliverOrdinary(e,n,r){let i=this.createEnvelope(e,n);try{let e=(0,t.strToU8)(JSON.stringify(i)),a=await this.compressOrdinary(e);await this.sendWithRetry({body:a,lifecycle:!1,requestKeepalive:!1,reservedBytes:0,seq:n,sessionId:r})}catch(e){z(this.config.onError,e)}}async deliverLifecycle(e,n,r){let i=[];for(let a=0;a<e.length;a++){let o=e[a];if(o===void 0){i.push(void 0);continue}let s=this.createEnvelope(o,n+a);try{i.push({body:this.compression.gzipSync((0,t.strToU8)(JSON.stringify(s))),lifecycle:!0,requestKeepalive:!1,reservedBytes:0,seq:n+a,sessionId:r})}catch(e){z(this.config.onError,e),i.push(void 0)}}let a=!0,o=Math.max(0,48e3-this.reservedKeepaliveBytes);for(let e of i){if(e===void 0){a=!1;continue}a&&e.body.byteLength<=o?(e.requestKeepalive=!0,e.reservedBytes=e.body.byteLength,this.reservedKeepaliveBytes+=e.reservedBytes,o-=e.reservedBytes):a=!1}await Promise.all(i.map(async e=>{if(e!==void 0)try{await this.sendWithRetry(e)}catch(e){z(this.config.onError,e)}}))}async compressOrdinary(e){if(!this.asyncCompressionAvailable)return this.compression.gzipSync(e);try{return await H(this.compression,e)}catch{return this.asyncCompressionAvailable=!1,this.compression.gzipSync(e)}}async sendWithRetry(e){let t=e.lifecycle?1:3;for(let n=1;n<=t;n++)try{await this.send(e);return}catch(e){let r=be(e,n);if(r===void 0||n>=t)throw e;await _e(r)}}async send(e){let t,n,r,i=new AbortController,a=setTimeout(()=>{i.abort(Error(`replay upload timed out after 10000ms`))},1e4);try{let a=`${this.config.replayUrl.replace(/\/+$/u,``)}/${encodeURIComponent(e.sessionId)}?seq=${String(e.seq)}`,o=await this.getUploadHeaders(),s=this.config.fetchImpl(a,{method:`POST`,headers:o,body:e.body.slice(),keepalive:e.requestKeepalive,signal:i.signal});t=!0;let c=await s;if(n=!0,r=await ye(c),!c.ok){let e=c.status===429?xe(c.headers.get(`retry-after`),Date.now()):void 0;throw new B(c.status,e)}}finally{clearTimeout(a),e.reservedBytes>0&&(t!==!0||n!==!0||r===!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 ge(this.config.token);return{...e,...t===void 0||t.length===0?{}:{Authorization:`Bearer ${t}`},"Content-Type":`application/json`,"Content-Encoding":`gzip`}}loadSeq(e){if(this.storage===null)return 0;try{let t=this.storage.getItem(L);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(L,JSON.stringify({id:e,seq:t}))}catch{}}};function z(e,t){try{let n=e?.(t);he(n)&&Promise.resolve(n).catch(()=>void 0)}catch{}}function he(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 ge(e){return typeof e==`function`?e():e}async function _e(e){return new Promise(t=>{setTimeout(t,e)})}function V(e){try{return(0,t.strToU8)(JSON.stringify(e)).byteLength}catch{return 0}}function ve(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 H(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 ye(e){if(e.body===null)return!0;try{return await e.body.cancel(),!0}catch{return!1}}function be(e,t){return e instanceof B?e.status===429?e.retryAfter?.kind===`too-long`?void 0:e.retryAfter?.kind===`delay`?e.retryAfter.milliseconds:500*t:e.status<500?void 0:500*t:500*t}function xe(e,t){if(e===null)return{kind:`fallback`};let n=e.trim();if(/^\d+$/u.test(n)){let e=Number(n);return Number.isSafeInteger(e)?U(e*1e3):{kind:`fallback`}}let r=Te(n,t);return r===void 0?{kind:`fallback`}:U(Math.max(0,r-t))}function U(e){return e>1e4?{kind:`too-long`}:{kind:`delay`,milliseconds:e}}const Se=[`Jan`,`Feb`,`Mar`,`Apr`,`May`,`Jun`,`Jul`,`Aug`,`Sep`,`Oct`,`Nov`,`Dec`],Ce=[`Sun`,`Mon`,`Tue`,`Wed`,`Thu`,`Fri`,`Sat`],we=[`Sunday`,`Monday`,`Tuesday`,`Wednesday`,`Thursday`,`Friday`,`Saturday`];function Te(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 W(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),W(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 W(i[1],i[3]?.trim(),i[2],i[7],i[4],i[5],i[6])}function W(e,t,n,r,i,a,o){let s=Number(t),c=Se.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=Ce.indexOf(e),h=we.indexOf(e);return(m>=0?m:h)===p.getUTCDay()?p.getTime():void 0}const Ee={mode:`off`,recording:!1,getSessionId:()=>``,flush:async()=>Promise.resolve(),stop:async()=>Promise.resolve()},G=`lf_session_replay_mode`,K=Symbol.for(`@pydantic/logfire-session-replay/controller`),q=1e3;function De(e){if(typeof window>`u`||typeof document>`u`)return Ee;let t=Fe();try{let n=ke(e),r=new de({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=P(),s=a(!1),c,l=!1,u=Promise.resolve(),d,f=(e,t)=>{let r=Ae(n,e,o);if(!(r===`off`||l||e!==s))try{c=Oe({config:n,getSessionId:a,mode:r,onSessionChanged:p,samplingModeStorage:o,sessionId:e})}catch(e){if(c=void 0,t)throw e;Z(n.onError,e)}},p=e=>{if(l||e===s)return;s=e;let t=c;c=void 0;let r=t?.deactivate()??Promise.resolve();u=u.then(async()=>{await X(r,n.onError),!l&&s===e&&f(e,!1)})},m;try{f(s,!0),m=setInterval(()=>{p(a(!1))},q)}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 X(e?.deactivate()??Promise.resolve(),n.onError),await u,r.flushPendingStorage(),t()})(),d)}}catch(e){throw t(),e}}function Oe(e){let{config:t,getSessionId:n,mode:r,onSessionChanged:i,samplingModeStorage:a,sessionId:o}=e,c=new R(t,o,r),l=[],u=!0,d=()=>u,h;try{let e=ae({emit:e=>{if(u)try{let t=n(!0);if(t!==o){i(t);return}c.add(e)}catch(e){Z(t.onError,e)}},maskAllText:t.maskAllText,maskAllInputs:t.maskAllInputs,maskTextSelector:t.maskTextSelector,blockSelector:t.blockSelector,checkoutEveryNms:r===`buffer`?12e4:0,redactUrlPatterns:t.redactUrlPatterns});l.push(()=>{e.stop()});let g=(n,r)=>{if(u)try{e.addCustomEvent(n,r)}catch(e){Z(t.onError,e)}},_;if(t.getTraceContext!==void 0){let e=setInterval(()=>{if(u)try{let e=t.getTraceContext?.(),n=e?.traceId;n!==void 0&&n.length>0&&n!==_&&(_=n,g(s.Trace,{traceId:n,spanId:e?.spanId}))}catch(e){Z(t.onError,e)}},q);l.push(()=>{clearInterval(e)})}let v=e=>{d()&&(g(s.Error,e),d()&&c.getMode()===`buffer`&&(J(a,o,`full`),Y(c.triggerFlush(),t.onError)))},y=e=>{e instanceof ErrorEvent&&v($(e.message,e.filename,Ne(e.error)))},b=e=>{let t=e.reason;v($(Ie(t?.message??e.reason),void 0,typeof t?.stack==`string`?t.stack:void 0))},x=()=>{document.visibilityState===`hidden`&&Y(c.flush({keepalive:!0}),t.onError)},S=()=>{Y(c.flush({keepalive:!0}),t.onError)};return window.addEventListener(`error`,y,!0),l.push(()=>{window.removeEventListener(`error`,y,!0)}),window.addEventListener(`unhandledrejection`,b,!0),l.push(()=>{window.removeEventListener(`unhandledrejection`,b,!0)}),document.addEventListener(`visibilitychange`,x),l.push(()=>{document.removeEventListener(`visibilitychange`,x)}),window.addEventListener(`pagehide`,S),l.push(()=>{window.removeEventListener(`pagehide`,S)}),t.captureConsole&&l.push(f(g,{onError:t.onError})),t.captureNetwork&&l.push(p(g,{ignoreUrlPatterns:t.ignoreUrlPatterns,now:t.now,onError:t.onError,redactUrlPatterns:t.redactUrlPatterns})),t.captureNavigation&&l.push(m(g,{onError:t.onError,redactUrlPatterns:t.redactUrlPatterns})),c.start(),{sessionId:o,transport:c,deactivate:async()=>(h??=(async()=>{u=!1,Q(l),await c.shutdown({keepalive:!1})})(),h),discard:()=>{u=!1,Q(l),c.discard()}}}catch(e){throw u=!1,Q(l),c.discard(),e}}function ke(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,sessionSampleRate:e.sessionSampleRate??c.sessionSampleRate,onErrorSampleRate:e.onErrorSampleRate??c.onErrorSampleRate,maskAllText:e.maskAllText??c.maskAllText,maskAllInputs:e.maskAllInputs??c.maskAllInputs,maskTextSelector:e.maskTextSelector??c.maskTextSelector,blockSelector:e.blockSelector??c.blockSelector,flushIntervalMs:e.flushIntervalMs??c.flushIntervalMs,maxBufferBytes:e.maxBufferBytes??c.maxBufferBytes,sessionIdleTimeoutMs:e.sessionIdleTimeoutMs??c.sessionIdleTimeoutMs,maxSessionDurationMs:e.maxSessionDurationMs??c.maxSessionDurationMs,distinctId:e.distinctId??c.distinctId,getDistinctId:e.getDistinctId,getTraceContext:e.getTraceContext,captureConsole:e.captureConsole??c.captureConsole,captureNetwork:e.captureNetwork??c.captureNetwork,captureNavigation:e.captureNavigation??c.captureNavigation,ignoreUrlPatterns:e.ignoreUrlPatterns??[],redactUrlPatterns:e.redactUrlPatterns??[...c.redactUrlPatterns],onError:e.onError,fetchImpl:n,now:e.now??Date.now,random:e.random??Math.random}}function Ae(e,t,n){let r=je(n,t);if(r!==void 0)return r;let i=ce({sessionSampleRate:e.sessionSampleRate,onErrorSampleRate:e.onErrorSampleRate,random:e.random});return J(n,t,i),i}function je(e,t){if(e!==null)try{let n=e.getItem(G);if(n===null)return;let r=JSON.parse(n);if(typeof r!=`object`||!r)return;let i=r;return i.id!==t||!Me(i.mode)?void 0:i.mode}catch{return}}function J(e,t,n){if(e!==null)try{e.setItem(G,JSON.stringify({id:t,mode:n}))}catch{}}function Me(e){return e===`full`||e===`buffer`||e===`off`}function Ne(e){let t=typeof e==`object`&&e&&`stack`in e?e.stack:void 0;return typeof t==`string`?t:void 0}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);Pe(n)&&Promise.resolve(n).catch(()=>void 0)}catch{}}function Pe(e){return typeof e==`object`&&!!e&&`then`in e&&typeof e.then==`function`}function Fe(){let e=globalThis;if(e[K]!==void 0)throw Error(`logfire session replay: a replay controller is already active in this page`);let t={};Object.defineProperty(e,K,{configurable:!0,enumerable:!1,value:t,writable:!0});let n=!1;return()=>{n||(n=!0,e[K]===t&&Reflect.deleteProperty(e,K))}}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 Ie(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=s,exports.EventType=i,exports.IncrementalSource=a,exports.MouseInteractions=o,exports.startSessionReplay=De;
package/dist/index.d.cts CHANGED
@@ -55,7 +55,7 @@ interface NetworkPayload {
55
55
  }
56
56
  interface NavigationPayload {
57
57
  url: string;
58
- kind: "load" | "push" | "replace" | "pop";
58
+ kind: "push" | "replace" | "pop";
59
59
  }
60
60
  interface ChunkMeta {
61
61
  seq: number;
@@ -104,8 +104,12 @@ interface SessionReplayConfig {
104
104
  * pass its RUM session id here.
105
105
  */
106
106
  getSessionId?: () => string | undefined;
107
+ /** Probability of recording each new browser session in full. */
107
108
  sessionSampleRate?: number;
109
+ /** Probability of buffering each otherwise-unsampled session for uncaught error promotion. */
108
110
  onErrorSampleRate?: number;
111
+ /** Mask all rendered DOM text. Defaults to true. */
112
+ maskAllText?: boolean;
109
113
  maskAllInputs?: boolean;
110
114
  maskTextSelector?: string;
111
115
  blockSelector?: string;
package/dist/index.d.ts CHANGED
@@ -55,7 +55,7 @@ interface NetworkPayload {
55
55
  }
56
56
  interface NavigationPayload {
57
57
  url: string;
58
- kind: "load" | "push" | "replace" | "pop";
58
+ kind: "push" | "replace" | "pop";
59
59
  }
60
60
  interface ChunkMeta {
61
61
  seq: number;
@@ -104,8 +104,12 @@ interface SessionReplayConfig {
104
104
  * pass its RUM session id here.
105
105
  */
106
106
  getSessionId?: () => string | undefined;
107
+ /** Probability of recording each new browser session in full. */
107
108
  sessionSampleRate?: number;
109
+ /** Probability of buffering each otherwise-unsampled session for uncaught error promotion. */
108
110
  onErrorSampleRate?: number;
111
+ /** Mask all rendered DOM text. Defaults to true. */
112
+ maskAllText?: boolean;
109
113
  maskAllInputs?: boolean;
110
114
  maskTextSelector?: string;
111
115
  blockSelector?: string;
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- import{record as e}from"rrweb";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},o={MouseUp:0,MouseDown:1,Click:2,ContextMenu:3,DblClick:4},s={Error:`logfire.error`,Trace:`logfire.trace`,Console:`logfire.console`,Network:`logfire.network`,Navigation:`logfire.navigation`},c=1,l={sessionSampleRate:1,onErrorSampleRate:1,maskAllInputs:!0,maskTextSelector:``,blockSelector:``,flushIntervalMs:5e3,maxBufferBytes:1e6,sessionIdleTimeoutMs:18e5,maxSessionDurationMs:144e5,distinctId:``,captureConsole:!0,captureNetwork:!0,captureNavigation:!0},u=[`log`,`info`,`warn`,`error`,`debug`],d=1024,f=()=>void 0;function p(e,t={}){let n=new Map,r=!1;for(let r of u){let i=console[r];if(typeof i!=`function`)continue;let a=i;n.set(r,a),console[r]=(...n)=>{b(e,s.Console,{level:r,args:n.slice(0,10).map(x)},t.onError),a.apply(console,n)}}return()=>{if(!r){r=!0;for(let[e,t]of n)console[e]=t}}}function m(e,t){let n=v(t),r=g(e,n),i=_(e,n),a=!1;return()=>{a||(a=!0,r(),i())}}function h(e,t={}){let n=history.pushState,r=history.replaceState,i=!1,a=n=>{b(e,s.Navigation,{url:window.location.href,kind:n},t.onError)};history.pushState=function(...e){n.apply(this,e),a(`push`)},history.replaceState=function(...e){r.apply(this,e),a(`replace`)};let o=()=>{a(`pop`)};return window.addEventListener(`popstate`,o),()=>{i||(i=!0,history.pushState=n,history.replaceState=r,window.removeEventListener(`popstate`,o))}}function g(e,t){let n=window.fetch;if(typeof n!=`function`)return f;let r=!1;return window.fetch=async(r,i)=>{let a=t.now(),o=C(r,i),c=w(r);if(O(c,t.ignoreUrlPatterns))return n(r,i);let l=D(c,t.redactUrlPatterns),u=E(i?.body);try{let c=await n(r,i);return b(e,s.Network,T({method:o,url:l,status:c.status,durationMs:Math.max(0,t.now()-a),reqBytes:u,resBytes:ee(c.headers)}),t.onError),c}catch(n){throw b(e,s.Network,T({method:o,url:l,status:0,durationMs:Math.max(0,t.now()-a),failed:!0,reqBytes:u}),t.onError),n}},()=>{r||(r=!0,window.fetch=n)}}function _(e,t){let n=window.XMLHttpRequest.prototype,r=n.open,i=n.send,a=new WeakMap,o=!1;return n.open=function(e,n,i,o,s){let c=n.toString();if(O(c,t.ignoreUrlPatterns)){a.delete(this),r.call(this,e,n,i??!0,o??null,s??null);return}a.set(this,{method:e.toUpperCase(),url:D(c,t.redactUrlPatterns),startedAt:0,reqBytes:0,failed:!1,emitted:!1}),r.call(this,e,n,i??!0,o??null,s??null)},n.send=function(n){let r=a.get(this);if(r===void 0){i.call(this,n);return}r.startedAt=t.now(),r.reqBytes=E(n);let o=()=>{r.failed=!0},c=()=>{r.emitted||(r.emitted=!0,this.removeEventListener(`error`,o),this.removeEventListener(`abort`,o),this.removeEventListener(`timeout`,o),b(e,s.Network,T({method:r.method,url:r.url,status:this.status,durationMs:Math.max(0,t.now()-r.startedAt),failed:r.failed||this.status===0,reqBytes:r.reqBytes,resBytes:te(this)}),t.onError))};this.addEventListener(`error`,o),this.addEventListener(`abort`,o),this.addEventListener(`timeout`,o),this.addEventListener(`loadend`,c,{once:!0});try{i.call(this,n)}catch(n){throw this.removeEventListener(`error`,o),this.removeEventListener(`abort`,o),this.removeEventListener(`timeout`,o),this.removeEventListener(`loadend`,c),b(e,s.Network,T({method:r.method,url:r.url,status:0,durationMs:Math.max(0,t.now()-r.startedAt),failed:!0,reqBytes:r.reqBytes}),t.onError),n}},()=>{o||(o=!0,n.open=r,n.send=i)}}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){try{r?.(e)}catch{}}}function x(e){if(e==null)return String(e);if(typeof e==`string`)return S(e);if(typeof e==`number`||typeof e==`boolean`||typeof e==`bigint`)return String(e);if(e instanceof Error)return S(e.stack??`${e.name}: ${e.message}`);try{return S(JSON.stringify(e))}catch{return Object.prototype.toString.call(e)}}function S(e){return e.length<=d?e:`${e.slice(0,d)}...(+${String(e.length-d)} chars)`}function C(e,t){return(t?.method??(typeof e==`object`&&`method`in e?e.method:`GET`)).toUpperCase()}function w(e){return typeof e==`string`||e instanceof URL?e.toString():e.url}function ee(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 te(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 T(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 E(e){if(e==null)return 0;if(typeof e==`string`)return e.length;if(e instanceof ArrayBuffer||ArrayBuffer.isView(e))return e.byteLength;if(e instanceof Blob)return e.size}function D(e,t){if(t.length===0||!t.some(t=>t.test(e)))return e;try{let t=new URL(e,window.location.href);return`${t.origin}${t.pathname}`}catch{let[t=e]=e.split(`?`),[n=t]=t.split(`#`);return n}}function O(e,t){return t.some(t=>t.test(e))}const k=e;function ne(e){let t={emit:t=>{e.emit(t)},maskAllInputs:e.maskAllInputs,recordCanvas:!1,collectFonts:!1,sampling:{mousemove:!0,mouseInteraction:!0,scroll:150,media:800,input:`last`}};e.maskTextSelector!==void 0&&e.maskTextSelector.length>0&&(t.maskTextSelector=e.maskTextSelector),e.blockSelector!==void 0&&e.blockSelector.length>0&&(t.blockSelector=e.blockSelector),e.checkoutEveryNms!==void 0&&e.checkoutEveryNms>0&&(t.checkoutEveryNms=e.checkoutEveryNms);let n=k(t);return{stop:()=>{n?.()},addCustomEvent:(e,t)=>{k.addCustomEvent?.(e,t)},takeFullSnapshot:()=>{k.takeFullSnapshot?.(!0)}}}function A(e){return Number.isFinite(e)?Math.min(1,Math.max(0,e)):0}function j(e){let t=e.random??Math.random;return t()<A(e.sessionSampleRate)?`full`:t()<A(e.onErrorSampleRate)?`buffer`:`off`}function M(e=Date.now){let t=e(),n=new Uint8Array(new ArrayBuffer(16));N(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 N(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 P=`lf_session_replay`;var F=class{idleTimeoutMs;maxDurationMs;now;storage;memorySession;constructor(e){this.idleTimeoutMs=e.idleTimeoutMs,this.maxDurationMs=e.maxDurationMs,this.now=e.now??Date.now,this.storage=e.storage===void 0?I():e.storage}getSession(){let e=this.now(),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.write(t),t}reset(){return this.createSession(this.now())}isExpired(e,t){return t-e.lastActivityAt>this.idleTimeoutMs||t-e.startedAt>this.maxDurationMs}createSession(e){let t={id:M(this.now),startedAt:e,lastActivityAt:e};return this.write(t),t}read(){if(this.storage!==null)try{let e=this.storage.getItem(P);if(e!==null){let t=JSON.parse(e);if(re(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(P,JSON.stringify(e))}catch{}}};function I(){try{return globalThis.sessionStorage??null}catch{return null}}function re(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 L(e){return typeof e==`object`&&e?e:void 0}function R(e){return typeof e==`string`&&e.length>0?e:void 0}function ie(e,t,n){let r=1/0,c=0,l=0,u=0,d=0,f=!1,p=new Set,m=new Set;for(let e of t){e.timestamp<r&&(r=e.timestamp),e.timestamp>c&&(c=e.timestamp);let t=L(e.data);if(e.type===i.FullSnapshot)f=!0;else if(e.type===i.Meta){let e=R(t?.href);e!==void 0&&p.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)&&l++}else e===a.Input&&u++}else if(e.type===i.Custom&&t!==void 0){let e=R(t.tag),n=L(t.payload);if(e===s.Error)d++;else if(e===s.Trace){let e=R(n?.traceId);e!==void 0&&m.add(e)}else if(e===s.Console)n?.level===`error`&&d++;else if(e===s.Navigation){let e=R(n?.url);e!==void 0&&p.add(e)}}}return{seq:e,firstTimestamp:r===1/0?0:r,lastTimestamp:c,eventCount:t.length,clickCount:l,keypressCount:u,errorCount:d,hasFullSnapshot:f,urls:[...p],traceIds:[...m],...n!==void 0&&n.length>0?{distinctId:n}:{}}}const z=`lf_session_replay_seq`;var B=class{buffer=[];pendingBytes=0;seq=0;timer;mode;flushing;config;storage;sessionId;constructor(e,t,n,r=I()){this.config=e,this.sessionId=t,this.mode=n,this.storage=r,this.seq=this.loadSeq(t)}start(){this.timer!==void 0||this.mode!==`full`||(this.timer=setInterval(()=>{this.flushAndReport()},this.config.flushIntervalMs))}add(e){this.mode===`buffer`&&e.type===i.FullSnapshot&&(this.buffer=[],this.pendingBytes=0),this.buffer.push(e),this.pendingBytes+=W(e),this.mode===`full`&&this.pendingBytes>=this.config.maxBufferBytes&&this.flushAndReport()}async triggerFlush(){return this.mode===`buffer`&&(this.mode=`full`,this.start()),this.flush()}async flush(e={}){if(this.mode===`buffer`||this.buffer.length===0)return;let t=this.buffer;this.buffer=[],this.pendingBytes=0;let n=e.keepalive===!0?G(t):[t],r=this.seq;this.seq+=n.length;let i=this.sessionId;this.saveSeq(i,this.seq);let a=(this.flushing??Promise.resolve()).then(async()=>{for(let t=0;t<n.length;t++){let a=n[t];a!==void 0&&await this.deliver(a,r+t,i,e.keepalive??!1)}});this.flushing=a.catch(()=>void 0),await a}rotate(e){return e===this.sessionId?!1:(this.mode===`buffer`?(this.buffer=[],this.pendingBytes=0):this.flushAndReport(),this.sessionId=e,this.seq=this.loadSeq(e),!0)}async shutdown(e={}){this.timer!==void 0&&(clearInterval(this.timer),this.timer=void 0),await this.flush(e),await this.flushing}getMode(){return this.mode}flushAndReport(){this.flush().catch(e=>{this.config.onError?.(e)})}async deliver(e,t,i,a){let o={version:1,meta:ie(t,e,this.config.getDistinctId?.()??this.config.distinctId),events:e};try{let e=JSON.stringify(o),s=a?n(r(e)):await K(e),c=a&&s.byteLength<=6e4;await this.sendWithRetry(i,t,s,c)}catch(e){this.config.onError?.(e)}}async sendWithRetry(e,t,n,r){let i=r?1:3;for(let a=1;a<=i;a++)try{await this.send(e,t,n,r);return}catch(e){if(e instanceof V&&e.status<500||a>=i)throw e;await U(500*a)}}async send(e,t,n,r){let i=`${this.config.replayUrl.replace(/\/+$/u,``)}/${encodeURIComponent(e)}?seq=${String(t)}`,a=await this.getUploadHeaders(),o=await this.config.fetchImpl(i,{method:`POST`,headers:a,body:n.slice(),keepalive:r});if(!o.ok)throw new V(o.status)}async getUploadHeaders(){let e=this.config.headers===void 0?{}:await this.config.headers(),t=await H(this.config.token);return{...e,...t===void 0||t.length===0?{}:{Authorization:`Bearer ${t}`},"Content-Type":`application/json`,"Content-Encoding":`gzip`}}loadSeq(e){if(this.storage===null)return 0;try{let t=this.storage.getItem(z);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(z,JSON.stringify({id:e,seq:t}))}catch{}}},V=class extends Error{status;constructor(e){super(`replay ingest failed: ${String(e)}`),this.status=e,this.name=`ReplayIngestError`}};async function H(e){return typeof e==`function`?e():e}async function U(e){return new Promise(t=>{setTimeout(t,e)})}function W(e){try{return JSON.stringify(e).length}catch{return 0}}function G(e){let t=[],n=[],r=0;for(let i of e){let e=W(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 K(e){return new Promise((n,i)=>{t(r(e),{level:6},(e,t)=>{if(e!==null){i(e);return}n(t)})})}const q={mode:`off`,recording:!1,getSessionId:()=>``,flush:async()=>Promise.resolve(),stop:async()=>Promise.resolve()},J=`lf_session_replay_mode`;function ae(e){if(typeof window>`u`||typeof document>`u`)return q;let t=oe(e),n=new F({idleTimeoutMs:t.sessionIdleTimeoutMs,maxDurationMs:t.maxSessionDurationMs,now:t.now}),r=e=>{let r=t.getSessionId?.();return r!==void 0&&r.length>0?r:e?n.touch().id:n.getSession().id},i=r(!1),a=I(),o=se(t,i,a);if(o===`off`)return q;let c=new B(t,i,o),l={},u=ne({emit:e=>{let t=r(!0);c.rotate(t)&&l.current?.takeFullSnapshot(),c.add(e)},maskAllInputs:t.maskAllInputs,maskTextSelector:t.maskTextSelector,blockSelector:t.blockSelector,checkoutEveryNms:o===`buffer`?12e4:0});l.current=u;let d,f=t.getTraceContext===void 0?void 0:setInterval(()=>{let e=t.getTraceContext?.(),n=e?.traceId;n!==void 0&&n.length>0&&n!==d&&(d=n,u.addCustomEvent(s.Trace,{traceId:n,spanId:e?.spanId}))},1e3),g=e=>{u.addCustomEvent(s.Error,e),c.getMode()===`buffer`&&(Y(a,r(!1),`full`),Q(c.triggerFlush(),t.onError))},_=e=>{g($(e.message,e.filename,X(e.error)))},v=e=>{let t=e.reason;g($(t?.message??String(e.reason??`unhandledrejection`),void 0,t?.stack))},y=()=>{document.visibilityState===`hidden`&&Q(c.flush({keepalive:!0}),t.onError)};window.addEventListener(`error`,_,!0),window.addEventListener(`unhandledrejection`,v,!0),document.addEventListener(`visibilitychange`,y),window.addEventListener(`pagehide`,y);let b=(e,t)=>{u.addCustomEvent(e,t)},x=t.captureConsole?p(b,{onError:t.onError}):Z,S=t.captureNetwork?m(b,{ignoreUrlPatterns:t.ignoreUrlPatterns,now:t.now,onError:t.onError,redactUrlPatterns:t.redactUrlPatterns}):Z,C=t.captureNavigation?h(b,{onError:t.onError}):Z;c.start();let w;return{get mode(){return c.getMode()},recording:!0,getSessionId:()=>r(!1),flush:async()=>c.flush(),stop:async()=>(w??=(async()=>{f!==void 0&&clearInterval(f),window.removeEventListener(`error`,_,!0),window.removeEventListener(`unhandledrejection`,v,!0),document.removeEventListener(`visibilitychange`,y),window.removeEventListener(`pagehide`,y),x(),S(),C(),u.stop(),await c.shutdown({keepalive:!1})})(),w)}}function oe(e){if(e.replayUrl.length===0)throw Error("logfire session replay: `replayUrl` is required");let t=e.fetchImpl??(typeof fetch==`function`?fetch.bind(globalThis):void 0);if(t===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,sessionSampleRate:e.sessionSampleRate??l.sessionSampleRate,onErrorSampleRate:e.onErrorSampleRate??l.onErrorSampleRate,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,sessionIdleTimeoutMs:e.sessionIdleTimeoutMs??l.sessionIdleTimeoutMs,maxSessionDurationMs:e.maxSessionDurationMs??l.maxSessionDurationMs,distinctId:e.distinctId??l.distinctId,getDistinctId:e.getDistinctId,getTraceContext:e.getTraceContext,captureConsole:e.captureConsole??l.captureConsole,captureNetwork:e.captureNetwork??l.captureNetwork,captureNavigation:e.captureNavigation??l.captureNavigation,ignoreUrlPatterns:e.ignoreUrlPatterns??[],redactUrlPatterns:e.redactUrlPatterns??[],onError:e.onError,fetchImpl:t,now:e.now??Date.now,random:e.random??Math.random}}function se(e,t,n){let r=ce(n,t);if(r!==void 0)return r;let i=j({sessionSampleRate:e.sessionSampleRate,onErrorSampleRate:e.onErrorSampleRate,random:e.random});return Y(n,t,i),i}function ce(e,t){if(e!==null)try{let n=e.getItem(J);if(n===null)return;let r=JSON.parse(n);if(typeof r!=`object`||!r)return;let i=r;return i.id!==t||!le(i.mode)?void 0:i.mode}catch{return}}function Y(e,t,n){if(e!==null)try{e.setItem(J,JSON.stringify({id:t,mode:n}))}catch{}}function le(e){return e===`full`||e===`buffer`||e===`off`}function X(e){let t=typeof e==`object`&&e&&`stack`in e?e.stack:void 0;return typeof t==`string`?t:void 0}function Z(){}function Q(e,t){e.catch(e=>{t?.(e)})}function $(e,t,n){return{message:e,...t===void 0||t.length===0?{}:{source:t},...n===void 0?{}:{stack:n}}}export{c as CHUNK_ENVELOPE_VERSION,s as CustomTag,i as EventType,a as IncrementalSource,o as MouseInteractions,ae as startSessionReplay};
1
+ import{record as e}from"rrweb";import{gzip as t,gzipSync as n,strToU8 as r}from"fflate";function i(e,t){return t.some(t=>new RegExp(t.source,t.flags).test(e))}function a(e,t,n){if(!i(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 o={DomContentLoaded:0,Load:1,FullSnapshot:2,IncrementalSnapshot:3,Meta:4,Custom:5,Plugin:6},s={Mutation:0,MouseMove:1,MouseInteraction:2,Scroll:3,ViewportResize:4,Input:5},c={MouseUp:0,MouseDown:1,Click:2,ContextMenu:3,DblClick:4},l={Error:`logfire.error`,Trace:`logfire.trace`,Console:`logfire.console`,Network:`logfire.network`,Navigation:`logfire.navigation`},u=1,d={sessionSampleRate:1,onErrorSampleRate:1,maskAllText:!0,maskAllInputs:!0,maskTextSelector:``,blockSelector:``,flushIntervalMs:5e3,maxBufferBytes:1e6,sessionIdleTimeoutMs:18e5,maxSessionDurationMs:144e5,distinctId:``,captureConsole:!1,captureNetwork:!0,captureNavigation:!0,redactUrlPatterns:[/.+/u]},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(...a){return i()&&b(e,l.Console,{level:t,args:a.slice(0,10).map(T)},r),n.apply(this,a)}));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=a(window.location.href,t.redactUrlPatterns??[],window.location.href);b(e,l.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(),u=re(i,o),d=ie(i);if(k(d,t.ignoreUrlPatterns))return s.call(this,i,o);let f=a(d,t.redactUrlPatterns,window.location.href),p=O(o?.body);try{let n=await s.call(this,i,o);return r()&&b(e,l.Network,D({method:u,url:f,status:n.status,durationMs:Math.max(0,t.now()-c),reqBytes:p,resBytes:ae(n.headers)}),t.onError),n}catch(n){throw r()&&b(e,l.Network,D({method:u,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[o,s]=i;if(!n())return e.apply(this,i);let c=s.toString();return k(c,t.ignoreUrlPatterns)?(r.delete(this),e.apply(this,i)):(r.set(this,{method:o.toUpperCase(),url:a(c,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(...a){let[o]=a,s=i()?r.get(this):void 0;if(s===void 0)return n.apply(this,a);s.startedAt=t.now(),s.reqBytes=O(o);let c=()=>{s.failed=!0},u=()=>{s.emitted||(s.emitted=!0,this.removeEventListener(`error`,c),this.removeEventListener(`abort`,c),this.removeEventListener(`timeout`,c),i()&&b(e,l.Network,D({method:s.method,url:s.url,status:this.status,durationMs:Math.max(0,t.now()-s.startedAt),failed:s.failed||this.status===0,reqBytes:s.reqBytes,resBytes:oe(this)}),t.onError))};this.addEventListener(`error`,c),this.addEventListener(`abort`,c),this.addEventListener(`timeout`,c),this.addEventListener(`loadend`,u,{once:!0});try{return n.apply(this,a)}catch(n){throw this.removeEventListener(`error`,c),this.removeEventListener(`abort`,c),this.removeEventListener(`timeout`,c),this.removeEventListener(`loadend`,u),i()&&b(e,l.Network,D({method:s.method,url:s.url,status:0,durationMs:Math.max(0,t.now()-s.startedAt),failed:!0,reqBytes:s.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 T(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){return e.length<=p?e:`${e.slice(0,p)}...(+${String(e.length-p)} chars)`}function re(e,t){return(t?.method??(typeof e==`object`&&`method`in e?e.method:`GET`)).toUpperCase()}function ie(e){return typeof e==`string`||e instanceof URL?e.toString():e.url}function ae(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 oe(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 k(e,t){return i(e,t)}const A=e,se=new Set([`action`,`formaction`,`href`,`src`]);function ce(e){let t={emit:t=>{e.emit(le(t,e.redactUrlPatterns))},maskAllInputs:e.maskAllInputs,recordCanvas:!1,collectFonts:!1,sampling:{mousemove:!0,mouseInteraction:!0,scroll:150,media:800,input:`last`}};e.maskAllText?t.maskTextSelector=`*`:e.maskTextSelector!==void 0&&e.maskTextSelector.length>0&&(t.maskTextSelector=e.maskTextSelector),e.blockSelector!==void 0&&e.blockSelector.length>0&&(t.blockSelector=e.blockSelector),e.checkoutEveryNms!==void 0&&e.checkoutEveryNms>0&&(t.checkoutEveryNms=e.checkoutEveryNms);let n=A(t);if(n===void 0)throw Error(`logfire session replay: rrweb failed to start recording`);return{stop:()=>{n()},addCustomEvent:(e,t)=>{A.addCustomEvent?.(e,t)}}}function le(e,t){if(typeof e.data!=`object`||e.data===null)return e;let n=e.data;if(e.type===o.Meta){if(typeof n.href!=`string`)return e;let r=a(n.href,t,window.location.href);return r===n.href?e:{...e,data:{...n,href:r}}}if(e.type!==o.FullSnapshot&&(e.type!==o.IncrementalSnapshot||n.source!==s.Mutation))return e;let r=j(n,t);return r===n?e:{...e,data:r}}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)?ue(a,t):j(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,o]of Object.entries(n)){if(!se.has(e.toLowerCase())||typeof o!=`string`){i[e]=o;continue}let n=a(o,t,window.location.href);n!==o&&(r=!0),i[e]=n}return r?i:e}function M(e){return Number.isFinite(e)?Math.min(1,Math.max(0,e)):0}function de(e){let t=e.random??Math.random;return t()<M(e.sessionSampleRate)?`full`:t()<M(e.onErrorSampleRate)?`buffer`:`off`}function fe(e=Date.now){let t=e(),n=new Uint8Array(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/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 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 N=`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?P():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:fe(this.now),startedAt:e,lastActivityAt:e};return this.flushPendingStorage(),this.writeNow(t),t}read(){if(this.storage!==null)try{let e=this.storage.getItem(N);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(N,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 P(){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)}function F(e){return typeof e==`object`&&e?e:void 0}function I(e){return typeof e==`string`&&e.length>0?e:void 0}function L(e,t,n){let r=1/0,i=0,a=0,u=0,d=0,f=!1,p=new Set,m=new Set;for(let e of t){e.timestamp<r&&(r=e.timestamp),e.timestamp>i&&(i=e.timestamp);let t=F(e.data);if(e.type===o.FullSnapshot)f=!0;else if(e.type===o.Meta){let e=I(t?.href);e!==void 0&&p.add(e)}else if(e.type===o.IncrementalSnapshot&&t!==void 0){let e=t.source;if(e===s.MouseInteraction){let e=t.type;(e===c.Click||e===c.DblClick)&&a++}else e===s.Input&&u++}else if(e.type===o.Custom&&t!==void 0){let e=I(t.tag),n=F(t.payload);if(e===l.Error)d++;else if(e===l.Trace){let e=I(n?.traceId);e!==void 0&&m.add(e)}else if(e===l.Console)n?.level===`error`&&d++;else if(e===l.Navigation){let e=I(n?.url);e!==void 0&&p.add(e)}}}return{seq:e,firstTimestamp:r===1/0?0:r,lastTimestamp:i,eventCount:t.length,clickCount:a,keypressCount:u,errorCount:d,hasFullSnapshot:f,urls:[...p],traceIds:[...m],...n!==void 0&&n.length>0?{distinctId:n}:{}}}const R=`lf_session_replay_seq`,ge={gzip:t,gzipSync:n};var _e=class{buffer=[];pendingBytes=0;seq=0;timer;mode;flushing;reservedKeepaliveBytes=0;asyncCompressionAvailable=!0;config;compression;storage;sessionId;constructor(e,t,n,r=P(),i=ge){this.config=e,this.sessionId=t,this.mode=n,this.storage=r,this.compression=i,this.seq=this.loadSeq(t)}start(){this.timer!==void 0||this.mode!==`full`||(this.timer=setInterval(()=>{this.flushAndReport()},this.config.flushIntervalMs))}add(e){let t=V(e);if(this.mode===`buffer`){if(e.type===o.FullSnapshot){this.buffer=[e],this.pendingBytes=t;return}if(this.buffer.length===0||t>this.config.maxBufferBytes||this.pendingBytes+t>this.config.maxBufferBytes)return}this.buffer.push(e),this.pendingBytes+=t,this.mode===`full`&&this.pendingBytes>=this.config.maxBufferBytes&&this.flushAndReport()}async triggerFlush(){return this.mode===`buffer`&&(this.mode=`full`,this.start()),this.flush()}async flush(e={}){if(this.mode===`buffer`||this.buffer.length===0)return;let t=this.buffer;this.buffer=[],this.pendingBytes=0;let n=e.keepalive===!0?xe(t):[t],r=this.seq;this.seq+=n.length;let i=this.sessionId;this.saveSeq(i,this.seq);let a=e.keepalive===!0?Promise.resolve():this.flushing??Promise.resolve(),o=e.keepalive===!0?this.deliverLifecycle(n,r,i):a.then(async()=>{for(let e=0;e<n.length;e++){let t=n[e];t!==void 0&&await this.deliverOrdinary(t,r+e,i)}}),s=this.flushing;this.flushing=e.keepalive===!0&&s!==void 0?Promise.all([s,o]).then(()=>void 0,()=>void 0):o.catch(()=>void 0),await o}async shutdown(e={}){this.timer!==void 0&&(clearInterval(this.timer),this.timer=void 0),await this.flush(e),await this.flushing}discard(){this.timer!==void 0&&(clearInterval(this.timer),this.timer=void 0),this.buffer=[],this.pendingBytes=0}getMode(){return this.mode}flushAndReport(){this.flush().catch(e=>{z(this.config.onError,e)})}createEnvelope(e,t){let n=this.config.distinctId;if(this.config.getDistinctId!==void 0)try{n=this.config.getDistinctId()??this.config.distinctId}catch(e){z(this.config.onError,e)}return{version:1,meta:L(t,e,n),events:e}}async deliverOrdinary(e,t,n){let i=this.createEnvelope(e,t);try{let e=r(JSON.stringify(i)),a=await this.compressOrdinary(e);await this.sendWithRetry({body:a,lifecycle:!1,requestKeepalive:!1,reservedBytes:0,seq:t,sessionId:n})}catch(e){z(this.config.onError,e)}}async deliverLifecycle(e,t,n){let i=[];for(let a=0;a<e.length;a++){let o=e[a];if(o===void 0){i.push(void 0);continue}let s=this.createEnvelope(o,t+a);try{i.push({body:this.compression.gzipSync(r(JSON.stringify(s))),lifecycle:!0,requestKeepalive:!1,reservedBytes:0,seq:t+a,sessionId:n})}catch(e){z(this.config.onError,e),i.push(void 0)}}let a=!0,o=Math.max(0,48e3-this.reservedKeepaliveBytes);for(let e of i){if(e===void 0){a=!1;continue}a&&e.body.byteLength<=o?(e.requestKeepalive=!0,e.reservedBytes=e.body.byteLength,this.reservedKeepaliveBytes+=e.reservedBytes,o-=e.reservedBytes):a=!1}await Promise.all(i.map(async e=>{if(e!==void 0)try{await this.sendWithRetry(e)}catch(e){z(this.config.onError,e)}}))}async compressOrdinary(e){if(!this.asyncCompressionAvailable)return this.compression.gzipSync(e);try{return await Se(this.compression,e)}catch{return this.asyncCompressionAvailable=!1,this.compression.gzipSync(e)}}async sendWithRetry(e){let t=e.lifecycle?1:3;for(let n=1;n<=t;n++)try{await this.send(e);return}catch(e){let r=we(e,n);if(r===void 0||n>=t)throw e;await be(r)}}async send(e){let t,n,r,i=new AbortController,a=setTimeout(()=>{i.abort(Error(`replay upload timed out after 10000ms`))},1e4);try{let a=`${this.config.replayUrl.replace(/\/+$/u,``)}/${encodeURIComponent(e.sessionId)}?seq=${String(e.seq)}`,o=await this.getUploadHeaders(),s=this.config.fetchImpl(a,{method:`POST`,headers:o,body:e.body.slice(),keepalive:e.requestKeepalive,signal:i.signal});t=!0;let c=await s;if(n=!0,r=await Ce(c),!c.ok){let e=c.status===429?Te(c.headers.get(`retry-after`),Date.now()):void 0;throw new B(c.status,e)}}finally{clearTimeout(a),e.reservedBytes>0&&(t!==!0||n!==!0||r===!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 ye(this.config.token);return{...e,...t===void 0||t.length===0?{}:{Authorization:`Bearer ${t}`},"Content-Type":`application/json`,"Content-Encoding":`gzip`}}loadSeq(e){if(this.storage===null)return 0;try{let t=this.storage.getItem(R);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(R,JSON.stringify({id:e,seq:t}))}catch{}}};function z(e,t){try{let n=e?.(t);ve(n)&&Promise.resolve(n).catch(()=>void 0)}catch{}}function ve(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 ye(e){return typeof e==`function`?e():e}async function be(e){return new Promise(t=>{setTimeout(t,e)})}function V(e){try{return r(JSON.stringify(e)).byteLength}catch{return 0}}function xe(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 Se(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 Ce(e){if(e.body===null)return!0;try{return await e.body.cancel(),!0}catch{return!1}}function we(e,t){return e instanceof B?e.status===429?e.retryAfter?.kind===`too-long`?void 0:e.retryAfter?.kind===`delay`?e.retryAfter.milliseconds:500*t:e.status<500?void 0:500*t:500*t}function Te(e,t){if(e===null)return{kind:`fallback`};let n=e.trim();if(/^\d+$/u.test(n)){let e=Number(n);return Number.isSafeInteger(e)?H(e*1e3):{kind:`fallback`}}let r=ke(n,t);return r===void 0?{kind:`fallback`}:H(Math.max(0,r-t))}function H(e){return e>1e4?{kind:`too-long`}:{kind:`delay`,milliseconds:e}}const Ee=[`Jan`,`Feb`,`Mar`,`Apr`,`May`,`Jun`,`Jul`,`Aug`,`Sep`,`Oct`,`Nov`,`Dec`],De=[`Sun`,`Mon`,`Tue`,`Wed`,`Thu`,`Fri`,`Sat`],Oe=[`Sunday`,`Monday`,`Tuesday`,`Wednesday`,`Thursday`,`Friday`,`Saturday`];function ke(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 U(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),U(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 U(i[1],i[3]?.trim(),i[2],i[7],i[4],i[5],i[6])}function U(e,t,n,r,i,a,o){let s=Number(t),c=Ee.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=De.indexOf(e),h=Oe.indexOf(e);return(m>=0?m:h)===p.getUTCDay()?p.getTime():void 0}const Ae={mode:`off`,recording:!1,getSessionId:()=>``,flush:async()=>Promise.resolve(),stop:async()=>Promise.resolve()},W=`lf_session_replay_mode`,G=Symbol.for(`@pydantic/logfire-session-replay/controller`),K=1e3;function je(e){if(typeof window>`u`||typeof document>`u`)return Ae;let t=Re();try{let n=Ne(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=P(),s=a(!1),c,l=!1,u=Promise.resolve(),d,f=(e,t)=>{let r=Pe(n,e,o);if(!(r===`off`||l||e!==s))try{c=Me({config:n,getSessionId:a,mode:r,onSessionChanged:p,samplingModeStorage:o,sessionId:e})}catch(e){if(c=void 0,t)throw e;Z(n.onError,e)}},p=e=>{if(l||e===s)return;s=e;let t=c;c=void 0;let r=t?.deactivate()??Promise.resolve();u=u.then(async()=>{await X(r,n.onError),!l&&s===e&&f(e,!1)})},m;try{f(s,!0),m=setInterval(()=>{p(a(!1))},K)}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 X(e?.deactivate()??Promise.resolve(),n.onError),await u,r.flushPendingStorage(),t()})(),d)}}catch(e){throw t(),e}}function Me(e){let{config:t,getSessionId:n,mode:r,onSessionChanged:i,samplingModeStorage:a,sessionId:o}=e,s=new _e(t,o,r),c=[],u=!0,d=()=>u,f;try{let e=ce({emit:e=>{if(u)try{let t=n(!0);if(t!==o){i(t);return}s.add(e)}catch(e){Z(t.onError,e)}},maskAllText:t.maskAllText,maskAllInputs:t.maskAllInputs,maskTextSelector:t.maskTextSelector,blockSelector:t.blockSelector,checkoutEveryNms:r===`buffer`?12e4:0,redactUrlPatterns:t.redactUrlPatterns});c.push(()=>{e.stop()});let p=(n,r)=>{if(u)try{e.addCustomEvent(n,r)}catch(e){Z(t.onError,e)}},m;if(t.getTraceContext!==void 0){let e=setInterval(()=>{if(u)try{let e=t.getTraceContext?.(),n=e?.traceId;n!==void 0&&n.length>0&&n!==m&&(m=n,p(l.Trace,{traceId:n,spanId:e?.spanId}))}catch(e){Z(t.onError,e)}},K);c.push(()=>{clearInterval(e)})}let g=e=>{d()&&(p(l.Error,e),d()&&s.getMode()===`buffer`&&(q(a,o,`full`),Y(s.triggerFlush(),t.onError)))},_=e=>{e instanceof ErrorEvent&&g($(e.message,e.filename,Ie(e.error)))},v=e=>{let t=e.reason;g($(ze(t?.message??e.reason),void 0,typeof t?.stack==`string`?t.stack:void 0))},y=()=>{document.visibilityState===`hidden`&&Y(s.flush({keepalive:!0}),t.onError)},b=()=>{Y(s.flush({keepalive:!0}),t.onError)};return window.addEventListener(`error`,_,!0),c.push(()=>{window.removeEventListener(`error`,_,!0)}),window.addEventListener(`unhandledrejection`,v,!0),c.push(()=>{window.removeEventListener(`unhandledrejection`,v,!0)}),document.addEventListener(`visibilitychange`,y),c.push(()=>{document.removeEventListener(`visibilitychange`,y)}),window.addEventListener(`pagehide`,b),c.push(()=>{window.removeEventListener(`pagehide`,b)}),t.captureConsole&&c.push(h(p,{onError:t.onError})),t.captureNetwork&&c.push(ee(p,{ignoreUrlPatterns:t.ignoreUrlPatterns,now:t.now,onError:t.onError,redactUrlPatterns:t.redactUrlPatterns})),t.captureNavigation&&c.push(te(p,{onError:t.onError,redactUrlPatterns:t.redactUrlPatterns})),s.start(),{sessionId:o,transport:s,deactivate:async()=>(f??=(async()=>{u=!1,Q(c),await s.shutdown({keepalive:!1})})(),f),discard:()=>{u=!1,Q(c),s.discard()}}}catch(e){throw u=!1,Q(c),s.discard(),e}}function Ne(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,sessionSampleRate:e.sessionSampleRate??d.sessionSampleRate,onErrorSampleRate:e.onErrorSampleRate??d.onErrorSampleRate,maskAllText:e.maskAllText??d.maskAllText,maskAllInputs:e.maskAllInputs??d.maskAllInputs,maskTextSelector:e.maskTextSelector??d.maskTextSelector,blockSelector:e.blockSelector??d.blockSelector,flushIntervalMs:e.flushIntervalMs??d.flushIntervalMs,maxBufferBytes:e.maxBufferBytes??d.maxBufferBytes,sessionIdleTimeoutMs:e.sessionIdleTimeoutMs??d.sessionIdleTimeoutMs,maxSessionDurationMs:e.maxSessionDurationMs??d.maxSessionDurationMs,distinctId:e.distinctId??d.distinctId,getDistinctId:e.getDistinctId,getTraceContext:e.getTraceContext,captureConsole:e.captureConsole??d.captureConsole,captureNetwork:e.captureNetwork??d.captureNetwork,captureNavigation:e.captureNavigation??d.captureNavigation,ignoreUrlPatterns:e.ignoreUrlPatterns??[],redactUrlPatterns:e.redactUrlPatterns??[...d.redactUrlPatterns],onError:e.onError,fetchImpl:n,now:e.now??Date.now,random:e.random??Math.random}}function Pe(e,t,n){let r=Fe(n,t);if(r!==void 0)return r;let i=de({sessionSampleRate:e.sessionSampleRate,onErrorSampleRate:e.onErrorSampleRate,random:e.random});return q(n,t,i),i}function Fe(e,t){if(e!==null)try{let n=e.getItem(W);if(n===null)return;let r=JSON.parse(n);if(typeof r!=`object`||!r)return;let i=r;return i.id!==t||!J(i.mode)?void 0:i.mode}catch{return}}function q(e,t,n){if(e!==null)try{e.setItem(W,JSON.stringify({id:t,mode:n}))}catch{}}function J(e){return e===`full`||e===`buffer`||e===`off`}function Ie(e){let t=typeof e==`object`&&e&&`stack`in e?e.stack:void 0;return typeof t==`string`?t:void 0}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);Le(n)&&Promise.resolve(n).catch(()=>void 0)}catch{}}function Le(e){return typeof e==`object`&&!!e&&`then`in e&&typeof e.then==`function`}function Re(){let e=globalThis;if(e[G]!==void 0)throw Error(`logfire session replay: a replay controller is already active in this page`);let t={};Object.defineProperty(e,G,{configurable:!0,enumerable:!1,value:t,writable:!0});let n=!1;return()=>{n||(n=!0,e[G]===t&&Reflect.deleteProperty(e,G))}}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{u as CHUNK_ENVELOPE_VERSION,l as CustomTag,o as EventType,s as IncrementalSource,c as MouseInteractions,je as startSessionReplay};
package/package.json CHANGED
@@ -24,7 +24,7 @@
24
24
  "rum",
25
25
  "rrweb"
26
26
  ],
27
- "version": "0.1.0-alpha.0",
27
+ "version": "0.1.0",
28
28
  "type": "module",
29
29
  "main": "./dist/index.cjs",
30
30
  "module": "./dist/index.js",
@@ -41,26 +41,24 @@
41
41
  }
42
42
  }
43
43
  },
44
- "scripts": {
45
- "dev": "vp pack --watch",
46
- "build": "vp pack",
47
- "lint": "vp lint",
48
- "preview": "vp preview",
49
- "typecheck": "tsc",
50
- "prepack": "cp ../../LICENSE .",
51
- "postpublish": "rm LICENSE",
52
- "test": "vp test"
53
- },
54
44
  "dependencies": {
55
- "fflate": "catalog:",
56
- "rrweb": "catalog:"
45
+ "fflate": "^0.8.3",
46
+ "rrweb": "2.1.0"
57
47
  },
58
48
  "devDependencies": {
59
- "jsdom": "catalog:",
60
- "vitest": "catalog:"
49
+ "jsdom": "^29.1.1",
50
+ "vitest": "4.1.9"
61
51
  },
62
52
  "files": [
63
53
  "dist",
64
54
  "LICENSE"
65
- ]
66
- }
55
+ ],
56
+ "scripts": {
57
+ "dev": "vp pack --watch",
58
+ "build": "vp pack",
59
+ "lint": "vp lint",
60
+ "preview": "vp preview",
61
+ "typecheck": "tsc",
62
+ "test": "vp test"
63
+ }
64
+ }