@smarthivelabs-devs/observe-expo 26.0.0 → 26.1.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/README.md CHANGED
@@ -1,6 +1,26 @@
1
1
  # @smarthivelabs-devs/observe-expo
2
2
 
3
- SmartObserve SDK for Expo and React Native. Transport failures never throw into application code. Events buffer offline and flush when the network returns.
3
+ Crashes, sessions, and traces for Expo and React Native. Failed ingest never throws. Events persist offline and flush when the network returns.
4
+
5
+ Use a **public** DSN (`pk_`) from SmartObserve project settings.
6
+
7
+ ```text
8
+ https://<pk_public_key>@observe.smarthivelabs.dev/<project-slug>
9
+ ```
10
+
11
+ Native traffic uses origin `smartobserve-expo://native` — you do not add that in project settings. If the same app also runs in a browser, allow that HTTPS origin separately (or use `@smarthivelabs-devs/observe-web` on web).
12
+
13
+ ## Install
14
+
15
+ ```bash
16
+ pnpm add @smarthivelabs-devs/observe-expo
17
+ ```
18
+
19
+ Device, offline queue, and network helpers ship with the package. The app already has `expo`, `react`, and `react-native`.
20
+
21
+ ## Start
22
+
23
+ Call `init` once at the root of the app.
4
24
 
5
25
  ```ts
6
26
  import { SmartObserve } from "@smarthivelabs-devs/observe-expo";
@@ -8,15 +28,49 @@ import { SmartObserve } from "@smarthivelabs-devs/observe-expo";
8
28
  SmartObserve.init({ dsn: process.env.EXPO_PUBLIC_SMARTOBSERVE_DSN });
9
29
  ```
10
30
 
11
- DSN format (public key):
31
+ Release and dist default to the native app version and build number. The global JS handler, AppState lifecycle, a session (`active` / `exited` / `crashed`), device/app context, and `fetch` are wired automatically.
12
32
 
13
- ```text
14
- https://<pk_public_key>@observe.smarthivelabs.dev/<project-slug>
33
+ ## What you send
34
+
35
+ ```ts
36
+ SmartObserve.captureException(err);
37
+ SmartObserve.captureMessage("paywall shown", "info");
38
+ SmartObserve.log.warn("slow sync", { table: "orders" });
39
+
40
+ SmartObserve.setUser({ id: user.id });
41
+ SmartObserve.setTag("workspace", workspace.slug);
42
+ SmartObserve.trackScreen("Checkout", { step: "pay" });
43
+
44
+ await SmartObserve.startSpan({ name: "sync", operation: "db" }, async (span) => {
45
+ span.setAttribute("rows", count);
46
+ return sync();
47
+ });
15
48
  ```
16
49
 
17
- Native ingestion sends origin `smartobserve-expo://native`. You do not add that origin in project settings. If the app also loads in a web browser, add that HTTPS origin separately.
50
+ `trackScreen` is a navigation breadcrumb. `beforeSend` can drop or edit events. Tokens and passwords are redacted; add keys with `redactKeys`. Email / IP stay off the user unless `sendDefaultPii: true`.
18
51
 
19
- ### Expo config plugin
52
+ Disable automations with `trackNetwork: false` or `trackLifecycle: false`. Outgoing `fetch` never gets `traceparent` unless you allow hosts you own:
53
+
54
+ ```ts
55
+ SmartObserve.init({
56
+ dsn: process.env.EXPO_PUBLIC_SMARTOBSERVE_DSN,
57
+ allowTracePropagationTargets: ["https://api.yourapp.com", /^https:\/\/.*\.yourapp\.com$/],
58
+ });
59
+ ```
60
+
61
+ ## React Native UI
62
+
63
+ ```tsx
64
+ import { SmartObserveErrorBoundary } from "@smarthivelabs-devs/observe-expo/react";
65
+
66
+ <SmartObserveErrorBoundary fallback={<Text>Something broke.</Text>}>
67
+ <App />
68
+ </SmartObserveErrorBoundary>
69
+ ```
70
+
71
+ ## Config plugin
72
+
73
+ Writes DSN into `extra` and can upload source maps during the iOS prebuild step.
20
74
 
21
75
  ```json
22
76
  {
@@ -26,27 +80,25 @@ Native ingestion sends origin `smartobserve-expo://native`. You do not add that
26
80
  }
27
81
  ```
28
82
 
29
- Or with options:
30
-
31
83
  ```js
32
84
  ["@smarthivelabs-devs/observe-expo", { dsn: process.env.EXPO_PUBLIC_SMARTOBSERVE_DSN }]
