iris-recorder 0.4.1 → 0.5.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
@@ -38,6 +38,32 @@ If your app sends a visitor to another of its own hosts (say, from a sign-in pag
38
38
  `record({ sessionId })` on the other side to keep one session. `currentSessionId()`
39
39
  tells you whether this tab is already recording one.
40
40
 
41
+ ## Reporting caught errors
42
+
43
+ Uncaught errors and unhandled rejections are recorded automatically. Errors your app
44
+ catches itself never reach `window.onerror`. That includes everything a React or
45
+ Next.js **error boundary** catches, so report those yourself:
46
+
47
+ ```tsx
48
+ // app/error.tsx (Next.js), or any error boundary
49
+ 'use client';
50
+ import { useEffect } from 'react';
51
+ import { captureException } from 'iris-recorder';
52
+
53
+ export default function Error({ error, reset }: { error: Error & { digest?: string }; reset: () => void }) {
54
+ useEffect(() => {
55
+ captureException(error, { boundary: 'app', digest: error.digest });
56
+ }, [error]);
57
+ return <button onClick={reset}>Try again</button>;
58
+ }
59
+ ```
60
+
61
+ `captureException(error, context?)` and `captureMessage(message, context?)` are also on
62
+ the handle `record()` returns. The module-level versions forward to whichever recorder
63
+ is running and do nothing before `record()`, so they're safe to call anywhere. Context
64
+ is masked with the same rules as network bodies. The same error object is only ever
65
+ reported once, even if you capture it and then rethrow it.
66
+
41
67
  ## Privacy defaults
42
68
 
43
69
  - All inputs are masked; add `.twc-mask` to hide text, `.twc-block` to redact regions.
package/dist/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";var F=Object.defineProperty;var ge=Object.getOwnPropertyDescriptor;var ke=Object.getOwnPropertyNames;var be=Object.prototype.hasOwnProperty;var ve=(e,t,n)=>t in e?F(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n;var we=(e,t)=>{for(var n in t)F(e,n,{get:t[n],enumerable:!0})},Ee=(e,t,n,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of ke(t))!be.call(e,i)&&i!==n&&F(e,i,{get:()=>t[i],enumerable:!(o=ge(t,i))||o.enumerable});return e};var Se=e=>Ee(F({},"__esModule",{value:!0}),e);var U=(e,t,n)=>ve(e,typeof t!="symbol"?t+"":t,n);var je={};we(je,{currentSessionId:()=>G,record:()=>He});module.exports=Se(je);function N(e){let n=ee(e,1,{keys:32});return n&&Object.keys(n).length>0?n:void 0}function ee(e,t,n){if(typeof e!="object"||e===null||Array.isArray(e))return;let o={};for(let[i,d]of Object.entries(e)){if(n.keys<=0)break;let f=i.slice(0,64);if(f){if(typeof d=="string")o[f]=d.slice(0,300),n.keys-=1;else if(typeof d=="number"||typeof d=="boolean")o[f]=String(d),n.keys-=1;else if(typeof d=="object"&&d!==null&&!Array.isArray(d)&&t<3){n.keys-=1;let g=ee(d,t+1,n);g&&Object.keys(g).length>0?o[f]=g:n.keys+=1}}}return o}function $(e){for(let t of["id","userId","email","username","name"]){let n=e[t];if(typeof n=="string"&&n)return n}for(let t of Object.values(e))if(typeof t=="string"&&t)return t}var J="iris.sid",xe=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;function Y(e){return typeof e=="string"&&xe.test(e)}function G(){try{let e=sessionStorage.getItem(J);return Y(e)?e:void 0}catch(e){return}}function Ie(e){try{if(Y(e))return sessionStorage.setItem(J,e),e;let t=G();if(t)return t;let n=crypto.randomUUID();return sessionStorage.setItem(J,n),n}catch(t){return Y(e)?e:crypto.randomUUID()}}function te(e,t,n){let o=N(typeof t=="string"?{id:t}:t);return{sessionId:Ie(n),user:o,userId:o?$(o):void 0,release:e,startedAt:Date.now(),url:location.href,userAgent:navigator.userAgent}}var X=require("fflate");var W=class{constructor(t){U(this,"opts",t);U(this,"queue",[]);U(this,"bytes",0);U(this,"timer");U(this,"flushBytes");U(this,"maxBytes",4e6);var n,o;this.flushBytes=(n=t.flushBytes)!=null?n:64e3,this.timer=setInterval(()=>this.flush(!1),(o=t.flushMs)!=null?o:5e3),addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"&&this.flush(!0)}),addEventListener("pagehide",()=>this.flush(!0))}push(t){this.queue.push(t),this.bytes+=re(t),this.bytes>=this.flushBytes&&this.flush(!1)}flush(t){if(this.queue.length===0)return;let n=this.queue;this.queue=[],this.bytes=0;let o={meta:this.opts.meta,events:n},i=(0,X.gzipSync)((0,X.strToU8)(JSON.stringify(o))),d=`${this.opts.endpoint}/v1/ingest`;if(this.log(`flush via ${t?"beacon":"fetch"}: ${n.length} events, ${i.length}b gz \u2192 ${d}`),t&&"sendBeacon"in navigator){let f=!1;try{f=navigator.sendBeacon(d,new Blob([i],{type:"application/octet-stream"}))}catch(g){f=!1}f||(this.log("beacon refused \u2014 re-queueing"),this.requeue(n));return}fetch(d,{method:"POST",body:i,keepalive:t,headers:{"content-encoding":"gzip","content-type":"application/octet-stream","x-iris-key":this.opts.projectKey}}).then(f=>{this.log(`ingest responded ${f.status}`),f.ok||this.requeue(n)}).catch(f=>{this.log("ingest request failed",f),this.requeue(n)})}identify(t){var o;let n=N(typeof t=="string"?{id:t}:t);n&&(this.opts.meta.user=n,this.opts.meta.userId=$(n),this.log(`identified as ${(o=this.opts.meta.userId)!=null?o:"(unnamed user)"}`))}log(...t){this.opts.debug&&console.debug("[iris]",...t)}requeue(t){let n=t.concat(this.queue),o=0;for(let i of n)o+=re(i);o>this.maxBytes||(this.queue=n,this.bytes=o)}stop(){this.timer&&clearInterval(this.timer),this.flush(!0)}};function re(e){return JSON.stringify(e).length}var Re=["authorization","cookie","set-cookie","proxy-authorization","x-api-key","x-auth-token","x-csrf-token","x-xsrf-token"],Le=/pass(word|wd)?|secret|token|api[-_]?key|auth|credential|session|cvv|card[-_]?(number|num)?|ssn|pin/i;var Ae="[redacted]",j="[masked]";function D(e={}){var R,b,L,A;let t=new Set([...Re,...((R=e.redactHeaders)!=null?R:[]).map(l=>l.toLowerCase())]),n=(b=e.maskKeys)!=null?b:Le,o=new Set(((L=e.maskExtraKeys)!=null?L:[]).map(l=>l.toLowerCase())),i=l=>n.test(l)||o.has(l.toLowerCase()),d=(A=e.maxBodyChars)!=null?A:1e4,f=()=>typeof location!="undefined"?location.href:void 0,g=l=>{try{let h=new URL(l,f()),k=!1;for(let x of[...h.searchParams.keys()])i(x)&&(h.searchParams.set(x,j),k=!0);return k?h.toString():l}catch(h){return l}},w=l=>{let h={};for(let k of Object.keys(l))h[k]=t.has(k.toLowerCase())?Ae:l[k];return h},S=l=>{if(Array.isArray(l))return l.map(S);if(l&&typeof l=="object"){let h={};for(let[k,x]of Object.entries(l))h[k]=i(k)?j:S(x);return h}return l},I=(l,h=d)=>l.length>h?`${l.slice(0,h)}\u2026[+${l.length-h} chars]`:l;return{maskUrl:g,maskHeaders:w,maskBody:(l,h=d)=>{if(l==null||l==="")return;let k=String(l),x;try{x=JSON.stringify(S(JSON.parse(k)))}catch(_){if(/^[^={}\s]+=[^&]*(?:&[^=]+=[^&]*)*$/.test(k))try{let a=new URLSearchParams(k);for(let r of[...a.keys()])i(r)&&a.set(r,j);x=a.toString()}catch(a){x=k}else x=k}return I(x,h)},maskObject:l=>S(l),truncate:I,isMaskedKey:i,maxBodyChars:d}}var Me=500,Be=8e3,qe=120;function ne(e,t={},n={}){var w,S;let o=D(t),i=(w=n.maxEvents)!=null?w:Me,d=(S=n.maxPropsChars)!=null?S:Be,f=0,g=!1;return(I,E)=>{try{let q=typeof I=="string"?I.trim().slice(0,qe):"";if(!q)return;if(f>=i){g||(g=!0,console.warn(`[iris] track() budget exhausted (${i} events) \u2014 further events are dropped`));return}f++;let R={type:"custom",ts:Date.now(),name:q};if(E!=null&&typeof E=="object"){let b=null,L=1/0;try{b=o.maskObject(E),L=JSON.stringify(b).length}catch(A){b=null}R.props=b!=null&&L<=d?b:{"[iris]":`props dropped (${Number.isFinite(L)?`${L} chars > ${d}`:"not serializable"})`}}e(R)}catch(q){}}}var se=require("rrweb");function oe(e,t={}){var o;let n=(0,se.record)({emit(i){e({type:"replay",ts:Date.now(),data:i})},maskAllInputs:(o=t.maskAllInputs)!=null?o:!0,maskTextSelector:t.maskTextSelector,blockSelector:t.blockSelector,sampling:{mousemove:50,scroll:150,input:"last"},checkoutEveryNms:3e4});return()=>n==null?void 0:n()}function ie(e){let t=o=>{var i,d,f,g;e({type:"error",ts:Date.now(),source:"error",name:(d=(i=o.error)==null?void 0:i.name)!=null?d:"Error",message:(f=o.message)!=null?f:String(o.error),stack:(g=o.error)==null?void 0:g.stack})},n=o=>{var d,f;let i=o.reason;e({type:"error",ts:Date.now(),source:"unhandledrejection",name:(d=i==null?void 0:i.name)!=null?d:"UnhandledRejection",message:(f=i==null?void 0:i.message)!=null?f:String(i),stack:i==null?void 0:i.stack})};return addEventListener("error",t),addEventListener("unhandledrejection",n),()=>{removeEventListener("error",t),removeEventListener("unhandledrejection",n)}}var ae=512e3;function ce(e,t={}){var _;let n=(_=t.ignoreUrls)!=null?_:[],o=t.captureBodies!==!1,{maskUrl:i,maskHeaders:d,maskBody:f,truncate:g,isMaskedKey:w}=D(t),S=a=>typeof a=="string"&&n.some(r=>typeof r=="string"?a.includes(r):r.test(a)),I=a=>{let r={};if(!a)return r;if(typeof Headers!="undefined"&&a instanceof Headers)a.forEach((s,c)=>r[c]=s);else if(Array.isArray(a))for(let s of a)s&&s.length>=2&&(r[String(s[0])]=String(s[1]));else if(typeof a=="object")for(let[s,c]of Object.entries(a))r[s]=String(c);return r},E=a=>!!a&&/(json|text|xml|javascript|x-www-form-urlencoded|html)/i.test(a),q=a=>!!a&&/event-stream/i.test(a),R=a=>{let r={};if(!a)return r;for(let s of a.trim().split(/[\r\n]+/)){let c=s.indexOf(":");c>0&&(r[s.slice(0,c).trim()]=s.slice(c+1).trim())}return r},b=a=>{let r=[];return a.forEach((s,c)=>{typeof s=="string"?r.push(`${c}=${w(c)?j:s}`):r.push(`${c}=[file ${s.name||"blob"} ${s.size}B]`)}),r.join("&")},L=(a,r)=>{var c;let s=r==null?void 0:r.body;if(typeof s=="string")return{text:s,size:s.length};if(typeof URLSearchParams!="undefined"&&s instanceof URLSearchParams){let u=s.toString();return{text:u,size:u.length}}if(typeof FormData!="undefined"&&s instanceof FormData){let u=b(s);return{text:u,size:u.length,premasked:!0}}if(typeof Blob!="undefined"&&s instanceof Blob)return{size:s.size};if(typeof ArrayBuffer!="undefined"){if(s instanceof ArrayBuffer)return{size:s.byteLength};if(ArrayBuffer.isView(s))return{size:s.byteLength}}if(s==null&&typeof Request!="undefined"&&a instanceof Request){let u=a.method.toUpperCase();if(u!=="GET"&&u!=="HEAD"&&!a.bodyUsed){let y=(c=a.headers.get("content-type"))!=null?c:void 0;try{if(y&&/multipart\/form-data/i.test(y))return{textPromise:a.clone().formData().then(b).catch(()=>{}),premasked:!0};if(E(y))return{textPromise:a.clone().text().catch(()=>{})}}catch(m){}}}return{}},A=async a=>{let r=a.body;if(!r||typeof r.getReader!="function"){let m=await a.text();return{text:m,bytes:m.length,complete:!0}}let s=r.getReader(),c=new TextDecoder,u="",y=0;for(;;){let{done:m,value:p}=await s.read();if(m)return{text:u+c.decode(),bytes:y,complete:!0};if(y+=p.byteLength,u+=c.decode(p,{stream:!0}),y>=ae)return s.cancel().catch(()=>{}),{text:u,bytes:y,complete:!1}}},l=window.fetch;window.fetch=async function(...a){var m,p,v,M,O;let r=Date.now(),s=a[0],c=typeof s=="string"?s:s instanceof URL?s.href:s instanceof Request?s.url:String(s),u=((p=(m=a[1])==null?void 0:m.method)!=null?p:s instanceof Request?s.method:"GET").toUpperCase(),y={};if(o&&!S(c))try{y=L(s,a[1])}catch(T){y={}}try{let T=await l.apply(this,a);try{if(!S(c)){let B={type:"network",ts:r,method:u,url:i(c),status:T.status,durationMs:Date.now()-r,initiator:"fetch"};if(!o)e(B);else{let he=(M=(v=a[1])==null?void 0:v.headers)!=null?M:s instanceof Request?s.headers:void 0;B.reqHeaders=d(I(he)),B.resHeaders=d(I(T.headers));let P=(O=T.headers.get("content-type"))!=null?O:void 0;P&&(B.contentType=P);let z=Number(T.headers.get("content-length"));Number.isFinite(z)&&(B.resSize=z);let K=null;E(P)&&!q(P)&&!(Number.isFinite(z)&&z>ae)&&(K=A(T.clone())),(async()=>{var Q,Z;try{let H=(Q=y.text)!=null?Q:y.textPromise?await y.textPromise:void 0;if(H?(B.reqBody=y.premasked?g(H):f(H),B.reqSize=(Z=y.size)!=null?Z:H.length):y.size!=null&&(B.reqSize=y.size),K){let V=await K;V.text&&(B.resBody=f(V.text)),Number.isFinite(z)||(B.resSize=V.bytes)}}catch(H){}e(B)})()}}}catch(B){}return T}catch(T){try{S(c)||e({type:"network",ts:r,method:u,url:i(c),status:0,durationMs:Date.now()-r,initiator:"fetch"})}catch(B){}throw T}};let h=XMLHttpRequest.prototype.open,k=XMLHttpRequest.prototype.send,x=XMLHttpRequest.prototype.setRequestHeader;return XMLHttpRequest.prototype.open=function(a,r,...s){return this.__iris={method:String(a).toUpperCase(),url:String(r),start:0,reqHeaders:{},reqBody:void 0,reqSize:void 0,premasked:!1},h.apply(this,[a,r,...s])},XMLHttpRequest.prototype.setRequestHeader=function(a,r){let s=this.__iris;return s&&(s.reqHeaders[a]=r),x.apply(this,[a,r])},XMLHttpRequest.prototype.send=function(...a){let r=this.__iris;if(r){r.start=Date.now();let s=a[0];typeof s=="string"?(r.reqBody=s,r.reqSize=s.length):typeof URLSearchParams!="undefined"&&s instanceof URLSearchParams?(r.reqBody=s.toString(),r.reqSize=r.reqBody.length):typeof FormData!="undefined"&&s instanceof FormData?(r.reqBody=b(s),r.reqSize=r.reqBody.length,r.premasked=!0):typeof Blob!="undefined"&&s instanceof Blob?r.reqSize=s.size:(typeof ArrayBuffer!="undefined"&&s instanceof ArrayBuffer||typeof ArrayBuffer!="undefined"&&ArrayBuffer.isView(s))&&(r.reqSize=s.byteLength),this.addEventListener("loadend",()=>{var c;try{if(S(r.url))return;let u={type:"network",ts:r.start,method:r.method,url:i(r.url),status:this.status,durationMs:Date.now()-r.start,initiator:"xhr"};if(o){u.reqHeaders=d(r.reqHeaders),u.resHeaders=d(R(this.getAllResponseHeaders()));let y=(c=this.getResponseHeader("content-type"))!=null?c:void 0;y&&(u.contentType=y),r.reqBody!=null&&(u.reqBody=r.premasked?g(r.reqBody):f(r.reqBody)),r.reqSize!=null&&(u.reqSize=r.reqSize);let m=this.responseType;if(m===""||m==="text")try{let p=this.responseText;p&&(u.resBody=f(p),u.resSize=p.length)}catch(p){}else if(m==="json")try{let p=this.response;if(p!=null){let v=JSON.stringify(p);u.resBody=f(v),u.resSize=v.length}}catch(p){}else if(m==="arraybuffer"){let p=this.response;p&&(u.resSize=p.byteLength)}else if(m==="blob"){let p=this.response;p&&(u.resSize=p.size)}}e(u)}catch(u){}})}return k.apply(this,a)},()=>{window.fetch=l,XMLHttpRequest.prototype.open=h,XMLHttpRequest.prototype.send=k,XMLHttpRequest.prototype.setRequestHeader=x}}var _e=200,Te=2e3,ue=0;function de(e,t={},n=!1){var k,x,_,a;let o=D(t),i=(k=t.wsMaxFrames)!=null?k:_e,d=(x=t.wsMaxFrameChars)!=null?x:Te,f=new Set((_=t.wsFrameTypes)!=null?_:["text","binary"]),g=(a=t.ignoreUrls)!=null?a:[],w=r=>{let s=r.trim();if(!s.startsWith("{")&&!s.startsWith("["))return!1;try{return JSON.parse(s),!0}catch(c){return!1}},S=r=>typeof r=="string"?f.has("text")?!0:f.has("json")?w(r):!1:f.has("binary"),I=r=>typeof r=="string"&&g.some(s=>typeof s=="string"?r.includes(s):s.test(r)),E=r=>{try{e(r)}catch(s){}},q=(...r)=>{n&&console.debug("[iris]",...r)},R=r=>{if(typeof r=="string")return{data:o.maskBody(r,d),size:r.length};if(typeof Blob!="undefined"&&r instanceof Blob)return{binary:!0,size:r.size};if(typeof ArrayBuffer!="undefined"){if(r instanceof ArrayBuffer)return{binary:!0,size:r.byteLength};if(ArrayBuffer.isView(r))return{binary:!0,size:r.byteLength}}return{}},b=window.WebSocket,L=!1,A;if(typeof b=="function"){L=!0;class r extends b{constructor(u,y){super(u,y);try{let m=typeof u=="string"?u:String(u);if(I(m))return;let p=`ws${++ue}`,v={sent:0,recv:0,dropped:0};this.__iris={connId:p,budget:v},E({type:"ws",ts:Date.now(),connId:p,op:"open",transport:"websocket",url:o.maskUrl(m)}),this.addEventListener("message",M=>{if(S(M.data)){if(v.recv>=i){v.dropped++;return}v.recv++,E({type:"ws",ts:Date.now(),connId:p,op:"message",transport:"websocket",...R(M.data)})}}),this.addEventListener("close",M=>{E({type:"ws",ts:Date.now(),connId:p,op:"close",transport:"websocket",code:M.code,reason:M.reason||void 0,dropped:v.dropped||void 0}),q(`ws ${p} closed (${M.code}) \u2014 frames \u2191${v.sent} \u2193${v.recv}, dropped ${v.dropped}`)}),this.addEventListener("error",()=>{E({type:"ws",ts:Date.now(),connId:p,op:"error",transport:"websocket"})})}catch(m){}}}A=b.prototype.send;let s=A;b.prototype.send=function(c){try{let u=this.__iris;u&&S(c)&&(u.budget.sent>=i?u.budget.dropped++:(u.budget.sent++,E({type:"ws",ts:Date.now(),connId:u.connId,op:"send",transport:"websocket",...R(c)})))}catch(u){}return s.call(this,c)},window.WebSocket=r}let l=window.EventSource,h=!1;if(typeof l=="function"){h=!0;class r extends l{constructor(c,u){super(c,u);try{let y=typeof c=="string"?c:String(c);if(I(y))return;let m=`es${++ue}`,p={recv:0,dropped:0},v=(O,T)=>{if(S(O.data)){if(p.recv>=i){p.dropped++;return}p.recv++,E({type:"ws",ts:Date.now(),connId:m,op:"message",transport:"eventsource",...T?{event:T}:{},...R(O.data)})}};this.__iris={record:v,mirrored:new Set},E({type:"ws",ts:Date.now(),connId:m,op:"open",transport:"eventsource",url:o.maskUrl(y)}),super.addEventListener("message",O=>v(O)),super.addEventListener("error",()=>{E({type:"ws",ts:Date.now(),connId:m,op:"error",transport:"eventsource"})});let M=this.close.bind(this);this.close=()=>{try{E({type:"ws",ts:Date.now(),connId:m,op:"close",transport:"eventsource",dropped:p.dropped||void 0}),q(`es ${m} closed \u2014 frames \u2193${p.recv}, dropped ${p.dropped}`)}catch(O){}M()}}catch(y){}}addEventListener(c,u,y){try{let m=this.__iris;m&&c!=="message"&&c!=="error"&&c!=="open"&&!m.mirrored.has(c)&&(m.mirrored.add(c),super.addEventListener(c,(p=>m.record(p,c))))}catch(m){}super.addEventListener(c,u,y)}}window.EventSource=r}return()=>{L&&(window.WebSocket=b,A&&(b.prototype.send=A)),h&&(window.EventSource=l)}}var fe=["log","info","warn","error","debug"],Ce=e=>typeof e[0]=="string"&&e[0].startsWith("[iris]");function le(e,t={}){let n=t.captureIrisLogs===!0,o={};for(let i of fe)o[i]=console[i].bind(console),console[i]=(...d)=>{try{(n||!Ce(d))&&e({type:"console",ts:Date.now(),level:i,args:d.map(Oe)})}catch(f){}o[i](...d)};return()=>{for(let i of fe)o[i]&&(console[i]=o[i])}}function Oe(e){if(typeof e=="string")return e;try{return JSON.stringify(e)}catch(t){return String(e)}}var C=require("web-vitals");function pe(e){let t=n=>o=>{e({type:"vital",ts:Date.now(),metric:n,value:o.value,rating:o.rating})};(0,C.onLCP)(t("LCP")),(0,C.onCLS)(t("CLS")),(0,C.onINP)(t("INP")),(0,C.onFCP)(t("FCP")),(0,C.onTTFB)(t("TTFB"))}function ye(e){let t=location.href,n=()=>{try{let d=location.href;if(d===t)return;let f=t;t=d,e({type:"navigation",ts:Date.now(),from:f,to:d})}catch(d){}},o=history.pushState,i=history.replaceState;return history.pushState=function(...d){let f=o.apply(this,d);return n(),f},history.replaceState=function(...d){let f=i.apply(this,d);return n(),f},addEventListener("popstate",n),addEventListener("hashchange",n),()=>{history.pushState=o,history.replaceState=i,removeEventListener("popstate",n),removeEventListener("hashchange",n)}}function me(e,t={}){var A,l,h,k,x;let n=(A=t.rageThreshold)!=null?A:3,o=(l=t.rageWindowMs)!=null?l:1e3,i=(h=t.rageRadiusPx)!=null?h:30,d=(k=t.deadWindowMs)!=null?k:2500,f=(x=t.errorWindowMs)!=null?x:2500,g=0,w=0,S=0,I=[],E=()=>{g=Date.now()},q=new MutationObserver(E);q.observe(document,{subtree:!0,childList:!0,attributes:!0,characterData:!0}),addEventListener("scroll",E,!0);let R=()=>{w=Date.now()};addEventListener("error",R,!0),addEventListener("unhandledrejection",R,!0);let b=(_,a,r,s,c,u)=>{e({type:"click",ts:a,kind:_,selector:Ue(r),text:De(r),x:s,y:c,...u?{count:u}:{}})},L=_=>{try{let a=Date.now(),r=_.clientX,s=_.clientY,c=_.target;for(;I.length&&a-I[0].t>o;)I.shift();let u=I.filter(v=>Math.hypot(v.x-r,v.y-s)<=i).length;if(I.push({x:r,y:s,t:a}),u+1>=n&&(S=a,b("rage",a,c,r,s,u+1),I.length=0),u>0)return;let y=w;if(setTimeout(()=>{w>y&&b("error",a,c,r,s)},f),!ze(c))return;let m=g,p=location.href;setTimeout(()=>{let v=g>m||location.href!==p,M=w>y;!v&&!M&&S<a&&b("dead",a,c,r,s)},d)}catch(a){}};return addEventListener("click",L,!0),()=>{q.disconnect(),removeEventListener("scroll",E,!0),removeEventListener("error",R,!0),removeEventListener("unhandledrejection",R,!0),removeEventListener("click",L,!0)}}function Ue(e){var o;if(!e||!e.tagName)return"unknown";let t=e.tagName.toLowerCase();e.id&&(t+=`#${e.id}`);let n=((o=e.getAttribute("class"))!=null?o:"").trim().split(/\s+/).filter(Boolean)[0];return n&&(t+=`.${n}`),t}function De(e){var t;if(e)try{if(e.closest(".twc-mask, .twc-block"))return;let n=e.getAttribute("aria-label"),o=((t=n!=null?n:e.textContent)!=null?t:"").replace(/\s+/g," ").trim();return o?o.length>50?`${o.slice(0,50)}\u2026`:o:void 0}catch(n){return}}function ze(e){if(!e||e.closest("input, textarea, select, label"))return!1;if(e.closest('a, button, [role="button"], [onclick]'))return!0;try{return getComputedStyle(e).cursor==="pointer"}catch(t){return!1}}function He(e){var f,g;let t=te(e.release,(f=e.user)!=null?f:e.userId,e.sessionId),n=new W({endpoint:e.endpoint,projectKey:e.projectKey,meta:t,debug:e.debug}),o=n.push.bind(n),i=[],d=e.track===!1?()=>{}:ne(o,typeof e.network=="object"?e.network:{},typeof e.track=="object"?e.track:{});if(e.replay!==!1&&i.push(oe(o,{maskAllInputs:(g=e.maskAllInputs)!=null?g:!0,maskTextSelector:e.maskTextSelector,blockSelector:e.blockSelector})),e.errors!==!1&&i.push(ie(o)),e.console!==!1&&i.push(le(o,typeof e.console=="object"?e.console:{})),e.navigation!==!1&&i.push(ye(o)),e.frustration!==!1&&i.push(me(o)),e.vitals!==!1&&pe(o),e.network!==!1){let w={ignoreUrls:[`${e.endpoint}/v1/ingest`],...typeof e.network=="object"?e.network:{}};i.push(ce(o,w)),w.captureWebSockets!==!1&&i.push(de(o,w,e.debug))}return e.debug&&console.debug("[iris] recording",t.sessionId,"\u2192",e.endpoint),{sessionId:t.sessionId,identify:w=>n.identify(w),track:d,flush:()=>n.flush(!1),stop:()=>{i.forEach(w=>w()),n.stop()}}}0&&(module.exports={currentSessionId,record});
1
+ "use strict";var N=Object.defineProperty;var Se=Object.getOwnPropertyDescriptor;var Ie=Object.getOwnPropertyNames;var Re=Object.prototype.hasOwnProperty;var Me=(e,t,n)=>t in e?N(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n;var Ae=(e,t)=>{for(var n in t)N(e,n,{get:t[n],enumerable:!0})},Ce=(e,t,n,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of Ie(t))!Re.call(e,i)&&i!==n&&N(e,i,{get:()=>t[i],enumerable:!(s=Se(t,i))||s.enumerable});return e};var Le=e=>Ce(N({},"__esModule",{value:!0}),e);var D=(e,t,n)=>Me(e,typeof t!="symbol"?t+"":t,n);var Ge={};Ae(Ge,{captureException:()=>Je,captureMessage:()=>Ye,currentSessionId:()=>ee,record:()=>Ve});module.exports=Le(Ge);function $(e){let n=ne(e,1,{keys:32});return n&&Object.keys(n).length>0?n:void 0}function ne(e,t,n){if(typeof e!="object"||e===null||Array.isArray(e))return;let s={};for(let[i,u]of Object.entries(e)){if(n.keys<=0)break;let c=i.slice(0,64);if(c){if(typeof u=="string")s[c]=u.slice(0,300),n.keys-=1;else if(typeof u=="number"||typeof u=="boolean")s[c]=String(u),n.keys-=1;else if(typeof u=="object"&&u!==null&&!Array.isArray(u)&&t<3){n.keys-=1;let y=ne(u,t+1,n);y&&Object.keys(y).length>0?s[c]=y:n.keys+=1}}}return s}function W(e){for(let t of["id","userId","email","username","name"]){let n=e[t];if(typeof n=="string"&&n)return n}for(let t of Object.values(e))if(typeof t=="string"&&t)return t}var Q="iris.sid",_e=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;function Z(e){return typeof e=="string"&&_e.test(e)}function ee(){try{let e=sessionStorage.getItem(Q);return Z(e)?e:void 0}catch(e){return}}function Be(e){try{if(Z(e))return sessionStorage.setItem(Q,e),e;let t=ee();if(t)return t;let n=crypto.randomUUID();return sessionStorage.setItem(Q,n),n}catch(t){return Z(e)?e:crypto.randomUUID()}}function se(e,t,n){let s=$(typeof t=="string"?{id:t}:t);return{sessionId:Be(n),user:s,userId:s?W(s):void 0,release:e,startedAt:Date.now(),url:location.href,userAgent:navigator.userAgent}}var K=require("fflate");var X=class{constructor(t){D(this,"opts",t);D(this,"queue",[]);D(this,"bytes",0);D(this,"timer");D(this,"flushBytes");D(this,"maxBytes",4e6);var n,s;this.flushBytes=(n=t.flushBytes)!=null?n:64e3,this.timer=setInterval(()=>this.flush(!1),(s=t.flushMs)!=null?s:5e3),addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"&&this.flush(!0)}),addEventListener("pagehide",()=>this.flush(!0))}push(t){this.queue.push(t),this.bytes+=oe(t),this.bytes>=this.flushBytes&&this.flush(!1)}flush(t){if(this.queue.length===0)return;let n=this.queue;this.queue=[],this.bytes=0;let s={meta:this.opts.meta,events:n},i=(0,K.gzipSync)((0,K.strToU8)(JSON.stringify(s))),u=`${this.opts.endpoint}/v1/ingest`;if(this.log(`flush via ${t?"beacon":"fetch"}: ${n.length} events, ${i.length}b gz \u2192 ${u}`),t&&"sendBeacon"in navigator){let c=!1;try{let y=`${u}?k=${encodeURIComponent(this.opts.projectKey)}`;c=navigator.sendBeacon(y,new Blob([i],{type:"text/plain"}))}catch(y){c=!1}c||(this.log("beacon refused \u2014 re-queueing"),this.requeue(n));return}fetch(u,{method:"POST",body:i,keepalive:t,headers:{"content-encoding":"gzip","content-type":"application/octet-stream","x-iris-key":this.opts.projectKey}}).then(c=>{this.log(`ingest responded ${c.status}`),c.ok||this.requeue(n)}).catch(c=>{this.log("ingest request failed",c),this.requeue(n)})}identify(t){var s;let n=$(typeof t=="string"?{id:t}:t);n&&(this.opts.meta.user=n,this.opts.meta.userId=W(n),this.log(`identified as ${(s=this.opts.meta.userId)!=null?s:"(unnamed user)"}`))}log(...t){this.opts.debug&&console.debug("[iris]",...t)}requeue(t){let n=t.concat(this.queue),s=0;for(let i of n)s+=oe(i);s>this.maxBytes||(this.queue=n,this.bytes=s)}stop(){this.timer&&clearInterval(this.timer),this.flush(!0)}};function oe(e){return JSON.stringify(e).length}var qe=["authorization","cookie","set-cookie","proxy-authorization","x-api-key","x-auth-token","x-csrf-token","x-xsrf-token"],Oe=/pass(word|wd)?|secret|token|api[-_]?key|auth|credential|session|cvv|card[-_]?(number|num)?|ssn|pin/i;var Te="[redacted]",j="[masked]";function U(e={}){var R,w,M,A;let t=new Set([...qe,...((R=e.redactHeaders)!=null?R:[]).map(f=>f.toLowerCase())]),n=(w=e.maskKeys)!=null?w:Oe,s=new Set(((M=e.maskExtraKeys)!=null?M:[]).map(f=>f.toLowerCase())),i=f=>n.test(f)||s.has(f.toLowerCase()),u=(A=e.maxBodyChars)!=null?A:1e4,c=()=>typeof location!="undefined"?location.href:void 0,y=f=>{try{let k=new URL(f,c()),b=!1;for(let I of[...k.searchParams.keys()])i(I)&&(k.searchParams.set(I,j),b=!0);return b?k.toString():f}catch(k){return f}},S=f=>{let k={};for(let b of Object.keys(f))k[b]=t.has(b.toLowerCase())?Te:f[b];return k},m=f=>{if(Array.isArray(f))return f.map(m);if(f&&typeof f=="object"){let k={};for(let[b,I]of Object.entries(f))k[b]=i(b)?j:m(I);return k}return f},v=(f,k=u)=>f.length>k?`${f.slice(0,k)}\u2026[+${f.length-k} chars]`:f;return{maskUrl:y,maskHeaders:S,maskBody:(f,k=u)=>{if(f==null||f==="")return;let b=String(f),I;try{I=JSON.stringify(m(JSON.parse(b)))}catch(B){if(/^[^={}\s]+=[^&]*(?:&[^=]+=[^&]*)*$/.test(b))try{let a=new URLSearchParams(b);for(let r of[...a.keys()])i(r)&&a.set(r,j);I=a.toString()}catch(a){I=b}else I=b}return v(I,k)},maskObject:f=>m(f),truncate:v,isMaskedKey:i,maxBodyChars:u}}var Ue=500,De=8e3,Fe=120;function ie(e,t={},n={}){var S,m;let s=U(t),i=(S=n.maxEvents)!=null?S:Ue,u=(m=n.maxPropsChars)!=null?m:De,c=0,y=!1;return(v,E)=>{try{let _=typeof v=="string"?v.trim().slice(0,Fe):"";if(!_)return;if(c>=i){y||(y=!0,console.warn(`[iris] track() budget exhausted (${i} events) \u2014 further events are dropped`));return}c++;let R={type:"custom",ts:Date.now(),name:_};if(E!=null&&typeof E=="object"){let w=null,M=1/0;try{w=s.maskObject(E),M=JSON.stringify(w).length}catch(A){w=null}R.props=w!=null&&M<=u?w:{"[iris]":`props dropped (${Number.isFinite(M)?`${M} chars > ${u}`:"not serializable"})`}}e(R)}catch(_){}}}var ae=100,ce=8e3,ze=2e3,ue=new WeakSet;function V(e){return e===null||typeof e!="object"?!0:ue.has(e)?!1:(ue.add(e),!0)}var J={captureException:()=>{},captureMessage:()=>{}};function pe(e,t={}){let n=U(t),s=0,i=!1,u=(c,y)=>{if(s>=ae){i||(i=!0,console.warn(`[iris] capture budget exhausted (${ae} errors) \u2014 further captures are dropped`));return}s++;let S={type:"error",ts:Date.now(),source:"manual",name:c.name,message:c.message.slice(0,ze),...c.stack?{stack:c.stack}:{}};if(y!=null&&typeof y=="object"){let m=null,v=1/0;try{m=n.maskObject(y),v=JSON.stringify(m).length}catch(E){m=null}S.context=m!=null&&v<=ce?m:{"[iris]":`context dropped (${Number.isFinite(v)?`${v} chars > ${ce}`:"not serializable"})`}}e(S)};return{captureException(c,y){try{if(!V(c))return;u(je(c),y)}catch(S){}},captureMessage(c,y){try{u({name:"Message",message:String(c)},y)}catch(S){}}}}function je(e){var n;if(e&&typeof e=="object"&&typeof e.message=="string"){let s=e;return{name:typeof s.name=="string"&&s.name?s.name:"Error",message:s.message,...typeof s.stack=="string"?{stack:s.stack}:{}}}if(typeof e=="string")return{name:"Error",message:e};let t;try{t=(n=JSON.stringify(e))!=null?n:String(e)}catch(s){t=String(e)}return{name:"Error",message:t}}var de=require("rrweb");function fe(e,t={}){var s;let n=(0,de.record)({emit(i){e({type:"replay",ts:Date.now(),data:i})},maskAllInputs:(s=t.maskAllInputs)!=null?s:!0,maskTextSelector:t.maskTextSelector,blockSelector:t.blockSelector,sampling:{mousemove:50,scroll:150,input:"last"},checkoutEveryNms:3e4});return()=>n==null?void 0:n()}function le(e){let t=s=>{var i,u,c,y;V(s.error)&&e({type:"error",ts:Date.now(),source:"error",name:(u=(i=s.error)==null?void 0:i.name)!=null?u:"Error",message:(c=s.message)!=null?c:String(s.error),stack:(y=s.error)==null?void 0:y.stack})},n=s=>{var u,c;let i=s.reason;V(i)&&e({type:"error",ts:Date.now(),source:"unhandledrejection",name:(u=i==null?void 0:i.name)!=null?u:"UnhandledRejection",message:(c=i==null?void 0:i.message)!=null?c:String(i),stack:i==null?void 0:i.stack})};return addEventListener("error",t),addEventListener("unhandledrejection",n),()=>{removeEventListener("error",t),removeEventListener("unhandledrejection",n)}}var ye=512e3;function me(e,t={}){var B;let n=(B=t.ignoreUrls)!=null?B:[],s=t.captureBodies!==!1,{maskUrl:i,maskHeaders:u,maskBody:c,truncate:y,isMaskedKey:S}=U(t),m=a=>typeof a=="string"&&n.some(r=>typeof r=="string"?a.includes(r):r.test(a)),v=a=>{let r={};if(!a)return r;if(typeof Headers!="undefined"&&a instanceof Headers)a.forEach((o,p)=>r[p]=o);else if(Array.isArray(a))for(let o of a)o&&o.length>=2&&(r[String(o[0])]=String(o[1]));else if(typeof a=="object")for(let[o,p]of Object.entries(a))r[o]=String(p);return r},E=a=>!!a&&/(json|text|xml|javascript|x-www-form-urlencoded|html)/i.test(a),_=a=>!!a&&/event-stream/i.test(a),R=a=>{let r={};if(!a)return r;for(let o of a.trim().split(/[\r\n]+/)){let p=o.indexOf(":");p>0&&(r[o.slice(0,p).trim()]=o.slice(p+1).trim())}return r},w=a=>{let r=[];return a.forEach((o,p)=>{typeof o=="string"?r.push(`${p}=${S(p)?j:o}`):r.push(`${p}=[file ${o.name||"blob"} ${o.size}B]`)}),r.join("&")},M=(a,r)=>{var p;let o=r==null?void 0:r.body;if(typeof o=="string")return{text:o,size:o.length};if(typeof URLSearchParams!="undefined"&&o instanceof URLSearchParams){let d=o.toString();return{text:d,size:d.length}}if(typeof FormData!="undefined"&&o instanceof FormData){let d=w(o);return{text:d,size:d.length,premasked:!0}}if(typeof Blob!="undefined"&&o instanceof Blob)return{size:o.size};if(typeof ArrayBuffer!="undefined"){if(o instanceof ArrayBuffer)return{size:o.byteLength};if(ArrayBuffer.isView(o))return{size:o.byteLength}}if(o==null&&typeof Request!="undefined"&&a instanceof Request){let d=a.method.toUpperCase();if(d!=="GET"&&d!=="HEAD"&&!a.bodyUsed){let g=(p=a.headers.get("content-type"))!=null?p:void 0;try{if(g&&/multipart\/form-data/i.test(g))return{textPromise:a.clone().formData().then(w).catch(()=>{}),premasked:!0};if(E(g))return{textPromise:a.clone().text().catch(()=>{})}}catch(h){}}}return{}},A=async a=>{let r=a.body;if(!r||typeof r.getReader!="function"){let h=await a.text();return{text:h,bytes:h.length,complete:!0}}let o=r.getReader(),p=new TextDecoder,d="",g=0;for(;;){let{done:h,value:l}=await o.read();if(h)return{text:d+p.decode(),bytes:g,complete:!0};if(g+=l.byteLength,d+=p.decode(l,{stream:!0}),g>=ye)return o.cancel().catch(()=>{}),{text:d,bytes:g,complete:!1}}},f=window.fetch;window.fetch=async function(...a){var h,l,x,C,T;let r=Date.now(),o=a[0],p=typeof o=="string"?o:o instanceof URL?o.href:o instanceof Request?o.url:String(o),d=((l=(h=a[1])==null?void 0:h.method)!=null?l:o instanceof Request?o.method:"GET").toUpperCase(),g={};if(s&&!m(p))try{g=M(o,a[1])}catch(q){g={}}try{let q=await f.apply(this,a);try{if(!m(p)){let L={type:"network",ts:r,method:d,url:i(p),status:q.status,durationMs:Date.now()-r,initiator:"fetch"};if(!s)e(L);else{let xe=(C=(x=a[1])==null?void 0:x.headers)!=null?C:o instanceof Request?o.headers:void 0;L.reqHeaders=u(v(xe)),L.resHeaders=u(v(q.headers));let P=(T=q.headers.get("content-type"))!=null?T:void 0;P&&(L.contentType=P);let F=Number(q.headers.get("content-length"));Number.isFinite(F)&&(L.resSize=F);let Y=null;E(P)&&!_(P)&&!(Number.isFinite(F)&&F>ye)&&(Y=A(q.clone())),(async()=>{var te,re;try{let z=(te=g.text)!=null?te:g.textPromise?await g.textPromise:void 0;if(z?(L.reqBody=g.premasked?y(z):c(z),L.reqSize=(re=g.size)!=null?re:z.length):g.size!=null&&(L.reqSize=g.size),Y){let G=await Y;G.text&&(L.resBody=c(G.text)),Number.isFinite(F)||(L.resSize=G.bytes)}}catch(z){}e(L)})()}}}catch(L){}return q}catch(q){try{m(p)||e({type:"network",ts:r,method:d,url:i(p),status:0,durationMs:Date.now()-r,initiator:"fetch"})}catch(L){}throw q}};let k=XMLHttpRequest.prototype.open,b=XMLHttpRequest.prototype.send,I=XMLHttpRequest.prototype.setRequestHeader;return XMLHttpRequest.prototype.open=function(a,r,...o){return this.__iris={method:String(a).toUpperCase(),url:String(r),start:0,reqHeaders:{},reqBody:void 0,reqSize:void 0,premasked:!1},k.apply(this,[a,r,...o])},XMLHttpRequest.prototype.setRequestHeader=function(a,r){let o=this.__iris;return o&&(o.reqHeaders[a]=r),I.apply(this,[a,r])},XMLHttpRequest.prototype.send=function(...a){let r=this.__iris;if(r){r.start=Date.now();let o=a[0];typeof o=="string"?(r.reqBody=o,r.reqSize=o.length):typeof URLSearchParams!="undefined"&&o instanceof URLSearchParams?(r.reqBody=o.toString(),r.reqSize=r.reqBody.length):typeof FormData!="undefined"&&o instanceof FormData?(r.reqBody=w(o),r.reqSize=r.reqBody.length,r.premasked=!0):typeof Blob!="undefined"&&o instanceof Blob?r.reqSize=o.size:(typeof ArrayBuffer!="undefined"&&o instanceof ArrayBuffer||typeof ArrayBuffer!="undefined"&&ArrayBuffer.isView(o))&&(r.reqSize=o.byteLength),this.addEventListener("loadend",()=>{var p;try{if(m(r.url))return;let d={type:"network",ts:r.start,method:r.method,url:i(r.url),status:this.status,durationMs:Date.now()-r.start,initiator:"xhr"};if(s){d.reqHeaders=u(r.reqHeaders),d.resHeaders=u(R(this.getAllResponseHeaders()));let g=(p=this.getResponseHeader("content-type"))!=null?p:void 0;g&&(d.contentType=g),r.reqBody!=null&&(d.reqBody=r.premasked?y(r.reqBody):c(r.reqBody)),r.reqSize!=null&&(d.reqSize=r.reqSize);let h=this.responseType;if(h===""||h==="text")try{let l=this.responseText;l&&(d.resBody=c(l),d.resSize=l.length)}catch(l){}else if(h==="json")try{let l=this.response;if(l!=null){let x=JSON.stringify(l);d.resBody=c(x),d.resSize=x.length}}catch(l){}else if(h==="arraybuffer"){let l=this.response;l&&(d.resSize=l.byteLength)}else if(h==="blob"){let l=this.response;l&&(d.resSize=l.size)}}e(d)}catch(d){}})}return b.apply(this,a)},()=>{window.fetch=f,XMLHttpRequest.prototype.open=k,XMLHttpRequest.prototype.send=b,XMLHttpRequest.prototype.setRequestHeader=I}}var He=200,Pe=2e3,ge=0;function he(e,t={},n=!1){var b,I,B,a;let s=U(t),i=(b=t.wsMaxFrames)!=null?b:He,u=(I=t.wsMaxFrameChars)!=null?I:Pe,c=new Set((B=t.wsFrameTypes)!=null?B:["text","binary"]),y=(a=t.ignoreUrls)!=null?a:[],S=r=>{let o=r.trim();if(!o.startsWith("{")&&!o.startsWith("["))return!1;try{return JSON.parse(o),!0}catch(p){return!1}},m=r=>typeof r=="string"?c.has("text")?!0:c.has("json")?S(r):!1:c.has("binary"),v=r=>typeof r=="string"&&y.some(o=>typeof o=="string"?r.includes(o):o.test(r)),E=r=>{try{e(r)}catch(o){}},_=(...r)=>{n&&console.debug("[iris]",...r)},R=r=>{if(typeof r=="string")return{data:s.maskBody(r,u),size:r.length};if(typeof Blob!="undefined"&&r instanceof Blob)return{binary:!0,size:r.size};if(typeof ArrayBuffer!="undefined"){if(r instanceof ArrayBuffer)return{binary:!0,size:r.byteLength};if(ArrayBuffer.isView(r))return{binary:!0,size:r.byteLength}}return{}},w=window.WebSocket,M=!1,A;if(typeof w=="function"){M=!0;class r extends w{constructor(d,g){super(d,g);try{let h=typeof d=="string"?d:String(d);if(v(h))return;let l=`ws${++ge}`,x={sent:0,recv:0,dropped:0};this.__iris={connId:l,budget:x},E({type:"ws",ts:Date.now(),connId:l,op:"open",transport:"websocket",url:s.maskUrl(h)}),this.addEventListener("message",C=>{if(m(C.data)){if(x.recv>=i){x.dropped++;return}x.recv++,E({type:"ws",ts:Date.now(),connId:l,op:"message",transport:"websocket",...R(C.data)})}}),this.addEventListener("close",C=>{E({type:"ws",ts:Date.now(),connId:l,op:"close",transport:"websocket",code:C.code,reason:C.reason||void 0,dropped:x.dropped||void 0}),_(`ws ${l} closed (${C.code}) \u2014 frames \u2191${x.sent} \u2193${x.recv}, dropped ${x.dropped}`)}),this.addEventListener("error",()=>{E({type:"ws",ts:Date.now(),connId:l,op:"error",transport:"websocket"})})}catch(h){}}}A=w.prototype.send;let o=A;w.prototype.send=function(p){try{let d=this.__iris;d&&m(p)&&(d.budget.sent>=i?d.budget.dropped++:(d.budget.sent++,E({type:"ws",ts:Date.now(),connId:d.connId,op:"send",transport:"websocket",...R(p)})))}catch(d){}return o.call(this,p)},window.WebSocket=r}let f=window.EventSource,k=!1;if(typeof f=="function"){k=!0;class r extends f{constructor(p,d){super(p,d);try{let g=typeof p=="string"?p:String(p);if(v(g))return;let h=`es${++ge}`,l={recv:0,dropped:0},x=(T,q)=>{if(m(T.data)){if(l.recv>=i){l.dropped++;return}l.recv++,E({type:"ws",ts:Date.now(),connId:h,op:"message",transport:"eventsource",...q?{event:q}:{},...R(T.data)})}};this.__iris={record:x,mirrored:new Set},E({type:"ws",ts:Date.now(),connId:h,op:"open",transport:"eventsource",url:s.maskUrl(g)}),super.addEventListener("message",T=>x(T)),super.addEventListener("error",()=>{E({type:"ws",ts:Date.now(),connId:h,op:"error",transport:"eventsource"})});let C=this.close.bind(this);this.close=()=>{try{E({type:"ws",ts:Date.now(),connId:h,op:"close",transport:"eventsource",dropped:l.dropped||void 0}),_(`es ${h} closed \u2014 frames \u2193${l.recv}, dropped ${l.dropped}`)}catch(T){}C()}}catch(g){}}addEventListener(p,d,g){try{let h=this.__iris;h&&p!=="message"&&p!=="error"&&p!=="open"&&!h.mirrored.has(p)&&(h.mirrored.add(p),super.addEventListener(p,(l=>h.record(l,p))))}catch(h){}super.addEventListener(p,d,g)}}window.EventSource=r}return()=>{M&&(window.WebSocket=w,A&&(w.prototype.send=A)),k&&(window.EventSource=f)}}var ke=["log","info","warn","error","debug"],Ne=e=>typeof e[0]=="string"&&e[0].startsWith("[iris]");function be(e,t={}){let n=t.captureIrisLogs===!0,s={};for(let i of ke)s[i]=console[i].bind(console),console[i]=(...u)=>{try{(n||!Ne(u))&&e({type:"console",ts:Date.now(),level:i,args:u.map($e)})}catch(c){}s[i](...u)};return()=>{for(let i of ke)s[i]&&(console[i]=s[i])}}function $e(e){if(typeof e=="string")return e;try{return JSON.stringify(e)}catch(t){return String(e)}}var O=require("web-vitals");function ve(e){let t=n=>s=>{e({type:"vital",ts:Date.now(),metric:n,value:s.value,rating:s.rating})};(0,O.onLCP)(t("LCP")),(0,O.onCLS)(t("CLS")),(0,O.onINP)(t("INP")),(0,O.onFCP)(t("FCP")),(0,O.onTTFB)(t("TTFB"))}function we(e){let t=location.href,n=()=>{try{let u=location.href;if(u===t)return;let c=t;t=u,e({type:"navigation",ts:Date.now(),from:c,to:u})}catch(u){}},s=history.pushState,i=history.replaceState;return history.pushState=function(...u){let c=s.apply(this,u);return n(),c},history.replaceState=function(...u){let c=i.apply(this,u);return n(),c},addEventListener("popstate",n),addEventListener("hashchange",n),()=>{history.pushState=s,history.replaceState=i,removeEventListener("popstate",n),removeEventListener("hashchange",n)}}function Ee(e,t={}){var A,f,k,b,I;let n=(A=t.rageThreshold)!=null?A:3,s=(f=t.rageWindowMs)!=null?f:1e3,i=(k=t.rageRadiusPx)!=null?k:30,u=(b=t.deadWindowMs)!=null?b:2500,c=(I=t.errorWindowMs)!=null?I:2500,y=0,S=0,m=0,v=[],E=()=>{y=Date.now()},_=new MutationObserver(E);_.observe(document,{subtree:!0,childList:!0,attributes:!0,characterData:!0}),addEventListener("scroll",E,!0);let R=()=>{S=Date.now()};addEventListener("error",R,!0),addEventListener("unhandledrejection",R,!0);let w=(B,a,r,o,p,d)=>{e({type:"click",ts:a,kind:B,selector:We(r),text:Xe(r),x:o,y:p,...d?{count:d}:{}})},M=B=>{try{let a=Date.now(),r=B.clientX,o=B.clientY,p=B.target;for(;v.length&&a-v[0].t>s;)v.shift();let d=v.filter(x=>Math.hypot(x.x-r,x.y-o)<=i).length;if(v.push({x:r,y:o,t:a}),d+1>=n&&(m=a,w("rage",a,p,r,o,d+1),v.length=0),d>0)return;let g=S;if(setTimeout(()=>{S>g&&w("error",a,p,r,o)},c),!Ke(p))return;let h=y,l=location.href;setTimeout(()=>{let x=y>h||location.href!==l,C=S>g;!x&&!C&&m<a&&w("dead",a,p,r,o)},u)}catch(a){}};return addEventListener("click",M,!0),()=>{_.disconnect(),removeEventListener("scroll",E,!0),removeEventListener("error",R,!0),removeEventListener("unhandledrejection",R,!0),removeEventListener("click",M,!0)}}function We(e){var s;if(!e||!e.tagName)return"unknown";let t=e.tagName.toLowerCase();e.id&&(t+=`#${e.id}`);let n=((s=e.getAttribute("class"))!=null?s:"").trim().split(/\s+/).filter(Boolean)[0];return n&&(t+=`.${n}`),t}function Xe(e){var t;if(e)try{if(e.closest(".twc-mask, .twc-block"))return;let n=e.getAttribute("aria-label"),s=((t=n!=null?n:e.textContent)!=null?t:"").replace(/\s+/g," ").trim();return s?s.length>50?`${s.slice(0,50)}\u2026`:s:void 0}catch(n){return}}function Ke(e){if(!e||e.closest("input, textarea, select, label"))return!1;if(e.closest('a, button, [role="button"], [onclick]'))return!0;try{return getComputedStyle(e).cursor==="pointer"}catch(t){return!1}}var H=J;function Ve(e){var y,S;let t=se(e.release,(y=e.user)!=null?y:e.userId,e.sessionId),n=new X({endpoint:e.endpoint,projectKey:e.projectKey,meta:t,debug:e.debug}),s=n.push.bind(n),i=[],u=e.track===!1?()=>{}:ie(s,typeof e.network=="object"?e.network:{},typeof e.track=="object"?e.track:{}),c=e.errors===!1?J:pe(s,typeof e.network=="object"?e.network:{});if(H=c,e.replay!==!1&&i.push(fe(s,{maskAllInputs:(S=e.maskAllInputs)!=null?S:!0,maskTextSelector:e.maskTextSelector,blockSelector:e.blockSelector})),e.errors!==!1&&i.push(le(s)),e.console!==!1&&i.push(be(s,typeof e.console=="object"?e.console:{})),e.navigation!==!1&&i.push(we(s)),e.frustration!==!1&&i.push(Ee(s)),e.vitals!==!1&&ve(s),e.network!==!1){let m={ignoreUrls:[`${e.endpoint}/v1/ingest`],...typeof e.network=="object"?e.network:{}};i.push(me(s,m)),m.captureWebSockets!==!1&&i.push(he(s,m,e.debug))}return e.debug&&console.debug("[iris] recording",t.sessionId,"\u2192",e.endpoint),{sessionId:t.sessionId,identify:m=>n.identify(m),track:u,captureException:c.captureException,captureMessage:c.captureMessage,flush:()=>n.flush(!1),stop:()=>{H===c&&(H=J),i.forEach(m=>m()),n.stop()}}}var Je=(e,t)=>H.captureException(e,t),Ye=(e,t)=>H.captureMessage(e,t);0&&(module.exports={captureException,captureMessage,currentSessionId,record});
2
2
  //# sourceMappingURL=index.cjs.map