@ihyeon/browser-error-log 0.1.17 → 0.1.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.ko.md CHANGED
@@ -94,6 +94,22 @@ const errorLog = init({
94
94
 
95
95
  초기화 이후부터 수동 기록과 같은 최대 20개·12,000바이트 버퍼를 공유합니다. `clearBreadcrumbs()`로 이후 오류의 기록을 비우면 다음 이동부터 다시 기록합니다. 버퍼는 현재 문서의 메모리에 있으며 전체 페이지 로드 간에는 이어지지 않습니다. History의 state와 title 인자는 작업 기록에 복사하지 않습니다. `sanitizeUrl`·`beforeSend` 제어를 유지하며 `destroy()`는 해당 클라이언트의 계측을 해제합니다. 호스트가 History 메서드를 잠그거나 교체하면 이동을 기록하지 못할 수 있습니다.
96
96
 
97
+ ## 네트워크 요청 자동 기록
98
+
99
+ ```ts
100
+ const errorLog = init({
101
+ project: 'my-web',
102
+ endpoint: '/api/events',
103
+ captureNetworkBreadcrumbs: true,
104
+ });
105
+ ```
106
+
107
+ 선택 옵션으로 완료된 fetch·XHR 응답(2xx·4xx·5xx 포함)과 실제 전송 실패를 기존 제한된 작업 기록에 붙입니다. 응답은 분류 `http`, 메시지 `HTTP response`, 단일 값 데이터 `data.method`, `data.url`, `data.durationMs`, `data.status`로 기록합니다. 전송 실패는 분류 `network`, 메시지 `Network failure`이며 상태 코드를 생략합니다. 브라우저가 opaque 응답에 상태 `0`을 반환하면 뷰어는 상태를 확인할 수 없다고 표시합니다. URL에는 기존 필터를 적용하고 최대 200자로 제한합니다. 본문·헤더·실패 메시지는 기록에 복사하지 않으며, 의도적인 취소와 수집기 요청도 제외합니다.
108
+
109
+ 요청은 완료 순서로 기록하고 진행 중인 요청은 아직 오류의 복사본에 포함하지 않습니다. 요청 기록만으로 별도 이벤트를 보내거나 오류 통계를 늘리지 않습니다. 독립적인 오류 이벤트는 기존 `captureNetwork`와 `shouldCaptureHttp`가 제어합니다. 요청 기록만 원하면 `captureNetwork: false`를 함께 지정하세요. 상태 선택 콜백이 false를 반환해도 요청 기록은 남으므로 기록 필터링에는 `beforeSend`를 사용합니다. 오류 수집이 켜진 상태에서 선택 콜백이 예외를 던지면 해당 요청의 보고를 제외합니다. `clearBreadcrumbs()`는 이후 수집에 사용할 공통 버퍼(최대 20개·12,000바이트)를 비웁니다.
110
+
111
+ 사용자 지정 transport에는 제외할 수집기의 `endpoint`를 제공해야 합니다. 없으면 두 자동 네트워크 경로를 모두 끕니다. 기존 breadcrumb 계약을 사용하므로 작업 기록을 지원하는 0.1.16 이상의 수집기·뷰어와 함께 사용할 수 있습니다.
112
+
97
113
  ## 수집 제어
98
114
 
99
115
  ```ts
@@ -126,7 +142,23 @@ currentAppSection = 'account'; // 이후 이벤트에는 현재 값을 사용
126
142
 
127
143
  기본 HTTP 수집은 5xx와 네트워크 실패를 포함하고 의도적인 취소와 수집기 endpoint를 제외합니다. SDK는 URL 쿼리·해시·자격 정보와 흔한 이메일/토큰 패턴을 제거합니다. 요청/응답 본문, 쿠키, DOM, 폼 입력, 세션 녹화는 수집하지 않습니다. 오류 메시지, URL 경로, 스택, 사용자 지정 context에는 민감정보가 남을 수 있으므로 앱별 필터를 설정하세요. `beforeSend`나 `sanitizeUrl`이 실패하면 이벤트를 버립니다.
128
144
 
129
- 사용자 지정 `transport(batch, { signal })`에서는 요청에 `signal`을 전달하고 전송 실패 시 reject하세요. 자동 네트워크 수집을 원하면 자기 전송을 제외할 `endpoint`를 지정해야 합니다. 없으면 사용자 지정 transport에서 네트워크 수집을 끕니다. 기본 전송은 credentials를 보내지 않습니다.
145
+ 사용자 지정 `transport(batch, { signal })`에서는 요청에 `signal`을 전달하고 전송 실패 시 reject하세요. 자동 네트워크 오류 수집이나 요청 기록을 원하면 자기 전송을 제외할 `endpoint`를 지정해야 합니다. 없으면 사용자 지정 transport에서 두 경로를 모두 끕니다. 기본 전송은 credentials를 보내지 않습니다.
146
+
147
+ ## 오류 폭주 제한
148
+
149
+ ```ts
150
+ const errorLog = init({
151
+ project: 'my-web',
152
+ endpoint: '/api/events',
153
+ maxEventsPerMinute: 60,
154
+ });
155
+ ```
156
+
157
+ `maxEventsPerMinute`는 클라이언트별로 직전 60초 동안 큐에 새로 담는 이벤트 수를 제한하는 선택 옵션입니다. 기본값은 제한 없음입니다. 유한한 값은 소수점을 내리고 1~1,000 범위로 조정하며, 생략하거나 유한하지 않은 값을 지정하면 제한을 끕니다. 수동·React 수집, 전역 오류, Promise, console, 선택한 HTTP·네트워크 실패가 같은 한도를 공유합니다. 초과 이벤트는 나중에 보내도록 보관하지 않고 즉시 제외하며 `getStats().dropped`에 반영합니다. 각 이벤트를 큐에 담은 지 60초가 지나면 그만큼 다시 수집할 수 있습니다.
158
+
159
+ 큐를 비우는 flush로 한도가 초기화되지 않습니다. 재시도와 beacon 전송은 이미 담긴 이벤트를 사용하므로 추가 한도를 쓰지 않고, 작업 기록도 한도를 쓰지 않습니다. 같은 Error 객체의 중복 수집과 `beforeSend`가 제외한 이벤트는 한도를 쓰지 않습니다. 한도가 가득 차면 초과 이벤트의 `beforeSend` 호출을 생략합니다. 큐에 담긴 이벤트가 나중에 큐에서 밀려나거나 전송에 실패해도 사용한 한도는 유지합니다.
160
+
161
+ 한도는 현재 문서의 해당 클라이언트에 속하며 새 클라이언트나 전체 페이지 로드에서는 새로 시작합니다. 큐 진입 건수를 제한하므로 HTTP 요청 수·바이트·서버 전체 트래픽이나 이벤트 생성 작업량의 상한을 뜻하지는 않습니다. 수집기에는 별도의 서버 측 제한을 적용하세요.
130
162
 
131
163
  ## 전달 제한
132
164
 
package/README.md CHANGED
@@ -94,6 +94,22 @@ This opt-in setting records current-window, same-document navigation through `hi
94
94
 
95
95
  Capture starts after initialization and shares the same 20-step/12,000-byte trail as manual steps. `clearBreadcrumbs()` starts a fresh trail for future errors; recording resumes on the next navigation. The trail stays in memory for this document and does not carry across a full page load. History state and title arguments are not copied into breadcrumbs. `sanitizeUrl` and `beforeSend` keep their existing controls, and `destroy()` removes this client's instrumentation. Host-locked or replaced History methods can prevent navigation capture.
96
96
 
97
+ ## Automatically record network activity
98
+
99
+ ```ts
100
+ const errorLog = init({
101
+ project: 'my-web',
102
+ endpoint: '/api/events',
103
+ captureNetworkBreadcrumbs: true,
104
+ });
105
+ ```
106
+
107
+ This opt-in setting records completed fetch/XHR responses, including 2xx/4xx/5xx, and real transport failures in the same bounded trail. Response entries use category `http`, message `HTTP response`, and scalar `data.method`, `data.url`, `data.durationMs`, and `data.status`. Transport failures use category `network`, message `Network failure`, and omit status. A browser may report status `0` for an opaque response; the viewer shows unavailable status accordingly. URLs use the existing filters and are limited to 200 characters. Bodies, headers, and failure messages are not copied into these entries; intentional aborts and collector requests are excluded.
108
+
109
+ Requests are recorded when they finish, in completion order; in-flight requests are not yet part of an error's snapshot. Recording a request does not send another event or increase error counters. `captureNetwork` and `shouldCaptureHttp` continue to control standalone error events: set `captureNetwork: false` if you want network context without automatic HTTP/network error events. A false status predicate does not remove request breadcrumbs; filter those with `beforeSend`. A throwing predicate still drops that request's reporting when standalone capture is enabled. `clearBreadcrumbs()` resets the shared 20-step/12,000-byte trail for future captures.
110
+
111
+ With a custom transport, supply its collector `endpoint` for exclusion; without it, both automatic network channels are disabled. These entries use the existing breadcrumb contract and work with collectors/viewers supporting breadcrumbs since 0.1.16.
112
+
97
113
  ## Collection controls
98
114
 
99
115
  ```ts
@@ -126,7 +142,23 @@ Set `captureConsole: true` to capture `console.error` calls. The combined messag
126
142
 
127
143
  By default, HTTP capture records 5xx responses and network failures, excludes intentional aborts, and excludes the collector endpoint. The SDK strips URL queries, fragments, and credentials and masks common email/token patterns. It does not collect request/response bodies, cookies, DOM, form inputs, or session recordings. Error text, URL paths, stacks, and custom context may still contain sensitive data; set application-specific filters. A failing `beforeSend` or `sanitizeUrl` drops the event.
128
144
 
129
- For a custom `transport(batch, { signal })`, pass `signal` to your request and reject on delivery failure. Include `endpoint` for collector exclusion if you want automatic network capture; otherwise network capture is disabled for a custom transport. The default transport omits credentials.
145
+ For a custom `transport(batch, { signal })`, pass `signal` to your request and reject on delivery failure. Include `endpoint` for collector exclusion when using automatic network error capture or network breadcrumbs; otherwise both are disabled for a custom transport. The default transport omits credentials.
146
+
147
+ ## Limit error bursts
148
+
149
+ ```ts
150
+ const errorLog = init({
151
+ project: 'my-web',
152
+ endpoint: '/api/events',
153
+ maxEventsPerMinute: 60,
154
+ });
155
+ ```
156
+
157
+ `maxEventsPerMinute` optionally caps new events admitted to each client's queue over the preceding 60 seconds. It is disabled by default. Finite values are rounded down and clamped to 1–1,000; omitted or non-finite values disable the limit. All error types share the same budget, including manual and React captures, global errors, promises, console, and selected HTTP/network failures. Excess events are discarded immediately and increase `getStats().dropped`; they are not delayed for later delivery. Capacity returns as each admitted event reaches 60 seconds of age.
158
+
159
+ Flushing an empty queue does not reset the budget. Retries and beacon delivery reuse admitted events without consuming more capacity; breadcrumbs do not consume it. Duplicate Error objects and events filtered by `beforeSend` do not consume capacity. Once the budget is full, `beforeSend` is skipped for excess events. Admitted events still consume capacity if they are later evicted from the queue or fail delivery.
160
+
161
+ The budget belongs to this client in the current document; a new client or full page load starts a new one. It limits queue admission, not HTTP request counts, bytes, server-wide traffic, or the work done to construct an event. Use independent server-side limits for your collector.
130
162
 
131
163
  ## Delivery limits
132
164
 
package/dist/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";var N=Object.defineProperty;var W=Object.getOwnPropertyDescriptor;var $=Object.getOwnPropertyNames;var J=Object.prototype.hasOwnProperty;var Y=(r,e,t)=>e in r?N(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t;var Q=(r,e)=>{for(var t in e)N(r,t,{get:e[t],enumerable:!0})},G=(r,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of $(e))!J.call(r,i)&&i!==t&&N(r,i,{get:()=>e[i],enumerable:!(n=W(e,i))||n.enumerable});return r};var Z=r=>G(N({},"__esModule",{value:!0}),r);var h=(r,e,t)=>Y(r,typeof e!="symbol"?e+"":e,t);var ye={};Q(ye,{init:()=>me});module.exports=Z(ye);var k={count:20,bytes:12e3,category:40,message:256,dataKeys:6,dataKey:80,dataString:200};var ee=20,D=48e3,te=10,ne=24e3,I=[250,500],_=/(?:password|passwd|token|secret|authorization|cookie|session|api.?key|credential|bearer|private.?key)/i,H=new Set(["javascript","promise","react","console","http","network","manual"]),z=new Set(["browser","webview-ios","webview-android","unknown"]),re=0;function s(r,e){try{return r==null?void 0:Reflect.get(Object(r),e)}catch{return}}function w(r){try{return String(r)}catch{return"[unavailable]"}}function ie(r,e){return w(r).slice(0,e)}function S(){try{return performance.now()}catch{return Date.now()}}function F(){try{if(typeof crypto<"u"&&typeof crypto.randomUUID=="function")return crypto.randomUUID()}catch{}return`${Date.now().toString(36)}-${(++re).toString(36)}-${Math.random().toString(36).slice(2,10)}`}function O(r,e){try{if(e?.aborted)return!0}catch{}return s(r,"name")==="AbortError"||s(r,"code")===20}function q(r){if(r==null)return{message:"Unknown error"};let e=s(r,"message"),t=s(r,"name"),n=s(r,"stack");return{message:e==null?w(r):w(e),...t==null?{}:{name:w(t)},...n==null?{}:{stack:w(n)}}}function T(r){return new TextEncoder().encode(r).length}function C(r,e,t,n){return typeof r=="number"&&Number.isFinite(r)?Math.min(t,Math.max(e,Math.floor(r))):n}var M=class extends Error{constructor(t){super(`Collector responded ${t}`);h(this,"status",t)}},B=class extends Error{},P=class extends Error{},U=class{constructor(e){h(this,"active");h(this,"endpoint");h(this,"options");h(this,"networkCaptureEnabled");h(this,"navigationCaptureEnabled");h(this,"transportTimeoutMs");h(this,"startedAt",S());h(this,"viewId",F());h(this,"seenErrors",new WeakSet);h(this,"queue",[]);h(this,"breadcrumbs",[]);h(this,"maxQueueSize");h(this,"cancelWaits",new Set);h(this,"controllers",new Set);h(this,"destroySignal");h(this,"resolveDestroy");h(this,"interval");h(this,"flushing");h(this,"sequence",0);h(this,"inFlight",0);h(this,"sent",0);h(this,"dropped",0);h(this,"destroyed",!1);h(this,"onError",e=>{try{let t=s(e,"filename"),n=s(e,"lineno"),i=s(e,"colno"),o={};typeof t=="string"&&t.trim()&&(o.filename=this.cleanUrl(t)),typeof n=="number"&&Number.isFinite(n)&&n>0&&(o.lineno=n),typeof i=="number"&&Number.isFinite(i)&&i>0&&(o.colno=i),this.captureException(s(e,"error")??s(e,"message")??"Script error",{type:"javascript",...Object.keys(o).length?{context:o}:{}})}catch{this.dropped++}});h(this,"onRejection",e=>{this.captureException(e.reason,{type:"promise"})});h(this,"onVisibility",()=>{document.visibilityState==="hidden"&&this.tryBeacon()});if(this.options=e,this.active=e.enabled!==!1&&typeof window<"u"&&typeof document<"u",this.networkCaptureEnabled=e.captureNetwork!==!1&&(!e.transport||!!e.endpoint),this.navigationCaptureEnabled=e.captureNavigation===!0,this.maxQueueSize=C(e.maxQueueSize,1,100,50),this.transportTimeoutMs=C(e.transportTimeoutMs,250,6e4,5e3),this.destroySignal=new Promise(t=>{this.resolveDestroy=t}),!!this.active){if(!e.project||typeof e.project!="string")throw new Error("project is required");if(!e.transport&&!e.endpoint)throw new Error("endpoint or transport is required");this.endpoint=e.endpoint?this.absoluteUrl(e.endpoint):void 0,window.addEventListener("error",this.onError),window.addEventListener("unhandledrejection",this.onRejection),document.addEventListener("visibilitychange",this.onVisibility),this.networkCaptureEnabled&&ce(this),e.captureConsole===!0&&pe(this),this.navigationCaptureEnabled&&oe(this),this.interval=setInterval(()=>{this.flush()},C(e.flushIntervalMs,10,6e4,1e4))}}captureException(e,t={}){if(!(!this.active||this.destroyed||O(e)))try{if(e!==null&&(typeof e=="object"||typeof e=="function")&&this.seenErrors.has(e))return;let n=q(e),i=H.has(t.type)?t.type:"manual",o=this.makeEvent(i,n.message,{name:n.name,stack:n.stack,componentStack:t.componentStack,context:t.context});this.enqueue(o)&&e!==null&&(typeof e=="object"||typeof e=="function")&&this.seenErrors.add(e)}catch(n){(n instanceof B||n instanceof P)&&this.dropped++}}reportNetwork(e,t,n,i,o){if(!(this.destroyed||!this.active||this.isCollectorUrl(t)||O(o)))try{if(n!==void 0&&!(this.options.shouldCaptureHttp?this.options.shouldCaptureHttp(n,t,e):n>=500))return;let a={method:ie(e||"GET",16).toUpperCase(),url:t,status:n,durationMs:i},c=o===void 0?void 0:q(o),d=this.makeEvent(n===void 0?"network":"http",n===void 0?c?.message||"Network request failed":`HTTP ${n}`,{name:c?.name,network:a});this.enqueue(d)}catch{this.dropped++}}captureConsole(e){if(!(!this.active||this.destroyed))try{let t=e.map(w).join(" "),n;for(let i of e)try{if(i instanceof Error){n=q(i);break}}catch{}this.enqueue(this.makeEvent("console",t,{name:n?.name,stack:n?.stack}))}catch{this.dropped++}}addBreadcrumb(e){if(!(!this.active||this.destroyed))try{let t=this.cleanBreadcrumb(e,new Date().toISOString());if(!t)return;this.breadcrumbs.push(t),this.boundBreadcrumbs(this.breadcrumbs)}catch{}}reportNavigation(e,t,n){if(!(!this.active||this.destroyed||!this.navigationCaptureEnabled))try{let i=this.cleanUrl(e),o=this.cleanUrl(t),a=new URL(i),c=new URL(o);if(![a.protocol,c.protocol].every(l=>l==="http:"||l==="https:")||a.username||a.password||a.search||a.hash||c.username||c.password||c.search||c.hash)return;let d=i.slice(0,k.dataString),u=o.slice(0,k.dataString);if(d===u)return;this.breadcrumbs.push({occurredAt:new Date().toISOString(),category:"navigation",message:"Navigation",data:{from:d,to:u,trigger:n}}),this.boundBreadcrumbs(this.breadcrumbs)}catch{}}clearBreadcrumbs(){!this.active||this.destroyed||(this.breadcrumbs.length=0)}flush(){return!this.active||this.destroyed?Promise.resolve():this.flushing?this.flushing:(this.flushing=this.drain().finally(()=>{this.flushing=void 0}),this.flushing)}destroy(){if(!this.destroyed){this.destroyed=!0,this.interval&&clearInterval(this.interval),this.active&&(window.removeEventListener("error",this.onError),window.removeEventListener("unhandledrejection",this.onRejection),document.removeEventListener("visibilitychange",this.onVisibility),this.networkCaptureEnabled&&ue(this),this.options.captureConsole===!0&&he(this),this.navigationCaptureEnabled&&se(this)),this.dropped+=this.queue.length+this.inFlight,this.queue.length=0,this.breadcrumbs.length=0;for(let e of this.cancelWaits)e();for(let e of this.controllers)e.abort();this.resolveDestroy(V)}}getStats(){return{queued:this.queue.length,sent:this.sent,dropped:this.dropped}}absoluteUrl(e){try{return new URL(e,window.location.href).href}catch{return e}}isCollectorUrl(e){if(!this.endpoint)return!1;try{let t=new URL(e,window.location.href),n=new URL(this.endpoint,window.location.href);return t.origin===n.origin&&t.pathname===n.pathname}catch{return e===this.endpoint}}cleanUrl(e){let t=w(e);if(this.options.sanitizeUrl){try{t=this.options.sanitizeUrl(t)}catch{throw new B("URL sanitizer failed")}if(typeof t!="string"||!t)throw new B("URL sanitizer returned no URL")}try{let n=new URL(t,window.location.href);return n.protocol!=="http:"&&n.protocol!=="https:"?"[unsupported URL]":(n.username="",n.password="",n.search="",n.hash="",this.cleanText(n.href,1024,!1))}catch{return this.cleanText(t,1024,!1).split(/[?#]/,1)[0]}}cleanText(e,t,n=!0){let i=w(e);return n&&(i=i.replace(/https?:\/\/[^\s<>"'()[\]]+/gi,o=>this.cleanUrl(o)),i=i.replace(/(^|[\s"'(\[=])((?:\/(?!\/)|\.{1,2}\/)[^\s<>"'()[\]?#]*[?#][^\s<>"'()[\]]+|[a-z][\w.-]*(?:\/[^\s<>"'()[\]?#]*)?(?:\?[a-z0-9_.-]+=[^\s<>"'()[\]]+|#[^\s<>"'()[\]]+)|\?[a-z0-9_.-]+=[^\s<>"'()[\]]+)/gi,(o,a,c)=>{let d=/[.,;!]+$/.exec(c)?.[0]??"",u=c.slice(0,c.length-d.length),l=this.options.sanitizeUrl?this.cleanUrl(u):u.startsWith("?")?"[redacted query]":this.cleanText(u.split(/[?#]/,1)[0],1024,!1);return`${a}${l}${d}`})),i.replace(/\bBearer\s+[A-Za-z0-9._~+\/-]+/gi,"Bearer [REDACTED]").replace(/[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}/gi,"[REDACTED_EMAIL]").slice(0,t)}cleanContext(e){if(!e||typeof e!="object")return;let t={},n;try{n=Object.keys(e)}catch{return}for(let i of n){if(Object.keys(t).length>=12)break;if(_.test(i))continue;let o=s(e,i),a=this.cleanText(i,80);typeof o=="string"?t[a]=this.cleanText(o,500):(typeof o=="number"&&Number.isFinite(o)||typeof o=="boolean"||o===null)&&(t[a]=o)}return Object.keys(t).length?t:void 0}cleanBreadcrumb(e,t){if(!e||typeof e!="object")return;let n=t??s(e,"occurredAt");if(typeof n!="string")return;try{if(new Date(n).toISOString()!==n)return}catch{return}let i=s(e,"category"),o=s(e,"message");if(i!==void 0&&typeof i!="string"||typeof o!="string")return;let a=this.cleanText(i??(t?"manual":""),k.category),c=this.cleanText(o,k.message);if(!a.trim()||!c.trim())return;let d=s(e,"data"),u={};if(d&&typeof d=="object"){let l;try{l=Object.keys(d)}catch{l=[]}for(let p of l){if(Object.keys(u).length>=k.dataKeys)break;if(_.test(p))continue;let f=this.cleanText(p,k.dataKey),y=s(d,p);typeof y=="string"?u[f]=this.cleanText(y,k.dataString):(typeof y=="number"&&Number.isFinite(y)||typeof y=="boolean"||y===null)&&(u[f]=y)}}return{occurredAt:n,category:a,message:c,...Object.keys(u).length?{data:u}:{}}}boundBreadcrumbs(e){for(;e.length>k.count||T(JSON.stringify(e))>k.bytes;)e.shift()}cleanBreadcrumbTrail(e){let t;try{if(!Array.isArray(e))return;t=e.length}catch{return}if(!Number.isSafeInteger(t)||t<0)return;let n=[];for(let i=Math.max(0,t-k.count);i<t;i++){let o=this.cleanBreadcrumb(s(e,i));o&&(n.push(o),this.boundBreadcrumbs(n))}return n.length?n:void 0}cleanNetwork(e){if(!e||typeof e!="object")return;let t=s(e,"status"),n=typeof t=="number"&&Number.isInteger(t)&&t>=100&&t<=599?t:void 0;return{method:this.cleanText(s(e,"method")??"GET",16).toUpperCase(),url:this.cleanUrl(s(e,"url")??""),...n===void 0?{}:{status:n},durationMs:C(s(e,"durationMs"),0,36e5,0)}}makeEvent(e,t,n={}){let i=s(navigator,"userAgent"),o=this.cleanContext(n.context),a;try{a=this.options.getContext?.()}catch{throw new P("Context resolver failed")}let c=this.cleanContext(a),d=this.cleanContext(this.options.context),u=o;if(c||d){u={...o};for(let p of[c,d])if(p)for(let f of Object.keys(p)){if(Object.keys(u).length>=12)break;Object.prototype.hasOwnProperty.call(u,f)||(u[f]=p[f])}}let l=this.cleanNetwork(n.network);return{schemaVersion:1,eventId:F(),project:this.cleanText(this.options.project,80),environment:this.cleanText(this.options.environment??"development",80),release:this.cleanText(this.options.release??"unknown",120),sdkVersion:"0.1.17",occurredAt:new Date().toISOString(),viewId:this.viewId,sequence:++this.sequence,elapsedMs:C(S()-this.startedAt,0,36e5,0),type:e,message:this.cleanText(t,1024),...n.name===void 0?{}:{name:this.cleanText(n.name,100)},...n.stack===void 0?{}:{stack:this.cleanText(n.stack,4096)},...n.componentStack===void 0?{}:{componentStack:this.cleanText(n.componentStack,2048)},page:this.cleanUrl(window.location.href),runtime:z.has(this.options.runtime)?this.options.runtime:"browser",...typeof i=="string"?{browser:this.cleanText(i,300)}:{},...u?{context:u}:{},...this.breadcrumbs.length?{breadcrumbs:this.breadcrumbs.map(p=>({...p,...p.data?{data:{...p.data}}:{}}))}:{},...l?{network:l}:{}}}sanitizeReplacement(e,t){let n=s(e,"type"),i=s(e,"runtime"),o=s(e,"name"),a=s(e,"stack"),c=s(e,"componentStack"),d=s(e,"browser"),u=this.cleanContext(s(e,"context")),l=this.cleanBreadcrumbTrail(s(e,"breadcrumbs")),p=this.cleanNetwork(s(e,"network"));return{...t,type:H.has(n)?n:t.type,message:this.cleanText(s(e,"message")??t.message,1024),...o===void 0?{name:t.name}:{name:this.cleanText(o,100)},...a===void 0?{stack:t.stack}:{stack:this.cleanText(a,4096)},...c===void 0?{componentStack:t.componentStack}:{componentStack:this.cleanText(c,2048)},page:this.cleanUrl(s(e,"page")??t.page),runtime:z.has(i)?i:t.runtime,...d===void 0?{browser:t.browser}:{browser:this.cleanText(d,300)},...u?{context:u}:{context:void 0},...l?{breadcrumbs:l}:{breadcrumbs:void 0},...p?{network:p}:{network:void 0}}}enqueue(e){if(this.destroyed)return!1;let t=e;if(this.options.beforeSend)try{let n={...e,context:e.context&&{...e.context},breadcrumbs:e.breadcrumbs?.map(o=>({...o,data:o.data&&{...o.data}})),network:e.network&&{...e.network}},i=this.options.beforeSend(n);if(i===!1||i===null)return!1;t=this.sanitizeReplacement(i===void 0?n:i,e)}catch{return this.dropped++,!1}return T(JSON.stringify(t))>D?(this.dropped++,!1):(this.queue.length>=this.maxQueueSize&&(this.queue.shift(),this.dropped++),this.queue.push(t),this.queue.length>=this.maxQueueSize&&this.flush(),!0)}takeBatch(e=ee,t=D){let n=[],i=T('{"schemaVersion":1,"events":[]}');for(;this.queue.length&&n.length<e;){let o=this.queue[0],a=T(JSON.stringify(o))+(n.length?1:0);if(n.length&&i+a>t)break;if(!n.length&&i+a>t){this.queue.shift(),this.dropped++;continue}n.push(this.queue.shift()),i+=a}return{schemaVersion:1,events:n}}async drain(){for(;!this.destroyed&&this.queue.length;){let e=this.takeBatch();if(e.events.length){this.inFlight+=e.events.length;try{await this.sendWithRetry(e)}finally{this.inFlight-=e.events.length}}}}async sendWithRetry(e){for(let t=0;t<=I.length&&!this.destroyed;t++){let n=new AbortController;this.controllers.add(n);let i,o=new Promise((c,d)=>{i=setTimeout(()=>{n.abort(),d(new Error("Collector transport timed out"))},this.transportTimeoutMs)}),a;try{if(await Promise.race([this.send(e,n.signal),o,this.destroySignal])===V||this.destroyed)return;this.sent+=e.events.length;return}catch(c){if(this.destroyed)return;let d=s(c,"status");if(!(typeof d!="number"||d===429||d>=500)||t===I.length)break;a=I[t]}finally{i&&clearTimeout(i),this.controllers.delete(n)}a!==void 0&&await this.wait(a)}this.destroyed||(this.dropped+=e.events.length)}async send(e,t){if(this.options.transport){await this.options.transport(e,{signal:t});return}let n=await window.fetch(this.endpoint,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e),credentials:"omit",signal:t});if(!n.ok)throw new M(n.status)}wait(e){return new Promise(t=>{let n=()=>{clearTimeout(i),this.cancelWaits.delete(n),t()},i=setTimeout(n,e);this.cancelWaits.add(n)})}tryBeacon(){if(!(this.destroyed||this.options.transport||!this.endpoint||!this.queue.length))try{let e=new URL(this.endpoint);if(e.origin!==window.location.origin||e.search||e.hash||e.username||e.password||typeof navigator.sendBeacon!="function")return;let t=this.queue.slice(0,te);for(;t.length>0;){let i=JSON.stringify({schemaVersion:1,events:t});if(T(i)<=ne){navigator.sendBeacon(this.endpoint,new Blob([i],{type:"application/json"}))&&(this.queue.splice(0,t.length),this.sent+=t.length);return}t.pop()}}catch{}}},V=Symbol("destroyed"),L,j,A;function oe(r){A||(A=ae()),A?.clients.add(r)}function se(r){let e=A;e&&(e.clients.delete(r),e.clients.size||(e.cleanup(),A=void 0))}function X(r,e){let t=new Set,n=Object.getPrototypeOf(r);for(;n&&!t.has(n);){t.add(n);let i=Object.getOwnPropertyDescriptor(n,e);if(i)return i;n=Object.getPrototypeOf(n)}}function ae(){let r,e,t,n,i,o,a,c;try{if(r=window.history,e=window.location.href,i=Object.getOwnPropertyDescriptor(r,"pushState"),o=Object.getOwnPropertyDescriptor(r,"replaceState"),a=i?void 0:X(r,"pushState"),c=o?void 0:X(r,"replaceState"),i&&!("value"in i)||o&&!("value"in o)||!i&&(!a||!("value"in a)||a.writable!==!0)||!o&&(!c||!("value"in c)||c.writable!==!0)||(t=i?i.value:r.pushState,n=o?o.value:r.replaceState,typeof t!="function"||typeof n!="function"))return;let v=m=>m?m.configurable===!0||m.writable===!0:Object.isExtensible(r);if(!v(i)||!v(o))return}catch{return}let d=new Set,u=v=>{try{let m=window.location.href;if(m===e)return;let x=e;e=m;for(let b of d)try{b.reportNavigation(x,m,v)}catch{}}catch{}},l=function(...v){let m=Reflect.apply(t,this,v);return u("pushState"),m},p=function(...v){let m=Reflect.apply(n,this,v);return u("replaceState"),m},f=()=>{u("popstate")},y=()=>{u("hashchange")},g=(v,m,x)=>{try{let b=Object.getOwnPropertyDescriptor(r,v);if(!b||!("value"in b)||b.value!==m)return;x?Object.defineProperty(r,v,x):Reflect.deleteProperty(r,v)}catch{}},E=!1,R=!1;try{Object.defineProperty(r,"pushState",{configurable:i?.configurable??!0,enumerable:i?.enumerable??!1,writable:i?.writable??!0,value:l}),E=!0,Object.defineProperty(r,"replaceState",{configurable:o?.configurable??!0,enumerable:o?.enumerable??!1,writable:o?.writable??!0,value:p}),R=!0,window.addEventListener("popstate",f),window.addEventListener("hashchange",y)}catch{try{window.removeEventListener("hashchange",y)}catch{}try{window.removeEventListener("popstate",f)}catch{}R&&g("replaceState",p,o),E&&g("pushState",l,i);return}return{clients:d,cleanup(){try{window.removeEventListener("popstate",f)}catch{}try{window.removeEventListener("hashchange",y)}catch{}g("pushState",l,i),g("replaceState",p,o)}}}function ce(r){L||(L=le()),L.clients.add(r)}function ue(r){let e=L;e&&(e.clients.delete(r),e.clients.size||(e.cleanup(),L=void 0))}function de(r,e){let t;if(typeof Request<"u"&&r!==null&&typeof r=="object")if(r instanceof Request)t=s(r,"url");else try{t=Object.getOwnPropertyDescriptor(Request.prototype,"url")?.get?.call(r)}catch{}let n=s(e,"signal");return{url:t??w(r),method:w(s(e,"method")??(t===void 0?void 0:s(r,"method"))??"GET"),signal:n===void 0?t===void 0?void 0:s(r,"signal"):n}}function le(){let r=new Set,e=window.fetch,t;typeof e=="function"&&(t=function(...l){if(!r.size)return Reflect.apply(e,this,l);let p=S(),f;try{f=de(l[0],l[1])}catch{f={url:"",method:"GET"}}let y;try{y=Reflect.apply(e,this,l)}catch(g){if(!O(g,f.signal))for(let E of r)E.reportNetwork(f.method,f.url,void 0,S()-p,g);throw g}return y.then(g=>{try{let E=g.status;for(let R of r)R.reportNetwork(f.method,f.url,E,S()-p)}catch{}return g},g=>{if(!O(g,f.signal))for(let E of r)E.reportNetwork(f.method,f.url,void 0,S()-p,g);throw g})},window.fetch=t);let n=typeof XMLHttpRequest>"u"?void 0:XMLHttpRequest.prototype,i=n?.open,o=n?.send,a=new WeakMap,c=new WeakMap,d,u;return n&&i&&o&&(d=(function(...l){let p=Reflect.apply(i,this,l);c.get(this)?.();try{a.set(this,{method:w(l[0]),url:w(l[1])})}catch{}return p}),u=function(...l){if(!r.size)return Reflect.apply(o,this,l);let p=a.get(this);if(!p)return Reflect.apply(o,this,l);let f=S(),y=!1,g=!1,E=!1,R=()=>{y=!0},v=()=>{g=!0},m=()=>{this.removeEventListener("abort",R),this.removeEventListener("error",v),this.removeEventListener("timeout",v),this.removeEventListener("loadend",x),c.get(this)===m&&c.delete(this)},x=()=>{if(E=!0,m(),!y)try{let b=this.status;if(b===0&&!g)return;for(let K of r)K.reportNetwork(p.method,p.url,b===0?void 0:b,S()-f)}catch{}};try{this.addEventListener("abort",R),this.addEventListener("error",v),this.addEventListener("timeout",v),this.addEventListener("loadend",x)}catch{return m(),Reflect.apply(o,this,l)}try{let b=Reflect.apply(o,this,l);return E||c.set(this,m),b}catch(b){throw m(),b}},n.open=d,n.send=u),{clients:r,cleanup(){t&&window.fetch===t&&(window.fetch=e),n&&d&&n.open===d&&(n.open=i),n&&u&&n.send===u&&(n.send=o)}}}function pe(r){j||(j=fe()),j.clients.add(r)}function he(r){let e=j;e&&(e.clients.delete(r),e.clients.size||(e.cleanup(),j=void 0))}function fe(){let r=new Set,e=console.error,t=function(...n){try{return Reflect.apply(e,this,n)}finally{for(let i of r)i.captureConsole(n)}};return console.error=t,{clients:r,cleanup(){console.error===t&&(console.error=e)}}}function me(r){return new U(r)}
1
+ "use strict";var L=Object.defineProperty;var $=Object.getOwnPropertyDescriptor;var W=Object.getOwnPropertyNames;var J=Object.prototype.hasOwnProperty;var Y=(r,e,n)=>e in r?L(r,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):r[e]=n;var Z=(r,e)=>{for(var n in e)L(r,n,{get:e[n],enumerable:!0})},G=(r,e,n,t)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of W(e))!J.call(r,i)&&i!==n&&L(r,i,{get:()=>e[i],enumerable:!(t=$(e,i))||t.enumerable});return r};var Q=r=>G(L({},"__esModule",{value:!0}),r);var l=(r,e,n)=>Y(r,typeof e!="symbol"?e+"":e,n);var ye={};Z(ye,{init:()=>me});module.exports=Q(ye);var k={count:20,bytes:12e3,category:40,message:256,dataKeys:6,dataKey:80,dataString:200};var ee=20,_=48e3,te=10,ne=24e3,I=[250,500],H=/(?:password|passwd|token|secret|authorization|cookie|session|api.?key|credential|bearer|private.?key)/i,F=new Set(["javascript","promise","react","console","http","network","manual"]),z=new Set(["browser","webview-ios","webview-android","unknown"]),re=0;function s(r,e){try{return r==null?void 0:Reflect.get(Object(r),e)}catch{return}}function w(r){try{return String(r)}catch{return"[unavailable]"}}function ie(r,e){return w(r).slice(0,e)}function S(){try{return performance.now()}catch{return Date.now()}}function V(){try{if(typeof crypto<"u"&&typeof crypto.randomUUID=="function")return crypto.randomUUID()}catch{}return`${Date.now().toString(36)}-${(++re).toString(36)}-${Math.random().toString(36).slice(2,10)}`}function j(r,e){try{if(e?.aborted)return!0}catch{}return s(r,"name")==="AbortError"||s(r,"code")===20}function q(r){if(r==null)return{message:"Unknown error"};let e=s(r,"message"),n=s(r,"name"),t=s(r,"stack");return{message:e==null?w(r):w(e),...n==null?{}:{name:w(n)},...t==null?{}:{stack:w(t)}}}function C(r){return new TextEncoder().encode(r).length}function T(r,e,n,t){return typeof r=="number"&&Number.isFinite(r)?Math.min(n,Math.max(e,Math.floor(r))):t}var U=class extends Error{constructor(n){super(`Collector responded ${n}`);l(this,"status",n)}},B=class extends Error{},O=class extends Error{},D=class{constructor(e){l(this,"active");l(this,"endpoint");l(this,"options");l(this,"networkCaptureEnabled");l(this,"networkBreadcrumbCaptureEnabled");l(this,"navigationCaptureEnabled");l(this,"transportTimeoutMs");l(this,"startedAt",S());l(this,"viewId",V());l(this,"seenErrors",new WeakSet);l(this,"queue",[]);l(this,"breadcrumbs",[]);l(this,"maxQueueSize");l(this,"maxEventsPerMinute");l(this,"admittedAt",[]);l(this,"cancelWaits",new Set);l(this,"controllers",new Set);l(this,"destroySignal");l(this,"resolveDestroy");l(this,"interval");l(this,"flushing");l(this,"sequence",0);l(this,"inFlight",0);l(this,"sent",0);l(this,"dropped",0);l(this,"destroyed",!1);l(this,"lastAdmissionClock");l(this,"onError",e=>{try{let n=s(e,"filename"),t=s(e,"lineno"),i=s(e,"colno"),o={};typeof n=="string"&&n.trim()&&(o.filename=this.cleanUrl(n)),typeof t=="number"&&Number.isFinite(t)&&t>0&&(o.lineno=t),typeof i=="number"&&Number.isFinite(i)&&i>0&&(o.colno=i),this.captureException(s(e,"error")??s(e,"message")??"Script error",{type:"javascript",...Object.keys(o).length?{context:o}:{}})}catch{this.dropped++}});l(this,"onRejection",e=>{this.captureException(e.reason,{type:"promise"})});l(this,"onVisibility",()=>{document.visibilityState==="hidden"&&this.tryBeacon()});this.options=e,this.active=e.enabled!==!1&&typeof window<"u"&&typeof document<"u";let n=!e.transport||!!e.endpoint;if(this.networkCaptureEnabled=e.captureNetwork!==!1&&n,this.networkBreadcrumbCaptureEnabled=e.captureNetworkBreadcrumbs===!0&&n,this.navigationCaptureEnabled=e.captureNavigation===!0,this.maxQueueSize=T(e.maxQueueSize,1,100,50),this.maxEventsPerMinute=typeof e.maxEventsPerMinute=="number"&&Number.isFinite(e.maxEventsPerMinute)?T(e.maxEventsPerMinute,1,1e3,1):void 0,this.transportTimeoutMs=T(e.transportTimeoutMs,250,6e4,5e3),this.destroySignal=new Promise(t=>{this.resolveDestroy=t}),!!this.active){if(!e.project||typeof e.project!="string")throw new Error("project is required");if(!e.transport&&!e.endpoint)throw new Error("endpoint or transport is required");this.endpoint=e.endpoint?this.absoluteUrl(e.endpoint):void 0,window.addEventListener("error",this.onError),window.addEventListener("unhandledrejection",this.onRejection),document.addEventListener("visibilitychange",this.onVisibility),(this.networkCaptureEnabled||this.networkBreadcrumbCaptureEnabled)&&ce(this),e.captureConsole===!0&&he(this),this.navigationCaptureEnabled&&oe(this),this.interval=setInterval(()=>{this.flush()},T(e.flushIntervalMs,10,6e4,1e4))}}captureException(e,n={}){if(!(!this.active||this.destroyed||j(e)))try{if(e!==null&&(typeof e=="object"||typeof e=="function")&&this.seenErrors.has(e))return;let t=q(e),i=F.has(n.type)?n.type:"manual",o=this.makeEvent(i,t.message,{name:t.name,stack:t.stack,componentStack:n.componentStack,context:n.context});this.enqueue(o)&&e!==null&&(typeof e=="object"||typeof e=="function")&&this.seenErrors.add(e)}catch(t){(t instanceof B||t instanceof O)&&this.dropped++}}reportNetwork(e,n,t,i,o,c=!0){if(this.destroyed||!this.active||this.isCollectorUrl(n)||j(o))return;let d=this.networkCaptureEnabled&&c;if(d&&t!==void 0)try{d=this.options.shouldCaptureHttp?this.options.shouldCaptureHttp(t,n,e):t>=500}catch{this.dropped++;return}if(this.networkBreadcrumbCaptureEnabled)try{let u=this.cleanBreadcrumbUrl(n);if(u.url){let a={method:this.cleanNetworkBreadcrumbMethod(e),url:u.url,durationMs:T(i,0,36e5,0)};t!==void 0&&Number.isInteger(t)&&t>=0&&t<=599&&(a.status=t),this.breadcrumbs.push({occurredAt:new Date().toISOString(),category:t===void 0?"network":"http",message:t===void 0?"Network failure":"HTTP response",data:a}),this.boundBreadcrumbs(this.breadcrumbs)}else if(d&&!u.safeForError){this.dropped++;return}}catch{d&&this.dropped++;return}if(d)try{let u={method:ie(e||"GET",16).toUpperCase(),url:n,status:t,durationMs:i},a=o===void 0?void 0:q(o),h=this.makeEvent(t===void 0?"network":"http",t===void 0?a?.message||"Network request failed":`HTTP ${t}`,{name:a?.name,network:u});this.enqueue(h)}catch{this.dropped++}}reportZeroStatusCompletion(e,n,t){this.networkBreadcrumbCaptureEnabled&&this.reportNetwork(e,n,0,t,void 0,!1)}captureConsole(e){if(!(!this.active||this.destroyed))try{let n=e.map(w).join(" "),t;for(let i of e)try{if(i instanceof Error){t=q(i);break}}catch{}this.enqueue(this.makeEvent("console",n,{name:t?.name,stack:t?.stack}))}catch{this.dropped++}}addBreadcrumb(e){if(!(!this.active||this.destroyed))try{let n=this.cleanBreadcrumb(e,new Date().toISOString());if(!n)return;this.breadcrumbs.push(n),this.boundBreadcrumbs(this.breadcrumbs)}catch{}}reportNavigation(e,n,t){if(!(!this.active||this.destroyed||!this.navigationCaptureEnabled))try{let i=this.cleanBreadcrumbUrl(e).url,o=this.cleanBreadcrumbUrl(n).url;if(!i||!o||i===o)return;this.breadcrumbs.push({occurredAt:new Date().toISOString(),category:"navigation",message:"Navigation",data:{from:i,to:o,trigger:t}}),this.boundBreadcrumbs(this.breadcrumbs)}catch{}}clearBreadcrumbs(){!this.active||this.destroyed||(this.breadcrumbs.length=0)}flush(){return!this.active||this.destroyed?Promise.resolve():this.flushing?this.flushing:(this.flushing=this.drain().finally(()=>{this.flushing=void 0}),this.flushing)}destroy(){if(!this.destroyed){this.destroyed=!0,this.interval&&clearInterval(this.interval),this.active&&(window.removeEventListener("error",this.onError),window.removeEventListener("unhandledrejection",this.onRejection),document.removeEventListener("visibilitychange",this.onVisibility),(this.networkCaptureEnabled||this.networkBreadcrumbCaptureEnabled)&&ue(this),this.options.captureConsole===!0&&pe(this),this.navigationCaptureEnabled&&se(this)),this.dropped+=this.queue.length+this.inFlight,this.queue.length=0,this.breadcrumbs.length=0,this.admittedAt.length=0,this.lastAdmissionClock=void 0;for(let e of this.cancelWaits)e();for(let e of this.controllers)e.abort();this.resolveDestroy(X)}}getStats(){return{queued:this.queue.length,sent:this.sent,dropped:this.dropped}}absoluteUrl(e){try{return new URL(e,window.location.href).href}catch{return e}}isCollectorUrl(e){if(!this.endpoint)return!1;try{let n=new URL(e,window.location.href),t=new URL(this.endpoint,window.location.href);return n.origin===t.origin&&n.pathname===t.pathname}catch{return e===this.endpoint}}cleanUrl(e){let n=w(e);if(this.options.sanitizeUrl){try{n=this.options.sanitizeUrl(n)}catch{throw new B("URL sanitizer failed")}if(typeof n!="string"||!n)throw new B("URL sanitizer returned no URL")}try{let t=new URL(n,window.location.href);return t.protocol!=="http:"&&t.protocol!=="https:"?"[unsupported URL]":(t.username="",t.password="",t.search="",t.hash="",this.cleanText(t.href,1024,!1))}catch{return this.cleanText(n,1024,!1).split(/[?#]/,1)[0]}}cleanBreadcrumbUrl(e){let n=this.cleanUrl(e);if(n==="[unsupported URL]")return{safeForError:!0};try{let t=new URL(n);return t.protocol!=="http:"&&t.protocol!=="https:"||t.username||t.password||t.search||t.hash?{safeForError:!1}:{url:n.slice(0,k.dataString),safeForError:!0}}catch{return{safeForError:!1}}}cleanNetworkBreadcrumbMethod(e){let n=w(e||"GET").trim().toUpperCase();return/^[A-Z0-9!#$%&'*+.^_`|~-]{1,16}$/.test(n)?n:"GET"}cleanText(e,n,t=!0){let i=w(e);return t&&(i=i.replace(/https?:\/\/[^\s<>"'()[\]]+/gi,o=>this.cleanUrl(o)),i=i.replace(/(^|[\s"'(\[=])((?:\/(?!\/)|\.{1,2}\/)[^\s<>"'()[\]?#]*[?#][^\s<>"'()[\]]+|[a-z][\w.-]*(?:\/[^\s<>"'()[\]?#]*)?(?:\?[a-z0-9_.-]+=[^\s<>"'()[\]]+|#[^\s<>"'()[\]]+)|\?[a-z0-9_.-]+=[^\s<>"'()[\]]+)/gi,(o,c,d)=>{let u=/[.,;!]+$/.exec(d)?.[0]??"",a=d.slice(0,d.length-u.length),h=this.options.sanitizeUrl?this.cleanUrl(a):a.startsWith("?")?"[redacted query]":this.cleanText(a.split(/[?#]/,1)[0],1024,!1);return`${c}${h}${u}`})),i.replace(/\bBearer\s+[A-Za-z0-9._~+\/-]+/gi,"Bearer [REDACTED]").replace(/[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}/gi,"[REDACTED_EMAIL]").slice(0,n)}cleanContext(e){if(!e||typeof e!="object")return;let n={},t;try{t=Object.keys(e)}catch{return}for(let i of t){if(Object.keys(n).length>=12)break;if(H.test(i))continue;let o=s(e,i),c=this.cleanText(i,80);typeof o=="string"?n[c]=this.cleanText(o,500):(typeof o=="number"&&Number.isFinite(o)||typeof o=="boolean"||o===null)&&(n[c]=o)}return Object.keys(n).length?n:void 0}cleanBreadcrumb(e,n){if(!e||typeof e!="object")return;let t=n??s(e,"occurredAt");if(typeof t!="string")return;try{if(new Date(t).toISOString()!==t)return}catch{return}let i=s(e,"category"),o=s(e,"message");if(i!==void 0&&typeof i!="string"||typeof o!="string")return;let c=this.cleanText(i??(n?"manual":""),k.category),d=this.cleanText(o,k.message);if(!c.trim()||!d.trim())return;let u=s(e,"data"),a={};if(u&&typeof u=="object"){let h;try{h=Object.keys(u)}catch{h=[]}for(let p of h){if(Object.keys(a).length>=k.dataKeys)break;if(H.test(p))continue;let f=this.cleanText(p,k.dataKey),y=s(u,p);typeof y=="string"?a[f]=this.cleanText(y,k.dataString):(typeof y=="number"&&Number.isFinite(y)||typeof y=="boolean"||y===null)&&(a[f]=y)}}return{occurredAt:t,category:c,message:d,...Object.keys(a).length?{data:a}:{}}}boundBreadcrumbs(e){for(;e.length>k.count||C(JSON.stringify(e))>k.bytes;)e.shift()}cleanBreadcrumbTrail(e){let n;try{if(!Array.isArray(e))return;n=e.length}catch{return}if(!Number.isSafeInteger(n)||n<0)return;let t=[];for(let i=Math.max(0,n-k.count);i<n;i++){let o=this.cleanBreadcrumb(s(e,i));o&&(t.push(o),this.boundBreadcrumbs(t))}return t.length?t:void 0}cleanNetwork(e){if(!e||typeof e!="object")return;let n=s(e,"status"),t=typeof n=="number"&&Number.isInteger(n)&&n>=100&&n<=599?n:void 0;return{method:this.cleanText(s(e,"method")??"GET",16).toUpperCase(),url:this.cleanUrl(s(e,"url")??""),...t===void 0?{}:{status:t},durationMs:T(s(e,"durationMs"),0,36e5,0)}}makeEvent(e,n,t={}){let i=s(navigator,"userAgent"),o=this.cleanContext(t.context),c;try{c=this.options.getContext?.()}catch{throw new O("Context resolver failed")}let d=this.cleanContext(c),u=this.cleanContext(this.options.context),a=o;if(d||u){a={...o};for(let p of[d,u])if(p)for(let f of Object.keys(p)){if(Object.keys(a).length>=12)break;Object.prototype.hasOwnProperty.call(a,f)||(a[f]=p[f])}}let h=this.cleanNetwork(t.network);return{schemaVersion:1,eventId:V(),project:this.cleanText(this.options.project,80),environment:this.cleanText(this.options.environment??"development",80),release:this.cleanText(this.options.release??"unknown",120),sdkVersion:"0.1.19",occurredAt:new Date().toISOString(),viewId:this.viewId,sequence:++this.sequence,elapsedMs:T(S()-this.startedAt,0,36e5,0),type:e,message:this.cleanText(n,1024),...t.name===void 0?{}:{name:this.cleanText(t.name,100)},...t.stack===void 0?{}:{stack:this.cleanText(t.stack,4096)},...t.componentStack===void 0?{}:{componentStack:this.cleanText(t.componentStack,2048)},page:this.cleanUrl(window.location.href),runtime:z.has(this.options.runtime)?this.options.runtime:"browser",...typeof i=="string"?{browser:this.cleanText(i,300)}:{},...a?{context:a}:{},...this.breadcrumbs.length?{breadcrumbs:this.breadcrumbs.map(p=>({...p,...p.data?{data:{...p.data}}:{}}))}:{},...h?{network:h}:{}}}sanitizeReplacement(e,n){let t=s(e,"type"),i=s(e,"runtime"),o=s(e,"name"),c=s(e,"stack"),d=s(e,"componentStack"),u=s(e,"browser"),a=this.cleanContext(s(e,"context")),h=this.cleanBreadcrumbTrail(s(e,"breadcrumbs")),p=this.cleanNetwork(s(e,"network"));return{...n,type:F.has(t)?t:n.type,message:this.cleanText(s(e,"message")??n.message,1024),...o===void 0?{name:n.name}:{name:this.cleanText(o,100)},...c===void 0?{stack:n.stack}:{stack:this.cleanText(c,4096)},...d===void 0?{componentStack:n.componentStack}:{componentStack:this.cleanText(d,2048)},page:this.cleanUrl(s(e,"page")??n.page),runtime:z.has(i)?i:n.runtime,...u===void 0?{browser:n.browser}:{browser:this.cleanText(u,300)},...a?{context:a}:{context:void 0},...h?{breadcrumbs:h}:{breadcrumbs:void 0},...p?{network:p}:{network:void 0}}}admissionTime(){let e=S(),n=Number.isFinite(e)?Math.max(0,e,this.lastAdmissionClock??0):this.lastAdmissionClock??0;for(this.lastAdmissionClock=n;this.admittedAt.length&&n-this.admittedAt[0]>=6e4;)this.admittedAt.shift();return this.admittedAt.length<this.maxEventsPerMinute?n:void 0}enqueue(e){if(this.destroyed)return!1;if(this.maxEventsPerMinute!==void 0&&this.admissionTime()===void 0)return this.dropped++,!1;let n=e;if(this.options.beforeSend)try{let i={...e,context:e.context&&{...e.context},breadcrumbs:e.breadcrumbs?.map(c=>({...c,data:c.data&&{...c.data}})),network:e.network&&{...e.network}},o=this.options.beforeSend(i);if(o===!1||o===null)return!1;n=this.sanitizeReplacement(o===void 0?i:o,e)}catch{return this.dropped++,!1}if(C(JSON.stringify(n))>_)return this.dropped++,!1;let t=this.maxEventsPerMinute===void 0?void 0:this.admissionTime();return this.maxEventsPerMinute!==void 0&&t===void 0?(this.dropped++,!1):(this.queue.length>=this.maxQueueSize&&(this.queue.shift(),this.dropped++),this.queue.push(n),t!==void 0&&this.admittedAt.push(t),this.queue.length>=this.maxQueueSize&&this.flush(),!0)}takeBatch(e=ee,n=_){let t=[],i=C('{"schemaVersion":1,"events":[]}');for(;this.queue.length&&t.length<e;){let o=this.queue[0],c=C(JSON.stringify(o))+(t.length?1:0);if(t.length&&i+c>n)break;if(!t.length&&i+c>n){this.queue.shift(),this.dropped++;continue}t.push(this.queue.shift()),i+=c}return{schemaVersion:1,events:t}}async drain(){for(;!this.destroyed&&this.queue.length;){let e=this.takeBatch();if(e.events.length){this.inFlight+=e.events.length;try{await this.sendWithRetry(e)}finally{this.inFlight-=e.events.length}}}}async sendWithRetry(e){for(let n=0;n<=I.length&&!this.destroyed;n++){let t=new AbortController;this.controllers.add(t);let i,o=new Promise((d,u)=>{i=setTimeout(()=>{t.abort(),u(new Error("Collector transport timed out"))},this.transportTimeoutMs)}),c;try{if(await Promise.race([this.send(e,t.signal),o,this.destroySignal])===X||this.destroyed)return;this.sent+=e.events.length;return}catch(d){if(this.destroyed)return;let u=s(d,"status");if(!(typeof u!="number"||u===429||u>=500)||n===I.length)break;c=I[n]}finally{i&&clearTimeout(i),this.controllers.delete(t)}c!==void 0&&await this.wait(c)}this.destroyed||(this.dropped+=e.events.length)}async send(e,n){if(this.options.transport){await this.options.transport(e,{signal:n});return}let t=await window.fetch(this.endpoint,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e),credentials:"omit",signal:n});if(!t.ok)throw new U(t.status)}wait(e){return new Promise(n=>{let t=()=>{clearTimeout(i),this.cancelWaits.delete(t),n()},i=setTimeout(t,e);this.cancelWaits.add(t)})}tryBeacon(){if(!(this.destroyed||this.options.transport||!this.endpoint||!this.queue.length))try{let e=new URL(this.endpoint);if(e.origin!==window.location.origin||e.search||e.hash||e.username||e.password||typeof navigator.sendBeacon!="function")return;let n=this.queue.slice(0,te);for(;n.length>0;){let i=JSON.stringify({schemaVersion:1,events:n});if(C(i)<=ne){navigator.sendBeacon(this.endpoint,new Blob([i],{type:"application/json"}))&&(this.queue.splice(0,n.length),this.sent+=n.length);return}n.pop()}}catch{}}},X=Symbol("destroyed"),A,N,P;function oe(r){P||(P=ae()),P?.clients.add(r)}function se(r){let e=P;e&&(e.clients.delete(r),e.clients.size||(e.cleanup(),P=void 0))}function K(r,e){let n=new Set,t=Object.getPrototypeOf(r);for(;t&&!n.has(t);){n.add(t);let i=Object.getOwnPropertyDescriptor(t,e);if(i)return i;t=Object.getPrototypeOf(t)}}function ae(){let r,e,n,t,i,o,c,d;try{if(r=window.history,e=window.location.href,i=Object.getOwnPropertyDescriptor(r,"pushState"),o=Object.getOwnPropertyDescriptor(r,"replaceState"),c=i?void 0:K(r,"pushState"),d=o?void 0:K(r,"replaceState"),i&&!("value"in i)||o&&!("value"in o)||!i&&(!c||!("value"in c)||c.writable!==!0)||!o&&(!d||!("value"in d)||d.writable!==!0)||(n=i?i.value:r.pushState,t=o?o.value:r.replaceState,typeof n!="function"||typeof t!="function"))return;let b=m=>m?m.configurable===!0||m.writable===!0:Object.isExtensible(r);if(!b(i)||!b(o))return}catch{return}let u=new Set,a=b=>{try{let m=window.location.href;if(m===e)return;let R=e;e=m;for(let v of u)try{v.reportNavigation(R,m,b)}catch{}}catch{}},h=function(...b){let m=Reflect.apply(n,this,b);return a("pushState"),m},p=function(...b){let m=Reflect.apply(t,this,b);return a("replaceState"),m},f=()=>{a("popstate")},y=()=>{a("hashchange")},g=(b,m,R)=>{try{let v=Object.getOwnPropertyDescriptor(r,b);if(!v||!("value"in v)||v.value!==m)return;R?Object.defineProperty(r,b,R):Reflect.deleteProperty(r,b)}catch{}},E=!1,x=!1;try{Object.defineProperty(r,"pushState",{configurable:i?.configurable??!0,enumerable:i?.enumerable??!1,writable:i?.writable??!0,value:h}),E=!0,Object.defineProperty(r,"replaceState",{configurable:o?.configurable??!0,enumerable:o?.enumerable??!1,writable:o?.writable??!0,value:p}),x=!0,window.addEventListener("popstate",f),window.addEventListener("hashchange",y)}catch{try{window.removeEventListener("hashchange",y)}catch{}try{window.removeEventListener("popstate",f)}catch{}x&&g("replaceState",p,o),E&&g("pushState",h,i);return}return{clients:u,cleanup(){try{window.removeEventListener("popstate",f)}catch{}try{window.removeEventListener("hashchange",y)}catch{}g("pushState",h,i),g("replaceState",p,o)}}}function ce(r){A||(A=le()),A.clients.add(r)}function ue(r){let e=A;e&&(e.clients.delete(r),e.clients.size||(e.cleanup(),A=void 0))}function de(r,e){let n;if(typeof Request<"u"&&r!==null&&typeof r=="object")if(r instanceof Request)n=s(r,"url");else try{n=Object.getOwnPropertyDescriptor(Request.prototype,"url")?.get?.call(r)}catch{}let t=s(e,"signal");return{url:n??w(r),method:w(s(e,"method")??(n===void 0?void 0:s(r,"method"))??"GET"),signal:t===void 0?n===void 0?void 0:s(r,"signal"):t}}function le(){let r=new Set,e=window.fetch,n;typeof e=="function"&&(n=function(...h){if(!r.size)return Reflect.apply(e,this,h);let p=S(),f;try{f=de(h[0],h[1])}catch{f={url:"",method:"GET"}}let y;try{y=Reflect.apply(e,this,h)}catch(g){if(!j(g,f.signal))for(let E of r)E.reportNetwork(f.method,f.url,void 0,S()-p,g);throw g}return y.then(g=>{try{let E=g.status;for(let x of r)x.reportNetwork(f.method,f.url,E,S()-p)}catch{}return g},g=>{if(!j(g,f.signal))for(let E of r)E.reportNetwork(f.method,f.url,void 0,S()-p,g);throw g})},window.fetch=n);let t=typeof XMLHttpRequest>"u"?void 0:XMLHttpRequest.prototype,i=t?.open,o=t?.send,c=new WeakMap,d=new WeakMap,u,a;return t&&i&&o&&(u=(function(...h){let p=Reflect.apply(i,this,h);d.get(this)?.();try{c.set(this,{method:w(h[0]),url:w(h[1])})}catch{}return p}),a=function(...h){if(!r.size)return Reflect.apply(o,this,h);let p=c.get(this);if(!p)return Reflect.apply(o,this,h);let f=S(),y=!1,g=!1,E=!1,x=()=>{y=!0},b=()=>{g=!0},m=()=>{this.removeEventListener("abort",x),this.removeEventListener("error",b),this.removeEventListener("timeout",b),this.removeEventListener("loadend",R),d.get(this)===m&&d.delete(this)},R=()=>{if(E=!0,m(),!y)try{let v=this.status;if(v===0&&!g){for(let M of r)M.reportZeroStatusCompletion(p.method,p.url,S()-f);return}for(let M of r)M.reportNetwork(p.method,p.url,v===0?void 0:v,S()-f)}catch{}};try{this.addEventListener("abort",x),this.addEventListener("error",b),this.addEventListener("timeout",b),this.addEventListener("loadend",R)}catch{return m(),Reflect.apply(o,this,h)}try{let v=Reflect.apply(o,this,h);return E||d.set(this,m),v}catch(v){throw m(),v}},t.open=u,t.send=a),{clients:r,cleanup(){n&&window.fetch===n&&(window.fetch=e),t&&u&&t.open===u&&(t.open=i),t&&a&&t.send===a&&(t.send=o)}}}function he(r){N||(N=fe()),N.clients.add(r)}function pe(r){let e=N;e&&(e.clients.delete(r),e.clients.size||(e.cleanup(),N=void 0))}function fe(){let r=new Set,e=console.error,n=function(...t){try{return Reflect.apply(e,this,t)}finally{for(let i of r)i.captureConsole(t)}};return console.error=n,{clients:r,cleanup(){console.error===n&&(console.error=e)}}}function me(r){return new D(r)}
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/index.ts", "../../protocol/src/index.ts"],
4
- "sourcesContent": ["import { BREADCRUMB_LIMITS, type Breadcrumb, type ErrorEventRecord, type EventBatch, type EventType, type Runtime } from '@ihyeon/browser-error-log-protocol';\n\nexport type { Breadcrumb, ErrorEventRecord, EventBatch } from '@ihyeon/browser-error-log-protocol';\n\nexport interface CaptureExtra {\n type?: EventType;\n context?: Record<string, unknown>;\n componentStack?: string;\n}\n\nexport interface TransportContext { signal: AbortSignal }\n\nexport interface BrowserErrorLogOptions {\n project: string;\n environment?: string;\n release?: string;\n /** Scalar metadata added to every captured event; event context takes precedence. */\n context?: Record<string, unknown>;\n /** Returns scalar metadata from current application state for each new event. */\n getContext?: () => Record<string, unknown> | undefined;\n endpoint?: string;\n transport?: (batch: EventBatch, context: TransportContext) => void | Promise<void>;\n runtime?: Runtime;\n enabled?: boolean;\n captureConsole?: boolean;\n /** Records sanitized History navigation breadcrumbs; defaults to false. */\n captureNavigation?: boolean;\n /** Defaults to true. With a custom transport, automatic network capture requires endpoint for collector exclusion. */\n captureNetwork?: boolean;\n beforeSend?: (event: ErrorEventRecord) => ErrorEventRecord | false | null | void;\n sanitizeUrl?: (url: string) => string;\n shouldCaptureHttp?: (status: number, url: string, method: string) => boolean;\n flushIntervalMs?: number;\n maxQueueSize?: number;\n /** Per-attempt deadline, clamped to 250\u201360000 ms; defaults to 5000 ms. */\n transportTimeoutMs?: number;\n}\n\nexport interface BrowserErrorLogClient {\n captureException(error: unknown, extra?: CaptureExtra): void;\n flush(): Promise<void>;\n destroy(): void;\n getStats(): { queued: number; sent: number; dropped: number };\n}\n\nexport interface BreadcrumbInput {\n message: string;\n category?: string;\n data?: Record<string, unknown>;\n}\n\nexport interface BrowserErrorLogBreadcrumbClient extends BrowserErrorLogClient {\n addBreadcrumb(input: BreadcrumbInput): void;\n clearBreadcrumbs(): void;\n}\n\nconst MAX_BATCH_EVENTS = 20;\nconst MAX_BATCH_BYTES = 48_000;\nconst MAX_BEACON_EVENTS = 10;\nconst MAX_BEACON_BYTES = 24_000;\nconst RETRY_DELAYS_MS = [250, 500];\nconst SENSITIVE_KEY = /(?:password|passwd|token|secret|authorization|cookie|session|api.?key|credential|bearer|private.?key)/i;\nconst EVENT_TYPES = new Set<EventType>(['javascript', 'promise', 'react', 'console', 'http', 'network', 'manual']);\nconst RUNTIMES = new Set<Runtime>(['browser', 'webview-ios', 'webview-android', 'unknown']);\nlet fallbackId = 0;\n\nfunction read(object: unknown, key: PropertyKey): unknown {\n try { return object == null ? undefined : Reflect.get(Object(object), key); }\n catch { return undefined; }\n}\n\nfunction safeString(value: unknown): string {\n try { return String(value); }\n catch { return '[unavailable]'; }\n}\n\nfunction trim(value: unknown, length: number): string {\n return safeString(value).slice(0, length);\n}\n\nfunction now(): number {\n try { return performance.now(); }\n catch { return Date.now(); }\n}\n\nfunction newId(): string {\n try {\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') return crypto.randomUUID();\n } catch { /* fall through */ }\n return `${Date.now().toString(36)}-${(++fallbackId).toString(36)}-${Math.random().toString(36).slice(2, 10)}`;\n}\n\nfunction isAbort(error: unknown, signal?: AbortSignal | null): boolean {\n try { if (signal?.aborted) return true; }\n catch { /* ignore hostile signal */ }\n return read(error, 'name') === 'AbortError' || read(error, 'code') === 20;\n}\n\nfunction errorFields(error: unknown): { message: string; name?: string; stack?: string } {\n if (error === null || error === undefined) return { message: 'Unknown error' };\n const message = read(error, 'message');\n const name = read(error, 'name');\n const stack = read(error, 'stack');\n return {\n message: message == null ? safeString(error) : safeString(message),\n ...(name == null ? {} : { name: safeString(name) }),\n ...(stack == null ? {} : { stack: safeString(stack) }),\n };\n}\n\nfunction byteLength(value: string): number {\n return new TextEncoder().encode(value).length;\n}\n\nfunction boundedNumber(value: unknown, minimum: number, maximum: number, fallback: number): number {\n return typeof value === 'number' && Number.isFinite(value)\n ? Math.min(maximum, Math.max(minimum, Math.floor(value)))\n : fallback;\n}\n\nclass HttpDeliveryError extends Error {\n constructor(readonly status: number) { super(`Collector responded ${status}`); }\n}\n\nclass UrlSanitizationError extends Error {}\n\nclass ContextResolutionError extends Error {}\n\nclass Client implements BrowserErrorLogBreadcrumbClient {\n private readonly active: boolean;\n private readonly endpoint?: string;\n private readonly options: BrowserErrorLogOptions;\n private readonly networkCaptureEnabled: boolean;\n private readonly navigationCaptureEnabled: boolean;\n private readonly transportTimeoutMs: number;\n private readonly startedAt = now();\n private readonly viewId = newId();\n private readonly seenErrors = new WeakSet<object>();\n private readonly queue: ErrorEventRecord[] = [];\n private readonly breadcrumbs: Breadcrumb[] = [];\n private readonly maxQueueSize: number;\n private readonly cancelWaits = new Set<() => void>();\n private readonly controllers = new Set<AbortController>();\n private readonly destroySignal: Promise<symbol>;\n private resolveDestroy!: (value: symbol) => void;\n private interval?: ReturnType<typeof setInterval>;\n private flushing?: Promise<void>;\n private sequence = 0;\n private inFlight = 0;\n private sent = 0;\n private dropped = 0;\n private destroyed = false;\n\n constructor(options: BrowserErrorLogOptions) {\n this.options = options;\n this.active = options.enabled !== false && typeof window !== 'undefined' && typeof document !== 'undefined';\n this.networkCaptureEnabled = options.captureNetwork !== false && (!options.transport || Boolean(options.endpoint));\n this.navigationCaptureEnabled = options.captureNavigation === true;\n this.maxQueueSize = boundedNumber(options.maxQueueSize, 1, 100, 50);\n this.transportTimeoutMs = boundedNumber(options.transportTimeoutMs, 250, 60_000, 5_000);\n this.destroySignal = new Promise(resolve => { this.resolveDestroy = resolve; });\n if (!this.active) return;\n if (!options.project || typeof options.project !== 'string') throw new Error('project is required');\n if (!options.transport && !options.endpoint) throw new Error('endpoint or transport is required');\n this.endpoint = options.endpoint ? this.absoluteUrl(options.endpoint) : undefined;\n window.addEventListener('error', this.onError);\n window.addEventListener('unhandledrejection', this.onRejection);\n document.addEventListener('visibilitychange', this.onVisibility);\n if (this.networkCaptureEnabled) addNetworkClient(this);\n if (options.captureConsole === true) addConsoleClient(this);\n if (this.navigationCaptureEnabled) addNavigationClient(this);\n this.interval = setInterval(() => { void this.flush(); }, boundedNumber(options.flushIntervalMs, 10, 60_000, 10_000));\n }\n\n captureException(error: unknown, extra: CaptureExtra = {}): void {\n if (!this.active || this.destroyed || isAbort(error)) return;\n try {\n if (error !== null && (typeof error === 'object' || typeof error === 'function')) {\n if (this.seenErrors.has(error)) return;\n }\n const fields = errorFields(error);\n const type = EVENT_TYPES.has(extra.type as EventType) ? extra.type! : 'manual';\n const event = this.makeEvent(type, fields.message, {\n name: fields.name,\n stack: fields.stack,\n componentStack: extra.componentStack,\n context: extra.context,\n });\n if (this.enqueue(event) && error !== null && (typeof error === 'object' || typeof error === 'function')) {\n this.seenErrors.add(error);\n }\n } catch (error) {\n if (error instanceof UrlSanitizationError || error instanceof ContextResolutionError) this.dropped++;\n // Diagnostics must never affect the host app.\n }\n }\n\n reportNetwork(method: string, url: string, status: number | undefined, durationMs: number, failure?: unknown): void {\n if (this.destroyed || !this.active || this.isCollectorUrl(url) || isAbort(failure)) return;\n try {\n if (status !== undefined) {\n const include = this.options.shouldCaptureHttp\n ? this.options.shouldCaptureHttp(status, url, method)\n : status >= 500;\n if (!include) return;\n }\n const network = { method: trim(method || 'GET', 16).toUpperCase(), url, status, durationMs };\n const fields = failure === undefined ? undefined : errorFields(failure);\n const event = this.makeEvent(status === undefined ? 'network' : 'http',\n status === undefined ? (fields?.message || 'Network request failed') : `HTTP ${status}`,\n { name: fields?.name, network });\n this.enqueue(event);\n } catch { this.dropped++; /* a failing hook must not expose an unfiltered event */ }\n }\n\n captureConsole(values: unknown[]): void {\n if (!this.active || this.destroyed) return;\n try {\n const message = values.map(safeString).join(' ');\n let fields: ReturnType<typeof errorFields> | undefined;\n for (const value of values) {\n try {\n if (value instanceof Error) { fields = errorFields(value); break; }\n } catch { /* a hostile value must not suppress the console event */ }\n }\n this.enqueue(this.makeEvent('console', message, { name: fields?.name, stack: fields?.stack }));\n }\n catch { this.dropped++; /* console behavior is never changed by capture */ }\n }\n\n addBreadcrumb(input: BreadcrumbInput): void {\n if (!this.active || this.destroyed) return;\n try {\n const breadcrumb = this.cleanBreadcrumb(input, new Date().toISOString());\n if (!breadcrumb) return;\n this.breadcrumbs.push(breadcrumb);\n this.boundBreadcrumbs(this.breadcrumbs);\n } catch { /* Diagnostics must never affect the host app or error stats. */ }\n }\n\n reportNavigation(fromHref: string, toHref: string, trigger: NavigationTrigger): void {\n if (!this.active || this.destroyed || !this.navigationCaptureEnabled) return;\n try {\n const cleanFrom = this.cleanUrl(fromHref);\n const cleanTo = this.cleanUrl(toHref);\n // cleanUrl's malformed-input fallback is for general diagnostics; navigation only stores valid URLs.\n const fromUrl = new URL(cleanFrom);\n const toUrl = new URL(cleanTo);\n if (![fromUrl.protocol, toUrl.protocol].every(protocol => protocol === 'http:' || protocol === 'https:')) return;\n if (fromUrl.username || fromUrl.password || fromUrl.search || fromUrl.hash ||\n toUrl.username || toUrl.password || toUrl.search || toUrl.hash) return;\n const from = cleanFrom.slice(0, BREADCRUMB_LIMITS.dataString);\n const to = cleanTo.slice(0, BREADCRUMB_LIMITS.dataString);\n if (from === to) return;\n this.breadcrumbs.push({ occurredAt: new Date().toISOString(), category: 'navigation',\n message: 'Navigation', data: { from, to, trigger } });\n this.boundBreadcrumbs(this.breadcrumbs);\n } catch { /* A failing URL hook cannot affect navigation or expose an unfiltered breadcrumb. */ }\n }\n\n clearBreadcrumbs(): void {\n if (!this.active || this.destroyed) return;\n this.breadcrumbs.length = 0;\n }\n\n flush(): Promise<void> {\n if (!this.active || this.destroyed) return Promise.resolve();\n if (this.flushing) return this.flushing;\n this.flushing = this.drain().finally(() => { this.flushing = undefined; });\n return this.flushing;\n }\n\n destroy(): void {\n if (this.destroyed) return;\n this.destroyed = true;\n if (this.interval) clearInterval(this.interval);\n if (this.active) {\n window.removeEventListener('error', this.onError);\n window.removeEventListener('unhandledrejection', this.onRejection);\n document.removeEventListener('visibilitychange', this.onVisibility);\n if (this.networkCaptureEnabled) removeNetworkClient(this);\n if (this.options.captureConsole === true) removeConsoleClient(this);\n if (this.navigationCaptureEnabled) removeNavigationClient(this);\n }\n this.dropped += this.queue.length + this.inFlight;\n this.queue.length = 0;\n this.breadcrumbs.length = 0;\n for (const cancel of this.cancelWaits) cancel();\n for (const controller of this.controllers) controller.abort();\n this.resolveDestroy(DESTROYED);\n }\n\n getStats(): { queued: number; sent: number; dropped: number } {\n return { queued: this.queue.length, sent: this.sent, dropped: this.dropped };\n }\n\n private readonly onError = (event: ErrorEvent): void => {\n try {\n const filename = read(event, 'filename');\n const lineno = read(event, 'lineno');\n const colno = read(event, 'colno');\n const context: Record<string, unknown> = {};\n if (typeof filename === 'string' && filename.trim()) context.filename = this.cleanUrl(filename);\n if (typeof lineno === 'number' && Number.isFinite(lineno) && lineno > 0) context.lineno = lineno;\n if (typeof colno === 'number' && Number.isFinite(colno) && colno > 0) context.colno = colno;\n this.captureException(read(event, 'error') ?? read(event, 'message') ?? 'Script error', {\n type: 'javascript', ...(Object.keys(context).length ? { context } : {}),\n });\n } catch { this.dropped++; /* a failing URL hook must not affect the host app */ }\n };\n\n private readonly onRejection = (event: PromiseRejectionEvent): void => {\n this.captureException(event.reason, { type: 'promise' });\n };\n\n private readonly onVisibility = (): void => {\n if (document.visibilityState === 'hidden') this.tryBeacon();\n };\n\n private absoluteUrl(url: string): string {\n try { return new URL(url, window.location.href).href; }\n catch { return url; }\n }\n\n private isCollectorUrl(url: string): boolean {\n if (!this.endpoint) return false;\n try {\n const request = new URL(url, window.location.href);\n const collector = new URL(this.endpoint, window.location.href);\n return request.origin === collector.origin && request.pathname === collector.pathname;\n } catch { return url === this.endpoint; }\n }\n\n private cleanUrl(input: unknown): string {\n let value = safeString(input);\n if (this.options.sanitizeUrl) {\n try { value = this.options.sanitizeUrl(value); }\n catch { throw new UrlSanitizationError('URL sanitizer failed'); }\n if (typeof value !== 'string' || !value) throw new UrlSanitizationError('URL sanitizer returned no URL');\n }\n try {\n const url = new URL(value, window.location.href);\n if (url.protocol !== 'http:' && url.protocol !== 'https:') return '[unsupported URL]';\n url.username = '';\n url.password = '';\n url.search = '';\n url.hash = '';\n return this.cleanText(url.href, 1024, false);\n } catch { return this.cleanText(value, 1024, false).split(/[?#]/, 1)[0]; }\n }\n\n private cleanText(input: unknown, length: number, replaceUrls = true): string {\n let value = safeString(input);\n if (replaceUrls) {\n value = value.replace(/https?:\\/\\/[^\\s<>\"'()[\\]]+/gi, match => this.cleanUrl(match));\n value = value.replace(/(^|[\\s\"'(\\[=])((?:\\/(?!\\/)|\\.{1,2}\\/)[^\\s<>\"'()[\\]?#]*[?#][^\\s<>\"'()[\\]]+|[a-z][\\w.-]*(?:\\/[^\\s<>\"'()[\\]?#]*)?(?:\\?[a-z0-9_.-]+=[^\\s<>\"'()[\\]]+|#[^\\s<>\"'()[\\]]+)|\\?[a-z0-9_.-]+=[^\\s<>\"'()[\\]]+)/gi,\n (_match, prefix: string, url: string) => {\n const punctuation = /[.,;!]+$/.exec(url)?.[0] ?? '';\n const core = url.slice(0, url.length - punctuation.length);\n const cleaned = this.options.sanitizeUrl\n ? this.cleanUrl(core)\n : core.startsWith('?') ? '[redacted query]' : this.cleanText(core.split(/[?#]/, 1)[0], 1024, false);\n return `${prefix}${cleaned}${punctuation}`;\n });\n }\n return value\n .replace(/\\bBearer\\s+[A-Za-z0-9._~+\\/-]+/gi, 'Bearer [REDACTED]')\n .replace(/[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,}/gi, '[REDACTED_EMAIL]')\n .slice(0, length);\n }\n\n private cleanContext(input: unknown): ErrorEventRecord['context'] {\n if (!input || typeof input !== 'object') return undefined;\n const output: NonNullable<ErrorEventRecord['context']> = {};\n let keys: string[];\n try { keys = Object.keys(input); }\n catch { return undefined; }\n for (const key of keys) {\n if (Object.keys(output).length >= 12) break;\n if (SENSITIVE_KEY.test(key)) continue;\n const value = read(input, key);\n const safeKey = this.cleanText(key, 80);\n if (typeof value === 'string') output[safeKey] = this.cleanText(value, 500);\n else if (typeof value === 'number' && Number.isFinite(value)) output[safeKey] = value;\n else if (typeof value === 'boolean' || value === null) output[safeKey] = value;\n }\n return Object.keys(output).length ? output : undefined;\n }\n\n private cleanBreadcrumb(input: unknown, timestamp?: string): Breadcrumb | undefined {\n if (!input || typeof input !== 'object') return undefined;\n const occurredAt = timestamp ?? read(input, 'occurredAt');\n if (typeof occurredAt !== 'string') return undefined;\n try { if (new Date(occurredAt).toISOString() !== occurredAt) return undefined; }\n catch { return undefined; }\n const rawCategory = read(input, 'category');\n const rawMessage = read(input, 'message');\n if ((rawCategory !== undefined && typeof rawCategory !== 'string') || typeof rawMessage !== 'string') return undefined;\n const category = this.cleanText(rawCategory ?? (timestamp ? 'manual' : ''), BREADCRUMB_LIMITS.category);\n const message = this.cleanText(rawMessage, BREADCRUMB_LIMITS.message);\n if (!category.trim() || !message.trim()) return undefined;\n const rawData = read(input, 'data');\n const data: NonNullable<Breadcrumb['data']> = {};\n if (rawData && typeof rawData === 'object') {\n let keys: string[];\n try { keys = Object.keys(rawData); }\n catch { keys = []; }\n for (const key of keys) {\n if (Object.keys(data).length >= BREADCRUMB_LIMITS.dataKeys) break;\n if (SENSITIVE_KEY.test(key)) continue;\n const safeKey = this.cleanText(key, BREADCRUMB_LIMITS.dataKey);\n const value = read(rawData, key);\n if (typeof value === 'string') data[safeKey] = this.cleanText(value, BREADCRUMB_LIMITS.dataString);\n else if (typeof value === 'number' && Number.isFinite(value)) data[safeKey] = value;\n else if (typeof value === 'boolean' || value === null) data[safeKey] = value;\n }\n }\n return { occurredAt, category, message, ...(Object.keys(data).length ? { data } : {}) };\n }\n\n private boundBreadcrumbs(trail: Breadcrumb[]): void {\n while (trail.length > BREADCRUMB_LIMITS.count || byteLength(JSON.stringify(trail)) > BREADCRUMB_LIMITS.bytes) trail.shift();\n }\n\n private cleanBreadcrumbTrail(input: unknown): Breadcrumb[] | undefined {\n let length: number;\n try {\n if (!Array.isArray(input)) return undefined;\n length = input.length;\n } catch { return undefined; }\n if (!Number.isSafeInteger(length) || length < 0) return undefined;\n const trail: Breadcrumb[] = [];\n for (let index = Math.max(0, length - BREADCRUMB_LIMITS.count); index < length; index++) {\n const breadcrumb = this.cleanBreadcrumb(read(input, index));\n if (breadcrumb) {\n trail.push(breadcrumb);\n this.boundBreadcrumbs(trail);\n }\n }\n return trail.length ? trail : undefined;\n }\n\n private cleanNetwork(input: unknown): ErrorEventRecord['network'] {\n if (!input || typeof input !== 'object') return undefined;\n const rawStatus = read(input, 'status');\n const status = typeof rawStatus === 'number' && Number.isInteger(rawStatus) && rawStatus >= 100 && rawStatus <= 599\n ? rawStatus : undefined;\n return {\n method: this.cleanText(read(input, 'method') ?? 'GET', 16).toUpperCase(),\n url: this.cleanUrl(read(input, 'url') ?? ''),\n ...(status === undefined ? {} : { status }),\n durationMs: boundedNumber(read(input, 'durationMs'), 0, 3_600_000, 0),\n };\n }\n\n private makeEvent(type: EventType, message: string, extra: {\n name?: string; stack?: string; componentStack?: string;\n context?: unknown; network?: unknown;\n } = {}): ErrorEventRecord {\n const userAgent = read(navigator, 'userAgent');\n const eventContext = this.cleanContext(extra.context);\n let resolved: unknown;\n try { resolved = this.options.getContext?.(); }\n catch { throw new ContextResolutionError('Context resolver failed'); }\n const dynamicContext = this.cleanContext(resolved);\n const defaults = this.cleanContext(this.options.context);\n let context = eventContext;\n if (dynamicContext || defaults) {\n context = { ...eventContext };\n for (const fields of [dynamicContext, defaults]) {\n if (!fields) continue;\n for (const key of Object.keys(fields)) {\n if (Object.keys(context).length >= 12) break;\n if (!Object.prototype.hasOwnProperty.call(context, key)) context[key] = fields[key];\n }\n }\n }\n const network = this.cleanNetwork(extra.network);\n return {\n schemaVersion: 1,\n eventId: newId(),\n project: this.cleanText(this.options.project, 80),\n environment: this.cleanText(this.options.environment ?? 'development', 80),\n release: this.cleanText(this.options.release ?? 'unknown', 120),\n sdkVersion: '0.1.17',\n occurredAt: new Date().toISOString(),\n viewId: this.viewId,\n sequence: ++this.sequence,\n elapsedMs: boundedNumber(now() - this.startedAt, 0, 3_600_000, 0),\n type,\n message: this.cleanText(message, 1024),\n ...(extra.name === undefined ? {} : { name: this.cleanText(extra.name, 100) }),\n ...(extra.stack === undefined ? {} : { stack: this.cleanText(extra.stack, 4096) }),\n ...(extra.componentStack === undefined ? {} : { componentStack: this.cleanText(extra.componentStack, 2048) }),\n page: this.cleanUrl(window.location.href),\n runtime: RUNTIMES.has(this.options.runtime as Runtime) ? this.options.runtime! : 'browser',\n ...(typeof userAgent === 'string' ? { browser: this.cleanText(userAgent, 300) } : {}),\n ...(context ? { context } : {}),\n ...(this.breadcrumbs.length ? { breadcrumbs: this.breadcrumbs.map(crumb => ({\n ...crumb, ...(crumb.data ? { data: { ...crumb.data } } : {}),\n })) } : {}),\n ...(network ? { network } : {}),\n };\n }\n\n private sanitizeReplacement(candidate: unknown, base: ErrorEventRecord): ErrorEventRecord {\n const type = read(candidate, 'type');\n const runtime = read(candidate, 'runtime');\n const name = read(candidate, 'name');\n const stack = read(candidate, 'stack');\n const componentStack = read(candidate, 'componentStack');\n const browser = read(candidate, 'browser');\n const context = this.cleanContext(read(candidate, 'context'));\n const breadcrumbs = this.cleanBreadcrumbTrail(read(candidate, 'breadcrumbs'));\n const network = this.cleanNetwork(read(candidate, 'network'));\n return {\n ...base,\n type: EVENT_TYPES.has(type as EventType) ? type as EventType : base.type,\n message: this.cleanText(read(candidate, 'message') ?? base.message, 1024),\n ...(name === undefined ? { name: base.name } : { name: this.cleanText(name, 100) }),\n ...(stack === undefined ? { stack: base.stack } : { stack: this.cleanText(stack, 4096) }),\n ...(componentStack === undefined ? { componentStack: base.componentStack } : { componentStack: this.cleanText(componentStack, 2048) }),\n page: this.cleanUrl(read(candidate, 'page') ?? base.page),\n runtime: RUNTIMES.has(runtime as Runtime) ? runtime as Runtime : base.runtime,\n ...(browser === undefined ? { browser: base.browser } : { browser: this.cleanText(browser, 300) }),\n ...(context ? { context } : { context: undefined }),\n ...(breadcrumbs ? { breadcrumbs } : { breadcrumbs: undefined }),\n ...(network ? { network } : { network: undefined }),\n };\n }\n\n private enqueue(event: ErrorEventRecord): boolean {\n if (this.destroyed) return false;\n let finalEvent = event;\n if (this.options.beforeSend) {\n try {\n const copy = { ...event, context: event.context && { ...event.context },\n breadcrumbs: event.breadcrumbs?.map(crumb => ({ ...crumb, data: crumb.data && { ...crumb.data } })),\n network: event.network && { ...event.network } };\n const result = this.options.beforeSend(copy);\n if (result === false || result === null) return false;\n finalEvent = this.sanitizeReplacement(result === undefined ? copy : result, event);\n } catch { this.dropped++; return false; }\n }\n // A single event can never make a batch exceed its byte budget.\n if (byteLength(JSON.stringify(finalEvent)) > MAX_BATCH_BYTES) { this.dropped++; return false; }\n if (this.queue.length >= this.maxQueueSize) { this.queue.shift(); this.dropped++; }\n this.queue.push(finalEvent);\n if (this.queue.length >= this.maxQueueSize) void this.flush();\n return true;\n }\n\n private takeBatch(maxEvents = MAX_BATCH_EVENTS, maxBytes = MAX_BATCH_BYTES): EventBatch {\n const events: ErrorEventRecord[] = [];\n let bytes = byteLength('{\"schemaVersion\":1,\"events\":[]}');\n while (this.queue.length && events.length < maxEvents) {\n const next = this.queue[0];\n const size = byteLength(JSON.stringify(next)) + (events.length ? 1 : 0);\n if (events.length && bytes + size > maxBytes) break;\n if (!events.length && bytes + size > maxBytes) { this.queue.shift(); this.dropped++; continue; }\n events.push(this.queue.shift()!);\n bytes += size;\n }\n return { schemaVersion: 1, events };\n }\n\n private async drain(): Promise<void> {\n while (!this.destroyed && this.queue.length) {\n const batch = this.takeBatch();\n if (batch.events.length) {\n this.inFlight += batch.events.length;\n try { await this.sendWithRetry(batch); }\n finally { this.inFlight -= batch.events.length; }\n }\n }\n }\n\n private async sendWithRetry(batch: EventBatch): Promise<void> {\n for (let attempt = 0; attempt <= RETRY_DELAYS_MS.length && !this.destroyed; attempt++) {\n const controller = new AbortController();\n this.controllers.add(controller);\n let timeoutHandle: ReturnType<typeof setTimeout> | undefined;\n const timeout = new Promise<never>((_resolve, reject) => {\n timeoutHandle = setTimeout(() => {\n controller.abort();\n reject(new Error('Collector transport timed out'));\n }, this.transportTimeoutMs);\n });\n let retryDelay: number | undefined;\n try {\n const result = await Promise.race([this.send(batch, controller.signal), timeout, this.destroySignal]);\n if (result === DESTROYED || this.destroyed) return;\n this.sent += batch.events.length;\n return;\n } catch (error) {\n if (this.destroyed) return;\n const status = read(error, 'status');\n const retryable = typeof status !== 'number' || status === 429 || status >= 500;\n if (!retryable || attempt === RETRY_DELAYS_MS.length) break;\n retryDelay = RETRY_DELAYS_MS[attempt];\n } finally {\n if (timeoutHandle) clearTimeout(timeoutHandle);\n this.controllers.delete(controller);\n }\n if (retryDelay !== undefined) await this.wait(retryDelay);\n }\n if (!this.destroyed) this.dropped += batch.events.length;\n }\n\n private async send(batch: EventBatch, signal: AbortSignal): Promise<void> {\n if (this.options.transport) { await this.options.transport(batch, { signal }); return; }\n const response = await window.fetch(this.endpoint!, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(batch),\n credentials: 'omit',\n signal,\n });\n if (!response.ok) throw new HttpDeliveryError(response.status);\n }\n\n private wait(milliseconds: number): Promise<void> {\n return new Promise(resolve => {\n const finish = () => { clearTimeout(timer); this.cancelWaits.delete(finish); resolve(); };\n const timer = setTimeout(finish, milliseconds);\n this.cancelWaits.add(finish);\n });\n }\n\n private tryBeacon(): void {\n if (this.destroyed || this.options.transport || !this.endpoint || !this.queue.length) return;\n try {\n const url = new URL(this.endpoint);\n if (url.origin !== window.location.origin || url.search || url.hash || url.username || url.password) return;\n if (typeof navigator.sendBeacon !== 'function') return;\n const candidates = this.queue.slice(0, MAX_BEACON_EVENTS);\n while (candidates.length > 0) {\n const batch: EventBatch = { schemaVersion: 1, events: candidates };\n const body = JSON.stringify(batch);\n if (byteLength(body) <= MAX_BEACON_BYTES) {\n if (navigator.sendBeacon(this.endpoint, new Blob([body], { type: 'application/json' }))) {\n this.queue.splice(0, candidates.length);\n this.sent += candidates.length;\n }\n return;\n }\n candidates.pop();\n }\n } catch { /* best effort only */ }\n }\n}\n\nconst DESTROYED = Symbol('destroyed');\n\ninterface Instrumentation {\n clients: Set<Client>;\n cleanup(): void;\n}\n\nlet networkInstrumentation: Instrumentation | undefined;\nlet consoleInstrumentation: Instrumentation | undefined;\nlet navigationInstrumentation: Instrumentation | undefined;\n\ntype NavigationTrigger = 'pushState' | 'replaceState' | 'popstate' | 'hashchange';\n\nfunction addNavigationClient(client: Client): void {\n if (!navigationInstrumentation) navigationInstrumentation = installNavigation();\n navigationInstrumentation?.clients.add(client);\n}\n\nfunction removeNavigationClient(client: Client): void {\n const instrumentation = navigationInstrumentation;\n if (!instrumentation) return;\n instrumentation.clients.delete(client);\n if (!instrumentation.clients.size) {\n instrumentation.cleanup();\n navigationInstrumentation = undefined;\n }\n}\n\nfunction inheritedHistoryDescriptor(historyObject: History, key: 'pushState' | 'replaceState'): PropertyDescriptor | undefined {\n const seen = new Set<object>();\n let prototype = Object.getPrototypeOf(historyObject);\n while (prototype && !seen.has(prototype)) {\n seen.add(prototype);\n const descriptor = Object.getOwnPropertyDescriptor(prototype, key);\n if (descriptor) return descriptor;\n prototype = Object.getPrototypeOf(prototype);\n }\n return undefined;\n}\n\nfunction installNavigation(): Instrumentation | undefined {\n let historyObject: History;\n let lastHref: string;\n let originalPush: History['pushState'];\n let originalReplace: History['replaceState'];\n let ownPush: PropertyDescriptor | undefined;\n let ownReplace: PropertyDescriptor | undefined;\n let inheritedPush: PropertyDescriptor | undefined;\n let inheritedReplace: PropertyDescriptor | undefined;\n try {\n historyObject = window.history;\n lastHref = window.location.href;\n ownPush = Object.getOwnPropertyDescriptor(historyObject, 'pushState');\n ownReplace = Object.getOwnPropertyDescriptor(historyObject, 'replaceState');\n inheritedPush = ownPush ? undefined : inheritedHistoryDescriptor(historyObject, 'pushState');\n inheritedReplace = ownReplace ? undefined : inheritedHistoryDescriptor(historyObject, 'replaceState');\n if ((ownPush && !('value' in ownPush)) || (ownReplace && !('value' in ownReplace))) return undefined;\n if ((!ownPush && (!inheritedPush || !('value' in inheritedPush) || inheritedPush.writable !== true)) ||\n (!ownReplace && (!inheritedReplace || !('value' in inheritedReplace) || inheritedReplace.writable !== true))) return undefined;\n originalPush = ownPush ? ownPush.value : historyObject.pushState;\n originalReplace = ownReplace ? ownReplace.value : historyObject.replaceState;\n if (typeof originalPush !== 'function' || typeof originalReplace !== 'function') return undefined;\n const canInstall = (own?: PropertyDescriptor) => own\n ? own.configurable === true || own.writable === true\n : Object.isExtensible(historyObject);\n if (!canInstall(ownPush) || !canInstall(ownReplace)) return undefined;\n } catch { return undefined; }\n\n const clients = new Set<Client>();\n const report = (trigger: NavigationTrigger): void => {\n try {\n const toHref = window.location.href;\n if (toHref === lastHref) return;\n const fromHref = lastHref;\n lastHref = toHref;\n for (const client of clients) {\n try { client.reportNavigation(fromHref, toHref, trigger); }\n catch { /* Telemetry must never alter a successful native call. */ }\n }\n } catch { /* Location can be unavailable in a restricted host. */ }\n };\n const wrappedPush: History['pushState'] = function (this: History, ...args: Parameters<History['pushState']>): void {\n const result = Reflect.apply(originalPush, this, args);\n report('pushState');\n return result;\n };\n const wrappedReplace: History['replaceState'] = function (this: History, ...args: Parameters<History['replaceState']>): void {\n const result = Reflect.apply(originalReplace, this, args);\n report('replaceState');\n return result;\n };\n const onPopState = () => { report('popstate'); };\n const onHashChange = () => { report('hashchange'); };\n const restore = (key: 'pushState' | 'replaceState', wrapper: History['pushState'], own?: PropertyDescriptor): void => {\n try {\n const current = Object.getOwnPropertyDescriptor(historyObject, key);\n if (!current || !('value' in current) || current.value !== wrapper) return;\n if (own) Object.defineProperty(historyObject, key, own);\n else Reflect.deleteProperty(historyObject, key);\n } catch { /* Keep a host-installed replacement and never throw during cleanup. */ }\n };\n let pushInstalled = false;\n let replaceInstalled = false;\n try {\n Object.defineProperty(historyObject, 'pushState', { configurable: ownPush?.configurable ?? true,\n enumerable: ownPush?.enumerable ?? false, writable: ownPush?.writable ?? true, value: wrappedPush });\n pushInstalled = true;\n Object.defineProperty(historyObject, 'replaceState', { configurable: ownReplace?.configurable ?? true,\n enumerable: ownReplace?.enumerable ?? false, writable: ownReplace?.writable ?? true, value: wrappedReplace });\n replaceInstalled = true;\n window.addEventListener('popstate', onPopState);\n window.addEventListener('hashchange', onHashChange);\n } catch {\n try { window.removeEventListener('hashchange', onHashChange); } catch { /* best effort */ }\n try { window.removeEventListener('popstate', onPopState); } catch { /* best effort */ }\n if (replaceInstalled) restore('replaceState', wrappedReplace, ownReplace);\n if (pushInstalled) restore('pushState', wrappedPush, ownPush);\n return undefined;\n }\n return { clients, cleanup() {\n try { window.removeEventListener('popstate', onPopState); } catch { /* best effort */ }\n try { window.removeEventListener('hashchange', onHashChange); } catch { /* best effort */ }\n restore('pushState', wrappedPush, ownPush);\n restore('replaceState', wrappedReplace, ownReplace);\n } };\n}\n\nfunction addNetworkClient(client: Client): void {\n if (!networkInstrumentation) networkInstrumentation = installNetwork();\n networkInstrumentation.clients.add(client);\n}\n\nfunction removeNetworkClient(client: Client): void {\n const instrumentation = networkInstrumentation;\n if (!instrumentation) return;\n instrumentation.clients.delete(client);\n if (!instrumentation.clients.size) {\n instrumentation.cleanup();\n networkInstrumentation = undefined;\n }\n}\n\nfunction describeFetch(input: RequestInfo | URL, init?: RequestInit): { url: string; method: string; signal?: AbortSignal | null } {\n let requestUrl: string | undefined;\n if (typeof Request !== 'undefined' && input !== null && typeof input === 'object') {\n if (input instanceof Request) requestUrl = read(input, 'url') as string | undefined;\n else {\n try { requestUrl = Object.getOwnPropertyDescriptor(Request.prototype, 'url')?.get?.call(input); }\n catch { /* not a genuine Request */ }\n }\n }\n const initSignal = read(init, 'signal');\n return {\n url: requestUrl ?? safeString(input),\n method: safeString(read(init, 'method') ?? (requestUrl === undefined ? undefined : read(input, 'method')) ?? 'GET'),\n signal: (initSignal === undefined ? (requestUrl === undefined ? undefined : read(input, 'signal')) : initSignal) as AbortSignal | null | undefined,\n };\n}\n\nfunction installNetwork(): Instrumentation {\n const clients = new Set<Client>();\n const originalFetch = window.fetch;\n let wrappedFetch: typeof fetch | undefined;\n if (typeof originalFetch === 'function') {\n wrappedFetch = function (this: typeof window, ...args: Parameters<typeof fetch>): ReturnType<typeof fetch> {\n if (!clients.size) return Reflect.apply(originalFetch, this, args);\n const started = now();\n let request: ReturnType<typeof describeFetch>;\n try { request = describeFetch(args[0], args[1]); }\n catch { request = { url: '', method: 'GET' }; }\n let promise: ReturnType<typeof fetch>;\n try { promise = Reflect.apply(originalFetch, this, args); }\n catch (error) {\n if (!isAbort(error, request.signal)) for (const client of clients) client.reportNetwork(request.method, request.url, undefined, now() - started, error);\n throw error;\n }\n return promise.then(\n response => {\n try {\n const status = response.status;\n for (const client of clients) client.reportNetwork(request.method, request.url, status, now() - started);\n } catch { /* telemetry cannot change the fetch result */ }\n return response;\n },\n error => {\n if (!isAbort(error, request.signal)) for (const client of clients) client.reportNetwork(request.method, request.url, undefined, now() - started, error);\n throw error;\n },\n );\n };\n window.fetch = wrappedFetch;\n }\n\n const prototype = typeof XMLHttpRequest === 'undefined' ? undefined : XMLHttpRequest.prototype;\n const originalOpen = prototype?.open;\n const originalSend = prototype?.send;\n const metadata = new WeakMap<XMLHttpRequest, { method: string; url: string }>();\n const pending = new WeakMap<XMLHttpRequest, () => void>();\n let wrappedOpen: typeof XMLHttpRequest.prototype.open | undefined;\n let wrappedSend: typeof XMLHttpRequest.prototype.send | undefined;\n if (prototype && originalOpen && originalSend) {\n wrappedOpen = (function (this: XMLHttpRequest, ...args: unknown[]): void {\n const result = Reflect.apply(originalOpen, this, args);\n pending.get(this)?.();\n try { metadata.set(this, { method: safeString(args[0]), url: safeString(args[1]) }); }\n catch { /* native open already succeeded */ }\n return result;\n }) as typeof XMLHttpRequest.prototype.open;\n wrappedSend = function (this: XMLHttpRequest, ...args: Parameters<XMLHttpRequest['send']>): void {\n if (!clients.size) return Reflect.apply(originalSend, this, args);\n const details = metadata.get(this);\n if (!details) return Reflect.apply(originalSend, this, args);\n const started = now();\n let aborted = false;\n let failed = false;\n let completed = false;\n const onAbort = () => { aborted = true; };\n const onFailure = () => { failed = true; };\n const cleanup = () => {\n this.removeEventListener('abort', onAbort);\n this.removeEventListener('error', onFailure);\n this.removeEventListener('timeout', onFailure);\n this.removeEventListener('loadend', onLoadEnd);\n if (pending.get(this) === cleanup) pending.delete(this);\n };\n const onLoadEnd = () => {\n completed = true;\n cleanup();\n if (aborted) return;\n try {\n const status = this.status;\n if (status === 0 && !failed) return;\n for (const client of clients) client.reportNetwork(details.method, details.url,\n status === 0 ? undefined : status, now() - started);\n } catch { /* XHR state may be unavailable */ }\n };\n try {\n this.addEventListener('abort', onAbort);\n this.addEventListener('error', onFailure);\n this.addEventListener('timeout', onFailure);\n this.addEventListener('loadend', onLoadEnd);\n } catch {\n cleanup();\n return Reflect.apply(originalSend, this, args);\n }\n try {\n const result = Reflect.apply(originalSend, this, args);\n if (!completed) pending.set(this, cleanup);\n return result;\n }\n catch (error) {\n cleanup();\n throw error;\n }\n };\n prototype.open = wrappedOpen!;\n prototype.send = wrappedSend;\n }\n return {\n clients,\n cleanup() {\n if (wrappedFetch && window.fetch === wrappedFetch) window.fetch = originalFetch;\n if (prototype && wrappedOpen && prototype.open === wrappedOpen) prototype.open = originalOpen!;\n if (prototype && wrappedSend && prototype.send === wrappedSend) prototype.send = originalSend!;\n },\n };\n}\n\nfunction addConsoleClient(client: Client): void {\n if (!consoleInstrumentation) consoleInstrumentation = installConsole();\n consoleInstrumentation.clients.add(client);\n}\n\nfunction removeConsoleClient(client: Client): void {\n const instrumentation = consoleInstrumentation;\n if (!instrumentation) return;\n instrumentation.clients.delete(client);\n if (!instrumentation.clients.size) {\n instrumentation.cleanup();\n consoleInstrumentation = undefined;\n }\n}\n\nfunction installConsole(): Instrumentation {\n const clients = new Set<Client>();\n const original = console.error;\n const wrapped: typeof console.error = function (this: Console, ...values: unknown[]): void {\n try { return Reflect.apply(original, this, values); }\n finally { for (const client of clients) client.captureConsole(values); }\n };\n console.error = wrapped;\n return { clients, cleanup() { if (console.error === wrapped) console.error = original; } };\n}\n\nexport function init(options: BrowserErrorLogOptions): BrowserErrorLogBreadcrumbClient {\n return new Client(options);\n}\n", "export const SCHEMA_VERSION = 1 as const;\nexport const SDK_VERSION = '0.1.17';\n\nexport type EventType = 'javascript' | 'promise' | 'react' | 'console' | 'http' | 'network' | 'manual';\nexport type Runtime = 'browser' | 'webview-ios' | 'webview-android' | 'unknown';\n\nexport const BREADCRUMB_LIMITS = {\n count: 20, bytes: 12_000, category: 40, message: 256,\n dataKeys: 6, dataKey: 80, dataString: 200,\n} as const;\n\nexport interface Breadcrumb {\n occurredAt: string;\n category: string;\n message: string;\n data?: Record<string, string | number | boolean | null>;\n}\n\n/** Validates the bounded, canonical UTC breadcrumb representation on the wire. */\nexport function isBreadcrumbTrail(value: unknown): value is Breadcrumb[] {\n try {\n if (!Array.isArray(value) || value.length > BREADCRUMB_LIMITS.count) return false;\n for (const item of value) {\n if (!item || typeof item !== 'object' || Array.isArray(item)) return false;\n if (Object.keys(item).some(key => !['occurredAt', 'category', 'message', 'data'].includes(key))) return false;\n if (typeof item.occurredAt !== 'string' || !Number.isFinite(Date.parse(item.occurredAt)) ||\n new Date(item.occurredAt).toISOString() !== item.occurredAt) return false;\n if (typeof item.category !== 'string' || !item.category.trim() || item.category.length > BREADCRUMB_LIMITS.category ||\n typeof item.message !== 'string' || !item.message.trim() || item.message.length > BREADCRUMB_LIMITS.message) return false;\n if (item.data !== undefined) {\n if (!item.data || typeof item.data !== 'object' || Array.isArray(item.data)) return false;\n const entries = Object.entries(item.data);\n if (entries.length > BREADCRUMB_LIMITS.dataKeys || entries.some(([key, field]) =>\n key.length > BREADCRUMB_LIMITS.dataKey || !(field === null || typeof field === 'boolean' ||\n (typeof field === 'string' && field.length <= BREADCRUMB_LIMITS.dataString) ||\n (typeof field === 'number' && Number.isFinite(field))))) return false;\n }\n }\n return new TextEncoder().encode(JSON.stringify(value)).length <= BREADCRUMB_LIMITS.bytes;\n } catch { return false; }\n}\n\nexport interface ErrorEventRecord {\n schemaVersion: 1;\n eventId: string;\n project: string;\n environment: string;\n release: string;\n sdkVersion: string;\n occurredAt: string;\n receivedAt?: string;\n viewId: string;\n sequence: number;\n elapsedMs: number;\n type: EventType;\n message: string;\n name?: string;\n stack?: string;\n componentStack?: string;\n page: string;\n runtime: Runtime;\n browser?: string;\n context?: Record<string, string | number | boolean | null>;\n breadcrumbs?: Breadcrumb[];\n network?: { method: string; url: string; status?: number; durationMs: number };\n}\n\nexport interface EventBatch { schemaVersion: 1; events: ErrorEventRecord[] }\nexport interface EventFilter {\n project?: string;\n environment?: string;\n type?: EventType;\n query?: string;\n from?: string;\n to?: string;\n cursor?: string;\n limit?: number;\n}\nexport interface EventPage { events: ErrorEventRecord[]; nextCursor?: string }\nexport interface EventDataSource {\n listEvents(filter: EventFilter, signal?: AbortSignal): Promise<EventPage>;\n getEvent(project: string, eventId: string, signal?: AbortSignal): Promise<ErrorEventRecord | null>;\n}\n\nexport const EVENT_LABELS: Record<EventType, string> = {\n javascript: 'JavaScript', promise: 'Promise', react: 'React', console: 'Console',\n http: 'HTTP error', network: 'Network failure', manual: 'Manual',\n};\n"],
5
- "mappings": "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",
6
- "names": ["index_exports", "__export", "init", "__toCommonJS", "BREADCRUMB_LIMITS", "MAX_BATCH_EVENTS", "MAX_BATCH_BYTES", "MAX_BEACON_EVENTS", "MAX_BEACON_BYTES", "RETRY_DELAYS_MS", "SENSITIVE_KEY", "EVENT_TYPES", "RUNTIMES", "fallbackId", "read", "object", "key", "safeString", "value", "trim", "length", "now", "newId", "isAbort", "error", "signal", "errorFields", "message", "name", "stack", "byteLength", "boundedNumber", "minimum", "maximum", "fallback", "HttpDeliveryError", "status", "__publicField", "UrlSanitizationError", "ContextResolutionError", "Client", "options", "event", "filename", "lineno", "colno", "context", "resolve", "addNetworkClient", "addConsoleClient", "addNavigationClient", "extra", "fields", "type", "method", "url", "durationMs", "failure", "network", "values", "input", "breadcrumb", "fromHref", "toHref", "trigger", "cleanFrom", "cleanTo", "fromUrl", "toUrl", "protocol", "from", "BREADCRUMB_LIMITS", "to", "removeNetworkClient", "removeConsoleClient", "removeNavigationClient", "cancel", "controller", "DESTROYED", "request", "collector", "replaceUrls", "match", "_match", "prefix", "punctuation", "core", "cleaned", "output", "keys", "safeKey", "timestamp", "occurredAt", "rawCategory", "rawMessage", "category", "rawData", "data", "trail", "index", "rawStatus", "userAgent", "eventContext", "resolved", "dynamicContext", "defaults", "crumb", "candidate", "base", "runtime", "componentStack", "browser", "breadcrumbs", "finalEvent", "copy", "result", "maxEvents", "maxBytes", "events", "bytes", "next", "size", "batch", "attempt", "timeoutHandle", "timeout", "_resolve", "reject", "retryDelay", "response", "milliseconds", "finish", "timer", "candidates", "body", "networkInstrumentation", "consoleInstrumentation", "navigationInstrumentation", "client", "installNavigation", "instrumentation", "inheritedHistoryDescriptor", "historyObject", "seen", "prototype", "descriptor", "lastHref", "originalPush", "originalReplace", "ownPush", "ownReplace", "inheritedPush", "inheritedReplace", "canInstall", "own", "clients", "report", "wrappedPush", "args", "wrappedReplace", "onPopState", "onHashChange", "restore", "wrapper", "current", "pushInstalled", "replaceInstalled", "installNetwork", "describeFetch", "init", "requestUrl", "initSignal", "originalFetch", "wrappedFetch", "started", "promise", "originalOpen", "originalSend", "metadata", "pending", "wrappedOpen", "wrappedSend", "details", "aborted", "failed", "completed", "onAbort", "onFailure", "cleanup", "onLoadEnd", "installConsole", "original", "wrapped"]
4
+ "sourcesContent": ["import { BREADCRUMB_LIMITS, type Breadcrumb, type ErrorEventRecord, type EventBatch, type EventType, type Runtime } from '@ihyeon/browser-error-log-protocol';\n\nexport type { Breadcrumb, ErrorEventRecord, EventBatch } from '@ihyeon/browser-error-log-protocol';\n\nexport interface CaptureExtra {\n type?: EventType;\n context?: Record<string, unknown>;\n componentStack?: string;\n}\n\nexport interface TransportContext { signal: AbortSignal }\n\nexport interface BrowserErrorLogOptions {\n project: string;\n environment?: string;\n release?: string;\n /** Scalar metadata added to every captured event; event context takes precedence. */\n context?: Record<string, unknown>;\n /** Returns scalar metadata from current application state for each new event. */\n getContext?: () => Record<string, unknown> | undefined;\n endpoint?: string;\n transport?: (batch: EventBatch, context: TransportContext) => void | Promise<void>;\n runtime?: Runtime;\n enabled?: boolean;\n captureConsole?: boolean;\n /** Records sanitized History navigation breadcrumbs; defaults to false. */\n captureNavigation?: boolean;\n /** Defaults to true. With a custom transport, automatic network capture requires endpoint for collector exclusion. */\n captureNetwork?: boolean;\n /** Records sanitized fetch/XHR completion breadcrumbs; defaults to false. Custom transports require endpoint. */\n captureNetworkBreadcrumbs?: boolean;\n beforeSend?: (event: ErrorEventRecord) => ErrorEventRecord | false | null | void;\n sanitizeUrl?: (url: string) => string;\n shouldCaptureHttp?: (status: number, url: string, method: string) => boolean;\n flushIntervalMs?: number;\n maxQueueSize?: number;\n /** Maximum new events admitted in any rolling 60 seconds; disabled by default. */\n maxEventsPerMinute?: number;\n /** Per-attempt deadline, clamped to 250\u201360000 ms; defaults to 5000 ms. */\n transportTimeoutMs?: number;\n}\n\nexport interface BrowserErrorLogClient {\n captureException(error: unknown, extra?: CaptureExtra): void;\n flush(): Promise<void>;\n destroy(): void;\n getStats(): { queued: number; sent: number; dropped: number };\n}\n\nexport interface BreadcrumbInput {\n message: string;\n category?: string;\n data?: Record<string, unknown>;\n}\n\nexport interface BrowserErrorLogBreadcrumbClient extends BrowserErrorLogClient {\n addBreadcrumb(input: BreadcrumbInput): void;\n clearBreadcrumbs(): void;\n}\n\nconst MAX_BATCH_EVENTS = 20;\nconst MAX_BATCH_BYTES = 48_000;\nconst MAX_BEACON_EVENTS = 10;\nconst MAX_BEACON_BYTES = 24_000;\nconst RETRY_DELAYS_MS = [250, 500];\nconst SENSITIVE_KEY = /(?:password|passwd|token|secret|authorization|cookie|session|api.?key|credential|bearer|private.?key)/i;\nconst EVENT_TYPES = new Set<EventType>(['javascript', 'promise', 'react', 'console', 'http', 'network', 'manual']);\nconst RUNTIMES = new Set<Runtime>(['browser', 'webview-ios', 'webview-android', 'unknown']);\nlet fallbackId = 0;\n\nfunction read(object: unknown, key: PropertyKey): unknown {\n try { return object == null ? undefined : Reflect.get(Object(object), key); }\n catch { return undefined; }\n}\n\nfunction safeString(value: unknown): string {\n try { return String(value); }\n catch { return '[unavailable]'; }\n}\n\nfunction trim(value: unknown, length: number): string {\n return safeString(value).slice(0, length);\n}\n\nfunction now(): number {\n try { return performance.now(); }\n catch { return Date.now(); }\n}\n\nfunction newId(): string {\n try {\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') return crypto.randomUUID();\n } catch { /* fall through */ }\n return `${Date.now().toString(36)}-${(++fallbackId).toString(36)}-${Math.random().toString(36).slice(2, 10)}`;\n}\n\nfunction isAbort(error: unknown, signal?: AbortSignal | null): boolean {\n try { if (signal?.aborted) return true; }\n catch { /* ignore hostile signal */ }\n return read(error, 'name') === 'AbortError' || read(error, 'code') === 20;\n}\n\nfunction errorFields(error: unknown): { message: string; name?: string; stack?: string } {\n if (error === null || error === undefined) return { message: 'Unknown error' };\n const message = read(error, 'message');\n const name = read(error, 'name');\n const stack = read(error, 'stack');\n return {\n message: message == null ? safeString(error) : safeString(message),\n ...(name == null ? {} : { name: safeString(name) }),\n ...(stack == null ? {} : { stack: safeString(stack) }),\n };\n}\n\nfunction byteLength(value: string): number {\n return new TextEncoder().encode(value).length;\n}\n\nfunction boundedNumber(value: unknown, minimum: number, maximum: number, fallback: number): number {\n return typeof value === 'number' && Number.isFinite(value)\n ? Math.min(maximum, Math.max(minimum, Math.floor(value)))\n : fallback;\n}\n\nclass HttpDeliveryError extends Error {\n constructor(readonly status: number) { super(`Collector responded ${status}`); }\n}\n\nclass UrlSanitizationError extends Error {}\n\nclass ContextResolutionError extends Error {}\n\nclass Client implements BrowserErrorLogBreadcrumbClient {\n private readonly active: boolean;\n private readonly endpoint?: string;\n private readonly options: BrowserErrorLogOptions;\n private readonly networkCaptureEnabled: boolean;\n private readonly networkBreadcrumbCaptureEnabled: boolean;\n private readonly navigationCaptureEnabled: boolean;\n private readonly transportTimeoutMs: number;\n private readonly startedAt = now();\n private readonly viewId = newId();\n private readonly seenErrors = new WeakSet<object>();\n private readonly queue: ErrorEventRecord[] = [];\n private readonly breadcrumbs: Breadcrumb[] = [];\n private readonly maxQueueSize: number;\n private readonly maxEventsPerMinute?: number;\n private readonly admittedAt: number[] = [];\n private readonly cancelWaits = new Set<() => void>();\n private readonly controllers = new Set<AbortController>();\n private readonly destroySignal: Promise<symbol>;\n private resolveDestroy!: (value: symbol) => void;\n private interval?: ReturnType<typeof setInterval>;\n private flushing?: Promise<void>;\n private sequence = 0;\n private inFlight = 0;\n private sent = 0;\n private dropped = 0;\n private destroyed = false;\n private lastAdmissionClock?: number;\n\n constructor(options: BrowserErrorLogOptions) {\n this.options = options;\n this.active = options.enabled !== false && typeof window !== 'undefined' && typeof document !== 'undefined';\n const automaticNetworkAllowed = !options.transport || Boolean(options.endpoint);\n this.networkCaptureEnabled = options.captureNetwork !== false && automaticNetworkAllowed;\n this.networkBreadcrumbCaptureEnabled = options.captureNetworkBreadcrumbs === true && automaticNetworkAllowed;\n this.navigationCaptureEnabled = options.captureNavigation === true;\n this.maxQueueSize = boundedNumber(options.maxQueueSize, 1, 100, 50);\n this.maxEventsPerMinute = typeof options.maxEventsPerMinute === 'number' && Number.isFinite(options.maxEventsPerMinute)\n ? boundedNumber(options.maxEventsPerMinute, 1, 1000, 1) : undefined;\n this.transportTimeoutMs = boundedNumber(options.transportTimeoutMs, 250, 60_000, 5_000);\n this.destroySignal = new Promise(resolve => { this.resolveDestroy = resolve; });\n if (!this.active) return;\n if (!options.project || typeof options.project !== 'string') throw new Error('project is required');\n if (!options.transport && !options.endpoint) throw new Error('endpoint or transport is required');\n this.endpoint = options.endpoint ? this.absoluteUrl(options.endpoint) : undefined;\n window.addEventListener('error', this.onError);\n window.addEventListener('unhandledrejection', this.onRejection);\n document.addEventListener('visibilitychange', this.onVisibility);\n if (this.networkCaptureEnabled || this.networkBreadcrumbCaptureEnabled) addNetworkClient(this);\n if (options.captureConsole === true) addConsoleClient(this);\n if (this.navigationCaptureEnabled) addNavigationClient(this);\n this.interval = setInterval(() => { void this.flush(); }, boundedNumber(options.flushIntervalMs, 10, 60_000, 10_000));\n }\n\n captureException(error: unknown, extra: CaptureExtra = {}): void {\n if (!this.active || this.destroyed || isAbort(error)) return;\n try {\n if (error !== null && (typeof error === 'object' || typeof error === 'function')) {\n if (this.seenErrors.has(error)) return;\n }\n const fields = errorFields(error);\n const type = EVENT_TYPES.has(extra.type as EventType) ? extra.type! : 'manual';\n const event = this.makeEvent(type, fields.message, {\n name: fields.name,\n stack: fields.stack,\n componentStack: extra.componentStack,\n context: extra.context,\n });\n if (this.enqueue(event) && error !== null && (typeof error === 'object' || typeof error === 'function')) {\n this.seenErrors.add(error);\n }\n } catch (error) {\n if (error instanceof UrlSanitizationError || error instanceof ContextResolutionError) this.dropped++;\n // Diagnostics must never affect the host app.\n }\n }\n\n reportNetwork(method: string, url: string, status: number | undefined, durationMs: number,\n failure?: unknown, allowErrorCapture = true): void {\n if (this.destroyed || !this.active || this.isCollectorUrl(url) || isAbort(failure)) return;\n let captureError = this.networkCaptureEnabled && allowErrorCapture;\n if (captureError && status !== undefined) {\n try {\n captureError = this.options.shouldCaptureHttp\n ? this.options.shouldCaptureHttp(status, url, method)\n : status >= 500;\n } catch { this.dropped++; return; /* A failing hook cannot expose an unfiltered event or breadcrumb. */ }\n }\n if (this.networkBreadcrumbCaptureEnabled) {\n try {\n const cleaned = this.cleanBreadcrumbUrl(url);\n if (cleaned.url) {\n const data: NonNullable<Breadcrumb['data']> = {\n method: this.cleanNetworkBreadcrumbMethod(method),\n url: cleaned.url,\n durationMs: boundedNumber(durationMs, 0, 3_600_000, 0),\n };\n if (status !== undefined && Number.isInteger(status) && status >= 0 && status <= 599) data.status = status;\n this.breadcrumbs.push({ occurredAt: new Date().toISOString(),\n category: status === undefined ? 'network' : 'http',\n message: status === undefined ? 'Network failure' : 'HTTP response', data });\n this.boundBreadcrumbs(this.breadcrumbs);\n } else if (captureError && !cleaned.safeForError) {\n this.dropped++;\n return;\n }\n } catch {\n if (captureError) this.dropped++;\n return; // A failing URL hook cannot expose an unfiltered breadcrumb or selected error.\n }\n }\n if (!captureError) return;\n try {\n const network = { method: trim(method || 'GET', 16).toUpperCase(), url, status, durationMs };\n const fields = failure === undefined ? undefined : errorFields(failure);\n const event = this.makeEvent(status === undefined ? 'network' : 'http',\n status === undefined ? (fields?.message || 'Network request failed') : `HTTP ${status}`,\n { name: fields?.name, network });\n this.enqueue(event);\n } catch { this.dropped++; /* a failing hook must not expose an unfiltered event */ }\n }\n\n reportZeroStatusCompletion(method: string, url: string, durationMs: number): void {\n if (this.networkBreadcrumbCaptureEnabled) this.reportNetwork(method, url, 0, durationMs, undefined, false);\n }\n\n captureConsole(values: unknown[]): void {\n if (!this.active || this.destroyed) return;\n try {\n const message = values.map(safeString).join(' ');\n let fields: ReturnType<typeof errorFields> | undefined;\n for (const value of values) {\n try {\n if (value instanceof Error) { fields = errorFields(value); break; }\n } catch { /* a hostile value must not suppress the console event */ }\n }\n this.enqueue(this.makeEvent('console', message, { name: fields?.name, stack: fields?.stack }));\n }\n catch { this.dropped++; /* console behavior is never changed by capture */ }\n }\n\n addBreadcrumb(input: BreadcrumbInput): void {\n if (!this.active || this.destroyed) return;\n try {\n const breadcrumb = this.cleanBreadcrumb(input, new Date().toISOString());\n if (!breadcrumb) return;\n this.breadcrumbs.push(breadcrumb);\n this.boundBreadcrumbs(this.breadcrumbs);\n } catch { /* Diagnostics must never affect the host app or error stats. */ }\n }\n\n reportNavigation(fromHref: string, toHref: string, trigger: NavigationTrigger): void {\n if (!this.active || this.destroyed || !this.navigationCaptureEnabled) return;\n try {\n const from = this.cleanBreadcrumbUrl(fromHref).url;\n const to = this.cleanBreadcrumbUrl(toHref).url;\n if (!from || !to) return;\n if (from === to) return;\n this.breadcrumbs.push({ occurredAt: new Date().toISOString(), category: 'navigation',\n message: 'Navigation', data: { from, to, trigger } });\n this.boundBreadcrumbs(this.breadcrumbs);\n } catch { /* A failing URL hook cannot affect navigation or expose an unfiltered breadcrumb. */ }\n }\n\n clearBreadcrumbs(): void {\n if (!this.active || this.destroyed) return;\n this.breadcrumbs.length = 0;\n }\n\n flush(): Promise<void> {\n if (!this.active || this.destroyed) return Promise.resolve();\n if (this.flushing) return this.flushing;\n this.flushing = this.drain().finally(() => { this.flushing = undefined; });\n return this.flushing;\n }\n\n destroy(): void {\n if (this.destroyed) return;\n this.destroyed = true;\n if (this.interval) clearInterval(this.interval);\n if (this.active) {\n window.removeEventListener('error', this.onError);\n window.removeEventListener('unhandledrejection', this.onRejection);\n document.removeEventListener('visibilitychange', this.onVisibility);\n if (this.networkCaptureEnabled || this.networkBreadcrumbCaptureEnabled) removeNetworkClient(this);\n if (this.options.captureConsole === true) removeConsoleClient(this);\n if (this.navigationCaptureEnabled) removeNavigationClient(this);\n }\n this.dropped += this.queue.length + this.inFlight;\n this.queue.length = 0;\n this.breadcrumbs.length = 0;\n this.admittedAt.length = 0;\n this.lastAdmissionClock = undefined;\n for (const cancel of this.cancelWaits) cancel();\n for (const controller of this.controllers) controller.abort();\n this.resolveDestroy(DESTROYED);\n }\n\n getStats(): { queued: number; sent: number; dropped: number } {\n return { queued: this.queue.length, sent: this.sent, dropped: this.dropped };\n }\n\n private readonly onError = (event: ErrorEvent): void => {\n try {\n const filename = read(event, 'filename');\n const lineno = read(event, 'lineno');\n const colno = read(event, 'colno');\n const context: Record<string, unknown> = {};\n if (typeof filename === 'string' && filename.trim()) context.filename = this.cleanUrl(filename);\n if (typeof lineno === 'number' && Number.isFinite(lineno) && lineno > 0) context.lineno = lineno;\n if (typeof colno === 'number' && Number.isFinite(colno) && colno > 0) context.colno = colno;\n this.captureException(read(event, 'error') ?? read(event, 'message') ?? 'Script error', {\n type: 'javascript', ...(Object.keys(context).length ? { context } : {}),\n });\n } catch { this.dropped++; /* a failing URL hook must not affect the host app */ }\n };\n\n private readonly onRejection = (event: PromiseRejectionEvent): void => {\n this.captureException(event.reason, { type: 'promise' });\n };\n\n private readonly onVisibility = (): void => {\n if (document.visibilityState === 'hidden') this.tryBeacon();\n };\n\n private absoluteUrl(url: string): string {\n try { return new URL(url, window.location.href).href; }\n catch { return url; }\n }\n\n private isCollectorUrl(url: string): boolean {\n if (!this.endpoint) return false;\n try {\n const request = new URL(url, window.location.href);\n const collector = new URL(this.endpoint, window.location.href);\n return request.origin === collector.origin && request.pathname === collector.pathname;\n } catch { return url === this.endpoint; }\n }\n\n private cleanUrl(input: unknown): string {\n let value = safeString(input);\n if (this.options.sanitizeUrl) {\n try { value = this.options.sanitizeUrl(value); }\n catch { throw new UrlSanitizationError('URL sanitizer failed'); }\n if (typeof value !== 'string' || !value) throw new UrlSanitizationError('URL sanitizer returned no URL');\n }\n try {\n const url = new URL(value, window.location.href);\n if (url.protocol !== 'http:' && url.protocol !== 'https:') return '[unsupported URL]';\n url.username = '';\n url.password = '';\n url.search = '';\n url.hash = '';\n return this.cleanText(url.href, 1024, false);\n } catch { return this.cleanText(value, 1024, false).split(/[?#]/, 1)[0]; }\n }\n\n private cleanBreadcrumbUrl(input: string): { url?: string; safeForError: boolean } {\n const cleaned = this.cleanUrl(input);\n if (cleaned === '[unsupported URL]') return { safeForError: true };\n try {\n // cleanUrl's malformed-input fallback is for general diagnostics; breadcrumbs need a valid URL.\n const url = new URL(cleaned);\n if ((url.protocol !== 'http:' && url.protocol !== 'https:') || url.username || url.password || url.search || url.hash) {\n return { safeForError: false };\n }\n return { url: cleaned.slice(0, BREADCRUMB_LIMITS.dataString), safeForError: true };\n } catch { return { safeForError: false }; }\n }\n\n private cleanNetworkBreadcrumbMethod(input: string): string {\n const method = safeString(input || 'GET').trim().toUpperCase();\n return /^[A-Z0-9!#$%&'*+.^_`|~-]{1,16}$/.test(method) ? method : 'GET';\n }\n\n private cleanText(input: unknown, length: number, replaceUrls = true): string {\n let value = safeString(input);\n if (replaceUrls) {\n value = value.replace(/https?:\\/\\/[^\\s<>\"'()[\\]]+/gi, match => this.cleanUrl(match));\n value = value.replace(/(^|[\\s\"'(\\[=])((?:\\/(?!\\/)|\\.{1,2}\\/)[^\\s<>\"'()[\\]?#]*[?#][^\\s<>\"'()[\\]]+|[a-z][\\w.-]*(?:\\/[^\\s<>\"'()[\\]?#]*)?(?:\\?[a-z0-9_.-]+=[^\\s<>\"'()[\\]]+|#[^\\s<>\"'()[\\]]+)|\\?[a-z0-9_.-]+=[^\\s<>\"'()[\\]]+)/gi,\n (_match, prefix: string, url: string) => {\n const punctuation = /[.,;!]+$/.exec(url)?.[0] ?? '';\n const core = url.slice(0, url.length - punctuation.length);\n const cleaned = this.options.sanitizeUrl\n ? this.cleanUrl(core)\n : core.startsWith('?') ? '[redacted query]' : this.cleanText(core.split(/[?#]/, 1)[0], 1024, false);\n return `${prefix}${cleaned}${punctuation}`;\n });\n }\n return value\n .replace(/\\bBearer\\s+[A-Za-z0-9._~+\\/-]+/gi, 'Bearer [REDACTED]')\n .replace(/[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,}/gi, '[REDACTED_EMAIL]')\n .slice(0, length);\n }\n\n private cleanContext(input: unknown): ErrorEventRecord['context'] {\n if (!input || typeof input !== 'object') return undefined;\n const output: NonNullable<ErrorEventRecord['context']> = {};\n let keys: string[];\n try { keys = Object.keys(input); }\n catch { return undefined; }\n for (const key of keys) {\n if (Object.keys(output).length >= 12) break;\n if (SENSITIVE_KEY.test(key)) continue;\n const value = read(input, key);\n const safeKey = this.cleanText(key, 80);\n if (typeof value === 'string') output[safeKey] = this.cleanText(value, 500);\n else if (typeof value === 'number' && Number.isFinite(value)) output[safeKey] = value;\n else if (typeof value === 'boolean' || value === null) output[safeKey] = value;\n }\n return Object.keys(output).length ? output : undefined;\n }\n\n private cleanBreadcrumb(input: unknown, timestamp?: string): Breadcrumb | undefined {\n if (!input || typeof input !== 'object') return undefined;\n const occurredAt = timestamp ?? read(input, 'occurredAt');\n if (typeof occurredAt !== 'string') return undefined;\n try { if (new Date(occurredAt).toISOString() !== occurredAt) return undefined; }\n catch { return undefined; }\n const rawCategory = read(input, 'category');\n const rawMessage = read(input, 'message');\n if ((rawCategory !== undefined && typeof rawCategory !== 'string') || typeof rawMessage !== 'string') return undefined;\n const category = this.cleanText(rawCategory ?? (timestamp ? 'manual' : ''), BREADCRUMB_LIMITS.category);\n const message = this.cleanText(rawMessage, BREADCRUMB_LIMITS.message);\n if (!category.trim() || !message.trim()) return undefined;\n const rawData = read(input, 'data');\n const data: NonNullable<Breadcrumb['data']> = {};\n if (rawData && typeof rawData === 'object') {\n let keys: string[];\n try { keys = Object.keys(rawData); }\n catch { keys = []; }\n for (const key of keys) {\n if (Object.keys(data).length >= BREADCRUMB_LIMITS.dataKeys) break;\n if (SENSITIVE_KEY.test(key)) continue;\n const safeKey = this.cleanText(key, BREADCRUMB_LIMITS.dataKey);\n const value = read(rawData, key);\n if (typeof value === 'string') data[safeKey] = this.cleanText(value, BREADCRUMB_LIMITS.dataString);\n else if (typeof value === 'number' && Number.isFinite(value)) data[safeKey] = value;\n else if (typeof value === 'boolean' || value === null) data[safeKey] = value;\n }\n }\n return { occurredAt, category, message, ...(Object.keys(data).length ? { data } : {}) };\n }\n\n private boundBreadcrumbs(trail: Breadcrumb[]): void {\n while (trail.length > BREADCRUMB_LIMITS.count || byteLength(JSON.stringify(trail)) > BREADCRUMB_LIMITS.bytes) trail.shift();\n }\n\n private cleanBreadcrumbTrail(input: unknown): Breadcrumb[] | undefined {\n let length: number;\n try {\n if (!Array.isArray(input)) return undefined;\n length = input.length;\n } catch { return undefined; }\n if (!Number.isSafeInteger(length) || length < 0) return undefined;\n const trail: Breadcrumb[] = [];\n for (let index = Math.max(0, length - BREADCRUMB_LIMITS.count); index < length; index++) {\n const breadcrumb = this.cleanBreadcrumb(read(input, index));\n if (breadcrumb) {\n trail.push(breadcrumb);\n this.boundBreadcrumbs(trail);\n }\n }\n return trail.length ? trail : undefined;\n }\n\n private cleanNetwork(input: unknown): ErrorEventRecord['network'] {\n if (!input || typeof input !== 'object') return undefined;\n const rawStatus = read(input, 'status');\n const status = typeof rawStatus === 'number' && Number.isInteger(rawStatus) && rawStatus >= 100 && rawStatus <= 599\n ? rawStatus : undefined;\n return {\n method: this.cleanText(read(input, 'method') ?? 'GET', 16).toUpperCase(),\n url: this.cleanUrl(read(input, 'url') ?? ''),\n ...(status === undefined ? {} : { status }),\n durationMs: boundedNumber(read(input, 'durationMs'), 0, 3_600_000, 0),\n };\n }\n\n private makeEvent(type: EventType, message: string, extra: {\n name?: string; stack?: string; componentStack?: string;\n context?: unknown; network?: unknown;\n } = {}): ErrorEventRecord {\n const userAgent = read(navigator, 'userAgent');\n const eventContext = this.cleanContext(extra.context);\n let resolved: unknown;\n try { resolved = this.options.getContext?.(); }\n catch { throw new ContextResolutionError('Context resolver failed'); }\n const dynamicContext = this.cleanContext(resolved);\n const defaults = this.cleanContext(this.options.context);\n let context = eventContext;\n if (dynamicContext || defaults) {\n context = { ...eventContext };\n for (const fields of [dynamicContext, defaults]) {\n if (!fields) continue;\n for (const key of Object.keys(fields)) {\n if (Object.keys(context).length >= 12) break;\n if (!Object.prototype.hasOwnProperty.call(context, key)) context[key] = fields[key];\n }\n }\n }\n const network = this.cleanNetwork(extra.network);\n return {\n schemaVersion: 1,\n eventId: newId(),\n project: this.cleanText(this.options.project, 80),\n environment: this.cleanText(this.options.environment ?? 'development', 80),\n release: this.cleanText(this.options.release ?? 'unknown', 120),\n sdkVersion: '0.1.19',\n occurredAt: new Date().toISOString(),\n viewId: this.viewId,\n sequence: ++this.sequence,\n elapsedMs: boundedNumber(now() - this.startedAt, 0, 3_600_000, 0),\n type,\n message: this.cleanText(message, 1024),\n ...(extra.name === undefined ? {} : { name: this.cleanText(extra.name, 100) }),\n ...(extra.stack === undefined ? {} : { stack: this.cleanText(extra.stack, 4096) }),\n ...(extra.componentStack === undefined ? {} : { componentStack: this.cleanText(extra.componentStack, 2048) }),\n page: this.cleanUrl(window.location.href),\n runtime: RUNTIMES.has(this.options.runtime as Runtime) ? this.options.runtime! : 'browser',\n ...(typeof userAgent === 'string' ? { browser: this.cleanText(userAgent, 300) } : {}),\n ...(context ? { context } : {}),\n ...(this.breadcrumbs.length ? { breadcrumbs: this.breadcrumbs.map(crumb => ({\n ...crumb, ...(crumb.data ? { data: { ...crumb.data } } : {}),\n })) } : {}),\n ...(network ? { network } : {}),\n };\n }\n\n private sanitizeReplacement(candidate: unknown, base: ErrorEventRecord): ErrorEventRecord {\n const type = read(candidate, 'type');\n const runtime = read(candidate, 'runtime');\n const name = read(candidate, 'name');\n const stack = read(candidate, 'stack');\n const componentStack = read(candidate, 'componentStack');\n const browser = read(candidate, 'browser');\n const context = this.cleanContext(read(candidate, 'context'));\n const breadcrumbs = this.cleanBreadcrumbTrail(read(candidate, 'breadcrumbs'));\n const network = this.cleanNetwork(read(candidate, 'network'));\n return {\n ...base,\n type: EVENT_TYPES.has(type as EventType) ? type as EventType : base.type,\n message: this.cleanText(read(candidate, 'message') ?? base.message, 1024),\n ...(name === undefined ? { name: base.name } : { name: this.cleanText(name, 100) }),\n ...(stack === undefined ? { stack: base.stack } : { stack: this.cleanText(stack, 4096) }),\n ...(componentStack === undefined ? { componentStack: base.componentStack } : { componentStack: this.cleanText(componentStack, 2048) }),\n page: this.cleanUrl(read(candidate, 'page') ?? base.page),\n runtime: RUNTIMES.has(runtime as Runtime) ? runtime as Runtime : base.runtime,\n ...(browser === undefined ? { browser: base.browser } : { browser: this.cleanText(browser, 300) }),\n ...(context ? { context } : { context: undefined }),\n ...(breadcrumbs ? { breadcrumbs } : { breadcrumbs: undefined }),\n ...(network ? { network } : { network: undefined }),\n };\n }\n\n private admissionTime(): number | undefined {\n const reading = now();\n const current = Number.isFinite(reading)\n ? Math.max(0, reading, this.lastAdmissionClock ?? 0)\n : this.lastAdmissionClock ?? 0;\n this.lastAdmissionClock = current;\n while (this.admittedAt.length && current - this.admittedAt[0] >= 60_000) this.admittedAt.shift();\n return this.admittedAt.length < this.maxEventsPerMinute! ? current : undefined;\n }\n\n private enqueue(event: ErrorEventRecord): boolean {\n if (this.destroyed) return false;\n if (this.maxEventsPerMinute !== undefined && this.admissionTime() === undefined) {\n this.dropped++;\n return false;\n }\n let finalEvent = event;\n if (this.options.beforeSend) {\n try {\n const copy = { ...event, context: event.context && { ...event.context },\n breadcrumbs: event.breadcrumbs?.map(crumb => ({ ...crumb, data: crumb.data && { ...crumb.data } })),\n network: event.network && { ...event.network } };\n const result = this.options.beforeSend(copy);\n if (result === false || result === null) return false;\n finalEvent = this.sanitizeReplacement(result === undefined ? copy : result, event);\n } catch { this.dropped++; return false; }\n }\n // A single event can never make a batch exceed its byte budget.\n if (byteLength(JSON.stringify(finalEvent)) > MAX_BATCH_BYTES) { this.dropped++; return false; }\n const admittedAt = this.maxEventsPerMinute === undefined ? undefined : this.admissionTime();\n if (this.maxEventsPerMinute !== undefined && admittedAt === undefined) { this.dropped++; return false; }\n if (this.queue.length >= this.maxQueueSize) { this.queue.shift(); this.dropped++; }\n this.queue.push(finalEvent);\n if (admittedAt !== undefined) this.admittedAt.push(admittedAt);\n if (this.queue.length >= this.maxQueueSize) void this.flush();\n return true;\n }\n\n private takeBatch(maxEvents = MAX_BATCH_EVENTS, maxBytes = MAX_BATCH_BYTES): EventBatch {\n const events: ErrorEventRecord[] = [];\n let bytes = byteLength('{\"schemaVersion\":1,\"events\":[]}');\n while (this.queue.length && events.length < maxEvents) {\n const next = this.queue[0];\n const size = byteLength(JSON.stringify(next)) + (events.length ? 1 : 0);\n if (events.length && bytes + size > maxBytes) break;\n if (!events.length && bytes + size > maxBytes) { this.queue.shift(); this.dropped++; continue; }\n events.push(this.queue.shift()!);\n bytes += size;\n }\n return { schemaVersion: 1, events };\n }\n\n private async drain(): Promise<void> {\n while (!this.destroyed && this.queue.length) {\n const batch = this.takeBatch();\n if (batch.events.length) {\n this.inFlight += batch.events.length;\n try { await this.sendWithRetry(batch); }\n finally { this.inFlight -= batch.events.length; }\n }\n }\n }\n\n private async sendWithRetry(batch: EventBatch): Promise<void> {\n for (let attempt = 0; attempt <= RETRY_DELAYS_MS.length && !this.destroyed; attempt++) {\n const controller = new AbortController();\n this.controllers.add(controller);\n let timeoutHandle: ReturnType<typeof setTimeout> | undefined;\n const timeout = new Promise<never>((_resolve, reject) => {\n timeoutHandle = setTimeout(() => {\n controller.abort();\n reject(new Error('Collector transport timed out'));\n }, this.transportTimeoutMs);\n });\n let retryDelay: number | undefined;\n try {\n const result = await Promise.race([this.send(batch, controller.signal), timeout, this.destroySignal]);\n if (result === DESTROYED || this.destroyed) return;\n this.sent += batch.events.length;\n return;\n } catch (error) {\n if (this.destroyed) return;\n const status = read(error, 'status');\n const retryable = typeof status !== 'number' || status === 429 || status >= 500;\n if (!retryable || attempt === RETRY_DELAYS_MS.length) break;\n retryDelay = RETRY_DELAYS_MS[attempt];\n } finally {\n if (timeoutHandle) clearTimeout(timeoutHandle);\n this.controllers.delete(controller);\n }\n if (retryDelay !== undefined) await this.wait(retryDelay);\n }\n if (!this.destroyed) this.dropped += batch.events.length;\n }\n\n private async send(batch: EventBatch, signal: AbortSignal): Promise<void> {\n if (this.options.transport) { await this.options.transport(batch, { signal }); return; }\n const response = await window.fetch(this.endpoint!, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(batch),\n credentials: 'omit',\n signal,\n });\n if (!response.ok) throw new HttpDeliveryError(response.status);\n }\n\n private wait(milliseconds: number): Promise<void> {\n return new Promise(resolve => {\n const finish = () => { clearTimeout(timer); this.cancelWaits.delete(finish); resolve(); };\n const timer = setTimeout(finish, milliseconds);\n this.cancelWaits.add(finish);\n });\n }\n\n private tryBeacon(): void {\n if (this.destroyed || this.options.transport || !this.endpoint || !this.queue.length) return;\n try {\n const url = new URL(this.endpoint);\n if (url.origin !== window.location.origin || url.search || url.hash || url.username || url.password) return;\n if (typeof navigator.sendBeacon !== 'function') return;\n const candidates = this.queue.slice(0, MAX_BEACON_EVENTS);\n while (candidates.length > 0) {\n const batch: EventBatch = { schemaVersion: 1, events: candidates };\n const body = JSON.stringify(batch);\n if (byteLength(body) <= MAX_BEACON_BYTES) {\n if (navigator.sendBeacon(this.endpoint, new Blob([body], { type: 'application/json' }))) {\n this.queue.splice(0, candidates.length);\n this.sent += candidates.length;\n }\n return;\n }\n candidates.pop();\n }\n } catch { /* best effort only */ }\n }\n}\n\nconst DESTROYED = Symbol('destroyed');\n\ninterface Instrumentation {\n clients: Set<Client>;\n cleanup(): void;\n}\n\nlet networkInstrumentation: Instrumentation | undefined;\nlet consoleInstrumentation: Instrumentation | undefined;\nlet navigationInstrumentation: Instrumentation | undefined;\n\ntype NavigationTrigger = 'pushState' | 'replaceState' | 'popstate' | 'hashchange';\n\nfunction addNavigationClient(client: Client): void {\n if (!navigationInstrumentation) navigationInstrumentation = installNavigation();\n navigationInstrumentation?.clients.add(client);\n}\n\nfunction removeNavigationClient(client: Client): void {\n const instrumentation = navigationInstrumentation;\n if (!instrumentation) return;\n instrumentation.clients.delete(client);\n if (!instrumentation.clients.size) {\n instrumentation.cleanup();\n navigationInstrumentation = undefined;\n }\n}\n\nfunction inheritedHistoryDescriptor(historyObject: History, key: 'pushState' | 'replaceState'): PropertyDescriptor | undefined {\n const seen = new Set<object>();\n let prototype = Object.getPrototypeOf(historyObject);\n while (prototype && !seen.has(prototype)) {\n seen.add(prototype);\n const descriptor = Object.getOwnPropertyDescriptor(prototype, key);\n if (descriptor) return descriptor;\n prototype = Object.getPrototypeOf(prototype);\n }\n return undefined;\n}\n\nfunction installNavigation(): Instrumentation | undefined {\n let historyObject: History;\n let lastHref: string;\n let originalPush: History['pushState'];\n let originalReplace: History['replaceState'];\n let ownPush: PropertyDescriptor | undefined;\n let ownReplace: PropertyDescriptor | undefined;\n let inheritedPush: PropertyDescriptor | undefined;\n let inheritedReplace: PropertyDescriptor | undefined;\n try {\n historyObject = window.history;\n lastHref = window.location.href;\n ownPush = Object.getOwnPropertyDescriptor(historyObject, 'pushState');\n ownReplace = Object.getOwnPropertyDescriptor(historyObject, 'replaceState');\n inheritedPush = ownPush ? undefined : inheritedHistoryDescriptor(historyObject, 'pushState');\n inheritedReplace = ownReplace ? undefined : inheritedHistoryDescriptor(historyObject, 'replaceState');\n if ((ownPush && !('value' in ownPush)) || (ownReplace && !('value' in ownReplace))) return undefined;\n if ((!ownPush && (!inheritedPush || !('value' in inheritedPush) || inheritedPush.writable !== true)) ||\n (!ownReplace && (!inheritedReplace || !('value' in inheritedReplace) || inheritedReplace.writable !== true))) return undefined;\n originalPush = ownPush ? ownPush.value : historyObject.pushState;\n originalReplace = ownReplace ? ownReplace.value : historyObject.replaceState;\n if (typeof originalPush !== 'function' || typeof originalReplace !== 'function') return undefined;\n const canInstall = (own?: PropertyDescriptor) => own\n ? own.configurable === true || own.writable === true\n : Object.isExtensible(historyObject);\n if (!canInstall(ownPush) || !canInstall(ownReplace)) return undefined;\n } catch { return undefined; }\n\n const clients = new Set<Client>();\n const report = (trigger: NavigationTrigger): void => {\n try {\n const toHref = window.location.href;\n if (toHref === lastHref) return;\n const fromHref = lastHref;\n lastHref = toHref;\n for (const client of clients) {\n try { client.reportNavigation(fromHref, toHref, trigger); }\n catch { /* Telemetry must never alter a successful native call. */ }\n }\n } catch { /* Location can be unavailable in a restricted host. */ }\n };\n const wrappedPush: History['pushState'] = function (this: History, ...args: Parameters<History['pushState']>): void {\n const result = Reflect.apply(originalPush, this, args);\n report('pushState');\n return result;\n };\n const wrappedReplace: History['replaceState'] = function (this: History, ...args: Parameters<History['replaceState']>): void {\n const result = Reflect.apply(originalReplace, this, args);\n report('replaceState');\n return result;\n };\n const onPopState = () => { report('popstate'); };\n const onHashChange = () => { report('hashchange'); };\n const restore = (key: 'pushState' | 'replaceState', wrapper: History['pushState'], own?: PropertyDescriptor): void => {\n try {\n const current = Object.getOwnPropertyDescriptor(historyObject, key);\n if (!current || !('value' in current) || current.value !== wrapper) return;\n if (own) Object.defineProperty(historyObject, key, own);\n else Reflect.deleteProperty(historyObject, key);\n } catch { /* Keep a host-installed replacement and never throw during cleanup. */ }\n };\n let pushInstalled = false;\n let replaceInstalled = false;\n try {\n Object.defineProperty(historyObject, 'pushState', { configurable: ownPush?.configurable ?? true,\n enumerable: ownPush?.enumerable ?? false, writable: ownPush?.writable ?? true, value: wrappedPush });\n pushInstalled = true;\n Object.defineProperty(historyObject, 'replaceState', { configurable: ownReplace?.configurable ?? true,\n enumerable: ownReplace?.enumerable ?? false, writable: ownReplace?.writable ?? true, value: wrappedReplace });\n replaceInstalled = true;\n window.addEventListener('popstate', onPopState);\n window.addEventListener('hashchange', onHashChange);\n } catch {\n try { window.removeEventListener('hashchange', onHashChange); } catch { /* best effort */ }\n try { window.removeEventListener('popstate', onPopState); } catch { /* best effort */ }\n if (replaceInstalled) restore('replaceState', wrappedReplace, ownReplace);\n if (pushInstalled) restore('pushState', wrappedPush, ownPush);\n return undefined;\n }\n return { clients, cleanup() {\n try { window.removeEventListener('popstate', onPopState); } catch { /* best effort */ }\n try { window.removeEventListener('hashchange', onHashChange); } catch { /* best effort */ }\n restore('pushState', wrappedPush, ownPush);\n restore('replaceState', wrappedReplace, ownReplace);\n } };\n}\n\nfunction addNetworkClient(client: Client): void {\n if (!networkInstrumentation) networkInstrumentation = installNetwork();\n networkInstrumentation.clients.add(client);\n}\n\nfunction removeNetworkClient(client: Client): void {\n const instrumentation = networkInstrumentation;\n if (!instrumentation) return;\n instrumentation.clients.delete(client);\n if (!instrumentation.clients.size) {\n instrumentation.cleanup();\n networkInstrumentation = undefined;\n }\n}\n\nfunction describeFetch(input: RequestInfo | URL, init?: RequestInit): { url: string; method: string; signal?: AbortSignal | null } {\n let requestUrl: string | undefined;\n if (typeof Request !== 'undefined' && input !== null && typeof input === 'object') {\n if (input instanceof Request) requestUrl = read(input, 'url') as string | undefined;\n else {\n try { requestUrl = Object.getOwnPropertyDescriptor(Request.prototype, 'url')?.get?.call(input); }\n catch { /* not a genuine Request */ }\n }\n }\n const initSignal = read(init, 'signal');\n return {\n url: requestUrl ?? safeString(input),\n method: safeString(read(init, 'method') ?? (requestUrl === undefined ? undefined : read(input, 'method')) ?? 'GET'),\n signal: (initSignal === undefined ? (requestUrl === undefined ? undefined : read(input, 'signal')) : initSignal) as AbortSignal | null | undefined,\n };\n}\n\nfunction installNetwork(): Instrumentation {\n const clients = new Set<Client>();\n const originalFetch = window.fetch;\n let wrappedFetch: typeof fetch | undefined;\n if (typeof originalFetch === 'function') {\n wrappedFetch = function (this: typeof window, ...args: Parameters<typeof fetch>): ReturnType<typeof fetch> {\n if (!clients.size) return Reflect.apply(originalFetch, this, args);\n const started = now();\n let request: ReturnType<typeof describeFetch>;\n try { request = describeFetch(args[0], args[1]); }\n catch { request = { url: '', method: 'GET' }; }\n let promise: ReturnType<typeof fetch>;\n try { promise = Reflect.apply(originalFetch, this, args); }\n catch (error) {\n if (!isAbort(error, request.signal)) for (const client of clients) client.reportNetwork(request.method, request.url, undefined, now() - started, error);\n throw error;\n }\n return promise.then(\n response => {\n try {\n const status = response.status;\n for (const client of clients) client.reportNetwork(request.method, request.url, status, now() - started);\n } catch { /* telemetry cannot change the fetch result */ }\n return response;\n },\n error => {\n if (!isAbort(error, request.signal)) for (const client of clients) client.reportNetwork(request.method, request.url, undefined, now() - started, error);\n throw error;\n },\n );\n };\n window.fetch = wrappedFetch;\n }\n\n const prototype = typeof XMLHttpRequest === 'undefined' ? undefined : XMLHttpRequest.prototype;\n const originalOpen = prototype?.open;\n const originalSend = prototype?.send;\n const metadata = new WeakMap<XMLHttpRequest, { method: string; url: string }>();\n const pending = new WeakMap<XMLHttpRequest, () => void>();\n let wrappedOpen: typeof XMLHttpRequest.prototype.open | undefined;\n let wrappedSend: typeof XMLHttpRequest.prototype.send | undefined;\n if (prototype && originalOpen && originalSend) {\n wrappedOpen = (function (this: XMLHttpRequest, ...args: unknown[]): void {\n const result = Reflect.apply(originalOpen, this, args);\n pending.get(this)?.();\n try { metadata.set(this, { method: safeString(args[0]), url: safeString(args[1]) }); }\n catch { /* native open already succeeded */ }\n return result;\n }) as typeof XMLHttpRequest.prototype.open;\n wrappedSend = function (this: XMLHttpRequest, ...args: Parameters<XMLHttpRequest['send']>): void {\n if (!clients.size) return Reflect.apply(originalSend, this, args);\n const details = metadata.get(this);\n if (!details) return Reflect.apply(originalSend, this, args);\n const started = now();\n let aborted = false;\n let failed = false;\n let completed = false;\n const onAbort = () => { aborted = true; };\n const onFailure = () => { failed = true; };\n const cleanup = () => {\n this.removeEventListener('abort', onAbort);\n this.removeEventListener('error', onFailure);\n this.removeEventListener('timeout', onFailure);\n this.removeEventListener('loadend', onLoadEnd);\n if (pending.get(this) === cleanup) pending.delete(this);\n };\n const onLoadEnd = () => {\n completed = true;\n cleanup();\n if (aborted) return;\n try {\n const status = this.status;\n if (status === 0 && !failed) {\n for (const client of clients) client.reportZeroStatusCompletion(details.method, details.url, now() - started);\n return;\n }\n for (const client of clients) client.reportNetwork(details.method, details.url,\n status === 0 ? undefined : status, now() - started);\n } catch { /* XHR state may be unavailable */ }\n };\n try {\n this.addEventListener('abort', onAbort);\n this.addEventListener('error', onFailure);\n this.addEventListener('timeout', onFailure);\n this.addEventListener('loadend', onLoadEnd);\n } catch {\n cleanup();\n return Reflect.apply(originalSend, this, args);\n }\n try {\n const result = Reflect.apply(originalSend, this, args);\n if (!completed) pending.set(this, cleanup);\n return result;\n }\n catch (error) {\n cleanup();\n throw error;\n }\n };\n prototype.open = wrappedOpen!;\n prototype.send = wrappedSend;\n }\n return {\n clients,\n cleanup() {\n if (wrappedFetch && window.fetch === wrappedFetch) window.fetch = originalFetch;\n if (prototype && wrappedOpen && prototype.open === wrappedOpen) prototype.open = originalOpen!;\n if (prototype && wrappedSend && prototype.send === wrappedSend) prototype.send = originalSend!;\n },\n };\n}\n\nfunction addConsoleClient(client: Client): void {\n if (!consoleInstrumentation) consoleInstrumentation = installConsole();\n consoleInstrumentation.clients.add(client);\n}\n\nfunction removeConsoleClient(client: Client): void {\n const instrumentation = consoleInstrumentation;\n if (!instrumentation) return;\n instrumentation.clients.delete(client);\n if (!instrumentation.clients.size) {\n instrumentation.cleanup();\n consoleInstrumentation = undefined;\n }\n}\n\nfunction installConsole(): Instrumentation {\n const clients = new Set<Client>();\n const original = console.error;\n const wrapped: typeof console.error = function (this: Console, ...values: unknown[]): void {\n try { return Reflect.apply(original, this, values); }\n finally { for (const client of clients) client.captureConsole(values); }\n };\n console.error = wrapped;\n return { clients, cleanup() { if (console.error === wrapped) console.error = original; } };\n}\n\nexport function init(options: BrowserErrorLogOptions): BrowserErrorLogBreadcrumbClient {\n return new Client(options);\n}\n", "export const SCHEMA_VERSION = 1 as const;\nexport const SDK_VERSION = '0.1.19';\n\nexport type EventType = 'javascript' | 'promise' | 'react' | 'console' | 'http' | 'network' | 'manual';\nexport type Runtime = 'browser' | 'webview-ios' | 'webview-android' | 'unknown';\n\nexport const BREADCRUMB_LIMITS = {\n count: 20, bytes: 12_000, category: 40, message: 256,\n dataKeys: 6, dataKey: 80, dataString: 200,\n} as const;\n\nexport interface Breadcrumb {\n occurredAt: string;\n category: string;\n message: string;\n data?: Record<string, string | number | boolean | null>;\n}\n\n/** Validates the bounded, canonical UTC breadcrumb representation on the wire. */\nexport function isBreadcrumbTrail(value: unknown): value is Breadcrumb[] {\n try {\n if (!Array.isArray(value) || value.length > BREADCRUMB_LIMITS.count) return false;\n for (const item of value) {\n if (!item || typeof item !== 'object' || Array.isArray(item)) return false;\n if (Object.keys(item).some(key => !['occurredAt', 'category', 'message', 'data'].includes(key))) return false;\n if (typeof item.occurredAt !== 'string' || !Number.isFinite(Date.parse(item.occurredAt)) ||\n new Date(item.occurredAt).toISOString() !== item.occurredAt) return false;\n if (typeof item.category !== 'string' || !item.category.trim() || item.category.length > BREADCRUMB_LIMITS.category ||\n typeof item.message !== 'string' || !item.message.trim() || item.message.length > BREADCRUMB_LIMITS.message) return false;\n if (item.data !== undefined) {\n if (!item.data || typeof item.data !== 'object' || Array.isArray(item.data)) return false;\n const entries = Object.entries(item.data);\n if (entries.length > BREADCRUMB_LIMITS.dataKeys || entries.some(([key, field]) =>\n key.length > BREADCRUMB_LIMITS.dataKey || !(field === null || typeof field === 'boolean' ||\n (typeof field === 'string' && field.length <= BREADCRUMB_LIMITS.dataString) ||\n (typeof field === 'number' && Number.isFinite(field))))) return false;\n }\n }\n return new TextEncoder().encode(JSON.stringify(value)).length <= BREADCRUMB_LIMITS.bytes;\n } catch { return false; }\n}\n\nexport interface ErrorEventRecord {\n schemaVersion: 1;\n eventId: string;\n project: string;\n environment: string;\n release: string;\n sdkVersion: string;\n occurredAt: string;\n receivedAt?: string;\n viewId: string;\n sequence: number;\n elapsedMs: number;\n type: EventType;\n message: string;\n name?: string;\n stack?: string;\n componentStack?: string;\n page: string;\n runtime: Runtime;\n browser?: string;\n context?: Record<string, string | number | boolean | null>;\n breadcrumbs?: Breadcrumb[];\n network?: { method: string; url: string; status?: number; durationMs: number };\n}\n\nexport interface EventBatch { schemaVersion: 1; events: ErrorEventRecord[] }\nexport interface EventFilter {\n project?: string;\n environment?: string;\n type?: EventType;\n query?: string;\n from?: string;\n to?: string;\n cursor?: string;\n limit?: number;\n}\nexport interface EventPage { events: ErrorEventRecord[]; nextCursor?: string }\nexport interface EventDataSource {\n listEvents(filter: EventFilter, signal?: AbortSignal): Promise<EventPage>;\n getEvent(project: string, eventId: string, signal?: AbortSignal): Promise<ErrorEventRecord | null>;\n}\n\nexport const EVENT_LABELS: Record<EventType, string> = {\n javascript: 'JavaScript', promise: 'Promise', react: 'React', console: 'Console',\n http: 'HTTP error', network: 'Network failure', manual: 'Manual',\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["index_exports", "__export", "init", "__toCommonJS", "BREADCRUMB_LIMITS", "MAX_BATCH_EVENTS", "MAX_BATCH_BYTES", "MAX_BEACON_EVENTS", "MAX_BEACON_BYTES", "RETRY_DELAYS_MS", "SENSITIVE_KEY", "EVENT_TYPES", "RUNTIMES", "fallbackId", "read", "object", "key", "safeString", "value", "trim", "length", "now", "newId", "isAbort", "error", "signal", "errorFields", "message", "name", "stack", "byteLength", "boundedNumber", "minimum", "maximum", "fallback", "HttpDeliveryError", "status", "__publicField", "UrlSanitizationError", "ContextResolutionError", "Client", "options", "event", "filename", "lineno", "colno", "context", "automaticNetworkAllowed", "resolve", "addNetworkClient", "addConsoleClient", "addNavigationClient", "extra", "fields", "type", "method", "url", "durationMs", "failure", "allowErrorCapture", "captureError", "cleaned", "data", "network", "values", "input", "breadcrumb", "fromHref", "toHref", "trigger", "from", "to", "removeNetworkClient", "removeConsoleClient", "removeNavigationClient", "cancel", "controller", "DESTROYED", "request", "collector", "BREADCRUMB_LIMITS", "replaceUrls", "match", "_match", "prefix", "punctuation", "core", "output", "keys", "safeKey", "timestamp", "occurredAt", "rawCategory", "rawMessage", "category", "rawData", "trail", "index", "rawStatus", "userAgent", "eventContext", "resolved", "dynamicContext", "defaults", "crumb", "candidate", "base", "runtime", "componentStack", "browser", "breadcrumbs", "reading", "current", "finalEvent", "copy", "result", "admittedAt", "maxEvents", "maxBytes", "events", "bytes", "next", "size", "batch", "attempt", "timeoutHandle", "timeout", "_resolve", "reject", "retryDelay", "response", "milliseconds", "finish", "timer", "candidates", "body", "networkInstrumentation", "consoleInstrumentation", "navigationInstrumentation", "client", "installNavigation", "instrumentation", "inheritedHistoryDescriptor", "historyObject", "seen", "prototype", "descriptor", "lastHref", "originalPush", "originalReplace", "ownPush", "ownReplace", "inheritedPush", "inheritedReplace", "canInstall", "own", "clients", "report", "wrappedPush", "args", "wrappedReplace", "onPopState", "onHashChange", "restore", "wrapper", "pushInstalled", "replaceInstalled", "installNetwork", "describeFetch", "init", "requestUrl", "initSignal", "originalFetch", "wrappedFetch", "started", "promise", "originalOpen", "originalSend", "metadata", "pending", "wrappedOpen", "wrappedSend", "details", "aborted", "failed", "completed", "onAbort", "onFailure", "cleanup", "onLoadEnd", "installConsole", "original", "wrapped"]
7
7
  }
package/dist/index.d.ts CHANGED
@@ -25,11 +25,15 @@ export interface BrowserErrorLogOptions {
25
25
  captureNavigation?: boolean;
26
26
  /** Defaults to true. With a custom transport, automatic network capture requires endpoint for collector exclusion. */
27
27
  captureNetwork?: boolean;
28
+ /** Records sanitized fetch/XHR completion breadcrumbs; defaults to false. Custom transports require endpoint. */
29
+ captureNetworkBreadcrumbs?: boolean;
28
30
  beforeSend?: (event: ErrorEventRecord) => ErrorEventRecord | false | null | void;
29
31
  sanitizeUrl?: (url: string) => string;
30
32
  shouldCaptureHttp?: (status: number, url: string, method: string) => boolean;
31
33
  flushIntervalMs?: number;
32
34
  maxQueueSize?: number;
35
+ /** Maximum new events admitted in any rolling 60 seconds; disabled by default. */
36
+ maxEventsPerMinute?: number;
33
37
  /** Per-attempt deadline, clamped to 250–60000 ms; defaults to 5000 ms. */
34
38
  transportTimeoutMs?: number;
35
39
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../packages/browser/src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsC,KAAK,gBAAgB,EAAE,KAAK,UAAU,EAAE,KAAK,SAAS,EAAE,KAAK,OAAO,EAAE,MAAM,oCAAoC,CAAC;AAE9J,YAAY,EAAE,UAAU,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAC;AAEnG,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,gBAAgB;IAAG,MAAM,EAAE,WAAW,CAAA;CAAE;AAEzD,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,qFAAqF;IACrF,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,iFAAiF;IACjF,UAAU,CAAC,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;IACvD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,gBAAgB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnF,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,2EAA2E;IAC3E,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,sHAAsH;IACtH,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,gBAAgB,GAAG,KAAK,GAAG,IAAI,GAAG,IAAI,CAAC;IACjF,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC;IACtC,iBAAiB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC;IAC7E,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,0EAA0E;IAC1E,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,qBAAqB;IACpC,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;IAC7D,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,OAAO,IAAI,IAAI,CAAC;IAChB,QAAQ,IAAI;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CAC/D;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,+BAAgC,SAAQ,qBAAqB;IAC5E,aAAa,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAAC;IAC5C,gBAAgB,IAAI,IAAI,CAAC;CAC1B;AA43BD,wBAAgB,IAAI,CAAC,OAAO,EAAE,sBAAsB,GAAG,+BAA+B,CAErF"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../packages/browser/src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsC,KAAK,gBAAgB,EAAE,KAAK,UAAU,EAAE,KAAK,SAAS,EAAE,KAAK,OAAO,EAAE,MAAM,oCAAoC,CAAC;AAE9J,YAAY,EAAE,UAAU,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAC;AAEnG,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,gBAAgB;IAAG,MAAM,EAAE,WAAW,CAAA;CAAE;AAEzD,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,qFAAqF;IACrF,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,iFAAiF;IACjF,UAAU,CAAC,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;IACvD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,gBAAgB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnF,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,2EAA2E;IAC3E,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,sHAAsH;IACtH,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,iHAAiH;IACjH,yBAAyB,CAAC,EAAE,OAAO,CAAC;IACpC,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,gBAAgB,GAAG,KAAK,GAAG,IAAI,GAAG,IAAI,CAAC;IACjF,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC;IACtC,iBAAiB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC;IAC7E,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kFAAkF;IAClF,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,0EAA0E;IAC1E,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,qBAAqB;IACpC,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;IAC7D,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,OAAO,IAAI,IAAI,CAAC;IAChB,QAAQ,IAAI;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CAC/D;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,+BAAgC,SAAQ,qBAAqB;IAC5E,aAAa,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAAC;IAC5C,gBAAgB,IAAI,IAAI,CAAC;CAC1B;AAo8BD,wBAAgB,IAAI,CAAC,OAAO,EAAE,sBAAsB,GAAG,+BAA+B,CAErF"}
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- var K=Object.defineProperty;var W=(r,e,t)=>e in r?K(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t;var h=(r,e,t)=>W(r,typeof e!="symbol"?e+"":e,t);var k={count:20,bytes:12e3,category:40,message:256,dataKeys:6,dataKey:80,dataString:200};var $=20,U=48e3,J=10,Y=24e3,P=[250,500],D=/(?:password|passwd|token|secret|authorization|cookie|session|api.?key|credential|bearer|private.?key)/i,_=new Set(["javascript","promise","react","console","http","network","manual"]),H=new Set(["browser","webview-ios","webview-android","unknown"]),Q=0;function s(r,e){try{return r==null?void 0:Reflect.get(Object(r),e)}catch{return}}function w(r){try{return String(r)}catch{return"[unavailable]"}}function G(r,e){return w(r).slice(0,e)}function S(){try{return performance.now()}catch{return Date.now()}}function z(){try{if(typeof crypto<"u"&&typeof crypto.randomUUID=="function")return crypto.randomUUID()}catch{}return`${Date.now().toString(36)}-${(++Q).toString(36)}-${Math.random().toString(36).slice(2,10)}`}function N(r,e){try{if(e?.aborted)return!0}catch{}return s(r,"name")==="AbortError"||s(r,"code")===20}function I(r){if(r==null)return{message:"Unknown error"};let e=s(r,"message"),t=s(r,"name"),n=s(r,"stack");return{message:e==null?w(r):w(e),...t==null?{}:{name:w(t)},...n==null?{}:{stack:w(n)}}}function T(r){return new TextEncoder().encode(r).length}function C(r,e,t,n){return typeof r=="number"&&Number.isFinite(r)?Math.min(t,Math.max(e,Math.floor(r))):n}var q=class extends Error{constructor(t){super(`Collector responded ${t}`);h(this,"status",t)}},B=class extends Error{},O=class extends Error{},M=class{constructor(e){h(this,"active");h(this,"endpoint");h(this,"options");h(this,"networkCaptureEnabled");h(this,"navigationCaptureEnabled");h(this,"transportTimeoutMs");h(this,"startedAt",S());h(this,"viewId",z());h(this,"seenErrors",new WeakSet);h(this,"queue",[]);h(this,"breadcrumbs",[]);h(this,"maxQueueSize");h(this,"cancelWaits",new Set);h(this,"controllers",new Set);h(this,"destroySignal");h(this,"resolveDestroy");h(this,"interval");h(this,"flushing");h(this,"sequence",0);h(this,"inFlight",0);h(this,"sent",0);h(this,"dropped",0);h(this,"destroyed",!1);h(this,"onError",e=>{try{let t=s(e,"filename"),n=s(e,"lineno"),i=s(e,"colno"),o={};typeof t=="string"&&t.trim()&&(o.filename=this.cleanUrl(t)),typeof n=="number"&&Number.isFinite(n)&&n>0&&(o.lineno=n),typeof i=="number"&&Number.isFinite(i)&&i>0&&(o.colno=i),this.captureException(s(e,"error")??s(e,"message")??"Script error",{type:"javascript",...Object.keys(o).length?{context:o}:{}})}catch{this.dropped++}});h(this,"onRejection",e=>{this.captureException(e.reason,{type:"promise"})});h(this,"onVisibility",()=>{document.visibilityState==="hidden"&&this.tryBeacon()});if(this.options=e,this.active=e.enabled!==!1&&typeof window<"u"&&typeof document<"u",this.networkCaptureEnabled=e.captureNetwork!==!1&&(!e.transport||!!e.endpoint),this.navigationCaptureEnabled=e.captureNavigation===!0,this.maxQueueSize=C(e.maxQueueSize,1,100,50),this.transportTimeoutMs=C(e.transportTimeoutMs,250,6e4,5e3),this.destroySignal=new Promise(t=>{this.resolveDestroy=t}),!!this.active){if(!e.project||typeof e.project!="string")throw new Error("project is required");if(!e.transport&&!e.endpoint)throw new Error("endpoint or transport is required");this.endpoint=e.endpoint?this.absoluteUrl(e.endpoint):void 0,window.addEventListener("error",this.onError),window.addEventListener("unhandledrejection",this.onRejection),document.addEventListener("visibilitychange",this.onVisibility),this.networkCaptureEnabled&&ne(this),e.captureConsole===!0&&se(this),this.navigationCaptureEnabled&&Z(this),this.interval=setInterval(()=>{this.flush()},C(e.flushIntervalMs,10,6e4,1e4))}}captureException(e,t={}){if(!(!this.active||this.destroyed||N(e)))try{if(e!==null&&(typeof e=="object"||typeof e=="function")&&this.seenErrors.has(e))return;let n=I(e),i=_.has(t.type)?t.type:"manual",o=this.makeEvent(i,n.message,{name:n.name,stack:n.stack,componentStack:t.componentStack,context:t.context});this.enqueue(o)&&e!==null&&(typeof e=="object"||typeof e=="function")&&this.seenErrors.add(e)}catch(n){(n instanceof B||n instanceof O)&&this.dropped++}}reportNetwork(e,t,n,i,o){if(!(this.destroyed||!this.active||this.isCollectorUrl(t)||N(o)))try{if(n!==void 0&&!(this.options.shouldCaptureHttp?this.options.shouldCaptureHttp(n,t,e):n>=500))return;let a={method:G(e||"GET",16).toUpperCase(),url:t,status:n,durationMs:i},c=o===void 0?void 0:I(o),d=this.makeEvent(n===void 0?"network":"http",n===void 0?c?.message||"Network request failed":`HTTP ${n}`,{name:c?.name,network:a});this.enqueue(d)}catch{this.dropped++}}captureConsole(e){if(!(!this.active||this.destroyed))try{let t=e.map(w).join(" "),n;for(let i of e)try{if(i instanceof Error){n=I(i);break}}catch{}this.enqueue(this.makeEvent("console",t,{name:n?.name,stack:n?.stack}))}catch{this.dropped++}}addBreadcrumb(e){if(!(!this.active||this.destroyed))try{let t=this.cleanBreadcrumb(e,new Date().toISOString());if(!t)return;this.breadcrumbs.push(t),this.boundBreadcrumbs(this.breadcrumbs)}catch{}}reportNavigation(e,t,n){if(!(!this.active||this.destroyed||!this.navigationCaptureEnabled))try{let i=this.cleanUrl(e),o=this.cleanUrl(t),a=new URL(i),c=new URL(o);if(![a.protocol,c.protocol].every(l=>l==="http:"||l==="https:")||a.username||a.password||a.search||a.hash||c.username||c.password||c.search||c.hash)return;let d=i.slice(0,k.dataString),u=o.slice(0,k.dataString);if(d===u)return;this.breadcrumbs.push({occurredAt:new Date().toISOString(),category:"navigation",message:"Navigation",data:{from:d,to:u,trigger:n}}),this.boundBreadcrumbs(this.breadcrumbs)}catch{}}clearBreadcrumbs(){!this.active||this.destroyed||(this.breadcrumbs.length=0)}flush(){return!this.active||this.destroyed?Promise.resolve():this.flushing?this.flushing:(this.flushing=this.drain().finally(()=>{this.flushing=void 0}),this.flushing)}destroy(){if(!this.destroyed){this.destroyed=!0,this.interval&&clearInterval(this.interval),this.active&&(window.removeEventListener("error",this.onError),window.removeEventListener("unhandledrejection",this.onRejection),document.removeEventListener("visibilitychange",this.onVisibility),this.networkCaptureEnabled&&re(this),this.options.captureConsole===!0&&ae(this),this.navigationCaptureEnabled&&ee(this)),this.dropped+=this.queue.length+this.inFlight,this.queue.length=0,this.breadcrumbs.length=0;for(let e of this.cancelWaits)e();for(let e of this.controllers)e.abort();this.resolveDestroy(F)}}getStats(){return{queued:this.queue.length,sent:this.sent,dropped:this.dropped}}absoluteUrl(e){try{return new URL(e,window.location.href).href}catch{return e}}isCollectorUrl(e){if(!this.endpoint)return!1;try{let t=new URL(e,window.location.href),n=new URL(this.endpoint,window.location.href);return t.origin===n.origin&&t.pathname===n.pathname}catch{return e===this.endpoint}}cleanUrl(e){let t=w(e);if(this.options.sanitizeUrl){try{t=this.options.sanitizeUrl(t)}catch{throw new B("URL sanitizer failed")}if(typeof t!="string"||!t)throw new B("URL sanitizer returned no URL")}try{let n=new URL(t,window.location.href);return n.protocol!=="http:"&&n.protocol!=="https:"?"[unsupported URL]":(n.username="",n.password="",n.search="",n.hash="",this.cleanText(n.href,1024,!1))}catch{return this.cleanText(t,1024,!1).split(/[?#]/,1)[0]}}cleanText(e,t,n=!0){let i=w(e);return n&&(i=i.replace(/https?:\/\/[^\s<>"'()[\]]+/gi,o=>this.cleanUrl(o)),i=i.replace(/(^|[\s"'(\[=])((?:\/(?!\/)|\.{1,2}\/)[^\s<>"'()[\]?#]*[?#][^\s<>"'()[\]]+|[a-z][\w.-]*(?:\/[^\s<>"'()[\]?#]*)?(?:\?[a-z0-9_.-]+=[^\s<>"'()[\]]+|#[^\s<>"'()[\]]+)|\?[a-z0-9_.-]+=[^\s<>"'()[\]]+)/gi,(o,a,c)=>{let d=/[.,;!]+$/.exec(c)?.[0]??"",u=c.slice(0,c.length-d.length),l=this.options.sanitizeUrl?this.cleanUrl(u):u.startsWith("?")?"[redacted query]":this.cleanText(u.split(/[?#]/,1)[0],1024,!1);return`${a}${l}${d}`})),i.replace(/\bBearer\s+[A-Za-z0-9._~+\/-]+/gi,"Bearer [REDACTED]").replace(/[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}/gi,"[REDACTED_EMAIL]").slice(0,t)}cleanContext(e){if(!e||typeof e!="object")return;let t={},n;try{n=Object.keys(e)}catch{return}for(let i of n){if(Object.keys(t).length>=12)break;if(D.test(i))continue;let o=s(e,i),a=this.cleanText(i,80);typeof o=="string"?t[a]=this.cleanText(o,500):(typeof o=="number"&&Number.isFinite(o)||typeof o=="boolean"||o===null)&&(t[a]=o)}return Object.keys(t).length?t:void 0}cleanBreadcrumb(e,t){if(!e||typeof e!="object")return;let n=t??s(e,"occurredAt");if(typeof n!="string")return;try{if(new Date(n).toISOString()!==n)return}catch{return}let i=s(e,"category"),o=s(e,"message");if(i!==void 0&&typeof i!="string"||typeof o!="string")return;let a=this.cleanText(i??(t?"manual":""),k.category),c=this.cleanText(o,k.message);if(!a.trim()||!c.trim())return;let d=s(e,"data"),u={};if(d&&typeof d=="object"){let l;try{l=Object.keys(d)}catch{l=[]}for(let p of l){if(Object.keys(u).length>=k.dataKeys)break;if(D.test(p))continue;let f=this.cleanText(p,k.dataKey),y=s(d,p);typeof y=="string"?u[f]=this.cleanText(y,k.dataString):(typeof y=="number"&&Number.isFinite(y)||typeof y=="boolean"||y===null)&&(u[f]=y)}}return{occurredAt:n,category:a,message:c,...Object.keys(u).length?{data:u}:{}}}boundBreadcrumbs(e){for(;e.length>k.count||T(JSON.stringify(e))>k.bytes;)e.shift()}cleanBreadcrumbTrail(e){let t;try{if(!Array.isArray(e))return;t=e.length}catch{return}if(!Number.isSafeInteger(t)||t<0)return;let n=[];for(let i=Math.max(0,t-k.count);i<t;i++){let o=this.cleanBreadcrumb(s(e,i));o&&(n.push(o),this.boundBreadcrumbs(n))}return n.length?n:void 0}cleanNetwork(e){if(!e||typeof e!="object")return;let t=s(e,"status"),n=typeof t=="number"&&Number.isInteger(t)&&t>=100&&t<=599?t:void 0;return{method:this.cleanText(s(e,"method")??"GET",16).toUpperCase(),url:this.cleanUrl(s(e,"url")??""),...n===void 0?{}:{status:n},durationMs:C(s(e,"durationMs"),0,36e5,0)}}makeEvent(e,t,n={}){let i=s(navigator,"userAgent"),o=this.cleanContext(n.context),a;try{a=this.options.getContext?.()}catch{throw new O("Context resolver failed")}let c=this.cleanContext(a),d=this.cleanContext(this.options.context),u=o;if(c||d){u={...o};for(let p of[c,d])if(p)for(let f of Object.keys(p)){if(Object.keys(u).length>=12)break;Object.prototype.hasOwnProperty.call(u,f)||(u[f]=p[f])}}let l=this.cleanNetwork(n.network);return{schemaVersion:1,eventId:z(),project:this.cleanText(this.options.project,80),environment:this.cleanText(this.options.environment??"development",80),release:this.cleanText(this.options.release??"unknown",120),sdkVersion:"0.1.17",occurredAt:new Date().toISOString(),viewId:this.viewId,sequence:++this.sequence,elapsedMs:C(S()-this.startedAt,0,36e5,0),type:e,message:this.cleanText(t,1024),...n.name===void 0?{}:{name:this.cleanText(n.name,100)},...n.stack===void 0?{}:{stack:this.cleanText(n.stack,4096)},...n.componentStack===void 0?{}:{componentStack:this.cleanText(n.componentStack,2048)},page:this.cleanUrl(window.location.href),runtime:H.has(this.options.runtime)?this.options.runtime:"browser",...typeof i=="string"?{browser:this.cleanText(i,300)}:{},...u?{context:u}:{},...this.breadcrumbs.length?{breadcrumbs:this.breadcrumbs.map(p=>({...p,...p.data?{data:{...p.data}}:{}}))}:{},...l?{network:l}:{}}}sanitizeReplacement(e,t){let n=s(e,"type"),i=s(e,"runtime"),o=s(e,"name"),a=s(e,"stack"),c=s(e,"componentStack"),d=s(e,"browser"),u=this.cleanContext(s(e,"context")),l=this.cleanBreadcrumbTrail(s(e,"breadcrumbs")),p=this.cleanNetwork(s(e,"network"));return{...t,type:_.has(n)?n:t.type,message:this.cleanText(s(e,"message")??t.message,1024),...o===void 0?{name:t.name}:{name:this.cleanText(o,100)},...a===void 0?{stack:t.stack}:{stack:this.cleanText(a,4096)},...c===void 0?{componentStack:t.componentStack}:{componentStack:this.cleanText(c,2048)},page:this.cleanUrl(s(e,"page")??t.page),runtime:H.has(i)?i:t.runtime,...d===void 0?{browser:t.browser}:{browser:this.cleanText(d,300)},...u?{context:u}:{context:void 0},...l?{breadcrumbs:l}:{breadcrumbs:void 0},...p?{network:p}:{network:void 0}}}enqueue(e){if(this.destroyed)return!1;let t=e;if(this.options.beforeSend)try{let n={...e,context:e.context&&{...e.context},breadcrumbs:e.breadcrumbs?.map(o=>({...o,data:o.data&&{...o.data}})),network:e.network&&{...e.network}},i=this.options.beforeSend(n);if(i===!1||i===null)return!1;t=this.sanitizeReplacement(i===void 0?n:i,e)}catch{return this.dropped++,!1}return T(JSON.stringify(t))>U?(this.dropped++,!1):(this.queue.length>=this.maxQueueSize&&(this.queue.shift(),this.dropped++),this.queue.push(t),this.queue.length>=this.maxQueueSize&&this.flush(),!0)}takeBatch(e=$,t=U){let n=[],i=T('{"schemaVersion":1,"events":[]}');for(;this.queue.length&&n.length<e;){let o=this.queue[0],a=T(JSON.stringify(o))+(n.length?1:0);if(n.length&&i+a>t)break;if(!n.length&&i+a>t){this.queue.shift(),this.dropped++;continue}n.push(this.queue.shift()),i+=a}return{schemaVersion:1,events:n}}async drain(){for(;!this.destroyed&&this.queue.length;){let e=this.takeBatch();if(e.events.length){this.inFlight+=e.events.length;try{await this.sendWithRetry(e)}finally{this.inFlight-=e.events.length}}}}async sendWithRetry(e){for(let t=0;t<=P.length&&!this.destroyed;t++){let n=new AbortController;this.controllers.add(n);let i,o=new Promise((c,d)=>{i=setTimeout(()=>{n.abort(),d(new Error("Collector transport timed out"))},this.transportTimeoutMs)}),a;try{if(await Promise.race([this.send(e,n.signal),o,this.destroySignal])===F||this.destroyed)return;this.sent+=e.events.length;return}catch(c){if(this.destroyed)return;let d=s(c,"status");if(!(typeof d!="number"||d===429||d>=500)||t===P.length)break;a=P[t]}finally{i&&clearTimeout(i),this.controllers.delete(n)}a!==void 0&&await this.wait(a)}this.destroyed||(this.dropped+=e.events.length)}async send(e,t){if(this.options.transport){await this.options.transport(e,{signal:t});return}let n=await window.fetch(this.endpoint,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e),credentials:"omit",signal:t});if(!n.ok)throw new q(n.status)}wait(e){return new Promise(t=>{let n=()=>{clearTimeout(i),this.cancelWaits.delete(n),t()},i=setTimeout(n,e);this.cancelWaits.add(n)})}tryBeacon(){if(!(this.destroyed||this.options.transport||!this.endpoint||!this.queue.length))try{let e=new URL(this.endpoint);if(e.origin!==window.location.origin||e.search||e.hash||e.username||e.password||typeof navigator.sendBeacon!="function")return;let t=this.queue.slice(0,J);for(;t.length>0;){let i=JSON.stringify({schemaVersion:1,events:t});if(T(i)<=Y){navigator.sendBeacon(this.endpoint,new Blob([i],{type:"application/json"}))&&(this.queue.splice(0,t.length),this.sent+=t.length);return}t.pop()}}catch{}}},F=Symbol("destroyed"),L,j,A;function Z(r){A||(A=te()),A?.clients.add(r)}function ee(r){let e=A;e&&(e.clients.delete(r),e.clients.size||(e.cleanup(),A=void 0))}function V(r,e){let t=new Set,n=Object.getPrototypeOf(r);for(;n&&!t.has(n);){t.add(n);let i=Object.getOwnPropertyDescriptor(n,e);if(i)return i;n=Object.getPrototypeOf(n)}}function te(){let r,e,t,n,i,o,a,c;try{if(r=window.history,e=window.location.href,i=Object.getOwnPropertyDescriptor(r,"pushState"),o=Object.getOwnPropertyDescriptor(r,"replaceState"),a=i?void 0:V(r,"pushState"),c=o?void 0:V(r,"replaceState"),i&&!("value"in i)||o&&!("value"in o)||!i&&(!a||!("value"in a)||a.writable!==!0)||!o&&(!c||!("value"in c)||c.writable!==!0)||(t=i?i.value:r.pushState,n=o?o.value:r.replaceState,typeof t!="function"||typeof n!="function"))return;let v=m=>m?m.configurable===!0||m.writable===!0:Object.isExtensible(r);if(!v(i)||!v(o))return}catch{return}let d=new Set,u=v=>{try{let m=window.location.href;if(m===e)return;let x=e;e=m;for(let b of d)try{b.reportNavigation(x,m,v)}catch{}}catch{}},l=function(...v){let m=Reflect.apply(t,this,v);return u("pushState"),m},p=function(...v){let m=Reflect.apply(n,this,v);return u("replaceState"),m},f=()=>{u("popstate")},y=()=>{u("hashchange")},g=(v,m,x)=>{try{let b=Object.getOwnPropertyDescriptor(r,v);if(!b||!("value"in b)||b.value!==m)return;x?Object.defineProperty(r,v,x):Reflect.deleteProperty(r,v)}catch{}},E=!1,R=!1;try{Object.defineProperty(r,"pushState",{configurable:i?.configurable??!0,enumerable:i?.enumerable??!1,writable:i?.writable??!0,value:l}),E=!0,Object.defineProperty(r,"replaceState",{configurable:o?.configurable??!0,enumerable:o?.enumerable??!1,writable:o?.writable??!0,value:p}),R=!0,window.addEventListener("popstate",f),window.addEventListener("hashchange",y)}catch{try{window.removeEventListener("hashchange",y)}catch{}try{window.removeEventListener("popstate",f)}catch{}R&&g("replaceState",p,o),E&&g("pushState",l,i);return}return{clients:d,cleanup(){try{window.removeEventListener("popstate",f)}catch{}try{window.removeEventListener("hashchange",y)}catch{}g("pushState",l,i),g("replaceState",p,o)}}}function ne(r){L||(L=oe()),L.clients.add(r)}function re(r){let e=L;e&&(e.clients.delete(r),e.clients.size||(e.cleanup(),L=void 0))}function ie(r,e){let t;if(typeof Request<"u"&&r!==null&&typeof r=="object")if(r instanceof Request)t=s(r,"url");else try{t=Object.getOwnPropertyDescriptor(Request.prototype,"url")?.get?.call(r)}catch{}let n=s(e,"signal");return{url:t??w(r),method:w(s(e,"method")??(t===void 0?void 0:s(r,"method"))??"GET"),signal:n===void 0?t===void 0?void 0:s(r,"signal"):n}}function oe(){let r=new Set,e=window.fetch,t;typeof e=="function"&&(t=function(...l){if(!r.size)return Reflect.apply(e,this,l);let p=S(),f;try{f=ie(l[0],l[1])}catch{f={url:"",method:"GET"}}let y;try{y=Reflect.apply(e,this,l)}catch(g){if(!N(g,f.signal))for(let E of r)E.reportNetwork(f.method,f.url,void 0,S()-p,g);throw g}return y.then(g=>{try{let E=g.status;for(let R of r)R.reportNetwork(f.method,f.url,E,S()-p)}catch{}return g},g=>{if(!N(g,f.signal))for(let E of r)E.reportNetwork(f.method,f.url,void 0,S()-p,g);throw g})},window.fetch=t);let n=typeof XMLHttpRequest>"u"?void 0:XMLHttpRequest.prototype,i=n?.open,o=n?.send,a=new WeakMap,c=new WeakMap,d,u;return n&&i&&o&&(d=(function(...l){let p=Reflect.apply(i,this,l);c.get(this)?.();try{a.set(this,{method:w(l[0]),url:w(l[1])})}catch{}return p}),u=function(...l){if(!r.size)return Reflect.apply(o,this,l);let p=a.get(this);if(!p)return Reflect.apply(o,this,l);let f=S(),y=!1,g=!1,E=!1,R=()=>{y=!0},v=()=>{g=!0},m=()=>{this.removeEventListener("abort",R),this.removeEventListener("error",v),this.removeEventListener("timeout",v),this.removeEventListener("loadend",x),c.get(this)===m&&c.delete(this)},x=()=>{if(E=!0,m(),!y)try{let b=this.status;if(b===0&&!g)return;for(let X of r)X.reportNetwork(p.method,p.url,b===0?void 0:b,S()-f)}catch{}};try{this.addEventListener("abort",R),this.addEventListener("error",v),this.addEventListener("timeout",v),this.addEventListener("loadend",x)}catch{return m(),Reflect.apply(o,this,l)}try{let b=Reflect.apply(o,this,l);return E||c.set(this,m),b}catch(b){throw m(),b}},n.open=d,n.send=u),{clients:r,cleanup(){t&&window.fetch===t&&(window.fetch=e),n&&d&&n.open===d&&(n.open=i),n&&u&&n.send===u&&(n.send=o)}}}function se(r){j||(j=ce()),j.clients.add(r)}function ae(r){let e=j;e&&(e.clients.delete(r),e.clients.size||(e.cleanup(),j=void 0))}function ce(){let r=new Set,e=console.error,t=function(...n){try{return Reflect.apply(e,this,n)}finally{for(let i of r)i.captureConsole(n)}};return console.error=t,{clients:r,cleanup(){console.error===t&&(console.error=e)}}}function pe(r){return new M(r)}export{pe as init};
1
+ var K=Object.defineProperty;var $=(r,e,n)=>e in r?K(r,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):r[e]=n;var l=(r,e,n)=>$(r,typeof e!="symbol"?e+"":e,n);var k={count:20,bytes:12e3,category:40,message:256,dataKeys:6,dataKey:80,dataString:200};var W=20,D=48e3,J=10,Y=24e3,M=[250,500],_=/(?:password|passwd|token|secret|authorization|cookie|session|api.?key|credential|bearer|private.?key)/i,H=new Set(["javascript","promise","react","console","http","network","manual"]),F=new Set(["browser","webview-ios","webview-android","unknown"]),Z=0;function s(r,e){try{return r==null?void 0:Reflect.get(Object(r),e)}catch{return}}function w(r){try{return String(r)}catch{return"[unavailable]"}}function G(r,e){return w(r).slice(0,e)}function S(){try{return performance.now()}catch{return Date.now()}}function z(){try{if(typeof crypto<"u"&&typeof crypto.randomUUID=="function")return crypto.randomUUID()}catch{}return`${Date.now().toString(36)}-${(++Z).toString(36)}-${Math.random().toString(36).slice(2,10)}`}function L(r,e){try{if(e?.aborted)return!0}catch{}return s(r,"name")==="AbortError"||s(r,"code")===20}function I(r){if(r==null)return{message:"Unknown error"};let e=s(r,"message"),n=s(r,"name"),t=s(r,"stack");return{message:e==null?w(r):w(e),...n==null?{}:{name:w(n)},...t==null?{}:{stack:w(t)}}}function C(r){return new TextEncoder().encode(r).length}function T(r,e,n,t){return typeof r=="number"&&Number.isFinite(r)?Math.min(n,Math.max(e,Math.floor(r))):t}var q=class extends Error{constructor(n){super(`Collector responded ${n}`);l(this,"status",n)}},B=class extends Error{},j=class extends Error{},U=class{constructor(e){l(this,"active");l(this,"endpoint");l(this,"options");l(this,"networkCaptureEnabled");l(this,"networkBreadcrumbCaptureEnabled");l(this,"navigationCaptureEnabled");l(this,"transportTimeoutMs");l(this,"startedAt",S());l(this,"viewId",z());l(this,"seenErrors",new WeakSet);l(this,"queue",[]);l(this,"breadcrumbs",[]);l(this,"maxQueueSize");l(this,"maxEventsPerMinute");l(this,"admittedAt",[]);l(this,"cancelWaits",new Set);l(this,"controllers",new Set);l(this,"destroySignal");l(this,"resolveDestroy");l(this,"interval");l(this,"flushing");l(this,"sequence",0);l(this,"inFlight",0);l(this,"sent",0);l(this,"dropped",0);l(this,"destroyed",!1);l(this,"lastAdmissionClock");l(this,"onError",e=>{try{let n=s(e,"filename"),t=s(e,"lineno"),i=s(e,"colno"),o={};typeof n=="string"&&n.trim()&&(o.filename=this.cleanUrl(n)),typeof t=="number"&&Number.isFinite(t)&&t>0&&(o.lineno=t),typeof i=="number"&&Number.isFinite(i)&&i>0&&(o.colno=i),this.captureException(s(e,"error")??s(e,"message")??"Script error",{type:"javascript",...Object.keys(o).length?{context:o}:{}})}catch{this.dropped++}});l(this,"onRejection",e=>{this.captureException(e.reason,{type:"promise"})});l(this,"onVisibility",()=>{document.visibilityState==="hidden"&&this.tryBeacon()});this.options=e,this.active=e.enabled!==!1&&typeof window<"u"&&typeof document<"u";let n=!e.transport||!!e.endpoint;if(this.networkCaptureEnabled=e.captureNetwork!==!1&&n,this.networkBreadcrumbCaptureEnabled=e.captureNetworkBreadcrumbs===!0&&n,this.navigationCaptureEnabled=e.captureNavigation===!0,this.maxQueueSize=T(e.maxQueueSize,1,100,50),this.maxEventsPerMinute=typeof e.maxEventsPerMinute=="number"&&Number.isFinite(e.maxEventsPerMinute)?T(e.maxEventsPerMinute,1,1e3,1):void 0,this.transportTimeoutMs=T(e.transportTimeoutMs,250,6e4,5e3),this.destroySignal=new Promise(t=>{this.resolveDestroy=t}),!!this.active){if(!e.project||typeof e.project!="string")throw new Error("project is required");if(!e.transport&&!e.endpoint)throw new Error("endpoint or transport is required");this.endpoint=e.endpoint?this.absoluteUrl(e.endpoint):void 0,window.addEventListener("error",this.onError),window.addEventListener("unhandledrejection",this.onRejection),document.addEventListener("visibilitychange",this.onVisibility),(this.networkCaptureEnabled||this.networkBreadcrumbCaptureEnabled)&&ne(this),e.captureConsole===!0&&se(this),this.navigationCaptureEnabled&&Q(this),this.interval=setInterval(()=>{this.flush()},T(e.flushIntervalMs,10,6e4,1e4))}}captureException(e,n={}){if(!(!this.active||this.destroyed||L(e)))try{if(e!==null&&(typeof e=="object"||typeof e=="function")&&this.seenErrors.has(e))return;let t=I(e),i=H.has(n.type)?n.type:"manual",o=this.makeEvent(i,t.message,{name:t.name,stack:t.stack,componentStack:n.componentStack,context:n.context});this.enqueue(o)&&e!==null&&(typeof e=="object"||typeof e=="function")&&this.seenErrors.add(e)}catch(t){(t instanceof B||t instanceof j)&&this.dropped++}}reportNetwork(e,n,t,i,o,c=!0){if(this.destroyed||!this.active||this.isCollectorUrl(n)||L(o))return;let d=this.networkCaptureEnabled&&c;if(d&&t!==void 0)try{d=this.options.shouldCaptureHttp?this.options.shouldCaptureHttp(t,n,e):t>=500}catch{this.dropped++;return}if(this.networkBreadcrumbCaptureEnabled)try{let u=this.cleanBreadcrumbUrl(n);if(u.url){let a={method:this.cleanNetworkBreadcrumbMethod(e),url:u.url,durationMs:T(i,0,36e5,0)};t!==void 0&&Number.isInteger(t)&&t>=0&&t<=599&&(a.status=t),this.breadcrumbs.push({occurredAt:new Date().toISOString(),category:t===void 0?"network":"http",message:t===void 0?"Network failure":"HTTP response",data:a}),this.boundBreadcrumbs(this.breadcrumbs)}else if(d&&!u.safeForError){this.dropped++;return}}catch{d&&this.dropped++;return}if(d)try{let u={method:G(e||"GET",16).toUpperCase(),url:n,status:t,durationMs:i},a=o===void 0?void 0:I(o),h=this.makeEvent(t===void 0?"network":"http",t===void 0?a?.message||"Network request failed":`HTTP ${t}`,{name:a?.name,network:u});this.enqueue(h)}catch{this.dropped++}}reportZeroStatusCompletion(e,n,t){this.networkBreadcrumbCaptureEnabled&&this.reportNetwork(e,n,0,t,void 0,!1)}captureConsole(e){if(!(!this.active||this.destroyed))try{let n=e.map(w).join(" "),t;for(let i of e)try{if(i instanceof Error){t=I(i);break}}catch{}this.enqueue(this.makeEvent("console",n,{name:t?.name,stack:t?.stack}))}catch{this.dropped++}}addBreadcrumb(e){if(!(!this.active||this.destroyed))try{let n=this.cleanBreadcrumb(e,new Date().toISOString());if(!n)return;this.breadcrumbs.push(n),this.boundBreadcrumbs(this.breadcrumbs)}catch{}}reportNavigation(e,n,t){if(!(!this.active||this.destroyed||!this.navigationCaptureEnabled))try{let i=this.cleanBreadcrumbUrl(e).url,o=this.cleanBreadcrumbUrl(n).url;if(!i||!o||i===o)return;this.breadcrumbs.push({occurredAt:new Date().toISOString(),category:"navigation",message:"Navigation",data:{from:i,to:o,trigger:t}}),this.boundBreadcrumbs(this.breadcrumbs)}catch{}}clearBreadcrumbs(){!this.active||this.destroyed||(this.breadcrumbs.length=0)}flush(){return!this.active||this.destroyed?Promise.resolve():this.flushing?this.flushing:(this.flushing=this.drain().finally(()=>{this.flushing=void 0}),this.flushing)}destroy(){if(!this.destroyed){this.destroyed=!0,this.interval&&clearInterval(this.interval),this.active&&(window.removeEventListener("error",this.onError),window.removeEventListener("unhandledrejection",this.onRejection),document.removeEventListener("visibilitychange",this.onVisibility),(this.networkCaptureEnabled||this.networkBreadcrumbCaptureEnabled)&&re(this),this.options.captureConsole===!0&&ae(this),this.navigationCaptureEnabled&&ee(this)),this.dropped+=this.queue.length+this.inFlight,this.queue.length=0,this.breadcrumbs.length=0,this.admittedAt.length=0,this.lastAdmissionClock=void 0;for(let e of this.cancelWaits)e();for(let e of this.controllers)e.abort();this.resolveDestroy(V)}}getStats(){return{queued:this.queue.length,sent:this.sent,dropped:this.dropped}}absoluteUrl(e){try{return new URL(e,window.location.href).href}catch{return e}}isCollectorUrl(e){if(!this.endpoint)return!1;try{let n=new URL(e,window.location.href),t=new URL(this.endpoint,window.location.href);return n.origin===t.origin&&n.pathname===t.pathname}catch{return e===this.endpoint}}cleanUrl(e){let n=w(e);if(this.options.sanitizeUrl){try{n=this.options.sanitizeUrl(n)}catch{throw new B("URL sanitizer failed")}if(typeof n!="string"||!n)throw new B("URL sanitizer returned no URL")}try{let t=new URL(n,window.location.href);return t.protocol!=="http:"&&t.protocol!=="https:"?"[unsupported URL]":(t.username="",t.password="",t.search="",t.hash="",this.cleanText(t.href,1024,!1))}catch{return this.cleanText(n,1024,!1).split(/[?#]/,1)[0]}}cleanBreadcrumbUrl(e){let n=this.cleanUrl(e);if(n==="[unsupported URL]")return{safeForError:!0};try{let t=new URL(n);return t.protocol!=="http:"&&t.protocol!=="https:"||t.username||t.password||t.search||t.hash?{safeForError:!1}:{url:n.slice(0,k.dataString),safeForError:!0}}catch{return{safeForError:!1}}}cleanNetworkBreadcrumbMethod(e){let n=w(e||"GET").trim().toUpperCase();return/^[A-Z0-9!#$%&'*+.^_`|~-]{1,16}$/.test(n)?n:"GET"}cleanText(e,n,t=!0){let i=w(e);return t&&(i=i.replace(/https?:\/\/[^\s<>"'()[\]]+/gi,o=>this.cleanUrl(o)),i=i.replace(/(^|[\s"'(\[=])((?:\/(?!\/)|\.{1,2}\/)[^\s<>"'()[\]?#]*[?#][^\s<>"'()[\]]+|[a-z][\w.-]*(?:\/[^\s<>"'()[\]?#]*)?(?:\?[a-z0-9_.-]+=[^\s<>"'()[\]]+|#[^\s<>"'()[\]]+)|\?[a-z0-9_.-]+=[^\s<>"'()[\]]+)/gi,(o,c,d)=>{let u=/[.,;!]+$/.exec(d)?.[0]??"",a=d.slice(0,d.length-u.length),h=this.options.sanitizeUrl?this.cleanUrl(a):a.startsWith("?")?"[redacted query]":this.cleanText(a.split(/[?#]/,1)[0],1024,!1);return`${c}${h}${u}`})),i.replace(/\bBearer\s+[A-Za-z0-9._~+\/-]+/gi,"Bearer [REDACTED]").replace(/[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}/gi,"[REDACTED_EMAIL]").slice(0,n)}cleanContext(e){if(!e||typeof e!="object")return;let n={},t;try{t=Object.keys(e)}catch{return}for(let i of t){if(Object.keys(n).length>=12)break;if(_.test(i))continue;let o=s(e,i),c=this.cleanText(i,80);typeof o=="string"?n[c]=this.cleanText(o,500):(typeof o=="number"&&Number.isFinite(o)||typeof o=="boolean"||o===null)&&(n[c]=o)}return Object.keys(n).length?n:void 0}cleanBreadcrumb(e,n){if(!e||typeof e!="object")return;let t=n??s(e,"occurredAt");if(typeof t!="string")return;try{if(new Date(t).toISOString()!==t)return}catch{return}let i=s(e,"category"),o=s(e,"message");if(i!==void 0&&typeof i!="string"||typeof o!="string")return;let c=this.cleanText(i??(n?"manual":""),k.category),d=this.cleanText(o,k.message);if(!c.trim()||!d.trim())return;let u=s(e,"data"),a={};if(u&&typeof u=="object"){let h;try{h=Object.keys(u)}catch{h=[]}for(let p of h){if(Object.keys(a).length>=k.dataKeys)break;if(_.test(p))continue;let f=this.cleanText(p,k.dataKey),y=s(u,p);typeof y=="string"?a[f]=this.cleanText(y,k.dataString):(typeof y=="number"&&Number.isFinite(y)||typeof y=="boolean"||y===null)&&(a[f]=y)}}return{occurredAt:t,category:c,message:d,...Object.keys(a).length?{data:a}:{}}}boundBreadcrumbs(e){for(;e.length>k.count||C(JSON.stringify(e))>k.bytes;)e.shift()}cleanBreadcrumbTrail(e){let n;try{if(!Array.isArray(e))return;n=e.length}catch{return}if(!Number.isSafeInteger(n)||n<0)return;let t=[];for(let i=Math.max(0,n-k.count);i<n;i++){let o=this.cleanBreadcrumb(s(e,i));o&&(t.push(o),this.boundBreadcrumbs(t))}return t.length?t:void 0}cleanNetwork(e){if(!e||typeof e!="object")return;let n=s(e,"status"),t=typeof n=="number"&&Number.isInteger(n)&&n>=100&&n<=599?n:void 0;return{method:this.cleanText(s(e,"method")??"GET",16).toUpperCase(),url:this.cleanUrl(s(e,"url")??""),...t===void 0?{}:{status:t},durationMs:T(s(e,"durationMs"),0,36e5,0)}}makeEvent(e,n,t={}){let i=s(navigator,"userAgent"),o=this.cleanContext(t.context),c;try{c=this.options.getContext?.()}catch{throw new j("Context resolver failed")}let d=this.cleanContext(c),u=this.cleanContext(this.options.context),a=o;if(d||u){a={...o};for(let p of[d,u])if(p)for(let f of Object.keys(p)){if(Object.keys(a).length>=12)break;Object.prototype.hasOwnProperty.call(a,f)||(a[f]=p[f])}}let h=this.cleanNetwork(t.network);return{schemaVersion:1,eventId:z(),project:this.cleanText(this.options.project,80),environment:this.cleanText(this.options.environment??"development",80),release:this.cleanText(this.options.release??"unknown",120),sdkVersion:"0.1.19",occurredAt:new Date().toISOString(),viewId:this.viewId,sequence:++this.sequence,elapsedMs:T(S()-this.startedAt,0,36e5,0),type:e,message:this.cleanText(n,1024),...t.name===void 0?{}:{name:this.cleanText(t.name,100)},...t.stack===void 0?{}:{stack:this.cleanText(t.stack,4096)},...t.componentStack===void 0?{}:{componentStack:this.cleanText(t.componentStack,2048)},page:this.cleanUrl(window.location.href),runtime:F.has(this.options.runtime)?this.options.runtime:"browser",...typeof i=="string"?{browser:this.cleanText(i,300)}:{},...a?{context:a}:{},...this.breadcrumbs.length?{breadcrumbs:this.breadcrumbs.map(p=>({...p,...p.data?{data:{...p.data}}:{}}))}:{},...h?{network:h}:{}}}sanitizeReplacement(e,n){let t=s(e,"type"),i=s(e,"runtime"),o=s(e,"name"),c=s(e,"stack"),d=s(e,"componentStack"),u=s(e,"browser"),a=this.cleanContext(s(e,"context")),h=this.cleanBreadcrumbTrail(s(e,"breadcrumbs")),p=this.cleanNetwork(s(e,"network"));return{...n,type:H.has(t)?t:n.type,message:this.cleanText(s(e,"message")??n.message,1024),...o===void 0?{name:n.name}:{name:this.cleanText(o,100)},...c===void 0?{stack:n.stack}:{stack:this.cleanText(c,4096)},...d===void 0?{componentStack:n.componentStack}:{componentStack:this.cleanText(d,2048)},page:this.cleanUrl(s(e,"page")??n.page),runtime:F.has(i)?i:n.runtime,...u===void 0?{browser:n.browser}:{browser:this.cleanText(u,300)},...a?{context:a}:{context:void 0},...h?{breadcrumbs:h}:{breadcrumbs:void 0},...p?{network:p}:{network:void 0}}}admissionTime(){let e=S(),n=Number.isFinite(e)?Math.max(0,e,this.lastAdmissionClock??0):this.lastAdmissionClock??0;for(this.lastAdmissionClock=n;this.admittedAt.length&&n-this.admittedAt[0]>=6e4;)this.admittedAt.shift();return this.admittedAt.length<this.maxEventsPerMinute?n:void 0}enqueue(e){if(this.destroyed)return!1;if(this.maxEventsPerMinute!==void 0&&this.admissionTime()===void 0)return this.dropped++,!1;let n=e;if(this.options.beforeSend)try{let i={...e,context:e.context&&{...e.context},breadcrumbs:e.breadcrumbs?.map(c=>({...c,data:c.data&&{...c.data}})),network:e.network&&{...e.network}},o=this.options.beforeSend(i);if(o===!1||o===null)return!1;n=this.sanitizeReplacement(o===void 0?i:o,e)}catch{return this.dropped++,!1}if(C(JSON.stringify(n))>D)return this.dropped++,!1;let t=this.maxEventsPerMinute===void 0?void 0:this.admissionTime();return this.maxEventsPerMinute!==void 0&&t===void 0?(this.dropped++,!1):(this.queue.length>=this.maxQueueSize&&(this.queue.shift(),this.dropped++),this.queue.push(n),t!==void 0&&this.admittedAt.push(t),this.queue.length>=this.maxQueueSize&&this.flush(),!0)}takeBatch(e=W,n=D){let t=[],i=C('{"schemaVersion":1,"events":[]}');for(;this.queue.length&&t.length<e;){let o=this.queue[0],c=C(JSON.stringify(o))+(t.length?1:0);if(t.length&&i+c>n)break;if(!t.length&&i+c>n){this.queue.shift(),this.dropped++;continue}t.push(this.queue.shift()),i+=c}return{schemaVersion:1,events:t}}async drain(){for(;!this.destroyed&&this.queue.length;){let e=this.takeBatch();if(e.events.length){this.inFlight+=e.events.length;try{await this.sendWithRetry(e)}finally{this.inFlight-=e.events.length}}}}async sendWithRetry(e){for(let n=0;n<=M.length&&!this.destroyed;n++){let t=new AbortController;this.controllers.add(t);let i,o=new Promise((d,u)=>{i=setTimeout(()=>{t.abort(),u(new Error("Collector transport timed out"))},this.transportTimeoutMs)}),c;try{if(await Promise.race([this.send(e,t.signal),o,this.destroySignal])===V||this.destroyed)return;this.sent+=e.events.length;return}catch(d){if(this.destroyed)return;let u=s(d,"status");if(!(typeof u!="number"||u===429||u>=500)||n===M.length)break;c=M[n]}finally{i&&clearTimeout(i),this.controllers.delete(t)}c!==void 0&&await this.wait(c)}this.destroyed||(this.dropped+=e.events.length)}async send(e,n){if(this.options.transport){await this.options.transport(e,{signal:n});return}let t=await window.fetch(this.endpoint,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e),credentials:"omit",signal:n});if(!t.ok)throw new q(t.status)}wait(e){return new Promise(n=>{let t=()=>{clearTimeout(i),this.cancelWaits.delete(t),n()},i=setTimeout(t,e);this.cancelWaits.add(t)})}tryBeacon(){if(!(this.destroyed||this.options.transport||!this.endpoint||!this.queue.length))try{let e=new URL(this.endpoint);if(e.origin!==window.location.origin||e.search||e.hash||e.username||e.password||typeof navigator.sendBeacon!="function")return;let n=this.queue.slice(0,J);for(;n.length>0;){let i=JSON.stringify({schemaVersion:1,events:n});if(C(i)<=Y){navigator.sendBeacon(this.endpoint,new Blob([i],{type:"application/json"}))&&(this.queue.splice(0,n.length),this.sent+=n.length);return}n.pop()}}catch{}}},V=Symbol("destroyed"),A,N,P;function Q(r){P||(P=te()),P?.clients.add(r)}function ee(r){let e=P;e&&(e.clients.delete(r),e.clients.size||(e.cleanup(),P=void 0))}function X(r,e){let n=new Set,t=Object.getPrototypeOf(r);for(;t&&!n.has(t);){n.add(t);let i=Object.getOwnPropertyDescriptor(t,e);if(i)return i;t=Object.getPrototypeOf(t)}}function te(){let r,e,n,t,i,o,c,d;try{if(r=window.history,e=window.location.href,i=Object.getOwnPropertyDescriptor(r,"pushState"),o=Object.getOwnPropertyDescriptor(r,"replaceState"),c=i?void 0:X(r,"pushState"),d=o?void 0:X(r,"replaceState"),i&&!("value"in i)||o&&!("value"in o)||!i&&(!c||!("value"in c)||c.writable!==!0)||!o&&(!d||!("value"in d)||d.writable!==!0)||(n=i?i.value:r.pushState,t=o?o.value:r.replaceState,typeof n!="function"||typeof t!="function"))return;let b=m=>m?m.configurable===!0||m.writable===!0:Object.isExtensible(r);if(!b(i)||!b(o))return}catch{return}let u=new Set,a=b=>{try{let m=window.location.href;if(m===e)return;let R=e;e=m;for(let v of u)try{v.reportNavigation(R,m,b)}catch{}}catch{}},h=function(...b){let m=Reflect.apply(n,this,b);return a("pushState"),m},p=function(...b){let m=Reflect.apply(t,this,b);return a("replaceState"),m},f=()=>{a("popstate")},y=()=>{a("hashchange")},g=(b,m,R)=>{try{let v=Object.getOwnPropertyDescriptor(r,b);if(!v||!("value"in v)||v.value!==m)return;R?Object.defineProperty(r,b,R):Reflect.deleteProperty(r,b)}catch{}},E=!1,x=!1;try{Object.defineProperty(r,"pushState",{configurable:i?.configurable??!0,enumerable:i?.enumerable??!1,writable:i?.writable??!0,value:h}),E=!0,Object.defineProperty(r,"replaceState",{configurable:o?.configurable??!0,enumerable:o?.enumerable??!1,writable:o?.writable??!0,value:p}),x=!0,window.addEventListener("popstate",f),window.addEventListener("hashchange",y)}catch{try{window.removeEventListener("hashchange",y)}catch{}try{window.removeEventListener("popstate",f)}catch{}x&&g("replaceState",p,o),E&&g("pushState",h,i);return}return{clients:u,cleanup(){try{window.removeEventListener("popstate",f)}catch{}try{window.removeEventListener("hashchange",y)}catch{}g("pushState",h,i),g("replaceState",p,o)}}}function ne(r){A||(A=oe()),A.clients.add(r)}function re(r){let e=A;e&&(e.clients.delete(r),e.clients.size||(e.cleanup(),A=void 0))}function ie(r,e){let n;if(typeof Request<"u"&&r!==null&&typeof r=="object")if(r instanceof Request)n=s(r,"url");else try{n=Object.getOwnPropertyDescriptor(Request.prototype,"url")?.get?.call(r)}catch{}let t=s(e,"signal");return{url:n??w(r),method:w(s(e,"method")??(n===void 0?void 0:s(r,"method"))??"GET"),signal:t===void 0?n===void 0?void 0:s(r,"signal"):t}}function oe(){let r=new Set,e=window.fetch,n;typeof e=="function"&&(n=function(...h){if(!r.size)return Reflect.apply(e,this,h);let p=S(),f;try{f=ie(h[0],h[1])}catch{f={url:"",method:"GET"}}let y;try{y=Reflect.apply(e,this,h)}catch(g){if(!L(g,f.signal))for(let E of r)E.reportNetwork(f.method,f.url,void 0,S()-p,g);throw g}return y.then(g=>{try{let E=g.status;for(let x of r)x.reportNetwork(f.method,f.url,E,S()-p)}catch{}return g},g=>{if(!L(g,f.signal))for(let E of r)E.reportNetwork(f.method,f.url,void 0,S()-p,g);throw g})},window.fetch=n);let t=typeof XMLHttpRequest>"u"?void 0:XMLHttpRequest.prototype,i=t?.open,o=t?.send,c=new WeakMap,d=new WeakMap,u,a;return t&&i&&o&&(u=(function(...h){let p=Reflect.apply(i,this,h);d.get(this)?.();try{c.set(this,{method:w(h[0]),url:w(h[1])})}catch{}return p}),a=function(...h){if(!r.size)return Reflect.apply(o,this,h);let p=c.get(this);if(!p)return Reflect.apply(o,this,h);let f=S(),y=!1,g=!1,E=!1,x=()=>{y=!0},b=()=>{g=!0},m=()=>{this.removeEventListener("abort",x),this.removeEventListener("error",b),this.removeEventListener("timeout",b),this.removeEventListener("loadend",R),d.get(this)===m&&d.delete(this)},R=()=>{if(E=!0,m(),!y)try{let v=this.status;if(v===0&&!g){for(let O of r)O.reportZeroStatusCompletion(p.method,p.url,S()-f);return}for(let O of r)O.reportNetwork(p.method,p.url,v===0?void 0:v,S()-f)}catch{}};try{this.addEventListener("abort",x),this.addEventListener("error",b),this.addEventListener("timeout",b),this.addEventListener("loadend",R)}catch{return m(),Reflect.apply(o,this,h)}try{let v=Reflect.apply(o,this,h);return E||d.set(this,m),v}catch(v){throw m(),v}},t.open=u,t.send=a),{clients:r,cleanup(){n&&window.fetch===n&&(window.fetch=e),t&&u&&t.open===u&&(t.open=i),t&&a&&t.send===a&&(t.send=o)}}}function se(r){N||(N=ce()),N.clients.add(r)}function ae(r){let e=N;e&&(e.clients.delete(r),e.clients.size||(e.cleanup(),N=void 0))}function ce(){let r=new Set,e=console.error,n=function(...t){try{return Reflect.apply(e,this,t)}finally{for(let i of r)i.captureConsole(t)}};return console.error=n,{clients:r,cleanup(){console.error===n&&(console.error=e)}}}function he(r){return new U(r)}export{he as init};
2
2
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../protocol/src/index.ts", "../src/index.ts"],
4
- "sourcesContent": ["export const SCHEMA_VERSION = 1 as const;\nexport const SDK_VERSION = '0.1.17';\n\nexport type EventType = 'javascript' | 'promise' | 'react' | 'console' | 'http' | 'network' | 'manual';\nexport type Runtime = 'browser' | 'webview-ios' | 'webview-android' | 'unknown';\n\nexport const BREADCRUMB_LIMITS = {\n count: 20, bytes: 12_000, category: 40, message: 256,\n dataKeys: 6, dataKey: 80, dataString: 200,\n} as const;\n\nexport interface Breadcrumb {\n occurredAt: string;\n category: string;\n message: string;\n data?: Record<string, string | number | boolean | null>;\n}\n\n/** Validates the bounded, canonical UTC breadcrumb representation on the wire. */\nexport function isBreadcrumbTrail(value: unknown): value is Breadcrumb[] {\n try {\n if (!Array.isArray(value) || value.length > BREADCRUMB_LIMITS.count) return false;\n for (const item of value) {\n if (!item || typeof item !== 'object' || Array.isArray(item)) return false;\n if (Object.keys(item).some(key => !['occurredAt', 'category', 'message', 'data'].includes(key))) return false;\n if (typeof item.occurredAt !== 'string' || !Number.isFinite(Date.parse(item.occurredAt)) ||\n new Date(item.occurredAt).toISOString() !== item.occurredAt) return false;\n if (typeof item.category !== 'string' || !item.category.trim() || item.category.length > BREADCRUMB_LIMITS.category ||\n typeof item.message !== 'string' || !item.message.trim() || item.message.length > BREADCRUMB_LIMITS.message) return false;\n if (item.data !== undefined) {\n if (!item.data || typeof item.data !== 'object' || Array.isArray(item.data)) return false;\n const entries = Object.entries(item.data);\n if (entries.length > BREADCRUMB_LIMITS.dataKeys || entries.some(([key, field]) =>\n key.length > BREADCRUMB_LIMITS.dataKey || !(field === null || typeof field === 'boolean' ||\n (typeof field === 'string' && field.length <= BREADCRUMB_LIMITS.dataString) ||\n (typeof field === 'number' && Number.isFinite(field))))) return false;\n }\n }\n return new TextEncoder().encode(JSON.stringify(value)).length <= BREADCRUMB_LIMITS.bytes;\n } catch { return false; }\n}\n\nexport interface ErrorEventRecord {\n schemaVersion: 1;\n eventId: string;\n project: string;\n environment: string;\n release: string;\n sdkVersion: string;\n occurredAt: string;\n receivedAt?: string;\n viewId: string;\n sequence: number;\n elapsedMs: number;\n type: EventType;\n message: string;\n name?: string;\n stack?: string;\n componentStack?: string;\n page: string;\n runtime: Runtime;\n browser?: string;\n context?: Record<string, string | number | boolean | null>;\n breadcrumbs?: Breadcrumb[];\n network?: { method: string; url: string; status?: number; durationMs: number };\n}\n\nexport interface EventBatch { schemaVersion: 1; events: ErrorEventRecord[] }\nexport interface EventFilter {\n project?: string;\n environment?: string;\n type?: EventType;\n query?: string;\n from?: string;\n to?: string;\n cursor?: string;\n limit?: number;\n}\nexport interface EventPage { events: ErrorEventRecord[]; nextCursor?: string }\nexport interface EventDataSource {\n listEvents(filter: EventFilter, signal?: AbortSignal): Promise<EventPage>;\n getEvent(project: string, eventId: string, signal?: AbortSignal): Promise<ErrorEventRecord | null>;\n}\n\nexport const EVENT_LABELS: Record<EventType, string> = {\n javascript: 'JavaScript', promise: 'Promise', react: 'React', console: 'Console',\n http: 'HTTP error', network: 'Network failure', manual: 'Manual',\n};\n", "import { BREADCRUMB_LIMITS, type Breadcrumb, type ErrorEventRecord, type EventBatch, type EventType, type Runtime } from '@ihyeon/browser-error-log-protocol';\n\nexport type { Breadcrumb, ErrorEventRecord, EventBatch } from '@ihyeon/browser-error-log-protocol';\n\nexport interface CaptureExtra {\n type?: EventType;\n context?: Record<string, unknown>;\n componentStack?: string;\n}\n\nexport interface TransportContext { signal: AbortSignal }\n\nexport interface BrowserErrorLogOptions {\n project: string;\n environment?: string;\n release?: string;\n /** Scalar metadata added to every captured event; event context takes precedence. */\n context?: Record<string, unknown>;\n /** Returns scalar metadata from current application state for each new event. */\n getContext?: () => Record<string, unknown> | undefined;\n endpoint?: string;\n transport?: (batch: EventBatch, context: TransportContext) => void | Promise<void>;\n runtime?: Runtime;\n enabled?: boolean;\n captureConsole?: boolean;\n /** Records sanitized History navigation breadcrumbs; defaults to false. */\n captureNavigation?: boolean;\n /** Defaults to true. With a custom transport, automatic network capture requires endpoint for collector exclusion. */\n captureNetwork?: boolean;\n beforeSend?: (event: ErrorEventRecord) => ErrorEventRecord | false | null | void;\n sanitizeUrl?: (url: string) => string;\n shouldCaptureHttp?: (status: number, url: string, method: string) => boolean;\n flushIntervalMs?: number;\n maxQueueSize?: number;\n /** Per-attempt deadline, clamped to 250\u201360000 ms; defaults to 5000 ms. */\n transportTimeoutMs?: number;\n}\n\nexport interface BrowserErrorLogClient {\n captureException(error: unknown, extra?: CaptureExtra): void;\n flush(): Promise<void>;\n destroy(): void;\n getStats(): { queued: number; sent: number; dropped: number };\n}\n\nexport interface BreadcrumbInput {\n message: string;\n category?: string;\n data?: Record<string, unknown>;\n}\n\nexport interface BrowserErrorLogBreadcrumbClient extends BrowserErrorLogClient {\n addBreadcrumb(input: BreadcrumbInput): void;\n clearBreadcrumbs(): void;\n}\n\nconst MAX_BATCH_EVENTS = 20;\nconst MAX_BATCH_BYTES = 48_000;\nconst MAX_BEACON_EVENTS = 10;\nconst MAX_BEACON_BYTES = 24_000;\nconst RETRY_DELAYS_MS = [250, 500];\nconst SENSITIVE_KEY = /(?:password|passwd|token|secret|authorization|cookie|session|api.?key|credential|bearer|private.?key)/i;\nconst EVENT_TYPES = new Set<EventType>(['javascript', 'promise', 'react', 'console', 'http', 'network', 'manual']);\nconst RUNTIMES = new Set<Runtime>(['browser', 'webview-ios', 'webview-android', 'unknown']);\nlet fallbackId = 0;\n\nfunction read(object: unknown, key: PropertyKey): unknown {\n try { return object == null ? undefined : Reflect.get(Object(object), key); }\n catch { return undefined; }\n}\n\nfunction safeString(value: unknown): string {\n try { return String(value); }\n catch { return '[unavailable]'; }\n}\n\nfunction trim(value: unknown, length: number): string {\n return safeString(value).slice(0, length);\n}\n\nfunction now(): number {\n try { return performance.now(); }\n catch { return Date.now(); }\n}\n\nfunction newId(): string {\n try {\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') return crypto.randomUUID();\n } catch { /* fall through */ }\n return `${Date.now().toString(36)}-${(++fallbackId).toString(36)}-${Math.random().toString(36).slice(2, 10)}`;\n}\n\nfunction isAbort(error: unknown, signal?: AbortSignal | null): boolean {\n try { if (signal?.aborted) return true; }\n catch { /* ignore hostile signal */ }\n return read(error, 'name') === 'AbortError' || read(error, 'code') === 20;\n}\n\nfunction errorFields(error: unknown): { message: string; name?: string; stack?: string } {\n if (error === null || error === undefined) return { message: 'Unknown error' };\n const message = read(error, 'message');\n const name = read(error, 'name');\n const stack = read(error, 'stack');\n return {\n message: message == null ? safeString(error) : safeString(message),\n ...(name == null ? {} : { name: safeString(name) }),\n ...(stack == null ? {} : { stack: safeString(stack) }),\n };\n}\n\nfunction byteLength(value: string): number {\n return new TextEncoder().encode(value).length;\n}\n\nfunction boundedNumber(value: unknown, minimum: number, maximum: number, fallback: number): number {\n return typeof value === 'number' && Number.isFinite(value)\n ? Math.min(maximum, Math.max(minimum, Math.floor(value)))\n : fallback;\n}\n\nclass HttpDeliveryError extends Error {\n constructor(readonly status: number) { super(`Collector responded ${status}`); }\n}\n\nclass UrlSanitizationError extends Error {}\n\nclass ContextResolutionError extends Error {}\n\nclass Client implements BrowserErrorLogBreadcrumbClient {\n private readonly active: boolean;\n private readonly endpoint?: string;\n private readonly options: BrowserErrorLogOptions;\n private readonly networkCaptureEnabled: boolean;\n private readonly navigationCaptureEnabled: boolean;\n private readonly transportTimeoutMs: number;\n private readonly startedAt = now();\n private readonly viewId = newId();\n private readonly seenErrors = new WeakSet<object>();\n private readonly queue: ErrorEventRecord[] = [];\n private readonly breadcrumbs: Breadcrumb[] = [];\n private readonly maxQueueSize: number;\n private readonly cancelWaits = new Set<() => void>();\n private readonly controllers = new Set<AbortController>();\n private readonly destroySignal: Promise<symbol>;\n private resolveDestroy!: (value: symbol) => void;\n private interval?: ReturnType<typeof setInterval>;\n private flushing?: Promise<void>;\n private sequence = 0;\n private inFlight = 0;\n private sent = 0;\n private dropped = 0;\n private destroyed = false;\n\n constructor(options: BrowserErrorLogOptions) {\n this.options = options;\n this.active = options.enabled !== false && typeof window !== 'undefined' && typeof document !== 'undefined';\n this.networkCaptureEnabled = options.captureNetwork !== false && (!options.transport || Boolean(options.endpoint));\n this.navigationCaptureEnabled = options.captureNavigation === true;\n this.maxQueueSize = boundedNumber(options.maxQueueSize, 1, 100, 50);\n this.transportTimeoutMs = boundedNumber(options.transportTimeoutMs, 250, 60_000, 5_000);\n this.destroySignal = new Promise(resolve => { this.resolveDestroy = resolve; });\n if (!this.active) return;\n if (!options.project || typeof options.project !== 'string') throw new Error('project is required');\n if (!options.transport && !options.endpoint) throw new Error('endpoint or transport is required');\n this.endpoint = options.endpoint ? this.absoluteUrl(options.endpoint) : undefined;\n window.addEventListener('error', this.onError);\n window.addEventListener('unhandledrejection', this.onRejection);\n document.addEventListener('visibilitychange', this.onVisibility);\n if (this.networkCaptureEnabled) addNetworkClient(this);\n if (options.captureConsole === true) addConsoleClient(this);\n if (this.navigationCaptureEnabled) addNavigationClient(this);\n this.interval = setInterval(() => { void this.flush(); }, boundedNumber(options.flushIntervalMs, 10, 60_000, 10_000));\n }\n\n captureException(error: unknown, extra: CaptureExtra = {}): void {\n if (!this.active || this.destroyed || isAbort(error)) return;\n try {\n if (error !== null && (typeof error === 'object' || typeof error === 'function')) {\n if (this.seenErrors.has(error)) return;\n }\n const fields = errorFields(error);\n const type = EVENT_TYPES.has(extra.type as EventType) ? extra.type! : 'manual';\n const event = this.makeEvent(type, fields.message, {\n name: fields.name,\n stack: fields.stack,\n componentStack: extra.componentStack,\n context: extra.context,\n });\n if (this.enqueue(event) && error !== null && (typeof error === 'object' || typeof error === 'function')) {\n this.seenErrors.add(error);\n }\n } catch (error) {\n if (error instanceof UrlSanitizationError || error instanceof ContextResolutionError) this.dropped++;\n // Diagnostics must never affect the host app.\n }\n }\n\n reportNetwork(method: string, url: string, status: number | undefined, durationMs: number, failure?: unknown): void {\n if (this.destroyed || !this.active || this.isCollectorUrl(url) || isAbort(failure)) return;\n try {\n if (status !== undefined) {\n const include = this.options.shouldCaptureHttp\n ? this.options.shouldCaptureHttp(status, url, method)\n : status >= 500;\n if (!include) return;\n }\n const network = { method: trim(method || 'GET', 16).toUpperCase(), url, status, durationMs };\n const fields = failure === undefined ? undefined : errorFields(failure);\n const event = this.makeEvent(status === undefined ? 'network' : 'http',\n status === undefined ? (fields?.message || 'Network request failed') : `HTTP ${status}`,\n { name: fields?.name, network });\n this.enqueue(event);\n } catch { this.dropped++; /* a failing hook must not expose an unfiltered event */ }\n }\n\n captureConsole(values: unknown[]): void {\n if (!this.active || this.destroyed) return;\n try {\n const message = values.map(safeString).join(' ');\n let fields: ReturnType<typeof errorFields> | undefined;\n for (const value of values) {\n try {\n if (value instanceof Error) { fields = errorFields(value); break; }\n } catch { /* a hostile value must not suppress the console event */ }\n }\n this.enqueue(this.makeEvent('console', message, { name: fields?.name, stack: fields?.stack }));\n }\n catch { this.dropped++; /* console behavior is never changed by capture */ }\n }\n\n addBreadcrumb(input: BreadcrumbInput): void {\n if (!this.active || this.destroyed) return;\n try {\n const breadcrumb = this.cleanBreadcrumb(input, new Date().toISOString());\n if (!breadcrumb) return;\n this.breadcrumbs.push(breadcrumb);\n this.boundBreadcrumbs(this.breadcrumbs);\n } catch { /* Diagnostics must never affect the host app or error stats. */ }\n }\n\n reportNavigation(fromHref: string, toHref: string, trigger: NavigationTrigger): void {\n if (!this.active || this.destroyed || !this.navigationCaptureEnabled) return;\n try {\n const cleanFrom = this.cleanUrl(fromHref);\n const cleanTo = this.cleanUrl(toHref);\n // cleanUrl's malformed-input fallback is for general diagnostics; navigation only stores valid URLs.\n const fromUrl = new URL(cleanFrom);\n const toUrl = new URL(cleanTo);\n if (![fromUrl.protocol, toUrl.protocol].every(protocol => protocol === 'http:' || protocol === 'https:')) return;\n if (fromUrl.username || fromUrl.password || fromUrl.search || fromUrl.hash ||\n toUrl.username || toUrl.password || toUrl.search || toUrl.hash) return;\n const from = cleanFrom.slice(0, BREADCRUMB_LIMITS.dataString);\n const to = cleanTo.slice(0, BREADCRUMB_LIMITS.dataString);\n if (from === to) return;\n this.breadcrumbs.push({ occurredAt: new Date().toISOString(), category: 'navigation',\n message: 'Navigation', data: { from, to, trigger } });\n this.boundBreadcrumbs(this.breadcrumbs);\n } catch { /* A failing URL hook cannot affect navigation or expose an unfiltered breadcrumb. */ }\n }\n\n clearBreadcrumbs(): void {\n if (!this.active || this.destroyed) return;\n this.breadcrumbs.length = 0;\n }\n\n flush(): Promise<void> {\n if (!this.active || this.destroyed) return Promise.resolve();\n if (this.flushing) return this.flushing;\n this.flushing = this.drain().finally(() => { this.flushing = undefined; });\n return this.flushing;\n }\n\n destroy(): void {\n if (this.destroyed) return;\n this.destroyed = true;\n if (this.interval) clearInterval(this.interval);\n if (this.active) {\n window.removeEventListener('error', this.onError);\n window.removeEventListener('unhandledrejection', this.onRejection);\n document.removeEventListener('visibilitychange', this.onVisibility);\n if (this.networkCaptureEnabled) removeNetworkClient(this);\n if (this.options.captureConsole === true) removeConsoleClient(this);\n if (this.navigationCaptureEnabled) removeNavigationClient(this);\n }\n this.dropped += this.queue.length + this.inFlight;\n this.queue.length = 0;\n this.breadcrumbs.length = 0;\n for (const cancel of this.cancelWaits) cancel();\n for (const controller of this.controllers) controller.abort();\n this.resolveDestroy(DESTROYED);\n }\n\n getStats(): { queued: number; sent: number; dropped: number } {\n return { queued: this.queue.length, sent: this.sent, dropped: this.dropped };\n }\n\n private readonly onError = (event: ErrorEvent): void => {\n try {\n const filename = read(event, 'filename');\n const lineno = read(event, 'lineno');\n const colno = read(event, 'colno');\n const context: Record<string, unknown> = {};\n if (typeof filename === 'string' && filename.trim()) context.filename = this.cleanUrl(filename);\n if (typeof lineno === 'number' && Number.isFinite(lineno) && lineno > 0) context.lineno = lineno;\n if (typeof colno === 'number' && Number.isFinite(colno) && colno > 0) context.colno = colno;\n this.captureException(read(event, 'error') ?? read(event, 'message') ?? 'Script error', {\n type: 'javascript', ...(Object.keys(context).length ? { context } : {}),\n });\n } catch { this.dropped++; /* a failing URL hook must not affect the host app */ }\n };\n\n private readonly onRejection = (event: PromiseRejectionEvent): void => {\n this.captureException(event.reason, { type: 'promise' });\n };\n\n private readonly onVisibility = (): void => {\n if (document.visibilityState === 'hidden') this.tryBeacon();\n };\n\n private absoluteUrl(url: string): string {\n try { return new URL(url, window.location.href).href; }\n catch { return url; }\n }\n\n private isCollectorUrl(url: string): boolean {\n if (!this.endpoint) return false;\n try {\n const request = new URL(url, window.location.href);\n const collector = new URL(this.endpoint, window.location.href);\n return request.origin === collector.origin && request.pathname === collector.pathname;\n } catch { return url === this.endpoint; }\n }\n\n private cleanUrl(input: unknown): string {\n let value = safeString(input);\n if (this.options.sanitizeUrl) {\n try { value = this.options.sanitizeUrl(value); }\n catch { throw new UrlSanitizationError('URL sanitizer failed'); }\n if (typeof value !== 'string' || !value) throw new UrlSanitizationError('URL sanitizer returned no URL');\n }\n try {\n const url = new URL(value, window.location.href);\n if (url.protocol !== 'http:' && url.protocol !== 'https:') return '[unsupported URL]';\n url.username = '';\n url.password = '';\n url.search = '';\n url.hash = '';\n return this.cleanText(url.href, 1024, false);\n } catch { return this.cleanText(value, 1024, false).split(/[?#]/, 1)[0]; }\n }\n\n private cleanText(input: unknown, length: number, replaceUrls = true): string {\n let value = safeString(input);\n if (replaceUrls) {\n value = value.replace(/https?:\\/\\/[^\\s<>\"'()[\\]]+/gi, match => this.cleanUrl(match));\n value = value.replace(/(^|[\\s\"'(\\[=])((?:\\/(?!\\/)|\\.{1,2}\\/)[^\\s<>\"'()[\\]?#]*[?#][^\\s<>\"'()[\\]]+|[a-z][\\w.-]*(?:\\/[^\\s<>\"'()[\\]?#]*)?(?:\\?[a-z0-9_.-]+=[^\\s<>\"'()[\\]]+|#[^\\s<>\"'()[\\]]+)|\\?[a-z0-9_.-]+=[^\\s<>\"'()[\\]]+)/gi,\n (_match, prefix: string, url: string) => {\n const punctuation = /[.,;!]+$/.exec(url)?.[0] ?? '';\n const core = url.slice(0, url.length - punctuation.length);\n const cleaned = this.options.sanitizeUrl\n ? this.cleanUrl(core)\n : core.startsWith('?') ? '[redacted query]' : this.cleanText(core.split(/[?#]/, 1)[0], 1024, false);\n return `${prefix}${cleaned}${punctuation}`;\n });\n }\n return value\n .replace(/\\bBearer\\s+[A-Za-z0-9._~+\\/-]+/gi, 'Bearer [REDACTED]')\n .replace(/[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,}/gi, '[REDACTED_EMAIL]')\n .slice(0, length);\n }\n\n private cleanContext(input: unknown): ErrorEventRecord['context'] {\n if (!input || typeof input !== 'object') return undefined;\n const output: NonNullable<ErrorEventRecord['context']> = {};\n let keys: string[];\n try { keys = Object.keys(input); }\n catch { return undefined; }\n for (const key of keys) {\n if (Object.keys(output).length >= 12) break;\n if (SENSITIVE_KEY.test(key)) continue;\n const value = read(input, key);\n const safeKey = this.cleanText(key, 80);\n if (typeof value === 'string') output[safeKey] = this.cleanText(value, 500);\n else if (typeof value === 'number' && Number.isFinite(value)) output[safeKey] = value;\n else if (typeof value === 'boolean' || value === null) output[safeKey] = value;\n }\n return Object.keys(output).length ? output : undefined;\n }\n\n private cleanBreadcrumb(input: unknown, timestamp?: string): Breadcrumb | undefined {\n if (!input || typeof input !== 'object') return undefined;\n const occurredAt = timestamp ?? read(input, 'occurredAt');\n if (typeof occurredAt !== 'string') return undefined;\n try { if (new Date(occurredAt).toISOString() !== occurredAt) return undefined; }\n catch { return undefined; }\n const rawCategory = read(input, 'category');\n const rawMessage = read(input, 'message');\n if ((rawCategory !== undefined && typeof rawCategory !== 'string') || typeof rawMessage !== 'string') return undefined;\n const category = this.cleanText(rawCategory ?? (timestamp ? 'manual' : ''), BREADCRUMB_LIMITS.category);\n const message = this.cleanText(rawMessage, BREADCRUMB_LIMITS.message);\n if (!category.trim() || !message.trim()) return undefined;\n const rawData = read(input, 'data');\n const data: NonNullable<Breadcrumb['data']> = {};\n if (rawData && typeof rawData === 'object') {\n let keys: string[];\n try { keys = Object.keys(rawData); }\n catch { keys = []; }\n for (const key of keys) {\n if (Object.keys(data).length >= BREADCRUMB_LIMITS.dataKeys) break;\n if (SENSITIVE_KEY.test(key)) continue;\n const safeKey = this.cleanText(key, BREADCRUMB_LIMITS.dataKey);\n const value = read(rawData, key);\n if (typeof value === 'string') data[safeKey] = this.cleanText(value, BREADCRUMB_LIMITS.dataString);\n else if (typeof value === 'number' && Number.isFinite(value)) data[safeKey] = value;\n else if (typeof value === 'boolean' || value === null) data[safeKey] = value;\n }\n }\n return { occurredAt, category, message, ...(Object.keys(data).length ? { data } : {}) };\n }\n\n private boundBreadcrumbs(trail: Breadcrumb[]): void {\n while (trail.length > BREADCRUMB_LIMITS.count || byteLength(JSON.stringify(trail)) > BREADCRUMB_LIMITS.bytes) trail.shift();\n }\n\n private cleanBreadcrumbTrail(input: unknown): Breadcrumb[] | undefined {\n let length: number;\n try {\n if (!Array.isArray(input)) return undefined;\n length = input.length;\n } catch { return undefined; }\n if (!Number.isSafeInteger(length) || length < 0) return undefined;\n const trail: Breadcrumb[] = [];\n for (let index = Math.max(0, length - BREADCRUMB_LIMITS.count); index < length; index++) {\n const breadcrumb = this.cleanBreadcrumb(read(input, index));\n if (breadcrumb) {\n trail.push(breadcrumb);\n this.boundBreadcrumbs(trail);\n }\n }\n return trail.length ? trail : undefined;\n }\n\n private cleanNetwork(input: unknown): ErrorEventRecord['network'] {\n if (!input || typeof input !== 'object') return undefined;\n const rawStatus = read(input, 'status');\n const status = typeof rawStatus === 'number' && Number.isInteger(rawStatus) && rawStatus >= 100 && rawStatus <= 599\n ? rawStatus : undefined;\n return {\n method: this.cleanText(read(input, 'method') ?? 'GET', 16).toUpperCase(),\n url: this.cleanUrl(read(input, 'url') ?? ''),\n ...(status === undefined ? {} : { status }),\n durationMs: boundedNumber(read(input, 'durationMs'), 0, 3_600_000, 0),\n };\n }\n\n private makeEvent(type: EventType, message: string, extra: {\n name?: string; stack?: string; componentStack?: string;\n context?: unknown; network?: unknown;\n } = {}): ErrorEventRecord {\n const userAgent = read(navigator, 'userAgent');\n const eventContext = this.cleanContext(extra.context);\n let resolved: unknown;\n try { resolved = this.options.getContext?.(); }\n catch { throw new ContextResolutionError('Context resolver failed'); }\n const dynamicContext = this.cleanContext(resolved);\n const defaults = this.cleanContext(this.options.context);\n let context = eventContext;\n if (dynamicContext || defaults) {\n context = { ...eventContext };\n for (const fields of [dynamicContext, defaults]) {\n if (!fields) continue;\n for (const key of Object.keys(fields)) {\n if (Object.keys(context).length >= 12) break;\n if (!Object.prototype.hasOwnProperty.call(context, key)) context[key] = fields[key];\n }\n }\n }\n const network = this.cleanNetwork(extra.network);\n return {\n schemaVersion: 1,\n eventId: newId(),\n project: this.cleanText(this.options.project, 80),\n environment: this.cleanText(this.options.environment ?? 'development', 80),\n release: this.cleanText(this.options.release ?? 'unknown', 120),\n sdkVersion: '0.1.17',\n occurredAt: new Date().toISOString(),\n viewId: this.viewId,\n sequence: ++this.sequence,\n elapsedMs: boundedNumber(now() - this.startedAt, 0, 3_600_000, 0),\n type,\n message: this.cleanText(message, 1024),\n ...(extra.name === undefined ? {} : { name: this.cleanText(extra.name, 100) }),\n ...(extra.stack === undefined ? {} : { stack: this.cleanText(extra.stack, 4096) }),\n ...(extra.componentStack === undefined ? {} : { componentStack: this.cleanText(extra.componentStack, 2048) }),\n page: this.cleanUrl(window.location.href),\n runtime: RUNTIMES.has(this.options.runtime as Runtime) ? this.options.runtime! : 'browser',\n ...(typeof userAgent === 'string' ? { browser: this.cleanText(userAgent, 300) } : {}),\n ...(context ? { context } : {}),\n ...(this.breadcrumbs.length ? { breadcrumbs: this.breadcrumbs.map(crumb => ({\n ...crumb, ...(crumb.data ? { data: { ...crumb.data } } : {}),\n })) } : {}),\n ...(network ? { network } : {}),\n };\n }\n\n private sanitizeReplacement(candidate: unknown, base: ErrorEventRecord): ErrorEventRecord {\n const type = read(candidate, 'type');\n const runtime = read(candidate, 'runtime');\n const name = read(candidate, 'name');\n const stack = read(candidate, 'stack');\n const componentStack = read(candidate, 'componentStack');\n const browser = read(candidate, 'browser');\n const context = this.cleanContext(read(candidate, 'context'));\n const breadcrumbs = this.cleanBreadcrumbTrail(read(candidate, 'breadcrumbs'));\n const network = this.cleanNetwork(read(candidate, 'network'));\n return {\n ...base,\n type: EVENT_TYPES.has(type as EventType) ? type as EventType : base.type,\n message: this.cleanText(read(candidate, 'message') ?? base.message, 1024),\n ...(name === undefined ? { name: base.name } : { name: this.cleanText(name, 100) }),\n ...(stack === undefined ? { stack: base.stack } : { stack: this.cleanText(stack, 4096) }),\n ...(componentStack === undefined ? { componentStack: base.componentStack } : { componentStack: this.cleanText(componentStack, 2048) }),\n page: this.cleanUrl(read(candidate, 'page') ?? base.page),\n runtime: RUNTIMES.has(runtime as Runtime) ? runtime as Runtime : base.runtime,\n ...(browser === undefined ? { browser: base.browser } : { browser: this.cleanText(browser, 300) }),\n ...(context ? { context } : { context: undefined }),\n ...(breadcrumbs ? { breadcrumbs } : { breadcrumbs: undefined }),\n ...(network ? { network } : { network: undefined }),\n };\n }\n\n private enqueue(event: ErrorEventRecord): boolean {\n if (this.destroyed) return false;\n let finalEvent = event;\n if (this.options.beforeSend) {\n try {\n const copy = { ...event, context: event.context && { ...event.context },\n breadcrumbs: event.breadcrumbs?.map(crumb => ({ ...crumb, data: crumb.data && { ...crumb.data } })),\n network: event.network && { ...event.network } };\n const result = this.options.beforeSend(copy);\n if (result === false || result === null) return false;\n finalEvent = this.sanitizeReplacement(result === undefined ? copy : result, event);\n } catch { this.dropped++; return false; }\n }\n // A single event can never make a batch exceed its byte budget.\n if (byteLength(JSON.stringify(finalEvent)) > MAX_BATCH_BYTES) { this.dropped++; return false; }\n if (this.queue.length >= this.maxQueueSize) { this.queue.shift(); this.dropped++; }\n this.queue.push(finalEvent);\n if (this.queue.length >= this.maxQueueSize) void this.flush();\n return true;\n }\n\n private takeBatch(maxEvents = MAX_BATCH_EVENTS, maxBytes = MAX_BATCH_BYTES): EventBatch {\n const events: ErrorEventRecord[] = [];\n let bytes = byteLength('{\"schemaVersion\":1,\"events\":[]}');\n while (this.queue.length && events.length < maxEvents) {\n const next = this.queue[0];\n const size = byteLength(JSON.stringify(next)) + (events.length ? 1 : 0);\n if (events.length && bytes + size > maxBytes) break;\n if (!events.length && bytes + size > maxBytes) { this.queue.shift(); this.dropped++; continue; }\n events.push(this.queue.shift()!);\n bytes += size;\n }\n return { schemaVersion: 1, events };\n }\n\n private async drain(): Promise<void> {\n while (!this.destroyed && this.queue.length) {\n const batch = this.takeBatch();\n if (batch.events.length) {\n this.inFlight += batch.events.length;\n try { await this.sendWithRetry(batch); }\n finally { this.inFlight -= batch.events.length; }\n }\n }\n }\n\n private async sendWithRetry(batch: EventBatch): Promise<void> {\n for (let attempt = 0; attempt <= RETRY_DELAYS_MS.length && !this.destroyed; attempt++) {\n const controller = new AbortController();\n this.controllers.add(controller);\n let timeoutHandle: ReturnType<typeof setTimeout> | undefined;\n const timeout = new Promise<never>((_resolve, reject) => {\n timeoutHandle = setTimeout(() => {\n controller.abort();\n reject(new Error('Collector transport timed out'));\n }, this.transportTimeoutMs);\n });\n let retryDelay: number | undefined;\n try {\n const result = await Promise.race([this.send(batch, controller.signal), timeout, this.destroySignal]);\n if (result === DESTROYED || this.destroyed) return;\n this.sent += batch.events.length;\n return;\n } catch (error) {\n if (this.destroyed) return;\n const status = read(error, 'status');\n const retryable = typeof status !== 'number' || status === 429 || status >= 500;\n if (!retryable || attempt === RETRY_DELAYS_MS.length) break;\n retryDelay = RETRY_DELAYS_MS[attempt];\n } finally {\n if (timeoutHandle) clearTimeout(timeoutHandle);\n this.controllers.delete(controller);\n }\n if (retryDelay !== undefined) await this.wait(retryDelay);\n }\n if (!this.destroyed) this.dropped += batch.events.length;\n }\n\n private async send(batch: EventBatch, signal: AbortSignal): Promise<void> {\n if (this.options.transport) { await this.options.transport(batch, { signal }); return; }\n const response = await window.fetch(this.endpoint!, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(batch),\n credentials: 'omit',\n signal,\n });\n if (!response.ok) throw new HttpDeliveryError(response.status);\n }\n\n private wait(milliseconds: number): Promise<void> {\n return new Promise(resolve => {\n const finish = () => { clearTimeout(timer); this.cancelWaits.delete(finish); resolve(); };\n const timer = setTimeout(finish, milliseconds);\n this.cancelWaits.add(finish);\n });\n }\n\n private tryBeacon(): void {\n if (this.destroyed || this.options.transport || !this.endpoint || !this.queue.length) return;\n try {\n const url = new URL(this.endpoint);\n if (url.origin !== window.location.origin || url.search || url.hash || url.username || url.password) return;\n if (typeof navigator.sendBeacon !== 'function') return;\n const candidates = this.queue.slice(0, MAX_BEACON_EVENTS);\n while (candidates.length > 0) {\n const batch: EventBatch = { schemaVersion: 1, events: candidates };\n const body = JSON.stringify(batch);\n if (byteLength(body) <= MAX_BEACON_BYTES) {\n if (navigator.sendBeacon(this.endpoint, new Blob([body], { type: 'application/json' }))) {\n this.queue.splice(0, candidates.length);\n this.sent += candidates.length;\n }\n return;\n }\n candidates.pop();\n }\n } catch { /* best effort only */ }\n }\n}\n\nconst DESTROYED = Symbol('destroyed');\n\ninterface Instrumentation {\n clients: Set<Client>;\n cleanup(): void;\n}\n\nlet networkInstrumentation: Instrumentation | undefined;\nlet consoleInstrumentation: Instrumentation | undefined;\nlet navigationInstrumentation: Instrumentation | undefined;\n\ntype NavigationTrigger = 'pushState' | 'replaceState' | 'popstate' | 'hashchange';\n\nfunction addNavigationClient(client: Client): void {\n if (!navigationInstrumentation) navigationInstrumentation = installNavigation();\n navigationInstrumentation?.clients.add(client);\n}\n\nfunction removeNavigationClient(client: Client): void {\n const instrumentation = navigationInstrumentation;\n if (!instrumentation) return;\n instrumentation.clients.delete(client);\n if (!instrumentation.clients.size) {\n instrumentation.cleanup();\n navigationInstrumentation = undefined;\n }\n}\n\nfunction inheritedHistoryDescriptor(historyObject: History, key: 'pushState' | 'replaceState'): PropertyDescriptor | undefined {\n const seen = new Set<object>();\n let prototype = Object.getPrototypeOf(historyObject);\n while (prototype && !seen.has(prototype)) {\n seen.add(prototype);\n const descriptor = Object.getOwnPropertyDescriptor(prototype, key);\n if (descriptor) return descriptor;\n prototype = Object.getPrototypeOf(prototype);\n }\n return undefined;\n}\n\nfunction installNavigation(): Instrumentation | undefined {\n let historyObject: History;\n let lastHref: string;\n let originalPush: History['pushState'];\n let originalReplace: History['replaceState'];\n let ownPush: PropertyDescriptor | undefined;\n let ownReplace: PropertyDescriptor | undefined;\n let inheritedPush: PropertyDescriptor | undefined;\n let inheritedReplace: PropertyDescriptor | undefined;\n try {\n historyObject = window.history;\n lastHref = window.location.href;\n ownPush = Object.getOwnPropertyDescriptor(historyObject, 'pushState');\n ownReplace = Object.getOwnPropertyDescriptor(historyObject, 'replaceState');\n inheritedPush = ownPush ? undefined : inheritedHistoryDescriptor(historyObject, 'pushState');\n inheritedReplace = ownReplace ? undefined : inheritedHistoryDescriptor(historyObject, 'replaceState');\n if ((ownPush && !('value' in ownPush)) || (ownReplace && !('value' in ownReplace))) return undefined;\n if ((!ownPush && (!inheritedPush || !('value' in inheritedPush) || inheritedPush.writable !== true)) ||\n (!ownReplace && (!inheritedReplace || !('value' in inheritedReplace) || inheritedReplace.writable !== true))) return undefined;\n originalPush = ownPush ? ownPush.value : historyObject.pushState;\n originalReplace = ownReplace ? ownReplace.value : historyObject.replaceState;\n if (typeof originalPush !== 'function' || typeof originalReplace !== 'function') return undefined;\n const canInstall = (own?: PropertyDescriptor) => own\n ? own.configurable === true || own.writable === true\n : Object.isExtensible(historyObject);\n if (!canInstall(ownPush) || !canInstall(ownReplace)) return undefined;\n } catch { return undefined; }\n\n const clients = new Set<Client>();\n const report = (trigger: NavigationTrigger): void => {\n try {\n const toHref = window.location.href;\n if (toHref === lastHref) return;\n const fromHref = lastHref;\n lastHref = toHref;\n for (const client of clients) {\n try { client.reportNavigation(fromHref, toHref, trigger); }\n catch { /* Telemetry must never alter a successful native call. */ }\n }\n } catch { /* Location can be unavailable in a restricted host. */ }\n };\n const wrappedPush: History['pushState'] = function (this: History, ...args: Parameters<History['pushState']>): void {\n const result = Reflect.apply(originalPush, this, args);\n report('pushState');\n return result;\n };\n const wrappedReplace: History['replaceState'] = function (this: History, ...args: Parameters<History['replaceState']>): void {\n const result = Reflect.apply(originalReplace, this, args);\n report('replaceState');\n return result;\n };\n const onPopState = () => { report('popstate'); };\n const onHashChange = () => { report('hashchange'); };\n const restore = (key: 'pushState' | 'replaceState', wrapper: History['pushState'], own?: PropertyDescriptor): void => {\n try {\n const current = Object.getOwnPropertyDescriptor(historyObject, key);\n if (!current || !('value' in current) || current.value !== wrapper) return;\n if (own) Object.defineProperty(historyObject, key, own);\n else Reflect.deleteProperty(historyObject, key);\n } catch { /* Keep a host-installed replacement and never throw during cleanup. */ }\n };\n let pushInstalled = false;\n let replaceInstalled = false;\n try {\n Object.defineProperty(historyObject, 'pushState', { configurable: ownPush?.configurable ?? true,\n enumerable: ownPush?.enumerable ?? false, writable: ownPush?.writable ?? true, value: wrappedPush });\n pushInstalled = true;\n Object.defineProperty(historyObject, 'replaceState', { configurable: ownReplace?.configurable ?? true,\n enumerable: ownReplace?.enumerable ?? false, writable: ownReplace?.writable ?? true, value: wrappedReplace });\n replaceInstalled = true;\n window.addEventListener('popstate', onPopState);\n window.addEventListener('hashchange', onHashChange);\n } catch {\n try { window.removeEventListener('hashchange', onHashChange); } catch { /* best effort */ }\n try { window.removeEventListener('popstate', onPopState); } catch { /* best effort */ }\n if (replaceInstalled) restore('replaceState', wrappedReplace, ownReplace);\n if (pushInstalled) restore('pushState', wrappedPush, ownPush);\n return undefined;\n }\n return { clients, cleanup() {\n try { window.removeEventListener('popstate', onPopState); } catch { /* best effort */ }\n try { window.removeEventListener('hashchange', onHashChange); } catch { /* best effort */ }\n restore('pushState', wrappedPush, ownPush);\n restore('replaceState', wrappedReplace, ownReplace);\n } };\n}\n\nfunction addNetworkClient(client: Client): void {\n if (!networkInstrumentation) networkInstrumentation = installNetwork();\n networkInstrumentation.clients.add(client);\n}\n\nfunction removeNetworkClient(client: Client): void {\n const instrumentation = networkInstrumentation;\n if (!instrumentation) return;\n instrumentation.clients.delete(client);\n if (!instrumentation.clients.size) {\n instrumentation.cleanup();\n networkInstrumentation = undefined;\n }\n}\n\nfunction describeFetch(input: RequestInfo | URL, init?: RequestInit): { url: string; method: string; signal?: AbortSignal | null } {\n let requestUrl: string | undefined;\n if (typeof Request !== 'undefined' && input !== null && typeof input === 'object') {\n if (input instanceof Request) requestUrl = read(input, 'url') as string | undefined;\n else {\n try { requestUrl = Object.getOwnPropertyDescriptor(Request.prototype, 'url')?.get?.call(input); }\n catch { /* not a genuine Request */ }\n }\n }\n const initSignal = read(init, 'signal');\n return {\n url: requestUrl ?? safeString(input),\n method: safeString(read(init, 'method') ?? (requestUrl === undefined ? undefined : read(input, 'method')) ?? 'GET'),\n signal: (initSignal === undefined ? (requestUrl === undefined ? undefined : read(input, 'signal')) : initSignal) as AbortSignal | null | undefined,\n };\n}\n\nfunction installNetwork(): Instrumentation {\n const clients = new Set<Client>();\n const originalFetch = window.fetch;\n let wrappedFetch: typeof fetch | undefined;\n if (typeof originalFetch === 'function') {\n wrappedFetch = function (this: typeof window, ...args: Parameters<typeof fetch>): ReturnType<typeof fetch> {\n if (!clients.size) return Reflect.apply(originalFetch, this, args);\n const started = now();\n let request: ReturnType<typeof describeFetch>;\n try { request = describeFetch(args[0], args[1]); }\n catch { request = { url: '', method: 'GET' }; }\n let promise: ReturnType<typeof fetch>;\n try { promise = Reflect.apply(originalFetch, this, args); }\n catch (error) {\n if (!isAbort(error, request.signal)) for (const client of clients) client.reportNetwork(request.method, request.url, undefined, now() - started, error);\n throw error;\n }\n return promise.then(\n response => {\n try {\n const status = response.status;\n for (const client of clients) client.reportNetwork(request.method, request.url, status, now() - started);\n } catch { /* telemetry cannot change the fetch result */ }\n return response;\n },\n error => {\n if (!isAbort(error, request.signal)) for (const client of clients) client.reportNetwork(request.method, request.url, undefined, now() - started, error);\n throw error;\n },\n );\n };\n window.fetch = wrappedFetch;\n }\n\n const prototype = typeof XMLHttpRequest === 'undefined' ? undefined : XMLHttpRequest.prototype;\n const originalOpen = prototype?.open;\n const originalSend = prototype?.send;\n const metadata = new WeakMap<XMLHttpRequest, { method: string; url: string }>();\n const pending = new WeakMap<XMLHttpRequest, () => void>();\n let wrappedOpen: typeof XMLHttpRequest.prototype.open | undefined;\n let wrappedSend: typeof XMLHttpRequest.prototype.send | undefined;\n if (prototype && originalOpen && originalSend) {\n wrappedOpen = (function (this: XMLHttpRequest, ...args: unknown[]): void {\n const result = Reflect.apply(originalOpen, this, args);\n pending.get(this)?.();\n try { metadata.set(this, { method: safeString(args[0]), url: safeString(args[1]) }); }\n catch { /* native open already succeeded */ }\n return result;\n }) as typeof XMLHttpRequest.prototype.open;\n wrappedSend = function (this: XMLHttpRequest, ...args: Parameters<XMLHttpRequest['send']>): void {\n if (!clients.size) return Reflect.apply(originalSend, this, args);\n const details = metadata.get(this);\n if (!details) return Reflect.apply(originalSend, this, args);\n const started = now();\n let aborted = false;\n let failed = false;\n let completed = false;\n const onAbort = () => { aborted = true; };\n const onFailure = () => { failed = true; };\n const cleanup = () => {\n this.removeEventListener('abort', onAbort);\n this.removeEventListener('error', onFailure);\n this.removeEventListener('timeout', onFailure);\n this.removeEventListener('loadend', onLoadEnd);\n if (pending.get(this) === cleanup) pending.delete(this);\n };\n const onLoadEnd = () => {\n completed = true;\n cleanup();\n if (aborted) return;\n try {\n const status = this.status;\n if (status === 0 && !failed) return;\n for (const client of clients) client.reportNetwork(details.method, details.url,\n status === 0 ? undefined : status, now() - started);\n } catch { /* XHR state may be unavailable */ }\n };\n try {\n this.addEventListener('abort', onAbort);\n this.addEventListener('error', onFailure);\n this.addEventListener('timeout', onFailure);\n this.addEventListener('loadend', onLoadEnd);\n } catch {\n cleanup();\n return Reflect.apply(originalSend, this, args);\n }\n try {\n const result = Reflect.apply(originalSend, this, args);\n if (!completed) pending.set(this, cleanup);\n return result;\n }\n catch (error) {\n cleanup();\n throw error;\n }\n };\n prototype.open = wrappedOpen!;\n prototype.send = wrappedSend;\n }\n return {\n clients,\n cleanup() {\n if (wrappedFetch && window.fetch === wrappedFetch) window.fetch = originalFetch;\n if (prototype && wrappedOpen && prototype.open === wrappedOpen) prototype.open = originalOpen!;\n if (prototype && wrappedSend && prototype.send === wrappedSend) prototype.send = originalSend!;\n },\n };\n}\n\nfunction addConsoleClient(client: Client): void {\n if (!consoleInstrumentation) consoleInstrumentation = installConsole();\n consoleInstrumentation.clients.add(client);\n}\n\nfunction removeConsoleClient(client: Client): void {\n const instrumentation = consoleInstrumentation;\n if (!instrumentation) return;\n instrumentation.clients.delete(client);\n if (!instrumentation.clients.size) {\n instrumentation.cleanup();\n consoleInstrumentation = undefined;\n }\n}\n\nfunction installConsole(): Instrumentation {\n const clients = new Set<Client>();\n const original = console.error;\n const wrapped: typeof console.error = function (this: Console, ...values: unknown[]): void {\n try { return Reflect.apply(original, this, values); }\n finally { for (const client of clients) client.captureConsole(values); }\n };\n console.error = wrapped;\n return { clients, cleanup() { if (console.error === wrapped) console.error = original; } };\n}\n\nexport function init(options: BrowserErrorLogOptions): BrowserErrorLogBreadcrumbClient {\n return new Client(options);\n}\n"],
5
- "mappings": "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",
6
- "names": ["BREADCRUMB_LIMITS", "MAX_BATCH_EVENTS", "MAX_BATCH_BYTES", "MAX_BEACON_EVENTS", "MAX_BEACON_BYTES", "RETRY_DELAYS_MS", "SENSITIVE_KEY", "EVENT_TYPES", "RUNTIMES", "fallbackId", "read", "object", "key", "safeString", "value", "trim", "length", "now", "newId", "isAbort", "error", "signal", "errorFields", "message", "name", "stack", "byteLength", "boundedNumber", "minimum", "maximum", "fallback", "HttpDeliveryError", "status", "__publicField", "UrlSanitizationError", "ContextResolutionError", "Client", "options", "event", "filename", "lineno", "colno", "context", "resolve", "addNetworkClient", "addConsoleClient", "addNavigationClient", "extra", "fields", "type", "method", "url", "durationMs", "failure", "network", "values", "input", "breadcrumb", "fromHref", "toHref", "trigger", "cleanFrom", "cleanTo", "fromUrl", "toUrl", "protocol", "from", "BREADCRUMB_LIMITS", "to", "removeNetworkClient", "removeConsoleClient", "removeNavigationClient", "cancel", "controller", "DESTROYED", "request", "collector", "replaceUrls", "match", "_match", "prefix", "punctuation", "core", "cleaned", "output", "keys", "safeKey", "timestamp", "occurredAt", "rawCategory", "rawMessage", "category", "rawData", "data", "trail", "index", "rawStatus", "userAgent", "eventContext", "resolved", "dynamicContext", "defaults", "crumb", "candidate", "base", "runtime", "componentStack", "browser", "breadcrumbs", "finalEvent", "copy", "result", "maxEvents", "maxBytes", "events", "bytes", "next", "size", "batch", "attempt", "timeoutHandle", "timeout", "_resolve", "reject", "retryDelay", "response", "milliseconds", "finish", "timer", "candidates", "body", "networkInstrumentation", "consoleInstrumentation", "navigationInstrumentation", "client", "installNavigation", "instrumentation", "inheritedHistoryDescriptor", "historyObject", "seen", "prototype", "descriptor", "lastHref", "originalPush", "originalReplace", "ownPush", "ownReplace", "inheritedPush", "inheritedReplace", "canInstall", "own", "clients", "report", "wrappedPush", "args", "wrappedReplace", "onPopState", "onHashChange", "restore", "wrapper", "current", "pushInstalled", "replaceInstalled", "installNetwork", "describeFetch", "init", "requestUrl", "initSignal", "originalFetch", "wrappedFetch", "started", "promise", "originalOpen", "originalSend", "metadata", "pending", "wrappedOpen", "wrappedSend", "details", "aborted", "failed", "completed", "onAbort", "onFailure", "cleanup", "onLoadEnd", "installConsole", "original", "wrapped"]
4
+ "sourcesContent": ["export const SCHEMA_VERSION = 1 as const;\nexport const SDK_VERSION = '0.1.19';\n\nexport type EventType = 'javascript' | 'promise' | 'react' | 'console' | 'http' | 'network' | 'manual';\nexport type Runtime = 'browser' | 'webview-ios' | 'webview-android' | 'unknown';\n\nexport const BREADCRUMB_LIMITS = {\n count: 20, bytes: 12_000, category: 40, message: 256,\n dataKeys: 6, dataKey: 80, dataString: 200,\n} as const;\n\nexport interface Breadcrumb {\n occurredAt: string;\n category: string;\n message: string;\n data?: Record<string, string | number | boolean | null>;\n}\n\n/** Validates the bounded, canonical UTC breadcrumb representation on the wire. */\nexport function isBreadcrumbTrail(value: unknown): value is Breadcrumb[] {\n try {\n if (!Array.isArray(value) || value.length > BREADCRUMB_LIMITS.count) return false;\n for (const item of value) {\n if (!item || typeof item !== 'object' || Array.isArray(item)) return false;\n if (Object.keys(item).some(key => !['occurredAt', 'category', 'message', 'data'].includes(key))) return false;\n if (typeof item.occurredAt !== 'string' || !Number.isFinite(Date.parse(item.occurredAt)) ||\n new Date(item.occurredAt).toISOString() !== item.occurredAt) return false;\n if (typeof item.category !== 'string' || !item.category.trim() || item.category.length > BREADCRUMB_LIMITS.category ||\n typeof item.message !== 'string' || !item.message.trim() || item.message.length > BREADCRUMB_LIMITS.message) return false;\n if (item.data !== undefined) {\n if (!item.data || typeof item.data !== 'object' || Array.isArray(item.data)) return false;\n const entries = Object.entries(item.data);\n if (entries.length > BREADCRUMB_LIMITS.dataKeys || entries.some(([key, field]) =>\n key.length > BREADCRUMB_LIMITS.dataKey || !(field === null || typeof field === 'boolean' ||\n (typeof field === 'string' && field.length <= BREADCRUMB_LIMITS.dataString) ||\n (typeof field === 'number' && Number.isFinite(field))))) return false;\n }\n }\n return new TextEncoder().encode(JSON.stringify(value)).length <= BREADCRUMB_LIMITS.bytes;\n } catch { return false; }\n}\n\nexport interface ErrorEventRecord {\n schemaVersion: 1;\n eventId: string;\n project: string;\n environment: string;\n release: string;\n sdkVersion: string;\n occurredAt: string;\n receivedAt?: string;\n viewId: string;\n sequence: number;\n elapsedMs: number;\n type: EventType;\n message: string;\n name?: string;\n stack?: string;\n componentStack?: string;\n page: string;\n runtime: Runtime;\n browser?: string;\n context?: Record<string, string | number | boolean | null>;\n breadcrumbs?: Breadcrumb[];\n network?: { method: string; url: string; status?: number; durationMs: number };\n}\n\nexport interface EventBatch { schemaVersion: 1; events: ErrorEventRecord[] }\nexport interface EventFilter {\n project?: string;\n environment?: string;\n type?: EventType;\n query?: string;\n from?: string;\n to?: string;\n cursor?: string;\n limit?: number;\n}\nexport interface EventPage { events: ErrorEventRecord[]; nextCursor?: string }\nexport interface EventDataSource {\n listEvents(filter: EventFilter, signal?: AbortSignal): Promise<EventPage>;\n getEvent(project: string, eventId: string, signal?: AbortSignal): Promise<ErrorEventRecord | null>;\n}\n\nexport const EVENT_LABELS: Record<EventType, string> = {\n javascript: 'JavaScript', promise: 'Promise', react: 'React', console: 'Console',\n http: 'HTTP error', network: 'Network failure', manual: 'Manual',\n};\n", "import { BREADCRUMB_LIMITS, type Breadcrumb, type ErrorEventRecord, type EventBatch, type EventType, type Runtime } from '@ihyeon/browser-error-log-protocol';\n\nexport type { Breadcrumb, ErrorEventRecord, EventBatch } from '@ihyeon/browser-error-log-protocol';\n\nexport interface CaptureExtra {\n type?: EventType;\n context?: Record<string, unknown>;\n componentStack?: string;\n}\n\nexport interface TransportContext { signal: AbortSignal }\n\nexport interface BrowserErrorLogOptions {\n project: string;\n environment?: string;\n release?: string;\n /** Scalar metadata added to every captured event; event context takes precedence. */\n context?: Record<string, unknown>;\n /** Returns scalar metadata from current application state for each new event. */\n getContext?: () => Record<string, unknown> | undefined;\n endpoint?: string;\n transport?: (batch: EventBatch, context: TransportContext) => void | Promise<void>;\n runtime?: Runtime;\n enabled?: boolean;\n captureConsole?: boolean;\n /** Records sanitized History navigation breadcrumbs; defaults to false. */\n captureNavigation?: boolean;\n /** Defaults to true. With a custom transport, automatic network capture requires endpoint for collector exclusion. */\n captureNetwork?: boolean;\n /** Records sanitized fetch/XHR completion breadcrumbs; defaults to false. Custom transports require endpoint. */\n captureNetworkBreadcrumbs?: boolean;\n beforeSend?: (event: ErrorEventRecord) => ErrorEventRecord | false | null | void;\n sanitizeUrl?: (url: string) => string;\n shouldCaptureHttp?: (status: number, url: string, method: string) => boolean;\n flushIntervalMs?: number;\n maxQueueSize?: number;\n /** Maximum new events admitted in any rolling 60 seconds; disabled by default. */\n maxEventsPerMinute?: number;\n /** Per-attempt deadline, clamped to 250\u201360000 ms; defaults to 5000 ms. */\n transportTimeoutMs?: number;\n}\n\nexport interface BrowserErrorLogClient {\n captureException(error: unknown, extra?: CaptureExtra): void;\n flush(): Promise<void>;\n destroy(): void;\n getStats(): { queued: number; sent: number; dropped: number };\n}\n\nexport interface BreadcrumbInput {\n message: string;\n category?: string;\n data?: Record<string, unknown>;\n}\n\nexport interface BrowserErrorLogBreadcrumbClient extends BrowserErrorLogClient {\n addBreadcrumb(input: BreadcrumbInput): void;\n clearBreadcrumbs(): void;\n}\n\nconst MAX_BATCH_EVENTS = 20;\nconst MAX_BATCH_BYTES = 48_000;\nconst MAX_BEACON_EVENTS = 10;\nconst MAX_BEACON_BYTES = 24_000;\nconst RETRY_DELAYS_MS = [250, 500];\nconst SENSITIVE_KEY = /(?:password|passwd|token|secret|authorization|cookie|session|api.?key|credential|bearer|private.?key)/i;\nconst EVENT_TYPES = new Set<EventType>(['javascript', 'promise', 'react', 'console', 'http', 'network', 'manual']);\nconst RUNTIMES = new Set<Runtime>(['browser', 'webview-ios', 'webview-android', 'unknown']);\nlet fallbackId = 0;\n\nfunction read(object: unknown, key: PropertyKey): unknown {\n try { return object == null ? undefined : Reflect.get(Object(object), key); }\n catch { return undefined; }\n}\n\nfunction safeString(value: unknown): string {\n try { return String(value); }\n catch { return '[unavailable]'; }\n}\n\nfunction trim(value: unknown, length: number): string {\n return safeString(value).slice(0, length);\n}\n\nfunction now(): number {\n try { return performance.now(); }\n catch { return Date.now(); }\n}\n\nfunction newId(): string {\n try {\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') return crypto.randomUUID();\n } catch { /* fall through */ }\n return `${Date.now().toString(36)}-${(++fallbackId).toString(36)}-${Math.random().toString(36).slice(2, 10)}`;\n}\n\nfunction isAbort(error: unknown, signal?: AbortSignal | null): boolean {\n try { if (signal?.aborted) return true; }\n catch { /* ignore hostile signal */ }\n return read(error, 'name') === 'AbortError' || read(error, 'code') === 20;\n}\n\nfunction errorFields(error: unknown): { message: string; name?: string; stack?: string } {\n if (error === null || error === undefined) return { message: 'Unknown error' };\n const message = read(error, 'message');\n const name = read(error, 'name');\n const stack = read(error, 'stack');\n return {\n message: message == null ? safeString(error) : safeString(message),\n ...(name == null ? {} : { name: safeString(name) }),\n ...(stack == null ? {} : { stack: safeString(stack) }),\n };\n}\n\nfunction byteLength(value: string): number {\n return new TextEncoder().encode(value).length;\n}\n\nfunction boundedNumber(value: unknown, minimum: number, maximum: number, fallback: number): number {\n return typeof value === 'number' && Number.isFinite(value)\n ? Math.min(maximum, Math.max(minimum, Math.floor(value)))\n : fallback;\n}\n\nclass HttpDeliveryError extends Error {\n constructor(readonly status: number) { super(`Collector responded ${status}`); }\n}\n\nclass UrlSanitizationError extends Error {}\n\nclass ContextResolutionError extends Error {}\n\nclass Client implements BrowserErrorLogBreadcrumbClient {\n private readonly active: boolean;\n private readonly endpoint?: string;\n private readonly options: BrowserErrorLogOptions;\n private readonly networkCaptureEnabled: boolean;\n private readonly networkBreadcrumbCaptureEnabled: boolean;\n private readonly navigationCaptureEnabled: boolean;\n private readonly transportTimeoutMs: number;\n private readonly startedAt = now();\n private readonly viewId = newId();\n private readonly seenErrors = new WeakSet<object>();\n private readonly queue: ErrorEventRecord[] = [];\n private readonly breadcrumbs: Breadcrumb[] = [];\n private readonly maxQueueSize: number;\n private readonly maxEventsPerMinute?: number;\n private readonly admittedAt: number[] = [];\n private readonly cancelWaits = new Set<() => void>();\n private readonly controllers = new Set<AbortController>();\n private readonly destroySignal: Promise<symbol>;\n private resolveDestroy!: (value: symbol) => void;\n private interval?: ReturnType<typeof setInterval>;\n private flushing?: Promise<void>;\n private sequence = 0;\n private inFlight = 0;\n private sent = 0;\n private dropped = 0;\n private destroyed = false;\n private lastAdmissionClock?: number;\n\n constructor(options: BrowserErrorLogOptions) {\n this.options = options;\n this.active = options.enabled !== false && typeof window !== 'undefined' && typeof document !== 'undefined';\n const automaticNetworkAllowed = !options.transport || Boolean(options.endpoint);\n this.networkCaptureEnabled = options.captureNetwork !== false && automaticNetworkAllowed;\n this.networkBreadcrumbCaptureEnabled = options.captureNetworkBreadcrumbs === true && automaticNetworkAllowed;\n this.navigationCaptureEnabled = options.captureNavigation === true;\n this.maxQueueSize = boundedNumber(options.maxQueueSize, 1, 100, 50);\n this.maxEventsPerMinute = typeof options.maxEventsPerMinute === 'number' && Number.isFinite(options.maxEventsPerMinute)\n ? boundedNumber(options.maxEventsPerMinute, 1, 1000, 1) : undefined;\n this.transportTimeoutMs = boundedNumber(options.transportTimeoutMs, 250, 60_000, 5_000);\n this.destroySignal = new Promise(resolve => { this.resolveDestroy = resolve; });\n if (!this.active) return;\n if (!options.project || typeof options.project !== 'string') throw new Error('project is required');\n if (!options.transport && !options.endpoint) throw new Error('endpoint or transport is required');\n this.endpoint = options.endpoint ? this.absoluteUrl(options.endpoint) : undefined;\n window.addEventListener('error', this.onError);\n window.addEventListener('unhandledrejection', this.onRejection);\n document.addEventListener('visibilitychange', this.onVisibility);\n if (this.networkCaptureEnabled || this.networkBreadcrumbCaptureEnabled) addNetworkClient(this);\n if (options.captureConsole === true) addConsoleClient(this);\n if (this.navigationCaptureEnabled) addNavigationClient(this);\n this.interval = setInterval(() => { void this.flush(); }, boundedNumber(options.flushIntervalMs, 10, 60_000, 10_000));\n }\n\n captureException(error: unknown, extra: CaptureExtra = {}): void {\n if (!this.active || this.destroyed || isAbort(error)) return;\n try {\n if (error !== null && (typeof error === 'object' || typeof error === 'function')) {\n if (this.seenErrors.has(error)) return;\n }\n const fields = errorFields(error);\n const type = EVENT_TYPES.has(extra.type as EventType) ? extra.type! : 'manual';\n const event = this.makeEvent(type, fields.message, {\n name: fields.name,\n stack: fields.stack,\n componentStack: extra.componentStack,\n context: extra.context,\n });\n if (this.enqueue(event) && error !== null && (typeof error === 'object' || typeof error === 'function')) {\n this.seenErrors.add(error);\n }\n } catch (error) {\n if (error instanceof UrlSanitizationError || error instanceof ContextResolutionError) this.dropped++;\n // Diagnostics must never affect the host app.\n }\n }\n\n reportNetwork(method: string, url: string, status: number | undefined, durationMs: number,\n failure?: unknown, allowErrorCapture = true): void {\n if (this.destroyed || !this.active || this.isCollectorUrl(url) || isAbort(failure)) return;\n let captureError = this.networkCaptureEnabled && allowErrorCapture;\n if (captureError && status !== undefined) {\n try {\n captureError = this.options.shouldCaptureHttp\n ? this.options.shouldCaptureHttp(status, url, method)\n : status >= 500;\n } catch { this.dropped++; return; /* A failing hook cannot expose an unfiltered event or breadcrumb. */ }\n }\n if (this.networkBreadcrumbCaptureEnabled) {\n try {\n const cleaned = this.cleanBreadcrumbUrl(url);\n if (cleaned.url) {\n const data: NonNullable<Breadcrumb['data']> = {\n method: this.cleanNetworkBreadcrumbMethod(method),\n url: cleaned.url,\n durationMs: boundedNumber(durationMs, 0, 3_600_000, 0),\n };\n if (status !== undefined && Number.isInteger(status) && status >= 0 && status <= 599) data.status = status;\n this.breadcrumbs.push({ occurredAt: new Date().toISOString(),\n category: status === undefined ? 'network' : 'http',\n message: status === undefined ? 'Network failure' : 'HTTP response', data });\n this.boundBreadcrumbs(this.breadcrumbs);\n } else if (captureError && !cleaned.safeForError) {\n this.dropped++;\n return;\n }\n } catch {\n if (captureError) this.dropped++;\n return; // A failing URL hook cannot expose an unfiltered breadcrumb or selected error.\n }\n }\n if (!captureError) return;\n try {\n const network = { method: trim(method || 'GET', 16).toUpperCase(), url, status, durationMs };\n const fields = failure === undefined ? undefined : errorFields(failure);\n const event = this.makeEvent(status === undefined ? 'network' : 'http',\n status === undefined ? (fields?.message || 'Network request failed') : `HTTP ${status}`,\n { name: fields?.name, network });\n this.enqueue(event);\n } catch { this.dropped++; /* a failing hook must not expose an unfiltered event */ }\n }\n\n reportZeroStatusCompletion(method: string, url: string, durationMs: number): void {\n if (this.networkBreadcrumbCaptureEnabled) this.reportNetwork(method, url, 0, durationMs, undefined, false);\n }\n\n captureConsole(values: unknown[]): void {\n if (!this.active || this.destroyed) return;\n try {\n const message = values.map(safeString).join(' ');\n let fields: ReturnType<typeof errorFields> | undefined;\n for (const value of values) {\n try {\n if (value instanceof Error) { fields = errorFields(value); break; }\n } catch { /* a hostile value must not suppress the console event */ }\n }\n this.enqueue(this.makeEvent('console', message, { name: fields?.name, stack: fields?.stack }));\n }\n catch { this.dropped++; /* console behavior is never changed by capture */ }\n }\n\n addBreadcrumb(input: BreadcrumbInput): void {\n if (!this.active || this.destroyed) return;\n try {\n const breadcrumb = this.cleanBreadcrumb(input, new Date().toISOString());\n if (!breadcrumb) return;\n this.breadcrumbs.push(breadcrumb);\n this.boundBreadcrumbs(this.breadcrumbs);\n } catch { /* Diagnostics must never affect the host app or error stats. */ }\n }\n\n reportNavigation(fromHref: string, toHref: string, trigger: NavigationTrigger): void {\n if (!this.active || this.destroyed || !this.navigationCaptureEnabled) return;\n try {\n const from = this.cleanBreadcrumbUrl(fromHref).url;\n const to = this.cleanBreadcrumbUrl(toHref).url;\n if (!from || !to) return;\n if (from === to) return;\n this.breadcrumbs.push({ occurredAt: new Date().toISOString(), category: 'navigation',\n message: 'Navigation', data: { from, to, trigger } });\n this.boundBreadcrumbs(this.breadcrumbs);\n } catch { /* A failing URL hook cannot affect navigation or expose an unfiltered breadcrumb. */ }\n }\n\n clearBreadcrumbs(): void {\n if (!this.active || this.destroyed) return;\n this.breadcrumbs.length = 0;\n }\n\n flush(): Promise<void> {\n if (!this.active || this.destroyed) return Promise.resolve();\n if (this.flushing) return this.flushing;\n this.flushing = this.drain().finally(() => { this.flushing = undefined; });\n return this.flushing;\n }\n\n destroy(): void {\n if (this.destroyed) return;\n this.destroyed = true;\n if (this.interval) clearInterval(this.interval);\n if (this.active) {\n window.removeEventListener('error', this.onError);\n window.removeEventListener('unhandledrejection', this.onRejection);\n document.removeEventListener('visibilitychange', this.onVisibility);\n if (this.networkCaptureEnabled || this.networkBreadcrumbCaptureEnabled) removeNetworkClient(this);\n if (this.options.captureConsole === true) removeConsoleClient(this);\n if (this.navigationCaptureEnabled) removeNavigationClient(this);\n }\n this.dropped += this.queue.length + this.inFlight;\n this.queue.length = 0;\n this.breadcrumbs.length = 0;\n this.admittedAt.length = 0;\n this.lastAdmissionClock = undefined;\n for (const cancel of this.cancelWaits) cancel();\n for (const controller of this.controllers) controller.abort();\n this.resolveDestroy(DESTROYED);\n }\n\n getStats(): { queued: number; sent: number; dropped: number } {\n return { queued: this.queue.length, sent: this.sent, dropped: this.dropped };\n }\n\n private readonly onError = (event: ErrorEvent): void => {\n try {\n const filename = read(event, 'filename');\n const lineno = read(event, 'lineno');\n const colno = read(event, 'colno');\n const context: Record<string, unknown> = {};\n if (typeof filename === 'string' && filename.trim()) context.filename = this.cleanUrl(filename);\n if (typeof lineno === 'number' && Number.isFinite(lineno) && lineno > 0) context.lineno = lineno;\n if (typeof colno === 'number' && Number.isFinite(colno) && colno > 0) context.colno = colno;\n this.captureException(read(event, 'error') ?? read(event, 'message') ?? 'Script error', {\n type: 'javascript', ...(Object.keys(context).length ? { context } : {}),\n });\n } catch { this.dropped++; /* a failing URL hook must not affect the host app */ }\n };\n\n private readonly onRejection = (event: PromiseRejectionEvent): void => {\n this.captureException(event.reason, { type: 'promise' });\n };\n\n private readonly onVisibility = (): void => {\n if (document.visibilityState === 'hidden') this.tryBeacon();\n };\n\n private absoluteUrl(url: string): string {\n try { return new URL(url, window.location.href).href; }\n catch { return url; }\n }\n\n private isCollectorUrl(url: string): boolean {\n if (!this.endpoint) return false;\n try {\n const request = new URL(url, window.location.href);\n const collector = new URL(this.endpoint, window.location.href);\n return request.origin === collector.origin && request.pathname === collector.pathname;\n } catch { return url === this.endpoint; }\n }\n\n private cleanUrl(input: unknown): string {\n let value = safeString(input);\n if (this.options.sanitizeUrl) {\n try { value = this.options.sanitizeUrl(value); }\n catch { throw new UrlSanitizationError('URL sanitizer failed'); }\n if (typeof value !== 'string' || !value) throw new UrlSanitizationError('URL sanitizer returned no URL');\n }\n try {\n const url = new URL(value, window.location.href);\n if (url.protocol !== 'http:' && url.protocol !== 'https:') return '[unsupported URL]';\n url.username = '';\n url.password = '';\n url.search = '';\n url.hash = '';\n return this.cleanText(url.href, 1024, false);\n } catch { return this.cleanText(value, 1024, false).split(/[?#]/, 1)[0]; }\n }\n\n private cleanBreadcrumbUrl(input: string): { url?: string; safeForError: boolean } {\n const cleaned = this.cleanUrl(input);\n if (cleaned === '[unsupported URL]') return { safeForError: true };\n try {\n // cleanUrl's malformed-input fallback is for general diagnostics; breadcrumbs need a valid URL.\n const url = new URL(cleaned);\n if ((url.protocol !== 'http:' && url.protocol !== 'https:') || url.username || url.password || url.search || url.hash) {\n return { safeForError: false };\n }\n return { url: cleaned.slice(0, BREADCRUMB_LIMITS.dataString), safeForError: true };\n } catch { return { safeForError: false }; }\n }\n\n private cleanNetworkBreadcrumbMethod(input: string): string {\n const method = safeString(input || 'GET').trim().toUpperCase();\n return /^[A-Z0-9!#$%&'*+.^_`|~-]{1,16}$/.test(method) ? method : 'GET';\n }\n\n private cleanText(input: unknown, length: number, replaceUrls = true): string {\n let value = safeString(input);\n if (replaceUrls) {\n value = value.replace(/https?:\\/\\/[^\\s<>\"'()[\\]]+/gi, match => this.cleanUrl(match));\n value = value.replace(/(^|[\\s\"'(\\[=])((?:\\/(?!\\/)|\\.{1,2}\\/)[^\\s<>\"'()[\\]?#]*[?#][^\\s<>\"'()[\\]]+|[a-z][\\w.-]*(?:\\/[^\\s<>\"'()[\\]?#]*)?(?:\\?[a-z0-9_.-]+=[^\\s<>\"'()[\\]]+|#[^\\s<>\"'()[\\]]+)|\\?[a-z0-9_.-]+=[^\\s<>\"'()[\\]]+)/gi,\n (_match, prefix: string, url: string) => {\n const punctuation = /[.,;!]+$/.exec(url)?.[0] ?? '';\n const core = url.slice(0, url.length - punctuation.length);\n const cleaned = this.options.sanitizeUrl\n ? this.cleanUrl(core)\n : core.startsWith('?') ? '[redacted query]' : this.cleanText(core.split(/[?#]/, 1)[0], 1024, false);\n return `${prefix}${cleaned}${punctuation}`;\n });\n }\n return value\n .replace(/\\bBearer\\s+[A-Za-z0-9._~+\\/-]+/gi, 'Bearer [REDACTED]')\n .replace(/[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,}/gi, '[REDACTED_EMAIL]')\n .slice(0, length);\n }\n\n private cleanContext(input: unknown): ErrorEventRecord['context'] {\n if (!input || typeof input !== 'object') return undefined;\n const output: NonNullable<ErrorEventRecord['context']> = {};\n let keys: string[];\n try { keys = Object.keys(input); }\n catch { return undefined; }\n for (const key of keys) {\n if (Object.keys(output).length >= 12) break;\n if (SENSITIVE_KEY.test(key)) continue;\n const value = read(input, key);\n const safeKey = this.cleanText(key, 80);\n if (typeof value === 'string') output[safeKey] = this.cleanText(value, 500);\n else if (typeof value === 'number' && Number.isFinite(value)) output[safeKey] = value;\n else if (typeof value === 'boolean' || value === null) output[safeKey] = value;\n }\n return Object.keys(output).length ? output : undefined;\n }\n\n private cleanBreadcrumb(input: unknown, timestamp?: string): Breadcrumb | undefined {\n if (!input || typeof input !== 'object') return undefined;\n const occurredAt = timestamp ?? read(input, 'occurredAt');\n if (typeof occurredAt !== 'string') return undefined;\n try { if (new Date(occurredAt).toISOString() !== occurredAt) return undefined; }\n catch { return undefined; }\n const rawCategory = read(input, 'category');\n const rawMessage = read(input, 'message');\n if ((rawCategory !== undefined && typeof rawCategory !== 'string') || typeof rawMessage !== 'string') return undefined;\n const category = this.cleanText(rawCategory ?? (timestamp ? 'manual' : ''), BREADCRUMB_LIMITS.category);\n const message = this.cleanText(rawMessage, BREADCRUMB_LIMITS.message);\n if (!category.trim() || !message.trim()) return undefined;\n const rawData = read(input, 'data');\n const data: NonNullable<Breadcrumb['data']> = {};\n if (rawData && typeof rawData === 'object') {\n let keys: string[];\n try { keys = Object.keys(rawData); }\n catch { keys = []; }\n for (const key of keys) {\n if (Object.keys(data).length >= BREADCRUMB_LIMITS.dataKeys) break;\n if (SENSITIVE_KEY.test(key)) continue;\n const safeKey = this.cleanText(key, BREADCRUMB_LIMITS.dataKey);\n const value = read(rawData, key);\n if (typeof value === 'string') data[safeKey] = this.cleanText(value, BREADCRUMB_LIMITS.dataString);\n else if (typeof value === 'number' && Number.isFinite(value)) data[safeKey] = value;\n else if (typeof value === 'boolean' || value === null) data[safeKey] = value;\n }\n }\n return { occurredAt, category, message, ...(Object.keys(data).length ? { data } : {}) };\n }\n\n private boundBreadcrumbs(trail: Breadcrumb[]): void {\n while (trail.length > BREADCRUMB_LIMITS.count || byteLength(JSON.stringify(trail)) > BREADCRUMB_LIMITS.bytes) trail.shift();\n }\n\n private cleanBreadcrumbTrail(input: unknown): Breadcrumb[] | undefined {\n let length: number;\n try {\n if (!Array.isArray(input)) return undefined;\n length = input.length;\n } catch { return undefined; }\n if (!Number.isSafeInteger(length) || length < 0) return undefined;\n const trail: Breadcrumb[] = [];\n for (let index = Math.max(0, length - BREADCRUMB_LIMITS.count); index < length; index++) {\n const breadcrumb = this.cleanBreadcrumb(read(input, index));\n if (breadcrumb) {\n trail.push(breadcrumb);\n this.boundBreadcrumbs(trail);\n }\n }\n return trail.length ? trail : undefined;\n }\n\n private cleanNetwork(input: unknown): ErrorEventRecord['network'] {\n if (!input || typeof input !== 'object') return undefined;\n const rawStatus = read(input, 'status');\n const status = typeof rawStatus === 'number' && Number.isInteger(rawStatus) && rawStatus >= 100 && rawStatus <= 599\n ? rawStatus : undefined;\n return {\n method: this.cleanText(read(input, 'method') ?? 'GET', 16).toUpperCase(),\n url: this.cleanUrl(read(input, 'url') ?? ''),\n ...(status === undefined ? {} : { status }),\n durationMs: boundedNumber(read(input, 'durationMs'), 0, 3_600_000, 0),\n };\n }\n\n private makeEvent(type: EventType, message: string, extra: {\n name?: string; stack?: string; componentStack?: string;\n context?: unknown; network?: unknown;\n } = {}): ErrorEventRecord {\n const userAgent = read(navigator, 'userAgent');\n const eventContext = this.cleanContext(extra.context);\n let resolved: unknown;\n try { resolved = this.options.getContext?.(); }\n catch { throw new ContextResolutionError('Context resolver failed'); }\n const dynamicContext = this.cleanContext(resolved);\n const defaults = this.cleanContext(this.options.context);\n let context = eventContext;\n if (dynamicContext || defaults) {\n context = { ...eventContext };\n for (const fields of [dynamicContext, defaults]) {\n if (!fields) continue;\n for (const key of Object.keys(fields)) {\n if (Object.keys(context).length >= 12) break;\n if (!Object.prototype.hasOwnProperty.call(context, key)) context[key] = fields[key];\n }\n }\n }\n const network = this.cleanNetwork(extra.network);\n return {\n schemaVersion: 1,\n eventId: newId(),\n project: this.cleanText(this.options.project, 80),\n environment: this.cleanText(this.options.environment ?? 'development', 80),\n release: this.cleanText(this.options.release ?? 'unknown', 120),\n sdkVersion: '0.1.19',\n occurredAt: new Date().toISOString(),\n viewId: this.viewId,\n sequence: ++this.sequence,\n elapsedMs: boundedNumber(now() - this.startedAt, 0, 3_600_000, 0),\n type,\n message: this.cleanText(message, 1024),\n ...(extra.name === undefined ? {} : { name: this.cleanText(extra.name, 100) }),\n ...(extra.stack === undefined ? {} : { stack: this.cleanText(extra.stack, 4096) }),\n ...(extra.componentStack === undefined ? {} : { componentStack: this.cleanText(extra.componentStack, 2048) }),\n page: this.cleanUrl(window.location.href),\n runtime: RUNTIMES.has(this.options.runtime as Runtime) ? this.options.runtime! : 'browser',\n ...(typeof userAgent === 'string' ? { browser: this.cleanText(userAgent, 300) } : {}),\n ...(context ? { context } : {}),\n ...(this.breadcrumbs.length ? { breadcrumbs: this.breadcrumbs.map(crumb => ({\n ...crumb, ...(crumb.data ? { data: { ...crumb.data } } : {}),\n })) } : {}),\n ...(network ? { network } : {}),\n };\n }\n\n private sanitizeReplacement(candidate: unknown, base: ErrorEventRecord): ErrorEventRecord {\n const type = read(candidate, 'type');\n const runtime = read(candidate, 'runtime');\n const name = read(candidate, 'name');\n const stack = read(candidate, 'stack');\n const componentStack = read(candidate, 'componentStack');\n const browser = read(candidate, 'browser');\n const context = this.cleanContext(read(candidate, 'context'));\n const breadcrumbs = this.cleanBreadcrumbTrail(read(candidate, 'breadcrumbs'));\n const network = this.cleanNetwork(read(candidate, 'network'));\n return {\n ...base,\n type: EVENT_TYPES.has(type as EventType) ? type as EventType : base.type,\n message: this.cleanText(read(candidate, 'message') ?? base.message, 1024),\n ...(name === undefined ? { name: base.name } : { name: this.cleanText(name, 100) }),\n ...(stack === undefined ? { stack: base.stack } : { stack: this.cleanText(stack, 4096) }),\n ...(componentStack === undefined ? { componentStack: base.componentStack } : { componentStack: this.cleanText(componentStack, 2048) }),\n page: this.cleanUrl(read(candidate, 'page') ?? base.page),\n runtime: RUNTIMES.has(runtime as Runtime) ? runtime as Runtime : base.runtime,\n ...(browser === undefined ? { browser: base.browser } : { browser: this.cleanText(browser, 300) }),\n ...(context ? { context } : { context: undefined }),\n ...(breadcrumbs ? { breadcrumbs } : { breadcrumbs: undefined }),\n ...(network ? { network } : { network: undefined }),\n };\n }\n\n private admissionTime(): number | undefined {\n const reading = now();\n const current = Number.isFinite(reading)\n ? Math.max(0, reading, this.lastAdmissionClock ?? 0)\n : this.lastAdmissionClock ?? 0;\n this.lastAdmissionClock = current;\n while (this.admittedAt.length && current - this.admittedAt[0] >= 60_000) this.admittedAt.shift();\n return this.admittedAt.length < this.maxEventsPerMinute! ? current : undefined;\n }\n\n private enqueue(event: ErrorEventRecord): boolean {\n if (this.destroyed) return false;\n if (this.maxEventsPerMinute !== undefined && this.admissionTime() === undefined) {\n this.dropped++;\n return false;\n }\n let finalEvent = event;\n if (this.options.beforeSend) {\n try {\n const copy = { ...event, context: event.context && { ...event.context },\n breadcrumbs: event.breadcrumbs?.map(crumb => ({ ...crumb, data: crumb.data && { ...crumb.data } })),\n network: event.network && { ...event.network } };\n const result = this.options.beforeSend(copy);\n if (result === false || result === null) return false;\n finalEvent = this.sanitizeReplacement(result === undefined ? copy : result, event);\n } catch { this.dropped++; return false; }\n }\n // A single event can never make a batch exceed its byte budget.\n if (byteLength(JSON.stringify(finalEvent)) > MAX_BATCH_BYTES) { this.dropped++; return false; }\n const admittedAt = this.maxEventsPerMinute === undefined ? undefined : this.admissionTime();\n if (this.maxEventsPerMinute !== undefined && admittedAt === undefined) { this.dropped++; return false; }\n if (this.queue.length >= this.maxQueueSize) { this.queue.shift(); this.dropped++; }\n this.queue.push(finalEvent);\n if (admittedAt !== undefined) this.admittedAt.push(admittedAt);\n if (this.queue.length >= this.maxQueueSize) void this.flush();\n return true;\n }\n\n private takeBatch(maxEvents = MAX_BATCH_EVENTS, maxBytes = MAX_BATCH_BYTES): EventBatch {\n const events: ErrorEventRecord[] = [];\n let bytes = byteLength('{\"schemaVersion\":1,\"events\":[]}');\n while (this.queue.length && events.length < maxEvents) {\n const next = this.queue[0];\n const size = byteLength(JSON.stringify(next)) + (events.length ? 1 : 0);\n if (events.length && bytes + size > maxBytes) break;\n if (!events.length && bytes + size > maxBytes) { this.queue.shift(); this.dropped++; continue; }\n events.push(this.queue.shift()!);\n bytes += size;\n }\n return { schemaVersion: 1, events };\n }\n\n private async drain(): Promise<void> {\n while (!this.destroyed && this.queue.length) {\n const batch = this.takeBatch();\n if (batch.events.length) {\n this.inFlight += batch.events.length;\n try { await this.sendWithRetry(batch); }\n finally { this.inFlight -= batch.events.length; }\n }\n }\n }\n\n private async sendWithRetry(batch: EventBatch): Promise<void> {\n for (let attempt = 0; attempt <= RETRY_DELAYS_MS.length && !this.destroyed; attempt++) {\n const controller = new AbortController();\n this.controllers.add(controller);\n let timeoutHandle: ReturnType<typeof setTimeout> | undefined;\n const timeout = new Promise<never>((_resolve, reject) => {\n timeoutHandle = setTimeout(() => {\n controller.abort();\n reject(new Error('Collector transport timed out'));\n }, this.transportTimeoutMs);\n });\n let retryDelay: number | undefined;\n try {\n const result = await Promise.race([this.send(batch, controller.signal), timeout, this.destroySignal]);\n if (result === DESTROYED || this.destroyed) return;\n this.sent += batch.events.length;\n return;\n } catch (error) {\n if (this.destroyed) return;\n const status = read(error, 'status');\n const retryable = typeof status !== 'number' || status === 429 || status >= 500;\n if (!retryable || attempt === RETRY_DELAYS_MS.length) break;\n retryDelay = RETRY_DELAYS_MS[attempt];\n } finally {\n if (timeoutHandle) clearTimeout(timeoutHandle);\n this.controllers.delete(controller);\n }\n if (retryDelay !== undefined) await this.wait(retryDelay);\n }\n if (!this.destroyed) this.dropped += batch.events.length;\n }\n\n private async send(batch: EventBatch, signal: AbortSignal): Promise<void> {\n if (this.options.transport) { await this.options.transport(batch, { signal }); return; }\n const response = await window.fetch(this.endpoint!, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(batch),\n credentials: 'omit',\n signal,\n });\n if (!response.ok) throw new HttpDeliveryError(response.status);\n }\n\n private wait(milliseconds: number): Promise<void> {\n return new Promise(resolve => {\n const finish = () => { clearTimeout(timer); this.cancelWaits.delete(finish); resolve(); };\n const timer = setTimeout(finish, milliseconds);\n this.cancelWaits.add(finish);\n });\n }\n\n private tryBeacon(): void {\n if (this.destroyed || this.options.transport || !this.endpoint || !this.queue.length) return;\n try {\n const url = new URL(this.endpoint);\n if (url.origin !== window.location.origin || url.search || url.hash || url.username || url.password) return;\n if (typeof navigator.sendBeacon !== 'function') return;\n const candidates = this.queue.slice(0, MAX_BEACON_EVENTS);\n while (candidates.length > 0) {\n const batch: EventBatch = { schemaVersion: 1, events: candidates };\n const body = JSON.stringify(batch);\n if (byteLength(body) <= MAX_BEACON_BYTES) {\n if (navigator.sendBeacon(this.endpoint, new Blob([body], { type: 'application/json' }))) {\n this.queue.splice(0, candidates.length);\n this.sent += candidates.length;\n }\n return;\n }\n candidates.pop();\n }\n } catch { /* best effort only */ }\n }\n}\n\nconst DESTROYED = Symbol('destroyed');\n\ninterface Instrumentation {\n clients: Set<Client>;\n cleanup(): void;\n}\n\nlet networkInstrumentation: Instrumentation | undefined;\nlet consoleInstrumentation: Instrumentation | undefined;\nlet navigationInstrumentation: Instrumentation | undefined;\n\ntype NavigationTrigger = 'pushState' | 'replaceState' | 'popstate' | 'hashchange';\n\nfunction addNavigationClient(client: Client): void {\n if (!navigationInstrumentation) navigationInstrumentation = installNavigation();\n navigationInstrumentation?.clients.add(client);\n}\n\nfunction removeNavigationClient(client: Client): void {\n const instrumentation = navigationInstrumentation;\n if (!instrumentation) return;\n instrumentation.clients.delete(client);\n if (!instrumentation.clients.size) {\n instrumentation.cleanup();\n navigationInstrumentation = undefined;\n }\n}\n\nfunction inheritedHistoryDescriptor(historyObject: History, key: 'pushState' | 'replaceState'): PropertyDescriptor | undefined {\n const seen = new Set<object>();\n let prototype = Object.getPrototypeOf(historyObject);\n while (prototype && !seen.has(prototype)) {\n seen.add(prototype);\n const descriptor = Object.getOwnPropertyDescriptor(prototype, key);\n if (descriptor) return descriptor;\n prototype = Object.getPrototypeOf(prototype);\n }\n return undefined;\n}\n\nfunction installNavigation(): Instrumentation | undefined {\n let historyObject: History;\n let lastHref: string;\n let originalPush: History['pushState'];\n let originalReplace: History['replaceState'];\n let ownPush: PropertyDescriptor | undefined;\n let ownReplace: PropertyDescriptor | undefined;\n let inheritedPush: PropertyDescriptor | undefined;\n let inheritedReplace: PropertyDescriptor | undefined;\n try {\n historyObject = window.history;\n lastHref = window.location.href;\n ownPush = Object.getOwnPropertyDescriptor(historyObject, 'pushState');\n ownReplace = Object.getOwnPropertyDescriptor(historyObject, 'replaceState');\n inheritedPush = ownPush ? undefined : inheritedHistoryDescriptor(historyObject, 'pushState');\n inheritedReplace = ownReplace ? undefined : inheritedHistoryDescriptor(historyObject, 'replaceState');\n if ((ownPush && !('value' in ownPush)) || (ownReplace && !('value' in ownReplace))) return undefined;\n if ((!ownPush && (!inheritedPush || !('value' in inheritedPush) || inheritedPush.writable !== true)) ||\n (!ownReplace && (!inheritedReplace || !('value' in inheritedReplace) || inheritedReplace.writable !== true))) return undefined;\n originalPush = ownPush ? ownPush.value : historyObject.pushState;\n originalReplace = ownReplace ? ownReplace.value : historyObject.replaceState;\n if (typeof originalPush !== 'function' || typeof originalReplace !== 'function') return undefined;\n const canInstall = (own?: PropertyDescriptor) => own\n ? own.configurable === true || own.writable === true\n : Object.isExtensible(historyObject);\n if (!canInstall(ownPush) || !canInstall(ownReplace)) return undefined;\n } catch { return undefined; }\n\n const clients = new Set<Client>();\n const report = (trigger: NavigationTrigger): void => {\n try {\n const toHref = window.location.href;\n if (toHref === lastHref) return;\n const fromHref = lastHref;\n lastHref = toHref;\n for (const client of clients) {\n try { client.reportNavigation(fromHref, toHref, trigger); }\n catch { /* Telemetry must never alter a successful native call. */ }\n }\n } catch { /* Location can be unavailable in a restricted host. */ }\n };\n const wrappedPush: History['pushState'] = function (this: History, ...args: Parameters<History['pushState']>): void {\n const result = Reflect.apply(originalPush, this, args);\n report('pushState');\n return result;\n };\n const wrappedReplace: History['replaceState'] = function (this: History, ...args: Parameters<History['replaceState']>): void {\n const result = Reflect.apply(originalReplace, this, args);\n report('replaceState');\n return result;\n };\n const onPopState = () => { report('popstate'); };\n const onHashChange = () => { report('hashchange'); };\n const restore = (key: 'pushState' | 'replaceState', wrapper: History['pushState'], own?: PropertyDescriptor): void => {\n try {\n const current = Object.getOwnPropertyDescriptor(historyObject, key);\n if (!current || !('value' in current) || current.value !== wrapper) return;\n if (own) Object.defineProperty(historyObject, key, own);\n else Reflect.deleteProperty(historyObject, key);\n } catch { /* Keep a host-installed replacement and never throw during cleanup. */ }\n };\n let pushInstalled = false;\n let replaceInstalled = false;\n try {\n Object.defineProperty(historyObject, 'pushState', { configurable: ownPush?.configurable ?? true,\n enumerable: ownPush?.enumerable ?? false, writable: ownPush?.writable ?? true, value: wrappedPush });\n pushInstalled = true;\n Object.defineProperty(historyObject, 'replaceState', { configurable: ownReplace?.configurable ?? true,\n enumerable: ownReplace?.enumerable ?? false, writable: ownReplace?.writable ?? true, value: wrappedReplace });\n replaceInstalled = true;\n window.addEventListener('popstate', onPopState);\n window.addEventListener('hashchange', onHashChange);\n } catch {\n try { window.removeEventListener('hashchange', onHashChange); } catch { /* best effort */ }\n try { window.removeEventListener('popstate', onPopState); } catch { /* best effort */ }\n if (replaceInstalled) restore('replaceState', wrappedReplace, ownReplace);\n if (pushInstalled) restore('pushState', wrappedPush, ownPush);\n return undefined;\n }\n return { clients, cleanup() {\n try { window.removeEventListener('popstate', onPopState); } catch { /* best effort */ }\n try { window.removeEventListener('hashchange', onHashChange); } catch { /* best effort */ }\n restore('pushState', wrappedPush, ownPush);\n restore('replaceState', wrappedReplace, ownReplace);\n } };\n}\n\nfunction addNetworkClient(client: Client): void {\n if (!networkInstrumentation) networkInstrumentation = installNetwork();\n networkInstrumentation.clients.add(client);\n}\n\nfunction removeNetworkClient(client: Client): void {\n const instrumentation = networkInstrumentation;\n if (!instrumentation) return;\n instrumentation.clients.delete(client);\n if (!instrumentation.clients.size) {\n instrumentation.cleanup();\n networkInstrumentation = undefined;\n }\n}\n\nfunction describeFetch(input: RequestInfo | URL, init?: RequestInit): { url: string; method: string; signal?: AbortSignal | null } {\n let requestUrl: string | undefined;\n if (typeof Request !== 'undefined' && input !== null && typeof input === 'object') {\n if (input instanceof Request) requestUrl = read(input, 'url') as string | undefined;\n else {\n try { requestUrl = Object.getOwnPropertyDescriptor(Request.prototype, 'url')?.get?.call(input); }\n catch { /* not a genuine Request */ }\n }\n }\n const initSignal = read(init, 'signal');\n return {\n url: requestUrl ?? safeString(input),\n method: safeString(read(init, 'method') ?? (requestUrl === undefined ? undefined : read(input, 'method')) ?? 'GET'),\n signal: (initSignal === undefined ? (requestUrl === undefined ? undefined : read(input, 'signal')) : initSignal) as AbortSignal | null | undefined,\n };\n}\n\nfunction installNetwork(): Instrumentation {\n const clients = new Set<Client>();\n const originalFetch = window.fetch;\n let wrappedFetch: typeof fetch | undefined;\n if (typeof originalFetch === 'function') {\n wrappedFetch = function (this: typeof window, ...args: Parameters<typeof fetch>): ReturnType<typeof fetch> {\n if (!clients.size) return Reflect.apply(originalFetch, this, args);\n const started = now();\n let request: ReturnType<typeof describeFetch>;\n try { request = describeFetch(args[0], args[1]); }\n catch { request = { url: '', method: 'GET' }; }\n let promise: ReturnType<typeof fetch>;\n try { promise = Reflect.apply(originalFetch, this, args); }\n catch (error) {\n if (!isAbort(error, request.signal)) for (const client of clients) client.reportNetwork(request.method, request.url, undefined, now() - started, error);\n throw error;\n }\n return promise.then(\n response => {\n try {\n const status = response.status;\n for (const client of clients) client.reportNetwork(request.method, request.url, status, now() - started);\n } catch { /* telemetry cannot change the fetch result */ }\n return response;\n },\n error => {\n if (!isAbort(error, request.signal)) for (const client of clients) client.reportNetwork(request.method, request.url, undefined, now() - started, error);\n throw error;\n },\n );\n };\n window.fetch = wrappedFetch;\n }\n\n const prototype = typeof XMLHttpRequest === 'undefined' ? undefined : XMLHttpRequest.prototype;\n const originalOpen = prototype?.open;\n const originalSend = prototype?.send;\n const metadata = new WeakMap<XMLHttpRequest, { method: string; url: string }>();\n const pending = new WeakMap<XMLHttpRequest, () => void>();\n let wrappedOpen: typeof XMLHttpRequest.prototype.open | undefined;\n let wrappedSend: typeof XMLHttpRequest.prototype.send | undefined;\n if (prototype && originalOpen && originalSend) {\n wrappedOpen = (function (this: XMLHttpRequest, ...args: unknown[]): void {\n const result = Reflect.apply(originalOpen, this, args);\n pending.get(this)?.();\n try { metadata.set(this, { method: safeString(args[0]), url: safeString(args[1]) }); }\n catch { /* native open already succeeded */ }\n return result;\n }) as typeof XMLHttpRequest.prototype.open;\n wrappedSend = function (this: XMLHttpRequest, ...args: Parameters<XMLHttpRequest['send']>): void {\n if (!clients.size) return Reflect.apply(originalSend, this, args);\n const details = metadata.get(this);\n if (!details) return Reflect.apply(originalSend, this, args);\n const started = now();\n let aborted = false;\n let failed = false;\n let completed = false;\n const onAbort = () => { aborted = true; };\n const onFailure = () => { failed = true; };\n const cleanup = () => {\n this.removeEventListener('abort', onAbort);\n this.removeEventListener('error', onFailure);\n this.removeEventListener('timeout', onFailure);\n this.removeEventListener('loadend', onLoadEnd);\n if (pending.get(this) === cleanup) pending.delete(this);\n };\n const onLoadEnd = () => {\n completed = true;\n cleanup();\n if (aborted) return;\n try {\n const status = this.status;\n if (status === 0 && !failed) {\n for (const client of clients) client.reportZeroStatusCompletion(details.method, details.url, now() - started);\n return;\n }\n for (const client of clients) client.reportNetwork(details.method, details.url,\n status === 0 ? undefined : status, now() - started);\n } catch { /* XHR state may be unavailable */ }\n };\n try {\n this.addEventListener('abort', onAbort);\n this.addEventListener('error', onFailure);\n this.addEventListener('timeout', onFailure);\n this.addEventListener('loadend', onLoadEnd);\n } catch {\n cleanup();\n return Reflect.apply(originalSend, this, args);\n }\n try {\n const result = Reflect.apply(originalSend, this, args);\n if (!completed) pending.set(this, cleanup);\n return result;\n }\n catch (error) {\n cleanup();\n throw error;\n }\n };\n prototype.open = wrappedOpen!;\n prototype.send = wrappedSend;\n }\n return {\n clients,\n cleanup() {\n if (wrappedFetch && window.fetch === wrappedFetch) window.fetch = originalFetch;\n if (prototype && wrappedOpen && prototype.open === wrappedOpen) prototype.open = originalOpen!;\n if (prototype && wrappedSend && prototype.send === wrappedSend) prototype.send = originalSend!;\n },\n };\n}\n\nfunction addConsoleClient(client: Client): void {\n if (!consoleInstrumentation) consoleInstrumentation = installConsole();\n consoleInstrumentation.clients.add(client);\n}\n\nfunction removeConsoleClient(client: Client): void {\n const instrumentation = consoleInstrumentation;\n if (!instrumentation) return;\n instrumentation.clients.delete(client);\n if (!instrumentation.clients.size) {\n instrumentation.cleanup();\n consoleInstrumentation = undefined;\n }\n}\n\nfunction installConsole(): Instrumentation {\n const clients = new Set<Client>();\n const original = console.error;\n const wrapped: typeof console.error = function (this: Console, ...values: unknown[]): void {\n try { return Reflect.apply(original, this, values); }\n finally { for (const client of clients) client.captureConsole(values); }\n };\n console.error = wrapped;\n return { clients, cleanup() { if (console.error === wrapped) console.error = original; } };\n}\n\nexport function init(options: BrowserErrorLogOptions): BrowserErrorLogBreadcrumbClient {\n return new Client(options);\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["BREADCRUMB_LIMITS", "MAX_BATCH_EVENTS", "MAX_BATCH_BYTES", "MAX_BEACON_EVENTS", "MAX_BEACON_BYTES", "RETRY_DELAYS_MS", "SENSITIVE_KEY", "EVENT_TYPES", "RUNTIMES", "fallbackId", "read", "object", "key", "safeString", "value", "trim", "length", "now", "newId", "isAbort", "error", "signal", "errorFields", "message", "name", "stack", "byteLength", "boundedNumber", "minimum", "maximum", "fallback", "HttpDeliveryError", "status", "__publicField", "UrlSanitizationError", "ContextResolutionError", "Client", "options", "event", "filename", "lineno", "colno", "context", "automaticNetworkAllowed", "resolve", "addNetworkClient", "addConsoleClient", "addNavigationClient", "extra", "fields", "type", "method", "url", "durationMs", "failure", "allowErrorCapture", "captureError", "cleaned", "data", "network", "values", "input", "breadcrumb", "fromHref", "toHref", "trigger", "from", "to", "removeNetworkClient", "removeConsoleClient", "removeNavigationClient", "cancel", "controller", "DESTROYED", "request", "collector", "BREADCRUMB_LIMITS", "replaceUrls", "match", "_match", "prefix", "punctuation", "core", "output", "keys", "safeKey", "timestamp", "occurredAt", "rawCategory", "rawMessage", "category", "rawData", "trail", "index", "rawStatus", "userAgent", "eventContext", "resolved", "dynamicContext", "defaults", "crumb", "candidate", "base", "runtime", "componentStack", "browser", "breadcrumbs", "reading", "current", "finalEvent", "copy", "result", "admittedAt", "maxEvents", "maxBytes", "events", "bytes", "next", "size", "batch", "attempt", "timeoutHandle", "timeout", "_resolve", "reject", "retryDelay", "response", "milliseconds", "finish", "timer", "candidates", "body", "networkInstrumentation", "consoleInstrumentation", "navigationInstrumentation", "client", "installNavigation", "instrumentation", "inheritedHistoryDescriptor", "historyObject", "seen", "prototype", "descriptor", "lastHref", "originalPush", "originalReplace", "ownPush", "ownReplace", "inheritedPush", "inheritedReplace", "canInstall", "own", "clients", "report", "wrappedPush", "args", "wrappedReplace", "onPopState", "onHashChange", "restore", "wrapper", "pushInstalled", "replaceInstalled", "installNetwork", "describeFetch", "init", "requestUrl", "initSignal", "originalFetch", "wrappedFetch", "started", "promise", "originalOpen", "originalSend", "metadata", "pending", "wrappedOpen", "wrappedSend", "details", "aborted", "failed", "completed", "onAbort", "onFailure", "cleanup", "onLoadEnd", "installConsole", "original", "wrapped"]
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ihyeon/browser-error-log",
3
- "version": "0.1.17",
3
+ "version": "0.1.19",
4
4
  "description": "A small, framework-independent browser error SDK for a collector you control.",
5
5
  "keywords": [
6
6
  "browser",
@@ -23,7 +23,7 @@
23
23
  }
24
24
  },
25
25
  "dependencies": {
26
- "@ihyeon/browser-error-log-protocol": "0.1.17"
26
+ "@ihyeon/browser-error-log-protocol": "0.1.19"
27
27
  },
28
28
  "files": [
29
29
  "dist",