33
85
  ```
34
86
 
35
- Source-map upload uses `SMARTOBSERVE_AUTH_TOKEN` from project settings (`SMARTOBSERVE_RELEASE_TOKEN` is also accepted).
36
-
37
- The package includes persistent offline buffering, lifecycle/session capture, device context, navigation breadcrumbs, `fetch` network tracking (breadcrumbs, `http.client.duration` performance events, and `traceparent` propagation — disable with `trackNetwork: false`), a React error boundary, and an Expo config plugin.
87
+ In CI set `SMARTOBSERVE_AUTH_TOKEN` to a **release token** from project settings (`SMARTOBSERVE_RELEASE_TOKEN` also works). Fail the build without a token with `{ "requireUpload": true }` in plugin options.
38
88
 
39
- Peer packages (install in the app): `expo`, `react`, `react-native`, `expo-application`, `expo-constants`, `expo-device`, `@react-native-async-storage/async-storage`, `@react-native-community/netinfo`.
89
+ ## Options
40
90
 
41
- ### `allowTracePropagationTargets`
91
+ | Option | Default | Notes |
92
+ | --- | --- | --- |
93
+ | `dsn` | — | Public key DSN |
94
+ | `environment` | `production` | Shown on issues |
95
+ | `release` / `dist` | native version / build | Override for EAS |
96
+ | `enabled` | `true` if DSN is set | Set `false` in tests |
97
+ | `errorSampleRate` | `1` | `0`–`1` |
98
+ | `tracesSampleRate` | `0.1` | Root transactions |
99
+ | `sendDefaultPii` | `false` | Include email / IP |
100
+ | `debug` | `false` | Logs transport failures |
42
101
 
43
- By default, outgoing `fetch` requests never receive a `traceparent` header — this option is an **allow-list**, not a deny-list. Only add hosts you control:
44
-
45
- ```ts
46
- SmartObserve.init({
47
- dsn: process.env.EXPO_PUBLIC_SMARTOBSERVE_DSN,
48
- allowTracePropagationTargets: ["https://api.yourapp.com", /^https:\/\/.*\.yourapp\.com$/],
49
- });
50
- ```
102
+ ## API
51
103
 
52
- This directory is an autonomous package root. Run `pnpm install`, `pnpm contract:verify`, `pnpm test`, and `pnpm build` here. First publish is `26.0.0`.
104
+ `SmartObserve.init` · `captureException` · `captureMessage` · `log` · `setUser` · `setTag` · `setContext` · `addBreadcrumb` · `trackScreen` · `startSpan` · `beforeSend` · `flush` · `close` · `SmartObserveExpoClient`
@@ -52,7 +52,7 @@ import NetInfo from "@react-native-community/netinfo";
52
52
 
53
53
  // src/sdk-meta.ts
54
54
  var SDK_NAME = "@smarthivelabs-devs/observe-expo";
55
- var SDK_VERSION = "26.0.0";
55
+ var SDK_VERSION = "26.1.0";
56
56
 
57
57
  // src/transport.ts
58
58
  var STORAGE_KEY = "@smartobserve/events/v1";
@@ -359,4 +359,4 @@ export {
359
359
  SmartObserveExpoClient,
360
360
  SmartObserve
361
361
  };
362
- //# sourceMappingURL=chunk-HNIEV66S.js.map
362
+ //# sourceMappingURL=chunk-HDKJGFST.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/client.ts","../src/internal.ts","../src/transport.ts","../src/sdk-meta.ts","../src/index.ts"],"sourcesContent":["import { AppState, Platform } from \"react-native\";\nimport * as Application from \"expo-application\";\nimport Constants from \"expo-constants\";\nimport * as Device from \"expo-device\";\nimport { id, parseDsn, randomHex, safeUrl, sanitize } from \"./internal.js\";\nimport { ExpoTransport } from \"./transport.js\";\nimport type { BeforeSend, Breadcrumb, Level, ObserveEvent, ObserveSpan, ObserveUser, SmartObserveConfig, SpanOptions, TraceContext } from \"./types.js\";\n\ndeclare const ErrorUtils: { getGlobalHandler(): (error: Error, fatal?: boolean) => void; setGlobalHandler(handler: (error: Error, fatal?: boolean) => void): void } | undefined;\n\nexport class SmartObserveExpoClient {\n private config: SmartObserveConfig & { environment: string; enabled: boolean; debug: boolean; tracesSampleRate: number; errorSampleRate: number; maxBreadcrumbs: number }; private transport?: ExpoTransport; private user?: ObserveUser; private tags: Record<string, string> = {}; private contexts: Record<string, unknown> = {}; private breadcrumbs: Breadcrumb[] = []; private trace?: TraceContext; private beforeSendHook?: BeforeSend; private cleanups: Array<() => void> = []; private sessionId = id(); private sessionStarted = Date.now();\n constructor(input: SmartObserveConfig = {}) { this.config = { ...input, environment: input.environment ?? \"production\", enabled: input.enabled ?? Boolean(input.dsn), debug: input.debug ?? false, tracesSampleRate: input.tracesSampleRate ?? input.sampleRate ?? 0.1, errorSampleRate: input.errorSampleRate ?? 1, maxBreadcrumbs: input.maxBreadcrumbs ?? 100 }; this.beforeSendHook = input.beforeSend; if (this.config.enabled && input.dsn) { const parsed = parseDsn(input.dsn); this.transport = new ExpoTransport({ ...parsed, environment: this.config.environment, release: input.release ?? Application.nativeApplicationVersion ?? undefined, dist: input.dist ?? Application.nativeBuildVersion ?? undefined, maxQueueSize: input.maxQueueSize ?? 1_000, flushIntervalMs: input.flushIntervalMs ?? 5_000, debug: this.config.debug }); this.setup(parsed.endpoint); } }\n captureException(error: unknown, hint: Record<string, unknown> = {}) { const eventId = id(); if (Math.random() <= this.config.errorSampleRate) { const exception = serialize(error); void this.capture({ ...this.base(\"error\"), eventId, message: exception.value, level: \"error\", exceptions: [exception], metadata: hint }); } return eventId; }\n captureMessage(message: string, level: Level = \"info\", metadata?: Record<string, unknown>) { const eventId = id(); void this.capture({ ...this.base(\"log\"), eventId, message, level, metadata }); return eventId; }\n log = { debug: (m: string, d?: Record<string, unknown>) => this.captureMessage(m, \"debug\", d), info: (m: string, d?: Record<string, unknown>) => this.captureMessage(m, \"info\", d), warn: (m: string, d?: Record<string, unknown>) => this.captureMessage(m, \"warn\", d), error: (m: string, d?: Record<string, unknown>) => this.captureMessage(m, \"error\", d) };\n addBreadcrumb(value: Breadcrumb) { this.breadcrumbs.push({ ...sanitize(value, this.config.redactKeys), timestamp: value.timestamp ?? Date.now() }); this.breadcrumbs.splice(0, Math.max(0, this.breadcrumbs.length - this.config.maxBreadcrumbs)); }\n setUser(value: ObserveUser | null) { this.user = value ? sanitize(value, this.config.redactKeys) : undefined; }\n setTag(key: string, value: string | null) { if (value === null) delete this.tags[key]; else this.tags[key.slice(0, 64)] = value.slice(0, 256); }\n setContext(key: string, value: Record<string, unknown> | null) { if (value === null) delete this.contexts[key]; else this.contexts[key] = sanitize(value, this.config.redactKeys); }\n beforeSend(callback: BeforeSend) { this.beforeSendHook = callback; }\n startSpan<T>(options: SpanOptions, callback: (span: ObserveSpan) => T | Promise<T>): T | Promise<T> { const previous = this.trace; const trace: TraceContext = { traceId: options.parent?.traceId ?? previous?.traceId ?? randomHex(16), spanId: randomHex(8), parentSpanId: options.parent?.spanId ?? previous?.spanId, sampled: options.sampled ?? previous?.sampled ?? Math.random() < this.config.tracesSampleRate }; const start = Date.now(); const attributes = { ...(options.attributes ?? {}) }; let status: \"ok\" | \"error\" | \"cancelled\" | \"unknown\" = \"unknown\"; let ended = false; const span: ObserveSpan = { traceId: trace.traceId, spanId: trace.spanId, setAttribute: (key, value) => { attributes[key] = value; }, setStatus: (value) => { status = value; }, recordException: (error) => { status = \"error\"; this.captureException(error); }, end: () => { if (!ended && trace.sampled) { ended = true; const isRoot = !trace.parentSpanId; void this.capture({ ...this.base(isRoot ? \"transaction\" : \"span\"), name: options.name, operation: options.operation, startTimestamp: start, endTimestamp: Date.now(), status, ...(isRoot ? {} : { attributes }), trace }); } } }; this.trace = trace; try { const result = callback(span); if (result && typeof (result as Promise<T>).then === \"function\") return (result as Promise<T>).then((value) => { if (status === \"unknown\") status = \"ok\"; span.end(); return value; }, (error) => { span.recordException(error); span.end(); throw error; }).finally(() => { this.trace = previous; }); if (status === \"unknown\") status = \"ok\"; span.end(); return result; } finally { if (this.trace?.spanId === trace.spanId) this.trace = previous; } }\n flush() { return this.transport?.flush() ?? Promise.resolve(); } async close() { for (const cleanup of this.cleanups.splice(0)) cleanup(); await this.transport?.close(); }\n trackScreen(name: string, params?: Record<string, unknown>) { this.addBreadcrumb({ category: \"navigation\", message: name, data: params }); }\n private base(type: ObserveEvent[\"type\"]): ObserveEvent { return { eventId: id(), type, timestamp: Date.now(), platform: \"expo\", user: applyUser(this.user, this.config.sendDefaultPii), tags: { ...this.tags }, contexts: sanitize({ ...this.contexts, device: { brand: Device.brand, model: Device.modelName, deviceType: Device.deviceType, os: Platform.OS, osVersion: Platform.Version, isDevice: Device.isDevice }, app: { id: Application.applicationId, name: Application.applicationName, version: Application.nativeApplicationVersion, build: Application.nativeBuildVersion, runtimeVersion: Constants.expoConfig?.runtimeVersion } }, this.config.redactKeys), breadcrumbs: [...this.breadcrumbs], trace: this.trace }; }\n private async capture(raw: ObserveEvent) { if (!this.transport) return; try { let event = sanitize(raw, this.config.redactKeys); if (this.beforeSendHook) event = await this.beforeSendHook(event) as ObserveEvent; if (event) this.transport.enqueue(event); } catch (error) { if (this.config.debug) console.warn(\"[SmartObserve] event dropped\", error); } }\n private setup(endpoint: string) { const original = typeof ErrorUtils !== \"undefined\" ? ErrorUtils.getGlobalHandler() : undefined; if (original && typeof ErrorUtils !== \"undefined\") { ErrorUtils.setGlobalHandler((error, fatal) => { this.captureException(error, { mechanism: \"react-native.global\", fatal }); if (fatal) void this.capture({ ...this.base(\"session\"), sessionId: this.sessionId, startedAt: this.sessionStarted, endedAt: Date.now(), status: \"crashed\" }); original(error, fatal); }); this.cleanups.push(() => ErrorUtils.setGlobalHandler(original)); } if (this.config.trackLifecycle !== false) { const sub = AppState.addEventListener(\"change\", (state) => { this.addBreadcrumb({ category: \"app.lifecycle\", message: state }); if (state === \"active\") void this.flush(); if (state === \"background\" || state === \"inactive\") void this.capture({ ...this.base(\"session\"), sessionId: this.sessionId, startedAt: this.sessionStarted, endedAt: Date.now(), status: \"exited\" }); }); this.cleanups.push(() => sub.remove()); } if (this.config.trackNetwork !== false) this.patchFetch(endpoint); void this.capture({ ...this.base(\"session\"), sessionId: this.sessionId, startedAt: this.sessionStarted, status: \"active\" }); }\n private patchFetch(endpoint: string) { const original = globalThis.fetch; const client = this; globalThis.fetch = async function(input: RequestInfo | URL, init?: RequestInit) { const url = typeof input === \"string\" ? input : input instanceof URL ? input.href : input.url; if (url.startsWith(endpoint) || (init?.headers && new Headers(init.headers as HeadersInit).has(\"x-smartobserve-internal\"))) return original(input as RequestInfo, init); const started = Date.now(); const method = init?.method ?? (typeof input === \"object\" && \"method\" in input ? (input as Request).method : \"GET\"); client.addBreadcrumb({ category: \"http\", message: `${method} ${safeUrl(url)}`, data: { method, url: safeUrl(url) } }); const headers = new Headers(init?.headers ?? (typeof input === \"object\" && \"headers\" in input ? (input as Request).headers : undefined)); if (matches(url, client.config.allowTracePropagationTargets) && client.trace) headers.set(\"traceparent\", `00-${client.trace.traceId}-${client.trace.spanId}-${client.trace.sampled ? \"01\" : \"00\"}`); try { const response = await original(input as RequestInfo, { ...init, headers }); void client.capture({ ...client.base(\"performance\"), metric: \"http.client.duration\", value: Date.now() - started, unit: \"ms\", route: safeUrl(url), metadata: { method, status: response.status } }); return response; } catch (error) { client.captureException(error, { mechanism: \"fetch\", url: safeUrl(url), method }); throw error; } } as typeof fetch; this.cleanups.push(() => { globalThis.fetch = original; }); }\n}\nfunction matches(value: string, patterns?: Array<string | RegExp>) { return patterns?.some((pattern) => typeof pattern === \"string\" ? value.startsWith(pattern) : pattern.test(value)) ?? false; }\nfunction serialize(error: unknown) { if (!(error instanceof Error)) return { type: typeof error, value: typeof error === \"string\" ? error : String(error), handled: true, mechanism: \"manual\" }; return { type: error.name, value: error.message, handled: true, mechanism: \"manual\", stacktrace: (error.stack ?? \"\").split(\"\\n\").slice(1, 101).map((line) => { const match = line.match(/(?:at\\s+)?(?:(.*?)\\s+\\()?(.+?):(\\d+):(\\d+)\\)?$/); return match ? { function: match[1] || \"<anonymous>\", filename: match[2], line: Number(match[3]), column: Number(match[4]), inApp: !match[2]?.includes(\"node_modules\") } : { function: line.trim() }; }) }; }\nfunction applyUser(user: ObserveUser | undefined, sendDefaultPii?: boolean) { if (!user) return undefined; if (sendDefaultPii) return user; return { id: user.id, username: user.username }; }\n","export function id() { return crypto.randomUUID(); }\nexport function randomHex(bytes: number) { return [...crypto.getRandomValues(new Uint8Array(bytes))].map((value) => value.toString(16).padStart(2, \"0\")).join(\"\"); }\nexport function parseDsn(value: string) { const url = new URL(value); const key = decodeURIComponent(url.username); if (!/^(pk|sk)_[A-Za-z0-9_-]{16,}$/.test(key)) throw new Error(\"SmartObserve DSN contains an invalid project key\"); const slug = url.pathname.replace(/^\\/+|\\/+$/g, \"\"); if (!slug) throw new Error(\"SmartObserve DSN must include a project slug\"); return { endpoint: `${url.protocol}//${url.host}/api/v1/envelope`, key }; }\nconst BLOCKED = new Set([\"password\", \"passcode\", \"authorization\", \"cookie\", \"access_token\", \"refresh_token\", \"api_key\", \"secret\", \"private_key\", \"card_number\", \"cvv\", \"cvc\"]);\nexport function sanitize<T>(input: T, extra: string[] = []): T { const blocked = new Set([...BLOCKED, ...extra.map((value) => value.toLowerCase())]); const seen = new WeakSet<object>(); const walk = (value: unknown, depth: number): unknown => { if (depth > 5) return \"[Truncated]\"; if (typeof value === \"string\") return value.slice(0, 8_192); if (value === null || typeof value !== \"object\") return value; if (seen.has(value)) return \"[Circular]\"; seen.add(value); if (Array.isArray(value)) return value.slice(0, 200).map((entry) => walk(entry, depth + 1)); return Object.fromEntries(Object.entries(value).slice(0, 200).map(([key, entry]) => [key, blocked.has(key.toLowerCase().replace(/[\\s-]+/g, \"_\")) ? \"[Redacted]\" : walk(entry, depth + 1)])); }; return walk(input, 0) as T; }\nexport function safeUrl(value: string) { try { const url = new URL(value); url.username = \"\"; url.password = \"\"; for (const key of [...url.searchParams.keys()]) url.searchParams.set(key, \"[Filtered]\"); return url.toString(); } catch { return \"[Invalid URL]\"; } }\n","import AsyncStorage from \"@react-native-async-storage/async-storage\";\nimport NetInfo from \"@react-native-community/netinfo\";\nimport type { ObserveEvent } from \"./types.js\";\nimport { id } from \"./internal.js\";\nimport { SDK_NAME, SDK_VERSION } from \"./sdk-meta.js\";\nconst STORAGE_KEY = \"@smartobserve/events/v1\";\ninterface Options { endpoint: string; key: string; environment: string; release?: string; dist?: string; maxQueueSize: number; flushIntervalMs: number; debug: boolean }\nexport class ExpoTransport {\n private queue: ObserveEvent[] = []; private timer?: ReturnType<typeof setInterval>; private flushing?: Promise<void>; private online = true; private unsubscribe?: () => void; private closed = false;\n constructor(private readonly options: Options) { this.timer = setInterval(() => void this.flush(), options.flushIntervalMs); this.unsubscribe = NetInfo.addEventListener((state) => { this.online = state.isConnected !== false; if (this.online) void this.flush(); }); void this.restore(); }\n enqueue(event: ObserveEvent) { if (this.closed) return; if (this.queue.length >= this.options.maxQueueSize) this.evict(); this.queue.push(event); void this.persist(); if (this.queue.length >= 50 || event.level === \"fatal\") void this.flush(); }\n async flush() { if (this.flushing || !this.queue.length || !this.online) return this.flushing; const events = this.queue.splice(0, 50); this.flushing = this.send(events).then(() => this.persist()).catch((error) => { this.queue.unshift(...events); void this.persist(); if (this.options.debug) console.warn(\"[SmartObserve] offline batch retained\", error); }).finally(() => { this.flushing = undefined; }); return this.flushing; }\n async close() { this.closed = true; if (this.timer) clearInterval(this.timer); this.unsubscribe?.(); await this.flush(); }\n private async restore() { try { const raw = await AsyncStorage.getItem(STORAGE_KEY); if (!raw) return; const stored = JSON.parse(raw) as Array<ObserveEvent & { _storedAt?: number }>; this.queue.push(...stored.filter((event) => Date.now() - (event._storedAt ?? event.timestamp) < 7 * 86_400_000).slice(-this.options.maxQueueSize)); await this.flush(); } catch (error) { if (this.options.debug) console.warn(\"[SmartObserve] offline queue unavailable\", error); } }\n private async persist(): Promise<void> { try { let prepared = this.queue.map((event) => ({ ...event, _storedAt: Date.now() })); let raw = JSON.stringify(prepared); while (raw.length > 10 * 1024 * 1024 && this.queue.length) { this.evict(); prepared = this.queue.map((event) => ({ ...event, _storedAt: Date.now() })); raw = JSON.stringify(prepared); } await AsyncStorage.setItem(STORAGE_KEY, raw); } catch (error) { if (this.options.debug) console.warn(\"[SmartObserve] could not persist offline queue\", error); } }\n private async send(events: ObserveEvent[]) { const body = JSON.stringify({ schemaVersion: 1, envelopeId: id(), sentAt: Date.now(), sdk: { name: SDK_NAME, version: SDK_VERSION }, environment: this.options.environment, release: this.options.release, dist: this.options.dist, events }); let attempt = 0; while (true) { const response = await fetch(this.options.endpoint, { method: \"POST\", headers: { \"content-type\": \"application/json\", \"origin\": \"smartobserve-expo://native\", \"x-smartobserve-key\": this.options.key, \"x-smartobserve-platform\": \"expo\", \"x-smartobserve-internal\": \"transport\" }, body }); if (response.ok) return; if (![408, 429].includes(response.status) && response.status < 500) return; if (attempt++ >= 5) throw new Error(`HTTP ${response.status}`); await new Promise((resolve) => setTimeout(resolve, Math.random() * Math.min(30_000, 2 ** attempt * 1_000))); } }\n private evict() { const index = this.queue.findIndex((event) => event.type === \"span\" || event.type === \"performance\" || event.level === \"debug\"); this.queue.splice(index < 0 ? 0 : index, 1); }\n}\n","export const SDK_NAME = \"@smarthivelabs-devs/observe-expo\";\nexport const SDK_VERSION = \"26.0.0\";\n","import { SmartObserveExpoClient } from \"./client.js\";\nimport type { SmartObserveConfig } from \"./types.js\";\nlet client: SmartObserveExpoClient | undefined;\nexport const SmartObserve = { init(config: SmartObserveConfig = {}) { return client ??= new SmartObserveExpoClient(config); }, captureException(error: unknown, hint?: Record<string, unknown>) { return active().captureException(error, hint); }, captureMessage(message: string, level?: import(\"./types.js\").Level, metadata?: Record<string, unknown>) { return active().captureMessage(message, level, metadata); }, addBreadcrumb(value: import(\"./types.js\").Breadcrumb) { active().addBreadcrumb(value); }, setUser(value: import(\"./types.js\").ObserveUser | null) { active().setUser(value); }, setTag(key: string, value: string | null) { active().setTag(key, value); }, setContext(key: string, value: Record<string, unknown> | null) { active().setContext(key, value); }, startSpan<T>(options: import(\"./types.js\").SpanOptions, callback: (span: import(\"./types.js\").ObserveSpan) => T | Promise<T>) { return active().startSpan(options, callback); }, trackScreen(name: string, params?: Record<string, unknown>) { active().trackScreen(name, params); }, beforeSend(callback: import(\"./types.js\").BeforeSend) { active().beforeSend(callback); }, flush() { return active().flush(); }, async close() { await client?.close(); client = undefined; }, get log() { return active().log; } };\nfunction active() { return client ??= new SmartObserveExpoClient({ enabled: false }); }\nexport { SmartObserveExpoClient } from \"./client.js\"; export * from \"./types.js\";\n"],"mappings":"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","names":["client"]}
1
+ {"version":3,"sources":["../src/client.ts","../src/internal.ts","../src/transport.ts","../src/sdk-meta.ts","../src/index.ts"],"sourcesContent":["import { AppState, Platform } from \"react-native\";\nimport * as Application from \"expo-application\";\nimport Constants from \"expo-constants\";\nimport * as Device from \"expo-device\";\nimport { id, parseDsn, randomHex, safeUrl, sanitize } from \"./internal.js\";\nimport { ExpoTransport } from \"./transport.js\";\nimport type { BeforeSend, Breadcrumb, Level, ObserveEvent, ObserveSpan, ObserveUser, SmartObserveConfig, SpanOptions, TraceContext } from \"./types.js\";\n\ndeclare const ErrorUtils: { getGlobalHandler(): (error: Error, fatal?: boolean) => void; setGlobalHandler(handler: (error: Error, fatal?: boolean) => void): void } | undefined;\n\nexport class SmartObserveExpoClient {\n private config: SmartObserveConfig & { environment: string; enabled: boolean; debug: boolean; tracesSampleRate: number; errorSampleRate: number; maxBreadcrumbs: number }; private transport?: ExpoTransport; private user?: ObserveUser; private tags: Record<string, string> = {}; private contexts: Record<string, unknown> = {}; private breadcrumbs: Breadcrumb[] = []; private trace?: TraceContext; private beforeSendHook?: BeforeSend; private cleanups: Array<() => void> = []; private sessionId = id(); private sessionStarted = Date.now();\n constructor(input: SmartObserveConfig = {}) { this.config = { ...input, environment: input.environment ?? \"production\", enabled: input.enabled ?? Boolean(input.dsn), debug: input.debug ?? false, tracesSampleRate: input.tracesSampleRate ?? input.sampleRate ?? 0.1, errorSampleRate: input.errorSampleRate ?? 1, maxBreadcrumbs: input.maxBreadcrumbs ?? 100 }; this.beforeSendHook = input.beforeSend; if (this.config.enabled && input.dsn) { const parsed = parseDsn(input.dsn); this.transport = new ExpoTransport({ ...parsed, environment: this.config.environment, release: input.release ?? Application.nativeApplicationVersion ?? undefined, dist: input.dist ?? Application.nativeBuildVersion ?? undefined, maxQueueSize: input.maxQueueSize ?? 1_000, flushIntervalMs: input.flushIntervalMs ?? 5_000, debug: this.config.debug }); this.setup(parsed.endpoint); } }\n captureException(error: unknown, hint: Record<string, unknown> = {}) { const eventId = id(); if (Math.random() <= this.config.errorSampleRate) { const exception = serialize(error); void this.capture({ ...this.base(\"error\"), eventId, message: exception.value, level: \"error\", exceptions: [exception], metadata: hint }); } return eventId; }\n captureMessage(message: string, level: Level = \"info\", metadata?: Record<string, unknown>) { const eventId = id(); void this.capture({ ...this.base(\"log\"), eventId, message, level, metadata }); return eventId; }\n log = { debug: (m: string, d?: Record<string, unknown>) => this.captureMessage(m, \"debug\", d), info: (m: string, d?: Record<string, unknown>) => this.captureMessage(m, \"info\", d), warn: (m: string, d?: Record<string, unknown>) => this.captureMessage(m, \"warn\", d), error: (m: string, d?: Record<string, unknown>) => this.captureMessage(m, \"error\", d) };\n addBreadcrumb(value: Breadcrumb) { this.breadcrumbs.push({ ...sanitize(value, this.config.redactKeys), timestamp: value.timestamp ?? Date.now() }); this.breadcrumbs.splice(0, Math.max(0, this.breadcrumbs.length - this.config.maxBreadcrumbs)); }\n setUser(value: ObserveUser | null) { this.user = value ? sanitize(value, this.config.redactKeys) : undefined; }\n setTag(key: string, value: string | null) { if (value === null) delete this.tags[key]; else this.tags[key.slice(0, 64)] = value.slice(0, 256); }\n setContext(key: string, value: Record<string, unknown> | null) { if (value === null) delete this.contexts[key]; else this.contexts[key] = sanitize(value, this.config.redactKeys); }\n beforeSend(callback: BeforeSend) { this.beforeSendHook = callback; }\n startSpan<T>(options: SpanOptions, callback: (span: ObserveSpan) => T | Promise<T>): T | Promise<T> { const previous = this.trace; const trace: TraceContext = { traceId: options.parent?.traceId ?? previous?.traceId ?? randomHex(16), spanId: randomHex(8), parentSpanId: options.parent?.spanId ?? previous?.spanId, sampled: options.sampled ?? previous?.sampled ?? Math.random() < this.config.tracesSampleRate }; const start = Date.now(); const attributes = { ...(options.attributes ?? {}) }; let status: \"ok\" | \"error\" | \"cancelled\" | \"unknown\" = \"unknown\"; let ended = false; const span: ObserveSpan = { traceId: trace.traceId, spanId: trace.spanId, setAttribute: (key, value) => { attributes[key] = value; }, setStatus: (value) => { status = value; }, recordException: (error) => { status = \"error\"; this.captureException(error); }, end: () => { if (!ended && trace.sampled) { ended = true; const isRoot = !trace.parentSpanId; void this.capture({ ...this.base(isRoot ? \"transaction\" : \"span\"), name: options.name, operation: options.operation, startTimestamp: start, endTimestamp: Date.now(), status, ...(isRoot ? {} : { attributes }), trace }); } } }; this.trace = trace; try { const result = callback(span); if (result && typeof (result as Promise<T>).then === \"function\") return (result as Promise<T>).then((value) => { if (status === \"unknown\") status = \"ok\"; span.end(); return value; }, (error) => { span.recordException(error); span.end(); throw error; }).finally(() => { this.trace = previous; }); if (status === \"unknown\") status = \"ok\"; span.end(); return result; } finally { if (this.trace?.spanId === trace.spanId) this.trace = previous; } }\n flush() { return this.transport?.flush() ?? Promise.resolve(); } async close() { for (const cleanup of this.cleanups.splice(0)) cleanup(); await this.transport?.close(); }\n trackScreen(name: string, params?: Record<string, unknown>) { this.addBreadcrumb({ category: \"navigation\", message: name, data: params }); }\n private base(type: ObserveEvent[\"type\"]): ObserveEvent { return { eventId: id(), type, timestamp: Date.now(), platform: \"expo\", user: applyUser(this.user, this.config.sendDefaultPii), tags: { ...this.tags }, contexts: sanitize({ ...this.contexts, device: { brand: Device.brand, model: Device.modelName, deviceType: Device.deviceType, os: Platform.OS, osVersion: Platform.Version, isDevice: Device.isDevice }, app: { id: Application.applicationId, name: Application.applicationName, version: Application.nativeApplicationVersion, build: Application.nativeBuildVersion, runtimeVersion: Constants.expoConfig?.runtimeVersion } }, this.config.redactKeys), breadcrumbs: [...this.breadcrumbs], trace: this.trace }; }\n private async capture(raw: ObserveEvent) { if (!this.transport) return; try { let event = sanitize(raw, this.config.redactKeys); if (this.beforeSendHook) event = await this.beforeSendHook(event) as ObserveEvent; if (event) this.transport.enqueue(event); } catch (error) { if (this.config.debug) console.warn(\"[SmartObserve] event dropped\", error); } }\n private setup(endpoint: string) { const original = typeof ErrorUtils !== \"undefined\" ? ErrorUtils.getGlobalHandler() : undefined; if (original && typeof ErrorUtils !== \"undefined\") { ErrorUtils.setGlobalHandler((error, fatal) => { this.captureException(error, { mechanism: \"react-native.global\", fatal }); if (fatal) void this.capture({ ...this.base(\"session\"), sessionId: this.sessionId, startedAt: this.sessionStarted, endedAt: Date.now(), status: \"crashed\" }); original(error, fatal); }); this.cleanups.push(() => ErrorUtils.setGlobalHandler(original)); } if (this.config.trackLifecycle !== false) { const sub = AppState.addEventListener(\"change\", (state) => { this.addBreadcrumb({ category: \"app.lifecycle\", message: state }); if (state === \"active\") void this.flush(); if (state === \"background\" || state === \"inactive\") void this.capture({ ...this.base(\"session\"), sessionId: this.sessionId, startedAt: this.sessionStarted, endedAt: Date.now(), status: \"exited\" }); }); this.cleanups.push(() => sub.remove()); } if (this.config.trackNetwork !== false) this.patchFetch(endpoint); void this.capture({ ...this.base(\"session\"), sessionId: this.sessionId, startedAt: this.sessionStarted, status: \"active\" }); }\n private patchFetch(endpoint: string) { const original = globalThis.fetch; const client = this; globalThis.fetch = async function(input: RequestInfo | URL, init?: RequestInit) { const url = typeof input === \"string\" ? input : input instanceof URL ? input.href : input.url; if (url.startsWith(endpoint) || (init?.headers && new Headers(init.headers as HeadersInit).has(\"x-smartobserve-internal\"))) return original(input as RequestInfo, init); const started = Date.now(); const method = init?.method ?? (typeof input === \"object\" && \"method\" in input ? (input as Request).method : \"GET\"); client.addBreadcrumb({ category: \"http\", message: `${method} ${safeUrl(url)}`, data: { method, url: safeUrl(url) } }); const headers = new Headers(init?.headers ?? (typeof input === \"object\" && \"headers\" in input ? (input as Request).headers : undefined)); if (matches(url, client.config.allowTracePropagationTargets) && client.trace) headers.set(\"traceparent\", `00-${client.trace.traceId}-${client.trace.spanId}-${client.trace.sampled ? \"01\" : \"00\"}`); try { const response = await original(input as RequestInfo, { ...init, headers }); void client.capture({ ...client.base(\"performance\"), metric: \"http.client.duration\", value: Date.now() - started, unit: \"ms\", route: safeUrl(url), metadata: { method, status: response.status } }); return response; } catch (error) { client.captureException(error, { mechanism: \"fetch\", url: safeUrl(url), method }); throw error; } } as typeof fetch; this.cleanups.push(() => { globalThis.fetch = original; }); }\n}\nfunction matches(value: string, patterns?: Array<string | RegExp>) { return patterns?.some((pattern) => typeof pattern === \"string\" ? value.startsWith(pattern) : pattern.test(value)) ?? false; }\nfunction serialize(error: unknown) { if (!(error instanceof Error)) return { type: typeof error, value: typeof error === \"string\" ? error : String(error), handled: true, mechanism: \"manual\" }; return { type: error.name, value: error.message, handled: true, mechanism: \"manual\", stacktrace: (error.stack ?? \"\").split(\"\\n\").slice(1, 101).map((line) => { const match = line.match(/(?:at\\s+)?(?:(.*?)\\s+\\()?(.+?):(\\d+):(\\d+)\\)?$/); return match ? { function: match[1] || \"<anonymous>\", filename: match[2], line: Number(match[3]), column: Number(match[4]), inApp: !match[2]?.includes(\"node_modules\") } : { function: line.trim() }; }) }; }\nfunction applyUser(user: ObserveUser | undefined, sendDefaultPii?: boolean) { if (!user) return undefined; if (sendDefaultPii) return user; return { id: user.id, username: user.username }; }\n","export function id() { return crypto.randomUUID(); }\nexport function randomHex(bytes: number) { return [...crypto.getRandomValues(new Uint8Array(bytes))].map((value) => value.toString(16).padStart(2, \"0\")).join(\"\"); }\nexport function parseDsn(value: string) { const url = new URL(value); const key = decodeURIComponent(url.username); if (!/^(pk|sk)_[A-Za-z0-9_-]{16,}$/.test(key)) throw new Error(\"SmartObserve DSN contains an invalid project key\"); const slug = url.pathname.replace(/^\\/+|\\/+$/g, \"\"); if (!slug) throw new Error(\"SmartObserve DSN must include a project slug\"); return { endpoint: `${url.protocol}//${url.host}/api/v1/envelope`, key }; }\nconst BLOCKED = new Set([\"password\", \"passcode\", \"authorization\", \"cookie\", \"access_token\", \"refresh_token\", \"api_key\", \"secret\", \"private_key\", \"card_number\", \"cvv\", \"cvc\"]);\nexport function sanitize<T>(input: T, extra: string[] = []): T { const blocked = new Set([...BLOCKED, ...extra.map((value) => value.toLowerCase())]); const seen = new WeakSet<object>(); const walk = (value: unknown, depth: number): unknown => { if (depth > 5) return \"[Truncated]\"; if (typeof value === \"string\") return value.slice(0, 8_192); if (value === null || typeof value !== \"object\") return value; if (seen.has(value)) return \"[Circular]\"; seen.add(value); if (Array.isArray(value)) return value.slice(0, 200).map((entry) => walk(entry, depth + 1)); return Object.fromEntries(Object.entries(value).slice(0, 200).map(([key, entry]) => [key, blocked.has(key.toLowerCase().replace(/[\\s-]+/g, \"_\")) ? \"[Redacted]\" : walk(entry, depth + 1)])); }; return walk(input, 0) as T; }\nexport function safeUrl(value: string) { try { const url = new URL(value); url.username = \"\"; url.password = \"\"; for (const key of [...url.searchParams.keys()]) url.searchParams.set(key, \"[Filtered]\"); return url.toString(); } catch { return \"[Invalid URL]\"; } }\n","import AsyncStorage from \"@react-native-async-storage/async-storage\";\nimport NetInfo from \"@react-native-community/netinfo\";\nimport type { ObserveEvent } from \"./types.js\";\nimport { id } from \"./internal.js\";\nimport { SDK_NAME, SDK_VERSION } from \"./sdk-meta.js\";\nconst STORAGE_KEY = \"@smartobserve/events/v1\";\ninterface Options { endpoint: string; key: string; environment: string; release?: string; dist?: string; maxQueueSize: number; flushIntervalMs: number; debug: boolean }\nexport class ExpoTransport {\n private queue: ObserveEvent[] = []; private timer?: ReturnType<typeof setInterval>; private flushing?: Promise<void>; private online = true; private unsubscribe?: () => void; private closed = false;\n constructor(private readonly options: Options) { this.timer = setInterval(() => void this.flush(), options.flushIntervalMs); this.unsubscribe = NetInfo.addEventListener((state) => { this.online = state.isConnected !== false; if (this.online) void this.flush(); }); void this.restore(); }\n enqueue(event: ObserveEvent) { if (this.closed) return; if (this.queue.length >= this.options.maxQueueSize) this.evict(); this.queue.push(event); void this.persist(); if (this.queue.length >= 50 || event.level === \"fatal\") void this.flush(); }\n async flush() { if (this.flushing || !this.queue.length || !this.online) return this.flushing; const events = this.queue.splice(0, 50); this.flushing = this.send(events).then(() => this.persist()).catch((error) => { this.queue.unshift(...events); void this.persist(); if (this.options.debug) console.warn(\"[SmartObserve] offline batch retained\", error); }).finally(() => { this.flushing = undefined; }); return this.flushing; }\n async close() { this.closed = true; if (this.timer) clearInterval(this.timer); this.unsubscribe?.(); await this.flush(); }\n private async restore() { try { const raw = await AsyncStorage.getItem(STORAGE_KEY); if (!raw) return; const stored = JSON.parse(raw) as Array<ObserveEvent & { _storedAt?: number }>; this.queue.push(...stored.filter((event) => Date.now() - (event._storedAt ?? event.timestamp) < 7 * 86_400_000).slice(-this.options.maxQueueSize)); await this.flush(); } catch (error) { if (this.options.debug) console.warn(\"[SmartObserve] offline queue unavailable\", error); } }\n private async persist(): Promise<void> { try { let prepared = this.queue.map((event) => ({ ...event, _storedAt: Date.now() })); let raw = JSON.stringify(prepared); while (raw.length > 10 * 1024 * 1024 && this.queue.length) { this.evict(); prepared = this.queue.map((event) => ({ ...event, _storedAt: Date.now() })); raw = JSON.stringify(prepared); } await AsyncStorage.setItem(STORAGE_KEY, raw); } catch (error) { if (this.options.debug) console.warn(\"[SmartObserve] could not persist offline queue\", error); } }\n private async send(events: ObserveEvent[]) { const body = JSON.stringify({ schemaVersion: 1, envelopeId: id(), sentAt: Date.now(), sdk: { name: SDK_NAME, version: SDK_VERSION }, environment: this.options.environment, release: this.options.release, dist: this.options.dist, events }); let attempt = 0; while (true) { const response = await fetch(this.options.endpoint, { method: \"POST\", headers: { \"content-type\": \"application/json\", \"origin\": \"smartobserve-expo://native\", \"x-smartobserve-key\": this.options.key, \"x-smartobserve-platform\": \"expo\", \"x-smartobserve-internal\": \"transport\" }, body }); if (response.ok) return; if (![408, 429].includes(response.status) && response.status < 500) return; if (attempt++ >= 5) throw new Error(`HTTP ${response.status}`); await new Promise((resolve) => setTimeout(resolve, Math.random() * Math.min(30_000, 2 ** attempt * 1_000))); } }\n private evict() { const index = this.queue.findIndex((event) => event.type === \"span\" || event.type === \"performance\" || event.level === \"debug\"); this.queue.splice(index < 0 ? 0 : index, 1); }\n}\n","export const SDK_NAME = \"@smarthivelabs-devs/observe-expo\";\nexport const SDK_VERSION = \"26.1.0\";\n","import { SmartObserveExpoClient } from \"./client.js\";\nimport type { SmartObserveConfig } from \"./types.js\";\nlet client: SmartObserveExpoClient | undefined;\nexport const SmartObserve = { init(config: SmartObserveConfig = {}) { return client ??= new SmartObserveExpoClient(config); }, captureException(error: unknown, hint?: Record<string, unknown>) { return active().captureException(error, hint); }, captureMessage(message: string, level?: import(\"./types.js\").Level, metadata?: Record<string, unknown>) { return active().captureMessage(message, level, metadata); }, addBreadcrumb(value: import(\"./types.js\").Breadcrumb) { active().addBreadcrumb(value); }, setUser(value: import(\"./types.js\").ObserveUser | null) { active().setUser(value); }, setTag(key: string, value: string | null) { active().setTag(key, value); }, setContext(key: string, value: Record<string, unknown> | null) { active().setContext(key, value); }, startSpan<T>(options: import(\"./types.js\").SpanOptions, callback: (span: import(\"./types.js\").ObserveSpan) => T | Promise<T>) { return active().startSpan(options, callback); }, trackScreen(name: string, params?: Record<string, unknown>) { active().trackScreen(name, params); }, beforeSend(callback: import(\"./types.js\").BeforeSend) { active().beforeSend(callback); }, flush() { return active().flush(); }, async close() { await client?.close(); client = undefined; }, get log() { return active().log; } };\nfunction active() { return client ??= new SmartObserveExpoClient({ enabled: false }); }\nexport { SmartObserveExpoClient } from \"./client.js\"; export * from \"./types.js\";\n"],"mappings":"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","names":["client"]}
package/dist/index.cjs CHANGED
@@ -89,7 +89,7 @@ var import_netinfo = __toESM(require("@react-native-community/netinfo"), 1);
89
89
 
90
90
  // src/sdk-meta.ts
91
91
  var SDK_NAME = "@smarthivelabs-devs/observe-expo";
92
- var SDK_VERSION = "26.0.0";
92
+ var SDK_VERSION = "26.1.0";
93
93
 
94
94
  // src/transport.ts
