@greenhat-services/magpie-browser 0.0.0-stage → 0.1.1

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/breadcrumbs.ts","../src/globalHandlers.ts","../src/idle.ts","../src/http.ts","../src/transport.ts","../src/uaparse.ts","../src/runtime.ts","../src/tracing.ts","../src/index.ts"],"names":["init","scrubUrl"],"mappings":"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","file":"index.js","sourcesContent":["import { type Client, type Integration, type Level, normalize, scrubUrl, truncate } from '@greenhat-services/magpie-core';\n\nconst CONSOLE_LEVELS: Array<[keyof Console, Level]> = [\n ['debug', 'debug'],\n ['log', 'info'],\n ['info', 'info'],\n ['warn', 'warning'],\n ['error', 'error'],\n];\n\n/** `console.*` calls, so the lines logged just before an error show on the issue. The original is always called. */\nexport function consoleBreadcrumbs(): Integration {\n return {\n name: 'ConsoleBreadcrumbs',\n setup(client: Client) {\n if (typeof console === 'undefined') return;\n\n const originals = new Map<keyof Console, unknown>();\n let inside = false;\n\n for (const [method, level] of CONSOLE_LEVELS) {\n const original = console[method] as (...args: unknown[]) => void;\n if (typeof original !== 'function') continue;\n originals.set(method, original);\n\n (console as unknown as Record<string, unknown>)[method] = function (this: unknown, ...args: unknown[]) {\n if (!inside) {\n // addBreadcrumb must never be able to call console again and loop.\n inside = true;\n try {\n client.addBreadcrumb({ category: 'log', level, message: args.map(format).join(' ') });\n } finally {\n inside = false;\n }\n }\n\n return original.apply(this, args);\n };\n }\n\n return () => {\n for (const [method, original] of originals) (console as unknown as Record<string, unknown>)[method] = original;\n };\n },\n };\n}\n\nfunction format(value: unknown): string {\n if (typeof value === 'string') return truncate(value, 300);\n if (value instanceof Error) return truncate(`${value.name}: ${value.message}`, 300);\n\n try {\n return truncate(JSON.stringify(normalize(value, 2, 100, 10)) ?? String(value), 300);\n } catch {\n return String(value);\n }\n}\n\n/**\n * Clicks, as the element that was clicked (`form#checkout > button.primary`). Never the text or value, which can be\n * personal; the selector alone says what the person did.\n */\nexport function clickBreadcrumbs(): Integration {\n return {\n name: 'ClickBreadcrumbs',\n setup(client: Client) {\n if (typeof document === 'undefined') return;\n\n const onClick = (event: Event) => {\n const el = event.target as Element | null;\n if (!el || !('tagName' in el)) return;\n\n client.addBreadcrumb({ category: 'ui.click', message: describeElement(el) });\n };\n\n document.addEventListener('click', onClick, { capture: true, passive: true });\n\n return () => document.removeEventListener('click', onClick, { capture: true });\n },\n };\n}\n\n/** `tag#id.class.class[data-testid]` for the element and up to two ancestors. */\nexport function describeElement(el: Element): string {\n const parts: string[] = [];\n\n for (let node: Element | null = el, depth = 0; node && depth < 3; node = node.parentElement, depth++) {\n const tag = node.tagName.toLowerCase();\n if (tag === 'html' || tag === 'body') break;\n\n let part = tag;\n if (node.id) part += `#${node.id}`;\n const classes = (typeof node.className === 'string' ? node.className : '').split(/\\s+/).filter(Boolean).slice(0, 3);\n if (classes.length) part += `.${classes.join('.')}`;\n const testId = node.getAttribute('data-testid');\n if (testId) part += `[data-testid=${testId}]`;\n\n parts.unshift(part);\n if (node.id) break;\n }\n\n return truncate(parts.join(' > ') || el.tagName.toLowerCase(), 200);\n}\n\n/** `pushState`, `replaceState` and back/forward, as navigation breadcrumbs. Query strings are scrubbed. */\nexport function historyBreadcrumbs(onNavigate?: (to: string) => void): Integration {\n return {\n name: 'HistoryBreadcrumbs',\n setup(client: Client) {\n if (typeof window === 'undefined' || !window.history) return;\n\n let from = location.href;\n const record = () => {\n const to = location.href;\n if (to === from) return;\n client.addBreadcrumb({ category: 'navigation', data: { from: scrubUrl(from), to: scrubUrl(to) } });\n from = to;\n onNavigate?.(to);\n };\n\n const restore: Array<() => void> = [];\n for (const method of ['pushState', 'replaceState'] as const) {\n const original = history[method];\n history[method] = function (this: History, ...args: Parameters<History['pushState']>) {\n const result = original.apply(this, args);\n record();\n\n return result;\n };\n restore.push(() => {\n history[method] = original;\n });\n }\n\n window.addEventListener('popstate', record);\n restore.push(() => window.removeEventListener('popstate', record));\n\n return () => restore.forEach((r) => r());\n },\n };\n}\n","import type { Client, Integration } from '@greenhat-services/magpie-core';\n\n/**\n * Reports what the page itself did not catch: `window.onerror` and unhandled promise rejections. Both are marked\n * `handled: false`, which is what puts the \"Unhandled\" label on the issue.\n */\nexport function globalHandlers(): Integration {\n return {\n name: 'GlobalHandlers',\n setup(client: Client) {\n if (typeof window === 'undefined') return;\n\n const onError = (event: ErrorEvent | Event) => {\n // A failed <img> or <script> load is an error event on the element, not on window. It says nothing\n // useful about the code, so it becomes a breadcrumb.\n const target = event.target as Element | null;\n if (target && target !== (window as unknown) && 'tagName' in target) {\n const src = (target as HTMLImageElement).src || (target as HTMLLinkElement).href || '';\n client.addBreadcrumb({ category: 'resource', level: 'warning', message: `Failed to load <${target.tagName.toLowerCase()}> ${src}`.trim() });\n\n return;\n }\n\n const e = event as ErrorEvent;\n const mechanism = { type: 'onerror', handled: false };\n\n if (e.error !== undefined && e.error !== null) {\n client.captureException(e.error, { mechanism });\n\n return;\n }\n\n // A script from another origin without CORS headers reports only \"Script error.\": nothing to act on.\n if (!e.filename && /^Script error\\.?$/i.test(e.message)) return;\n\n // No Error object (a syntax error, a very old browser): build one that points at the right place.\n const error = new Error(e.message);\n error.name = /^(\\w+Error):/.exec(e.message)?.[1] ?? 'Error';\n error.stack = e.filename ? `${error.name}: ${e.message}\\n at ${e.filename}:${e.lineno || 0}:${e.colno || 0}` : undefined;\n client.captureException(error, { mechanism });\n };\n\n const onRejection = (event: PromiseRejectionEvent) => {\n client.captureException(event.reason, { mechanism: { type: 'onunhandledrejection', handled: false } });\n };\n\n window.addEventListener('error', onError, true);\n window.addEventListener('unhandledrejection', onRejection);\n\n return () => {\n window.removeEventListener('error', onError, true);\n window.removeEventListener('unhandledrejection', onRejection);\n };\n },\n };\n}\n","import type { Transaction } from '@greenhat-services/magpie-core';\n\n/**\n * A page load or a route change has no natural end. It is finished when the page has gone quiet: nothing has been\n * requested for `idleTimeout` ms (and, for a page load, the `load` event has fired), or `maxDuration` has passed, or the\n * person left the tab. The end is back-dated to the last activity, so the quiet wait is not counted as load time.\n */\nexport interface Idle {\n requestStarted(): void;\n requestFinished(): void;\n /** Ends the transaction now, whatever is still going on. */\n finish(): void;\n}\n\nconst trackers = new WeakMap<Transaction, Idle>();\n\nexport function idleFor(tx: Transaction): Idle | undefined {\n return trackers.get(tx);\n}\n\nexport interface IdleOptions {\n idleTimeout: number;\n maxDuration: number;\n /** Wait for `window.load` before counting the page as quiet. */\n waitForLoad?: boolean;\n /** Runs just before the transaction ends: the place to add spans that were measured rather than timed. */\n beforeEnd?: (tx: Transaction, endTimestamp: number) => void;\n onEnd?: (tx: Transaction) => void;\n}\n\nexport function trackIdle(tx: Transaction, options: IdleOptions): Idle {\n let pending = 0;\n let loaded = !options.waitForLoad || (typeof document !== 'undefined' && document.readyState === 'complete');\n let lastActivity = Date.now();\n let timer: ReturnType<typeof setTimeout> | undefined;\n let ended = false;\n const cleanup: Array<() => void> = [];\n\n // Magpie counts any status other than `ok` as a failure, so leaving the tab or a slow page never sets one: the page\n // did not fail, it just stopped being measured.\n const end = (backdate: boolean) => {\n if (ended) return;\n ended = true;\n if (timer) clearTimeout(timer);\n cleanup.forEach((c) => c());\n\n // Back-dated to the last activity, but never before the transaction began.\n const endAt = Math.max(tx.startTimestamp, (backdate ? lastActivity : Date.now()) / 1000);\n options.beforeEnd?.(tx, endAt);\n tx.end(endAt);\n options.onEnd?.(tx);\n };\n\n const arm = () => {\n if (timer) clearTimeout(timer);\n if (ended || pending > 0 || !loaded) return;\n timer = setTimeout(() => end(true), options.idleTimeout);\n };\n\n const idle: Idle = {\n requestStarted() {\n pending++;\n lastActivity = Date.now();\n if (timer) clearTimeout(timer);\n },\n requestFinished() {\n pending = Math.max(0, pending - 1);\n lastActivity = Date.now();\n arm();\n },\n finish: () => end(false),\n };\n\n trackers.set(tx, idle);\n\n const max = setTimeout(() => end(false), options.maxDuration);\n cleanup.push(() => clearTimeout(max));\n\n if (typeof window !== 'undefined') {\n if (!loaded) {\n const onLoad = () => {\n loaded = true;\n lastActivity = Date.now();\n arm();\n };\n window.addEventListener('load', onLoad, { once: true });\n cleanup.push(() => window.removeEventListener('load', onLoad));\n }\n\n const onHide = () => {\n if (document.visibilityState === 'hidden') end(true);\n };\n document.addEventListener('visibilitychange', onHide);\n cleanup.push(() => document.removeEventListener('visibilitychange', onHide));\n }\n\n arm();\n\n return idle;\n}\n","import { type Client, formatTraceHeader, type Integration, scrubUrl, TRACE_HEADER, type Span } from '@greenhat-services/magpie-core';\nimport { idleFor } from './idle';\n\n/** Hosts that refused the trace header. Module-level, so the knowledge outlives one client (hot reload, re-init). */\nconst refusedHosts = new Set<string>();\n\ninterface RequestInfo {\n method: string;\n url: string;\n}\n\n/**\n * Times `fetch` and `XMLHttpRequest`. Each request becomes a breadcrumb (so the issue shows what the page was\n * fetching), a span of the active page load or navigation, and, when tracing is on, carries the `magpie-trace` header\n * so the backend (the Laravel SDK, or the Nitro server) continues the same trace.\n *\n * Requests to Magpie itself are skipped, so delivering an event can never create more events.\n */\nexport function httpIntegration(): Integration {\n return {\n name: 'Http',\n setup(client: Client) {\n if (typeof window === 'undefined') return;\n\n const restore: Array<() => void> = [];\n const skip = (url: string) => !!client.dsn && absolute(url).startsWith(client.dsn.origin);\n\n // ---- fetch\n if (typeof window.fetch === 'function') {\n const original = window.fetch;\n\n window.fetch = function patchedFetch(this: unknown, input: Parameters<typeof fetch>[0], init?: RequestInit) {\n const info = describe(input, init);\n if (skip(info.url)) return original.call(this, input, init);\n\n const crossOrigin = !sameOrigin(absolute(info.url));\n const host = hostOf(info.url);\n // A host that refused the header once is not sent it again.\n const call = begin(client, info, crossOrigin && refusedHosts.has(host));\n let args: [Parameters<typeof fetch>[0], RequestInit | undefined] = [input, init];\n\n if (call.header) {\n const headers = new Headers(init?.headers ?? (typeof Request !== 'undefined' && input instanceof Request ? input.headers : undefined));\n if (!headers.has(TRACE_HEADER)) headers.set(TRACE_HEADER, call.header);\n args = [input, { ...init, headers }];\n }\n\n const done = (response: Response) => {\n call.finish(response.status);\n\n return response;\n };\n const fail = (error: unknown): never => {\n call.finish(0);\n throw error;\n };\n\n return original.apply(this, args).then(done, (error) => {\n // A cross-origin API whose CORS policy does not allow our header rejects the whole request,\n // which would break the app's own call. Stop sending it to that host. A GET or HEAD can be asked\n // again without it, since asking twice changes nothing; anything else cannot be repeated safely.\n if (call.header && crossOrigin && error instanceof TypeError) {\n refusedHosts.add(host);\n if (client.options.debug) console.warn(`[magpie] ${host} rejected the ${TRACE_HEADER} header (its CORS policy does not allow it), so it will not be sent there again. Remove it from tracePropagationTargets, or allow the header on that API.`);\n if (info.method === 'GET' || info.method === 'HEAD') return original.call(this, input, init).then(done, fail);\n }\n\n return fail(error);\n });\n } as typeof fetch;\n\n restore.push(() => {\n window.fetch = original;\n });\n }\n\n // ---- XMLHttpRequest\n if (typeof XMLHttpRequest !== 'undefined') {\n const proto = XMLHttpRequest.prototype;\n const open = proto.open;\n const send = proto.send;\n const state = new WeakMap<XMLHttpRequest, RequestInfo>();\n\n proto.open = function (this: XMLHttpRequest, method: string, url: string | URL, ...rest: unknown[]) {\n state.set(this, { method: String(method).toUpperCase(), url: String(url) });\n\n return (open as (...a: unknown[]) => void).call(this, method, url, ...rest);\n } as typeof proto.open;\n\n proto.send = function (this: XMLHttpRequest, body?: Document | XMLHttpRequestBodyInit | null) {\n const info = state.get(this);\n if (info && !skip(info.url)) {\n const call = begin(client, info);\n if (call.header) {\n try {\n this.setRequestHeader(TRACE_HEADER, call.header);\n } catch {\n // Headers cannot be set once the request is sent; the trace just continues without it.\n }\n }\n this.addEventListener('loadend', () => call.finish(this.status));\n }\n\n return send.call(this, body);\n };\n\n restore.push(() => {\n proto.open = open;\n proto.send = send;\n });\n }\n\n return () => restore.forEach((r) => r());\n },\n };\n}\n\n/** Starts the breadcrumb timer, the span and the trace header for one request. */\nfunction begin(client: Client, info: RequestInfo, withholdHeader = false): { header: string | undefined; finish: (status: number) => void } {\n const started = performance.now();\n const parent = client.activeTransaction;\n const idle = parent ? idleFor(parent) : undefined;\n const tracing = (client.options.tracesSampleRate ?? 0) > 0 && parent !== undefined;\n\n let span: Span | undefined;\n if (parent?.sampled) {\n span = parent.startChild({ op: 'http.client', description: `${info.method} ${stripQuery(info.url)}`, data: { method: info.method } });\n idle?.requestStarted();\n } else if (parent) {\n idle?.requestStarted();\n }\n\n // The header names the request's own span, so the server's transaction is its child. Sent to same-origin\n // requests, and to the hosts listed in `tracePropagationTargets`, so third parties never see it.\n const target = absolute(info.url);\n const header = !withholdHeader && tracing && parent && (sameOrigin(target) || client.shouldPropagate(target))\n ? formatTraceHeader(parent.traceId, span?.spanId ?? parent.spanId, parent.sampled)\n : undefined;\n\n return {\n header,\n finish(status) {\n const duration = Math.round(performance.now() - started);\n const failed = status === 0 || status >= 400;\n\n if (span) {\n if (status) span.setData('status_code', status);\n span.setStatus(status === 0 ? 'unknown_error' : status >= 500 ? 'internal_error' : 'ok');\n span.end();\n }\n if (parent) idle?.requestFinished();\n\n client.addBreadcrumb({\n category: 'http',\n type: 'http',\n level: status >= 500 || status === 0 ? 'error' : failed ? 'warning' : 'info',\n message: `${info.method} ${scrubUrl(info.url)}`,\n data: { method: info.method, ...(status ? { status_code: status } : { status_code: 'failed' }), duration_ms: duration },\n });\n },\n };\n}\n\nfunction describe(input: Parameters<typeof fetch>[0], init?: RequestInit): RequestInfo {\n const isRequest = typeof Request !== 'undefined' && input instanceof Request;\n const url = typeof input === 'string' ? input : input instanceof URL ? input.href : isRequest ? (input as Request).url : String(input);\n\n return { method: (init?.method ?? (isRequest ? (input as Request).method : 'GET')).toUpperCase(), url };\n}\n\nfunction absolute(url: string): string {\n try {\n return new URL(url, location.href).href;\n } catch {\n return url;\n }\n}\n\nfunction hostOf(url: string): string {\n try {\n return new URL(url, location.href).host;\n } catch {\n return url;\n }\n}\n\nfunction sameOrigin(absoluteUrl: string): boolean {\n try {\n return new URL(absoluteUrl).origin === location.origin;\n } catch {\n return false;\n }\n}\n\n/** A request's span is named by its path: the query string would make every call a different description. */\nfunction stripQuery(url: string): string {\n return scrubUrl(url).split(/[?#]/)[0];\n}\n","import { type Dsn, endpoint, type Payload, type Transport, type TransportResult } from '@greenhat-services/magpie-core';\n\n/** Browsers refuse a keepalive request whose body is much over 64 KB, so larger ones are sent without it. */\nconst KEEPALIVE_LIMIT = 60_000;\n\n/**\n * Delivers payloads with `fetch`.\n *\n * The key travels in the query string and the body is `text/plain`, which makes this a CORS \"simple request\": the\n * browser sends it straight away with no preflight, so an event is one round trip instead of two, and `keepalive`\n * lets it finish while the page is closing. The key is public by design (it ships in every bundle), and Magpie reads\n * the raw body whatever its content type.\n */\nexport function fetchTransport(dsn: Dsn, fetchImpl: typeof fetch = (...args) => globalThis.fetch(...args)): Transport {\n const url = (payload: Payload) => `${endpoint(dsn, (payload as { type?: string }).type === 'transaction' ? 'transactions' : 'events')}?magpie_key=${encodeURIComponent(dsn.publicKey)}`;\n\n return {\n async send(payload: Payload): Promise<TransportResult> {\n try {\n const body = JSON.stringify(payload);\n const response = await fetchImpl(url(payload), {\n method: 'POST',\n body,\n headers: { 'Content-Type': 'text/plain' },\n keepalive: body.length < KEEPALIVE_LIMIT,\n mode: 'cors',\n credentials: 'omit',\n referrerPolicy: 'no-referrer',\n });\n\n return { ok: response.ok, status: response.status, retryAfter: parseRetryAfter(response.headers.get('retry-after')) };\n } catch {\n // Offline, blocked by an ad blocker, or CORS: there is nothing useful to do but drop it.\n return { ok: false };\n }\n },\n };\n}\n\nfunction parseRetryAfter(value: string | null): number | undefined {\n const seconds = Number(value);\n\n return value !== null && Number.isFinite(seconds) && seconds > 0 ? Math.min(seconds, 3600) : undefined;\n}\n","export interface Agent {\n browser: { name: string; version: string };\n os: { name: string; version?: string };\n device: 'mobile' | 'tablet' | 'desktop';\n}\n\n/**\n * The browser, OS and device class from a user-agent string. Versions are the major number: it reads cleanly\n * (\"Chrome 155\") and is what Magpie's legacy-browser filter compares. The order matters, because Edge, Opera and\n * Samsung Internet all say \"Chrome\" too, and Chrome says \"Safari\".\n */\nexport function parseUserAgent(ua: string): Agent {\n const first = (re: RegExp) => re.exec(ua)?.[1];\n const major = (v: string | undefined) => (v ? v.split('.')[0] : '');\n\n let browser: Agent['browser'] = { name: 'Unknown', version: '' };\n const rules: Array<[string, RegExp]> = [\n ['Edge', /\\bEdgA?i?O?S?\\/([\\d.]+)/],\n ['Opera', /\\bOPR\\/([\\d.]+)/],\n ['Samsung Internet', /\\bSamsungBrowser\\/([\\d.]+)/],\n ['Firefox', /\\b(?:Firefox|FxiOS)\\/([\\d.]+)/],\n ['Chrome', /\\b(?:Headless)?(?:Chrome|Chromium|CriOS)\\/([\\d.]+)/],\n ['Safari', /\\bVersion\\/([\\d.]+).*\\bSafari\\//],\n ];\n for (const [name, re] of rules) {\n const v = first(re);\n if (v) {\n browser = { name, version: major(v) };\n break;\n }\n }\n\n let os: Agent['os'] = { name: 'Unknown' };\n if (/\\bWindows NT/.test(ua)) {\n const nt = first(/\\bWindows NT ([\\d.]+)/);\n os = { name: 'Windows', version: nt === '10.0' ? '10' : nt === '6.3' ? '8.1' : nt === '6.2' ? '8' : nt === '6.1' ? '7' : nt };\n } else if (/\\b(iPhone|iPad|iPod)\\b/.test(ua)) {\n os = { name: 'iOS', version: first(/\\bOS ([\\d_]+)/)?.replace(/_/g, '.') };\n } else if (/\\bAndroid\\b/.test(ua)) {\n os = { name: 'Android', version: first(/\\bAndroid ([\\d.]+)/) };\n } else if (/\\bMac OS X\\b/.test(ua)) {\n os = { name: 'macOS', version: first(/\\bMac OS X ([\\d_.]+)/)?.replace(/_/g, '.') };\n } else if (/\\bCrOS\\b/.test(ua)) {\n os = { name: 'Chrome OS' };\n } else if (/\\bLinux\\b/.test(ua)) {\n os = { name: 'Linux' };\n }\n\n const device: Agent['device'] = /\\b(iPad|Tablet)\\b/.test(ua) || (/\\bAndroid\\b/.test(ua) && !/\\bMobile\\b/.test(ua)) ? 'tablet' : /\\b(iPhone|iPod|Mobile)\\b/.test(ua) ? 'mobile' : 'desktop';\n\n return { browser, os, device };\n}\n","import { type Runtime, SDK_VERSION } from '@greenhat-services/magpie-core';\nimport { fetchTransport } from './transport';\nimport { parseUserAgent } from './uaparse';\n\nexport const SDK_NAME = 'magpie.javascript.browser';\n\n/**\n * What a browser tells Magpie about itself: the browser and OS contexts, and the page's URL with the user agent.\n * The referrer is only sent with `sendDefaultPii`, since where someone came from says something about them.\n */\nexport function browserRuntime(options: { sendDefaultPii?: boolean; sdkName?: string; fetch?: typeof fetch } = {}): Runtime {\n let agent: ReturnType<typeof parseUserAgent> | undefined;\n const ua = () => (typeof navigator === 'undefined' ? '' : navigator.userAgent);\n const parsed = () => (agent ??= parseUserAgent(ua()));\n\n return {\n sdk: { name: options.sdkName ?? SDK_NAME, version: SDK_VERSION },\n platform: 'javascript',\n // The caller passes the original fetch, taken before it is patched, so delivering an event is never itself traced.\n createTransport: (dsn) => fetchTransport(dsn, options.fetch),\n\n contexts() {\n const a = parsed();\n\n return {\n browser: { name: a.browser.name, version: a.browser.version },\n os: { name: a.os.name, ...(a.os.version ? { version: a.os.version } : {}) },\n device: {\n type: a.device,\n ...(typeof screen !== 'undefined' ? { screen_resolution: `${screen.width}x${screen.height}` } : {}),\n ...(typeof navigator !== 'undefined' && navigator.language ? { language: navigator.language } : {}),\n },\n };\n },\n\n request() {\n if (typeof location === 'undefined') return undefined;\n\n return {\n url: location.href,\n headers: {\n 'User-Agent': ua(),\n ...(options.sendDefaultPii && typeof document !== 'undefined' && document.referrer ? { Referer: document.referrer } : {}),\n },\n };\n },\n };\n}\n","import { type Client, type Integration, parseTraceHeader, type Transaction } from '@greenhat-services/magpie-core';\nimport { idleFor, trackIdle } from './idle';\n\nexport interface TracingOptions {\n /** Trace the first page load. Default true. */\n pageload?: boolean;\n /** Also start a navigation transaction on every history change. Off by default: without a router the path is the\n * only name there is, and `/users/7` and `/users/8` would be two transactions. Use the Vue router integration. */\n history?: boolean;\n /** Quiet time, in ms, that ends a page load or navigation. Default 1000. */\n idleTimeout?: number;\n /** The longest a page load or navigation may stay open, in ms. Default 15000. */\n maxDuration?: number;\n}\n\nconst DEFAULTS = { pageload: true, history: false, idleTimeout: 1000, maxDuration: 15_000 };\n\n/** The settings each client was started with, for `startNavigation` to reuse. */\nconst settings = new WeakMap<Client, Required<TracingOptions>>();\n\n/**\n * Page loads and route changes as transactions. A page load starts at the browser's own time origin and ends when the\n * page is quiet; its spans are the browser's navigation timings (DNS, connect, request, response, DOM, load), the\n * scripts and styles it fetched, and the paint milestones. Every `fetch` and XHR in between becomes a span too.\n */\nexport function tracingIntegration(options: TracingOptions = {}): Integration {\n return {\n name: 'Tracing',\n setup(client: Client) {\n if (typeof window === 'undefined' || !((client.options.tracesSampleRate ?? 0) > 0)) return;\n\n const config = { ...DEFAULTS, ...options };\n settings.set(client, config);\n const teardown: Array<() => void> = [];\n\n if (config.pageload) startPageload(client, config);\n\n if (config.history) {\n const onChange = () => startNavigation(client, location.pathname);\n window.addEventListener('popstate', onChange);\n teardown.push(() => window.removeEventListener('popstate', onChange));\n }\n\n return () => {\n idleFor(client.activeTransaction as Transaction)?.finish();\n teardown.forEach((t) => t());\n };\n },\n };\n}\n\n/** Begins timing a route change under `name` (use the route pattern, `/users/:id`, not the address). */\nexport function startNavigation(client: Client, name: string): Transaction | undefined {\n const config = settings.get(client);\n if (!config) return undefined;\n\n // A navigation that begins while the previous one is still open ends it: the person has moved on.\n if (client.activeTransaction) idleFor(client.activeTransaction)?.finish();\n\n const tx = client.startTransaction({ name, op: 'navigation' });\n client.activeTransaction = tx;\n client.scope.setTransactionName(name);\n trackIdle(tx, {\n idleTimeout: config.idleTimeout,\n maxDuration: config.maxDuration,\n onEnd: (ended) => {\n if (client.activeTransaction === ended) client.activeTransaction = undefined;\n },\n });\n\n return tx;\n}\n\n/** Renames the page load or navigation in progress, which is how a router swaps `/users/7` for `/users/:id`. */\nexport function renameActiveTransaction(client: Client, name: string): void {\n client.activeTransaction?.setName(name);\n client.scope.setTransactionName(name);\n}\n\nfunction startPageload(client: Client, config: Required<TracingOptions>): void {\n // A server that rendered this page can hand over its trace in <meta name=\"magpie-trace\">, so the server's work and\n // the browser's load are one trace.\n const meta = document.querySelector('meta[name=\"magpie-trace\"]')?.getAttribute('content');\n const parent = parseTraceHeader(meta);\n\n const tx = client.startTransaction({\n name: location.pathname,\n op: 'pageload',\n startTimestamp: performance.timeOrigin / 1000,\n ...(parent ? { traceId: parent.traceId, parentSpanId: parent.spanId, sampled: parent.sampled } : {}),\n });\n client.activeTransaction = tx;\n client.scope.setTransactionName(tx.name);\n\n const lcp = observeLargestPaint();\n\n trackIdle(tx, {\n idleTimeout: config.idleTimeout,\n maxDuration: config.maxDuration,\n waitForLoad: true,\n beforeEnd: (t) => addPageloadSpans(client, t, lcp()),\n onEnd: (ended) => {\n if (client.activeTransaction === ended) client.activeTransaction = undefined;\n },\n });\n}\n\n/** The most recent largest-contentful-paint time, in ms from the time origin. */\nfunction observeLargestPaint(): () => number | undefined {\n let value: number | undefined;\n\n try {\n const observer = new PerformanceObserver((list) => {\n const last = list.getEntries().at(-1);\n if (last) value = last.startTime;\n });\n observer.observe({ type: 'largest-contentful-paint', buffered: true });\n } catch {\n // Not every browser reports it.\n }\n\n return () => value;\n}\n\nfunction addPageloadSpans(client: Client, tx: Transaction, lcp: number | undefined): void {\n if (!tx.sampled) return;\n\n try {\n const origin = performance.timeOrigin;\n const at = (ms: number) => (origin + ms) / 1000;\n const add = (op: string, description: string, from: number, to: number) => {\n if (!(to > from) && !(op === 'ui.paint' && to === from)) return;\n const span = tx.startChild({ op, description, startTimestamp: at(from) });\n span.end(at(to));\n };\n\n const nav = performance.getEntriesByType('navigation')[0] as PerformanceNavigationTiming | undefined;\n if (nav) {\n add('browser.dns', 'DNS lookup', nav.domainLookupStart, nav.domainLookupEnd);\n add('browser.connect', 'Connection', nav.connectStart, nav.connectEnd);\n add('browser.request', 'Waiting for the first byte', nav.requestStart, nav.responseStart);\n add('browser.response', 'Downloading the document', nav.responseStart, nav.responseEnd);\n add('browser.dom', 'Building the page', nav.responseEnd, nav.domContentLoadedEventEnd);\n add('browser.load', 'Loading everything else', nav.domContentLoadedEventEnd, nav.loadEventEnd);\n }\n\n const fcp = performance.getEntriesByName('first-contentful-paint')[0];\n if (fcp) add('ui.paint', 'first-contentful-paint', fcp.startTime, fcp.startTime);\n if (lcp !== undefined) add('ui.paint', 'largest-contentful-paint', lcp, lcp);\n\n // Scripts, styles and images the page fetched. Requests made by fetch and XHR already have their own spans.\n const ingest = client.dsn?.origin;\n performance\n .getEntriesByType('resource')\n .filter((r) => {\n const entry = r as PerformanceResourceTiming;\n\n return ['script', 'link', 'css', 'img'].includes(entry.initiatorType) && entry.responseEnd > 0 && !(ingest && entry.name.startsWith(ingest));\n })\n .slice(0, 25)\n .forEach((r) => {\n const entry = r as PerformanceResourceTiming;\n add(`resource.${entry.initiatorType}`, entry.name.split(/[?#]/)[0], entry.startTime, entry.responseEnd);\n });\n } catch {\n // Timing APIs are best effort: a page load without spans is still a page load.\n }\n}\n","import {\n Client,\n getClient,\n type Integration,\n type Options,\n setClient,\n} from '@greenhat-services/magpie-core';\nimport { clickBreadcrumbs, consoleBreadcrumbs, historyBreadcrumbs } from './breadcrumbs';\nimport { globalHandlers } from './globalHandlers';\nimport { httpIntegration } from './http';\nimport { browserRuntime } from './runtime';\nimport { tracingIntegration, type TracingOptions } from './tracing';\n\nexport * from '@greenhat-services/magpie-core';\nexport { clickBreadcrumbs, consoleBreadcrumbs, describeElement, historyBreadcrumbs } from './breadcrumbs';\nexport { globalHandlers } from './globalHandlers';\nexport { httpIntegration } from './http';\nexport { renameActiveTransaction, startNavigation, tracingIntegration, type TracingOptions } from './tracing';\nexport { fetchTransport } from './transport';\nexport { parseUserAgent } from './uaparse';\n\nexport interface BreadcrumbOptions {\n console?: boolean;\n clicks?: boolean;\n history?: boolean;\n /** Requests made with `fetch` and XMLHttpRequest. */\n http?: boolean;\n}\n\nexport interface BrowserOptions extends Options {\n /** Report `window.onerror` and unhandled promise rejections. Default true. */\n captureUnhandled?: boolean;\n /** `false` for none, or choose: console, clicks, history and http are all on by default. */\n breadcrumbs?: boolean | BreadcrumbOptions;\n /** Page load and route tracing. On whenever `tracesSampleRate` is above zero; `false` turns it off. */\n tracing?: boolean | TracingOptions;\n /** What this SDK calls itself in events. The framework packages set it. */\n sdkName?: string;\n}\n\n/** The release a build script put on the page, for apps that do not pass one. Vite users write `import.meta.env.VITE_MAGPIE_RELEASE`. */\nconst injectedRelease = (): string | undefined => (globalThis as { __MAGPIE_RELEASE__?: string }).__MAGPIE_RELEASE__;\n\n/**\n * Starts Magpie in the browser. Call it once, as early as you can, before the app mounts. On the server (no `window`)\n * it does nothing and returns undefined, so the same entry file is safe in server-rendered apps.\n */\nexport function init(options: BrowserOptions = {}): Client | undefined {\n if (typeof window === 'undefined') return undefined;\n\n // Initialising twice (hot reload, a second entry point) replaces the first client instead of doubling every handler.\n const previous = getClient();\n if (previous) void previous.close(0);\n\n const { captureUnhandled = true, breadcrumbs = true, tracing, sdkName, integrations = [], ...rest } = options;\n const crumbs: BreadcrumbOptions = breadcrumbs === false ? {} : { console: true, clicks: true, history: true, http: true, ...(breadcrumbs === true ? {} : breadcrumbs) };\n const tracesOn = (rest.tracesSampleRate ?? 0) > 0 && tracing !== false;\n\n // Taken before the http integration patches it, so delivering an event is never itself traced.\n const nativeFetch = typeof window.fetch === 'function' ? window.fetch.bind(window) : undefined;\n\n const client = new Client(\n { ...rest, release: rest.release ?? injectedRelease() },\n browserRuntime({ sendDefaultPii: rest.sendDefaultPii, sdkName, fetch: nativeFetch }),\n );\n\n const defaults: Integration[] = [\n ...(captureUnhandled ? [globalHandlers()] : []),\n ...(crumbs.console ? [consoleBreadcrumbs()] : []),\n ...(crumbs.clicks ? [clickBreadcrumbs()] : []),\n ...(crumbs.history ? [historyBreadcrumbs()] : []),\n // Request breadcrumbs and spans share one patch, and tracing needs it, so it runs when either is wanted.\n ...(crumbs.http || tracesOn ? [httpIntegration()] : []),\n ...(tracesOn ? [tracingIntegration(typeof tracing === 'object' ? tracing : {})] : []),\n ];\n\n setClient(client);\n // Tracing runs after http so the page load exists before the first request is made.\n client.scope.setTransactionName(location.pathname);\n client.setupIntegrations([...defaults.filter((i) => i.name !== 'Tracing'), ...defaults.filter((i) => i.name === 'Tracing'), ...integrations]);\n\n return client;\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,42 @@
1
1
  {
2
- "name": "@greenhat-services/magpie-browser",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
2
+ "name": "@greenhat-services/magpie-browser",
3
+ "version": "0.1.1",
4
+ "description": "Magpie error tracking and performance monitoring for the browser.",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "sideEffects": false,
8
+ "main": "./dist/index.cjs",
9
+ "module": "./dist/index.js",
10
+ "types": "./dist/index.d.ts",
11
+ "exports": {
12
+ ".": {
13
+ "types": "./dist/index.d.ts",
14
+ "import": "./dist/index.js",
15
+ "require": "./dist/index.cjs"
16
+ }
17
+ },
18
+ "files": [
19
+ "dist"
20
+ ],
21
+ "scripts": {
22
+ "build": "tsup",
23
+ "prepack": "npm run build"
24
+ },
25
+ "dependencies": {
26
+ "@greenhat-services/magpie-core": "^0.1.0"
27
+ },
28
+ "publishConfig": {
29
+ "access": "public"
30
+ },
31
+ "repository": {
32
+ "type": "git",
33
+ "url": "git+https://github.com/Greenhat-Services/magpie-js.git",
34
+ "directory": "packages/browser"
35
+ },
36
+ "keywords": [
37
+ "magpie",
38
+ "error-tracking",
39
+ "monitoring",
40
+ "browser"
41
+ ]
42
+ }