@allstak/react 0.3.4 → 0.3.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/build/{chunk-DURAJQ3M.mjs → chunk-FAPFDLXF.mjs} +5 -4
- package/dist/build/chunk-FAPFDLXF.mjs.map +1 -0
- package/dist/build/{chunk-3JRNQSVX.mjs → chunk-GQWTXGDD.mjs} +2 -2
- package/dist/build/next.js +4 -3
- package/dist/build/next.js.map +1 -1
- package/dist/build/next.mjs +2 -2
- package/dist/build/sourcemaps.js +4 -3
- package/dist/build/sourcemaps.js.map +1 -1
- package/dist/build/sourcemaps.mjs +1 -1
- package/dist/build/vite.js +4 -3
- package/dist/build/vite.js.map +1 -1
- package/dist/build/vite.mjs +1 -1
- package/dist/build/webpack.js +4 -3
- package/dist/build/webpack.js.map +1 -1
- package/dist/build/webpack.mjs +2 -2
- package/dist/index.d.mts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
- package/dist/build/chunk-DURAJQ3M.mjs.map +0 -1
- /package/dist/build/{chunk-3JRNQSVX.mjs.map → chunk-GQWTXGDD.mjs.map} +0 -0
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/transport.ts","../src/stack.ts","../src/auto-breadcrumbs.ts","../src/navigation.ts","../src/scope.ts","../src/tracing.ts","../src/replay.ts","../src/debug-id.ts","../src/http-requests.ts","../src/http-redact.ts","../src/http-instrumentation.ts","../src/web-vitals.ts","../src/client.ts","../src/provider.tsx"],"sourcesContent":["/**\n * @allstak/react — standalone React SDK.\n *\n * Self-contained: no @allstak/js or @allstak-io/* dependencies. Ships its own\n * AllStak client (init/capture/breadcrumbs/transport) plus React-specific\n * helpers (Provider, ErrorBoundary, useAllStak hook, withAllStakProfiler HOC).\n *\n * Recommended usage (one-liner):\n *\n * import { AllStakProvider } from '@allstak/react';\n *\n * export function App() {\n * return (\n * <AllStakProvider apiKey=\"ask_live_...\" environment=\"production\" debug>\n * <AppRoot />\n * </AllStakProvider>\n * );\n * }\n *\n * Advanced / manual usage:\n *\n * import { AllStak } from '@allstak/react';\n * AllStak.init({ apiKey, environment, release });\n * <AllStakErrorBoundary>...</AllStakErrorBoundary>\n * const { captureException } = useAllStak();\n */\n\nimport * as React from 'react';\nimport { AllStak } from './client';\n\n// ── Primary API: AllStakProvider (recommended) ──────────────────\nexport {\n AllStakProvider,\n useAllStak,\n __resetProviderInstanceForTest,\n} from './provider';\nexport type { AllStakProviderProps } from './provider';\n\n// ── Core client + manual setup ──────────────────────────────────\nexport { AllStak } from './client';\nexport type { AllStakConfig, Breadcrumb } from './client';\nexport { AllStakClient, INGEST_HOST, SDK_NAME, SDK_VERSION, Scope } from './client';\n\n// ── Navigation helpers ──────────────────────────────────────────\nexport { instrumentBrowserNavigation, instrumentReactRouter, instrumentNextRouter } from './navigation';\n\n// ── Auto-breadcrumb helpers ─────────────────────────────────────\nexport { instrumentFetch, instrumentConsole, __resetConsoleInstrumentationFlagForTest } from './auto-breadcrumbs';\nexport type { ConsoleCaptureOptions } from './auto-breadcrumbs';\n\n// ── Web Vitals ──────────────────────────────────────────────────\nexport { startWebVitals, __resetWebVitalsFlagForTest } from './web-vitals';\nexport type { WebVitalsHandle } from './web-vitals';\n\n// ── Replay surrogate ────────────────────────────────────────────\nexport { ReplayRecorder } from './replay';\nexport type { ReplayOptions } from './replay';\n\n// ── HTTP tracking ───────────────────────────────────────────────\nexport type { HttpTrackingOptions } from './http-redact';\nexport { HttpRequestModule } from './http-requests';\nexport type { HttpRequestEvent } from './http-requests';\n\n// ── ErrorBoundary (legacy standalone — provider's boundary is preferred) ──\n\nexport interface AllStakErrorBoundaryProps {\n children: React.ReactNode;\n fallback?:\n | React.ReactNode\n | ((props: { error: Error; reset: () => void }) => React.ReactNode);\n /** Extra tags attached only to errors captured by this boundary. */\n tags?: Record<string, string>;\n /** Called after the error has been captured. */\n onError?: (error: Error, info: React.ErrorInfo) => void;\n}\n\ninterface AllStakErrorBoundaryState {\n error: Error | null;\n}\n\nexport class AllStakErrorBoundary extends React.Component<\n AllStakErrorBoundaryProps,\n AllStakErrorBoundaryState\n> {\n state: AllStakErrorBoundaryState = { error: null };\n\n static getDerivedStateFromError(error: Error): AllStakErrorBoundaryState {\n return { error };\n }\n\n componentDidCatch(error: Error, info: React.ErrorInfo): void {\n try {\n AllStak.addBreadcrumb('ui', 'React error boundary caught error', 'error', {\n componentStack: info.componentStack ?? '',\n });\n const context: Record<string, unknown> = {\n componentStack: info.componentStack ?? '',\n source: 'react-error-boundary',\n };\n if (this.props.tags) {\n for (const [k, v] of Object.entries(this.props.tags)) {\n context[`tag.${k}`] = v;\n }\n }\n AllStak.captureException(error, context);\n } catch { /* never break the host app */ }\n try { this.props.onError?.(error, info); } catch { /* ignore */ }\n }\n\n private reset = () => this.setState({ error: null });\n\n render(): React.ReactNode {\n if (this.state.error) {\n const { fallback } = this.props;\n if (typeof fallback === 'function') {\n return fallback({ error: this.state.error, reset: this.reset });\n }\n if (fallback !== undefined) return fallback;\n return null;\n }\n return this.props.children;\n }\n}\n\n/**\n * HOC: drops a navigation breadcrumb when a component mounts. Useful\n * for marking screen boundaries without a router.\n */\nexport function withAllStakProfiler<P extends object>(\n Component: React.ComponentType<P>,\n name?: string,\n): React.FC<P> {\n const displayName =\n name ?? Component.displayName ?? Component.name ?? 'AnonymousComponent';\n const Wrapped: React.FC<P> = (props) => {\n React.useEffect(() => {\n AllStak.addBreadcrumb('navigation', `Mounted <${displayName}>`, 'info');\n }, []);\n return React.createElement(Component, props);\n };\n Wrapped.displayName = `withAllStakProfiler(${displayName})`;\n return Wrapped;\n}\n","/**\n * Fail-open HTTP transport for browser/React. Telemetry sends are best-effort:\n * they use a short timeout, never reject into the host app, and fall into a\n * bounded in-memory ring buffer with circuit-breaker backoff when AllStak is\n * unavailable.\n *\n * No window, no AbortController fallback shims — RN exposes both natively.\n */\n\nconst REQUEST_TIMEOUT = 2000;\nconst MAX_BUFFER = 100;\nconst FAILURE_THRESHOLD = 3;\nconst BACKOFF_BASE_MS = 500;\nconst BACKOFF_MAX_MS = 30_000;\n\ninterface Pending {\n path: string;\n payload: unknown;\n}\n\nexport class HttpTransport {\n private buffer: Pending[] = [];\n private flushing = false;\n private consecutiveFailures = 0;\n private circuitOpenUntil = 0;\n\n constructor(\n private baseUrl: string,\n private apiKey: string,\n ) {}\n\n send(path: string, payload: unknown): Promise<void> {\n this.enqueueOrDispatch({ path, payload });\n return Promise.resolve();\n }\n\n private enqueueOrDispatch(item: Pending): void {\n if (Date.now() < this.circuitOpenUntil) {\n this.push(item);\n return;\n }\n void this.dispatch(item).catch(() => undefined);\n }\n\n private async dispatch(item: Pending): Promise<void> {\n try {\n await this.doFetch(item.path, item.payload);\n this.consecutiveFailures = 0;\n this.circuitOpenUntil = 0;\n this.scheduleFlush();\n } catch (err) {\n this.recordFailure(err);\n this.push(item);\n }\n }\n\n private async doFetch(path: string, payload: unknown): Promise<void> {\n const url = `${this.baseUrl}${path}`;\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), REQUEST_TIMEOUT);\n try {\n const res = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-AllStak-Key': this.apiKey,\n },\n body: JSON.stringify(payload),\n signal: controller.signal,\n });\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n private push(item: Pending): void {\n if (this.buffer.length >= MAX_BUFFER) this.buffer.shift();\n this.buffer.push(item);\n }\n\n private scheduleFlush(): void {\n if (this.flushing || this.buffer.length === 0) return;\n const delay = Math.max(0, this.circuitOpenUntil - Date.now());\n const timer = setTimeout(() => {\n void this.flushBuffer().catch(() => undefined);\n }, delay);\n if (typeof timer === 'object' && typeof timer.unref === 'function') timer.unref();\n }\n\n private async flushBuffer(): Promise<void> {\n if (this.flushing || this.buffer.length === 0) return;\n this.flushing = true;\n try {\n const items = this.buffer.splice(0, this.buffer.length);\n for (const item of items) {\n if (Date.now() < this.circuitOpenUntil) {\n this.push(item);\n continue;\n }\n try {\n await this.doFetch(item.path, item.payload);\n this.consecutiveFailures = 0;\n this.circuitOpenUntil = 0;\n } catch (err) {\n this.recordFailure(err);\n this.push(item);\n }\n }\n } finally {\n this.flushing = false;\n if (this.buffer.length > 0) this.scheduleFlush();\n }\n }\n\n private recordFailure(error: unknown): void {\n this.consecutiveFailures++;\n if (this.consecutiveFailures < FAILURE_THRESHOLD) return;\n const retryAfterMs = retryAfterFromError(error);\n const backoff = retryAfterMs ?? jitteredBackoff(this.consecutiveFailures);\n this.circuitOpenUntil = Date.now() + backoff;\n }\n\n getBufferSize(): number {\n return this.buffer.length;\n }\n\n /**\n * Wait for the in-flight retry-buffer to drain. Resolves `true` if the\n * buffer empties within `timeoutMs` (default 2000ms), `false` otherwise.\n * Useful at process exit / before navigation away.\n */\n async flush(timeoutMs = 2000): Promise<boolean> {\n const deadline = Date.now() + timeoutMs;\n await this.flushBuffer();\n while (this.buffer.length > 0 || this.flushing) {\n if (Date.now() >= deadline) return false;\n await new Promise((r) => setTimeout(r, 25));\n await this.flushBuffer();\n }\n return true;\n }\n}\n\nfunction jitteredBackoff(failures: number): number {\n const exp = Math.min(BACKOFF_MAX_MS, BACKOFF_BASE_MS * 2 ** Math.min(8, failures - FAILURE_THRESHOLD));\n return Math.floor(exp / 2 + Math.random() * (exp / 2));\n}\n\nfunction retryAfterFromError(error: unknown): number | null {\n const message = error instanceof Error ? error.message : '';\n return /HTTP\\s+(429|503)/.test(message) ? BACKOFF_MAX_MS : null;\n}\n","/**\n * Engine-agnostic Error.stack parser. Handles V8 / Hermes (\"at fn (file:l:c)\")\n * and Gecko / JSC (\"fn@file:l:c\"). Output mirrors the backend\n * ErrorIngestRequest.Frame shape so the dashboard can render frames directly.\n */\n\nexport interface StackFrame {\n filename?: string;\n absPath?: string;\n function?: string;\n lineno?: number;\n colno?: number;\n inApp?: boolean;\n platform?: string;\n}\n\nconst V8_FRAME_RE = /^\\s*at\\s+(?:(.+?)\\s+\\()?((?:.+?):(\\d+):(\\d+))\\)?\\s*$/;\nconst GECKO_FRAME_RE = /^\\s*(?:(.*?)@)?(.+?):(\\d+):(\\d+)\\s*$/;\nconst NODE_INTERNAL_RE = /^(node:|internal\\/|node_modules\\/)/;\n\nexport function parseStack(stack: string | undefined | null): StackFrame[] {\n if (!stack || typeof stack !== 'string') return [];\n const frames: StackFrame[] = [];\n\n for (const raw of stack.split('\\n')) {\n const line = raw.trim();\n if (!line) continue;\n\n let m = V8_FRAME_RE.exec(line);\n if (m) {\n const filename = stripQueryHash(m[2].replace(/:\\d+:\\d+$/, ''));\n frames.push({\n filename,\n absPath: filename,\n function: m[1] ? m[1].trim() : undefined,\n lineno: parseInt(m[3], 10),\n colno: parseInt(m[4], 10),\n inApp: isInApp(filename),\n });\n continue;\n }\n\n m = GECKO_FRAME_RE.exec(line);\n if (m && m[2]) {\n const filename = stripQueryHash(m[2]);\n frames.push({\n filename,\n absPath: filename,\n function: m[1] ? m[1].trim() : undefined,\n lineno: parseInt(m[3], 10),\n colno: parseInt(m[4], 10),\n inApp: isInApp(filename),\n });\n }\n }\n\n return frames;\n}\n\nfunction stripQueryHash(url: string): string {\n const q = url.indexOf('?');\n const h = url.indexOf('#');\n let cut = url.length;\n if (q >= 0) cut = Math.min(cut, q);\n if (h >= 0) cut = Math.min(cut, h);\n return url.slice(0, cut);\n}\n\nfunction isInApp(filename: string | undefined): boolean {\n if (!filename) return true;\n if (NODE_INTERNAL_RE.test(filename)) return false;\n if (filename.includes('/node_modules/')) return false;\n return true;\n}\n","/**\n * Idempotent instrumentation of `globalThis.fetch` and `console.warn/error`\n * to feed breadcrumbs into the AllStak client. Safe to call once at init.\n *\n * - `instrumentFetch`: wraps fetch and records a breadcrumb per request\n * (success and failure). Skips requests targeting the SDK's own ingest\n * host so the wrap never recurses. Preserves the original return type\n * and rethrows fetch errors after the breadcrumb is recorded.\n * - `instrumentConsole`: wraps `console.warn` and `console.error` to\n * record `log`-type breadcrumbs at the corresponding level.\n *\n * Both patches use a flag on the wrapper function so a second call is a\n * no-op — important because hot-module-reload in dev would otherwise\n * stack patches and double-fire breadcrumbs.\n */\n\ntype AddBreadcrumbFn = (\n type: string,\n msg: string,\n level?: string,\n data?: Record<string, unknown>,\n) => void;\n\nconst FETCH_FLAG = '__allstak_fetch_patched__';\nconst CONSOLE_FLAG = '__allstak_console_patched__';\n\nexport function instrumentFetch(\n addBreadcrumb: AddBreadcrumbFn,\n ownBaseUrl?: string,\n): void {\n const g: any = globalThis as any;\n if (typeof g.fetch !== 'function') return;\n if (g.fetch[FETCH_FLAG]) return;\n\n const originalFetch = g.fetch;\n\n const wrapped = async function (this: any, input: any, init?: any) {\n const method = (init?.method || (input && typeof input === 'object' && input.method) || 'GET').toUpperCase();\n let url: string;\n if (typeof input === 'string') url = input;\n else if (input && typeof input.href === 'string') url = input.href;\n else if (input && typeof input.url === 'string') url = input.url;\n else url = String(input);\n\n // Strip query string from the breadcrumb to avoid leaking secrets.\n const safePath = url.split('?')[0];\n const isOwnIngest = !!(ownBaseUrl && url.startsWith(ownBaseUrl));\n\n const start = Date.now();\n try {\n const response = await originalFetch.call(this, input, init);\n const durationMs = Date.now() - start;\n if (!isOwnIngest) {\n addBreadcrumb(\n 'http',\n `${method} ${safePath} -> ${response.status}`,\n response.status >= 400 ? 'error' : 'info',\n { method, url: safePath, statusCode: response.status, durationMs },\n );\n }\n return response;\n } catch (err) {\n const durationMs = Date.now() - start;\n if (!isOwnIngest) {\n addBreadcrumb('http', `${method} ${safePath} -> failed`, 'error', {\n method, url: safePath, error: String(err), durationMs,\n });\n }\n throw err;\n }\n };\n (wrapped as any)[FETCH_FLAG] = true;\n g.fetch = wrapped;\n}\n\n/**\n * Per-console-method capture flags. Defaults: warn + error captured,\n * log + info NOT captured (typical React apps emit thousands of debug\n * lines per session — flooding the dashboard with them creates pure\n * noise, so they're opt-in).\n *\n * <AllStakProvider captureConsole={{ log: true, info: true }} />\n */\nexport interface ConsoleCaptureOptions {\n log?: boolean;\n info?: boolean;\n warn?: boolean;\n error?: boolean;\n}\n\nconst CONSOLE_DEFAULTS: Required<ConsoleCaptureOptions> = {\n log: false,\n info: false,\n warn: true,\n error: true,\n};\n\nconst CONSOLE_METHOD_TO_LEVEL: Record<keyof ConsoleCaptureOptions, string> = {\n log: 'info',\n info: 'info',\n warn: 'warn',\n error: 'error',\n};\n\n/** Max bytes per stringified arg. Anything longer is suffixed with `…[truncated]`. */\nconst MAX_ARG_BYTES = 5000;\n\nexport function instrumentConsole(\n addBreadcrumb: AddBreadcrumbFn,\n options: ConsoleCaptureOptions = {},\n): void {\n if (typeof console === 'undefined') return;\n if ((console as any)[CONSOLE_FLAG]) return;\n\n const opts: Required<ConsoleCaptureOptions> = {\n log: options.log ?? CONSOLE_DEFAULTS.log,\n info: options.info ?? CONSOLE_DEFAULTS.info,\n warn: options.warn ?? CONSOLE_DEFAULTS.warn,\n error: options.error ?? CONSOLE_DEFAULTS.error,\n };\n\n const wrap = (method: keyof ConsoleCaptureOptions): void => {\n const orig = (console as any)[method];\n if (typeof orig !== 'function') return;\n const level = CONSOLE_METHOD_TO_LEVEL[method];\n (console as any)[method] = function (...args: unknown[]) {\n if (opts[method]) {\n try {\n const serialized = args.map(safeStringifyArg);\n const message = truncate(serialized.join(' '));\n addBreadcrumb('log', message, level, {\n category: 'console',\n method,\n args: serialized,\n });\n } catch { /* never break host */ }\n }\n return orig.apply(console, args);\n };\n };\n\n if (opts.log) wrap('log');\n if (opts.info) wrap('info');\n if (opts.warn) wrap('warn');\n if (opts.error) wrap('error');\n\n (console as any)[CONSOLE_FLAG] = true;\n}\n\n/** @internal — for tests. Resets the wrap-once flag. */\nexport function __resetConsoleInstrumentationFlagForTest(): void {\n if (typeof console !== 'undefined') {\n delete (console as any)[CONSOLE_FLAG];\n }\n}\n\n/**\n * Safely stringify a single console arg. Handles primitives, Errors,\n * arrays, plain objects, and circular references. Falls back to\n * Object.prototype.toString.call(v) on any failure.\n */\nfunction safeStringifyArg(v: unknown): string {\n if (v === null || v === undefined) return String(v);\n if (typeof v === 'string') return v;\n if (typeof v === 'number' || typeof v === 'boolean' || typeof v === 'bigint') return String(v);\n if (typeof v === 'symbol') return v.toString();\n if (typeof v === 'function') return `[Function${v.name ? ` ${v.name}` : ''}]`;\n if (v instanceof Error) {\n return `${v.name || 'Error'}: ${v.message}${v.stack ? `\\n${v.stack}` : ''}`;\n }\n if (typeof v === 'object') {\n try {\n const seen = new WeakSet<object>();\n const out = JSON.stringify(v, (_key, val) => {\n if (typeof val === 'object' && val !== null) {\n if (seen.has(val as object)) return '[Circular]';\n seen.add(val as object);\n }\n if (typeof val === 'bigint') return val.toString();\n if (typeof val === 'function') return `[Function${val.name ? ` ${val.name}` : ''}]`;\n if (typeof val === 'symbol') return val.toString();\n return val;\n });\n return out ?? Object.prototype.toString.call(v);\n } catch {\n return Object.prototype.toString.call(v);\n }\n }\n return String(v);\n}\n\nfunction truncate(s: string): string {\n if (s.length <= MAX_ARG_BYTES) return s;\n return s.slice(0, MAX_ARG_BYTES) + '…[truncated]';\n}\n\n","/**\n * Browser navigation breadcrumbs — minimal fallback that doesn't depend on\n * any specific router library. Wraps `history.pushState`/`replaceState` and\n * listens to `popstate` so SPA navigation transitions appear in the\n * breadcrumb feed regardless of which router (React Router, Next, Remix,\n * none) the app uses.\n *\n * Idempotent — calling twice is safe (the wrappers tag themselves).\n *\n * For framework-specific instrumentation (React Router's `useNavigate`,\n * Next's `router.events`), bind manually with `AllStak.addBreadcrumb`.\n */\n\ntype AddBreadcrumbFn = (\n type: string,\n msg: string,\n level?: string,\n data?: Record<string, unknown>,\n) => void;\n\nconst FLAG = '__allstak_history_patched__';\n\nexport function instrumentBrowserNavigation(addBreadcrumb: AddBreadcrumbFn): void {\n if (typeof window === 'undefined' || typeof history === 'undefined') return;\n if ((history as any)[FLAG]) return;\n\n const emit = (from: string, to: string) => {\n if (from === to) return;\n try { addBreadcrumb('navigation', `${from} -> ${to}`, 'info', { from, to }); }\n catch { /* never break host */ }\n };\n\n const origPush = history.pushState.bind(history);\n const origReplace = history.replaceState.bind(history);\n\n history.pushState = function (state: any, unused: string, url?: string | URL | null) {\n const from = location.pathname + location.search;\n const ret = origPush(state, unused, url ?? null);\n emit(from, location.pathname + location.search);\n return ret;\n };\n history.replaceState = function (state: any, unused: string, url?: string | URL | null) {\n const from = location.pathname + location.search;\n const ret = origReplace(state, unused, url ?? null);\n emit(from, location.pathname + location.search);\n return ret;\n };\n\n let last = location.pathname + location.search;\n window.addEventListener('popstate', () => {\n const next = location.pathname + location.search;\n emit(last, next);\n last = next;\n });\n\n (history as any)[FLAG] = true;\n}\n\n/**\n * React Router v6+ helper. Pass a `Location` object whenever the app's\n * top-level `useLocation()` value changes — usually inside a small effect\n * in the route layout. No hard dependency on `react-router-dom`.\n *\n * import { useLocation } from 'react-router-dom';\n * import { instrumentReactRouter } from '@allstak/react';\n * useEffect(() => instrumentReactRouter(useLocation()), [useLocation()]);\n *\n * Each call records a `navigation` breadcrumb if the path differs from\n * the last one we saw. Idempotent on the same path.\n */\nlet lastReactRouterPath: string | undefined;\nexport function instrumentReactRouter(\n location: { pathname: string; search?: string },\n addBreadcrumb: AddBreadcrumbFn = (...args) => __defaultBreadcrumb(...args),\n): void {\n const next = `${location.pathname}${location.search ?? ''}`;\n if (next === lastReactRouterPath) return;\n const from = lastReactRouterPath ?? '<initial>';\n lastReactRouterPath = next;\n try { addBreadcrumb('navigation', `${from} -> ${next}`, 'info', { router: 'react-router', from, to: next }); }\n catch { /* ignore */ }\n}\n\n/**\n * Next.js (Pages router) helper. Hook into `router.events.on('routeChangeComplete', ...)`\n * inside `_app.tsx` and call this with the new URL. No hard dependency on `next`.\n *\n * import Router from 'next/router';\n * import { instrumentNextRouter } from '@allstak/react';\n * Router.events.on('routeChangeComplete', (url) => instrumentNextRouter(url));\n *\n * For the Next.js App Router, instead use `usePathname()` + `useSearchParams()`\n * and call `instrumentReactRouter({ pathname, search })`.\n */\nlet lastNextPath: string | undefined;\nexport function instrumentNextRouter(\n url: string,\n addBreadcrumb: AddBreadcrumbFn = (...args) => __defaultBreadcrumb(...args),\n): void {\n if (url === lastNextPath) return;\n const from = lastNextPath ?? '<initial>';\n lastNextPath = url;\n try { addBreadcrumb('navigation', `${from} -> ${url}`, 'info', { router: 'next', from, to: url }); }\n catch { /* ignore */ }\n}\n\n// Default forwarder — set by the client at init so callers can pass `addBreadcrumb`\n// implicitly. Avoids a circular import on `./client`.\nlet __defaultBreadcrumb: AddBreadcrumbFn = () => {};\nexport function __setDefaultBreadcrumbForwarder(fn: AddBreadcrumbFn): void {\n __defaultBreadcrumb = fn;\n}\n","/**\n * Per-call scoped context isolation.\n *\n * A `Scope` carries the same shape as the top-level config (user, tags,\n * extras, contexts, fingerprint, level) but only applies inside the\n * `withScope` callback that owns it. The client merges the active scope\n * stack on top of the base config when building each event payload, so:\n *\n * - context set inside `withScope` does NOT leak out\n * - nested scopes layer additively (later wins on key conflicts)\n * - throwing or async work in the callback still pops the scope\n *\n * Use this on the server (SSR / RSC / API route handlers) to attach\n * per-request user/tags without leaking that data into another request\n * being processed concurrently.\n */\n\nexport type Severity = 'fatal' | 'error' | 'warning' | 'info' | 'debug';\n\nexport class Scope {\n user?: { id?: string; email?: string };\n tags: Record<string, string> = {};\n extras: Record<string, unknown> = {};\n contexts: Record<string, Record<string, unknown>> = {};\n fingerprint?: string[];\n level?: Severity;\n\n setUser(user: { id?: string; email?: string }): this { this.user = user; return this; }\n setTag(key: string, value: string): this { this.tags[key] = value; return this; }\n setTags(tags: Record<string, string>): this { Object.assign(this.tags, tags); return this; }\n setExtra(key: string, value: unknown): this { this.extras[key] = value; return this; }\n setExtras(extras: Record<string, unknown>): this { Object.assign(this.extras, extras); return this; }\n setContext(name: string, ctx: Record<string, unknown> | null): this {\n if (ctx === null) delete this.contexts[name]; else this.contexts[name] = ctx;\n return this;\n }\n setLevel(level: Severity): this { this.level = level; return this; }\n setFingerprint(fingerprint: string[] | null): this {\n this.fingerprint = fingerprint && fingerprint.length > 0 ? fingerprint : undefined;\n return this;\n }\n clear(): this {\n this.user = undefined;\n this.tags = {};\n this.extras = {};\n this.contexts = {};\n this.fingerprint = undefined;\n this.level = undefined;\n return this;\n }\n}\n\n/**\n * Merge a base config with the active scope stack. Later scopes overwrite\n * earlier ones on key conflicts; tag/extra/context dictionaries are merged\n * key-by-key. Returns a NEW object — does not mutate inputs.\n */\nexport function mergeScopes<T extends {\n user?: { id?: string; email?: string };\n tags?: Record<string, string>;\n extras?: Record<string, unknown>;\n contexts?: Record<string, Record<string, unknown>>;\n fingerprint?: string[];\n level?: Severity;\n}>(base: T, stack: Scope[]): T {\n const out: T = { ...base };\n out.tags = { ...(base.tags ?? {}) };\n out.extras = { ...(base.extras ?? {}) };\n out.contexts = { ...(base.contexts ?? {}) };\n for (const scope of stack) {\n if (scope.user) out.user = scope.user;\n Object.assign(out.tags, scope.tags);\n Object.assign(out.extras, scope.extras);\n Object.assign(out.contexts, scope.contexts);\n if (scope.fingerprint) out.fingerprint = scope.fingerprint;\n if (scope.level) out.level = scope.level;\n }\n return out;\n}\n","/**\n * Lightweight distributed tracing primitives.\n *\n * A `Span` represents a unit of work — `startSpan('http.client', { description: 'GET /api/users' })`\n * returns a Span; call `span.finish()` when the work completes. Spans\n * batch into the transport's `/ingest/v1/spans` channel and ship every 5s\n * (or when 20 spans accumulate).\n *\n * Trace propagation: each span carries a `traceId` (UUID, generated lazily\n * on first call to `getTraceId()`) and a `spanId`. Nested calls to\n * `startSpan()` automatically inherit the active span as their parent.\n *\n * Sampling: `tracesSampleRate` (config) gates whether `startSpan` actually\n * records anything — drops when `Math.random() >= rate`. The returned\n * Span is a no-op shim in that case so call sites don't need to null-check.\n */\n\nimport type { HttpTransport } from './transport';\n\nconst SPAN_INGEST_PATH = '/ingest/v1/spans';\nconst FLUSH_INTERVAL_MS = 5_000;\nconst BATCH_SIZE_THRESHOLD = 20;\n\nexport interface SpanData {\n traceId: string;\n spanId: string;\n parentSpanId: string;\n operation: string;\n description: string;\n status: 'ok' | 'error' | 'timeout';\n durationMs: number;\n startTimeMillis: number;\n endTimeMillis: number;\n service: string;\n environment: string;\n tags: Record<string, string>;\n data: string;\n}\n\nfunction id(): string {\n // Same v4 shape used elsewhere in the SDK — RN doesn't ship\n // crypto.randomUUID reliably across versions.\n const hex = (n: number) => Math.floor(Math.random() * n).toString(16).padStart(1, '0');\n const seg = (len: number) => Array.from({ length: len }, () => hex(16)).join('');\n return `${seg(8)}-${seg(4)}-4${seg(3)}-${(8 + Math.floor(Math.random() * 4)).toString(16)}${seg(3)}-${seg(12)}`;\n}\n\nexport class Span {\n private _finished = false;\n private _startTimeMillis: number;\n private _data = '';\n\n constructor(\n private _traceId: string,\n private _spanId: string,\n private _parentSpanId: string,\n private _operation: string,\n private _description: string,\n private _service: string,\n private _environment: string,\n private _tags: Record<string, string>,\n private _onFinish: (data: SpanData) => void,\n ) {\n this._startTimeMillis = Date.now();\n }\n\n setTag(key: string, value: string): this { this._tags[key] = value; return this; }\n setData(data: string): this { this._data = data; return this; }\n setDescription(description: string): this { this._description = description; return this; }\n\n finish(status: 'ok' | 'error' | 'timeout' = 'ok'): void {\n if (this._finished) return;\n this._finished = true;\n const endTimeMillis = Date.now();\n this._onFinish({\n traceId: this._traceId,\n spanId: this._spanId,\n parentSpanId: this._parentSpanId,\n operation: this._operation,\n description: this._description,\n status,\n durationMs: endTimeMillis - this._startTimeMillis,\n startTimeMillis: this._startTimeMillis,\n endTimeMillis,\n service: this._service,\n environment: this._environment,\n tags: this._tags,\n data: this._data,\n });\n }\n\n get traceId(): string { return this._traceId; }\n get spanId(): string { return this._spanId; }\n get isFinished(): boolean { return this._finished; }\n}\n\n/** A no-op span returned when `tracesSampleRate` drops the trace. */\nclass NoopSpan extends Span {\n constructor(traceId: string, spanId: string) {\n super(traceId, spanId, '', '', '', '', '', {}, () => {});\n }\n finish(): void { /* never enqueues anything */ }\n}\n\ninterface TracingOptions {\n service: string;\n environment: string;\n /** 0..1 — probability to record a span. Default 1. */\n tracesSampleRate?: number;\n}\n\nexport class TracingModule {\n private spans: SpanData[] = [];\n private flushTimer: ReturnType<typeof setInterval> | null = null;\n private currentTraceId: string | null = null;\n private spanStack: Span[] = [];\n private destroyed = false;\n\n constructor(private transport: HttpTransport, private opts: TracingOptions) {\n // Lazy timer — only kick off when the first span finishes, so an app\n // that never traces doesn't pay an interval cost.\n }\n\n /** Get (and lazily create) the active trace ID. */\n getTraceId(): string {\n if (!this.currentTraceId) this.currentTraceId = id();\n return this.currentTraceId;\n }\n\n /** Override the active trace ID, e.g. from an inbound request header. */\n setTraceId(traceId: string): void { this.currentTraceId = traceId; }\n\n /** Get the active span's ID, or null if no span is active. */\n getCurrentSpanId(): string | null {\n return this.spanStack.length > 0 ? this.spanStack[this.spanStack.length - 1].spanId : null;\n }\n\n /** Reset both the trace ID and the in-flight span stack. */\n resetTrace(): void {\n this.currentTraceId = null;\n this.spanStack = [];\n }\n\n /**\n * Start a new span. The returned Span automatically inherits the active\n * span as its parent. If `tracesSampleRate` drops this trace, returns a\n * no-op Span so the call site doesn't have to null-check.\n */\n startSpan(operation: string, options: { description?: string; tags?: Record<string, string> } = {}): Span {\n const traceId = this.getTraceId();\n const spanId = id();\n const parentSpanId = this.getCurrentSpanId() ?? '';\n\n if (!this.passesSampleRate()) {\n // Sampled out — return a no-op so the public API shape is stable.\n return new NoopSpan(traceId, spanId);\n }\n\n const span = new Span(\n traceId, spanId, parentSpanId,\n operation, options.description ?? '',\n this.opts.service ?? '', this.opts.environment ?? '',\n { ...(options.tags ?? {}) },\n (data) => this.enqueue(data, span),\n );\n this.spanStack.push(span);\n return span;\n }\n\n private passesSampleRate(): boolean {\n const r = this.opts.tracesSampleRate;\n if (typeof r !== 'number' || r >= 1) return true;\n if (r <= 0) return false;\n return Math.random() < r;\n }\n\n private enqueue(data: SpanData, span: Span): void {\n if (this.destroyed) return;\n // Pop the finishing span from the stack (if it's the top — usually is,\n // but tolerate out-of-order finishes from misbehaving callers).\n const idx = this.spanStack.lastIndexOf(span);\n if (idx >= 0) this.spanStack.splice(idx, 1);\n\n this.spans.push(data);\n if (this.spans.length >= BATCH_SIZE_THRESHOLD) {\n this.flush();\n return;\n }\n if (!this.flushTimer) {\n this.flushTimer = setInterval(() => this.flush(), FLUSH_INTERVAL_MS);\n }\n }\n\n flush(): void {\n if (this.spans.length === 0) return;\n const batch = this.spans;\n this.spans = [];\n this.transport.send(SPAN_INGEST_PATH, { spans: batch });\n }\n\n destroy(): void {\n this.destroyed = true;\n if (this.flushTimer) { clearInterval(this.flushTimer); this.flushTimer = null; }\n this.flush();\n this.currentTraceId = null;\n this.spanStack = [];\n }\n}\n","/**\n * Lightweight session-replay surrogate for the browser.\n *\n * **Status:** experimental. Captures DOM mutation events as a chronological\n * log so a server-side replay viewer can reconstruct the visible page over\n * time. Privacy-first defaults:\n *\n * - all `<input>`, `<textarea>`, `<select>` values are masked by default\n * - elements with `data-allstak-mask` are entirely replaced with `***`\n * - `[type=\"password\"]` is always masked, even with masking off\n * - `sampleRate` defaults to 0 — replay is OPT-IN per init\n *\n * NOT a drop-in replacement for full DOM-snapshot replay libraries — it\n * does not record initial paint, window resizes, scroll positions, or\n * canvas content. It records:\n *\n * 1. an initial sanitized DOM snapshot at start\n * 2. mutations: childList add/remove + attributes (filtered)\n * 3. user input events with values masked\n * 4. a periodic flush of the buffered log to /ingest/v1/replay\n *\n * Because the wire format is a JSON event log (not a binary blob), payloads\n * are larger than dedicated replay tools — appropriate for low-volume\n * debugging, not for sampling 100% of production traffic.\n */\n\nimport type { HttpTransport } from './transport';\n\ntype AddBreadcrumbFn = (\n type: string,\n msg: string,\n level?: string,\n data?: Record<string, unknown>,\n) => void;\n\nconst REPLAY_INGEST_PATH = '/ingest/v1/replay';\nconst FLUSH_INTERVAL_MS = 10_000;\nconst DEFAULT_MASK_ATTR = 'data-allstak-mask';\n\nexport interface ReplayOptions {\n enabled?: boolean;\n /** Probability per session that replay records. Default 0 (opt-in). */\n sampleRate?: number;\n /** Mask all text inputs / textareas / selects by default. Default true. */\n maskAllInputs?: boolean;\n /** Custom attribute name that flags an element to be masked. Default `data-allstak-mask`. */\n maskAttribute?: string;\n /** Max number of events buffered before forced flush. Default 200. */\n maxBufferedEvents?: number;\n}\n\ninterface ReplayEvent {\n /** UNIX millis when the event was observed. */\n ts: number;\n /** event kind */\n k: 'snap' | 'mut' | 'input' | 'nav';\n /** Free-form JSON-friendly payload. */\n data: Record<string, unknown>;\n}\n\nconst FLAG = '__allstak_replay_started__';\n\nexport class ReplayRecorder {\n private buffer: ReplayEvent[] = [];\n private flushTimer: ReturnType<typeof setInterval> | null = null;\n private observer: MutationObserver | null = null;\n private inputListener: ((ev: Event) => void) | null = null;\n private opts: Required<ReplayOptions>;\n private sessionId: string;\n private destroyed = false;\n\n constructor(\n private transport: HttpTransport,\n sessionId: string,\n private addBreadcrumb: AddBreadcrumbFn,\n options: ReplayOptions = {},\n ) {\n this.sessionId = sessionId;\n this.opts = {\n enabled: options.enabled ?? true,\n sampleRate: options.sampleRate ?? 0,\n maskAllInputs: options.maskAllInputs ?? true,\n maskAttribute: options.maskAttribute ?? DEFAULT_MASK_ATTR,\n maxBufferedEvents: options.maxBufferedEvents ?? 200,\n };\n }\n\n start(): void {\n if (typeof document === 'undefined' || typeof window === 'undefined') return;\n if (!this.opts.enabled) return;\n if (Math.random() >= this.opts.sampleRate) return;\n if ((document as any)[FLAG]) return;\n (document as any)[FLAG] = true;\n\n // Initial sanitized snapshot.\n this.push({\n ts: Date.now(),\n k: 'snap',\n data: { html: this.snapshotBody(), url: location.href },\n });\n\n // DOM mutations.\n this.observer = new MutationObserver((records) => {\n for (const r of records) {\n if (r.type === 'childList') {\n this.push({\n ts: Date.now(),\n k: 'mut',\n data: {\n kind: 'childList',\n target: this.describePath(r.target as Element),\n added: Array.from(r.addedNodes).map((n) => this.describeNode(n)),\n removed: r.removedNodes.length,\n },\n });\n } else if (r.type === 'attributes') {\n this.push({\n ts: Date.now(),\n k: 'mut',\n data: {\n kind: 'attr',\n target: this.describePath(r.target as Element),\n name: r.attributeName,\n value: this.safeAttribute(r.target as Element, r.attributeName ?? ''),\n },\n });\n }\n }\n });\n this.observer.observe(document.body ?? document.documentElement, {\n childList: true, attributes: true, subtree: true,\n });\n\n // User input — values always masked.\n this.inputListener = (ev: Event) => {\n const target = ev.target as HTMLInputElement | null;\n if (!target || !('value' in target)) return;\n const masked = this.maskInputValue(target);\n this.push({\n ts: Date.now(),\n k: 'input',\n data: { target: this.describePath(target), value: masked, type: target.type },\n });\n };\n document.addEventListener('input', this.inputListener, true);\n\n this.flushTimer = setInterval(() => this.flush(), FLUSH_INTERVAL_MS);\n\n try { this.addBreadcrumb('default', 'Replay recording started', 'info', { sessionId: this.sessionId }); }\n catch { /* ignore */ }\n }\n\n destroy(): void {\n this.destroyed = true;\n if (this.observer) { this.observer.disconnect(); this.observer = null; }\n if (this.inputListener) {\n document.removeEventListener('input', this.inputListener, true);\n this.inputListener = null;\n }\n if (this.flushTimer) { clearInterval(this.flushTimer); this.flushTimer = null; }\n this.flush();\n if (typeof document !== 'undefined') (document as any)[FLAG] = false;\n }\n\n /** @internal — exposed for tests. */\n getBuffer(): ReadonlyArray<ReplayEvent> { return this.buffer; }\n\n private push(ev: ReplayEvent): void {\n if (this.destroyed) return;\n this.buffer.push(ev);\n if (this.buffer.length >= this.opts.maxBufferedEvents) this.flush();\n }\n\n private flush(): void {\n if (this.buffer.length === 0) return;\n const events = this.buffer;\n this.buffer = [];\n this.transport.send(REPLAY_INGEST_PATH, {\n sessionId: this.sessionId,\n events,\n });\n }\n\n // ── Sanitization helpers ──────────────────────────────────────────\n\n private snapshotBody(): string {\n if (!document.body) return '';\n const clone = document.body.cloneNode(true) as HTMLElement;\n this.maskTree(clone);\n return clone.outerHTML;\n }\n\n private maskTree(root: Element): void {\n if (this.opts.maskAttribute && root.hasAttribute?.(this.opts.maskAttribute)) {\n root.textContent = '***';\n return;\n }\n const tag = root.tagName?.toLowerCase();\n if (tag === 'input' || tag === 'textarea' || tag === 'select') {\n (root as HTMLInputElement).value = this.maskInputValue(root as HTMLInputElement);\n root.setAttribute('value', (root as HTMLInputElement).value);\n }\n for (const child of Array.from(root.children)) this.maskTree(child);\n }\n\n private maskInputValue(el: HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement): string {\n // Password fields are ALWAYS masked, regardless of `maskAllInputs`.\n if ((el as HTMLInputElement).type === 'password') return '***';\n if (this.opts.maskAllInputs) return '***';\n return String((el as any).value ?? '');\n }\n\n private describeNode(node: Node): Record<string, unknown> {\n if (node.nodeType === 1) {\n return { type: 'element', tag: (node as Element).tagName?.toLowerCase() };\n }\n if (node.nodeType === 3) {\n return { type: 'text', length: (node.nodeValue ?? '').length };\n }\n return { type: 'other' };\n }\n\n private describePath(el: Element | null): string {\n if (!el || el.nodeType !== 1) return '';\n const parts: string[] = [];\n let cur: Element | null = el;\n let depth = 0;\n while (cur && depth < 8) {\n let p = cur.tagName.toLowerCase();\n if (cur.id) { p += `#${cur.id}`; parts.unshift(p); break; }\n if (cur.classList?.length) p += '.' + Array.from(cur.classList).slice(0, 2).join('.');\n parts.unshift(p);\n cur = cur.parentElement;\n depth += 1;\n }\n return parts.join('>');\n }\n\n private safeAttribute(el: Element, name: string): string {\n if (name === 'value' || name === 'defaultValue') return '***';\n return el.getAttribute(name) ?? '';\n }\n}\n","/**\n * Browser-side debug-id resolver.\n *\n * The build-time inject step (run via `@allstak/js/sourcemaps` against\n * Vite/Webpack/Next output) emits `//# debugId=<uuid>` into every JS\n * chunk and writes a self-registration snippet that populates\n * `globalThis._allstakDebugIds` as a `{ [scriptUrl]: uuid }` map.\n *\n * At capture time we resolve each stack frame's filename against that\n * map and attach the matched UUID to the frame so the dashboard\n * symbolicator can pick the right `.map` even after long-tail caching.\n */\n\ninterface DebugIdRegistry { [filename: string]: string | undefined }\n\nfunction getRegistry(): DebugIdRegistry {\n return ((globalThis as any)._allstakDebugIds ?? {}) as DebugIdRegistry;\n}\n\nconst cache = new Map<string, string | undefined>();\n\nexport function resolveDebugId(filename: string | undefined): string | undefined {\n if (!filename) return undefined;\n if (cache.has(filename)) return cache.get(filename);\n const registry = getRegistry();\n let id = registry[filename];\n if (!id) {\n // Tolerate registry keys that omit the scheme/host (relative URLs in\n // the browser source-map upload path).\n for (const key of Object.keys(registry)) {\n if (filename.endsWith(key)) { id = registry[key]; break; }\n }\n }\n cache.set(filename, id);\n return id;\n}\n\n/** @internal — for tests. */\nexport function __clearDebugIdCache(): void { cache.clear(); }\n","/**\n * HTTP request batching + transport for the React Native SDK.\n *\n * Mirrors the wire shape used by `@allstak/js`'s HttpRequestModule so the\n * existing backend ingest endpoint (`/ingest/v1/http-requests`) accepts\n * events from this SDK without a schema change. Adds optional rich fields\n * (headers, bodies, error string) — these ride alongside the existing\n * required fields and are tolerated as additive metadata server-side.\n *\n * Batching:\n * - flushes on a 5s timer OR when 20 events queue up\n * - flushes immediately on `destroy()`\n * - `getRecentFailed(n)` returns the last n failed requests (statusCode\n * >= 400 OR error set), used by error-linking on the next captureException\n */\n\nimport type { HttpTransport } from './transport';\n\nconst INGEST_PATH = '/ingest/v1/http-requests';\nconst FLUSH_INTERVAL_MS = 5_000;\nconst BATCH_SIZE_THRESHOLD = 20;\nconst RECENT_FAILED_BUFFER_SIZE = 10;\n\n/** What instrumentation hands to the module per request. */\nexport interface HttpRequestEvent {\n type: 'http_request';\n method: string;\n url: string; // already sanitized\n statusCode?: number;\n durationMs: number;\n requestSize?: number;\n responseSize?: number;\n requestBody?: string;\n responseBody?: string;\n requestHeaders?: Record<string, string>;\n responseHeaders?: Record<string, string>;\n error?: string;\n traceId?: string;\n}\n\nexport interface HttpRequestIngestItem {\n type: 'http_request';\n traceId: string;\n direction: 'outbound';\n method: string;\n // Backend wants host + path separately; we also keep the full sanitized\n // URL alongside in case the consumer wants it.\n host: string;\n path: string;\n url: string;\n statusCode: number;\n durationMs: number;\n requestSize?: number;\n responseSize?: number;\n requestBody?: string;\n responseBody?: string;\n requestHeaders?: Record<string, string>;\n responseHeaders?: Record<string, string>;\n error?: string;\n environment?: string;\n release?: string;\n dist?: string;\n platform?: string;\n 'sdk.name'?: string;\n 'sdk.version'?: string;\n timestamp: string;\n}\n\ninterface IngestPayload {\n requests: HttpRequestIngestItem[];\n}\n\ninterface ModuleDefaults {\n environment?: string;\n release?: string;\n dist?: string;\n platform?: string;\n sdkName?: string;\n sdkVersion?: string;\n}\n\nfunction genTraceId(): string {\n const hex = (n: number) => Math.floor(Math.random() * n).toString(16).padStart(1, '0');\n const seg = (len: number) => Array.from({ length: len }, () => hex(16)).join('');\n return `${seg(8)}-${seg(4)}-4${seg(3)}-${(8 + Math.floor(Math.random() * 4)).toString(16)}${seg(3)}-${seg(12)}`;\n}\n\nfunction splitHostPath(url: string): { host: string; path: string } {\n try {\n const u = new URL(url);\n return { host: u.host, path: u.pathname || '/' };\n } catch {\n // Relative URL — treat the whole thing as path.\n return { host: '', path: url.split('?')[0] };\n }\n}\n\nexport class HttpRequestModule {\n private queue: HttpRequestIngestItem[] = [];\n private recentFailed: HttpRequestIngestItem[] = [];\n private flushTimer: ReturnType<typeof setInterval> | null = null;\n private destroyed = false;\n private defaults: ModuleDefaults = {};\n\n constructor(private transport: HttpTransport) {}\n\n setDefaults(defaults: ModuleDefaults): void {\n this.defaults = { ...this.defaults, ...defaults };\n }\n\n capture(ev: HttpRequestEvent): void {\n if (this.destroyed) return;\n const { host, path } = splitHostPath(ev.url);\n const item: HttpRequestIngestItem = {\n type: 'http_request',\n traceId: ev.traceId ?? genTraceId(),\n direction: 'outbound',\n method: (ev.method || 'GET').toUpperCase(),\n host,\n path,\n url: ev.url,\n statusCode: ev.statusCode ?? 0,\n durationMs: Math.max(0, Math.floor(ev.durationMs)),\n requestSize: ev.requestSize,\n responseSize: ev.responseSize,\n requestBody: ev.requestBody,\n responseBody: ev.responseBody,\n requestHeaders: ev.requestHeaders,\n responseHeaders: ev.responseHeaders,\n error: ev.error,\n environment: this.defaults.environment,\n release: this.defaults.release,\n dist: this.defaults.dist,\n platform: this.defaults.platform,\n 'sdk.name': this.defaults.sdkName,\n 'sdk.version': this.defaults.sdkVersion,\n timestamp: new Date().toISOString(),\n };\n\n this.queue.push(item);\n const isFailed = (item.statusCode >= 400) || !!item.error;\n if (isFailed) {\n this.recentFailed.push(item);\n if (this.recentFailed.length > RECENT_FAILED_BUFFER_SIZE) this.recentFailed.shift();\n }\n\n if (this.queue.length >= BATCH_SIZE_THRESHOLD) { this.flush(); return; }\n if (!this.flushTimer) this.flushTimer = setInterval(() => this.flush(), FLUSH_INTERVAL_MS);\n }\n\n /** Snapshot of the last failed requests for error-linking. Newest last. */\n getRecentFailed(): ReadonlyArray<HttpRequestIngestItem> {\n return this.recentFailed;\n }\n\n flush(): void {\n if (this.queue.length === 0) return;\n const batch = this.queue;\n this.queue = [];\n const payload: IngestPayload = { requests: batch };\n this.transport.send(INGEST_PATH, payload);\n }\n\n destroy(): void {\n this.destroyed = true;\n if (this.flushTimer) { clearInterval(this.flushTimer); this.flushTimer = null; }\n this.flush();\n this.recentFailed = [];\n }\n\n /** @internal — for tests. */\n getQueueSize(): number { return this.queue.length; }\n}\n","/**\n * URL + header + body redaction utilities for HTTP instrumentation.\n *\n * Hard rules:\n * - Authorization, Cookie, X-API-Key, Set-Cookie are ALWAYS redacted\n * (host app cannot opt back into capturing them).\n * - Query params named `token`, `password`, `api_key`, `apikey`,\n * `authorization`, `auth`, `secret`, `access_token`, `refresh_token`,\n * `session` are ALWAYS redacted.\n * - Host app may add additional names via `redactHeaders` /\n * `redactQueryParams`; the always-list is the floor, not the ceiling.\n * - Bodies are truncated to `maxBodyBytes` (default 4096) and replaced\n * with `'<binary>'` when not safely-stringifiable.\n *\n * URL pattern matching for ignoredUrls / allowedUrls accepts strings\n * (substring match) or RegExp (test-based). String matching is\n * case-insensitive on the URL.\n */\n\nexport const ALWAYS_REDACT_HEADERS = new Set([\n 'authorization',\n 'cookie',\n 'set-cookie',\n 'x-api-key',\n 'x-auth-token',\n 'proxy-authorization',\n]);\n\nexport const ALWAYS_REDACT_QUERY = new Set([\n 'token',\n 'password',\n 'api_key',\n 'apikey',\n 'authorization',\n 'auth',\n 'secret',\n 'access_token',\n 'refresh_token',\n 'session',\n 'sessionid',\n 'jwt',\n]);\n\nexport const REDACTED = '[REDACTED]';\n\nexport interface HttpTrackingOptions {\n /** Capture request body. Default false. Truncated to maxBodyBytes. */\n captureRequestBody?: boolean;\n /** Capture response body. Default false. Truncated to maxBodyBytes. */\n captureResponseBody?: boolean;\n /**\n * Capture request + response headers. Default false. Hard-redacted\n * names are always stripped regardless of this flag.\n */\n captureHeaders?: boolean;\n /** Additional header names to redact (case-insensitive). */\n redactHeaders?: string[];\n /** Additional query-param names to redact (case-insensitive). */\n redactQueryParams?: string[];\n /**\n * Skip URLs matching any of these patterns. String = case-insensitive\n * substring match; RegExp = `.test()` against the full URL.\n */\n ignoredUrls?: (string | RegExp)[];\n /**\n * If non-empty, only capture URLs matching at least one of these\n * patterns. Takes precedence over ignoredUrls.\n */\n allowedUrls?: (string | RegExp)[];\n /** Max bytes per captured body. Default 4096. */\n maxBodyBytes?: number;\n}\n\nexport function shouldCaptureUrl(url: string, opts: HttpTrackingOptions): boolean {\n if (!url) return false;\n const lower = url.toLowerCase();\n if (opts.allowedUrls && opts.allowedUrls.length > 0) {\n return opts.allowedUrls.some((p) => matches(p, url, lower));\n }\n if (opts.ignoredUrls && opts.ignoredUrls.length > 0) {\n return !opts.ignoredUrls.some((p) => matches(p, url, lower));\n }\n return true;\n}\n\nfunction matches(pattern: string | RegExp, url: string, lower: string): boolean {\n if (pattern instanceof RegExp) return pattern.test(url);\n if (typeof pattern !== 'string') return false;\n return lower.includes(pattern.toLowerCase());\n}\n\n/**\n * Redact sensitive query-string params in a URL. Returns the sanitized\n * URL string. Falls back to the input when URL parsing fails (relative\n * URLs in test environments).\n */\nexport function redactUrl(url: string, opts: HttpTrackingOptions): string {\n if (!url) return url;\n const extra = (opts.redactQueryParams ?? []).map((s) => s.toLowerCase());\n const redactSet = new Set([...ALWAYS_REDACT_QUERY, ...extra]);\n\n // Try the URL parser first — handles full URLs cleanly.\n let parsed: URL | null = null;\n try { parsed = new URL(url); } catch { /* relative or malformed */ }\n\n if (parsed) {\n // Avoid `for…of` on URLSearchParams (the lib's Symbol.iterator typing\n // varies across DOM/dom-iterable lib targets). `forEach` is universal.\n const params = parsed.searchParams;\n let mutated = false;\n const keysToRedact: string[] = [];\n params.forEach((_v, k) => {\n if (redactSet.has(k.toLowerCase())) keysToRedact.push(k);\n });\n for (const k of keysToRedact) {\n params.set(k, REDACTED);\n mutated = true;\n }\n if (mutated) parsed.search = params.toString();\n return parsed.toString();\n }\n\n // Fallback: regex over the query portion of the URL.\n const qIdx = url.indexOf('?');\n if (qIdx < 0) return url;\n const head = url.slice(0, qIdx);\n const queryAndHash = url.slice(qIdx + 1);\n const hashIdx = queryAndHash.indexOf('#');\n const query = hashIdx < 0 ? queryAndHash : queryAndHash.slice(0, hashIdx);\n const hash = hashIdx < 0 ? '' : queryAndHash.slice(hashIdx);\n\n const parts = query.split('&').map((pair) => {\n const eq = pair.indexOf('=');\n if (eq < 0) return pair;\n const key = pair.slice(0, eq);\n return redactSet.has(key.toLowerCase()) ? `${key}=${REDACTED}` : pair;\n });\n return `${head}?${parts.join('&')}${hash ? '#' + hash : ''}`;\n}\n\n/**\n * Filter + redact an HTTP header dictionary. Returns a NEW object — does\n * not mutate the input. When `captureHeaders` is false returns undefined\n * (no headers in the wire payload at all).\n */\nexport function sanitizeHeaders(\n headers: Record<string, string | string[] | undefined> | undefined,\n opts: HttpTrackingOptions,\n): Record<string, string> | undefined {\n if (!opts.captureHeaders) return undefined;\n if (!headers) return {};\n const extra = (opts.redactHeaders ?? []).map((s) => s.toLowerCase());\n const redactSet = new Set([...ALWAYS_REDACT_HEADERS, ...extra]);\n const out: Record<string, string> = {};\n for (const [k, v] of Object.entries(headers)) {\n if (v == null) continue;\n const lower = k.toLowerCase();\n out[lower] = redactSet.has(lower)\n ? REDACTED\n : Array.isArray(v) ? v.join(', ') : String(v);\n }\n return out;\n}\n\n/**\n * Truncate + safely-stringify a body. Returns:\n * - undefined when capture is disabled\n * - the stringified body when it's a string / number / plain object\n * - '<binary>' when it's a Blob / FormData / ArrayBuffer / etc\n * - truncated string with `…[truncated]` suffix when over maxBodyBytes\n */\nexport function captureBody(\n body: unknown,\n enabled: boolean,\n maxBodyBytes: number,\n): string | undefined {\n if (!enabled) return undefined;\n if (body == null) return undefined;\n let str: string;\n if (typeof body === 'string') str = body;\n else if (typeof body === 'number' || typeof body === 'boolean') str = String(body);\n else if (typeof body === 'object') {\n // Don't try to stringify Blob, FormData, ArrayBuffer, ReadableStream.\n const tag = Object.prototype.toString.call(body);\n if (tag !== '[object Object]' && tag !== '[object Array]') return '<binary>';\n try { str = JSON.stringify(body); } catch { return '<unserializable>'; }\n } else {\n return '<binary>';\n }\n if (str.length > maxBodyBytes) return str.slice(0, maxBodyBytes) + '…[truncated]';\n return str;\n}\n","/**\n * Automatic HTTP instrumentation for React Native — patches `fetch`,\n * `XMLHttpRequest`, and (when found) `axios`.\n *\n * Idempotent: each patch tags itself with a flag so a second `init()` is\n * a no-op rather than stacking wrappers (which would otherwise double-fire\n * events and corrupt response handling on hot reload).\n *\n * Privacy + safety contract:\n * - URL query params are sanitized via `redactUrl` BEFORE being recorded\n * - Headers are not recorded unless `captureHeaders: true`\n * - Bodies are not recorded unless `captureRequestBody`/`captureResponseBody`\n * - Response body capture clones the Response (or skips when cloning is\n * unsafe — large/streaming responses) so the consumer's downstream\n * `.json()` / `.text()` still works without \"body already used\" errors\n * - Skips own ingest URLs (`api.allstak.sa/ingest/...`) so wrappers\n * never recurse on telemetry traffic\n * - On any internal failure, the original network call is allowed to\n * proceed — never break consumer networking\n */\n\nimport { HttpRequestModule, HttpRequestEvent } from './http-requests';\nimport {\n HttpTrackingOptions,\n redactUrl,\n sanitizeHeaders,\n shouldCaptureUrl,\n captureBody,\n} from './http-redact';\n\nconst FETCH_FLAG = '__allstak_http_fetch_patched__';\nconst XHR_FLAG = '__allstak_http_xhr_patched__';\nconst AXIOS_FLAG = Symbol.for('allstak.http.axios.instrumented');\n\nconst DEFAULT_MAX_BODY = 4096;\n\n// Module-level \"current binding\" — wrappers route capture calls through\n// this so re-init swaps the underlying module without re-wrapping the\n// global, and a destroyed module silently no-ops instead of throwing.\nlet _currentModule: HttpRequestModule | null = null;\nlet _currentOpts: BoundOptions | null = null;\nfunction currentModule(): HttpRequestModule | null { return _currentModule; }\nfunction currentOpts(): BoundOptions | null { return _currentOpts; }\nfunction safeCapture(ev: HttpRequestEvent): void {\n try { currentModule()?.capture(ev); } catch { /* never break host */ }\n}\n\ninterface BoundOptions extends Required<Omit<HttpTrackingOptions, 'redactHeaders' | 'redactQueryParams' | 'ignoredUrls' | 'allowedUrls'>> {\n redactHeaders: string[];\n redactQueryParams: string[];\n ignoredUrls: (string | RegExp)[];\n allowedUrls: (string | RegExp)[];\n ownIngestPrefix: string;\n}\n\nfunction bind(opts: HttpTrackingOptions, ownIngestHost: string): BoundOptions {\n return {\n captureRequestBody: opts.captureRequestBody ?? false,\n captureResponseBody: opts.captureResponseBody ?? false,\n captureHeaders: opts.captureHeaders ?? false,\n redactHeaders: opts.redactHeaders ?? [],\n redactQueryParams: opts.redactQueryParams ?? [],\n ignoredUrls: opts.ignoredUrls ?? [],\n allowedUrls: opts.allowedUrls ?? [],\n maxBodyBytes: opts.maxBodyBytes ?? DEFAULT_MAX_BODY,\n ownIngestPrefix: ownIngestHost.replace(/\\/$/, ''),\n };\n}\n\nfunction isOwnIngest(url: string, prefix: string): boolean {\n return !!prefix && url.startsWith(prefix);\n}\n\nfunction urlString(input: any): string {\n if (typeof input === 'string') return input;\n if (input && typeof input.href === 'string') return input.href;\n if (input && typeof input.url === 'string') return input.url;\n return String(input);\n}\n\nfunction safeByteLength(s: string | undefined | null): number | undefined {\n if (s == null) return undefined;\n if (typeof s === 'string') {\n // Approximate — UTF-8 byte length without TextEncoder dep.\n let n = 0;\n for (let i = 0; i < s.length; i++) {\n const c = s.charCodeAt(i);\n if (c < 0x80) n += 1;\n else if (c < 0x800) n += 2;\n else if (c >= 0xd800 && c <= 0xdbff) { n += 4; i += 1; }\n else n += 3;\n }\n return n;\n }\n return undefined;\n}\n\nfunction headersToObject(h: any): Record<string, string> {\n if (!h) return {};\n // Headers / Map style (entries())\n if (typeof h.entries === 'function') {\n const out: Record<string, string> = {};\n for (const [k, v] of h.entries()) out[String(k).toLowerCase()] = String(v);\n return out;\n }\n // Plain dict\n if (typeof h === 'object') {\n const out: Record<string, string> = {};\n for (const [k, v] of Object.entries(h)) {\n if (v == null) continue;\n out[String(k).toLowerCase()] = Array.isArray(v) ? v.join(', ') : String(v);\n }\n return out;\n }\n return {};\n}\n\n// ───────────────────────────────────────────────────────────────\n// fetch\n// ───────────────────────────────────────────────────────────────\n\nexport function patchFetch(): void {\n const g: any = globalThis as any;\n if (typeof g.fetch !== 'function') return;\n if (g.fetch[FETCH_FLAG]) return;\n\n const original = g.fetch;\n\n const wrapped = async function (this: any, input: any, init?: any): Promise<Response> {\n const opts = currentOpts();\n if (!opts || !currentModule()) {\n // Instrumentation not bound (yet, or re-init mid-flight) — pass through.\n return original.call(this, input, init);\n }\n const rawUrl = urlString(input);\n const sanitizedUrl = redactUrl(rawUrl, opts);\n const method = ((init?.method) || (input && typeof input === 'object' && input.method) || 'GET').toUpperCase();\n\n if (isOwnIngest(rawUrl, opts.ownIngestPrefix) || !shouldCaptureUrl(rawUrl, opts)) {\n return original.call(this, input, init);\n }\n\n const start = Date.now();\n const reqHeaders = sanitizeHeaders(headersToObject(init?.headers ?? (input && input.headers)), opts);\n const reqBody = captureBody(init?.body, opts.captureRequestBody, opts.maxBodyBytes);\n const reqSize = safeByteLength(typeof init?.body === 'string' ? init.body : undefined);\n\n let response: any;\n try {\n response = await original.call(this, input, init);\n } catch (err) {\n safeCapture({\n type: 'http_request',\n method, url: sanitizedUrl, statusCode: 0,\n durationMs: Date.now() - start,\n requestBody: reqBody, requestHeaders: reqHeaders, requestSize: reqSize,\n error: String((err as any)?.message ?? err),\n });\n throw err;\n }\n\n const durationMs = Date.now() - start;\n let respBody: string | undefined;\n let respSize: number | undefined;\n let respHeaders: Record<string, string> | undefined;\n try {\n respHeaders = sanitizeHeaders(headersToObject(response.headers), opts);\n const lenHeader = typeof response.headers?.get === 'function' ? response.headers.get('content-length') : null;\n if (lenHeader) respSize = parseInt(lenHeader, 10) || undefined;\n\n if (opts.captureResponseBody && typeof response.clone === 'function') {\n try {\n const cloned = response.clone();\n const text = await cloned.text();\n respBody = captureBody(text, true, opts.maxBodyBytes);\n if (respSize == null) respSize = safeByteLength(text);\n } catch { /* clone unsafe — leave body undefined */ }\n }\n } catch { /* never break the response surface */ }\n\n safeCapture({\n type: 'http_request',\n method, url: sanitizedUrl,\n statusCode: response.status, durationMs,\n requestBody: reqBody, requestHeaders: reqHeaders, requestSize: reqSize,\n responseBody: respBody, responseHeaders: respHeaders, responseSize: respSize,\n });\n\n return response;\n };\n (wrapped as any)[FETCH_FLAG] = true;\n g.fetch = wrapped;\n}\n\n// ───────────────────────────────────────────────────────────────\n// XMLHttpRequest\n// ───────────────────────────────────────────────────────────────\n\nexport function patchXhr(): void {\n const g: any = globalThis as any;\n const X: any = g.XMLHttpRequest;\n if (!X || X.prototype[XHR_FLAG]) return;\n\n const origOpen = X.prototype.open;\n const origSend = X.prototype.send;\n const origSetRequestHeader = X.prototype.setRequestHeader;\n\n X.prototype.open = function (method: string, url: string, ...rest: unknown[]) {\n (this as any).__allstak_method__ = method;\n (this as any).__allstak_url__ = url;\n (this as any).__allstak_headers__ = {};\n return origOpen.call(this, method, url, ...rest);\n };\n\n X.prototype.setRequestHeader = function (name: string, value: string) {\n try { (this as any).__allstak_headers__[String(name).toLowerCase()] = String(value); }\n catch { /* ignore */ }\n return origSetRequestHeader.call(this, name, value);\n };\n\n X.prototype.send = function (body?: unknown) {\n const opts = currentOpts();\n if (!opts || !currentModule()) return origSend.call(this, body as any);\n\n const start = Date.now();\n const method = String((this as any).__allstak_method__ || 'GET').toUpperCase();\n const rawUrl = String((this as any).__allstak_url__ || '');\n const sanitizedUrl = redactUrl(rawUrl, opts);\n\n if (isOwnIngest(rawUrl, opts.ownIngestPrefix) || !shouldCaptureUrl(rawUrl, opts)) {\n return origSend.call(this, body as any);\n }\n\n const reqHeaders = sanitizeHeaders((this as any).__allstak_headers__, opts);\n const reqBody = captureBody(body, opts.captureRequestBody, opts.maxBodyBytes);\n const reqSize = safeByteLength(typeof body === 'string' ? body : undefined);\n\n const finish = (statusCode: number, error?: string) => {\n const durationMs = Date.now() - start;\n let respHeaders: Record<string, string> | undefined;\n let respBody: string | undefined;\n let respSize: number | undefined;\n try {\n const liveOpts = currentOpts() ?? opts;\n if (liveOpts.captureHeaders && typeof (this as any).getAllResponseHeaders === 'function') {\n const raw: string = (this as any).getAllResponseHeaders() || '';\n const dict: Record<string, string> = {};\n for (const line of raw.split(/\\r?\\n/)) {\n const idx = line.indexOf(':');\n if (idx > 0) dict[line.slice(0, idx).trim().toLowerCase()] = line.slice(idx + 1).trim();\n }\n respHeaders = sanitizeHeaders(dict, liveOpts);\n }\n if (liveOpts.captureResponseBody) {\n const text = (this as any).responseText;\n if (typeof text === 'string') {\n respBody = captureBody(text, true, liveOpts.maxBodyBytes);\n respSize = safeByteLength(text);\n }\n }\n } catch { /* never break */ }\n\n safeCapture({\n type: 'http_request',\n method, url: sanitizedUrl,\n statusCode, durationMs,\n requestBody: reqBody, requestHeaders: reqHeaders, requestSize: reqSize,\n responseBody: respBody, responseHeaders: respHeaders, responseSize: respSize,\n error,\n });\n };\n\n this.addEventListener?.('load', () => finish(this.status || 0));\n this.addEventListener?.('error', () => finish(0, 'network'));\n this.addEventListener?.('abort', () => finish(0, 'abort'));\n this.addEventListener?.('timeout', () => finish(0, 'timeout'));\n return origSend.call(this, body as any);\n };\n\n X.prototype[XHR_FLAG] = true;\n}\n\n// ───────────────────────────────────────────────────────────────\n// axios — manual instrumentation + best-effort auto-detect\n// ───────────────────────────────────────────────────────────────\n\n/**\n * Manually instrument an axios instance. Idempotent — calling twice on\n * the same instance is a no-op. Returns the same instance so it can be\n * used inline:\n * `const api = AllStak.instrumentAxios(axios.create({...}))`\n *\n * NOTE: under React Native, axios uses XHR under the hood by default, so\n * the XHR patch above already records the same calls. This wrapper is\n * still useful when consumers configure axios with a custom `adapter`\n * that bypasses XHR (e.g. node-style http adapter on RN+Node setups).\n * Both patches are idempotent and de-dup via a per-request flag.\n */\nexport function instrumentAxiosInstance(\n axiosInstance: any,\n module: HttpRequestModule,\n opts: BoundOptions,\n): any {\n if (!axiosInstance || typeof axiosInstance.interceptors !== 'object') return axiosInstance;\n if (axiosInstance[AXIOS_FLAG]) return axiosInstance;\n axiosInstance[AXIOS_FLAG] = true;\n\n const reqStarts = new WeakMap<object, { start: number; method: string; rawUrl: string }>();\n\n axiosInstance.interceptors.request.use((config: any) => {\n try {\n const rawUrl = (config.baseURL ? config.baseURL.replace(/\\/$/, '') : '') + (config.url || '');\n reqStarts.set(config, {\n start: Date.now(),\n method: String(config.method || 'GET').toUpperCase(),\n rawUrl,\n });\n } catch { /* ignore */ }\n return config;\n });\n\n const finalize = (cfg: any, statusCode: number, response?: any, error?: string) => {\n const meta = reqStarts.get(cfg);\n if (!meta) return;\n reqStarts.delete(cfg);\n if (isOwnIngest(meta.rawUrl, opts.ownIngestPrefix)) return;\n if (!shouldCaptureUrl(meta.rawUrl, opts)) return;\n\n const sanitizedUrl = redactUrl(meta.rawUrl, opts);\n const reqHeaders = sanitizeHeaders(headersToObject(cfg.headers), opts);\n const reqBody = captureBody(cfg.data, opts.captureRequestBody, opts.maxBodyBytes);\n const respHeaders = sanitizeHeaders(headersToObject(response?.headers), opts);\n const respBody = captureBody(response?.data, opts.captureResponseBody, opts.maxBodyBytes);\n\n try {\n module.capture({\n type: 'http_request',\n method: meta.method,\n url: sanitizedUrl,\n statusCode,\n durationMs: Date.now() - meta.start,\n requestBody: reqBody,\n requestHeaders: reqHeaders,\n responseBody: respBody,\n responseHeaders: respHeaders,\n error,\n });\n } catch { /* ignore */ }\n };\n\n axiosInstance.interceptors.response.use(\n (response: any) => { finalize(response.config, response.status); return response; },\n (err: any) => {\n const cfg = err?.config;\n const status = err?.response?.status ?? 0;\n finalize(cfg, status, err?.response, String(err?.message ?? err));\n throw err;\n },\n );\n return axiosInstance;\n}\n\n/**\n * Best-effort auto-detect: attempt to require('axios') and instrument the\n * default singleton. Silently no-ops when axios isn't installed (the\n * common case — most apps either don't use axios or import it via ES\n * modules and would call instrumentAxios manually).\n */\nexport function tryAutoInstrumentAxios(module: HttpRequestModule, opts: BoundOptions): void {\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const axios = (globalThis as any).require?.('axios') ?? null;\n if (axios) instrumentAxiosInstance(axios.default ?? axios, module, opts);\n } catch { /* axios not installed */ }\n}\n\n// ───────────────────────────────────────────────────────────────\n// Top-level orchestrator\n// ───────────────────────────────────────────────────────────────\n\nexport function installHttpInstrumentation(\n module: HttpRequestModule,\n options: HttpTrackingOptions,\n ownIngestHost: string,\n): { instrumentAxios: (axios: any) => any } {\n const bound = bind(options, ownIngestHost);\n // Bind first so already-installed wrappers immediately route to the new\n // module/options. Subsequent patch* calls are idempotent no-ops.\n _currentModule = module;\n _currentOpts = bound;\n try { patchFetch(); } catch { /* ignore */ }\n try { patchXhr(); } catch { /* ignore */ }\n try { tryAutoInstrumentAxios(module, bound); } catch { /* ignore */ }\n return {\n instrumentAxios: (axios: any) => instrumentAxiosInstance(axios, module, bound),\n };\n}\n\n/** Called by AllStakClient.destroy() so wrappers go quiet between inits. */\nexport function unbindHttpInstrumentation(): void {\n _currentModule = null;\n _currentOpts = null;\n}\n\n/** @internal — for tests. */\nexport function __resetForTest(): void {\n const g: any = globalThis as any;\n if (g.fetch && g.fetch[FETCH_FLAG]) {\n // No way to recover original without saving — tests use freshly-set fetch.\n }\n if (g.XMLHttpRequest && g.XMLHttpRequest.prototype[XHR_FLAG]) {\n delete g.XMLHttpRequest.prototype[XHR_FLAG];\n }\n}\n","/**\n * Lightweight Web Vitals collection via the browser's PerformanceObserver.\n *\n * Captures CLS, LCP, INP, FCP, TTFB without pulling in the `web-vitals`\n * package as a runtime dependency. Each metric is shipped as a single\n * `web_vital` log on the SDK's `/ingest/v1/logs` channel — so the\n * dashboard can chart them alongside other logs.\n *\n * Privacy: only numeric values + the metric name are sent. No URLs,\n * referrers, or user-identifiable data.\n *\n * Browser compatibility: PerformanceObserver is available in every\n * evergreen browser (Chrome 51+, Safari 11+, Firefox 57+, Edge 79+).\n * Older browsers silently no-op via the `typeof PerformanceObserver`\n * guard.\n *\n * - **CLS** (Cumulative Layout Shift) — layout-shift entries with\n * `hadRecentInput=false`, summed for the session\n * - **LCP** (Largest Contentful Paint) — biggest paint entry's startTime\n * - **INP** (Interaction to Next Paint) — longest event-timing duration\n * - **FCP** (First Contentful Paint) — first paint named `first-contentful-paint`\n * - **TTFB** (Time to First Byte) — `responseStart - requestStart` from the\n * navigation timing entry\n */\n\ntype VitalsReporter = (metric: { name: string; value: number; id?: string }) => void;\n\nconst FLAG = '__allstak_web_vitals_started__';\n\nexport interface WebVitalsHandle {\n /** Disconnects all observers. Idempotent. */\n destroy(): void;\n}\n\n/**\n * Start collecting Web Vitals. Returns a handle whose `destroy()` cleans\n * up all PerformanceObservers. Safe no-op on non-browser runtimes.\n */\nexport function startWebVitals(report: VitalsReporter): WebVitalsHandle {\n const noop: WebVitalsHandle = { destroy: () => {} };\n if (typeof window === 'undefined') return noop;\n if (typeof PerformanceObserver === 'undefined') return noop;\n if ((window as any)[FLAG]) return noop;\n (window as any)[FLAG] = true;\n\n const observers: PerformanceObserver[] = [];\n\n // ── LCP ──────────────────────────────────────────────────────────\n // Reports the LCP value when the page is hidden or unloaded.\n let lastLcp = 0;\n try {\n const obs = new PerformanceObserver((list) => {\n const entries = list.getEntries();\n const last = entries[entries.length - 1] as any;\n if (last && typeof last.startTime === 'number') {\n lastLcp = last.startTime;\n }\n });\n obs.observe({ type: 'largest-contentful-paint', buffered: true } as any);\n observers.push(obs);\n } catch { /* unsupported entry type */ }\n\n // ── CLS ──────────────────────────────────────────────────────────\n let cls = 0;\n try {\n const obs = new PerformanceObserver((list) => {\n for (const entry of list.getEntries() as any[]) {\n if (!entry.hadRecentInput && typeof entry.value === 'number') {\n cls += entry.value;\n }\n }\n });\n obs.observe({ type: 'layout-shift', buffered: true } as any);\n observers.push(obs);\n } catch { /* unsupported */ }\n\n // ── INP ──────────────────────────────────────────────────────────\n let maxInteraction = 0;\n try {\n const obs = new PerformanceObserver((list) => {\n for (const entry of list.getEntries() as any[]) {\n if (typeof entry.duration === 'number' && entry.duration > maxInteraction) {\n maxInteraction = entry.duration;\n }\n }\n });\n // 'event' includes both keyboard and pointer events; durationThreshold\n // 40ms keeps observer overhead low on busy pages.\n obs.observe({ type: 'event', buffered: true, durationThreshold: 40 } as any);\n observers.push(obs);\n } catch { /* unsupported */ }\n\n // ── FCP ──────────────────────────────────────────────────────────\n let fcp = 0;\n try {\n const obs = new PerformanceObserver((list) => {\n for (const entry of list.getEntries()) {\n if (entry.name === 'first-contentful-paint') {\n fcp = entry.startTime;\n }\n }\n });\n obs.observe({ type: 'paint', buffered: true } as any);\n observers.push(obs);\n } catch { /* unsupported */ }\n\n // ── TTFB ─────────────────────────────────────────────────────────\n // From the navigation timing entry. Reported once on first read.\n const reportTtfb = (): void => {\n try {\n const navEntry = performance.getEntriesByType('navigation')[0] as PerformanceNavigationTiming | undefined;\n if (navEntry && typeof navEntry.responseStart === 'number' && typeof navEntry.requestStart === 'number') {\n const ttfb = Math.max(0, navEntry.responseStart - navEntry.requestStart);\n report({ name: 'TTFB', value: ttfb });\n }\n } catch { /* ignore */ }\n };\n\n // Final flush on hide/unload — this is when LCP/CLS/INP are most\n // accurate (after the page is done interacting).\n const finalize = (): void => {\n if (lastLcp > 0) report({ name: 'LCP', value: lastLcp });\n report({ name: 'CLS', value: cls });\n if (maxInteraction > 0) report({ name: 'INP', value: maxInteraction });\n if (fcp > 0) report({ name: 'FCP', value: fcp });\n reportTtfb();\n };\n\n // visibilitychange is the most reliable signal — pagehide / unload\n // can be unreliable on mobile Safari but visibilitychange always\n // fires before either. We intentionally do NOT use unload (deprecated\n // and disables back/forward cache).\n const onVisibility = (): void => {\n if (document.visibilityState === 'hidden') finalize();\n };\n document.addEventListener('visibilitychange', onVisibility);\n // Also try at pagehide for browsers that fire it before visibilitychange.\n const onPagehide = (): void => finalize();\n window.addEventListener('pagehide', onPagehide);\n\n return {\n destroy: () => {\n for (const o of observers) {\n try { o.disconnect(); } catch { /* ignore */ }\n }\n document.removeEventListener('visibilitychange', onVisibility);\n window.removeEventListener('pagehide', onPagehide);\n (window as any)[FLAG] = false;\n },\n };\n}\n\n/** @internal — reset the started flag so tests can re-init. */\nexport function __resetWebVitalsFlagForTest(): void {\n if (typeof window !== 'undefined') {\n (window as any)[FLAG] = false;\n }\n}\n","/**\n * Standalone AllStak client for the browser/React environment. No external\n * AllStak SDK dependencies — only the browser's native `fetch`, AbortController,\n * Date, JSON, and (optionally) `window` for unhandled error auto-capture.\n *\n * Surface mirrors the public AllStak API used by web apps:\n * init / captureException / captureMessage / addBreadcrumb / clearBreadcrumbs\n * setUser / setTag / setIdentity / getSessionId\n */\n\nimport { HttpTransport } from './transport';\nimport { parseStack } from './stack';\nimport { instrumentFetch, instrumentConsole } from './auto-breadcrumbs';\nimport { instrumentBrowserNavigation, __setDefaultBreadcrumbForwarder } from './navigation';\nimport { Scope, mergeScopes } from './scope';\nimport { TracingModule, Span } from './tracing';\nimport { ReplayRecorder, ReplayOptions } from './replay';\nimport { resolveDebugId } from './debug-id';\nimport { HttpRequestModule } from './http-requests';\nimport type { HttpTrackingOptions } from './http-redact';\nimport { installHttpInstrumentation } from './http-instrumentation';\nimport type { ConsoleCaptureOptions } from './auto-breadcrumbs';\nimport { startWebVitals, WebVitalsHandle } from './web-vitals';\n\nexport const INGEST_HOST = 'https://api.allstak.sa';\nexport const SDK_NAME = 'allstak-react';\nexport const SDK_VERSION = '0.3.4';\n\nexport { Scope } from './scope';\nexport { Span, TracingModule } from './tracing';\nexport type { SpanData } from './tracing';\n\nconst ERRORS_PATH = '/ingest/v1/errors';\nconst LOGS_PATH = '/ingest/v1/logs';\n\nconst VALID_BREADCRUMB_TYPES = new Set(['http', 'log', 'ui', 'navigation', 'query', 'default']);\nconst VALID_BREADCRUMB_LEVELS = new Set(['info', 'warn', 'error', 'debug']);\nconst DEFAULT_MAX_BREADCRUMBS = 50;\n\nexport interface AllStakConfig {\n /** Project API key (`ask_live_…`). Required. */\n apiKey: string;\n /** Optional ingest host override; defaults to {@link INGEST_HOST}. */\n host?: string;\n environment?: string;\n release?: string;\n user?: { id?: string; email?: string };\n tags?: Record<string, string>;\n /** Per-event extra data attached to every capture (override per call via context arg). */\n extras?: Record<string, unknown>;\n /** Named context bags (e.g. `app`, `device`). Each lives under `metadata['context.<name>']`. */\n contexts?: Record<string, Record<string, unknown>>;\n /**\n * Default severity level for events that don't specify their own.\n * Customer-set default severity, mirrors `setLevel`.\n */\n level?: 'fatal' | 'error' | 'warning' | 'info' | 'debug';\n /**\n * Custom grouping fingerprint applied to every event. Customer-set grouping override —\n * `setFingerprint`. Pass an empty array or `null` to clear.\n */\n fingerprint?: string[];\n /** Probability in [0, 1] that any new span is recorded. Default 1. */\n tracesSampleRate?: number;\n /** Service name attached to every span (defaults to release if unset). */\n service?: string;\n maxBreadcrumbs?: number;\n /** Auto-capture unhandled `error` and `unhandledrejection` on `window`. Default: true */\n autoCaptureBrowserErrors?: boolean;\n /** Wrap `globalThis.fetch` to record HTTP breadcrumbs. Default: true */\n autoBreadcrumbsFetch?: boolean;\n /** Wrap `console.*` methods to record log breadcrumbs. Default: true.\n * Per-method capture is controlled by `captureConsole` (warn + error\n * default on, log + info default off). */\n autoBreadcrumbsConsole?: boolean;\n /**\n * Per-console-method capture flags. Defaults: warn + error captured,\n * log + info NOT captured (to avoid breadcrumb spam from typical app\n * logging). Set `{ log: true, info: true }` to opt-in.\n */\n captureConsole?: ConsoleCaptureOptions;\n /**\n * Auto-capture Web Vitals (CLS, LCP, INP, FCP, TTFB) via the browser's\n * PerformanceObserver. Default: true. Each metric ships as a\n * `web_vitals` log on the next backend flush.\n */\n autoWebVitals?: boolean;\n /** Wrap `history.pushState`/`replaceState` and listen to `popstate` for SPA navigation breadcrumbs. Default: true */\n autoBreadcrumbsNavigation?: boolean;\n /**\n * Experimental session-replay surrogate. **Off by default.** Enable with\n * `replay: { sampleRate: 0.1 }`. Captures sanitized initial DOM snapshot +\n * subsequent mutations + masked input events. See `src/replay.ts` for\n * the full privacy contract.\n */\n replay?: ReplayOptions;\n /**\n * Auto-instrument outbound HTTP — wraps `fetch`, `XMLHttpRequest`, and\n * (when present) `axios`. Default: false.\n */\n enableHttpTracking?: boolean;\n /**\n * Privacy + capture controls for HTTP instrumentation. Bodies and\n * headers are OFF by default; auth headers and sensitive query params\n * are ALWAYS redacted.\n */\n httpTracking?: HttpTrackingOptions;\n /**\n * Probability in [0, 1] that any given error is sent. Default: 1 (no sampling).\n * Applied per event before {@link beforeSend}.\n */\n sampleRate?: number;\n /**\n * Mutate or drop an event before it is sent. Return `null` (or a falsy\n * value) to drop. Sync or async. Errors thrown inside the hook are caught\n * — the event is sent as-is so a buggy hook can't black-hole telemetry.\n */\n beforeSend?: (event: ErrorIngestPayload) =>\n | ErrorIngestPayload | null | undefined\n | Promise<ErrorIngestPayload | null | undefined>;\n /** SDK identity overrides. */\n sdkName?: string;\n sdkVersion?: string;\n platform?: string;\n dist?: string;\n commitSha?: string;\n branch?: string;\n}\n\nexport interface Breadcrumb {\n timestamp: string;\n type: string;\n message: string;\n level: string;\n data?: Record<string, unknown>;\n}\n\ninterface PayloadFrame {\n filename?: string;\n absPath?: string;\n function?: string;\n lineno?: number;\n colno?: number;\n inApp?: boolean;\n platform?: string;\n debugId?: string;\n}\n\nexport interface ErrorIngestPayload {\n exceptionClass: string;\n message: string;\n stackTrace?: string[];\n frames?: PayloadFrame[];\n platform?: string;\n sdkName?: string;\n sdkVersion?: string;\n dist?: string;\n level: string;\n environment?: string;\n release?: string;\n sessionId?: string;\n user?: { id?: string; email?: string };\n metadata?: Record<string, unknown>;\n breadcrumbs?: Breadcrumb[];\n requestContext?: { method?: string; path?: string; host?: string; userAgent?: string };\n fingerprint?: string[];\n}\n\nfunction frameToString(f: PayloadFrame): string {\n const fn = f.function && f.function.length > 0 ? f.function : '<anonymous>';\n const file = f.filename || f.absPath || '<anonymous>';\n return ` at ${fn} (${file}:${f.lineno ?? 0}:${f.colno ?? 0})`;\n}\n\nfunction generateId(): string {\n const hex = (n: number) => Math.floor(Math.random() * n).toString(16).padStart(1, '0');\n const seg = (len: number) => Array.from({ length: len }, () => hex(16)).join('');\n return `${seg(8)}-${seg(4)}-4${seg(3)}-${(8 + Math.floor(Math.random() * 4)).toString(16)}${seg(3)}-${seg(12)}`;\n}\n\nfunction browserRequestContext(): ErrorIngestPayload['requestContext'] {\n if (typeof window === 'undefined' || typeof location === 'undefined') return undefined;\n return {\n method: 'GET',\n path: location.pathname || '/',\n host: location.host || '',\n userAgent: typeof navigator !== 'undefined' ? navigator.userAgent : undefined,\n };\n}\n\nexport class AllStakClient {\n private transport: HttpTransport;\n private config: AllStakConfig;\n private sessionId: string;\n private breadcrumbs: Breadcrumb[] = [];\n private maxBreadcrumbs: number;\n private scopeStack: Scope[] = [];\n private tracing: TracingModule;\n private replay: ReplayRecorder | null = null;\n private httpRequests: HttpRequestModule | null = null;\n private _instrumentAxios: ((axios: any) => any) | null = null;\n private onErrorHandler: ((ev: ErrorEvent) => void) | null = null;\n private onRejectionHandler: ((ev: PromiseRejectionEvent) => void) | null = null;\n private webVitals: WebVitalsHandle | null = null;\n\n constructor(config: AllStakConfig) {\n if (!config.apiKey) throw new Error('AllStak: config.apiKey is required');\n this.config = { ...config };\n if (!this.config.environment) this.config.environment = 'production';\n if (!this.config.sdkName) this.config.sdkName = SDK_NAME;\n if (!this.config.sdkVersion) this.config.sdkVersion = SDK_VERSION;\n if (!this.config.platform) this.config.platform = 'browser';\n this.sessionId = generateId();\n this.maxBreadcrumbs = config.maxBreadcrumbs ?? DEFAULT_MAX_BREADCRUMBS;\n const baseUrl = (config.host ?? INGEST_HOST).replace(/\\/$/, '');\n this.transport = new HttpTransport(baseUrl, config.apiKey);\n this.tracing = new TracingModule(this.transport, {\n service: config.service ?? config.release ?? '',\n environment: this.config.environment ?? 'production',\n tracesSampleRate: config.tracesSampleRate,\n });\n\n if (config.autoCaptureBrowserErrors !== false && typeof window !== 'undefined') {\n this.installBrowserHandlers();\n }\n // Route auto-breadcrumbs through the current singleton so that\n // re-init (which destroys this instance) doesn't leave the wrappers\n // dispatching into a dead client.\n if (config.autoBreadcrumbsFetch !== false) {\n try { instrumentFetch(safeAddBreadcrumb, baseUrl); }\n catch { /* ignore — never break init */ }\n }\n if (config.autoBreadcrumbsConsole !== false) {\n try { instrumentConsole(safeAddBreadcrumb, config.captureConsole); }\n catch { /* ignore */ }\n }\n if (config.autoBreadcrumbsNavigation !== false) {\n try { instrumentBrowserNavigation(safeAddBreadcrumb); }\n catch { /* ignore */ }\n }\n if (config.autoWebVitals !== false) {\n try {\n const send = (m: { name: string; value: number; id?: string }) => {\n this.transport.send(LOGS_PATH, {\n timestamp: new Date().toISOString(),\n level: 'info',\n message: `web-vital:${m.name}=${m.value.toFixed(2)}`,\n sessionId: this.sessionId,\n environment: this.config.environment,\n release: this.config.release,\n platform: this.config.platform,\n sdkName: this.config.sdkName,\n sdkVersion: this.config.sdkVersion,\n metadata: {\n category: 'web-vital',\n name: m.name,\n value: m.value,\n ...(m.id ? { id: m.id } : {}),\n ...this.releaseTags(),\n },\n });\n };\n this.webVitals = startWebVitals(send);\n } catch { /* never break init */ }\n }\n if (config.replay && (config.replay.enabled ?? true)) {\n try {\n this.replay = new ReplayRecorder(this.transport, this.sessionId, safeAddBreadcrumb, config.replay);\n this.replay.start();\n } catch { /* never break init */ }\n }\n if (config.enableHttpTracking) {\n try {\n this.httpRequests = new HttpRequestModule(this.transport);\n this.httpRequests.setDefaults({\n environment: this.config.environment,\n release: this.config.release,\n dist: this.config.dist,\n platform: this.config.platform,\n sdkName: this.config.sdkName,\n sdkVersion: this.config.sdkVersion,\n });\n const { instrumentAxios } = installHttpInstrumentation(\n this.httpRequests,\n config.httpTracking ?? {},\n baseUrl,\n );\n this._instrumentAxios = instrumentAxios;\n } catch { /* never break init */ }\n }\n }\n\n /** Manually instrument an axios instance. No-op when HTTP tracking is off. */\n instrumentAxios<T = any>(axios: T): T {\n if (!this._instrumentAxios) return axios;\n return this._instrumentAxios(axios) as T;\n }\n\n /** Snapshot of recent failed HTTP requests for error-linking. */\n getRecentFailedHttp() {\n return this.httpRequests?.getRecentFailed() ?? [];\n }\n\n captureException(error: Error, context?: Record<string, unknown>): void {\n if (!this.passesSampleRate()) return;\n const frames = parseStack(error.stack).map((f) => ({\n ...f,\n platform: this.config.platform,\n debugId: resolveDebugId(f.filename),\n }));\n const stackTrace = frames.length > 0 ? frames.map(frameToString) : undefined;\n const currentBreadcrumbs = this.breadcrumbs.length > 0 ? [...this.breadcrumbs] : undefined;\n this.breadcrumbs = [];\n\n // Prefer an explicit `error.name` override; fall back to constructor\n // name then to 'Error'. `new Error()` always has constructor.name ===\n // 'Error', so an explicit name set after construction would otherwise\n // be silently dropped.\n const exceptionClass =\n (error.name && error.name !== 'Error' ? error.name : undefined) ||\n error.constructor?.name ||\n 'Error';\n const eff = this.effective();\n const traceContext: Record<string, unknown> = {};\n const traceId = this.tracing.getTraceId();\n if (traceId) traceContext.traceId = traceId;\n const spanId = this.tracing.getCurrentSpanId();\n if (spanId) traceContext.spanId = spanId;\n const recentFailed = this.httpRequests?.getRecentFailed() ?? [];\n if (recentFailed.length > 0) {\n traceContext['http.recentFailed'] = recentFailed.map((r) => ({\n method: r.method, url: r.url, statusCode: r.statusCode,\n durationMs: r.durationMs, error: r.error,\n }));\n }\n\n const payload: ErrorIngestPayload = {\n exceptionClass,\n message: error.message,\n stackTrace,\n frames: frames.length > 0 ? frames : undefined,\n platform: this.config.platform,\n sdkName: this.config.sdkName,\n sdkVersion: this.config.sdkVersion,\n dist: this.config.dist,\n level: eff.level ?? 'error',\n environment: this.config.environment,\n release: this.config.release,\n sessionId: this.sessionId,\n user: eff.user,\n metadata: { ...this.buildMetadata(context), ...traceContext },\n breadcrumbs: currentBreadcrumbs,\n requestContext: browserRequestContext(),\n fingerprint: eff.fingerprint,\n };\n this.sendThroughBeforeSend(payload);\n }\n\n /** Start a new span — auto-parented to any currently-active span. */\n startSpan(operation: string, options?: { description?: string; tags?: Record<string, string> }): Span {\n return this.tracing.startSpan(operation, options);\n }\n /** Get (and lazily create) the active trace ID. */\n getTraceId(): string { return this.tracing.getTraceId(); }\n /** Override the active trace ID, e.g. from an inbound request header. */\n setTraceId(traceId: string): void { this.tracing.setTraceId(traceId); }\n /** ID of the currently-active span, or null. */\n getCurrentSpanId(): string | null { return this.tracing.getCurrentSpanId(); }\n /** Reset the trace ID and the active span stack. */\n resetTrace(): void { this.tracing.resetTrace(); }\n\n captureMessage(\n message: string,\n level: 'fatal' | 'error' | 'warning' | 'info' = 'info',\n options: { as?: 'log' | 'error' | 'both' } = {},\n ): void {\n const as = options.as ?? (level === 'fatal' || level === 'error' ? 'both' : 'log');\n if (as === 'log' || as === 'both') {\n this.sendLog(level === 'warning' ? 'warn' : level, message);\n }\n if (as === 'error' || as === 'both') {\n if (!this.passesSampleRate()) return;\n const eff = this.effective();\n const payload: ErrorIngestPayload = {\n exceptionClass: 'Message',\n message,\n platform: this.config.platform,\n sdkName: this.config.sdkName,\n sdkVersion: this.config.sdkVersion,\n dist: this.config.dist,\n level,\n environment: this.config.environment,\n release: this.config.release,\n sessionId: this.sessionId,\n user: eff.user,\n metadata: this.buildMetadata(),\n requestContext: browserRequestContext(),\n fingerprint: eff.fingerprint,\n };\n this.sendThroughBeforeSend(payload);\n }\n }\n\n addBreadcrumb(type: string, message: string, level?: string, data?: Record<string, unknown>): void {\n const crumb: Breadcrumb = {\n timestamp: new Date().toISOString(),\n type: VALID_BREADCRUMB_TYPES.has(type) ? type : 'default',\n message,\n level: level && VALID_BREADCRUMB_LEVELS.has(level) ? level : 'info',\n ...(data ? { data } : {}),\n };\n if (this.breadcrumbs.length >= this.maxBreadcrumbs) this.breadcrumbs.shift();\n this.breadcrumbs.push(crumb);\n }\n\n clearBreadcrumbs(): void { this.breadcrumbs = []; }\n setUser(user: { id?: string; email?: string }): void { this.config.user = user; }\n setTag(key: string, value: string): void {\n if (!this.config.tags) this.config.tags = {};\n this.config.tags[key] = value;\n }\n /** Bulk-set tags. Merges with existing tags. */\n setTags(tags: Record<string, string>): void {\n if (!this.config.tags) this.config.tags = {};\n Object.assign(this.config.tags, tags);\n }\n /** Set a single extra value. */\n setExtra(key: string, value: unknown): void {\n if (!this.config.extras) this.config.extras = {};\n this.config.extras[key] = value;\n }\n /** Bulk-set extras. Merges with existing extras. */\n setExtras(extras: Record<string, unknown>): void {\n if (!this.config.extras) this.config.extras = {};\n Object.assign(this.config.extras, extras);\n }\n /**\n * Attach a named context bag (e.g. `app`, `device`, `runtime`) — appears\n * under `metadata['context.<name>']` on every subsequent event. Pass\n * `null` to remove a previously-set context.\n */\n setContext(name: string, ctx: Record<string, unknown> | null): void {\n if (!this.config.contexts) this.config.contexts = {};\n if (ctx === null) delete this.config.contexts[name];\n else this.config.contexts[name] = ctx;\n }\n /**\n * Wait for the in-flight retry-buffer to drain. Resolves `true` if the\n * buffer empties within `timeoutMs` (default 2000ms), `false` otherwise.\n */\n flush(timeoutMs?: number): Promise<boolean> {\n return this.transport.flush(timeoutMs);\n }\n\n /** Set the default severity level applied to subsequent captures. */\n setLevel(level: 'fatal' | 'error' | 'warning' | 'info' | 'debug'): void {\n this.config.level = level;\n }\n\n /**\n * Set a custom grouping fingerprint applied to subsequent events.\n * Pass `null` or an empty array to clear and revert to default grouping.\n */\n setFingerprint(fingerprint: string[] | null): void {\n this.config.fingerprint = fingerprint && fingerprint.length > 0 ? fingerprint : undefined;\n }\n setIdentity(identity: { sdkName?: string; sdkVersion?: string; platform?: string; dist?: string }): void {\n if (identity.sdkName) this.config.sdkName = identity.sdkName;\n if (identity.sdkVersion) this.config.sdkVersion = identity.sdkVersion;\n if (identity.platform) this.config.platform = identity.platform;\n if (identity.dist) this.config.dist = identity.dist;\n }\n getSessionId(): string { return this.sessionId; }\n getConfig(): AllStakConfig { return this.config; }\n\n destroy(): void {\n if (typeof window !== 'undefined') {\n if (this.onErrorHandler) window.removeEventListener('error', this.onErrorHandler as EventListener);\n if (this.onRejectionHandler) window.removeEventListener('unhandledrejection', this.onRejectionHandler as EventListener);\n }\n this.onErrorHandler = null;\n this.onRejectionHandler = null;\n this.tracing.destroy();\n if (this.replay) { this.replay.destroy(); this.replay = null; }\n if (this.httpRequests) { this.httpRequests.destroy(); this.httpRequests = null; }\n if (this.webVitals) { this.webVitals.destroy(); this.webVitals = null; }\n this._instrumentAxios = null;\n this.breadcrumbs = [];\n }\n\n private installBrowserHandlers(): void {\n this.onErrorHandler = (ev: ErrorEvent) => {\n const err = ev.error instanceof Error ? ev.error : new Error(ev.message || 'Unknown error');\n this.captureException(err, { source: 'window.onerror' });\n };\n this.onRejectionHandler = (ev: PromiseRejectionEvent) => {\n const err = ev.reason instanceof Error ? ev.reason : new Error(String(ev.reason));\n this.captureException(err, { source: 'window.unhandledrejection' });\n };\n window.addEventListener('error', this.onErrorHandler as EventListener);\n window.addEventListener('unhandledrejection', this.onRejectionHandler as EventListener);\n }\n\n private sendLog(level: string, message: string): void {\n this.transport.send(LOGS_PATH, {\n timestamp: new Date().toISOString(),\n level,\n message,\n sessionId: this.sessionId,\n environment: this.config.environment,\n release: this.config.release,\n platform: this.config.platform,\n sdkName: this.config.sdkName,\n sdkVersion: this.config.sdkVersion,\n metadata: { ...this.releaseTags(), ...this.config.tags },\n });\n }\n\n private passesSampleRate(): boolean {\n const r = this.config.sampleRate;\n if (typeof r !== 'number' || r >= 1) return true;\n if (r <= 0) return false;\n return Math.random() < r;\n }\n\n /**\n * Returns the effective config layer = base config + every active scope.\n * Scope-only overrides (set inside `withScope`) flow into the wire\n * payload without leaking out of the callback.\n */\n private effective(): AllStakConfig {\n return mergeScopes(this.config, this.scopeStack);\n }\n\n private buildMetadata(perCallContext?: Record<string, unknown>): Record<string, unknown> {\n const eff = this.effective();\n const out: Record<string, unknown> = {\n ...this.releaseTags(),\n ...eff.tags,\n ...(eff.extras ?? {}),\n ...(perCallContext ?? {}),\n };\n if (eff.contexts) {\n for (const [name, ctx] of Object.entries(eff.contexts)) {\n out[`context.${name}`] = ctx;\n }\n }\n return out;\n }\n\n /**\n * Run `callback` with a fresh, temporary {@link Scope} that isolates\n * any user/tag/extra/context/fingerprint/level it sets. The scope is\n * popped automatically when the callback returns or throws — including\n * for `Promise`-returning callbacks (the pop runs in `.finally`).\n *\n * Use this on the server (SSR / RSC / API route handlers) to attach\n * per-request user/tags without leaking that data into another request\n * being processed concurrently.\n */\n withScope<T>(callback: (scope: Scope) => T): T {\n const scope = new Scope();\n this.scopeStack.push(scope);\n let popped = false;\n const pop = () => { if (!popped) { popped = true; this.scopeStack.pop(); } };\n try {\n const result = callback(scope);\n if (result && typeof (result as any).then === 'function') {\n return (result as any).then(\n (v: any) => { pop(); return v; },\n (e: any) => { pop(); throw e; },\n );\n }\n pop();\n return result;\n } catch (err) {\n pop();\n throw err;\n }\n }\n\n /** Direct access to the topmost active scope, or null. @internal */\n getCurrentScope(): Scope | null {\n return this.scopeStack[this.scopeStack.length - 1] ?? null;\n }\n\n private async sendThroughBeforeSend(payload: ErrorIngestPayload): Promise<void> {\n let final: ErrorIngestPayload | null | undefined = payload;\n if (this.config.beforeSend) {\n try { final = await this.config.beforeSend(payload); }\n catch { final = payload; /* never let a buggy hook drop telemetry */ }\n }\n if (!final) return; // explicit drop\n this.transport.send(ERRORS_PATH, final);\n }\n\n private releaseTags(): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n if (this.config.sdkName) out['sdk.name'] = this.config.sdkName;\n if (this.config.sdkVersion) out['sdk.version'] = this.config.sdkVersion;\n if (this.config.platform) out['platform'] = this.config.platform;\n if (this.config.dist) out['dist'] = this.config.dist;\n if (this.config.commitSha) out['commit.sha'] = this.config.commitSha;\n if (this.config.branch) out['commit.branch'] = this.config.branch;\n return out;\n }\n}\n\nlet instance: AllStakClient | null = null;\nfunction ensureInit(): AllStakClient {\n if (!instance) throw new Error('AllStak.init() must be called before using the SDK');\n return instance;\n}\n\n/**\n * Module-level breadcrumb forwarder used by the auto-instrumentation\n * wrappers so they always target the current `instance` (after re-init)\n * and silently no-op when there is none.\n */\nfunction safeAddBreadcrumb(\n type: string,\n message: string,\n level?: string,\n data?: Record<string, unknown>,\n): void {\n try { instance?.addBreadcrumb(type, message, level, data); }\n catch { /* never break host */ }\n}\n\n// Wire the navigation module's default-forwarder so router helpers\n// dispatch into the active singleton without an extra import dance.\n__setDefaultBreadcrumbForwarder(safeAddBreadcrumb);\n\nexport const AllStak = {\n init(config: AllStakConfig): AllStakClient {\n if (instance) instance.destroy();\n instance = new AllStakClient(config);\n return instance;\n },\n captureException(error: Error, context?: Record<string, unknown>): void {\n ensureInit().captureException(error, context);\n },\n captureMessage(\n message: string,\n level: 'fatal' | 'error' | 'warning' | 'info' = 'info',\n options?: { as?: 'log' | 'error' | 'both' },\n ): void {\n ensureInit().captureMessage(message, level, options);\n },\n addBreadcrumb(type: string, message: string, level?: string, data?: Record<string, unknown>): void {\n ensureInit().addBreadcrumb(type, message, level, data);\n },\n clearBreadcrumbs(): void { ensureInit().clearBreadcrumbs(); },\n setUser(user: { id?: string; email?: string }): void { ensureInit().setUser(user); },\n setTag(key: string, value: string): void { ensureInit().setTag(key, value); },\n setTags(tags: Record<string, string>): void { ensureInit().setTags(tags); },\n setExtra(key: string, value: unknown): void { ensureInit().setExtra(key, value); },\n setExtras(extras: Record<string, unknown>): void { ensureInit().setExtras(extras); },\n setContext(name: string, ctx: Record<string, unknown> | null): void { ensureInit().setContext(name, ctx); },\n setLevel(level: 'fatal' | 'error' | 'warning' | 'info' | 'debug'): void { ensureInit().setLevel(level); },\n setFingerprint(fingerprint: string[] | null): void { ensureInit().setFingerprint(fingerprint); },\n flush(timeoutMs?: number): Promise<boolean> { return ensureInit().flush(timeoutMs); },\n setIdentity(identity: { sdkName?: string; sdkVersion?: string; platform?: string; dist?: string }): void {\n ensureInit().setIdentity(identity);\n },\n /**\n * Run `callback` with a fresh, temporary {@link Scope}. Any user/tag/\n * extra/context/fingerprint/level set on the scope is visible only inside\n * the callback. Pop is automatic (sync, async, throwing).\n */\n withScope<T>(callback: (scope: Scope) => T): T { return ensureInit().withScope(callback); },\n startSpan(operation: string, options?: { description?: string; tags?: Record<string, string> }): Span {\n return ensureInit().startSpan(operation, options);\n },\n getTraceId(): string { return ensureInit().getTraceId(); },\n setTraceId(traceId: string): void { ensureInit().setTraceId(traceId); },\n getCurrentSpanId(): string | null { return ensureInit().getCurrentSpanId(); },\n resetTrace(): void { ensureInit().resetTrace(); },\n /** Manually instrument an axios instance. No-op when HTTP tracking is off. */\n instrumentAxios<T = any>(axios: T): T { return ensureInit().instrumentAxios(axios); },\n getSessionId(): string { return ensureInit().getSessionId(); },\n getConfig(): AllStakConfig | null { return instance?.getConfig() ?? null; },\n destroy(): void { instance?.destroy(); instance = null; },\n /** @internal */ _getInstance(): AllStakClient | null { return instance; },\n};\n","import * as React from 'react';\nimport { AllStak, AllStakClient } from './client';\nimport type { AllStakConfig } from './client';\n\nexport interface AllStakProviderProps {\n children: React.ReactNode;\n apiKey: string;\n environment?: string;\n release?: string;\n host?: string;\n user?: { id?: string; email?: string };\n tags?: Record<string, string>;\n debug?: boolean;\n enableHttpTracking?: boolean;\n httpTracking?: AllStakConfig['httpTracking'];\n /**\n * Per-console-method capture flags. Defaults: warn + error captured,\n * log + info NOT captured (to avoid breadcrumb spam from typical app\n * logging). Set `{ log: true, info: true }` to opt-in.\n */\n captureConsole?: AllStakConfig['captureConsole'];\n sampleRate?: number;\n beforeSend?: AllStakConfig['beforeSend'];\n replay?: AllStakConfig['replay'];\n tracesSampleRate?: number;\n service?: string;\n dist?: string;\n /** Default true. Capture window error + unhandledrejection. */\n autoCaptureBrowserErrors?: boolean;\n /** Default true. Wrap fetch for breadcrumbs. */\n autoBreadcrumbsFetch?: boolean;\n /** Default true. Wrap console for breadcrumbs (per-method via captureConsole). */\n autoBreadcrumbsConsole?: boolean;\n /** Default true. Patch history.pushState/replaceState + popstate listener. */\n autoBreadcrumbsNavigation?: boolean;\n /** Default true. Collect Web Vitals via PerformanceObserver. */\n autoWebVitals?: boolean;\n /**\n * Tear down the SDK when the provider unmounts. Default `false`.\n *\n * Most apps mount `AllStakProvider` once at the root and never unmount\n * it. Setting this to `true` risks disabling telemetry if the provider\n * re-mounts (Fast Refresh in dev, route key changes, React 18 Strict\n * Mode double-mount, etc.) — there is a brief window between unmount\n * and remount where captures throw.\n *\n * Leave at the default unless you genuinely need to dispose the SDK.\n */\n destroyOnUnmount?: boolean;\n fallback?:\n | React.ReactNode\n | ((props: { error: Error; resetError: () => void }) => React.ReactNode);\n onError?: (error: Error, componentStack?: string) => void;\n}\n\ninterface ErrorBoundaryState {\n error: Error | null;\n}\n\nconst AllStakContext = React.createContext<AllStakClient | null>(null);\n\n// Module-level guard so re-mounts of <AllStakProvider> reuse the existing\n// singleton instead of destroying + re-creating it (which would briefly\n// break captureException calls and clear breadcrumbs).\nlet __providerOwnedInstance: AllStakClient | null = null;\n\nclass AllStakErrorBoundaryInner extends React.Component<\n {\n children: React.ReactNode;\n fallback?: AllStakProviderProps['fallback'];\n onError?: AllStakProviderProps['onError'];\n debug?: boolean;\n },\n ErrorBoundaryState\n> {\n state: ErrorBoundaryState = { error: null };\n\n static getDerivedStateFromError(error: Error): ErrorBoundaryState {\n return { error };\n }\n\n componentDidCatch(error: Error, info: React.ErrorInfo): void {\n try {\n AllStak.addBreadcrumb('ui', 'React error boundary caught error', 'error', {\n componentStack: info.componentStack ?? '',\n });\n AllStak.captureException(error, {\n componentStack: info.componentStack ?? '',\n source: 'AllStakProvider.ErrorBoundary',\n });\n if (this.props.debug) {\n // eslint-disable-next-line no-console\n console.log(`[AllStak] Captured render error: ${error.message}`);\n }\n } catch { /* never break the host app */ }\n try { this.props.onError?.(error, info.componentStack ?? undefined); }\n catch { /* ignore */ }\n }\n\n private resetError = () => this.setState({ error: null });\n\n render(): React.ReactNode {\n if (this.state.error) {\n const { fallback } = this.props;\n if (typeof fallback === 'function') {\n return fallback({ error: this.state.error, resetError: this.resetError });\n }\n if (fallback !== undefined) return fallback;\n return null;\n }\n return this.props.children;\n }\n}\n\nexport function AllStakProvider({\n children,\n apiKey,\n environment,\n release,\n host,\n user,\n tags,\n debug,\n enableHttpTracking,\n httpTracking,\n captureConsole,\n sampleRate,\n beforeSend,\n replay,\n tracesSampleRate,\n service,\n dist,\n autoCaptureBrowserErrors,\n autoBreadcrumbsFetch,\n autoBreadcrumbsConsole,\n autoBreadcrumbsNavigation,\n autoWebVitals,\n destroyOnUnmount = false,\n fallback,\n onError,\n}: AllStakProviderProps): React.ReactElement {\n const clientRef = React.useRef<AllStakClient | null>(null);\n\n if (!clientRef.current) {\n // If a previous provider mount left an instance live, reuse it.\n // Covers React 18 Strict Mode double-mount and Fast Refresh.\n const existing = AllStak._getInstance();\n if (existing && __providerOwnedInstance === existing) {\n clientRef.current = existing;\n if (debug) {\n // eslint-disable-next-line no-console\n console.log(`[AllStak] Reusing session ${AllStak.getSessionId()}`);\n }\n } else {\n const config: AllStakConfig = {\n apiKey,\n environment,\n release,\n host,\n user,\n tags,\n enableHttpTracking,\n httpTracking,\n captureConsole,\n sampleRate,\n beforeSend,\n replay,\n tracesSampleRate,\n service,\n dist,\n autoCaptureBrowserErrors,\n autoBreadcrumbsFetch,\n autoBreadcrumbsConsole,\n autoBreadcrumbsNavigation,\n autoWebVitals,\n };\n clientRef.current = AllStak.init(config);\n __providerOwnedInstance = clientRef.current;\n\n if (debug) {\n // eslint-disable-next-line no-console\n console.log(`[AllStak] Initialized — session ${AllStak.getSessionId()}`);\n if (autoBreadcrumbsNavigation !== false) {\n // eslint-disable-next-line no-console\n console.log('[AllStak] Navigation auto-instrumentation enabled');\n } else {\n // eslint-disable-next-line no-console\n console.log('[AllStak] Navigation auto-instrumentation not applied; use manual fallback');\n }\n }\n }\n }\n\n React.useEffect(() => {\n return () => {\n if (destroyOnUnmount) {\n AllStak.destroy();\n __providerOwnedInstance = null;\n clientRef.current = null;\n if (debug) {\n // eslint-disable-next-line no-console\n console.log('[AllStak] Destroyed on unmount');\n }\n }\n };\n }, [destroyOnUnmount, debug]);\n\n return (\n <AllStakContext.Provider value={clientRef.current}>\n <AllStakErrorBoundaryInner fallback={fallback} onError={onError} debug={debug}>\n {children}\n </AllStakErrorBoundaryInner>\n </AllStakContext.Provider>\n );\n}\n\n/**\n * Convenience hook — exposes the most common capture/context APIs with\n * a stable identity so components don't have to import the namespace.\n */\nexport function useAllStak() {\n return React.useMemo(\n () => ({\n captureException: (error: Error, ctx?: Record<string, unknown>) =>\n AllStak.captureException(error, ctx),\n captureMessage: (\n msg: string,\n level: 'fatal' | 'error' | 'warning' | 'info' = 'info',\n ) => AllStak.captureMessage(msg, level),\n setUser: (user: { id?: string; email?: string }) => AllStak.setUser(user),\n setTag: (key: string, value: string) => AllStak.setTag(key, value),\n setContext: (name: string, ctx: Record<string, unknown> | null) =>\n AllStak.setContext(name, ctx),\n addBreadcrumb: (\n type: string,\n message: string,\n level?: string,\n data?: Record<string, unknown>,\n ) => AllStak.addBreadcrumb(type, message, level, data),\n flush: (timeoutMs?: number) => AllStak.flush(timeoutMs),\n }),\n [],\n );\n}\n\n/** @internal — for tests. Resets the module-level remount-guard. */\nexport function __resetProviderInstanceForTest(): void {\n __providerOwnedInstance = null;\n}\n"],"mappings":"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","names":["React","isOwnIngest","location","FLUSH_INTERVAL_MS","FLAG","id","FLUSH_INTERVAL_MS","BATCH_SIZE_THRESHOLD","FETCH_FLAG","module","FLAG","Component"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/transport.ts","../src/stack.ts","../src/auto-breadcrumbs.ts","../src/navigation.ts","../src/scope.ts","../src/tracing.ts","../src/replay.ts","../src/debug-id.ts","../src/http-requests.ts","../src/http-redact.ts","../src/http-instrumentation.ts","../src/web-vitals.ts","../src/client.ts","../src/provider.tsx"],"sourcesContent":["/**\n * @allstak/react — standalone React SDK.\n *\n * Self-contained: no @allstak/js or @allstak-io/* dependencies. Ships its own\n * AllStak client (init/capture/breadcrumbs/transport) plus React-specific\n * helpers (Provider, ErrorBoundary, useAllStak hook, withAllStakProfiler HOC).\n *\n * Recommended usage (one-liner):\n *\n * import { AllStakProvider } from '@allstak/react';\n *\n * export function App() {\n * return (\n * <AllStakProvider apiKey=\"ask_live_...\" environment=\"production\" debug>\n * <AppRoot />\n * </AllStakProvider>\n * );\n * }\n *\n * Advanced / manual usage:\n *\n * import { AllStak } from '@allstak/react';\n * AllStak.init({ apiKey, environment, release });\n * <AllStakErrorBoundary>...</AllStakErrorBoundary>\n * const { captureException } = useAllStak();\n */\n\nimport * as React from 'react';\nimport { AllStak } from './client';\n\n// ── Primary API: AllStakProvider (recommended) ──────────────────\nexport {\n AllStakProvider,\n useAllStak,\n __resetProviderInstanceForTest,\n} from './provider';\nexport type { AllStakProviderProps } from './provider';\n\n// ── Core client + manual setup ──────────────────────────────────\nexport { AllStak } from './client';\nexport type { AllStakConfig, Breadcrumb } from './client';\nexport { AllStakClient, INGEST_HOST, SDK_NAME, SDK_VERSION, Scope } from './client';\n\n// ── Navigation helpers ──────────────────────────────────────────\nexport { instrumentBrowserNavigation, instrumentReactRouter, instrumentNextRouter } from './navigation';\n\n// ── Auto-breadcrumb helpers ─────────────────────────────────────\nexport { instrumentFetch, instrumentConsole, __resetConsoleInstrumentationFlagForTest } from './auto-breadcrumbs';\nexport type { ConsoleCaptureOptions } from './auto-breadcrumbs';\n\n// ── Web Vitals ──────────────────────────────────────────────────\nexport { startWebVitals, __resetWebVitalsFlagForTest } from './web-vitals';\nexport type { WebVitalsHandle } from './web-vitals';\n\n// ── Replay surrogate ────────────────────────────────────────────\nexport { ReplayRecorder } from './replay';\nexport type { ReplayOptions } from './replay';\n\n// ── HTTP tracking ───────────────────────────────────────────────\nexport type { HttpTrackingOptions } from './http-redact';\nexport { HttpRequestModule } from './http-requests';\nexport type { HttpRequestEvent } from './http-requests';\n\n// ── ErrorBoundary (legacy standalone — provider's boundary is preferred) ──\n\nexport interface AllStakErrorBoundaryProps {\n children: React.ReactNode;\n fallback?:\n | React.ReactNode\n | ((props: { error: Error; reset: () => void }) => React.ReactNode);\n /** Extra tags attached only to errors captured by this boundary. */\n tags?: Record<string, string>;\n /** Called after the error has been captured. */\n onError?: (error: Error, info: React.ErrorInfo) => void;\n}\n\ninterface AllStakErrorBoundaryState {\n error: Error | null;\n}\n\nexport class AllStakErrorBoundary extends React.Component<\n AllStakErrorBoundaryProps,\n AllStakErrorBoundaryState\n> {\n state: AllStakErrorBoundaryState = { error: null };\n\n static getDerivedStateFromError(error: Error): AllStakErrorBoundaryState {\n return { error };\n }\n\n componentDidCatch(error: Error, info: React.ErrorInfo): void {\n try {\n AllStak.addBreadcrumb('ui', 'React error boundary caught error', 'error', {\n componentStack: info.componentStack ?? '',\n });\n const context: Record<string, unknown> = {\n componentStack: info.componentStack ?? '',\n source: 'react-error-boundary',\n };\n if (this.props.tags) {\n for (const [k, v] of Object.entries(this.props.tags)) {\n context[`tag.${k}`] = v;\n }\n }\n AllStak.captureException(error, context);\n } catch { /* never break the host app */ }\n try { this.props.onError?.(error, info); } catch { /* ignore */ }\n }\n\n private reset = () => this.setState({ error: null });\n\n render(): React.ReactNode {\n if (this.state.error) {\n const { fallback } = this.props;\n if (typeof fallback === 'function') {\n return fallback({ error: this.state.error, reset: this.reset });\n }\n if (fallback !== undefined) return fallback;\n return null;\n }\n return this.props.children;\n }\n}\n\n/**\n * HOC: drops a navigation breadcrumb when a component mounts. Useful\n * for marking screen boundaries without a router.\n */\nexport function withAllStakProfiler<P extends object>(\n Component: React.ComponentType<P>,\n name?: string,\n): React.FC<P> {\n const displayName =\n name ?? Component.displayName ?? Component.name ?? 'AnonymousComponent';\n const Wrapped: React.FC<P> = (props) => {\n React.useEffect(() => {\n AllStak.addBreadcrumb('navigation', `Mounted <${displayName}>`, 'info');\n }, []);\n return React.createElement(Component, props);\n };\n Wrapped.displayName = `withAllStakProfiler(${displayName})`;\n return Wrapped;\n}\n","/**\n * Fail-open HTTP transport for browser/React. Telemetry sends are best-effort:\n * they use a short timeout, never reject into the host app, and fall into a\n * bounded in-memory ring buffer with circuit-breaker backoff when AllStak is\n * unavailable.\n *\n * No window, no AbortController fallback shims — RN exposes both natively.\n */\n\nconst REQUEST_TIMEOUT = 2000;\nconst MAX_BUFFER = 100;\nconst FAILURE_THRESHOLD = 3;\nconst BACKOFF_BASE_MS = 500;\nconst BACKOFF_MAX_MS = 30_000;\n\ninterface Pending {\n path: string;\n payload: unknown;\n}\n\nexport class HttpTransport {\n private buffer: Pending[] = [];\n private flushing = false;\n private consecutiveFailures = 0;\n private circuitOpenUntil = 0;\n\n constructor(\n private baseUrl: string,\n private apiKey: string,\n ) {}\n\n send(path: string, payload: unknown): Promise<void> {\n this.enqueueOrDispatch({ path, payload });\n return Promise.resolve();\n }\n\n private enqueueOrDispatch(item: Pending): void {\n if (Date.now() < this.circuitOpenUntil) {\n this.push(item);\n return;\n }\n void this.dispatch(item).catch(() => undefined);\n }\n\n private async dispatch(item: Pending): Promise<void> {\n try {\n await this.doFetch(item.path, item.payload);\n this.consecutiveFailures = 0;\n this.circuitOpenUntil = 0;\n this.scheduleFlush();\n } catch (err) {\n this.recordFailure(err);\n this.push(item);\n }\n }\n\n private async doFetch(path: string, payload: unknown): Promise<void> {\n const url = `${this.baseUrl}${path}`;\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), REQUEST_TIMEOUT);\n try {\n const res = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-AllStak-Key': this.apiKey,\n },\n body: JSON.stringify(payload),\n signal: controller.signal,\n });\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n private push(item: Pending): void {\n if (this.buffer.length >= MAX_BUFFER) this.buffer.shift();\n this.buffer.push(item);\n }\n\n private scheduleFlush(): void {\n if (this.flushing || this.buffer.length === 0) return;\n const delay = Math.max(0, this.circuitOpenUntil - Date.now());\n const timer = setTimeout(() => {\n void this.flushBuffer().catch(() => undefined);\n }, delay);\n if (typeof timer === 'object' && typeof timer.unref === 'function') timer.unref();\n }\n\n private async flushBuffer(): Promise<void> {\n if (this.flushing || this.buffer.length === 0) return;\n this.flushing = true;\n try {\n const items = this.buffer.splice(0, this.buffer.length);\n for (const item of items) {\n if (Date.now() < this.circuitOpenUntil) {\n this.push(item);\n continue;\n }\n try {\n await this.doFetch(item.path, item.payload);\n this.consecutiveFailures = 0;\n this.circuitOpenUntil = 0;\n } catch (err) {\n this.recordFailure(err);\n this.push(item);\n }\n }\n } finally {\n this.flushing = false;\n if (this.buffer.length > 0) this.scheduleFlush();\n }\n }\n\n private recordFailure(error: unknown): void {\n this.consecutiveFailures++;\n if (this.consecutiveFailures < FAILURE_THRESHOLD) return;\n const retryAfterMs = retryAfterFromError(error);\n const backoff = retryAfterMs ?? jitteredBackoff(this.consecutiveFailures);\n this.circuitOpenUntil = Date.now() + backoff;\n }\n\n getBufferSize(): number {\n return this.buffer.length;\n }\n\n /**\n * Wait for the in-flight retry-buffer to drain. Resolves `true` if the\n * buffer empties within `timeoutMs` (default 2000ms), `false` otherwise.\n * Useful at process exit / before navigation away.\n */\n async flush(timeoutMs = 2000): Promise<boolean> {\n const deadline = Date.now() + timeoutMs;\n await this.flushBuffer();\n while (this.buffer.length > 0 || this.flushing) {\n if (Date.now() >= deadline) return false;\n await new Promise((r) => setTimeout(r, 25));\n await this.flushBuffer();\n }\n return true;\n }\n}\n\nfunction jitteredBackoff(failures: number): number {\n const exp = Math.min(BACKOFF_MAX_MS, BACKOFF_BASE_MS * 2 ** Math.min(8, failures - FAILURE_THRESHOLD));\n return Math.floor(exp / 2 + Math.random() * (exp / 2));\n}\n\nfunction retryAfterFromError(error: unknown): number | null {\n const message = error instanceof Error ? error.message : '';\n return /HTTP\\s+(429|503)/.test(message) ? BACKOFF_MAX_MS : null;\n}\n","/**\n * Engine-agnostic Error.stack parser. Handles V8 / Hermes (\"at fn (file:l:c)\")\n * and Gecko / JSC (\"fn@file:l:c\"). Output mirrors the backend\n * ErrorIngestRequest.Frame shape so the dashboard can render frames directly.\n */\n\nexport interface StackFrame {\n filename?: string;\n absPath?: string;\n function?: string;\n lineno?: number;\n colno?: number;\n inApp?: boolean;\n platform?: string;\n}\n\nconst V8_FRAME_RE = /^\\s*at\\s+(?:(.+?)\\s+\\()?((?:.+?):(\\d+):(\\d+))\\)?\\s*$/;\nconst GECKO_FRAME_RE = /^\\s*(?:(.*?)@)?(.+?):(\\d+):(\\d+)\\s*$/;\nconst NODE_INTERNAL_RE = /^(node:|internal\\/|node_modules\\/)/;\n\nexport function parseStack(stack: string | undefined | null): StackFrame[] {\n if (!stack || typeof stack !== 'string') return [];\n const frames: StackFrame[] = [];\n\n for (const raw of stack.split('\\n')) {\n const line = raw.trim();\n if (!line) continue;\n\n let m = V8_FRAME_RE.exec(line);\n if (m) {\n const filename = stripQueryHash(m[2].replace(/:\\d+:\\d+$/, ''));\n frames.push({\n filename,\n absPath: filename,\n function: m[1] ? m[1].trim() : undefined,\n lineno: parseInt(m[3], 10),\n colno: parseInt(m[4], 10),\n inApp: isInApp(filename),\n });\n continue;\n }\n\n m = GECKO_FRAME_RE.exec(line);\n if (m && m[2]) {\n const filename = stripQueryHash(m[2]);\n frames.push({\n filename,\n absPath: filename,\n function: m[1] ? m[1].trim() : undefined,\n lineno: parseInt(m[3], 10),\n colno: parseInt(m[4], 10),\n inApp: isInApp(filename),\n });\n }\n }\n\n return frames;\n}\n\nfunction stripQueryHash(url: string): string {\n const q = url.indexOf('?');\n const h = url.indexOf('#');\n let cut = url.length;\n if (q >= 0) cut = Math.min(cut, q);\n if (h >= 0) cut = Math.min(cut, h);\n return url.slice(0, cut);\n}\n\nfunction isInApp(filename: string | undefined): boolean {\n if (!filename) return true;\n if (NODE_INTERNAL_RE.test(filename)) return false;\n if (filename.includes('/node_modules/')) return false;\n return true;\n}\n","/**\n * Idempotent instrumentation of `globalThis.fetch` and `console.warn/error`\n * to feed breadcrumbs into the AllStak client. Safe to call once at init.\n *\n * - `instrumentFetch`: wraps fetch and records a breadcrumb per request\n * (success and failure). Skips requests targeting the SDK's own ingest\n * host so the wrap never recurses. Preserves the original return type\n * and rethrows fetch errors after the breadcrumb is recorded.\n * - `instrumentConsole`: wraps `console.warn` and `console.error` to\n * record `log`-type breadcrumbs at the corresponding level.\n *\n * Both patches use a flag on the wrapper function so a second call is a\n * no-op — important because hot-module-reload in dev would otherwise\n * stack patches and double-fire breadcrumbs.\n */\n\ntype AddBreadcrumbFn = (\n type: string,\n msg: string,\n level?: string,\n data?: Record<string, unknown>,\n) => void;\n\nconst FETCH_FLAG = '__allstak_fetch_patched__';\nconst CONSOLE_FLAG = '__allstak_console_patched__';\n\nexport function instrumentFetch(\n addBreadcrumb: AddBreadcrumbFn,\n ownBaseUrl?: string,\n): void {\n const g: any = globalThis as any;\n if (typeof g.fetch !== 'function') return;\n if (g.fetch[FETCH_FLAG]) return;\n\n const originalFetch = g.fetch;\n\n const wrapped = async function (this: any, input: any, init?: any) {\n const method = (init?.method || (input && typeof input === 'object' && input.method) || 'GET').toUpperCase();\n let url: string;\n if (typeof input === 'string') url = input;\n else if (input && typeof input.href === 'string') url = input.href;\n else if (input && typeof input.url === 'string') url = input.url;\n else url = String(input);\n\n // Strip query string from the breadcrumb to avoid leaking secrets.\n const safePath = url.split('?')[0];\n const isOwnIngest = !!(ownBaseUrl && url.startsWith(ownBaseUrl));\n\n const start = Date.now();\n try {\n const response = await originalFetch.call(this, input, init);\n const durationMs = Date.now() - start;\n if (!isOwnIngest) {\n addBreadcrumb(\n 'http',\n `${method} ${safePath} -> ${response.status}`,\n response.status >= 400 ? 'error' : 'info',\n { method, url: safePath, statusCode: response.status, durationMs },\n );\n }\n return response;\n } catch (err) {\n const durationMs = Date.now() - start;\n if (!isOwnIngest) {\n addBreadcrumb('http', `${method} ${safePath} -> failed`, 'error', {\n method, url: safePath, error: String(err), durationMs,\n });\n }\n throw err;\n }\n };\n (wrapped as any)[FETCH_FLAG] = true;\n g.fetch = wrapped;\n}\n\n/**\n * Per-console-method capture flags. Defaults: warn + error captured,\n * log + info NOT captured (typical React apps emit thousands of debug\n * lines per session — flooding the dashboard with them creates pure\n * noise, so they're opt-in).\n *\n * <AllStakProvider captureConsole={{ log: true, info: true }} />\n */\nexport interface ConsoleCaptureOptions {\n log?: boolean;\n info?: boolean;\n warn?: boolean;\n error?: boolean;\n}\n\nconst CONSOLE_DEFAULTS: Required<ConsoleCaptureOptions> = {\n log: false,\n info: false,\n warn: true,\n error: true,\n};\n\nconst CONSOLE_METHOD_TO_LEVEL: Record<keyof ConsoleCaptureOptions, string> = {\n log: 'info',\n info: 'info',\n warn: 'warn',\n error: 'error',\n};\n\n/** Max bytes per stringified arg. Anything longer is suffixed with `…[truncated]`. */\nconst MAX_ARG_BYTES = 5000;\n\nexport function instrumentConsole(\n addBreadcrumb: AddBreadcrumbFn,\n options: ConsoleCaptureOptions = {},\n): void {\n if (typeof console === 'undefined') return;\n if ((console as any)[CONSOLE_FLAG]) return;\n\n const opts: Required<ConsoleCaptureOptions> = {\n log: options.log ?? CONSOLE_DEFAULTS.log,\n info: options.info ?? CONSOLE_DEFAULTS.info,\n warn: options.warn ?? CONSOLE_DEFAULTS.warn,\n error: options.error ?? CONSOLE_DEFAULTS.error,\n };\n\n const wrap = (method: keyof ConsoleCaptureOptions): void => {\n const orig = (console as any)[method];\n if (typeof orig !== 'function') return;\n const level = CONSOLE_METHOD_TO_LEVEL[method];\n (console as any)[method] = function (...args: unknown[]) {\n if (opts[method]) {\n try {\n const serialized = args.map(safeStringifyArg);\n const message = truncate(serialized.join(' '));\n addBreadcrumb('log', message, level, {\n category: 'console',\n method,\n args: serialized,\n });\n } catch { /* never break host */ }\n }\n return orig.apply(console, args);\n };\n };\n\n if (opts.log) wrap('log');\n if (opts.info) wrap('info');\n if (opts.warn) wrap('warn');\n if (opts.error) wrap('error');\n\n (console as any)[CONSOLE_FLAG] = true;\n}\n\n/** @internal — for tests. Resets the wrap-once flag. */\nexport function __resetConsoleInstrumentationFlagForTest(): void {\n if (typeof console !== 'undefined') {\n delete (console as any)[CONSOLE_FLAG];\n }\n}\n\n/**\n * Safely stringify a single console arg. Handles primitives, Errors,\n * arrays, plain objects, and circular references. Falls back to\n * Object.prototype.toString.call(v) on any failure.\n */\nfunction safeStringifyArg(v: unknown): string {\n if (v === null || v === undefined) return String(v);\n if (typeof v === 'string') return v;\n if (typeof v === 'number' || typeof v === 'boolean' || typeof v === 'bigint') return String(v);\n if (typeof v === 'symbol') return v.toString();\n if (typeof v === 'function') return `[Function${v.name ? ` ${v.name}` : ''}]`;\n if (v instanceof Error) {\n return `${v.name || 'Error'}: ${v.message}${v.stack ? `\\n${v.stack}` : ''}`;\n }\n if (typeof v === 'object') {\n try {\n const seen = new WeakSet<object>();\n const out = JSON.stringify(v, (_key, val) => {\n if (typeof val === 'object' && val !== null) {\n if (seen.has(val as object)) return '[Circular]';\n seen.add(val as object);\n }\n if (typeof val === 'bigint') return val.toString();\n if (typeof val === 'function') return `[Function${val.name ? ` ${val.name}` : ''}]`;\n if (typeof val === 'symbol') return val.toString();\n return val;\n });\n return out ?? Object.prototype.toString.call(v);\n } catch {\n return Object.prototype.toString.call(v);\n }\n }\n return String(v);\n}\n\nfunction truncate(s: string): string {\n if (s.length <= MAX_ARG_BYTES) return s;\n return s.slice(0, MAX_ARG_BYTES) + '…[truncated]';\n}\n\n","/**\n * Browser navigation breadcrumbs — minimal fallback that doesn't depend on\n * any specific router library. Wraps `history.pushState`/`replaceState` and\n * listens to `popstate` so SPA navigation transitions appear in the\n * breadcrumb feed regardless of which router (React Router, Next, Remix,\n * none) the app uses.\n *\n * Idempotent — calling twice is safe (the wrappers tag themselves).\n *\n * For framework-specific instrumentation (React Router's `useNavigate`,\n * Next's `router.events`), bind manually with `AllStak.addBreadcrumb`.\n */\n\ntype AddBreadcrumbFn = (\n type: string,\n msg: string,\n level?: string,\n data?: Record<string, unknown>,\n) => void;\n\nconst FLAG = '__allstak_history_patched__';\n\nexport function instrumentBrowserNavigation(addBreadcrumb: AddBreadcrumbFn): void {\n if (typeof window === 'undefined' || typeof history === 'undefined') return;\n if ((history as any)[FLAG]) return;\n\n const emit = (from: string, to: string) => {\n if (from === to) return;\n try { addBreadcrumb('navigation', `${from} -> ${to}`, 'info', { from, to }); }\n catch { /* never break host */ }\n };\n\n const origPush = history.pushState.bind(history);\n const origReplace = history.replaceState.bind(history);\n\n history.pushState = function (state: any, unused: string, url?: string | URL | null) {\n const from = location.pathname + location.search;\n const ret = origPush(state, unused, url ?? null);\n emit(from, location.pathname + location.search);\n return ret;\n };\n history.replaceState = function (state: any, unused: string, url?: string | URL | null) {\n const from = location.pathname + location.search;\n const ret = origReplace(state, unused, url ?? null);\n emit(from, location.pathname + location.search);\n return ret;\n };\n\n let last = location.pathname + location.search;\n window.addEventListener('popstate', () => {\n const next = location.pathname + location.search;\n emit(last, next);\n last = next;\n });\n\n (history as any)[FLAG] = true;\n}\n\n/**\n * React Router v6+ helper. Pass a `Location` object whenever the app's\n * top-level `useLocation()` value changes — usually inside a small effect\n * in the route layout. No hard dependency on `react-router-dom`.\n *\n * import { useLocation } from 'react-router-dom';\n * import { instrumentReactRouter } from '@allstak/react';\n * useEffect(() => instrumentReactRouter(useLocation()), [useLocation()]);\n *\n * Each call records a `navigation` breadcrumb if the path differs from\n * the last one we saw. Idempotent on the same path.\n */\nlet lastReactRouterPath: string | undefined;\nexport function instrumentReactRouter(\n location: { pathname: string; search?: string },\n addBreadcrumb: AddBreadcrumbFn = (...args) => __defaultBreadcrumb(...args),\n): void {\n const next = `${location.pathname}${location.search ?? ''}`;\n if (next === lastReactRouterPath) return;\n const from = lastReactRouterPath ?? '<initial>';\n lastReactRouterPath = next;\n try { addBreadcrumb('navigation', `${from} -> ${next}`, 'info', { router: 'react-router', from, to: next }); }\n catch { /* ignore */ }\n}\n\n/**\n * Next.js (Pages router) helper. Hook into `router.events.on('routeChangeComplete', ...)`\n * inside `_app.tsx` and call this with the new URL. No hard dependency on `next`.\n *\n * import Router from 'next/router';\n * import { instrumentNextRouter } from '@allstak/react';\n * Router.events.on('routeChangeComplete', (url) => instrumentNextRouter(url));\n *\n * For the Next.js App Router, instead use `usePathname()` + `useSearchParams()`\n * and call `instrumentReactRouter({ pathname, search })`.\n */\nlet lastNextPath: string | undefined;\nexport function instrumentNextRouter(\n url: string,\n addBreadcrumb: AddBreadcrumbFn = (...args) => __defaultBreadcrumb(...args),\n): void {\n if (url === lastNextPath) return;\n const from = lastNextPath ?? '<initial>';\n lastNextPath = url;\n try { addBreadcrumb('navigation', `${from} -> ${url}`, 'info', { router: 'next', from, to: url }); }\n catch { /* ignore */ }\n}\n\n// Default forwarder — set by the client at init so callers can pass `addBreadcrumb`\n// implicitly. Avoids a circular import on `./client`.\nlet __defaultBreadcrumb: AddBreadcrumbFn = () => {};\nexport function __setDefaultBreadcrumbForwarder(fn: AddBreadcrumbFn): void {\n __defaultBreadcrumb = fn;\n}\n","/**\n * Per-call scoped context isolation.\n *\n * A `Scope` carries the same shape as the top-level config (user, tags,\n * extras, contexts, fingerprint, level) but only applies inside the\n * `withScope` callback that owns it. The client merges the active scope\n * stack on top of the base config when building each event payload, so:\n *\n * - context set inside `withScope` does NOT leak out\n * - nested scopes layer additively (later wins on key conflicts)\n * - throwing or async work in the callback still pops the scope\n *\n * Use this on the server (SSR / RSC / API route handlers) to attach\n * per-request user/tags without leaking that data into another request\n * being processed concurrently.\n */\n\nexport type Severity = 'fatal' | 'error' | 'warning' | 'info' | 'debug';\n\nexport class Scope {\n user?: { id?: string; email?: string };\n tags: Record<string, string> = {};\n extras: Record<string, unknown> = {};\n contexts: Record<string, Record<string, unknown>> = {};\n fingerprint?: string[];\n level?: Severity;\n\n setUser(user: { id?: string; email?: string }): this { this.user = user; return this; }\n setTag(key: string, value: string): this { this.tags[key] = value; return this; }\n setTags(tags: Record<string, string>): this { Object.assign(this.tags, tags); return this; }\n setExtra(key: string, value: unknown): this { this.extras[key] = value; return this; }\n setExtras(extras: Record<string, unknown>): this { Object.assign(this.extras, extras); return this; }\n setContext(name: string, ctx: Record<string, unknown> | null): this {\n if (ctx === null) delete this.contexts[name]; else this.contexts[name] = ctx;\n return this;\n }\n setLevel(level: Severity): this { this.level = level; return this; }\n setFingerprint(fingerprint: string[] | null): this {\n this.fingerprint = fingerprint && fingerprint.length > 0 ? fingerprint : undefined;\n return this;\n }\n clear(): this {\n this.user = undefined;\n this.tags = {};\n this.extras = {};\n this.contexts = {};\n this.fingerprint = undefined;\n this.level = undefined;\n return this;\n }\n}\n\n/**\n * Merge a base config with the active scope stack. Later scopes overwrite\n * earlier ones on key conflicts; tag/extra/context dictionaries are merged\n * key-by-key. Returns a NEW object — does not mutate inputs.\n */\nexport function mergeScopes<T extends {\n user?: { id?: string; email?: string };\n tags?: Record<string, string>;\n extras?: Record<string, unknown>;\n contexts?: Record<string, Record<string, unknown>>;\n fingerprint?: string[];\n level?: Severity;\n}>(base: T, stack: Scope[]): T {\n const out: T = { ...base };\n out.tags = { ...(base.tags ?? {}) };\n out.extras = { ...(base.extras ?? {}) };\n out.contexts = { ...(base.contexts ?? {}) };\n for (const scope of stack) {\n if (scope.user) out.user = scope.user;\n Object.assign(out.tags, scope.tags);\n Object.assign(out.extras, scope.extras);\n Object.assign(out.contexts, scope.contexts);\n if (scope.fingerprint) out.fingerprint = scope.fingerprint;\n if (scope.level) out.level = scope.level;\n }\n return out;\n}\n","/**\n * Lightweight distributed tracing primitives.\n *\n * A `Span` represents a unit of work — `startSpan('http.client', { description: 'GET /api/users' })`\n * returns a Span; call `span.finish()` when the work completes. Spans\n * batch into the transport's `/ingest/v1/spans` channel and ship every 5s\n * (or when 20 spans accumulate).\n *\n * Trace propagation: each span carries a `traceId` (UUID, generated lazily\n * on first call to `getTraceId()`) and a `spanId`. Nested calls to\n * `startSpan()` automatically inherit the active span as their parent.\n *\n * Sampling: `tracesSampleRate` (config) gates whether `startSpan` actually\n * records anything — drops when `Math.random() >= rate`. The returned\n * Span is a no-op shim in that case so call sites don't need to null-check.\n */\n\nimport type { HttpTransport } from './transport';\n\nconst SPAN_INGEST_PATH = '/ingest/v1/spans';\nconst FLUSH_INTERVAL_MS = 5_000;\nconst BATCH_SIZE_THRESHOLD = 20;\n\nexport interface SpanData {\n traceId: string;\n spanId: string;\n parentSpanId: string;\n operation: string;\n description: string;\n status: 'ok' | 'error' | 'timeout';\n durationMs: number;\n startTimeMillis: number;\n endTimeMillis: number;\n service: string;\n environment: string;\n tags: Record<string, string>;\n data: string;\n}\n\nfunction id(): string {\n // Same v4 shape used elsewhere in the SDK — RN doesn't ship\n // crypto.randomUUID reliably across versions.\n const hex = (n: number) => Math.floor(Math.random() * n).toString(16).padStart(1, '0');\n const seg = (len: number) => Array.from({ length: len }, () => hex(16)).join('');\n return `${seg(8)}-${seg(4)}-4${seg(3)}-${(8 + Math.floor(Math.random() * 4)).toString(16)}${seg(3)}-${seg(12)}`;\n}\n\nexport class Span {\n private _finished = false;\n private _startTimeMillis: number;\n private _data = '';\n\n constructor(\n private _traceId: string,\n private _spanId: string,\n private _parentSpanId: string,\n private _operation: string,\n private _description: string,\n private _service: string,\n private _environment: string,\n private _tags: Record<string, string>,\n private _onFinish: (data: SpanData) => void,\n ) {\n this._startTimeMillis = Date.now();\n }\n\n setTag(key: string, value: string): this { this._tags[key] = value; return this; }\n setData(data: string): this { this._data = data; return this; }\n setDescription(description: string): this { this._description = description; return this; }\n\n finish(status: 'ok' | 'error' | 'timeout' = 'ok'): void {\n if (this._finished) return;\n this._finished = true;\n const endTimeMillis = Date.now();\n this._onFinish({\n traceId: this._traceId,\n spanId: this._spanId,\n parentSpanId: this._parentSpanId,\n operation: this._operation,\n description: this._description,\n status,\n durationMs: endTimeMillis - this._startTimeMillis,\n startTimeMillis: this._startTimeMillis,\n endTimeMillis,\n service: this._service,\n environment: this._environment,\n tags: this._tags,\n data: this._data,\n });\n }\n\n get traceId(): string { return this._traceId; }\n get spanId(): string { return this._spanId; }\n get isFinished(): boolean { return this._finished; }\n}\n\n/** A no-op span returned when `tracesSampleRate` drops the trace. */\nclass NoopSpan extends Span {\n constructor(traceId: string, spanId: string) {\n super(traceId, spanId, '', '', '', '', '', {}, () => {});\n }\n finish(): void { /* never enqueues anything */ }\n}\n\ninterface TracingOptions {\n service: string;\n environment: string;\n /** 0..1 — probability to record a span. Default 1. */\n tracesSampleRate?: number;\n}\n\nexport class TracingModule {\n private spans: SpanData[] = [];\n private flushTimer: ReturnType<typeof setInterval> | null = null;\n private currentTraceId: string | null = null;\n private spanStack: Span[] = [];\n private destroyed = false;\n\n constructor(private transport: HttpTransport, private opts: TracingOptions) {\n // Lazy timer — only kick off when the first span finishes, so an app\n // that never traces doesn't pay an interval cost.\n }\n\n /** Get (and lazily create) the active trace ID. */\n getTraceId(): string {\n if (!this.currentTraceId) this.currentTraceId = id();\n return this.currentTraceId;\n }\n\n /** Override the active trace ID, e.g. from an inbound request header. */\n setTraceId(traceId: string): void { this.currentTraceId = traceId; }\n\n /** Get the active span's ID, or null if no span is active. */\n getCurrentSpanId(): string | null {\n return this.spanStack.length > 0 ? this.spanStack[this.spanStack.length - 1].spanId : null;\n }\n\n /** Reset both the trace ID and the in-flight span stack. */\n resetTrace(): void {\n this.currentTraceId = null;\n this.spanStack = [];\n }\n\n /**\n * Start a new span. The returned Span automatically inherits the active\n * span as its parent. If `tracesSampleRate` drops this trace, returns a\n * no-op Span so the call site doesn't have to null-check.\n */\n startSpan(operation: string, options: { description?: string; tags?: Record<string, string> } = {}): Span {\n const traceId = this.getTraceId();\n const spanId = id();\n const parentSpanId = this.getCurrentSpanId() ?? '';\n\n if (!this.passesSampleRate()) {\n // Sampled out — return a no-op so the public API shape is stable.\n return new NoopSpan(traceId, spanId);\n }\n\n const span = new Span(\n traceId, spanId, parentSpanId,\n operation, options.description ?? '',\n this.opts.service ?? '', this.opts.environment ?? '',\n { ...(options.tags ?? {}) },\n (data) => this.enqueue(data, span),\n );\n this.spanStack.push(span);\n return span;\n }\n\n private passesSampleRate(): boolean {\n const r = this.opts.tracesSampleRate;\n if (typeof r !== 'number' || r >= 1) return true;\n if (r <= 0) return false;\n return Math.random() < r;\n }\n\n private enqueue(data: SpanData, span: Span): void {\n if (this.destroyed) return;\n // Pop the finishing span from the stack (if it's the top — usually is,\n // but tolerate out-of-order finishes from misbehaving callers).\n const idx = this.spanStack.lastIndexOf(span);\n if (idx >= 0) this.spanStack.splice(idx, 1);\n\n this.spans.push(data);\n if (this.spans.length >= BATCH_SIZE_THRESHOLD) {\n this.flush();\n return;\n }\n if (!this.flushTimer) {\n this.flushTimer = setInterval(() => this.flush(), FLUSH_INTERVAL_MS);\n }\n }\n\n flush(): void {\n if (this.spans.length === 0) return;\n const batch = this.spans;\n this.spans = [];\n this.transport.send(SPAN_INGEST_PATH, { spans: batch });\n }\n\n destroy(): void {\n this.destroyed = true;\n if (this.flushTimer) { clearInterval(this.flushTimer); this.flushTimer = null; }\n this.flush();\n this.currentTraceId = null;\n this.spanStack = [];\n }\n}\n","/**\n * Lightweight session-replay surrogate for the browser.\n *\n * **Status:** experimental. Captures DOM mutation events as a chronological\n * log so a server-side replay viewer can reconstruct the visible page over\n * time. Privacy-first defaults:\n *\n * - all `<input>`, `<textarea>`, `<select>` values are masked by default\n * - elements with `data-allstak-mask` are entirely replaced with `***`\n * - `[type=\"password\"]` is always masked, even with masking off\n * - `sampleRate` defaults to 0 — replay is OPT-IN per init\n *\n * NOT a drop-in replacement for full DOM-snapshot replay libraries — it\n * does not record initial paint, window resizes, scroll positions, or\n * canvas content. It records:\n *\n * 1. an initial sanitized DOM snapshot at start\n * 2. mutations: childList add/remove + attributes (filtered)\n * 3. user input events with values masked\n * 4. a periodic flush of the buffered log to /ingest/v1/replay\n *\n * Because the wire format is a JSON event log (not a binary blob), payloads\n * are larger than dedicated replay tools — appropriate for low-volume\n * debugging, not for sampling 100% of production traffic.\n */\n\nimport type { HttpTransport } from './transport';\n\ntype AddBreadcrumbFn = (\n type: string,\n msg: string,\n level?: string,\n data?: Record<string, unknown>,\n) => void;\n\nconst REPLAY_INGEST_PATH = '/ingest/v1/replay';\nconst FLUSH_INTERVAL_MS = 10_000;\nconst DEFAULT_MASK_ATTR = 'data-allstak-mask';\n\nexport interface ReplayOptions {\n enabled?: boolean;\n /** Probability per session that replay records. Default 0 (opt-in). */\n sampleRate?: number;\n /** Mask all text inputs / textareas / selects by default. Default true. */\n maskAllInputs?: boolean;\n /** Custom attribute name that flags an element to be masked. Default `data-allstak-mask`. */\n maskAttribute?: string;\n /** Max number of events buffered before forced flush. Default 200. */\n maxBufferedEvents?: number;\n}\n\ninterface ReplayEvent {\n /** UNIX millis when the event was observed. */\n ts: number;\n /** event kind */\n k: 'snap' | 'mut' | 'input' | 'nav';\n /** Free-form JSON-friendly payload. */\n data: Record<string, unknown>;\n}\n\nconst FLAG = '__allstak_replay_started__';\n\nexport class ReplayRecorder {\n private buffer: ReplayEvent[] = [];\n private flushTimer: ReturnType<typeof setInterval> | null = null;\n private observer: MutationObserver | null = null;\n private inputListener: ((ev: Event) => void) | null = null;\n private opts: Required<ReplayOptions>;\n private sessionId: string;\n private destroyed = false;\n\n constructor(\n private transport: HttpTransport,\n sessionId: string,\n private addBreadcrumb: AddBreadcrumbFn,\n options: ReplayOptions = {},\n ) {\n this.sessionId = sessionId;\n this.opts = {\n enabled: options.enabled ?? true,\n sampleRate: options.sampleRate ?? 0,\n maskAllInputs: options.maskAllInputs ?? true,\n maskAttribute: options.maskAttribute ?? DEFAULT_MASK_ATTR,\n maxBufferedEvents: options.maxBufferedEvents ?? 200,\n };\n }\n\n start(): void {\n if (typeof document === 'undefined' || typeof window === 'undefined') return;\n if (!this.opts.enabled) return;\n if (Math.random() >= this.opts.sampleRate) return;\n if ((document as any)[FLAG]) return;\n (document as any)[FLAG] = true;\n\n // Initial sanitized snapshot.\n this.push({\n ts: Date.now(),\n k: 'snap',\n data: { html: this.snapshotBody(), url: location.href },\n });\n\n // DOM mutations.\n this.observer = new MutationObserver((records) => {\n for (const r of records) {\n if (r.type === 'childList') {\n this.push({\n ts: Date.now(),\n k: 'mut',\n data: {\n kind: 'childList',\n target: this.describePath(r.target as Element),\n added: Array.from(r.addedNodes).map((n) => this.describeNode(n)),\n removed: r.removedNodes.length,\n },\n });\n } else if (r.type === 'attributes') {\n this.push({\n ts: Date.now(),\n k: 'mut',\n data: {\n kind: 'attr',\n target: this.describePath(r.target as Element),\n name: r.attributeName,\n value: this.safeAttribute(r.target as Element, r.attributeName ?? ''),\n },\n });\n }\n }\n });\n this.observer.observe(document.body ?? document.documentElement, {\n childList: true, attributes: true, subtree: true,\n });\n\n // User input — values always masked.\n this.inputListener = (ev: Event) => {\n const target = ev.target as HTMLInputElement | null;\n if (!target || !('value' in target)) return;\n const masked = this.maskInputValue(target);\n this.push({\n ts: Date.now(),\n k: 'input',\n data: { target: this.describePath(target), value: masked, type: target.type },\n });\n };\n document.addEventListener('input', this.inputListener, true);\n\n this.flushTimer = setInterval(() => this.flush(), FLUSH_INTERVAL_MS);\n\n try { this.addBreadcrumb('default', 'Replay recording started', 'info', { sessionId: this.sessionId }); }\n catch { /* ignore */ }\n }\n\n destroy(): void {\n this.destroyed = true;\n if (this.observer) { this.observer.disconnect(); this.observer = null; }\n if (this.inputListener) {\n document.removeEventListener('input', this.inputListener, true);\n this.inputListener = null;\n }\n if (this.flushTimer) { clearInterval(this.flushTimer); this.flushTimer = null; }\n this.flush();\n if (typeof document !== 'undefined') (document as any)[FLAG] = false;\n }\n\n /** @internal — exposed for tests. */\n getBuffer(): ReadonlyArray<ReplayEvent> { return this.buffer; }\n\n private push(ev: ReplayEvent): void {\n if (this.destroyed) return;\n this.buffer.push(ev);\n if (this.buffer.length >= this.opts.maxBufferedEvents) this.flush();\n }\n\n private flush(): void {\n if (this.buffer.length === 0) return;\n const events = this.buffer;\n this.buffer = [];\n this.transport.send(REPLAY_INGEST_PATH, {\n sessionId: this.sessionId,\n events,\n });\n }\n\n // ── Sanitization helpers ──────────────────────────────────────────\n\n private snapshotBody(): string {\n if (!document.body) return '';\n const clone = document.body.cloneNode(true) as HTMLElement;\n this.maskTree(clone);\n return clone.outerHTML;\n }\n\n private maskTree(root: Element): void {\n if (this.opts.maskAttribute && root.hasAttribute?.(this.opts.maskAttribute)) {\n root.textContent = '***';\n return;\n }\n const tag = root.tagName?.toLowerCase();\n if (tag === 'input' || tag === 'textarea' || tag === 'select') {\n (root as HTMLInputElement).value = this.maskInputValue(root as HTMLInputElement);\n root.setAttribute('value', (root as HTMLInputElement).value);\n }\n for (const child of Array.from(root.children)) this.maskTree(child);\n }\n\n private maskInputValue(el: HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement): string {\n // Password fields are ALWAYS masked, regardless of `maskAllInputs`.\n if ((el as HTMLInputElement).type === 'password') return '***';\n if (this.opts.maskAllInputs) return '***';\n return String((el as any).value ?? '');\n }\n\n private describeNode(node: Node): Record<string, unknown> {\n if (node.nodeType === 1) {\n return { type: 'element', tag: (node as Element).tagName?.toLowerCase() };\n }\n if (node.nodeType === 3) {\n return { type: 'text', length: (node.nodeValue ?? '').length };\n }\n return { type: 'other' };\n }\n\n private describePath(el: Element | null): string {\n if (!el || el.nodeType !== 1) return '';\n const parts: string[] = [];\n let cur: Element | null = el;\n let depth = 0;\n while (cur && depth < 8) {\n let p = cur.tagName.toLowerCase();\n if (cur.id) { p += `#${cur.id}`; parts.unshift(p); break; }\n if (cur.classList?.length) p += '.' + Array.from(cur.classList).slice(0, 2).join('.');\n parts.unshift(p);\n cur = cur.parentElement;\n depth += 1;\n }\n return parts.join('>');\n }\n\n private safeAttribute(el: Element, name: string): string {\n if (name === 'value' || name === 'defaultValue') return '***';\n return el.getAttribute(name) ?? '';\n }\n}\n","/**\n * Browser-side debug-id resolver.\n *\n * The build-time inject step (run via `@allstak/js/sourcemaps` against\n * Vite/Webpack/Next output) emits `//# debugId=<uuid>` into every JS\n * chunk and writes a self-registration snippet that populates\n * `globalThis._allstakDebugIds` as a `{ [scriptUrl]: uuid }` map.\n *\n * At capture time we resolve each stack frame's filename against that\n * map and attach the matched UUID to the frame so the dashboard\n * symbolicator can pick the right `.map` even after long-tail caching.\n */\n\ninterface DebugIdRegistry { [filename: string]: string | undefined }\n\nfunction getRegistry(): DebugIdRegistry {\n return ((globalThis as any)._allstakDebugIds ?? {}) as DebugIdRegistry;\n}\n\nconst cache = new Map<string, string | undefined>();\n\nexport function resolveDebugId(filename: string | undefined): string | undefined {\n if (!filename) return undefined;\n if (cache.has(filename)) return cache.get(filename);\n const registry = getRegistry();\n let id = registry[filename];\n if (!id) {\n // Tolerate registry keys that omit the scheme/host (relative URLs in\n // the browser source-map upload path).\n for (const key of Object.keys(registry)) {\n if (filename.endsWith(key)) { id = registry[key]; break; }\n }\n }\n cache.set(filename, id);\n return id;\n}\n\n/** @internal — for tests. */\nexport function __clearDebugIdCache(): void { cache.clear(); }\n","/**\n * HTTP request batching + transport for the React Native SDK.\n *\n * Mirrors the wire shape used by `@allstak/js`'s HttpRequestModule so the\n * existing backend ingest endpoint (`/ingest/v1/http-requests`) accepts\n * events from this SDK without a schema change. Adds optional rich fields\n * (headers, bodies, error string) — these ride alongside the existing\n * required fields and are tolerated as additive metadata server-side.\n *\n * Batching:\n * - flushes on a 5s timer OR when 20 events queue up\n * - flushes immediately on `destroy()`\n * - `getRecentFailed(n)` returns the last n failed requests (statusCode\n * >= 400 OR error set), used by error-linking on the next captureException\n */\n\nimport type { HttpTransport } from './transport';\n\nconst INGEST_PATH = '/ingest/v1/http-requests';\nconst FLUSH_INTERVAL_MS = 5_000;\nconst BATCH_SIZE_THRESHOLD = 20;\nconst RECENT_FAILED_BUFFER_SIZE = 10;\n\n/** What instrumentation hands to the module per request. */\nexport interface HttpRequestEvent {\n type: 'http_request';\n method: string;\n url: string; // already sanitized\n statusCode?: number;\n durationMs: number;\n requestSize?: number;\n responseSize?: number;\n requestBody?: string;\n responseBody?: string;\n requestHeaders?: Record<string, string>;\n responseHeaders?: Record<string, string>;\n error?: string;\n traceId?: string;\n}\n\nexport interface HttpRequestIngestItem {\n type: 'http_request';\n traceId: string;\n direction: 'outbound';\n method: string;\n // Backend wants host + path separately; we also keep the full sanitized\n // URL alongside in case the consumer wants it.\n host: string;\n path: string;\n url: string;\n statusCode: number;\n durationMs: number;\n requestSize?: number;\n responseSize?: number;\n requestBody?: string;\n responseBody?: string;\n requestHeaders?: Record<string, string>;\n responseHeaders?: Record<string, string>;\n error?: string;\n environment?: string;\n release?: string;\n dist?: string;\n platform?: string;\n 'sdk.name'?: string;\n 'sdk.version'?: string;\n timestamp: string;\n}\n\ninterface IngestPayload {\n requests: HttpRequestIngestItem[];\n}\n\ninterface ModuleDefaults {\n environment?: string;\n release?: string;\n dist?: string;\n platform?: string;\n sdkName?: string;\n sdkVersion?: string;\n}\n\nfunction genTraceId(): string {\n const hex = (n: number) => Math.floor(Math.random() * n).toString(16).padStart(1, '0');\n const seg = (len: number) => Array.from({ length: len }, () => hex(16)).join('');\n return `${seg(8)}-${seg(4)}-4${seg(3)}-${(8 + Math.floor(Math.random() * 4)).toString(16)}${seg(3)}-${seg(12)}`;\n}\n\nfunction splitHostPath(url: string): { host: string; path: string } {\n try {\n const u = new URL(url);\n return { host: u.host, path: u.pathname || '/' };\n } catch {\n // Relative URL — treat the whole thing as path.\n return { host: '', path: url.split('?')[0] };\n }\n}\n\nexport class HttpRequestModule {\n private queue: HttpRequestIngestItem[] = [];\n private recentFailed: HttpRequestIngestItem[] = [];\n private flushTimer: ReturnType<typeof setInterval> | null = null;\n private destroyed = false;\n private defaults: ModuleDefaults = {};\n\n constructor(private transport: HttpTransport) {}\n\n setDefaults(defaults: ModuleDefaults): void {\n this.defaults = { ...this.defaults, ...defaults };\n }\n\n capture(ev: HttpRequestEvent): void {\n if (this.destroyed) return;\n const { host, path } = splitHostPath(ev.url);\n const item: HttpRequestIngestItem = {\n type: 'http_request',\n traceId: ev.traceId ?? genTraceId(),\n direction: 'outbound',\n method: (ev.method || 'GET').toUpperCase(),\n host,\n path,\n url: ev.url,\n statusCode: ev.statusCode ?? 0,\n durationMs: Math.max(0, Math.floor(ev.durationMs)),\n requestSize: ev.requestSize,\n responseSize: ev.responseSize,\n requestBody: ev.requestBody,\n responseBody: ev.responseBody,\n requestHeaders: ev.requestHeaders,\n responseHeaders: ev.responseHeaders,\n error: ev.error,\n environment: this.defaults.environment,\n release: this.defaults.release,\n dist: this.defaults.dist,\n platform: this.defaults.platform,\n 'sdk.name': this.defaults.sdkName,\n 'sdk.version': this.defaults.sdkVersion,\n timestamp: new Date().toISOString(),\n };\n\n this.queue.push(item);\n const isFailed = (item.statusCode >= 400) || !!item.error;\n if (isFailed) {\n this.recentFailed.push(item);\n if (this.recentFailed.length > RECENT_FAILED_BUFFER_SIZE) this.recentFailed.shift();\n }\n\n if (this.queue.length >= BATCH_SIZE_THRESHOLD) { this.flush(); return; }\n if (!this.flushTimer) this.flushTimer = setInterval(() => this.flush(), FLUSH_INTERVAL_MS);\n }\n\n /** Snapshot of the last failed requests for error-linking. Newest last. */\n getRecentFailed(): ReadonlyArray<HttpRequestIngestItem> {\n return this.recentFailed;\n }\n\n flush(): void {\n if (this.queue.length === 0) return;\n const batch = this.queue;\n this.queue = [];\n const payload: IngestPayload = { requests: batch };\n this.transport.send(INGEST_PATH, payload);\n }\n\n destroy(): void {\n this.destroyed = true;\n if (this.flushTimer) { clearInterval(this.flushTimer); this.flushTimer = null; }\n this.flush();\n this.recentFailed = [];\n }\n\n /** @internal — for tests. */\n getQueueSize(): number { return this.queue.length; }\n}\n","/**\n * URL + header + body redaction utilities for HTTP instrumentation.\n *\n * Hard rules:\n * - Authorization, Cookie, X-API-Key, Set-Cookie are ALWAYS redacted\n * (host app cannot opt back into capturing them).\n * - Query params named `token`, `password`, `api_key`, `apikey`,\n * `authorization`, `auth`, `secret`, `access_token`, `refresh_token`,\n * `session` are ALWAYS redacted.\n * - Host app may add additional names via `redactHeaders` /\n * `redactQueryParams`; the always-list is the floor, not the ceiling.\n * - Bodies are truncated to `maxBodyBytes` (default 4096) and replaced\n * with `'<binary>'` when not safely-stringifiable.\n *\n * URL pattern matching for ignoredUrls / allowedUrls accepts strings\n * (substring match) or RegExp (test-based). String matching is\n * case-insensitive on the URL.\n */\n\nexport const ALWAYS_REDACT_HEADERS = new Set([\n 'authorization',\n 'cookie',\n 'set-cookie',\n 'x-api-key',\n 'x-auth-token',\n 'proxy-authorization',\n]);\n\nexport const ALWAYS_REDACT_QUERY = new Set([\n 'token',\n 'password',\n 'api_key',\n 'apikey',\n 'authorization',\n 'auth',\n 'secret',\n 'access_token',\n 'refresh_token',\n 'session',\n 'sessionid',\n 'jwt',\n]);\n\nexport const REDACTED = '[REDACTED]';\n\nexport interface HttpTrackingOptions {\n /** Capture request body. Default false. Truncated to maxBodyBytes. */\n captureRequestBody?: boolean;\n /** Capture response body. Default false. Truncated to maxBodyBytes. */\n captureResponseBody?: boolean;\n /**\n * Capture request + response headers. Default false. Hard-redacted\n * names are always stripped regardless of this flag.\n */\n captureHeaders?: boolean;\n /** Additional header names to redact (case-insensitive). */\n redactHeaders?: string[];\n /** Additional query-param names to redact (case-insensitive). */\n redactQueryParams?: string[];\n /**\n * Skip URLs matching any of these patterns. String = case-insensitive\n * substring match; RegExp = `.test()` against the full URL.\n */\n ignoredUrls?: (string | RegExp)[];\n /**\n * If non-empty, only capture URLs matching at least one of these\n * patterns. Takes precedence over ignoredUrls.\n */\n allowedUrls?: (string | RegExp)[];\n /** Max bytes per captured body. Default 4096. */\n maxBodyBytes?: number;\n}\n\nexport function shouldCaptureUrl(url: string, opts: HttpTrackingOptions): boolean {\n if (!url) return false;\n const lower = url.toLowerCase();\n if (opts.allowedUrls && opts.allowedUrls.length > 0) {\n return opts.allowedUrls.some((p) => matches(p, url, lower));\n }\n if (opts.ignoredUrls && opts.ignoredUrls.length > 0) {\n return !opts.ignoredUrls.some((p) => matches(p, url, lower));\n }\n return true;\n}\n\nfunction matches(pattern: string | RegExp, url: string, lower: string): boolean {\n if (pattern instanceof RegExp) return pattern.test(url);\n if (typeof pattern !== 'string') return false;\n return lower.includes(pattern.toLowerCase());\n}\n\n/**\n * Redact sensitive query-string params in a URL. Returns the sanitized\n * URL string. Falls back to the input when URL parsing fails (relative\n * URLs in test environments).\n */\nexport function redactUrl(url: string, opts: HttpTrackingOptions): string {\n if (!url) return url;\n const extra = (opts.redactQueryParams ?? []).map((s) => s.toLowerCase());\n const redactSet = new Set([...ALWAYS_REDACT_QUERY, ...extra]);\n\n // Try the URL parser first — handles full URLs cleanly.\n let parsed: URL | null = null;\n try { parsed = new URL(url); } catch { /* relative or malformed */ }\n\n if (parsed) {\n // Avoid `for…of` on URLSearchParams (the lib's Symbol.iterator typing\n // varies across DOM/dom-iterable lib targets). `forEach` is universal.\n const params = parsed.searchParams;\n let mutated = false;\n const keysToRedact: string[] = [];\n params.forEach((_v, k) => {\n if (redactSet.has(k.toLowerCase())) keysToRedact.push(k);\n });\n for (const k of keysToRedact) {\n params.set(k, REDACTED);\n mutated = true;\n }\n if (mutated) parsed.search = params.toString();\n return parsed.toString();\n }\n\n // Fallback: regex over the query portion of the URL.\n const qIdx = url.indexOf('?');\n if (qIdx < 0) return url;\n const head = url.slice(0, qIdx);\n const queryAndHash = url.slice(qIdx + 1);\n const hashIdx = queryAndHash.indexOf('#');\n const query = hashIdx < 0 ? queryAndHash : queryAndHash.slice(0, hashIdx);\n const hash = hashIdx < 0 ? '' : queryAndHash.slice(hashIdx);\n\n const parts = query.split('&').map((pair) => {\n const eq = pair.indexOf('=');\n if (eq < 0) return pair;\n const key = pair.slice(0, eq);\n return redactSet.has(key.toLowerCase()) ? `${key}=${REDACTED}` : pair;\n });\n return `${head}?${parts.join('&')}${hash ? '#' + hash : ''}`;\n}\n\n/**\n * Filter + redact an HTTP header dictionary. Returns a NEW object — does\n * not mutate the input. When `captureHeaders` is false returns undefined\n * (no headers in the wire payload at all).\n */\nexport function sanitizeHeaders(\n headers: Record<string, string | string[] | undefined> | undefined,\n opts: HttpTrackingOptions,\n): Record<string, string> | undefined {\n if (!opts.captureHeaders) return undefined;\n if (!headers) return {};\n const extra = (opts.redactHeaders ?? []).map((s) => s.toLowerCase());\n const redactSet = new Set([...ALWAYS_REDACT_HEADERS, ...extra]);\n const out: Record<string, string> = {};\n for (const [k, v] of Object.entries(headers)) {\n if (v == null) continue;\n const lower = k.toLowerCase();\n out[lower] = redactSet.has(lower)\n ? REDACTED\n : Array.isArray(v) ? v.join(', ') : String(v);\n }\n return out;\n}\n\n/**\n * Truncate + safely-stringify a body. Returns:\n * - undefined when capture is disabled\n * - the stringified body when it's a string / number / plain object\n * - '<binary>' when it's a Blob / FormData / ArrayBuffer / etc\n * - truncated string with `…[truncated]` suffix when over maxBodyBytes\n */\nexport function captureBody(\n body: unknown,\n enabled: boolean,\n maxBodyBytes: number,\n): string | undefined {\n if (!enabled) return undefined;\n if (body == null) return undefined;\n let str: string;\n if (typeof body === 'string') str = body;\n else if (typeof body === 'number' || typeof body === 'boolean') str = String(body);\n else if (typeof body === 'object') {\n // Don't try to stringify Blob, FormData, ArrayBuffer, ReadableStream.\n const tag = Object.prototype.toString.call(body);\n if (tag !== '[object Object]' && tag !== '[object Array]') return '<binary>';\n try { str = JSON.stringify(body); } catch { return '<unserializable>'; }\n } else {\n return '<binary>';\n }\n if (str.length > maxBodyBytes) return str.slice(0, maxBodyBytes) + '…[truncated]';\n return str;\n}\n","/**\n * Automatic HTTP instrumentation for React Native — patches `fetch`,\n * `XMLHttpRequest`, and (when found) `axios`.\n *\n * Idempotent: each patch tags itself with a flag so a second `init()` is\n * a no-op rather than stacking wrappers (which would otherwise double-fire\n * events and corrupt response handling on hot reload).\n *\n * Privacy + safety contract:\n * - URL query params are sanitized via `redactUrl` BEFORE being recorded\n * - Headers are not recorded unless `captureHeaders: true`\n * - Bodies are not recorded unless `captureRequestBody`/`captureResponseBody`\n * - Response body capture clones the Response (or skips when cloning is\n * unsafe — large/streaming responses) so the consumer's downstream\n * `.json()` / `.text()` still works without \"body already used\" errors\n * - Skips own ingest URLs (`api.allstak.sa/ingest/...`) so wrappers\n * never recurse on telemetry traffic\n * - On any internal failure, the original network call is allowed to\n * proceed — never break consumer networking\n */\n\nimport { HttpRequestModule, HttpRequestEvent } from './http-requests';\nimport {\n HttpTrackingOptions,\n redactUrl,\n sanitizeHeaders,\n shouldCaptureUrl,\n captureBody,\n} from './http-redact';\n\nconst FETCH_FLAG = '__allstak_http_fetch_patched__';\nconst XHR_FLAG = '__allstak_http_xhr_patched__';\nconst AXIOS_FLAG = Symbol.for('allstak.http.axios.instrumented');\n\nconst DEFAULT_MAX_BODY = 4096;\n\n// Module-level \"current binding\" — wrappers route capture calls through\n// this so re-init swaps the underlying module without re-wrapping the\n// global, and a destroyed module silently no-ops instead of throwing.\nlet _currentModule: HttpRequestModule | null = null;\nlet _currentOpts: BoundOptions | null = null;\nfunction currentModule(): HttpRequestModule | null { return _currentModule; }\nfunction currentOpts(): BoundOptions | null { return _currentOpts; }\nfunction safeCapture(ev: HttpRequestEvent): void {\n try { currentModule()?.capture(ev); } catch { /* never break host */ }\n}\n\ninterface BoundOptions extends Required<Omit<HttpTrackingOptions, 'redactHeaders' | 'redactQueryParams' | 'ignoredUrls' | 'allowedUrls'>> {\n redactHeaders: string[];\n redactQueryParams: string[];\n ignoredUrls: (string | RegExp)[];\n allowedUrls: (string | RegExp)[];\n ownIngestPrefix: string;\n}\n\nfunction bind(opts: HttpTrackingOptions, ownIngestHost: string): BoundOptions {\n return {\n captureRequestBody: opts.captureRequestBody ?? false,\n captureResponseBody: opts.captureResponseBody ?? false,\n captureHeaders: opts.captureHeaders ?? false,\n redactHeaders: opts.redactHeaders ?? [],\n redactQueryParams: opts.redactQueryParams ?? [],\n ignoredUrls: opts.ignoredUrls ?? [],\n allowedUrls: opts.allowedUrls ?? [],\n maxBodyBytes: opts.maxBodyBytes ?? DEFAULT_MAX_BODY,\n ownIngestPrefix: ownIngestHost.replace(/\\/$/, ''),\n };\n}\n\nfunction isOwnIngest(url: string, prefix: string): boolean {\n return !!prefix && url.startsWith(prefix);\n}\n\nfunction urlString(input: any): string {\n if (typeof input === 'string') return input;\n if (input && typeof input.href === 'string') return input.href;\n if (input && typeof input.url === 'string') return input.url;\n return String(input);\n}\n\nfunction safeByteLength(s: string | undefined | null): number | undefined {\n if (s == null) return undefined;\n if (typeof s === 'string') {\n // Approximate — UTF-8 byte length without TextEncoder dep.\n let n = 0;\n for (let i = 0; i < s.length; i++) {\n const c = s.charCodeAt(i);\n if (c < 0x80) n += 1;\n else if (c < 0x800) n += 2;\n else if (c >= 0xd800 && c <= 0xdbff) { n += 4; i += 1; }\n else n += 3;\n }\n return n;\n }\n return undefined;\n}\n\nfunction headersToObject(h: any): Record<string, string> {\n if (!h) return {};\n // Headers / Map style (entries())\n if (typeof h.entries === 'function') {\n const out: Record<string, string> = {};\n for (const [k, v] of h.entries()) out[String(k).toLowerCase()] = String(v);\n return out;\n }\n // Plain dict\n if (typeof h === 'object') {\n const out: Record<string, string> = {};\n for (const [k, v] of Object.entries(h)) {\n if (v == null) continue;\n out[String(k).toLowerCase()] = Array.isArray(v) ? v.join(', ') : String(v);\n }\n return out;\n }\n return {};\n}\n\n// ───────────────────────────────────────────────────────────────\n// fetch\n// ───────────────────────────────────────────────────────────────\n\nexport function patchFetch(): void {\n const g: any = globalThis as any;\n if (typeof g.fetch !== 'function') return;\n if (g.fetch[FETCH_FLAG]) return;\n\n const original = g.fetch;\n\n const wrapped = async function (this: any, input: any, init?: any): Promise<Response> {\n const opts = currentOpts();\n if (!opts || !currentModule()) {\n // Instrumentation not bound (yet, or re-init mid-flight) — pass through.\n return original.call(this, input, init);\n }\n const rawUrl = urlString(input);\n const sanitizedUrl = redactUrl(rawUrl, opts);\n const method = ((init?.method) || (input && typeof input === 'object' && input.method) || 'GET').toUpperCase();\n\n if (isOwnIngest(rawUrl, opts.ownIngestPrefix) || !shouldCaptureUrl(rawUrl, opts)) {\n return original.call(this, input, init);\n }\n\n const start = Date.now();\n const reqHeaders = sanitizeHeaders(headersToObject(init?.headers ?? (input && input.headers)), opts);\n const reqBody = captureBody(init?.body, opts.captureRequestBody, opts.maxBodyBytes);\n const reqSize = safeByteLength(typeof init?.body === 'string' ? init.body : undefined);\n\n let response: any;\n try {\n response = await original.call(this, input, init);\n } catch (err) {\n safeCapture({\n type: 'http_request',\n method, url: sanitizedUrl, statusCode: 0,\n durationMs: Date.now() - start,\n requestBody: reqBody, requestHeaders: reqHeaders, requestSize: reqSize,\n error: String((err as any)?.message ?? err),\n });\n throw err;\n }\n\n const durationMs = Date.now() - start;\n let respBody: string | undefined;\n let respSize: number | undefined;\n let respHeaders: Record<string, string> | undefined;\n try {\n respHeaders = sanitizeHeaders(headersToObject(response.headers), opts);\n const lenHeader = typeof response.headers?.get === 'function' ? response.headers.get('content-length') : null;\n if (lenHeader) respSize = parseInt(lenHeader, 10) || undefined;\n\n if (opts.captureResponseBody && typeof response.clone === 'function') {\n try {\n const cloned = response.clone();\n const text = await cloned.text();\n respBody = captureBody(text, true, opts.maxBodyBytes);\n if (respSize == null) respSize = safeByteLength(text);\n } catch { /* clone unsafe — leave body undefined */ }\n }\n } catch { /* never break the response surface */ }\n\n safeCapture({\n type: 'http_request',\n method, url: sanitizedUrl,\n statusCode: response.status, durationMs,\n requestBody: reqBody, requestHeaders: reqHeaders, requestSize: reqSize,\n responseBody: respBody, responseHeaders: respHeaders, responseSize: respSize,\n });\n\n return response;\n };\n (wrapped as any)[FETCH_FLAG] = true;\n g.fetch = wrapped;\n}\n\n// ───────────────────────────────────────────────────────────────\n// XMLHttpRequest\n// ───────────────────────────────────────────────────────────────\n\nexport function patchXhr(): void {\n const g: any = globalThis as any;\n const X: any = g.XMLHttpRequest;\n if (!X || X.prototype[XHR_FLAG]) return;\n\n const origOpen = X.prototype.open;\n const origSend = X.prototype.send;\n const origSetRequestHeader = X.prototype.setRequestHeader;\n\n X.prototype.open = function (method: string, url: string, ...rest: unknown[]) {\n (this as any).__allstak_method__ = method;\n (this as any).__allstak_url__ = url;\n (this as any).__allstak_headers__ = {};\n return origOpen.call(this, method, url, ...rest);\n };\n\n X.prototype.setRequestHeader = function (name: string, value: string) {\n try { (this as any).__allstak_headers__[String(name).toLowerCase()] = String(value); }\n catch { /* ignore */ }\n return origSetRequestHeader.call(this, name, value);\n };\n\n X.prototype.send = function (body?: unknown) {\n const opts = currentOpts();\n if (!opts || !currentModule()) return origSend.call(this, body as any);\n\n const start = Date.now();\n const method = String((this as any).__allstak_method__ || 'GET').toUpperCase();\n const rawUrl = String((this as any).__allstak_url__ || '');\n const sanitizedUrl = redactUrl(rawUrl, opts);\n\n if (isOwnIngest(rawUrl, opts.ownIngestPrefix) || !shouldCaptureUrl(rawUrl, opts)) {\n return origSend.call(this, body as any);\n }\n\n const reqHeaders = sanitizeHeaders((this as any).__allstak_headers__, opts);\n const reqBody = captureBody(body, opts.captureRequestBody, opts.maxBodyBytes);\n const reqSize = safeByteLength(typeof body === 'string' ? body : undefined);\n\n const finish = (statusCode: number, error?: string) => {\n const durationMs = Date.now() - start;\n let respHeaders: Record<string, string> | undefined;\n let respBody: string | undefined;\n let respSize: number | undefined;\n try {\n const liveOpts = currentOpts() ?? opts;\n if (liveOpts.captureHeaders && typeof (this as any).getAllResponseHeaders === 'function') {\n const raw: string = (this as any).getAllResponseHeaders() || '';\n const dict: Record<string, string> = {};\n for (const line of raw.split(/\\r?\\n/)) {\n const idx = line.indexOf(':');\n if (idx > 0) dict[line.slice(0, idx).trim().toLowerCase()] = line.slice(idx + 1).trim();\n }\n respHeaders = sanitizeHeaders(dict, liveOpts);\n }\n if (liveOpts.captureResponseBody) {\n const text = (this as any).responseText;\n if (typeof text === 'string') {\n respBody = captureBody(text, true, liveOpts.maxBodyBytes);\n respSize = safeByteLength(text);\n }\n }\n } catch { /* never break */ }\n\n safeCapture({\n type: 'http_request',\n method, url: sanitizedUrl,\n statusCode, durationMs,\n requestBody: reqBody, requestHeaders: reqHeaders, requestSize: reqSize,\n responseBody: respBody, responseHeaders: respHeaders, responseSize: respSize,\n error,\n });\n };\n\n this.addEventListener?.('load', () => finish(this.status || 0));\n this.addEventListener?.('error', () => finish(0, 'network'));\n this.addEventListener?.('abort', () => finish(0, 'abort'));\n this.addEventListener?.('timeout', () => finish(0, 'timeout'));\n return origSend.call(this, body as any);\n };\n\n X.prototype[XHR_FLAG] = true;\n}\n\n// ───────────────────────────────────────────────────────────────\n// axios — manual instrumentation + best-effort auto-detect\n// ───────────────────────────────────────────────────────────────\n\n/**\n * Manually instrument an axios instance. Idempotent — calling twice on\n * the same instance is a no-op. Returns the same instance so it can be\n * used inline:\n * `const api = AllStak.instrumentAxios(axios.create({...}))`\n *\n * NOTE: under React Native, axios uses XHR under the hood by default, so\n * the XHR patch above already records the same calls. This wrapper is\n * still useful when consumers configure axios with a custom `adapter`\n * that bypasses XHR (e.g. node-style http adapter on RN+Node setups).\n * Both patches are idempotent and de-dup via a per-request flag.\n */\nexport function instrumentAxiosInstance(\n axiosInstance: any,\n module: HttpRequestModule,\n opts: BoundOptions,\n): any {\n if (!axiosInstance || typeof axiosInstance.interceptors !== 'object') return axiosInstance;\n if (axiosInstance[AXIOS_FLAG]) return axiosInstance;\n axiosInstance[AXIOS_FLAG] = true;\n\n const reqStarts = new WeakMap<object, { start: number; method: string; rawUrl: string }>();\n\n axiosInstance.interceptors.request.use((config: any) => {\n try {\n const rawUrl = (config.baseURL ? config.baseURL.replace(/\\/$/, '') : '') + (config.url || '');\n reqStarts.set(config, {\n start: Date.now(),\n method: String(config.method || 'GET').toUpperCase(),\n rawUrl,\n });\n } catch { /* ignore */ }\n return config;\n });\n\n const finalize = (cfg: any, statusCode: number, response?: any, error?: string) => {\n const meta = reqStarts.get(cfg);\n if (!meta) return;\n reqStarts.delete(cfg);\n if (isOwnIngest(meta.rawUrl, opts.ownIngestPrefix)) return;\n if (!shouldCaptureUrl(meta.rawUrl, opts)) return;\n\n const sanitizedUrl = redactUrl(meta.rawUrl, opts);\n const reqHeaders = sanitizeHeaders(headersToObject(cfg.headers), opts);\n const reqBody = captureBody(cfg.data, opts.captureRequestBody, opts.maxBodyBytes);\n const respHeaders = sanitizeHeaders(headersToObject(response?.headers), opts);\n const respBody = captureBody(response?.data, opts.captureResponseBody, opts.maxBodyBytes);\n\n try {\n module.capture({\n type: 'http_request',\n method: meta.method,\n url: sanitizedUrl,\n statusCode,\n durationMs: Date.now() - meta.start,\n requestBody: reqBody,\n requestHeaders: reqHeaders,\n responseBody: respBody,\n responseHeaders: respHeaders,\n error,\n });\n } catch { /* ignore */ }\n };\n\n axiosInstance.interceptors.response.use(\n (response: any) => { finalize(response.config, response.status); return response; },\n (err: any) => {\n const cfg = err?.config;\n const status = err?.response?.status ?? 0;\n finalize(cfg, status, err?.response, String(err?.message ?? err));\n throw err;\n },\n );\n return axiosInstance;\n}\n\n/**\n * Best-effort auto-detect: attempt to require('axios') and instrument the\n * default singleton. Silently no-ops when axios isn't installed (the\n * common case — most apps either don't use axios or import it via ES\n * modules and would call instrumentAxios manually).\n */\nexport function tryAutoInstrumentAxios(module: HttpRequestModule, opts: BoundOptions): void {\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const axios = (globalThis as any).require?.('axios') ?? null;\n if (axios) instrumentAxiosInstance(axios.default ?? axios, module, opts);\n } catch { /* axios not installed */ }\n}\n\n// ───────────────────────────────────────────────────────────────\n// Top-level orchestrator\n// ───────────────────────────────────────────────────────────────\n\nexport function installHttpInstrumentation(\n module: HttpRequestModule,\n options: HttpTrackingOptions,\n ownIngestHost: string,\n): { instrumentAxios: (axios: any) => any } {\n const bound = bind(options, ownIngestHost);\n // Bind first so already-installed wrappers immediately route to the new\n // module/options. Subsequent patch* calls are idempotent no-ops.\n _currentModule = module;\n _currentOpts = bound;\n try { patchFetch(); } catch { /* ignore */ }\n try { patchXhr(); } catch { /* ignore */ }\n try { tryAutoInstrumentAxios(module, bound); } catch { /* ignore */ }\n return {\n instrumentAxios: (axios: any) => instrumentAxiosInstance(axios, module, bound),\n };\n}\n\n/** Called by AllStakClient.destroy() so wrappers go quiet between inits. */\nexport function unbindHttpInstrumentation(): void {\n _currentModule = null;\n _currentOpts = null;\n}\n\n/** @internal — for tests. */\nexport function __resetForTest(): void {\n const g: any = globalThis as any;\n if (g.fetch && g.fetch[FETCH_FLAG]) {\n // No way to recover original without saving — tests use freshly-set fetch.\n }\n if (g.XMLHttpRequest && g.XMLHttpRequest.prototype[XHR_FLAG]) {\n delete g.XMLHttpRequest.prototype[XHR_FLAG];\n }\n}\n","/**\n * Lightweight Web Vitals collection via the browser's PerformanceObserver.\n *\n * Captures CLS, LCP, INP, FCP, TTFB without pulling in the `web-vitals`\n * package as a runtime dependency. Each metric is shipped as a single\n * `web_vital` log on the SDK's `/ingest/v1/logs` channel — so the\n * dashboard can chart them alongside other logs.\n *\n * Privacy: only numeric values + the metric name are sent. No URLs,\n * referrers, or user-identifiable data.\n *\n * Browser compatibility: PerformanceObserver is available in every\n * evergreen browser (Chrome 51+, Safari 11+, Firefox 57+, Edge 79+).\n * Older browsers silently no-op via the `typeof PerformanceObserver`\n * guard.\n *\n * - **CLS** (Cumulative Layout Shift) — layout-shift entries with\n * `hadRecentInput=false`, summed for the session\n * - **LCP** (Largest Contentful Paint) — biggest paint entry's startTime\n * - **INP** (Interaction to Next Paint) — longest event-timing duration\n * - **FCP** (First Contentful Paint) — first paint named `first-contentful-paint`\n * - **TTFB** (Time to First Byte) — `responseStart - requestStart` from the\n * navigation timing entry\n */\n\ntype VitalsReporter = (metric: { name: string; value: number; id?: string }) => void;\n\nconst FLAG = '__allstak_web_vitals_started__';\n\nexport interface WebVitalsHandle {\n /** Disconnects all observers. Idempotent. */\n destroy(): void;\n}\n\n/**\n * Start collecting Web Vitals. Returns a handle whose `destroy()` cleans\n * up all PerformanceObservers. Safe no-op on non-browser runtimes.\n */\nexport function startWebVitals(report: VitalsReporter): WebVitalsHandle {\n const noop: WebVitalsHandle = { destroy: () => {} };\n if (typeof window === 'undefined') return noop;\n if (typeof PerformanceObserver === 'undefined') return noop;\n if ((window as any)[FLAG]) return noop;\n (window as any)[FLAG] = true;\n\n const observers: PerformanceObserver[] = [];\n\n // ── LCP ──────────────────────────────────────────────────────────\n // Reports the LCP value when the page is hidden or unloaded.\n let lastLcp = 0;\n try {\n const obs = new PerformanceObserver((list) => {\n const entries = list.getEntries();\n const last = entries[entries.length - 1] as any;\n if (last && typeof last.startTime === 'number') {\n lastLcp = last.startTime;\n }\n });\n obs.observe({ type: 'largest-contentful-paint', buffered: true } as any);\n observers.push(obs);\n } catch { /* unsupported entry type */ }\n\n // ── CLS ──────────────────────────────────────────────────────────\n let cls = 0;\n try {\n const obs = new PerformanceObserver((list) => {\n for (const entry of list.getEntries() as any[]) {\n if (!entry.hadRecentInput && typeof entry.value === 'number') {\n cls += entry.value;\n }\n }\n });\n obs.observe({ type: 'layout-shift', buffered: true } as any);\n observers.push(obs);\n } catch { /* unsupported */ }\n\n // ── INP ──────────────────────────────────────────────────────────\n let maxInteraction = 0;\n try {\n const obs = new PerformanceObserver((list) => {\n for (const entry of list.getEntries() as any[]) {\n if (typeof entry.duration === 'number' && entry.duration > maxInteraction) {\n maxInteraction = entry.duration;\n }\n }\n });\n // 'event' includes both keyboard and pointer events; durationThreshold\n // 40ms keeps observer overhead low on busy pages.\n obs.observe({ type: 'event', buffered: true, durationThreshold: 40 } as any);\n observers.push(obs);\n } catch { /* unsupported */ }\n\n // ── FCP ──────────────────────────────────────────────────────────\n let fcp = 0;\n try {\n const obs = new PerformanceObserver((list) => {\n for (const entry of list.getEntries()) {\n if (entry.name === 'first-contentful-paint') {\n fcp = entry.startTime;\n }\n }\n });\n obs.observe({ type: 'paint', buffered: true } as any);\n observers.push(obs);\n } catch { /* unsupported */ }\n\n // ── TTFB ─────────────────────────────────────────────────────────\n // From the navigation timing entry. Reported once on first read.\n const reportTtfb = (): void => {\n try {\n const navEntry = performance.getEntriesByType('navigation')[0] as PerformanceNavigationTiming | undefined;\n if (navEntry && typeof navEntry.responseStart === 'number' && typeof navEntry.requestStart === 'number') {\n const ttfb = Math.max(0, navEntry.responseStart - navEntry.requestStart);\n report({ name: 'TTFB', value: ttfb });\n }\n } catch { /* ignore */ }\n };\n\n // Final flush on hide/unload — this is when LCP/CLS/INP are most\n // accurate (after the page is done interacting).\n const finalize = (): void => {\n if (lastLcp > 0) report({ name: 'LCP', value: lastLcp });\n report({ name: 'CLS', value: cls });\n if (maxInteraction > 0) report({ name: 'INP', value: maxInteraction });\n if (fcp > 0) report({ name: 'FCP', value: fcp });\n reportTtfb();\n };\n\n // visibilitychange is the most reliable signal — pagehide / unload\n // can be unreliable on mobile Safari but visibilitychange always\n // fires before either. We intentionally do NOT use unload (deprecated\n // and disables back/forward cache).\n const onVisibility = (): void => {\n if (document.visibilityState === 'hidden') finalize();\n };\n document.addEventListener('visibilitychange', onVisibility);\n // Also try at pagehide for browsers that fire it before visibilitychange.\n const onPagehide = (): void => finalize();\n window.addEventListener('pagehide', onPagehide);\n\n return {\n destroy: () => {\n for (const o of observers) {\n try { o.disconnect(); } catch { /* ignore */ }\n }\n document.removeEventListener('visibilitychange', onVisibility);\n window.removeEventListener('pagehide', onPagehide);\n (window as any)[FLAG] = false;\n },\n };\n}\n\n/** @internal — reset the started flag so tests can re-init. */\nexport function __resetWebVitalsFlagForTest(): void {\n if (typeof window !== 'undefined') {\n (window as any)[FLAG] = false;\n }\n}\n","/**\n * Standalone AllStak client for the browser/React environment. No external\n * AllStak SDK dependencies — only the browser's native `fetch`, AbortController,\n * Date, JSON, and (optionally) `window` for unhandled error auto-capture.\n *\n * Surface mirrors the public AllStak API used by web apps:\n * init / captureException / captureMessage / addBreadcrumb / clearBreadcrumbs\n * setUser / setTag / setIdentity / getSessionId\n */\n\nimport { HttpTransport } from './transport';\nimport { parseStack } from './stack';\nimport { instrumentFetch, instrumentConsole } from './auto-breadcrumbs';\nimport { instrumentBrowserNavigation, __setDefaultBreadcrumbForwarder } from './navigation';\nimport { Scope, mergeScopes } from './scope';\nimport { TracingModule, Span } from './tracing';\nimport { ReplayRecorder, ReplayOptions } from './replay';\nimport { resolveDebugId } from './debug-id';\nimport { HttpRequestModule } from './http-requests';\nimport type { HttpTrackingOptions } from './http-redact';\nimport { installHttpInstrumentation } from './http-instrumentation';\nimport type { ConsoleCaptureOptions } from './auto-breadcrumbs';\nimport { startWebVitals, WebVitalsHandle } from './web-vitals';\n\nexport const INGEST_HOST = 'https://api.allstak.sa';\nexport const SDK_NAME = 'allstak-react';\nexport const SDK_VERSION = '0.3.6';\n\nexport { Scope } from './scope';\nexport { Span, TracingModule } from './tracing';\nexport type { SpanData } from './tracing';\n\nconst ERRORS_PATH = '/ingest/v1/errors';\nconst LOGS_PATH = '/ingest/v1/logs';\n\nconst VALID_BREADCRUMB_TYPES = new Set(['http', 'log', 'ui', 'navigation', 'query', 'default']);\nconst VALID_BREADCRUMB_LEVELS = new Set(['info', 'warn', 'error', 'debug']);\nconst DEFAULT_MAX_BREADCRUMBS = 50;\n\nexport interface AllStakConfig {\n /** Project API key (`ask_live_…`). Required. */\n apiKey: string;\n /** Optional ingest host override; defaults to {@link INGEST_HOST}. */\n host?: string;\n environment?: string;\n release?: string;\n user?: { id?: string; email?: string };\n tags?: Record<string, string>;\n /** Per-event extra data attached to every capture (override per call via context arg). */\n extras?: Record<string, unknown>;\n /** Named context bags (e.g. `app`, `device`). Each lives under `metadata['context.<name>']`. */\n contexts?: Record<string, Record<string, unknown>>;\n /**\n * Default severity level for events that don't specify their own.\n * Customer-set default severity, mirrors `setLevel`.\n */\n level?: 'fatal' | 'error' | 'warning' | 'info' | 'debug';\n /**\n * Custom grouping fingerprint applied to every event. Customer-set grouping override —\n * `setFingerprint`. Pass an empty array or `null` to clear.\n */\n fingerprint?: string[];\n /** Probability in [0, 1] that any new span is recorded. Default 1. */\n tracesSampleRate?: number;\n /** Service name attached to every span (defaults to release if unset). */\n service?: string;\n maxBreadcrumbs?: number;\n /** Auto-capture unhandled `error` and `unhandledrejection` on `window`. Default: true */\n autoCaptureBrowserErrors?: boolean;\n /** Wrap `globalThis.fetch` to record HTTP breadcrumbs. Default: true */\n autoBreadcrumbsFetch?: boolean;\n /** Wrap `console.*` methods to record log breadcrumbs. Default: true.\n * Per-method capture is controlled by `captureConsole` (warn + error\n * default on, log + info default off). */\n autoBreadcrumbsConsole?: boolean;\n /**\n * Per-console-method capture flags. Defaults: warn + error captured,\n * log + info NOT captured (to avoid breadcrumb spam from typical app\n * logging). Set `{ log: true, info: true }` to opt-in.\n */\n captureConsole?: ConsoleCaptureOptions;\n /**\n * Auto-capture Web Vitals (CLS, LCP, INP, FCP, TTFB) via the browser's\n * PerformanceObserver. Default: true. Each metric ships as a\n * `web_vitals` log on the next backend flush.\n */\n autoWebVitals?: boolean;\n /** Wrap `history.pushState`/`replaceState` and listen to `popstate` for SPA navigation breadcrumbs. Default: true */\n autoBreadcrumbsNavigation?: boolean;\n /**\n * Experimental session-replay surrogate. **Off by default.** Enable with\n * `replay: { sampleRate: 0.1 }`. Captures sanitized initial DOM snapshot +\n * subsequent mutations + masked input events. See `src/replay.ts` for\n * the full privacy contract.\n */\n replay?: ReplayOptions;\n /**\n * Auto-instrument outbound HTTP — wraps `fetch`, `XMLHttpRequest`, and\n * (when present) `axios`. Default: false.\n */\n enableHttpTracking?: boolean;\n /**\n * Privacy + capture controls for HTTP instrumentation. Bodies and\n * headers are OFF by default; auth headers and sensitive query params\n * are ALWAYS redacted.\n */\n httpTracking?: HttpTrackingOptions;\n /**\n * Probability in [0, 1] that any given error is sent. Default: 1 (no sampling).\n * Applied per event before {@link beforeSend}.\n */\n sampleRate?: number;\n /**\n * Mutate or drop an event before it is sent. Return `null` (or a falsy\n * value) to drop. Sync or async. Errors thrown inside the hook are caught\n * — the event is sent as-is so a buggy hook can't black-hole telemetry.\n */\n beforeSend?: (event: ErrorIngestPayload) =>\n | ErrorIngestPayload | null | undefined\n | Promise<ErrorIngestPayload | null | undefined>;\n /** SDK identity overrides. */\n sdkName?: string;\n sdkVersion?: string;\n platform?: string;\n dist?: string;\n commitSha?: string;\n branch?: string;\n}\n\nexport interface Breadcrumb {\n timestamp: string;\n type: string;\n message: string;\n level: string;\n data?: Record<string, unknown>;\n}\n\ninterface PayloadFrame {\n filename?: string;\n absPath?: string;\n function?: string;\n lineno?: number;\n colno?: number;\n inApp?: boolean;\n platform?: string;\n debugId?: string;\n}\n\nexport interface ErrorIngestPayload {\n exceptionClass: string;\n message: string;\n stackTrace?: string[];\n frames?: PayloadFrame[];\n platform?: string;\n sdkName?: string;\n sdkVersion?: string;\n dist?: string;\n level: string;\n environment?: string;\n release?: string;\n sessionId?: string;\n user?: { id?: string; email?: string };\n metadata?: Record<string, unknown>;\n breadcrumbs?: Breadcrumb[];\n requestContext?: { method?: string; path?: string; host?: string; userAgent?: string };\n fingerprint?: string[];\n}\n\nfunction frameToString(f: PayloadFrame): string {\n const fn = f.function && f.function.length > 0 ? f.function : '<anonymous>';\n const file = f.filename || f.absPath || '<anonymous>';\n return ` at ${fn} (${file}:${f.lineno ?? 0}:${f.colno ?? 0})`;\n}\n\nfunction generateId(): string {\n const hex = (n: number) => Math.floor(Math.random() * n).toString(16).padStart(1, '0');\n const seg = (len: number) => Array.from({ length: len }, () => hex(16)).join('');\n return `${seg(8)}-${seg(4)}-4${seg(3)}-${(8 + Math.floor(Math.random() * 4)).toString(16)}${seg(3)}-${seg(12)}`;\n}\n\nfunction browserRequestContext(): ErrorIngestPayload['requestContext'] {\n if (typeof window === 'undefined' || typeof location === 'undefined') return undefined;\n return {\n method: 'GET',\n path: location.pathname || '/',\n host: location.host || '',\n userAgent: typeof navigator !== 'undefined' ? navigator.userAgent : undefined,\n };\n}\n\nexport class AllStakClient {\n private transport: HttpTransport;\n private config: AllStakConfig;\n private sessionId: string;\n private breadcrumbs: Breadcrumb[] = [];\n private maxBreadcrumbs: number;\n private scopeStack: Scope[] = [];\n private tracing: TracingModule;\n private replay: ReplayRecorder | null = null;\n private httpRequests: HttpRequestModule | null = null;\n private _instrumentAxios: ((axios: any) => any) | null = null;\n private onErrorHandler: ((ev: ErrorEvent) => void) | null = null;\n private onRejectionHandler: ((ev: PromiseRejectionEvent) => void) | null = null;\n private webVitals: WebVitalsHandle | null = null;\n\n constructor(config: AllStakConfig) {\n if (!config.apiKey) throw new Error('AllStak: config.apiKey is required');\n this.config = { ...config };\n if (!this.config.environment) this.config.environment = 'production';\n if (!this.config.sdkName) this.config.sdkName = SDK_NAME;\n if (!this.config.sdkVersion) this.config.sdkVersion = SDK_VERSION;\n if (!this.config.platform) this.config.platform = 'browser';\n this.sessionId = generateId();\n this.maxBreadcrumbs = config.maxBreadcrumbs ?? DEFAULT_MAX_BREADCRUMBS;\n const baseUrl = (config.host ?? INGEST_HOST).replace(/\\/$/, '');\n this.transport = new HttpTransport(baseUrl, config.apiKey);\n this.tracing = new TracingModule(this.transport, {\n service: config.service ?? config.release ?? '',\n environment: this.config.environment ?? 'production',\n tracesSampleRate: config.tracesSampleRate,\n });\n\n if (config.autoCaptureBrowserErrors !== false && typeof window !== 'undefined') {\n this.installBrowserHandlers();\n }\n // Route auto-breadcrumbs through the current singleton so that\n // re-init (which destroys this instance) doesn't leave the wrappers\n // dispatching into a dead client.\n if (config.autoBreadcrumbsFetch !== false) {\n try { instrumentFetch(safeAddBreadcrumb, baseUrl); }\n catch { /* ignore — never break init */ }\n }\n if (config.autoBreadcrumbsConsole !== false) {\n try { instrumentConsole(safeAddBreadcrumb, config.captureConsole); }\n catch { /* ignore */ }\n }\n if (config.autoBreadcrumbsNavigation !== false) {\n try { instrumentBrowserNavigation(safeAddBreadcrumb); }\n catch { /* ignore */ }\n }\n if (config.autoWebVitals !== false) {\n try {\n const send = (m: { name: string; value: number; id?: string }) => {\n this.transport.send(LOGS_PATH, {\n timestamp: new Date().toISOString(),\n level: 'info',\n message: `web-vital:${m.name}=${m.value.toFixed(2)}`,\n sessionId: this.sessionId,\n environment: this.config.environment,\n release: this.config.release,\n platform: this.config.platform,\n sdkName: this.config.sdkName,\n sdkVersion: this.config.sdkVersion,\n metadata: {\n category: 'web-vital',\n name: m.name,\n value: m.value,\n ...(m.id ? { id: m.id } : {}),\n ...this.releaseTags(),\n },\n });\n };\n this.webVitals = startWebVitals(send);\n } catch { /* never break init */ }\n }\n if (config.replay && (config.replay.enabled ?? true)) {\n try {\n this.replay = new ReplayRecorder(this.transport, this.sessionId, safeAddBreadcrumb, config.replay);\n this.replay.start();\n } catch { /* never break init */ }\n }\n if (config.enableHttpTracking) {\n try {\n this.httpRequests = new HttpRequestModule(this.transport);\n this.httpRequests.setDefaults({\n environment: this.config.environment,\n release: this.config.release,\n dist: this.config.dist,\n platform: this.config.platform,\n sdkName: this.config.sdkName,\n sdkVersion: this.config.sdkVersion,\n });\n const { instrumentAxios } = installHttpInstrumentation(\n this.httpRequests,\n config.httpTracking ?? {},\n baseUrl,\n );\n this._instrumentAxios = instrumentAxios;\n } catch { /* never break init */ }\n }\n }\n\n /** Manually instrument an axios instance. No-op when HTTP tracking is off. */\n instrumentAxios<T = any>(axios: T): T {\n if (!this._instrumentAxios) return axios;\n return this._instrumentAxios(axios) as T;\n }\n\n /** Snapshot of recent failed HTTP requests for error-linking. */\n getRecentFailedHttp() {\n return this.httpRequests?.getRecentFailed() ?? [];\n }\n\n captureException(error: Error, context?: Record<string, unknown>): void {\n if (!this.passesSampleRate()) return;\n const frames = parseStack(error.stack).map((f) => ({\n ...f,\n platform: this.config.platform,\n debugId: resolveDebugId(f.filename),\n }));\n const stackTrace = frames.length > 0 ? frames.map(frameToString) : undefined;\n const currentBreadcrumbs = this.breadcrumbs.length > 0 ? [...this.breadcrumbs] : undefined;\n this.breadcrumbs = [];\n\n // Prefer an explicit `error.name` override; fall back to constructor\n // name then to 'Error'. `new Error()` always has constructor.name ===\n // 'Error', so an explicit name set after construction would otherwise\n // be silently dropped.\n const exceptionClass =\n (error.name && error.name !== 'Error' ? error.name : undefined) ||\n error.constructor?.name ||\n 'Error';\n const eff = this.effective();\n const traceContext: Record<string, unknown> = {};\n const traceId = this.tracing.getTraceId();\n if (traceId) traceContext.traceId = traceId;\n const spanId = this.tracing.getCurrentSpanId();\n if (spanId) traceContext.spanId = spanId;\n const recentFailed = this.httpRequests?.getRecentFailed() ?? [];\n if (recentFailed.length > 0) {\n traceContext['http.recentFailed'] = recentFailed.map((r) => ({\n method: r.method, url: r.url, statusCode: r.statusCode,\n durationMs: r.durationMs, error: r.error,\n }));\n }\n\n const payload: ErrorIngestPayload = {\n exceptionClass,\n message: error.message,\n stackTrace,\n frames: frames.length > 0 ? frames : undefined,\n platform: this.config.platform,\n sdkName: this.config.sdkName,\n sdkVersion: this.config.sdkVersion,\n dist: this.config.dist,\n level: eff.level ?? 'error',\n environment: this.config.environment,\n release: this.config.release,\n sessionId: this.sessionId,\n user: eff.user,\n metadata: { ...this.buildMetadata(context), ...traceContext },\n breadcrumbs: currentBreadcrumbs,\n requestContext: browserRequestContext(),\n fingerprint: eff.fingerprint,\n };\n this.sendThroughBeforeSend(payload);\n }\n\n /** Start a new span — auto-parented to any currently-active span. */\n startSpan(operation: string, options?: { description?: string; tags?: Record<string, string> }): Span {\n return this.tracing.startSpan(operation, options);\n }\n /** Get (and lazily create) the active trace ID. */\n getTraceId(): string { return this.tracing.getTraceId(); }\n /** Override the active trace ID, e.g. from an inbound request header. */\n setTraceId(traceId: string): void { this.tracing.setTraceId(traceId); }\n /** ID of the currently-active span, or null. */\n getCurrentSpanId(): string | null { return this.tracing.getCurrentSpanId(); }\n /** Reset the trace ID and the active span stack. */\n resetTrace(): void { this.tracing.resetTrace(); }\n\n captureMessage(\n message: string,\n level: 'fatal' | 'error' | 'warning' | 'info' = 'info',\n options: { as?: 'log' | 'error' | 'both' } = {},\n ): void {\n const as = options.as ?? (level === 'fatal' || level === 'error' ? 'both' : 'log');\n if (as === 'log' || as === 'both') {\n this.sendLog(level === 'warning' ? 'warn' : level, message);\n }\n if (as === 'error' || as === 'both') {\n if (!this.passesSampleRate()) return;\n const eff = this.effective();\n const payload: ErrorIngestPayload = {\n exceptionClass: 'Message',\n message,\n platform: this.config.platform,\n sdkName: this.config.sdkName,\n sdkVersion: this.config.sdkVersion,\n dist: this.config.dist,\n level,\n environment: this.config.environment,\n release: this.config.release,\n sessionId: this.sessionId,\n user: eff.user,\n metadata: this.buildMetadata(),\n requestContext: browserRequestContext(),\n fingerprint: eff.fingerprint,\n };\n this.sendThroughBeforeSend(payload);\n }\n }\n\n addBreadcrumb(type: string, message: string, level?: string, data?: Record<string, unknown>): void {\n const crumb: Breadcrumb = {\n timestamp: new Date().toISOString(),\n type: VALID_BREADCRUMB_TYPES.has(type) ? type : 'default',\n message,\n level: level && VALID_BREADCRUMB_LEVELS.has(level) ? level : 'info',\n ...(data ? { data } : {}),\n };\n if (this.breadcrumbs.length >= this.maxBreadcrumbs) this.breadcrumbs.shift();\n this.breadcrumbs.push(crumb);\n }\n\n clearBreadcrumbs(): void { this.breadcrumbs = []; }\n setUser(user: { id?: string; email?: string }): void { this.config.user = user; }\n setTag(key: string, value: string): void {\n if (!this.config.tags) this.config.tags = {};\n this.config.tags[key] = value;\n }\n /** Bulk-set tags. Merges with existing tags. */\n setTags(tags: Record<string, string>): void {\n if (!this.config.tags) this.config.tags = {};\n Object.assign(this.config.tags, tags);\n }\n /** Set a single extra value. */\n setExtra(key: string, value: unknown): void {\n if (!this.config.extras) this.config.extras = {};\n this.config.extras[key] = value;\n }\n /** Bulk-set extras. Merges with existing extras. */\n setExtras(extras: Record<string, unknown>): void {\n if (!this.config.extras) this.config.extras = {};\n Object.assign(this.config.extras, extras);\n }\n /**\n * Attach a named context bag (e.g. `app`, `device`, `runtime`) — appears\n * under `metadata['context.<name>']` on every subsequent event. Pass\n * `null` to remove a previously-set context.\n */\n setContext(name: string, ctx: Record<string, unknown> | null): void {\n if (!this.config.contexts) this.config.contexts = {};\n if (ctx === null) delete this.config.contexts[name];\n else this.config.contexts[name] = ctx;\n }\n /**\n * Wait for the in-flight retry-buffer to drain. Resolves `true` if the\n * buffer empties within `timeoutMs` (default 2000ms), `false` otherwise.\n */\n flush(timeoutMs?: number): Promise<boolean> {\n return this.transport.flush(timeoutMs);\n }\n\n /** Set the default severity level applied to subsequent captures. */\n setLevel(level: 'fatal' | 'error' | 'warning' | 'info' | 'debug'): void {\n this.config.level = level;\n }\n\n /**\n * Set a custom grouping fingerprint applied to subsequent events.\n * Pass `null` or an empty array to clear and revert to default grouping.\n */\n setFingerprint(fingerprint: string[] | null): void {\n this.config.fingerprint = fingerprint && fingerprint.length > 0 ? fingerprint : undefined;\n }\n setIdentity(identity: { sdkName?: string; sdkVersion?: string; platform?: string; dist?: string }): void {\n if (identity.sdkName) this.config.sdkName = identity.sdkName;\n if (identity.sdkVersion) this.config.sdkVersion = identity.sdkVersion;\n if (identity.platform) this.config.platform = identity.platform;\n if (identity.dist) this.config.dist = identity.dist;\n }\n getSessionId(): string { return this.sessionId; }\n getConfig(): AllStakConfig { return this.config; }\n\n destroy(): void {\n if (typeof window !== 'undefined') {\n if (this.onErrorHandler) window.removeEventListener('error', this.onErrorHandler as EventListener);\n if (this.onRejectionHandler) window.removeEventListener('unhandledrejection', this.onRejectionHandler as EventListener);\n }\n this.onErrorHandler = null;\n this.onRejectionHandler = null;\n this.tracing.destroy();\n if (this.replay) { this.replay.destroy(); this.replay = null; }\n if (this.httpRequests) { this.httpRequests.destroy(); this.httpRequests = null; }\n if (this.webVitals) { this.webVitals.destroy(); this.webVitals = null; }\n this._instrumentAxios = null;\n this.breadcrumbs = [];\n }\n\n private installBrowserHandlers(): void {\n this.onErrorHandler = (ev: ErrorEvent) => {\n const err = ev.error instanceof Error ? ev.error : new Error(ev.message || 'Unknown error');\n this.captureException(err, { source: 'window.onerror' });\n };\n this.onRejectionHandler = (ev: PromiseRejectionEvent) => {\n const err = ev.reason instanceof Error ? ev.reason : new Error(String(ev.reason));\n this.captureException(err, { source: 'window.unhandledrejection' });\n };\n window.addEventListener('error', this.onErrorHandler as EventListener);\n window.addEventListener('unhandledrejection', this.onRejectionHandler as EventListener);\n }\n\n private sendLog(level: string, message: string): void {\n this.transport.send(LOGS_PATH, {\n timestamp: new Date().toISOString(),\n level,\n message,\n sessionId: this.sessionId,\n environment: this.config.environment,\n release: this.config.release,\n platform: this.config.platform,\n sdkName: this.config.sdkName,\n sdkVersion: this.config.sdkVersion,\n metadata: { ...this.releaseTags(), ...this.config.tags },\n });\n }\n\n private passesSampleRate(): boolean {\n const r = this.config.sampleRate;\n if (typeof r !== 'number' || r >= 1) return true;\n if (r <= 0) return false;\n return Math.random() < r;\n }\n\n /**\n * Returns the effective config layer = base config + every active scope.\n * Scope-only overrides (set inside `withScope`) flow into the wire\n * payload without leaking out of the callback.\n */\n private effective(): AllStakConfig {\n return mergeScopes(this.config, this.scopeStack);\n }\n\n private buildMetadata(perCallContext?: Record<string, unknown>): Record<string, unknown> {\n const eff = this.effective();\n const out: Record<string, unknown> = {\n ...this.releaseTags(),\n ...eff.tags,\n ...(eff.extras ?? {}),\n ...(perCallContext ?? {}),\n };\n if (eff.contexts) {\n for (const [name, ctx] of Object.entries(eff.contexts)) {\n out[`context.${name}`] = ctx;\n }\n }\n return out;\n }\n\n /**\n * Run `callback` with a fresh, temporary {@link Scope} that isolates\n * any user/tag/extra/context/fingerprint/level it sets. The scope is\n * popped automatically when the callback returns or throws — including\n * for `Promise`-returning callbacks (the pop runs in `.finally`).\n *\n * Use this on the server (SSR / RSC / API route handlers) to attach\n * per-request user/tags without leaking that data into another request\n * being processed concurrently.\n */\n withScope<T>(callback: (scope: Scope) => T): T {\n const scope = new Scope();\n this.scopeStack.push(scope);\n let popped = false;\n const pop = () => { if (!popped) { popped = true; this.scopeStack.pop(); } };\n try {\n const result = callback(scope);\n if (result && typeof (result as any).then === 'function') {\n return (result as any).then(\n (v: any) => { pop(); return v; },\n (e: any) => { pop(); throw e; },\n );\n }\n pop();\n return result;\n } catch (err) {\n pop();\n throw err;\n }\n }\n\n /** Direct access to the topmost active scope, or null. @internal */\n getCurrentScope(): Scope | null {\n return this.scopeStack[this.scopeStack.length - 1] ?? null;\n }\n\n private async sendThroughBeforeSend(payload: ErrorIngestPayload): Promise<void> {\n let final: ErrorIngestPayload | null | undefined = payload;\n if (this.config.beforeSend) {\n try { final = await this.config.beforeSend(payload); }\n catch { final = payload; /* never let a buggy hook drop telemetry */ }\n }\n if (!final) return; // explicit drop\n this.transport.send(ERRORS_PATH, final);\n }\n\n private releaseTags(): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n if (this.config.sdkName) out['sdk.name'] = this.config.sdkName;\n if (this.config.sdkVersion) out['sdk.version'] = this.config.sdkVersion;\n if (this.config.platform) out['platform'] = this.config.platform;\n if (this.config.dist) out['dist'] = this.config.dist;\n if (this.config.commitSha) out['commit.sha'] = this.config.commitSha;\n if (this.config.branch) out['commit.branch'] = this.config.branch;\n return out;\n }\n}\n\nlet instance: AllStakClient | null = null;\nfunction ensureInit(): AllStakClient {\n if (!instance) throw new Error('AllStak.init() must be called before using the SDK');\n return instance;\n}\n\n/**\n * Module-level breadcrumb forwarder used by the auto-instrumentation\n * wrappers so they always target the current `instance` (after re-init)\n * and silently no-op when there is none.\n */\nfunction safeAddBreadcrumb(\n type: string,\n message: string,\n level?: string,\n data?: Record<string, unknown>,\n): void {\n try { instance?.addBreadcrumb(type, message, level, data); }\n catch { /* never break host */ }\n}\n\n// Wire the navigation module's default-forwarder so router helpers\n// dispatch into the active singleton without an extra import dance.\n__setDefaultBreadcrumbForwarder(safeAddBreadcrumb);\n\nexport const AllStak = {\n init(config: AllStakConfig): AllStakClient {\n if (instance) instance.destroy();\n instance = new AllStakClient(config);\n return instance;\n },\n captureException(error: Error, context?: Record<string, unknown>): void {\n ensureInit().captureException(error, context);\n },\n captureMessage(\n message: string,\n level: 'fatal' | 'error' | 'warning' | 'info' = 'info',\n options?: { as?: 'log' | 'error' | 'both' },\n ): void {\n ensureInit().captureMessage(message, level, options);\n },\n addBreadcrumb(type: string, message: string, level?: string, data?: Record<string, unknown>): void {\n ensureInit().addBreadcrumb(type, message, level, data);\n },\n clearBreadcrumbs(): void { ensureInit().clearBreadcrumbs(); },\n setUser(user: { id?: string; email?: string }): void { ensureInit().setUser(user); },\n setTag(key: string, value: string): void { ensureInit().setTag(key, value); },\n setTags(tags: Record<string, string>): void { ensureInit().setTags(tags); },\n setExtra(key: string, value: unknown): void { ensureInit().setExtra(key, value); },\n setExtras(extras: Record<string, unknown>): void { ensureInit().setExtras(extras); },\n setContext(name: string, ctx: Record<string, unknown> | null): void { ensureInit().setContext(name, ctx); },\n setLevel(level: 'fatal' | 'error' | 'warning' | 'info' | 'debug'): void { ensureInit().setLevel(level); },\n setFingerprint(fingerprint: string[] | null): void { ensureInit().setFingerprint(fingerprint); },\n flush(timeoutMs?: number): Promise<boolean> { return ensureInit().flush(timeoutMs); },\n setIdentity(identity: { sdkName?: string; sdkVersion?: string; platform?: string; dist?: string }): void {\n ensureInit().setIdentity(identity);\n },\n /**\n * Run `callback` with a fresh, temporary {@link Scope}. Any user/tag/\n * extra/context/fingerprint/level set on the scope is visible only inside\n * the callback. Pop is automatic (sync, async, throwing).\n */\n withScope<T>(callback: (scope: Scope) => T): T { return ensureInit().withScope(callback); },\n startSpan(operation: string, options?: { description?: string; tags?: Record<string, string> }): Span {\n return ensureInit().startSpan(operation, options);\n },\n getTraceId(): string { return ensureInit().getTraceId(); },\n setTraceId(traceId: string): void { ensureInit().setTraceId(traceId); },\n getCurrentSpanId(): string | null { return ensureInit().getCurrentSpanId(); },\n resetTrace(): void { ensureInit().resetTrace(); },\n /** Manually instrument an axios instance. No-op when HTTP tracking is off. */\n instrumentAxios<T = any>(axios: T): T { return ensureInit().instrumentAxios(axios); },\n getSessionId(): string { return ensureInit().getSessionId(); },\n getConfig(): AllStakConfig | null { return instance?.getConfig() ?? null; },\n destroy(): void { instance?.destroy(); instance = null; },\n /** @internal */ _getInstance(): AllStakClient | null { return instance; },\n};\n","import * as React from 'react';\nimport { AllStak, AllStakClient } from './client';\nimport type { AllStakConfig } from './client';\n\nexport interface AllStakProviderProps {\n children: React.ReactNode;\n apiKey: string;\n environment?: string;\n release?: string;\n host?: string;\n user?: { id?: string; email?: string };\n tags?: Record<string, string>;\n debug?: boolean;\n enableHttpTracking?: boolean;\n httpTracking?: AllStakConfig['httpTracking'];\n /**\n * Per-console-method capture flags. Defaults: warn + error captured,\n * log + info NOT captured (to avoid breadcrumb spam from typical app\n * logging). Set `{ log: true, info: true }` to opt-in.\n */\n captureConsole?: AllStakConfig['captureConsole'];\n sampleRate?: number;\n beforeSend?: AllStakConfig['beforeSend'];\n replay?: AllStakConfig['replay'];\n tracesSampleRate?: number;\n service?: string;\n dist?: string;\n /** Default true. Capture window error + unhandledrejection. */\n autoCaptureBrowserErrors?: boolean;\n /** Default true. Wrap fetch for breadcrumbs. */\n autoBreadcrumbsFetch?: boolean;\n /** Default true. Wrap console for breadcrumbs (per-method via captureConsole). */\n autoBreadcrumbsConsole?: boolean;\n /** Default true. Patch history.pushState/replaceState + popstate listener. */\n autoBreadcrumbsNavigation?: boolean;\n /** Default true. Collect Web Vitals via PerformanceObserver. */\n autoWebVitals?: boolean;\n /**\n * Tear down the SDK when the provider unmounts. Default `false`.\n *\n * Most apps mount `AllStakProvider` once at the root and never unmount\n * it. Setting this to `true` risks disabling telemetry if the provider\n * re-mounts (Fast Refresh in dev, route key changes, React 18 Strict\n * Mode double-mount, etc.) — there is a brief window between unmount\n * and remount where captures throw.\n *\n * Leave at the default unless you genuinely need to dispose the SDK.\n */\n destroyOnUnmount?: boolean;\n fallback?:\n | React.ReactNode\n | ((props: { error: Error; resetError: () => void }) => React.ReactNode);\n onError?: (error: Error, componentStack?: string) => void;\n}\n\ninterface ErrorBoundaryState {\n error: Error | null;\n}\n\nconst AllStakContext = React.createContext<AllStakClient | null>(null);\n\n// Module-level guard so re-mounts of <AllStakProvider> reuse the existing\n// singleton instead of destroying + re-creating it (which would briefly\n// break captureException calls and clear breadcrumbs).\nlet __providerOwnedInstance: AllStakClient | null = null;\n\nclass AllStakErrorBoundaryInner extends React.Component<\n {\n children: React.ReactNode;\n fallback?: AllStakProviderProps['fallback'];\n onError?: AllStakProviderProps['onError'];\n debug?: boolean;\n },\n ErrorBoundaryState\n> {\n state: ErrorBoundaryState = { error: null };\n\n static getDerivedStateFromError(error: Error): ErrorBoundaryState {\n return { error };\n }\n\n componentDidCatch(error: Error, info: React.ErrorInfo): void {\n try {\n AllStak.addBreadcrumb('ui', 'React error boundary caught error', 'error', {\n componentStack: info.componentStack ?? '',\n });\n AllStak.captureException(error, {\n componentStack: info.componentStack ?? '',\n source: 'AllStakProvider.ErrorBoundary',\n });\n if (this.props.debug) {\n // eslint-disable-next-line no-console\n console.log(`[AllStak] Captured render error: ${error.message}`);\n }\n } catch { /* never break the host app */ }\n try { this.props.onError?.(error, info.componentStack ?? undefined); }\n catch { /* ignore */ }\n }\n\n private resetError = () => this.setState({ error: null });\n\n render(): React.ReactNode {\n if (this.state.error) {\n const { fallback } = this.props;\n if (typeof fallback === 'function') {\n return fallback({ error: this.state.error, resetError: this.resetError });\n }\n if (fallback !== undefined) return fallback;\n return null;\n }\n return this.props.children;\n }\n}\n\nexport function AllStakProvider({\n children,\n apiKey,\n environment,\n release,\n host,\n user,\n tags,\n debug,\n enableHttpTracking,\n httpTracking,\n captureConsole,\n sampleRate,\n beforeSend,\n replay,\n tracesSampleRate,\n service,\n dist,\n autoCaptureBrowserErrors,\n autoBreadcrumbsFetch,\n autoBreadcrumbsConsole,\n autoBreadcrumbsNavigation,\n autoWebVitals,\n destroyOnUnmount = false,\n fallback,\n onError,\n}: AllStakProviderProps): React.ReactElement {\n const clientRef = React.useRef<AllStakClient | null>(null);\n\n if (!clientRef.current) {\n // If a previous provider mount left an instance live, reuse it.\n // Covers React 18 Strict Mode double-mount and Fast Refresh.\n const existing = AllStak._getInstance();\n if (existing && __providerOwnedInstance === existing) {\n clientRef.current = existing;\n if (debug) {\n // eslint-disable-next-line no-console\n console.log(`[AllStak] Reusing session ${AllStak.getSessionId()}`);\n }\n } else {\n const config: AllStakConfig = {\n apiKey,\n environment,\n release,\n host,\n user,\n tags,\n enableHttpTracking,\n httpTracking,\n captureConsole,\n sampleRate,\n beforeSend,\n replay,\n tracesSampleRate,\n service,\n dist,\n autoCaptureBrowserErrors,\n autoBreadcrumbsFetch,\n autoBreadcrumbsConsole,\n autoBreadcrumbsNavigation,\n autoWebVitals,\n };\n clientRef.current = AllStak.init(config);\n __providerOwnedInstance = clientRef.current;\n\n if (debug) {\n // eslint-disable-next-line no-console\n console.log(`[AllStak] Initialized — session ${AllStak.getSessionId()}`);\n if (autoBreadcrumbsNavigation !== false) {\n // eslint-disable-next-line no-console\n console.log('[AllStak] Navigation auto-instrumentation enabled');\n } else {\n // eslint-disable-next-line no-console\n console.log('[AllStak] Navigation auto-instrumentation not applied; use manual fallback');\n }\n }\n }\n }\n\n React.useEffect(() => {\n return () => {\n if (destroyOnUnmount) {\n AllStak.destroy();\n __providerOwnedInstance = null;\n clientRef.current = null;\n if (debug) {\n // eslint-disable-next-line no-console\n console.log('[AllStak] Destroyed on unmount');\n }\n }\n };\n }, [destroyOnUnmount, debug]);\n\n return (\n <AllStakContext.Provider value={clientRef.current}>\n <AllStakErrorBoundaryInner fallback={fallback} onError={onError} debug={debug}>\n {children}\n </AllStakErrorBoundaryInner>\n </AllStakContext.Provider>\n );\n}\n\n/**\n * Convenience hook — exposes the most common capture/context APIs with\n * a stable identity so components don't have to import the namespace.\n */\nexport function useAllStak() {\n return React.useMemo(\n () => ({\n captureException: (error: Error, ctx?: Record<string, unknown>) =>\n AllStak.captureException(error, ctx),\n captureMessage: (\n msg: string,\n level: 'fatal' | 'error' | 'warning' | 'info' = 'info',\n ) => AllStak.captureMessage(msg, level),\n setUser: (user: { id?: string; email?: string }) => AllStak.setUser(user),\n setTag: (key: string, value: string) => AllStak.setTag(key, value),\n setContext: (name: string, ctx: Record<string, unknown> | null) =>\n AllStak.setContext(name, ctx),\n addBreadcrumb: (\n type: string,\n message: string,\n level?: string,\n data?: Record<string, unknown>,\n ) => AllStak.addBreadcrumb(type, message, level, data),\n flush: (timeoutMs?: number) => AllStak.flush(timeoutMs),\n }),\n [],\n );\n}\n\n/** @internal — for tests. Resets the module-level remount-guard. */\nexport function __resetProviderInstanceForTest(): void {\n __providerOwnedInstance = null;\n}\n"],"mappings":"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","names":["React","isOwnIngest","location","FLUSH_INTERVAL_MS","FLAG","id","FLUSH_INTERVAL_MS","BATCH_SIZE_THRESHOLD","FETCH_FLAG","module","FLAG","Component"]}
|