95
95
  var STORAGE_KEY = "@smartobserve/events/v1";
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/client.ts","../src/internal.ts","../src/transport.ts","../src/sdk-meta.ts"],"sourcesContent":["import { SmartObserveExpoClient } from \"./client.js\";\nimport type { SmartObserveConfig } from \"./types.js\";\nlet client: SmartObserveExpoClient | undefined;\nexport const SmartObserve = { init(config: SmartObserveConfig = {}) { return client ??= new SmartObserveExpoClient(config); }, captureException(error: unknown, hint?: Record<string, unknown>) { return active().captureException(error, hint); }, captureMessage(message: string, level?: import(\"./types.js\").Level, metadata?: Record<string, unknown>) { return active().captureMessage(message, level, metadata); }, addBreadcrumb(value: import(\"./types.js\").Breadcrumb) { active().addBreadcrumb(value); }, setUser(value: import(\"./types.js\").ObserveUser | null) { active().setUser(value); }, setTag(key: string, value: string | null) { active().setTag(key, value); }, setContext(key: string, value: Record<string, unknown> | null) { active().setContext(key, value); }, startSpan<T>(options: import(\"./types.js\").SpanOptions, callback: (span: import(\"./types.js\").ObserveSpan) => T | Promise<T>) { return active().startSpan(options, callback); }, trackScreen(name: string, params?: Record<string, unknown>) { active().trackScreen(name, params); }, beforeSend(callback: import(\"./types.js\").BeforeSend) { active().beforeSend(callback); }, flush() { return active().flush(); }, async close() { await client?.close(); client = undefined; }, get log() { return active().log; } };\nfunction active() { return client ??= new SmartObserveExpoClient({ enabled: false }); }\nexport { SmartObserveExpoClient } from \"./client.js\"; export * from \"./types.js\";\n","import { AppState, Platform } from \"react-native\";\nimport * as Application from \"expo-application\";\nimport Constants from \"expo-constants\";\nimport * as Device from \"expo-device\";\nimport { id, parseDsn, randomHex, safeUrl, sanitize } from \"./internal.js\";\nimport { ExpoTransport } from \"./transport.js\";\nimport type { BeforeSend, Breadcrumb, Level, ObserveEvent, ObserveSpan, ObserveUser, SmartObserveConfig, SpanOptions, TraceContext } from \"./types.js\";\n\ndeclare const ErrorUtils: { getGlobalHandler(): (error: Error, fatal?: boolean) => void; setGlobalHandler(handler: (error: Error, fatal?: boolean) => void): void } | undefined;\n\nexport class SmartObserveExpoClient {\n private config: SmartObserveConfig & { environment: string; enabled: boolean; debug: boolean; tracesSampleRate: number; errorSampleRate: number; maxBreadcrumbs: number }; private transport?: ExpoTransport; private user?: ObserveUser; private tags: Record<string, string> = {}; private contexts: Record<string, unknown> = {}; private breadcrumbs: Breadcrumb[] = []; private trace?: TraceContext; private beforeSendHook?: BeforeSend; private cleanups: Array<() => void> = []; private sessionId = id(); private sessionStarted = Date.now();\n constructor(input: SmartObserveConfig = {}) { this.config = { ...input, environment: input.environment ?? \"production\", enabled: input.enabled ?? Boolean(input.dsn), debug: input.debug ?? false, tracesSampleRate: input.tracesSampleRate ?? input.sampleRate ?? 0.1, errorSampleRate: input.errorSampleRate ?? 1, maxBreadcrumbs: input.maxBreadcrumbs ?? 100 }; this.beforeSendHook = input.beforeSend; if (this.config.enabled && input.dsn) { const parsed = parseDsn(input.dsn); this.transport = new ExpoTransport({ ...parsed, environment: this.config.environment, release: input.release ?? Application.nativeApplicationVersion ?? undefined, dist: input.dist ?? Application.nativeBuildVersion ?? undefined, maxQueueSize: input.maxQueueSize ?? 1_000, flushIntervalMs: input.flushIntervalMs ?? 5_000, debug: this.config.debug }); this.setup(parsed.endpoint); } }\n captureException(error: unknown, hint: Record<string, unknown> = {}) { const eventId = id(); if (Math.random() <= this.config.errorSampleRate) { const exception = serialize(error); void this.capture({ ...this.base(\"error\"), eventId, message: exception.value, level: \"error\", exceptions: [exception], metadata: hint }); } return eventId; }\n captureMessage(message: string, level: Level = \"info\", metadata?: Record<string, unknown>) { const eventId = id(); void this.capture({ ...this.base(\"log\"), eventId, message, level, metadata }); return eventId; }\n log = { debug: (m: string, d?: Record<string, unknown>) => this.captureMessage(m, \"debug\", d), info: (m: string, d?: Record<string, unknown>) => this.captureMessage(m, \"info\", d), warn: (m: string, d?: Record<string, unknown>) => this.captureMessage(m, \"warn\", d), error: (m: string, d?: Record<string, unknown>) => this.captureMessage(m, \"error\", d) };\n addBreadcrumb(value: Breadcrumb) { this.breadcrumbs.push({ ...sanitize(value, this.config.redactKeys), timestamp: value.timestamp ?? Date.now() }); this.breadcrumbs.splice(0, Math.max(0, this.breadcrumbs.length - this.config.maxBreadcrumbs)); }\n setUser(value: ObserveUser | null) { this.user = value ? sanitize(value, this.config.redactKeys) : undefined; }\n setTag(key: string, value: string | null) { if (value === null) delete this.tags[key]; else this.tags[key.slice(0, 64)] = value.slice(0, 256); }\n setContext(key: string, value: Record<string, unknown> | null) { if (value === null) delete this.contexts[key]; else this.contexts[key] = sanitize(value, this.config.redactKeys); }\n beforeSend(callback: BeforeSend) { this.beforeSendHook = callback; }\n startSpan<T>(options: SpanOptions, callback: (span: ObserveSpan) => T | Promise<T>): T | Promise<T> { const previous = this.trace; const trace: TraceContext = { traceId: options.parent?.traceId ?? previous?.traceId ?? randomHex(16), spanId: randomHex(8), parentSpanId: options.parent?.spanId ?? previous?.spanId, sampled: options.sampled ?? previous?.sampled ?? Math.random() < this.config.tracesSampleRate }; const start = Date.now(); const attributes = { ...(options.attributes ?? {}) }; let status: \"ok\" | \"error\" | \"cancelled\" | \"unknown\" = \"unknown\"; let ended = false; const span: ObserveSpan = { traceId: trace.traceId, spanId: trace.spanId, setAttribute: (key, value) => { attributes[key] = value; }, setStatus: (value) => { status = value; }, recordException: (error) => { status = \"error\"; this.captureException(error); }, end: () => { if (!ended && trace.sampled) { ended = true; const isRoot = !trace.parentSpanId; void this.capture({ ...this.base(isRoot ? \"transaction\" : \"span\"), name: options.name, operation: options.operation, startTimestamp: start, endTimestamp: Date.now(), status, ...(isRoot ? {} : { attributes }), trace }); } } }; this.trace = trace; try { const result = callback(span); if (result && typeof (result as Promise<T>).then === \"function\") return (result as Promise<T>).then((value) => { if (status === \"unknown\") status = \"ok\"; span.end(); return value; }, (error) => { span.recordException(error); span.end(); throw error; }).finally(() => { this.trace = previous; }); if (status === \"unknown\") status = \"ok\"; span.end(); return result; } finally { if (this.trace?.spanId === trace.spanId) this.trace = previous; } }\n flush() { return this.transport?.flush() ?? Promise.resolve(); } async close() { for (const cleanup of this.cleanups.splice(0)) cleanup(); await this.transport?.close(); }\n trackScreen(name: string, params?: Record<string, unknown>) { this.addBreadcrumb({ category: \"navigation\", message: name, data: params }); }\n private base(type: ObserveEvent[\"type\"]): ObserveEvent { return { eventId: id(), type, timestamp: Date.now(), platform: \"expo\", user: applyUser(this.user, this.config.sendDefaultPii), tags: { ...this.tags }, contexts: sanitize({ ...this.contexts, device: { brand: Device.brand, model: Device.modelName, deviceType: Device.deviceType, os: Platform.OS, osVersion: Platform.Version, isDevice: Device.isDevice }, app: { id: Application.applicationId, name: Application.applicationName, version: Application.nativeApplicationVersion, build: Application.nativeBuildVersion, runtimeVersion: Constants.expoConfig?.runtimeVersion } }, this.config.redactKeys), breadcrumbs: [...this.breadcrumbs], trace: this.trace }; }\n private async capture(raw: ObserveEvent) { if (!this.transport) return; try { let event = sanitize(raw, this.config.redactKeys); if (this.beforeSendHook) event = await this.beforeSendHook(event) as ObserveEvent; if (event) this.transport.enqueue(event); } catch (error) { if (this.config.debug) console.warn(\"[SmartObserve] event dropped\", error); } }\n private setup(endpoint: string) { const original = typeof ErrorUtils !== \"undefined\" ? ErrorUtils.getGlobalHandler() : undefined; if (original && typeof ErrorUtils !== \"undefined\") { ErrorUtils.setGlobalHandler((error, fatal) => { this.captureException(error, { mechanism: \"react-native.global\", fatal }); if (fatal) void this.capture({ ...this.base(\"session\"), sessionId: this.sessionId, startedAt: this.sessionStarted, endedAt: Date.now(), status: \"crashed\" }); original(error, fatal); }); this.cleanups.push(() => ErrorUtils.setGlobalHandler(original)); } if (this.config.trackLifecycle !== false) { const sub = AppState.addEventListener(\"change\", (state) => { this.addBreadcrumb({ category: \"app.lifecycle\", message: state }); if (state === \"active\") void this.flush(); if (state === \"background\" || state === \"inactive\") void this.capture({ ...this.base(\"session\"), sessionId: this.sessionId, startedAt: this.sessionStarted, endedAt: Date.now(), status: \"exited\" }); }); this.cleanups.push(() => sub.remove()); } if (this.config.trackNetwork !== false) this.patchFetch(endpoint); void this.capture({ ...this.base(\"session\"), sessionId: this.sessionId, startedAt: this.sessionStarted, status: \"active\" }); }\n private patchFetch(endpoint: string) { const original = globalThis.fetch; const client = this; globalThis.fetch = async function(input: RequestInfo | URL, init?: RequestInit) { const url = typeof input === \"string\" ? input : input instanceof URL ? input.href : input.url; if (url.startsWith(endpoint) || (init?.headers && new Headers(init.headers as HeadersInit).has(\"x-smartobserve-internal\"))) return original(input as RequestInfo, init); const started = Date.now(); const method = init?.method ?? (typeof input === \"object\" && \"method\" in input ? (input as Request).method : \"GET\"); client.addBreadcrumb({ category: \"http\", message: `${method} ${safeUrl(url)}`, data: { method, url: safeUrl(url) } }); const headers = new Headers(init?.headers ?? (typeof input === \"object\" && \"headers\" in input ? (input as Request).headers : undefined)); if (matches(url, client.config.allowTracePropagationTargets) && client.trace) headers.set(\"traceparent\", `00-${client.trace.traceId}-${client.trace.spanId}-${client.trace.sampled ? \"01\" : \"00\"}`); try { const response = await original(input as RequestInfo, { ...init, headers }); void client.capture({ ...client.base(\"performance\"), metric: \"http.client.duration\", value: Date.now() - started, unit: \"ms\", route: safeUrl(url), metadata: { method, status: response.status } }); return response; } catch (error) { client.captureException(error, { mechanism: \"fetch\", url: safeUrl(url), method }); throw error; } } as typeof fetch; this.cleanups.push(() => { globalThis.fetch = original; }); }\n}\nfunction matches(value: string, patterns?: Array<string | RegExp>) { return patterns?.some((pattern) => typeof pattern === \"string\" ? value.startsWith(pattern) : pattern.test(value)) ?? false; }\nfunction serialize(error: unknown) { if (!(error instanceof Error)) return { type: typeof error, value: typeof error === \"string\" ? error : String(error), handled: true, mechanism: \"manual\" }; return { type: error.name, value: error.message, handled: true, mechanism: \"manual\", stacktrace: (error.stack ?? \"\").split(\"\\n\").slice(1, 101).map((line) => { const match = line.match(/(?:at\\s+)?(?:(.*?)\\s+\\()?(.+?):(\\d+):(\\d+)\\)?$/); return match ? { function: match[1] || \"<anonymous>\", filename: match[2], line: Number(match[3]), column: Number(match[4]), inApp: !match[2]?.includes(\"node_modules\") } : { function: line.trim() }; }) }; }\nfunction applyUser(user: ObserveUser | undefined, sendDefaultPii?: boolean) { if (!user) return undefined; if (sendDefaultPii) return user; return { id: user.id, username: user.username }; }\n","export function id() { return crypto.randomUUID(); }\nexport function randomHex(bytes: number) { return [...crypto.getRandomValues(new Uint8Array(bytes))].map((value) => value.toString(16).padStart(2, \"0\")).join(\"\"); }\nexport function parseDsn(value: string) { const url = new URL(value); const key = decodeURIComponent(url.username); if (!/^(pk|sk)_[A-Za-z0-9_-]{16,}$/.test(key)) throw new Error(\"SmartObserve DSN contains an invalid project key\"); const slug = url.pathname.replace(/^\\/+|\\/+$/g, \"\"); if (!slug) throw new Error(\"SmartObserve DSN must include a project slug\"); return { endpoint: `${url.protocol}//${url.host}/api/v1/envelope`, key }; }\nconst BLOCKED = new Set([\"password\", \"passcode\", \"authorization\", \"cookie\", \"access_token\", \"refresh_token\", \"api_key\", \"secret\", \"private_key\", \"card_number\", \"cvv\", \"cvc\"]);\nexport function sanitize<T>(input: T, extra: string[] = []): T { const blocked = new Set([...BLOCKED, ...extra.map((value) => value.toLowerCase())]); const seen = new WeakSet<object>(); const walk = (value: unknown, depth: number): unknown => { if (depth > 5) return \"[Truncated]\"; if (typeof value === \"string\") return value.slice(0, 8_192); if (value === null || typeof value !== \"object\") return value; if (seen.has(value)) return \"[Circular]\"; seen.add(value); if (Array.isArray(value)) return value.slice(0, 200).map((entry) => walk(entry, depth + 1)); return Object.fromEntries(Object.entries(value).slice(0, 200).map(([key, entry]) => [key, blocked.has(key.toLowerCase().replace(/[\\s-]+/g, \"_\")) ? \"[Redacted]\" : walk(entry, depth + 1)])); }; return walk(input, 0) as T; }\nexport function safeUrl(value: string) { try { const url = new URL(value); url.username = \"\"; url.password = \"\"; for (const key of [...url.searchParams.keys()]) url.searchParams.set(key, \"[Filtered]\"); return url.toString(); } catch { return \"[Invalid URL]\"; } }\n","import AsyncStorage from \"@react-native-async-storage/async-storage\";\nimport NetInfo from \"@react-native-community/netinfo\";\nimport type { ObserveEvent } from \"./types.js\";\nimport { id } from \"./internal.js\";\nimport { SDK_NAME, SDK_VERSION } from \"./sdk-meta.js\";\nconst STORAGE_KEY = \"@smartobserve/events/v1\";\ninterface Options { endpoint: string; key: string; environment: string; release?: string; dist?: string; maxQueueSize: number; flushIntervalMs: number; debug: boolean }\nexport class ExpoTransport {\n private queue: ObserveEvent[] = []; private timer?: ReturnType<typeof setInterval>; private flushing?: Promise<void>; private online = true; private unsubscribe?: () => void; private closed = false;\n constructor(private readonly options: Options) { this.timer = setInterval(() => void this.flush(), options.flushIntervalMs); this.unsubscribe = NetInfo.addEventListener((state) => { this.online = state.isConnected !== false; if (this.online) void this.flush(); }); void this.restore(); }\n enqueue(event: ObserveEvent) { if (this.closed) return; if (this.queue.length >= this.options.maxQueueSize) this.evict(); this.queue.push(event); void this.persist(); if (this.queue.length >= 50 || event.level === \"fatal\") void this.flush(); }\n async flush() { if (this.flushing || !this.queue.length || !this.online) return this.flushing; const events = this.queue.splice(0, 50); this.flushing = this.send(events).then(() => this.persist()).catch((error) => { this.queue.unshift(...events); void this.persist(); if (this.options.debug) console.warn(\"[SmartObserve] offline batch retained\", error); }).finally(() => { this.flushing = undefined; }); return this.flushing; }\n async close() { this.closed = true; if (this.timer) clearInterval(this.timer); this.unsubscribe?.(); await this.flush(); }\n private async restore() { try { const raw = await AsyncStorage.getItem(STORAGE_KEY); if (!raw) return; const stored = JSON.parse(raw) as Array<ObserveEvent & { _storedAt?: number }>; this.queue.push(...stored.filter((event) => Date.now() - (event._storedAt ?? event.timestamp) < 7 * 86_400_000).slice(-this.options.maxQueueSize)); await this.flush(); } catch (error) { if (this.options.debug) console.warn(\"[SmartObserve] offline queue unavailable\", error); } }\n private async persist(): Promise<void> { try { let prepared = this.queue.map((event) => ({ ...event, _storedAt: Date.now() })); let raw = JSON.stringify(prepared); while (raw.length > 10 * 1024 * 1024 && this.queue.length) { this.evict(); prepared = this.queue.map((event) => ({ ...event, _storedAt: Date.now() })); raw = JSON.stringify(prepared); } await AsyncStorage.setItem(STORAGE_KEY, raw); } catch (error) { if (this.options.debug) console.warn(\"[SmartObserve] could not persist offline queue\", error); } }\n private async send(events: ObserveEvent[]) { const body = JSON.stringify({ schemaVersion: 1, envelopeId: id(), sentAt: Date.now(), sdk: { name: SDK_NAME, version: SDK_VERSION }, environment: this.options.environment, release: this.options.release, dist: this.options.dist, events }); let attempt = 0; while (true) { const response = await fetch(this.options.endpoint, { method: \"POST\", headers: { \"content-type\": \"application/json\", \"origin\": \"smartobserve-expo://native\", \"x-smartobserve-key\": this.options.key, \"x-smartobserve-platform\": \"expo\", \"x-smartobserve-internal\": \"transport\" }, body }); if (response.ok) return; if (![408, 429].includes(response.status) && response.status < 500) return; if (attempt++ >= 5) throw new Error(`HTTP ${response.status}`); await new Promise((resolve) => setTimeout(resolve, Math.random() * Math.min(30_000, 2 ** attempt * 1_000))); } }\n private evict() { const index = this.queue.findIndex((event) => event.type === \"span\" || event.type === \"performance\" || event.level === \"debug\"); this.queue.splice(index < 0 ? 0 : index, 1); }\n}\n","export const SDK_NAME = \"@smarthivelabs-devs/observe-expo\";\nexport const SDK_VERSION = \"26.0.0\";\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,0BAAmC;AACnC,kBAA6B;AAC7B,4BAAsB;AACtB,aAAwB;;;ACHjB,SAAS,KAAK;AAAE,SAAO,OAAO,WAAW;AAAG;AAC5C,SAAS,UAAU,OAAe;AAAE,SAAO,CAAC,GAAG,OAAO,gBAAgB,IAAI,WAAW,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,UAAU,MAAM,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,EAAE,KAAK,EAAE;AAAG;AAC5J,SAAS,SAAS,OAAe;AAAE,QAAM,MAAM,IAAI,IAAI,KAAK;AAAG,QAAM,MAAM,mBAAmB,IAAI,QAAQ;AAAG,MAAI,CAAC,+BAA+B,KAAK,GAAG,EAAG,OAAM,IAAI,MAAM,kDAAkD;AAAG,QAAM,OAAO,IAAI,SAAS,QAAQ,cAAc,EAAE;AAAG,MAAI,CAAC,KAAM,OAAM,IAAI,MAAM,8CAA8C;AAAG,SAAO,EAAE,UAAU,GAAG,IAAI,QAAQ,KAAK,IAAI,IAAI,oBAAoB,IAAI;AAAG;AACnb,IAAM,UAAU,oBAAI,IAAI,CAAC,YAAY,YAAY,iBAAiB,UAAU,gBAAgB,iBAAiB,WAAW,UAAU,eAAe,eAAe,OAAO,KAAK,CAAC;AACtK,SAAS,SAAY,OAAU,QAAkB,CAAC,GAAM;AAAE,QAAM,UAAU,oBAAI,IAAI,CAAC,GAAG,SAAS,GAAG,MAAM,IAAI,CAAC,UAAU,MAAM,YAAY,CAAC,CAAC,CAAC;AAAG,QAAM,OAAO,oBAAI,QAAgB;AAAG,QAAM,OAAO,CAAC,OAAgB,UAA2B;AAAE,QAAI,QAAQ,EAAG,QAAO;AAAe,QAAI,OAAO,UAAU,SAAU,QAAO,MAAM,MAAM,GAAG,IAAK;AAAG,QAAI,UAAU,QAAQ,OAAO,UAAU,SAAU,QAAO;AAAO,QAAI,KAAK,IAAI,KAAK,EAAG,QAAO;AAAc,SAAK,IAAI,KAAK;AAAG,QAAI,MAAM,QAAQ,KAAK,EAAG,QAAO,MAAM,MAAM,GAAG,GAAG,EAAE,IAAI,CAAC,UAAU,KAAK,OAAO,QAAQ,CAAC,CAAC;AAAG,WAAO,OAAO,YAAY,OAAO,QAAQ,KAAK,EAAE,MAAM,GAAG,GAAG,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,QAAQ,IAAI,IAAI,YAAY,EAAE,QAAQ,WAAW,GAAG,CAAC,IAAI,eAAe,KAAK,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC;AAAA,EAAG;AAAG,SAAO,KAAK,OAAO,CAAC;AAAQ;AACnwB,SAAS,QAAQ,OAAe;AAAE,MAAI;AAAE,UAAM,MAAM,IAAI,IAAI,KAAK;AAAG,QAAI,WAAW;AAAI,QAAI,WAAW;AAAI,eAAW,OAAO,CAAC,GAAG,IAAI,aAAa,KAAK,CAAC,EAAG,KAAI,aAAa,IAAI,KAAK,YAAY;AAAG,WAAO,IAAI,SAAS;AAAA,EAAG,QAAQ;AAAE,WAAO;AAAA,EAAiB;AAAE;;;ACLrQ,2BAAyB;AACzB,qBAAoB;;;ACDb,IAAM,WAAW;AACjB,IAAM,cAAc;;;ADI3B,IAAM,cAAc;AAEb,IAAM,gBAAN,MAAoB;AAAA,EAEzB,YAA6B,SAAkB;AAAlB;AAAoB,SAAK,QAAQ,YAAY,MAAM,KAAK,KAAK,MAAM,GAAG,QAAQ,eAAe;AAAG,SAAK,cAAc,eAAAA,QAAQ,iBAAiB,CAAC,UAAU;AAAE,WAAK,SAAS,MAAM,gBAAgB;AAAO,UAAI,KAAK,OAAQ,MAAK,KAAK,MAAM;AAAA,IAAG,CAAC;AAAG,SAAK,KAAK,QAAQ;AAAA,EAAG;AAAA,EAAjQ;AAAA,EADrB,QAAwB,CAAC;AAAA,EAAW;AAAA,EAAgD;AAAA,EAAkC,SAAS;AAAA,EAAc;AAAA,EAAkC,SAAS;AAAA,EAEhM,QAAQ,OAAqB;AAAE,QAAI,KAAK,OAAQ;AAAQ,QAAI,KAAK,MAAM,UAAU,KAAK,QAAQ,aAAc,MAAK,MAAM;AAAG,SAAK,MAAM,KAAK,KAAK;AAAG,SAAK,KAAK,QAAQ;AAAG,QAAI,KAAK,MAAM,UAAU,MAAM,MAAM,UAAU,QAAS,MAAK,KAAK,MAAM;AAAA,EAAG;AAAA,EAClP,MAAM,QAAQ;AAAE,QAAI,KAAK,YAAY,CAAC,KAAK,MAAM,UAAU,CAAC,KAAK,OAAQ,QAAO,KAAK;AAAU,UAAM,SAAS,KAAK,MAAM,OAAO,GAAG,EAAE;AAAG,SAAK,WAAW,KAAK,KAAK,MAAM,EAAE,KAAK,MAAM,KAAK,QAAQ,CAAC,EAAE,MAAM,CAAC,UAAU;AAAE,WAAK,MAAM,QAAQ,GAAG,MAAM;AAAG,WAAK,KAAK,QAAQ;AAAG,UAAI,KAAK,QAAQ,MAAO,SAAQ,KAAK,yCAAyC,KAAK;AAAA,IAAG,CAAC,EAAE,QAAQ,MAAM;AAAE,WAAK,WAAW;AAAA,IAAW,CAAC;AAAG,WAAO,KAAK;AAAA,EAAU;AAAA,EAC1a,MAAM,QAAQ;AAAE,SAAK,SAAS;AAAM,QAAI,KAAK,MAAO,eAAc,KAAK,KAAK;AAAG,SAAK,cAAc;AAAG,UAAM,KAAK,MAAM;AAAA,EAAG;AAAA,EACzH,MAAc,UAAU;AAAE,QAAI;AAAE,YAAM,MAAM,MAAM,qBAAAC,QAAa,QAAQ,WAAW;AAAG,UAAI,CAAC,IAAK;AAAQ,YAAM,SAAS,KAAK,MAAM,GAAG;AAAmD,WAAK,MAAM,KAAK,GAAG,OAAO,OAAO,CAAC,UAAU,KAAK,IAAI,KAAK,MAAM,aAAa,MAAM,aAAa,IAAI,KAAU,EAAE,MAAM,CAAC,KAAK,QAAQ,YAAY,CAAC;AAAG,YAAM,KAAK,MAAM;AAAA,IAAG,SAAS,OAAO;AAAE,UAAI,KAAK,QAAQ,MAAO,SAAQ,KAAK,4CAA4C,KAAK;AAAA,IAAG;AAAA,EAAE;AAAA,EAC5c,MAAc,UAAyB;AAAE,QAAI;AAAE,UAAI,WAAW,KAAK,MAAM,IAAI,CAAC,WAAW,EAAE,GAAG,OAAO,WAAW,KAAK,IAAI,EAAE,EAAE;AAAG,UAAI,MAAM,KAAK,UAAU,QAAQ;AAAG,aAAO,IAAI,SAAS,KAAK,OAAO,QAAQ,KAAK,MAAM,QAAQ;AAAE,aAAK,MAAM;AAAG,mBAAW,KAAK,MAAM,IAAI,CAAC,WAAW,EAAE,GAAG,OAAO,WAAW,KAAK,IAAI,EAAE,EAAE;AAAG,cAAM,KAAK,UAAU,QAAQ;AAAA,MAAG;AAAE,YAAM,qBAAAA,QAAa,QAAQ,aAAa,GAAG;AAAA,IAAG,SAAS,OAAO;AAAE,UAAI,KAAK,QAAQ,MAAO,SAAQ,KAAK,kDAAkD,KAAK;AAAA,IAAG;AAAA,EAAE;AAAA,EAC/f,MAAc,KAAK,QAAwB;AAAE,UAAM,OAAO,KAAK,UAAU,EAAE,eAAe,GAAG,YAAY,GAAG,GAAG,QAAQ,KAAK,IAAI,GAAG,KAAK,EAAE,MAAM,UAAU,SAAS,YAAY,GAAG,aAAa,KAAK,QAAQ,aAAa,SAAS,KAAK,QAAQ,SAAS,MAAM,KAAK,QAAQ,MAAM,OAAO,CAAC;AAAG,QAAI,UAAU;AAAG,WAAO,MAAM;AAAE,YAAM,WAAW,MAAM,MAAM,KAAK,QAAQ,UAAU,EAAE,QAAQ,QAAQ,SAAS,EAAE,gBAAgB,oBAAoB,UAAU,8BAA8B,sBAAsB,KAAK,QAAQ,KAAK,2BAA2B,QAAQ,2BAA2B,YAAY,GAAG,KAAK,CAAC;AAAG,UAAI,SAAS,GAAI;AAAQ,UAAI,CAAC,CAAC,KAAK,GAAG,EAAE,SAAS,SAAS,MAAM,KAAK,SAAS,SAAS,IAAK;AAAQ,UAAI,aAAa,EAAG,OAAM,IAAI,MAAM,QAAQ,SAAS,MAAM,EAAE;AAAG,YAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,KAAK,OAAO,IAAI,KAAK,IAAI,KAAQ,KAAK,UAAU,GAAK,CAAC,CAAC;AAAA,IAAG;AAAA,EAAE;AAAA,EACn2B,QAAQ;AAAE,UAAM,QAAQ,KAAK,MAAM,UAAU,CAAC,UAAU,MAAM,SAAS,UAAU,MAAM,SAAS,iBAAiB,MAAM,UAAU,OAAO;AAAG,SAAK,MAAM,OAAO,QAAQ,IAAI,IAAI,OAAO,CAAC;AAAA,EAAG;AAClM;;;AFPO,IAAM,yBAAN,MAA6B;AAAA,EAC1B;AAAA,EAA2K;AAAA,EAAmC;AAAA,EAA4B,OAA+B,CAAC;AAAA,EAAW,WAAoC,CAAC;AAAA,EAAW,cAA4B,CAAC;AAAA,EAAW;AAAA,EAA8B;AAAA,EAAqC,WAA8B,CAAC;AAAA,EAAW,YAAY,GAAG;AAAA,EAAW,iBAAiB,KAAK,IAAI;AAAA,EACthB,YAAY,QAA4B,CAAC,GAAG;AAAE,SAAK,SAAS,EAAE,GAAG,OAAO,aAAa,MAAM,eAAe,cAAc,SAAS,MAAM,WAAW,QAAQ,MAAM,GAAG,GAAG,OAAO,MAAM,SAAS,OAAO,kBAAkB,MAAM,oBAAoB,MAAM,cAAc,KAAK,iBAAiB,MAAM,mBAAmB,GAAG,gBAAgB,MAAM,kBAAkB,IAAI;AAAG,SAAK,iBAAiB,MAAM;AAAY,QAAI,KAAK,OAAO,WAAW,MAAM,KAAK;AAAE,YAAM,SAAS,SAAS,MAAM,GAAG;AAAG,WAAK,YAAY,IAAI,cAAc,EAAE,GAAG,QAAQ,aAAa,KAAK,OAAO,aAAa,SAAS,MAAM,WAAuB,wCAA4B,QAAW,MAAM,MAAM,QAAoB,kCAAsB,QAAW,cAAc,MAAM,gBAAgB,KAAO,iBAAiB,MAAM,mBAAmB,KAAO,OAAO,KAAK,OAAO,MAAM,CAAC;AAAG,WAAK,MAAM,OAAO,QAAQ;AAAA,IAAG;AAAA,EAAE;AAAA,EACp1B,iBAAiB,OAAgB,OAAgC,CAAC,GAAG;AAAE,UAAM,UAAU,GAAG;AAAG,QAAI,KAAK,OAAO,KAAK,KAAK,OAAO,iBAAiB;AAAE,YAAM,YAAY,UAAU,KAAK;AAAG,WAAK,KAAK,QAAQ,EAAE,GAAG,KAAK,KAAK,OAAO,GAAG,SAAS,SAAS,UAAU,OAAO,OAAO,SAAS,YAAY,CAAC,SAAS,GAAG,UAAU,KAAK,CAAC;AAAA,IAAG;AAAE,WAAO;AAAA,EAAS;AAAA,EACjV,eAAe,SAAiB,QAAe,QAAQ,UAAoC;AAAE,UAAM,UAAU,GAAG;AAAG,SAAK,KAAK,QAAQ,EAAE,GAAG,KAAK,KAAK,KAAK,GAAG,SAAS,SAAS,OAAO,SAAS,CAAC;AAAG,WAAO;AAAA,EAAS;AAAA,EAClN,MAAM,EAAE,OAAO,CAAC,GAAW,MAAgC,KAAK,eAAe,GAAG,SAAS,CAAC,GAAG,MAAM,CAAC,GAAW,MAAgC,KAAK,eAAe,GAAG,QAAQ,CAAC,GAAG,MAAM,CAAC,GAAW,MAAgC,KAAK,eAAe,GAAG,QAAQ,CAAC,GAAG,OAAO,CAAC,GAAW,MAAgC,KAAK,eAAe,GAAG,SAAS,CAAC,EAAE;AAAA,EAC/V,cAAc,OAAmB;AAAE,SAAK,YAAY,KAAK,EAAE,GAAG,SAAS,OAAO,KAAK,OAAO,UAAU,GAAG,WAAW,MAAM,aAAa,KAAK,IAAI,EAAE,CAAC;AAAG,SAAK,YAAY,OAAO,GAAG,KAAK,IAAI,GAAG,KAAK,YAAY,SAAS,KAAK,OAAO,cAAc,CAAC;AAAA,EAAG;AAAA,EACnP,QAAQ,OAA2B;AAAE,SAAK,OAAO,QAAQ,SAAS,OAAO,KAAK,OAAO,UAAU,IAAI;AAAA,EAAW;AAAA,EAC9G,OAAO,KAAa,OAAsB;AAAE,QAAI,UAAU,KAAM,QAAO,KAAK,KAAK,GAAG;AAAA,QAAQ,MAAK,KAAK,IAAI,MAAM,GAAG,EAAE,CAAC,IAAI,MAAM,MAAM,GAAG,GAAG;AAAA,EAAG;AAAA,EAC/I,WAAW,KAAa,OAAuC;AAAE,QAAI,UAAU,KAAM,QAAO,KAAK,SAAS,GAAG;AAAA,QAAQ,MAAK,SAAS,GAAG,IAAI,SAAS,OAAO,KAAK,OAAO,UAAU;AAAA,EAAG;AAAA,EACnL,WAAW,UAAsB;AAAE,SAAK,iBAAiB;AAAA,EAAU;AAAA,EACnE,UAAa,SAAsB,UAAiE;AAAE,UAAM,WAAW,KAAK;AAAO,UAAM,QAAsB,EAAE,SAAS,QAAQ,QAAQ,WAAW,UAAU,WAAW,UAAU,EAAE,GAAG,QAAQ,UAAU,CAAC,GAAG,cAAc,QAAQ,QAAQ,UAAU,UAAU,QAAQ,SAAS,QAAQ,WAAW,UAAU,WAAW,KAAK,OAAO,IAAI,KAAK,OAAO,iBAAiB;AAAG,UAAM,QAAQ,KAAK,IAAI;AAAG,UAAM,aAAa,EAAE,GAAI,QAAQ,cAAc,CAAC,EAAG;AAAG,QAAI,SAAmD;AAAW,QAAI,QAAQ;AAAO,UAAM,OAAoB,EAAE,SAAS,MAAM,SAAS,QAAQ,MAAM,QAAQ,cAAc,CAAC,KAAK,UAAU;AAAE,iBAAW,GAAG,IAAI;AAAA,IAAO,GAAG,WAAW,CAAC,UAAU;AAAE,eAAS;AAAA,IAAO,GAAG,iBAAiB,CAAC,UAAU;AAAE,eAAS;AAAS,WAAK,iBAAiB,KAAK;AAAA,IAAG,GAAG,KAAK,MAAM;AAAE,UAAI,CAAC,SAAS,MAAM,SAAS;AAAE,gBAAQ;AAAM,cAAM,SAAS,CAAC,MAAM;AAAc,aAAK,KAAK,QAAQ,EAAE,GAAG,KAAK,KAAK,SAAS,gBAAgB,MAAM,GAAG,MAAM,QAAQ,MAAM,WAAW,QAAQ,WAAW,gBAAgB,OAAO,cAAc,KAAK,IAAI,GAAG,QAAQ,GAAI,SAAS,CAAC,IAAI,EAAE,WAAW,GAAI,MAAM,CAAC;AAAA,MAAG;AAAA,IAAE,EAAE;AAAG,SAAK,QAAQ;AAAO,QAAI;AAAE,YAAM,SAAS,SAAS,IAAI;AAAG,UAAI,UAAU,OAAQ,OAAsB,SAAS,WAAY,QAAQ,OAAsB,KAAK,CAAC,UAAU;AAAE,YAAI,WAAW,UAAW,UAAS;AAAM,aAAK,IAAI;AAAG,eAAO;AAAA,MAAO,GAAG,CAAC,UAAU;AAAE,aAAK,gBAAgB,KAAK;AAAG,aAAK,IAAI;AAAG,cAAM;AAAA,MAAO,CAAC,EAAE,QAAQ,MAAM;AAAE,aAAK,QAAQ;AAAA,MAAU,CAAC;AAAG,UAAI,WAAW,UAAW,UAAS;AAAM,WAAK,IAAI;AAAG,aAAO;AAAA,IAAQ,UAAE;AAAU,UAAI,KAAK,OAAO,WAAW,MAAM,OAAQ,MAAK,QAAQ;AAAA,IAAU;AAAA,EAAE;AAAA,EACpnD,QAAQ;AAAE,WAAO,KAAK,WAAW,MAAM,KAAK,QAAQ,QAAQ;AAAA,EAAG;AAAA,EAAE,MAAM,QAAQ;AAAE,eAAW,WAAW,KAAK,SAAS,OAAO,CAAC,EAAG,SAAQ;AAAG,UAAM,KAAK,WAAW,MAAM;AAAA,EAAG;AAAA,EAC1K,YAAY,MAAc,QAAkC;AAAE,SAAK,cAAc,EAAE,UAAU,cAAc,SAAS,MAAM,MAAM,OAAO,CAAC;AAAA,EAAG;AAAA,EACnI,KAAK,MAA0C;AAAE,WAAO,EAAE,SAAS,GAAG,GAAG,MAAM,WAAW,KAAK,IAAI,GAAG,UAAU,QAAQ,MAAM,UAAU,KAAK,MAAM,KAAK,OAAO,cAAc,GAAG,MAAM,EAAE,GAAG,KAAK,KAAK,GAAG,UAAU,SAAS,EAAE,GAAG,KAAK,UAAU,QAAQ,EAAE,OAAc,cAAO,OAAc,kBAAW,YAAmB,mBAAY,IAAI,6BAAS,IAAI,WAAW,6BAAS,SAAS,UAAiB,gBAAS,GAAG,KAAK,EAAE,IAAgB,2BAAe,MAAkB,6BAAiB,SAAqB,sCAA0B,OAAmB,gCAAoB,gBAAgB,sBAAAC,QAAU,YAAY,eAAe,EAAE,GAAG,KAAK,OAAO,UAAU,GAAG,aAAa,CAAC,GAAG,KAAK,WAAW,GAAG,OAAO,KAAK,MAAM;AAAA,EAAG;AAAA,EACpsB,MAAc,QAAQ,KAAmB;AAAE,QAAI,CAAC,KAAK,UAAW;AAAQ,QAAI;AAAE,UAAI,QAAQ,SAAS,KAAK,KAAK,OAAO,UAAU;AAAG,UAAI,KAAK,eAAgB,SAAQ,MAAM,KAAK,eAAe,KAAK;AAAmB,UAAI,MAAO,MAAK,UAAU,QAAQ,KAAK;AAAA,IAAG,SAAS,OAAO;AAAE,UAAI,KAAK,OAAO,MAAO,SAAQ,KAAK,gCAAgC,KAAK;AAAA,IAAG;AAAA,EAAE;AAAA,EACtV,MAAM,UAAkB;AAAE,UAAM,WAAW,OAAO,eAAe,cAAc,WAAW,iBAAiB,IAAI;AAAW,QAAI,YAAY,OAAO,eAAe,aAAa;AAAE,iBAAW,iBAAiB,CAAC,OAAO,UAAU;AAAE,aAAK,iBAAiB,OAAO,EAAE,WAAW,uBAAuB,MAAM,CAAC;AAAG,YAAI,MAAO,MAAK,KAAK,QAAQ,EAAE,GAAG,KAAK,KAAK,SAAS,GAAG,WAAW,KAAK,WAAW,WAAW,KAAK,gBAAgB,SAAS,KAAK,IAAI,GAAG,QAAQ,UAAU,CAAC;AAAG,iBAAS,OAAO,KAAK;AAAA,MAAG,CAAC;AAAG,WAAK,SAAS,KAAK,MAAM,WAAW,iBAAiB,QAAQ,CAAC;AAAA,IAAG;AAAE,QAAI,KAAK,OAAO,mBAAmB,OAAO;AAAE,YAAM,MAAM,6BAAS,iBAAiB,UAAU,CAAC,UAAU;AAAE,aAAK,cAAc,EAAE,UAAU,iBAAiB,SAAS,MAAM,CAAC;AAAG,YAAI,UAAU,SAAU,MAAK,KAAK,MAAM;AAAG,YAAI,UAAU,gBAAgB,UAAU,WAAY,MAAK,KAAK,QAAQ,EAAE,GAAG,KAAK,KAAK,SAAS,GAAG,WAAW,KAAK,WAAW,WAAW,KAAK,gBAAgB,SAAS,KAAK,IAAI,GAAG,QAAQ,SAAS,CAAC;AAAA,MAAG,CAAC;AAAG,WAAK,SAAS,KAAK,MAAM,IAAI,OAAO,CAAC;AAAA,IAAG;AAAE,QAAI,KAAK,OAAO,iBAAiB,MAAO,MAAK,WAAW,QAAQ;AAAG,SAAK,KAAK,QAAQ,EAAE,GAAG,KAAK,KAAK,SAAS,GAAG,WAAW,KAAK,WAAW,WAAW,KAAK,gBAAgB,QAAQ,SAAS,CAAC;AAAA,EAAG;AAAA,EAClrC,WAAW,UAAkB;AAAE,UAAM,WAAW,WAAW;AAAO,UAAMC,UAAS;AAAM,eAAW,QAAQ,eAAe,OAA0B,MAAoB;AAAE,YAAM,MAAM,OAAO,UAAU,WAAW,QAAQ,iBAAiB,MAAM,MAAM,OAAO,MAAM;AAAK,UAAI,IAAI,WAAW,QAAQ,KAAM,MAAM,WAAW,IAAI,QAAQ,KAAK,OAAsB,EAAE,IAAI,yBAAyB,EAAI,QAAO,SAAS,OAAsB,IAAI;AAAG,YAAM,UAAU,KAAK,IAAI;AAAG,YAAM,SAAS,MAAM,WAAW,OAAO,UAAU,YAAY,YAAY,QAAS,MAAkB,SAAS;AAAQ,MAAAA,QAAO,cAAc,EAAE,UAAU,QAAQ,SAAS,GAAG,MAAM,IAAI,QAAQ,GAAG,CAAC,IAAI,MAAM,EAAE,QAAQ,KAAK,QAAQ,GAAG,EAAE,EAAE,CAAC;AAAG,YAAM,UAAU,IAAI,QAAQ,MAAM,YAAY,OAAO,UAAU,YAAY,aAAa,QAAS,MAAkB,UAAU,OAAU;AAAG,UAAI,QAAQ,KAAKA,QAAO,OAAO,4BAA4B,KAAKA,QAAO,MAAO,SAAQ,IAAI,eAAe,MAAMA,QAAO,MAAM,OAAO,IAAIA,QAAO,MAAM,MAAM,IAAIA,QAAO,MAAM,UAAU,OAAO,IAAI,EAAE;AAAG,UAAI;AAAE,cAAM,WAAW,MAAM,SAAS,OAAsB,EAAE,GAAG,MAAM,QAAQ,CAAC;AAAG,aAAKA,QAAO,QAAQ,EAAE,GAAGA,QAAO,KAAK,aAAa,GAAG,QAAQ,wBAAwB,OAAO,KAAK,IAAI,IAAI,SAAS,MAAM,MAAM,OAAO,QAAQ,GAAG,GAAG,UAAU,EAAE,QAAQ,QAAQ,SAAS,OAAO,EAAE,CAAC;AAAG,eAAO;AAAA,MAAU,SAAS,OAAO;AAAE,QAAAA,QAAO,iBAAiB,OAAO,EAAE,WAAW,SAAS,KAAK,QAAQ,GAAG,GAAG,OAAO,CAAC;AAAG,cAAM;AAAA,MAAO;AAAA,IAAE;AAAmB,SAAK,SAAS,KAAK,MAAM;AAAE,iBAAW,QAAQ;AAAA,IAAU,CAAC;AAAA,EAAG;AAC9/C;AACA,SAAS,QAAQ,OAAe,UAAmC;AAAE,SAAO,UAAU,KAAK,CAAC,YAAY,OAAO,YAAY,WAAW,MAAM,WAAW,OAAO,IAAI,QAAQ,KAAK,KAAK,CAAC,KAAK;AAAO;AACjM,SAAS,UAAU,OAAgB;AAAE,MAAI,EAAE,iBAAiB,OAAQ,QAAO,EAAE,MAAM,OAAO,OAAO,OAAO,OAAO,UAAU,WAAW,QAAQ,OAAO,KAAK,GAAG,SAAS,MAAM,WAAW,SAAS;AAAG,SAAO,EAAE,MAAM,MAAM,MAAM,OAAO,MAAM,SAAS,SAAS,MAAM,WAAW,UAAU,aAAa,MAAM,SAAS,IAAI,MAAM,IAAI,EAAE,MAAM,GAAG,GAAG,EAAE,IAAI,CAAC,SAAS;AAAE,UAAM,QAAQ,KAAK,MAAM,gDAAgD;AAAG,WAAO,QAAQ,EAAE,UAAU,MAAM,CAAC,KAAK,eAAe,UAAU,MAAM,CAAC,GAAG,MAAM,OAAO,MAAM,CAAC,CAAC,GAAG,QAAQ,OAAO,MAAM,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,SAAS,cAAc,EAAE,IAAI,EAAE,UAAU,KAAK,KAAK,EAAE;AAAA,EAAG,CAAC,EAAE;AAAG;AACxnB,SAAS,UAAU,MAA+B,gBAA0B;AAAE,MAAI,CAAC,KAAM,QAAO;AAAW,MAAI,eAAgB,QAAO;AAAM,SAAO,EAAE,IAAI,KAAK,IAAI,UAAU,KAAK,SAAS;AAAG;;;AD7B7L,IAAI;AACG,IAAM,eAAe,EAAE,KAAK,SAA6B,CAAC,GAAG;AAAE,SAAO,WAAW,IAAI,uBAAuB,MAAM;AAAG,GAAG,iBAAiB,OAAgB,MAAgC;AAAE,SAAO,OAAO,EAAE,iBAAiB,OAAO,IAAI;AAAG,GAAG,eAAe,SAAiB,OAAoC,UAAoC;AAAE,SAAO,OAAO,EAAE,eAAe,SAAS,OAAO,QAAQ;AAAG,GAAG,cAAc,OAAwC;AAAE,SAAO,EAAE,cAAc,KAAK;AAAG,GAAG,QAAQ,OAAgD;AAAE,SAAO,EAAE,QAAQ,KAAK;AAAG,GAAG,OAAO,KAAa,OAAsB;AAAE,SAAO,EAAE,OAAO,KAAK,KAAK;AAAG,GAAG,WAAW,KAAa,OAAuC;AAAE,SAAO,EAAE,WAAW,KAAK,KAAK;AAAG,GAAG,UAAa,SAA2C,UAAsE;AAAE,SAAO,OAAO,EAAE,UAAU,SAAS,QAAQ;AAAG,GAAG,YAAY,MAAc,QAAkC;AAAE,SAAO,EAAE,YAAY,MAAM,MAAM;AAAG,GAAG,WAAW,UAA2C;AAAE,SAAO,EAAE,WAAW,QAAQ;AAAG,GAAG,QAAQ;AAAE,SAAO,OAAO,EAAE,MAAM;AAAG,GAAG,MAAM,QAAQ;AAAE,QAAM,QAAQ,MAAM;AAAG,WAAS;AAAW,GAAG,IAAI,MAAM;AAAE,SAAO,OAAO,EAAE;AAAK,EAAE;AACnvC,SAAS,SAAS;AAAE,SAAO,WAAW,IAAI,uBAAuB,EAAE,SAAS,MAAM,CAAC;AAAG;","names":["NetInfo","AsyncStorage","Constants","client"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/client.ts","../src/internal.ts","../src/transport.ts","../src/sdk-meta.ts"],"sourcesContent":["import { SmartObserveExpoClient } from \"./client.js\";\nimport type { SmartObserveConfig } from \"./types.js\";\nlet client: SmartObserveExpoClient | undefined;\nexport const SmartObserve = { init(config: SmartObserveConfig = {}) { return client ??= new SmartObserveExpoClient(config); }, captureException(error: unknown, hint?: Record<string, unknown>) { return active().captureException(error, hint); }, captureMessage(message: string, level?: import(\"./types.js\").Level, metadata?: Record<string, unknown>) { return active().captureMessage(message, level, metadata); }, addBreadcrumb(value: import(\"./types.js\").Breadcrumb) { active().addBreadcrumb(value); }, setUser(value: import(\"./types.js\").ObserveUser | null) { active().setUser(value); }, setTag(key: string, value: string | null) { active().setTag(key, value); }, setContext(key: string, value: Record<string, unknown> | null) { active().setContext(key, value); }, startSpan<T>(options: import(\"./types.js\").SpanOptions, callback: (span: import(\"./types.js\").ObserveSpan) => T | Promise<T>) { return active().startSpan(options, callback); }, trackScreen(name: string, params?: Record<string, unknown>) { active().trackScreen(name, params); }, beforeSend(callback: import(\"./types.js\").BeforeSend) { active().beforeSend(callback); }, flush() { return active().flush(); }, async close() { await client?.close(); client = undefined; }, get log() { return active().log; } };\nfunction active() { return client ??= new SmartObserveExpoClient({ enabled: false }); }\nexport { SmartObserveExpoClient } from \"./client.js\"; export * from \"./types.js\";\n","import { AppState, Platform } from \"react-native\";\nimport * as Application from \"expo-application\";\nimport Constants from \"expo-constants\";\nimport * as Device from \"expo-device\";\nimport { id, parseDsn, randomHex, safeUrl, sanitize } from \"./internal.js\";\nimport { ExpoTransport } from \"./transport.js\";\nimport type { BeforeSend, Breadcrumb, Level, ObserveEvent, ObserveSpan, ObserveUser, SmartObserveConfig, SpanOptions, TraceContext } from \"./types.js\";\n\ndeclare const ErrorUtils: { getGlobalHandler(): (error: Error, fatal?: boolean) => void; setGlobalHandler(handler: (error: Error, fatal?: boolean) => void): void } | undefined;\n\nexport class SmartObserveExpoClient {\n private config: SmartObserveConfig & { environment: string; enabled: boolean; debug: boolean; tracesSampleRate: number; errorSampleRate: number; maxBreadcrumbs: number }; private transport?: ExpoTransport; private user?: ObserveUser; private tags: Record<string, string> = {}; private contexts: Record<string, unknown> = {}; private breadcrumbs: Breadcrumb[] = []; private trace?: TraceContext; private beforeSendHook?: BeforeSend; private cleanups: Array<() => void> = []; private sessionId = id(); private sessionStarted = Date.now();\n constructor(input: SmartObserveConfig = {}) { this.config = { ...input, environment: input.environment ?? \"production\", enabled: input.enabled ?? Boolean(input.dsn), debug: input.debug ?? false, tracesSampleRate: input.tracesSampleRate ?? input.sampleRate ?? 0.1, errorSampleRate: input.errorSampleRate ?? 1, maxBreadcrumbs: input.maxBreadcrumbs ?? 100 }; this.beforeSendHook = input.beforeSend; if (this.config.enabled && input.dsn) { const parsed = parseDsn(input.dsn); this.transport = new ExpoTransport({ ...parsed, environment: this.config.environment, release: input.release ?? Application.nativeApplicationVersion ?? undefined, dist: input.dist ?? Application.nativeBuildVersion ?? undefined, maxQueueSize: input.maxQueueSize ?? 1_000, flushIntervalMs: input.flushIntervalMs ?? 5_000, debug: this.config.debug }); this.setup(parsed.endpoint); } }\n captureException(error: unknown, hint: Record<string, unknown> = {}) { const eventId = id(); if (Math.random() <= this.config.errorSampleRate) { const exception = serialize(error); void this.capture({ ...this.base(\"error\"), eventId, message: exception.value, level: \"error\", exceptions: [exception], metadata: hint }); } return eventId; }\n captureMessage(message: string, level: Level = \"info\", metadata?: Record<string, unknown>) { const eventId = id(); void this.capture({ ...this.base(\"log\"), eventId, message, level, metadata }); return eventId; }\n log = { debug: (m: string, d?: Record<string, unknown>) => this.captureMessage(m, \"debug\", d), info: (m: string, d?: Record<string, unknown>) => this.captureMessage(m, \"info\", d), warn: (m: string, d?: Record<string, unknown>) => this.captureMessage(m, \"warn\", d), error: (m: string, d?: Record<string, unknown>) => this.captureMessage(m, \"error\", d) };\n addBreadcrumb(value: Breadcrumb) { this.breadcrumbs.push({ ...sanitize(value, this.config.redactKeys), timestamp: value.timestamp ?? Date.now() }); this.breadcrumbs.splice(0, Math.max(0, this.breadcrumbs.length - this.config.maxBreadcrumbs)); }\n setUser(value: ObserveUser | null) { this.user = value ? sanitize(value, this.config.redactKeys) : undefined; }\n setTag(key: string, value: string | null) { if (value === null) delete this.tags[key]; else this.tags[key.slice(0, 64)] = value.slice(0, 256); }\n setContext(key: string, value: Record<string, unknown> | null) { if (value === null) delete this.contexts[key]; else this.contexts[key] = sanitize(value, this.config.redactKeys); }\n beforeSend(callback: BeforeSend) { this.beforeSendHook = callback; }\n startSpan<T>(options: SpanOptions, callback: (span: ObserveSpan) => T | Promise<T>): T | Promise<T> { const previous = this.trace; const trace: TraceContext = { traceId: options.parent?.traceId ?? previous?.traceId ?? randomHex(16), spanId: randomHex(8), parentSpanId: options.parent?.spanId ?? previous?.spanId, sampled: options.sampled ?? previous?.sampled ?? Math.random() < this.config.tracesSampleRate }; const start = Date.now(); const attributes = { ...(options.attributes ?? {}) }; let status: \"ok\" | \"error\" | \"cancelled\" | \"unknown\" = \"unknown\"; let ended = false; const span: ObserveSpan = { traceId: trace.traceId, spanId: trace.spanId, setAttribute: (key, value) => { attributes[key] = value; }, setStatus: (value) => { status = value; }, recordException: (error) => { status = \"error\"; this.captureException(error); }, end: () => { if (!ended && trace.sampled) { ended = true; const isRoot = !trace.parentSpanId; void this.capture({ ...this.base(isRoot ? \"transaction\" : \"span\"), name: options.name, operation: options.operation, startTimestamp: start, endTimestamp: Date.now(), status, ...(isRoot ? {} : { attributes }), trace }); } } }; this.trace = trace; try { const result = callback(span); if (result && typeof (result as Promise<T>).then === \"function\") return (result as Promise<T>).then((value) => { if (status === \"unknown\") status = \"ok\"; span.end(); return value; }, (error) => { span.recordException(error); span.end(); throw error; }).finally(() => { this.trace = previous; }); if (status === \"unknown\") status = \"ok\"; span.end(); return result; } finally { if (this.trace?.spanId === trace.spanId) this.trace = previous; } }\n flush() { return this.transport?.flush() ?? Promise.resolve(); } async close() { for (const cleanup of this.cleanups.splice(0)) cleanup(); await this.transport?.close(); }\n trackScreen(name: string, params?: Record<string, unknown>) { this.addBreadcrumb({ category: \"navigation\", message: name, data: params }); }\n private base(type: ObserveEvent[\"type\"]): ObserveEvent { return { eventId: id(), type, timestamp: Date.now(), platform: \"expo\", user: applyUser(this.user, this.config.sendDefaultPii), tags: { ...this.tags }, contexts: sanitize({ ...this.contexts, device: { brand: Device.brand, model: Device.modelName, deviceType: Device.deviceType, os: Platform.OS, osVersion: Platform.Version, isDevice: Device.isDevice }, app: { id: Application.applicationId, name: Application.applicationName, version: Application.nativeApplicationVersion, build: Application.nativeBuildVersion, runtimeVersion: Constants.expoConfig?.runtimeVersion } }, this.config.redactKeys), breadcrumbs: [...this.breadcrumbs], trace: this.trace }; }\n private async capture(raw: ObserveEvent) { if (!this.transport) return; try { let event = sanitize(raw, this.config.redactKeys); if (this.beforeSendHook) event = await this.beforeSendHook(event) as ObserveEvent; if (event) this.transport.enqueue(event); } catch (error) { if (this.config.debug) console.warn(\"[SmartObserve] event dropped\", error); } }\n private setup(endpoint: string) { const original = typeof ErrorUtils !== \"undefined\" ? ErrorUtils.getGlobalHandler() : undefined; if (original && typeof ErrorUtils !== \"undefined\") { ErrorUtils.setGlobalHandler((error, fatal) => { this.captureException(error, { mechanism: \"react-native.global\", fatal }); if (fatal) void this.capture({ ...this.base(\"session\"), sessionId: this.sessionId, startedAt: this.sessionStarted, endedAt: Date.now(), status: \"crashed\" }); original(error, fatal); }); this.cleanups.push(() => ErrorUtils.setGlobalHandler(original)); } if (this.config.trackLifecycle !== false) { const sub = AppState.addEventListener(\"change\", (state) => { this.addBreadcrumb({ category: \"app.lifecycle\", message: state }); if (state === \"active\") void this.flush(); if (state === \"background\" || state === \"inactive\") void this.capture({ ...this.base(\"session\"), sessionId: this.sessionId, startedAt: this.sessionStarted, endedAt: Date.now(), status: \"exited\" }); }); this.cleanups.push(() => sub.remove()); } if (this.config.trackNetwork !== false) this.patchFetch(endpoint); void this.capture({ ...this.base(\"session\"), sessionId: this.sessionId, startedAt: this.sessionStarted, status: \"active\" }); }\n private patchFetch(endpoint: string) { const original = globalThis.fetch; const client = this; globalThis.fetch = async function(input: RequestInfo | URL, init?: RequestInit) { const url = typeof input === \"string\" ? input : input instanceof URL ? input.href : input.url; if (url.startsWith(endpoint) || (init?.headers && new Headers(init.headers as HeadersInit).has(\"x-smartobserve-internal\"))) return original(input as RequestInfo, init); const started = Date.now(); const method = init?.method ?? (typeof input === \"object\" && \"method\" in input ? (input as Request).method : \"GET\"); client.addBreadcrumb({ category: \"http\", message: `${method} ${safeUrl(url)}`, data: { method, url: safeUrl(url) } }); const headers = new Headers(init?.headers ?? (typeof input === \"object\" && \"headers\" in input ? (input as Request).headers : undefined)); if (matches(url, client.config.allowTracePropagationTargets) && client.trace) headers.set(\"traceparent\", `00-${client.trace.traceId}-${client.trace.spanId}-${client.trace.sampled ? \"01\" : \"00\"}`); try { const response = await original(input as RequestInfo, { ...init, headers }); void client.capture({ ...client.base(\"performance\"), metric: \"http.client.duration\", value: Date.now() - started, unit: \"ms\", route: safeUrl(url), metadata: { method, status: response.status } }); return response; } catch (error) { client.captureException(error, { mechanism: \"fetch\", url: safeUrl(url), method }); throw error; } } as typeof fetch; this.cleanups.push(() => { globalThis.fetch = original; }); }\n}\nfunction matches(value: string, patterns?: Array<string | RegExp>) { return patterns?.some((pattern) => typeof pattern === \"string\" ? value.startsWith(pattern) : pattern.test(value)) ?? false; }\nfunction serialize(error: unknown) { if (!(error instanceof Error)) return { type: typeof error, value: typeof error === \"string\" ? error : String(error), handled: true, mechanism: \"manual\" }; return { type: error.name, value: error.message, handled: true, mechanism: \"manual\", stacktrace: (error.stack ?? \"\").split(\"\\n\").slice(1, 101).map((line) => { const match = line.match(/(?:at\\s+)?(?:(.*?)\\s+\\()?(.+?):(\\d+):(\\d+)\\)?$/); return match ? { function: match[1] || \"<anonymous>\", filename: match[2], line: Number(match[3]), column: Number(match[4]), inApp: !match[2]?.includes(\"node_modules\") } : { function: line.trim() }; }) }; }\nfunction applyUser(user: ObserveUser | undefined, sendDefaultPii?: boolean) { if (!user) return undefined; if (sendDefaultPii) return user; return { id: user.id, username: user.username }; }\n","export function id() { return crypto.randomUUID(); }\nexport function randomHex(bytes: number) { return [...crypto.getRandomValues(new Uint8Array(bytes))].map((value) => value.toString(16).padStart(2, \"0\")).join(\"\"); }\nexport function parseDsn(value: string) { const url = new URL(value); const key = decodeURIComponent(url.username); if (!/^(pk|sk)_[A-Za-z0-9_-]{16,}$/.test(key)) throw new Error(\"SmartObserve DSN contains an invalid project key\"); const slug = url.pathname.replace(/^\\/+|\\/+$/g, \"\"); if (!slug) throw new Error(\"SmartObserve DSN must include a project slug\"); return { endpoint: `${url.protocol}//${url.host}/api/v1/envelope`, key }; }\nconst BLOCKED = new Set([\"password\", \"passcode\", \"authorization\", \"cookie\", \"access_token\", \"refresh_token\", \"api_key\", \"secret\", \"private_key\", \"card_number\", \"cvv\", \"cvc\"]);\nexport function sanitize<T>(input: T, extra: string[] = []): T { const blocked = new Set([...BLOCKED, ...extra.map((value) => value.toLowerCase())]); const seen = new WeakSet<object>(); const walk = (value: unknown, depth: number): unknown => { if (depth > 5) return \"[Truncated]\"; if (typeof value === \"string\") return value.slice(0, 8_192); if (value === null || typeof value !== \"object\") return value; if (seen.has(value)) return \"[Circular]\"; seen.add(value); if (Array.isArray(value)) return value.slice(0, 200).map((entry) => walk(entry, depth + 1)); return Object.fromEntries(Object.entries(value).slice(0, 200).map(([key, entry]) => [key, blocked.has(key.toLowerCase().replace(/[\\s-]+/g, \"_\")) ? \"[Redacted]\" : walk(entry, depth + 1)])); }; return walk(input, 0) as T; }\nexport function safeUrl(value: string) { try { const url = new URL(value); url.username = \"\"; url.password = \"\"; for (const key of [...url.searchParams.keys()]) url.searchParams.set(key, \"[Filtered]\"); return url.toString(); } catch { return \"[Invalid URL]\"; } }\n","import AsyncStorage from \"@react-native-async-storage/async-storage\";\nimport NetInfo from \"@react-native-community/netinfo\";\nimport type { ObserveEvent } from \"./types.js\";\nimport { id } from \"./internal.js\";\nimport { SDK_NAME, SDK_VERSION } from \"./sdk-meta.js\";\nconst STORAGE_KEY = \"@smartobserve/events/v1\";\ninterface Options { endpoint: string; key: string; environment: string; release?: string; dist?: string; maxQueueSize: number; flushIntervalMs: number; debug: boolean }\nexport class ExpoTransport {\n private queue: ObserveEvent[] = []; private timer?: ReturnType<typeof setInterval>; private flushing?: Promise<void>; private online = true; private unsubscribe?: () => void; private closed = false;\n constructor(private readonly options: Options) { this.timer = setInterval(() => void this.flush(), options.flushIntervalMs); this.unsubscribe = NetInfo.addEventListener((state) => { this.online = state.isConnected !== false; if (this.online) void this.flush(); }); void this.restore(); }\n enqueue(event: ObserveEvent) { if (this.closed) return; if (this.queue.length >= this.options.maxQueueSize) this.evict(); this.queue.push(event); void this.persist(); if (this.queue.length >= 50 || event.level === \"fatal\") void this.flush(); }\n async flush() { if (this.flushing || !this.queue.length || !this.online) return this.flushing; const events = this.queue.splice(0, 50); this.flushing = this.send(events).then(() => this.persist()).catch((error) => { this.queue.unshift(...events); void this.persist(); if (this.options.debug) console.warn(\"[SmartObserve] offline batch retained\", error); }).finally(() => { this.flushing = undefined; }); return this.flushing; }\n async close() { this.closed = true; if (this.timer) clearInterval(this.timer); this.unsubscribe?.(); await this.flush(); }\n private async restore() { try { const raw = await AsyncStorage.getItem(STORAGE_KEY); if (!raw) return; const stored = JSON.parse(raw) as Array<ObserveEvent & { _storedAt?: number }>; this.queue.push(...stored.filter((event) => Date.now() - (event._storedAt ?? event.timestamp) < 7 * 86_400_000).slice(-this.options.maxQueueSize)); await this.flush(); } catch (error) { if (this.options.debug) console.warn(\"[SmartObserve] offline queue unavailable\", error); } }\n private async persist(): Promise<void> { try { let prepared = this.queue.map((event) => ({ ...event, _storedAt: Date.now() })); let raw = JSON.stringify(prepared); while (raw.length > 10 * 1024 * 1024 && this.queue.length) { this.evict(); prepared = this.queue.map((event) => ({ ...event, _storedAt: Date.now() })); raw = JSON.stringify(prepared); } await AsyncStorage.setItem(STORAGE_KEY, raw); } catch (error) { if (this.options.debug) console.warn(\"[SmartObserve] could not persist offline queue\", error); } }\n private async send(events: ObserveEvent[]) { const body = JSON.stringify({ schemaVersion: 1, envelopeId: id(), sentAt: Date.now(), sdk: { name: SDK_NAME, version: SDK_VERSION }, environment: this.options.environment, release: this.options.release, dist: this.options.dist, events }); let attempt = 0; while (true) { const response = await fetch(this.options.endpoint, { method: \"POST\", headers: { \"content-type\": \"application/json\", \"origin\": \"smartobserve-expo://native\", \"x-smartobserve-key\": this.options.key, \"x-smartobserve-platform\": \"expo\", \"x-smartobserve-internal\": \"transport\" }, body }); if (response.ok) return; if (![408, 429].includes(response.status) && response.status < 500) return; if (attempt++ >= 5) throw new Error(`HTTP ${response.status}`); await new Promise((resolve) => setTimeout(resolve, Math.random() * Math.min(30_000, 2 ** attempt * 1_000))); } }\n private evict() { const index = this.queue.findIndex((event) => event.type === \"span\" || event.type === \"performance\" || event.level === \"debug\"); this.queue.splice(index < 0 ? 0 : index, 1); }\n}\n","export const SDK_NAME = \"@smarthivelabs-devs/observe-expo\";\nexport const SDK_VERSION = \"26.1.0\";\n"],"mappings":"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","names":["NetInfo","AsyncStorage","Constants","client"]}
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  SmartObserve,
3
3
  SmartObserveExpoClient
