@zharp/browser 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js ADDED
@@ -0,0 +1,7 @@
1
+ 'use strict';Object.defineProperty(exports,'__esModule',{value:true});var chunkH5MED5NB_js=require('./chunk-H5MED5NB.js');var Ee=[["Edge",/Edg(?:e|A|iOS)?\/([\d.]+)/],["Opera",/(?:OPR|Opera)\/([\d.]+)/],["Samsung Internet",/SamsungBrowser\/([\d.]+)/],["Firefox",/(?:Firefox|FxiOS)\/([\d.]+)/],["Chrome",/(?:Chrome|CriOS)\/([\d.]+)/],["Safari",/Version\/([\d.]+).*Safari\//]];function J(n){var r;let e={};for(let[s,i]of Ee){let o=i.exec(n);if(o){e.browserName=s,e.browserVersion=o[1].split(".")[0];break}}let t;return (t=/Windows NT ([\d.]+)/.exec(n))?(e.osName="Windows",e.osVersion=(r={"10.0":"10","6.3":"8.1","6.2":"8","6.1":"7"}[t[1]])!=null?r:t[1]):(t=/(?:iPhone|iPad|iPod).*? OS ([\d_]+)/.exec(n))?(e.osName="iOS",e.osVersion=t[1].replace(/_/g,".")):(t=/Android ([\d.]+)/.exec(n))?(e.osName="Android",e.osVersion=t[1]):(t=/Mac OS X ([\d_.]+)/.exec(n))?(e.osName="macOS",e.osVersion=t[1].replace(/_/g,".")):/CrOS/.test(n)?e.osName="ChromeOS":/Linux/.test(n)&&(e.osName="Linux"),e}var ke="zharp.debug_ids",N=new Map,Q=new Set;function xe(){let n=typeof globalThis!="undefined"?globalThis:void 0,e=n&&n.__zharpDebugIds;return e&&typeof e=="object"?e:void 0}function te(n){let e=n.trim();if(!e)return;let t=/^at (?:async )?(?:.*? \()?(.+?):\d+:\d+\)?$/.exec(e);if(t)return ee(t[1]);if(!e.startsWith("at "))return t=/^(?:[^@]*@)?(.+?):\d+:\d+$/.exec(e),t?ee(t[1]):void 0}function ee(n){if(!(!n||n.includes("eval at ")||n==="<anonymous>"||n==="native"))return n}function _e(n){let e=[];for(let t of n.split(`
2
+ `)){let r=te(t);r&&!e.includes(r)&&e.push(r);}return e}function Te(){let n=xe();if(n)for(let e in n){if(Q.has(e))continue;Q.add(e);let t=n[e];if(typeof t=="string")for(let r of e.split(`
3
+ `)){let s=te(r);if(s){N.set(s,t);break}}}}function Ae(n){if(n)try{if(Te(),N.size===0)return;let e;for(let t of _e(n)){let r=N.get(t);r&&((e!=null?e:e={})[t]=r);}return e}catch(e){return}}function re(n){let e=Ae(n);return e?{[ke]:JSON.stringify(e)}:{}}function P(n){if(n instanceof Error)return n;if(n&&typeof n=="object"&&typeof n.message=="string"){let e=new Error(n.message);return e.name=typeof n.name=="string"?n.name:"Error",typeof n.stack=="string"&&(e.stack=n.stack),e}return new Error(typeof n=="string"?n:`Non-Error thrown: ${chunkH5MED5NB_js.g(n)}`)}function C(n,e){var o;let t=(n.name&&n.name!=="Error"?n.name:(o=n.constructor)==null?void 0:o.name)||"Error",r=n.message||"",s=`${t}: ${r}`,i=typeof n.stack=="string"?n.stack:"";return i.startsWith(n.name||t)||(i=i?`${s}
4
+ ${i}`:s),{"exception.type":t,"exception.message":r,"exception.stacktrace":i,"zharp.handled":e?"true":"false",...re(i)}}function ne(n){let e=r=>chunkH5MED5NB_js.h(()=>{if(r.error!==void 0&&r.error!==null)n(r.error,"onerror");else if(r.message){let s=new Error(r.message);s.stack=`Error: ${r.message}
5
+ at ${r.filename||"<anonymous>"}:${r.lineno||0}:${r.colno||0}`,n(s,"onerror");}}),t=r=>chunkH5MED5NB_js.h(()=>n(r.reason,"onunhandledrejection"));return window.addEventListener("error",e),window.addEventListener("unhandledrejection",t),()=>{window.removeEventListener("error",e),window.removeEventListener("unhandledrejection",t);}}var Ie={debug:"debug",log:"info",info:"info",warn:"warn",error:"error"};function se(n,e){let t={},r=false;for(let s of n){let i=console[s];if(typeof i!="function"||i.__zharp)continue;t[s]=i;let o=function(...a){i.apply(this!=null?this:console,a),!r&&(r=true,chunkH5MED5NB_js.h(()=>{let c=a.map(l=>l instanceof Error?l.stack||String(l):chunkH5MED5NB_js.g(l)).join(" ");c.startsWith("[Zharp]")||e(Ie[s],c);}),r=false);};o.__zharp=true,console[s]=o;}return ()=>Object.assign(console,t)}var $=class{constructor(e,t,r,s,i=chunkH5MED5NB_js.d()){this.tracer=e;this.name=t;this.kind=r;this.startTime=i;this.spanId=chunkH5MED5NB_js.c();this.attributes={};this.status={code:0};this.endTime=0;this.traceId=s?s.traceId:chunkH5MED5NB_js.b(),this.parentSpanId=s==null?void 0:s.spanId,this.sampled=s?s.sampled:Math.random()<e.sampleRate;}get ended(){return this.endTime!==0}setAttribute(e,t){return this.attributes[e]=t,this}setAttributes(e){return Object.assign(this.attributes,e),this}setStatus(e,t){return this.status={code:e,message:t},this}get traceparent(){return `00-${this.traceId}-${this.spanId}-${this.sampled?"01":"00"}`}end(e=chunkH5MED5NB_js.d()){this.endTime||(this.endTime=Math.max(e,this.startTime),this.tracer.finished(this));}toOtlp(e){return {traceId:this.traceId,spanId:this.spanId,parentSpanId:this.parentSpanId,name:this.name,kind:this.kind,startTimeUnixNano:chunkH5MED5NB_js.e(this.startTime),endTimeUnixNano:chunkH5MED5NB_js.e(this.endTime),attributes:chunkH5MED5NB_js.f({...e,...this.attributes}),status:this.status.message?this.status:{code:this.status.code}}}},x=class{constructor(e,t,r,s){this.span=e;this.idleMs=t;this.onEnd=s;this.inflight=0;this.idleTimer=null;this.held=false;this.maxTimer=setTimeout(()=>this.finish(),Math.max(0,e.startTime+r-chunkH5MED5NB_js.d())),this.arm();}begin(){this.inflight++,this.disarm();}done(){this.inflight=Math.max(0,this.inflight-1),this.arm();}hold(){this.held=true,this.disarm();}release(){this.held=false,this.arm();}finish(){this.span.ended||(this.disarm(),clearTimeout(this.maxTimer),this.span.end(),this.onEnd(this));}arm(){this.disarm(),this.inflight===0&&!this.held&&(this.idleTimer=setTimeout(()=>this.finish(),this.idleMs));}disarm(){this.idleTimer&&clearTimeout(this.idleTimer),this.idleTimer=null;}},Oe=1e3,Le=500,ie=3e4,Ne=1e3,_=class{constructor(e){this.hooks=e;this.sampleRate=1;this.root=null;this.interaction=null;this.click=null;this.stack=[];}finished(e){this.hooks.export(e);}activeSpan(){return this.stack.length?this.stack[this.stack.length-1]:this.interaction&&!this.interaction.span.ended?this.interaction.span:this.root&&!this.root.span.ended?this.root.span:null}startSpan(e,t=1,r=this.activeSpan(),s){let i=new $(this,e,t,r,s);return r||this.hooks.traceStarted(i.traceId),i}withSpan(e,t){this.stack.push(e);try{return t()}finally{let r=this.stack.lastIndexOf(e);r>=0&&this.stack.splice(r,1);}}startRoot(e,t,r,s){var o,a;(o=this.interaction)==null||o.finish(),(a=this.root)==null||a.finish();let i=this.startSpan(`${e} ${t}`,1,null,s);return i.setAttributes({"zharp.span.type":e,...r}),this.root=new x(i,Oe,ie,c=>{this.root===c&&(this.root=null);}),this.root}noteClick(e,t){this.click={label:e,target:t,time:chunkH5MED5NB_js.d()};}requestStarting(){var r;let e=this.click;if(e&&chunkH5MED5NB_js.d()-e.time<Ne&&!this.stack.length){this.click=null,(r=this.interaction)==null||r.finish();let s=this.startSpan(`click \u201C${e.label}\u201D`,1,null,e.time);s.setAttributes({"zharp.span.type":"interaction","zharp.interaction.target":e.target}),this.interaction=new x(s,Le,ie,i=>{this.interaction===i&&(this.interaction=null);});}let t=[this.interaction,this.root].filter(s=>!!s&&!s.span.ended);return {parent:this.activeSpan(),waiters:t}}endAll(){var e,t;(e=this.interaction)==null||e.finish(),(t=this.root)==null||t.finish();}};function oe(n,e,t){let{parent:r,waiters:s}=n.tracer.requestStarting(),i=H(t),o=n.tracer.startSpan(`${e} ${Pe(i)}`,3,r);o.setAttributes({"http.request.method":e,"url.full":i,"server.address":Ce(i)});for(let a of s)a.begin();return {span:o,done(a,c){a&&o.setAttribute("http.response.status_code",a),c!==void 0||!a?(o.setAttribute("error.type",c instanceof Error?c.name:"network"),o.setStatus(2,c instanceof Error?c.message:"Request failed")):a>=400&&(o.setAttribute("error.type",String(a)),o.setStatus(2,`HTTP ${a}`)),o.end();for(let l of s)l.done();}}}function ae(n,e){return n?`${n},${e}`:e}function ce(n){let e=globalThis,t=e.fetch;if(typeof t!="function"||t.__zharp)return ()=>{};let r=function(s,i){var h,f,b;let o=typeof s=="string"?s:s instanceof URL?s.href:s==null?void 0:s.url;if(!o||!n.shouldTrace(o))return t.call(this,s,i);let a=String((f=(h=i==null?void 0:i.method)!=null?h:s==null?void 0:s.method)!=null?f:"GET").toUpperCase(),c=chunkH5MED5NB_js.h(()=>oe(n,a,o));if(!c)return t.call(this,s,i);let l=i;return n.shouldPropagate(o)&&(l=(b=chunkH5MED5NB_js.h(()=>{var y;let u=new Headers((y=i==null?void 0:i.headers)!=null?y:typeof Request!="undefined"&&s instanceof Request?s.headers:void 0);u.has("traceparent")||u.set("traceparent",c.span.traceparent);let g=n.baggage();return g&&u.set("baggage",ae(u.get("baggage"),g)),{...i,headers:u}}))!=null?b:i),t.call(this,s,l).then(u=>(chunkH5MED5NB_js.h(()=>c.done(u.status)),u),u=>{throw chunkH5MED5NB_js.h(()=>c.done(0,u)),u})};return r.__zharp=true,e.fetch=r,()=>{e.fetch===r&&(e.fetch=t);}}function de(n){if(typeof XMLHttpRequest=="undefined")return ()=>{};let e=XMLHttpRequest.prototype;if(e.__zharp)return ()=>{};let{open:t,send:r,setRequestHeader:s}=e;return e.open=function(i,o,...a){return this.__zharp={method:String(i||"GET").toUpperCase(),url:String(o),traceparent:false,baggage:null},t.call(this,i,o,...a)},e.setRequestHeader=function(i,o){let a=this.__zharp,c=String(i).toLowerCase();if(a&&c==="traceparent"&&(a.traceparent=true),a&&c==="baggage"&&!a.own){a.baggage=o;return}return s.call(this,i,o)},e.send=function(i){let o=this.__zharp;if(!o||!n.shouldTrace(o.url))return r.call(this,i);let a=chunkH5MED5NB_js.h(()=>oe(n,o.method,o.url));return a?(chunkH5MED5NB_js.h(()=>{if(n.shouldPropagate(o.url)){o.own=true,o.traceparent||s.call(this,"traceparent",a.span.traceparent);let c=n.baggage();(c||o.baggage)&&s.call(this,"baggage",c?ae(o.baggage,c):o.baggage);}else o.baggage&&s.call(this,"baggage",o.baggage);}),this.addEventListener("loadend",()=>chunkH5MED5NB_js.h(()=>a.done(this.status)))):o.baggage&&chunkH5MED5NB_js.h(()=>s.call(this,"baggage",o.baggage)),r.call(this,i)},e.__zharp=true,()=>{Object.assign(e,{open:t,send:r,setRequestHeader:s}),delete e.__zharp;}}var M=()=>typeof location!="undefined"?location.href:"http://localhost/";function H(n){var e;return (e=chunkH5MED5NB_js.h(()=>new URL(n,M()).href))!=null?e:n}function Pe(n){var e;return (e=chunkH5MED5NB_js.h(()=>new URL(n).pathname))!=null?e:n.split("?")[0]}function Ce(n){var e;return (e=chunkH5MED5NB_js.h(()=>new URL(n).hostname))!=null?e:""}function U(n,e){let t=chunkH5MED5NB_js.h(()=>new URL(n,M()));return t?e.some(r=>r instanceof RegExp?r.test(t.href):r?r.includes("://")?t.href.startsWith(r):t.host===r||t.hostname===r:false):false}function le(n){var e;return (e=chunkH5MED5NB_js.h(()=>typeof location!="undefined"&&new URL(n,M()).origin===location.origin))!=null?e:false}function T(){let n=location.hash.startsWith("#/")?location.hash:"";return location.pathname+n}function ue(n){let e=T(),t=()=>chunkH5MED5NB_js.h(()=>{let i=T();i!==e&&(e=i,n(i));}),r=window.history,s={};for(let i of ["pushState","replaceState"]){let o=r[i];if(typeof o!="function"||o.__zharp)continue;s[i]=o;let a=function(...c){let l=o.apply(this,c);return t(),l};a.__zharp=true,r[i]=a;}return window.addEventListener("popstate",t),window.addEventListener("hashchange",t),()=>{Object.assign(r,s),window.removeEventListener("popstate",t),window.removeEventListener("hashchange",t);}}var $e="button,a,[role=button],[role=link],[role=menuitem],[role=tab],[role=option],[role=checkbox],[role=switch],input[type=button],input[type=submit],input[type=checkbox],input[type=radio],summary,label,select,[data-zharp-name]";function Me(n){var c;let e=n instanceof Element?n:null;if(!e)return null;let t=(c=e.closest($e))!=null?c:e,r=l=>{var h;return (h=t.getAttribute(l))==null?void 0:h.trim()},s=t.tagName.toLowerCase(),i=r("data-zharp-name")||r("aria-label")||(s==="input"?t.value||r("name"):"")||(t.textContent||"").replace(/\s+/g," ").trim()||r("title")||r("alt")||s;i.length>40&&(i=`${i.slice(0,39)}\u2026`);let o=t.id?`#${t.id}`:"",a=typeof t.className=="string"&&t.className.trim()?`.${t.className.trim().split(/\s+/).slice(0,2).join(".")}`:"";return {label:i,selector:`${s}${o}${a}`}}function pe(n){let e=t=>chunkH5MED5NB_js.h(()=>{let r=Me(t.target);r&&n(r.label,r.selector);});return document.addEventListener("click",e,true),()=>document.removeEventListener("click",e,true)}function he(n){let e=["click","keydown","scroll","touchstart","pointerdown"],t=0,r=()=>{let s=Date.now();s-t<1e3||(t=s,chunkH5MED5NB_js.h(n));};for(let s of e)document.addEventListener(s,r,{capture:true,passive:true});return ()=>{for(let s of e)document.removeEventListener(s,r,{capture:true});}}function fe(n){let e=()=>{document.visibilityState==="hidden"&&chunkH5MED5NB_js.h(n);},t=()=>chunkH5MED5NB_js.h(n);return document.addEventListener("visibilitychange",e),window.addEventListener("pagehide",t),()=>{document.removeEventListener("visibilitychange",e),window.removeEventListener("pagehide",t);}}function ge(){let n=chunkH5MED5NB_js.h(()=>performance.getEntriesByType("navigation")[0]);if(!n)return {};let e={},t=(r,s)=>{s>0&&(e[r]=Math.round(s));};return t("browser.timing.ttfb_ms",n.responseStart),t("browser.timing.dom_content_loaded_ms",n.domContentLoadedEventEnd),t("browser.timing.load_ms",n.loadEventEnd),e}function He(n){return import('./recorder-2KVKGSYN.js')}var A=class{constructor(e,t,r,s){this.session=e;this.options=t;this.endpoint=r;this.service=s;this.recorder=null;this.loading=false;this.early={traces:[],error:false};e.onRenew(()=>{let i=this.decide();this.recorder?this.recorder.renew(i):i!=="off"&&this.load(i);});}start(){let e=this.decide();e!=="off"&&this.load(e);}linkTrace(e){this.recorder?this.recorder.linkTrace(e):this.loading&&this.early.traces.length<50&&this.early.traces.push(e);}onError(){this.recorder?this.recorder.onError():this.loading&&(this.early.error=true);}flush(){return this.recorder?this.recorder.flush():Promise.resolve()}flushOnHide(){var e;(e=this.recorder)==null||e.flushOnHide();}stop(){let e=this.recorder;return this.recorder=null,e?e.stop():Promise.resolve()}decide(){let e=this.session.current;if(e.replay)return e.replay;let t=s=>typeof s=="number"?Math.min(1,Math.max(0,s)):0,r=Math.random()<t(this.options.sampleRate)?"session":Math.random()<t(this.options.onErrorSampleRate)?"buffer":"off";return this.session.update({replay:r}),r}load(e){if(this.loading)return;this.loading=true;let t={endpoint:this.endpoint,service:this.service,options:this.options,session:()=>this.session.current,saveSequence:(r,s)=>{this.session.current.id===r&&this.session.update({seq:s});},saveMode:(r,s)=>{this.session.current.id===r&&this.session.update({replay:s});}};He(this.options).then(r=>{this.recorder=r.createRecorder(t,e);for(let s of this.early.traces)this.recorder.linkTrace(s);this.early.error&&this.recorder.onError();}).catch(()=>{}).finally(()=>{this.loading=false,this.early={traces:[],error:false};});}};var me="zharp.session",Ue=5e3;function ye(n=null){let e=Date.now(),t=chunkH5MED5NB_js.a(16);return {id:`${t.slice(0,8)}-${t.slice(8,12)}-4${t.slice(13,16)}-${(parseInt(t[16],16)&3|8).toString(16)}${t.slice(17,20)}-${t.slice(20)}`,started:e,lastActive:e,user:n}}var I=class{constructor(e){this.timeoutMs=e;this.lastWrite=0;this.listeners=[];let t=this.read();this.state=t&&Date.now()-t.lastActive<e?t:ye(t==null?void 0:t.user),this.write();}get current(){return Date.now()-this.state.lastActive>=this.timeoutMs&&this.renew(),this.state}get id(){return this.current.id}touch(){let e=this.current;e.lastActive=Date.now(),e.lastActive-this.lastWrite>Ue&&this.write();}renew(e){this.state=ye(e===void 0?this.state.user:e),this.write();for(let t of this.listeners)t(this.state);}update(e){Object.assign(this.state,e),this.write();}onRenew(e){this.listeners.push(e);}read(){try{let e=sessionStorage.getItem(me),t=e?JSON.parse(e):null;return t&&typeof t.id=="string"&&typeof t.lastActive=="number"?t:null}catch(e){return null}}write(){this.lastWrite=Date.now();try{sessionStorage.setItem(me,JSON.stringify(this.state));}catch(e){}}};var O="0.1.0";var Ze="https://api.zharp.io/api/v1/otlp",ze={trace:1,debug:5,info:9,warn:13,error:17,fatal:21},k=class{constructor(){this.running=null;this.user=null;this.tags={};this.reported=new WeakSet;this.log={trace:(e,t)=>this.emit("trace",e,t),debug:(e,t)=>this.emit("debug",e,t),info:(e,t)=>this.emit("info",e,t),warn:(e,t)=>this.emit("warn",e,t),error:(e,t)=>this.emit("error",e,t),fatal:(e,t)=>this.emit("fatal",e,t)};}get isActive(){return this.running!==null}get sessionId(){var e;return (e=this.running)==null?void 0:e.session.id}init(e){try{if(this.running){console.warn("[Zharp] Zharp.init() was called again \u2014 the first call's settings stay in effect.");return}if(!e||!e.key){console.warn("[Zharp] Zharp.init({ key }) needs the app key from the Zharp dashboard. Nothing will be sent.");return}if(!chunkH5MED5NB_js.i())return;this.start(e);}catch(t){}}start(e){var V,q,W,B,D,F;let t=(e.endpoint||Ze).replace(/\/+$/,""),r={url:t,key:e.key,fetch:globalThis.fetch},s=e.service||"web",i=new I(((V=e.sessionTimeoutMinutes)!=null?V:30)*6e4);this.user?i.update({user:this.user}):this.user=(q=i.current.user)!=null?q:null;let o=typeof navigator!="undefined"?navigator.userAgent:"",a=J(o),c=chunkH5MED5NB_js.f({"service.name":s,"service.version":e.release,"deployment.environment.name":e.environment,"telemetry.sdk.name":"zharp","telemetry.sdk.language":"webjs","telemetry.sdk.version":O,"browser.name":a.browserName,"browser.version":a.browserVersion,"os.name":a.osName,"os.version":a.osVersion,"user_agent.original":o||void 0}),l={name:"@zharp/browser",version:O},h=new chunkH5MED5NB_js.o(r,"traces",p=>({resourceSpans:[{resource:{attributes:c},scopeSpans:[{scope:l,spans:p}]}]})),f=new chunkH5MED5NB_js.o(r,"logs",p=>({resourceLogs:[{resource:{attributes:c},scopeLogs:[{scope:l,logRecords:p}]}]})),b=e.replay,u=b&&(((W=b.sampleRate)!=null?W:0)>0||((B=b.onErrorSampleRate)!=null?B:0)>0)?new A(i,b,r,s):null,g=new _({export:p=>{p.sampled&&h.add(p.toOtlp(this.contextAttributes()));},traceStarted:p=>u==null?void 0:u.linkTrace(p)});g.sampleRate=typeof e.sampleRate=="number"?Math.min(1,Math.max(0,e.sampleRate)):1;let y=e.tracing!==false,z={options:e,endpoint:r,session:i,tracer:g,tracing:y,spans:h,logs:f,replay:u,teardowns:[]};this.running=z;let ve=(D=e.ignoreUrls)!=null?D:[],Se=(F=e.tracingOrigins)!=null?F:[],j={tracer:g,shouldTrace:p=>{let w=H(p);return !w.startsWith(t)&&!U(w,ve)},shouldPropagate:p=>le(p)||U(p,Se),baggage:()=>this.baggage()},v=z.teardowns;if(y&&v.push(ce(j),de(j)),v.push(ne((p,w)=>this.report(p,false,{"zharp.mechanism":w}))),v.push(he(()=>i.touch())),v.push(ue(p=>{i.touch(),y&&g.startRoot("navigation",p,{"url.full":location.href});})),y&&e.interactions!==false&&v.push(pe((p,w)=>g.noteClick(p,w))),e.captureConsole){let p=e.captureConsole===true?["debug","log","info","warn","error"]:e.captureConsole;v.push(se(p,(w,Re)=>this.emit(w,Re,{"log.source":"console"})));}v.push(fe(()=>{g.endAll(),h.flushOnHide(),f.flushOnHide(),u==null||u.flushOnHide();})),u==null||u.start(),y&&this.startPageLoad(g);}startPageLoad(e){let t=typeof performance!="undefined"&&performance.timeOrigin?performance.timeOrigin:chunkH5MED5NB_js.d(),r=e.startRoot("pageload",T(),{"url.full":location.href,"document.referrer":document.referrer||void 0},t),s=()=>{r.span.setAttributes(ge()),r.release();};document.readyState==="complete"?s():(r.hold(),window.addEventListener("load",()=>setTimeout(s,0),{once:true}));}setUser(e){chunkH5MED5NB_js.h(()=>{var t;this.user=e&&e.id!==void 0&&e.id!==null&&e.id!==""?{id:e.id,email:e.email,name:e.name}:null,(t=this.running)==null||t.session.update({user:this.user});});}clearUser(){chunkH5MED5NB_js.h(()=>{var e;this.user=null,(e=this.running)==null||e.session.renew(null);});}setTag(e,t){t==null?delete this.tags[e]:this.tags[e]=t;}captureError(e,t){this.report(e,true,t);}startSpan(e,t,r){let s=this.running,i;if(s!=null&&s.tracing&&(i=chunkH5MED5NB_js.h(()=>s.tracer.startSpan(e,1))),!s||!i)return t(Z);let o=i;r&&o.setAttributes(r);let a=c=>chunkH5MED5NB_js.h(()=>o.setStatus(2,P(c).message).end());try{let c=s.tracer.withSpan(o,()=>t(o));return c&&typeof c.then=="function"?c.then(l=>(o.end(),l),l=>{throw a(l),l}):(o.end(),c)}catch(c){throw a(c),c}}async flush(){var t;let e=this.running;e&&await Promise.all([e.spans.flush(),e.logs.flush(),(t=e.replay)==null?void 0:t.flush()]).catch(()=>{});}async close(){var t;let e=this.running;if(e){e.tracer.endAll(),await this.flush(),await((t=e.replay)==null?void 0:t.stop().catch(()=>{}));for(let r of e.teardowns)chunkH5MED5NB_js.h(r);this.running=null;}}contextAttributes(){let e=this.running,t=this.user;return {...this.tags,"session.id":e==null?void 0:e.session.id,"enduser.id":t?String(t.id):void 0,"enduser.email":t==null?void 0:t.email,"enduser.name":t==null?void 0:t.name}}baggage(){var r;let e=[],t=(r=this.running)==null?void 0:r.session.id;return t&&e.push(`session.id=${encodeURIComponent(t)}`),this.user&&e.push(`enduser.id=${encodeURIComponent(String(this.user.id))}`),e.join(",")}emit(e,t,r,s){chunkH5MED5NB_js.h(()=>{var l;let i=this.running;if(!i)return;let o=i.tracer.activeSpan(),a=chunkH5MED5NB_js.e(chunkH5MED5NB_js.d()),c={...this.contextAttributes(),"url.full":location.href};for(let h in r){let f=r[h];f instanceof Error&&!s&&(e==="error"||e==="fatal")?(s=C(f,true),this.reported.add(f)):c[h]=f;}i.logs.add({timeUnixNano:a,observedTimeUnixNano:a,severityNumber:ze[e],severityText:e.toUpperCase(),body:{stringValue:typeof t=="string"?t:t instanceof Error?t.message:chunkH5MED5NB_js.g(t)},attributes:chunkH5MED5NB_js.f({...c,...s}),traceId:o==null?void 0:o.traceId,spanId:o==null?void 0:o.spanId}),s&&((l=i.replay)==null||l.onError());});}report(e,t,r){chunkH5MED5NB_js.h(()=>{if(e&&typeof e=="object"){if(this.reported.has(e))return;this.reported.add(e);}let s=P(e),i=C(s,t);this.emit("error",`${i["exception.type"]}: ${i["exception.message"]}`,r,i);});}},Z={traceId:"",spanId:"",setAttribute(){return Z},setAttributes(){return Z}};var we=globalThis,be,je=(be=we.__ZHARP_BROWSER__)!=null?be:we.__ZHARP_BROWSER__=new k,yt=je;
6
+ exports.VERSION=O;exports.Zharp=je;exports.ZharpBrowser=k;exports.default=yt;//# sourceMappingURL=index.js.map
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/environment.ts","../../../internal/src/debug-ids.ts","../src/instrument/errors.ts","../src/tracing.ts","../src/instrument/http.ts","../src/instrument/page.ts","../src/replay/controller.ts","../src/session.ts","../src/version.ts","../src/client.ts","../src/index.ts"],"names":["BROWSERS","parseUserAgent","ua","_a","out","name","pattern","match","DEBUG_IDS_ATTRIBUTE","files","parsed","registry","g","value","frameFile","line","text","clean","file","stackFiles","stack","refresh","entries","id","debugIdsFor","debugIdAttributes","ids","asError","error","safeString","exceptionAttributes","handled","type","message","head","watchErrors","report","onError","event","safely","onRejection","CONSOLE_LEVELS","watchConsole","methods","log","originals","inside","method","original","patched","args","arg","Span","tracer","kind","parent","startTime","now","newSpanId","newTraceId","key","attributes","code","time","context","toNanos","keyValues","IdleSpan","span","idleMs","maxMs","onEnd","ROOT_IDLE_MS","INTERACTION_IDLE_MS","MAX_ROOT_MS","CLICK_WINDOW_MS","Tracer","hooks","fn","index","path","_b","idle","label","target","click","waiters","begin","url","full","absolute","pathOf","hostOf","waiter","status","mergeBaggage","existing","ours","instrumentFetch","input","init","_c","request","nextInit","headers","baggage","response","instrumentXhr","proto","open","send","setRequestHeader","rest","state","lower","body","base","matches","patterns","sameOrigin","currentRoute","hash","watchNavigation","onNavigate","last","check","route","history","result","CLICKABLE","describeTarget","start","element","attr","tag","classes","watchClicks","onClick","listener","described","watchActivity","onActivity","events","watchHide","onHide","onVisibility","onPageHide","navigationTimings","entry","put","loadRecorder","options","ReplayController","session","endpoint","service","mode","traceId","recorder","rate","host","next","replay","module","STORAGE_KEY","WRITE_EVERY_MS","newState","user","hex","randomHex","Session","timeoutMs","stored","patch","raw","VERSION","DEFAULT_ENDPOINT","SEVERITY","ZharpBrowser","m","a","isBrowser","e","_d","_e","_f","endpointUrl","platform","resource","scope","spans","Exporter","records","logs","replayOptions","tracing","running","ignore","tracingOrigins","httpHooks","t","mechanism","selector","level","timeOrigin","root","loaded","noopSpan","s","fail","undo","parts","exception","attrs","Zharp","src_default"],"mappings":"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","file":"index.js","sourcesContent":["/**\r\n * Browser and OS from the user agent, as `browser.name`/`browser.version` and\r\n * `os.name`/`os.version`.\r\n *\r\n * A handful of patterns rather than a UA library: the dashboard needs \"Chrome 130 on macOS\",\r\n * not device databases, and the order of the checks is what matters — Edge and Opera say\r\n * \"Chrome\" too, and every iOS browser says \"Safari\".\r\n */\r\n\r\nconst BROWSERS: Array<[name: string, pattern: RegExp]> = [\r\n ['Edge', /Edg(?:e|A|iOS)?\\/([\\d.]+)/],\r\n ['Opera', /(?:OPR|Opera)\\/([\\d.]+)/],\r\n ['Samsung Internet', /SamsungBrowser\\/([\\d.]+)/],\r\n ['Firefox', /(?:Firefox|FxiOS)\\/([\\d.]+)/],\r\n ['Chrome', /(?:Chrome|CriOS)\\/([\\d.]+)/],\r\n ['Safari', /Version\\/([\\d.]+).*Safari\\//],\r\n];\r\n\r\nexport interface Platform {\r\n browserName?: string;\r\n browserVersion?: string;\r\n osName?: string;\r\n osVersion?: string;\r\n}\r\n\r\nexport function parseUserAgent(ua: string): Platform {\r\n const out: Platform = {};\r\n for (const [name, pattern] of BROWSERS) {\r\n const match = pattern.exec(ua);\r\n if (match) {\r\n out.browserName = name;\r\n // The major version is what anyone filters on; the rest is build noise.\r\n out.browserVersion = match[1].split('.')[0];\r\n break;\r\n }\r\n }\r\n\r\n let match: RegExpExecArray | null;\r\n if ((match = /Windows NT ([\\d.]+)/.exec(ua))) {\r\n out.osName = 'Windows';\r\n out.osVersion = ({ '10.0': '10', '6.3': '8.1', '6.2': '8', '6.1': '7' } as Record<string, string>)[match[1]] ?? match[1];\r\n } else if ((match = /(?:iPhone|iPad|iPod).*? OS ([\\d_]+)/.exec(ua))) {\r\n out.osName = 'iOS';\r\n out.osVersion = match[1].replace(/_/g, '.');\r\n } else if ((match = /Android ([\\d.]+)/.exec(ua))) {\r\n out.osName = 'Android';\r\n out.osVersion = match[1];\r\n } else if ((match = /Mac OS X ([\\d_.]+)/.exec(ua))) {\r\n out.osName = 'macOS';\r\n out.osVersion = match[1].replace(/_/g, '.');\r\n } else if (/CrOS/.test(ua)) {\r\n out.osName = 'ChromeOS';\r\n } else if (/Linux/.test(ua)) {\r\n out.osName = 'Linux';\r\n }\r\n return out;\r\n}\r\n","/**\r\n * Debug IDs: which build of a file a stack frame came from, so Zharp can find its source map.\r\n *\r\n * `zharp sourcemaps inject` (and the bundler plugins) add a line to every emitted JS file that\r\n * registers it at load time:\r\n *\r\n * (globalThis.__zharpDebugIds ||= {})[new Error().stack] = \"<uuid>\"\r\n *\r\n * The key is a stack captured inside the file, so its top frame names the file exactly as this\r\n * runtime sees it — whatever the CDN, URL or path. Parsing those stacks gives file → debug ID;\r\n * an error then carries the IDs of the files in its own stack as `zharp.debug_ids`, a JSON\r\n * object `{ \"<file as it appears in the stack>\": \"<uuid>\" }`.\r\n */\r\n\r\n/** The attribute an error carries its files' debug IDs in. */\r\nexport const DEBUG_IDS_ATTRIBUTE = 'zharp.debug_ids';\r\n\r\n/** File → debug ID, from the registry entries parsed so far. */\r\nconst files = new Map<string, string>();\r\n/** Registry keys already parsed. The registry only grows, so each stack is parsed once. */\r\nconst parsed = new Set<string>();\r\n\r\nfunction registry(): Record<string, unknown> | undefined {\r\n const g = typeof globalThis !== 'undefined' ? (globalThis as any) : undefined;\r\n const value = g && g.__zharpDebugIds;\r\n return value && typeof value === 'object' ? value : undefined;\r\n}\r\n\r\n/**\r\n * The file a stack frame line points at, as written in the line: V8 (`at fn (file:1:2)`,\r\n * `at file:1:2`), and Gecko/WebKit (`fn@file:1:2`, `@file:1:2`). Undefined for anything else.\r\n */\r\nexport function frameFile(line: string): string | undefined {\r\n const text = line.trim();\r\n if (!text) return undefined;\r\n let match = /^at (?:async )?(?:.*? \\()?(.+?):\\d+:\\d+\\)?$/.exec(text);\r\n if (match) return clean(match[1]);\r\n if (text.startsWith('at ')) return undefined;\r\n match = /^(?:[^@]*@)?(.+?):\\d+:\\d+$/.exec(text);\r\n return match ? clean(match[1]) : undefined;\r\n}\r\n\r\nfunction clean(file: string): string | undefined {\r\n // `eval at fn (file:1:2), <anonymous>` and friends name no file of their own.\r\n if (!file || file.includes('eval at ') || file === '<anonymous>' || file === 'native') return undefined;\r\n return file;\r\n}\r\n\r\n/** Every file in a stack, in order, each once. */\r\nexport function stackFiles(stack: string): string[] {\r\n const out: string[] = [];\r\n for (const line of stack.split('\\n')) {\r\n const file = frameFile(line);\r\n if (file && !out.includes(file)) out.push(file);\r\n }\r\n return out;\r\n}\r\n\r\n/** Parse the registry entries not seen yet: each one's top frame is the file that registered it. */\r\nfunction refresh(): void {\r\n const entries = registry();\r\n if (!entries) return;\r\n for (const stack in entries) {\r\n if (parsed.has(stack)) continue;\r\n parsed.add(stack);\r\n const id = entries[stack];\r\n if (typeof id !== 'string') continue;\r\n for (const line of stack.split('\\n')) {\r\n const file = frameFile(line);\r\n if (file) {\r\n files.set(file, id);\r\n break;\r\n }\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * The debug IDs of the files in `stack` that registered one, or undefined when none did (no\r\n * injected build, or only third-party frames).\r\n */\r\nexport function debugIdsFor(stack: string | undefined): Record<string, string> | undefined {\r\n if (!stack) return undefined;\r\n try {\r\n refresh();\r\n if (files.size === 0) return undefined;\r\n let out: Record<string, string> | undefined;\r\n for (const file of stackFiles(stack)) {\r\n const id = files.get(file);\r\n if (id) (out ??= {})[file] = id;\r\n }\r\n return out;\r\n } catch {\r\n return undefined;\r\n }\r\n}\r\n\r\n/** `{ 'zharp.debug_ids': '<json>' }` for `stack`, or an empty object. Spread it into an error's attributes. */\r\nexport function debugIdAttributes(stack: string | undefined): Record<string, string> {\r\n const ids = debugIdsFor(stack);\r\n return ids ? { [DEBUG_IDS_ATTRIBUTE]: JSON.stringify(ids) } : {};\r\n}\r\n\r\n/** For tests: forget everything parsed. */\r\nexport function resetDebugIdCache(): void {\r\n files.clear();\r\n parsed.clear();\r\n}\r\n","/**\r\n * Uncaught errors, unhandled rejections and (when asked for) the console.\r\n */\r\nimport { debugIdAttributes } from '@zharp/internal/debug-ids';\r\nimport { safeString, safely } from '../util';\r\n\r\n/** Whatever was thrown, as an Error. */\r\nexport function asError(value: unknown): Error {\r\n if (value instanceof Error) return value;\r\n if (value && typeof value === 'object' && typeof (value as any).message === 'string') {\r\n const error = new Error((value as any).message);\r\n error.name = typeof (value as any).name === 'string' ? (value as any).name : 'Error';\r\n if (typeof (value as any).stack === 'string') error.stack = (value as any).stack;\r\n return error;\r\n }\r\n return new Error(typeof value === 'string' ? value : `Non-Error thrown: ${safeString(value)}`);\r\n}\r\n\r\n/**\r\n * The `exception.*` attributes Zharp groups errors by. The stack keeps a `Type: message` first\r\n * line: Chrome's stacks have one, Firefox's and Safari's do not. When the page's scripts were\r\n * built with Zharp's source map tooling, `zharp.debug_ids` names the build of each file in the\r\n * stack, so the server can map it back to the original source.\r\n */\r\nexport function exceptionAttributes(error: Error, handled: boolean): Record<string, string> {\r\n const type = (error.name && error.name !== 'Error' ? error.name : error.constructor?.name) || 'Error';\r\n const message = error.message || '';\r\n const head = `${type}: ${message}`;\r\n let stack = typeof error.stack === 'string' ? error.stack : '';\r\n if (!stack.startsWith(error.name || type)) stack = stack ? `${head}\\n${stack}` : head;\r\n return {\r\n 'exception.type': type,\r\n 'exception.message': message,\r\n 'exception.stacktrace': stack,\r\n 'zharp.handled': handled ? 'true' : 'false',\r\n ...debugIdAttributes(stack),\r\n };\r\n}\r\n\r\nexport function watchErrors(report: (error: unknown, mechanism: string) => void): () => void {\r\n const onError = (event: ErrorEvent) =>\r\n safely(() => {\r\n // A failed <img> or <script> load also fires 'error' (on the element, captured here only\r\n // with capture listeners, which this is not) — only script errors reach this listener.\r\n if (event.error !== undefined && event.error !== null) report(event.error, 'onerror');\r\n else if (event.message) {\r\n // \"Script error.\" from a cross-origin script without CORS: no stack, but still an error.\r\n const error = new Error(event.message);\r\n error.stack = `Error: ${event.message}\\n at ${event.filename || '<anonymous>'}:${event.lineno || 0}:${event.colno || 0}`;\r\n report(error, 'onerror');\r\n }\r\n });\r\n const onRejection = (event: PromiseRejectionEvent) => safely(() => report(event.reason, 'onunhandledrejection'));\r\n window.addEventListener('error', onError);\r\n window.addEventListener('unhandledrejection', onRejection);\r\n return () => {\r\n window.removeEventListener('error', onError);\r\n window.removeEventListener('unhandledrejection', onRejection);\r\n };\r\n}\r\n\r\nconst CONSOLE_LEVELS = { debug: 'debug', log: 'info', info: 'info', warn: 'warn', error: 'error' } as const;\r\nexport type ConsoleMethod = keyof typeof CONSOLE_LEVELS;\r\n\r\n/** Copy console calls into logs. The console still prints as before. */\r\nexport function watchConsole(methods: ConsoleMethod[], log: (level: 'debug' | 'info' | 'warn' | 'error', message: string) => void): () => void {\r\n const originals: Partial<Record<ConsoleMethod, any>> = {};\r\n let inside = false;\r\n for (const method of methods) {\r\n const original = (console as any)[method];\r\n if (typeof original !== 'function' || original.__zharp) continue;\r\n originals[method] = original;\r\n const patched = function (this: unknown, ...args: unknown[]) {\r\n original.apply(this ?? console, args);\r\n if (inside) return;\r\n inside = true;\r\n safely(() => {\r\n const message = args.map((arg) => (arg instanceof Error ? arg.stack || String(arg) : safeString(arg))).join(' ');\r\n if (!message.startsWith('[Zharp]')) log(CONSOLE_LEVELS[method], message);\r\n });\r\n inside = false;\r\n };\r\n (patched as any).__zharp = true;\r\n (console as any)[method] = patched;\r\n }\r\n return () => Object.assign(console, originals);\r\n}\r\n","/**\r\n * Spans in the page.\r\n *\r\n * Browsers have no async context to carry \"the current span\" across awaits, so the page's\r\n * structure stands in for it. At any moment the parent for new work is, in order:\r\n *\r\n * 1. a span opened with `Zharp.startSpan()`, while its callback runs synchronously;\r\n * 2. the open interaction — a click that led to requests, `click “Pay now”`;\r\n * 3. the open page load or navigation.\r\n *\r\n * Page loads, navigations and interactions are each the root of a trace of their own, and stay\r\n * open until their requests are done and nothing new has started for a moment (or a hard limit\r\n * passes). A request with none of these open is a trace on its own.\r\n */\r\nimport { keyValues, newSpanId, newTraceId, now, toNanos } from './util';\r\n\r\nexport const enum Kind {\r\n Internal = 1,\r\n Client = 3,\r\n}\r\n\r\nexport const enum Status {\r\n Unset = 0,\r\n Ok = 1,\r\n Error = 2,\r\n}\r\n\r\nexport class Span {\r\n readonly spanId = newSpanId();\r\n readonly traceId: string;\r\n readonly parentSpanId?: string;\r\n readonly sampled: boolean;\r\n readonly attributes: Record<string, unknown> = {};\r\n private status: { code: Status; message?: string } = { code: Status.Unset };\r\n private endTime = 0;\r\n\r\n constructor(\r\n private readonly tracer: Tracer,\r\n public name: string,\r\n readonly kind: Kind,\r\n parent: Span | null,\r\n readonly startTime = now(),\r\n ) {\r\n this.traceId = parent ? parent.traceId : newTraceId();\r\n this.parentSpanId = parent?.spanId;\r\n this.sampled = parent ? parent.sampled : Math.random() < tracer.sampleRate;\r\n }\r\n\r\n get ended(): boolean {\r\n return this.endTime !== 0;\r\n }\r\n\r\n setAttribute(key: string, value: unknown): this {\r\n this.attributes[key] = value;\r\n return this;\r\n }\r\n\r\n setAttributes(attributes: Record<string, unknown>): this {\r\n Object.assign(this.attributes, attributes);\r\n return this;\r\n }\r\n\r\n setStatus(code: Status, message?: string): this {\r\n this.status = { code, message };\r\n return this;\r\n }\r\n\r\n /** W3C `traceparent` for a request made inside this span. */\r\n get traceparent(): string {\r\n return `00-${this.traceId}-${this.spanId}-${this.sampled ? '01' : '00'}`;\r\n }\r\n\r\n end(time = now()): void {\r\n if (this.endTime) return;\r\n this.endTime = Math.max(time, this.startTime);\r\n this.tracer.finished(this);\r\n }\r\n\r\n /** As an OTLP/JSON span, with the context attributes as they are now. */\r\n toOtlp(context: Record<string, unknown>): Record<string, unknown> {\r\n return {\r\n traceId: this.traceId,\r\n spanId: this.spanId,\r\n parentSpanId: this.parentSpanId,\r\n name: this.name,\r\n kind: this.kind,\r\n startTimeUnixNano: toNanos(this.startTime),\r\n endTimeUnixNano: toNanos(this.endTime),\r\n attributes: keyValues({ ...context, ...this.attributes }),\r\n status: this.status.message ? this.status : { code: this.status.code },\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * A root span that ends itself once its work is done: when nothing it is waiting for is in\r\n * flight and `idleMs` has passed with nothing new, or at `maxMs` regardless.\r\n */\r\nexport class IdleSpan {\r\n private inflight = 0;\r\n private idleTimer: ReturnType<typeof setTimeout> | null = null;\r\n private readonly maxTimer: ReturnType<typeof setTimeout>;\r\n /** A page load is not finished before the load event, however quiet the network is. */\r\n private held = false;\r\n\r\n constructor(\r\n readonly span: Span,\r\n private readonly idleMs: number,\r\n maxMs: number,\r\n private readonly onEnd: (idle: IdleSpan) => void,\r\n ) {\r\n this.maxTimer = setTimeout(() => this.finish(), Math.max(0, span.startTime + maxMs - now()));\r\n this.arm();\r\n }\r\n\r\n begin(): void {\r\n this.inflight++;\r\n this.disarm();\r\n }\r\n\r\n done(): void {\r\n this.inflight = Math.max(0, this.inflight - 1);\r\n this.arm();\r\n }\r\n\r\n /** Do not end on idle until `release()`; the hard limit still applies. */\r\n hold(): void {\r\n this.held = true;\r\n this.disarm();\r\n }\r\n\r\n release(): void {\r\n this.held = false;\r\n this.arm();\r\n }\r\n\r\n finish(): void {\r\n if (this.span.ended) return;\r\n this.disarm();\r\n clearTimeout(this.maxTimer);\r\n this.span.end();\r\n this.onEnd(this);\r\n }\r\n\r\n private arm(): void {\r\n this.disarm();\r\n if (this.inflight === 0 && !this.held) this.idleTimer = setTimeout(() => this.finish(), this.idleMs);\r\n }\r\n\r\n private disarm(): void {\r\n if (this.idleTimer) clearTimeout(this.idleTimer);\r\n this.idleTimer = null;\r\n }\r\n}\r\n\r\nexport interface TracerHooks {\r\n /** A span ended; export it if sampled. */\r\n export(span: Span): void;\r\n /** A new trace began; the replay of this session should know about it. */\r\n traceStarted(traceId: string): void;\r\n}\r\n\r\n/** Root spans wait this long after their last request before ending. */\r\nconst ROOT_IDLE_MS = 1_000;\r\nconst INTERACTION_IDLE_MS = 500;\r\nconst MAX_ROOT_MS = 30_000;\r\n/** A request this long after a click is no longer counted as the click's doing. */\r\nconst CLICK_WINDOW_MS = 1_000;\r\n\r\nexport class Tracer {\r\n sampleRate = 1;\r\n root: IdleSpan | null = null;\r\n interaction: IdleSpan | null = null;\r\n private click: { label: string; target: string; time: number } | null = null;\r\n private readonly stack: Span[] = [];\r\n\r\n constructor(private readonly hooks: TracerHooks) {}\r\n\r\n finished(span: Span): void {\r\n this.hooks.export(span);\r\n }\r\n\r\n /** The span new work belongs to, if any is open. */\r\n activeSpan(): Span | null {\r\n if (this.stack.length) return this.stack[this.stack.length - 1];\r\n if (this.interaction && !this.interaction.span.ended) return this.interaction.span;\r\n if (this.root && !this.root.span.ended) return this.root.span;\r\n return null;\r\n }\r\n\r\n startSpan(name: string, kind = Kind.Internal, parent: Span | null = this.activeSpan(), startTime?: number): Span {\r\n const span = new Span(this, name, kind, parent, startTime);\r\n if (!parent) this.hooks.traceStarted(span.traceId);\r\n return span;\r\n }\r\n\r\n /** Run `fn` with `span` as the active span for its synchronous part. */\r\n withSpan<T>(span: Span, fn: () => T): T {\r\n this.stack.push(span);\r\n try {\r\n return fn();\r\n } finally {\r\n const index = this.stack.lastIndexOf(span);\r\n if (index >= 0) this.stack.splice(index, 1);\r\n }\r\n }\r\n\r\n /** A page load or navigation: ends whatever root and interaction were open, and starts the new root. */\r\n startRoot(type: 'pageload' | 'navigation', path: string, attributes: Record<string, unknown>, startTime?: number): IdleSpan {\r\n this.interaction?.finish();\r\n this.root?.finish();\r\n const span = this.startSpan(`${type} ${path}`, Kind.Internal, null, startTime);\r\n span.setAttributes({ 'zharp.span.type': type, ...attributes });\r\n this.root = new IdleSpan(span, ROOT_IDLE_MS, MAX_ROOT_MS, (idle) => {\r\n if (this.root === idle) this.root = null;\r\n });\r\n return this.root;\r\n }\r\n\r\n /** A click happened; it becomes an interaction span only if it leads to a request. */\r\n noteClick(label: string, target: string): void {\r\n this.click = { label, target, time: now() };\r\n }\r\n\r\n /**\r\n * A request is starting. Returns the span it belongs under and the idle spans to tell when it\r\n * is done — after opening the interaction span if a click just led to it.\r\n */\r\n requestStarting(): { parent: Span | null; waiters: IdleSpan[] } {\r\n const click = this.click;\r\n if (click && now() - click.time < CLICK_WINDOW_MS && !this.stack.length) {\r\n this.click = null;\r\n this.interaction?.finish();\r\n const span = this.startSpan(`click “${click.label}”`, Kind.Internal, null, click.time);\r\n span.setAttributes({ 'zharp.span.type': 'interaction', 'zharp.interaction.target': click.target });\r\n this.interaction = new IdleSpan(span, INTERACTION_IDLE_MS, MAX_ROOT_MS, (idle) => {\r\n if (this.interaction === idle) this.interaction = null;\r\n });\r\n }\r\n const waiters = [this.interaction, this.root].filter((s): s is IdleSpan => !!s && !s.span.ended);\r\n return { parent: this.activeSpan(), waiters };\r\n }\r\n\r\n /** The page is going away: end everything that is open, so it can still be sent. */\r\n endAll(): void {\r\n this.interaction?.finish();\r\n this.root?.finish();\r\n }\r\n}\r\n","/**\r\n * CLIENT spans for `fetch` and `XMLHttpRequest`, and the headers that carry the trace on.\r\n *\r\n * Only same-origin requests and those matching `tracingOrigins` get `traceparent` and\r\n * `baggage`: an unexpected header on a third-party request turns it into a CORS preflight the\r\n * third party may refuse. Every request still gets a span; the SDK's own requests get neither.\r\n */\r\nimport { Kind, Status, type Span, type Tracer } from '../tracing';\r\nimport { safely } from '../util';\r\n\r\nexport interface HttpHooks {\r\n tracer: Tracer;\r\n /** Whether a URL is traced at all (not the SDK's own endpoint, not ignored). */\r\n shouldTrace(url: string): boolean;\r\n /** Whether a URL gets the trace headers. */\r\n shouldPropagate(url: string): boolean;\r\n /** `baggage` entries: the session and user. */\r\n baggage(): string;\r\n}\r\n\r\n/** The span for one request, and the root spans waiting for it. */\r\nfunction begin(hooks: HttpHooks, method: string, url: string): { span: Span; done: (status: number, error?: unknown) => void } {\r\n const { parent, waiters } = hooks.tracer.requestStarting();\r\n const full = absolute(url);\r\n const span = hooks.tracer.startSpan(`${method} ${pathOf(full)}`, Kind.Client, parent);\r\n span.setAttributes({ 'http.request.method': method, 'url.full': full, 'server.address': hostOf(full) });\r\n for (const waiter of waiters) waiter.begin();\r\n return {\r\n span,\r\n done(status, error) {\r\n if (status) span.setAttribute('http.response.status_code', status);\r\n if (error !== undefined || !status) {\r\n span.setAttribute('error.type', error instanceof Error ? error.name : 'network');\r\n span.setStatus(Status.Error, error instanceof Error ? error.message : 'Request failed');\r\n } else if (status >= 400) {\r\n span.setAttribute('error.type', String(status));\r\n span.setStatus(Status.Error, `HTTP ${status}`);\r\n }\r\n span.end();\r\n for (const waiter of waiters) waiter.done();\r\n },\r\n };\r\n}\r\n\r\n/** `baggage` merged with any the caller already set. */\r\nfunction mergeBaggage(existing: string | null | undefined, ours: string): string {\r\n return existing ? `${existing},${ours}` : ours;\r\n}\r\n\r\nexport function instrumentFetch(hooks: HttpHooks): () => void {\r\n const g = globalThis as any;\r\n const original = g.fetch;\r\n if (typeof original !== 'function' || original.__zharp) return () => {};\r\n\r\n const patched = function (this: unknown, input: RequestInfo | URL, init?: RequestInit): Promise<Response> {\r\n const url = typeof input === 'string' ? input : input instanceof URL ? input.href : (input as Request)?.url;\r\n if (!url || !hooks.shouldTrace(url)) return original.call(this, input, init);\r\n\r\n const method = String(init?.method ?? (input as Request)?.method ?? 'GET').toUpperCase();\r\n const request = safely(() => begin(hooks, method, url));\r\n if (!request) return original.call(this, input, init);\r\n\r\n let nextInit = init;\r\n if (hooks.shouldPropagate(url)) {\r\n nextInit = safely(() => {\r\n const headers = new Headers(init?.headers ?? (typeof Request !== 'undefined' && input instanceof Request ? input.headers : undefined));\r\n // A traceparent the caller set is a trace they are deliberately continuing.\r\n if (!headers.has('traceparent')) headers.set('traceparent', request.span.traceparent);\r\n const baggage = hooks.baggage();\r\n if (baggage) headers.set('baggage', mergeBaggage(headers.get('baggage'), baggage));\r\n return { ...init, headers };\r\n }) ?? init;\r\n }\r\n\r\n return original.call(this, input, nextInit).then(\r\n (response: Response) => {\r\n safely(() => request.done(response.status));\r\n return response;\r\n },\r\n (error: unknown) => {\r\n safely(() => request.done(0, error));\r\n throw error;\r\n },\r\n );\r\n };\r\n patched.__zharp = true;\r\n g.fetch = patched;\r\n return () => {\r\n if (g.fetch === patched) g.fetch = original;\r\n };\r\n}\r\n\r\nexport function instrumentXhr(hooks: HttpHooks): () => void {\r\n if (typeof XMLHttpRequest === 'undefined') return () => {};\r\n const proto = XMLHttpRequest.prototype as any;\r\n if (proto.__zharp) return () => {};\r\n const { open, send, setRequestHeader } = proto;\r\n\r\n proto.open = function (method: string, url: string | URL, ...rest: unknown[]) {\r\n this.__zharp = { method: String(method || 'GET').toUpperCase(), url: String(url), traceparent: false, baggage: null };\r\n return open.call(this, method, url, ...rest);\r\n };\r\n\r\n proto.setRequestHeader = function (name: string, value: string) {\r\n const state = this.__zharp;\r\n const lower = String(name).toLowerCase();\r\n // XHR headers cannot be read back, so what the caller sets is noted as it is set.\r\n if (state && lower === 'traceparent') state.traceparent = true;\r\n if (state && lower === 'baggage' && !state.own) {\r\n state.baggage = value;\r\n return; // sent merged with ours in send()\r\n }\r\n return setRequestHeader.call(this, name, value);\r\n };\r\n\r\n proto.send = function (body?: unknown) {\r\n const state = this.__zharp;\r\n if (!state || !hooks.shouldTrace(state.url)) return send.call(this, body);\r\n const request = safely(() => begin(hooks, state.method, state.url));\r\n if (request) {\r\n safely(() => {\r\n if (hooks.shouldPropagate(state.url)) {\r\n state.own = true;\r\n if (!state.traceparent) setRequestHeader.call(this, 'traceparent', request.span.traceparent);\r\n const baggage = hooks.baggage();\r\n if (baggage || state.baggage) setRequestHeader.call(this, 'baggage', baggage ? mergeBaggage(state.baggage, baggage) : state.baggage);\r\n } else if (state.baggage) {\r\n setRequestHeader.call(this, 'baggage', state.baggage);\r\n }\r\n });\r\n this.addEventListener('loadend', () => safely(() => request.done(this.status)));\r\n } else if (state.baggage) {\r\n safely(() => setRequestHeader.call(this, 'baggage', state.baggage));\r\n }\r\n return send.call(this, body);\r\n };\r\n proto.__zharp = true;\r\n\r\n return () => {\r\n Object.assign(proto, { open, send, setRequestHeader });\r\n delete proto.__zharp;\r\n };\r\n}\r\n\r\n// ── URLs ──────────────────────────────────────────────────────────────────────\r\n\r\nconst base = () => (typeof location !== 'undefined' ? location.href : 'http://localhost/');\r\n\r\nexport function absolute(url: string): string {\r\n return safely(() => new URL(url, base()).href) ?? url;\r\n}\r\n\r\nfunction pathOf(url: string): string {\r\n return safely(() => new URL(url).pathname) ?? url.split('?')[0];\r\n}\r\n\r\nfunction hostOf(url: string): string {\r\n return safely(() => new URL(url).hostname) ?? '';\r\n}\r\n\r\n/**\r\n * Whether `url` matches one of `patterns`: a bare host (`api.example.com`, with or without a\r\n * port) matches that host; a string with a scheme matches as a prefix; a RegExp is tested.\r\n */\r\nexport function matches(url: string, patterns: Array<string | RegExp>): boolean {\r\n const parsed = safely(() => new URL(url, base()));\r\n if (!parsed) return false;\r\n return patterns.some((pattern) => {\r\n if (pattern instanceof RegExp) return pattern.test(parsed.href);\r\n if (!pattern) return false;\r\n if (pattern.includes('://')) return parsed.href.startsWith(pattern);\r\n return parsed.host === pattern || parsed.hostname === pattern;\r\n });\r\n}\r\n\r\nexport function sameOrigin(url: string): boolean {\r\n return safely(() => typeof location !== 'undefined' && new URL(url, base()).origin === location.origin) ?? false;\r\n}\r\n","/**\r\n * The page's own events: navigations in a single-page app, clicks, and the signs of a person\r\n * still being there that keep their session alive.\r\n */\r\nimport { safely } from '../util';\r\n\r\n/** The route as the app sees it: the path, plus a hash route (`#/orders`) when there is one. */\r\nexport function currentRoute(): string {\r\n const hash = location.hash.startsWith('#/') ? location.hash : '';\r\n return location.pathname + hash;\r\n}\r\n\r\n/**\r\n * Call `onNavigate(route)` when the route changes through `history.pushState`,\r\n * `history.replaceState`, back/forward, or a hash change. A replaceState that only swaps\r\n * query parameters is not a navigation.\r\n */\r\nexport function watchNavigation(onNavigate: (route: string) => void): () => void {\r\n let last = currentRoute();\r\n const check = () =>\r\n safely(() => {\r\n const route = currentRoute();\r\n if (route === last) return;\r\n last = route;\r\n onNavigate(route);\r\n });\r\n\r\n const history = window.history as any;\r\n const originals: Record<string, any> = {};\r\n for (const method of ['pushState', 'replaceState']) {\r\n const original = history[method];\r\n if (typeof original !== 'function' || original.__zharp) continue;\r\n originals[method] = original;\r\n const patched = function (this: unknown, ...args: unknown[]) {\r\n const result = original.apply(this, args);\r\n check();\r\n return result;\r\n };\r\n (patched as any).__zharp = true;\r\n history[method] = patched;\r\n }\r\n window.addEventListener('popstate', check);\r\n window.addEventListener('hashchange', check);\r\n return () => {\r\n Object.assign(history, originals);\r\n window.removeEventListener('popstate', check);\r\n window.removeEventListener('hashchange', check);\r\n };\r\n}\r\n\r\nconst CLICKABLE =\r\n 'button,a,[role=button],[role=link],[role=menuitem],[role=tab],[role=option],[role=checkbox],[role=switch],input[type=button],input[type=submit],input[type=checkbox],input[type=radio],summary,label,select,[data-zharp-name]';\r\n\r\n/** What a person would call the thing they clicked: its name for screen readers, near enough. */\r\nexport function describeTarget(target: EventTarget | null): { label: string; selector: string } | null {\r\n const start = target instanceof Element ? target : null;\r\n if (!start) return null;\r\n const element = start.closest(CLICKABLE) ?? start;\r\n const attr = (name: string) => element.getAttribute(name)?.trim();\r\n const tag = element.tagName.toLowerCase();\r\n let label =\r\n attr('data-zharp-name') ||\r\n attr('aria-label') ||\r\n (tag === 'input' ? (element as HTMLInputElement).value || attr('name') : '') ||\r\n (element.textContent || '').replace(/\\s+/g, ' ').trim() ||\r\n attr('title') ||\r\n attr('alt') ||\r\n tag;\r\n if (label.length > 40) label = `${label.slice(0, 39)}…`;\r\n const id = element.id ? `#${element.id}` : '';\r\n const classes = typeof element.className === 'string' && element.className.trim()\r\n ? `.${element.className.trim().split(/\\s+/).slice(0, 2).join('.')}`\r\n : '';\r\n return { label, selector: `${tag}${id}${classes}` };\r\n}\r\n\r\nexport function watchClicks(onClick: (label: string, selector: string) => void): () => void {\r\n const listener = (event: Event) =>\r\n safely(() => {\r\n const described = describeTarget(event.target);\r\n if (described) onClick(described.label, described.selector);\r\n });\r\n // Capture phase: a handler that stops propagation must not hide the click from the SDK.\r\n document.addEventListener('click', listener, true);\r\n return () => document.removeEventListener('click', listener, true);\r\n}\r\n\r\n/** Things a person does. Each keeps the session alive; none is recorded. */\r\nexport function watchActivity(onActivity: () => void): () => void {\r\n const events = ['click', 'keydown', 'scroll', 'touchstart', 'pointerdown'];\r\n let last = 0;\r\n const listener = () => {\r\n const time = Date.now();\r\n if (time - last < 1_000) return;\r\n last = time;\r\n safely(onActivity);\r\n };\r\n for (const name of events) document.addEventListener(name, listener, { capture: true, passive: true });\r\n return () => {\r\n for (const name of events) document.removeEventListener(name, listener, { capture: true });\r\n };\r\n}\r\n\r\n/** The page is being hidden or closed — the last chance to send anything. */\r\nexport function watchHide(onHide: () => void): () => void {\r\n const onVisibility = () => {\r\n if (document.visibilityState === 'hidden') safely(onHide);\r\n };\r\n const onPageHide = () => safely(onHide);\r\n document.addEventListener('visibilitychange', onVisibility);\r\n window.addEventListener('pagehide', onPageHide);\r\n return () => {\r\n document.removeEventListener('visibilitychange', onVisibility);\r\n window.removeEventListener('pagehide', onPageHide);\r\n };\r\n}\r\n\r\n/** Load timings of the current document, for the page load span. */\r\nexport function navigationTimings(): Record<string, number> {\r\n const entry = safely(() => performance.getEntriesByType('navigation')[0] as PerformanceNavigationTiming | undefined);\r\n if (!entry) return {};\r\n const out: Record<string, number> = {};\r\n const put = (key: string, value: number) => {\r\n if (value > 0) out[key] = Math.round(value);\r\n };\r\n put('browser.timing.ttfb_ms', entry.responseStart);\r\n put('browser.timing.dom_content_loaded_ms', entry.domContentLoadedEventEnd);\r\n put('browser.timing.load_ms', entry.loadEventEnd);\r\n return out;\r\n}\r\n","/**\r\n * The part of replay that is always in the bundle: deciding whether this session records, and\r\n * loading the recorder when it does. Everything heavy is in recorder.ts.\r\n */\r\nimport type { ReplayMode, Session } from '../session';\r\nimport type { ReplayOptions } from '../types';\r\nimport type { Endpoint } from '../transport';\r\nimport type { RecorderLike, RecorderModule, ReplayHost } from './host';\r\n\r\n\r\n/** Where the script-tag build was loaded from, so the recorder can be found next to it. */\r\nlet scriptSrc: string | undefined;\r\nexport function rememberScriptSrc(src: string | undefined): void {\r\n scriptSrc = src;\r\n}\r\n\r\nfunction loadRecorder(options: ReplayOptions): Promise<RecorderModule> {\r\n if (__ZHARP_CDN__) {\r\n const g = globalThis as any;\r\n if (g.__ZHARP_REPLAY__) return Promise.resolve(g.__ZHARP_REPLAY__);\r\n const src = options.recorderUrl || (scriptSrc ? scriptSrc.replace(/zharp(\\.min)?\\.js(\\?.*)?$/, 'zharp-replay.min.js') : '');\r\n if (!src) return Promise.reject(new Error('No recorder URL'));\r\n return new Promise((resolve, reject) => {\r\n const script = document.createElement('script');\r\n script.src = src;\r\n script.async = true;\r\n script.crossOrigin = 'anonymous';\r\n script.onload = () => (g.__ZHARP_REPLAY__ ? resolve(g.__ZHARP_REPLAY__) : reject(new Error('Recorder did not register')));\r\n script.onerror = () => reject(new Error(`Could not load ${src}`));\r\n document.head.appendChild(script);\r\n });\r\n }\r\n return import('./recorder');\r\n}\r\n\r\nexport class ReplayController {\r\n private recorder: RecorderLike | null = null;\r\n private loading = false;\r\n /** Traces and errors that happened while the recorder was downloading. */\r\n private early: { traces: string[]; error: boolean } = { traces: [], error: false };\r\n\r\n constructor(\r\n private readonly session: Session,\r\n private readonly options: ReplayOptions,\r\n private readonly endpoint: Endpoint,\r\n private readonly service: string,\r\n ) {\r\n session.onRenew(() => {\r\n const mode = this.decide();\r\n if (this.recorder) this.recorder.renew(mode);\r\n else if (mode !== 'off') this.load(mode);\r\n });\r\n }\r\n\r\n start(): void {\r\n const mode = this.decide();\r\n if (mode !== 'off') this.load(mode);\r\n }\r\n\r\n linkTrace(traceId: string): void {\r\n if (this.recorder) this.recorder.linkTrace(traceId);\r\n else if (this.loading && this.early.traces.length < 50) this.early.traces.push(traceId);\r\n }\r\n\r\n onError(): void {\r\n if (this.recorder) this.recorder.onError();\r\n else if (this.loading) this.early.error = true;\r\n }\r\n\r\n flush(): Promise<void> {\r\n return this.recorder ? this.recorder.flush() : Promise.resolve();\r\n }\r\n\r\n flushOnHide(): void {\r\n this.recorder?.flushOnHide();\r\n }\r\n\r\n stop(): Promise<void> {\r\n const recorder = this.recorder;\r\n this.recorder = null;\r\n return recorder ? recorder.stop() : Promise.resolve();\r\n }\r\n\r\n /** This session's mode, decided once and kept with the session. */\r\n private decide(): ReplayMode {\r\n const state = this.session.current;\r\n if (state.replay) return state.replay;\r\n const rate = (value: number | undefined) => (typeof value === 'number' ? Math.min(1, Math.max(0, value)) : 0);\r\n const mode: ReplayMode =\r\n Math.random() < rate(this.options.sampleRate) ? 'session' : Math.random() < rate(this.options.onErrorSampleRate) ? 'buffer' : 'off';\r\n this.session.update({ replay: mode });\r\n return mode;\r\n }\r\n\r\n private load(mode: ReplayMode): void {\r\n if (this.loading) return;\r\n this.loading = true;\r\n const host: ReplayHost = {\r\n endpoint: this.endpoint,\r\n service: this.service,\r\n options: this.options,\r\n session: () => this.session.current,\r\n saveSequence: (id, next) => {\r\n if (this.session.current.id === id) this.session.update({ seq: next });\r\n },\r\n saveMode: (id, replay) => {\r\n if (this.session.current.id === id) this.session.update({ replay });\r\n },\r\n };\r\n loadRecorder(this.options)\r\n .then((module) => {\r\n this.recorder = module.createRecorder(host, mode);\r\n for (const id of this.early.traces) this.recorder.linkTrace(id);\r\n if (this.early.error) this.recorder.onError();\r\n })\r\n .catch(() => {\r\n // No recorder (blocked by a content policy, offline): the rest of the SDK carries on.\r\n })\r\n .finally(() => {\r\n this.loading = false;\r\n this.early = { traces: [], error: false };\r\n });\r\n }\r\n}\r\n","/**\r\n * The session: one person's continuous use of one tab.\r\n *\r\n * Kept in sessionStorage, so it survives reloads and navigations in the tab but a second tab\r\n * is a session of its own. That matters for replay: two tabs writing one recording would each\r\n * number their batches from the same counter and overwrite each other.\r\n *\r\n * A session ends after 30 minutes without activity (clicks, keys, scrolls, telemetry) and when\r\n * the user logs out (`clearUser`). Storage that throws — Safari private mode, a sandboxed\r\n * iframe, a full quota — leaves the session in memory for the life of the page.\r\n */\r\nimport { randomHex } from './util';\r\nimport type { ZharpUser } from './types';\r\n\r\nconst STORAGE_KEY = 'zharp.session';\r\n/** Activity is written back at most this often; every click writing storage would be wasteful. */\r\nconst WRITE_EVERY_MS = 5_000;\r\n\r\nexport type ReplayMode = 'off' | 'session' | 'buffer';\r\n\r\nexport interface SessionState {\r\n id: string;\r\n started: number;\r\n lastActive: number;\r\n /** The replay decision, made once per session. Absent until replay has decided. */\r\n replay?: ReplayMode;\r\n /** Next replay batch number. Persisted so a reload does not reuse numbers the server already has. */\r\n seq?: number;\r\n user?: ZharpUser | null;\r\n}\r\n\r\nfunction newState(user: ZharpUser | null = null): SessionState {\r\n const time = Date.now();\r\n // A UUID's shape, from 16 random bytes.\r\n const hex = randomHex(16);\r\n const id = `${hex.slice(0, 8)}-${hex.slice(8, 12)}-4${hex.slice(13, 16)}-${((parseInt(hex[16], 16) & 3) | 8).toString(16)}${hex.slice(17, 20)}-${hex.slice(20)}`;\r\n return { id, started: time, lastActive: time, user };\r\n}\r\n\r\nexport class Session {\r\n private state: SessionState;\r\n private lastWrite = 0;\r\n private readonly listeners: Array<(state: SessionState) => void> = [];\r\n\r\n constructor(private readonly timeoutMs: number) {\r\n const stored = this.read();\r\n this.state = stored && Date.now() - stored.lastActive < timeoutMs ? stored : newState(stored?.user);\r\n this.write();\r\n }\r\n\r\n /** The current session, after starting a new one if this one has expired. */\r\n get current(): SessionState {\r\n if (Date.now() - this.state.lastActive >= this.timeoutMs) this.renew();\r\n return this.state;\r\n }\r\n\r\n get id(): string {\r\n return this.current.id;\r\n }\r\n\r\n /** Something happened: the session is still going. */\r\n touch(): void {\r\n const state = this.current;\r\n state.lastActive = Date.now();\r\n if (state.lastActive - this.lastWrite > WRITE_EVERY_MS) this.write();\r\n }\r\n\r\n /** Start a new session now. The user carries over unless `user` is given. */\r\n renew(user?: ZharpUser | null): void {\r\n this.state = newState(user === undefined ? this.state.user : user);\r\n this.write();\r\n for (const listener of this.listeners) listener(this.state);\r\n }\r\n\r\n update(patch: Partial<SessionState>): void {\r\n Object.assign(this.state, patch);\r\n this.write();\r\n }\r\n\r\n /** Called with the new state whenever a session ends and another begins. */\r\n onRenew(listener: (state: SessionState) => void): void {\r\n this.listeners.push(listener);\r\n }\r\n\r\n private read(): SessionState | null {\r\n try {\r\n const raw = sessionStorage.getItem(STORAGE_KEY);\r\n const parsed = raw ? JSON.parse(raw) : null;\r\n return parsed && typeof parsed.id === 'string' && typeof parsed.lastActive === 'number' ? parsed : null;\r\n } catch {\r\n return null;\r\n }\r\n }\r\n\r\n private write(): void {\r\n this.lastWrite = Date.now();\r\n try {\r\n sessionStorage.setItem(STORAGE_KEY, JSON.stringify(this.state));\r\n } catch {\r\n // In memory only.\r\n }\r\n }\r\n}\r\n","/** Sent as `telemetry.sdk.version`. Bumped with package.json. */\r\nexport const VERSION = '0.1.0';\r\n","/**\r\n * @zharp/browser: errors, logs, traces and session replay from a web page, sent to Zharp as\r\n * OTLP.\r\n *\r\n * `Zharp.init()` turns everything on. Each part is small and lives in its own module; this file\r\n * wires them together and is the public API. Nothing here throws into the page: every entry\r\n * point catches, and a failure to send is silent apart from one warning for a rejected key.\r\n */\r\nimport { parseUserAgent } from './environment';\r\nimport { asError, exceptionAttributes, watchConsole, watchErrors, type ConsoleMethod } from './instrument/errors';\r\nimport { absolute, instrumentFetch, instrumentXhr, matches, sameOrigin, type HttpHooks } from './instrument/http';\r\nimport { currentRoute, navigationTimings, watchActivity, watchClicks, watchHide, watchNavigation } from './instrument/page';\r\nimport { ReplayController } from './replay/controller';\r\nimport { Session } from './session';\r\nimport { Kind, Status, Tracer, type Span } from './tracing';\r\nimport { Exporter, type Endpoint } from './transport';\r\nimport type { Attributes, BrowserOptions, ZharpUser } from './types';\r\nimport { isBrowser, keyValues, now, safely, safeString, toNanos } from './util';\r\nimport { VERSION } from './version';\r\n\r\nexport const DEFAULT_ENDPOINT = 'https://api.zharp.io/api/v1/otlp';\r\n\r\nconst SEVERITY = { trace: 1, debug: 5, info: 9, warn: 13, error: 17, fatal: 21 } as const;\r\ntype Level = keyof typeof SEVERITY;\r\ntype LogFn = (message: unknown, attributes?: Attributes) => void;\r\n\r\n/** A manual span, as `Zharp.startSpan` hands it to its callback. */\r\nexport interface ZharpSpan {\r\n readonly traceId: string;\r\n readonly spanId: string;\r\n setAttribute(key: string, value: unknown): ZharpSpan;\r\n setAttributes(attributes: Attributes): ZharpSpan;\r\n}\r\n\r\ninterface Running {\r\n options: BrowserOptions;\r\n endpoint: Endpoint;\r\n session: Session;\r\n tracer: Tracer;\r\n /** False in logs-only mode: the tracer then never starts a span, so there is never an active one. */\r\n tracing: boolean;\r\n spans: Exporter<unknown>;\r\n logs: Exporter<unknown>;\r\n replay: ReplayController | null;\r\n teardowns: Array<() => void>;\r\n}\r\n\r\nexport class ZharpBrowser {\r\n private running: Running | null = null;\r\n private user: ZharpUser | null = null;\r\n private readonly tags: Record<string, unknown> = {};\r\n /** Errors already reported, so one caught by the app and then rethrown is sent once. */\r\n private readonly reported = new WeakSet<object>();\r\n\r\n readonly log: Record<Level, LogFn> = {\r\n trace: (m, a) => this.emit('trace', m, a),\r\n debug: (m, a) => this.emit('debug', m, a),\r\n info: (m, a) => this.emit('info', m, a),\r\n warn: (m, a) => this.emit('warn', m, a),\r\n error: (m, a) => this.emit('error', m, a),\r\n fatal: (m, a) => this.emit('fatal', m, a),\r\n };\r\n\r\n get isActive(): boolean {\r\n return this.running !== null;\r\n }\r\n\r\n /** The current session's ID, e.g. to show on a support page. */\r\n get sessionId(): string | undefined {\r\n return this.running?.session.id;\r\n }\r\n\r\n init(options: BrowserOptions): void {\r\n try {\r\n if (this.running) {\r\n console.warn('[Zharp] Zharp.init() was called again — the first call\\'s settings stay in effect.');\r\n return;\r\n }\r\n if (!options || !options.key) {\r\n console.warn('[Zharp] Zharp.init({ key }) needs the app key from the Zharp dashboard. Nothing will be sent.');\r\n return;\r\n }\r\n if (!isBrowser()) return;\r\n this.start(options);\r\n } catch {\r\n // A broken SDK must not take the page down with it.\r\n }\r\n }\r\n\r\n private start(options: BrowserOptions): void {\r\n const endpointUrl = (options.endpoint || DEFAULT_ENDPOINT).replace(/\\/+$/, '');\r\n const endpoint: Endpoint = { url: endpointUrl, key: options.key, fetch: (globalThis as any).fetch };\r\n const service = options.service || 'web';\r\n const session = new Session((options.sessionTimeoutMinutes ?? 30) * 60_000);\r\n // A user set before init(), or remembered by the session from earlier in this tab.\r\n if (this.user) session.update({ user: this.user });\r\n else this.user = session.current.user ?? null;\r\n\r\n const ua = typeof navigator !== 'undefined' ? navigator.userAgent : '';\r\n const platform = parseUserAgent(ua);\r\n const resource = keyValues({\r\n 'service.name': service,\r\n 'service.version': options.release,\r\n 'deployment.environment.name': options.environment,\r\n 'telemetry.sdk.name': 'zharp',\r\n 'telemetry.sdk.language': 'webjs',\r\n 'telemetry.sdk.version': VERSION,\r\n 'browser.name': platform.browserName,\r\n 'browser.version': platform.browserVersion,\r\n 'os.name': platform.osName,\r\n 'os.version': platform.osVersion,\r\n 'user_agent.original': ua || undefined,\r\n });\r\n const scope = { name: '@zharp/browser', version: VERSION };\r\n\r\n const spans = new Exporter<unknown>(endpoint, 'traces', (records) => ({\r\n resourceSpans: [{ resource: { attributes: resource }, scopeSpans: [{ scope, spans: records }] }],\r\n }));\r\n const logs = new Exporter<unknown>(endpoint, 'logs', (records) => ({\r\n resourceLogs: [{ resource: { attributes: resource }, scopeLogs: [{ scope, logRecords: records }] }],\r\n }));\r\n\r\n const replayOptions = options.replay;\r\n const replay =\r\n replayOptions && ((replayOptions.sampleRate ?? 0) > 0 || (replayOptions.onErrorSampleRate ?? 0) > 0)\r\n ? new ReplayController(session, replayOptions, endpoint, service)\r\n : null;\r\n\r\n const tracer = new Tracer({\r\n export: (span) => {\r\n if (span.sampled) spans.add(span.toOtlp(this.contextAttributes()));\r\n },\r\n traceStarted: (traceId) => replay?.linkTrace(traceId),\r\n });\r\n tracer.sampleRate = typeof options.sampleRate === 'number' ? Math.min(1, Math.max(0, options.sampleRate)) : 1;\r\n\r\n const tracing = options.tracing !== false;\r\n const running: Running = { options, endpoint, session, tracer, tracing, spans, logs, replay, teardowns: [] };\r\n this.running = running;\r\n\r\n const ignore = options.ignoreUrls ?? [];\r\n const tracingOrigins = options.tracingOrigins ?? [];\r\n const httpHooks: HttpHooks = {\r\n tracer,\r\n shouldTrace: (url) => {\r\n const full = absolute(url);\r\n return !full.startsWith(endpointUrl) && !matches(full, ignore);\r\n },\r\n shouldPropagate: (url) => sameOrigin(url) || matches(url, tracingOrigins),\r\n baggage: () => this.baggage(),\r\n };\r\n\r\n const t = running.teardowns;\r\n // Logs only: fetch and XHR are left alone (no spans, no headers), and there are no page\r\n // load, navigation or click spans.\r\n if (tracing) t.push(instrumentFetch(httpHooks), instrumentXhr(httpHooks));\r\n t.push(watchErrors((error, mechanism) => this.report(error, false, { 'zharp.mechanism': mechanism })));\r\n t.push(watchActivity(() => session.touch()));\r\n t.push(\r\n watchNavigation((route) => {\r\n session.touch();\r\n if (tracing) tracer.startRoot('navigation', route, { 'url.full': location.href });\r\n }),\r\n );\r\n if (tracing && options.interactions !== false) t.push(watchClicks((label, selector) => tracer.noteClick(label, selector)));\r\n if (options.captureConsole) {\r\n const methods: ConsoleMethod[] = options.captureConsole === true ? ['debug', 'log', 'info', 'warn', 'error'] : options.captureConsole;\r\n t.push(watchConsole(methods, (level, message) => this.emit(level, message, { 'log.source': 'console' })));\r\n }\r\n t.push(\r\n watchHide(() => {\r\n tracer.endAll();\r\n spans.flushOnHide();\r\n logs.flushOnHide();\r\n replay?.flushOnHide();\r\n }),\r\n );\r\n\r\n // Replay first, so it hears about the page load's trace while the recorder downloads.\r\n replay?.start();\r\n if (tracing) this.startPageLoad(tracer);\r\n }\r\n\r\n /** The page load span: from navigation start until the load event, its requests, and a quiet second. */\r\n private startPageLoad(tracer: Tracer): void {\r\n const timeOrigin = typeof performance !== 'undefined' && performance.timeOrigin ? performance.timeOrigin : now();\r\n const root = tracer.startRoot('pageload', currentRoute(), { 'url.full': location.href, 'document.referrer': document.referrer || undefined }, timeOrigin);\r\n const loaded = () => {\r\n root.span.setAttributes(navigationTimings());\r\n root.release();\r\n };\r\n if (document.readyState === 'complete') loaded();\r\n else {\r\n root.hold();\r\n window.addEventListener('load', () => setTimeout(loaded, 0), { once: true });\r\n }\r\n }\r\n\r\n /**\r\n * Who is using the page: `enduser.id` (and `enduser.email`, `enduser.name`) on everything sent\r\n * from now on, and in the `baggage` header so the back end's spans and logs carry it too.\r\n * Call it after login and on every page load while logged in.\r\n */\r\n setUser(user: ZharpUser | null): void {\r\n safely(() => {\r\n this.user = user && user.id !== undefined && user.id !== null && user.id !== '' ? { id: user.id, email: user.email, name: user.name } : null;\r\n this.running?.session.update({ user: this.user });\r\n });\r\n }\r\n\r\n /** Forget the user and start a new session — call it on logout. */\r\n clearUser(): void {\r\n safely(() => {\r\n this.user = null;\r\n this.running?.session.renew(null);\r\n });\r\n }\r\n\r\n /** An attribute on every span and log from now on. `null` removes it. */\r\n setTag(key: string, value: string | number | boolean | null | undefined): void {\r\n if (value === null || value === undefined) delete this.tags[key];\r\n else this.tags[key] = value;\r\n }\r\n\r\n /** Report an error you caught. Sent as handled, and grouped into an issue with its other occurrences. */\r\n captureError(error: unknown, attributes?: Attributes): void {\r\n this.report(error, true, attributes);\r\n }\r\n\r\n /**\r\n * Run `fn` in a span named `name`. Requests and logs from its synchronous part belong to it;\r\n * a promise it returns ends the span when it settles. Errors pass through unchanged.\r\n */\r\n startSpan<T>(name: string, fn: (span: ZharpSpan) => T, attributes?: Attributes): T {\r\n const running = this.running;\r\n let span: Span | undefined;\r\n if (running?.tracing) span = safely(() => running.tracer.startSpan(name, Kind.Internal));\r\n if (!running || !span) return fn(noopSpan);\r\n const s = span;\r\n if (attributes) s.setAttributes(attributes);\r\n const fail = (error: unknown) => safely(() => s.setStatus(Status.Error, asError(error).message).end());\r\n try {\r\n const result = running.tracer.withSpan(s, () => fn(s));\r\n if (result && typeof (result as any).then === 'function') {\r\n return (result as any).then(\r\n (value: unknown) => {\r\n s.end();\r\n return value;\r\n },\r\n (error: unknown) => {\r\n fail(error);\r\n throw error;\r\n },\r\n );\r\n }\r\n s.end();\r\n return result;\r\n } catch (error) {\r\n fail(error);\r\n throw error;\r\n }\r\n }\r\n\r\n /** Send everything waiting now. */\r\n async flush(): Promise<void> {\r\n const running = this.running;\r\n if (!running) return;\r\n await Promise.all([running.spans.flush(), running.logs.flush(), running.replay?.flush()]).catch(() => {});\r\n }\r\n\r\n /** Flush and stop: every patch is undone and nothing more is recorded. */\r\n async close(): Promise<void> {\r\n const running = this.running;\r\n if (!running) return;\r\n running.tracer.endAll();\r\n await this.flush();\r\n await running.replay?.stop().catch(() => {});\r\n for (const undo of running.teardowns) safely(undo);\r\n this.running = null;\r\n }\r\n\r\n // ── internals ─────────────────────────────────────────────────────────\r\n\r\n /** Session, user and tags: on every span and log, as they are when it is sent. */\r\n private contextAttributes(): Record<string, unknown> {\r\n const running = this.running;\r\n const user = this.user;\r\n return {\r\n ...this.tags,\r\n 'session.id': running?.session.id,\r\n 'enduser.id': user ? String(user.id) : undefined,\r\n 'enduser.email': user?.email,\r\n 'enduser.name': user?.name,\r\n };\r\n }\r\n\r\n /** The `baggage` header value: session and user, for the back end to copy onto its spans. */\r\n private baggage(): string {\r\n const parts: string[] = [];\r\n const session = this.running?.session.id;\r\n if (session) parts.push(`session.id=${encodeURIComponent(session)}`);\r\n if (this.user) parts.push(`enduser.id=${encodeURIComponent(String(this.user.id))}`);\r\n return parts.join(',');\r\n }\r\n\r\n private emit(level: Level, message: unknown, attributes?: Attributes, exception?: Record<string, string>): void {\r\n safely(() => {\r\n const running = this.running;\r\n if (!running) return;\r\n const span = running.tracer.activeSpan();\r\n const time = toNanos(now());\r\n const attrs: Record<string, unknown> = { ...this.contextAttributes(), 'url.full': location.href };\r\n for (const key in attributes) {\r\n const value = attributes[key];\r\n // An Error passed with an error log is the reason for it: sent as the exception, with its stack.\r\n if (value instanceof Error && !exception && (level === 'error' || level === 'fatal')) {\r\n exception = exceptionAttributes(value, true);\r\n this.reported.add(value);\r\n } else attrs[key] = value;\r\n }\r\n running.logs.add({\r\n timeUnixNano: time,\r\n observedTimeUnixNano: time,\r\n severityNumber: SEVERITY[level],\r\n severityText: level.toUpperCase(),\r\n body: { stringValue: typeof message === 'string' ? message : message instanceof Error ? message.message : safeString(message) },\r\n attributes: keyValues({ ...attrs, ...exception }),\r\n traceId: span?.traceId,\r\n spanId: span?.spanId,\r\n });\r\n if (exception) running.replay?.onError();\r\n });\r\n }\r\n\r\n private report(value: unknown, handled: boolean, attributes?: Attributes): void {\r\n safely(() => {\r\n if (value && typeof value === 'object') {\r\n if (this.reported.has(value)) return;\r\n this.reported.add(value);\r\n }\r\n const error = asError(value);\r\n const exception = exceptionAttributes(error, handled);\r\n this.emit('error', `${exception['exception.type']}: ${exception['exception.message']}`, attributes, exception);\r\n });\r\n }\r\n}\r\n\r\nconst noopSpan: ZharpSpan = {\r\n traceId: '',\r\n spanId: '',\r\n setAttribute() {\r\n return noopSpan;\r\n },\r\n setAttributes() {\r\n return noopSpan;\r\n },\r\n};\r\n","import { ZharpBrowser } from './client';\r\n\r\nexport { ZharpBrowser } from './client';\r\nexport type { ZharpSpan } from './client';\r\nexport { VERSION } from './version';\r\nexport type { BrowserOptions, ReplayOptions, ReplayEvent, ZharpUser, Attributes } from './types';\r\n\r\n// One instance per page, kept on globalThis: two copies of the package in one bundle (or the\r\n// script tag and a bundle) must not patch fetch twice or keep two sessions.\r\nconst g = globalThis as any;\r\nexport const Zharp: ZharpBrowser = g.__ZHARP_BROWSER__ ?? (g.__ZHARP_BROWSER__ = new ZharpBrowser());\r\nexport default Zharp;\r\n"]}
package/dist/index.mjs ADDED
@@ -0,0 +1,7 @@
1
+ import {i,f,o,d,h,e,g,a,c,b}from'./chunk-X34YPHYT.mjs';var Ee=[["Edge",/Edg(?:e|A|iOS)?\/([\d.]+)/],["Opera",/(?:OPR|Opera)\/([\d.]+)/],["Samsung Internet",/SamsungBrowser\/([\d.]+)/],["Firefox",/(?:Firefox|FxiOS)\/([\d.]+)/],["Chrome",/(?:Chrome|CriOS)\/([\d.]+)/],["Safari",/Version\/([\d.]+).*Safari\//]];function J(n){var r;let e={};for(let[s,i]of Ee){let o=i.exec(n);if(o){e.browserName=s,e.browserVersion=o[1].split(".")[0];break}}let t;return (t=/Windows NT ([\d.]+)/.exec(n))?(e.osName="Windows",e.osVersion=(r={"10.0":"10","6.3":"8.1","6.2":"8","6.1":"7"}[t[1]])!=null?r:t[1]):(t=/(?:iPhone|iPad|iPod).*? OS ([\d_]+)/.exec(n))?(e.osName="iOS",e.osVersion=t[1].replace(/_/g,".")):(t=/Android ([\d.]+)/.exec(n))?(e.osName="Android",e.osVersion=t[1]):(t=/Mac OS X ([\d_.]+)/.exec(n))?(e.osName="macOS",e.osVersion=t[1].replace(/_/g,".")):/CrOS/.test(n)?e.osName="ChromeOS":/Linux/.test(n)&&(e.osName="Linux"),e}var ke="zharp.debug_ids",N=new Map,Q=new Set;function xe(){let n=typeof globalThis!="undefined"?globalThis:void 0,e=n&&n.__zharpDebugIds;return e&&typeof e=="object"?e:void 0}function te(n){let e=n.trim();if(!e)return;let t=/^at (?:async )?(?:.*? \()?(.+?):\d+:\d+\)?$/.exec(e);if(t)return ee(t[1]);if(!e.startsWith("at "))return t=/^(?:[^@]*@)?(.+?):\d+:\d+$/.exec(e),t?ee(t[1]):void 0}function ee(n){if(!(!n||n.includes("eval at ")||n==="<anonymous>"||n==="native"))return n}function _e(n){let e=[];for(let t of n.split(`
2
+ `)){let r=te(t);r&&!e.includes(r)&&e.push(r);}return e}function Te(){let n=xe();if(n)for(let e in n){if(Q.has(e))continue;Q.add(e);let t=n[e];if(typeof t=="string")for(let r of e.split(`
3
+ `)){let s=te(r);if(s){N.set(s,t);break}}}}function Ae(n){if(n)try{if(Te(),N.size===0)return;let e;for(let t of _e(n)){let r=N.get(t);r&&((e!=null?e:e={})[t]=r);}return e}catch(e){return}}function re(n){let e=Ae(n);return e?{[ke]:JSON.stringify(e)}:{}}function P(n){if(n instanceof Error)return n;if(n&&typeof n=="object"&&typeof n.message=="string"){let e=new Error(n.message);return e.name=typeof n.name=="string"?n.name:"Error",typeof n.stack=="string"&&(e.stack=n.stack),e}return new Error(typeof n=="string"?n:`Non-Error thrown: ${g(n)}`)}function C(n,e){var o;let t=(n.name&&n.name!=="Error"?n.name:(o=n.constructor)==null?void 0:o.name)||"Error",r=n.message||"",s=`${t}: ${r}`,i=typeof n.stack=="string"?n.stack:"";return i.startsWith(n.name||t)||(i=i?`${s}
4
+ ${i}`:s),{"exception.type":t,"exception.message":r,"exception.stacktrace":i,"zharp.handled":e?"true":"false",...re(i)}}function ne(n){let e=r=>h(()=>{if(r.error!==void 0&&r.error!==null)n(r.error,"onerror");else if(r.message){let s=new Error(r.message);s.stack=`Error: ${r.message}
5
+ at ${r.filename||"<anonymous>"}:${r.lineno||0}:${r.colno||0}`,n(s,"onerror");}}),t=r=>h(()=>n(r.reason,"onunhandledrejection"));return window.addEventListener("error",e),window.addEventListener("unhandledrejection",t),()=>{window.removeEventListener("error",e),window.removeEventListener("unhandledrejection",t);}}var Ie={debug:"debug",log:"info",info:"info",warn:"warn",error:"error"};function se(n,e){let t={},r=false;for(let s of n){let i=console[s];if(typeof i!="function"||i.__zharp)continue;t[s]=i;let o=function(...a){i.apply(this!=null?this:console,a),!r&&(r=true,h(()=>{let c=a.map(l=>l instanceof Error?l.stack||String(l):g(l)).join(" ");c.startsWith("[Zharp]")||e(Ie[s],c);}),r=false);};o.__zharp=true,console[s]=o;}return ()=>Object.assign(console,t)}var $=class{constructor(e,t,r,s,i=d()){this.tracer=e;this.name=t;this.kind=r;this.startTime=i;this.spanId=c();this.attributes={};this.status={code:0};this.endTime=0;this.traceId=s?s.traceId:b(),this.parentSpanId=s==null?void 0:s.spanId,this.sampled=s?s.sampled:Math.random()<e.sampleRate;}get ended(){return this.endTime!==0}setAttribute(e,t){return this.attributes[e]=t,this}setAttributes(e){return Object.assign(this.attributes,e),this}setStatus(e,t){return this.status={code:e,message:t},this}get traceparent(){return `00-${this.traceId}-${this.spanId}-${this.sampled?"01":"00"}`}end(e=d()){this.endTime||(this.endTime=Math.max(e,this.startTime),this.tracer.finished(this));}toOtlp(e$1){return {traceId:this.traceId,spanId:this.spanId,parentSpanId:this.parentSpanId,name:this.name,kind:this.kind,startTimeUnixNano:e(this.startTime),endTimeUnixNano:e(this.endTime),attributes:f({...e$1,...this.attributes}),status:this.status.message?this.status:{code:this.status.code}}}},x=class{constructor(e,t,r,s){this.span=e;this.idleMs=t;this.onEnd=s;this.inflight=0;this.idleTimer=null;this.held=false;this.maxTimer=setTimeout(()=>this.finish(),Math.max(0,e.startTime+r-d())),this.arm();}begin(){this.inflight++,this.disarm();}done(){this.inflight=Math.max(0,this.inflight-1),this.arm();}hold(){this.held=true,this.disarm();}release(){this.held=false,this.arm();}finish(){this.span.ended||(this.disarm(),clearTimeout(this.maxTimer),this.span.end(),this.onEnd(this));}arm(){this.disarm(),this.inflight===0&&!this.held&&(this.idleTimer=setTimeout(()=>this.finish(),this.idleMs));}disarm(){this.idleTimer&&clearTimeout(this.idleTimer),this.idleTimer=null;}},Oe=1e3,Le=500,ie=3e4,Ne=1e3,_=class{constructor(e){this.hooks=e;this.sampleRate=1;this.root=null;this.interaction=null;this.click=null;this.stack=[];}finished(e){this.hooks.export(e);}activeSpan(){return this.stack.length?this.stack[this.stack.length-1]:this.interaction&&!this.interaction.span.ended?this.interaction.span:this.root&&!this.root.span.ended?this.root.span:null}startSpan(e,t=1,r=this.activeSpan(),s){let i=new $(this,e,t,r,s);return r||this.hooks.traceStarted(i.traceId),i}withSpan(e,t){this.stack.push(e);try{return t()}finally{let r=this.stack.lastIndexOf(e);r>=0&&this.stack.splice(r,1);}}startRoot(e,t,r,s){var o,a;(o=this.interaction)==null||o.finish(),(a=this.root)==null||a.finish();let i=this.startSpan(`${e} ${t}`,1,null,s);return i.setAttributes({"zharp.span.type":e,...r}),this.root=new x(i,Oe,ie,c=>{this.root===c&&(this.root=null);}),this.root}noteClick(e,t){this.click={label:e,target:t,time:d()};}requestStarting(){var r;let e=this.click;if(e&&d()-e.time<Ne&&!this.stack.length){this.click=null,(r=this.interaction)==null||r.finish();let s=this.startSpan(`click \u201C${e.label}\u201D`,1,null,e.time);s.setAttributes({"zharp.span.type":"interaction","zharp.interaction.target":e.target}),this.interaction=new x(s,Le,ie,i=>{this.interaction===i&&(this.interaction=null);});}let t=[this.interaction,this.root].filter(s=>!!s&&!s.span.ended);return {parent:this.activeSpan(),waiters:t}}endAll(){var e,t;(e=this.interaction)==null||e.finish(),(t=this.root)==null||t.finish();}};function oe(n,e,t){let{parent:r,waiters:s}=n.tracer.requestStarting(),i=H(t),o=n.tracer.startSpan(`${e} ${Pe(i)}`,3,r);o.setAttributes({"http.request.method":e,"url.full":i,"server.address":Ce(i)});for(let a of s)a.begin();return {span:o,done(a,c){a&&o.setAttribute("http.response.status_code",a),c!==void 0||!a?(o.setAttribute("error.type",c instanceof Error?c.name:"network"),o.setStatus(2,c instanceof Error?c.message:"Request failed")):a>=400&&(o.setAttribute("error.type",String(a)),o.setStatus(2,`HTTP ${a}`)),o.end();for(let l of s)l.done();}}}function ae(n,e){return n?`${n},${e}`:e}function ce(n){let e=globalThis,t=e.fetch;if(typeof t!="function"||t.__zharp)return ()=>{};let r=function(s,i){var h$1,f,b;let o=typeof s=="string"?s:s instanceof URL?s.href:s==null?void 0:s.url;if(!o||!n.shouldTrace(o))return t.call(this,s,i);let a=String((f=(h$1=i==null?void 0:i.method)!=null?h$1:s==null?void 0:s.method)!=null?f:"GET").toUpperCase(),c=h(()=>oe(n,a,o));if(!c)return t.call(this,s,i);let l=i;return n.shouldPropagate(o)&&(l=(b=h(()=>{var y;let u=new Headers((y=i==null?void 0:i.headers)!=null?y:typeof Request!="undefined"&&s instanceof Request?s.headers:void 0);u.has("traceparent")||u.set("traceparent",c.span.traceparent);let g=n.baggage();return g&&u.set("baggage",ae(u.get("baggage"),g)),{...i,headers:u}}))!=null?b:i),t.call(this,s,l).then(u=>(h(()=>c.done(u.status)),u),u=>{throw h(()=>c.done(0,u)),u})};return r.__zharp=true,e.fetch=r,()=>{e.fetch===r&&(e.fetch=t);}}function de(n){if(typeof XMLHttpRequest=="undefined")return ()=>{};let e=XMLHttpRequest.prototype;if(e.__zharp)return ()=>{};let{open:t,send:r,setRequestHeader:s}=e;return e.open=function(i,o,...a){return this.__zharp={method:String(i||"GET").toUpperCase(),url:String(o),traceparent:false,baggage:null},t.call(this,i,o,...a)},e.setRequestHeader=function(i,o){let a=this.__zharp,c=String(i).toLowerCase();if(a&&c==="traceparent"&&(a.traceparent=true),a&&c==="baggage"&&!a.own){a.baggage=o;return}return s.call(this,i,o)},e.send=function(i){let o=this.__zharp;if(!o||!n.shouldTrace(o.url))return r.call(this,i);let a=h(()=>oe(n,o.method,o.url));return a?(h(()=>{if(n.shouldPropagate(o.url)){o.own=true,o.traceparent||s.call(this,"traceparent",a.span.traceparent);let c=n.baggage();(c||o.baggage)&&s.call(this,"baggage",c?ae(o.baggage,c):o.baggage);}else o.baggage&&s.call(this,"baggage",o.baggage);}),this.addEventListener("loadend",()=>h(()=>a.done(this.status)))):o.baggage&&h(()=>s.call(this,"baggage",o.baggage)),r.call(this,i)},e.__zharp=true,()=>{Object.assign(e,{open:t,send:r,setRequestHeader:s}),delete e.__zharp;}}var M=()=>typeof location!="undefined"?location.href:"http://localhost/";function H(n){var e;return (e=h(()=>new URL(n,M()).href))!=null?e:n}function Pe(n){var e;return (e=h(()=>new URL(n).pathname))!=null?e:n.split("?")[0]}function Ce(n){var e;return (e=h(()=>new URL(n).hostname))!=null?e:""}function U(n,e){let t=h(()=>new URL(n,M()));return t?e.some(r=>r instanceof RegExp?r.test(t.href):r?r.includes("://")?t.href.startsWith(r):t.host===r||t.hostname===r:false):false}function le(n){var e;return (e=h(()=>typeof location!="undefined"&&new URL(n,M()).origin===location.origin))!=null?e:false}function T(){let n=location.hash.startsWith("#/")?location.hash:"";return location.pathname+n}function ue(n){let e=T(),t=()=>h(()=>{let i=T();i!==e&&(e=i,n(i));}),r=window.history,s={};for(let i of ["pushState","replaceState"]){let o=r[i];if(typeof o!="function"||o.__zharp)continue;s[i]=o;let a=function(...c){let l=o.apply(this,c);return t(),l};a.__zharp=true,r[i]=a;}return window.addEventListener("popstate",t),window.addEventListener("hashchange",t),()=>{Object.assign(r,s),window.removeEventListener("popstate",t),window.removeEventListener("hashchange",t);}}var $e="button,a,[role=button],[role=link],[role=menuitem],[role=tab],[role=option],[role=checkbox],[role=switch],input[type=button],input[type=submit],input[type=checkbox],input[type=radio],summary,label,select,[data-zharp-name]";function Me(n){var c;let e=n instanceof Element?n:null;if(!e)return null;let t=(c=e.closest($e))!=null?c:e,r=l=>{var h;return (h=t.getAttribute(l))==null?void 0:h.trim()},s=t.tagName.toLowerCase(),i=r("data-zharp-name")||r("aria-label")||(s==="input"?t.value||r("name"):"")||(t.textContent||"").replace(/\s+/g," ").trim()||r("title")||r("alt")||s;i.length>40&&(i=`${i.slice(0,39)}\u2026`);let o=t.id?`#${t.id}`:"",a=typeof t.className=="string"&&t.className.trim()?`.${t.className.trim().split(/\s+/).slice(0,2).join(".")}`:"";return {label:i,selector:`${s}${o}${a}`}}function pe(n){let e=t=>h(()=>{let r=Me(t.target);r&&n(r.label,r.selector);});return document.addEventListener("click",e,true),()=>document.removeEventListener("click",e,true)}function he(n){let e=["click","keydown","scroll","touchstart","pointerdown"],t=0,r=()=>{let s=Date.now();s-t<1e3||(t=s,h(n));};for(let s of e)document.addEventListener(s,r,{capture:true,passive:true});return ()=>{for(let s of e)document.removeEventListener(s,r,{capture:true});}}function fe(n){let e=()=>{document.visibilityState==="hidden"&&h(n);},t=()=>h(n);return document.addEventListener("visibilitychange",e),window.addEventListener("pagehide",t),()=>{document.removeEventListener("visibilitychange",e),window.removeEventListener("pagehide",t);}}function ge(){let n=h(()=>performance.getEntriesByType("navigation")[0]);if(!n)return {};let e={},t=(r,s)=>{s>0&&(e[r]=Math.round(s));};return t("browser.timing.ttfb_ms",n.responseStart),t("browser.timing.dom_content_loaded_ms",n.domContentLoadedEventEnd),t("browser.timing.load_ms",n.loadEventEnd),e}function He(n){return import('./recorder-HNDTSUTD.mjs')}var A=class{constructor(e,t,r,s){this.session=e;this.options=t;this.endpoint=r;this.service=s;this.recorder=null;this.loading=false;this.early={traces:[],error:false};e.onRenew(()=>{let i=this.decide();this.recorder?this.recorder.renew(i):i!=="off"&&this.load(i);});}start(){let e=this.decide();e!=="off"&&this.load(e);}linkTrace(e){this.recorder?this.recorder.linkTrace(e):this.loading&&this.early.traces.length<50&&this.early.traces.push(e);}onError(){this.recorder?this.recorder.onError():this.loading&&(this.early.error=true);}flush(){return this.recorder?this.recorder.flush():Promise.resolve()}flushOnHide(){var e;(e=this.recorder)==null||e.flushOnHide();}stop(){let e=this.recorder;return this.recorder=null,e?e.stop():Promise.resolve()}decide(){let e=this.session.current;if(e.replay)return e.replay;let t=s=>typeof s=="number"?Math.min(1,Math.max(0,s)):0,r=Math.random()<t(this.options.sampleRate)?"session":Math.random()<t(this.options.onErrorSampleRate)?"buffer":"off";return this.session.update({replay:r}),r}load(e){if(this.loading)return;this.loading=true;let t={endpoint:this.endpoint,service:this.service,options:this.options,session:()=>this.session.current,saveSequence:(r,s)=>{this.session.current.id===r&&this.session.update({seq:s});},saveMode:(r,s)=>{this.session.current.id===r&&this.session.update({replay:s});}};He(this.options).then(r=>{this.recorder=r.createRecorder(t,e);for(let s of this.early.traces)this.recorder.linkTrace(s);this.early.error&&this.recorder.onError();}).catch(()=>{}).finally(()=>{this.loading=false,this.early={traces:[],error:false};});}};var me="zharp.session",Ue=5e3;function ye(n=null){let e=Date.now(),t=a(16);return {id:`${t.slice(0,8)}-${t.slice(8,12)}-4${t.slice(13,16)}-${(parseInt(t[16],16)&3|8).toString(16)}${t.slice(17,20)}-${t.slice(20)}`,started:e,lastActive:e,user:n}}var I=class{constructor(e){this.timeoutMs=e;this.lastWrite=0;this.listeners=[];let t=this.read();this.state=t&&Date.now()-t.lastActive<e?t:ye(t==null?void 0:t.user),this.write();}get current(){return Date.now()-this.state.lastActive>=this.timeoutMs&&this.renew(),this.state}get id(){return this.current.id}touch(){let e=this.current;e.lastActive=Date.now(),e.lastActive-this.lastWrite>Ue&&this.write();}renew(e){this.state=ye(e===void 0?this.state.user:e),this.write();for(let t of this.listeners)t(this.state);}update(e){Object.assign(this.state,e),this.write();}onRenew(e){this.listeners.push(e);}read(){try{let e=sessionStorage.getItem(me),t=e?JSON.parse(e):null;return t&&typeof t.id=="string"&&typeof t.lastActive=="number"?t:null}catch(e){return null}}write(){this.lastWrite=Date.now();try{sessionStorage.setItem(me,JSON.stringify(this.state));}catch(e){}}};var O="0.1.0";var Ze="https://api.zharp.io/api/v1/otlp",ze={trace:1,debug:5,info:9,warn:13,error:17,fatal:21},k=class{constructor(){this.running=null;this.user=null;this.tags={};this.reported=new WeakSet;this.log={trace:(e,t)=>this.emit("trace",e,t),debug:(e,t)=>this.emit("debug",e,t),info:(e,t)=>this.emit("info",e,t),warn:(e,t)=>this.emit("warn",e,t),error:(e,t)=>this.emit("error",e,t),fatal:(e,t)=>this.emit("fatal",e,t)};}get isActive(){return this.running!==null}get sessionId(){var e;return (e=this.running)==null?void 0:e.session.id}init(e){try{if(this.running){console.warn("[Zharp] Zharp.init() was called again \u2014 the first call's settings stay in effect.");return}if(!e||!e.key){console.warn("[Zharp] Zharp.init({ key }) needs the app key from the Zharp dashboard. Nothing will be sent.");return}if(!i())return;this.start(e);}catch(t){}}start(e){var V,q,W,B,D,F;let t=(e.endpoint||Ze).replace(/\/+$/,""),r={url:t,key:e.key,fetch:globalThis.fetch},s=e.service||"web",i=new I(((V=e.sessionTimeoutMinutes)!=null?V:30)*6e4);this.user?i.update({user:this.user}):this.user=(q=i.current.user)!=null?q:null;let o$1=typeof navigator!="undefined"?navigator.userAgent:"",a=J(o$1),c=f({"service.name":s,"service.version":e.release,"deployment.environment.name":e.environment,"telemetry.sdk.name":"zharp","telemetry.sdk.language":"webjs","telemetry.sdk.version":O,"browser.name":a.browserName,"browser.version":a.browserVersion,"os.name":a.osName,"os.version":a.osVersion,"user_agent.original":o$1||void 0}),l={name:"@zharp/browser",version:O},h=new o(r,"traces",p=>({resourceSpans:[{resource:{attributes:c},scopeSpans:[{scope:l,spans:p}]}]})),f$1=new o(r,"logs",p=>({resourceLogs:[{resource:{attributes:c},scopeLogs:[{scope:l,logRecords:p}]}]})),b=e.replay,u=b&&(((W=b.sampleRate)!=null?W:0)>0||((B=b.onErrorSampleRate)!=null?B:0)>0)?new A(i,b,r,s):null,g=new _({export:p=>{p.sampled&&h.add(p.toOtlp(this.contextAttributes()));},traceStarted:p=>u==null?void 0:u.linkTrace(p)});g.sampleRate=typeof e.sampleRate=="number"?Math.min(1,Math.max(0,e.sampleRate)):1;let y=e.tracing!==false,z={options:e,endpoint:r,session:i,tracer:g,tracing:y,spans:h,logs:f$1,replay:u,teardowns:[]};this.running=z;let ve=(D=e.ignoreUrls)!=null?D:[],Se=(F=e.tracingOrigins)!=null?F:[],j={tracer:g,shouldTrace:p=>{let w=H(p);return !w.startsWith(t)&&!U(w,ve)},shouldPropagate:p=>le(p)||U(p,Se),baggage:()=>this.baggage()},v=z.teardowns;if(y&&v.push(ce(j),de(j)),v.push(ne((p,w)=>this.report(p,false,{"zharp.mechanism":w}))),v.push(he(()=>i.touch())),v.push(ue(p=>{i.touch(),y&&g.startRoot("navigation",p,{"url.full":location.href});})),y&&e.interactions!==false&&v.push(pe((p,w)=>g.noteClick(p,w))),e.captureConsole){let p=e.captureConsole===true?["debug","log","info","warn","error"]:e.captureConsole;v.push(se(p,(w,Re)=>this.emit(w,Re,{"log.source":"console"})));}v.push(fe(()=>{g.endAll(),h.flushOnHide(),f$1.flushOnHide(),u==null||u.flushOnHide();})),u==null||u.start(),y&&this.startPageLoad(g);}startPageLoad(e){let t=typeof performance!="undefined"&&performance.timeOrigin?performance.timeOrigin:d(),r=e.startRoot("pageload",T(),{"url.full":location.href,"document.referrer":document.referrer||void 0},t),s=()=>{r.span.setAttributes(ge()),r.release();};document.readyState==="complete"?s():(r.hold(),window.addEventListener("load",()=>setTimeout(s,0),{once:true}));}setUser(e){h(()=>{var t;this.user=e&&e.id!==void 0&&e.id!==null&&e.id!==""?{id:e.id,email:e.email,name:e.name}:null,(t=this.running)==null||t.session.update({user:this.user});});}clearUser(){h(()=>{var e;this.user=null,(e=this.running)==null||e.session.renew(null);});}setTag(e,t){t==null?delete this.tags[e]:this.tags[e]=t;}captureError(e,t){this.report(e,true,t);}startSpan(e,t,r){let s=this.running,i;if(s!=null&&s.tracing&&(i=h(()=>s.tracer.startSpan(e,1))),!s||!i)return t(Z);let o=i;r&&o.setAttributes(r);let a=c=>h(()=>o.setStatus(2,P(c).message).end());try{let c=s.tracer.withSpan(o,()=>t(o));return c&&typeof c.then=="function"?c.then(l=>(o.end(),l),l=>{throw a(l),l}):(o.end(),c)}catch(c){throw a(c),c}}async flush(){var t;let e=this.running;e&&await Promise.all([e.spans.flush(),e.logs.flush(),(t=e.replay)==null?void 0:t.flush()]).catch(()=>{});}async close(){var t;let e=this.running;if(e){e.tracer.endAll(),await this.flush(),await((t=e.replay)==null?void 0:t.stop().catch(()=>{}));for(let r of e.teardowns)h(r);this.running=null;}}contextAttributes(){let e=this.running,t=this.user;return {...this.tags,"session.id":e==null?void 0:e.session.id,"enduser.id":t?String(t.id):void 0,"enduser.email":t==null?void 0:t.email,"enduser.name":t==null?void 0:t.name}}baggage(){var r;let e=[],t=(r=this.running)==null?void 0:r.session.id;return t&&e.push(`session.id=${encodeURIComponent(t)}`),this.user&&e.push(`enduser.id=${encodeURIComponent(String(this.user.id))}`),e.join(",")}emit(e$1,t,r,s){h(()=>{var l;let i=this.running;if(!i)return;let o=i.tracer.activeSpan(),a=e(d()),c={...this.contextAttributes(),"url.full":location.href};for(let h in r){let f=r[h];f instanceof Error&&!s&&(e$1==="error"||e$1==="fatal")?(s=C(f,true),this.reported.add(f)):c[h]=f;}i.logs.add({timeUnixNano:a,observedTimeUnixNano:a,severityNumber:ze[e$1],severityText:e$1.toUpperCase(),body:{stringValue:typeof t=="string"?t:t instanceof Error?t.message:g(t)},attributes:f({...c,...s}),traceId:o==null?void 0:o.traceId,spanId:o==null?void 0:o.spanId}),s&&((l=i.replay)==null||l.onError());});}report(e,t,r){h(()=>{if(e&&typeof e=="object"){if(this.reported.has(e))return;this.reported.add(e);}let s=P(e),i=C(s,t);this.emit("error",`${i["exception.type"]}: ${i["exception.message"]}`,r,i);});}},Z={traceId:"",spanId:"",setAttribute(){return Z},setAttributes(){return Z}};var we=globalThis,be,je=(be=we.__ZHARP_BROWSER__)!=null?be:we.__ZHARP_BROWSER__=new k,yt=je;
6
+ export{O as VERSION,je as Zharp,k as ZharpBrowser,yt as default};//# sourceMappingURL=index.mjs.map
7
+ //# sourceMappingURL=index.mjs.map