@pydantic/logfire-session-replay 0.2.0 → 0.3.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
@@ -44,7 +44,7 @@ const replay = startSessionReplay({
44
44
  account_tier: currentAccount.tier,
45
45
  beta_user: currentUser.isBeta,
46
46
  }),
47
- getTraceContext: () => getCurrentTraceContext(),
47
+ getSessionId: () => getSharedBrowserSessionId(),
48
48
  })
49
49
 
50
50
  await replay.flush()
@@ -105,7 +105,6 @@ The decompressed body shape is:
105
105
  errorCount,
106
106
  hasFullSnapshot,
107
107
  urls,
108
- traceIds,
109
108
  distinctId,
110
109
  sessionAttributes,
111
110
  },
@@ -215,10 +214,9 @@ not automatically promote the replay buffer.
215
214
 
216
215
  Use `getSessionId` to share a session id with another SDK layer. The
217
216
  `@pydantic/logfire-browser` integration passes its browser RUM session id through
218
- this hook when top-level `sessionReplay` is configured.
219
-
220
- Use `getTraceContext` to stamp active trace ids into the replay stream so the
221
- replay can be linked to browser traces and errors.
217
+ this hook when top-level `sessionReplay` is configured. Other integrations must
218
+ record the same value as `browser.session.id` on their browser spans so Logfire
219
+ can correlate those spans with the replay over its time bounds.
222
220
 
223
221
  ## Browser SDK Integration
224
222
 