4
- } from "./chunk-HNIEV66S.js";
4
+ } from "./chunk-HDKJGFST.js";
5
5
  export {
6
6
  SmartObserve,
7
7
  SmartObserveExpoClient
package/dist/react.cjs CHANGED
@@ -89,7 +89,7 @@ var import_netinfo = __toESM(require("@react-native-community/netinfo"), 1);
89
89
 
90
90
  // src/sdk-meta.ts
91
91
  var SDK_NAME = "@smarthivelabs-devs/observe-expo";
92
- var SDK_VERSION = "26.0.0";
92
+ var SDK_VERSION = "26.1.0";
93
93
 
94
94
  // src/transport.ts
95
95
  var STORAGE_KEY = "@smartobserve/events/v1";
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/react.tsx","../src/client.ts","../src/internal.ts","../src/transport.ts","../src/sdk-meta.ts","../src/index.ts"],"sourcesContent":["import React from \"react\";\nimport { SmartObserve } from \"./index.js\";\nexport interface SmartObserveErrorBoundaryProps { children: React.ReactNode; fallback?: React.ReactNode | ((error: Error) => React.ReactNode); onError?: (error: Error) => void }\ninterface State { error?: Error }\nexport class SmartObserveErrorBoundary extends React.Component<SmartObserveErrorBoundaryProps, State> { override state: State = {}; static getDerivedStateFromError(error: Error): State { return { error }; } override componentDidCatch(error: Error, info: React.ErrorInfo) { SmartObserve.captureException(error, { mechanism: \"react.error_boundary\", componentStack: info.componentStack }); this.props.onError?.(error); } override render() { if (!this.state.error) return this.props.children; return typeof this.props.fallback === \"function\" ? this.props.fallback(this.state.error) : this.props.fallback ?? null; } }\n","import { AppState, Platform } from \"react-native\";\nimport * as Application from \"expo-application\";\nimport Constants from \"expo-constants\";\nimport * as Device from \"expo-device\";\nimport { id, parseDsn, randomHex, safeUrl, sanitize } from \"./internal.js\";\nimport { ExpoTransport } from \"./transport.js\";\nimport type { BeforeSend, Breadcrumb, Level, ObserveEvent, ObserveSpan, ObserveUser, SmartObserveConfig, SpanOptions, TraceContext } from \"./types.js\";\n\ndeclare const ErrorUtils: { getGlobalHandler(): (error: Error, fatal?: boolean) => void; setGlobalHandler(handler: (error: Error, fatal?: boolean) => void): void } | undefined;\n\nexport class SmartObserveExpoClient {\n private config: SmartObserveConfig & { environment: string; enabled: boolean; debug: boolean; tracesSampleRate: number; errorSampleRate: number; maxBreadcrumbs: number }; private transport?: ExpoTransport; private user?: ObserveUser; private tags: Record<string, string> = {}; private contexts: Record<string, unknown> = {}; private breadcrumbs: Breadcrumb[] = []; private trace?: TraceContext; private beforeSendHook?: BeforeSend; private cleanups: Array<() => void> = []; private sessionId = id(); private sessionStarted = Date.now();\n constructor(input: SmartObserveConfig = {}) { this.config = { ...input, environment: input.environment ?? \"production\", enabled: input.enabled ?? Boolean(input.dsn), debug: input.debug ?? false, tracesSampleRate: input.tracesSampleRate ?? input.sampleRate ?? 0.1, errorSampleRate: input.errorSampleRate ?? 1, maxBreadcrumbs: input.maxBreadcrumbs ?? 100 }; this.beforeSendHook = input.beforeSend; if (this.config.enabled && input.dsn) { const parsed = parseDsn(input.dsn); this.transport = new ExpoTransport({ ...parsed, environment: this.config.environment, release: input.release ?? Application.nativeApplicationVersion ?? undefined, dist: input.dist ?? Application.nativeBuildVersion ?? undefined, maxQueueSize: input.maxQueueSize ?? 1_000, flushIntervalMs: input.flushIntervalMs ?? 5_000, debug: this.config.debug }); this.setup(parsed.endpoint); } }\n captureException(error: unknown, hint: Record<string, unknown> = {}) { const eventId = id(); if (Math.random() <= this.config.errorSampleRate) { const exception = serialize(error); void this.capture({ ...this.base(\"error\"), eventId, message: exception.value, level: \"error\", exceptions: [exception], metadata: hint }); } return eventId; }\n captureMessage(message: string, level: Level = \"info\", metadata?: Record<string, unknown>) { const eventId = id(); void this.capture({ ...this.base(\"log\"), eventId, message, level, metadata }); return eventId; }\n log = { debug: (m: string, d?: Record<string, unknown>) => this.captureMessage(m, \"debug\", d), info: (m: string, d?: Record<string, unknown>) => this.captureMessage(m, \"info\", d), warn: (m: string, d?: Record<string, unknown>) => this.captureMessage(m, \"warn\", d), error: (m: string, d?: Record<string, unknown>) => this.captureMessage(m, \"error\", d) };\n addBreadcrumb(value: Breadcrumb) { this.breadcrumbs.push({ ...sanitize(value, this.config.redactKeys), timestamp: value.timestamp ?? Date.now() }); this.breadcrumbs.splice(0, Math.max(0, this.breadcrumbs.length - this.config.maxBreadcrumbs)); }\n setUser(value: ObserveUser | null) { this.user = value ? sanitize(value, this.config.redactKeys) : undefined; }\n setTag(key: string, value: string | null) { if (value === null) delete this.tags[key]; else this.tags[key.slice(0, 64)] = value.slice(0, 256); }\n setContext(key: string, value: Record<string, unknown> | null) { if (value === null) delete this.contexts[key]; else this.contexts[key] = sanitize(value, this.config.redactKeys); }\n beforeSend(callback: BeforeSend) { this.beforeSendHook = callback; }\n startSpan<T>(options: SpanOptions, callback: (span: ObserveSpan) => T | Promise<T>): T | Promise<T> { const previous = this.trace; const trace: TraceContext = { traceId: options.parent?.traceId ?? previous?.traceId ?? randomHex(16), spanId: randomHex(8), parentSpanId: options.parent?.spanId ?? previous?.spanId, sampled: options.sampled ?? previous?.sampled ?? Math.random() < this.config.tracesSampleRate }; const start = Date.now(); const attributes = { ...(options.attributes ?? {}) }; let status: \"ok\" | \"error\" | \"cancelled\" | \"unknown\" = \"unknown\"; let ended = false; const span: ObserveSpan = { traceId: trace.traceId, spanId: trace.spanId, setAttribute: (key, value) => { attributes[key] = value; }, setStatus: (value) => { status = value; }, recordException: (error) => { status = \"error\"; this.captureException(error); }, end: () => { if (!ended && trace.sampled) { ended = true; const isRoot = !trace.parentSpanId; void this.capture({ ...this.base(isRoot ? \"transaction\" : \"span\"), name: options.name, operation: options.operation, startTimestamp: start, endTimestamp: Date.now(), status, ...(isRoot ? {} : { attributes }), trace }); } } }; this.trace = trace; try { const result = callback(span); if (result && typeof (result as Promise<T>).then === \"function\") return (result as Promise<T>).then((value) => { if (status === \"unknown\") status = \"ok\"; span.end(); return value; }, (error) => { span.recordException(error); span.end(); throw error; }).finally(() => { this.trace = previous; }); if (status === \"unknown\") status = \"ok\"; span.end(); return result; } finally { if (this.trace?.spanId === trace.spanId) this.trace = previous; } }\n flush() { return this.transport?.flush() ?? Promise.resolve(); } async close() { for (const cleanup of this.cleanups.splice(0)) cleanup(); await this.transport?.close(); }\n trackScreen(name: string, params?: Record<string, unknown>) { this.addBreadcrumb({ category: \"navigation\", message: name, data: params }); }\n private base(type: ObserveEvent[\"type\"]): ObserveEvent { return { eventId: id(), type, timestamp: Date.now(), platform: \"expo\", user: applyUser(this.user, this.config.sendDefaultPii), tags: { ...this.tags }, contexts: sanitize({ ...this.contexts, device: { brand: Device.brand, model: Device.modelName, deviceType: Device.deviceType, os: Platform.OS, osVersion: Platform.Version, isDevice: Device.isDevice }, app: { id: Application.applicationId, name: Application.applicationName, version: Application.nativeApplicationVersion, build: Application.nativeBuildVersion, runtimeVersion: Constants.expoConfig?.runtimeVersion } }, this.config.redactKeys), breadcrumbs: [...this.breadcrumbs], trace: this.trace }; }\n private async capture(raw: ObserveEvent) { if (!this.transport) return; try { let event = sanitize(raw, this.config.redactKeys); if (this.beforeSendHook) event = await this.beforeSendHook(event) as ObserveEvent; if (event) this.transport.enqueue(event); } catch (error) { if (this.config.debug) console.warn(\"[SmartObserve] event dropped\", error); } }\n private setup(endpoint: string) { const original = typeof ErrorUtils !== \"undefined\" ? ErrorUtils.getGlobalHandler() : undefined; if (original && typeof ErrorUtils !== \"undefined\") { ErrorUtils.setGlobalHandler((error, fatal) => { this.captureException(error, { mechanism: \"react-native.global\", fatal }); if (fatal) void this.capture({ ...this.base(\"session\"), sessionId: this.sessionId, startedAt: this.sessionStarted, endedAt: Date.now(), status: \"crashed\" }); original(error, fatal); }); this.cleanups.push(() => ErrorUtils.setGlobalHandler(original)); } if (this.config.trackLifecycle !== false) { const sub = AppState.addEventListener(\"change\", (state) => { this.addBreadcrumb({ category: \"app.lifecycle\", message: state }); if (state === \"active\") void this.flush(); if (state === \"background\" || state === \"inactive\") void this.capture({ ...this.base(\"session\"), sessionId: this.sessionId, startedAt: this.sessionStarted, endedAt: Date.now(), status: \"exited\" }); }); this.cleanups.push(() => sub.remove()); } if (this.config.trackNetwork !== false) this.patchFetch(endpoint); void this.capture({ ...this.base(\"session\"), sessionId: this.sessionId, startedAt: this.sessionStarted, status: \"active\" }); }\n private patchFetch(endpoint: string) { const original = globalThis.fetch; const client = this; globalThis.fetch = async function(input: RequestInfo | URL, init?: RequestInit) { const url = typeof input === \"string\" ? input : input instanceof URL ? input.href : input.url; if (url.startsWith(endpoint) || (init?.headers && new Headers(init.headers as HeadersInit).has(\"x-smartobserve-internal\"))) return original(input as RequestInfo, init); const started = Date.now(); const method = init?.method ?? (typeof input === \"object\" && \"method\" in input ? (input as Request).method : \"GET\"); client.addBreadcrumb({ category: \"http\", message: `${method} ${safeUrl(url)}`, data: { method, url: safeUrl(url) } }); const headers = new Headers(init?.headers ?? (typeof input === \"object\" && \"headers\" in input ? (input as Request).headers : undefined)); if (matches(url, client.config.allowTracePropagationTargets) && client.trace) headers.set(\"traceparent\", `00-${client.trace.traceId}-${client.trace.spanId}-${client.trace.sampled ? \"01\" : \"00\"}`); try { const response = await original(input as RequestInfo, { ...init, headers }); void client.capture({ ...client.base(\"performance\"), metric: \"http.client.duration\", value: Date.now() - started, unit: \"ms\", route: safeUrl(url), metadata: { method, status: response.status } }); return response; } catch (error) { client.captureException(error, { mechanism: \"fetch\", url: safeUrl(url), method }); throw error; } } as typeof fetch; this.cleanups.push(() => { globalThis.fetch = original; }); }\n}\nfunction matches(value: string, patterns?: Array<string | RegExp>) { return patterns?.some((pattern) => typeof pattern === \"string\" ? value.startsWith(pattern) : pattern.test(value)) ?? false; }\nfunction serialize(error: unknown) { if (!(error instanceof Error)) return { type: typeof error, value: typeof error === \"string\" ? error : String(error), handled: true, mechanism: \"manual\" }; return { type: error.name, value: error.message, handled: true, mechanism: \"manual\", stacktrace: (error.stack ?? \"\").split(\"\\n\").slice(1, 101).map((line) => { const match = line.match(/(?:at\\s+)?(?:(.*?)\\s+\\()?(.+?):(\\d+):(\\d+)\\)?$/); return match ? { function: match[1] || \"<anonymous>\", filename: match[2], line: Number(match[3]), column: Number(match[4]), inApp: !match[2]?.includes(\"node_modules\") } : { function: line.trim() }; }) }; }\nfunction applyUser(user: ObserveUser | undefined, sendDefaultPii?: boolean) { if (!user) return undefined; if (sendDefaultPii) return user; return { id: user.id, username: user.username }; }\n","export function id() { return crypto.randomUUID(); }\nexport function randomHex(bytes: number) { return [...crypto.getRandomValues(new Uint8Array(bytes))].map((value) => value.toString(16).padStart(2, \"0\")).join(\"\"); }\nexport function parseDsn(value: string) { const url = new URL(value); const key = decodeURIComponent(url.username); if (!/^(pk|sk)_[A-Za-z0-9_-]{16,}$/.test(key)) throw new Error(\"SmartObserve DSN contains an invalid project key\"); const slug = url.pathname.replace(/^\\/+|\\/+$/g, \"\"); if (!slug) throw new Error(\"SmartObserve DSN must include a project slug\"); return { endpoint: `${url.protocol}//${url.host}/api/v1/envelope`, key }; }\nconst BLOCKED = new Set([\"password\", \"passcode\", \"authorization\", \"cookie\", \"access_token\", \"refresh_token\", \"api_key\", \"secret\", \"private_key\", \"card_number\", \"cvv\", \"cvc\"]);\nexport function sanitize<T>(input: T, extra: string[] = []): T { const blocked = new Set([...BLOCKED, ...extra.map((value) => value.toLowerCase())]); const seen = new WeakSet<object>(); const walk = (value: unknown, depth: number): unknown => { if (depth > 5) return \"[Truncated]\"; if (typeof value === \"string\") return value.slice(0, 8_192); if (value === null || typeof value !== \"object\") return value; if (seen.has(value)) return \"[Circular]\"; seen.add(value); if (Array.isArray(value)) return value.slice(0, 200).map((entry) => walk(entry, depth + 1)); return Object.fromEntries(Object.entries(value).slice(0, 200).map(([key, entry]) => [key, blocked.has(key.toLowerCase().replace(/[\\s-]+/g, \"_\")) ? \"[Redacted]\" : walk(entry, depth + 1)])); }; return walk(input, 0) as T; }\nexport function safeUrl(value: string) { try { const url = new URL(value); url.username = \"\"; url.password = \"\"; for (const key of [...url.searchParams.keys()]) url.searchParams.set(key, \"[Filtered]\"); return url.toString(); } catch { return \"[Invalid URL]\"; } }\n","import AsyncStorage from \"@react-native-async-storage/async-storage\";\nimport NetInfo from \"@react-native-community/netinfo\";\nimport type { ObserveEvent } from \"./types.js\";\nimport { id } from \"./internal.js\";\nimport { SDK_NAME, SDK_VERSION } from \"./sdk-meta.js\";\nconst STORAGE_KEY = \"@smartobserve/events/v1\";\ninterface Options { endpoint: string; key: string; environment: string; release?: string; dist?: string; maxQueueSize: number; flushIntervalMs: number; debug: boolean }\nexport class ExpoTransport {\n private queue: ObserveEvent[] = []; private timer?: ReturnType<typeof setInterval>; private flushing?: Promise<void>; private online = true; private unsubscribe?: () => void; private closed = false;\n constructor(private readonly options: Options) { this.timer = setInterval(() => void this.flush(), options.flushIntervalMs); this.unsubscribe = NetInfo.addEventListener((state) => { this.online = state.isConnected !== false; if (this.online) void this.flush(); }); void this.restore(); }\n enqueue(event: ObserveEvent) { if (this.closed) return; if (this.queue.length >= this.options.maxQueueSize) this.evict(); this.queue.push(event); void this.persist(); if (this.queue.length >= 50 || event.level === \"fatal\") void this.flush(); }\n async flush() { if (this.flushing || !this.queue.length || !this.online) return this.flushing; const events = this.queue.splice(0, 50); this.flushing = this.send(events).then(() => this.persist()).catch((error) => { this.queue.unshift(...events); void this.persist(); if (this.options.debug) console.warn(\"[SmartObserve] offline batch retained\", error); }).finally(() => { this.flushing = undefined; }); return this.flushing; }\n async close() { this.closed = true; if (this.timer) clearInterval(this.timer); this.unsubscribe?.(); await this.flush(); }\n private async restore() { try { const raw = await AsyncStorage.getItem(STORAGE_KEY); if (!raw) return; const stored = JSON.parse(raw) as Array<ObserveEvent & { _storedAt?: number }>; this.queue.push(...stored.filter((event) => Date.now() - (event._storedAt ?? event.timestamp) < 7 * 86_400_000).slice(-this.options.maxQueueSize)); await this.flush(); } catch (error) { if (this.options.debug) console.warn(\"[SmartObserve] offline queue unavailable\", error); } }\n private async persist(): Promise<void> { try { let prepared = this.queue.map((event) => ({ ...event, _storedAt: Date.now() })); let raw = JSON.stringify(prepared); while (raw.length > 10 * 1024 * 1024 && this.queue.length) { this.evict(); prepared = this.queue.map((event) => ({ ...event, _storedAt: Date.now() })); raw = JSON.stringify(prepared); } await AsyncStorage.setItem(STORAGE_KEY, raw); } catch (error) { if (this.options.debug) console.warn(\"[SmartObserve] could not persist offline queue\", error); } }\n private async send(events: ObserveEvent[]) { const body = JSON.stringify({ schemaVersion: 1, envelopeId: id(), sentAt: Date.now(), sdk: { name: SDK_NAME, version: SDK_VERSION }, environment: this.options.environment, release: this.options.release, dist: this.options.dist, events }); let attempt = 0; while (true) { const response = await fetch(this.options.endpoint, { method: \"POST\", headers: { \"content-type\": \"application/json\", \"origin\": \"smartobserve-expo://native\", \"x-smartobserve-key\": this.options.key, \"x-smartobserve-platform\": \"expo\", \"x-smartobserve-internal\": \"transport\" }, body }); if (response.ok) return; if (![408, 429].includes(response.status) && response.status < 500) return; if (attempt++ >= 5) throw new Error(`HTTP ${response.status}`); await new Promise((resolve) => setTimeout(resolve, Math.random() * Math.min(30_000, 2 ** attempt * 1_000))); } }\n private evict() { const index = this.queue.findIndex((event) => event.type === \"span\" || event.type === \"performance\" || event.level === \"debug\"); this.queue.splice(index < 0 ? 0 : index, 1); }\n}\n","export const SDK_NAME = \"@smarthivelabs-devs/observe-expo\";\nexport const SDK_VERSION = \"26.0.0\";\n","import { SmartObserveExpoClient } from \"./client.js\";\nimport type { SmartObserveConfig } from \"./types.js\";\nlet client: SmartObserveExpoClient | undefined;\nexport const SmartObserve = { init(config: SmartObserveConfig = {}) { return client ??= new SmartObserveExpoClient(config); }, captureException(error: unknown, hint?: Record<string, unknown>) { return active().captureException(error, hint); }, captureMessage(message: string, level?: import(\"./types.js\").Level, metadata?: Record<string, unknown>) { return active().captureMessage(message, level, metadata); }, addBreadcrumb(value: import(\"./types.js\").Breadcrumb) { active().addBreadcrumb(value); }, setUser(value: import(\"./types.js\").ObserveUser | null) { active().setUser(value); }, setTag(key: string, value: string | null) { active().setTag(key, value); }, setContext(key: string, value: Record<string, unknown> | null) { active().setContext(key, value); }, startSpan<T>(options: import(\"./types.js\").SpanOptions, callback: (span: import(\"./types.js\").ObserveSpan) => T | Promise<T>) { return active().startSpan(options, callback); }, trackScreen(name: string, params?: Record<string, unknown>) { active().trackScreen(name, params); }, beforeSend(callback: import(\"./types.js\").BeforeSend) { active().beforeSend(callback); }, flush() { return active().flush(); }, async close() { await client?.close(); client = undefined; }, get log() { return active().log; } };\nfunction active() { return client ??= new SmartObserveExpoClient({ enabled: false }); }\nexport { SmartObserveExpoClient } from \"./client.js\"; export * from \"./types.js\";\n"],"mappings":"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","names":["NetInfo","AsyncStorage","Constants","client","React"]}
1
+ {"version":3,"sources":["../src/react.tsx","../src/client.ts","../src/internal.ts","../src/transport.ts","../src/sdk-meta.ts","../src/index.ts"],"sourcesContent":["import React from \"react\";\nimport { SmartObserve } from \"./index.js\";\nexport interface SmartObserveErrorBoundaryProps { children: React.ReactNode; fallback?: React.ReactNode | ((error: Error) => React.ReactNode); onError?: (error: Error) => void }\ninterface State { error?: Error }\nexport class SmartObserveErrorBoundary extends React.Component<SmartObserveErrorBoundaryProps, State> { override state: State = {}; static getDerivedStateFromError(error: Error): State { return { error }; } override componentDidCatch(error: Error, info: React.ErrorInfo) { SmartObserve.captureException(error, { mechanism: \"react.error_boundary\", componentStack: info.componentStack }); this.props.onError?.(error); } override render() { if (!this.state.error) return this.props.children; return typeof this.props.fallback === \"function\" ? this.props.fallback(this.state.error) : this.props.fallback ?? null; } }\n","import { AppState, Platform } from \"react-native\";\nimport * as Application from \"expo-application\";\nimport Constants from \"expo-constants\";\nimport * as Device from \"expo-device\";\nimport { id, parseDsn, randomHex, safeUrl, sanitize } from \"./internal.js\";\nimport { ExpoTransport } from \"./transport.js\";\nimport type { BeforeSend, Breadcrumb, Level, ObserveEvent, ObserveSpan, ObserveUser, SmartObserveConfig, SpanOptions, TraceContext } from \"./types.js\";\n\ndeclare const ErrorUtils: { getGlobalHandler(): (error: Error, fatal?: boolean) => void; setGlobalHandler(handler: (error: Error, fatal?: boolean) => void): void } | undefined;\n\nexport class SmartObserveExpoClient {\n private config: SmartObserveConfig & { environment: string; enabled: boolean; debug: boolean; tracesSampleRate: number; errorSampleRate: number; maxBreadcrumbs: number }; private transport?: ExpoTransport; private user?: ObserveUser; private tags: Record<string, string> = {}; private contexts: Record<string, unknown> = {}; private breadcrumbs: Breadcrumb[] = []; private trace?: TraceContext; private beforeSendHook?: BeforeSend; private cleanups: Array<() => void> = []; private sessionId = id(); private sessionStarted = Date.now();\n constructor(input: SmartObserveConfig = {}) { this.config = { ...input, environment: input.environment ?? \"production\", enabled: input.enabled ?? Boolean(input.dsn), debug: input.debug ?? false, tracesSampleRate: input.tracesSampleRate ?? input.sampleRate ?? 0.1, errorSampleRate: input.errorSampleRate ?? 1, maxBreadcrumbs: input.maxBreadcrumbs ?? 100 }; this.beforeSendHook = input.beforeSend; if (this.config.enabled && input.dsn) { const parsed = parseDsn(input.dsn); this.transport = new ExpoTransport({ ...parsed, environment: this.config.environment, release: input.release ?? Application.nativeApplicationVersion ?? undefined, dist: input.dist ?? Application.nativeBuildVersion ?? undefined, maxQueueSize: input.maxQueueSize ?? 1_000, flushIntervalMs: input.flushIntervalMs ?? 5_000, debug: this.config.debug }); this.setup(parsed.endpoint); } }\n captureException(error: unknown, hint: Record<string, unknown> = {}) { const eventId = id(); if (Math.random() <= this.config.errorSampleRate) { const exception = serialize(error); void this.capture({ ...this.base(\"error\"), eventId, message: exception.value, level: \"error\", exceptions: [exception], metadata: hint }); } return eventId; }\n captureMessage(message: string, level: Level = \"info\", metadata?: Record<string, unknown>) { const eventId = id(); void this.capture({ ...this.base(\"log\"), eventId, message, level, metadata }); return eventId; }\n log = { debug: (m: string, d?: Record<string, unknown>) => this.captureMessage(m, \"debug\", d), info: (m: string, d?: Record<string, unknown>) => this.captureMessage(m, \"info\", d), warn: (m: string, d?: Record<string, unknown>) => this.captureMessage(m, \"warn\", d), error: (m: string, d?: Record<string, unknown>) => this.captureMessage(m, \"error\", d) };\n addBreadcrumb(value: Breadcrumb) { this.breadcrumbs.push({ ...sanitize(value, this.config.redactKeys), timestamp: value.timestamp ?? Date.now() }); this.breadcrumbs.splice(0, Math.max(0, this.breadcrumbs.length - this.config.maxBreadcrumbs)); }\n setUser(value: ObserveUser | null) { this.user = value ? sanitize(value, this.config.redactKeys) : undefined; }\n setTag(key: string, value: string | null) { if (value === null) delete this.tags[key]; else this.tags[key.slice(0, 64)] = value.slice(0, 256); }\n setContext(key: string, value: Record<string, unknown> | null) { if (value === null) delete this.contexts[key]; else this.contexts[key] = sanitize(value, this.config.redactKeys); }\n beforeSend(callback: BeforeSend) { this.beforeSendHook = callback; }\n startSpan<T>(options: SpanOptions, callback: (span: ObserveSpan) => T | Promise<T>): T | Promise<T> { const previous = this.trace; const trace: TraceContext = { traceId: options.parent?.traceId ?? previous?.traceId ?? randomHex(16), spanId: randomHex(8), parentSpanId: options.parent?.spanId ?? previous?.spanId, sampled: options.sampled ?? previous?.sampled ?? Math.random() < this.config.tracesSampleRate }; const start = Date.now(); const attributes = { ...(options.attributes ?? {}) }; let status: \"ok\" | \"error\" | \"cancelled\" | \"unknown\" = \"unknown\"; let ended = false; const span: ObserveSpan = { traceId: trace.traceId, spanId: trace.spanId, setAttribute: (key, value) => { attributes[key] = value; }, setStatus: (value) => { status = value; }, recordException: (error) => { status = \"error\"; this.captureException(error); }, end: () => { if (!ended && trace.sampled) { ended = true; const isRoot = !trace.parentSpanId; void this.capture({ ...this.base(isRoot ? \"transaction\" : \"span\"), name: options.name, operation: options.operation, startTimestamp: start, endTimestamp: Date.now(), status, ...(isRoot ? {} : { attributes }), trace }); } } }; this.trace = trace; try { const result = callback(span); if (result && typeof (result as Promise<T>).then === \"function\") return (result as Promise<T>).then((value) => { if (status === \"unknown\") status = \"ok\"; span.end(); return value; }, (error) => { span.recordException(error); span.end(); throw error; }).finally(() => { this.trace = previous; }); if (status === \"unknown\") status = \"ok\"; span.end(); return result; } finally { if (this.trace?.spanId === trace.spanId) this.trace = previous; } }\n flush() { return this.transport?.flush() ?? Promise.resolve(); } async close() { for (const cleanup of this.cleanups.splice(0)) cleanup(); await this.transport?.close(); }\n trackScreen(name: string, params?: Record<string, unknown>) { this.addBreadcrumb({ category: \"navigation\", message: name, data: params }); }\n private base(type: ObserveEvent[\"type\"]): ObserveEvent { return { eventId: id(), type, timestamp: Date.now(), platform: \"expo\", user: applyUser(this.user, this.config.sendDefaultPii), tags: { ...this.tags }, contexts: sanitize({ ...this.contexts, device: { brand: Device.brand, model: Device.modelName, deviceType: Device.deviceType, os: Platform.OS, osVersion: Platform.Version, isDevice: Device.isDevice }, app: { id: Application.applicationId, name: Application.applicationName, version: Application.nativeApplicationVersion, build: Application.nativeBuildVersion, runtimeVersion: Constants.expoConfig?.runtimeVersion } }, this.config.redactKeys), breadcrumbs: [...this.breadcrumbs], trace: this.trace }; }\n private async capture(raw: ObserveEvent) { if (!this.transport) return; try { let event = sanitize(raw, this.config.redactKeys); if (this.beforeSendHook) event = await this.beforeSendHook(event) as ObserveEvent; if (event) this.transport.enqueue(event); } catch (error) { if (this.config.debug) console.warn(\"[SmartObserve] event dropped\", error); } }\n private setup(endpoint: string) { const original = typeof ErrorUtils !== \"undefined\" ? ErrorUtils.getGlobalHandler() : undefined; if (original && typeof ErrorUtils !== \"undefined\") { ErrorUtils.setGlobalHandler((error, fatal) => { this.captureException(error, { mechanism: \"react-native.global\", fatal }); if (fatal) void this.capture({ ...this.base(\"session\"), sessionId: this.sessionId, startedAt: this.sessionStarted, endedAt: Date.now(), status: \"crashed\" }); original(error, fatal); }); this.cleanups.push(() => ErrorUtils.setGlobalHandler(original)); } if (this.config.trackLifecycle !== false) { const sub = AppState.addEventListener(\"change\", (state) => { this.addBreadcrumb({ category: \"app.lifecycle\", message: state }); if (state === \"active\") void this.flush(); if (state === \"background\" || state === \"inactive\") void this.capture({ ...this.base(\"session\"), sessionId: this.sessionId, startedAt: this.sessionStarted, endedAt: Date.now(), status: \"exited\" }); }); this.cleanups.push(() => sub.remove()); } if (this.config.trackNetwork !== false) this.patchFetch(endpoint); void this.capture({ ...this.base(\"session\"), sessionId: this.sessionId, startedAt: this.sessionStarted, status: \"active\" }); }\n private patchFetch(endpoint: string) { const original = globalThis.fetch; const client = this; globalThis.fetch = async function(input: RequestInfo | URL, init?: RequestInit) { const url = typeof input === \"string\" ? input : input instanceof URL ? input.href : input.url; if (url.startsWith(endpoint) || (init?.headers && new Headers(init.headers as HeadersInit).has(\"x-smartobserve-internal\"))) return original(input as RequestInfo, init); const started = Date.now(); const method = init?.method ?? (typeof input === \"object\" && \"method\" in input ? (input as Request).method : \"GET\"); client.addBreadcrumb({ category: \"http\", message: `${method} ${safeUrl(url)}`, data: { method, url: safeUrl(url) } }); const headers = new Headers(init?.headers ?? (typeof input === \"object\" && \"headers\" in input ? (input as Request).headers : undefined)); if (matches(url, client.config.allowTracePropagationTargets) && client.trace) headers.set(\"traceparent\", `00-${client.trace.traceId}-${client.trace.spanId}-${client.trace.sampled ? \"01\" : \"00\"}`); try { const response = await original(input as RequestInfo, { ...init, headers }); void client.capture({ ...client.base(\"performance\"), metric: \"http.client.duration\", value: Date.now() - started, unit: \"ms\", route: safeUrl(url), metadata: { method, status: response.status } }); return response; } catch (error) { client.captureException(error, { mechanism: \"fetch\", url: safeUrl(url), method }); throw error; } } as typeof fetch; this.cleanups.push(() => { globalThis.fetch = original; }); }\n}\nfunction matches(value: string, patterns?: Array<string | RegExp>) { return patterns?.some((pattern) => typeof pattern === \"string\" ? value.startsWith(pattern) : pattern.test(value)) ?? false; }\nfunction serialize(error: unknown) { if (!(error instanceof Error)) return { type: typeof error, value: typeof error === \"string\" ? error : String(error), handled: true, mechanism: \"manual\" }; return { type: error.name, value: error.message, handled: true, mechanism: \"manual\", stacktrace: (error.stack ?? \"\").split(\"\\n\").slice(1, 101).map((line) => { const match = line.match(/(?:at\\s+)?(?:(.*?)\\s+\\()?(.+?):(\\d+):(\\d+)\\)?$/); return match ? { function: match[1] || \"<anonymous>\", filename: match[2], line: Number(match[3]), column: Number(match[4]), inApp: !match[2]?.includes(\"node_modules\") } : { function: line.trim() }; }) }; }\nfunction applyUser(user: ObserveUser | undefined, sendDefaultPii?: boolean) { if (!user) return undefined; if (sendDefaultPii) return user; return { id: user.id, username: user.username }; }\n","export function id() { return crypto.randomUUID(); }\nexport function randomHex(bytes: number) { return [...crypto.getRandomValues(new Uint8Array(bytes))].map((value) => value.toString(16).padStart(2, \"0\")).join(\"\"); }\nexport function parseDsn(value: string) { const url = new URL(value); const key = decodeURIComponent(url.username); if (!/^(pk|sk)_[A-Za-z0-9_-]{16,}$/.test(key)) throw new Error(\"SmartObserve DSN contains an invalid project key\"); const slug = url.pathname.replace(/^\\/+|\\/+$/g, \"\"); if (!slug) throw new Error(\"SmartObserve DSN must include a project slug\"); return { endpoint: `${url.protocol}//${url.host}/api/v1/envelope`, key }; }\nconst BLOCKED = new Set([\"password\", \"passcode\", \"authorization\", \"cookie\", \"access_token\", \"refresh_token\", \"api_key\", \"secret\", \"private_key\", \"card_number\", \"cvv\", \"cvc\"]);\nexport function sanitize<T>(input: T, extra: string[] = []): T { const blocked = new Set([...BLOCKED, ...extra.map((value) => value.toLowerCase())]); const seen = new WeakSet<object>(); const walk = (value: unknown, depth: number): unknown => { if (depth > 5) return \"[Truncated]\"; if (typeof value === \"string\") return value.slice(0, 8_192); if (value === null || typeof value !== \"object\") return value; if (seen.has(value)) return \"[Circular]\"; seen.add(value); if (Array.isArray(value)) return value.slice(0, 200).map((entry) => walk(entry, depth + 1)); return Object.fromEntries(Object.entries(value).slice(0, 200).map(([key, entry]) => [key, blocked.has(key.toLowerCase().replace(/[\\s-]+/g, \"_\")) ? \"[Redacted]\" : walk(entry, depth + 1)])); }; return walk(input, 0) as T; }\nexport function safeUrl(value: string) { try { const url = new URL(value); url.username = \"\"; url.password = \"\"; for (const key of [...url.searchParams.keys()]) url.searchParams.set(key, \"[Filtered]\"); return url.toString(); } catch { return \"[Invalid URL]\"; } }\n","import AsyncStorage from \"@react-native-async-storage/async-storage\";\nimport NetInfo from \"@react-native-community/netinfo\";\nimport type { ObserveEvent } from \"./types.js\";\nimport { id } from \"./internal.js\";\nimport { SDK_NAME, SDK_VERSION } from \"./sdk-meta.js\";\nconst STORAGE_KEY = \"@smartobserve/events/v1\";\ninterface Options { endpoint: string; key: string; environment: string; release?: string; dist?: string; maxQueueSize: number; flushIntervalMs: number; debug: boolean }\nexport class ExpoTransport {\n private queue: ObserveEvent[] = []; private timer?: ReturnType<typeof setInterval>; private flushing?: Promise<void>; private online = true; private unsubscribe?: () => void; private closed = false;\n constructor(private readonly options: Options) { this.timer = setInterval(() => void this.flush(), options.flushIntervalMs); this.unsubscribe = NetInfo.addEventListener((state) => { this.online = state.isConnected !== false; if (this.online) void this.flush(); }); void this.restore(); }\n enqueue(event: ObserveEvent) { if (this.closed) return; if (this.queue.length >= this.options.maxQueueSize) this.evict(); this.queue.push(event); void this.persist(); if (this.queue.length >= 50 || event.level === \"fatal\") void this.flush(); }\n async flush() { if (this.flushing || !this.queue.length || !this.online) return this.flushing; const events = this.queue.splice(0, 50); this.flushing = this.send(events).then(() => this.persist()).catch((error) => { this.queue.unshift(...events); void this.persist(); if (this.options.debug) console.warn(\"[SmartObserve] offline batch retained\", error); }).finally(() => { this.flushing = undefined; }); return this.flushing; }\n async close() { this.closed = true; if (this.timer) clearInterval(this.timer); this.unsubscribe?.(); await this.flush(); }\n private async restore() { try { const raw = await AsyncStorage.getItem(STORAGE_KEY); if (!raw) return; const stored = JSON.parse(raw) as Array<ObserveEvent & { _storedAt?: number }>; this.queue.push(...stored.filter((event) => Date.now() - (event._storedAt ?? event.timestamp) < 7 * 86_400_000).slice(-this.options.maxQueueSize)); await this.flush(); } catch (error) { if (this.options.debug) console.warn(\"[SmartObserve] offline queue unavailable\", error); } }\n private async persist(): Promise<void> { try { let prepared = this.queue.map((event) => ({ ...event, _storedAt: Date.now() })); let raw = JSON.stringify(prepared); while (raw.length > 10 * 1024 * 1024 && this.queue.length) { this.evict(); prepared = this.queue.map((event) => ({ ...event, _storedAt: Date.now() })); raw = JSON.stringify(prepared); } await AsyncStorage.setItem(STORAGE_KEY, raw); } catch (error) { if (this.options.debug) console.warn(\"[SmartObserve] could not persist offline queue\", error); } }\n private async send(events: ObserveEvent[]) { const body = JSON.stringify({ schemaVersion: 1, envelopeId: id(), sentAt: Date.now(), sdk: { name: SDK_NAME, version: SDK_VERSION }, environment: this.options.environment, release: this.options.release, dist: this.options.dist, events }); let attempt = 0; while (true) { const response = await fetch(this.options.endpoint, { method: \"POST\", headers: { \"content-type\": \"application/json\", \"origin\": \"smartobserve-expo://native\", \"x-smartobserve-key\": this.options.key, \"x-smartobserve-platform\": \"expo\", \"x-smartobserve-internal\": \"transport\" }, body }); if (response.ok) return; if (![408, 429].includes(response.status) && response.status < 500) return; if (attempt++ >= 5) throw new Error(`HTTP ${response.status}`); await new Promise((resolve) => setTimeout(resolve, Math.random() * Math.min(30_000, 2 ** attempt * 1_000))); } }\n private evict() { const index = this.queue.findIndex((event) => event.type === \"span\" || event.type === \"performance\" || event.level === \"debug\"); this.queue.splice(index < 0 ? 0 : index, 1); }\n}\n","export const SDK_NAME = \"@smarthivelabs-devs/observe-expo\";\nexport const SDK_VERSION = \"26.1.0\";\n","import { SmartObserveExpoClient } from \"./client.js\";\nimport type { SmartObserveConfig } from \"./types.js\";\nlet client: SmartObserveExpoClient | undefined;\nexport const SmartObserve = { init(config: SmartObserveConfig = {}) { return client ??= new SmartObserveExpoClient(config); }, captureException(error: unknown, hint?: Record<string, unknown>) { return active().captureException(error, hint); }, captureMessage(message: string, level?: import(\"./types.js\").Level, metadata?: Record<string, unknown>) { return active().captureMessage(message, level, metadata); }, addBreadcrumb(value: import(\"./types.js\").Breadcrumb) { active().addBreadcrumb(value); }, setUser(value: import(\"./types.js\").ObserveUser | null) { active().setUser(value); }, setTag(key: string, value: string | null) { active().setTag(key, value); }, setContext(key: string, value: Record<string, unknown> | null) { active().setContext(key, value); }, startSpan<T>(options: import(\"./types.js\").SpanOptions, callback: (span: import(\"./types.js\").ObserveSpan) => T | Promise<T>) { return active().startSpan(options, callback); }, trackScreen(name: string, params?: Record<string, unknown>) { active().trackScreen(name, params); }, beforeSend(callback: import(\"./types.js\").BeforeSend) { active().beforeSend(callback); }, flush() { return active().flush(); }, async close() { await client?.close(); client = undefined; }, get log() { return active().log; } };\nfunction active() { return client ??= new SmartObserveExpoClient({ enabled: false }); }\nexport { SmartObserveExpoClient } from \"./client.js\"; export * from \"./types.js\";\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAAkB;;;ACAlB,0BAAmC;AACnC,kBAA6B;AAC7B,4BAAsB;AACtB,aAAwB;;;ACHjB,SAAS,KAAK;AAAE,SAAO,OAAO,WAAW;AAAG;AAC5C,SAAS,UAAU,OAAe;AAAE,SAAO,CAAC,GAAG,OAAO,gBAAgB,IAAI,WAAW,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,UAAU,MAAM,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,EAAE,KAAK,EAAE;AAAG;AAC5J,SAAS,SAAS,OAAe;AAAE,QAAM,MAAM,IAAI,IAAI,KAAK;AAAG,QAAM,MAAM,mBAAmB,IAAI,QAAQ;AAAG,MAAI,CAAC,+BAA+B,KAAK,GAAG,EAAG,OAAM,IAAI,MAAM,kDAAkD;AAAG,QAAM,OAAO,IAAI,SAAS,QAAQ,cAAc,EAAE;AAAG,MAAI,CAAC,KAAM,OAAM,IAAI,MAAM,8CAA8C;AAAG,SAAO,EAAE,UAAU,GAAG,IAAI,QAAQ,KAAK,IAAI,IAAI,oBAAoB,IAAI;AAAG;AACnb,IAAM,UAAU,oBAAI,IAAI,CAAC,YAAY,YAAY,iBAAiB,UAAU,gBAAgB,iBAAiB,WAAW,UAAU,eAAe,eAAe,OAAO,KAAK,CAAC;AACtK,SAAS,SAAY,OAAU,QAAkB,CAAC,GAAM;AAAE,QAAM,UAAU,oBAAI,IAAI,CAAC,GAAG,SAAS,GAAG,MAAM,IAAI,CAAC,UAAU,MAAM,YAAY,CAAC,CAAC,CAAC;AAAG,QAAM,OAAO,oBAAI,QAAgB;AAAG,QAAM,OAAO,CAAC,OAAgB,UAA2B;AAAE,QAAI,QAAQ,EAAG,QAAO;AAAe,QAAI,OAAO,UAAU,SAAU,QAAO,MAAM,MAAM,GAAG,IAAK;AAAG,QAAI,UAAU,QAAQ,OAAO,UAAU,SAAU,QAAO;AAAO,QAAI,KAAK,IAAI,KAAK,EAAG,QAAO;AAAc,SAAK,IAAI,KAAK;AAAG,QAAI,MAAM,QAAQ,KAAK,EAAG,QAAO,MAAM,MAAM,GAAG,GAAG,EAAE,IAAI,CAAC,UAAU,KAAK,OAAO,QAAQ,CAAC,CAAC;AAAG,WAAO,OAAO,YAAY,OAAO,QAAQ,KAAK,EAAE,MAAM,GAAG,GAAG,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,QAAQ,IAAI,IAAI,YAAY,EAAE,QAAQ,WAAW,GAAG,CAAC,IAAI,eAAe,KAAK,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC;AAAA,EAAG;AAAG,SAAO,KAAK,OAAO,CAAC;AAAQ;AACnwB,SAAS,QAAQ,OAAe;AAAE,MAAI;AAAE,UAAM,MAAM,IAAI,IAAI,KAAK;AAAG,QAAI,WAAW;AAAI,QAAI,WAAW;AAAI,eAAW,OAAO,CAAC,GAAG,IAAI,aAAa,KAAK,CAAC,EAAG,KAAI,aAAa,IAAI,KAAK,YAAY;AAAG,WAAO,IAAI,SAAS;AAAA,EAAG,QAAQ;AAAE,WAAO;AAAA,EAAiB;AAAE;;;ACLrQ,2BAAyB;AACzB,qBAAoB;;;ACDb,IAAM,WAAW;AACjB,IAAM,cAAc;;;ADI3B,IAAM,cAAc;AAEb,IAAM,gBAAN,MAAoB;AAAA,EAEzB,YAA6B,SAAkB;AAAlB;AAAoB,SAAK,QAAQ,YAAY,MAAM,KAAK,KAAK,MAAM,GAAG,QAAQ,eAAe;AAAG,SAAK,cAAc,eAAAA,QAAQ,iBAAiB,CAAC,UAAU;AAAE,WAAK,SAAS,MAAM,gBAAgB;AAAO,UAAI,KAAK,OAAQ,MAAK,KAAK,MAAM;AAAA,IAAG,CAAC;AAAG,SAAK,KAAK,QAAQ;AAAA,EAAG;AAAA,EAAjQ;AAAA,EADrB,QAAwB,CAAC;AAAA,EAAW;AAAA,EAAgD;AAAA,EAAkC,SAAS;AAAA,EAAc;AAAA,EAAkC,SAAS;AAAA,EAEhM,QAAQ,OAAqB;AAAE,QAAI,KAAK,OAAQ;AAAQ,QAAI,KAAK,MAAM,UAAU,KAAK,QAAQ,aAAc,MAAK,MAAM;AAAG,SAAK,MAAM,KAAK,KAAK;AAAG,SAAK,KAAK,QAAQ;AAAG,QAAI,KAAK,MAAM,UAAU,MAAM,MAAM,UAAU,QAAS,MAAK,KAAK,MAAM;AAAA,EAAG;AAAA,EAClP,MAAM,QAAQ;AAAE,QAAI,KAAK,YAAY,CAAC,KAAK,MAAM,UAAU,CAAC,KAAK,OAAQ,QAAO,KAAK;AAAU,UAAM,SAAS,KAAK,MAAM,OAAO,GAAG,EAAE;AAAG,SAAK,WAAW,KAAK,KAAK,MAAM,EAAE,KAAK,MAAM,KAAK,QAAQ,CAAC,EAAE,MAAM,CAAC,UAAU;AAAE,WAAK,MAAM,QAAQ,GAAG,MAAM;AAAG,WAAK,KAAK,QAAQ;AAAG,UAAI,KAAK,QAAQ,MAAO,SAAQ,KAAK,yCAAyC,KAAK;AAAA,IAAG,CAAC,EAAE,QAAQ,MAAM;AAAE,WAAK,WAAW;AAAA,IAAW,CAAC;AAAG,WAAO,KAAK;AAAA,EAAU;AAAA,EAC1a,MAAM,QAAQ;AAAE,SAAK,SAAS;AAAM,QAAI,KAAK,MAAO,eAAc,KAAK,KAAK;AAAG,SAAK,cAAc;AAAG,UAAM,KAAK,MAAM;AAAA,EAAG;AAAA,EACzH,MAAc,UAAU;AAAE,QAAI;AAAE,YAAM,MAAM,MAAM,qBAAAC,QAAa,QAAQ,WAAW;AAAG,UAAI,CAAC,IAAK;AAAQ,YAAM,SAAS,KAAK,MAAM,GAAG;AAAmD,WAAK,MAAM,KAAK,GAAG,OAAO,OAAO,CAAC,UAAU,KAAK,IAAI,KAAK,MAAM,aAAa,MAAM,aAAa,IAAI,KAAU,EAAE,MAAM,CAAC,KAAK,QAAQ,YAAY,CAAC;AAAG,YAAM,KAAK,MAAM;AAAA,IAAG,SAAS,OAAO;AAAE,UAAI,KAAK,QAAQ,MAAO,SAAQ,KAAK,4CAA4C,KAAK;AAAA,IAAG;AAAA,EAAE;AAAA,EAC5c,MAAc,UAAyB;AAAE,QAAI;AAAE,UAAI,WAAW,KAAK,MAAM,IAAI,CAAC,WAAW,EAAE,GAAG,OAAO,WAAW,KAAK,IAAI,EAAE,EAAE;AAAG,UAAI,MAAM,KAAK,UAAU,QAAQ;AAAG,aAAO,IAAI,SAAS,KAAK,OAAO,QAAQ,KAAK,MAAM,QAAQ;AAAE,aAAK,MAAM;AAAG,mBAAW,KAAK,MAAM,IAAI,CAAC,WAAW,EAAE,GAAG,OAAO,WAAW,KAAK,IAAI,EAAE,EAAE;AAAG,cAAM,KAAK,UAAU,QAAQ;AAAA,MAAG;AAAE,YAAM,qBAAAA,QAAa,QAAQ,aAAa,GAAG;AAAA,IAAG,SAAS,OAAO;AAAE,UAAI,KAAK,QAAQ,MAAO,SAAQ,KAAK,kDAAkD,KAAK;AAAA,IAAG;AAAA,EAAE;AAAA,EAC/f,MAAc,KAAK,QAAwB;AAAE,UAAM,OAAO,KAAK,UAAU,EAAE,eAAe,GAAG,YAAY,GAAG,GAAG,QAAQ,KAAK,IAAI,GAAG,KAAK,EAAE,MAAM,UAAU,SAAS,YAAY,GAAG,aAAa,KAAK,QAAQ,aAAa,SAAS,KAAK,QAAQ,SAAS,MAAM,KAAK,QAAQ,MAAM,OAAO,CAAC;AAAG,QAAI,UAAU;AAAG,WAAO,MAAM;AAAE,YAAM,WAAW,MAAM,MAAM,KAAK,QAAQ,UAAU,EAAE,QAAQ,QAAQ,SAAS,EAAE,gBAAgB,oBAAoB,UAAU,8BAA8B,sBAAsB,KAAK,QAAQ,KAAK,2BAA2B,QAAQ,2BAA2B,YAAY,GAAG,KAAK,CAAC;AAAG,UAAI,SAAS,GAAI;AAAQ,UAAI,CAAC,CAAC,KAAK,GAAG,EAAE,SAAS,SAAS,MAAM,KAAK,SAAS,SAAS,IAAK;AAAQ,UAAI,aAAa,EAAG,OAAM,IAAI,MAAM,QAAQ,SAAS,MAAM,EAAE;AAAG,YAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,KAAK,OAAO,IAAI,KAAK,IAAI,KAAQ,KAAK,UAAU,GAAK,CAAC,CAAC;AAAA,IAAG;AAAA,EAAE;AAAA,EACn2B,QAAQ;AAAE,UAAM,QAAQ,KAAK,MAAM,UAAU,CAAC,UAAU,MAAM,SAAS,UAAU,MAAM,SAAS,iBAAiB,MAAM,UAAU,OAAO;AAAG,SAAK,MAAM,OAAO,QAAQ,IAAI,IAAI,OAAO,CAAC;AAAA,EAAG;AAClM;;;AFPO,IAAM,yBAAN,MAA6B;AAAA,EAC1B;AAAA,EAA2K;AAAA,EAAmC;AAAA,EAA4B,OAA+B,CAAC;AAAA,EAAW,WAAoC,CAAC;AAAA,EAAW,cAA4B,CAAC;AAAA,EAAW;AAAA,EAA8B;AAAA,EAAqC,WAA8B,CAAC;AAAA,EAAW,YAAY,GAAG;AAAA,EAAW,iBAAiB,KAAK,IAAI;AAAA,EACthB,YAAY,QAA4B,CAAC,GAAG;AAAE,SAAK,SAAS,EAAE,GAAG,OAAO,aAAa,MAAM,eAAe,cAAc,SAAS,MAAM,WAAW,QAAQ,MAAM,GAAG,GAAG,OAAO,MAAM,SAAS,OAAO,kBAAkB,MAAM,oBAAoB,MAAM,cAAc,KAAK,iBAAiB,MAAM,mBAAmB,GAAG,gBAAgB,MAAM,kBAAkB,IAAI;AAAG,SAAK,iBAAiB,MAAM;AAAY,QAAI,KAAK,OAAO,WAAW,MAAM,KAAK;AAAE,YAAM,SAAS,SAAS,MAAM,GAAG;AAAG,WAAK,YAAY,IAAI,cAAc,EAAE,GAAG,QAAQ,aAAa,KAAK,OAAO,aAAa,SAAS,MAAM,WAAuB,wCAA4B,QAAW,MAAM,MAAM,QAAoB,kCAAsB,QAAW,cAAc,MAAM,gBAAgB,KAAO,iBAAiB,MAAM,mBAAmB,KAAO,OAAO,KAAK,OAAO,MAAM,CAAC;AAAG,WAAK,MAAM,OAAO,QAAQ;AAAA,IAAG;AAAA,EAAE;AAAA,EACp1B,iBAAiB,OAAgB,OAAgC,CAAC,GAAG;AAAE,UAAM,UAAU,GAAG;AAAG,QAAI,KAAK,OAAO,KAAK,KAAK,OAAO,iBAAiB;AAAE,YAAM,YAAY,UAAU,KAAK;AAAG,WAAK,KAAK,QAAQ,EAAE,GAAG,KAAK,KAAK,OAAO,GAAG,SAAS,SAAS,UAAU,OAAO,OAAO,SAAS,YAAY,CAAC,SAAS,GAAG,UAAU,KAAK,CAAC;AAAA,IAAG;AAAE,WAAO;AAAA,EAAS;AAAA,EACjV,eAAe,SAAiB,QAAe,QAAQ,UAAoC;AAAE,UAAM,UAAU,GAAG;AAAG,SAAK,KAAK,QAAQ,EAAE,GAAG,KAAK,KAAK,KAAK,GAAG,SAAS,SAAS,OAAO,SAAS,CAAC;AAAG,WAAO;AAAA,EAAS;AAAA,EAClN,MAAM,EAAE,OAAO,CAAC,GAAW,MAAgC,KAAK,eAAe,GAAG,SAAS,CAAC,GAAG,MAAM,CAAC,GAAW,MAAgC,KAAK,eAAe,GAAG,QAAQ,CAAC,GAAG,MAAM,CAAC,GAAW,MAAgC,KAAK,eAAe,GAAG,QAAQ,CAAC,GAAG,OAAO,CAAC,GAAW,MAAgC,KAAK,eAAe,GAAG,SAAS,CAAC,EAAE;AAAA,EAC/V,cAAc,OAAmB;AAAE,SAAK,YAAY,KAAK,EAAE,GAAG,SAAS,OAAO,KAAK,OAAO,UAAU,GAAG,WAAW,MAAM,aAAa,KAAK,IAAI,EAAE,CAAC;AAAG,SAAK,YAAY,OAAO,GAAG,KAAK,IAAI,GAAG,KAAK,YAAY,SAAS,KAAK,OAAO,cAAc,CAAC;AAAA,EAAG;AAAA,EACnP,QAAQ,OAA2B;AAAE,SAAK,OAAO,QAAQ,SAAS,OAAO,KAAK,OAAO,UAAU,IAAI;AAAA,EAAW;AAAA,EAC9G,OAAO,KAAa,OAAsB;AAAE,QAAI,UAAU,KAAM,QAAO,KAAK,KAAK,GAAG;AAAA,QAAQ,MAAK,KAAK,IAAI,MAAM,GAAG,EAAE,CAAC,IAAI,MAAM,MAAM,GAAG,GAAG;AAAA,EAAG;AAAA,EAC/I,WAAW,KAAa,OAAuC;AAAE,QAAI,UAAU,KAAM,QAAO,KAAK,SAAS,GAAG;AAAA,QAAQ,MAAK,SAAS,GAAG,IAAI,SAAS,OAAO,KAAK,OAAO,UAAU;AAAA,EAAG;AAAA,EACnL,WAAW,UAAsB;AAAE,SAAK,iBAAiB;AAAA,EAAU;AAAA,EACnE,UAAa,SAAsB,UAAiE;AAAE,UAAM,WAAW,KAAK;AAAO,UAAM,QAAsB,EAAE,SAAS,QAAQ,QAAQ,WAAW,UAAU,WAAW,UAAU,EAAE,GAAG,QAAQ,UAAU,CAAC,GAAG,cAAc,QAAQ,QAAQ,UAAU,UAAU,QAAQ,SAAS,QAAQ,WAAW,UAAU,WAAW,KAAK,OAAO,IAAI,KAAK,OAAO,iBAAiB;AAAG,UAAM,QAAQ,KAAK,IAAI;AAAG,UAAM,aAAa,EAAE,GAAI,QAAQ,cAAc,CAAC,EAAG;AAAG,QAAI,SAAmD;AAAW,QAAI,QAAQ;AAAO,UAAM,OAAoB,EAAE,SAAS,MAAM,SAAS,QAAQ,MAAM,QAAQ,cAAc,CAAC,KAAK,UAAU;AAAE,iBAAW,GAAG,IAAI;AAAA,IAAO,GAAG,WAAW,CAAC,UAAU;AAAE,eAAS;AAAA,IAAO,GAAG,iBAAiB,CAAC,UAAU;AAAE,eAAS;AAAS,WAAK,iBAAiB,KAAK;AAAA,IAAG,GAAG,KAAK,MAAM;AAAE,UAAI,CAAC,SAAS,MAAM,SAAS;AAAE,gBAAQ;AAAM,cAAM,SAAS,CAAC,MAAM;AAAc,aAAK,KAAK,QAAQ,EAAE,GAAG,KAAK,KAAK,SAAS,gBAAgB,MAAM,GAAG,MAAM,QAAQ,MAAM,WAAW,QAAQ,WAAW,gBAAgB,OAAO,cAAc,KAAK,IAAI,GAAG,QAAQ,GAAI,SAAS,CAAC,IAAI,EAAE,WAAW,GAAI,MAAM,CAAC;AAAA,MAAG;AAAA,IAAE,EAAE;AAAG,SAAK,QAAQ;AAAO,QAAI;AAAE,YAAM,SAAS,SAAS,IAAI;AAAG,UAAI,UAAU,OAAQ,OAAsB,SAAS,WAAY,QAAQ,OAAsB,KAAK,CAAC,UAAU;AAAE,YAAI,WAAW,UAAW,UAAS;AAAM,aAAK,IAAI;AAAG,eAAO;AAAA,MAAO,GAAG,CAAC,UAAU;AAAE,aAAK,gBAAgB,KAAK;AAAG,aAAK,IAAI;AAAG,cAAM;AAAA,MAAO,CAAC,EAAE,QAAQ,MAAM;AAAE,aAAK,QAAQ;AAAA,MAAU,CAAC;AAAG,UAAI,WAAW,UAAW,UAAS;AAAM,WAAK,IAAI;AAAG,aAAO;AAAA,IAAQ,UAAE;AAAU,UAAI,KAAK,OAAO,WAAW,MAAM,OAAQ,MAAK,QAAQ;AAAA,IAAU;AAAA,EAAE;AAAA,EACpnD,QAAQ;AAAE,WAAO,KAAK,WAAW,MAAM,KAAK,QAAQ,QAAQ;AAAA,EAAG;AAAA,EAAE,MAAM,QAAQ;AAAE,eAAW,WAAW,KAAK,SAAS,OAAO,CAAC,EAAG,SAAQ;AAAG,UAAM,KAAK,WAAW,MAAM;AAAA,EAAG;AAAA,EAC1K,YAAY,MAAc,QAAkC;AAAE,SAAK,cAAc,EAAE,UAAU,cAAc,SAAS,MAAM,MAAM,OAAO,CAAC;AAAA,EAAG;AAAA,EACnI,KAAK,MAA0C;AAAE,WAAO,EAAE,SAAS,GAAG,GAAG,MAAM,WAAW,KAAK,IAAI,GAAG,UAAU,QAAQ,MAAM,UAAU,KAAK,MAAM,KAAK,OAAO,cAAc,GAAG,MAAM,EAAE,GAAG,KAAK,KAAK,GAAG,UAAU,SAAS,EAAE,GAAG,KAAK,UAAU,QAAQ,EAAE,OAAc,cAAO,OAAc,kBAAW,YAAmB,mBAAY,IAAI,6BAAS,IAAI,WAAW,6BAAS,SAAS,UAAiB,gBAAS,GAAG,KAAK,EAAE,IAAgB,2BAAe,MAAkB,6BAAiB,SAAqB,sCAA0B,OAAmB,gCAAoB,gBAAgB,sBAAAC,QAAU,YAAY,eAAe,EAAE,GAAG,KAAK,OAAO,UAAU,GAAG,aAAa,CAAC,GAAG,KAAK,WAAW,GAAG,OAAO,KAAK,MAAM;AAAA,EAAG;AAAA,EACpsB,MAAc,QAAQ,KAAmB;AAAE,QAAI,CAAC,KAAK,UAAW;AAAQ,QAAI;AAAE,UAAI,QAAQ,SAAS,KAAK,KAAK,OAAO,UAAU;AAAG,UAAI,KAAK,eAAgB,SAAQ,MAAM,KAAK,eAAe,KAAK;AAAmB,UAAI,MAAO,MAAK,UAAU,QAAQ,KAAK;AAAA,IAAG,SAAS,OAAO;AAAE,UAAI,KAAK,OAAO,MAAO,SAAQ,KAAK,gCAAgC,KAAK;AAAA,IAAG;AAAA,EAAE;AAAA,EACtV,MAAM,UAAkB;AAAE,UAAM,WAAW,OAAO,eAAe,cAAc,WAAW,iBAAiB,IAAI;AAAW,QAAI,YAAY,OAAO,eAAe,aAAa;AAAE,iBAAW,iBAAiB,CAAC,OAAO,UAAU;AAAE,aAAK,iBAAiB,OAAO,EAAE,WAAW,uBAAuB,MAAM,CAAC;AAAG,YAAI,MAAO,MAAK,KAAK,QAAQ,EAAE,GAAG,KAAK,KAAK,SAAS,GAAG,WAAW,KAAK,WAAW,WAAW,KAAK,gBAAgB,SAAS,KAAK,IAAI,GAAG,QAAQ,UAAU,CAAC;AAAG,iBAAS,OAAO,KAAK;AAAA,MAAG,CAAC;AAAG,WAAK,SAAS,KAAK,MAAM,WAAW,iBAAiB,QAAQ,CAAC;AAAA,IAAG;AAAE,QAAI,KAAK,OAAO,mBAAmB,OAAO;AAAE,YAAM,MAAM,6BAAS,iBAAiB,UAAU,CAAC,UAAU;AAAE,aAAK,cAAc,EAAE,UAAU,iBAAiB,SAAS,MAAM,CAAC;AAAG,YAAI,UAAU,SAAU,MAAK,KAAK,MAAM;AAAG,YAAI,UAAU,gBAAgB,UAAU,WAAY,MAAK,KAAK,QAAQ,EAAE,GAAG,KAAK,KAAK,SAAS,GAAG,WAAW,KAAK,WAAW,WAAW,KAAK,gBAAgB,SAAS,KAAK,IAAI,GAAG,QAAQ,SAAS,CAAC;AAAA,MAAG,CAAC;AAAG,WAAK,SAAS,KAAK,MAAM,IAAI,OAAO,CAAC;AAAA,IAAG;AAAE,QAAI,KAAK,OAAO,iBAAiB,MAAO,MAAK,WAAW,QAAQ;AAAG,SAAK,KAAK,QAAQ,EAAE,GAAG,KAAK,KAAK,SAAS,GAAG,WAAW,KAAK,WAAW,WAAW,KAAK,gBAAgB,QAAQ,SAAS,CAAC;AAAA,EAAG;AAAA,EAClrC,WAAW,UAAkB;AAAE,UAAM,WAAW,WAAW;AAAO,UAAMC,UAAS;AAAM,eAAW,QAAQ,eAAe,OAA0B,MAAoB;AAAE,YAAM,MAAM,OAAO,UAAU,WAAW,QAAQ,iBAAiB,MAAM,MAAM,OAAO,MAAM;AAAK,UAAI,IAAI,WAAW,QAAQ,KAAM,MAAM,WAAW,IAAI,QAAQ,KAAK,OAAsB,EAAE,IAAI,yBAAyB,EAAI,QAAO,SAAS,OAAsB,IAAI;AAAG,YAAM,UAAU,KAAK,IAAI;AAAG,YAAM,SAAS,MAAM,WAAW,OAAO,UAAU,YAAY,YAAY,QAAS,MAAkB,SAAS;AAAQ,MAAAA,QAAO,cAAc,EAAE,UAAU,QAAQ,SAAS,GAAG,MAAM,IAAI,QAAQ,GAAG,CAAC,IAAI,MAAM,EAAE,QAAQ,KAAK,QAAQ,GAAG,EAAE,EAAE,CAAC;AAAG,YAAM,UAAU,IAAI,QAAQ,MAAM,YAAY,OAAO,UAAU,YAAY,aAAa,QAAS,MAAkB,UAAU,OAAU;AAAG,UAAI,QAAQ,KAAKA,QAAO,OAAO,4BAA4B,KAAKA,QAAO,MAAO,SAAQ,IAAI,eAAe,MAAMA,QAAO,MAAM,OAAO,IAAIA,QAAO,MAAM,MAAM,IAAIA,QAAO,MAAM,UAAU,OAAO,IAAI,EAAE;AAAG,UAAI;AAAE,cAAM,WAAW,MAAM,SAAS,OAAsB,EAAE,GAAG,MAAM,QAAQ,CAAC;AAAG,aAAKA,QAAO,QAAQ,EAAE,GAAGA,QAAO,KAAK,aAAa,GAAG,QAAQ,wBAAwB,OAAO,KAAK,IAAI,IAAI,SAAS,MAAM,MAAM,OAAO,QAAQ,GAAG,GAAG,UAAU,EAAE,QAAQ,QAAQ,SAAS,OAAO,EAAE,CAAC;AAAG,eAAO;AAAA,MAAU,SAAS,OAAO;AAAE,QAAAA,QAAO,iBAAiB,OAAO,EAAE,WAAW,SAAS,KAAK,QAAQ,GAAG,GAAG,OAAO,CAAC;AAAG,cAAM;AAAA,MAAO;AAAA,IAAE;AAAmB,SAAK,SAAS,KAAK,MAAM;AAAE,iBAAW,QAAQ;AAAA,IAAU,CAAC;AAAA,EAAG;AAC9/C;AACA,SAAS,QAAQ,OAAe,UAAmC;AAAE,SAAO,UAAU,KAAK,CAAC,YAAY,OAAO,YAAY,WAAW,MAAM,WAAW,OAAO,IAAI,QAAQ,KAAK,KAAK,CAAC,KAAK;AAAO;AACjM,SAAS,UAAU,OAAgB;AAAE,MAAI,EAAE,iBAAiB,OAAQ,QAAO,EAAE,MAAM,OAAO,OAAO,OAAO,OAAO,UAAU,WAAW,QAAQ,OAAO,KAAK,GAAG,SAAS,MAAM,WAAW,SAAS;AAAG,SAAO,EAAE,MAAM,MAAM,MAAM,OAAO,MAAM,SAAS,SAAS,MAAM,WAAW,UAAU,aAAa,MAAM,SAAS,IAAI,MAAM,IAAI,EAAE,MAAM,GAAG,GAAG,EAAE,IAAI,CAAC,SAAS;AAAE,UAAM,QAAQ,KAAK,MAAM,gDAAgD;AAAG,WAAO,QAAQ,EAAE,UAAU,MAAM,CAAC,KAAK,eAAe,UAAU,MAAM,CAAC,GAAG,MAAM,OAAO,MAAM,CAAC,CAAC,GAAG,QAAQ,OAAO,MAAM,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,SAAS,cAAc,EAAE,IAAI,EAAE,UAAU,KAAK,KAAK,EAAE;AAAA,EAAG,CAAC,EAAE;AAAG;AACxnB,SAAS,UAAU,MAA+B,gBAA0B;AAAE,MAAI,CAAC,KAAM,QAAO;AAAW,MAAI,eAAgB,QAAO;AAAM,SAAO,EAAE,IAAI,KAAK,IAAI,UAAU,KAAK,SAAS;AAAG;;;AI7B7L,IAAI;AACG,IAAM,eAAe,EAAE,KAAK,SAA6B,CAAC,GAAG;AAAE,SAAO,WAAW,IAAI,uBAAuB,MAAM;AAAG,GAAG,iBAAiB,OAAgB,MAAgC;AAAE,SAAO,OAAO,EAAE,iBAAiB,OAAO,IAAI;AAAG,GAAG,eAAe,SAAiB,OAAoC,UAAoC;AAAE,SAAO,OAAO,EAAE,eAAe,SAAS,OAAO,QAAQ;AAAG,GAAG,cAAc,OAAwC;AAAE,SAAO,EAAE,cAAc,KAAK;AAAG,GAAG,QAAQ,OAAgD;AAAE,SAAO,EAAE,QAAQ,KAAK;AAAG,GAAG,OAAO,KAAa,OAAsB;AAAE,SAAO,EAAE,OAAO,KAAK,KAAK;AAAG,GAAG,WAAW,KAAa,OAAuC;AAAE,SAAO,EAAE,WAAW,KAAK,KAAK;AAAG,GAAG,UAAa,SAA2C,UAAsE;AAAE,SAAO,OAAO,EAAE,UAAU,SAAS,QAAQ;AAAG,GAAG,YAAY,MAAc,QAAkC;AAAE,SAAO,EAAE,YAAY,MAAM,MAAM;AAAG,GAAG,WAAW,UAA2C;AAAE,SAAO,EAAE,WAAW,QAAQ;AAAG,GAAG,QAAQ;AAAE,SAAO,OAAO,EAAE,MAAM;AAAG,GAAG,MAAM,QAAQ;AAAE,QAAM,QAAQ,MAAM;AAAG,WAAS;AAAW,GAAG,IAAI,MAAM;AAAE,SAAO,OAAO,EAAE;AAAK,EAAE;AACnvC,SAAS,SAAS;AAAE,SAAO,WAAW,IAAI,uBAAuB,EAAE,SAAS,MAAM,CAAC;AAAG;;;ALA/E,IAAM,4BAAN,cAAwC,aAAAC,QAAM,UAAiD;AAAA,EAAW,QAAe,CAAC;AAAA,EAAG,OAAO,yBAAyB,OAAqB;AAAE,WAAO,EAAE,MAAM;AAAA,EAAG;AAAA,EAAW,kBAAkB,OAAc,MAAuB;AAAE,iBAAa,iBAAiB,OAAO,EAAE,WAAW,wBAAwB,gBAAgB,KAAK,eAAe,CAAC;AAAG,SAAK,MAAM,UAAU,KAAK;AAAA,EAAG;AAAA,EAAW,SAAS;AAAE,QAAI,CAAC,KAAK,MAAM,MAAO,QAAO,KAAK,MAAM;AAAU,WAAO,OAAO,KAAK,MAAM,aAAa,aAAa,KAAK,MAAM,SAAS,KAAK,MAAM,KAAK,IAAI,KAAK,MAAM,YAAY;AAAA,EAAM;AAAE;","names":["NetInfo","AsyncStorage","Constants","client","React"]}
package/dist/react.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  SmartObserve
3
- } from "./chunk-HNIEV66S.js";
3
+ } from "./chunk-HDKJGFST.js";
4
4
 
