@runtimescope/sdk 0.8.0 → 0.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -1,5 +1,5 @@
1
- "use strict";var M=Object.defineProperty;var ie=Object.getOwnPropertyDescriptor;var ae=Object.getOwnPropertyNames;var ce=Object.prototype.hasOwnProperty;var ue=(e,t,n)=>t in e?M(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n;var de=(e,t)=>{for(var n in t)M(e,n,{get:t[n],enumerable:!0})},le=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of ae(t))!ce.call(e,s)&&s!==n&&M(e,s,{get:()=>t[s],enumerable:!(r=ie(t,s))||r.enumerable});return e};var pe=e=>le(M({},"__esModule",{value:!0}),e);var p=(e,t,n)=>ue(e,typeof t!="symbol"?t+"":t,n);var Xe={};de(Xe,{RuntimeScope:()=>E,default:()=>je});module.exports=pe(Xe);var k=console.debug.bind(console),R=class R{constructor(t){p(this,"ws",null);p(this,"batch",[]);p(this,"offlineQueue",[]);p(this,"flushTimer",null);p(this,"reconnectTimer",null);p(this,"reconnectDelay",500);p(this,"reconnectAttempt",0);p(this,"connected",!1);p(this,"stopped",!1);p(this,"config");p(this,"commandHandler",null);p(this,"hasEverConnected",!1);p(this,"connectionWarningTimer",null);p(this,"visibilityHandler",null);p(this,"onlineHandler",null);this.config=t}connect(){this.stopped=!1,this.doConnect(),this.connectionWarningTimer=setTimeout(()=>{!this.hasEverConnected&&!this.stopped&&console.warn(`[RuntimeScope] SDK has not connected to ${this.config.serverUrl} after 10s. Is the collector running? Start it with: npx @runtimescope/collector`)},R.CONNECTION_WARNING_DELAY),typeof document<"u"&&(this.visibilityHandler=()=>{document.visibilityState==="visible"&&!this.connected&&!this.stopped&&(k("[RuntimeScope] Tab visible \u2014 attempting immediate reconnect"),this.resetReconnectState(),this.reconnectTimer&&(clearTimeout(this.reconnectTimer),this.reconnectTimer=null),this.doConnect())},document.addEventListener("visibilitychange",this.visibilityHandler)),typeof window<"u"&&(this.onlineHandler=()=>{!this.connected&&!this.stopped&&(k("[RuntimeScope] Network online \u2014 attempting immediate reconnect"),this.resetReconnectState(),this.reconnectTimer&&(clearTimeout(this.reconnectTimer),this.reconnectTimer=null),this.doConnect())},window.addEventListener("online",this.onlineHandler))}doConnect(){if(!this.stopped){try{this.ws=new WebSocket(this.config.serverUrl)}catch{this.scheduleReconnect();return}this.ws.onmessage=t=>{try{let n=JSON.parse(String(t.data));n.type==="command"&&n.payload&&this.commandHandler&&this.commandHandler(n.payload),n.type==="__server_restart"&&(k("[RuntimeScope] Server restart notice received \u2014 will reconnect immediately"),this.resetReconnectState()),n.type==="error"&&n.payload?.code==="AUTH_FAILED"&&(k("[RuntimeScope] Authentication failed \u2014 stopping reconnection"),this.stopped=!0)}catch{}},this.ws.onopen=()=>{if(this.connected=!0,this.hasEverConnected=!0,this.resetReconnectState(),k(`[RuntimeScope] Connected to ${this.config.serverUrl}`),this.sendRaw({type:"handshake",payload:{appName:this.config.appName,sdkVersion:this.config.sdkVersion,sessionId:this.config.sessionId,...this.config.authToken?{authToken:this.config.authToken}:{}},timestamp:Date.now(),sessionId:this.config.sessionId}),this.offlineQueue.length>0){let t=this.offlineQueue.splice(0);for(let n of t)this.batch.push(n);this.flush()}this.flushTimer=setInterval(()=>this.flush(),this.config.flushIntervalMs)},this.ws.onclose=()=>{this.connected=!1,this.clearFlushTimer(),this.stopped||(k("[RuntimeScope] Disconnected, will reconnect..."),this.scheduleReconnect())},this.ws.onerror=()=>{k(`[RuntimeScope] WebSocket error connecting to ${this.config.serverUrl}`)}}}send(t){this.connected?(this.batch.push(t),this.batch.length>=this.config.batchSize&&this.flush()):this.offlineQueue.length<R.MAX_OFFLINE_QUEUE&&this.offlineQueue.push(t)}flush(){if(this.batch.length===0||!this.connected||!this.ws)return;let t=this.batch.splice(0);this.sendRaw({type:"event",payload:{events:t},timestamp:Date.now(),sessionId:this.config.sessionId})}sendRaw(t){if(this.ws&&this.ws.readyState===WebSocket.OPEN)try{this.ws.send(JSON.stringify(t))}catch{}}scheduleReconnect(){if(this.stopped||this.reconnectTimer)return;this.reconnectAttempt++;let t;if(this.reconnectAttempt<=R.FAST_RETRY_COUNT)t=R.FAST_RETRY_DELAY;else{let n=this.reconnectDelay*.25*(Math.random()*2-1);t=Math.min(this.reconnectDelay+n,R.MAX_RECONNECT_DELAY),this.reconnectDelay=Math.min(this.reconnectDelay*2,R.MAX_RECONNECT_DELAY)}this.reconnectTimer=setTimeout(()=>{this.reconnectTimer=null,this.doConnect()},t)}resetReconnectState(){this.reconnectDelay=500,this.reconnectAttempt=0}clearFlushTimer(){this.flushTimer&&(clearInterval(this.flushTimer),this.flushTimer=null)}onCommand(t){this.commandHandler=t}sendCommandResponse(t,n,r){this.sendRaw({type:"command_response",requestId:t,command:n,payload:r,timestamp:Date.now(),sessionId:this.config.sessionId})}disconnect(){this.stopped=!0,this.clearFlushTimer(),this.connectionWarningTimer&&(clearTimeout(this.connectionWarningTimer),this.connectionWarningTimer=null),this.reconnectTimer&&(clearTimeout(this.reconnectTimer),this.reconnectTimer=null),this.visibilityHandler&&typeof document<"u"&&(document.removeEventListener("visibilitychange",this.visibilityHandler),this.visibilityHandler=null),this.onlineHandler&&typeof window<"u"&&(window.removeEventListener("online",this.onlineHandler),this.onlineHandler=null),this.flush(),this.ws&&(this.ws.onclose=null,this.ws.onerror=null,this.ws.close(),this.ws=null),this.connected=!1,this.batch=[],this.offlineQueue=[]}};p(R,"MAX_OFFLINE_QUEUE",1e3),p(R,"MAX_RECONNECT_DELAY",3e4),p(R,"CONNECTION_WARNING_DELAY",1e4),p(R,"FAST_RETRY_COUNT",3),p(R,"FAST_RETRY_DELAY",500);var F=R;function m(){let e=new Uint8Array(8);return crypto.getRandomValues(e),Array.from(e,t=>t.toString(16).padStart(2,"0")).join("")}function $(){let e=new Uint8Array(16);return crypto.getRandomValues(e),Array.from(e,t=>t.toString(16).padStart(2,"0")).join("")}var fe=1e3,me=1e4,he=5e3,C=new Map,x=null,P=0;function ve(){P++,!x&&(x=setInterval(()=>{let e=Date.now()-me;for(let[t,n]of C)n<e&&C.delete(t)},he))}function ge(){P--,P<=0&&x&&(clearInterval(x),x=null,P=0)}function W(e,t,n,r){let s=window.fetch,c=new Set(n.map(a=>a.toLowerCase())),o=r?.captureBody??!1,i=r?.maxBodySize??65536;return ve(),window.fetch=async function(a,u){let d=performance.now(),l=typeof a=="string"?a:a instanceof URL?a.href:a.url,f=(u?.method??"GET").toUpperCase(),b=ye(u?.headers,c),g=Re(u?.body),T=Se(u?.body),D;o&&u?.body&&(D=Ee(u.body,i));let U=`${f}:${l}:${d}`;if(C.size>=fe){let h=C.keys().next().value;h!==void 0&&C.delete(h)}C.set(U,Date.now());try{let h=await s.call(window,a,u),_=performance.now()-d,L=parseInt(h.headers.get("content-length")||"0",10),I=we(h.headers,c),v;if(o)try{let O=await h.clone().text();v=O.length>i?O.slice(0,i):O}catch{}let w={eventId:m(),sessionId:t,timestamp:Date.now(),eventType:"network",url:l,method:f,status:h.status,requestHeaders:b,responseHeaders:I,requestBodySize:g,responseBodySize:L,duration:_,ttfb:_,graphqlOperation:T,requestBody:D,responseBody:v,source:"fetch"};if(r?.beforeSend){let S=r.beforeSend(w);S&&e(S)}else e(w);return h}catch(h){let _=performance.now()-d,L="error",I="";h instanceof DOMException&&h.name==="AbortError"?(L="abort",I="Request aborted"):h instanceof Error&&(I=h.message);let v={eventId:m(),sessionId:t,timestamp:Date.now(),eventType:"network",url:l,method:f,status:0,requestHeaders:b,responseHeaders:{},requestBodySize:g,responseBodySize:0,duration:_,ttfb:0,graphqlOperation:T,requestBody:D,errorPhase:L,errorMessage:I,source:"fetch"};if(r?.beforeSend){let w=r.beforeSend(v);w&&e(w)}else e(v);throw h}},()=>{window.fetch=s,ge()}}function ye(e,t){let n={};if(!e)return n;if(e instanceof Headers)e.forEach((r,s)=>{n[s]=t.has(s.toLowerCase())?"[REDACTED]":r});else if(Array.isArray(e))for(let[r,s]of e)n[r]=t.has(r.toLowerCase())?"[REDACTED]":s;else for(let[r,s]of Object.entries(e))n[r]=t.has(r.toLowerCase())?"[REDACTED]":s;return n}function we(e,t){let n={};return e.forEach((r,s)=>{n[s]=t.has(s.toLowerCase())?"[REDACTED]":r}),n}function Re(e){return e?typeof e=="string"?new Blob([e]).size:e instanceof Blob?e.size:e instanceof ArrayBuffer||ArrayBuffer.isView(e)?e.byteLength:e instanceof FormData?0:e instanceof URLSearchParams?new Blob([e.toString()]).size:0:0}function Ee(e,t){if(e){if(typeof e=="string")return e.length>t?e.slice(0,t):e;if(e instanceof URLSearchParams){let n=e.toString();return n.length>t?n.slice(0,t):n}if(e instanceof FormData)return"[FormData]";if(e instanceof Blob)return`[Blob ${e.size} bytes]`;if(e instanceof ArrayBuffer)return`[ArrayBuffer ${e.byteLength} bytes]`;if(ArrayBuffer.isView(e))return`[TypedArray ${e.byteLength} bytes]`}}function Se(e){if(!(!e||typeof e!="string"))try{let t=JSON.parse(e);if(typeof t.query=="string"){let n=t.query.trim(),r="query";n.startsWith("mutation")?r="mutation":n.startsWith("subscription")&&(r="subscription");let s=t.operationName||be(n)||"anonymous";return{type:r,name:s}}}catch{}}function be(e){return e.match(/^(?:query|mutation|subscription)\s+(\w+)/)?.[1]}function y(e,t=5){let n=new WeakSet;function r(s,c){if(c>t)return"[max depth]";if(s==null)return s;if(typeof s=="function")return`[Function: ${s.name||"anonymous"}]`;if(typeof s=="symbol"||typeof s=="bigint")return s.toString();if(typeof s!="object")return s;if(s instanceof Error)return{name:s.name,message:s.message,stack:s.stack};if(s instanceof Date)return s.toISOString();if(s instanceof RegExp)return s.toString();if(n.has(s))return"[Circular]";if(n.add(s),Array.isArray(s))return s.map(u=>r(u,c+1));let o={},i;try{i=Object.keys(s)}catch{return"[Object]"}let a=50;for(let u=0;u<Math.min(i.length,a);u++)try{o[i[u]]=r(s[i[u]],c+1)}catch{o[i[u]]="[Error accessing property]"}return i.length>a&&(o["..."]=`${i.length-a} more keys`),o}return r(e,0)}var V=["log","warn","error","info","debug","trace"];function G(e,t,n){let r={};for(let s of V)r[s]=console[s].bind(console),console[s]=(...c)=>{let o=c.map(a=>typeof a=="string"?a:_e(a)).join(" "),i={eventId:m(),sessionId:t,timestamp:Date.now(),eventType:"console",level:s,message:o,args:c.map(a=>y(a,3)),stackTrace:s==="error"||s==="trace"?new Error().stack?.split(`
1
+ "use strict";var M=Object.defineProperty;var ie=Object.getOwnPropertyDescriptor;var ae=Object.getOwnPropertyNames;var ce=Object.prototype.hasOwnProperty;var ue=(t,e,s)=>e in t?M(t,e,{enumerable:!0,configurable:!0,writable:!0,value:s}):t[e]=s;var de=(t,e)=>{for(var s in e)M(t,s,{get:e[s],enumerable:!0})},le=(t,e,s,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of ae(e))!ce.call(t,r)&&r!==s&&M(t,r,{get:()=>e[r],enumerable:!(n=ie(e,r))||n.enumerable});return t};var pe=t=>le(M({},"__esModule",{value:!0}),t);var p=(t,e,s)=>ue(t,typeof e!="symbol"?e+"":e,s);var Xe={};de(Xe,{RuntimeScope:()=>E,default:()=>Ue});module.exports=pe(Xe);var k=console.debug.bind(console),R=class R{constructor(e){p(this,"ws",null);p(this,"batch",[]);p(this,"offlineQueue",[]);p(this,"flushTimer",null);p(this,"reconnectTimer",null);p(this,"reconnectDelay",500);p(this,"reconnectAttempt",0);p(this,"connected",!1);p(this,"stopped",!1);p(this,"config");p(this,"commandHandler",null);p(this,"hasEverConnected",!1);p(this,"connectionWarningTimer",null);p(this,"visibilityHandler",null);p(this,"onlineHandler",null);this.config=e}connect(){this.stopped=!1,this.doConnect(),this.connectionWarningTimer=setTimeout(()=>{!this.hasEverConnected&&!this.stopped&&console.warn(`[RuntimeScope] SDK has not connected to ${this.config.serverUrl} after 10s. Is the collector running? Start it with: npx @runtimescope/collector`)},R.CONNECTION_WARNING_DELAY),typeof document<"u"&&(this.visibilityHandler=()=>{document.visibilityState==="visible"&&!this.connected&&!this.stopped&&(k("[RuntimeScope] Tab visible \u2014 attempting immediate reconnect"),this.resetReconnectState(),this.reconnectTimer&&(clearTimeout(this.reconnectTimer),this.reconnectTimer=null),this.doConnect())},document.addEventListener("visibilitychange",this.visibilityHandler)),typeof window<"u"&&(this.onlineHandler=()=>{!this.connected&&!this.stopped&&(k("[RuntimeScope] Network online \u2014 attempting immediate reconnect"),this.resetReconnectState(),this.reconnectTimer&&(clearTimeout(this.reconnectTimer),this.reconnectTimer=null),this.doConnect())},window.addEventListener("online",this.onlineHandler))}doConnect(){if(!this.stopped){try{this.ws=new WebSocket(this.config.serverUrl)}catch{this.scheduleReconnect();return}this.ws.onmessage=e=>{try{let s=JSON.parse(String(e.data));s.type==="command"&&s.payload&&this.commandHandler&&this.commandHandler(s.payload),s.type==="__server_restart"&&(k("[RuntimeScope] Server restart notice received \u2014 will reconnect immediately"),this.resetReconnectState()),s.type==="error"&&s.payload?.code==="AUTH_FAILED"&&(k("[RuntimeScope] Authentication failed \u2014 stopping reconnection"),this.stopped=!0)}catch{}},this.ws.onopen=()=>{if(this.connected=!0,this.hasEverConnected=!0,this.resetReconnectState(),k(`[RuntimeScope] Connected to ${this.config.serverUrl}`),this.sendRaw({type:"handshake",payload:{appName:this.config.appName,sdkVersion:this.config.sdkVersion,sessionId:this.config.sessionId,...this.config.authToken?{authToken:this.config.authToken}:{},...this.config.projectId?{projectId:this.config.projectId}:{}},timestamp:Date.now(),sessionId:this.config.sessionId}),this.offlineQueue.length>0){let e=this.offlineQueue.splice(0);for(let s of e)this.batch.push(s);this.flush()}this.flushTimer=setInterval(()=>this.flush(),this.config.flushIntervalMs)},this.ws.onclose=()=>{this.connected=!1,this.clearFlushTimer(),this.stopped||(k("[RuntimeScope] Disconnected, will reconnect..."),this.scheduleReconnect())},this.ws.onerror=()=>{k(`[RuntimeScope] WebSocket error connecting to ${this.config.serverUrl}`)}}}send(e){this.connected?(this.batch.push(e),this.batch.length>=this.config.batchSize&&this.flush()):this.offlineQueue.length<R.MAX_OFFLINE_QUEUE&&this.offlineQueue.push(e)}flush(){if(this.batch.length===0||!this.connected||!this.ws)return;let e=this.batch.splice(0);this.sendRaw({type:"event",payload:{events:e},timestamp:Date.now(),sessionId:this.config.sessionId})}sendRaw(e){if(this.ws&&this.ws.readyState===WebSocket.OPEN)try{this.ws.send(JSON.stringify(e))}catch{}}scheduleReconnect(){if(this.stopped||this.reconnectTimer)return;this.reconnectAttempt++;let e;if(this.reconnectAttempt<=R.FAST_RETRY_COUNT)e=R.FAST_RETRY_DELAY;else{let s=this.reconnectDelay*.25*(Math.random()*2-1);e=Math.min(this.reconnectDelay+s,R.MAX_RECONNECT_DELAY),this.reconnectDelay=Math.min(this.reconnectDelay*2,R.MAX_RECONNECT_DELAY)}this.reconnectTimer=setTimeout(()=>{this.reconnectTimer=null,this.doConnect()},e)}resetReconnectState(){this.reconnectDelay=500,this.reconnectAttempt=0}clearFlushTimer(){this.flushTimer&&(clearInterval(this.flushTimer),this.flushTimer=null)}onCommand(e){this.commandHandler=e}sendCommandResponse(e,s,n){this.sendRaw({type:"command_response",requestId:e,command:s,payload:n,timestamp:Date.now(),sessionId:this.config.sessionId})}disconnect(){this.stopped=!0,this.clearFlushTimer(),this.connectionWarningTimer&&(clearTimeout(this.connectionWarningTimer),this.connectionWarningTimer=null),this.reconnectTimer&&(clearTimeout(this.reconnectTimer),this.reconnectTimer=null),this.visibilityHandler&&typeof document<"u"&&(document.removeEventListener("visibilitychange",this.visibilityHandler),this.visibilityHandler=null),this.onlineHandler&&typeof window<"u"&&(window.removeEventListener("online",this.onlineHandler),this.onlineHandler=null),this.flush(),this.ws&&(this.ws.onclose=null,this.ws.onerror=null,this.ws.close(),this.ws=null),this.connected=!1,this.batch=[],this.offlineQueue=[]}};p(R,"MAX_OFFLINE_QUEUE",1e3),p(R,"MAX_RECONNECT_DELAY",3e4),p(R,"CONNECTION_WARNING_DELAY",1e4),p(R,"FAST_RETRY_COUNT",3),p(R,"FAST_RETRY_DELAY",500);var F=R;function m(){let t=new Uint8Array(8);return crypto.getRandomValues(t),Array.from(t,e=>e.toString(16).padStart(2,"0")).join("")}function $(){let t=new Uint8Array(16);return crypto.getRandomValues(t),Array.from(t,e=>e.toString(16).padStart(2,"0")).join("")}var fe=1e3,me=1e4,he=5e3,C=new Map,H=null,P=0;function ve(){P++,!H&&(H=setInterval(()=>{let t=Date.now()-me;for(let[e,s]of C)s<t&&C.delete(e)},he))}function ge(){P--,P<=0&&H&&(clearInterval(H),H=null,P=0)}function W(t,e,s,n){let r=window.fetch,c=new Set(s.map(a=>a.toLowerCase())),i=n?.captureBody??!1,o=n?.maxBodySize??65536;return ve(),window.fetch=async function(a,u){let d=performance.now(),l=typeof a=="string"?a:a instanceof URL?a.href:a.url,f=(u?.method??"GET").toUpperCase(),b=ye(u?.headers,c),g=Re(u?.body),T=Se(u?.body),x;i&&u?.body&&(x=Ee(u.body,o));let j=`${f}:${l}:${d}`;if(C.size>=fe){let h=C.keys().next().value;h!==void 0&&C.delete(h)}C.set(j,Date.now());try{let h=await r.call(window,a,u),_=performance.now()-d,L=parseInt(h.headers.get("content-length")||"0",10),I=we(h.headers,c),v;if(i)try{let O=await h.clone().text();v=O.length>o?O.slice(0,o):O}catch{}let w={eventId:m(),sessionId:e,timestamp:Date.now(),eventType:"network",url:l,method:f,status:h.status,requestHeaders:b,responseHeaders:I,requestBodySize:g,responseBodySize:L,duration:_,ttfb:_,graphqlOperation:T,requestBody:x,responseBody:v,source:"fetch"};if(n?.beforeSend){let S=n.beforeSend(w);S&&t(S)}else t(w);return h}catch(h){let _=performance.now()-d,L="error",I="";h instanceof DOMException&&h.name==="AbortError"?(L="abort",I="Request aborted"):h instanceof Error&&(I=h.message);let v={eventId:m(),sessionId:e,timestamp:Date.now(),eventType:"network",url:l,method:f,status:0,requestHeaders:b,responseHeaders:{},requestBodySize:g,responseBodySize:0,duration:_,ttfb:0,graphqlOperation:T,requestBody:x,errorPhase:L,errorMessage:I,source:"fetch"};if(n?.beforeSend){let w=n.beforeSend(v);w&&t(w)}else t(v);throw h}},()=>{window.fetch=r,ge()}}function ye(t,e){let s={};if(!t)return s;if(t instanceof Headers)t.forEach((n,r)=>{s[r]=e.has(r.toLowerCase())?"[REDACTED]":n});else if(Array.isArray(t))for(let[n,r]of t)s[n]=e.has(n.toLowerCase())?"[REDACTED]":r;else for(let[n,r]of Object.entries(t))s[n]=e.has(n.toLowerCase())?"[REDACTED]":r;return s}function we(t,e){let s={};return t.forEach((n,r)=>{s[r]=e.has(r.toLowerCase())?"[REDACTED]":n}),s}function Re(t){return t?typeof t=="string"?new Blob([t]).size:t instanceof Blob?t.size:t instanceof ArrayBuffer||ArrayBuffer.isView(t)?t.byteLength:t instanceof FormData?0:t instanceof URLSearchParams?new Blob([t.toString()]).size:0:0}function Ee(t,e){if(t){if(typeof t=="string")return t.length>e?t.slice(0,e):t;if(t instanceof URLSearchParams){let s=t.toString();return s.length>e?s.slice(0,e):s}if(t instanceof FormData)return"[FormData]";if(t instanceof Blob)return`[Blob ${t.size} bytes]`;if(t instanceof ArrayBuffer)return`[ArrayBuffer ${t.byteLength} bytes]`;if(ArrayBuffer.isView(t))return`[TypedArray ${t.byteLength} bytes]`}}function Se(t){if(!(!t||typeof t!="string"))try{let e=JSON.parse(t);if(typeof e.query=="string"){let s=e.query.trim(),n="query";s.startsWith("mutation")?n="mutation":s.startsWith("subscription")&&(n="subscription");let r=e.operationName||be(s)||"anonymous";return{type:n,name:r}}}catch{}}function be(t){return t.match(/^(?:query|mutation|subscription)\s+(\w+)/)?.[1]}function y(t,e=5){let s=new WeakSet;function n(r,c){if(c>e)return"[max depth]";if(r==null)return r;if(typeof r=="function")return`[Function: ${r.name||"anonymous"}]`;if(typeof r=="symbol"||typeof r=="bigint")return r.toString();if(typeof r!="object")return r;if(r instanceof Error)return{name:r.name,message:r.message,stack:r.stack};if(r instanceof Date)return r.toISOString();if(r instanceof RegExp)return r.toString();if(s.has(r))return"[Circular]";if(s.add(r),Array.isArray(r))return r.map(u=>n(u,c+1));let i={},o;try{o=Object.keys(r)}catch{return"[Object]"}let a=50;for(let u=0;u<Math.min(o.length,a);u++)try{i[o[u]]=n(r[o[u]],c+1)}catch{i[o[u]]="[Error accessing property]"}return o.length>a&&(i["..."]=`${o.length-a} more keys`),i}return n(t,0)}var V=["log","warn","error","info","debug","trace"];function G(t,e,s){let n={};for(let r of V)n[r]=console[r].bind(console),console[r]=(...c)=>{let i=c.map(a=>typeof a=="string"?a:_e(a)).join(" "),o={eventId:m(),sessionId:e,timestamp:Date.now(),eventType:"console",level:r,message:i,args:c.map(a=>y(a,3)),stackTrace:r==="error"||r==="trace"?new Error().stack?.split(`
2
2
  `).slice(2).join(`
3
- `):void 0,sourceFile:void 0};if(n){let a=n(i);a&&e(a)}else e(i);r[s](...c)};return()=>{for(let s of V)console[s]=r[s]}}function _e(e){try{return JSON.stringify(e)}catch{return String(e)}}function Q(e,t,n,r){let s=new Set(n.map(l=>l.toLowerCase())),c=r?.captureBody??!1,o=r?.maxBodySize??65536,i=new AbortController,a=XMLHttpRequest.prototype.open,u=XMLHttpRequest.prototype.setRequestHeader,d=XMLHttpRequest.prototype.send;return XMLHttpRequest.prototype.open=function(l,f){return this.__rs_method=l.toUpperCase(),this.__rs_url=typeof f=="string"?f:f.href,this.__rs_headers={},a.apply(this,arguments)},XMLHttpRequest.prototype.setRequestHeader=function(l,f){return this.__rs_headers&&(this.__rs_headers[l.toLowerCase()]=s.has(l.toLowerCase())?"[REDACTED]":f),u.call(this,l,f)},XMLHttpRequest.prototype.send=function(l){let f=this.__rs_method??"GET",b=this.__rs_url??"",g=`${f}:${b}`,T=!1;for(let v of C.keys())if(v.startsWith(g)){T=!0;break}if(T)return this.__rs_fetchIntercepted=!0,d.call(this,l);let D={...this.__rs_headers??{}},U=performance.now(),h,_=0;if(l){if(typeof l=="string")_=new Blob([l]).size,c&&(h=l.length>o?l.slice(0,o):l);else if(l instanceof Blob)_=l.size,c&&(h=`[Blob ${l.size} bytes]`);else if(l instanceof ArrayBuffer)_=l.byteLength,c&&(h=`[ArrayBuffer ${l.byteLength} bytes]`);else if(l instanceof FormData)c&&(h="[FormData]");else if(l instanceof URLSearchParams){let v=l.toString();_=new Blob([v]).size,c&&(h=v.length>o?v.slice(0,o):v)}}let L=Ie(l),I=v=>{let w={eventId:m(),sessionId:t,timestamp:Date.now(),eventType:"network",url:b,method:f,status:0,requestHeaders:D,responseHeaders:{},requestBodySize:_,responseBodySize:0,duration:0,ttfb:0,graphqlOperation:L,requestBody:h,source:"xhr",...v};if(r?.beforeSend){let S=r.beforeSend(w);S&&e(S)}else e(w)};return this.addEventListener("loadend",()=>{let v=performance.now()-U;if(this.status>0){let w=Te(this.getAllResponseHeaders(),s),S=parseInt(this.getResponseHeader("content-length")||"0",10),O;if(c&&(this.responseType===""||this.responseType==="text"))try{let j=this.responseText;O=j.length>o?j.slice(0,o):j}catch{}I({status:this.status,responseHeaders:w,responseBodySize:S,responseBody:O,duration:v,ttfb:v})}else{let w="error",S="Network error";this.readyState===0||this.status,this.timeout>0&&v>=this.timeout&&(w="timeout",S=`Request timed out after ${this.timeout}ms`),I({duration:v,errorPhase:w,errorMessage:S})}},{once:!0,signal:i.signal}),d.call(this,l)},()=>{i.abort(),XMLHttpRequest.prototype.open=a,XMLHttpRequest.prototype.setRequestHeader=u,XMLHttpRequest.prototype.send=d}}function Te(e,t){let n={};if(!e)return n;for(let r of e.trim().split(/[\r\n]+/)){let s=r.indexOf(":");if(s===-1)continue;let c=r.slice(0,s).trim().toLowerCase(),o=r.slice(s+1).trim();n[c]=t.has(c)?"[REDACTED]":o}return n}function Ie(e){if(!(!e||typeof e!="string"))try{let t=JSON.parse(e);if(typeof t.query=="string"){let n=t.query.trim(),r="query";n.startsWith("mutation")?r="mutation":n.startsWith("subscription")&&(r="subscription");let s=t.operationName||Ce(n)||"anonymous";return{type:r,name:s}}}catch{}}function Ce(e){return e.match(/^(?:query|mutation|subscription)\s+(\w+)/)?.[1]}function Y(e,t,n,r){let s=[],c=new Map;for(let[o,i]of Object.entries(n)){let a=ke(i);if(a==="zustand"){let u=i;B(e,t,r?.beforeSend,{storeId:o,library:a,phase:"init",state:y(u.getState(),4)});let d=u.subscribe((l,f)=>{let b=K(f,l);B(e,t,r?.beforeSend,{storeId:o,library:a,phase:"update",state:y(l,4),previousState:y(f,4),diff:b?y(b,3):void 0})});s.push(d)}else if(a==="redux"){let u=i;B(e,t,r?.beforeSend,{storeId:o,library:a,phase:"init",state:y(u.getState(),4)});let d,l=u.dispatch.bind(u);c.set(o,l),u.dispatch=g=>(g&&typeof g=="object"&&"type"in g&&(d={type:String(g.type),payload:g.payload}),l(g));let f=u.getState(),b=u.subscribe(()=>{let g=u.getState(),T=K(f,g);B(e,t,r?.beforeSend,{storeId:o,library:a,phase:"update",state:y(g,4),previousState:y(f,4),diff:T?y(T,3):void 0,action:d?y(d,3):void 0}),f=g,d=void 0});s.push(b)}}return()=>{for(let o of s)o();for(let[o,i]of c){let a=n[o];a&&(a.dispatch=i)}}}function ke(e){if(!e||typeof e!="object")return"unknown";let t=e;return typeof t.getState=="function"&&typeof t.setState=="function"&&typeof t.subscribe=="function"?"zustand":typeof t.dispatch=="function"&&typeof t.getState=="function"&&typeof t.subscribe=="function"?"redux":"unknown"}function K(e,t){if(!e||!t||typeof e!="object"||typeof t!="object")return null;let n={},r=e,s=t,c=new Set([...Object.keys(r),...Object.keys(s)]);for(let o of c)r[o]!==s[o]&&(n[o]={from:r[o],to:s[o]});return Object.keys(n).length>0?n:null}function B(e,t,n,r){let s={eventId:m(),sessionId:t,timestamp:Date.now(),eventType:"state",...r};if(n){let c=n(s);c&&e(c)}else e(s)}var Le={LCP:[2500,4e3],FCP:[1800,3e3],CLS:[.1,.25],TTFB:[800,1800],FID:[100,300],INP:[200,500]};function Oe(e,t){let[n,r]=Le[e]??[1/0,1/0];return t<=n?"good":t<=r?"needs-improvement":"poor"}var H=null;function J(e,t,n){if(H)for(let i of H)try{i.disconnect()}catch{}let r=[];H=r;let s=(i,a,u)=>{let d={eventId:m(),sessionId:t,timestamp:Date.now(),eventType:"performance",metricName:i,value:Math.round(a*100)/100,rating:Oe(i,a),element:u};if(n?.beforeSend){let l=n.beforeSend(d);l&&e(l)}else e(d)};N(r,"largest-contentful-paint",i=>{let a=i[i.length-1];if(!a)return;let u=a.element;s("LCP",a.startTime,u?.tagName?.toLowerCase())}),N(r,"paint",i=>{for(let a of i)a.name==="first-contentful-paint"&&s("FCP",a.startTime)});let c=0;N(r,"layout-shift",i=>{for(let a of i){let u=a;!u.hadRecentInput&&u.value&&(c+=u.value,s("CLS",c))}}),N(r,"first-input",i=>{let a=i[0];if(!a)return;let u=a;u.processingStart&&s("FID",u.processingStart-a.startTime)}),N(r,"navigation",i=>{let a=i[0];a&&s("TTFB",a.responseStart-a.requestStart)});let o=0;return N(r,"event",i=>{for(let a of i)a.duration>o&&(o=a.duration,s("INP",o))},{durationThreshold:16}),()=>{for(let i of r)try{i.disconnect()}catch{}H===r&&(H=null)}}function N(e,t,n,r){try{let s=new PerformanceObserver(c=>{n(c.getEntries())});s.observe({type:t,buffered:!0,...r}),e.push(s)}catch{}}var Ne=0,De=1,te=1e4,Z=100,xe=6e4,ee=500;function ne(e,t,n){let r=new Map,s=n?.snapshotIntervalMs??5e3,c=null,o=He();if(!o)return()=>{};let i=o.onCommitFiberRoot;return o._runtimescope_original=i,o.onCommitFiberRoot=(a,u)=>{if(i)try{i(a,u)}catch{}u.current&&X(u.current,r)},c=setInterval(()=>{Be(r,e,t,n?.beforeSend)},s),()=>{c&&(clearInterval(c),c=null),o&&(o._runtimescope_original?o.onCommitFiberRoot=o._runtimescope_original:delete o.onCommitFiberRoot,delete o._runtimescope_original)}}function He(){if(typeof window>"u")return null;let e=window;return e.__REACT_DEVTOOLS_GLOBAL_HOOK__||(e.__REACT_DEVTOOLS_GLOBAL_HOOK__={}),e.__REACT_DEVTOOLS_GLOBAL_HOOK__}function X(e,t){Ae(e,t),e.child&&X(e.child,t),e.sibling&&X(e.sibling,t)}function Ae(e,t){if(e.tag!==Ne&&e.tag!==De)return;let n=Me(e);if(!n)return;let r=Date.now(),s=e.alternate===null,c=e.actualDuration??0,o=Fe(e,s),i=t.get(n);i||(i={renderCount:0,totalDuration:0,lastRenderTime:0,lastRenderPhase:"mount",lastRenderCause:"unknown",renderTimestamps:[]},t.set(n,i)),i.renderCount++,i.totalDuration+=c,i.lastRenderTime=r,i.lastRenderPhase=s?"mount":"update",i.lastRenderCause=o??"unknown",i.renderTimestamps.push(r),i.renderTimestamps.length>Z&&(i.renderTimestamps=i.renderTimestamps.slice(-Z))}function Me(e){if(e.type&&typeof e.type!="string")return e.type.displayName||e.type.name||void 0}function Fe(e,t){return t?"props":e.alternate?e.memoizedProps!==e.alternate.memoizedProps?"props":e.memoizedState!==e.alternate.memoizedState?"state":"parent":"unknown"}function Pe(e){if(e.length<2)return 0;let t=Date.now(),n=t-te,r=e.filter(c=>c>=n);if(r.length<2)return 0;let s=t-r[0];return s===0?0:r.length/(s/1e3)}function Be(e,t,n,r){if(e.size===0)return;let s=[],c=[],o=0;for(let[u,d]of e){let l=Pe(d.renderTimestamps),f=l>4||d.renderCount>20;s.push({componentName:u,renderCount:d.renderCount,totalDuration:Math.round(d.totalDuration*100)/100,avgDuration:d.renderCount>0?Math.round(d.totalDuration/d.renderCount*100)/100:0,lastRenderPhase:d.lastRenderPhase,lastRenderCause:d.lastRenderCause,renderVelocity:Math.round(l*100)/100,suspicious:f}),f&&c.push(u),o+=d.renderCount}s.sort((u,d)=>d.renderCount-u.renderCount);let i={eventId:m(),sessionId:n,timestamp:Date.now(),eventType:"render",profiles:s,snapshotWindowMs:te,totalRenders:o,suspiciousComponents:c};if(r){let u=r(i);u&&t(u)}else t(i);let a=Date.now();for(let[u,d]of e)a-d.lastRenderTime>xe?e.delete(u):(d.renderCount=0,d.totalDuration=0);if(e.size>ee){let u=[...e.entries()].sort((l,f)=>l[1].lastRenderTime-f[1].lastRenderTime),d=e.size-ee;for(let l=0;l<d;l++)e.delete(u[l][0])}}function re(e,t,n){let r=c=>{let o,i,a;if(c instanceof ErrorEvent)o=c.message||"Uncaught error",i=c.error?.stack,a=c.filename?`${c.filename}:${c.lineno}:${c.colno}`:void 0;else{let d=c.target;if(d&&d!==window){let l=d.tagName?.toLowerCase()??"unknown",f=d.src??d.src??d.href??"unknown";o=`Failed to load resource: <${l}> ${f}`}else return}let u={eventId:m(),sessionId:t,timestamp:Date.now(),eventType:"console",level:"error",message:`[Uncaught] ${o}`,args:[y(o,3)],stackTrace:i,sourceFile:a};if(n){let d=n(u);d&&e(d)}else e(u)},s=c=>{let o=c.reason,i,a;if(o instanceof Error)i=o.message,a=o.stack;else if(typeof o=="string")i=o;else try{i=JSON.stringify(o)}catch{i=String(o)}let u={eventId:m(),sessionId:t,timestamp:Date.now(),eventType:"console",level:"error",message:`[Unhandled Rejection] ${i}`,args:[y(o,3)],stackTrace:a,sourceFile:void 0};if(n){let d=n(u);d&&e(d)}else e(u)};return window.addEventListener("error",r,!0),window.addEventListener("unhandledrejection",s),()=>{window.removeEventListener("error",r,!0),window.removeEventListener("unhandledrejection",s)}}function se(e,t){let n=window.location.href;function r(a,u){let d=n;d!==a&&(n=a,e({eventId:m(),sessionId:t,timestamp:Date.now(),eventType:"navigation",from:d,to:a,trigger:u}))}let s=history.pushState.bind(history),c=history.replaceState.bind(history);history.pushState=function(...a){s(...a),r(window.location.href,"pushState")},history.replaceState=function(...a){c(...a),r(window.location.href,"replaceState")};let o=()=>r(window.location.href,"popstate");window.addEventListener("popstate",o);let i=()=>r(window.location.href,"hashchange");return window.addEventListener("hashchange",i),()=>{history.pushState=s,history.replaceState=c,window.removeEventListener("popstate",o),window.removeEventListener("hashchange",i)}}function oe(e,t){let n=r=>{let s=r.target;if(!(s instanceof Element)||s.closest("[data-runtimescope]"))return;let c=qe(s),o=ze(s),i={eventId:m(),sessionId:t,timestamp:Date.now(),eventType:"ui",action:"click",target:c,...o&&{text:o}};e(i)};return document.addEventListener("click",n,!0),()=>{document.removeEventListener("click",n,!0)}}function qe(e){let t=e.tagName.toLowerCase();if(e.id)return`${t}#${e.id}`;let n=e.getAttribute("data-testid")??e.getAttribute("data-test-id");if(n)return`${t}[data-testid="${n}"]`;let r=e.getAttribute("role"),s=e.getAttribute("aria-label");if(r&&s)return`${t}[role="${r}"][aria-label="${s}"]`;let c=e.className;if(typeof c=="string"&&c.trim()){let i=c.split(/\s+/).find(a=>a.length>2&&!a.startsWith("_")&&!a.includes("__"));if(i)return`${t}.${i}`}let o=e.parentElement;if(o){let i=o.children,a=Array.from(i).filter(u=>u.tagName===e.tagName);if(a.length>1){let u=a.indexOf(e)+1;return`${t}:nth-child(${u})`}}return t}function ze(e){let t=e.getAttribute("aria-label");if(t)return t.slice(0,80);let n=e.innerText??e.textContent;if(!n)return;let r=n.trim().replace(/\s+/g," ");if(r.length!==0)return r.length>80?r.slice(0,77)+"...":r}var q="0.8.0",A=console.debug.bind(console),z=Symbol.for("__runtimescope_originals__");function Ue(){let e=globalThis;return e[z]||(e[z]={fetch:window.fetch,xhrOpen:XMLHttpRequest.prototype.open,xhrSend:XMLHttpRequest.prototype.send,xhrSetRequestHeader:XMLHttpRequest.prototype.setRequestHeader,consoleMethods:{log:console.log.bind(console),warn:console.warn.bind(console),error:console.error.bind(console),info:console.info.bind(console),debug:console.debug.bind(console),trace:console.trace.bind(console)}}),e[z]}var E=class{static get sessionId(){return this._sessionId}static get isConnected(){return this._state==="started"}static shouldSample(){if(this._sampleRate<1&&Math.random()>this._sampleRate)return!1;if(this._maxEventsPerSecond!==void 0){let t=Date.now();if(t-this._windowStart>=1e3&&(this._windowCount=0,this._windowStart=t),this._windowCount>=this._maxEventsPerSecond)return!1;this._windowCount++}return!0}static connect(t={}){if(t.enabled===!1)return;this._state==="started"&&(A("[RuntimeScope] Already connected \u2014 disconnecting before re-init"),this.disconnect());let n={serverUrl:t.serverUrl??t.endpoint??"ws://localhost:9090",appName:t.appName??"unknown",captureNetwork:t.captureNetwork??!0,captureConsole:t.captureConsole??!0,captureXhr:t.captureXhr??!0,captureBody:t.captureBody??!1,maxBodySize:t.maxBodySize??65536,capturePerformance:t.capturePerformance??!0,captureRenders:t.captureRenders??!0,captureNavigation:t.captureNavigation??!0,captureClicks:t.captureClicks??!0,stores:t.stores??{},beforeSend:t.beforeSend,redactHeaders:t.redactHeaders??["authorization","cookie"],batchSize:t.batchSize??50,flushIntervalMs:t.flushIntervalMs??100};Ue(),this._sessionId=$(),this._state="started",this.transport=new F({serverUrl:n.serverUrl,appName:n.appName,sessionId:this._sessionId,sdkVersion:q,authToken:t.authToken,batchSize:n.batchSize,flushIntervalMs:n.flushIntervalMs}),this._sampleRate=t.sampleRate??1,this._maxEventsPerSecond=t.maxEventsPerSecond,this._windowCount=0,this._windowStart=Date.now(),this._user=t.user,this.transport.connect(),A(`[RuntimeScope] SDK v${q} initializing \u2014 app: ${n.appName}, server: ${n.serverUrl}`);let r=o=>{o.eventType!=="session"&&o.eventType!=="custom"&&o.eventType!=="ui"&&!this.shouldSample()||this.transport?.send(o)};r({eventId:m(),sessionId:this._sessionId,timestamp:Date.now(),eventType:"session",appName:n.appName,connectedAt:Date.now(),sdkVersion:q,buildMeta:t.buildMeta,user:this._user});let s=this._sessionId;this.transport.onCommand(o=>{this.handleCommand(o,r,s)}),n.captureNetwork&&this.restoreFns.push(W(r,this._sessionId,n.redactHeaders,{captureBody:n.captureBody,maxBodySize:n.maxBodySize,beforeSend:n.beforeSend})),n.captureXhr&&this.restoreFns.push(Q(r,this._sessionId,n.redactHeaders,{captureBody:n.captureBody,maxBodySize:n.maxBodySize,beforeSend:n.beforeSend})),n.captureConsole&&(this.restoreFns.push(G(r,this._sessionId,n.beforeSend)),this.restoreFns.push(re(r,this._sessionId,n.beforeSend))),Object.keys(n.stores).length>0&&this.restoreFns.push(Y(r,this._sessionId,n.stores,{beforeSend:n.beforeSend})),n.capturePerformance&&this.restoreFns.push(J(r,this._sessionId,{beforeSend:n.beforeSend})),n.captureRenders&&this.restoreFns.push(ne(r,this._sessionId,{beforeSend:n.beforeSend})),n.captureNavigation&&this.restoreFns.push(se(r,this._sessionId)),n.captureClicks&&this.restoreFns.push(oe(r,this._sessionId));let c=[n.captureNetwork&&"fetch",n.captureXhr&&"xhr",n.captureConsole&&"console, errors",Object.keys(n.stores).length>0&&"state",n.capturePerformance&&"performance",n.captureRenders&&"renders",n.captureNavigation&&"navigation",n.captureClicks&&"clicks"].filter(Boolean);A(`[RuntimeScope] Interceptors active \u2014 ${c.join(", ")}`),this._sampleRate<1&&A(`[RuntimeScope] Sampling at ${(this._sampleRate*100).toFixed(0)}%`),this._maxEventsPerSecond!==void 0&&A(`[RuntimeScope] Rate limited to ${this._maxEventsPerSecond} events/sec`)}static handleCommand(t,n,r){if(t.command==="capture_dom_snapshot"){let s=t.params?.maxSize??5e5,c=document.documentElement.outerHTML,o=c.length>s;o&&(c=c.slice(0,s));let i={eventId:m(),sessionId:r,timestamp:Date.now(),eventType:"dom_snapshot",html:c,url:window.location.href,viewport:{width:window.innerWidth,height:window.innerHeight},scrollPosition:{x:window.scrollX,y:window.scrollY},elementCount:document.querySelectorAll("*").length,truncated:o};n(i),this.transport?.sendCommandResponse(t.requestId,t.command,i)}else this.transport?.sendCommandResponse(t.requestId,t.command,{error:"Unknown command"})}static init(t={}){return this.connect(t)}static track(t,n){if(!this.transport||!this._sessionId)return;let r={eventId:m(),sessionId:this._sessionId,timestamp:Date.now(),eventType:"custom",name:t,properties:n};this.transport.send(r)}static setUser(t){this._user=t??void 0,this.transport&&this._sessionId&&this.transport.send({eventId:m(),sessionId:this._sessionId,timestamp:Date.now(),eventType:"session",appName:"user_update",connectedAt:Date.now(),sdkVersion:q,user:this._user})}static addBreadcrumb(t,n){if(!this.transport||!this._sessionId)return;let r={eventId:m(),sessionId:this._sessionId,timestamp:Date.now(),eventType:"ui",action:"breadcrumb",target:"manual",text:t,...n&&{data:n}};this.transport.send(r)}static disconnect(){for(let n of this.restoreFns)try{n()}catch{}this.restoreFns=[];let t=globalThis[z];if(t){window.fetch!==t.fetch&&(window.fetch=t.fetch);for(let[n,r]of Object.entries(t.consoleMethods)){let s=console;s[n]!==r&&(s[n]=r)}}this.transport?.disconnect(),this.transport=null,this._sessionId=null,this._state="stopped"}};p(E,"transport",null),p(E,"restoreFns",[]),p(E,"_sessionId",null),p(E,"_state","stopped"),p(E,"_sampleRate",1),p(E,"_maxEventsPerSecond"),p(E,"_windowCount",0),p(E,"_windowStart",0),p(E,"_user");var je=E;0&&(module.exports={RuntimeScope});
3
+ `):void 0,sourceFile:void 0};if(s){let a=s(o);a&&t(a)}else t(o);n[r](...c)};return()=>{for(let r of V)console[r]=n[r]}}function _e(t){try{return JSON.stringify(t)}catch{return String(t)}}function Q(t,e,s,n){let r=new Set(s.map(l=>l.toLowerCase())),c=n?.captureBody??!1,i=n?.maxBodySize??65536,o=new AbortController,a=XMLHttpRequest.prototype.open,u=XMLHttpRequest.prototype.setRequestHeader,d=XMLHttpRequest.prototype.send;return XMLHttpRequest.prototype.open=function(l,f){return this.__rs_method=l.toUpperCase(),this.__rs_url=typeof f=="string"?f:f.href,this.__rs_headers={},a.apply(this,arguments)},XMLHttpRequest.prototype.setRequestHeader=function(l,f){return this.__rs_headers&&(this.__rs_headers[l.toLowerCase()]=r.has(l.toLowerCase())?"[REDACTED]":f),u.call(this,l,f)},XMLHttpRequest.prototype.send=function(l){let f=this.__rs_method??"GET",b=this.__rs_url??"",g=`${f}:${b}`,T=!1;for(let v of C.keys())if(v.startsWith(g)){T=!0;break}if(T)return this.__rs_fetchIntercepted=!0,d.call(this,l);let x={...this.__rs_headers??{}},j=performance.now(),h,_=0;if(l){if(typeof l=="string")_=new Blob([l]).size,c&&(h=l.length>i?l.slice(0,i):l);else if(l instanceof Blob)_=l.size,c&&(h=`[Blob ${l.size} bytes]`);else if(l instanceof ArrayBuffer)_=l.byteLength,c&&(h=`[ArrayBuffer ${l.byteLength} bytes]`);else if(l instanceof FormData)c&&(h="[FormData]");else if(l instanceof URLSearchParams){let v=l.toString();_=new Blob([v]).size,c&&(h=v.length>i?v.slice(0,i):v)}}let L=Ie(l),I=v=>{let w={eventId:m(),sessionId:e,timestamp:Date.now(),eventType:"network",url:b,method:f,status:0,requestHeaders:x,responseHeaders:{},requestBodySize:_,responseBodySize:0,duration:0,ttfb:0,graphqlOperation:L,requestBody:h,source:"xhr",...v};if(n?.beforeSend){let S=n.beforeSend(w);S&&t(S)}else t(w)};return this.addEventListener("loadend",()=>{let v=performance.now()-j;if(this.status>0){let w=Te(this.getAllResponseHeaders(),r),S=parseInt(this.getResponseHeader("content-length")||"0",10),O;if(c&&(this.responseType===""||this.responseType==="text"))try{let U=this.responseText;O=U.length>i?U.slice(0,i):U}catch{}I({status:this.status,responseHeaders:w,responseBodySize:S,responseBody:O,duration:v,ttfb:v})}else{let w="error",S="Network error";this.readyState===0||this.status,this.timeout>0&&v>=this.timeout&&(w="timeout",S=`Request timed out after ${this.timeout}ms`),I({duration:v,errorPhase:w,errorMessage:S})}},{once:!0,signal:o.signal}),d.call(this,l)},()=>{o.abort(),XMLHttpRequest.prototype.open=a,XMLHttpRequest.prototype.setRequestHeader=u,XMLHttpRequest.prototype.send=d}}function Te(t,e){let s={};if(!t)return s;for(let n of t.trim().split(/[\r\n]+/)){let r=n.indexOf(":");if(r===-1)continue;let c=n.slice(0,r).trim().toLowerCase(),i=n.slice(r+1).trim();s[c]=e.has(c)?"[REDACTED]":i}return s}function Ie(t){if(!(!t||typeof t!="string"))try{let e=JSON.parse(t);if(typeof e.query=="string"){let s=e.query.trim(),n="query";s.startsWith("mutation")?n="mutation":s.startsWith("subscription")&&(n="subscription");let r=e.operationName||Ce(s)||"anonymous";return{type:n,name:r}}}catch{}}function Ce(t){return t.match(/^(?:query|mutation|subscription)\s+(\w+)/)?.[1]}function Y(t,e,s,n){let r=[],c=new Map;for(let[i,o]of Object.entries(s)){let a=ke(o);if(a==="zustand"){let u=o;B(t,e,n?.beforeSend,{storeId:i,library:a,phase:"init",state:y(u.getState(),4)});let d=u.subscribe((l,f)=>{let b=K(f,l);B(t,e,n?.beforeSend,{storeId:i,library:a,phase:"update",state:y(l,4),previousState:y(f,4),diff:b?y(b,3):void 0})});r.push(d)}else if(a==="redux"){let u=o;B(t,e,n?.beforeSend,{storeId:i,library:a,phase:"init",state:y(u.getState(),4)});let d,l=u.dispatch.bind(u);c.set(i,l),u.dispatch=g=>(g&&typeof g=="object"&&"type"in g&&(d={type:String(g.type),payload:g.payload}),l(g));let f=u.getState(),b=u.subscribe(()=>{let g=u.getState(),T=K(f,g);B(t,e,n?.beforeSend,{storeId:i,library:a,phase:"update",state:y(g,4),previousState:y(f,4),diff:T?y(T,3):void 0,action:d?y(d,3):void 0}),f=g,d=void 0});r.push(b)}}return()=>{for(let i of r)i();for(let[i,o]of c){let a=s[i];a&&(a.dispatch=o)}}}function ke(t){if(!t||typeof t!="object")return"unknown";let e=t;return typeof e.getState=="function"&&typeof e.setState=="function"&&typeof e.subscribe=="function"?"zustand":typeof e.dispatch=="function"&&typeof e.getState=="function"&&typeof e.subscribe=="function"?"redux":"unknown"}function K(t,e){if(!t||!e||typeof t!="object"||typeof e!="object")return null;let s={},n=t,r=e,c=new Set([...Object.keys(n),...Object.keys(r)]);for(let i of c)n[i]!==r[i]&&(s[i]={from:n[i],to:r[i]});return Object.keys(s).length>0?s:null}function B(t,e,s,n){let r={eventId:m(),sessionId:e,timestamp:Date.now(),eventType:"state",...n};if(s){let c=s(r);c&&t(c)}else t(r)}var Le={LCP:[2500,4e3],FCP:[1800,3e3],CLS:[.1,.25],TTFB:[800,1800],FID:[100,300],INP:[200,500]};function Oe(t,e){let[s,n]=Le[t]??[1/0,1/0];return e<=s?"good":e<=n?"needs-improvement":"poor"}var A=null;function J(t,e,s){if(A)for(let o of A)try{o.disconnect()}catch{}let n=[];A=n;let r=(o,a,u)=>{let d={eventId:m(),sessionId:e,timestamp:Date.now(),eventType:"performance",metricName:o,value:Math.round(a*100)/100,rating:Oe(o,a),element:u};if(s?.beforeSend){let l=s.beforeSend(d);l&&t(l)}else t(d)};N(n,"largest-contentful-paint",o=>{let a=o[o.length-1];if(!a)return;let u=a.element;r("LCP",a.startTime,u?.tagName?.toLowerCase())}),N(n,"paint",o=>{for(let a of o)a.name==="first-contentful-paint"&&r("FCP",a.startTime)});let c=0;N(n,"layout-shift",o=>{for(let a of o){let u=a;!u.hadRecentInput&&u.value&&(c+=u.value,r("CLS",c))}}),N(n,"first-input",o=>{let a=o[0];if(!a)return;let u=a;u.processingStart&&r("FID",u.processingStart-a.startTime)}),N(n,"navigation",o=>{let a=o[0];a&&r("TTFB",a.responseStart-a.requestStart)});let i=0;return N(n,"event",o=>{for(let a of o)a.duration>i&&(i=a.duration,r("INP",i))},{durationThreshold:16}),()=>{for(let o of n)try{o.disconnect()}catch{}A===n&&(A=null)}}function N(t,e,s,n){try{let r=new PerformanceObserver(c=>{s(c.getEntries())});r.observe({type:e,buffered:!0,...n}),t.push(r)}catch{}}var Ne=0,De=1,te=1e4,Z=100,xe=6e4,ee=500;function ne(t,e,s){let n=new Map,r=s?.snapshotIntervalMs??5e3,c=null,i=He();if(!i)return()=>{};let o=i.onCommitFiberRoot;return i._runtimescope_original=o,i.onCommitFiberRoot=(a,u)=>{if(o)try{o(a,u)}catch{}u.current&&X(u.current,n)},c=setInterval(()=>{Be(n,t,e,s?.beforeSend)},r),()=>{c&&(clearInterval(c),c=null),i&&(i._runtimescope_original?i.onCommitFiberRoot=i._runtimescope_original:delete i.onCommitFiberRoot,delete i._runtimescope_original)}}function He(){if(typeof window>"u")return null;let t=window;return t.__REACT_DEVTOOLS_GLOBAL_HOOK__||(t.__REACT_DEVTOOLS_GLOBAL_HOOK__={}),t.__REACT_DEVTOOLS_GLOBAL_HOOK__}function X(t,e){Ae(t,e),t.child&&X(t.child,e),t.sibling&&X(t.sibling,e)}function Ae(t,e){if(t.tag!==Ne&&t.tag!==De)return;let s=Me(t);if(!s)return;let n=Date.now(),r=t.alternate===null,c=t.actualDuration??0,i=Fe(t,r),o=e.get(s);o||(o={renderCount:0,totalDuration:0,lastRenderTime:0,lastRenderPhase:"mount",lastRenderCause:"unknown",renderTimestamps:[]},e.set(s,o)),o.renderCount++,o.totalDuration+=c,o.lastRenderTime=n,o.lastRenderPhase=r?"mount":"update",o.lastRenderCause=i??"unknown",o.renderTimestamps.push(n),o.renderTimestamps.length>Z&&(o.renderTimestamps=o.renderTimestamps.slice(-Z))}function Me(t){if(t.type&&typeof t.type!="string")return t.type.displayName||t.type.name||void 0}function Fe(t,e){return e?"props":t.alternate?t.memoizedProps!==t.alternate.memoizedProps?"props":t.memoizedState!==t.alternate.memoizedState?"state":"parent":"unknown"}function Pe(t){if(t.length<2)return 0;let e=Date.now(),s=e-te,n=t.filter(c=>c>=s);if(n.length<2)return 0;let r=e-n[0];return r===0?0:n.length/(r/1e3)}function Be(t,e,s,n){if(t.size===0)return;let r=[],c=[],i=0;for(let[u,d]of t){let l=Pe(d.renderTimestamps),f=l>4||d.renderCount>20;r.push({componentName:u,renderCount:d.renderCount,totalDuration:Math.round(d.totalDuration*100)/100,avgDuration:d.renderCount>0?Math.round(d.totalDuration/d.renderCount*100)/100:0,lastRenderPhase:d.lastRenderPhase,lastRenderCause:d.lastRenderCause,renderVelocity:Math.round(l*100)/100,suspicious:f}),f&&c.push(u),i+=d.renderCount}r.sort((u,d)=>d.renderCount-u.renderCount);let o={eventId:m(),sessionId:s,timestamp:Date.now(),eventType:"render",profiles:r,snapshotWindowMs:te,totalRenders:i,suspiciousComponents:c};if(n){let u=n(o);u&&e(u)}else e(o);let a=Date.now();for(let[u,d]of t)a-d.lastRenderTime>xe?t.delete(u):(d.renderCount=0,d.totalDuration=0);if(t.size>ee){let u=[...t.entries()].sort((l,f)=>l[1].lastRenderTime-f[1].lastRenderTime),d=t.size-ee;for(let l=0;l<d;l++)t.delete(u[l][0])}}function re(t,e,s){let n=c=>{let i,o,a;if(c instanceof ErrorEvent)i=c.message||"Uncaught error",o=c.error?.stack,a=c.filename?`${c.filename}:${c.lineno}:${c.colno}`:void 0;else{let d=c.target;if(d&&d!==window){let l=d.tagName?.toLowerCase()??"unknown",f=d.src??d.src??d.href??"unknown";i=`Failed to load resource: <${l}> ${f}`}else return}let u={eventId:m(),sessionId:e,timestamp:Date.now(),eventType:"console",level:"error",message:`[Uncaught] ${i}`,args:[y(i,3)],stackTrace:o,sourceFile:a};if(s){let d=s(u);d&&t(d)}else t(u)},r=c=>{let i=c.reason,o,a;if(i instanceof Error)o=i.message,a=i.stack;else if(typeof i=="string")o=i;else try{o=JSON.stringify(i)}catch{o=String(i)}let u={eventId:m(),sessionId:e,timestamp:Date.now(),eventType:"console",level:"error",message:`[Unhandled Rejection] ${o}`,args:[y(i,3)],stackTrace:a,sourceFile:void 0};if(s){let d=s(u);d&&t(d)}else t(u)};return window.addEventListener("error",n,!0),window.addEventListener("unhandledrejection",r),()=>{window.removeEventListener("error",n,!0),window.removeEventListener("unhandledrejection",r)}}function se(t,e){let s=window.location.href;function n(a,u){let d=s;d!==a&&(s=a,t({eventId:m(),sessionId:e,timestamp:Date.now(),eventType:"navigation",from:d,to:a,trigger:u}))}let r=history.pushState.bind(history),c=history.replaceState.bind(history);history.pushState=function(...a){r(...a),n(window.location.href,"pushState")},history.replaceState=function(...a){c(...a),n(window.location.href,"replaceState")};let i=()=>n(window.location.href,"popstate");window.addEventListener("popstate",i);let o=()=>n(window.location.href,"hashchange");return window.addEventListener("hashchange",o),()=>{history.pushState=r,history.replaceState=c,window.removeEventListener("popstate",i),window.removeEventListener("hashchange",o)}}function oe(t,e){let s=n=>{let r=n.target;if(!(r instanceof Element)||r.closest("[data-runtimescope]"))return;let c=qe(r),i=ze(r),o={eventId:m(),sessionId:e,timestamp:Date.now(),eventType:"ui",action:"click",target:c,...i&&{text:i}};t(o)};return document.addEventListener("click",s,!0),()=>{document.removeEventListener("click",s,!0)}}function qe(t){let e=t.tagName.toLowerCase();if(t.id)return`${e}#${t.id}`;let s=t.getAttribute("data-testid")??t.getAttribute("data-test-id");if(s)return`${e}[data-testid="${s}"]`;let n=t.getAttribute("role"),r=t.getAttribute("aria-label");if(n&&r)return`${e}[role="${n}"][aria-label="${r}"]`;let c=t.className;if(typeof c=="string"&&c.trim()){let o=c.split(/\s+/).find(a=>a.length>2&&!a.startsWith("_")&&!a.includes("__"));if(o)return`${e}.${o}`}let i=t.parentElement;if(i){let o=i.children,a=Array.from(o).filter(u=>u.tagName===t.tagName);if(a.length>1){let u=a.indexOf(t)+1;return`${e}:nth-child(${u})`}}return e}function ze(t){let e=t.getAttribute("aria-label");if(e)return e.slice(0,80);let s=t.innerText??t.textContent;if(!s)return;let n=s.trim().replace(/\s+/g," ");if(n.length!==0)return n.length>80?n.slice(0,77)+"...":n}var q="0.9.1",D=console.debug.bind(console),z=Symbol.for("__runtimescope_originals__");function je(){let t=globalThis;return t[z]||(t[z]={fetch:window.fetch,xhrOpen:XMLHttpRequest.prototype.open,xhrSend:XMLHttpRequest.prototype.send,xhrSetRequestHeader:XMLHttpRequest.prototype.setRequestHeader,consoleMethods:{log:console.log.bind(console),warn:console.warn.bind(console),error:console.error.bind(console),info:console.info.bind(console),debug:console.debug.bind(console),trace:console.trace.bind(console)}}),t[z]}var E=class{static get sessionId(){return this._sessionId}static get isConnected(){return this._state==="started"}static shouldSample(){if(this._sampleRate<1&&Math.random()>this._sampleRate)return!1;if(this._maxEventsPerSecond!==void 0){let e=Date.now();if(e-this._windowStart>=1e3&&(this._windowCount=0,this._windowStart=e),this._windowCount>=this._maxEventsPerSecond)return!1;this._windowCount++}return!0}static connect(e={}){if(e.enabled===!1)return;if(!!!(e.serverUrl||e.endpoint)&&typeof window<"u"){let o=window.location?.hostname;if(o&&o!=="localhost"&&o!=="127.0.0.1"&&!o.startsWith("192.168.")&&!o.startsWith("10.")){D("[RuntimeScope] No endpoint configured and not on localhost \u2014 SDK disabled for production");return}}this._state==="started"&&(D("[RuntimeScope] Already connected \u2014 disconnecting before re-init"),this.disconnect());let n={serverUrl:e.serverUrl??e.endpoint??"ws://localhost:9090",appName:e.appName??"unknown",captureNetwork:e.captureNetwork??!0,captureConsole:e.captureConsole??!0,captureXhr:e.captureXhr??!0,captureBody:e.captureBody??!1,maxBodySize:e.maxBodySize??65536,capturePerformance:e.capturePerformance??!0,captureRenders:e.captureRenders??!0,captureNavigation:e.captureNavigation??!0,captureClicks:e.captureClicks??!0,stores:e.stores??{},beforeSend:e.beforeSend,redactHeaders:e.redactHeaders??["authorization","cookie"],batchSize:e.batchSize??50,flushIntervalMs:e.flushIntervalMs??100};je(),this._sessionId=$(),this._state="started",this.transport=new F({serverUrl:n.serverUrl,appName:n.appName,sessionId:this._sessionId,sdkVersion:q,authToken:e.authToken,projectId:e.projectId,batchSize:n.batchSize,flushIntervalMs:n.flushIntervalMs}),this._sampleRate=e.sampleRate??1,this._maxEventsPerSecond=e.maxEventsPerSecond,this._windowCount=0,this._windowStart=Date.now(),this._user=e.user,this.transport.connect(),D(`[RuntimeScope] SDK v${q} initializing \u2014 app: ${n.appName}, server: ${n.serverUrl}`);let r=o=>{o.eventType!=="session"&&o.eventType!=="custom"&&o.eventType!=="ui"&&!this.shouldSample()||this.transport?.send(o)};r({eventId:m(),sessionId:this._sessionId,timestamp:Date.now(),eventType:"session",appName:n.appName,connectedAt:Date.now(),sdkVersion:q,buildMeta:e.buildMeta,user:this._user,projectId:e.projectId});let c=this._sessionId;this.transport.onCommand(o=>{this.handleCommand(o,r,c)}),n.captureNetwork&&this.restoreFns.push(W(r,this._sessionId,n.redactHeaders,{captureBody:n.captureBody,maxBodySize:n.maxBodySize,beforeSend:n.beforeSend})),n.captureXhr&&this.restoreFns.push(Q(r,this._sessionId,n.redactHeaders,{captureBody:n.captureBody,maxBodySize:n.maxBodySize,beforeSend:n.beforeSend})),n.captureConsole&&(this.restoreFns.push(G(r,this._sessionId,n.beforeSend)),this.restoreFns.push(re(r,this._sessionId,n.beforeSend))),Object.keys(n.stores).length>0&&this.restoreFns.push(Y(r,this._sessionId,n.stores,{beforeSend:n.beforeSend})),n.capturePerformance&&this.restoreFns.push(J(r,this._sessionId,{beforeSend:n.beforeSend})),n.captureRenders&&this.restoreFns.push(ne(r,this._sessionId,{beforeSend:n.beforeSend})),n.captureNavigation&&this.restoreFns.push(se(r,this._sessionId)),n.captureClicks&&this.restoreFns.push(oe(r,this._sessionId));let i=[n.captureNetwork&&"fetch",n.captureXhr&&"xhr",n.captureConsole&&"console, errors",Object.keys(n.stores).length>0&&"state",n.capturePerformance&&"performance",n.captureRenders&&"renders",n.captureNavigation&&"navigation",n.captureClicks&&"clicks"].filter(Boolean);D(`[RuntimeScope] Interceptors active \u2014 ${i.join(", ")}`),this._sampleRate<1&&D(`[RuntimeScope] Sampling at ${(this._sampleRate*100).toFixed(0)}%`),this._maxEventsPerSecond!==void 0&&D(`[RuntimeScope] Rate limited to ${this._maxEventsPerSecond} events/sec`)}static handleCommand(e,s,n){if(e.command==="capture_dom_snapshot"){let r=e.params?.maxSize??5e5,c=document.documentElement.outerHTML,i=c.length>r;i&&(c=c.slice(0,r));let o={eventId:m(),sessionId:n,timestamp:Date.now(),eventType:"dom_snapshot",html:c,url:window.location.href,viewport:{width:window.innerWidth,height:window.innerHeight},scrollPosition:{x:window.scrollX,y:window.scrollY},elementCount:document.querySelectorAll("*").length,truncated:i};s(o),this.transport?.sendCommandResponse(e.requestId,e.command,o)}else this.transport?.sendCommandResponse(e.requestId,e.command,{error:"Unknown command"})}static init(e={}){return this.connect(e)}static track(e,s){if(!this.transport||!this._sessionId)return;let n={eventId:m(),sessionId:this._sessionId,timestamp:Date.now(),eventType:"custom",name:e,properties:s};this.transport.send(n)}static setUser(e){this._user=e??void 0,this.transport&&this._sessionId&&this.transport.send({eventId:m(),sessionId:this._sessionId,timestamp:Date.now(),eventType:"session",appName:"user_update",connectedAt:Date.now(),sdkVersion:q,user:this._user})}static addBreadcrumb(e,s){if(!this.transport||!this._sessionId)return;let n={eventId:m(),sessionId:this._sessionId,timestamp:Date.now(),eventType:"ui",action:"breadcrumb",target:"manual",text:e,...s&&{data:s}};this.transport.send(n)}static disconnect(){for(let s of this.restoreFns)try{s()}catch{}this.restoreFns=[];let e=globalThis[z];if(e){window.fetch!==e.fetch&&(window.fetch=e.fetch);for(let[s,n]of Object.entries(e.consoleMethods)){let r=console;r[s]!==n&&(r[s]=n)}}this.transport?.disconnect(),this.transport=null,this._sessionId=null,this._state="stopped"}};p(E,"transport",null),p(E,"restoreFns",[]),p(E,"_sessionId",null),p(E,"_state","stopped"),p(E,"_sampleRate",1),p(E,"_maxEventsPerSecond"),p(E,"_windowCount",0),p(E,"_windowStart",0),p(E,"_user");var Ue=E;0&&(module.exports={RuntimeScope});
4
4
  if(typeof RuntimeScope!=="undefined"&&RuntimeScope.RuntimeScope){RuntimeScope=RuntimeScope.RuntimeScope;}
5
5
  //# sourceMappingURL=index.cjs.map