package/dist/index.cjs CHANGED
@@ -1 +1 @@
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(ee)},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=te(a,o),d=ne(a);if(O(d,t.ignoreUrlPatterns))return c.call(this,a,o);let f=r(d,t.redactUrlPatterns,window.location.href),p=D(o?.body);try{let n=await c.call(this,a,o);return i()&&y(e,s.Network,E({method:u,url:f,status:n.status,durationMs:Math.max(0,t.now()-l),reqBytes:p,resBytes:re(n.headers)}),t.onError),n}catch(n){throw i()&&y(e,s.Network,E({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 O(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=D(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,E({method:c.method,url:c.url,status:this.status,durationMs:Math.max(0,t.now()-c.startedAt),failed:c.failed||this.status===0,reqBytes:c.reqBytes,resBytes:ie(this)}),t.onError))};this.addEventListener(`error`,l),this.addEventListener(`abort`,l),this.addEventListener(`timeout`,l),this.addEventListener(`loadend`,u,{once:!0});try{return n.apply(this,a)}catch(n){throw this.removeEventListener(`error`,l),this.removeEventListener(`abort`,l),this.removeEventListener(`timeout`,l),this.removeEventListener(`loadend`,u),r()&&y(e,s.Network,E({method:c.method,url:c.url,status:0,durationMs:Math.max(0,t.now()-c.startedAt),failed:!0,reqBytes:c.reqBytes}),t.onError),n}})),C(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 ee(e){if(e==null)return String(e);if(typeof e==`string`)return T(e);if(typeof e==`number`||typeof e==`boolean`||typeof e==`bigint`)return String(e);if(e instanceof Error)return T(e.stack??`${e.name}: ${e.message}`);try{return T(JSON.stringify(e))}catch{return Object.prototype.toString.call(e)}}function T(e){return e.length<=u?e:`${e.slice(0,u)}...(+${String(e.length-u)} chars)`}function te(e,t){return(t?.method??(typeof e==`object`&&`method`in e?e.method:`GET`)).toUpperCase()}function ne(e){return typeof e==`string`||e instanceof URL?e.toString():e.url}function re(e){let t=e.get(`content-length`);if(t===null)return;let n=Number.parseInt(t,10);return Number.isFinite(n)?n:void 0}function ie(e){try{let t=e.getResponseHeader(`content-length`);if(t===null)return;let n=Number.parseInt(t,10);return Number.isFinite(n)?n:void 0}catch{return}}function E(e){return{method:e.method,url:e.url,status:e.status,durationMs:e.durationMs,...e.failed===void 0?{}:{failed:e.failed},...e.reqBytes===void 0?{}:{reqBytes:e.reqBytes},...e.resBytes===void 0?{}:{resBytes:e.resBytes}}}function D(e){if(e==null)return 0;if(typeof e==`string`)return new TextEncoder().encode(e).byteLength;if(e instanceof ArrayBuffer||ArrayBuffer.isView(e))return e.byteLength;if(e instanceof Blob)return e.size}function O(e,t){return n(e,t)}const k=e.record,ae=new Set([`action`,`formaction`,`href`,`src`]);function A(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=k(t);if(n===void 0)throw Error(`logfire session replay: rrweb failed to start recording`);return{stop:()=>{n()},addCustomEvent:(e,t)=>{k.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(!ae.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`}const le=/^[a-z][a-z0-9_]{0,63}$/u;function ue(e,t){let n=0;for(let r of e)if(n+=+(r.length>0),n>t)return!1;return!0}function de(e,t){if(e===void 0)return Object.freeze({});let n;try{n=e()}catch(e){return t(e),Object.freeze({})}if(typeof n!=`object`||!n||Array.isArray(n))return Object.freeze({});let r;try{r=Object.getPrototypeOf(n)}catch(e){return t(e),Object.freeze({})}if(r!==Object.prototype&&r!==null)return Object.freeze({});let i;try{i=Object.keys(n)}catch(e){return t(e),Object.freeze({})}let a={},o=0;for(let e of i){if(!le.test(e))continue;let r;try{r=Reflect.get(n,e)}catch(e){t(e);continue}if((typeof r==`boolean`||typeof r==`number`&&Number.isFinite(r)||typeof r==`string`&&ue(r,200))&&(a[e]=r,o+=1,o===20))break}return Object.freeze(a)}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,r={}){let c=1/0,l=0,u=0,d=0,f=0,p=!1,m=new Set,h=new Set;for(let e of t){e.timestamp<c&&(c=e.timestamp),e.timestamp>l&&(l=e.timestamp);let t=F(e.data);if(e.type===i.FullSnapshot)p=!0;else if(e.type===i.Meta){let e=I(t?.href);e!==void 0&&m.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)&&u++}else e===a.Input&&d++}else if(e.type===i.Custom&&t!==void 0){let e=I(t.tag),n=F(t.payload);if(e===s.Error)f++;else if(e===s.Trace){let e=I(n?.traceId);e!==void 0&&h.add(e)}else if(e===s.Console)n?.level===`error`&&f++;else if(e===s.Navigation){let e=I(n?.url);e!==void 0&&m.add(e)}}}return{seq:e,firstTimestamp:c===1/0?0:c,lastTimestamp:l,eventCount:t.length,clickCount:u,keypressCount:d,errorCount:f,hasFullSnapshot:p,urls:[...m],traceIds:[...h],...n!==void 0&&n.length>0?{distinctId:n}:{},...Object.keys(r).length===0?{}:{sessionAttributes:{...r}}}}const R=`lf_session_replay_seq`,ge={gzip:t.gzip,gzipSync:t.gzipSync};var _e=class{buffer=[];pendingBytes=0;seq=0;timer;mode;flushing;reservedKeepaliveBytes=0;asyncCompressionAvailable=!0;config;compression;storage;sessionId;sessionAttributes;constructor(e,t,n,r=P(),i=ge,a={}){this.config=e,this.sessionId=t,this.sessionAttributes=Object.freeze({...a}),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?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,this.sessionAttributes),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 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(0,t.strToU8)(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,c=new _e(t,o,r,void 0,void 0,de(t.getSessionAttributes,e=>{Z(t.onError,e)})),l=[],u=!0,d=()=>u,h;try{let e=A({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)}},K);l.push(()=>{clearInterval(e)})}let v=e=>{d()&&(g(s.Error,e),d()&&c.getMode()===`buffer`&&(q(a,o,`full`),Y(c.triggerFlush(),t.onError)))},y=e=>{e instanceof ErrorEvent&&v($(e.message,e.filename,Ie(e.error)))},b=e=>{let t=e.reason;v($(ze(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 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,getSessionAttributes:e.getSessionAttributes,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 Pe(e,t,n){let r=Fe(n,t);if(r!==void 0)return r;let i=ce({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)}}exports.CHUNK_ENVELOPE_VERSION=1,exports.CustomTag=s,exports.EventType=i,exports.IncrementalSource=a,exports.MouseInteractions=o,exports.startSessionReplay=je;
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`,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(ee)},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=te(a,o),d=ne(a);if(O(d,t.ignoreUrlPatterns))return c.call(this,a,o);let f=r(d,t.redactUrlPatterns,window.location.href),p=D(o?.body);try{let n=await c.call(this,a,o);return i()&&y(e,s.Network,E({method:u,url:f,status:n.status,durationMs:Math.max(0,t.now()-l),reqBytes:p,resBytes:re(n.headers)}),t.onError),n}catch(n){throw i()&&y(e,s.Network,E({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 O(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=D(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,E({method:c.method,url:c.url,status:this.status,durationMs:Math.max(0,t.now()-c.startedAt),failed:c.failed||this.status===0,reqBytes:c.reqBytes,resBytes:ie(this)}),t.onError))};this.addEventListener(`error`,l),this.addEventListener(`abort`,l),this.addEventListener(`timeout`,l),this.addEventListener(`loadend`,u,{once:!0});try{return n.apply(this,a)}catch(n){throw this.removeEventListener(`error`,l),this.removeEventListener(`abort`,l),this.removeEventListener(`timeout`,l),this.removeEventListener(`loadend`,u),r()&&y(e,s.Network,E({method:c.method,url:c.url,status:0,durationMs:Math.max(0,t.now()-c.startedAt),failed:!0,reqBytes:c.reqBytes}),t.onError),n}})),C(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 ee(e){if(e==null)return String(e);if(typeof e==`string`)return T(e);if(typeof e==`number`||typeof e==`boolean`||typeof e==`bigint`)return String(e);if(e instanceof Error)return T(e.stack??`${e.name}: ${e.message}`);try{return T(JSON.stringify(e))}catch{return Object.prototype.toString.call(e)}}function T(e){return e.length<=u?e:`${e.slice(0,u)}...(+${String(e.length-u)} chars)`}function te(e,t){return(t?.method??(typeof e==`object`&&`method`in e?e.method:`GET`)).toUpperCase()}function ne(e){return typeof e==`string`||e instanceof URL?e.toString():e.url}function re(e){let t=e.get(`content-length`);if(t===null)return;let n=Number.parseInt(t,10);return Number.isFinite(n)?n:void 0}function ie(e){try{let t=e.getResponseHeader(`content-length`);if(t===null)return;let n=Number.parseInt(t,10);return Number.isFinite(n)?n:void 0}catch{return}}function E(e){return{method:e.method,url:e.url,status:e.status,durationMs:e.durationMs,...e.failed===void 0?{}:{failed:e.failed},...e.reqBytes===void 0?{}:{reqBytes:e.reqBytes},...e.resBytes===void 0?{}:{resBytes:e.resBytes}}}function D(e){if(e==null)return 0;if(typeof e==`string`)return new TextEncoder().encode(e).byteLength;if(e instanceof ArrayBuffer||ArrayBuffer.isView(e))return e.byteLength;if(e instanceof Blob)return e.size}function O(e,t){return n(e,t)}const k=e.record,A=new Set([`action`,`formaction`,`href`,`src`]);function j(e){let t={emit:t=>{e.emit(ae(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=k(t);if(n===void 0)throw Error(`logfire session replay: rrweb failed to start recording`);return{stop:()=>{n()},addCustomEvent:(e,t)=>{k.addCustomEvent?.(e,t)}}}function ae(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=M(n,t);return o===n?e:{...e,data:o}}function M(e,t){if(Array.isArray(e)){let n=!1,r=[];for(let i of e){let e=M(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)?oe(a,t):M(a,t);n!==a&&(r=!0),i[e]=n}return r?i:e}function oe(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(!A.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 N(e){return Number.isFinite(e)?Math.min(1,Math.max(0,e)):0}function se(e){let t=e.random??Math.random;return t()<N(e.sessionSampleRate)?`full`:t()<N(e.onErrorSampleRate)?`buffer`:`off`}const ce=/^[a-z][a-z0-9_]{0,63}$/u;function le(e,t){let n=0;for(let r of e)if(n+=+(r.length>0),n>t)return!1;return!0}function ue(e,t){if(e===void 0)return Object.freeze({});let n;try{n=e()}catch(e){return t(e),Object.freeze({})}if(typeof n!=`object`||!n||Array.isArray(n))return Object.freeze({});let r;try{r=Object.getPrototypeOf(n)}catch(e){return t(e),Object.freeze({})}if(r!==Object.prototype&&r!==null)return Object.freeze({});let i;try{i=Object.keys(n)}catch(e){return t(e),Object.freeze({})}let a={},o=0;for(let e of i){if(!ce.test(e))continue;let r;try{r=Reflect.get(n,e)}catch(e){t(e);continue}if((typeof r==`boolean`||typeof r==`number`&&Number.isFinite(r)||typeof r==`string`&&le(r,200))&&(a[e]=r,o+=1,o===20))break}return Object.freeze(a)}function de(e=Date.now){let t=e(),n=new Uint8Array(new ArrayBuffer(16));fe(n),n[0]=Math.floor(t/2**40)&255,n[1]=Math.floor(t/2**32)&255,n[2]=Math.floor(t/2**24)&255,n[3]=Math.floor(t/2**16)&255,n[4]=Math.floor(t/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 fe(e){let t=globalThis.crypto;if(typeof t?.getRandomValues==`function`){t.getRandomValues(e);return}for(let t=0;t<e.length;t++)e[t]=Math.floor(Math.random()*256)}const P=`lf_session_replay`;var pe=class{idleTimeoutMs;maxDurationMs;now;storage;memorySession;pendingSession;persistenceTimer;constructor(e){this.idleTimeoutMs=e.idleTimeoutMs,this.maxDurationMs=e.maxDurationMs,this.now=e.now??Date.now,this.storage=e.storage===void 0?F():e.storage}getSession(){let e=this.now();if(this.memorySession!==void 0&&!this.isExpired(this.memorySession,e))return this.memorySession;let t=this.read();return t!==void 0&&!this.isExpired(t,e)?t:this.createSession(e)}touch(){let e=this.now(),t={...this.getSession(),lastActivityAt:e};return this.memorySession=t,this.scheduleWrite(t),t}reset(){return this.createSession(this.now())}flushPendingStorage(){this.persistenceTimer!==void 0&&(clearTimeout(this.persistenceTimer),this.persistenceTimer=void 0);let e=this.pendingSession;this.pendingSession=void 0,e!==void 0&&this.writeNow(e)}isExpired(e,t){return t-e.lastActivityAt>this.idleTimeoutMs||t-e.startedAt>this.maxDurationMs}createSession(e){let t={id:de(this.now),startedAt:e,lastActivityAt:e};return this.flushPendingStorage(),this.writeNow(t),t}read(){if(this.storage!==null)try{let e=this.storage.getItem(P);if(e!==null){let t=JSON.parse(e);if(me(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{}}scheduleWrite(e){this.pendingSession=e,this.persistenceTimer===void 0&&(this.persistenceTimer=setTimeout(()=>{this.persistenceTimer=void 0;let e=this.pendingSession;this.pendingSession=void 0,e!==void 0&&this.writeNow(e)},1e3))}writeNow(e){this.memorySession=e,this.write(e)}};function F(){try{return globalThis.sessionStorage??null}catch{return null}}function me(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 R(e,t,n,r={}){let c=1/0,l=0,u=0,d=0,f=0,p=!1,m=new Set;for(let e of t){e.timestamp<c&&(c=e.timestamp),e.timestamp>l&&(l=e.timestamp);let t=I(e.data);if(e.type===i.FullSnapshot)p=!0;else if(e.type===i.Meta){let e=L(t?.href);e!==void 0&&m.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)&&u++}else e===a.Input&&d++}else if(e.type===i.Custom&&t!==void 0){let e=L(t.tag),n=I(t.payload);if(e===s.Error)f++;else if(e===s.Console)n?.level===`error`&&f++;else if(e===s.Navigation){let e=L(n?.url);e!==void 0&&m.add(e)}}}return{seq:e,firstTimestamp:c===1/0?0:c,lastTimestamp:l,eventCount:t.length,clickCount:u,keypressCount:d,errorCount:f,hasFullSnapshot:p,urls:[...m],...n!==void 0&&n.length>0?{distinctId:n}:{},...Object.keys(r).length===0?{}:{sessionAttributes:{...r}}}}const z=`lf_session_replay_seq`,he={gzip:t.gzip,gzipSync:t.gzipSync};var ge=class{buffer=[];pendingBytes=0;seq=0;timer;mode;flushing;reservedKeepaliveBytes=0;asyncCompressionAvailable=!0;config;compression;storage;sessionId;sessionAttributes;constructor(e,t,n,r=F(),i=he,a={}){this.config=e,this.sessionId=t,this.sessionAttributes=Object.freeze({...a}),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=H(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?be(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=>{B(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){B(this.config.onError,e)}return{version:1,meta:R(t,e,n,this.sessionAttributes),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){B(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){B(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){B(this.config.onError,e)}}))}async compressOrdinary(e){if(!this.asyncCompressionAvailable)return this.compression.gzipSync(e);try{return await xe(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=Ce(e,n);if(r===void 0||n>=t)throw e;await ye(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 Se(c),!c.ok){let e=c.status===429?we(c.headers.get(`retry-after`),Date.now()):void 0;throw new V(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 ve(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{}}};function B(e,t){try{let n=e?.(t);_e(n)&&Promise.resolve(n).catch(()=>void 0)}catch{}}function _e(e){return typeof e==`object`&&!!e&&`then`in e&&typeof e.then==`function`}var V=class extends Error{retryAfter;status;constructor(e,t){super(`replay ingest failed: ${String(e)}`),this.status=e,this.retryAfter=t,this.name=`ReplayIngestError`}};async function ve(e){return typeof e==`function`?e():e}async function ye(e){return new Promise(t=>{setTimeout(t,e)})}function H(e){try{return(0,t.strToU8)(JSON.stringify(e)).byteLength}catch{return 0}}function be(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 xe(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 Se(e){if(e.body===null)return!0;try{return await e.body.cancel(),!0}catch{return!1}}function Ce(e,t){return e instanceof V?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 we(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=Oe(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 Te=[`Jan`,`Feb`,`Mar`,`Apr`,`May`,`Jun`,`Jul`,`Aug`,`Sep`,`Oct`,`Nov`,`Dec`],Ee=[`Sun`,`Mon`,`Tue`,`Wed`,`Thu`,`Fri`,`Sat`],De=[`Sunday`,`Monday`,`Tuesday`,`Wednesday`,`Thursday`,`Friday`,`Saturday`];function Oe(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=Te.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=Ee.indexOf(e),h=De.indexOf(e);return(m>=0?m:h)===p.getUTCDay()?p.getTime():void 0}const ke={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`);function Ae(e){if(typeof window>`u`||typeof document>`u`)return ke;let t=Le();try{let n=Me(e),r=new pe({idleTimeoutMs:n.sessionIdleTimeoutMs,maxDurationMs:n.maxSessionDurationMs,now:n.now}),i=r.getSession().id,a=e=>{let t;try{t=n.getSessionId?.()}catch(e){return Z(n.onError,e),i}if(t!==void 0&&t.length>0)return i=t,t;let a=e?r.touch().id:r.getSession().id;return i=a,a},o=F(),s=a(!1),c,l=!1,u=Promise.resolve(),d,f=(e,t)=>{let r=Ne(n,e,o);if(!(r===`off`||l||e!==s))try{c=je({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))},1e3)}catch(e){throw c?.discard(),c=void 0,e}return{get mode(){try{return c?.transport.getMode()??`off`}catch(e){return Z(n.onError,e),`off`}},get recording(){try{return c!==void 0}catch(e){return Z(n.onError,e),!1}},getSessionId:()=>a(!1),flush:async()=>{try{await u,await c?.transport.flush()}catch(e){Z(n.onError,e)}},stop:async()=>(d??=(async()=>{l=!0,clearInterval(m);let e=c;c=void 0,await X(e?.deactivate()??Promise.resolve(),n.onError),await u,r.flushPendingStorage(),t()})(),d)}}catch(e){throw t(),e}}function je(e){let{config:t,getSessionId:n,mode:r,onSessionChanged:i,samplingModeStorage:a,sessionId:o}=e,c=new ge(t,o,r,void 0,void 0,ue(t.getSessionAttributes,e=>{Z(t.onError,e)})),l=[],u=!0,d=()=>u,h;try{let e=j({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)}},_=e=>{d()&&(g(s.Error,e),d()&&c.getMode()===`buffer`&&(J(a,o,`full`),Y(c.triggerFlush(),t.onError)))},v=e=>{e instanceof ErrorEvent&&_($(e.message,e.filename,Fe(e.error)))},y=e=>{let t=e.reason;_($(Re(t?.message??e.reason),void 0,typeof t?.stack==`string`?t.stack:void 0))},b=()=>{document.visibilityState===`hidden`&&Y(c.flush({keepalive:!0}),t.onError)},x=()=>{Y(c.flush({keepalive:!0}),t.onError)};return window.addEventListener(`error`,v,!0),l.push(()=>{window.removeEventListener(`error`,v,!0)}),window.addEventListener(`unhandledrejection`,y,!0),l.push(()=>{window.removeEventListener(`unhandledrejection`,y,!0)}),document.addEventListener(`visibilitychange`,b),l.push(()=>{document.removeEventListener(`visibilitychange`,b)}),window.addEventListener(`pagehide`,x),l.push(()=>{window.removeEventListener(`pagehide`,x)}),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 Me(e){if(e.replayUrl.length===0)throw Error("logfire session replay: `replayUrl` is required");let t=new URL(e.replayUrl,`https://logfire.invalid/`);if(t.search!==``||t.hash!==``)throw Error("logfire session replay: `replayUrl` must not contain a query or fragment");let n=e.fetchImpl??(typeof fetch==`function`?fetch.bind(globalThis):void 0);if(n===void 0)throw Error("logfire session replay: no `fetch` available; pass `fetchImpl`");return{replayUrl:e.replayUrl,headers:e.headers,token:e.token,getSessionId:e.getSessionId,getSessionAttributes:e.getSessionAttributes,sessionSampleRate:e.sessionSampleRate??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,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 Ne(e,t,n){let r=q(n,t);if(r!==void 0)return r;let i=se({sessionSampleRate:e.sessionSampleRate,onErrorSampleRate:e.onErrorSampleRate,random:e.random});return J(n,t,i),i}function q(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||!Pe(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 Pe(e){return e===`full`||e===`buffer`||e===`off`}function Fe(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);Ie(n)&&Promise.resolve(n).catch(()=>void 0)}catch{}}function Ie(e){return typeof e==`object`&&!!e&&`then`in e&&typeof e.then==`function`}function Le(){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 Re(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=Ae;
package/dist/index.d.cts CHANGED
@@ -30,7 +30,6 @@ declare const MouseInteractions: {
30
30
  };
31
31
  declare const CustomTag: {
32
32
  readonly Error: "logfire.error";
33
- readonly Trace: "logfire.trace";
34
33
  readonly Console: "logfire.console";
35
34
  readonly Network: "logfire.network";
36
35
  readonly Navigation: "logfire.navigation";
@@ -70,7 +69,6 @@ interface ChunkMeta {
70
69
  errorCount: number;
71
70
  hasFullSnapshot: boolean;
72
71
  urls: string[];
73
- traceIds: string[];
74
72
  distinctId?: string;
75
73
  sessionAttributes?: SessionAttributes;
76
74
  }
@@ -128,10 +126,6 @@ interface SessionReplayConfig {
128
126
  maxSessionDurationMs?: number;
129
127
  distinctId?: string;
130
128
  getDistinctId?: () => string | undefined;
131
- getTraceContext?: () => {
132
- traceId?: string;
133
- spanId?: string;
134
- } | undefined;
135
129
  captureConsole?: boolean;
136
130
  captureNetwork?: boolean;
137
131
  captureNavigation?: boolean;
package/dist/index.d.ts CHANGED
@@ -30,7 +30,6 @@ declare const MouseInteractions: {
30
30
  };
31
31
  declare const CustomTag: {
32
32
  readonly Error: "logfire.error";
33
- readonly Trace: "logfire.trace";
34
33
  readonly Console: "logfire.console";
35
34
  readonly Network: "logfire.network";
36
35
  readonly Navigation: "logfire.navigation";
@@ -70,7 +69,6 @@ interface ChunkMeta {
70
69
  errorCount: number;
71
70
  hasFullSnapshot: boolean;
72
71
  urls: string[];
73
- traceIds: string[];
74
72
  distinctId?: string;
75
73
  sessionAttributes?: SessionAttributes;
76
74
  }
@@ -128,10 +126,6 @@ interface SessionReplayConfig {
128
126
  maxSessionDurationMs?: number;
129
127
  distinctId?: string;
130
128
  getDistinctId?: () => string | undefined;
131
- getTraceContext?: () => {
132
- traceId?: string;
133
- spanId?: string;
134
- } | undefined;
135
129
  captureConsole?: boolean;
136
130
  captureNetwork?: boolean;
137
131
  captureNavigation?: boolean;
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";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(re)},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=ie(i,o),d=E(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 re(e){if(e==null)return String(e);if(typeof e==`string`)return T(e);if(typeof e==`number`||typeof e==`boolean`||typeof e==`bigint`)return String(e);if(e instanceof Error)return T(e.stack??`${e.name}: ${e.message}`);try{return T(JSON.stringify(e))}catch{return Object.prototype.toString.call(e)}}function T(e){return e.length<=p?e:`${e.slice(0,p)}...(+${String(e.length-p)} chars)`}function ie(e,t){return(t?.method??(typeof e==`object`&&`method`in e?e.method:`GET`)).toUpperCase()}function E(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`}const fe=/^[a-z][a-z0-9_]{0,63}$/u;function pe(e,t){let n=0;for(let r of e)if(n+=+(r.length>0),n>t)return!1;return!0}function me(e,t){if(e===void 0)return Object.freeze({});let n;try{n=e()}catch(e){return t(e),Object.freeze({})}if(typeof n!=`object`||!n||Array.isArray(n))return Object.freeze({});let r;try{r=Object.getPrototypeOf(n)}catch(e){return t(e),Object.freeze({})}if(r!==Object.prototype&&r!==null)return Object.freeze({});let i;try{i=Object.keys(n)}catch(e){return t(e),Object.freeze({})}let a={},o=0;for(let e of i){if(!fe.test(e))continue;let r;try{r=Reflect.get(n,e)}catch(e){t(e);continue}if((typeof r==`boolean`||typeof r==`number`&&Number.isFinite(r)||typeof r==`string`&&pe(r,200))&&(a[e]=r,o+=1,o===20))break}return Object.freeze(a)}function he(e=Date.now){let t=e(),n=new Uint8Array(new ArrayBuffer(16));ge(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 ge(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 _e=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:he(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(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(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 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 ve(e,t,n,r={}){let i=1/0,a=0,u=0,d=0,f=0,p=!1,m=new Set,h=new Set;for(let e of t){e.timestamp<i&&(i=e.timestamp),e.timestamp>a&&(a=e.timestamp);let t=I(e.data);if(e.type===o.FullSnapshot)p=!0;else if(e.type===o.Meta){let e=L(t?.href);e!==void 0&&m.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)&&u++}else e===s.Input&&d++}else if(e.type===o.Custom&&t!==void 0){let e=L(t.tag),n=I(t.payload);if(e===l.Error)f++;else if(e===l.Trace){let e=L(n?.traceId);e!==void 0&&h.add(e)}else if(e===l.Console)n?.level===`error`&&f++;else if(e===l.Navigation){let e=L(n?.url);e!==void 0&&m.add(e)}}}return{seq:e,firstTimestamp:i===1/0?0:i,lastTimestamp:a,eventCount:t.length,clickCount:u,keypressCount:d,errorCount:f,hasFullSnapshot:p,urls:[...m],traceIds:[...h],...n!==void 0&&n.length>0?{distinctId:n}:{},...Object.keys(r).length===0?{}:{sessionAttributes:{...r}}}}const R=`lf_session_replay_seq`,ye={gzip:t,gzipSync:n};var be=class{buffer=[];pendingBytes=0;seq=0;timer;mode;flushing;reservedKeepaliveBytes=0;asyncCompressionAvailable=!0;config;compression;storage;sessionId;sessionAttributes;constructor(e,t,n,r=P(),i=ye,a={}){this.config=e,this.sessionId=t,this.sessionAttributes=Object.freeze({...a}),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=H(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?Ce(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:ve(t,e,n,this.sessionAttributes),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 we(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=Ee(e,n);if(r===void 0||n>=t)throw e;await Se(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 Te(c),!c.ok){let e=c.status===429?De(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 V(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);xe(n)&&Promise.resolve(n).catch(()=>void 0)}catch{}}function xe(e){return typeof e==`object`&&!!e&&`then`in e&&typeof e.then==`function`}var 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 V(e){return typeof e==`function`?e():e}async function Se(e){return new Promise(t=>{setTimeout(t,e)})}function H(e){try{return r(JSON.stringify(e)).byteLength}catch{return 0}}function Ce(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 we(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 Te(e){if(e.body===null)return!0;try{return await e.body.cancel(),!0}catch{return!1}}function Ee(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 De(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=je(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 Oe=[`Jan`,`Feb`,`Mar`,`Apr`,`May`,`Jun`,`Jul`,`Aug`,`Sep`,`Oct`,`Nov`,`Dec`],ke=[`Sun`,`Mon`,`Tue`,`Wed`,`Thu`,`Fri`,`Sat`],Ae=[`Sunday`,`Monday`,`Tuesday`,`Wednesday`,`Thursday`,`Friday`,`Saturday`];function je(e,t){let n=/^(Sun|Mon|Tue|Wed|Thu|Fri|Sat), (\d{2}) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) (\d{4}) (\d{2}):(\d{2}):(\d{2}) GMT$/u.exec(e);if(n!==null)return 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=Oe.indexOf(n),l=Number(r),u=Number(i),d=Number(a),f=Number(o);if(c<0||s<1||s>31||u>23||d>59||f>59)return;let p=new Date(0);if(p.setUTCFullYear(l,c,s),p.setUTCHours(u,d,f,0),p.getUTCFullYear()!==l||p.getUTCMonth()!==c||p.getUTCDate()!==s||p.getUTCHours()!==u||p.getUTCMinutes()!==d||p.getUTCSeconds()!==f)return;let m=ke.indexOf(e),h=Ae.indexOf(e);return(m>=0?m:h)===p.getUTCDay()?p.getTime():void 0}const Me={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 Ne(e){if(typeof window>`u`||typeof document>`u`)return Me;let t=Ve();try{let n=Fe(e),r=new _e({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=Ie(n,e,o);if(!(r===`off`||l||e!==s))try{c=Pe({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 Pe(e){let{config:t,getSessionId:n,mode:r,onSessionChanged:i,samplingModeStorage:a,sessionId:o}=e,s=new be(t,o,r,void 0,void 0,me(t.getSessionAttributes,e=>{Z(t.onError,e)})),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)}},q);c.push(()=>{clearInterval(e)})}let g=e=>{d()&&(p(l.Error,e),d()&&s.getMode()===`buffer`&&(J(a,o,`full`),Y(s.triggerFlush(),t.onError)))},_=e=>{e instanceof ErrorEvent&&g($(e.message,e.filename,ze(e.error)))},v=e=>{let t=e.reason;g($(He(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 Fe(e){if(e.replayUrl.length===0)throw Error("logfire session replay: `replayUrl` is required");let t=new URL(e.replayUrl,`https://logfire.invalid/`);if(t.search!==``||t.hash!==``)throw Error("logfire session replay: `replayUrl` must not contain a query or fragment");let n=e.fetchImpl??(typeof fetch==`function`?fetch.bind(globalThis):void 0);if(n===void 0)throw Error("logfire session replay: no `fetch` available; pass `fetchImpl`");return{replayUrl:e.replayUrl,headers:e.headers,token:e.token,getSessionId:e.getSessionId,getSessionAttributes:e.getSessionAttributes,sessionSampleRate:e.sessionSampleRate??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 Ie(e,t,n){let r=Le(n,t);if(r!==void 0)return r;let i=de({sessionSampleRate:e.sessionSampleRate,onErrorSampleRate:e.onErrorSampleRate,random:e.random});return J(n,t,i),i}function Le(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||!Re(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 Re(e){return e===`full`||e===`buffer`||e===`off`}function ze(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);Be(n)&&Promise.resolve(n).catch(()=>void 0)}catch{}}function Be(e){return typeof e==`object`&&!!e&&`then`in e&&typeof e.then==`function`}function Ve(){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 He(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,Ne 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`,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(re)},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=ie(i,o),d=E(i);if(A(d,t.ignoreUrlPatterns))return s.call(this,i,o);let f=a(d,t.redactUrlPatterns,window.location.href),p=k(o?.body);try{let n=await s.call(this,i,o);return r()&&b(e,l.Network,O({method:u,url:f,status:n.status,durationMs:Math.max(0,t.now()-c),reqBytes:p,resBytes:D(n.headers)}),t.onError),n}catch(n){throw r()&&b(e,l.Network,O({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 A(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=k(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,O({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:ae(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,O({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 re(e){if(e==null)return String(e);if(typeof e==`string`)return T(e);if(typeof e==`number`||typeof e==`boolean`||typeof e==`bigint`)return String(e);if(e instanceof Error)return T(e.stack??`${e.name}: ${e.message}`);try{return T(JSON.stringify(e))}catch{return Object.prototype.toString.call(e)}}function T(e){return e.length<=p?e:`${e.slice(0,p)}...(+${String(e.length-p)} chars)`}function ie(e,t){return(t?.method??(typeof e==`object`&&`method`in e?e.method:`GET`)).toUpperCase()}function E(e){return typeof e==`string`||e instanceof URL?e.toString():e.url}function D(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 ae(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 O(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 k(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 A(e,t){return i(e,t)}const j=e,oe=new Set([`action`,`formaction`,`href`,`src`]);function se(e){let t={emit:t=>{e.emit(ce(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=j(t);if(n===void 0)throw Error(`logfire session replay: rrweb failed to start recording`);return{stop:()=>{n()},addCustomEvent:(e,t)=>{j.addCustomEvent?.(e,t)}}}function ce(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=M(n,t);return r===n?e:{...e,data:r}}function M(e,t){if(Array.isArray(e)){let n=!1,r=[];for(let i of e){let e=M(i,t);e!==i&&(n=!0),r.push(e)}return n?r:e}if(typeof e!=`object`||!e)return e;let n=e,r=!1,i={};for(let[e,a]of Object.entries(n)){let n=e===`attributes`&&!Array.isArray(a)?le(a,t):M(a,t);n!==a&&(r=!0),i[e]=n}return r?i:e}function le(e,t){if(typeof e!=`object`||!e||Array.isArray(e))return e;let n=e,r=!1,i={};for(let[e,o]of Object.entries(n)){if(!oe.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 N(e){return Number.isFinite(e)?Math.min(1,Math.max(0,e)):0}function ue(e){let t=e.random??Math.random;return t()<N(e.sessionSampleRate)?`full`:t()<N(e.onErrorSampleRate)?`buffer`:`off`}const de=/^[a-z][a-z0-9_]{0,63}$/u;function fe(e,t){let n=0;for(let r of e)if(n+=+(r.length>0),n>t)return!1;return!0}function pe(e,t){if(e===void 0)return Object.freeze({});let n;try{n=e()}catch(e){return t(e),Object.freeze({})}if(typeof n!=`object`||!n||Array.isArray(n))return Object.freeze({});let r;try{r=Object.getPrototypeOf(n)}catch(e){return t(e),Object.freeze({})}if(r!==Object.prototype&&r!==null)return Object.freeze({});let i;try{i=Object.keys(n)}catch(e){return t(e),Object.freeze({})}let a={},o=0;for(let e of i){if(!de.test(e))continue;let r;try{r=Reflect.get(n,e)}catch(e){t(e);continue}if((typeof r==`boolean`||typeof r==`number`&&Number.isFinite(r)||typeof r==`string`&&fe(r,200))&&(a[e]=r,o+=1,o===20))break}return Object.freeze(a)}function me(e=Date.now){let t=e(),n=new Uint8Array(new ArrayBuffer(16));he(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 he(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 ge=class{idleTimeoutMs;maxDurationMs;now;storage;memorySession;pendingSession;persistenceTimer;constructor(e){this.idleTimeoutMs=e.idleTimeoutMs,this.maxDurationMs=e.maxDurationMs,this.now=e.now??Date.now,this.storage=e.storage===void 0?F():e.storage}getSession(){let e=this.now();if(this.memorySession!==void 0&&!this.isExpired(this.memorySession,e))return this.memorySession;let t=this.read();return t!==void 0&&!this.isExpired(t,e)?t:this.createSession(e)}touch(){let e=this.now(),t={...this.getSession(),lastActivityAt:e};return this.memorySession=t,this.scheduleWrite(t),t}reset(){return this.createSession(this.now())}flushPendingStorage(){this.persistenceTimer!==void 0&&(clearTimeout(this.persistenceTimer),this.persistenceTimer=void 0);let e=this.pendingSession;this.pendingSession=void 0,e!==void 0&&this.writeNow(e)}isExpired(e,t){return t-e.lastActivityAt>this.idleTimeoutMs||t-e.startedAt>this.maxDurationMs}createSession(e){let t={id:me(this.now),startedAt:e,lastActivityAt:e};return this.flushPendingStorage(),this.writeNow(t),t}read(){if(this.storage!==null)try{let e=this.storage.getItem(P);if(e!==null){let t=JSON.parse(e);if(I(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{}}scheduleWrite(e){this.pendingSession=e,this.persistenceTimer===void 0&&(this.persistenceTimer=setTimeout(()=>{this.persistenceTimer=void 0;let e=this.pendingSession;this.pendingSession=void 0,e!==void 0&&this.writeNow(e)},1e3))}writeNow(e){this.memorySession=e,this.write(e)}};function F(){try{return globalThis.sessionStorage??null}catch{return null}}function I(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 _e(e,t,n,r={}){let i=1/0,a=0,u=0,d=0,f=0,p=!1,m=new Set;for(let e of t){e.timestamp<i&&(i=e.timestamp),e.timestamp>a&&(a=e.timestamp);let t=L(e.data);if(e.type===o.FullSnapshot)p=!0;else if(e.type===o.Meta){let e=R(t?.href);e!==void 0&&m.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)&&u++}else e===s.Input&&d++}else if(e.type===o.Custom&&t!==void 0){let e=R(t.tag),n=L(t.payload);if(e===l.Error)f++;else if(e===l.Console)n?.level===`error`&&f++;else if(e===l.Navigation){let e=R(n?.url);e!==void 0&&m.add(e)}}}return{seq:e,firstTimestamp:i===1/0?0:i,lastTimestamp:a,eventCount:t.length,clickCount:u,keypressCount:d,errorCount:f,hasFullSnapshot:p,urls:[...m],...n!==void 0&&n.length>0?{distinctId:n}:{},...Object.keys(r).length===0?{}:{sessionAttributes:{...r}}}}const z=`lf_session_replay_seq`,ve={gzip:t,gzipSync:n};var ye=class{buffer=[];pendingBytes=0;seq=0;timer;mode;flushing;reservedKeepaliveBytes=0;asyncCompressionAvailable=!0;config;compression;storage;sessionId;sessionAttributes;constructor(e,t,n,r=F(),i=ve,a={}){this.config=e,this.sessionId=t,this.sessionAttributes=Object.freeze({...a}),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=U(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?Se(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=>{B(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){B(this.config.onError,e)}return{version:1,meta:_e(t,e,n,this.sessionAttributes),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){B(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){B(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){B(this.config.onError,e)}}))}async compressOrdinary(e){if(!this.asyncCompressionAvailable)return this.compression.gzipSync(e);try{return await Ce(this.compression,e)}catch{return this.asyncCompressionAvailable=!1,this.compression.gzipSync(e)}}async 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=Te(e,n);if(r===void 0||n>=t)throw e;await H(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 we(c),!c.ok){let e=c.status===429?Ee(c.headers.get(`retry-after`),Date.now()):void 0;throw new V(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 xe(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{}}};function B(e,t){try{let n=e?.(t);be(n)&&Promise.resolve(n).catch(()=>void 0)}catch{}}function be(e){return typeof e==`object`&&!!e&&`then`in e&&typeof e.then==`function`}var V=class extends Error{retryAfter;status;constructor(e,t){super(`replay ingest failed: ${String(e)}`),this.status=e,this.retryAfter=t,this.name=`ReplayIngestError`}};async function xe(e){return typeof e==`function`?e():e}async function H(e){return new Promise(t=>{setTimeout(t,e)})}function U(e){try{return r(JSON.stringify(e)).byteLength}catch{return 0}}function Se(e){let t=[],n=[],r=0;for(let i of e){let e=U(i);n.length>0&&r+e>48e3&&(t.push(n),n=[],r=0),n.push(i),r+=e}return n.length>0&&t.push(n),t}async function Ce(e,t){return new Promise((n,r)=>{let i=[];typeof window<`u`&&i.push(window),typeof document<`u`&&i.push(document);let a=()=>{for(let e of i)e.removeEventListener(`securitypolicyviolation`,s)},o=(e,t)=>{if(a(),e!==null){r(e);return}n(t)},s=e=>{let t=e;(t.effectiveDirective.includes(`worker-src`)||t.violatedDirective.includes(`worker-src`))&&o(Error(`replay compression worker blocked by Content Security Policy`))};for(let e of i)e.addEventListener(`securitypolicyviolation`,s);try{e.gzip(t,{level:6},(e,t)=>{o(e,t)})}catch(e){a(),r(e instanceof Error?e:Error(String(e)))}})}async function we(e){if(e.body===null)return!0;try{return await e.body.cancel(),!0}catch{return!1}}function Te(e,t){return e instanceof V?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 Ee(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)?W(e*1e3):{kind:`fallback`}}let r=Ae(n,t);return r===void 0?{kind:`fallback`}:W(Math.max(0,r-t))}function W(e){return e>1e4?{kind:`too-long`}:{kind:`delay`,milliseconds:e}}const De=[`Jan`,`Feb`,`Mar`,`Apr`,`May`,`Jun`,`Jul`,`Aug`,`Sep`,`Oct`,`Nov`,`Dec`],Oe=[`Sun`,`Mon`,`Tue`,`Wed`,`Thu`,`Fri`,`Sat`],ke=[`Sunday`,`Monday`,`Tuesday`,`Wednesday`,`Thursday`,`Friday`,`Saturday`];function Ae(e,t){let n=/^(Sun|Mon|Tue|Wed|Thu|Fri|Sat), (\d{2}) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) (\d{4}) (\d{2}):(\d{2}):(\d{2}) GMT$/u.exec(e);if(n!==null)return G(n[1],n[2],n[3],n[4],n[5],n[6],n[7]);let r=/^(Sunday|Monday|Tuesday|Wednesday|Thursday|Friday|Saturday), (\d{2})-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-(\d{2}) (\d{2}):(\d{2}):(\d{2}) GMT$/u.exec(e);if(r!==null){let e=new Date(t).getUTCFullYear(),n=Number(r[4]),i=Math.floor(e/100)*100+n;return i>e+50&&(i-=100),G(r[1],r[2],r[3],String(i),r[5],r[6],r[7])}let i=/^(Sun|Mon|Tue|Wed|Thu|Fri|Sat) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) (\d{2}| \d) (\d{2}):(\d{2}):(\d{2}) (\d{4})$/u.exec(e);if(i!==null)return G(i[1],i[3]?.trim(),i[2],i[7],i[4],i[5],i[6])}function G(e,t,n,r,i,a,o){let s=Number(t),c=De.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=Oe.indexOf(e),h=ke.indexOf(e);return(m>=0?m:h)===p.getUTCDay()?p.getTime():void 0}const je={mode:`off`,recording:!1,getSessionId:()=>``,flush:async()=>Promise.resolve(),stop:async()=>Promise.resolve()},K=`lf_session_replay_mode`,q=Symbol.for(`@pydantic/logfire-session-replay/controller`);function Me(e){if(typeof window>`u`||typeof document>`u`)return je;let t=Be();try{let n=Pe(e),r=new ge({idleTimeoutMs:n.sessionIdleTimeoutMs,maxDurationMs:n.maxSessionDurationMs,now:n.now}),i=r.getSession().id,a=e=>{let t;try{t=n.getSessionId?.()}catch(e){return Z(n.onError,e),i}if(t!==void 0&&t.length>0)return i=t,t;let a=e?r.touch().id:r.getSession().id;return i=a,a},o=F(),s=a(!1),c,l=!1,u=Promise.resolve(),d,f=(e,t)=>{let r=Fe(n,e,o);if(!(r===`off`||l||e!==s))try{c=Ne({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))},1e3)}catch(e){throw c?.discard(),c=void 0,e}return{get mode(){try{return c?.transport.getMode()??`off`}catch(e){return Z(n.onError,e),`off`}},get recording(){try{return c!==void 0}catch(e){return Z(n.onError,e),!1}},getSessionId:()=>a(!1),flush:async()=>{try{await u,await c?.transport.flush()}catch(e){Z(n.onError,e)}},stop:async()=>(d??=(async()=>{l=!0,clearInterval(m);let e=c;c=void 0,await X(e?.deactivate()??Promise.resolve(),n.onError),await u,r.flushPendingStorage(),t()})(),d)}}catch(e){throw t(),e}}function Ne(e){let{config:t,getSessionId:n,mode:r,onSessionChanged:i,samplingModeStorage:a,sessionId:o}=e,s=new ye(t,o,r,void 0,void 0,pe(t.getSessionAttributes,e=>{Z(t.onError,e)})),c=[],u=!0,d=()=>u,f;try{let e=se({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=e=>{d()&&(p(l.Error,e),d()&&s.getMode()===`buffer`&&(J(a,o,`full`),Y(s.triggerFlush(),t.onError)))},g=e=>{e instanceof ErrorEvent&&m($(e.message,e.filename,Re(e.error)))},_=e=>{let t=e.reason;m($(Ve(t?.message??e.reason),void 0,typeof t?.stack==`string`?t.stack:void 0))},v=()=>{document.visibilityState===`hidden`&&Y(s.flush({keepalive:!0}),t.onError)},y=()=>{Y(s.flush({keepalive:!0}),t.onError)};return window.addEventListener(`error`,g,!0),c.push(()=>{window.removeEventListener(`error`,g,!0)}),window.addEventListener(`unhandledrejection`,_,!0),c.push(()=>{window.removeEventListener(`unhandledrejection`,_,!0)}),document.addEventListener(`visibilitychange`,v),c.push(()=>{document.removeEventListener(`visibilitychange`,v)}),window.addEventListener(`pagehide`,y),c.push(()=>{window.removeEventListener(`pagehide`,y)}),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 Pe(e){if(e.replayUrl.length===0)throw Error("logfire session replay: `replayUrl` is required");let t=new URL(e.replayUrl,`https://logfire.invalid/`);if(t.search!==``||t.hash!==``)throw Error("logfire session replay: `replayUrl` must not contain a query or fragment");let n=e.fetchImpl??(typeof fetch==`function`?fetch.bind(globalThis):void 0);if(n===void 0)throw Error("logfire session replay: no `fetch` available; pass `fetchImpl`");return{replayUrl:e.replayUrl,headers:e.headers,token:e.token,getSessionId:e.getSessionId,getSessionAttributes:e.getSessionAttributes,sessionSampleRate:e.sessionSampleRate??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,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 Fe(e,t,n){let r=Ie(n,t);if(r!==void 0)return r;let i=ue({sessionSampleRate:e.sessionSampleRate,onErrorSampleRate:e.onErrorSampleRate,random:e.random});return J(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||!Le(i.mode)?void 0:i.mode}catch{return}}function J(e,t,n){if(e!==null)try{e.setItem(K,JSON.stringify({id:t,mode:n}))}catch{}}function Le(e){return e===`full`||e===`buffer`||e===`off`}function Re(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);ze(n)&&Promise.resolve(n).catch(()=>void 0)}catch{}}function ze(e){return typeof e==`object`&&!!e&&`then`in e&&typeof e.then==`function`}function Be(){let e=globalThis;if(e[q]!==void 0)throw Error(`logfire session replay: a replay controller is already active in this page`);let t={};Object.defineProperty(e,q,{configurable:!0,enumerable:!1,value:t,writable:!0});let n=!1;return()=>{n||(n=!0,e[q]===t&&Reflect.deleteProperty(e,q))}}function Q(e){for(let t=e.length-1;t>=0;--t)try{e[t]?.()}catch{}e.length=0}function $(e,t,n){return{message:e,...t===void 0||t.length===0?{}:{source:t},...n===void 0?{}:{stack:n}}}function Ve(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,Me as startSessionReplay};
package/package.json CHANGED
@@ -24,7 +24,7 @@
24
24
  "rum",
25
25
  "rrweb"
26
26
  ],
27
- "version": "0.2.0",
27
+ "version": "0.3.0",
28
28
  "type": "module",
29
29
  "main": "./dist/index.cjs",
30
30
  "module": "./dist/index.js",