@debugkit/sdk 0.1.0 → 0.2.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 +55 -3
- package/dist/{chunk-3UN5VMQU.js → chunk-3WRI3DI2.js} +5 -5
- package/dist/chunk-3WRI3DI2.js.map +1 -0
- package/dist/chunk-5C7KJJNO.js +651 -0
- package/dist/chunk-5C7KJJNO.js.map +1 -0
- package/dist/chunk-EGCXLOFH.cjs +663 -0
- package/dist/chunk-EGCXLOFH.cjs.map +1 -0
- package/dist/{chunk-BD2FNVCP.js → chunk-HO3JW55K.js} +15 -7
- package/dist/chunk-HO3JW55K.js.map +1 -0
- package/dist/{chunk-NSWUGBA2.cjs → chunk-NJ6DTUVX.cjs} +20 -12
- package/dist/chunk-NJ6DTUVX.cjs.map +1 -0
- package/dist/{chunk-KUJ4EW3D.cjs → chunk-YELZOB7J.cjs} +10 -10
- package/dist/chunk-YELZOB7J.cjs.map +1 -0
- package/dist/client-ekzlpWIR.d.cts +220 -0
- package/dist/client-ekzlpWIR.d.ts +220 -0
- package/dist/expo-router.cjs +4 -4
- package/dist/expo-router.d.cts +1 -1
- package/dist/expo-router.d.ts +1 -1
- package/dist/expo-router.js +2 -2
- package/dist/expo.cjs +13 -13
- package/dist/expo.d.cts +1 -1
- package/dist/expo.d.ts +1 -1
- package/dist/expo.js +5 -5
- package/dist/index.cjs +12 -8
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +1 -1
- package/dist/node.cjs +69 -14
- package/dist/node.cjs.map +1 -1
- package/dist/node.d.cts +4 -7
- package/dist/node.d.ts +4 -7
- package/dist/node.js +55 -5
- package/dist/node.js.map +1 -1
- package/dist/react-native.cjs +10 -10
- package/dist/react-native.d.cts +1 -1
- package/dist/react-native.d.ts +1 -1
- package/dist/react-native.js +3 -3
- package/dist/react.cjs +6 -6
- package/dist/react.d.cts +1 -1
- package/dist/react.d.ts +1 -1
- package/dist/react.js +2 -2
- package/package.json +2 -2
- package/dist/chunk-3UN5VMQU.js.map +0 -1
- package/dist/chunk-BD2FNVCP.js.map +0 -1
- package/dist/chunk-KUJ4EW3D.cjs.map +0 -1
- package/dist/chunk-NSWUGBA2.cjs.map +0 -1
- package/dist/chunk-VIJ5USKQ.js +0 -300
- package/dist/chunk-VIJ5USKQ.js.map +0 -1
- package/dist/chunk-XEFWRCN4.cjs +0 -311
- package/dist/chunk-XEFWRCN4.cjs.map +0 -1
- package/dist/client-drmb0n15.d.cts +0 -103
- package/dist/client-drmb0n15.d.ts +0 -103
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../schema/src/core.ts","../src/context.ts","../src/auto.ts","../src/client.ts","../src/index.ts"],"names":["ua","path","g","_a"],"mappings":"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","file":"chunk-EGCXLOFH.cjs","sourcesContent":["/**\n * Zod-free half of the schema: types, constants and pure helpers.\n * Client code (the SDK) imports only this entry so validators never reach app bundles.\n */\nimport type { Severity, StackFrame } from \"./index\";\n\nexport type {\n Flow,\n Device,\n Context,\n ContextInput,\n Breadcrumb,\n StackFrame,\n Severity,\n ErrorEvent,\n CustomEvent,\n SessionEvent,\n Event,\n EventInput,\n Envelope,\n EnvelopeInput,\n StoredEvent,\n Issue,\n RollupDimension,\n RollupIncrement,\n RollupRow,\n} from \"./index\";\n\nexport const SCHEMA_VERSION = 1;\n\n/* ---------- Severity (shared by ingest + dashboard) ---------- */\n\nexport interface SeverityThresholds {\n critical: number;\n high: number;\n medium: number;\n}\n\n/** Occurrences in the trailing 24h window. */\nexport const DEFAULT_SEVERITY_THRESHOLDS: SeverityThresholds = { critical: 100, high: 25, medium: 5 };\n\nexport function severityFromCount(count: number, t: SeverityThresholds = DEFAULT_SEVERITY_THRESHOLDS): Severity {\n if (count >= t.critical) return \"critical\";\n if (count >= t.high) return \"high\";\n if (count >= t.medium) return \"medium\";\n return \"low\";\n}\n\nexport const SEVERITY_ORDER: Record<Severity, number> = { critical: 3, high: 2, medium: 1, low: 0 };\n\n/* ---------- Stack parsing ---------- */\n\n\n// V8/Hermes: \" at fn (file:line:col)\" or \" at file:line:col\"\nconst V8 = /^\\s*at (?:(.+?) \\()?(.+?):(\\d+):(\\d+)\\)?\\s*$/;\n// JSC/Firefox: \"fn@file:line:col\"\nconst GECKO = /^\\s*(.*?)@(.+?):(\\d+):(\\d+)\\s*$/;\n\nconst NOT_IN_APP = [/node_modules/, /\\bnative\\b/, /\\[native code\\]/, /InternalBytecode/];\n\n/**\n * React Native ships one JS bundle, so every frame points at it: in development a Metro URL\n * (\".../entry.bundle//&platform=ios&dev=true...\"), in release \"address at index.android.bundle\"\n * or \"main.jsbundle\". We can't tell app code from library code without source maps, so bundle\n * frames count as in-app and the function name carries the signal.\n */\nconst RN_BUNDLE = /\\.(?:js)?bundle\\b/;\n\nfunction cleanFile(file: string): string {\n return file.replace(/^address at /, \"\");\n}\n\nexport function parseStack(stack: string | undefined): StackFrame[] {\n if (!stack) return [];\n const frames: StackFrame[] = [];\n for (const raw of stack.split(\"\\n\")) {\n const m = V8.exec(raw) ?? GECKO.exec(raw);\n if (!m) continue;\n const [, fn, rawFile, line, col] = m;\n const file = cleanFile(rawFile ?? \"\");\n frames.push({\n fn: fn || undefined,\n file,\n line: Number(line),\n col: Number(col),\n inApp: RN_BUNDLE.test(file) ? !/^(?:anonymous|eval|global code)$/.test(fn ?? \"\") : !NOT_IN_APP.some((re) => re.test(file)),\n });\n if (frames.length >= 100) break;\n }\n return frames;\n}\n","import type { ContextInput } from \"@debugkit/schema/core\";\n\ntype Shallow<T> = { [K in keyof T]?: T[K] extends object ? Partial<T[K]> : T[K] };\nexport type ContextPatch = Shallow<ContextInput>;\n\n/** Merge two context patches one level deep (os, device, app ... are merged field by field). */\nexport function mergeContext(a: ContextPatch, b: ContextPatch): ContextPatch {\n const out: Record<string, unknown> = { ...a };\n for (const [k, v] of Object.entries(b)) {\n const prev = out[k];\n out[k] = v && typeof v === \"object\" && prev && typeof prev === \"object\" ? { ...prev, ...v } : v ?? prev;\n }\n return out as ContextPatch;\n}\n\nfunction safe<T>(fn: () => T): T | undefined {\n try {\n return fn();\n } catch {\n return undefined;\n }\n}\n\nexport function timezone(): string | undefined {\n return safe(() => Intl.DateTimeFormat().resolvedOptions().timeZone);\n}\nexport function locale(): string | undefined {\n return safe(() => Intl.DateTimeFormat().resolvedOptions().locale);\n}\n\n/**\n * Best-effort context for browsers (React, TanStack Start/Router client, Next client ...).\n * Safe to call in any runtime: it never touches globals that might not exist.\n */\nexport function browserContext(): ContextPatch {\n if (typeof navigator === \"undefined\" || typeof window === \"undefined\") {\n const ua = typeof navigator !== \"undefined\" ? navigator.userAgent : undefined;\n const node = typeof process !== \"undefined\" ? process.versions?.node : undefined;\n return {\n runtime: { name: ua === \"Cloudflare-Workers\" ? \"cloudflare-workers\" : node ? \"node\" : \"edge\", version: node },\n os: { name: \"server\" },\n timezone: timezone(),\n };\n }\n const ua = navigator.userAgent;\n const android = /Android ([\\d.]+)/.exec(ua)?.[1];\n const ios = /(?:iPhone|iPad|iPod).*? OS (\\d+[_\\d]*)/.exec(ua)?.[1];\n const os = android\n ? { name: \"android\", version: android }\n : ios\n ? { name: \"ios\", version: ios.replace(/_/g, \".\") }\n : /Mac OS X/.test(ua)\n ? { name: \"macos\" }\n : /Windows/.test(ua)\n ? { name: \"windows\" }\n : /Linux/.test(ua)\n ? { name: \"linux\" }\n : { name: \"web\" };\n const conn = (navigator as { connection?: { effectiveType?: string; type?: string } }).connection;\n const browser = /Edg\\/([\\d.]+)/.exec(ua)\n ? { name: \"edge\", v: /Edg\\/([\\d.]+)/.exec(ua)![1] }\n : /Chrome\\/([\\d.]+)/.exec(ua)\n ? { name: \"chrome\", v: /Chrome\\/([\\d.]+)/.exec(ua)![1] }\n : /Version\\/([\\d.]+).*Safari/.exec(ua)\n ? { name: \"safari\", v: /Version\\/([\\d.]+)/.exec(ua)![1] }\n : /Firefox\\/([\\d.]+)/.exec(ua)\n ? { name: \"firefox\", v: /Firefox\\/([\\d.]+)/.exec(ua)![1] }\n : undefined;\n return {\n os,\n runtime: { name: \"browser\", version: browser ? `${browser.name} ${browser.v}` : undefined },\n device: {\n type: /iPad|Tablet/.test(ua) ? \"tablet\" : /Mobi/.test(ua) ? \"phone\" : \"desktop\",\n screen: typeof screen !== \"undefined\" ? { width: screen.width, height: screen.height, scale: window.devicePixelRatio } : undefined,\n },\n network: conn\n ? {\n type: conn.type === \"wifi\" ? \"wifi\" : conn.type === \"cellular\" ? \"cellular\" : \"unknown\",\n effectiveType: conn.effectiveType,\n isConnected: navigator.onLine,\n }\n : undefined,\n locale: navigator.language,\n timezone: timezone(),\n };\n}\n","/**\n * Automatic instrumentation installed by `init()`: network requests, console, navigation,\n * clicks and page lifecycle. Every installer is a no-op on platforms that lack the global it\n * patches, and returns a function that undoes the patch.\n */\n\nexport interface RequestInfo {\n method: string;\n url: string;\n status?: number;\n error?: unknown;\n aborted?: boolean;\n timedOut?: boolean;\n durationMs: number;\n /** Stack captured where the request was made, so a failure points at the calling code. */\n stack?: string;\n}\n\n/** What the instrumentation needs from the client. */\nexport interface AutoSink {\n request(info: RequestInfo): void;\n crumb(category: \"navigation\" | \"network\" | \"ui\" | \"log\", message: string, level?: \"debug\" | \"info\" | \"warning\" | \"error\", data?: Record<string, string | number | boolean | null>): void;\n navigated(to: string): void;\n lifecycle(state: \"foreground\" | \"background\"): void;\n ignored(url: string): boolean;\n}\n\ntype Restore = () => void;\nconst g = globalThis as Record<string, any>;\n\n/* ------------------------------- URLs ------------------------------- */\n\nconst ID_SEGMENT = /^(?:\\d+|[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}|[0-9a-f]{16,}|(?=[^/]*\\d)[\\w-]{20,})$/i;\n\n/**\n * \"https://api.x.com/v1/orders/8812?token=abc\" → \"api.x.com/v1/orders/:id\". Query strings and\n * fragments never leave the device (they often carry tokens and personal data), and ids are\n * replaced so requests group by endpoint. Same-origin URLs keep only the path.\n */\nexport function normaliseUrl(raw: string): string {\n const m = /^(?:([a-z][a-z0-9+.-]*:)?\\/\\/([^/?#]*))?([^?#]*)/i.exec(raw.trim());\n let host = m?.[2] ?? \"\";\n const path = (m?.[3] || \"/\").split(\"/\").map((s) => (ID_SEGMENT.test(s) ? \":id\" : s)).join(\"/\");\n if (host.includes(\"@\")) host = host.slice(host.lastIndexOf(\"@\") + 1); // drop user:pass@\n const here = typeof location !== \"undefined\" ? location.host : undefined;\n return !host || host === here ? path : `${host}${path.startsWith(\"/\") ? \"\" : \"/\"}${path}`;\n}\n\n/* ------------------------------ network ----------------------------- */\n\n/** > 0 while the original fetch runs synchronously, so the XHR it uses (React Native) isn't counted twice. */\nlet insideFetch = 0;\n\nexport function instrumentFetch(sink: AutoSink): Restore | undefined {\n const orig = g.fetch as typeof fetch | undefined;\n if (typeof orig !== \"function\" || (orig as { __debug?: boolean }).__debug) return;\n const wrapped = function (this: unknown, input: any, init?: any): Promise<Response> {\n const url = typeof input === \"string\" ? input : (input?.href ?? input?.url ?? String(input));\n if (sink.ignored(url)) return orig.call(this, input, init);\n const method = String(init?.method ?? input?.method ?? \"GET\").toUpperCase();\n const start = Date.now();\n const stack = new Error().stack;\n let p: Promise<Response>;\n insideFetch++;\n try {\n p = orig.call(this, input, init);\n } finally {\n insideFetch--;\n }\n return p.then(\n (res) => {\n sink.request({ method, url, status: res.status, durationMs: Date.now() - start, stack });\n return res;\n },\n (error) => {\n const aborted = (error as { name?: string })?.name === \"AbortError\";\n sink.request({ method, url, error, aborted, durationMs: Date.now() - start, stack });\n throw error;\n },\n );\n };\n (wrapped as { __debug?: boolean }).__debug = true;\n g.fetch = wrapped;\n return () => {\n if (g.fetch === wrapped) g.fetch = orig;\n };\n}\n\ninterface TrackedXhr {\n __debug?: { method: string; url: string } | null;\n status: number;\n addEventListener(type: string, fn: () => void): void;\n}\n\nexport function instrumentXhr(sink: AutoSink): Restore | undefined {\n const X = g.XMLHttpRequest as { prototype: Record<string, any> } | undefined;\n const proto = X?.prototype;\n if (!proto || proto.open.__debug) return;\n const open = proto.open as (...a: unknown[]) => void;\n const send = proto.send as (...a: unknown[]) => void;\n\n const wrappedOpen = function (this: TrackedXhr, method: string, url: string | URL, ...rest: unknown[]) {\n const u = String(url);\n this.__debug = insideFetch > 0 || sink.ignored(u) ? null : { method: String(method).toUpperCase(), url: u };\n return open.call(this, method, url, ...rest);\n };\n const wrappedSend = function (this: TrackedXhr, ...args: unknown[]) {\n const d = this.__debug;\n if (d) {\n const start = Date.now();\n const stack = new Error().stack;\n let aborted = false;\n let timedOut = false;\n this.addEventListener(\"abort\", () => (aborted = true));\n this.addEventListener(\"timeout\", () => (timedOut = true));\n this.addEventListener(\"loadend\", () =>\n sink.request({ ...d, status: this.status || undefined, aborted, timedOut, durationMs: Date.now() - start, stack }),\n );\n }\n return send.apply(this, args);\n };\n (wrappedOpen as { __debug?: boolean }).__debug = true;\n proto.open = wrappedOpen;\n proto.send = wrappedSend;\n return () => {\n proto.open = open;\n proto.send = send;\n };\n}\n\n/* ------------------------------ console ----------------------------- */\n\nfunction format(arg: unknown): string {\n if (typeof arg === \"string\") return arg;\n if (arg instanceof Error) return `${arg.name}: ${arg.message}`;\n try {\n return JSON.stringify(arg) ?? String(arg);\n } catch {\n return String(arg);\n }\n}\n\nexport function instrumentConsole(sink: AutoSink): Restore | undefined {\n const c = g.console as Record<string, (...a: unknown[]) => void> | undefined;\n if (!c) return;\n const restores: Restore[] = [];\n for (const [method, level] of [[\"warn\", \"warning\"], [\"error\", \"error\"]] as const) {\n const orig = c[method];\n if (typeof orig !== \"function\") continue;\n c[method] = function (this: unknown, ...args: unknown[]) {\n if (args[0] !== \"[deBug]\") sink.crumb(\"log\", args.map(format).join(\" \").slice(0, 500), level);\n return orig.apply(this, args);\n };\n restores.push(() => (c[method] = orig));\n }\n return () => restores.forEach((r) => r());\n}\n\n/* --------------------------- web: navigation -------------------------- */\n\nconst path = () => (typeof location !== \"undefined\" ? location.pathname : \"\");\n\nexport function instrumentHistory(sink: AutoSink): Restore | undefined {\n const h = g.history as Record<string, (...a: unknown[]) => void> | undefined;\n if (typeof window === \"undefined\" || !h?.pushState || typeof g.addEventListener !== \"function\") return;\n const orig = { pushState: h.pushState, replaceState: h.replaceState };\n for (const k of [\"pushState\", \"replaceState\"] as const) {\n h[k] = function (this: unknown, ...args: unknown[]) {\n const out = orig[k]!.apply(this, args);\n sink.navigated(path());\n return out;\n };\n }\n const onPop = () => sink.navigated(path());\n g.addEventListener(\"popstate\", onPop);\n sink.navigated(path());\n return () => {\n Object.assign(h, orig);\n g.removeEventListener(\"popstate\", onPop);\n };\n}\n\n/* ----------------------------- web: clicks ---------------------------- */\n\nconst CLICKABLE = 'button,a,[role=\"button\"],[role=\"link\"],[role=\"tab\"],[role=\"menuitem\"],input[type=\"submit\"],input[type=\"button\"],input[type=\"checkbox\"],input[type=\"radio\"],summary,label,[data-testid]';\n\n/** Describes the element by its label, never by anything the user typed. */\nexport function describeElement(el: Element): string {\n const tag = el.tagName.toLowerCase();\n const label =\n el.getAttribute(\"aria-label\") ||\n el.getAttribute(\"data-testid\") ||\n el.getAttribute(\"title\") ||\n (tag === \"input\" ? el.getAttribute(\"name\") || (el as HTMLInputElement).type : (el as HTMLElement).innerText || el.textContent || \"\");\n const id = el.id ? `#${el.id}` : \"\";\n const text = label.replace(/\\s+/g, \" \").trim().slice(0, 60);\n return `${tag}${id}${text ? ` \"${text}\"` : \"\"}`;\n}\n\nexport function instrumentClicks(sink: AutoSink): Restore | undefined {\n const d = g.document as Document | undefined;\n if (!d?.addEventListener) return;\n const onClick = (ev: Event) => {\n const t = ev.target as Element | null;\n const el = t?.closest?.(CLICKABLE);\n if (el) sink.crumb(\"ui\", `Clicked ${describeElement(el)}`);\n };\n d.addEventListener(\"click\", onClick, true);\n return () => d.removeEventListener(\"click\", onClick, true);\n}\n\n/* --------------------------- web: lifecycle --------------------------- */\n\nexport function instrumentWebLifecycle(sink: AutoSink): Restore | undefined {\n const d = g.document as Document | undefined;\n if (typeof window === \"undefined\" || !d?.addEventListener) return;\n const onVis = () => sink.lifecycle(d.visibilityState === \"hidden\" ? \"background\" : \"foreground\");\n const onOnline = () => sink.crumb(\"network\", \"Device went online\");\n const onOffline = () => sink.crumb(\"network\", \"Device went offline\", \"warning\");\n d.addEventListener(\"visibilitychange\", onVis);\n g.addEventListener(\"online\", onOnline);\n g.addEventListener(\"offline\", onOffline);\n return () => {\n d.removeEventListener(\"visibilitychange\", onVis);\n g.removeEventListener(\"online\", onOnline);\n g.removeEventListener(\"offline\", onOffline);\n };\n}\n","import type { Breadcrumb, ContextInput, EnvelopeInput, EventInput, Severity } from \"@debugkit/schema/core\";\nimport { parseStack } from \"@debugkit/schema/core\";\nimport { browserContext, mergeContext, type ContextPatch } from \"./context\";\nimport {\n instrumentClicks,\n instrumentConsole,\n instrumentFetch,\n instrumentHistory,\n instrumentWebLifecycle,\n instrumentXhr,\n normaliseUrl,\n type AutoSink,\n type RequestInfo,\n} from \"./auto\";\n\nexport const SDK_NAME = \"@debugkit/sdk\";\nexport const SDK_VERSION = \"0.2.0\";\n\n/** Optional persistence so events survive app restarts / offline. e.g. AsyncStorage. */\nexport interface QueueStorage {\n getItem(key: string): Promise<string | null>;\n setItem(key: string, value: string): Promise<void>;\n}\n\nexport interface InitOptions {\n /** URL of the ingest function deployed in your cloud. */\n endpoint: string;\n /** Public, write-only key. Safe to ship in the app. */\n ingestKey: string;\n app: { id: string; version?: string; build?: string; environment?: string };\n /**\n * Platform context. Defaults to browserContext() in browsers. The framework entry points\n * (`/expo`, `/react-native`, `/node`) fill this in for you.\n */\n context?: ContextPatch;\n /**\n * What deBug records on its own once initialised. Everything is on by default; pass `false`\n * to turn it all off, or switch parts off: `autoCapture: { console: false }`.\n */\n autoCapture?: boolean | AutoCaptureOptions;\n /** Network capture settings. */\n network?: NetworkOptions;\n /** Fraction of errors and events to keep, 0 to 1. Sessions are never sampled. Default 1. */\n sampleRate?: number;\n /** At most this many errors are sent per minute, and at most a sixth of that for one repeating error. Default 60. */\n maxErrorsPerMinute?: number;\n /** @deprecated Use `autoCapture: { errors: false }`. */\n captureGlobalErrors?: boolean;\n storage?: QueueStorage;\n /** How often queued events are sent. 0 disables the timer (edge runtimes): call flush() yourself. Default 5000. */\n flushIntervalMs?: number;\n maxBatch?: number;\n maxBreadcrumbs?: number;\n /** Drop or edit events before they are sent (PII scrubbing). Return null to drop. */\n beforeSend?: (e: EventInput) => EventInput | null;\n fetch?: typeof fetch;\n debug?: boolean;\n}\n\nexport interface AutoCaptureOptions {\n /** Uncaught errors and unhandled promise rejections. */\n errors?: boolean;\n /** fetch and XMLHttpRequest: a breadcrumb for every request, an error for each failed one. */\n network?: boolean;\n /** console.warn and console.error as breadcrumbs. */\n console?: boolean;\n /** Page changes in browsers (History API), so any router is covered. */\n navigation?: boolean;\n /** Clicks on buttons, links and other controls in browsers, by their label. */\n clicks?: boolean;\n /** Foreground/background and online/offline as breadcrumbs; flushes when the app is hidden. */\n lifecycle?: boolean;\n /** Session start, errored and crashed markers, for crash-free rates per release. */\n sessions?: boolean;\n}\n\nexport interface NetworkOptions {\n /** URLs never recorded (substring or regex). The ingest endpoint is always skipped. */\n ignoreUrls?: (string | RegExp)[];\n /**\n * Tag requests with a flow by URL, first match wins:\n * `flows: [[\"/v2/auth/\", \"auth.login\"], [/\\/payments\\//, \"checkout.payment\"]]`.\n */\n flows?: [string | RegExp, string][];\n /** Which HTTP statuses count as failures. Default: 500 and above. Network failures and timeouts always count. */\n isFailure?: (status: number, url: string) => boolean;\n /** Requests slower than this get a warning breadcrumb. Default 3000ms. */\n slowMs?: number;\n}\n\nexport interface EventMeta {\n flow?: string;\n step?: string;\n tags?: Record<string, string>;\n}\n\nconst QUEUE_KEY = \"@debugkit/queue\";\nconst MAX_QUEUE = 500;\n\nconst uid = () =>\n (globalThis.crypto?.randomUUID?.() ??\n `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 12)}`).replace(/-/g, \"\");\nconst now = () => new Date().toISOString();\n\nexport class DebugClient {\n private opts!: Required<Pick<InitOptions, \"flushIntervalMs\" | \"maxBatch\" | \"maxBreadcrumbs\">> & InitOptions;\n private queue: EventInput[] = [];\n private crumbs: Breadcrumb[] = [];\n private session = { id: uid(), startedAt: now() };\n private user: { id?: string; anonymousId: string } = { anonymousId: uid() };\n private timer: ReturnType<typeof setInterval> | undefined;\n private flushing: Promise<void> | undefined;\n private backoffUntil = 0;\n private failures = 0;\n private ready = false;\n private handlersInstalled = false;\n private auto: Required<AutoCaptureOptions> = { errors: false, network: false, console: false, navigation: false, clicks: false, lifecycle: false, sessions: false };\n private restores: (() => void)[] = [];\n private sessionState = { errored: false, crashed: false };\n private lastNav: string | undefined;\n private limits = new Map<string, { n: number; since: number }>();\n /** fetch as it was before instrumentation, so our own uploads are never recorded. */\n private rawFetch: typeof fetch | undefined;\n\n init(options: InitOptions): this {\n if (this.timer) clearInterval(this.timer);\n this.uninstrument();\n this.opts = { flushIntervalMs: 5000, maxBatch: 50, maxBreadcrumbs: 30, ...options };\n if (!this.opts.context && typeof window !== \"undefined\") this.opts.context = browserContext();\n this.auto = resolveAuto(options);\n this.rawFetch = typeof globalThis.fetch === \"function\" ? (((globalThis.fetch as { __raw?: typeof fetch }).__raw ?? globalThis.fetch) as typeof fetch) : undefined;\n this.ready = true;\n void this.restore();\n if (this.auto.errors && !this.handlersInstalled) this.installGlobalHandlers();\n this.instrument();\n if (this.auto.sessions) this.startSession();\n if (this.opts.flushIntervalMs > 0) {\n this.timer = setInterval(() => void this.flush(), this.opts.flushIntervalMs);\n (this.timer as { unref?: () => void }).unref?.();\n }\n return this;\n }\n\n /** Which automatic captures are on, after defaults. */\n get autoCapture(): Readonly<Required<AutoCaptureOptions>> {\n return this.auto;\n }\n\n /**\n * Begin a new session: a fresh id and a \"started\" marker. Called by `init()`, and by the\n * React Native entry when the app returns after 30 minutes in the background.\n */\n startSession() {\n if (!this.ready) return;\n void this.flush(); // events already queued belong to the old session\n this.session = { id: uid(), startedAt: now() };\n this.sessionState = { errored: false, crashed: false };\n if (this.auto.sessions) this.push({ type: \"session\", id: uid(), ts: now(), status: \"started\" });\n }\n\n /** Record a navigation breadcrumb (\"from → to\"). Repeated paths are ignored. */\n navigated(to: string) {\n if (!to || to === this.lastNav) return;\n this.breadcrumb(\"navigation\", this.lastNav ? `${this.lastNav} → ${to}` : to);\n this.lastNav = to;\n }\n\n get initialized() {\n return this.ready;\n }\n\n /** Merge extra context (e.g. after an async device lookup). Applies to events sent from now on. */\n setContext(patch: ContextPatch) {\n if (this.opts) this.opts.context = mergeContext(this.opts.context ?? {}, patch);\n }\n\n setUser(id: string | undefined) {\n this.user = { ...this.user, id };\n }\n\n breadcrumb(category: Breadcrumb[\"category\"], message: string, data?: Record<string, string | number | boolean | null>, level: Breadcrumb[\"level\"] = \"info\") {\n const msg = message.slice(0, 500);\n const last = this.crumbs[this.crumbs.length - 1];\n if (last && last.category === category && last.message === msg && last.level === level) {\n last.ts = now();\n last.data = { ...data, repeated: Number(last.data?.repeated ?? 1) + 1 };\n return;\n }\n this.crumbs.push({ ts: now(), category, message: msg, data, level });\n if (this.crumbs.length > (this.opts?.maxBreadcrumbs ?? 30)) this.crumbs.shift();\n }\n\n /** Log an error. `flow` is the part of the app it belongs to, e.g. \"auth.login\". */\n error(err: unknown, meta: EventMeta & { severity?: Severity; handled?: boolean; fatal?: boolean } = {}) {\n this.captureError(normaliseError(err), meta);\n }\n\n /** Log a custom event. Use outcome to let deBug compute failure rates per flow. */\n event(name: string, meta: EventMeta & { outcome?: \"success\" | \"failure\" | \"abandoned\"; props?: Record<string, string | number | boolean | null> } = {}) {\n this.breadcrumb(\"event\", name, meta.props);\n this.enqueue({ type: \"event\", id: uid(), ts: now(), name, flow: meta.flow, step: meta.step, tags: meta.tags, outcome: meta.outcome, props: meta.props });\n }\n\n /**\n * Wraps an async step: logs a success or failure outcome for the flow, plus the error.\n * Pass `{ captureError: false }` when the error is already reported elsewhere, e.g. a\n * server function wrapped in withDebug, so it isn't counted twice.\n */\n async track<T>(flow: string, step: string, fn: () => Promise<T>, opts: { captureError?: boolean } = {}): Promise<T> {\n try {\n const out = await fn();\n this.event(`${flow}.${step}`, { flow, step, outcome: \"success\" });\n return out;\n } catch (err) {\n this.event(`${flow}.${step}`, { flow, step, outcome: \"failure\" });\n if (opts.captureError !== false) this.error(err, { flow, step });\n throw err;\n }\n }\n\n async flush(): Promise<void> {\n // Wait for an upload in progress, then send whatever was queued meanwhile (a crash marker, say).\n if (this.flushing) await this.flushing.catch(() => {});\n if (this.flushing) return this.flushing;\n if (!this.ready || this.queue.length === 0 || Date.now() < this.backoffUntil) return;\n const batch = this.queue.splice(0, this.opts.maxBatch);\n this.flushing = this.send(batch)\n .then(() => {\n this.failures = 0;\n })\n .catch((err) => {\n this.queue.unshift(...batch);\n this.failures++;\n this.backoffUntil = Date.now() + Math.min(60_000, 1000 * 2 ** this.failures);\n this.log(\"flush failed\", err);\n })\n .finally(() => {\n this.flushing = undefined;\n void this.persist();\n });\n return this.flushing;\n }\n\n /** Stop the flush timer, undo automatic instrumentation and send what is queued. */\n close() {\n if (this.timer) clearInterval(this.timer);\n this.uninstrument();\n return this.flush();\n }\n\n /* ---------------- internals ---------------- */\n\n /** @internal Used by the platform entry points for errors that have no thrown value. */\n captureError(\n e: { name: string; message: string; stack?: string; frames?: ReturnType<typeof parseStack> },\n meta: EventMeta & { severity?: Severity; handled?: boolean; fatal?: boolean },\n request?: { method: string; url: string; status?: number; durationMs?: number },\n ) {\n if (!this.ready) return;\n const handled = meta.handled ?? true;\n const frames = e.frames ?? parseStack(e.stack);\n if (!meta.fatal && !this.allowError(`${e.name}|${e.message.slice(0, 120)}|${frames[0]?.file ?? \"\"}:${frames[0]?.line ?? \"\"}`)) return;\n // Session markers go first so they ride in the same upload as the error.\n if (this.auto.sessions && (!handled || meta.fatal)) {\n if (!this.sessionState.errored) {\n this.sessionState.errored = true;\n this.push({ type: \"session\", id: uid(), ts: now(), status: \"errored\" });\n }\n if (meta.fatal && !this.sessionState.crashed) {\n this.sessionState.crashed = true;\n this.push({ type: \"session\", id: uid(), ts: now(), status: \"crashed\" });\n }\n }\n // Fatal errors skip sampling: a crash is always worth its one event.\n (meta.fatal ? this.push : this.enqueue).call(this, {\n type: \"error\",\n id: uid(),\n ts: now(),\n flow: meta.flow,\n step: meta.step,\n tags: meta.tags,\n severity: meta.severity ?? (meta.fatal ? \"critical\" : undefined),\n handled,\n error: { name: e.name, message: e.message, stack: e.stack, frames },\n breadcrumbs: [...this.crumbs],\n request,\n });\n }\n\n /** Per-minute limits: one runaway error can't flood the queue, the network or your database. */\n private allowError(signature: string): boolean {\n const max = this.opts.maxErrorsPerMinute ?? 60;\n const t = Date.now();\n const hit = (key: string, cap: number) => {\n let l = this.limits.get(key);\n if (!l || t - l.since > 60_000) this.limits.set(key, (l = { n: 0, since: t }));\n return ++l.n <= cap;\n };\n if (this.limits.size > 200) this.limits.clear();\n const ok = hit(\"*\", max) && hit(signature, Math.max(1, Math.ceil(max / 6)));\n if (!ok) this.log(\"rate limited\", signature);\n return ok;\n }\n\n private sampled(): boolean {\n const r = this.opts.sampleRate ?? 1;\n return r >= 1 || Math.random() < r;\n }\n\n private enqueue(e: EventInput) {\n if (!this.ready || !this.sampled()) return;\n this.push(e);\n }\n\n /** Queue without sampling (sessions must be complete for crash-free rates to be right). */\n private push(e: EventInput) {\n if (!this.ready) return;\n const out = this.opts.beforeSend ? this.opts.beforeSend(e) : e;\n if (!out) return;\n this.queue.push(out);\n if (this.queue.length > MAX_QUEUE) this.queue.splice(0, this.queue.length - MAX_QUEUE);\n if (out.type === \"error\" || this.queue.length >= this.opts.maxBatch) void this.flush();\n else void this.persist();\n }\n\n private buildContext(): ContextInput {\n const c = this.opts.context ?? {};\n return {\n ...c,\n app: { ...(c.app ?? {}), ...this.opts.app },\n os: { name: \"unknown\", ...(c.os ?? {}) },\n runtime: { name: \"unknown\", ...(c.runtime ?? {}) },\n device: c.device ?? {},\n } as ContextInput;\n }\n\n /** Set when the ingest rejects 0.2 fields: it predates them, so send what it understands. */\n private legacyIngest = false;\n\n private async send(events: EventInput[]): Promise<void> {\n if (this.legacyIngest) events = toLegacy(events);\n if (!events.length) return;\n const body: EnvelopeInput = {\n sdk: { name: SDK_NAME, version: SDK_VERSION },\n context: this.buildContext(),\n user: this.user,\n session: this.session,\n events,\n };\n const f = this.opts.fetch ?? this.rawFetch ?? fetch;\n const json = JSON.stringify(body);\n const res = await f(this.opts.endpoint, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\", \"x-debug-key\": this.opts.ingestKey },\n body: json,\n // Lets the last batch finish when the page is closing. Browsers cap keepalive bodies at 64 KB.\n ...(typeof window !== \"undefined\" && json.length < 60_000 ? { keepalive: true } : {}),\n });\n // 4xx (other than 429) means the payload will never be accepted: drop it instead of retrying forever.\n if (res.status >= 400 && res.status < 500 && res.status !== 429) {\n this.log(`ingest rejected batch (${res.status})`, await res.text().catch(() => \"\"));\n // An ingest older than this SDK rejects session markers and request details. Retry once\n // without them rather than lose the errors; upgrade @debugkit/ingest to keep them.\n if (res.status === 400 && !this.legacyIngest && hasNewFields(events)) {\n this.legacyIngest = true;\n return this.send(events);\n }\n return;\n }\n if (!res.ok) throw new Error(`ingest responded ${res.status}`);\n }\n\n private async persist() {\n try {\n await this.opts.storage?.setItem(QUEUE_KEY, JSON.stringify(this.queue));\n } catch {}\n }\n\n private async restore() {\n try {\n const raw = await this.opts.storage?.getItem(QUEUE_KEY);\n if (raw) this.queue.unshift(...(JSON.parse(raw) as EventInput[]));\n } catch {}\n }\n\n private installGlobalHandlers() {\n this.handlersInstalled = true;\n const g = globalThis as Record<string, any>;\n // React Native\n if (g.ErrorUtils?.setGlobalHandler) {\n const prev = g.ErrorUtils.getGlobalHandler?.();\n g.ErrorUtils.setGlobalHandler((err: unknown, isFatal?: boolean) => {\n this.error(err, { handled: false, fatal: !!isFatal, tags: { source: \"global-handler\" } });\n void this.flush();\n prev?.(err, isFatal);\n });\n }\n // Browser (not workers / edge runtimes, which also expose addEventListener)\n if (typeof window !== \"undefined\" && typeof g.addEventListener === \"function\") {\n g.addEventListener(\"error\", (ev: { error?: unknown; message?: string }) => this.error(ev.error ?? ev.message, { handled: false, tags: { source: \"window.onerror\" } }));\n g.addEventListener(\"unhandledrejection\", (ev: { reason?: unknown }) => this.error(ev.reason, { handled: false, tags: { source: \"unhandledrejection\" } }));\n }\n }\n\n private instrument() {\n const a = this.auto;\n const sink = this.sink();\n const add = (r: (() => void) | undefined) => r && this.restores.push(r);\n if (a.network) {\n const restoreFetch = instrumentFetch(sink);\n if (restoreFetch) (globalThis.fetch as { __raw?: typeof fetch }).__raw = this.rawFetch;\n add(restoreFetch);\n add(instrumentXhr(sink));\n }\n if (a.console) add(instrumentConsole(sink));\n if (a.navigation) add(instrumentHistory(sink));\n if (a.clicks) add(instrumentClicks(sink));\n if (a.lifecycle) add(instrumentWebLifecycle(sink));\n }\n\n private uninstrument() {\n while (this.restores.length) this.restores.pop()!();\n }\n\n /** The bridge the instrumentation (./auto, and the platform entry points) reports through. */\n sink(): AutoSink {\n return {\n request: (r) => this.recordRequest(r),\n crumb: (category, message, level = \"info\", data) => this.breadcrumb(category, message, data, level),\n navigated: (to) => this.navigated(to),\n lifecycle: (state) => {\n this.breadcrumb(\"ui\", state === \"background\" ? \"App went to the background\" : \"App came to the foreground\");\n if (state === \"background\") void this.flush();\n },\n ignored: (url) => this.isIgnored(url),\n };\n }\n\n private isIgnored(url: string): boolean {\n if (!this.ready) return true;\n const ep = this.opts.endpoint.replace(/^https?:/, \"\");\n if (url.includes(ep) || /\\/symbolicate\\b|\\/logs(?:\\?|$)/.test(url)) return true; // ingest, Metro and Expo dev servers\n return (this.opts.network?.ignoreUrls ?? []).some((p) => (typeof p === \"string\" ? url.includes(p) : p.test(url)));\n }\n\n private recordRequest(r: RequestInfo) {\n if (!this.ready) return;\n const net = this.opts.network ?? {};\n const url = normaliseUrl(r.url);\n const ms = Math.round(r.durationMs);\n const failed = r.status === undefined ? !r.aborted : (net.isFailure ?? ((s: number) => s >= 500))(r.status, url);\n const slow = ms >= (net.slowMs ?? 3000);\n const outcome = r.aborted ? \"aborted\" : r.timedOut ? \"timed out\" : r.status !== undefined ? String(r.status) : \"failed\";\n this.breadcrumb(\"network\", `${r.method} ${url} → ${outcome} (${ms}ms)`, { status: r.status ?? null, durationMs: ms }, failed ? \"error\" : slow ? \"warning\" : \"info\");\n if (!failed) return;\n\n const flow = net.flows?.find(([p]) => (typeof p === \"string\" ? url.includes(p) : p.test(url)))?.[1];\n const cause = r.error ? normaliseError(r.error) : undefined;\n const message =\n r.status !== undefined ? `${r.method} ${url} responded ${r.status}` : `${r.method} ${url} ${r.timedOut ? \"timed out\" : \"failed\"}${cause ? `: ${cause.message}` : \"\"}`;\n // The first frame is our own wrapper; the rest is the code that made the request.\n const frames = parseStack(r.stack).slice(1);\n this.captureError(\n { name: r.status !== undefined ? \"HttpError\" : \"NetworkError\", message, stack: r.stack, frames },\n { flow, handled: true, tags: { source: \"network\" } },\n { method: r.method, url, status: r.status, durationMs: ms },\n );\n }\n\n private log(...args: unknown[]) {\n if (this.opts?.debug) console.warn(\"[deBug]\", ...args);\n }\n}\n\nfunction normaliseError(err: unknown): { name: string; message: string; stack?: string } {\n if (err instanceof Error) return { name: err.name || \"Error\", message: err.message, stack: err.stack };\n if (typeof err === \"string\") return { name: \"Error\", message: err };\n try {\n return { name: \"NonError\", message: JSON.stringify(err).slice(0, 2000) };\n } catch {\n return { name: \"NonError\", message: String(err) };\n }\n}\n\nfunction resolveAuto(o: InitOptions): Required<AutoCaptureOptions> {\n const all = o.autoCapture !== false;\n const sel: AutoCaptureOptions = typeof o.autoCapture === \"object\" ? o.autoCapture : {};\n const pick = (k: keyof AutoCaptureOptions, dflt = all) => sel[k] ?? dflt;\n return {\n errors: o.captureGlobalErrors ?? pick(\"errors\"),\n network: pick(\"network\"),\n console: pick(\"console\"),\n navigation: pick(\"navigation\"),\n clicks: pick(\"clicks\"),\n lifecycle: pick(\"lifecycle\"),\n sessions: pick(\"sessions\"),\n };\n}\n\nconst hasNewFields = (events: EventInput[]) => events.some((e) => e.type === \"session\" || (e.type === \"error\" && e.request));\n\n/** Events as a 0.1 ingest accepts them: no session markers, no request details. */\nfunction toLegacy(events: EventInput[]): EventInput[] {\n const out: EventInput[] = [];\n for (const e of events) {\n if (e.type === \"session\") continue;\n if (e.type === \"error\" && e.request) {\n const { request: _r, ...rest } = e;\n out.push(rest);\n } else out.push(e);\n }\n return out;\n}\n","import { DebugClient } from \"./client\";\n\nexport { DebugClient, SDK_NAME, SDK_VERSION } from \"./client\";\nexport type { InitOptions, EventMeta, QueueStorage, AutoCaptureOptions, NetworkOptions } from \"./client\";\nexport { normaliseUrl } from \"./auto\";\nexport { browserContext, mergeContext, type ContextPatch } from \"./context\";\nexport { parseStack } from \"@debugkit/schema/core\";\nexport type { Breadcrumb, EventInput, Severity, StackFrame } from \"@debugkit/schema/core\";\n\n/**\n * Default client. Framework entry points (`/react`, `/react-native`, `/expo`, `/node`) use this\n * same instance, so `import { deBug } from \"@debugkit/sdk\"` works everywhere.\n */\nexport const deBug = new DebugClient();\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { deBug, timezone, locale, mergeContext } from './chunk-
|
|
1
|
+
import { deBug, timezone, locale, mergeContext } from './chunk-5C7KJJNO.js';
|
|
2
2
|
import { Platform, AppState } from 'react-native';
|
|
3
3
|
|
|
4
4
|
function nativeContext(opts = {}) {
|
|
@@ -31,6 +31,7 @@ function nativeContext(opts = {}) {
|
|
|
31
31
|
timezone: timezone()
|
|
32
32
|
};
|
|
33
33
|
}
|
|
34
|
+
var SESSION_TIMEOUT_MS = 30 * 6e4;
|
|
34
35
|
function initReactNative(options, client = deBug) {
|
|
35
36
|
var _a, _b;
|
|
36
37
|
const { deviceInfo, captureUnhandledRejections = "production", ...rest } = options;
|
|
@@ -40,8 +41,17 @@ function initReactNative(options, client = deBug) {
|
|
|
40
41
|
app: { ...base.app, ...rest.app },
|
|
41
42
|
context: mergeContext(base, (_a = rest.context) != null ? _a : {})
|
|
42
43
|
});
|
|
44
|
+
let backgroundedAt = 0;
|
|
43
45
|
AppState.addEventListener("change", (state) => {
|
|
44
|
-
if (state
|
|
46
|
+
if (state === "active") {
|
|
47
|
+
if (client.autoCapture.lifecycle) client.sink().lifecycle("foreground");
|
|
48
|
+
if (backgroundedAt && Date.now() - backgroundedAt > SESSION_TIMEOUT_MS) client.startSession();
|
|
49
|
+
backgroundedAt = 0;
|
|
50
|
+
} else if (!backgroundedAt) {
|
|
51
|
+
backgroundedAt = Date.now();
|
|
52
|
+
if (client.autoCapture.lifecycle) client.sink().lifecycle("background");
|
|
53
|
+
else void client.flush();
|
|
54
|
+
}
|
|
45
55
|
});
|
|
46
56
|
const dev = typeof __DEV__ !== "undefined" && __DEV__;
|
|
47
57
|
const tracker = (_b = globalThis.HermesInternal) == null ? void 0 : _b.enablePromiseRejectionTracker;
|
|
@@ -56,16 +66,14 @@ function initReactNative(options, client = deBug) {
|
|
|
56
66
|
return client;
|
|
57
67
|
}
|
|
58
68
|
function trackReactNavigation(ref, client = deBug) {
|
|
59
|
-
let last;
|
|
60
69
|
const record = () => {
|
|
61
70
|
var _a;
|
|
62
71
|
const name = (_a = ref.getCurrentRoute()) == null ? void 0 : _a.name;
|
|
63
|
-
if (name
|
|
64
|
-
last = name != null ? name : last;
|
|
72
|
+
if (name) client.navigated(name);
|
|
65
73
|
};
|
|
66
74
|
return { onReady: record, onStateChange: record };
|
|
67
75
|
}
|
|
68
76
|
|
|
69
77
|
export { initReactNative, nativeContext, trackReactNavigation };
|
|
70
|
-
//# sourceMappingURL=chunk-
|
|
71
|
-
//# sourceMappingURL=chunk-
|
|
78
|
+
//# sourceMappingURL=chunk-HO3JW55K.js.map
|
|
79
|
+
//# sourceMappingURL=chunk-HO3JW55K.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/react-native.ts"],"names":[],"mappings":"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","file":"chunk-HO3JW55K.js","sourcesContent":["import { AppState, Platform } from \"react-native\";\nimport { deBug, type DebugClient, type InitOptions } from \"./index\";\nimport { locale, mergeContext, timezone, type ContextPatch } from \"./context\";\n\nexport * from \"./react\";\n\n/** The subset of react-native-device-info we read. Pass the module itself: `import DeviceInfo from \"react-native-device-info\"`. */\nexport interface DeviceInfoModule {\n getModel(): string;\n getBrand(): string;\n getVersion(): string;\n getBuildNumber(): string;\n isTablet(): boolean;\n getManufacturerSync?(): string;\n isEmulatorSync?(): boolean;\n getTotalMemorySync?(): number;\n}\n\ntype RNConstants = {\n Release?: string;\n Model?: string;\n Brand?: string;\n Manufacturer?: string;\n Fingerprint?: string;\n reactNativeVersion?: { major: number; minor: number; patch: number };\n};\n\n/**\n * Context for bare React Native. Reads what `react-native` exposes on its own; pass\n * react-native-device-info for model, app version and memory on both platforms.\n */\nexport function nativeContext(opts: { deviceInfo?: DeviceInfoModule } = {}): ContextPatch {\n const c = (Platform.constants ?? {}) as RNConstants;\n const di = opts.deviceInfo;\n const rn = c.reactNativeVersion;\n const hermes = typeof (globalThis as { HermesInternal?: unknown }).HermesInternal !== \"undefined\";\n const call = <T,>(fn?: () => T) => {\n try {\n return fn?.();\n } catch {\n return undefined;\n }\n };\n const totalMemory = call(di?.getTotalMemorySync?.bind(di));\n return {\n os: { name: Platform.OS, version: Platform.OS === \"android\" ? (c.Release ?? String(Platform.Version)) : String(Platform.Version) },\n runtime: { name: \"react-native\", version: rn ? `${rn.major}.${rn.minor}.${rn.patch}` : undefined, engine: hermes ? \"hermes\" : \"jsc\" },\n device: {\n model: call(di?.getModel.bind(di)) ?? c.Model,\n brand: call(di?.getBrand.bind(di)) ?? c.Brand,\n manufacturer: call(di?.getManufacturerSync?.bind(di)) ?? c.Manufacturer,\n isEmulator: call(di?.isEmulatorSync?.bind(di)) ?? (c.Fingerprint ? /generic|emulator/i.test(c.Fingerprint) : undefined),\n memoryMb: totalMemory ? Math.round(totalMemory / 1024 / 1024) : undefined,\n type: di ? (call(di.isTablet.bind(di)) ? \"tablet\" : \"phone\") : Platform.OS === \"ios\" && (Platform as { isPad?: boolean }).isPad ? \"tablet\" : \"phone\",\n },\n app: { version: call(di?.getVersion.bind(di)), build: call(di?.getBuildNumber.bind(di)) } as ContextPatch[\"app\"],\n locale: locale(),\n timezone: timezone(),\n };\n}\n\nexport interface ReactNativeInitOptions extends InitOptions {\n deviceInfo?: DeviceInfoModule;\n /**\n * Report unhandled promise rejections (Hermes). Default \"production\": in development React\n * Native's own yellow-box warning keeps working. `true` captures in development too.\n */\n captureUnhandledRejections?: boolean | \"production\";\n}\n\ndeclare const __DEV__: boolean | undefined;\n\nconst SESSION_TIMEOUT_MS = 30 * 60_000;\n\n/** Initialise deBug in a React Native app (bare or Expo). Fills in device context and flushes when the app is backgrounded. */\nexport function initReactNative(options: ReactNativeInitOptions, client: DebugClient = deBug): DebugClient {\n const { deviceInfo, captureUnhandledRejections = \"production\", ...rest } = options;\n const base = nativeContext({ deviceInfo });\n client.init({\n ...rest,\n app: { ...(base.app as object), ...rest.app },\n context: mergeContext(base, rest.context ?? {}),\n });\n\n // Sessions end after 30 minutes in the background; coming back after that starts a new one.\n let backgroundedAt = 0;\n AppState.addEventListener(\"change\", (state) => {\n if (state === \"active\") {\n if (client.autoCapture.lifecycle) client.sink().lifecycle(\"foreground\");\n if (backgroundedAt && Date.now() - backgroundedAt > SESSION_TIMEOUT_MS) client.startSession();\n backgroundedAt = 0;\n } else if (!backgroundedAt) {\n backgroundedAt = Date.now();\n if (client.autoCapture.lifecycle) client.sink().lifecycle(\"background\");\n else void client.flush();\n }\n });\n\n const dev = typeof __DEV__ !== \"undefined\" && __DEV__;\n const tracker = (globalThis as { HermesInternal?: { enablePromiseRejectionTracker?: (o: object) => void } }).HermesInternal\n ?.enablePromiseRejectionTracker;\n if (tracker && (captureUnhandledRejections === true || (captureUnhandledRejections === \"production\" && !dev))) {\n tracker({\n allRejections: true,\n onUnhandled: (_id: number, reason: unknown) => client.error(reason, { handled: false, tags: { source: \"unhandled-rejection\" } }),\n onHandled: () => {},\n });\n }\n return client;\n}\n\n/** Minimal shape of a React Navigation container ref. */\ninterface NavigationRefLike {\n getCurrentRoute(): { name: string } | undefined;\n}\n\n/**\n * Breadcrumbs for React Navigation. Spread the result onto your container:\n * const nav = useNavigationContainerRef();\n * <NavigationContainer ref={nav} {...trackReactNavigation(nav)}>\n */\nexport function trackReactNavigation(ref: NavigationRefLike, client: DebugClient = deBug) {\n const record = () => {\n const name = ref.getCurrentRoute()?.name;\n if (name) client.navigated(name);\n };\n return { onReady: record, onStateChange: record };\n}\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunkEGCXLOFH_cjs = require('./chunk-EGCXLOFH.cjs');
|
|
4
4
|
var reactNative = require('react-native');
|
|
5
5
|
|
|
6
6
|
function nativeContext(opts = {}) {
|
|
@@ -29,21 +29,31 @@ function nativeContext(opts = {}) {
|
|
|
29
29
|
type: di ? call(di.isTablet.bind(di)) ? "tablet" : "phone" : reactNative.Platform.OS === "ios" && reactNative.Platform.isPad ? "tablet" : "phone"
|
|
30
30
|
},
|
|
31
31
|
app: { version: call(di == null ? void 0 : di.getVersion.bind(di)), build: call(di == null ? void 0 : di.getBuildNumber.bind(di)) },
|
|
32
|
-
locale:
|
|
33
|
-
timezone:
|
|
32
|
+
locale: chunkEGCXLOFH_cjs.locale(),
|
|
33
|
+
timezone: chunkEGCXLOFH_cjs.timezone()
|
|
34
34
|
};
|
|
35
35
|
}
|
|
36
|
-
|
|
36
|
+
var SESSION_TIMEOUT_MS = 30 * 6e4;
|
|
37
|
+
function initReactNative(options, client = chunkEGCXLOFH_cjs.deBug) {
|
|
37
38
|
var _a, _b;
|
|
38
39
|
const { deviceInfo, captureUnhandledRejections = "production", ...rest } = options;
|
|
39
40
|
const base = nativeContext({ deviceInfo });
|
|
40
41
|
client.init({
|
|
41
42
|
...rest,
|
|
42
43
|
app: { ...base.app, ...rest.app },
|
|
43
|
-
context:
|
|
44
|
+
context: chunkEGCXLOFH_cjs.mergeContext(base, (_a = rest.context) != null ? _a : {})
|
|
44
45
|
});
|
|
46
|
+
let backgroundedAt = 0;
|
|
45
47
|
reactNative.AppState.addEventListener("change", (state) => {
|
|
46
|
-
if (state
|
|
48
|
+
if (state === "active") {
|
|
49
|
+
if (client.autoCapture.lifecycle) client.sink().lifecycle("foreground");
|
|
50
|
+
if (backgroundedAt && Date.now() - backgroundedAt > SESSION_TIMEOUT_MS) client.startSession();
|
|
51
|
+
backgroundedAt = 0;
|
|
52
|
+
} else if (!backgroundedAt) {
|
|
53
|
+
backgroundedAt = Date.now();
|
|
54
|
+
if (client.autoCapture.lifecycle) client.sink().lifecycle("background");
|
|
55
|
+
else void client.flush();
|
|
56
|
+
}
|
|
47
57
|
});
|
|
48
58
|
const dev = typeof __DEV__ !== "undefined" && __DEV__;
|
|
49
59
|
const tracker = (_b = globalThis.HermesInternal) == null ? void 0 : _b.enablePromiseRejectionTracker;
|
|
@@ -57,13 +67,11 @@ function initReactNative(options, client = chunkXEFWRCN4_cjs.deBug) {
|
|
|
57
67
|
}
|
|
58
68
|
return client;
|
|
59
69
|
}
|
|
60
|
-
function trackReactNavigation(ref, client =
|
|
61
|
-
let last;
|
|
70
|
+
function trackReactNavigation(ref, client = chunkEGCXLOFH_cjs.deBug) {
|
|
62
71
|
const record = () => {
|
|
63
72
|
var _a;
|
|
64
73
|
const name = (_a = ref.getCurrentRoute()) == null ? void 0 : _a.name;
|
|
65
|
-
if (name
|
|
66
|
-
last = name != null ? name : last;
|
|
74
|
+
if (name) client.navigated(name);
|
|
67
75
|
};
|
|
68
76
|
return { onReady: record, onStateChange: record };
|
|
69
77
|
}
|
|
@@ -71,5 +79,5 @@ function trackReactNavigation(ref, client = chunkXEFWRCN4_cjs.deBug) {
|
|
|
71
79
|
exports.initReactNative = initReactNative;
|
|
72
80
|
exports.nativeContext = nativeContext;
|
|
73
81
|
exports.trackReactNavigation = trackReactNavigation;
|
|
74
|
-
//# sourceMappingURL=chunk-
|
|
75
|
-
//# sourceMappingURL=chunk-
|
|
82
|
+
//# sourceMappingURL=chunk-NJ6DTUVX.cjs.map
|
|
83
|
+
//# sourceMappingURL=chunk-NJ6DTUVX.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/react-native.ts"],"names":["Platform","locale","timezone","deBug","mergeContext","AppState"],"mappings":"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","file":"chunk-NJ6DTUVX.cjs","sourcesContent":["import { AppState, Platform } from \"react-native\";\nimport { deBug, type DebugClient, type InitOptions } from \"./index\";\nimport { locale, mergeContext, timezone, type ContextPatch } from \"./context\";\n\nexport * from \"./react\";\n\n/** The subset of react-native-device-info we read. Pass the module itself: `import DeviceInfo from \"react-native-device-info\"`. */\nexport interface DeviceInfoModule {\n getModel(): string;\n getBrand(): string;\n getVersion(): string;\n getBuildNumber(): string;\n isTablet(): boolean;\n getManufacturerSync?(): string;\n isEmulatorSync?(): boolean;\n getTotalMemorySync?(): number;\n}\n\ntype RNConstants = {\n Release?: string;\n Model?: string;\n Brand?: string;\n Manufacturer?: string;\n Fingerprint?: string;\n reactNativeVersion?: { major: number; minor: number; patch: number };\n};\n\n/**\n * Context for bare React Native. Reads what `react-native` exposes on its own; pass\n * react-native-device-info for model, app version and memory on both platforms.\n */\nexport function nativeContext(opts: { deviceInfo?: DeviceInfoModule } = {}): ContextPatch {\n const c = (Platform.constants ?? {}) as RNConstants;\n const di = opts.deviceInfo;\n const rn = c.reactNativeVersion;\n const hermes = typeof (globalThis as { HermesInternal?: unknown }).HermesInternal !== \"undefined\";\n const call = <T,>(fn?: () => T) => {\n try {\n return fn?.();\n } catch {\n return undefined;\n }\n };\n const totalMemory = call(di?.getTotalMemorySync?.bind(di));\n return {\n os: { name: Platform.OS, version: Platform.OS === \"android\" ? (c.Release ?? String(Platform.Version)) : String(Platform.Version) },\n runtime: { name: \"react-native\", version: rn ? `${rn.major}.${rn.minor}.${rn.patch}` : undefined, engine: hermes ? \"hermes\" : \"jsc\" },\n device: {\n model: call(di?.getModel.bind(di)) ?? c.Model,\n brand: call(di?.getBrand.bind(di)) ?? c.Brand,\n manufacturer: call(di?.getManufacturerSync?.bind(di)) ?? c.Manufacturer,\n isEmulator: call(di?.isEmulatorSync?.bind(di)) ?? (c.Fingerprint ? /generic|emulator/i.test(c.Fingerprint) : undefined),\n memoryMb: totalMemory ? Math.round(totalMemory / 1024 / 1024) : undefined,\n type: di ? (call(di.isTablet.bind(di)) ? \"tablet\" : \"phone\") : Platform.OS === \"ios\" && (Platform as { isPad?: boolean }).isPad ? \"tablet\" : \"phone\",\n },\n app: { version: call(di?.getVersion.bind(di)), build: call(di?.getBuildNumber.bind(di)) } as ContextPatch[\"app\"],\n locale: locale(),\n timezone: timezone(),\n };\n}\n\nexport interface ReactNativeInitOptions extends InitOptions {\n deviceInfo?: DeviceInfoModule;\n /**\n * Report unhandled promise rejections (Hermes). Default \"production\": in development React\n * Native's own yellow-box warning keeps working. `true` captures in development too.\n */\n captureUnhandledRejections?: boolean | \"production\";\n}\n\ndeclare const __DEV__: boolean | undefined;\n\nconst SESSION_TIMEOUT_MS = 30 * 60_000;\n\n/** Initialise deBug in a React Native app (bare or Expo). Fills in device context and flushes when the app is backgrounded. */\nexport function initReactNative(options: ReactNativeInitOptions, client: DebugClient = deBug): DebugClient {\n const { deviceInfo, captureUnhandledRejections = \"production\", ...rest } = options;\n const base = nativeContext({ deviceInfo });\n client.init({\n ...rest,\n app: { ...(base.app as object), ...rest.app },\n context: mergeContext(base, rest.context ?? {}),\n });\n\n // Sessions end after 30 minutes in the background; coming back after that starts a new one.\n let backgroundedAt = 0;\n AppState.addEventListener(\"change\", (state) => {\n if (state === \"active\") {\n if (client.autoCapture.lifecycle) client.sink().lifecycle(\"foreground\");\n if (backgroundedAt && Date.now() - backgroundedAt > SESSION_TIMEOUT_MS) client.startSession();\n backgroundedAt = 0;\n } else if (!backgroundedAt) {\n backgroundedAt = Date.now();\n if (client.autoCapture.lifecycle) client.sink().lifecycle(\"background\");\n else void client.flush();\n }\n });\n\n const dev = typeof __DEV__ !== \"undefined\" && __DEV__;\n const tracker = (globalThis as { HermesInternal?: { enablePromiseRejectionTracker?: (o: object) => void } }).HermesInternal\n ?.enablePromiseRejectionTracker;\n if (tracker && (captureUnhandledRejections === true || (captureUnhandledRejections === \"production\" && !dev))) {\n tracker({\n allRejections: true,\n onUnhandled: (_id: number, reason: unknown) => client.error(reason, { handled: false, tags: { source: \"unhandled-rejection\" } }),\n onHandled: () => {},\n });\n }\n return client;\n}\n\n/** Minimal shape of a React Navigation container ref. */\ninterface NavigationRefLike {\n getCurrentRoute(): { name: string } | undefined;\n}\n\n/**\n * Breadcrumbs for React Navigation. Spread the result onto your container:\n * const nav = useNavigationContainerRef();\n * <NavigationContainer ref={nav} {...trackReactNavigation(nav)}>\n */\nexport function trackReactNavigation(ref: NavigationRefLike, client: DebugClient = deBug) {\n const record = () => {\n const name = ref.getCurrentRoute()?.name;\n if (name) client.navigated(name);\n };\n return { onReady: record, onStateChange: record };\n}\n"]}
|
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunkEGCXLOFH_cjs = require('./chunk-EGCXLOFH.cjs');
|
|
4
4
|
var react = require('react');
|
|
5
5
|
|
|
6
6
|
var DebugErrorBoundary = class extends react.Component {
|
|
7
7
|
constructor() {
|
|
8
8
|
super(...arguments);
|
|
9
|
-
|
|
10
|
-
|
|
9
|
+
chunkEGCXLOFH_cjs.__publicField(this, "state", { error: null });
|
|
10
|
+
chunkEGCXLOFH_cjs.__publicField(this, "reset", () => this.setState({ error: null }));
|
|
11
11
|
}
|
|
12
12
|
static getDerivedStateFromError(error) {
|
|
13
13
|
return { error };
|
|
14
14
|
}
|
|
15
15
|
componentDidCatch(error, info) {
|
|
16
16
|
var _a, _b, _c;
|
|
17
|
-
const client = (_a = this.props.client) != null ? _a :
|
|
17
|
+
const client = (_a = this.props.client) != null ? _a : chunkEGCXLOFH_cjs.deBug;
|
|
18
18
|
if (info.componentStack) {
|
|
19
19
|
client.breadcrumb("ui", "React render error", { componentStack: info.componentStack.trim().slice(0, 1500) }, "error");
|
|
20
20
|
}
|
|
@@ -29,17 +29,17 @@ var DebugErrorBoundary = class extends react.Component {
|
|
|
29
29
|
return typeof fallback === "function" ? fallback({ error, reset: this.reset }) : fallback != null ? fallback : null;
|
|
30
30
|
}
|
|
31
31
|
};
|
|
32
|
-
function useDebugNavigation(path, client =
|
|
32
|
+
function useDebugNavigation(path, client = chunkEGCXLOFH_cjs.deBug) {
|
|
33
33
|
react.useEffect(() => {
|
|
34
|
-
if (path) client.
|
|
34
|
+
if (path) client.navigated(path);
|
|
35
35
|
}, [path, client]);
|
|
36
36
|
}
|
|
37
|
-
function trackTanStackRouter(router, client =
|
|
38
|
-
return router.subscribe("onResolved", ({ toLocation }) => client.
|
|
37
|
+
function trackTanStackRouter(router, client = chunkEGCXLOFH_cjs.deBug) {
|
|
38
|
+
return router.subscribe("onResolved", ({ toLocation }) => client.navigated(toLocation.pathname));
|
|
39
39
|
}
|
|
40
40
|
|
|
41
41
|
exports.DebugErrorBoundary = DebugErrorBoundary;
|
|
42
42
|
exports.trackTanStackRouter = trackTanStackRouter;
|
|
43
43
|
exports.useDebugNavigation = useDebugNavigation;
|
|
44
|
-
//# sourceMappingURL=chunk-
|
|
45
|
-
//# sourceMappingURL=chunk-
|
|
44
|
+
//# sourceMappingURL=chunk-YELZOB7J.cjs.map
|
|
45
|
+
//# sourceMappingURL=chunk-YELZOB7J.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/react.tsx"],"names":["Component","__publicField","deBug","useEffect"],"mappings":";;;;;AAqBO,IAAM,kBAAA,GAAN,cAAiCA,eAAA,CAA0C;AAAA,EAA3E,WAAA,GAAA;AAAA,IAAA,KAAA,CAAA,GAAA,SAAA,CAAA;AACL,IAAAC,+BAAA,CAAA,IAAA,EAAA,OAAA,EAAe,EAAE,OAAO,IAAA,EAAK,CAAA;AAgB7B,IAAAA,+BAAA,CAAA,IAAA,EAAA,OAAA,EAAQ,MAAM,IAAA,CAAK,QAAA,CAAS,EAAE,KAAA,EAAO,MAAM,CAAA,CAAA;AAAA,EAAA;AAAA,EAd3C,OAAO,yBAAyB,KAAA,EAAqB;AACnD,IAAA,OAAO,EAAE,KAAA,EAAM;AAAA,EACjB;AAAA,EAEA,iBAAA,CAAkB,OAAc,IAAA,EAAiB;AA5BnD,IAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA;AA6BI,IAAA,MAAM,MAAA,GAAA,CAAS,EAAA,GAAA,IAAA,CAAK,KAAA,CAAM,MAAA,KAAX,IAAA,GAAA,EAAA,GAAqBC,uBAAA;AACpC,IAAA,IAAI,KAAK,cAAA,EAAgB;AACvB,MAAA,MAAA,CAAO,UAAA,CAAW,IAAA,EAAM,oBAAA,EAAsB,EAAE,gBAAgB,IAAA,CAAK,cAAA,CAAe,IAAA,EAAK,CAAE,KAAA,CAAM,CAAA,EAAG,IAAI,CAAA,IAAK,OAAO,CAAA;AAAA,IACtH;AACA,IAAA,MAAA,CAAO,KAAA,CAAM,KAAA,EAAO,EAAE,IAAA,EAAM,KAAK,KAAA,CAAM,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,IAAA,EAAM,EAAE,MAAA,EAAQ,gBAAA,IAAoB,CAAA;AACjG,IAAA,KAAK,OAAO,KAAA,EAAM;AAClB,IAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,IAAA,CAAK,KAAA,EAAM,OAAA,KAAX,IAAA,GAAA,MAAA,GAAA,EAAA,CAAA,IAAA,CAAA,EAAA,EAAqB,KAAA,EAAO,IAAA,CAAA;AAAA,EAC9B;AAAA,EAIA,MAAA,GAAS;AACP,IAAA,MAAM,EAAE,KAAA,EAAM,GAAI,IAAA,CAAK,KAAA;AACvB,IAAA,IAAI,CAAC,KAAA,EAAO,OAAO,IAAA,CAAK,KAAA,CAAM,QAAA;AAC9B,IAAA,MAAM,EAAE,QAAA,EAAS,GAAI,IAAA,CAAK,KAAA;AAC1B,IAAA,OAAO,OAAO,QAAA,KAAa,UAAA,GAAa,QAAA,CAAS,EAAE,KAAA,EAAO,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,CAAA,GAAK,QAAA,IAAA,IAAA,GAAA,QAAA,GAAY,IAAA;AAAA,EAChG;AACF;AAGO,SAAS,kBAAA,CAAmB,IAAA,EAA0B,MAAA,GAAsBA,uBAAA,EAAO;AACxF,EAAAC,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,IAAA,EAAM,MAAA,CAAO,SAAA,CAAU,IAAI,CAAA;AAAA,EACjC,CAAA,EAAG,CAAC,IAAA,EAAM,MAAM,CAAC,CAAA;AACnB;AAYO,SAAS,mBAAA,CAAoB,MAAA,EAAoB,MAAA,GAAsBD,uBAAA,EAAO;AACnF,EAAA,OAAO,MAAA,CAAO,SAAA,CAAU,YAAA,EAAc,CAAC,EAAE,UAAA,EAAW,KAAM,MAAA,CAAO,SAAA,CAAU,UAAA,CAAW,QAAQ,CAAC,CAAA;AACjG","file":"chunk-YELZOB7J.cjs","sourcesContent":["import { Component, useEffect, type ErrorInfo, type ReactNode } from \"react\";\nimport { deBug, type DebugClient } from \"./index\";\n\nexport interface DebugErrorBoundaryProps {\n children?: ReactNode;\n /** What to render after a crash. A function gets the error and a reset callback. */\n fallback?: ReactNode | ((props: { error: Error; reset: () => void }) => ReactNode);\n /** Part of the app this boundary protects, e.g. \"checkout\". */\n flow?: string;\n client?: DebugClient;\n onError?: (error: Error, info: ErrorInfo) => void;\n}\n\ninterface State {\n error: Error | null;\n}\n\n/**\n * Catches render errors that React would otherwise swallow (or turn into a white/red screen)\n * and reports them. Works in React DOM and React Native.\n */\nexport class DebugErrorBoundary extends Component<DebugErrorBoundaryProps, State> {\n state: State = { error: null };\n\n static getDerivedStateFromError(error: Error): State {\n return { error };\n }\n\n componentDidCatch(error: Error, info: ErrorInfo) {\n const client = this.props.client ?? deBug;\n if (info.componentStack) {\n client.breadcrumb(\"ui\", \"React render error\", { componentStack: info.componentStack.trim().slice(0, 1500) }, \"error\");\n }\n client.error(error, { flow: this.props.flow, handled: false, tags: { source: \"error-boundary\" } });\n void client.flush();\n this.props.onError?.(error, info);\n }\n\n reset = () => this.setState({ error: null });\n\n render() {\n const { error } = this.state;\n if (!error) return this.props.children;\n const { fallback } = this.props;\n return typeof fallback === \"function\" ? fallback({ error, reset: this.reset }) : (fallback ?? null);\n }\n}\n\n/** Adds a navigation breadcrumb whenever `path` changes. Works with any router. */\nexport function useDebugNavigation(path: string | undefined, client: DebugClient = deBug) {\n useEffect(() => {\n if (path) client.navigated(path);\n }, [path, client]);\n}\n\n/** Minimal shape of a TanStack Router instance (avoids a hard dependency). */\ninterface RouterLike {\n subscribe(event: \"onResolved\", fn: (e: { toLocation: { pathname: string; href?: string } }) => void): () => void;\n}\n\n/**\n * Records a breadcrumb for every navigation in a TanStack Router app:\n * const router = createRouter({ routeTree }); trackTanStackRouter(router);\n * Returns an unsubscribe function.\n */\nexport function trackTanStackRouter(router: RouterLike, client: DebugClient = deBug) {\n return router.subscribe(\"onResolved\", ({ toLocation }) => client.navigated(toLocation.pathname));\n}\n\nexport { deBug } from \"./index\";\n"]}
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
import { ContextInput, EventInput, Breadcrumb, Severity, parseStack } from '@debugkit/schema/core';
|
|
2
|
+
|
|
3
|
+
type Shallow<T> = {
|
|
4
|
+
[K in keyof T]?: T[K] extends object ? Partial<T[K]> : T[K];
|
|
5
|
+
};
|
|
6
|
+
type ContextPatch = Shallow<ContextInput>;
|
|
7
|
+
/** Merge two context patches one level deep (os, device, app ... are merged field by field). */
|
|
8
|
+
declare function mergeContext(a: ContextPatch, b: ContextPatch): ContextPatch;
|
|
9
|
+
/**
|
|
10
|
+
* Best-effort context for browsers (React, TanStack Start/Router client, Next client ...).
|
|
11
|
+
* Safe to call in any runtime: it never touches globals that might not exist.
|
|
12
|
+
*/
|
|
13
|
+
declare function browserContext(): ContextPatch;
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Automatic instrumentation installed by `init()`: network requests, console, navigation,
|
|
17
|
+
* clicks and page lifecycle. Every installer is a no-op on platforms that lack the global it
|
|
18
|
+
* patches, and returns a function that undoes the patch.
|
|
19
|
+
*/
|
|
20
|
+
interface RequestInfo {
|
|
21
|
+
method: string;
|
|
22
|
+
url: string;
|
|
23
|
+
status?: number;
|
|
24
|
+
error?: unknown;
|
|
25
|
+
aborted?: boolean;
|
|
26
|
+
timedOut?: boolean;
|
|
27
|
+
durationMs: number;
|
|
28
|
+
/** Stack captured where the request was made, so a failure points at the calling code. */
|
|
29
|
+
stack?: string;
|
|
30
|
+
}
|
|
31
|
+
/** What the instrumentation needs from the client. */
|
|
32
|
+
interface AutoSink {
|
|
33
|
+
request(info: RequestInfo): void;
|
|
34
|
+
crumb(category: "navigation" | "network" | "ui" | "log", message: string, level?: "debug" | "info" | "warning" | "error", data?: Record<string, string | number | boolean | null>): void;
|
|
35
|
+
navigated(to: string): void;
|
|
36
|
+
lifecycle(state: "foreground" | "background"): void;
|
|
37
|
+
ignored(url: string): boolean;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* "https://api.x.com/v1/orders/8812?token=abc" → "api.x.com/v1/orders/:id". Query strings and
|
|
41
|
+
* fragments never leave the device (they often carry tokens and personal data), and ids are
|
|
42
|
+
* replaced so requests group by endpoint. Same-origin URLs keep only the path.
|
|
43
|
+
*/
|
|
44
|
+
declare function normaliseUrl(raw: string): string;
|
|
45
|
+
|
|
46
|
+
declare const SDK_NAME = "@debugkit/sdk";
|
|
47
|
+
declare const SDK_VERSION = "0.2.0";
|
|
48
|
+
/** Optional persistence so events survive app restarts / offline. e.g. AsyncStorage. */
|
|
49
|
+
interface QueueStorage {
|
|
50
|
+
getItem(key: string): Promise<string | null>;
|
|
51
|
+
setItem(key: string, value: string): Promise<void>;
|
|
52
|
+
}
|
|
53
|
+
interface InitOptions {
|
|
54
|
+
/** URL of the ingest function deployed in your cloud. */
|
|
55
|
+
endpoint: string;
|
|
56
|
+
/** Public, write-only key. Safe to ship in the app. */
|
|
57
|
+
ingestKey: string;
|
|
58
|
+
app: {
|
|
59
|
+
id: string;
|
|
60
|
+
version?: string;
|
|
61
|
+
build?: string;
|
|
62
|
+
environment?: string;
|
|
63
|
+
};
|
|
64
|
+
/**
|
|
65
|
+
* Platform context. Defaults to browserContext() in browsers. The framework entry points
|
|
66
|
+
* (`/expo`, `/react-native`, `/node`) fill this in for you.
|
|
67
|
+
*/
|
|
68
|
+
context?: ContextPatch;
|
|
69
|
+
/**
|
|
70
|
+
* What deBug records on its own once initialised. Everything is on by default; pass `false`
|
|
71
|
+
* to turn it all off, or switch parts off: `autoCapture: { console: false }`.
|
|
72
|
+
*/
|
|
73
|
+
autoCapture?: boolean | AutoCaptureOptions;
|
|
74
|
+
/** Network capture settings. */
|
|
75
|
+
network?: NetworkOptions;
|
|
76
|
+
/** Fraction of errors and events to keep, 0 to 1. Sessions are never sampled. Default 1. */
|
|
77
|
+
sampleRate?: number;
|
|
78
|
+
/** At most this many errors are sent per minute, and at most a sixth of that for one repeating error. Default 60. */
|
|
79
|
+
maxErrorsPerMinute?: number;
|
|
80
|
+
/** @deprecated Use `autoCapture: { errors: false }`. */
|
|
81
|
+
captureGlobalErrors?: boolean;
|
|
82
|
+
storage?: QueueStorage;
|
|
83
|
+
/** How often queued events are sent. 0 disables the timer (edge runtimes): call flush() yourself. Default 5000. */
|
|
84
|
+
flushIntervalMs?: number;
|
|
85
|
+
maxBatch?: number;
|
|
86
|
+
maxBreadcrumbs?: number;
|
|
87
|
+
/** Drop or edit events before they are sent (PII scrubbing). Return null to drop. */
|
|
88
|
+
beforeSend?: (e: EventInput) => EventInput | null;
|
|
89
|
+
fetch?: typeof fetch;
|
|
90
|
+
debug?: boolean;
|
|
91
|
+
}
|
|
92
|
+
interface AutoCaptureOptions {
|
|
93
|
+
/** Uncaught errors and unhandled promise rejections. */
|
|
94
|
+
errors?: boolean;
|
|
95
|
+
/** fetch and XMLHttpRequest: a breadcrumb for every request, an error for each failed one. */
|
|
96
|
+
network?: boolean;
|
|
97
|
+
/** console.warn and console.error as breadcrumbs. */
|
|
98
|
+
console?: boolean;
|
|
99
|
+
/** Page changes in browsers (History API), so any router is covered. */
|
|
100
|
+
navigation?: boolean;
|
|
101
|
+
/** Clicks on buttons, links and other controls in browsers, by their label. */
|
|
102
|
+
clicks?: boolean;
|
|
103
|
+
/** Foreground/background and online/offline as breadcrumbs; flushes when the app is hidden. */
|
|
104
|
+
lifecycle?: boolean;
|
|
105
|
+
/** Session start, errored and crashed markers, for crash-free rates per release. */
|
|
106
|
+
sessions?: boolean;
|
|
107
|
+
}
|
|
108
|
+
interface NetworkOptions {
|
|
109
|
+
/** URLs never recorded (substring or regex). The ingest endpoint is always skipped. */
|
|
110
|
+
ignoreUrls?: (string | RegExp)[];
|
|
111
|
+
/**
|
|
112
|
+
* Tag requests with a flow by URL, first match wins:
|
|
113
|
+
* `flows: [["/v2/auth/", "auth.login"], [/\/payments\//, "checkout.payment"]]`.
|
|
114
|
+
*/
|
|
115
|
+
flows?: [string | RegExp, string][];
|
|
116
|
+
/** Which HTTP statuses count as failures. Default: 500 and above. Network failures and timeouts always count. */
|
|
117
|
+
isFailure?: (status: number, url: string) => boolean;
|
|
118
|
+
/** Requests slower than this get a warning breadcrumb. Default 3000ms. */
|
|
119
|
+
slowMs?: number;
|
|
120
|
+
}
|
|
121
|
+
interface EventMeta {
|
|
122
|
+
flow?: string;
|
|
123
|
+
step?: string;
|
|
124
|
+
tags?: Record<string, string>;
|
|
125
|
+
}
|
|
126
|
+
declare class DebugClient {
|
|
127
|
+
private opts;
|
|
128
|
+
private queue;
|
|
129
|
+
private crumbs;
|
|
130
|
+
private session;
|
|
131
|
+
private user;
|
|
132
|
+
private timer;
|
|
133
|
+
private flushing;
|
|
134
|
+
private backoffUntil;
|
|
135
|
+
private failures;
|
|
136
|
+
private ready;
|
|
137
|
+
private handlersInstalled;
|
|
138
|
+
private auto;
|
|
139
|
+
private restores;
|
|
140
|
+
private sessionState;
|
|
141
|
+
private lastNav;
|
|
142
|
+
private limits;
|
|
143
|
+
/** fetch as it was before instrumentation, so our own uploads are never recorded. */
|
|
144
|
+
private rawFetch;
|
|
145
|
+
init(options: InitOptions): this;
|
|
146
|
+
/** Which automatic captures are on, after defaults. */
|
|
147
|
+
get autoCapture(): Readonly<Required<AutoCaptureOptions>>;
|
|
148
|
+
/**
|
|
149
|
+
* Begin a new session: a fresh id and a "started" marker. Called by `init()`, and by the
|
|
150
|
+
* React Native entry when the app returns after 30 minutes in the background.
|
|
151
|
+
*/
|
|
152
|
+
startSession(): void;
|
|
153
|
+
/** Record a navigation breadcrumb ("from → to"). Repeated paths are ignored. */
|
|
154
|
+
navigated(to: string): void;
|
|
155
|
+
get initialized(): boolean;
|
|
156
|
+
/** Merge extra context (e.g. after an async device lookup). Applies to events sent from now on. */
|
|
157
|
+
setContext(patch: ContextPatch): void;
|
|
158
|
+
setUser(id: string | undefined): void;
|
|
159
|
+
breadcrumb(category: Breadcrumb["category"], message: string, data?: Record<string, string | number | boolean | null>, level?: Breadcrumb["level"]): void;
|
|
160
|
+
/** Log an error. `flow` is the part of the app it belongs to, e.g. "auth.login". */
|
|
161
|
+
error(err: unknown, meta?: EventMeta & {
|
|
162
|
+
severity?: Severity;
|
|
163
|
+
handled?: boolean;
|
|
164
|
+
fatal?: boolean;
|
|
165
|
+
}): void;
|
|
166
|
+
/** Log a custom event. Use outcome to let deBug compute failure rates per flow. */
|
|
167
|
+
event(name: string, meta?: EventMeta & {
|
|
168
|
+
outcome?: "success" | "failure" | "abandoned";
|
|
169
|
+
props?: Record<string, string | number | boolean | null>;
|
|
170
|
+
}): void;
|
|
171
|
+
/**
|
|
172
|
+
* Wraps an async step: logs a success or failure outcome for the flow, plus the error.
|
|
173
|
+
* Pass `{ captureError: false }` when the error is already reported elsewhere, e.g. a
|
|
174
|
+
* server function wrapped in withDebug, so it isn't counted twice.
|
|
175
|
+
*/
|
|
176
|
+
track<T>(flow: string, step: string, fn: () => Promise<T>, opts?: {
|
|
177
|
+
captureError?: boolean;
|
|
178
|
+
}): Promise<T>;
|
|
179
|
+
flush(): Promise<void>;
|
|
180
|
+
/** Stop the flush timer, undo automatic instrumentation and send what is queued. */
|
|
181
|
+
close(): Promise<void>;
|
|
182
|
+
/** @internal Used by the platform entry points for errors that have no thrown value. */
|
|
183
|
+
captureError(e: {
|
|
184
|
+
name: string;
|
|
185
|
+
message: string;
|
|
186
|
+
stack?: string;
|
|
187
|
+
frames?: ReturnType<typeof parseStack>;
|
|
188
|
+
}, meta: EventMeta & {
|
|
189
|
+
severity?: Severity;
|
|
190
|
+
handled?: boolean;
|
|
191
|
+
fatal?: boolean;
|
|
192
|
+
}, request?: {
|
|
193
|
+
method: string;
|
|
194
|
+
url: string;
|
|
195
|
+
status?: number;
|
|
196
|
+
durationMs?: number;
|
|
197
|
+
}): void;
|
|
198
|
+
/** Per-minute limits: one runaway error can't flood the queue, the network or your database. */
|
|
199
|
+
private allowError;
|
|
200
|
+
private sampled;
|
|
201
|
+
private enqueue;
|
|
202
|
+
/** Queue without sampling (sessions must be complete for crash-free rates to be right). */
|
|
203
|
+
private push;
|
|
204
|
+
private buildContext;
|
|
205
|
+
/** Set when the ingest rejects 0.2 fields: it predates them, so send what it understands. */
|
|
206
|
+
private legacyIngest;
|
|
207
|
+
private send;
|
|
208
|
+
private persist;
|
|
209
|
+
private restore;
|
|
210
|
+
private installGlobalHandlers;
|
|
211
|
+
private instrument;
|
|
212
|
+
private uninstrument;
|
|
213
|
+
/** The bridge the instrumentation (./auto, and the platform entry points) reports through. */
|
|
214
|
+
sink(): AutoSink;
|
|
215
|
+
private isIgnored;
|
|
216
|
+
private recordRequest;
|
|
217
|
+
private log;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
export { type AutoCaptureOptions as A, type ContextPatch as C, DebugClient as D, type EventMeta as E, type InitOptions as I, type NetworkOptions as N, type QueueStorage as Q, SDK_NAME as S, SDK_VERSION as a, browserContext as b, mergeContext as m, normaliseUrl as n };
|