@ihyeon/browser-error-log 0.1.14 → 0.1.15

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
@@ -68,10 +68,13 @@ try {
68
68
  ## 수집 제어
69
69
 
70
70
  ```ts
71
+ let currentAppSection = 'checkout';
72
+
71
73
  const errorLog = init({
72
74
  project: 'my-web',
73
75
  endpoint: '/api/events', // 자체 수집기 또는 같은 Origin의 프록시
74
- context: { appSection: 'checkout', buildChannel: 'stable' },
76
+ context: { buildChannel: 'stable' },
77
+ getContext: () => ({ appSection: currentAppSection }),
75
78
  captureConsole: false,
76
79
  beforeSend(event) {
77
80
  if (event.message.includes('Expected diagnostic')) return null;
@@ -84,9 +87,11 @@ const errorLog = init({
84
87
  return status >= 500;
85
88
  },
86
89
  });
90
+
91
+ currentAppSection = 'account'; // 이후 이벤트에는 현재 값을 사용
87
92
  ```
88
93
 
89
- 초기화 시 `context`를 지정하면 자동 수집을 포함한 모든 이벤트에 공통 진단 정보를 붙입니다. `captureException(error, { context })`의 개별 값이 우선하며, 최대 12개의 단일 값 항목 중 남은 자리를 공통 정보로 채웁니다. 동일한 민감 키·URL·텍스트 필터가 적용되고, `beforeSend`에서 합쳐진 context를 수정하거나 제거할 수 있습니다.
94
+ 초기화 시 `context`를 지정하면 자동 수집을 포함한 모든 이벤트에 공통 진단 정보를 붙입니다. 동기 콜백 `getContext`는 이벤트 수집 시 한 번 호출해 현재 앱 상태를 읽으며, `undefined`를 반환하면 동적 항목을 추가하지 않습니다. 최대 12개의 단일 값 항목 안에서 `captureException(error, { context })`의 개별 값, `getContext`, 초기화 `context` 순서로 우선합니다. 동일한 민감 키·URL·텍스트 필터가 적용되고, `beforeSend`에서 합쳐진 context를 수정하거나 제거할 수 있습니다. 이미 큐에 담긴 이벤트는 수집 당시 값을 유지합니다. `getContext`가 예외를 던지면 앱에 영향을 주지 않고 해당 이벤트를 버립니다.
90
95
 
91
96
  `captureConsole: true`로 `console.error` 호출을 수집할 수 있습니다. 인자를 합친 메시지는 유지하며, 같은 창에서 생성된 첫 번째 `Error` 인자의 이름과 스택도 기록합니다. 동일한 민감정보 필터와 `beforeSend` 제어가 적용됩니다.
92
97
 
package/README.md CHANGED
@@ -68,10 +68,13 @@ The optional `@ihyeon/browser-error-log-react` package provides an Error Boundar
68
68
  ## Collection controls
69
69
 
70
70
  ```ts
71
+ let currentAppSection = 'checkout';
72
+
71
73
  const errorLog = init({
72
74
  project: 'my-web',
73
75
  endpoint: '/api/events', // your collector or a same-origin proxy
74
- context: { appSection: 'checkout', buildChannel: 'stable' },
76
+ context: { buildChannel: 'stable' },
77
+ getContext: () => ({ appSection: currentAppSection }),
75
78
  captureConsole: false,
76
79
  beforeSend(event) {
77
80
  if (event.message.includes('Expected diagnostic')) return null;
@@ -84,9 +87,11 @@ const errorLog = init({
84
87
  return status >= 500;
85
88
  },
86
89
  });
90
+
91
+ currentAppSection = 'account'; // subsequent events use the current value
87
92
  ```
88
93
 
89
- Set `context` at initialization to attach common diagnostic fields to every event, including automatic captures. Per-error `captureException(error, { context })` values take priority, including within the limit of 12 scalar fields; common fields fill the remaining slots. The same sensitive-key, URL, and text filters apply, and `beforeSend` can edit or remove the combined context.
94
+ Set `context` at initialization to attach common diagnostic fields to every event, including automatic captures. Use the synchronous `getContext` callback to read current app state once per captured event; returning `undefined` adds no dynamic fields. Per-error `captureException(error, { context })` values take priority over `getContext`, followed by initialization `context`, within the limit of 12 scalar fields. The same sensitive-key, URL, and text filters apply, and `beforeSend` can edit or remove the combined context. Already queued events keep their captured values. A throwing `getContext` drops that event without affecting the app.
90
95
 
91
96
  Set `captureConsole: true` to capture `console.error` calls. The combined message is preserved; the first `Error` created in the current window also contributes its name and stack, using the same redaction and `beforeSend` controls.
92
97
 
package/dist/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";var q=Object.defineProperty;var H=Object.getOwnPropertyDescriptor;var X=Object.getOwnPropertyNames;var D=Object.prototype.hasOwnProperty;var F=(r,e,t)=>e in r?q(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t;var V=(r,e)=>{for(var t in e)q(r,t,{get:e[t],enumerable:!0})},W=(r,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of X(e))!D.call(r,o)&&o!==t&&q(r,o,{get:()=>e[o],enumerable:!(n=H(e,o))||n.enumerable});return r};var Y=r=>W(q({},"__esModule",{value:!0}),r);var a=(r,e,t)=>F(r,typeof e!="symbol"?e+"":e,t);var ie={};V(ie,{init:()=>oe});module.exports=Y(ie);var _=[250,500],$=/(?:password|passwd|token|secret|authorization|cookie|session|api.?key|credential|bearer|private.?key)/i,j=new Set(["javascript","promise","react","console","http","network","manual"]),I=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 m(r){try{return String(r)}catch{return"[unavailable]"}}function G(r,e){return m(r).slice(0,e)}function v(){try{return performance.now()}catch{return Date.now()}}function O(){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 A(r,e){try{if(e?.aborted)return!0}catch{}return s(r,"name")==="AbortError"||s(r,"code")===20}function M(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?m(r):m(e),...t==null?{}:{name:m(t)},...n==null?{}:{stack:m(n)}}}function L(r){return new TextEncoder().encode(r).length}function k(r,e,t,n){return typeof r=="number"&&Number.isFinite(r)?Math.min(t,Math.max(e,Math.floor(r))):n}var B=class extends Error{constructor(t){super(`Collector responded ${t}`);a(this,"status",t)}},R=class extends Error{},N=class{constructor(e){a(this,"active");a(this,"endpoint");a(this,"options");a(this,"networkCaptureEnabled");a(this,"transportTimeoutMs");a(this,"startedAt",v());a(this,"viewId",O());a(this,"seenErrors",new WeakSet);a(this,"queue",[]);a(this,"maxQueueSize");a(this,"cancelWaits",new Set);a(this,"controllers",new Set);a(this,"destroySignal");a(this,"resolveDestroy");a(this,"interval");a(this,"flushing");a(this,"sequence",0);a(this,"inFlight",0);a(this,"sent",0);a(this,"dropped",0);a(this,"destroyed",!1);a(this,"onError",e=>{try{let t=s(e,"filename"),n=s(e,"lineno"),o=s(e,"colno"),i={};typeof t=="string"&&t.trim()&&(i.filename=this.cleanUrl(t)),typeof n=="number"&&Number.isFinite(n)&&n>0&&(i.lineno=n),typeof o=="number"&&Number.isFinite(o)&&o>0&&(i.colno=o),this.captureException(s(e,"error")??s(e,"message")??"Script error",{type:"javascript",...Object.keys(i).length?{context:i}:{}})}catch{this.dropped++}});a(this,"onRejection",e=>{this.captureException(e.reason,{type:"promise"})});a(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.maxQueueSize=k(e.maxQueueSize,1,100,50),this.transportTimeoutMs=k(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&&J(this),e.captureConsole===!0&&te(this),this.interval=setInterval(()=>{this.flush()},k(e.flushIntervalMs,10,6e4,1e4))}}captureException(e,t={}){if(!(!this.active||this.destroyed||A(e)))try{if(e!==null&&(typeof e=="object"||typeof e=="function")&&this.seenErrors.has(e))return;let n=M(e),o=j.has(t.type)?t.type:"manual",i=this.makeEvent(o,n.message,{name:n.name,stack:n.stack,componentStack:t.componentStack,context:t.context});this.enqueue(i)&&e!==null&&(typeof e=="object"||typeof e=="function")&&this.seenErrors.add(e)}catch(n){n instanceof R&&this.dropped++}}reportNetwork(e,t,n,o,i){if(!(this.destroyed||!this.active||this.isCollectorUrl(t)||A(i)))try{if(n!==void 0&&!(this.options.shouldCaptureHttp?this.options.shouldCaptureHttp(n,t,e):n>=500))return;let c={method:G(e||"GET",16).toUpperCase(),url:t,status:n,durationMs:o},l=i===void 0?void 0:M(i),u=this.makeEvent(n===void 0?"network":"http",n===void 0?l?.message||"Network request failed":`HTTP ${n}`,{name:l?.name,network:c});this.enqueue(u)}catch{this.dropped++}}captureConsole(e){if(!(!this.active||this.destroyed))try{let t=e.map(m).join(" "),n;for(let o of e)try{if(o instanceof Error){n=M(o);break}}catch{}this.enqueue(this.makeEvent("console",t,{name:n?.name,stack:n?.stack}))}catch{this.dropped++}}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&&Z(this),this.options.captureConsole===!0&&ne(this)),this.dropped+=this.queue.length+this.inFlight,this.queue.length=0;for(let e of this.cancelWaits)e();for(let e of this.controllers)e.abort();this.resolveDestroy(z)}}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=m(e);if(this.options.sanitizeUrl){try{t=this.options.sanitizeUrl(t)}catch{throw new R("URL sanitizer failed")}if(typeof t!="string"||!t)throw new R("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 o=m(e);return n&&(o=o.replace(/https?:\/\/[^\s<>"'()[\]]+/gi,i=>this.cleanUrl(i)),o=o.replace(/(^|[\s"'(\[=])((?:\/(?!\/)|\.{1,2}\/)[^\s<>"'()[\]?#]*[?#][^\s<>"'()[\]]+|[a-z][\w.-]*(?:\/[^\s<>"'()[\]?#]*)?(?:\?[a-z0-9_.-]+=[^\s<>"'()[\]]+|#[^\s<>"'()[\]]+)|\?[a-z0-9_.-]+=[^\s<>"'()[\]]+)/gi,(i,c,l)=>{let u=/[.,;!]+$/.exec(l)?.[0]??"",h=l.slice(0,l.length-u.length),d=this.options.sanitizeUrl?this.cleanUrl(h):h.startsWith("?")?"[redacted query]":this.cleanText(h.split(/[?#]/,1)[0],1024,!1);return`${c}${d}${u}`})),o.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 o of n){if(Object.keys(t).length>=12)break;if($.test(o))continue;let i=s(e,o),c=this.cleanText(o,80);typeof i=="string"?t[c]=this.cleanText(i,500):(typeof i=="number"&&Number.isFinite(i)||typeof i=="boolean"||i===null)&&(t[c]=i)}return Object.keys(t).length?t: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:k(s(e,"durationMs"),0,36e5,0)}}makeEvent(e,t,n={}){let o=s(navigator,"userAgent"),i=this.cleanContext(n.context),c=this.cleanContext(this.options.context),l=i;if(c){l={...i};for(let h of Object.keys(c)){if(Object.keys(l).length>=12)break;Object.prototype.hasOwnProperty.call(l,h)||(l[h]=c[h])}}let u=this.cleanNetwork(n.network);return{schemaVersion:1,eventId:O(),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.14",occurredAt:new Date().toISOString(),viewId:this.viewId,sequence:++this.sequence,elapsedMs:k(v()-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:I.has(this.options.runtime)?this.options.runtime:"browser",...typeof o=="string"?{browser:this.cleanText(o,300)}:{},...l?{context:l}:{},...u?{network:u}:{}}}sanitizeReplacement(e,t){let n=s(e,"type"),o=s(e,"runtime"),i=s(e,"name"),c=s(e,"stack"),l=s(e,"componentStack"),u=s(e,"browser"),h=this.cleanContext(s(e,"context")),d=this.cleanNetwork(s(e,"network"));return{...t,type:j.has(n)?n:t.type,message:this.cleanText(s(e,"message")??t.message,1024),...i===void 0?{name:t.name}:{name:this.cleanText(i,100)},...c===void 0?{stack:t.stack}:{stack:this.cleanText(c,4096)},...l===void 0?{componentStack:t.componentStack}:{componentStack:this.cleanText(l,2048)},page:this.cleanUrl(s(e,"page")??t.page),runtime:I.has(o)?o:t.runtime,...u===void 0?{browser:t.browser}:{browser:this.cleanText(u,300)},...h?{context:h}:{context:void 0},...d?{network:d}:{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},network:e.network&&{...e.network}},o=this.options.beforeSend(n);if(o===!1||o===null)return!1;t=this.sanitizeReplacement(o===void 0?n:o,e)}catch{return this.dropped++,!1}return L(JSON.stringify(t))>48e3?(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=20,t=48e3){let n=[],o=L('{"schemaVersion":1,"events":[]}');for(;this.queue.length&&n.length<e;){let i=this.queue[0],c=L(JSON.stringify(i))+(n.length?1:0);if(n.length&&o+c>t)break;if(!n.length&&o+c>t){this.queue.shift(),this.dropped++;continue}n.push(this.queue.shift()),o+=c}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<=_.length&&!this.destroyed;t++){let n=new AbortController;this.controllers.add(n);let o,i=new Promise((l,u)=>{o=setTimeout(()=>{n.abort(),u(new Error("Collector transport timed out"))},this.transportTimeoutMs)}),c;try{if(await Promise.race([this.send(e,n.signal),i,this.destroySignal])===z||this.destroyed)return;this.sent+=e.events.length;return}catch(l){if(this.destroyed)return;let u=s(l,"status");if(!(typeof u!="number"||u===429||u>=500)||t===_.length)break;c=_[t]}finally{o&&clearTimeout(o),this.controllers.delete(n)}c!==void 0&&await this.wait(c)}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 B(n.status)}wait(e){return new Promise(t=>{let n=()=>{clearTimeout(o),this.cancelWaits.delete(n),t()},o=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,10);for(;t.length>0;){let o=JSON.stringify({schemaVersion:1,events:t});if(L(o)<=24e3){navigator.sendBeacon(this.endpoint,new Blob([o],{type:"application/json"}))&&(this.queue.splice(0,t.length),this.sent+=t.length);return}t.pop()}}catch{}}},z=Symbol("destroyed"),T,S;function J(r){T||(T=ee()),T.clients.add(r)}function Z(r){let e=T;e&&(e.clients.delete(r),e.clients.size||(e.cleanup(),T=void 0))}function K(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??m(r),method:m(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 ee(){let r=new Set,e=window.fetch,t;typeof e=="function"&&(t=function(...d){if(!r.size)return Reflect.apply(e,this,d);let y=v(),f;try{f=K(d[0],d[1])}catch{f={url:"",method:"GET"}}let E;try{E=Reflect.apply(e,this,d)}catch(p){if(!A(p,f.signal))for(let w of r)w.reportNetwork(f.method,f.url,void 0,v()-y,p);throw p}return E.then(p=>{try{let w=p.status;for(let x of r)x.reportNetwork(f.method,f.url,w,v()-y)}catch{}return p},p=>{if(!A(p,f.signal))for(let w of r)w.reportNetwork(f.method,f.url,void 0,v()-y,p);throw p})},window.fetch=t);let n=typeof XMLHttpRequest>"u"?void 0:XMLHttpRequest.prototype,o=n?.open,i=n?.send,c=new WeakMap,l=new WeakMap,u,h;return n&&o&&i&&(u=(function(...d){let y=Reflect.apply(o,this,d);l.get(this)?.();try{c.set(this,{method:m(d[0]),url:m(d[1])})}catch{}return y}),h=function(...d){if(!r.size)return Reflect.apply(i,this,d);let y=c.get(this);if(!y)return Reflect.apply(i,this,d);let f=v(),E=!1,p=!1,w=!1,x=()=>{E=!0},C=()=>{p=!0},b=()=>{this.removeEventListener("abort",x),this.removeEventListener("error",C),this.removeEventListener("timeout",C),this.removeEventListener("loadend",U),l.get(this)===b&&l.delete(this)},U=()=>{if(w=!0,b(),!E)try{let g=this.status;if(g===0&&!p)return;for(let P of r)P.reportNetwork(y.method,y.url,g===0?void 0:g,v()-f)}catch{}};try{this.addEventListener("abort",x),this.addEventListener("error",C),this.addEventListener("timeout",C),this.addEventListener("loadend",U)}catch{return b(),Reflect.apply(i,this,d)}try{let g=Reflect.apply(i,this,d);return w||l.set(this,b),g}catch(g){throw b(),g}},n.open=u,n.send=h),{clients:r,cleanup(){t&&window.fetch===t&&(window.fetch=e),n&&u&&n.open===u&&(n.open=o),n&&h&&n.send===h&&(n.send=i)}}}function te(r){S||(S=re()),S.clients.add(r)}function ne(r){let e=S;e&&(e.clients.delete(r),e.clients.size||(e.cleanup(),S=void 0))}function re(){let r=new Set,e=console.error,t=function(...n){try{return Reflect.apply(e,this,n)}finally{for(let o of r)o.captureConsole(n)}};return console.error=t,{clients:r,cleanup(){console.error===t&&(console.error=e)}}}function oe(r){return new N(r)}
1
+ "use strict";var q=Object.defineProperty;var X=Object.getOwnPropertyDescriptor;var D=Object.getOwnPropertyNames;var F=Object.prototype.hasOwnProperty;var V=(r,e,t)=>e in r?q(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t;var W=(r,e)=>{for(var t in e)q(r,t,{get:e[t],enumerable:!0})},Y=(r,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of D(e))!F.call(r,o)&&o!==t&&q(r,o,{get:()=>e[o],enumerable:!(n=X(e,o))||n.enumerable});return r};var $=r=>Y(q({},"__esModule",{value:!0}),r);var a=(r,e,t)=>V(r,typeof e!="symbol"?e+"":e,t);var se={};W(se,{init:()=>ie});module.exports=$(se);var M=[250,500],Q=/(?:password|passwd|token|secret|authorization|cookie|session|api.?key|credential|bearer|private.?key)/i,I=new Set(["javascript","promise","react","console","http","network","manual"]),O=new Set(["browser","webview-ios","webview-android","unknown"]),G=0;function s(r,e){try{return r==null?void 0:Reflect.get(Object(r),e)}catch{return}}function y(r){try{return String(r)}catch{return"[unavailable]"}}function J(r,e){return y(r).slice(0,e)}function v(){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)}-${(++G).toString(36)}-${Math.random().toString(36).slice(2,10)}`}function A(r,e){try{if(e?.aborted)return!0}catch{}return s(r,"name")==="AbortError"||s(r,"code")===20}function B(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?y(r):y(e),...t==null?{}:{name:y(t)},...n==null?{}:{stack:y(n)}}}function L(r){return new TextEncoder().encode(r).length}function k(r,e,t,n){return typeof r=="number"&&Number.isFinite(r)?Math.min(t,Math.max(e,Math.floor(r))):n}var N=class extends Error{constructor(t){super(`Collector responded ${t}`);a(this,"status",t)}},R=class extends Error{},_=class extends Error{},U=class{constructor(e){a(this,"active");a(this,"endpoint");a(this,"options");a(this,"networkCaptureEnabled");a(this,"transportTimeoutMs");a(this,"startedAt",v());a(this,"viewId",z());a(this,"seenErrors",new WeakSet);a(this,"queue",[]);a(this,"maxQueueSize");a(this,"cancelWaits",new Set);a(this,"controllers",new Set);a(this,"destroySignal");a(this,"resolveDestroy");a(this,"interval");a(this,"flushing");a(this,"sequence",0);a(this,"inFlight",0);a(this,"sent",0);a(this,"dropped",0);a(this,"destroyed",!1);a(this,"onError",e=>{try{let t=s(e,"filename"),n=s(e,"lineno"),o=s(e,"colno"),i={};typeof t=="string"&&t.trim()&&(i.filename=this.cleanUrl(t)),typeof n=="number"&&Number.isFinite(n)&&n>0&&(i.lineno=n),typeof o=="number"&&Number.isFinite(o)&&o>0&&(i.colno=o),this.captureException(s(e,"error")??s(e,"message")??"Script error",{type:"javascript",...Object.keys(i).length?{context:i}:{}})}catch{this.dropped++}});a(this,"onRejection",e=>{this.captureException(e.reason,{type:"promise"})});a(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.maxQueueSize=k(e.maxQueueSize,1,100,50),this.transportTimeoutMs=k(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&&Z(this),e.captureConsole===!0&&ne(this),this.interval=setInterval(()=>{this.flush()},k(e.flushIntervalMs,10,6e4,1e4))}}captureException(e,t={}){if(!(!this.active||this.destroyed||A(e)))try{if(e!==null&&(typeof e=="object"||typeof e=="function")&&this.seenErrors.has(e))return;let n=B(e),o=I.has(t.type)?t.type:"manual",i=this.makeEvent(o,n.message,{name:n.name,stack:n.stack,componentStack:t.componentStack,context:t.context});this.enqueue(i)&&e!==null&&(typeof e=="object"||typeof e=="function")&&this.seenErrors.add(e)}catch(n){(n instanceof R||n instanceof _)&&this.dropped++}}reportNetwork(e,t,n,o,i){if(!(this.destroyed||!this.active||this.isCollectorUrl(t)||A(i)))try{if(n!==void 0&&!(this.options.shouldCaptureHttp?this.options.shouldCaptureHttp(n,t,e):n>=500))return;let c={method:J(e||"GET",16).toUpperCase(),url:t,status:n,durationMs:o},l=i===void 0?void 0:B(i),u=this.makeEvent(n===void 0?"network":"http",n===void 0?l?.message||"Network request failed":`HTTP ${n}`,{name:l?.name,network:c});this.enqueue(u)}catch{this.dropped++}}captureConsole(e){if(!(!this.active||this.destroyed))try{let t=e.map(y).join(" "),n;for(let o of e)try{if(o instanceof Error){n=B(o);break}}catch{}this.enqueue(this.makeEvent("console",t,{name:n?.name,stack:n?.stack}))}catch{this.dropped++}}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&&K(this),this.options.captureConsole===!0&&re(this)),this.dropped+=this.queue.length+this.inFlight,this.queue.length=0;for(let e of this.cancelWaits)e();for(let e of this.controllers)e.abort();this.resolveDestroy(P)}}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=y(e);if(this.options.sanitizeUrl){try{t=this.options.sanitizeUrl(t)}catch{throw new R("URL sanitizer failed")}if(typeof t!="string"||!t)throw new R("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 o=y(e);return n&&(o=o.replace(/https?:\/\/[^\s<>"'()[\]]+/gi,i=>this.cleanUrl(i)),o=o.replace(/(^|[\s"'(\[=])((?:\/(?!\/)|\.{1,2}\/)[^\s<>"'()[\]?#]*[?#][^\s<>"'()[\]]+|[a-z][\w.-]*(?:\/[^\s<>"'()[\]?#]*)?(?:\?[a-z0-9_.-]+=[^\s<>"'()[\]]+|#[^\s<>"'()[\]]+)|\?[a-z0-9_.-]+=[^\s<>"'()[\]]+)/gi,(i,c,l)=>{let u=/[.,;!]+$/.exec(l)?.[0]??"",h=l.slice(0,l.length-u.length),d=this.options.sanitizeUrl?this.cleanUrl(h):h.startsWith("?")?"[redacted query]":this.cleanText(h.split(/[?#]/,1)[0],1024,!1);return`${c}${d}${u}`})),o.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 o of n){if(Object.keys(t).length>=12)break;if(Q.test(o))continue;let i=s(e,o),c=this.cleanText(o,80);typeof i=="string"?t[c]=this.cleanText(i,500):(typeof i=="number"&&Number.isFinite(i)||typeof i=="boolean"||i===null)&&(t[c]=i)}return Object.keys(t).length?t: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:k(s(e,"durationMs"),0,36e5,0)}}makeEvent(e,t,n={}){let o=s(navigator,"userAgent"),i=this.cleanContext(n.context),c;try{c=this.options.getContext?.()}catch{throw new _("Context resolver failed")}let l=this.cleanContext(c),u=this.cleanContext(this.options.context),h=i;if(l||u){h={...i};for(let f of[l,u])if(f)for(let p of Object.keys(f)){if(Object.keys(h).length>=12)break;Object.prototype.hasOwnProperty.call(h,p)||(h[p]=f[p])}}let d=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.15",occurredAt:new Date().toISOString(),viewId:this.viewId,sequence:++this.sequence,elapsedMs:k(v()-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:O.has(this.options.runtime)?this.options.runtime:"browser",...typeof o=="string"?{browser:this.cleanText(o,300)}:{},...h?{context:h}:{},...d?{network:d}:{}}}sanitizeReplacement(e,t){let n=s(e,"type"),o=s(e,"runtime"),i=s(e,"name"),c=s(e,"stack"),l=s(e,"componentStack"),u=s(e,"browser"),h=this.cleanContext(s(e,"context")),d=this.cleanNetwork(s(e,"network"));return{...t,type:I.has(n)?n:t.type,message:this.cleanText(s(e,"message")??t.message,1024),...i===void 0?{name:t.name}:{name:this.cleanText(i,100)},...c===void 0?{stack:t.stack}:{stack:this.cleanText(c,4096)},...l===void 0?{componentStack:t.componentStack}:{componentStack:this.cleanText(l,2048)},page:this.cleanUrl(s(e,"page")??t.page),runtime:O.has(o)?o:t.runtime,...u===void 0?{browser:t.browser}:{browser:this.cleanText(u,300)},...h?{context:h}:{context:void 0},...d?{network:d}:{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},network:e.network&&{...e.network}},o=this.options.beforeSend(n);if(o===!1||o===null)return!1;t=this.sanitizeReplacement(o===void 0?n:o,e)}catch{return this.dropped++,!1}return L(JSON.stringify(t))>48e3?(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=20,t=48e3){let n=[],o=L('{"schemaVersion":1,"events":[]}');for(;this.queue.length&&n.length<e;){let i=this.queue[0],c=L(JSON.stringify(i))+(n.length?1:0);if(n.length&&o+c>t)break;if(!n.length&&o+c>t){this.queue.shift(),this.dropped++;continue}n.push(this.queue.shift()),o+=c}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<=M.length&&!this.destroyed;t++){let n=new AbortController;this.controllers.add(n);let o,i=new Promise((l,u)=>{o=setTimeout(()=>{n.abort(),u(new Error("Collector transport timed out"))},this.transportTimeoutMs)}),c;try{if(await Promise.race([this.send(e,n.signal),i,this.destroySignal])===P||this.destroyed)return;this.sent+=e.events.length;return}catch(l){if(this.destroyed)return;let u=s(l,"status");if(!(typeof u!="number"||u===429||u>=500)||t===M.length)break;c=M[t]}finally{o&&clearTimeout(o),this.controllers.delete(n)}c!==void 0&&await this.wait(c)}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 N(n.status)}wait(e){return new Promise(t=>{let n=()=>{clearTimeout(o),this.cancelWaits.delete(n),t()},o=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,10);for(;t.length>0;){let o=JSON.stringify({schemaVersion:1,events:t});if(L(o)<=24e3){navigator.sendBeacon(this.endpoint,new Blob([o],{type:"application/json"}))&&(this.queue.splice(0,t.length),this.sent+=t.length);return}t.pop()}}catch{}}},P=Symbol("destroyed"),T,S;function Z(r){T||(T=te()),T.clients.add(r)}function K(r){let e=T;e&&(e.clients.delete(r),e.clients.size||(e.cleanup(),T=void 0))}function ee(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??y(r),method:y(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 te(){let r=new Set,e=window.fetch,t;typeof e=="function"&&(t=function(...d){if(!r.size)return Reflect.apply(e,this,d);let f=v(),p;try{p=ee(d[0],d[1])}catch{p={url:"",method:"GET"}}let E;try{E=Reflect.apply(e,this,d)}catch(m){if(!A(m,p.signal))for(let w of r)w.reportNetwork(p.method,p.url,void 0,v()-f,m);throw m}return E.then(m=>{try{let w=m.status;for(let x of r)x.reportNetwork(p.method,p.url,w,v()-f)}catch{}return m},m=>{if(!A(m,p.signal))for(let w of r)w.reportNetwork(p.method,p.url,void 0,v()-f,m);throw m})},window.fetch=t);let n=typeof XMLHttpRequest>"u"?void 0:XMLHttpRequest.prototype,o=n?.open,i=n?.send,c=new WeakMap,l=new WeakMap,u,h;return n&&o&&i&&(u=(function(...d){let f=Reflect.apply(o,this,d);l.get(this)?.();try{c.set(this,{method:y(d[0]),url:y(d[1])})}catch{}return f}),h=function(...d){if(!r.size)return Reflect.apply(i,this,d);let f=c.get(this);if(!f)return Reflect.apply(i,this,d);let p=v(),E=!1,m=!1,w=!1,x=()=>{E=!0},C=()=>{m=!0},b=()=>{this.removeEventListener("abort",x),this.removeEventListener("error",C),this.removeEventListener("timeout",C),this.removeEventListener("loadend",j),l.get(this)===b&&l.delete(this)},j=()=>{if(w=!0,b(),!E)try{let g=this.status;if(g===0&&!m)return;for(let H of r)H.reportNetwork(f.method,f.url,g===0?void 0:g,v()-p)}catch{}};try{this.addEventListener("abort",x),this.addEventListener("error",C),this.addEventListener("timeout",C),this.addEventListener("loadend",j)}catch{return b(),Reflect.apply(i,this,d)}try{let g=Reflect.apply(i,this,d);return w||l.set(this,b),g}catch(g){throw b(),g}},n.open=u,n.send=h),{clients:r,cleanup(){t&&window.fetch===t&&(window.fetch=e),n&&u&&n.open===u&&(n.open=o),n&&h&&n.send===h&&(n.send=i)}}}function ne(r){S||(S=oe()),S.clients.add(r)}function re(r){let e=S;e&&(e.clients.delete(r),e.clients.size||(e.cleanup(),S=void 0))}function oe(){let r=new Set,e=console.error,t=function(...n){try{return Reflect.apply(e,this,n)}finally{for(let o of r)o.captureConsole(n)}};return console.error=t,{clients:r,cleanup(){console.error===t&&(console.error=e)}}}function ie(r){return new U(r)}
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/index.ts"],
4
- "sourcesContent": ["import type { ErrorEventRecord, EventBatch, EventType, Runtime } from '@ihyeon/browser-error-log-protocol';\n\nexport type { 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 endpoint?: string;\n transport?: (batch: EventBatch, context: TransportContext) => void | Promise<void>;\n runtime?: Runtime;\n enabled?: boolean;\n captureConsole?: 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\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 Client implements BrowserErrorLogClient {\n private readonly active: boolean;\n private readonly endpoint?: string;\n private readonly options: BrowserErrorLogOptions;\n private readonly networkCaptureEnabled: 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 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.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 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) 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 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 }\n this.dropped += this.queue.length + this.inFlight;\n this.queue.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 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 const defaults = this.cleanContext(this.options.context);\n let context = eventContext;\n if (defaults) {\n context = { ...eventContext };\n for (const key of Object.keys(defaults)) {\n if (Object.keys(context).length >= 12) break;\n if (!Object.prototype.hasOwnProperty.call(context, key)) context[key] = defaults[key];\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.14',\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 ...(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 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 ...(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 }, 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;\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): BrowserErrorLogClient {\n return new Client(options);\n}\n"],
5
- "mappings": "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",
6
- "names": ["index_exports", "__export", "init", "__toCommonJS", "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", "Client", "options", "event", "filename", "lineno", "colno", "context", "resolve", "addNetworkClient", "addConsoleClient", "extra", "fields", "type", "method", "url", "durationMs", "failure", "network", "values", "removeNetworkClient", "removeConsoleClient", "cancel", "controller", "DESTROYED", "request", "collector", "input", "replaceUrls", "match", "_match", "prefix", "punctuation", "core", "cleaned", "output", "keys", "safeKey", "rawStatus", "userAgent", "eventContext", "defaults", "candidate", "base", "runtime", "componentStack", "browser", "finalEvent", "copy", "result", "maxEvents", "maxBytes", "events", "bytes", "next", "size", "batch", "attempt", "timeoutHandle", "timeout", "_resolve", "reject", "retryDelay", "response", "milliseconds", "finish", "timer", "candidates", "body", "networkInstrumentation", "consoleInstrumentation", "client", "installNetwork", "instrumentation", "describeFetch", "init", "requestUrl", "initSignal", "clients", "originalFetch", "wrappedFetch", "args", "started", "promise", "prototype", "originalOpen", "originalSend", "metadata", "pending", "wrappedOpen", "wrappedSend", "details", "aborted", "failed", "completed", "onAbort", "onFailure", "cleanup", "onLoadEnd", "installConsole", "original", "wrapped"]
4
+ "sourcesContent": ["import type { ErrorEventRecord, EventBatch, EventType, Runtime } from '@ihyeon/browser-error-log-protocol';\n\nexport type { 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 /** 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\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 BrowserErrorLogClient {\n private readonly active: boolean;\n private readonly endpoint?: string;\n private readonly options: BrowserErrorLogOptions;\n private readonly networkCaptureEnabled: 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 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.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 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 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 }\n this.dropped += this.queue.length + this.inFlight;\n this.queue.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 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.15',\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 ...(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 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 ...(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 }, 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;\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): BrowserErrorLogClient {\n return new Client(options);\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["index_exports", "__export", "init", "__toCommonJS", "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", "extra", "fields", "type", "method", "url", "durationMs", "failure", "network", "values", "removeNetworkClient", "removeConsoleClient", "cancel", "controller", "DESTROYED", "request", "collector", "input", "replaceUrls", "match", "_match", "prefix", "punctuation", "core", "cleaned", "output", "keys", "safeKey", "rawStatus", "userAgent", "eventContext", "resolved", "dynamicContext", "defaults", "candidate", "base", "runtime", "componentStack", "browser", "finalEvent", "copy", "result", "maxEvents", "maxBytes", "events", "bytes", "next", "size", "batch", "attempt", "timeoutHandle", "timeout", "_resolve", "reject", "retryDelay", "response", "milliseconds", "finish", "timer", "candidates", "body", "networkInstrumentation", "consoleInstrumentation", "client", "installNetwork", "instrumentation", "describeFetch", "init", "requestUrl", "initSignal", "clients", "originalFetch", "wrappedFetch", "args", "started", "promise", "prototype", "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
@@ -14,6 +14,8 @@ export interface BrowserErrorLogOptions {
14
14
  release?: string;
15
15
  /** Scalar metadata added to every captured event; event context takes precedence. */
16
16
  context?: Record<string, unknown>;
17
+ /** Returns scalar metadata from current application state for each new event. */
18
+ getContext?: () => Record<string, unknown> | undefined;
17
19
  endpoint?: string;
18
20
  transport?: (batch: EventBatch, context: TransportContext) => void | Promise<void>;
19
21
  runtime?: Runtime;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../packages/browser/src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,oCAAoC,CAAC;AAE3G,YAAY,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAC;AAEvF,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,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,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;AAypBD,wBAAgB,IAAI,CAAC,OAAO,EAAE,sBAAsB,GAAG,qBAAqB,CAE3E"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../packages/browser/src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,oCAAoC,CAAC;AAE3G,YAAY,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAC;AAEvF,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,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;AAkqBD,wBAAgB,IAAI,CAAC,OAAO,EAAE,sBAAsB,GAAG,qBAAqB,CAE3E"}
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- var P=Object.defineProperty;var H=(r,e,t)=>e in r?P(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t;var a=(r,e,t)=>H(r,typeof e!="symbol"?e+"":e,t);var A=[250,500],X=/(?:password|passwd|token|secret|authorization|cookie|session|api.?key|credential|bearer|private.?key)/i,U=new Set(["javascript","promise","react","console","http","network","manual"]),j=new Set(["browser","webview-ios","webview-android","unknown"]),D=0;function s(r,e){try{return r==null?void 0:Reflect.get(Object(r),e)}catch{return}}function m(r){try{return String(r)}catch{return"[unavailable]"}}function F(r,e){return m(r).slice(0,e)}function v(){try{return performance.now()}catch{return Date.now()}}function I(){try{if(typeof crypto<"u"&&typeof crypto.randomUUID=="function")return crypto.randomUUID()}catch{}return`${Date.now().toString(36)}-${(++D).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 _(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?m(r):m(e),...t==null?{}:{name:m(t)},...n==null?{}:{stack:m(n)}}}function q(r){return new TextEncoder().encode(r).length}function k(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}`);a(this,"status",t)}},R=class extends Error{},B=class{constructor(e){a(this,"active");a(this,"endpoint");a(this,"options");a(this,"networkCaptureEnabled");a(this,"transportTimeoutMs");a(this,"startedAt",v());a(this,"viewId",I());a(this,"seenErrors",new WeakSet);a(this,"queue",[]);a(this,"maxQueueSize");a(this,"cancelWaits",new Set);a(this,"controllers",new Set);a(this,"destroySignal");a(this,"resolveDestroy");a(this,"interval");a(this,"flushing");a(this,"sequence",0);a(this,"inFlight",0);a(this,"sent",0);a(this,"dropped",0);a(this,"destroyed",!1);a(this,"onError",e=>{try{let t=s(e,"filename"),n=s(e,"lineno"),o=s(e,"colno"),i={};typeof t=="string"&&t.trim()&&(i.filename=this.cleanUrl(t)),typeof n=="number"&&Number.isFinite(n)&&n>0&&(i.lineno=n),typeof o=="number"&&Number.isFinite(o)&&o>0&&(i.colno=o),this.captureException(s(e,"error")??s(e,"message")??"Script error",{type:"javascript",...Object.keys(i).length?{context:i}:{}})}catch{this.dropped++}});a(this,"onRejection",e=>{this.captureException(e.reason,{type:"promise"})});a(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.maxQueueSize=k(e.maxQueueSize,1,100,50),this.transportTimeoutMs=k(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&&V(this),e.captureConsole===!0&&Q(this),this.interval=setInterval(()=>{this.flush()},k(e.flushIntervalMs,10,6e4,1e4))}}captureException(e,t={}){if(!(!this.active||this.destroyed||L(e)))try{if(e!==null&&(typeof e=="object"||typeof e=="function")&&this.seenErrors.has(e))return;let n=_(e),o=U.has(t.type)?t.type:"manual",i=this.makeEvent(o,n.message,{name:n.name,stack:n.stack,componentStack:t.componentStack,context:t.context});this.enqueue(i)&&e!==null&&(typeof e=="object"||typeof e=="function")&&this.seenErrors.add(e)}catch(n){n instanceof R&&this.dropped++}}reportNetwork(e,t,n,o,i){if(!(this.destroyed||!this.active||this.isCollectorUrl(t)||L(i)))try{if(n!==void 0&&!(this.options.shouldCaptureHttp?this.options.shouldCaptureHttp(n,t,e):n>=500))return;let c={method:F(e||"GET",16).toUpperCase(),url:t,status:n,durationMs:o},l=i===void 0?void 0:_(i),u=this.makeEvent(n===void 0?"network":"http",n===void 0?l?.message||"Network request failed":`HTTP ${n}`,{name:l?.name,network:c});this.enqueue(u)}catch{this.dropped++}}captureConsole(e){if(!(!this.active||this.destroyed))try{let t=e.map(m).join(" "),n;for(let o of e)try{if(o instanceof Error){n=_(o);break}}catch{}this.enqueue(this.makeEvent("console",t,{name:n?.name,stack:n?.stack}))}catch{this.dropped++}}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&&W(this),this.options.captureConsole===!0&&G(this)),this.dropped+=this.queue.length+this.inFlight,this.queue.length=0;for(let e of this.cancelWaits)e();for(let e of this.controllers)e.abort();this.resolveDestroy(O)}}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=m(e);if(this.options.sanitizeUrl){try{t=this.options.sanitizeUrl(t)}catch{throw new R("URL sanitizer failed")}if(typeof t!="string"||!t)throw new R("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 o=m(e);return n&&(o=o.replace(/https?:\/\/[^\s<>"'()[\]]+/gi,i=>this.cleanUrl(i)),o=o.replace(/(^|[\s"'(\[=])((?:\/(?!\/)|\.{1,2}\/)[^\s<>"'()[\]?#]*[?#][^\s<>"'()[\]]+|[a-z][\w.-]*(?:\/[^\s<>"'()[\]?#]*)?(?:\?[a-z0-9_.-]+=[^\s<>"'()[\]]+|#[^\s<>"'()[\]]+)|\?[a-z0-9_.-]+=[^\s<>"'()[\]]+)/gi,(i,c,l)=>{let u=/[.,;!]+$/.exec(l)?.[0]??"",h=l.slice(0,l.length-u.length),d=this.options.sanitizeUrl?this.cleanUrl(h):h.startsWith("?")?"[redacted query]":this.cleanText(h.split(/[?#]/,1)[0],1024,!1);return`${c}${d}${u}`})),o.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 o of n){if(Object.keys(t).length>=12)break;if(X.test(o))continue;let i=s(e,o),c=this.cleanText(o,80);typeof i=="string"?t[c]=this.cleanText(i,500):(typeof i=="number"&&Number.isFinite(i)||typeof i=="boolean"||i===null)&&(t[c]=i)}return Object.keys(t).length?t: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:k(s(e,"durationMs"),0,36e5,0)}}makeEvent(e,t,n={}){let o=s(navigator,"userAgent"),i=this.cleanContext(n.context),c=this.cleanContext(this.options.context),l=i;if(c){l={...i};for(let h of Object.keys(c)){if(Object.keys(l).length>=12)break;Object.prototype.hasOwnProperty.call(l,h)||(l[h]=c[h])}}let u=this.cleanNetwork(n.network);return{schemaVersion:1,eventId:I(),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.14",occurredAt:new Date().toISOString(),viewId:this.viewId,sequence:++this.sequence,elapsedMs:k(v()-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:j.has(this.options.runtime)?this.options.runtime:"browser",...typeof o=="string"?{browser:this.cleanText(o,300)}:{},...l?{context:l}:{},...u?{network:u}:{}}}sanitizeReplacement(e,t){let n=s(e,"type"),o=s(e,"runtime"),i=s(e,"name"),c=s(e,"stack"),l=s(e,"componentStack"),u=s(e,"browser"),h=this.cleanContext(s(e,"context")),d=this.cleanNetwork(s(e,"network"));return{...t,type:U.has(n)?n:t.type,message:this.cleanText(s(e,"message")??t.message,1024),...i===void 0?{name:t.name}:{name:this.cleanText(i,100)},...c===void 0?{stack:t.stack}:{stack:this.cleanText(c,4096)},...l===void 0?{componentStack:t.componentStack}:{componentStack:this.cleanText(l,2048)},page:this.cleanUrl(s(e,"page")??t.page),runtime:j.has(o)?o:t.runtime,...u===void 0?{browser:t.browser}:{browser:this.cleanText(u,300)},...h?{context:h}:{context:void 0},...d?{network:d}:{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},network:e.network&&{...e.network}},o=this.options.beforeSend(n);if(o===!1||o===null)return!1;t=this.sanitizeReplacement(o===void 0?n:o,e)}catch{return this.dropped++,!1}return q(JSON.stringify(t))>48e3?(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=20,t=48e3){let n=[],o=q('{"schemaVersion":1,"events":[]}');for(;this.queue.length&&n.length<e;){let i=this.queue[0],c=q(JSON.stringify(i))+(n.length?1:0);if(n.length&&o+c>t)break;if(!n.length&&o+c>t){this.queue.shift(),this.dropped++;continue}n.push(this.queue.shift()),o+=c}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<=A.length&&!this.destroyed;t++){let n=new AbortController;this.controllers.add(n);let o,i=new Promise((l,u)=>{o=setTimeout(()=>{n.abort(),u(new Error("Collector transport timed out"))},this.transportTimeoutMs)}),c;try{if(await Promise.race([this.send(e,n.signal),i,this.destroySignal])===O||this.destroyed)return;this.sent+=e.events.length;return}catch(l){if(this.destroyed)return;let u=s(l,"status");if(!(typeof u!="number"||u===429||u>=500)||t===A.length)break;c=A[t]}finally{o&&clearTimeout(o),this.controllers.delete(n)}c!==void 0&&await this.wait(c)}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(o),this.cancelWaits.delete(n),t()},o=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,10);for(;t.length>0;){let o=JSON.stringify({schemaVersion:1,events:t});if(q(o)<=24e3){navigator.sendBeacon(this.endpoint,new Blob([o],{type:"application/json"}))&&(this.queue.splice(0,t.length),this.sent+=t.length);return}t.pop()}}catch{}}},O=Symbol("destroyed"),T,S;function V(r){T||(T=$()),T.clients.add(r)}function W(r){let e=T;e&&(e.clients.delete(r),e.clients.size||(e.cleanup(),T=void 0))}function Y(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??m(r),method:m(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 $(){let r=new Set,e=window.fetch,t;typeof e=="function"&&(t=function(...d){if(!r.size)return Reflect.apply(e,this,d);let y=v(),f;try{f=Y(d[0],d[1])}catch{f={url:"",method:"GET"}}let E;try{E=Reflect.apply(e,this,d)}catch(p){if(!L(p,f.signal))for(let w of r)w.reportNetwork(f.method,f.url,void 0,v()-y,p);throw p}return E.then(p=>{try{let w=p.status;for(let x of r)x.reportNetwork(f.method,f.url,w,v()-y)}catch{}return p},p=>{if(!L(p,f.signal))for(let w of r)w.reportNetwork(f.method,f.url,void 0,v()-y,p);throw p})},window.fetch=t);let n=typeof XMLHttpRequest>"u"?void 0:XMLHttpRequest.prototype,o=n?.open,i=n?.send,c=new WeakMap,l=new WeakMap,u,h;return n&&o&&i&&(u=(function(...d){let y=Reflect.apply(o,this,d);l.get(this)?.();try{c.set(this,{method:m(d[0]),url:m(d[1])})}catch{}return y}),h=function(...d){if(!r.size)return Reflect.apply(i,this,d);let y=c.get(this);if(!y)return Reflect.apply(i,this,d);let f=v(),E=!1,p=!1,w=!1,x=()=>{E=!0},C=()=>{p=!0},b=()=>{this.removeEventListener("abort",x),this.removeEventListener("error",C),this.removeEventListener("timeout",C),this.removeEventListener("loadend",N),l.get(this)===b&&l.delete(this)},N=()=>{if(w=!0,b(),!E)try{let g=this.status;if(g===0&&!p)return;for(let z of r)z.reportNetwork(y.method,y.url,g===0?void 0:g,v()-f)}catch{}};try{this.addEventListener("abort",x),this.addEventListener("error",C),this.addEventListener("timeout",C),this.addEventListener("loadend",N)}catch{return b(),Reflect.apply(i,this,d)}try{let g=Reflect.apply(i,this,d);return w||l.set(this,b),g}catch(g){throw b(),g}},n.open=u,n.send=h),{clients:r,cleanup(){t&&window.fetch===t&&(window.fetch=e),n&&u&&n.open===u&&(n.open=o),n&&h&&n.send===h&&(n.send=i)}}}function Q(r){S||(S=J()),S.clients.add(r)}function G(r){let e=S;e&&(e.clients.delete(r),e.clients.size||(e.cleanup(),S=void 0))}function J(){let r=new Set,e=console.error,t=function(...n){try{return Reflect.apply(e,this,n)}finally{for(let o of r)o.captureConsole(n)}};return console.error=t,{clients:r,cleanup(){console.error===t&&(console.error=e)}}}function K(r){return new B(r)}export{K as init};
1
+ var H=Object.defineProperty;var X=(r,e,t)=>e in r?H(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t;var a=(r,e,t)=>X(r,typeof e!="symbol"?e+"":e,t);var _=[250,500],D=/(?:password|passwd|token|secret|authorization|cookie|session|api.?key|credential|bearer|private.?key)/i,j=new Set(["javascript","promise","react","console","http","network","manual"]),I=new Set(["browser","webview-ios","webview-android","unknown"]),F=0;function s(r,e){try{return r==null?void 0:Reflect.get(Object(r),e)}catch{return}}function y(r){try{return String(r)}catch{return"[unavailable]"}}function V(r,e){return y(r).slice(0,e)}function v(){try{return performance.now()}catch{return Date.now()}}function O(){try{if(typeof crypto<"u"&&typeof crypto.randomUUID=="function")return crypto.randomUUID()}catch{}return`${Date.now().toString(36)}-${(++F).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 M(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?y(r):y(e),...t==null?{}:{name:y(t)},...n==null?{}:{stack:y(n)}}}function q(r){return new TextEncoder().encode(r).length}function k(r,e,t,n){return typeof r=="number"&&Number.isFinite(r)?Math.min(t,Math.max(e,Math.floor(r))):n}var B=class extends Error{constructor(t){super(`Collector responded ${t}`);a(this,"status",t)}},R=class extends Error{},A=class extends Error{},N=class{constructor(e){a(this,"active");a(this,"endpoint");a(this,"options");a(this,"networkCaptureEnabled");a(this,"transportTimeoutMs");a(this,"startedAt",v());a(this,"viewId",O());a(this,"seenErrors",new WeakSet);a(this,"queue",[]);a(this,"maxQueueSize");a(this,"cancelWaits",new Set);a(this,"controllers",new Set);a(this,"destroySignal");a(this,"resolveDestroy");a(this,"interval");a(this,"flushing");a(this,"sequence",0);a(this,"inFlight",0);a(this,"sent",0);a(this,"dropped",0);a(this,"destroyed",!1);a(this,"onError",e=>{try{let t=s(e,"filename"),n=s(e,"lineno"),o=s(e,"colno"),i={};typeof t=="string"&&t.trim()&&(i.filename=this.cleanUrl(t)),typeof n=="number"&&Number.isFinite(n)&&n>0&&(i.lineno=n),typeof o=="number"&&Number.isFinite(o)&&o>0&&(i.colno=o),this.captureException(s(e,"error")??s(e,"message")??"Script error",{type:"javascript",...Object.keys(i).length?{context:i}:{}})}catch{this.dropped++}});a(this,"onRejection",e=>{this.captureException(e.reason,{type:"promise"})});a(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.maxQueueSize=k(e.maxQueueSize,1,100,50),this.transportTimeoutMs=k(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&&W(this),e.captureConsole===!0&&G(this),this.interval=setInterval(()=>{this.flush()},k(e.flushIntervalMs,10,6e4,1e4))}}captureException(e,t={}){if(!(!this.active||this.destroyed||L(e)))try{if(e!==null&&(typeof e=="object"||typeof e=="function")&&this.seenErrors.has(e))return;let n=M(e),o=j.has(t.type)?t.type:"manual",i=this.makeEvent(o,n.message,{name:n.name,stack:n.stack,componentStack:t.componentStack,context:t.context});this.enqueue(i)&&e!==null&&(typeof e=="object"||typeof e=="function")&&this.seenErrors.add(e)}catch(n){(n instanceof R||n instanceof A)&&this.dropped++}}reportNetwork(e,t,n,o,i){if(!(this.destroyed||!this.active||this.isCollectorUrl(t)||L(i)))try{if(n!==void 0&&!(this.options.shouldCaptureHttp?this.options.shouldCaptureHttp(n,t,e):n>=500))return;let c={method:V(e||"GET",16).toUpperCase(),url:t,status:n,durationMs:o},l=i===void 0?void 0:M(i),u=this.makeEvent(n===void 0?"network":"http",n===void 0?l?.message||"Network request failed":`HTTP ${n}`,{name:l?.name,network:c});this.enqueue(u)}catch{this.dropped++}}captureConsole(e){if(!(!this.active||this.destroyed))try{let t=e.map(y).join(" "),n;for(let o of e)try{if(o instanceof Error){n=M(o);break}}catch{}this.enqueue(this.makeEvent("console",t,{name:n?.name,stack:n?.stack}))}catch{this.dropped++}}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&&Y(this),this.options.captureConsole===!0&&J(this)),this.dropped+=this.queue.length+this.inFlight,this.queue.length=0;for(let e of this.cancelWaits)e();for(let e of this.controllers)e.abort();this.resolveDestroy(z)}}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=y(e);if(this.options.sanitizeUrl){try{t=this.options.sanitizeUrl(t)}catch{throw new R("URL sanitizer failed")}if(typeof t!="string"||!t)throw new R("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 o=y(e);return n&&(o=o.replace(/https?:\/\/[^\s<>"'()[\]]+/gi,i=>this.cleanUrl(i)),o=o.replace(/(^|[\s"'(\[=])((?:\/(?!\/)|\.{1,2}\/)[^\s<>"'()[\]?#]*[?#][^\s<>"'()[\]]+|[a-z][\w.-]*(?:\/[^\s<>"'()[\]?#]*)?(?:\?[a-z0-9_.-]+=[^\s<>"'()[\]]+|#[^\s<>"'()[\]]+)|\?[a-z0-9_.-]+=[^\s<>"'()[\]]+)/gi,(i,c,l)=>{let u=/[.,;!]+$/.exec(l)?.[0]??"",h=l.slice(0,l.length-u.length),d=this.options.sanitizeUrl?this.cleanUrl(h):h.startsWith("?")?"[redacted query]":this.cleanText(h.split(/[?#]/,1)[0],1024,!1);return`${c}${d}${u}`})),o.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 o of n){if(Object.keys(t).length>=12)break;if(D.test(o))continue;let i=s(e,o),c=this.cleanText(o,80);typeof i=="string"?t[c]=this.cleanText(i,500):(typeof i=="number"&&Number.isFinite(i)||typeof i=="boolean"||i===null)&&(t[c]=i)}return Object.keys(t).length?t: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:k(s(e,"durationMs"),0,36e5,0)}}makeEvent(e,t,n={}){let o=s(navigator,"userAgent"),i=this.cleanContext(n.context),c;try{c=this.options.getContext?.()}catch{throw new A("Context resolver failed")}let l=this.cleanContext(c),u=this.cleanContext(this.options.context),h=i;if(l||u){h={...i};for(let f of[l,u])if(f)for(let p of Object.keys(f)){if(Object.keys(h).length>=12)break;Object.prototype.hasOwnProperty.call(h,p)||(h[p]=f[p])}}let d=this.cleanNetwork(n.network);return{schemaVersion:1,eventId:O(),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.15",occurredAt:new Date().toISOString(),viewId:this.viewId,sequence:++this.sequence,elapsedMs:k(v()-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:I.has(this.options.runtime)?this.options.runtime:"browser",...typeof o=="string"?{browser:this.cleanText(o,300)}:{},...h?{context:h}:{},...d?{network:d}:{}}}sanitizeReplacement(e,t){let n=s(e,"type"),o=s(e,"runtime"),i=s(e,"name"),c=s(e,"stack"),l=s(e,"componentStack"),u=s(e,"browser"),h=this.cleanContext(s(e,"context")),d=this.cleanNetwork(s(e,"network"));return{...t,type:j.has(n)?n:t.type,message:this.cleanText(s(e,"message")??t.message,1024),...i===void 0?{name:t.name}:{name:this.cleanText(i,100)},...c===void 0?{stack:t.stack}:{stack:this.cleanText(c,4096)},...l===void 0?{componentStack:t.componentStack}:{componentStack:this.cleanText(l,2048)},page:this.cleanUrl(s(e,"page")??t.page),runtime:I.has(o)?o:t.runtime,...u===void 0?{browser:t.browser}:{browser:this.cleanText(u,300)},...h?{context:h}:{context:void 0},...d?{network:d}:{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},network:e.network&&{...e.network}},o=this.options.beforeSend(n);if(o===!1||o===null)return!1;t=this.sanitizeReplacement(o===void 0?n:o,e)}catch{return this.dropped++,!1}return q(JSON.stringify(t))>48e3?(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=20,t=48e3){let n=[],o=q('{"schemaVersion":1,"events":[]}');for(;this.queue.length&&n.length<e;){let i=this.queue[0],c=q(JSON.stringify(i))+(n.length?1:0);if(n.length&&o+c>t)break;if(!n.length&&o+c>t){this.queue.shift(),this.dropped++;continue}n.push(this.queue.shift()),o+=c}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<=_.length&&!this.destroyed;t++){let n=new AbortController;this.controllers.add(n);let o,i=new Promise((l,u)=>{o=setTimeout(()=>{n.abort(),u(new Error("Collector transport timed out"))},this.transportTimeoutMs)}),c;try{if(await Promise.race([this.send(e,n.signal),i,this.destroySignal])===z||this.destroyed)return;this.sent+=e.events.length;return}catch(l){if(this.destroyed)return;let u=s(l,"status");if(!(typeof u!="number"||u===429||u>=500)||t===_.length)break;c=_[t]}finally{o&&clearTimeout(o),this.controllers.delete(n)}c!==void 0&&await this.wait(c)}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 B(n.status)}wait(e){return new Promise(t=>{let n=()=>{clearTimeout(o),this.cancelWaits.delete(n),t()},o=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,10);for(;t.length>0;){let o=JSON.stringify({schemaVersion:1,events:t});if(q(o)<=24e3){navigator.sendBeacon(this.endpoint,new Blob([o],{type:"application/json"}))&&(this.queue.splice(0,t.length),this.sent+=t.length);return}t.pop()}}catch{}}},z=Symbol("destroyed"),T,S;function W(r){T||(T=Q()),T.clients.add(r)}function Y(r){let e=T;e&&(e.clients.delete(r),e.clients.size||(e.cleanup(),T=void 0))}function $(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??y(r),method:y(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 Q(){let r=new Set,e=window.fetch,t;typeof e=="function"&&(t=function(...d){if(!r.size)return Reflect.apply(e,this,d);let f=v(),p;try{p=$(d[0],d[1])}catch{p={url:"",method:"GET"}}let E;try{E=Reflect.apply(e,this,d)}catch(m){if(!L(m,p.signal))for(let w of r)w.reportNetwork(p.method,p.url,void 0,v()-f,m);throw m}return E.then(m=>{try{let w=m.status;for(let x of r)x.reportNetwork(p.method,p.url,w,v()-f)}catch{}return m},m=>{if(!L(m,p.signal))for(let w of r)w.reportNetwork(p.method,p.url,void 0,v()-f,m);throw m})},window.fetch=t);let n=typeof XMLHttpRequest>"u"?void 0:XMLHttpRequest.prototype,o=n?.open,i=n?.send,c=new WeakMap,l=new WeakMap,u,h;return n&&o&&i&&(u=(function(...d){let f=Reflect.apply(o,this,d);l.get(this)?.();try{c.set(this,{method:y(d[0]),url:y(d[1])})}catch{}return f}),h=function(...d){if(!r.size)return Reflect.apply(i,this,d);let f=c.get(this);if(!f)return Reflect.apply(i,this,d);let p=v(),E=!1,m=!1,w=!1,x=()=>{E=!0},C=()=>{m=!0},b=()=>{this.removeEventListener("abort",x),this.removeEventListener("error",C),this.removeEventListener("timeout",C),this.removeEventListener("loadend",U),l.get(this)===b&&l.delete(this)},U=()=>{if(w=!0,b(),!E)try{let g=this.status;if(g===0&&!m)return;for(let P of r)P.reportNetwork(f.method,f.url,g===0?void 0:g,v()-p)}catch{}};try{this.addEventListener("abort",x),this.addEventListener("error",C),this.addEventListener("timeout",C),this.addEventListener("loadend",U)}catch{return b(),Reflect.apply(i,this,d)}try{let g=Reflect.apply(i,this,d);return w||l.set(this,b),g}catch(g){throw b(),g}},n.open=u,n.send=h),{clients:r,cleanup(){t&&window.fetch===t&&(window.fetch=e),n&&u&&n.open===u&&(n.open=o),n&&h&&n.send===h&&(n.send=i)}}}function G(r){S||(S=Z()),S.clients.add(r)}function J(r){let e=S;e&&(e.clients.delete(r),e.clients.size||(e.cleanup(),S=void 0))}function Z(){let r=new Set,e=console.error,t=function(...n){try{return Reflect.apply(e,this,n)}finally{for(let o of r)o.captureConsole(n)}};return console.error=t,{clients:r,cleanup(){console.error===t&&(console.error=e)}}}function ee(r){return new N(r)}export{ee 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": ["../src/index.ts"],
4
- "sourcesContent": ["import type { ErrorEventRecord, EventBatch, EventType, Runtime } from '@ihyeon/browser-error-log-protocol';\n\nexport type { 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 endpoint?: string;\n transport?: (batch: EventBatch, context: TransportContext) => void | Promise<void>;\n runtime?: Runtime;\n enabled?: boolean;\n captureConsole?: 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\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 Client implements BrowserErrorLogClient {\n private readonly active: boolean;\n private readonly endpoint?: string;\n private readonly options: BrowserErrorLogOptions;\n private readonly networkCaptureEnabled: 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 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.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 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) 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 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 }\n this.dropped += this.queue.length + this.inFlight;\n this.queue.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 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 const defaults = this.cleanContext(this.options.context);\n let context = eventContext;\n if (defaults) {\n context = { ...eventContext };\n for (const key of Object.keys(defaults)) {\n if (Object.keys(context).length >= 12) break;\n if (!Object.prototype.hasOwnProperty.call(context, key)) context[key] = defaults[key];\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.14',\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 ...(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 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 ...(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 }, 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;\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): BrowserErrorLogClient {\n return new Client(options);\n}\n"],
5
- "mappings": "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",
6
- "names": ["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", "Client", "options", "event", "filename", "lineno", "colno", "context", "resolve", "addNetworkClient", "addConsoleClient", "extra", "fields", "type", "method", "url", "durationMs", "failure", "network", "values", "removeNetworkClient", "removeConsoleClient", "cancel", "controller", "DESTROYED", "request", "collector", "input", "replaceUrls", "match", "_match", "prefix", "punctuation", "core", "cleaned", "output", "keys", "safeKey", "rawStatus", "userAgent", "eventContext", "defaults", "candidate", "base", "runtime", "componentStack", "browser", "finalEvent", "copy", "result", "maxEvents", "maxBytes", "events", "bytes", "next", "size", "batch", "attempt", "timeoutHandle", "timeout", "_resolve", "reject", "retryDelay", "response", "milliseconds", "finish", "timer", "candidates", "body", "networkInstrumentation", "consoleInstrumentation", "client", "installNetwork", "instrumentation", "describeFetch", "init", "requestUrl", "initSignal", "clients", "originalFetch", "wrappedFetch", "args", "started", "promise", "prototype", "originalOpen", "originalSend", "metadata", "pending", "wrappedOpen", "wrappedSend", "details", "aborted", "failed", "completed", "onAbort", "onFailure", "cleanup", "onLoadEnd", "installConsole", "original", "wrapped"]
4
+ "sourcesContent": ["import type { ErrorEventRecord, EventBatch, EventType, Runtime } from '@ihyeon/browser-error-log-protocol';\n\nexport type { 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 /** 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\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 BrowserErrorLogClient {\n private readonly active: boolean;\n private readonly endpoint?: string;\n private readonly options: BrowserErrorLogOptions;\n private readonly networkCaptureEnabled: 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 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.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 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 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 }\n this.dropped += this.queue.length + this.inFlight;\n this.queue.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 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.15',\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 ...(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 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 ...(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 }, 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;\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): BrowserErrorLogClient {\n return new Client(options);\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["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", "extra", "fields", "type", "method", "url", "durationMs", "failure", "network", "values", "removeNetworkClient", "removeConsoleClient", "cancel", "controller", "DESTROYED", "request", "collector", "input", "replaceUrls", "match", "_match", "prefix", "punctuation", "core", "cleaned", "output", "keys", "safeKey", "rawStatus", "userAgent", "eventContext", "resolved", "dynamicContext", "defaults", "candidate", "base", "runtime", "componentStack", "browser", "finalEvent", "copy", "result", "maxEvents", "maxBytes", "events", "bytes", "next", "size", "batch", "attempt", "timeoutHandle", "timeout", "_resolve", "reject", "retryDelay", "response", "milliseconds", "finish", "timer", "candidates", "body", "networkInstrumentation", "consoleInstrumentation", "client", "installNetwork", "instrumentation", "describeFetch", "init", "requestUrl", "initSignal", "clients", "originalFetch", "wrappedFetch", "args", "started", "promise", "prototype", "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.14",
3
+ "version": "0.1.15",
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.14"
26
+ "@ihyeon/browser-error-log-protocol": "0.1.15"
27
27
  },
28
28
  "files": [
29
29
  "dist",