5
5
  // src/react.tsx
6
6
  import React from "react";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@smarthivelabs-devs/observe-expo",
3
- "version": "26.0.0",
3
+ "version": "26.1.0",
4
4
  "description": "SmartObserve SDK for Expo and React Native",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -40,28 +40,23 @@
40
40
  "app.plugin.cjs"
41
41
  ],
42
42
  "dependencies": {
43
- "@expo/config-plugins": "^10.1.2"
44
- },
45
- "peerDependencies": {
43
+ "@expo/config-plugins": "^10.1.2",
46
44
  "@react-native-async-storage/async-storage": "^2.2.0",
47
45
  "@react-native-community/netinfo": "^11.4.1",
48
- "expo": ">=57.0.0",
49
46
  "expo-application": "^7.0.7",
50
47
  "expo-constants": "^18.0.10",
51
- "expo-device": "^8.0.9",
48
+ "expo-device": "^8.0.9"
49
+ },
50
+ "peerDependencies": {
51
+ "expo": ">=57.0.0",
52
52
  "react": ">=19.2.0",
53
53
  "react-native": ">=0.86.0"
54
54
  },
55
55
  "devDependencies": {
56
56
  "@changesets/cli": "^2.29.7",
57
- "@react-native-async-storage/async-storage": "^2.2.0",
58
- "@react-native-community/netinfo": "^11.4.1",
59
57
  "@types/node": "^22.15.0",
60
58
  "@types/react": "^19.2.2",
61
59
  "expo": "^57.0.0",
62
- "expo-application": "^7.0.7",
63
- "expo-constants": "^18.0.10",
64
- "expo-device": "^8.0.9",
65
60
  "react": "^19.2.0",
66
61
  "react-native": "^0.86.0",
67
62
  "tsup": "^8.5.0",