@allstak/react-native 0.3.2 → 0.3.3

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/transport.ts","../src/stack.ts","../src/utils/debug-id.ts","../src/scope.ts","../src/tracing.ts","../src/replay-surrogate.ts","../src/http-requests.ts","../src/http-redact.ts","../src/http-instrumentation.ts","../src/client.ts","../src/provider.tsx","../src/auto-breadcrumbs.ts","../src/architecture.ts","../src/navigation.ts","../src/install.ts","../src/index.ts"],"sourcesContent":["/**\n * Fail-open HTTP transport for React Native. 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 interface TransportStats {\n queued: number;\n sent: number;\n failed: number;\n dropped: number;\n consecutiveFailures: number;\n circuitOpenUntil: number;\n lastTransportLatencyMs?: number;\n lastFlushDurationMs?: number;\n}\n\nexport class HttpTransport {\n private buffer: Pending[] = [];\n private flushing = false;\n private consecutiveFailures = 0;\n private circuitOpenUntil = 0;\n private sent = 0;\n private failed = 0;\n private dropped = 0;\n private lastTransportLatencyMs: number | undefined;\n private lastFlushDurationMs: number | undefined;\n\n constructor(\n private baseUrl: string,\n private apiKey: string,\n private enabled = true,\n ) {}\n\n send(path: string, payload: unknown): Promise<void> {\n if (!this.enabled) {\n this.noteDropped();\n return Promise.resolve();\n }\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.sent++;\n this.consecutiveFailures = 0;\n this.circuitOpenUntil = 0;\n this.scheduleFlush();\n } catch (err) {\n this.failed++;\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 const started = Date.now();\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 this.lastTransportLatencyMs = Date.now() - started;\n }\n }\n\n private push(item: Pending): void {\n if (this.buffer.length >= MAX_BUFFER) {\n this.buffer.shift();\n this.dropped++;\n }\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 const started = Date.now();\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.sent++;\n this.consecutiveFailures = 0;\n this.circuitOpenUntil = 0;\n } catch (err) {\n this.failed++;\n this.recordFailure(err);\n this.push(item);\n }\n }\n } finally {\n this.lastFlushDurationMs = Date.now() - started;\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 noteDropped(count = 1): void {\n this.dropped += Math.max(0, count);\n }\n\n getStats(): TransportStats {\n return {\n queued: this.buffer.length,\n sent: this.sent,\n failed: this.failed,\n dropped: this.dropped,\n consecutiveFailures: this.consecutiveFailures,\n circuitOpenUntil: this.circuitOpenUntil,\n lastTransportLatencyMs: this.lastTransportLatencyMs,\n lastFlushDurationMs: this.lastFlushDurationMs,\n };\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 before navigation away or during native crash drain.\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 * Runtime debug-ID resolver for React Native.\n *\n * The build-time source map injector (`build/sourcemaps.ts`) appends\n * `//# debugId=<uuid>` to every JS bundle and writes the same UUID\n * into the matching `.map` file. At runtime, the symbolicator needs\n * that UUID per stack frame to pick the right source map.\n *\n * In React Native the primary lookup path is the global registry:\n * `globalThis._allstakDebugIds` — a `{ [bundleUrl]: uuid }` map\n * populated by the injected code at bundle evaluation time.\n *\n * This is a best-effort resolver: it returns `undefined` when no\n * debug ID can be found. The symbolicator handles missing IDs\n * gracefully (falls back to release-based lookup).\n */\n\nconst REGISTRY_KEY = '_allstakDebugIds';\n\nconst cache = new Map<string, string | null>();\n\nexport function resolveDebugId(filename: string | undefined): string | undefined {\n if (!filename) return undefined;\n\n if (cache.has(filename)) return cache.get(filename) ?? undefined;\n\n // Global registry — set by the build-time injector. Indexed by the\n // bundle URL that the runtime loaded.\n const registry = (globalThis as { [REGISTRY_KEY]?: Record<string, string> })[REGISTRY_KEY];\n if (registry && typeof registry === 'object') {\n const hit = registry[filename];\n if (typeof hit === 'string' && hit.length > 0) {\n cache.set(filename, hit);\n return hit;\n }\n }\n\n cache.set(filename, null);\n return undefined;\n}\n\n/** Test-only: reset the per-process cache. */\nexport function _resetDebugIdCache(): void {\n cache.clear();\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 (this.flushTimer as any)?.unref?.();\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 * React Native \"replay surrogate\" — a privacy-first view-state breadcrumb\n * recorder for environments where binary screen capture isn't available\n * (Expo Go, JS-only test runners, or apps that can't link a native module\n * for legal/compliance reasons).\n *\n * **What it captures (chronological, opt-in via sampleRate):**\n * - the active route name on every navigation event\n * - AppState foreground/background transitions (already covered by\n * installReactNative's AppState breadcrumb wiring — we reuse that)\n * - explicit `recordScreenView(name, params)` calls from the host app\n * (used by router integrations or manual checkpoints)\n *\n * **What it intentionally does NOT capture:**\n * - any user input values (text fields, password inputs, search queries)\n * - any rendered text content from the visible screen\n * - screenshots of any kind\n * - URL path parameters by default (only the route name + opt-in `safeParams`)\n *\n * Hard rule: by default `safeParams` is `[]` and route params are dropped.\n * Callers must explicitly enumerate which param keys are safe to log.\n */\n\nimport type { HttpTransport } from './transport';\n\nconst REPLAY_INGEST_PATH = '/ingest/v1/replay';\nconst FLUSH_INTERVAL_MS = 10_000;\n\nexport interface ReplaySurrogateOptions {\n enabled?: boolean;\n /** Probability in [0, 1] per session that recording happens. Default 0 (opt-in). */\n sampleRate?: number;\n /**\n * Whitelist of route-param keys that are safe to record alongside the\n * route name. Anything not on this list is dropped. Default `[]`.\n */\n safeParams?: string[];\n /** Max events buffered before forced flush. Default 200. */\n maxBufferedEvents?: number;\n}\n\ninterface SurrogateEvent {\n ts: number;\n k: 'screen' | 'appstate' | 'manual' | 'request' | 'exception' | 'response' | 'action' | 'retry';\n data: Record<string, unknown>;\n}\n\nexport interface TimelineContext {\n traceId?: string;\n requestId?: string;\n spanId?: string;\n eventId?: string;\n release?: string;\n dist?: string;\n screen?: string;\n route?: string;\n}\n\nexport class ReplaySurrogate {\n private buffer: SurrogateEvent[] = [];\n private flushTimer: ReturnType<typeof setInterval> | null = null;\n private opts: Required<ReplaySurrogateOptions>;\n private sessionId: string;\n private active = false;\n private destroyed = false;\n\n constructor(\n private transport: HttpTransport,\n sessionId: string,\n options: ReplaySurrogateOptions = {},\n ) {\n this.sessionId = sessionId;\n this.opts = {\n enabled: options.enabled ?? true,\n sampleRate: options.sampleRate ?? 0,\n safeParams: options.safeParams ?? [],\n maxBufferedEvents: options.maxBufferedEvents ?? 200,\n };\n }\n\n /** Enable recording for this session if sample-rate roll passes. */\n start(): boolean {\n if (!this.opts.enabled) return false;\n if (this.active) return true;\n if (Math.random() >= this.opts.sampleRate) return false;\n this.active = true;\n this.flushTimer = setInterval(() => this.flush(), FLUSH_INTERVAL_MS);\n (this.flushTimer as any)?.unref?.();\n return true;\n }\n\n /** Record a screen view. Filters params through the safeParams allow-list. */\n recordScreenView(routeName: string, params?: Record<string, unknown>, context?: TimelineContext): void {\n if (!this.active) return;\n const safe: Record<string, unknown> = {};\n if (params && this.opts.safeParams.length > 0) {\n for (const key of this.opts.safeParams) {\n if (key in params) safe[key] = params[key];\n }\n }\n this.push({ ts: Date.now(), k: 'screen', data: { route: routeName, params: safe, ...compact(context) } });\n }\n\n /** Record an AppState transition (foreground/background/inactive). */\n recordAppState(next: string, context?: TimelineContext): void {\n if (!this.active) return;\n this.push({ ts: Date.now(), k: 'appstate', data: { state: next, ...compact(context) } });\n }\n\n /** Record a free-form, customer-validated checkpoint. */\n recordManual(label: string, data?: Record<string, unknown>, context?: TimelineContext): void {\n if (!this.active) return;\n this.push({ ts: Date.now(), k: 'manual', data: { label, ...(data ?? {}), ...compact(context) } });\n }\n\n /** Record a forensic mobile session timeline marker. This is not replay. */\n recordTimelineMarker(\n kind: SurrogateEvent['k'],\n label: string,\n data?: Record<string, unknown>,\n context?: TimelineContext,\n ): void {\n if (!this.active) return;\n this.push({ ts: Date.now(), k: kind, data: { label, ...(data ?? {}), ...compact(context) } });\n }\n\n destroy(): void {\n this.destroyed = true;\n this.active = false;\n if (this.flushTimer) { clearInterval(this.flushTimer); this.flushTimer = null; }\n this.flush();\n }\n\n /** @internal — for tests. */\n isActive(): boolean { return this.active; }\n /** @internal — for tests. */\n getBuffer(): ReadonlyArray<SurrogateEvent> { return this.buffer; }\n\n private push(ev: SurrogateEvent): 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\nfunction compact(context?: TimelineContext): Record<string, unknown> {\n if (!context) return {};\n const out: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(context)) {\n if (value !== undefined && value !== null && value !== '') out[key] = value;\n }\n return out;\n}\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 traceId: string;\n requestId: string;\n spanId?: string;\n parentSpanId?: string;\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 requestBodyStatus?: string;\n responseBodyStatus?: string;\n requestBodyRedactedFields?: string[];\n responseBodyRedactedFields?: string[];\n requestBodyTruncated?: boolean;\n responseBodyTruncated?: boolean;\n capturePolicy?: string;\n linkConfidence?: 'exact' | 'inferred' | 'weak' | 'none';\n}\n\nexport interface HttpRequestIngestItem {\n type: 'http_request';\n traceId: string;\n requestId: 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 spanId?: string;\n parentSpanId?: string;\n requestBodyStatus?: string;\n responseBodyStatus?: string;\n requestBodyRedactedFields?: string[];\n responseBodyRedactedFields?: string[];\n requestBodyTruncated?: boolean;\n responseBodyTruncated?: boolean;\n capturePolicy?: string;\n linkConfidence?: 'exact' | 'inferred' | 'weak' | 'none';\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 genRequestId(): string {\n return genTraceId();\n}\n\nexport function generateHttpId(): string {\n return genTraceId();\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 requestId: ev.requestId ?? genRequestId(),\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 spanId: ev.spanId,\n parentSpanId: ev.parentSpanId,\n requestBodyStatus: ev.requestBodyStatus,\n responseBodyStatus: ev.responseBodyStatus,\n requestBodyRedactedFields: ev.requestBodyRedactedFields,\n responseBodyRedactedFields: ev.responseBodyRedactedFields,\n requestBodyTruncated: ev.requestBodyTruncated,\n responseBodyTruncated: ev.responseBodyTruncated,\n capturePolicy: ev.capturePolicy,\n linkConfidence: ev.linkConfidence ?? 'exact',\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) {\n this.flushTimer = setInterval(() => this.flush(), FLUSH_INTERVAL_MS);\n (this.flushTimer as any)?.unref?.();\n }\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 const DEFAULT_REDACT_BODY_FIELDS = [\n 'password',\n 'passcode',\n 'otp',\n 'token',\n 'authorization',\n 'cookie',\n 'session',\n 'refresh_token',\n 'access_token',\n 'jwt',\n 'card',\n 'credit_card',\n 'iban',\n 'national_id',\n 'secret',\n 'api_key',\n];\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 /** Content types eligible for body capture. Default JSON + text payloads. */\n allowedContentTypes?: string[];\n /** Additional JSON body fields to redact recursively. */\n redactBodyFields?: string[];\n}\n\nexport interface CapturedBody {\n body?: string;\n status: 'disabled' | 'captured' | 'redacted' | 'truncated' | 'unsupported' | 'empty';\n redactedFields: string[];\n truncated: boolean;\n capturePolicy: string;\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 captureBodyResult(\n body: unknown,\n enabled: boolean,\n maxBodyBytes: number,\n opts: HttpTrackingOptions = {},\n contentType?: string,\n): CapturedBody {\n if (!enabled) {\n return {\n status: 'disabled',\n redactedFields: [],\n truncated: false,\n capturePolicy: 'body_capture_disabled',\n };\n }\n if (body == null) {\n return {\n status: 'empty',\n redactedFields: [],\n truncated: false,\n capturePolicy: 'empty_body',\n };\n }\n const allowed = opts.allowedContentTypes ?? ['application/json', 'text/', 'application/problem+json'];\n if (contentType && !allowed.some((needle) => contentType.toLowerCase().includes(needle.toLowerCase()))) {\n return {\n status: 'unsupported',\n redactedFields: [],\n truncated: false,\n capturePolicy: `unsupported_content_type:${contentType}`,\n };\n }\n\n let str: string;\n let redactedFields: 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]') {\n return {\n body: '<binary>',\n status: 'unsupported',\n redactedFields: [],\n truncated: false,\n capturePolicy: 'unsupported_binary_body',\n };\n }\n const redacted = redactJsonValue(body, opts);\n redactedFields = redacted.redactedFields;\n try { str = JSON.stringify(redacted.value); } catch {\n return {\n body: '<unserializable>',\n status: 'unsupported',\n redactedFields,\n truncated: false,\n capturePolicy: 'unserializable_body',\n };\n }\n } else {\n return {\n body: '<binary>',\n status: 'unsupported',\n redactedFields: [],\n truncated: false,\n capturePolicy: 'unsupported_body_type',\n };\n }\n\n if (typeof body === 'string' && looksJson(contentType, str)) {\n try {\n const redacted = redactJsonValue(JSON.parse(str), opts);\n redactedFields = redacted.redactedFields;\n str = JSON.stringify(redacted.value);\n } catch {\n str = redactSensitiveText(str, opts);\n }\n }\n\n let truncated = false;\n if (str.length > maxBodyBytes) {\n str = str.slice(0, maxBodyBytes) + '…[truncated]';\n truncated = true;\n }\n return {\n body: str,\n status: truncated ? 'truncated' : redactedFields.length > 0 ? 'redacted' : 'captured',\n redactedFields: Array.from(new Set(redactedFields)).sort(),\n truncated,\n capturePolicy: 'opt_in_body_capture',\n };\n}\n\nexport function captureBody(\n body: unknown,\n enabled: boolean,\n maxBodyBytes: number,\n): string | undefined {\n return captureBodyResult(body, enabled, maxBodyBytes).body;\n}\n\nfunction looksJson(contentType: string | undefined, body: string): boolean {\n if (contentType && contentType.toLowerCase().includes('json')) return true;\n const trimmed = body.trim();\n return (trimmed.startsWith('{') && trimmed.endsWith('}')) || (trimmed.startsWith('[') && trimmed.endsWith(']'));\n}\n\nfunction redactJsonValue(value: unknown, opts: HttpTrackingOptions, path = ''): { value: unknown; redactedFields: string[] } {\n const fieldSet = new Set([...DEFAULT_REDACT_BODY_FIELDS, ...(opts.redactBodyFields ?? [])].map((v) => v.toLowerCase()));\n const redactedFields: string[] = [];\n const walk = (input: unknown, currentPath: string): unknown => {\n if (Array.isArray(input)) return input.map((item, index) => walk(item, `${currentPath}[${index}]`));\n if (!input || typeof input !== 'object') return input;\n const out: Record<string, unknown> = {};\n for (const [key, raw] of Object.entries(input as Record<string, unknown>)) {\n const keyLower = key.toLowerCase();\n const nextPath = currentPath ? `${currentPath}.${key}` : key;\n if (fieldSet.has(keyLower) || keyLower.includes('token') || keyLower.includes('password')) {\n out[key] = REDACTED;\n redactedFields.push(nextPath);\n } else {\n out[key] = walk(raw, nextPath);\n }\n }\n return out;\n };\n return { value: walk(value, path), redactedFields };\n}\n\nfunction redactSensitiveText(input: string, opts: HttpTrackingOptions): string {\n const fields = [...DEFAULT_REDACT_BODY_FIELDS, ...(opts.redactBodyFields ?? [])];\n let out = input;\n for (const key of fields) {\n const escaped = key.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n out = out.replace(new RegExp(`(\"${escaped}\"\\\\s*:\\\\s*)\"[^\"]*\"`, 'gi'), `$1\"${REDACTED}\"`);\n }\n return out;\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, generateHttpId } from './http-requests';\nimport type { TracingModule, Span } from './tracing';\nimport type { ReplaySurrogate } from './replay-surrogate';\nimport {\n HttpTrackingOptions,\n redactUrl,\n sanitizeHeaders,\n shouldCaptureUrl,\n captureBodyResult,\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;\nlet _currentRuntime: RuntimeBinding | null = null;\nfunction currentModule(): HttpRequestModule | null { return _currentModule; }\nfunction currentOpts(): BoundOptions | null { return _currentOpts; }\nfunction currentRuntime(): RuntimeBinding | null { return _currentRuntime; }\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\ninterface RuntimeBinding {\n tracing: TracingModule;\n replay: ReplaySurrogate | null;\n release?: string;\n dist?: string;\n platform?: string;\n environment?: string;\n}\n\ninterface RequestContext {\n traceId: string;\n requestId: string;\n spanId: string;\n parentSpanId: string;\n traceparent: string;\n span: Span;\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 allowedContentTypes: opts.allowedContentTypes ?? ['application/json', 'text/', 'application/problem+json'],\n redactBodyFields: opts.redactBodyFields ?? [],\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\nfunction normalizeTraceId(traceId: string): string {\n const hex = traceId.replace(/[^a-fA-F0-9]/g, '').toLowerCase();\n return (hex + '00000000000000000000000000000000').slice(0, 32);\n}\n\nfunction normalizeSpanId(spanId: string): string {\n const hex = spanId.replace(/[^a-fA-F0-9]/g, '').toLowerCase();\n return (hex + '0000000000000000').slice(0, 16);\n}\n\nfunction createRequestContext(method: string, url: string): RequestContext | null {\n const runtime = currentRuntime();\n if (!runtime) return null;\n const requestId = generateHttpId();\n const parentSpanId = runtime.tracing.getCurrentSpanId() ?? '';\n const span = runtime.tracing.startSpan('mobile.http', {\n description: `${method.toUpperCase()} ${url}`,\n tags: { requestId, method: method.toUpperCase(), platform: runtime.platform ?? 'react-native' },\n });\n const traceId = runtime.tracing.getTraceId();\n const spanId = span.spanId;\n return {\n traceId,\n requestId,\n spanId,\n parentSpanId,\n traceparent: `00-${normalizeTraceId(traceId)}-${normalizeSpanId(spanId)}-01`,\n span,\n };\n}\n\nfunction propagationHeaders(ctx: RequestContext): Record<string, string> {\n const headers: Record<string, string> = {\n traceparent: ctx.traceparent,\n 'x-allstak-trace-id': ctx.traceId,\n 'x-allstak-request-id': ctx.requestId,\n };\n if (ctx.parentSpanId) headers['x-allstak-parent-span-id'] = ctx.parentSpanId;\n return headers;\n}\n\nfunction mergeHeaders(headers: any, propagation: Record<string, string>): any {\n const entries = Object.entries(propagation);\n if (typeof Headers !== 'undefined' && headers instanceof Headers) {\n const next = new Headers(headers);\n for (const [k, v] of entries) if (!next.has(k)) next.set(k, v);\n return next;\n }\n if (Array.isArray(headers)) {\n const existing = new Set(headers.map(([k]) => String(k).toLowerCase()));\n const next = [...headers];\n for (const [k, v] of entries) if (!existing.has(k.toLowerCase())) next.push([k, v]);\n return next;\n }\n const next: Record<string, string> = { ...(headers ?? {}) };\n const lower = new Set(Object.keys(next).map((k) => k.toLowerCase()));\n for (const [k, v] of entries) if (!lower.has(k.toLowerCase())) next[k] = v;\n return next;\n}\n\nfunction injectFetchHeaders(input: any, init: any, ctx: RequestContext): { input: any; init: any } {\n const headers = mergeHeaders(init?.headers ?? (input && typeof input === 'object' ? input.headers : undefined), propagationHeaders(ctx));\n return { input, init: { ...(init ?? {}), headers } };\n}\n\nfunction recordTimeline(kind: 'request' | 'exception' | 'response' | 'retry', label: string, ctx: RequestContext, data?: Record<string, unknown>): void {\n try {\n currentRuntime()?.replay?.recordTimelineMarker?.(kind, label, data, {\n traceId: ctx.traceId,\n requestId: ctx.requestId,\n spanId: ctx.spanId,\n release: currentRuntime()?.release,\n dist: currentRuntime()?.dist,\n });\n } catch { /* never break host */ }\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 ctx = createRequestContext(method, sanitizedUrl);\n const requestInit = ctx ? injectFetchHeaders(input, init, ctx).init : init;\n if (ctx) recordTimeline('request', 'request_started', ctx, { method, url: sanitizedUrl });\n const reqHeaders = sanitizeHeaders(headersToObject(requestInit?.headers ?? (input && input.headers)), opts);\n const reqBody = captureBodyResult(requestInit?.body, opts.captureRequestBody, opts.maxBodyBytes, opts, reqHeaders?.['content-type']);\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, requestInit);\n } catch (err) {\n ctx?.span.finish('error');\n if (ctx) recordTimeline('exception', 'request_failed', ctx, { method, url: sanitizedUrl, error: String((err as any)?.message ?? err) });\n safeCapture({\n type: 'http_request',\n traceId: ctx?.traceId ?? generateHttpId(),\n requestId: ctx?.requestId ?? generateHttpId(),\n spanId: ctx?.spanId,\n parentSpanId: ctx?.parentSpanId,\n method, url: sanitizedUrl, statusCode: 0,\n durationMs: Date.now() - start,\n requestBody: reqBody.body, requestHeaders: reqHeaders, requestSize: reqSize,\n requestBodyStatus: reqBody.status,\n requestBodyRedactedFields: reqBody.redactedFields,\n requestBodyTruncated: reqBody.truncated,\n capturePolicy: reqBody.capturePolicy,\n error: String((err as any)?.message ?? err),\n linkConfidence: 'exact',\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 = captureBodyResult(text, true, opts.maxBodyBytes, opts, respHeaders?.['content-type']).body;\n if (respSize == null) respSize = safeByteLength(text);\n } catch { /* clone unsafe — leave body undefined */ }\n }\n } catch { /* never break the response surface */ }\n const respBodyResult = captureBodyResult(respBody, opts.captureResponseBody && respBody !== undefined, opts.maxBodyBytes, opts, respHeaders?.['content-type']);\n const isError = response.status >= 400;\n ctx?.span.setTag('requestId', ctx.requestId).setTag('http.status_code', String(response.status)).finish(isError ? 'error' : 'ok');\n if (ctx) recordTimeline(isError ? 'exception' : 'response', isError ? 'request_failed' : 'response_received', ctx, { statusCode: response.status, durationMs });\n\n safeCapture({\n type: 'http_request',\n traceId: ctx?.traceId ?? generateHttpId(),\n requestId: ctx?.requestId ?? generateHttpId(),\n spanId: ctx?.spanId,\n parentSpanId: ctx?.parentSpanId,\n method, url: sanitizedUrl,\n statusCode: response.status, durationMs,\n requestBody: reqBody.body, requestHeaders: reqHeaders, requestSize: reqSize,\n responseBody: respBodyResult.body, responseHeaders: respHeaders, responseSize: respSize,\n requestBodyStatus: reqBody.status,\n responseBodyStatus: respBodyResult.status,\n requestBodyRedactedFields: reqBody.redactedFields,\n responseBodyRedactedFields: respBodyResult.redactedFields,\n requestBodyTruncated: reqBody.truncated,\n responseBodyTruncated: respBodyResult.truncated,\n capturePolicy: `${reqBody.capturePolicy};${respBodyResult.capturePolicy}`,\n linkConfidence: 'exact',\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 ctx = createRequestContext(method, sanitizedUrl);\n if (ctx) {\n for (const [k, v] of Object.entries(propagationHeaders(ctx))) {\n try { origSetRequestHeader.call(this, k, v); } catch { /* ignore */ }\n }\n recordTimeline('request', 'request_started', ctx, { method, url: sanitizedUrl });\n }\n const reqBody = captureBodyResult(body, opts.captureRequestBody, opts.maxBodyBytes, opts, reqHeaders?.['content-type']);\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 let respBodyResult = captureBodyResult(undefined, false, liveOpts.maxBodyBytes, liveOpts);\n if (liveOpts.captureResponseBody) {\n const text = (this as any).responseText;\n if (typeof text === 'string') {\n respBodyResult = captureBodyResult(text, true, liveOpts.maxBodyBytes, liveOpts, respHeaders?.['content-type']);\n respBody = respBodyResult.body;\n respSize = safeByteLength(text);\n }\n }\n } catch { /* never break */ }\n const failed = !!error || statusCode >= 400;\n ctx?.span.setTag('requestId', ctx.requestId).setTag('http.status_code', String(statusCode)).finish(failed ? 'error' : 'ok');\n if (ctx) recordTimeline(failed ? 'exception' : 'response', failed ? 'request_failed' : 'response_received', ctx, { statusCode, durationMs, error });\n\n safeCapture({\n type: 'http_request',\n traceId: ctx?.traceId ?? generateHttpId(),\n requestId: ctx?.requestId ?? generateHttpId(),\n spanId: ctx?.spanId,\n parentSpanId: ctx?.parentSpanId,\n method, url: sanitizedUrl,\n statusCode, durationMs,\n requestBody: reqBody.body, requestHeaders: reqHeaders, requestSize: reqSize,\n responseBody: respBody, responseHeaders: respHeaders, responseSize: respSize,\n requestBodyStatus: reqBody.status,\n responseBodyStatus: respBody ? 'captured' : opts.captureResponseBody ? 'empty' : 'disabled',\n requestBodyRedactedFields: reqBody.redactedFields,\n requestBodyTruncated: reqBody.truncated,\n capturePolicy: reqBody.capturePolicy,\n error,\n linkConfidence: 'exact',\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; ctx: RequestContext | null }>();\n\n axiosInstance.interceptors.request.use((config: any) => {\n try {\n const rawUrl = (config.baseURL ? config.baseURL.replace(/\\/$/, '') : '') + (config.url || '');\n const method = String(config.method || 'GET').toUpperCase();\n const ctx = createRequestContext(method, rawUrl);\n if (ctx) {\n config.headers = mergeHeaders(config.headers, propagationHeaders(ctx));\n recordTimeline('request', 'request_started', ctx, { method, url: rawUrl });\n }\n reqStarts.set(config, {\n start: Date.now(),\n method,\n rawUrl,\n ctx,\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 = captureBodyResult(cfg.data, opts.captureRequestBody, opts.maxBodyBytes, opts, reqHeaders?.['content-type']);\n const respHeaders = sanitizeHeaders(headersToObject(response?.headers), opts);\n const respBody = captureBodyResult(response?.data, opts.captureResponseBody, opts.maxBodyBytes, opts, respHeaders?.['content-type']);\n const failed = !!error || statusCode >= 400;\n meta.ctx?.span.setTag('requestId', meta.ctx.requestId).setTag('http.status_code', String(statusCode)).finish(failed ? 'error' : 'ok');\n if (meta.ctx) recordTimeline(failed ? 'exception' : 'response', failed ? 'request_failed' : 'response_received', meta.ctx, { statusCode, error });\n\n try {\n module.capture({\n type: 'http_request',\n traceId: meta.ctx?.traceId ?? generateHttpId(),\n requestId: meta.ctx?.requestId ?? generateHttpId(),\n spanId: meta.ctx?.spanId,\n parentSpanId: meta.ctx?.parentSpanId,\n method: meta.method,\n url: sanitizedUrl,\n statusCode,\n durationMs: Date.now() - meta.start,\n requestBody: reqBody.body,\n requestHeaders: reqHeaders,\n responseBody: respBody.body,\n responseHeaders: respHeaders,\n requestBodyStatus: reqBody.status,\n responseBodyStatus: respBody.status,\n requestBodyRedactedFields: reqBody.redactedFields,\n responseBodyRedactedFields: respBody.redactedFields,\n requestBodyTruncated: reqBody.truncated,\n responseBodyTruncated: respBody.truncated,\n capturePolicy: `${reqBody.capturePolicy};${respBody.capturePolicy}`,\n error,\n linkConfidence: 'exact',\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 runtime: RuntimeBinding,\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 _currentRuntime = runtime;\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 _currentRuntime = 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 * Standalone AllStak client for React Native. No browser APIs, no Node APIs —\n * only what RN guarantees: global `fetch`, AbortController, Date, JSON.\n *\n * Surface mirrors the public AllStak API used by mobile apps:\n * init / captureException / captureMessage / addBreadcrumb / clearBreadcrumbs\n * setUser / setTag / setIdentity / getSessionId\n */\n\nimport { HttpTransport, TransportStats } from './transport';\nimport { parseStack } from './stack';\nimport { resolveDebugId } from './utils/debug-id';\nimport { Scope, mergeScopes } from './scope';\nimport { TracingModule, Span } from './tracing';\nimport { ReplaySurrogate, ReplaySurrogateOptions } from './replay-surrogate';\nimport { HttpRequestModule } from './http-requests';\nimport type { HttpTrackingOptions } from './http-redact';\nimport { installHttpInstrumentation, unbindHttpInstrumentation } from './http-instrumentation';\nimport type { ConsoleCaptureOptions } from './auto-breadcrumbs';\n\nexport const INGEST_HOST = 'https://api.allstak.sa';\nexport const SDK_NAME = 'allstak-react-native';\nexport const SDK_VERSION = '0.3.1';\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 * Affects `captureException` (sets `payload.level`) and the default of\n * `captureMessage`. Customer-set default severity, mirrors `setLevel`.\n */\n level?: 'fatal' | 'error' | 'warning' | 'info' | 'debug';\n /**\n * Custom grouping fingerprint applied to every event. The backend uses\n * this in place of stack-based grouping. 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 /**\n * Privacy-first view-state replay surrogate. **Off by default.** Enable\n * with `replay: { sampleRate: 0.1, safeParams: ['screenId'] }`. Captures\n * route names + AppState transitions + manual checkpoints — never inputs\n * or rendered text. See `src/replay-surrogate.ts` for the privacy contract.\n */\n replay?: ReplaySurrogateOptions;\n /**\n * Auto-instrument outbound HTTP — wraps `fetch`, `XMLHttpRequest`, and\n * (when present) `axios`. Default: false. Combine with `httpTracking`\n * to control body/header capture and redaction. Idempotent.\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 * 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 maxBreadcrumbs?: number;\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 /**\n * Optional fail-open screenshot capture. Off by default and provider-based\n * so Expo/RN apps choose their own native or JS screenshot implementation.\n * The SDK bounds timeout/size/sampling and drops screenshots before it can\n * hurt app navigation, JS thread responsiveness, or telemetry delivery.\n */\n screenshot?: ScreenshotCaptureOptions;\n /** SDK identity overrides (set automatically by installReactNative). */\n sdkName?: string;\n sdkVersion?: string;\n platform?: string;\n dist?: string;\n commitSha?: string;\n branch?: string;\n}\n\nexport interface ScreenshotArtifact {\n data?: string;\n contentType?: 'image/png' | 'image/jpeg' | 'image/webp';\n width?: number;\n height?: number;\n sizeBytes?: number;\n redacted?: boolean;\n redactionStrategy?: string;\n}\n\nexport interface ScreenshotCaptureOptions {\n enabled?: boolean;\n captureOnError?: boolean;\n timeoutMs?: number;\n maxBytes?: number;\n sampleRate?: number;\n provider?: (reason: { type: 'error'; error: Error; traceId?: string; requestId?: string }) =>\n | ScreenshotArtifact | null | undefined\n | Promise<ScreenshotArtifact | null | undefined>;\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 traceId?: string;\n spanId?: string;\n parentSpanId?: string;\n requestId?: string;\n replayId?: string;\n service?: string;\n user?: { id?: string; email?: string };\n metadata?: Record<string, unknown>;\n breadcrumbs?: Breadcrumb[];\n fingerprint?: string[];\n debugMeta?: { images: Array<{ type: string; debugId: 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 // RFC4122-ish v4 — RN doesn't ship `crypto.randomUUID` reliably across\n // versions, so build one from Math.random. Good enough for session IDs.\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 stringContextValue(context: Record<string, unknown>, key: string): string | undefined {\n const value = context[key];\n return typeof value === 'string' && value.trim().length > 0 ? value : undefined;\n}\n\nfunction firstRecentRequestId(recentFailed: ReadonlyArray<{ requestId?: string }>): string | undefined {\n for (let i = recentFailed.length - 1; i >= 0; i--) {\n const requestId = recentFailed[i]?.requestId;\n if (requestId && requestId.trim().length > 0) return requestId;\n }\n return undefined;\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: ReplaySurrogate | null = null;\n private httpRequests: HttpRequestModule | null = null;\n private _instrumentAxios: ((axios: any) => any) | null = null;\n\n constructor(config: AllStakConfig) {\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 = 'react-native';\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 ?? '', Boolean(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 if (config.replay && (config.replay.enabled ?? true)) {\n try {\n this.replay = new ReplaySurrogate(this.transport, this.sessionId, 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, config.httpTracking ?? {}, baseUrl,\n {\n tracing: this.tracing,\n replay: this.replay,\n release: this.config.release,\n dist: this.config.dist,\n platform: this.config.platform,\n environment: this.config.environment,\n },\n );\n this._instrumentAxios = instrumentAxios;\n } catch { /* never break init */ }\n }\n }\n\n /** Access the replay surrogate (or null if not initialized / sampled out). */\n getReplay(): ReplaySurrogate | null { return this.replay; }\n\n /** Manually instrument an axios instance. No-op when HTTP tracking is off. */\n instrumentAxios<T = any>(axios: T): T {\n return this._instrumentAxios ? (this._instrumentAxios(axios) as T) : axios;\n }\n /** Snapshot of recent failed HTTP requests for error-linking. */\n getRecentFailedHttp() { return this.httpRequests?.getRecentFailed() ?? []; }\n\n // ── Public API ────────────────────────────────────────────────────\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\n // Aggregate unique debug-ids into debugMeta.images[] so the\n // symbolicator can match by image-level debugId.\n const debugIdSet = new Set<string>();\n for (const f of frames) if (f.debugId) debugIdSet.add(f.debugId);\n const debugMeta = debugIdSet.size > 0\n ? { images: Array.from(debugIdSet).map((id) => ({ type: 'sourcemap' as const, debugId: id })) }\n : undefined;\n\n const stackTrace = frames.length > 0 ? frames.map(frameToString) : undefined;\n\n const currentBreadcrumbs = this.breadcrumbs.length > 0 ? [...this.breadcrumbs] : undefined;\n this.breadcrumbs = [];\n\n // Prefer an explicit `error.name` override (e.g. native crashes set\n // it to 'NSException'); fall back to constructor name then to 'Error'.\n // `new Error()` always has constructor.name === 'Error', so an explicit\n // name set after construction would otherwise 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 recentFailed = this.httpRequests?.getRecentFailed() ?? [];\n const linkedRequest = recentFailed.length > 0 ? recentFailed[recentFailed.length - 1] : undefined;\n if (linkedRequest?.traceId) this.tracing.setTraceId(linkedRequest.traceId);\n const exceptionSpan = linkedRequest ? this.tracing.startSpan('mobile.exception', {\n description: error.message,\n tags: {\n requestId: linkedRequest.requestId,\n exceptionClass,\n },\n }) : null;\n exceptionSpan?.finish('error');\n const traceId = linkedRequest?.traceId ?? this.tracing.getTraceId();\n if (traceId) traceContext.traceId = traceId;\n const spanId = exceptionSpan?.spanId || this.tracing.getCurrentSpanId();\n if (spanId) traceContext.spanId = spanId;\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 requestId: r.requestId, traceId: r.traceId,\n confidence: r.requestId === linkedRequest?.requestId ? 'inferred' : 'weak',\n }));\n traceContext['http.linkConfidence'] = 'inferred';\n }\n try {\n if (!linkedRequest) throw new Error('no linked request');\n this.replay?.recordTimelineMarker?.('exception', 'exception_captured', {\n exceptionClass,\n message: error.message,\n requestLinkConfidence: linkedRequest ? 'inferred' : 'none',\n }, {\n traceId,\n requestId: linkedRequest?.requestId,\n spanId: spanId ?? undefined,\n release: this.config.release,\n dist: this.config.dist,\n });\n } catch { /* never break capture */ }\n\n const payload: ErrorIngestPayload = {\n exceptionClass,\n message: error.message,\n stackTrace,\n frames: frames.length > 0 ? frames : undefined,\n debugMeta,\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 traceId: stringContextValue(traceContext, 'traceId'),\n spanId: stringContextValue(traceContext, 'spanId'),\n requestId: linkedRequest?.requestId ?? firstRecentRequestId(recentFailed),\n service: this.config.service,\n user: eff.user,\n metadata: { ...this.buildMetadata(context), ...traceContext },\n breadcrumbs: currentBreadcrumbs,\n fingerprint: eff.fingerprint,\n };\n\n if (this.shouldCaptureScreenshot()) {\n void this.withScreenshotMetadata(error, payload)\n .then((enriched) => this.sendThroughBeforeSend(enriched))\n .catch(() => this.sendThroughBeforeSend({\n ...payload,\n metadata: { ...(payload.metadata ?? {}), 'screenshot.status': 'failed' },\n }));\n return;\n }\n this.sendThroughBeforeSend({\n ...payload,\n metadata: {\n ...(payload.metadata ?? {}),\n 'screenshot.status': this.config.screenshot?.enabled ? 'unsupported' : 'disabled',\n },\n });\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 traceId: this.tracing.getTraceId(),\n spanId: this.tracing.getCurrentSpanId() ?? undefined,\n service: this.config.service,\n user: eff.user,\n metadata: this.buildMetadata(),\n fingerprint: eff.fingerprint,\n };\n this.sendThroughBeforeSend(payload);\n }\n }\n\n addBreadcrumb(\n type: string,\n message: string,\n level?: string,\n data?: Record<string, unknown>,\n ): 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 {\n this.breadcrumbs = [];\n }\n\n setUser(user: { id?: string; email?: string }): void {\n this.config.user = user;\n }\n\n setTag(key: string, value: string): void {\n if (!this.config.tags) this.config.tags = {};\n this.config.tags[key] = value;\n }\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\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\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 /**\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 /**\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\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\n getSessionId(): string { return this.sessionId; }\n\n getConfig(): AllStakConfig { return this.config; }\n\n getTransportStats(): TransportStats { return this.transport.getStats(); }\n\n destroy(): void {\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 unbindHttpInstrumentation();\n this._instrumentAxios = null;\n this.breadcrumbs = [];\n }\n\n // ── Internal ──────────────────────────────────────────────────────\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.buildMetadata(),\n });\n }\n\n private shouldCaptureScreenshot(): boolean {\n const screenshot = this.config.screenshot;\n if (!screenshot?.enabled || screenshot.captureOnError === false || !screenshot.provider) return false;\n const sampleRate = screenshot.sampleRate ?? 1;\n return !(sampleRate <= 0 || (sampleRate < 1 && Math.random() >= sampleRate));\n }\n\n private async withScreenshotMetadata(error: Error, payload: ErrorIngestPayload): Promise<ErrorIngestPayload> {\n const screenshot = this.config.screenshot;\n if (!screenshot?.provider) {\n return { ...payload, metadata: { ...(payload.metadata ?? {}), 'screenshot.status': 'unsupported' } };\n }\n const timeoutMs = Math.max(100, Math.min(screenshot.timeoutMs ?? 1500, 5000));\n const maxBytes = Math.max(1024, screenshot.maxBytes ?? 200_000);\n try {\n const artifact = await Promise.race([\n Promise.resolve(screenshot.provider({\n type: 'error',\n error,\n traceId: payload.traceId,\n requestId: payload.requestId,\n })),\n new Promise<null>((resolve) => setTimeout(() => resolve(null), timeoutMs)),\n ]);\n if (!artifact) {\n return { ...payload, metadata: { ...(payload.metadata ?? {}), 'screenshot.status': 'timeout_or_empty' } };\n }\n const size = artifact.sizeBytes ?? byteSize(artifact.data);\n if (size > maxBytes) {\n this.transport.noteDropped();\n return {\n ...payload,\n metadata: { ...(payload.metadata ?? {}), 'screenshot.status': 'dropped_too_large', 'screenshot.sizeBytes': size },\n };\n }\n return {\n ...payload,\n metadata: {\n ...(payload.metadata ?? {}),\n 'screenshot.status': 'captured',\n 'screenshot.contentType': artifact.contentType,\n 'screenshot.width': artifact.width,\n 'screenshot.height': artifact.height,\n 'screenshot.sizeBytes': size,\n 'screenshot.redacted': artifact.redacted ?? false,\n 'screenshot.redactionStrategy': artifact.redactionStrategy,\n ...(artifact.data ? { 'screenshot.data': artifact.data } : {}),\n },\n };\n } catch {\n return { ...payload, metadata: { ...(payload.metadata ?? {}), 'screenshot.status': 'failed' } };\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 scope on the\n * stack. Inner code reads from this instead of `this.config` directly so\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 to attach per-request context without leaking\n * across concurrent requests.\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;\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\n// ── Public singleton facade ──────────────────────────────────────────\n\nlet instance: AllStakClient | null = null;\n\nfunction maybeInit(): AllStakClient | null {\n return instance;\n}\n\nfunction noopSpan(operation = ''): Span {\n return new Span('', '', '', operation, '', '', '', {}, () => undefined);\n}\n\nfunction emptyStats(): TransportStats {\n return {\n queued: 0,\n sent: 0,\n failed: 0,\n dropped: 0,\n consecutiveFailures: 0,\n circuitOpenUntil: 0,\n };\n}\n\n/**\n * Module-level breadcrumb forwarder used by auto-instrumentation wrappers\n * (fetch/console/navigation) so they always target the current `instance`\n * after re-init, and silently no-op when there is none.\n */\nexport function __safeAddBreadcrumbForInstrumentation(\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\nexport const AllStak = {\n init(config: AllStakConfig): AllStakClient {\n try {\n if (instance) instance.destroy();\n instance = new AllStakClient(config);\n return instance;\n } catch {\n instance = new AllStakClient({ ...config, apiKey: '' });\n return instance;\n }\n },\n captureException(error: Error, context?: Record<string, unknown>): void {\n try { maybeInit()?.captureException(error, context); } catch { /* fail-open */ }\n },\n captureMessage(\n message: string,\n level: 'fatal' | 'error' | 'warning' | 'info' = 'info',\n options?: { as?: 'log' | 'error' | 'both' },\n ): void {\n try { maybeInit()?.captureMessage(message, level, options); } catch { /* fail-open */ }\n },\n addBreadcrumb(type: string, message: string, level?: string, data?: Record<string, unknown>): void {\n try { maybeInit()?.addBreadcrumb(type, message, level, data); } catch { /* fail-open */ }\n },\n clearBreadcrumbs(): void { try { maybeInit()?.clearBreadcrumbs(); } catch { /* fail-open */ } },\n setUser(user: { id?: string; email?: string }): void { try { maybeInit()?.setUser(user); } catch { /* fail-open */ } },\n setTag(key: string, value: string): void { try { maybeInit()?.setTag(key, value); } catch { /* fail-open */ } },\n setTags(tags: Record<string, string>): void { try { maybeInit()?.setTags(tags); } catch { /* fail-open */ } },\n setExtra(key: string, value: unknown): void { try { maybeInit()?.setExtra(key, value); } catch { /* fail-open */ } },\n setExtras(extras: Record<string, unknown>): void { try { maybeInit()?.setExtras(extras); } catch { /* fail-open */ } },\n setContext(name: string, ctx: Record<string, unknown> | null): void { try { maybeInit()?.setContext(name, ctx); } catch { /* fail-open */ } },\n setLevel(level: 'fatal' | 'error' | 'warning' | 'info' | 'debug'): void { try { maybeInit()?.setLevel(level); } catch { /* fail-open */ } },\n setFingerprint(fingerprint: string[] | null): void { try { maybeInit()?.setFingerprint(fingerprint); } catch { /* fail-open */ } },\n flush(timeoutMs?: number): Promise<boolean> {\n try { return maybeInit()?.flush(timeoutMs) ?? Promise.resolve(true); }\n catch { return Promise.resolve(false); }\n },\n setIdentity(identity: { sdkName?: string; sdkVersion?: string; platform?: string; dist?: string }): void {\n try { maybeInit()?.setIdentity(identity); } catch { /* fail-open */ }\n },\n /**\n * Run `callback` with a fresh scoped context. Any user/tag/extra/context/\n * fingerprint/level set on the passed `Scope` is visible only inside the\n * callback (and any captures made within it). Pop is automatic, including\n * for async callbacks and thrown errors.\n */\n withScope<T>(callback: (scope: Scope) => T): T {\n try {\n const client = maybeInit();\n return client ? client.withScope(callback) : callback(new Scope());\n }\n catch { return callback(new Scope()); }\n },\n startSpan(operation: string, options?: { description?: string; tags?: Record<string, string> }): Span {\n try { return maybeInit()?.startSpan(operation, options) ?? noopSpan(operation); }\n catch { return noopSpan(operation); }\n },\n getTraceId(): string {\n try { return maybeInit()?.getTraceId() ?? ''; } catch { return ''; }\n },\n setTraceId(traceId: string): void { try { maybeInit()?.setTraceId(traceId); } catch { /* fail-open */ } },\n getCurrentSpanId(): string | null {\n try { return maybeInit()?.getCurrentSpanId() ?? null; } catch { return null; }\n },\n resetTrace(): void { try { maybeInit()?.resetTrace(); } catch { /* fail-open */ } },\n /** Access the privacy-first replay surrogate (or null if disabled / sampled out). */\n getReplay(): ReplaySurrogate | null {\n try { return maybeInit()?.getReplay() ?? null; } catch { return null; }\n },\n /** Manually instrument an axios instance. No-op when HTTP tracking is off. */\n instrumentAxios<T = any>(axios: T): T {\n try { return maybeInit()?.instrumentAxios(axios) ?? axios; } catch { return axios; }\n },\n getSessionId(): string {\n try { return maybeInit()?.getSessionId() ?? ''; } catch { return ''; }\n },\n getConfig(): AllStakConfig | null { return instance?.getConfig() ?? null; },\n getTransportStats(): TransportStats {\n try { return maybeInit()?.getTransportStats() ?? emptyStats(); } catch { return emptyStats(); }\n },\n destroy(): void { instance?.destroy(); instance = null; },\n /** @internal — exposed for testing */\n _getInstance(): AllStakClient | null { return instance; },\n};\n\nfunction byteSize(value?: string): number {\n if (!value) return 0;\n try {\n if (typeof TextEncoder !== 'undefined') return new TextEncoder().encode(value).length;\n } catch {\n /* ignore */\n }\n return value.length;\n}\n","import * as React from 'react';\nimport { AllStak, AllStakClient } from './client';\nimport type { AllStakConfig } from './client';\nimport { installReactNative } from './install';\nimport type { ReactNativeInstallOptions } from './install';\n\nexport interface AllStakProviderProps extends ReactNativeInstallOptions {\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 on, log +\n * info off. Set `{ log: true, info: true }` to opt-in to verbose\n * capture, or `{ warn: false, error: false }` to suppress.\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 /**\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 * (e.g. test harness, multi-tenant container that switches projects).\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 AllStakErrorBoundary 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 destroyOnUnmount = false,\n fallback,\n onError,\n autoErrorHandler,\n autoPromiseRejections,\n autoDeviceTags,\n autoAppStateBreadcrumbs,\n autoNetworkCapture,\n autoFetchBreadcrumbs,\n autoConsoleBreadcrumbs,\n autoNavigationBreadcrumbs,\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. This\n // covers Fast Refresh in dev and Strict Mode double-mount in React 18\n // — both unmount/remount the provider but should not tear down the SDK.\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 };\n clientRef.current = AllStak.init(config);\n __providerOwnedInstance = clientRef.current;\n\n installReactNative({\n autoErrorHandler,\n autoPromiseRejections,\n autoDeviceTags,\n autoAppStateBreadcrumbs,\n autoNetworkCapture,\n autoFetchBreadcrumbs,\n autoConsoleBreadcrumbs,\n autoNavigationBreadcrumbs,\n debugLogs: debug,\n });\n\n if (debug) {\n // eslint-disable-next-line no-console\n console.log(`[AllStak] Initialized — session ${AllStak.getSessionId()}`);\n }\n }\n }\n\n React.useEffect(() => {\n return () => {\n if (destroyOnUnmount) {\n AllStak.destroy();\n __providerOwnedInstance = null;\n clientRef.current = null;\n // eslint-disable-next-line no-console\n if (debug) console.log('[AllStak] Destroyed on unmount');\n }\n };\n }, [destroyOnUnmount, debug]);\n\n return (\n <AllStakContext.Provider value={clientRef.current}>\n <AllStakErrorBoundary fallback={fallback} onError={onError} debug={debug}>\n {children}\n </AllStakErrorBoundary>\n </AllStakContext.Provider>\n );\n}\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 addBreadcrumb: (\n type: string,\n message: string,\n level?: string,\n data?: Record<string, unknown>,\n ) => AllStak.addBreadcrumb(type, message, level, data),\n }),\n [],\n );\n}\n\n/** @internal — for tests. Resets the module-level remount-guard. */\nexport function __resetProviderInstanceForTest(): void {\n __providerOwnedInstance = null;\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 are set to keep the\n * dashboard signal-to-noise high: `warn` and `error` capture by default\n * (most apps fire those at human-meaningful moments), `log` and `info`\n * are OFF by default since typical apps log thousands of debug lines\n * per session.\n *\n * Override per-method:\n *\n * <AllStakProvider captureConsole={{ log: true, info: true }} />\n *\n * Or to fully suppress:\n *\n * <AllStakProvider captureConsole={{ warn: false, error: false }} />\n *\n * Setting `autoConsoleBreadcrumbs={false}` on the provider/install is a\n * higher-level kill switch — it skips wrapping any console method.\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 // Wrap every method whose flag is true. We always wrap if the flag is on\n // and never wrap if off — so toggling at runtime requires re-init (kept\n // simple to avoid stacking wrappers on hot reload).\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 // JSON.stringify can return undefined (e.g. for a function root that\n // we already handled above; guard regardless).\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 * React Native architecture / runtime detection.\n *\n * **Status:** the JS-level check is implemented and tested. The native\n * AllStak modules (Java + Obj-C) are written in legacy module style and\n * are known to interoperate with the New Architecture (Fabric +\n * TurboModules) via the RN interop layer. End-to-end integration on a\n * real Fabric build has not yet been verified — see README §\"New\n * Architecture support\" for current status.\n *\n * The two booleans returned here are read off well-known global flags\n * that RN exposes to JS:\n *\n * - `globalThis.__turboModuleProxy` — present when TurboModules is\n * enabled (New Architecture).\n * - `globalThis.RN$Bridgeless` — present when bridgeless mode is on.\n *\n * If the host app surfaces this through `AllStak.setTag('rn.newArch', '1')`\n * we can correlate New-Arch crashes specifically and prioritize a fix.\n */\n\nexport interface ArchitectureInfo {\n /** True when TurboModules / New Architecture is detected at runtime. */\n newArchitecture: boolean;\n /** True when bridgeless mode is detected. */\n bridgeless: boolean;\n /** True when the JS engine is Hermes. */\n hermes: boolean;\n /** Free-form tag suitable for `AllStak.setTag('rn.architecture', ...)`. */\n tag: 'new-arch' | 'old-arch' | 'unknown';\n}\n\nexport function detectArchitecture(): ArchitectureInfo {\n const g = globalThis as any;\n const newArchitecture = typeof g.__turboModuleProxy !== 'undefined';\n const bridgeless = typeof g.RN$Bridgeless !== 'undefined' && !!g.RN$Bridgeless;\n const hermes = typeof g.HermesInternal !== 'undefined';\n\n let tag: ArchitectureInfo['tag'] = 'unknown';\n // Heuristic: if `__turboModuleProxy` is defined we're on New Arch.\n // Without it we conservatively return 'unknown' rather than guessing,\n // since some legacy debug builds also lack it.\n if (newArchitecture) tag = 'new-arch';\n else if (typeof g.nativeFlushQueueImmediate === 'function') tag = 'old-arch';\n\n return { newArchitecture, bridgeless, hermes, tag };\n}\n\n/**\n * Convenience: stamp `rn.architecture`, `rn.bridgeless`, and `rn.hermes`\n * tags on the active AllStak singleton based on detection. Safe to call\n * any time after `AllStak.init()` and before the first capture.\n */\nexport function applyArchitectureTags(setTag: (key: string, value: string) => void): ArchitectureInfo {\n const info = detectArchitecture();\n try {\n setTag('rn.architecture', info.tag);\n setTag('rn.bridgeless', String(info.bridgeless));\n setTag('rn.hermes', String(info.hermes));\n } catch { /* never break host */ }\n return info;\n}\n","/**\n * React Native navigation breadcrumbs — two opt-in helpers:\n *\n * - instrumentReactNavigation(navigationRef): call once after the\n * NavigationContainer is mounted. Subscribes to `state` events on the\n * NavigationContainerRef and emits a breadcrumb whenever the active\n * route name changes. Works with @react-navigation/native v6+ without\n * adding it as a dependency (the ref shape is duck-typed).\n *\n * - instrumentNavigationFromLinking(): registers a Linking event\n * listener so deep links also appear in breadcrumbs. Useful when the\n * app uses Linking.openURL(...) instead of (or alongside) a router.\n *\n * Both helpers are idempotent and never throw if the underlying RN module\n * isn't present (Expo Go, JS-only test runs).\n */\n\nimport { AllStak } from './client';\n\ndeclare const require: (id: string) => any;\n\ntype NavigationRef = {\n getCurrentRoute?: () => { name?: string } | undefined;\n addListener?: (event: string, cb: () => void) => () => void;\n};\n\nconst NAV_FLAG = Symbol.for('allstak.nav.subscribed');\nconst LINKING_FLAG = '__allstak_linking_patched__';\nconst NAV_AUTO_PATCH_FLAG = Symbol.for('allstak.nav.autoPatched');\n\nexport interface ReactNavigationOptions {\n /**\n * Whitelist of route-param keys safe to record alongside the route name.\n * Anything outside this list is dropped — params commonly carry user IDs,\n * order numbers, etc. Default `[]`.\n */\n safeParams?: string[];\n /**\n * Also forward the screen view to the replay surrogate (if active).\n * Default true — the surrogate itself decides whether it's recording.\n */\n forwardToReplay?: boolean;\n}\n\n/**\n * Subscribe to a `@react-navigation/native` NavigationContainerRef and\n * emit a navigation breadcrumb whenever the active route changes. Captures:\n *\n * - route name change (from -> to)\n * - whitelisted route params (via `safeParams`)\n * - state change → forwarded to replay surrogate when enabled\n *\n * Idempotent — installs once per ref. Returns an unsubscribe function.\n */\nexport function instrumentReactNavigation(\n navigationRef: NavigationRef,\n options: ReactNavigationOptions = {},\n): () => void {\n if (!navigationRef || typeof navigationRef.addListener !== 'function') {\n return () => {};\n }\n const ref = navigationRef as any;\n if (ref[NAV_FLAG]) return () => {};\n ref[NAV_FLAG] = true;\n\n const safeKeys = options.safeParams ?? [];\n const forwardToReplay = options.forwardToReplay !== false;\n\n const filterParams = (params: Record<string, unknown> | undefined): Record<string, unknown> => {\n const out: Record<string, unknown> = {};\n if (!params) return out;\n for (const key of safeKeys) if (key in params) out[key] = (params as any)[key];\n return out;\n };\n\n let last: string | undefined = navigationRef.getCurrentRoute?.()?.name;\n const unsub = navigationRef.addListener('state', () => {\n const route = navigationRef.getCurrentRoute?.();\n const next = route?.name;\n if (!next || next === last) return;\n const safe = filterParams((route as any)?.params);\n try {\n AllStak.addBreadcrumb('navigation', `${last ?? '<start>'} -> ${next}`, 'info',\n { from: last, to: next, params: safe });\n } catch { /* never break host */ }\n\n if (forwardToReplay) {\n try {\n const replay = (AllStak as any).getReplay?.();\n replay?.recordScreenView?.(next, (route as any)?.params);\n } catch { /* ignore */ }\n }\n last = next;\n });\n return () => {\n try { unsub?.(); } catch { /* ignore */ }\n ref[NAV_FLAG] = false;\n };\n}\n\n/**\n * Register a Linking listener so `openURL`/deep-link launches surface\n * as breadcrumbs. No-op if `react-native` isn't available (test env).\n */\nexport function instrumentNavigationFromLinking(): void {\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const rn = require('react-native');\n const Linking: any = rn?.Linking;\n if (!Linking || typeof Linking.addEventListener !== 'function') return;\n if ((Linking as any)[LINKING_FLAG]) return;\n\n Linking.addEventListener('url', (ev: { url?: string }) => {\n const url = typeof ev?.url === 'string' ? ev.url : '';\n if (!url) return;\n try { AllStak.addBreadcrumb('navigation', `deep-link: ${url.split('?')[0]}`, 'info', { url }); }\n catch { /* ignore */ }\n });\n (Linking as any)[LINKING_FLAG] = true;\n } catch {\n // react-native not available in this runtime (test, Expo Go web, etc.)\n }\n}\n\n/**\n * Best-effort automatic instrumentation of `@react-navigation/native`.\n *\n * **What it does:**\n * - Tries `require('@react-navigation/native')`. If the package is not\n * installed, returns `false` and is otherwise a no-op.\n * - If found, monkey-patches the module's exported `NavigationContainer`\n * with a wrapper that auto-creates an internal ref, forwards the\n * user's `ref` prop, and on mount calls `instrumentReactNavigation`\n * so route changes ship as breadcrumbs.\n * - Idempotent: a flag on the module's exports object prevents double\n * patching across hot-reload cycles or repeated `installReactNative`\n * calls.\n *\n * **Why this works:**\n * Babel's CommonJS interop preserves runtime property lookups for\n * named imports — `import { NavigationContainer } from '@react-navigation/native'`\n * compiles to `_rnav.NavigationContainer` accesses at use-site, so\n * patching the module's exports object before the host app renders\n * means user code transparently picks up our wrapper.\n *\n * **Why it might fail:**\n * - `@react-navigation/native` not installed → returns false silently.\n * - Module exports frozen or sealed (rare in CJS-style RN builds).\n * - User imported `NavigationContainer` via a deep path that bypasses\n * the index module.\n * In any failure case the manual API (`instrumentReactNavigation(ref)`)\n * is still available as a fallback.\n */\nexport function tryAutoInstrumentNavigation(): boolean {\n // Metro detection — auto-patch is incompatible with Metro's static\n // bundler because dynamic `require()` of an external module name\n // surfaces a LogBox dev-error even when caught. On Metro/RN we\n // therefore SKIP the auto-patch entirely and fall through to the\n // documented manual fallback (`instrumentReactNavigation(navigationRef)`).\n // The unit tests still exercise the auto-patch path under Node where\n // dynamic require is well-supported.\n const g: any = globalThis as any;\n const isMetro =\n typeof g.__METRO_GLOBAL_PREFIX__ !== 'undefined' ||\n typeof g.__r === 'function' ||\n typeof g.HermesInternal !== 'undefined';\n if (isMetro) return false;\n\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const rnav = require('@react-navigation/native');\n if (!rnav || !rnav.NavigationContainer) return false;\n if ((rnav as any)[NAV_AUTO_PATCH_FLAG]) return true;\n\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const React = require('react');\n if (!React || typeof React.forwardRef !== 'function') return false;\n\n const OrigContainer = rnav.NavigationContainer;\n\n const Wrapped = React.forwardRef(function AllStakNavigationContainer(\n props: any,\n userRef: any,\n ) {\n const internalRef = React.useRef(null);\n\n const setRef = React.useCallback((r: any) => {\n internalRef.current = r;\n if (typeof userRef === 'function') userRef(r);\n else if (userRef) userRef.current = r;\n }, [userRef]);\n\n React.useEffect(() => {\n if (internalRef.current) {\n try { instrumentReactNavigation(internalRef.current); }\n catch { /* never break host */ }\n }\n }, []);\n\n return React.createElement(OrigContainer, { ...props, ref: setRef });\n });\n Wrapped.displayName = 'AllStakNavigationContainer';\n\n try {\n // Some bundlers / strict modes freeze the exports object — guard.\n Object.defineProperty(rnav, 'NavigationContainer', {\n value: Wrapped,\n configurable: true,\n writable: true,\n });\n (rnav as any)[NAV_AUTO_PATCH_FLAG] = true;\n return true;\n } catch {\n // Exports immutable — fall back to manual API.\n return false;\n }\n } catch {\n // @react-navigation/native not installed, or React unavailable.\n return false;\n }\n}\n\n/** @internal — for tests. Resets the auto-patch flag on the cached module. */\nexport function __resetAutoNavigationFlagForTest(): void {\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const rnav = require('@react-navigation/native');\n if (rnav) delete (rnav as any)[NAV_AUTO_PATCH_FLAG];\n } catch { /* ignore */ }\n}\n","/**\n * React Native runtime integration — ErrorUtils, Hermes promise rejection\n * tracking, Platform tags, AppState breadcrumbs, XHR network capture,\n * fetch breadcrumbs, and console breadcrumbs.\n *\n * Extracted from index.ts so AllStakProvider can call it without circular\n * imports.\n */\n\nimport { AllStak, SDK_VERSION, __safeAddBreadcrumbForInstrumentation as safeBc } from './client';\nimport { instrumentFetch, instrumentConsole } from './auto-breadcrumbs';\nimport { applyArchitectureTags } from './architecture';\nimport { tryAutoInstrumentNavigation } from './navigation';\n\ndeclare const require: (id: string) => any;\n\ntype ErrorUtilsShape = {\n getGlobalHandler: () => (error: Error, isFatal?: boolean) => void;\n setGlobalHandler: (handler: (error: Error, isFatal?: boolean) => void) => void;\n};\n\nexport interface ReactNativeInstallOptions {\n /** Auto-capture unhandled JS exceptions via ErrorUtils. Default: true */\n autoErrorHandler?: boolean;\n /** Auto-capture unhandled promise rejections (Hermes). Default: true */\n autoPromiseRejections?: boolean;\n /** Auto-attach Platform.* info as tags. Default: true */\n autoDeviceTags?: boolean;\n /** Auto-emit breadcrumbs on AppState change. Default: true */\n autoAppStateBreadcrumbs?: boolean;\n /** Auto-instrument XHR (RN's fetch is XHR-based) for network breadcrumbs. Default: true */\n autoNetworkCapture?: boolean;\n /** Wrap `globalThis.fetch` to record HTTP breadcrumbs. Default: true */\n autoFetchBreadcrumbs?: boolean;\n /**\n * Wrap `console.*` methods to record log breadcrumbs. Default: true.\n * Per-method capture is controlled by `captureConsole` in AllStakConfig\n * (warn + error default on, log + info default off).\n */\n autoConsoleBreadcrumbs?: boolean;\n /**\n * Auto-detect `@react-navigation/native` and patch `NavigationContainer`\n * so route changes ship as breadcrumbs without the host app needing\n * to call `instrumentReactNavigation(ref)`. Default: true. When the\n * package is not installed, this silently no-ops.\n */\n autoNavigationBreadcrumbs?: boolean;\n /**\n * Emit a `[AllStak] Navigation auto-instrumentation enabled/not applied`\n * console log so developers can confirm the wiring at startup. The\n * provider sets this from its `debug` prop; defaults to false when\n * called manually.\n */\n debugLogs?: boolean;\n}\n\n/**\n * Patch the global `XMLHttpRequest` so any HTTP call (RN's `fetch` is\n * XHR-based) is captured as a network breadcrumb. Idempotent. Skips the\n * AllStak ingest host so we never recurse.\n */\nfunction instrumentXmlHttpRequest(): void {\n const flag = '__allstak_xhr_patched__';\n const X: any = (globalThis as any).XMLHttpRequest;\n if (!X || X.prototype[flag]) return;\n\n const ownHost = (() => {\n try {\n const cfg = AllStak.getConfig();\n return (cfg?.host ?? 'https://api.allstak.sa').replace(/\\/$/, '');\n } catch { return ''; }\n })();\n\n const origOpen = X.prototype.open;\n const origSend = X.prototype.send;\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 return origOpen.call(this, method, url, ...rest);\n };\n\n X.prototype.send = function (body?: unknown) {\n const start = Date.now();\n const method: string = (this as any).__allstak_method__ || 'GET';\n const url: string = (this as any).__allstak_url__ || '';\n const isOwnIngest = ownHost && url.startsWith(ownHost);\n let path = url;\n try { path = new URL(url).pathname; } catch { /* relative URL */ }\n\n const onDone = (status: number) => {\n const durationMs = Date.now() - start;\n try {\n AllStak.addBreadcrumb('http', `${method} ${path} -> ${status}`,\n status >= 400 ? 'error' : 'info',\n { method, url: path, statusCode: status, durationMs });\n } catch { /* never break */ }\n };\n\n if (!isOwnIngest) {\n this.addEventListener?.('load', () => onDone(this.status || 0));\n this.addEventListener?.('error', () => onDone(0));\n this.addEventListener?.('abort', () => onDone(0));\n this.addEventListener?.('timeout', () => onDone(0));\n }\n\n return origSend.call(this, body);\n };\n\n X.prototype[flag] = true;\n}\n\nexport function installReactNative(options: ReactNativeInstallOptions = {}): void {\n const autoError = options.autoErrorHandler !== false;\n const autoPromise = options.autoPromiseRejections !== false;\n const autoDevice = options.autoDeviceTags !== false;\n const autoAppState = options.autoAppStateBreadcrumbs !== false;\n const autoNetwork = options.autoNetworkCapture !== false;\n\n AllStak.setTag('platform', 'react-native');\n try { applyArchitectureTags((k, v) => AllStak.setTag(k, v)); } catch { /* ignore */ }\n\n try {\n const hermes = typeof (globalThis as { HermesInternal?: unknown }).HermesInternal !== 'undefined';\n let dist: string | undefined;\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const rn = require('react-native');\n const os = rn?.Platform?.OS as string | undefined;\n if (os === 'ios' || os === 'android') {\n dist = `${os}-${hermes ? 'hermes' : 'jsc'}`;\n }\n } catch { /* not running under RN */ }\n AllStak.setIdentity({\n sdkName: 'allstak-react-native',\n sdkVersion: SDK_VERSION,\n platform: 'react-native',\n dist,\n });\n } catch { /* never break init */ }\n\n if (autoNetwork) {\n try { instrumentXmlHttpRequest(); } catch { /* not in JS env */ }\n }\n\n if (options.autoFetchBreadcrumbs !== false) {\n try {\n const cfg = AllStak.getConfig();\n const ownBaseUrl = (cfg?.host ?? 'https://api.allstak.sa').replace(/\\/$/, '');\n instrumentFetch(safeBc, ownBaseUrl);\n } catch { /* never break init */ }\n }\n if (options.autoConsoleBreadcrumbs !== false) {\n try {\n const cfg = AllStak.getConfig();\n instrumentConsole(safeBc, cfg?.captureConsole);\n }\n catch { /* never break init */ }\n }\n\n if (options.autoNavigationBreadcrumbs !== false) {\n let navResult = false;\n try { navResult = tryAutoInstrumentNavigation(); }\n catch { /* @react-navigation/native not installed — silent fallback */ }\n if (options.debugLogs) {\n // eslint-disable-next-line no-console\n if (navResult) console.log('[AllStak] Navigation auto-instrumentation enabled');\n // eslint-disable-next-line no-console\n else console.log('[AllStak] Navigation auto-instrumentation not applied; use instrumentReactNavigation(ref) fallback');\n }\n }\n\n if (autoDevice) {\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const rn = require('react-native');\n const Platform: any = rn?.Platform;\n if (Platform) {\n AllStak.setTag('device.os', String(Platform.OS ?? ''));\n AllStak.setTag('device.osVersion', String(Platform.Version ?? ''));\n if (Platform.constants?.Model) {\n AllStak.setTag('device.model', String(Platform.constants.Model));\n }\n }\n } catch { /* not running under RN */ }\n }\n\n if (autoAppState) {\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const rn = require('react-native');\n const AppState: any = rn?.AppState;\n if (AppState && typeof AppState.addEventListener === 'function') {\n AppState.addEventListener('change', (next: string) => {\n try {\n AllStak.addBreadcrumb('navigation', `AppState → ${next}`, 'info', { appState: next });\n } catch { /* ignore */ }\n });\n }\n } catch { /* no RN available */ }\n }\n\n if (autoError) {\n const eu: ErrorUtilsShape | undefined = (globalThis as any).ErrorUtils;\n if (eu && typeof eu.setGlobalHandler === 'function') {\n const prev = eu.getGlobalHandler();\n eu.setGlobalHandler((error: Error, isFatal?: boolean) => {\n try {\n AllStak.captureException(error, {\n source: 'react-native-ErrorUtils',\n fatal: String(Boolean(isFatal)),\n });\n } catch { /* never break */ }\n try { prev(error, isFatal); } catch { /* ignore */ }\n });\n }\n }\n\n if (autoPromise) {\n const wrapTrackerReason = (rejection: unknown): Error =>\n rejection instanceof Error\n ? rejection\n : new Error(`Unhandled promise rejection: ${String(rejection)}`);\n\n const ship = (err: Error) => {\n try { AllStak.captureException(err, { source: 'unhandledRejection' }); }\n catch { /* ignore */ }\n };\n\n // 1. Hermes-native Promise rejection tracker — works for the Promise\n // rejections the typical RN/Hermes app generates. The\n // `promise/setimmediate/rejection-tracking` package only patches\n // the `promise` package's polyfill, NOT the Hermes-native Promise,\n // so we must hook this in addition to (or instead of) the polyfill\n // tracker for unhandled-rejection capture to work end-to-end.\n try {\n const hermesInternal: any = (globalThis as any).HermesInternal;\n if (hermesInternal && typeof hermesInternal.enablePromiseRejectionTracker === 'function') {\n hermesInternal.enablePromiseRejectionTracker({\n allRejections: true,\n onUnhandled: (_id: number, rejection: unknown) => ship(wrapTrackerReason(rejection)),\n onHandled: () => {},\n });\n }\n } catch { /* never break init */ }\n\n // 2. Polyfill-side tracker (works on JSC + on RN polyfilled Promise).\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const tracking = require('promise/setimmediate/rejection-tracking');\n tracking.enable({\n allRejections: true,\n onUnhandled: (_id: number, rejection: unknown) => ship(wrapTrackerReason(rejection)),\n onHandled: () => {},\n });\n } catch {\n // Last-resort browser-style listener — keep the original wrapping\n // (bare String(reason)) so existing test contracts still match.\n const g: any = globalThis as any;\n if (typeof g.addEventListener === 'function') {\n g.addEventListener('unhandledrejection', (ev: any) => {\n const reason = ev?.reason;\n const err = reason instanceof Error ? reason : new Error(String(reason));\n ship(err);\n });\n }\n }\n }\n}\n","/**\n * @allstak/react-native — standalone React Native SDK.\n *\n * Self-contained: depends only on `react-native` (peer) and the global\n * `fetch`/`AbortController` that RN guarantees. Contains no `window`,\n * `document`, `localStorage`, `sessionStorage`, or browser DOM event\n * listeners.\n *\n * Recommended usage (one-liner):\n *\n * import { AllStakProvider } from '@allstak/react-native';\n *\n * export default function App() {\n * return (\n * <AllStakProvider apiKey=\"YOUR_API_KEY\" environment=\"production\">\n * <AppRoot />\n * </AllStakProvider>\n * );\n * }\n *\n * Advanced / manual usage:\n *\n * import { AllStak, installReactNative } from '@allstak/react-native';\n * AllStak.init({ apiKey, environment, release });\n * installReactNative();\n *\n * Native crash capture (Java/Kotlin on Android, Obj-C/Swift on iOS) lives\n * under the `native/` directory in this package. See README.\n */\n\nimport { AllStak } from './client';\n\n// ── Primary API: AllStakProvider (recommended) ──────────────────\nexport { AllStakProvider, useAllStak, __resetProviderInstanceForTest } from './provider';\nexport type { AllStakProviderProps } from './provider';\n\n// ── Core client + manual setup ──────────────────────────────────\nexport { AllStak } from './client';\nexport type { AllStakConfig, Breadcrumb, ScreenshotArtifact, ScreenshotCaptureOptions } from './client';\nexport type { TransportStats } from './transport';\nexport { AllStakClient, INGEST_HOST, SDK_NAME, SDK_VERSION, Scope } from './client';\n\n// ── React Native integrations (used internally by AllStakProvider) ──\nexport { installReactNative } from './install';\nexport type { ReactNativeInstallOptions } from './install';\n\n// ── Navigation helpers ──────────────────────────────────────────\nexport {\n instrumentReactNavigation,\n instrumentNavigationFromLinking,\n tryAutoInstrumentNavigation,\n __resetAutoNavigationFlagForTest,\n} from './navigation';\n\n// ── Console capture types ───────────────────────────────────────\nexport type { ConsoleCaptureOptions } from './auto-breadcrumbs';\nexport { __resetConsoleInstrumentationFlagForTest } from './auto-breadcrumbs';\n\n// ── Advanced modules ────────────────────────────────────────────\nexport { ReplaySurrogate } from './replay-surrogate';\nexport type { ReplaySurrogateOptions } from './replay-surrogate';\nexport { detectArchitecture, applyArchitectureTags } from './architecture';\nexport type { ArchitectureInfo } from './architecture';\nexport type { HttpTrackingOptions } from './http-redact';\nexport {\n ALWAYS_REDACT_HEADERS,\n ALWAYS_REDACT_QUERY,\n DEFAULT_REDACT_BODY_FIELDS,\n REDACTED,\n redactUrl,\n sanitizeHeaders,\n captureBodyResult,\n} from './http-redact';\nexport { HttpRequestModule } from './http-requests';\nexport type { HttpRequestEvent } from './http-requests';\n\n// ── Native crash drain ──────────────────────────────────────────\n\ndeclare const require: (id: string) => any;\n\n/**\n * Test seam — set a fake native module to be returned by\n * `drainPendingNativeCrashes` instead of `require('react-native').NativeModules.AllStakNative`.\n * Pass `null` to clear. Production callers must NOT use this.\n *\n * @internal\n */\nlet __testNativeModule: any = null;\nexport function __setNativeModuleForTest(mod: any): void {\n __testNativeModule = mod;\n}\n\n/**\n * DEV-ONLY: deliberately trigger a native iOS or Android crash via the\n * linked AllStak native module. This is intended for verifying the\n * native-crash → drain → ingest pipeline during SDK development. It\n * **terminates the app process** — never expose this in production UI.\n *\n * import { __devTriggerNativeCrash } from '@allstak/react-native';\n * if (__DEV__) __devTriggerNativeCrash(); // app dies; relaunch drains\n *\n * No-op when the native module is not linked.\n */\nexport async function __devTriggerNativeCrash(): Promise<void> {\n try {\n let native: any = __testNativeModule;\n if (!native) {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const rn = require('react-native');\n native = rn?.NativeModules?.AllStakNative;\n }\n if (!native || typeof native.__devTriggerCrash !== 'function') return;\n await native.__devTriggerCrash();\n } catch {\n // Native module not present — silently no-op.\n }\n}\n\n/**\n * Drain any native crash stashed by AllStakCrashHandler on the previous\n * launch and ship it to /ingest/v1/errors. No-op when the native module\n * is not linked (Expo Go, JS-only test runners, etc).\n */\nexport async function drainPendingNativeCrashes(release?: string): Promise<void> {\n try {\n let native: any = __testNativeModule;\n if (!native) {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const rn = require('react-native');\n native = rn?.NativeModules?.AllStakNative;\n }\n if (!native) return;\n if (typeof native.install === 'function') {\n try { await native.install(release ?? ''); } catch { /* ignore */ }\n }\n if (typeof native.drainPendingCrash === 'function') {\n const json: string | null = await native.drainPendingCrash();\n if (json && json !== '') {\n try {\n const payload = JSON.parse(json);\n const err = new Error(payload?.message ?? 'Native crash');\n err.name = payload?.exceptionClass ?? 'NativeCrash';\n (err as any).stack = Array.isArray(payload?.stackTrace)\n ? payload.stackTrace.join('\\n')\n : String(payload?.stackTrace ?? '');\n AllStak.captureException(err, {\n ...(payload?.metadata || {}),\n 'native.crash': 'true',\n });\n } catch { /* swallow */ }\n }\n }\n } catch {\n // react-native not available in this runtime\n }\n}\n"],"mappings":"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","names":["FLUSH_INTERVAL_MS","FLUSH_INTERVAL_MS","BATCH_SIZE_THRESHOLD","next","id","FETCH_FLAG","isOwnIngest","React","isOwnIngest"]}
1
+ {"version":3,"sources":["../src/transport.ts","../src/stack.ts","../src/utils/debug-id.ts","../src/scope.ts","../src/tracing.ts","../src/replay-surrogate.ts","../src/http-requests.ts","../src/http-redact.ts","../src/http-instrumentation.ts","../src/client.ts","../src/provider.tsx","../src/auto-breadcrumbs.ts","../src/architecture.ts","../src/navigation.ts","../src/install.ts","../src/index.ts"],"sourcesContent":["/**\n * Fail-open HTTP transport for React Native. 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 interface TransportStats {\n queued: number;\n sent: number;\n failed: number;\n dropped: number;\n consecutiveFailures: number;\n circuitOpenUntil: number;\n lastTransportLatencyMs?: number;\n lastFlushDurationMs?: number;\n}\n\nexport class HttpTransport {\n private buffer: Pending[] = [];\n private flushing = false;\n private consecutiveFailures = 0;\n private circuitOpenUntil = 0;\n private sent = 0;\n private failed = 0;\n private dropped = 0;\n private lastTransportLatencyMs: number | undefined;\n private lastFlushDurationMs: number | undefined;\n\n constructor(\n private baseUrl: string,\n private apiKey: string,\n private enabled = true,\n ) {}\n\n send(path: string, payload: unknown): Promise<void> {\n if (!this.enabled) {\n this.noteDropped();\n return Promise.resolve();\n }\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.sent++;\n this.consecutiveFailures = 0;\n this.circuitOpenUntil = 0;\n this.scheduleFlush();\n } catch (err) {\n this.failed++;\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 const started = Date.now();\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 this.lastTransportLatencyMs = Date.now() - started;\n }\n }\n\n private push(item: Pending): void {\n if (this.buffer.length >= MAX_BUFFER) {\n this.buffer.shift();\n this.dropped++;\n }\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 const started = Date.now();\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.sent++;\n this.consecutiveFailures = 0;\n this.circuitOpenUntil = 0;\n } catch (err) {\n this.failed++;\n this.recordFailure(err);\n this.push(item);\n }\n }\n } finally {\n this.lastFlushDurationMs = Date.now() - started;\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 noteDropped(count = 1): void {\n this.dropped += Math.max(0, count);\n }\n\n getStats(): TransportStats {\n return {\n queued: this.buffer.length,\n sent: this.sent,\n failed: this.failed,\n dropped: this.dropped,\n consecutiveFailures: this.consecutiveFailures,\n circuitOpenUntil: this.circuitOpenUntil,\n lastTransportLatencyMs: this.lastTransportLatencyMs,\n lastFlushDurationMs: this.lastFlushDurationMs,\n };\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 before navigation away or during native crash drain.\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 * Runtime debug-ID resolver for React Native.\n *\n * The build-time source map injector (`build/sourcemaps.ts`) appends\n * `//# debugId=<uuid>` to every JS bundle and writes the same UUID\n * into the matching `.map` file. At runtime, the symbolicator needs\n * that UUID per stack frame to pick the right source map.\n *\n * In React Native the primary lookup path is the global registry:\n * `globalThis._allstakDebugIds` — a `{ [bundleUrl]: uuid }` map\n * populated by the injected code at bundle evaluation time.\n *\n * This is a best-effort resolver: it returns `undefined` when no\n * debug ID can be found. The symbolicator handles missing IDs\n * gracefully (falls back to release-based lookup).\n */\n\nconst REGISTRY_KEY = '_allstakDebugIds';\n\nconst cache = new Map<string, string | null>();\n\nexport function resolveDebugId(filename: string | undefined): string | undefined {\n if (!filename) return undefined;\n\n if (cache.has(filename)) return cache.get(filename) ?? undefined;\n\n // Global registry — set by the build-time injector. Indexed by the\n // bundle URL that the runtime loaded.\n const registry = (globalThis as { [REGISTRY_KEY]?: Record<string, string> })[REGISTRY_KEY];\n if (registry && typeof registry === 'object') {\n const hit = registry[filename];\n if (typeof hit === 'string' && hit.length > 0) {\n cache.set(filename, hit);\n return hit;\n }\n }\n\n cache.set(filename, null);\n return undefined;\n}\n\n/** Test-only: reset the per-process cache. */\nexport function _resetDebugIdCache(): void {\n cache.clear();\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 (this.flushTimer as any)?.unref?.();\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 * React Native \"replay surrogate\" — a privacy-first view-state breadcrumb\n * recorder for environments where binary screen capture isn't available\n * (Expo Go, JS-only test runners, or apps that can't link a native module\n * for legal/compliance reasons).\n *\n * **What it captures (chronological, opt-in via sampleRate):**\n * - the active route name on every navigation event\n * - AppState foreground/background transitions (already covered by\n * installReactNative's AppState breadcrumb wiring — we reuse that)\n * - explicit `recordScreenView(name, params)` calls from the host app\n * (used by router integrations or manual checkpoints)\n *\n * **What it intentionally does NOT capture:**\n * - any user input values (text fields, password inputs, search queries)\n * - any rendered text content from the visible screen\n * - screenshots of any kind\n * - URL path parameters by default (only the route name + opt-in `safeParams`)\n *\n * Hard rule: by default `safeParams` is `[]` and route params are dropped.\n * Callers must explicitly enumerate which param keys are safe to log.\n */\n\nimport type { HttpTransport } from './transport';\n\nconst REPLAY_INGEST_PATH = '/ingest/v1/replay';\nconst FLUSH_INTERVAL_MS = 10_000;\n\nexport interface ReplaySurrogateOptions {\n enabled?: boolean;\n /** Probability in [0, 1] per session that recording happens. Default 0 (opt-in). */\n sampleRate?: number;\n /**\n * Whitelist of route-param keys that are safe to record alongside the\n * route name. Anything not on this list is dropped. Default `[]`.\n */\n safeParams?: string[];\n /** Max events buffered before forced flush. Default 200. */\n maxBufferedEvents?: number;\n}\n\ninterface SurrogateEvent {\n ts: number;\n k: 'screen' | 'appstate' | 'manual' | 'request' | 'exception' | 'response' | 'action' | 'retry';\n data: Record<string, unknown>;\n}\n\nexport interface TimelineContext {\n traceId?: string;\n requestId?: string;\n spanId?: string;\n eventId?: string;\n release?: string;\n dist?: string;\n screen?: string;\n route?: string;\n}\n\nexport class ReplaySurrogate {\n private buffer: SurrogateEvent[] = [];\n private flushTimer: ReturnType<typeof setInterval> | null = null;\n private opts: Required<ReplaySurrogateOptions>;\n private sessionId: string;\n private active = false;\n private destroyed = false;\n\n constructor(\n private transport: HttpTransport,\n sessionId: string,\n options: ReplaySurrogateOptions = {},\n ) {\n this.sessionId = sessionId;\n this.opts = {\n enabled: options.enabled ?? true,\n sampleRate: options.sampleRate ?? 0,\n safeParams: options.safeParams ?? [],\n maxBufferedEvents: options.maxBufferedEvents ?? 200,\n };\n }\n\n /** Enable recording for this session if sample-rate roll passes. */\n start(): boolean {\n if (!this.opts.enabled) return false;\n if (this.active) return true;\n if (Math.random() >= this.opts.sampleRate) return false;\n this.active = true;\n this.flushTimer = setInterval(() => this.flush(), FLUSH_INTERVAL_MS);\n (this.flushTimer as any)?.unref?.();\n return true;\n }\n\n /** Record a screen view. Filters params through the safeParams allow-list. */\n recordScreenView(routeName: string, params?: Record<string, unknown>, context?: TimelineContext): void {\n if (!this.active) return;\n const safe: Record<string, unknown> = {};\n if (params && this.opts.safeParams.length > 0) {\n for (const key of this.opts.safeParams) {\n if (key in params) safe[key] = params[key];\n }\n }\n this.push({ ts: Date.now(), k: 'screen', data: { route: routeName, params: safe, ...compact(context) } });\n }\n\n /** Record an AppState transition (foreground/background/inactive). */\n recordAppState(next: string, context?: TimelineContext): void {\n if (!this.active) return;\n this.push({ ts: Date.now(), k: 'appstate', data: { state: next, ...compact(context) } });\n }\n\n /** Record a free-form, customer-validated checkpoint. */\n recordManual(label: string, data?: Record<string, unknown>, context?: TimelineContext): void {\n if (!this.active) return;\n this.push({ ts: Date.now(), k: 'manual', data: { label, ...(data ?? {}), ...compact(context) } });\n }\n\n /** Record a forensic mobile session timeline marker. This is not replay. */\n recordTimelineMarker(\n kind: SurrogateEvent['k'],\n label: string,\n data?: Record<string, unknown>,\n context?: TimelineContext,\n ): void {\n if (!this.active) return;\n this.push({ ts: Date.now(), k: kind, data: { label, ...(data ?? {}), ...compact(context) } });\n }\n\n destroy(): void {\n this.destroyed = true;\n this.active = false;\n if (this.flushTimer) { clearInterval(this.flushTimer); this.flushTimer = null; }\n this.flush();\n }\n\n /** @internal — for tests. */\n isActive(): boolean { return this.active; }\n /** @internal — for tests. */\n getBuffer(): ReadonlyArray<SurrogateEvent> { return this.buffer; }\n\n private push(ev: SurrogateEvent): 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\nfunction compact(context?: TimelineContext): Record<string, unknown> {\n if (!context) return {};\n const out: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(context)) {\n if (value !== undefined && value !== null && value !== '') out[key] = value;\n }\n return out;\n}\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 traceId: string;\n requestId: string;\n spanId?: string;\n parentSpanId?: string;\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 requestBodyStatus?: string;\n responseBodyStatus?: string;\n requestBodyRedactedFields?: string[];\n responseBodyRedactedFields?: string[];\n requestBodyTruncated?: boolean;\n responseBodyTruncated?: boolean;\n capturePolicy?: string;\n linkConfidence?: 'exact' | 'inferred' | 'weak' | 'none';\n}\n\nexport interface HttpRequestIngestItem {\n type: 'http_request';\n traceId: string;\n requestId: 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 spanId?: string;\n parentSpanId?: string;\n requestBodyStatus?: string;\n responseBodyStatus?: string;\n requestBodyRedactedFields?: string[];\n responseBodyRedactedFields?: string[];\n requestBodyTruncated?: boolean;\n responseBodyTruncated?: boolean;\n capturePolicy?: string;\n linkConfidence?: 'exact' | 'inferred' | 'weak' | 'none';\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 genRequestId(): string {\n return genTraceId();\n}\n\nexport function generateHttpId(): string {\n return genTraceId();\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 requestId: ev.requestId ?? genRequestId(),\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 spanId: ev.spanId,\n parentSpanId: ev.parentSpanId,\n requestBodyStatus: ev.requestBodyStatus,\n responseBodyStatus: ev.responseBodyStatus,\n requestBodyRedactedFields: ev.requestBodyRedactedFields,\n responseBodyRedactedFields: ev.responseBodyRedactedFields,\n requestBodyTruncated: ev.requestBodyTruncated,\n responseBodyTruncated: ev.responseBodyTruncated,\n capturePolicy: ev.capturePolicy,\n linkConfidence: ev.linkConfidence ?? 'exact',\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) {\n this.flushTimer = setInterval(() => this.flush(), FLUSH_INTERVAL_MS);\n (this.flushTimer as any)?.unref?.();\n }\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 const DEFAULT_REDACT_BODY_FIELDS = [\n 'password',\n 'passcode',\n 'otp',\n 'token',\n 'authorization',\n 'cookie',\n 'session',\n 'refresh_token',\n 'access_token',\n 'jwt',\n 'card',\n 'credit_card',\n 'iban',\n 'national_id',\n 'secret',\n 'api_key',\n];\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 /** Content types eligible for body capture. Default JSON + text payloads. */\n allowedContentTypes?: string[];\n /** Additional JSON body fields to redact recursively. */\n redactBodyFields?: string[];\n}\n\nexport interface CapturedBody {\n body?: string;\n status: 'disabled' | 'captured' | 'redacted' | 'truncated' | 'unsupported' | 'empty';\n redactedFields: string[];\n truncated: boolean;\n capturePolicy: string;\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 captureBodyResult(\n body: unknown,\n enabled: boolean,\n maxBodyBytes: number,\n opts: HttpTrackingOptions = {},\n contentType?: string,\n): CapturedBody {\n if (!enabled) {\n return {\n status: 'disabled',\n redactedFields: [],\n truncated: false,\n capturePolicy: 'body_capture_disabled',\n };\n }\n if (body == null) {\n return {\n status: 'empty',\n redactedFields: [],\n truncated: false,\n capturePolicy: 'empty_body',\n };\n }\n const allowed = opts.allowedContentTypes ?? ['application/json', 'text/', 'application/problem+json'];\n if (contentType && !allowed.some((needle) => contentType.toLowerCase().includes(needle.toLowerCase()))) {\n return {\n status: 'unsupported',\n redactedFields: [],\n truncated: false,\n capturePolicy: `unsupported_content_type:${contentType}`,\n };\n }\n\n let str: string;\n let redactedFields: 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]') {\n return {\n body: '<binary>',\n status: 'unsupported',\n redactedFields: [],\n truncated: false,\n capturePolicy: 'unsupported_binary_body',\n };\n }\n const redacted = redactJsonValue(body, opts);\n redactedFields = redacted.redactedFields;\n try { str = JSON.stringify(redacted.value); } catch {\n return {\n body: '<unserializable>',\n status: 'unsupported',\n redactedFields,\n truncated: false,\n capturePolicy: 'unserializable_body',\n };\n }\n } else {\n return {\n body: '<binary>',\n status: 'unsupported',\n redactedFields: [],\n truncated: false,\n capturePolicy: 'unsupported_body_type',\n };\n }\n\n if (typeof body === 'string' && looksJson(contentType, str)) {\n try {\n const redacted = redactJsonValue(JSON.parse(str), opts);\n redactedFields = redacted.redactedFields;\n str = JSON.stringify(redacted.value);\n } catch {\n str = redactSensitiveText(str, opts);\n }\n }\n\n let truncated = false;\n if (str.length > maxBodyBytes) {\n str = str.slice(0, maxBodyBytes) + '…[truncated]';\n truncated = true;\n }\n return {\n body: str,\n status: truncated ? 'truncated' : redactedFields.length > 0 ? 'redacted' : 'captured',\n redactedFields: Array.from(new Set(redactedFields)).sort(),\n truncated,\n capturePolicy: 'opt_in_body_capture',\n };\n}\n\nexport function captureBody(\n body: unknown,\n enabled: boolean,\n maxBodyBytes: number,\n): string | undefined {\n return captureBodyResult(body, enabled, maxBodyBytes).body;\n}\n\nfunction looksJson(contentType: string | undefined, body: string): boolean {\n if (contentType && contentType.toLowerCase().includes('json')) return true;\n const trimmed = body.trim();\n return (trimmed.startsWith('{') && trimmed.endsWith('}')) || (trimmed.startsWith('[') && trimmed.endsWith(']'));\n}\n\nfunction redactJsonValue(value: unknown, opts: HttpTrackingOptions, path = ''): { value: unknown; redactedFields: string[] } {\n const fieldSet = new Set([...DEFAULT_REDACT_BODY_FIELDS, ...(opts.redactBodyFields ?? [])].map((v) => v.toLowerCase()));\n const redactedFields: string[] = [];\n const walk = (input: unknown, currentPath: string): unknown => {\n if (Array.isArray(input)) return input.map((item, index) => walk(item, `${currentPath}[${index}]`));\n if (!input || typeof input !== 'object') return input;\n const out: Record<string, unknown> = {};\n for (const [key, raw] of Object.entries(input as Record<string, unknown>)) {\n const keyLower = key.toLowerCase();\n const nextPath = currentPath ? `${currentPath}.${key}` : key;\n if (fieldSet.has(keyLower) || keyLower.includes('token') || keyLower.includes('password')) {\n out[key] = REDACTED;\n redactedFields.push(nextPath);\n } else {\n out[key] = walk(raw, nextPath);\n }\n }\n return out;\n };\n return { value: walk(value, path), redactedFields };\n}\n\nfunction redactSensitiveText(input: string, opts: HttpTrackingOptions): string {\n const fields = [...DEFAULT_REDACT_BODY_FIELDS, ...(opts.redactBodyFields ?? [])];\n let out = input;\n for (const key of fields) {\n const escaped = key.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n out = out.replace(new RegExp(`(\"${escaped}\"\\\\s*:\\\\s*)\"[^\"]*\"`, 'gi'), `$1\"${REDACTED}\"`);\n }\n return out;\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, generateHttpId } from './http-requests';\nimport type { TracingModule, Span } from './tracing';\nimport type { ReplaySurrogate } from './replay-surrogate';\nimport {\n HttpTrackingOptions,\n redactUrl,\n sanitizeHeaders,\n shouldCaptureUrl,\n captureBodyResult,\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;\nlet _currentRuntime: RuntimeBinding | null = null;\nfunction currentModule(): HttpRequestModule | null { return _currentModule; }\nfunction currentOpts(): BoundOptions | null { return _currentOpts; }\nfunction currentRuntime(): RuntimeBinding | null { return _currentRuntime; }\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\ninterface RuntimeBinding {\n tracing: TracingModule;\n replay: ReplaySurrogate | null;\n release?: string;\n dist?: string;\n platform?: string;\n environment?: string;\n}\n\ninterface RequestContext {\n traceId: string;\n requestId: string;\n spanId: string;\n parentSpanId: string;\n traceparent: string;\n span: Span;\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 allowedContentTypes: opts.allowedContentTypes ?? ['application/json', 'text/', 'application/problem+json'],\n redactBodyFields: opts.redactBodyFields ?? [],\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\nfunction normalizeTraceId(traceId: string): string {\n const hex = traceId.replace(/[^a-fA-F0-9]/g, '').toLowerCase();\n return (hex + '00000000000000000000000000000000').slice(0, 32);\n}\n\nfunction normalizeSpanId(spanId: string): string {\n const hex = spanId.replace(/[^a-fA-F0-9]/g, '').toLowerCase();\n return (hex + '0000000000000000').slice(0, 16);\n}\n\nfunction createRequestContext(method: string, url: string): RequestContext | null {\n const runtime = currentRuntime();\n if (!runtime) return null;\n const requestId = generateHttpId();\n const parentSpanId = runtime.tracing.getCurrentSpanId() ?? '';\n const span = runtime.tracing.startSpan('mobile.http', {\n description: `${method.toUpperCase()} ${url}`,\n tags: { requestId, method: method.toUpperCase(), platform: runtime.platform ?? 'react-native' },\n });\n const traceId = runtime.tracing.getTraceId();\n const spanId = span.spanId;\n return {\n traceId,\n requestId,\n spanId,\n parentSpanId,\n traceparent: `00-${normalizeTraceId(traceId)}-${normalizeSpanId(spanId)}-01`,\n span,\n };\n}\n\nfunction propagationHeaders(ctx: RequestContext): Record<string, string> {\n const headers: Record<string, string> = {\n traceparent: ctx.traceparent,\n 'x-allstak-trace-id': ctx.traceId,\n 'x-allstak-request-id': ctx.requestId,\n };\n if (ctx.parentSpanId) headers['x-allstak-parent-span-id'] = ctx.parentSpanId;\n return headers;\n}\n\nfunction mergeHeaders(headers: any, propagation: Record<string, string>): any {\n const entries = Object.entries(propagation);\n if (typeof Headers !== 'undefined' && headers instanceof Headers) {\n const next = new Headers(headers);\n for (const [k, v] of entries) if (!next.has(k)) next.set(k, v);\n return next;\n }\n if (Array.isArray(headers)) {\n const existing = new Set(headers.map(([k]) => String(k).toLowerCase()));\n const next = [...headers];\n for (const [k, v] of entries) if (!existing.has(k.toLowerCase())) next.push([k, v]);\n return next;\n }\n const next: Record<string, string> = { ...(headers ?? {}) };\n const lower = new Set(Object.keys(next).map((k) => k.toLowerCase()));\n for (const [k, v] of entries) if (!lower.has(k.toLowerCase())) next[k] = v;\n return next;\n}\n\nfunction injectFetchHeaders(input: any, init: any, ctx: RequestContext): { input: any; init: any } {\n const headers = mergeHeaders(init?.headers ?? (input && typeof input === 'object' ? input.headers : undefined), propagationHeaders(ctx));\n return { input, init: { ...(init ?? {}), headers } };\n}\n\nfunction recordTimeline(kind: 'request' | 'exception' | 'response' | 'retry', label: string, ctx: RequestContext, data?: Record<string, unknown>): void {\n try {\n currentRuntime()?.replay?.recordTimelineMarker?.(kind, label, data, {\n traceId: ctx.traceId,\n requestId: ctx.requestId,\n spanId: ctx.spanId,\n release: currentRuntime()?.release,\n dist: currentRuntime()?.dist,\n });\n } catch { /* never break host */ }\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 ctx = createRequestContext(method, sanitizedUrl);\n const requestInit = ctx ? injectFetchHeaders(input, init, ctx).init : init;\n if (ctx) recordTimeline('request', 'request_started', ctx, { method, url: sanitizedUrl });\n const reqHeaders = sanitizeHeaders(headersToObject(requestInit?.headers ?? (input && input.headers)), opts);\n const reqBody = captureBodyResult(requestInit?.body, opts.captureRequestBody, opts.maxBodyBytes, opts, reqHeaders?.['content-type']);\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, requestInit);\n } catch (err) {\n ctx?.span.finish('error');\n if (ctx) recordTimeline('exception', 'request_failed', ctx, { method, url: sanitizedUrl, error: String((err as any)?.message ?? err) });\n safeCapture({\n type: 'http_request',\n traceId: ctx?.traceId ?? generateHttpId(),\n requestId: ctx?.requestId ?? generateHttpId(),\n spanId: ctx?.spanId,\n parentSpanId: ctx?.parentSpanId,\n method, url: sanitizedUrl, statusCode: 0,\n durationMs: Date.now() - start,\n requestBody: reqBody.body, requestHeaders: reqHeaders, requestSize: reqSize,\n requestBodyStatus: reqBody.status,\n requestBodyRedactedFields: reqBody.redactedFields,\n requestBodyTruncated: reqBody.truncated,\n capturePolicy: reqBody.capturePolicy,\n error: String((err as any)?.message ?? err),\n linkConfidence: 'exact',\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 = captureBodyResult(text, true, opts.maxBodyBytes, opts, respHeaders?.['content-type']).body;\n if (respSize == null) respSize = safeByteLength(text);\n } catch { /* clone unsafe — leave body undefined */ }\n }\n } catch { /* never break the response surface */ }\n const respBodyResult = captureBodyResult(respBody, opts.captureResponseBody && respBody !== undefined, opts.maxBodyBytes, opts, respHeaders?.['content-type']);\n const isError = response.status >= 400;\n ctx?.span.setTag('requestId', ctx.requestId).setTag('http.status_code', String(response.status)).finish(isError ? 'error' : 'ok');\n if (ctx) recordTimeline(isError ? 'exception' : 'response', isError ? 'request_failed' : 'response_received', ctx, { statusCode: response.status, durationMs });\n\n safeCapture({\n type: 'http_request',\n traceId: ctx?.traceId ?? generateHttpId(),\n requestId: ctx?.requestId ?? generateHttpId(),\n spanId: ctx?.spanId,\n parentSpanId: ctx?.parentSpanId,\n method, url: sanitizedUrl,\n statusCode: response.status, durationMs,\n requestBody: reqBody.body, requestHeaders: reqHeaders, requestSize: reqSize,\n responseBody: respBodyResult.body, responseHeaders: respHeaders, responseSize: respSize,\n requestBodyStatus: reqBody.status,\n responseBodyStatus: respBodyResult.status,\n requestBodyRedactedFields: reqBody.redactedFields,\n responseBodyRedactedFields: respBodyResult.redactedFields,\n requestBodyTruncated: reqBody.truncated,\n responseBodyTruncated: respBodyResult.truncated,\n capturePolicy: `${reqBody.capturePolicy};${respBodyResult.capturePolicy}`,\n linkConfidence: 'exact',\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 ctx = createRequestContext(method, sanitizedUrl);\n if (ctx) {\n for (const [k, v] of Object.entries(propagationHeaders(ctx))) {\n try { origSetRequestHeader.call(this, k, v); } catch { /* ignore */ }\n }\n recordTimeline('request', 'request_started', ctx, { method, url: sanitizedUrl });\n }\n const reqBody = captureBodyResult(body, opts.captureRequestBody, opts.maxBodyBytes, opts, reqHeaders?.['content-type']);\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 let respBodyResult = captureBodyResult(undefined, false, liveOpts.maxBodyBytes, liveOpts);\n if (liveOpts.captureResponseBody) {\n const text = (this as any).responseText;\n if (typeof text === 'string') {\n respBodyResult = captureBodyResult(text, true, liveOpts.maxBodyBytes, liveOpts, respHeaders?.['content-type']);\n respBody = respBodyResult.body;\n respSize = safeByteLength(text);\n }\n }\n } catch { /* never break */ }\n const failed = !!error || statusCode >= 400;\n ctx?.span.setTag('requestId', ctx.requestId).setTag('http.status_code', String(statusCode)).finish(failed ? 'error' : 'ok');\n if (ctx) recordTimeline(failed ? 'exception' : 'response', failed ? 'request_failed' : 'response_received', ctx, { statusCode, durationMs, error });\n\n safeCapture({\n type: 'http_request',\n traceId: ctx?.traceId ?? generateHttpId(),\n requestId: ctx?.requestId ?? generateHttpId(),\n spanId: ctx?.spanId,\n parentSpanId: ctx?.parentSpanId,\n method, url: sanitizedUrl,\n statusCode, durationMs,\n requestBody: reqBody.body, requestHeaders: reqHeaders, requestSize: reqSize,\n responseBody: respBody, responseHeaders: respHeaders, responseSize: respSize,\n requestBodyStatus: reqBody.status,\n responseBodyStatus: respBody ? 'captured' : opts.captureResponseBody ? 'empty' : 'disabled',\n requestBodyRedactedFields: reqBody.redactedFields,\n requestBodyTruncated: reqBody.truncated,\n capturePolicy: reqBody.capturePolicy,\n error,\n linkConfidence: 'exact',\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; ctx: RequestContext | null }>();\n\n axiosInstance.interceptors.request.use((config: any) => {\n try {\n const rawUrl = (config.baseURL ? config.baseURL.replace(/\\/$/, '') : '') + (config.url || '');\n const method = String(config.method || 'GET').toUpperCase();\n const ctx = createRequestContext(method, rawUrl);\n if (ctx) {\n config.headers = mergeHeaders(config.headers, propagationHeaders(ctx));\n recordTimeline('request', 'request_started', ctx, { method, url: rawUrl });\n }\n reqStarts.set(config, {\n start: Date.now(),\n method,\n rawUrl,\n ctx,\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 = captureBodyResult(cfg.data, opts.captureRequestBody, opts.maxBodyBytes, opts, reqHeaders?.['content-type']);\n const respHeaders = sanitizeHeaders(headersToObject(response?.headers), opts);\n const respBody = captureBodyResult(response?.data, opts.captureResponseBody, opts.maxBodyBytes, opts, respHeaders?.['content-type']);\n const failed = !!error || statusCode >= 400;\n meta.ctx?.span.setTag('requestId', meta.ctx.requestId).setTag('http.status_code', String(statusCode)).finish(failed ? 'error' : 'ok');\n if (meta.ctx) recordTimeline(failed ? 'exception' : 'response', failed ? 'request_failed' : 'response_received', meta.ctx, { statusCode, error });\n\n try {\n module.capture({\n type: 'http_request',\n traceId: meta.ctx?.traceId ?? generateHttpId(),\n requestId: meta.ctx?.requestId ?? generateHttpId(),\n spanId: meta.ctx?.spanId,\n parentSpanId: meta.ctx?.parentSpanId,\n method: meta.method,\n url: sanitizedUrl,\n statusCode,\n durationMs: Date.now() - meta.start,\n requestBody: reqBody.body,\n requestHeaders: reqHeaders,\n responseBody: respBody.body,\n responseHeaders: respHeaders,\n requestBodyStatus: reqBody.status,\n responseBodyStatus: respBody.status,\n requestBodyRedactedFields: reqBody.redactedFields,\n responseBodyRedactedFields: respBody.redactedFields,\n requestBodyTruncated: reqBody.truncated,\n responseBodyTruncated: respBody.truncated,\n capturePolicy: `${reqBody.capturePolicy};${respBody.capturePolicy}`,\n error,\n linkConfidence: 'exact',\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 runtime: RuntimeBinding,\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 _currentRuntime = runtime;\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 _currentRuntime = 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 * Standalone AllStak client for React Native. No browser APIs, no Node APIs —\n * only what RN guarantees: global `fetch`, AbortController, Date, JSON.\n *\n * Surface mirrors the public AllStak API used by mobile apps:\n * init / captureException / captureMessage / addBreadcrumb / clearBreadcrumbs\n * setUser / setTag / setIdentity / getSessionId\n */\n\nimport { HttpTransport, TransportStats } from './transport';\nimport { parseStack } from './stack';\nimport { resolveDebugId } from './utils/debug-id';\nimport { Scope, mergeScopes } from './scope';\nimport { TracingModule, Span } from './tracing';\nimport { ReplaySurrogate, ReplaySurrogateOptions } from './replay-surrogate';\nimport { HttpRequestModule } from './http-requests';\nimport type { HttpTrackingOptions } from './http-redact';\nimport { installHttpInstrumentation, unbindHttpInstrumentation } from './http-instrumentation';\nimport type { ConsoleCaptureOptions } from './auto-breadcrumbs';\n\nexport const INGEST_HOST = 'https://api.allstak.sa';\nexport const SDK_NAME = 'allstak-react-native';\nexport const SDK_VERSION = '0.3.3';\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 * Affects `captureException` (sets `payload.level`) and the default of\n * `captureMessage`. Customer-set default severity, mirrors `setLevel`.\n */\n level?: 'fatal' | 'error' | 'warning' | 'info' | 'debug';\n /**\n * Custom grouping fingerprint applied to every event. The backend uses\n * this in place of stack-based grouping. 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 /**\n * Privacy-first view-state replay surrogate. **Off by default.** Enable\n * with `replay: { sampleRate: 0.1, safeParams: ['screenId'] }`. Captures\n * route names + AppState transitions + manual checkpoints — never inputs\n * or rendered text. See `src/replay-surrogate.ts` for the privacy contract.\n */\n replay?: ReplaySurrogateOptions;\n /**\n * Auto-instrument outbound HTTP — wraps `fetch`, `XMLHttpRequest`, and\n * (when present) `axios`. Default: false. Combine with `httpTracking`\n * to control body/header capture and redaction. Idempotent.\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 * 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 maxBreadcrumbs?: number;\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 /**\n * Optional fail-open screenshot capture. Off by default and provider-based\n * so Expo/RN apps choose their own native or JS screenshot implementation.\n * The SDK bounds timeout/size/sampling and drops screenshots before it can\n * hurt app navigation, JS thread responsiveness, or telemetry delivery.\n */\n screenshot?: ScreenshotCaptureOptions;\n /** SDK identity overrides (set automatically by installReactNative). */\n sdkName?: string;\n sdkVersion?: string;\n platform?: string;\n dist?: string;\n commitSha?: string;\n branch?: string;\n}\n\nexport interface ScreenshotArtifact {\n data?: string;\n contentType?: 'image/png' | 'image/jpeg' | 'image/webp';\n width?: number;\n height?: number;\n sizeBytes?: number;\n redacted?: boolean;\n redactionStrategy?: string;\n}\n\nexport interface ScreenshotCaptureOptions {\n enabled?: boolean;\n captureOnError?: boolean;\n timeoutMs?: number;\n maxBytes?: number;\n sampleRate?: number;\n provider?: (reason: { type: 'error'; error: Error; traceId?: string; requestId?: string }) =>\n | ScreenshotArtifact | null | undefined\n | Promise<ScreenshotArtifact | null | undefined>;\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 traceId?: string;\n spanId?: string;\n parentSpanId?: string;\n requestId?: string;\n replayId?: string;\n service?: string;\n user?: { id?: string; email?: string };\n metadata?: Record<string, unknown>;\n breadcrumbs?: Breadcrumb[];\n fingerprint?: string[];\n debugMeta?: { images: Array<{ type: string; debugId: 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 // RFC4122-ish v4 — RN doesn't ship `crypto.randomUUID` reliably across\n // versions, so build one from Math.random. Good enough for session IDs.\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 stringContextValue(context: Record<string, unknown>, key: string): string | undefined {\n const value = context[key];\n return typeof value === 'string' && value.trim().length > 0 ? value : undefined;\n}\n\nfunction firstRecentRequestId(recentFailed: ReadonlyArray<{ requestId?: string }>): string | undefined {\n for (let i = recentFailed.length - 1; i >= 0; i--) {\n const requestId = recentFailed[i]?.requestId;\n if (requestId && requestId.trim().length > 0) return requestId;\n }\n return undefined;\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: ReplaySurrogate | null = null;\n private httpRequests: HttpRequestModule | null = null;\n private _instrumentAxios: ((axios: any) => any) | null = null;\n\n constructor(config: AllStakConfig) {\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 = 'react-native';\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 ?? '', Boolean(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 if (config.replay && (config.replay.enabled ?? true)) {\n try {\n this.replay = new ReplaySurrogate(this.transport, this.sessionId, 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, config.httpTracking ?? {}, baseUrl,\n {\n tracing: this.tracing,\n replay: this.replay,\n release: this.config.release,\n dist: this.config.dist,\n platform: this.config.platform,\n environment: this.config.environment,\n },\n );\n this._instrumentAxios = instrumentAxios;\n } catch { /* never break init */ }\n }\n }\n\n /** Access the replay surrogate (or null if not initialized / sampled out). */\n getReplay(): ReplaySurrogate | null { return this.replay; }\n\n /** Manually instrument an axios instance. No-op when HTTP tracking is off. */\n instrumentAxios<T = any>(axios: T): T {\n return this._instrumentAxios ? (this._instrumentAxios(axios) as T) : axios;\n }\n /** Snapshot of recent failed HTTP requests for error-linking. */\n getRecentFailedHttp() { return this.httpRequests?.getRecentFailed() ?? []; }\n\n // ── Public API ────────────────────────────────────────────────────\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\n // Aggregate unique debug-ids into debugMeta.images[] so the\n // symbolicator can match by image-level debugId.\n const debugIdSet = new Set<string>();\n for (const f of frames) if (f.debugId) debugIdSet.add(f.debugId);\n const debugMeta = debugIdSet.size > 0\n ? { images: Array.from(debugIdSet).map((id) => ({ type: 'sourcemap' as const, debugId: id })) }\n : undefined;\n\n const stackTrace = frames.length > 0 ? frames.map(frameToString) : undefined;\n\n const currentBreadcrumbs = this.breadcrumbs.length > 0 ? [...this.breadcrumbs] : undefined;\n this.breadcrumbs = [];\n\n // Prefer an explicit `error.name` override (e.g. native crashes set\n // it to 'NSException'); fall back to constructor name then to 'Error'.\n // `new Error()` always has constructor.name === 'Error', so an explicit\n // name set after construction would otherwise 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 recentFailed = this.httpRequests?.getRecentFailed() ?? [];\n const linkedRequest = recentFailed.length > 0 ? recentFailed[recentFailed.length - 1] : undefined;\n if (linkedRequest?.traceId) this.tracing.setTraceId(linkedRequest.traceId);\n const exceptionSpan = linkedRequest ? this.tracing.startSpan('mobile.exception', {\n description: error.message,\n tags: {\n requestId: linkedRequest.requestId,\n exceptionClass,\n },\n }) : null;\n exceptionSpan?.finish('error');\n const traceId = linkedRequest?.traceId ?? this.tracing.getTraceId();\n if (traceId) traceContext.traceId = traceId;\n const spanId = exceptionSpan?.spanId || this.tracing.getCurrentSpanId();\n if (spanId) traceContext.spanId = spanId;\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 requestId: r.requestId, traceId: r.traceId,\n confidence: r.requestId === linkedRequest?.requestId ? 'inferred' : 'weak',\n }));\n traceContext['http.linkConfidence'] = 'inferred';\n }\n try {\n if (!linkedRequest) throw new Error('no linked request');\n this.replay?.recordTimelineMarker?.('exception', 'exception_captured', {\n exceptionClass,\n message: error.message,\n requestLinkConfidence: linkedRequest ? 'inferred' : 'none',\n }, {\n traceId,\n requestId: linkedRequest?.requestId,\n spanId: spanId ?? undefined,\n release: this.config.release,\n dist: this.config.dist,\n });\n } catch { /* never break capture */ }\n\n const payload: ErrorIngestPayload = {\n exceptionClass,\n message: error.message,\n stackTrace,\n frames: frames.length > 0 ? frames : undefined,\n debugMeta,\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 traceId: stringContextValue(traceContext, 'traceId'),\n spanId: stringContextValue(traceContext, 'spanId'),\n requestId: linkedRequest?.requestId ?? firstRecentRequestId(recentFailed),\n service: this.config.service,\n user: eff.user,\n metadata: { ...this.buildMetadata(context), ...traceContext },\n breadcrumbs: currentBreadcrumbs,\n fingerprint: eff.fingerprint,\n };\n\n if (this.shouldCaptureScreenshot()) {\n void this.withScreenshotMetadata(error, payload)\n .then((enriched) => this.sendThroughBeforeSend(enriched))\n .catch(() => this.sendThroughBeforeSend({\n ...payload,\n metadata: { ...(payload.metadata ?? {}), 'screenshot.status': 'failed' },\n }));\n return;\n }\n this.sendThroughBeforeSend({\n ...payload,\n metadata: {\n ...(payload.metadata ?? {}),\n 'screenshot.status': this.config.screenshot?.enabled ? 'unsupported' : 'disabled',\n },\n });\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 traceId: this.tracing.getTraceId(),\n spanId: this.tracing.getCurrentSpanId() ?? undefined,\n service: this.config.service,\n user: eff.user,\n metadata: this.buildMetadata(),\n fingerprint: eff.fingerprint,\n };\n this.sendThroughBeforeSend(payload);\n }\n }\n\n addBreadcrumb(\n type: string,\n message: string,\n level?: string,\n data?: Record<string, unknown>,\n ): 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 {\n this.breadcrumbs = [];\n }\n\n setUser(user: { id?: string; email?: string }): void {\n this.config.user = user;\n }\n\n setTag(key: string, value: string): void {\n if (!this.config.tags) this.config.tags = {};\n this.config.tags[key] = value;\n }\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\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\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 /**\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 /**\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\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\n getSessionId(): string { return this.sessionId; }\n\n getConfig(): AllStakConfig { return this.config; }\n\n getTransportStats(): TransportStats { return this.transport.getStats(); }\n\n destroy(): void {\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 unbindHttpInstrumentation();\n this._instrumentAxios = null;\n this.breadcrumbs = [];\n }\n\n // ── Internal ──────────────────────────────────────────────────────\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.buildMetadata(),\n });\n }\n\n private shouldCaptureScreenshot(): boolean {\n const screenshot = this.config.screenshot;\n if (!screenshot?.enabled || screenshot.captureOnError === false || !screenshot.provider) return false;\n const sampleRate = screenshot.sampleRate ?? 1;\n return !(sampleRate <= 0 || (sampleRate < 1 && Math.random() >= sampleRate));\n }\n\n private async withScreenshotMetadata(error: Error, payload: ErrorIngestPayload): Promise<ErrorIngestPayload> {\n const screenshot = this.config.screenshot;\n if (!screenshot?.provider) {\n return { ...payload, metadata: { ...(payload.metadata ?? {}), 'screenshot.status': 'unsupported' } };\n }\n const timeoutMs = Math.max(100, Math.min(screenshot.timeoutMs ?? 1500, 5000));\n const maxBytes = Math.max(1024, screenshot.maxBytes ?? 200_000);\n try {\n const artifact = await Promise.race([\n Promise.resolve(screenshot.provider({\n type: 'error',\n error,\n traceId: payload.traceId,\n requestId: payload.requestId,\n })),\n new Promise<null>((resolve) => setTimeout(() => resolve(null), timeoutMs)),\n ]);\n if (!artifact) {\n return { ...payload, metadata: { ...(payload.metadata ?? {}), 'screenshot.status': 'timeout_or_empty' } };\n }\n const size = artifact.sizeBytes ?? byteSize(artifact.data);\n if (size > maxBytes) {\n this.transport.noteDropped();\n return {\n ...payload,\n metadata: { ...(payload.metadata ?? {}), 'screenshot.status': 'dropped_too_large', 'screenshot.sizeBytes': size },\n };\n }\n return {\n ...payload,\n metadata: {\n ...(payload.metadata ?? {}),\n 'screenshot.status': 'captured',\n 'screenshot.contentType': artifact.contentType,\n 'screenshot.width': artifact.width,\n 'screenshot.height': artifact.height,\n 'screenshot.sizeBytes': size,\n 'screenshot.redacted': artifact.redacted ?? false,\n 'screenshot.redactionStrategy': artifact.redactionStrategy,\n ...(artifact.data ? { 'screenshot.data': artifact.data } : {}),\n },\n };\n } catch {\n return { ...payload, metadata: { ...(payload.metadata ?? {}), 'screenshot.status': 'failed' } };\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 scope on the\n * stack. Inner code reads from this instead of `this.config` directly so\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 to attach per-request context without leaking\n * across concurrent requests.\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;\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\n// ── Public singleton facade ──────────────────────────────────────────\n\nlet instance: AllStakClient | null = null;\n\nfunction maybeInit(): AllStakClient | null {\n return instance;\n}\n\nfunction noopSpan(operation = ''): Span {\n return new Span('', '', '', operation, '', '', '', {}, () => undefined);\n}\n\nfunction emptyStats(): TransportStats {\n return {\n queued: 0,\n sent: 0,\n failed: 0,\n dropped: 0,\n consecutiveFailures: 0,\n circuitOpenUntil: 0,\n };\n}\n\n/**\n * Module-level breadcrumb forwarder used by auto-instrumentation wrappers\n * (fetch/console/navigation) so they always target the current `instance`\n * after re-init, and silently no-op when there is none.\n */\nexport function __safeAddBreadcrumbForInstrumentation(\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\nexport const AllStak = {\n init(config: AllStakConfig): AllStakClient {\n try {\n if (instance) instance.destroy();\n instance = new AllStakClient(config);\n return instance;\n } catch {\n instance = new AllStakClient({ ...config, apiKey: '' });\n return instance;\n }\n },\n captureException(error: Error, context?: Record<string, unknown>): void {\n try { maybeInit()?.captureException(error, context); } catch { /* fail-open */ }\n },\n captureMessage(\n message: string,\n level: 'fatal' | 'error' | 'warning' | 'info' = 'info',\n options?: { as?: 'log' | 'error' | 'both' },\n ): void {\n try { maybeInit()?.captureMessage(message, level, options); } catch { /* fail-open */ }\n },\n addBreadcrumb(type: string, message: string, level?: string, data?: Record<string, unknown>): void {\n try { maybeInit()?.addBreadcrumb(type, message, level, data); } catch { /* fail-open */ }\n },\n clearBreadcrumbs(): void { try { maybeInit()?.clearBreadcrumbs(); } catch { /* fail-open */ } },\n setUser(user: { id?: string; email?: string }): void { try { maybeInit()?.setUser(user); } catch { /* fail-open */ } },\n setTag(key: string, value: string): void { try { maybeInit()?.setTag(key, value); } catch { /* fail-open */ } },\n setTags(tags: Record<string, string>): void { try { maybeInit()?.setTags(tags); } catch { /* fail-open */ } },\n setExtra(key: string, value: unknown): void { try { maybeInit()?.setExtra(key, value); } catch { /* fail-open */ } },\n setExtras(extras: Record<string, unknown>): void { try { maybeInit()?.setExtras(extras); } catch { /* fail-open */ } },\n setContext(name: string, ctx: Record<string, unknown> | null): void { try { maybeInit()?.setContext(name, ctx); } catch { /* fail-open */ } },\n setLevel(level: 'fatal' | 'error' | 'warning' | 'info' | 'debug'): void { try { maybeInit()?.setLevel(level); } catch { /* fail-open */ } },\n setFingerprint(fingerprint: string[] | null): void { try { maybeInit()?.setFingerprint(fingerprint); } catch { /* fail-open */ } },\n flush(timeoutMs?: number): Promise<boolean> {\n try { return maybeInit()?.flush(timeoutMs) ?? Promise.resolve(true); }\n catch { return Promise.resolve(false); }\n },\n setIdentity(identity: { sdkName?: string; sdkVersion?: string; platform?: string; dist?: string }): void {\n try { maybeInit()?.setIdentity(identity); } catch { /* fail-open */ }\n },\n /**\n * Run `callback` with a fresh scoped context. Any user/tag/extra/context/\n * fingerprint/level set on the passed `Scope` is visible only inside the\n * callback (and any captures made within it). Pop is automatic, including\n * for async callbacks and thrown errors.\n */\n withScope<T>(callback: (scope: Scope) => T): T {\n try {\n const client = maybeInit();\n return client ? client.withScope(callback) : callback(new Scope());\n }\n catch { return callback(new Scope()); }\n },\n startSpan(operation: string, options?: { description?: string; tags?: Record<string, string> }): Span {\n try { return maybeInit()?.startSpan(operation, options) ?? noopSpan(operation); }\n catch { return noopSpan(operation); }\n },\n getTraceId(): string {\n try { return maybeInit()?.getTraceId() ?? ''; } catch { return ''; }\n },\n setTraceId(traceId: string): void { try { maybeInit()?.setTraceId(traceId); } catch { /* fail-open */ } },\n getCurrentSpanId(): string | null {\n try { return maybeInit()?.getCurrentSpanId() ?? null; } catch { return null; }\n },\n resetTrace(): void { try { maybeInit()?.resetTrace(); } catch { /* fail-open */ } },\n /** Access the privacy-first replay surrogate (or null if disabled / sampled out). */\n getReplay(): ReplaySurrogate | null {\n try { return maybeInit()?.getReplay() ?? null; } catch { return null; }\n },\n /** Manually instrument an axios instance. No-op when HTTP tracking is off. */\n instrumentAxios<T = any>(axios: T): T {\n try { return maybeInit()?.instrumentAxios(axios) ?? axios; } catch { return axios; }\n },\n getSessionId(): string {\n try { return maybeInit()?.getSessionId() ?? ''; } catch { return ''; }\n },\n getConfig(): AllStakConfig | null { return instance?.getConfig() ?? null; },\n getTransportStats(): TransportStats {\n try { return maybeInit()?.getTransportStats() ?? emptyStats(); } catch { return emptyStats(); }\n },\n destroy(): void { instance?.destroy(); instance = null; },\n /** @internal — exposed for testing */\n _getInstance(): AllStakClient | null { return instance; },\n};\n\nfunction byteSize(value?: string): number {\n if (!value) return 0;\n try {\n if (typeof TextEncoder !== 'undefined') return new TextEncoder().encode(value).length;\n } catch {\n /* ignore */\n }\n return value.length;\n}\n","import * as React from 'react';\nimport { AllStak, AllStakClient } from './client';\nimport type { AllStakConfig } from './client';\nimport { installReactNative } from './install';\nimport type { ReactNativeInstallOptions } from './install';\n\nexport interface AllStakProviderProps extends ReactNativeInstallOptions {\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 on, log +\n * info off. Set `{ log: true, info: true }` to opt-in to verbose\n * capture, or `{ warn: false, error: false }` to suppress.\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 /**\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 * (e.g. test harness, multi-tenant container that switches projects).\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 AllStakErrorBoundary 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 destroyOnUnmount = false,\n fallback,\n onError,\n autoErrorHandler,\n autoPromiseRejections,\n autoDeviceTags,\n autoAppStateBreadcrumbs,\n autoNetworkCapture,\n autoFetchBreadcrumbs,\n autoConsoleBreadcrumbs,\n autoNavigationBreadcrumbs,\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. This\n // covers Fast Refresh in dev and Strict Mode double-mount in React 18\n // — both unmount/remount the provider but should not tear down the SDK.\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 };\n clientRef.current = AllStak.init(config);\n __providerOwnedInstance = clientRef.current;\n\n installReactNative({\n autoErrorHandler,\n autoPromiseRejections,\n autoDeviceTags,\n autoAppStateBreadcrumbs,\n autoNetworkCapture,\n autoFetchBreadcrumbs,\n autoConsoleBreadcrumbs,\n autoNavigationBreadcrumbs,\n debugLogs: debug,\n });\n\n if (debug) {\n // eslint-disable-next-line no-console\n console.log(`[AllStak] Initialized — session ${AllStak.getSessionId()}`);\n }\n }\n }\n\n React.useEffect(() => {\n return () => {\n if (destroyOnUnmount) {\n AllStak.destroy();\n __providerOwnedInstance = null;\n clientRef.current = null;\n // eslint-disable-next-line no-console\n if (debug) console.log('[AllStak] Destroyed on unmount');\n }\n };\n }, [destroyOnUnmount, debug]);\n\n return (\n <AllStakContext.Provider value={clientRef.current}>\n <AllStakErrorBoundary fallback={fallback} onError={onError} debug={debug}>\n {children}\n </AllStakErrorBoundary>\n </AllStakContext.Provider>\n );\n}\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 addBreadcrumb: (\n type: string,\n message: string,\n level?: string,\n data?: Record<string, unknown>,\n ) => AllStak.addBreadcrumb(type, message, level, data),\n }),\n [],\n );\n}\n\n/** @internal — for tests. Resets the module-level remount-guard. */\nexport function __resetProviderInstanceForTest(): void {\n __providerOwnedInstance = null;\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 are set to keep the\n * dashboard signal-to-noise high: `warn` and `error` capture by default\n * (most apps fire those at human-meaningful moments), `log` and `info`\n * are OFF by default since typical apps log thousands of debug lines\n * per session.\n *\n * Override per-method:\n *\n * <AllStakProvider captureConsole={{ log: true, info: true }} />\n *\n * Or to fully suppress:\n *\n * <AllStakProvider captureConsole={{ warn: false, error: false }} />\n *\n * Setting `autoConsoleBreadcrumbs={false}` on the provider/install is a\n * higher-level kill switch — it skips wrapping any console method.\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 // Wrap every method whose flag is true. We always wrap if the flag is on\n // and never wrap if off — so toggling at runtime requires re-init (kept\n // simple to avoid stacking wrappers on hot reload).\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 // JSON.stringify can return undefined (e.g. for a function root that\n // we already handled above; guard regardless).\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 * React Native architecture / runtime detection.\n *\n * **Status:** the JS-level check is implemented and tested. The native\n * AllStak modules (Java + Obj-C) are written in legacy module style and\n * are known to interoperate with the New Architecture (Fabric +\n * TurboModules) via the RN interop layer. End-to-end integration on a\n * real Fabric build has not yet been verified — see README §\"New\n * Architecture support\" for current status.\n *\n * The two booleans returned here are read off well-known global flags\n * that RN exposes to JS:\n *\n * - `globalThis.__turboModuleProxy` — present when TurboModules is\n * enabled (New Architecture).\n * - `globalThis.RN$Bridgeless` — present when bridgeless mode is on.\n *\n * If the host app surfaces this through `AllStak.setTag('rn.newArch', '1')`\n * we can correlate New-Arch crashes specifically and prioritize a fix.\n */\n\nexport interface ArchitectureInfo {\n /** True when TurboModules / New Architecture is detected at runtime. */\n newArchitecture: boolean;\n /** True when bridgeless mode is detected. */\n bridgeless: boolean;\n /** True when the JS engine is Hermes. */\n hermes: boolean;\n /** Free-form tag suitable for `AllStak.setTag('rn.architecture', ...)`. */\n tag: 'new-arch' | 'old-arch' | 'unknown';\n}\n\nexport function detectArchitecture(): ArchitectureInfo {\n const g = globalThis as any;\n const newArchitecture = typeof g.__turboModuleProxy !== 'undefined';\n const bridgeless = typeof g.RN$Bridgeless !== 'undefined' && !!g.RN$Bridgeless;\n const hermes = typeof g.HermesInternal !== 'undefined';\n\n let tag: ArchitectureInfo['tag'] = 'unknown';\n // Heuristic: if `__turboModuleProxy` is defined we're on New Arch.\n // Without it we conservatively return 'unknown' rather than guessing,\n // since some legacy debug builds also lack it.\n if (newArchitecture) tag = 'new-arch';\n else if (typeof g.nativeFlushQueueImmediate === 'function') tag = 'old-arch';\n\n return { newArchitecture, bridgeless, hermes, tag };\n}\n\n/**\n * Convenience: stamp `rn.architecture`, `rn.bridgeless`, and `rn.hermes`\n * tags on the active AllStak singleton based on detection. Safe to call\n * any time after `AllStak.init()` and before the first capture.\n */\nexport function applyArchitectureTags(setTag: (key: string, value: string) => void): ArchitectureInfo {\n const info = detectArchitecture();\n try {\n setTag('rn.architecture', info.tag);\n setTag('rn.bridgeless', String(info.bridgeless));\n setTag('rn.hermes', String(info.hermes));\n } catch { /* never break host */ }\n return info;\n}\n","/**\n * React Native navigation breadcrumbs — two opt-in helpers:\n *\n * - instrumentReactNavigation(navigationRef): call once after the\n * NavigationContainer is mounted. Subscribes to `state` events on the\n * NavigationContainerRef and emits a breadcrumb whenever the active\n * route name changes. Works with @react-navigation/native v6+ without\n * adding it as a dependency (the ref shape is duck-typed).\n *\n * - instrumentNavigationFromLinking(): registers a Linking event\n * listener so deep links also appear in breadcrumbs. Useful when the\n * app uses Linking.openURL(...) instead of (or alongside) a router.\n *\n * Both helpers are idempotent and never throw if the underlying RN module\n * isn't present (Expo Go, JS-only test runs).\n */\n\nimport { AllStak } from './client';\n\ndeclare const require: (id: string) => any;\n\ntype NavigationRef = {\n getCurrentRoute?: () => { name?: string } | undefined;\n addListener?: (event: string, cb: () => void) => () => void;\n};\n\nconst NAV_FLAG = Symbol.for('allstak.nav.subscribed');\nconst LINKING_FLAG = '__allstak_linking_patched__';\nconst NAV_AUTO_PATCH_FLAG = Symbol.for('allstak.nav.autoPatched');\n\nexport interface ReactNavigationOptions {\n /**\n * Whitelist of route-param keys safe to record alongside the route name.\n * Anything outside this list is dropped — params commonly carry user IDs,\n * order numbers, etc. Default `[]`.\n */\n safeParams?: string[];\n /**\n * Also forward the screen view to the replay surrogate (if active).\n * Default true — the surrogate itself decides whether it's recording.\n */\n forwardToReplay?: boolean;\n}\n\n/**\n * Subscribe to a `@react-navigation/native` NavigationContainerRef and\n * emit a navigation breadcrumb whenever the active route changes. Captures:\n *\n * - route name change (from -> to)\n * - whitelisted route params (via `safeParams`)\n * - state change → forwarded to replay surrogate when enabled\n *\n * Idempotent — installs once per ref. Returns an unsubscribe function.\n */\nexport function instrumentReactNavigation(\n navigationRef: NavigationRef,\n options: ReactNavigationOptions = {},\n): () => void {\n if (!navigationRef || typeof navigationRef.addListener !== 'function') {\n return () => {};\n }\n const ref = navigationRef as any;\n if (ref[NAV_FLAG]) return () => {};\n ref[NAV_FLAG] = true;\n\n const safeKeys = options.safeParams ?? [];\n const forwardToReplay = options.forwardToReplay !== false;\n\n const filterParams = (params: Record<string, unknown> | undefined): Record<string, unknown> => {\n const out: Record<string, unknown> = {};\n if (!params) return out;\n for (const key of safeKeys) if (key in params) out[key] = (params as any)[key];\n return out;\n };\n\n let last: string | undefined = navigationRef.getCurrentRoute?.()?.name;\n const unsub = navigationRef.addListener('state', () => {\n const route = navigationRef.getCurrentRoute?.();\n const next = route?.name;\n if (!next || next === last) return;\n const safe = filterParams((route as any)?.params);\n try {\n AllStak.addBreadcrumb('navigation', `${last ?? '<start>'} -> ${next}`, 'info',\n { from: last, to: next, params: safe });\n } catch { /* never break host */ }\n\n if (forwardToReplay) {\n try {\n const replay = (AllStak as any).getReplay?.();\n replay?.recordScreenView?.(next, (route as any)?.params);\n } catch { /* ignore */ }\n }\n last = next;\n });\n return () => {\n try { unsub?.(); } catch { /* ignore */ }\n ref[NAV_FLAG] = false;\n };\n}\n\n/**\n * Register a Linking listener so `openURL`/deep-link launches surface\n * as breadcrumbs. No-op if `react-native` isn't available (test env).\n */\nexport function instrumentNavigationFromLinking(): void {\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const rn = require('react-native');\n const Linking: any = rn?.Linking;\n if (!Linking || typeof Linking.addEventListener !== 'function') return;\n if ((Linking as any)[LINKING_FLAG]) return;\n\n Linking.addEventListener('url', (ev: { url?: string }) => {\n const url = typeof ev?.url === 'string' ? ev.url : '';\n if (!url) return;\n try { AllStak.addBreadcrumb('navigation', `deep-link: ${url.split('?')[0]}`, 'info', { url }); }\n catch { /* ignore */ }\n });\n (Linking as any)[LINKING_FLAG] = true;\n } catch {\n // react-native not available in this runtime (test, Expo Go web, etc.)\n }\n}\n\n/**\n * Best-effort automatic instrumentation of `@react-navigation/native`.\n *\n * **What it does:**\n * - Tries `require('@react-navigation/native')`. If the package is not\n * installed, returns `false` and is otherwise a no-op.\n * - If found, monkey-patches the module's exported `NavigationContainer`\n * with a wrapper that auto-creates an internal ref, forwards the\n * user's `ref` prop, and on mount calls `instrumentReactNavigation`\n * so route changes ship as breadcrumbs.\n * - Idempotent: a flag on the module's exports object prevents double\n * patching across hot-reload cycles or repeated `installReactNative`\n * calls.\n *\n * **Why this works:**\n * Babel's CommonJS interop preserves runtime property lookups for\n * named imports — `import { NavigationContainer } from '@react-navigation/native'`\n * compiles to `_rnav.NavigationContainer` accesses at use-site, so\n * patching the module's exports object before the host app renders\n * means user code transparently picks up our wrapper.\n *\n * **Why it might fail:**\n * - `@react-navigation/native` not installed → returns false silently.\n * - Module exports frozen or sealed (rare in CJS-style RN builds).\n * - User imported `NavigationContainer` via a deep path that bypasses\n * the index module.\n * In any failure case the manual API (`instrumentReactNavigation(ref)`)\n * is still available as a fallback.\n */\nexport function tryAutoInstrumentNavigation(): boolean {\n // Metro detection — auto-patch is incompatible with Metro's static\n // bundler because dynamic `require()` of an external module name\n // surfaces a LogBox dev-error even when caught. On Metro/RN we\n // therefore SKIP the auto-patch entirely and fall through to the\n // documented manual fallback (`instrumentReactNavigation(navigationRef)`).\n // The unit tests still exercise the auto-patch path under Node where\n // dynamic require is well-supported.\n const g: any = globalThis as any;\n const isMetro =\n typeof g.__METRO_GLOBAL_PREFIX__ !== 'undefined' ||\n typeof g.__r === 'function' ||\n typeof g.HermesInternal !== 'undefined';\n if (isMetro) return false;\n\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const rnav = require('@react-navigation/native');\n if (!rnav || !rnav.NavigationContainer) return false;\n if ((rnav as any)[NAV_AUTO_PATCH_FLAG]) return true;\n\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const React = require('react');\n if (!React || typeof React.forwardRef !== 'function') return false;\n\n const OrigContainer = rnav.NavigationContainer;\n\n const Wrapped = React.forwardRef(function AllStakNavigationContainer(\n props: any,\n userRef: any,\n ) {\n const internalRef = React.useRef(null);\n\n const setRef = React.useCallback((r: any) => {\n internalRef.current = r;\n if (typeof userRef === 'function') userRef(r);\n else if (userRef) userRef.current = r;\n }, [userRef]);\n\n React.useEffect(() => {\n if (internalRef.current) {\n try { instrumentReactNavigation(internalRef.current); }\n catch { /* never break host */ }\n }\n }, []);\n\n return React.createElement(OrigContainer, { ...props, ref: setRef });\n });\n Wrapped.displayName = 'AllStakNavigationContainer';\n\n try {\n // Some bundlers / strict modes freeze the exports object — guard.\n Object.defineProperty(rnav, 'NavigationContainer', {\n value: Wrapped,\n configurable: true,\n writable: true,\n });\n (rnav as any)[NAV_AUTO_PATCH_FLAG] = true;\n return true;\n } catch {\n // Exports immutable — fall back to manual API.\n return false;\n }\n } catch {\n // @react-navigation/native not installed, or React unavailable.\n return false;\n }\n}\n\n/** @internal — for tests. Resets the auto-patch flag on the cached module. */\nexport function __resetAutoNavigationFlagForTest(): void {\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const rnav = require('@react-navigation/native');\n if (rnav) delete (rnav as any)[NAV_AUTO_PATCH_FLAG];\n } catch { /* ignore */ }\n}\n","/**\n * React Native runtime integration — ErrorUtils, Hermes promise rejection\n * tracking, Platform tags, AppState breadcrumbs, XHR network capture,\n * fetch breadcrumbs, and console breadcrumbs.\n *\n * Extracted from index.ts so AllStakProvider can call it without circular\n * imports.\n */\n\nimport { AllStak, SDK_VERSION, __safeAddBreadcrumbForInstrumentation as safeBc } from './client';\nimport { instrumentFetch, instrumentConsole } from './auto-breadcrumbs';\nimport { applyArchitectureTags } from './architecture';\nimport { tryAutoInstrumentNavigation } from './navigation';\n\ndeclare const require: (id: string) => any;\n\ntype ErrorUtilsShape = {\n getGlobalHandler: () => (error: Error, isFatal?: boolean) => void;\n setGlobalHandler: (handler: (error: Error, isFatal?: boolean) => void) => void;\n};\n\nexport interface ReactNativeInstallOptions {\n /** Auto-capture unhandled JS exceptions via ErrorUtils. Default: true */\n autoErrorHandler?: boolean;\n /** Auto-capture unhandled promise rejections (Hermes). Default: true */\n autoPromiseRejections?: boolean;\n /** Auto-attach Platform.* info as tags. Default: true */\n autoDeviceTags?: boolean;\n /** Auto-emit breadcrumbs on AppState change. Default: true */\n autoAppStateBreadcrumbs?: boolean;\n /** Auto-instrument XHR (RN's fetch is XHR-based) for network breadcrumbs. Default: true */\n autoNetworkCapture?: boolean;\n /** Wrap `globalThis.fetch` to record HTTP breadcrumbs. Default: true */\n autoFetchBreadcrumbs?: boolean;\n /**\n * Wrap `console.*` methods to record log breadcrumbs. Default: true.\n * Per-method capture is controlled by `captureConsole` in AllStakConfig\n * (warn + error default on, log + info default off).\n */\n autoConsoleBreadcrumbs?: boolean;\n /**\n * Auto-detect `@react-navigation/native` and patch `NavigationContainer`\n * so route changes ship as breadcrumbs without the host app needing\n * to call `instrumentReactNavigation(ref)`. Default: true. When the\n * package is not installed, this silently no-ops.\n */\n autoNavigationBreadcrumbs?: boolean;\n /**\n * Emit a `[AllStak] Navigation auto-instrumentation enabled/not applied`\n * console log so developers can confirm the wiring at startup. The\n * provider sets this from its `debug` prop; defaults to false when\n * called manually.\n */\n debugLogs?: boolean;\n}\n\n/**\n * Patch the global `XMLHttpRequest` so any HTTP call (RN's `fetch` is\n * XHR-based) is captured as a network breadcrumb. Idempotent. Skips the\n * AllStak ingest host so we never recurse.\n */\nfunction instrumentXmlHttpRequest(): void {\n const flag = '__allstak_xhr_patched__';\n const X: any = (globalThis as any).XMLHttpRequest;\n if (!X || X.prototype[flag]) return;\n\n const ownHost = (() => {\n try {\n const cfg = AllStak.getConfig();\n return (cfg?.host ?? 'https://api.allstak.sa').replace(/\\/$/, '');\n } catch { return ''; }\n })();\n\n const origOpen = X.prototype.open;\n const origSend = X.prototype.send;\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 return origOpen.call(this, method, url, ...rest);\n };\n\n X.prototype.send = function (body?: unknown) {\n const start = Date.now();\n const method: string = (this as any).__allstak_method__ || 'GET';\n const url: string = (this as any).__allstak_url__ || '';\n const isOwnIngest = ownHost && url.startsWith(ownHost);\n let path = url;\n try { path = new URL(url).pathname; } catch { /* relative URL */ }\n\n const onDone = (status: number) => {\n const durationMs = Date.now() - start;\n try {\n AllStak.addBreadcrumb('http', `${method} ${path} -> ${status}`,\n status >= 400 ? 'error' : 'info',\n { method, url: path, statusCode: status, durationMs });\n } catch { /* never break */ }\n };\n\n if (!isOwnIngest) {\n this.addEventListener?.('load', () => onDone(this.status || 0));\n this.addEventListener?.('error', () => onDone(0));\n this.addEventListener?.('abort', () => onDone(0));\n this.addEventListener?.('timeout', () => onDone(0));\n }\n\n return origSend.call(this, body);\n };\n\n X.prototype[flag] = true;\n}\n\nexport function installReactNative(options: ReactNativeInstallOptions = {}): void {\n const autoError = options.autoErrorHandler !== false;\n const autoPromise = options.autoPromiseRejections !== false;\n const autoDevice = options.autoDeviceTags !== false;\n const autoAppState = options.autoAppStateBreadcrumbs !== false;\n const autoNetwork = options.autoNetworkCapture !== false;\n\n AllStak.setTag('platform', 'react-native');\n try { applyArchitectureTags((k, v) => AllStak.setTag(k, v)); } catch { /* ignore */ }\n\n try {\n const hermes = typeof (globalThis as { HermesInternal?: unknown }).HermesInternal !== 'undefined';\n let dist: string | undefined;\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const rn = require('react-native');\n const os = rn?.Platform?.OS as string | undefined;\n if (os === 'ios' || os === 'android') {\n dist = `${os}-${hermes ? 'hermes' : 'jsc'}`;\n }\n } catch { /* not running under RN */ }\n AllStak.setIdentity({\n sdkName: 'allstak-react-native',\n sdkVersion: SDK_VERSION,\n platform: 'react-native',\n dist,\n });\n } catch { /* never break init */ }\n\n if (autoNetwork) {\n try { instrumentXmlHttpRequest(); } catch { /* not in JS env */ }\n }\n\n if (options.autoFetchBreadcrumbs !== false) {\n try {\n const cfg = AllStak.getConfig();\n const ownBaseUrl = (cfg?.host ?? 'https://api.allstak.sa').replace(/\\/$/, '');\n instrumentFetch(safeBc, ownBaseUrl);\n } catch { /* never break init */ }\n }\n if (options.autoConsoleBreadcrumbs !== false) {\n try {\n const cfg = AllStak.getConfig();\n instrumentConsole(safeBc, cfg?.captureConsole);\n }\n catch { /* never break init */ }\n }\n\n if (options.autoNavigationBreadcrumbs !== false) {\n let navResult = false;\n try { navResult = tryAutoInstrumentNavigation(); }\n catch { /* @react-navigation/native not installed — silent fallback */ }\n if (options.debugLogs) {\n // eslint-disable-next-line no-console\n if (navResult) console.log('[AllStak] Navigation auto-instrumentation enabled');\n // eslint-disable-next-line no-console\n else console.log('[AllStak] Navigation auto-instrumentation not applied; use instrumentReactNavigation(ref) fallback');\n }\n }\n\n if (autoDevice) {\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const rn = require('react-native');\n const Platform: any = rn?.Platform;\n if (Platform) {\n AllStak.setTag('device.os', String(Platform.OS ?? ''));\n AllStak.setTag('device.osVersion', String(Platform.Version ?? ''));\n if (Platform.constants?.Model) {\n AllStak.setTag('device.model', String(Platform.constants.Model));\n }\n }\n } catch { /* not running under RN */ }\n }\n\n if (autoAppState) {\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const rn = require('react-native');\n const AppState: any = rn?.AppState;\n if (AppState && typeof AppState.addEventListener === 'function') {\n AppState.addEventListener('change', (next: string) => {\n try {\n AllStak.addBreadcrumb('navigation', `AppState → ${next}`, 'info', { appState: next });\n } catch { /* ignore */ }\n });\n }\n } catch { /* no RN available */ }\n }\n\n if (autoError) {\n const eu: ErrorUtilsShape | undefined = (globalThis as any).ErrorUtils;\n if (eu && typeof eu.setGlobalHandler === 'function') {\n const prev = eu.getGlobalHandler();\n eu.setGlobalHandler((error: Error, isFatal?: boolean) => {\n try {\n AllStak.captureException(error, {\n source: 'react-native-ErrorUtils',\n fatal: String(Boolean(isFatal)),\n });\n } catch { /* never break */ }\n try { prev(error, isFatal); } catch { /* ignore */ }\n });\n }\n }\n\n if (autoPromise) {\n const wrapTrackerReason = (rejection: unknown): Error =>\n rejection instanceof Error\n ? rejection\n : new Error(`Unhandled promise rejection: ${String(rejection)}`);\n\n const ship = (err: Error) => {\n try { AllStak.captureException(err, { source: 'unhandledRejection' }); }\n catch { /* ignore */ }\n };\n\n // 1. Hermes-native Promise rejection tracker — works for the Promise\n // rejections the typical RN/Hermes app generates. The\n // `promise/setimmediate/rejection-tracking` package only patches\n // the `promise` package's polyfill, NOT the Hermes-native Promise,\n // so we must hook this in addition to (or instead of) the polyfill\n // tracker for unhandled-rejection capture to work end-to-end.\n try {\n const hermesInternal: any = (globalThis as any).HermesInternal;\n if (hermesInternal && typeof hermesInternal.enablePromiseRejectionTracker === 'function') {\n hermesInternal.enablePromiseRejectionTracker({\n allRejections: true,\n onUnhandled: (_id: number, rejection: unknown) => ship(wrapTrackerReason(rejection)),\n onHandled: () => {},\n });\n }\n } catch { /* never break init */ }\n\n // 2. Polyfill-side tracker (works on JSC + on RN polyfilled Promise).\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const tracking = require('promise/setimmediate/rejection-tracking');\n tracking.enable({\n allRejections: true,\n onUnhandled: (_id: number, rejection: unknown) => ship(wrapTrackerReason(rejection)),\n onHandled: () => {},\n });\n } catch {\n // Last-resort browser-style listener — keep the original wrapping\n // (bare String(reason)) so existing test contracts still match.\n const g: any = globalThis as any;\n if (typeof g.addEventListener === 'function') {\n g.addEventListener('unhandledrejection', (ev: any) => {\n const reason = ev?.reason;\n const err = reason instanceof Error ? reason : new Error(String(reason));\n ship(err);\n });\n }\n }\n }\n}\n","/**\n * @allstak/react-native — standalone React Native SDK.\n *\n * Self-contained: depends only on `react-native` (peer) and the global\n * `fetch`/`AbortController` that RN guarantees. Contains no `window`,\n * `document`, `localStorage`, `sessionStorage`, or browser DOM event\n * listeners.\n *\n * Recommended usage (one-liner):\n *\n * import { AllStakProvider } from '@allstak/react-native';\n *\n * export default function App() {\n * return (\n * <AllStakProvider apiKey=\"YOUR_API_KEY\" environment=\"production\">\n * <AppRoot />\n * </AllStakProvider>\n * );\n * }\n *\n * Advanced / manual usage:\n *\n * import { AllStak, installReactNative } from '@allstak/react-native';\n * AllStak.init({ apiKey, environment, release });\n * installReactNative();\n *\n * Native crash capture (Java/Kotlin on Android, Obj-C/Swift on iOS) lives\n * under the `native/` directory in this package. See README.\n */\n\nimport { AllStak } from './client';\n\n// ── Primary API: AllStakProvider (recommended) ──────────────────\nexport { AllStakProvider, useAllStak, __resetProviderInstanceForTest } from './provider';\nexport type { AllStakProviderProps } from './provider';\n\n// ── Core client + manual setup ──────────────────────────────────\nexport { AllStak } from './client';\nexport type { AllStakConfig, Breadcrumb, ScreenshotArtifact, ScreenshotCaptureOptions } from './client';\nexport type { TransportStats } from './transport';\nexport { AllStakClient, INGEST_HOST, SDK_NAME, SDK_VERSION, Scope } from './client';\n\n// ── React Native integrations (used internally by AllStakProvider) ──\nexport { installReactNative } from './install';\nexport type { ReactNativeInstallOptions } from './install';\n\n// ── Navigation helpers ──────────────────────────────────────────\nexport {\n instrumentReactNavigation,\n instrumentNavigationFromLinking,\n tryAutoInstrumentNavigation,\n __resetAutoNavigationFlagForTest,\n} from './navigation';\n\n// ── Console capture types ───────────────────────────────────────\nexport type { ConsoleCaptureOptions } from './auto-breadcrumbs';\nexport { __resetConsoleInstrumentationFlagForTest } from './auto-breadcrumbs';\n\n// ── Advanced modules ────────────────────────────────────────────\nexport { ReplaySurrogate } from './replay-surrogate';\nexport type { ReplaySurrogateOptions } from './replay-surrogate';\nexport { detectArchitecture, applyArchitectureTags } from './architecture';\nexport type { ArchitectureInfo } from './architecture';\nexport type { HttpTrackingOptions } from './http-redact';\nexport {\n ALWAYS_REDACT_HEADERS,\n ALWAYS_REDACT_QUERY,\n DEFAULT_REDACT_BODY_FIELDS,\n REDACTED,\n redactUrl,\n sanitizeHeaders,\n captureBodyResult,\n} from './http-redact';\nexport { HttpRequestModule } from './http-requests';\nexport type { HttpRequestEvent } from './http-requests';\n\n// ── Native crash drain ──────────────────────────────────────────\n\ndeclare const require: (id: string) => any;\n\n/**\n * Test seam — set a fake native module to be returned by\n * `drainPendingNativeCrashes` instead of `require('react-native').NativeModules.AllStakNative`.\n * Pass `null` to clear. Production callers must NOT use this.\n *\n * @internal\n */\nlet __testNativeModule: any = null;\nexport function __setNativeModuleForTest(mod: any): void {\n __testNativeModule = mod;\n}\n\n/**\n * DEV-ONLY: deliberately trigger a native iOS or Android crash via the\n * linked AllStak native module. This is intended for verifying the\n * native-crash → drain → ingest pipeline during SDK development. It\n * **terminates the app process** — never expose this in production UI.\n *\n * import { __devTriggerNativeCrash } from '@allstak/react-native';\n * if (__DEV__) __devTriggerNativeCrash(); // app dies; relaunch drains\n *\n * No-op when the native module is not linked.\n */\nexport async function __devTriggerNativeCrash(): Promise<void> {\n try {\n let native: any = __testNativeModule;\n if (!native) {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const rn = require('react-native');\n native = rn?.NativeModules?.AllStakNative;\n }\n if (!native || typeof native.__devTriggerCrash !== 'function') return;\n await native.__devTriggerCrash();\n } catch {\n // Native module not present — silently no-op.\n }\n}\n\n/**\n * Drain any native crash stashed by AllStakCrashHandler on the previous\n * launch and ship it to /ingest/v1/errors. No-op when the native module\n * is not linked (Expo Go, JS-only test runners, etc).\n */\nexport async function drainPendingNativeCrashes(release?: string): Promise<void> {\n try {\n let native: any = __testNativeModule;\n if (!native) {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const rn = require('react-native');\n native = rn?.NativeModules?.AllStakNative;\n }\n if (!native) return;\n if (typeof native.install === 'function') {\n try { await native.install(release ?? ''); } catch { /* ignore */ }\n }\n if (typeof native.drainPendingCrash === 'function') {\n const json: string | null = await native.drainPendingCrash();\n if (json && json !== '') {\n try {\n const payload = JSON.parse(json);\n const err = new Error(payload?.message ?? 'Native crash');\n err.name = payload?.exceptionClass ?? 'NativeCrash';\n (err as any).stack = Array.isArray(payload?.stackTrace)\n ? payload.stackTrace.join('\\n')\n : String(payload?.stackTrace ?? '');\n AllStak.captureException(err, {\n ...(payload?.metadata || {}),\n 'native.crash': 'true',\n });\n } catch { /* swallow */ }\n }\n }\n } catch {\n // react-native not available in this runtime\n }\n}\n"],"mappings":"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","names":["FLUSH_INTERVAL_MS","FLUSH_INTERVAL_MS","BATCH_SIZE_THRESHOLD","next","id","FETCH_FLAG","isOwnIngest","React","isOwnIngest"]}