@allstak/react-native 0.1.3 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\n * @allstak/react-native — React Native public API.\n *\n * Re-exports the RN integration from @allstak/js/react-native:\n * - installReactNative({...}) — hooks ErrorUtils + Hermes rejection tracking\n * + Platform.OS tags\n *\n * Native-layer crash capture (Java/Kotlin on Android, Obj-C/Swift on iOS)\n * lives under the `native/` directory inside this package. See README.\n */\nexport { installReactNative, type ReactNativeInstallOptions, AllStak } from '@allstak/js/react-native';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAUA,0BAA4E;","names":[]}
1
+ {"version":3,"sources":["../src/index.ts","../src/transport.ts","../src/stack.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/auto-breadcrumbs.ts","../src/architecture.ts","../src/navigation.ts"],"sourcesContent":["/**\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 * Usage:\n *\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, __safeAddBreadcrumbForInstrumentation as safeBc } from './client';\nimport { instrumentFetch, instrumentConsole } from './auto-breadcrumbs';\nimport { applyArchitectureTags } from './architecture';\n\n// React Native runs CommonJS, so `require` is always present at runtime.\n// Declared here (instead of pulling @types/node) so consumers don't inherit\n// Node types they don't need.\ndeclare const require: (id: string) => any;\n\nexport { AllStak } from './client';\nexport type { AllStakConfig, Breadcrumb } from './client';\nexport { AllStakClient, INGEST_HOST, SDK_NAME, SDK_VERSION, Scope } from './client';\nexport { instrumentReactNavigation, instrumentNavigationFromLinking } from './navigation';\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 { HttpRequestModule } from './http-requests';\nexport type { HttpRequestEvent } from './http-requests';\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 /** Wrap `console.warn`/`console.error` to record log breadcrumbs. Default: true */\n autoConsoleBreadcrumbs?: 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\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 * 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\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 // Stamp SDK identity + auto-detected dist (ios-hermes / android-jsc / …).\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: '0.3.0',\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 { instrumentConsole(safeBc); }\n catch { /* never break init */ }\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 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) => {\n const err = rejection instanceof Error\n ? rejection\n : new Error(`Unhandled promise rejection: ${String(rejection)}`);\n try { AllStak.captureException(err, { source: 'unhandledRejection' }); }\n catch { /* ignore */ }\n },\n onHandled: () => {},\n });\n } catch {\n // Last-resort fallback: globalThis.addEventListener if present.\n // Note: we explicitly do NOT touch window/document — only globalThis.\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 try { AllStak.captureException(err, { source: 'unhandledRejection' }); }\n catch { /* ignore */ }\n });\n }\n }\n }\n}\n","/**\n * Minimal HTTP transport for React Native. Uses the global `fetch` (always\n * present in RN >= 0.60) with a 3s timeout. Failed sends fall into a small\n * in-memory ring buffer that we retry on the next successful flush.\n *\n * No window, no AbortController fallback shims — RN exposes both natively.\n */\n\nconst REQUEST_TIMEOUT = 3000;\nconst MAX_BUFFER = 100;\n\ninterface Pending {\n path: string;\n payload: unknown;\n}\n\nexport class HttpTransport {\n private buffer: Pending[] = [];\n private flushing = false;\n\n constructor(\n private baseUrl: string,\n private apiKey: string,\n ) {}\n\n async send(path: string, payload: unknown): Promise<void> {\n try {\n await this.doFetch(path, payload);\n await this.flushBuffer();\n } catch {\n if (this.buffer.length >= MAX_BUFFER) this.buffer.shift();\n this.buffer.push({ path, payload });\n }\n }\n\n private async doFetch(path: string, payload: unknown): Promise<void> {\n const url = `${this.baseUrl}${path}`;\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), REQUEST_TIMEOUT);\n try {\n const res = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-AllStak-Key': this.apiKey,\n },\n body: JSON.stringify(payload),\n signal: controller.signal,\n });\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n private async flushBuffer(): Promise<void> {\n if (this.flushing || this.buffer.length === 0) return;\n this.flushing = true;\n try {\n const items = this.buffer.splice(0, this.buffer.length);\n for (const item of items) {\n try { await this.doFetch(item.path, item.payload); }\n catch { /* drop on retry failure — buffer is best-effort */ }\n }\n } finally {\n this.flushing = false;\n }\n }\n\n getBufferSize(): number {\n return this.buffer.length;\n }\n\n /**\n * Wait for the in-flight retry-buffer to drain. Resolves `true` if the\n * buffer empties within `timeoutMs` (default 2000ms), `false` otherwise.\n * Useful 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","/**\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 * Per-call scoped context isolation.\n *\n * A `Scope` carries the same shape as the top-level config (user, tags,\n * extras, contexts, fingerprint, level) but only applies inside the\n * `withScope` callback that owns it. The client merges the active scope\n * stack on top of the base config when building each event payload, so:\n *\n * - context set inside `withScope` does NOT leak out\n * - nested scopes layer additively (later wins on key conflicts)\n * - throwing or async work in the callback still pops the scope\n *\n * Use this on the server (SSR / RSC / API route handlers) to attach\n * per-request user/tags without leaking that data into another request\n * being processed concurrently.\n */\n\nexport type Severity = 'fatal' | 'error' | 'warning' | 'info' | 'debug';\n\nexport class Scope {\n user?: { id?: string; email?: string };\n tags: Record<string, string> = {};\n extras: Record<string, unknown> = {};\n contexts: Record<string, Record<string, unknown>> = {};\n fingerprint?: string[];\n level?: Severity;\n\n setUser(user: { id?: string; email?: string }): this { this.user = user; return this; }\n setTag(key: string, value: string): this { this.tags[key] = value; return this; }\n setTags(tags: Record<string, string>): this { Object.assign(this.tags, tags); return this; }\n setExtra(key: string, value: unknown): this { this.extras[key] = value; return this; }\n setExtras(extras: Record<string, unknown>): this { Object.assign(this.extras, extras); return this; }\n setContext(name: string, ctx: Record<string, unknown> | null): this {\n if (ctx === null) delete this.contexts[name]; else this.contexts[name] = ctx;\n return this;\n }\n setLevel(level: Severity): this { this.level = level; return this; }\n setFingerprint(fingerprint: string[] | null): this {\n this.fingerprint = fingerprint && fingerprint.length > 0 ? fingerprint : undefined;\n return this;\n }\n clear(): this {\n this.user = undefined;\n this.tags = {};\n this.extras = {};\n this.contexts = {};\n this.fingerprint = undefined;\n this.level = undefined;\n return this;\n }\n}\n\n/**\n * Merge a base config with the active scope stack. Later scopes overwrite\n * earlier ones on key conflicts; tag/extra/context dictionaries are merged\n * key-by-key. Returns a NEW object — does not mutate inputs.\n */\nexport function mergeScopes<T extends {\n user?: { id?: string; email?: string };\n tags?: Record<string, string>;\n extras?: Record<string, unknown>;\n contexts?: Record<string, Record<string, unknown>>;\n fingerprint?: string[];\n level?: Severity;\n}>(base: T, stack: Scope[]): T {\n const out: T = { ...base };\n out.tags = { ...(base.tags ?? {}) };\n out.extras = { ...(base.extras ?? {}) };\n out.contexts = { ...(base.contexts ?? {}) };\n for (const scope of stack) {\n if (scope.user) out.user = scope.user;\n Object.assign(out.tags, scope.tags);\n Object.assign(out.extras, scope.extras);\n Object.assign(out.contexts, scope.contexts);\n if (scope.fingerprint) out.fingerprint = scope.fingerprint;\n if (scope.level) out.level = scope.level;\n }\n return out;\n}\n","/**\n * Lightweight distributed tracing primitives.\n *\n * A `Span` represents a unit of work — `startSpan('http.client', { description: 'GET /api/users' })`\n * returns a Span; call `span.finish()` when the work completes. Spans\n * batch into the transport's `/ingest/v1/spans` channel and ship every 5s\n * (or when 20 spans accumulate).\n *\n * Trace propagation: each span carries a `traceId` (UUID, generated lazily\n * on first call to `getTraceId()`) and a `spanId`. Nested calls to\n * `startSpan()` automatically inherit the active span as their parent.\n *\n * Sampling: `tracesSampleRate` (config) gates whether `startSpan` actually\n * records anything — drops when `Math.random() >= rate`. The returned\n * Span is a no-op shim in that case so call sites don't need to null-check.\n */\n\nimport type { HttpTransport } from './transport';\n\nconst SPAN_INGEST_PATH = '/ingest/v1/spans';\nconst FLUSH_INTERVAL_MS = 5_000;\nconst BATCH_SIZE_THRESHOLD = 20;\n\nexport interface SpanData {\n traceId: string;\n spanId: string;\n parentSpanId: string;\n operation: string;\n description: string;\n status: 'ok' | 'error' | 'timeout';\n durationMs: number;\n startTimeMillis: number;\n endTimeMillis: number;\n service: string;\n environment: string;\n tags: Record<string, string>;\n data: string;\n}\n\nfunction id(): string {\n // Same v4 shape used elsewhere in the SDK — RN doesn't ship\n // crypto.randomUUID reliably across versions.\n const hex = (n: number) => Math.floor(Math.random() * n).toString(16).padStart(1, '0');\n const seg = (len: number) => Array.from({ length: len }, () => hex(16)).join('');\n return `${seg(8)}-${seg(4)}-4${seg(3)}-${(8 + Math.floor(Math.random() * 4)).toString(16)}${seg(3)}-${seg(12)}`;\n}\n\nexport class Span {\n private _finished = false;\n private _startTimeMillis: number;\n private _data = '';\n\n constructor(\n private _traceId: string,\n private _spanId: string,\n private _parentSpanId: string,\n private _operation: string,\n private _description: string,\n private _service: string,\n private _environment: string,\n private _tags: Record<string, string>,\n private _onFinish: (data: SpanData) => void,\n ) {\n this._startTimeMillis = Date.now();\n }\n\n setTag(key: string, value: string): this { this._tags[key] = value; return this; }\n setData(data: string): this { this._data = data; return this; }\n setDescription(description: string): this { this._description = description; return this; }\n\n finish(status: 'ok' | 'error' | 'timeout' = 'ok'): void {\n if (this._finished) return;\n this._finished = true;\n const endTimeMillis = Date.now();\n this._onFinish({\n traceId: this._traceId,\n spanId: this._spanId,\n parentSpanId: this._parentSpanId,\n operation: this._operation,\n description: this._description,\n status,\n durationMs: endTimeMillis - this._startTimeMillis,\n startTimeMillis: this._startTimeMillis,\n endTimeMillis,\n service: this._service,\n environment: this._environment,\n tags: this._tags,\n data: this._data,\n });\n }\n\n get traceId(): string { return this._traceId; }\n get spanId(): string { return this._spanId; }\n get isFinished(): boolean { return this._finished; }\n}\n\n/** A no-op span returned when `tracesSampleRate` drops the trace. */\nclass NoopSpan extends Span {\n constructor(traceId: string, spanId: string) {\n super(traceId, spanId, '', '', '', '', '', {}, () => {});\n }\n finish(): void { /* never enqueues anything */ }\n}\n\ninterface TracingOptions {\n service: string;\n environment: string;\n /** 0..1 — probability to record a span. Default 1. */\n tracesSampleRate?: number;\n}\n\nexport class TracingModule {\n private spans: SpanData[] = [];\n private flushTimer: ReturnType<typeof setInterval> | null = null;\n private currentTraceId: string | null = null;\n private spanStack: Span[] = [];\n private destroyed = false;\n\n constructor(private transport: HttpTransport, private opts: TracingOptions) {\n // Lazy timer — only kick off when the first span finishes, so an app\n // that never traces doesn't pay an interval cost.\n }\n\n /** Get (and lazily create) the active trace ID. */\n getTraceId(): string {\n if (!this.currentTraceId) this.currentTraceId = id();\n return this.currentTraceId;\n }\n\n /** Override the active trace ID, e.g. from an inbound request header. */\n setTraceId(traceId: string): void { this.currentTraceId = traceId; }\n\n /** Get the active span's ID, or null if no span is active. */\n getCurrentSpanId(): string | null {\n return this.spanStack.length > 0 ? this.spanStack[this.spanStack.length - 1].spanId : null;\n }\n\n /** Reset both the trace ID and the in-flight span stack. */\n resetTrace(): void {\n this.currentTraceId = null;\n this.spanStack = [];\n }\n\n /**\n * Start a new span. The returned Span automatically inherits the active\n * span as its parent. If `tracesSampleRate` drops this trace, returns a\n * no-op Span so the call site doesn't have to null-check.\n */\n startSpan(operation: string, options: { description?: string; tags?: Record<string, string> } = {}): Span {\n const traceId = this.getTraceId();\n const spanId = id();\n const parentSpanId = this.getCurrentSpanId() ?? '';\n\n if (!this.passesSampleRate()) {\n // Sampled out — return a no-op so the public API shape is stable.\n return new NoopSpan(traceId, spanId);\n }\n\n const span = new Span(\n traceId, spanId, parentSpanId,\n operation, options.description ?? '',\n this.opts.service ?? '', this.opts.environment ?? '',\n { ...(options.tags ?? {}) },\n (data) => this.enqueue(data, span),\n );\n this.spanStack.push(span);\n return span;\n }\n\n private passesSampleRate(): boolean {\n const r = this.opts.tracesSampleRate;\n if (typeof r !== 'number' || r >= 1) return true;\n if (r <= 0) return false;\n return Math.random() < r;\n }\n\n private enqueue(data: SpanData, span: Span): void {\n if (this.destroyed) return;\n // Pop the finishing span from the stack (if it's the top — usually is,\n // but tolerate out-of-order finishes from misbehaving callers).\n const idx = this.spanStack.lastIndexOf(span);\n if (idx >= 0) this.spanStack.splice(idx, 1);\n\n this.spans.push(data);\n if (this.spans.length >= BATCH_SIZE_THRESHOLD) {\n this.flush();\n return;\n }\n if (!this.flushTimer) {\n this.flushTimer = setInterval(() => this.flush(), FLUSH_INTERVAL_MS);\n }\n }\n\n flush(): void {\n if (this.spans.length === 0) return;\n const batch = this.spans;\n this.spans = [];\n this.transport.send(SPAN_INGEST_PATH, { spans: batch });\n }\n\n destroy(): void {\n this.destroyed = true;\n if (this.flushTimer) { clearInterval(this.flushTimer); this.flushTimer = null; }\n this.flush();\n this.currentTraceId = null;\n this.spanStack = [];\n }\n}\n","/**\n * 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';\n data: Record<string, unknown>;\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 return true;\n }\n\n /** Record a screen view. Filters params through the safeParams allow-list. */\n recordScreenView(routeName: string, params?: Record<string, unknown>): 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 } });\n }\n\n /** Record an AppState transition (foreground/background/inactive). */\n recordAppState(next: string): void {\n if (!this.active) return;\n this.push({ ts: Date.now(), k: 'appstate', data: { state: next } });\n }\n\n /** Record a free-form, customer-validated checkpoint. */\n recordManual(label: string, data?: Record<string, unknown>): void {\n if (!this.active) return;\n this.push({ ts: Date.now(), k: 'manual', data: { label, ...(data ?? {}) } });\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","/**\n * HTTP request batching + transport for the React Native SDK.\n *\n * Mirrors the wire shape used by `@allstak/js`'s HttpRequestModule so the\n * existing backend ingest endpoint (`/ingest/v1/http-requests`) accepts\n * events from this SDK without a schema change. Adds optional rich fields\n * (headers, bodies, error string) — these ride alongside the existing\n * required fields and are tolerated as additive metadata server-side.\n *\n * Batching:\n * - flushes on a 5s timer OR when 20 events queue up\n * - flushes immediately on `destroy()`\n * - `getRecentFailed(n)` returns the last n failed requests (statusCode\n * >= 400 OR error set), used by error-linking on the next captureException\n */\n\nimport type { HttpTransport } from './transport';\n\nconst INGEST_PATH = '/ingest/v1/http-requests';\nconst FLUSH_INTERVAL_MS = 5_000;\nconst BATCH_SIZE_THRESHOLD = 20;\nconst RECENT_FAILED_BUFFER_SIZE = 10;\n\n/** What instrumentation hands to the module per request. */\nexport interface HttpRequestEvent {\n type: 'http_request';\n method: string;\n url: string; // already sanitized\n statusCode?: number;\n durationMs: number;\n requestSize?: number;\n responseSize?: number;\n requestBody?: string;\n responseBody?: string;\n requestHeaders?: Record<string, string>;\n responseHeaders?: Record<string, string>;\n error?: string;\n traceId?: string;\n}\n\nexport interface HttpRequestIngestItem {\n type: 'http_request';\n traceId: string;\n direction: 'outbound';\n method: string;\n // Backend wants host + path separately; we also keep the full sanitized\n // URL alongside in case the consumer wants it.\n host: string;\n path: string;\n url: string;\n statusCode: number;\n durationMs: number;\n requestSize?: number;\n responseSize?: number;\n requestBody?: string;\n responseBody?: string;\n requestHeaders?: Record<string, string>;\n responseHeaders?: Record<string, string>;\n error?: string;\n environment?: string;\n release?: string;\n dist?: string;\n platform?: string;\n 'sdk.name'?: string;\n 'sdk.version'?: string;\n timestamp: string;\n}\n\ninterface IngestPayload {\n requests: HttpRequestIngestItem[];\n}\n\ninterface ModuleDefaults {\n environment?: string;\n release?: string;\n dist?: string;\n platform?: string;\n sdkName?: string;\n sdkVersion?: string;\n}\n\nfunction genTraceId(): string {\n const hex = (n: number) => Math.floor(Math.random() * n).toString(16).padStart(1, '0');\n const seg = (len: number) => Array.from({ length: len }, () => hex(16)).join('');\n return `${seg(8)}-${seg(4)}-4${seg(3)}-${(8 + Math.floor(Math.random() * 4)).toString(16)}${seg(3)}-${seg(12)}`;\n}\n\nfunction splitHostPath(url: string): { host: string; path: string } {\n try {\n const u = new URL(url);\n return { host: u.host, path: u.pathname || '/' };\n } catch {\n // Relative URL — treat the whole thing as path.\n return { host: '', path: url.split('?')[0] };\n }\n}\n\nexport class HttpRequestModule {\n private queue: HttpRequestIngestItem[] = [];\n private recentFailed: HttpRequestIngestItem[] = [];\n private flushTimer: ReturnType<typeof setInterval> | null = null;\n private destroyed = false;\n private defaults: ModuleDefaults = {};\n\n constructor(private transport: HttpTransport) {}\n\n setDefaults(defaults: ModuleDefaults): void {\n this.defaults = { ...this.defaults, ...defaults };\n }\n\n capture(ev: HttpRequestEvent): void {\n if (this.destroyed) return;\n const { host, path } = splitHostPath(ev.url);\n const item: HttpRequestIngestItem = {\n type: 'http_request',\n traceId: ev.traceId ?? genTraceId(),\n direction: 'outbound',\n method: (ev.method || 'GET').toUpperCase(),\n host,\n path,\n url: ev.url,\n statusCode: ev.statusCode ?? 0,\n durationMs: Math.max(0, Math.floor(ev.durationMs)),\n requestSize: ev.requestSize,\n responseSize: ev.responseSize,\n requestBody: ev.requestBody,\n responseBody: ev.responseBody,\n requestHeaders: ev.requestHeaders,\n responseHeaders: ev.responseHeaders,\n error: ev.error,\n environment: this.defaults.environment,\n release: this.defaults.release,\n dist: this.defaults.dist,\n platform: this.defaults.platform,\n 'sdk.name': this.defaults.sdkName,\n 'sdk.version': this.defaults.sdkVersion,\n timestamp: new Date().toISOString(),\n };\n\n this.queue.push(item);\n const isFailed = (item.statusCode >= 400) || !!item.error;\n if (isFailed) {\n this.recentFailed.push(item);\n if (this.recentFailed.length > RECENT_FAILED_BUFFER_SIZE) this.recentFailed.shift();\n }\n\n if (this.queue.length >= BATCH_SIZE_THRESHOLD) { this.flush(); return; }\n if (!this.flushTimer) this.flushTimer = setInterval(() => this.flush(), FLUSH_INTERVAL_MS);\n }\n\n /** Snapshot of the last failed requests for error-linking. Newest last. */\n getRecentFailed(): ReadonlyArray<HttpRequestIngestItem> {\n return this.recentFailed;\n }\n\n flush(): void {\n if (this.queue.length === 0) return;\n const batch = this.queue;\n this.queue = [];\n const payload: IngestPayload = { requests: batch };\n this.transport.send(INGEST_PATH, payload);\n }\n\n destroy(): void {\n this.destroyed = true;\n if (this.flushTimer) { clearInterval(this.flushTimer); this.flushTimer = null; }\n this.flush();\n this.recentFailed = [];\n }\n\n /** @internal — for tests. */\n getQueueSize(): number { return this.queue.length; }\n}\n","/**\n * URL + header + body redaction utilities for HTTP instrumentation.\n *\n * Hard rules:\n * - Authorization, Cookie, X-API-Key, Set-Cookie are ALWAYS redacted\n * (host app cannot opt back into capturing them).\n * - Query params named `token`, `password`, `api_key`, `apikey`,\n * `authorization`, `auth`, `secret`, `access_token`, `refresh_token`,\n * `session` are ALWAYS redacted.\n * - Host app may add additional names via `redactHeaders` /\n * `redactQueryParams`; the always-list is the floor, not the ceiling.\n * - Bodies are truncated to `maxBodyBytes` (default 4096) and replaced\n * with `'<binary>'` when not safely-stringifiable.\n *\n * URL pattern matching for ignoredUrls / allowedUrls accepts strings\n * (substring match) or RegExp (test-based). String matching is\n * case-insensitive on the URL.\n */\n\nexport const ALWAYS_REDACT_HEADERS = new Set([\n 'authorization',\n 'cookie',\n 'set-cookie',\n 'x-api-key',\n 'x-auth-token',\n 'proxy-authorization',\n]);\n\nexport const ALWAYS_REDACT_QUERY = new Set([\n 'token',\n 'password',\n 'api_key',\n 'apikey',\n 'authorization',\n 'auth',\n 'secret',\n 'access_token',\n 'refresh_token',\n 'session',\n 'sessionid',\n 'jwt',\n]);\n\nexport const REDACTED = '[REDACTED]';\n\nexport interface HttpTrackingOptions {\n /** Capture request body. Default false. Truncated to maxBodyBytes. */\n captureRequestBody?: boolean;\n /** Capture response body. Default false. Truncated to maxBodyBytes. */\n captureResponseBody?: boolean;\n /**\n * Capture request + response headers. Default false. Hard-redacted\n * names are always stripped regardless of this flag.\n */\n captureHeaders?: boolean;\n /** Additional header names to redact (case-insensitive). */\n redactHeaders?: string[];\n /** Additional query-param names to redact (case-insensitive). */\n redactQueryParams?: string[];\n /**\n * Skip URLs matching any of these patterns. String = case-insensitive\n * substring match; RegExp = `.test()` against the full URL.\n */\n ignoredUrls?: (string | RegExp)[];\n /**\n * If non-empty, only capture URLs matching at least one of these\n * patterns. Takes precedence over ignoredUrls.\n */\n allowedUrls?: (string | RegExp)[];\n /** Max bytes per captured body. Default 4096. */\n maxBodyBytes?: number;\n}\n\nexport function shouldCaptureUrl(url: string, opts: HttpTrackingOptions): boolean {\n if (!url) return false;\n const lower = url.toLowerCase();\n if (opts.allowedUrls && opts.allowedUrls.length > 0) {\n return opts.allowedUrls.some((p) => matches(p, url, lower));\n }\n if (opts.ignoredUrls && opts.ignoredUrls.length > 0) {\n return !opts.ignoredUrls.some((p) => matches(p, url, lower));\n }\n return true;\n}\n\nfunction matches(pattern: string | RegExp, url: string, lower: string): boolean {\n if (pattern instanceof RegExp) return pattern.test(url);\n if (typeof pattern !== 'string') return false;\n return lower.includes(pattern.toLowerCase());\n}\n\n/**\n * Redact sensitive query-string params in a URL. Returns the sanitized\n * URL string. Falls back to the input when URL parsing fails (relative\n * URLs in test environments).\n */\nexport function redactUrl(url: string, opts: HttpTrackingOptions): string {\n if (!url) return url;\n const extra = (opts.redactQueryParams ?? []).map((s) => s.toLowerCase());\n const redactSet = new Set([...ALWAYS_REDACT_QUERY, ...extra]);\n\n // Try the URL parser first — handles full URLs cleanly.\n let parsed: URL | null = null;\n try { parsed = new URL(url); } catch { /* relative or malformed */ }\n\n if (parsed) {\n // Avoid `for…of` on URLSearchParams (the lib's Symbol.iterator typing\n // varies across DOM/dom-iterable lib targets). `forEach` is universal.\n const params = parsed.searchParams;\n let mutated = false;\n const keysToRedact: string[] = [];\n params.forEach((_v, k) => {\n if (redactSet.has(k.toLowerCase())) keysToRedact.push(k);\n });\n for (const k of keysToRedact) {\n params.set(k, REDACTED);\n mutated = true;\n }\n if (mutated) parsed.search = params.toString();\n return parsed.toString();\n }\n\n // Fallback: regex over the query portion of the URL.\n const qIdx = url.indexOf('?');\n if (qIdx < 0) return url;\n const head = url.slice(0, qIdx);\n const queryAndHash = url.slice(qIdx + 1);\n const hashIdx = queryAndHash.indexOf('#');\n const query = hashIdx < 0 ? queryAndHash : queryAndHash.slice(0, hashIdx);\n const hash = hashIdx < 0 ? '' : queryAndHash.slice(hashIdx);\n\n const parts = query.split('&').map((pair) => {\n const eq = pair.indexOf('=');\n if (eq < 0) return pair;\n const key = pair.slice(0, eq);\n return redactSet.has(key.toLowerCase()) ? `${key}=${REDACTED}` : pair;\n });\n return `${head}?${parts.join('&')}${hash ? '#' + hash : ''}`;\n}\n\n/**\n * Filter + redact an HTTP header dictionary. Returns a NEW object — does\n * not mutate the input. When `captureHeaders` is false returns undefined\n * (no headers in the wire payload at all).\n */\nexport function sanitizeHeaders(\n headers: Record<string, string | string[] | undefined> | undefined,\n opts: HttpTrackingOptions,\n): Record<string, string> | undefined {\n if (!opts.captureHeaders) return undefined;\n if (!headers) return {};\n const extra = (opts.redactHeaders ?? []).map((s) => s.toLowerCase());\n const redactSet = new Set([...ALWAYS_REDACT_HEADERS, ...extra]);\n const out: Record<string, string> = {};\n for (const [k, v] of Object.entries(headers)) {\n if (v == null) continue;\n const lower = k.toLowerCase();\n out[lower] = redactSet.has(lower)\n ? REDACTED\n : Array.isArray(v) ? v.join(', ') : String(v);\n }\n return out;\n}\n\n/**\n * Truncate + safely-stringify a body. Returns:\n * - undefined when capture is disabled\n * - the stringified body when it's a string / number / plain object\n * - '<binary>' when it's a Blob / FormData / ArrayBuffer / etc\n * - truncated string with `…[truncated]` suffix when over maxBodyBytes\n */\nexport function captureBody(\n body: unknown,\n enabled: boolean,\n maxBodyBytes: number,\n): string | undefined {\n if (!enabled) return undefined;\n if (body == null) return undefined;\n let str: string;\n if (typeof body === 'string') str = body;\n else if (typeof body === 'number' || typeof body === 'boolean') str = String(body);\n else if (typeof body === 'object') {\n // Don't try to stringify Blob, FormData, ArrayBuffer, ReadableStream.\n const tag = Object.prototype.toString.call(body);\n if (tag !== '[object Object]' && tag !== '[object Array]') return '<binary>';\n try { str = JSON.stringify(body); } catch { return '<unserializable>'; }\n } else {\n return '<binary>';\n }\n if (str.length > maxBodyBytes) return str.slice(0, maxBodyBytes) + '…[truncated]';\n return str;\n}\n","/**\n * Automatic HTTP instrumentation for React Native — patches `fetch`,\n * `XMLHttpRequest`, and (when found) `axios`.\n *\n * Idempotent: each patch tags itself with a flag so a second `init()` is\n * a no-op rather than stacking wrappers (which would otherwise double-fire\n * events and corrupt response handling on hot reload).\n *\n * Privacy + safety contract:\n * - URL query params are sanitized via `redactUrl` BEFORE being recorded\n * - Headers are not recorded unless `captureHeaders: true`\n * - Bodies are not recorded unless `captureRequestBody`/`captureResponseBody`\n * - Response body capture clones the Response (or skips when cloning is\n * unsafe — large/streaming responses) so the consumer's downstream\n * `.json()` / `.text()` still works without \"body already used\" errors\n * - Skips own ingest URLs (`api.allstak.sa/ingest/...`) so wrappers\n * never recurse on telemetry traffic\n * - On any internal failure, the original network call is allowed to\n * proceed — never break consumer networking\n */\n\nimport { HttpRequestModule, HttpRequestEvent } from './http-requests';\nimport {\n HttpTrackingOptions,\n redactUrl,\n sanitizeHeaders,\n shouldCaptureUrl,\n captureBody,\n} from './http-redact';\n\nconst FETCH_FLAG = '__allstak_http_fetch_patched__';\nconst XHR_FLAG = '__allstak_http_xhr_patched__';\nconst AXIOS_FLAG = Symbol.for('allstak.http.axios.instrumented');\n\nconst DEFAULT_MAX_BODY = 4096;\n\n// Module-level \"current binding\" — wrappers route capture calls through\n// this so re-init swaps the underlying module without re-wrapping the\n// global, and a destroyed module silently no-ops instead of throwing.\nlet _currentModule: HttpRequestModule | null = null;\nlet _currentOpts: BoundOptions | null = null;\nfunction currentModule(): HttpRequestModule | null { return _currentModule; }\nfunction currentOpts(): BoundOptions | null { return _currentOpts; }\nfunction safeCapture(ev: HttpRequestEvent): void {\n try { currentModule()?.capture(ev); } catch { /* never break host */ }\n}\n\ninterface BoundOptions extends Required<Omit<HttpTrackingOptions, 'redactHeaders' | 'redactQueryParams' | 'ignoredUrls' | 'allowedUrls'>> {\n redactHeaders: string[];\n redactQueryParams: string[];\n ignoredUrls: (string | RegExp)[];\n allowedUrls: (string | RegExp)[];\n ownIngestPrefix: string;\n}\n\nfunction bind(opts: HttpTrackingOptions, ownIngestHost: string): BoundOptions {\n return {\n captureRequestBody: opts.captureRequestBody ?? false,\n captureResponseBody: opts.captureResponseBody ?? false,\n captureHeaders: opts.captureHeaders ?? false,\n redactHeaders: opts.redactHeaders ?? [],\n redactQueryParams: opts.redactQueryParams ?? [],\n ignoredUrls: opts.ignoredUrls ?? [],\n allowedUrls: opts.allowedUrls ?? [],\n maxBodyBytes: opts.maxBodyBytes ?? DEFAULT_MAX_BODY,\n ownIngestPrefix: ownIngestHost.replace(/\\/$/, ''),\n };\n}\n\nfunction isOwnIngest(url: string, prefix: string): boolean {\n return !!prefix && url.startsWith(prefix);\n}\n\nfunction urlString(input: any): string {\n if (typeof input === 'string') return input;\n if (input && typeof input.href === 'string') return input.href;\n if (input && typeof input.url === 'string') return input.url;\n return String(input);\n}\n\nfunction safeByteLength(s: string | undefined | null): number | undefined {\n if (s == null) return undefined;\n if (typeof s === 'string') {\n // Approximate — UTF-8 byte length without TextEncoder dep.\n let n = 0;\n for (let i = 0; i < s.length; i++) {\n const c = s.charCodeAt(i);\n if (c < 0x80) n += 1;\n else if (c < 0x800) n += 2;\n else if (c >= 0xd800 && c <= 0xdbff) { n += 4; i += 1; }\n else n += 3;\n }\n return n;\n }\n return undefined;\n}\n\nfunction headersToObject(h: any): Record<string, string> {\n if (!h) return {};\n // Headers / Map style (entries())\n if (typeof h.entries === 'function') {\n const out: Record<string, string> = {};\n for (const [k, v] of h.entries()) out[String(k).toLowerCase()] = String(v);\n return out;\n }\n // Plain dict\n if (typeof h === 'object') {\n const out: Record<string, string> = {};\n for (const [k, v] of Object.entries(h)) {\n if (v == null) continue;\n out[String(k).toLowerCase()] = Array.isArray(v) ? v.join(', ') : String(v);\n }\n return out;\n }\n return {};\n}\n\n// ───────────────────────────────────────────────────────────────\n// fetch\n// ───────────────────────────────────────────────────────────────\n\nexport function patchFetch(): void {\n const g: any = globalThis as any;\n if (typeof g.fetch !== 'function') return;\n if (g.fetch[FETCH_FLAG]) return;\n\n const original = g.fetch;\n\n const wrapped = async function (this: any, input: any, init?: any): Promise<Response> {\n const opts = currentOpts();\n if (!opts || !currentModule()) {\n // Instrumentation not bound (yet, or re-init mid-flight) — pass through.\n return original.call(this, input, init);\n }\n const rawUrl = urlString(input);\n const sanitizedUrl = redactUrl(rawUrl, opts);\n const method = ((init?.method) || (input && typeof input === 'object' && input.method) || 'GET').toUpperCase();\n\n if (isOwnIngest(rawUrl, opts.ownIngestPrefix) || !shouldCaptureUrl(rawUrl, opts)) {\n return original.call(this, input, init);\n }\n\n const start = Date.now();\n const reqHeaders = sanitizeHeaders(headersToObject(init?.headers ?? (input && input.headers)), opts);\n const reqBody = captureBody(init?.body, opts.captureRequestBody, opts.maxBodyBytes);\n const reqSize = safeByteLength(typeof init?.body === 'string' ? init.body : undefined);\n\n let response: any;\n try {\n response = await original.call(this, input, init);\n } catch (err) {\n safeCapture({\n type: 'http_request',\n method, url: sanitizedUrl, statusCode: 0,\n durationMs: Date.now() - start,\n requestBody: reqBody, requestHeaders: reqHeaders, requestSize: reqSize,\n error: String((err as any)?.message ?? err),\n });\n throw err;\n }\n\n const durationMs = Date.now() - start;\n let respBody: string | undefined;\n let respSize: number | undefined;\n let respHeaders: Record<string, string> | undefined;\n try {\n respHeaders = sanitizeHeaders(headersToObject(response.headers), opts);\n const lenHeader = typeof response.headers?.get === 'function' ? response.headers.get('content-length') : null;\n if (lenHeader) respSize = parseInt(lenHeader, 10) || undefined;\n\n if (opts.captureResponseBody && typeof response.clone === 'function') {\n try {\n const cloned = response.clone();\n const text = await cloned.text();\n respBody = captureBody(text, true, opts.maxBodyBytes);\n if (respSize == null) respSize = safeByteLength(text);\n } catch { /* clone unsafe — leave body undefined */ }\n }\n } catch { /* never break the response surface */ }\n\n safeCapture({\n type: 'http_request',\n method, url: sanitizedUrl,\n statusCode: response.status, durationMs,\n requestBody: reqBody, requestHeaders: reqHeaders, requestSize: reqSize,\n responseBody: respBody, responseHeaders: respHeaders, responseSize: respSize,\n });\n\n return response;\n };\n (wrapped as any)[FETCH_FLAG] = true;\n g.fetch = wrapped;\n}\n\n// ───────────────────────────────────────────────────────────────\n// XMLHttpRequest\n// ───────────────────────────────────────────────────────────────\n\nexport function patchXhr(): void {\n const g: any = globalThis as any;\n const X: any = g.XMLHttpRequest;\n if (!X || X.prototype[XHR_FLAG]) return;\n\n const origOpen = X.prototype.open;\n const origSend = X.prototype.send;\n const origSetRequestHeader = X.prototype.setRequestHeader;\n\n X.prototype.open = function (method: string, url: string, ...rest: unknown[]) {\n (this as any).__allstak_method__ = method;\n (this as any).__allstak_url__ = url;\n (this as any).__allstak_headers__ = {};\n return origOpen.call(this, method, url, ...rest);\n };\n\n X.prototype.setRequestHeader = function (name: string, value: string) {\n try { (this as any).__allstak_headers__[String(name).toLowerCase()] = String(value); }\n catch { /* ignore */ }\n return origSetRequestHeader.call(this, name, value);\n };\n\n X.prototype.send = function (body?: unknown) {\n const opts = currentOpts();\n if (!opts || !currentModule()) return origSend.call(this, body as any);\n\n const start = Date.now();\n const method = String((this as any).__allstak_method__ || 'GET').toUpperCase();\n const rawUrl = String((this as any).__allstak_url__ || '');\n const sanitizedUrl = redactUrl(rawUrl, opts);\n\n if (isOwnIngest(rawUrl, opts.ownIngestPrefix) || !shouldCaptureUrl(rawUrl, opts)) {\n return origSend.call(this, body as any);\n }\n\n const reqHeaders = sanitizeHeaders((this as any).__allstak_headers__, opts);\n const reqBody = captureBody(body, opts.captureRequestBody, opts.maxBodyBytes);\n const reqSize = safeByteLength(typeof body === 'string' ? body : undefined);\n\n const finish = (statusCode: number, error?: string) => {\n const durationMs = Date.now() - start;\n let respHeaders: Record<string, string> | undefined;\n let respBody: string | undefined;\n let respSize: number | undefined;\n try {\n const liveOpts = currentOpts() ?? opts;\n if (liveOpts.captureHeaders && typeof (this as any).getAllResponseHeaders === 'function') {\n const raw: string = (this as any).getAllResponseHeaders() || '';\n const dict: Record<string, string> = {};\n for (const line of raw.split(/\\r?\\n/)) {\n const idx = line.indexOf(':');\n if (idx > 0) dict[line.slice(0, idx).trim().toLowerCase()] = line.slice(idx + 1).trim();\n }\n respHeaders = sanitizeHeaders(dict, liveOpts);\n }\n if (liveOpts.captureResponseBody) {\n const text = (this as any).responseText;\n if (typeof text === 'string') {\n respBody = captureBody(text, true, liveOpts.maxBodyBytes);\n respSize = safeByteLength(text);\n }\n }\n } catch { /* never break */ }\n\n safeCapture({\n type: 'http_request',\n method, url: sanitizedUrl,\n statusCode, durationMs,\n requestBody: reqBody, requestHeaders: reqHeaders, requestSize: reqSize,\n responseBody: respBody, responseHeaders: respHeaders, responseSize: respSize,\n error,\n });\n };\n\n this.addEventListener?.('load', () => finish(this.status || 0));\n this.addEventListener?.('error', () => finish(0, 'network'));\n this.addEventListener?.('abort', () => finish(0, 'abort'));\n this.addEventListener?.('timeout', () => finish(0, 'timeout'));\n return origSend.call(this, body as any);\n };\n\n X.prototype[XHR_FLAG] = true;\n}\n\n// ───────────────────────────────────────────────────────────────\n// axios — manual instrumentation + best-effort auto-detect\n// ───────────────────────────────────────────────────────────────\n\n/**\n * Manually instrument an axios instance. Idempotent — calling twice on\n * the same instance is a no-op. Returns the same instance so it can be\n * used inline:\n * `const api = AllStak.instrumentAxios(axios.create({...}))`\n *\n * NOTE: under React Native, axios uses XHR under the hood by default, so\n * the XHR patch above already records the same calls. This wrapper is\n * still useful when consumers configure axios with a custom `adapter`\n * that bypasses XHR (e.g. node-style http adapter on RN+Node setups).\n * Both patches are idempotent and de-dup via a per-request flag.\n */\nexport function instrumentAxiosInstance(\n axiosInstance: any,\n module: HttpRequestModule,\n opts: BoundOptions,\n): any {\n if (!axiosInstance || typeof axiosInstance.interceptors !== 'object') return axiosInstance;\n if (axiosInstance[AXIOS_FLAG]) return axiosInstance;\n axiosInstance[AXIOS_FLAG] = true;\n\n const reqStarts = new WeakMap<object, { start: number; method: string; rawUrl: string }>();\n\n axiosInstance.interceptors.request.use((config: any) => {\n try {\n const rawUrl = (config.baseURL ? config.baseURL.replace(/\\/$/, '') : '') + (config.url || '');\n reqStarts.set(config, {\n start: Date.now(),\n method: String(config.method || 'GET').toUpperCase(),\n rawUrl,\n });\n } catch { /* ignore */ }\n return config;\n });\n\n const finalize = (cfg: any, statusCode: number, response?: any, error?: string) => {\n const meta = reqStarts.get(cfg);\n if (!meta) return;\n reqStarts.delete(cfg);\n if (isOwnIngest(meta.rawUrl, opts.ownIngestPrefix)) return;\n if (!shouldCaptureUrl(meta.rawUrl, opts)) return;\n\n const sanitizedUrl = redactUrl(meta.rawUrl, opts);\n const reqHeaders = sanitizeHeaders(headersToObject(cfg.headers), opts);\n const reqBody = captureBody(cfg.data, opts.captureRequestBody, opts.maxBodyBytes);\n const respHeaders = sanitizeHeaders(headersToObject(response?.headers), opts);\n const respBody = captureBody(response?.data, opts.captureResponseBody, opts.maxBodyBytes);\n\n try {\n module.capture({\n type: 'http_request',\n method: meta.method,\n url: sanitizedUrl,\n statusCode,\n durationMs: Date.now() - meta.start,\n requestBody: reqBody,\n requestHeaders: reqHeaders,\n responseBody: respBody,\n responseHeaders: respHeaders,\n error,\n });\n } catch { /* ignore */ }\n };\n\n axiosInstance.interceptors.response.use(\n (response: any) => { finalize(response.config, response.status); return response; },\n (err: any) => {\n const cfg = err?.config;\n const status = err?.response?.status ?? 0;\n finalize(cfg, status, err?.response, String(err?.message ?? err));\n throw err;\n },\n );\n return axiosInstance;\n}\n\n/**\n * Best-effort auto-detect: attempt to require('axios') and instrument the\n * default singleton. Silently no-ops when axios isn't installed (the\n * common case — most apps either don't use axios or import it via ES\n * modules and would call instrumentAxios manually).\n */\nexport function tryAutoInstrumentAxios(module: HttpRequestModule, opts: BoundOptions): void {\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const axios = (globalThis as any).require?.('axios') ?? null;\n if (axios) instrumentAxiosInstance(axios.default ?? axios, module, opts);\n } catch { /* axios not installed */ }\n}\n\n// ───────────────────────────────────────────────────────────────\n// Top-level orchestrator\n// ───────────────────────────────────────────────────────────────\n\nexport function installHttpInstrumentation(\n module: HttpRequestModule,\n options: HttpTrackingOptions,\n ownIngestHost: string,\n): { instrumentAxios: (axios: any) => any } {\n const bound = bind(options, ownIngestHost);\n // Bind first so already-installed wrappers immediately route to the new\n // module/options. Subsequent patch* calls are idempotent no-ops.\n _currentModule = module;\n _currentOpts = bound;\n try { patchFetch(); } catch { /* ignore */ }\n try { patchXhr(); } catch { /* ignore */ }\n try { tryAutoInstrumentAxios(module, bound); } catch { /* ignore */ }\n return {\n instrumentAxios: (axios: any) => instrumentAxiosInstance(axios, module, bound),\n };\n}\n\n/** Called by AllStakClient.destroy() so wrappers go quiet between inits. */\nexport function unbindHttpInstrumentation(): void {\n _currentModule = null;\n _currentOpts = null;\n}\n\n/** @internal — for tests. */\nexport function __resetForTest(): void {\n const g: any = globalThis as any;\n if (g.fetch && g.fetch[FETCH_FLAG]) {\n // No way to recover original without saving — tests use freshly-set fetch.\n }\n if (g.XMLHttpRequest && g.XMLHttpRequest.prototype[XHR_FLAG]) {\n delete g.XMLHttpRequest.prototype[XHR_FLAG];\n }\n}\n","/**\n * 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 } from './transport';\nimport { parseStack } from './stack';\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 } from './http-instrumentation';\n\nexport const INGEST_HOST = 'https://api.allstak.sa';\nexport const SDK_NAME = 'allstak-react-native';\nexport const SDK_VERSION = '0.3.0';\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 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 /** 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 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}\n\nexport interface ErrorIngestPayload {\n exceptionClass: string;\n message: string;\n stackTrace?: string[];\n frames?: PayloadFrame[];\n platform?: string;\n sdkName?: string;\n sdkVersion?: string;\n dist?: string;\n level: string;\n environment?: string;\n release?: string;\n sessionId?: string;\n user?: { id?: string; email?: string };\n metadata?: Record<string, unknown>;\n breadcrumbs?: Breadcrumb[];\n fingerprint?: string[];\n}\n\nfunction frameToString(f: PayloadFrame): string {\n const fn = f.function && f.function.length > 0 ? f.function : '<anonymous>';\n const file = f.filename || f.absPath || '<anonymous>';\n return ` at ${fn} (${file}:${f.lineno ?? 0}:${f.colno ?? 0})`;\n}\n\nfunction generateId(): string {\n // 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\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 if (!config.apiKey) {\n throw new Error('AllStak: config.apiKey is required');\n }\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);\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 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 }));\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 traceId = this.tracing.getTraceId();\n if (traceId) traceContext.traceId = traceId;\n const spanId = this.tracing.getCurrentSpanId();\n if (spanId) traceContext.spanId = spanId;\n const recentFailed = this.httpRequests?.getRecentFailed() ?? [];\n if (recentFailed.length > 0) {\n traceContext['http.recentFailed'] = recentFailed.map((r) => ({\n method: r.method, url: r.url, statusCode: r.statusCode,\n durationMs: r.durationMs, error: r.error,\n }));\n }\n\n const payload: ErrorIngestPayload = {\n exceptionClass,\n message: error.message,\n stackTrace,\n frames: frames.length > 0 ? frames : undefined,\n platform: this.config.platform,\n sdkName: this.config.sdkName,\n sdkVersion: this.config.sdkVersion,\n dist: this.config.dist,\n level: eff.level ?? 'error',\n environment: this.config.environment,\n release: this.config.release,\n sessionId: this.sessionId,\n user: eff.user,\n metadata: { ...this.buildMetadata(context), ...traceContext },\n breadcrumbs: currentBreadcrumbs,\n fingerprint: eff.fingerprint,\n };\n\n this.sendThroughBeforeSend(payload);\n }\n\n /** Start a new span. Auto-parented to any currently-active span. */\n startSpan(operation: string, options?: { description?: string; tags?: Record<string, string> }): Span {\n return this.tracing.startSpan(operation, options);\n }\n /** Get (and lazily create) the active trace ID. */\n getTraceId(): string { return this.tracing.getTraceId(); }\n /** Override the active trace ID, e.g. from an inbound request header. */\n setTraceId(traceId: string): void { this.tracing.setTraceId(traceId); }\n /** ID of the currently-active span, or null. */\n getCurrentSpanId(): string | null { return this.tracing.getCurrentSpanId(); }\n /** Reset the trace ID and the active span stack. */\n resetTrace(): void { this.tracing.resetTrace(); }\n\n captureMessage(\n message: string,\n level: 'fatal' | 'error' | 'warning' | 'info' = 'info',\n options: { as?: 'log' | 'error' | 'both' } = {},\n ): void {\n const as = options.as ?? (level === 'fatal' || level === 'error' ? 'both' : 'log');\n if (as === 'log' || as === 'both') {\n this.sendLog(level === 'warning' ? 'warn' : level, message);\n }\n if (as === 'error' || as === 'both') {\n if (!this.passesSampleRate()) return;\n const eff = this.effective();\n const payload: ErrorIngestPayload = {\n exceptionClass: 'Message',\n message,\n platform: this.config.platform,\n sdkName: this.config.sdkName,\n sdkVersion: this.config.sdkVersion,\n dist: this.config.dist,\n level,\n environment: this.config.environment,\n release: this.config.release,\n sessionId: this.sessionId,\n user: eff.user,\n metadata: this.buildMetadata(),\n 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 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 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 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 ensureInit(): AllStakClient {\n if (!instance) throw new Error('AllStak.init() must be called before using the SDK');\n return instance;\n}\n\n/**\n * Module-level breadcrumb forwarder used by 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 if (instance) instance.destroy();\n instance = new AllStakClient(config);\n return instance;\n },\n captureException(error: Error, context?: Record<string, unknown>): void {\n ensureInit().captureException(error, context);\n },\n captureMessage(\n message: string,\n level: 'fatal' | 'error' | 'warning' | 'info' = 'info',\n options?: { as?: 'log' | 'error' | 'both' },\n ): void {\n ensureInit().captureMessage(message, level, options);\n },\n addBreadcrumb(type: string, message: string, level?: string, data?: Record<string, unknown>): void {\n ensureInit().addBreadcrumb(type, message, level, data);\n },\n clearBreadcrumbs(): void { ensureInit().clearBreadcrumbs(); },\n setUser(user: { id?: string; email?: string }): void { ensureInit().setUser(user); },\n setTag(key: string, value: string): void { ensureInit().setTag(key, value); },\n setTags(tags: Record<string, string>): void { ensureInit().setTags(tags); },\n setExtra(key: string, value: unknown): void { ensureInit().setExtra(key, value); },\n setExtras(extras: Record<string, unknown>): void { ensureInit().setExtras(extras); },\n setContext(name: string, ctx: Record<string, unknown> | null): void { ensureInit().setContext(name, ctx); },\n setLevel(level: 'fatal' | 'error' | 'warning' | 'info' | 'debug'): void { ensureInit().setLevel(level); },\n setFingerprint(fingerprint: string[] | null): void { ensureInit().setFingerprint(fingerprint); },\n flush(timeoutMs?: number): Promise<boolean> { return ensureInit().flush(timeoutMs); },\n setIdentity(identity: { sdkName?: string; sdkVersion?: string; platform?: string; dist?: string }): void {\n ensureInit().setIdentity(identity);\n },\n /**\n * Run `callback` with a fresh 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 { return ensureInit().withScope(callback); },\n startSpan(operation: string, options?: { description?: string; tags?: Record<string, string> }): Span {\n return ensureInit().startSpan(operation, options);\n },\n getTraceId(): string { return ensureInit().getTraceId(); },\n setTraceId(traceId: string): void { ensureInit().setTraceId(traceId); },\n getCurrentSpanId(): string | null { return ensureInit().getCurrentSpanId(); },\n resetTrace(): void { ensureInit().resetTrace(); },\n /** Access the privacy-first replay surrogate (or null if disabled / sampled out). */\n getReplay(): ReplaySurrogate | null { return ensureInit().getReplay(); },\n /** Manually instrument an axios instance. No-op when HTTP tracking is off. */\n instrumentAxios<T = any>(axios: T): T { return ensureInit().instrumentAxios(axios); },\n getSessionId(): string { return ensureInit().getSessionId(); },\n getConfig(): AllStakConfig | null { return instance?.getConfig() ?? null; },\n destroy(): void { instance?.destroy(); instance = null; },\n /** @internal — exposed for testing */\n _getInstance(): AllStakClient | null { return instance; },\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\nexport function instrumentConsole(addBreadcrumb: AddBreadcrumbFn): void {\n if (typeof console === 'undefined') return;\n if ((console as any)[CONSOLE_FLAG]) return;\n\n const origWarn = console.warn;\n const origError = console.error;\n\n console.warn = function (...args: unknown[]) {\n try { addBreadcrumb('log', args.map(safeString).join(' '), 'warn'); }\n catch { /* never break host */ }\n return origWarn.apply(console, args);\n };\n console.error = function (...args: unknown[]) {\n try { addBreadcrumb('log', args.map(safeString).join(' '), 'error'); }\n catch { /* never break host */ }\n return origError.apply(console, args);\n };\n (console as any)[CONSOLE_FLAG] = true;\n}\n\nfunction safeString(v: unknown): string {\n if (v == null) return String(v);\n if (typeof v === 'string') return v;\n if (v instanceof Error) return `${v.name}: ${v.message}`;\n try { return typeof v === 'object' ? JSON.stringify(v) : String(v); }\n catch { return Object.prototype.toString.call(v); }\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__';\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"],"mappings":"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","names":["FLUSH_INTERVAL_MS","FLUSH_INTERVAL_MS","BATCH_SIZE_THRESHOLD","module","FETCH_FLAG","isOwnIngest","isOwnIngest"]}