@oconde/radar 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/client.ts","../src/context.ts","../src/express.ts","../src/protocol/index.ts","../src/redact.ts","../src/serialize.ts","../src/request.ts","../src/options.ts","../src/process-handlers.ts","../src/source.ts","../src/stack.ts","../src/transport.ts","../src/util.ts","../src/version.ts","../src/radar.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\nimport { hostname } from 'node:os';\nimport { performance } from 'node:perf_hooks';\nimport { currentContext, runWithContext, type RadarContext, type RequestLike } from './context.js';\nimport { createMiddleware, type RadarMiddleware } from './express.js';\nimport { levelEnabled, resolveOptions, type RadarOptions, type RedactMode, type ResolvedOptions } from './options.js';\nimport { installProcessHandlers } from './process-handlers.js';\nimport {\n INGEST_PATH,\n LIMITS,\n type ErrorEvent,\n type LogEvent,\n type LogLevel,\n type RadarEvent,\n type RequestInfo,\n type RuntimeInfo,\n type UserInfo,\n} from './protocol/index.js';\nimport { redactPath, requestInfo, requestPath, requestRoute } from './request.js';\nimport { setFingerprintSecret } from './redact.js';\nimport { prepareAttrs, truncate } from './serialize.js';\nimport { enrichException } from './source.js';\nimport { exceptionInfo } from './stack.js';\nimport { Transport } from './transport.js';\nimport { describeError, elapsedSince } from './util.js';\nimport { SDK_NAME, SDK_VERSION } from './version.js';\n\nexport type Attributes = Record<string, unknown>;\nexport type LogRequestOptions = { level?: LogLevel; redact?: RedactMode };\n\ntype LogExtras = { request?: RequestInfo; mode?: RedactMode };\n\nexport class RadarClient {\n private options: ResolvedOptions = resolveOptions({}, {});\n private transport: Transport | null = null;\n private initialized = false;\n private closed = false;\n private readonly captured = new WeakSet<object>();\n\n get isEnabled(): boolean {\n return this.transport !== null && !this.closed;\n }\n\n get settings(): Readonly<ResolvedOptions> {\n return this.options;\n }\n\n init(options: RadarOptions = {}): void {\n try {\n if (this.initialized) {\n this.debugWarn('radar.init chamado mais de uma vez; mantida a primeira configuração');\n return;\n }\n this.initialized = true;\n this.options = resolveOptions(options);\n setFingerprintSecret(this.options.key);\n if (this.options.enabled && this.options.key) {\n this.transport = new Transport({\n url: this.options.endpoint + INGEST_PATH,\n key: this.options.key,\n sdk: { name: SDK_NAME, version: SDK_VERSION },\n environment: this.options.environment,\n ...(this.options.release ? { release: this.options.release } : {}),\n onWarning: (message, always) => (always ? this.writeWarning(message) : this.debugWarn(message)),\n });\n }\n if (this.options.captureUnhandled && (this.transport || this.options.console)) installProcessHandlers(this);\n } catch (error) {\n this.debugWarn(`radar.init falhou: ${describeError(error)}`);\n }\n }\n\n debug(message: string, data?: Attributes): void {\n this.safely(() => this.emitLog('debug', message, data));\n }\n\n info(message: string, data?: Attributes): void {\n this.safely(() => this.emitLog('info', message, data));\n }\n\n warn(message: string, data?: Attributes): void {\n this.safely(() => this.emitLog('warn', message, data));\n }\n\n error(message: string, data?: Attributes): void {\n this.safely(() => this.emitLog('error', message, data));\n }\n\n logRequest(title: string, data?: Attributes, options: LogRequestOptions = {}): void {\n this.safely(() => {\n const context = currentContext();\n const mode = options.redact ?? this.options.redact;\n const request = context?.req ? requestInfo(context.req, mode, { route: context.route }, this.options.requestDetail) : undefined;\n this.emitLog(options.level ?? 'info', title, data, { request, mode });\n });\n }\n\n captureError(error: unknown, data?: Attributes): void {\n this.safely(() => this.emitError(error, data, 'error', true));\n }\n\n captureUnhandled(error: unknown, level: 'error' | 'fatal'): void {\n this.safely(() => this.emitError(error, undefined, level, false));\n }\n\n setUser(user: UserInfo): void {\n this.safely(() => {\n const context = currentContext();\n if (!context) return;\n context.user = {\n ...(user.id !== undefined && user.id !== null ? { id: truncate(String(user.id), 200) } : {}),\n ...(user.email ? { email: truncate(String(user.email), 200) } : {}),\n ...(user.name ? { name: truncate(String(user.name), 200) } : {}),\n };\n });\n }\n\n async track<T>(name: string, fn: () => T | Promise<T>, data?: Attributes): Promise<T> {\n const execute = async (): Promise<T> => {\n const started = performance.now();\n try {\n const result = await fn();\n this.info(name, { ...data, durationMs: elapsedSince(started), ok: true });\n return result;\n } catch (error) {\n this.error(name, { ...data, durationMs: elapsedSince(started), ok: false });\n this.captureError(error, data);\n throw error;\n }\n };\n if (currentContext()) return execute();\n return runWithContext({ requestId: randomUUID(), startedAt: performance.now() }, execute);\n }\n\n middleware(): RadarMiddleware {\n return createMiddleware(this);\n }\n\n shouldLogRequest(req: RequestLike): boolean {\n return this.options.logRequests && !this.options.ignorePaths.includes(requestPath(req));\n }\n\n logHttpRequest(context: RadarContext, status: number): void {\n this.safely(() => {\n const req = context.req;\n if (!req) return;\n const level: LogLevel = status >= 500 ? 'error' : status >= 400 ? 'warn' : 'info';\n const route = requestRoute(req, context.route);\n runWithContext(context, () =>\n this.emitLog(level, 'http.request', {\n method: (req.method ?? 'GET').toUpperCase(),\n ...(route ? { route } : {}),\n ...(this.options.requestDetail === 'full' ? { path: redactPath(requestPath(req), req.params, this.options.redact) } : {}),\n status,\n durationMs: elapsedSince(context.startedAt),\n }),\n );\n });\n }\n\n async flush(timeoutMs = 2000): Promise<void> {\n try {\n await this.transport?.flush(timeoutMs);\n } catch (error) {\n this.debugWarn(`flush falhou: ${describeError(error)}`);\n }\n }\n\n async close(timeoutMs = 2000): Promise<void> {\n if (this.closed) return;\n await this.flush(timeoutMs);\n this.closed = true;\n this.transport?.stop();\n }\n\n private emitLog(level: LogLevel, message: string, data: Attributes | undefined, extras: LogExtras = {}): void {\n if (this.closed || !levelEnabled(level, this.options.minLevel)) return;\n const context = currentContext();\n const mode = extras.mode ?? this.options.redact;\n const event: LogEvent = {\n type: 'log',\n ts: Date.now(),\n level,\n message: truncate(String(message), LIMITS.messageLength),\n ...(context ? { requestId: context.requestId } : {}),\n ...(data !== undefined ? { attrs: prepareAttrs(data, mode) } : {}),\n ...(extras.request ? { request: extras.request } : {}),\n ...(context?.user ? { user: context.user } : {}),\n };\n this.print(event);\n this.transport?.enqueue(event);\n }\n\n private emitError(error: unknown, data: Attributes | undefined, level: 'error' | 'fatal', handled: boolean): void {\n if (this.closed) return;\n if (typeof error === 'object' && error !== null) {\n if (this.captured.has(error)) return;\n this.captured.add(error);\n }\n const context = currentContext();\n const mode = this.options.redact;\n const event: ErrorEvent = {\n type: 'error',\n ts: Date.now(),\n level,\n handled,\n exception: exceptionInfo(error),\n ...(context ? { requestId: context.requestId } : {}),\n ...(context?.req ? { request: requestInfo(context.req, mode, { route: context.route }, this.options.requestDetail) } : {}),\n ...(context?.user ? { user: context.user } : {}),\n runtime: runtimeInfo(),\n ...(data !== undefined ? { attrs: prepareAttrs(data, mode) } : {}),\n };\n this.print(event, error instanceof Error ? error.stack : undefined);\n if (!this.transport) return;\n this.transport.enqueue(() =>\n enrichException(event.exception).then(\n (exception) => ({ ...event, exception }),\n () => event,\n ),\n );\n }\n\n private print(event: RadarEvent, stack?: string): void {\n if (!this.options.console) return;\n try {\n const requestId = event.requestId ? { requestId: event.requestId } : {};\n if (event.type === 'log') {\n const line = { ...event.attrs, ts: new Date(event.ts).toISOString(), level: event.level, message: event.message, ...requestId };\n (event.level === 'error' ? process.stderr : process.stdout).write(`${JSON.stringify(line)}\\n`);\n return;\n }\n const line = {\n ...event.attrs,\n ts: new Date(event.ts).toISOString(),\n level: event.level,\n message: `${event.exception.type}: ${event.exception.message}`,\n ...requestId,\n ...(stack ? { stack } : {}),\n };\n process.stderr.write(`${JSON.stringify(line)}\\n`);\n } catch {\n return;\n }\n }\n\n private safely(action: () => void): void {\n try {\n action();\n } catch (error) {\n this.debugWarn(`falha interna do Radar: ${describeError(error)}`);\n }\n }\n\n private debugWarn(message: string): void {\n if (this.options.debug) this.writeWarning(message);\n }\n\n private writeWarning(message: string): void {\n try {\n process.stderr.write(`[radar] ${message}\\n`);\n } catch {\n return;\n }\n }\n}\n\nfunction runtimeInfo(): RuntimeInfo {\n return {\n name: 'node',\n version: process.versions.node,\n host: hostname(),\n pid: process.pid,\n memoryMb: Math.round(process.memoryUsage.rss() / 1_048_576),\n uptimeS: Math.round(process.uptime()),\n };\n}\n","import { AsyncLocalStorage } from 'node:async_hooks';\nimport type { UserInfo } from './protocol/index.js';\n\nexport type HeaderValue = string | string[] | number | undefined;\n\nexport type RequestLike = {\n method?: string;\n url?: string;\n originalUrl?: string;\n route?: { path?: unknown };\n params?: Record<string, unknown>;\n query?: unknown;\n headers: Record<string, HeaderValue>;\n body?: unknown;\n ip?: string;\n socket?: { remoteAddress?: string };\n};\n\nexport type ResponseLike = {\n statusCode: number;\n setHeader(name: string, value: string): unknown;\n once(event: 'finish', listener: () => void): unknown;\n};\n\nexport type RadarContext = {\n requestId: string;\n startedAt: number;\n req?: RequestLike;\n route?: string;\n user?: UserInfo;\n};\n\ntype GlobalState = { storage: AsyncLocalStorage<RadarContext>; client?: unknown };\n\nconst STATE_KEY = Symbol.for('@oconde/radar');\n\nexport function globalState(): GlobalState {\n const holder = globalThis as unknown as Record<symbol, GlobalState | undefined>;\n let state = holder[STATE_KEY];\n if (!state) {\n state = { storage: new AsyncLocalStorage<RadarContext>() };\n holder[STATE_KEY] = state;\n }\n return state;\n}\n\nexport function currentContext(): RadarContext | undefined {\n return globalState().storage.getStore();\n}\n\nexport function runWithContext<T>(context: RadarContext, fn: () => T): T {\n return globalState().storage.run(context, fn);\n}\n","import { randomUUID } from 'node:crypto';\nimport { performance } from 'node:perf_hooks';\nimport { runWithContext, type RadarContext, type RequestLike, type ResponseLike } from './context.js';\nimport { LIMITS } from './protocol/index.js';\nimport { headerValue } from './request.js';\n\nexport type RequestLogger = {\n shouldLogRequest(req: RequestLike): boolean;\n logHttpRequest(context: RadarContext, status: number): void;\n};\n\nexport type RadarMiddleware = (req: RequestLike, res: ResponseLike, next: (error?: unknown) => void) => void;\n\nexport function createMiddleware(logger: RequestLogger): RadarMiddleware {\n return (req, res, next) => {\n let context: RadarContext;\n try {\n const incoming = headerValue(req.headers['x-request-id'])?.trim();\n const requestId = incoming && incoming.length <= LIMITS.requestIdLength ? incoming : randomUUID();\n context = { requestId, startedAt: performance.now(), req };\n res.setHeader('x-request-id', requestId);\n if (logger.shouldLogRequest(req)) res.once('finish', () => logger.logHttpRequest(context, res.statusCode));\n } catch {\n next();\n return;\n }\n runWithContext(context, () => next());\n };\n}\n","export const PROTOCOL_VERSION = 1;\n\nexport const INGEST_PATH = '/api/v1/events';\n\nexport const LIMITS = {\n batchBytes: 1_000_000,\n batchEvents: 500,\n messageLength: 2000,\n stringLength: 2000,\n attrsBytes: 16_384,\n bodyBytes: 16_384,\n headers: 50,\n frames: 50,\n contextFrames: 10,\n contextLines: 5,\n contextLineLength: 300,\n causeDepth: 5,\n depth: 6,\n arrayItems: 50,\n requestIdLength: 128,\n} as const;\n\nexport type LogLevel = 'debug' | 'info' | 'warn' | 'error';\n\nexport type EventBatch = {\n v: 1;\n sdk: { name: string; version: string };\n environment?: string;\n release?: string;\n dropped?: number;\n events: RadarEvent[];\n};\n\nexport type RadarEvent = LogEvent | ErrorEvent;\n\nexport type LogEvent = {\n type: 'log';\n ts: number;\n level: LogLevel;\n message: string;\n requestId?: string;\n attrs?: Record<string, unknown>;\n request?: RequestInfo;\n user?: UserInfo;\n};\n\nexport type ErrorEvent = {\n type: 'error';\n ts: number;\n level: 'error' | 'fatal';\n handled: boolean;\n requestId?: string;\n exception: ExceptionInfo;\n request?: RequestInfo;\n user?: UserInfo;\n runtime?: RuntimeInfo;\n attrs?: Record<string, unknown>;\n};\n\nexport type ExceptionInfo = {\n type: string;\n message: string;\n frames: StackFrame[];\n cause?: ExceptionInfo;\n};\n\nexport type StackFrame = {\n fn?: string;\n file: string;\n line?: number;\n col?: number;\n inApp: boolean;\n context?: { pre: string[]; line: string; post: string[] };\n};\n\nexport type RequestInfo = {\n method: string;\n url: string;\n route?: string;\n params?: Record<string, string>;\n query?: Record<string, unknown>;\n headers?: Record<string, string>;\n body?: unknown;\n ip?: string;\n userAgent?: string;\n status?: number;\n durationMs?: number;\n};\n\nexport type UserInfo = { id?: string; email?: string; name?: string };\n\nexport type RuntimeInfo = {\n name: 'node';\n version: string;\n host?: string;\n pid?: number;\n memoryMb?: number;\n uptimeS?: number;\n};\n\nexport type IngestResponse = { accepted: number; dropped: number };\n\nexport type IngestErrorCode =\n | 'invalid_key'\n | 'account_disabled'\n | 'payload_too_large'\n | 'invalid_batch'\n | 'quota_exceeded'\n | 'rate_limited';\n\nexport type IngestError = { error: { code: IngestErrorCode; message: string } };\n","import { createHash, createHmac, randomBytes } from 'node:crypto';\nimport type { RedactMode } from './options.js';\n\nconst SECRET_WORDS = new Set([\n 'pass',\n 'passwd',\n 'password',\n 'passwords',\n 'senha',\n 'secret',\n 'secrets',\n 'token',\n 'tokens',\n 'authorization',\n 'auth',\n 'cookie',\n 'cookies',\n 'apikey',\n 'privatekey',\n 'cpf',\n 'card',\n 'cvv',\n 'cvc',\n 'pin',\n 'otp',\n 'signature',\n 'jwt',\n 'session',\n 'sessionid',\n 'credential',\n 'credentials',\n]);\nconst SECRET_PAIRS = [\n ['api', 'key'],\n ['private', 'key'],\n ['access', 'key'],\n ['secret', 'key'],\n];\nconst LOW_ENTROPY_WORDS = new Set(['pass', 'passwd', 'password', 'passwords', 'senha', 'cpf', 'card', 'cvv', 'cvc', 'pin', 'otp']);\nconst CUSTOM_SECRET_HEADER = /^x-.+-(key|secret|token)$/i;\nconst AUTH_SCHEME = /^(Bearer|Basic|Token|Digest|ApiKey)\\s+/i;\nconst JWT_PREFIX = /^eyJ[A-Za-z0-9_-]{8,}\\.[A-Za-z0-9_-]{8,}\\./;\nconst MAX_DEPTH = 8;\nconst KEY_SLOT = Symbol.for('@oconde/radar/fingerprint-key');\n\ntype FingerprintSlot = { key: Buffer };\n\nfunction fingerprintSlot(): FingerprintSlot {\n const holder = globalThis as unknown as Record<symbol, FingerprintSlot | undefined>;\n let slot = holder[KEY_SLOT];\n if (!slot) {\n slot = { key: randomBytes(32) };\n holder[KEY_SLOT] = slot;\n }\n return slot;\n}\n\nexport function setFingerprintSecret(secret: string | undefined): void {\n fingerprintSlot().key = secret ? createHash('sha256').update(`@oconde/radar:${secret}`).digest() : randomBytes(32);\n}\n\nexport function fingerprint(value: string): string {\n return createHmac('sha256', fingerprintSlot().key).update(value).digest('hex').slice(0, 8);\n}\n\nfunction words(name: string): string[] {\n return name\n .replace(/([a-z0-9])([A-Z])/g, '$1 $2')\n .toLowerCase()\n .split(/[^a-z0-9]+/)\n .filter(Boolean);\n}\n\nexport function isSensitiveKey(key: string): boolean {\n const parts = words(key);\n if (parts.length === 1 && parts[0] === 'key') return true;\n if (parts.some((part) => SECRET_WORDS.has(part))) return true;\n return SECRET_PAIRS.some(([first, second]) => parts.some((part, index) => part === first && parts[index + 1] === second));\n}\n\nexport function isLowEntropyKey(key: string): boolean {\n return words(key).some((part) => LOW_ENTROPY_WORDS.has(part));\n}\n\nexport function isSensitiveHeader(name: string): boolean {\n return isSensitiveKey(name) || CUSTOM_SECRET_HEADER.test(name);\n}\n\nexport function looksLikeCredential(value: string): boolean {\n const head = value.slice(0, 64);\n return AUTH_SCHEME.test(head.slice(0, 16)) || JWT_PREFIX.test(head);\n}\n\nexport function maskValue(value: unknown, revealEdges = true): string {\n const text = typeof value === 'string' ? value : (JSON.stringify(value) ?? String(value));\n const scheme = AUTH_SCHEME.exec(text.slice(0, 16));\n const prefix = scheme ? `${scheme[1]} ` : '';\n const secret = scheme ? text.slice(scheme[0].length) : text;\n const visible = revealEdges && secret.length > 12 ? `${secret.slice(0, 4)}…${secret.slice(-4)}` : '•••';\n return `${prefix}${visible} #${fingerprint(text)}`;\n}\n\nexport function redactDeep(value: unknown, mode: RedactMode, depth = 0): unknown {\n if (mode === 'none' || depth > MAX_DEPTH || value === null) return value;\n if (typeof value === 'string') return looksLikeCredential(value) ? maskValue(value) : value;\n if (typeof value !== 'object') return value;\n if (Array.isArray(value)) return value.map((item) => redactDeep(item, mode, depth + 1));\n const result: Record<string, unknown> = {};\n for (const [key, item] of Object.entries(value)) {\n const hasValue = item !== null && item !== undefined && item !== '';\n result[key] = isSensitiveKey(key) && hasValue ? maskValue(item, !isLowEntropyKey(key)) : redactDeep(item, mode, depth + 1);\n }\n return result;\n}\n","import type { RedactMode } from './options.js';\nimport { LIMITS } from './protocol/index.js';\nimport { redactDeep } from './redact.js';\n\nexport const TRUNCATED = '…[cortado]';\nexport const LIMIT_REACHED = '…[limite]';\n\nconst MAX_NODES = 2000;\n\ntype Budget = { remaining: number };\n\nexport function truncate(value: string, max: number = LIMITS.stringLength): string {\n return value.length > max ? value.slice(0, max) + TRUNCATED : value;\n}\n\nexport function sanitize(value: unknown, depth = 0, seen: WeakSet<object> = new WeakSet(), budget: Budget = { remaining: MAX_NODES }): unknown {\n if (value === null || value === undefined) return value;\n budget.remaining -= 1;\n switch (typeof value) {\n case 'string':\n return truncate(value);\n case 'number':\n return Number.isFinite(value) ? value : String(value);\n case 'boolean':\n return value;\n case 'bigint':\n return value.toString();\n case 'function':\n case 'symbol':\n return undefined;\n }\n if (value instanceof Date) return Number.isNaN(value.getTime()) ? null : value.toISOString();\n if (ArrayBuffer.isView(value) || value instanceof ArrayBuffer) return `[binário ${value.byteLength} bytes]`;\n if (value instanceof Error) return { name: value.name, message: truncate(value.message) };\n const object = value as object;\n if (seen.has(object)) return '[circular]';\n if (depth >= LIMITS.depth) return '[profundidade]';\n if (budget.remaining <= 0) return LIMIT_REACHED;\n seen.add(object);\n try {\n if (Array.isArray(object)) {\n const items: unknown[] = [];\n for (const item of object.slice(0, LIMITS.arrayItems)) {\n if (budget.remaining <= 0) {\n items.push(LIMIT_REACHED);\n break;\n }\n items.push(sanitize(item, depth + 1, seen, budget) ?? null);\n }\n if (object.length > LIMITS.arrayItems) items.push(`…[mais ${object.length - LIMITS.arrayItems}]`);\n return items;\n }\n if (object instanceof Map) return sanitize(Object.fromEntries(object.entries()), depth + 1, seen, budget);\n if (object instanceof Set) return sanitize([...object], depth + 1, seen, budget);\n const result: Record<string, unknown> = {};\n for (const key in object) {\n if (!Object.prototype.hasOwnProperty.call(object, key)) continue;\n if (budget.remaining <= 0) {\n result['…'] = LIMIT_REACHED;\n break;\n }\n const clean = sanitize((object as Record<string, unknown>)[key], depth + 1, seen, budget);\n if (clean !== undefined) result[key] = clean;\n }\n return result;\n } finally {\n seen.delete(object);\n }\n}\n\nexport function limitBytes(value: unknown, maxBytes: number): unknown {\n const json = JSON.stringify(value);\n if (json === undefined || Buffer.byteLength(json) <= maxBytes) return value;\n return { _truncated: truncate(json, maxBytes) };\n}\n\nexport function prepareAttrs(data: unknown, mode: RedactMode): Record<string, unknown> {\n const clean = redactDeep(sanitize(data), mode);\n const record = isRecord(clean) ? clean : { value: clean };\n return limitBytes(record, LIMITS.attrsBytes) as Record<string, unknown>;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n","import type { HeaderValue, RequestLike } from './context.js';\nimport type { RedactMode, RequestDetail } from './options.js';\nimport { LIMITS, type RequestInfo } from './protocol/index.js';\nimport { isLowEntropyKey, isSensitiveHeader, isSensitiveKey, looksLikeCredential, maskValue, redactDeep } from './redact.js';\nimport { limitBytes, sanitize, truncate } from './serialize.js';\n\nexport function headerValue(value: HeaderValue): string | undefined {\n if (value === undefined) return undefined;\n return Array.isArray(value) ? value.join(', ') : String(value);\n}\n\nexport function requestHeaders(headers: Record<string, HeaderValue>, mode: RedactMode): Record<string, string> {\n const result: Record<string, string> = {};\n let count = 0;\n for (const [name, raw] of Object.entries(headers)) {\n const value = headerValue(raw);\n if (value === undefined) continue;\n if (count >= LIMITS.headers) break;\n const key = name.toLowerCase();\n result[key] = mode === 'mask' && (isSensitiveHeader(key) || looksLikeCredential(value)) ? maskValue(value) : truncate(value);\n count++;\n }\n return result;\n}\n\nexport function requestPath(req: RequestLike): string {\n const url = req.originalUrl ?? req.url ?? '';\n const end = url.indexOf('?');\n return end >= 0 ? url.slice(0, end) : url;\n}\n\nexport function requestRoute(req: RequestLike, route?: string): string | undefined {\n if (route) return route;\n return typeof req.route?.path === 'string' ? req.route.path : undefined;\n}\n\nexport function redactPath(path: string, params: Record<string, unknown> | undefined, mode: RedactMode): string {\n if (mode === 'none' || !params) return path;\n let result = path;\n for (const [key, value] of Object.entries(params)) {\n if (typeof value !== 'string' || value.length < 4 || !isSensitiveKey(key)) continue;\n const masked = maskValue(value, !isLowEntropyKey(key));\n for (const form of new Set([value, encodeURIComponent(value)])) result = result.split(form).join(masked);\n }\n return result;\n}\n\nexport function safeUrl(req: RequestLike, mode: RedactMode): string {\n const url = req.originalUrl ?? req.url ?? '';\n const queryStart = url.indexOf('?');\n const path = queryStart >= 0 ? url.slice(0, queryStart) : url;\n const query = queryStart >= 0 ? url.slice(queryStart) : '';\n return redactUrl(redactPath(path, req.params, mode) + query, mode);\n}\n\nexport function redactUrl(url: string, mode: RedactMode): string {\n const queryStart = url.indexOf('?');\n if (mode === 'none' || queryStart < 0) return url;\n const params = new URLSearchParams(url.slice(queryStart + 1));\n let changed = false;\n for (const [key, value] of [...params.entries()]) {\n if (isSensitiveKey(key) && value !== '') {\n params.set(key, maskValue(value, !isLowEntropyKey(key)));\n changed = true;\n }\n }\n return changed ? `${url.slice(0, queryStart)}?${params.toString()}` : url;\n}\n\nexport function requestInfo(req: RequestLike, mode: RedactMode, extra: { route?: string; status?: number; durationMs?: number } = {}, detail: RequestDetail = 'full'): RequestInfo {\n const route = requestRoute(req, extra.route);\n if (detail === 'route') {\n return {\n method: (req.method ?? 'GET').toUpperCase(),\n url: route ?? '',\n ...(route ? { route } : {}),\n ...(extra.status !== undefined ? { status: extra.status } : {}),\n ...(extra.durationMs !== undefined ? { durationMs: extra.durationMs } : {}),\n };\n }\n const params = prepareRecord(req.params, mode) as Record<string, string> | undefined;\n const query = prepareRecord(req.query, mode);\n const body = prepareBody(req.body, mode);\n const userAgent = headerValue(req.headers['user-agent']);\n const ip = req.ip ?? req.socket?.remoteAddress;\n return {\n method: (req.method ?? 'GET').toUpperCase(),\n url: truncate(safeUrl(req, mode)),\n ...(route ? { route } : {}),\n ...(params ? { params } : {}),\n ...(query ? { query } : {}),\n headers: requestHeaders(req.headers, mode),\n ...(body !== undefined ? { body } : {}),\n ...(ip ? { ip } : {}),\n ...(userAgent ? { userAgent: truncate(userAgent, 500) } : {}),\n ...(extra.status !== undefined ? { status: extra.status } : {}),\n ...(extra.durationMs !== undefined ? { durationMs: extra.durationMs } : {}),\n };\n}\n\nfunction isEmptyRecord(value: unknown): boolean {\n return typeof value === 'object' && value !== null && !Array.isArray(value) && Object.keys(value).length === 0;\n}\n\nfunction prepareRecord(value: unknown, mode: RedactMode): Record<string, unknown> | undefined {\n if (typeof value !== 'object' || value === null) return undefined;\n const clean = prepare(value, mode);\n return isEmptyRecord(clean) || typeof clean !== 'object' || clean === null ? undefined : (clean as Record<string, unknown>);\n}\n\nfunction prepare(value: unknown, mode: RedactMode): unknown {\n return redactDeep(sanitize(value), mode);\n}\n\nfunction prepareBody(body: unknown, mode: RedactMode): unknown {\n if (body === undefined || body === null || body === '') return undefined;\n const clean = prepare(body, mode);\n if (isEmptyRecord(clean)) return undefined;\n return limitBytes(clean, LIMITS.bodyBytes);\n}\n","import type { LogLevel } from './protocol/index.js';\n\nexport type RedactMode = 'mask' | 'none';\nexport type RequestDetail = 'full' | 'route';\n\nexport type RadarOptions = {\n key?: string;\n endpoint?: string;\n environment?: string;\n release?: string;\n enabled?: boolean;\n console?: boolean;\n minLevel?: LogLevel;\n redact?: RedactMode;\n requestDetail?: RequestDetail;\n logRequests?: boolean;\n ignorePaths?: string[];\n captureUnhandled?: boolean;\n debug?: boolean;\n};\n\nexport type ResolvedOptions = {\n key: string | undefined;\n endpoint: string;\n environment: string;\n release: string | undefined;\n enabled: boolean;\n console: boolean;\n minLevel: LogLevel;\n redact: RedactMode;\n requestDetail: RequestDetail;\n logRequests: boolean;\n ignorePaths: string[];\n captureUnhandled: boolean;\n debug: boolean;\n};\n\nexport const DEFAULT_ENDPOINT = 'https://radar-ingest.oconde.dev';\n\nconst LEVELS: LogLevel[] = ['debug', 'info', 'warn', 'error'];\n\nexport function resolveOptions(options: RadarOptions = {}, env: NodeJS.ProcessEnv = process.env): ResolvedOptions {\n const key = options.key?.trim() || undefined;\n return {\n key,\n endpoint: (options.endpoint ?? DEFAULT_ENDPOINT).replace(/\\/+$/, ''),\n environment: options.environment ?? env.NODE_ENV ?? 'production',\n release: options.release || undefined,\n enabled: options.enabled ?? Boolean(key),\n console: options.console ?? false,\n minLevel: options.minLevel && LEVELS.includes(options.minLevel) ? options.minLevel : 'info',\n redact: options.redact === 'none' ? 'none' : 'mask',\n requestDetail: options.requestDetail === 'route' ? 'route' : 'full',\n logRequests: options.logRequests ?? true,\n ignorePaths: options.ignorePaths ?? ['/healthz', '/health'],\n captureUnhandled: options.captureUnhandled ?? true,\n debug: options.debug ?? false,\n };\n}\n\nexport function levelEnabled(level: LogLevel, minLevel: LogLevel): boolean {\n return LEVELS.indexOf(level) >= LEVELS.indexOf(minLevel);\n}\n","import { inspect } from 'node:util';\n\nexport type UnhandledCapturer = {\n captureUnhandled(error: unknown, level: 'error' | 'fatal'): void;\n flush(timeoutMs?: number): Promise<void>;\n};\n\nconst INSTALLED = Symbol.for('@oconde/radar/process-handlers');\nconst MODE_FLAG = /^--unhandled-rejections=(\\S+)$/;\n\nexport function unhandledRejectionsMode(execArgv: string[] = process.execArgv, nodeOptions: string = process.env.NODE_OPTIONS ?? ''): string {\n for (const arg of [...nodeOptions.split(/\\s+/), ...execArgv]) {\n const match = MODE_FLAG.exec(arg);\n if (match?.[1]) return match[1];\n }\n return 'throw';\n}\n\nexport function asUncaught(reason: unknown): unknown {\n if (reason instanceof Error) return reason;\n const error = new Error(\n `This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). The promise rejected with the reason \"${inspect(reason)}\".`,\n ) as Error & { code: string };\n error.code = 'ERR_UNHANDLED_REJECTION';\n return error;\n}\n\nexport function installProcessHandlers(capturer: UnhandledCapturer): void {\n const holder = process as unknown as Record<symbol, boolean | undefined>;\n if (holder[INSTALLED]) return;\n holder[INSTALLED] = true;\n\n process.on('unhandledRejection', (reason) => {\n const mode = unhandledRejectionsMode();\n const othersListen = process.listenerCount('unhandledRejection') > 1;\n if (othersListen || mode !== 'throw') {\n capturer.captureUnhandled(reason, 'error');\n if (!othersListen && mode === 'warn-with-error-code') process.exitCode = 1;\n return;\n }\n const uncaught = asUncaught(reason);\n setImmediate(() => {\n throw uncaught;\n });\n });\n\n process.on('uncaughtException', (error) => {\n capturer.captureUnhandled(error, 'fatal');\n if (process.listenerCount('uncaughtException') > 1) return;\n try {\n process.stderr.write(`${inspect(error)}\\n`);\n } catch {\n process.exitCode = 1;\n }\n void capturer.flush(2000).finally(() => process.exit(1));\n });\n}\n","import { readFile, stat } from 'node:fs/promises';\nimport { SourceMap } from 'node:module';\nimport { dirname, isAbsolute, relative, resolve, sep } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { LIMITS, type ExceptionInfo, type StackFrame } from './protocol/index.js';\n\nconst MAX_FILE_BYTES = 2 * 1024 * 1024;\nconst MAX_CACHED_FILES = 50;\nconst MAPPING_URL = /\\/\\/[#@]\\s*sourceMappingURL=(\\S+)\\s*$/;\n\ntype LoadedMap = { map: SourceMap; baseDir: string; sources: string[]; contents: (string | null)[]; lines: Map<number, string[]> };\ntype LoadedFile = { lines: string[]; map: LoadedMap | null };\ntype MappedFrame = { frame: StackFrame; lines: string[] | null };\ntype MapPayload = { sources?: string[]; sourcesContent?: (string | null)[]; sourceRoot?: string };\ntype MapEntry = { originalSource?: string; originalLine?: number; originalColumn?: number };\n\nconst cache = new Map<string, Promise<LoadedFile | null>>();\n\nexport function clearSourceCache(): void {\n cache.clear();\n}\n\nexport async function enrichFrames(frames: StackFrame[], cwd: string = process.cwd()): Promise<StackFrame[]> {\n const result: StackFrame[] = [];\n let withContext = 0;\n for (const frame of frames) {\n try {\n const { frame: mapped, lines } = await mapFrame(frame);\n let next = mapped;\n if (mapped.inApp && lines && mapped.line && withContext < LIMITS.contextFrames) {\n const context = contextFor(lines, mapped.line);\n if (context) {\n next = { ...mapped, context };\n withContext++;\n }\n }\n result.push({ ...next, file: relativize(next.file, cwd) });\n } catch {\n result.push({ ...frame, file: relativize(frame.file, cwd) });\n }\n }\n return result;\n}\n\nexport async function enrichException(exception: ExceptionInfo, cwd: string = process.cwd()): Promise<ExceptionInfo> {\n const frames = await enrichFrames(exception.frames, cwd);\n if (!exception.cause) return { ...exception, frames };\n return { ...exception, frames, cause: await enrichException(exception.cause, cwd) };\n}\n\nexport function relativize(file: string, cwd: string): string {\n if (!isAbsolute(file)) return file;\n const path = relative(cwd, file);\n return path.startsWith('..') || isAbsolute(path) ? file : path.split(sep).join('/');\n}\n\nasync function mapFrame(frame: StackFrame): Promise<MappedFrame> {\n if (!frame.line || !isAbsolute(frame.file)) return { frame, lines: null };\n const file = await loadFile(frame.file);\n if (!file) return { frame, lines: null };\n if (!file.map) return { frame, lines: file.lines };\n const entry = file.map.map.findEntry(frame.line - 1, (frame.col ?? 1) - 1) as MapEntry;\n if (typeof entry.originalSource !== 'string' || typeof entry.originalLine !== 'number') return { frame, lines: file.lines };\n const originalPath = resolveSource(file.map, entry.originalSource);\n const mapped: StackFrame = { ...frame, file: originalPath, line: entry.originalLine + 1, col: (entry.originalColumn ?? 0) + 1 };\n const lines = embeddedLines(file.map, file.map.sources.indexOf(entry.originalSource));\n if (lines) return { frame: mapped, lines };\n const original = await loadFile(originalPath);\n return { frame: mapped, lines: original?.lines ?? null };\n}\n\nfunction embeddedLines(map: LoadedMap, index: number): string[] | null {\n if (index < 0) return null;\n const cached = map.lines.get(index);\n if (cached) return cached;\n const content = map.contents[index];\n if (typeof content !== 'string') return null;\n const lines = content.split(/\\r?\\n/);\n map.lines.set(index, lines);\n return lines;\n}\n\nfunction contextFor(lines: string[], line: number): StackFrame['context'] {\n const index = line - 1;\n if (index < 0 || index >= lines.length) return undefined;\n const clip = (text: string) => (text.length > LIMITS.contextLineLength ? `${text.slice(0, LIMITS.contextLineLength)}…` : text);\n return {\n pre: lines.slice(Math.max(0, index - LIMITS.contextLines), index).map(clip),\n line: clip(lines[index] ?? ''),\n post: lines.slice(index + 1, index + 1 + LIMITS.contextLines).map(clip),\n };\n}\n\nfunction resolveSource(map: LoadedMap, source: string): string {\n if (source.startsWith('file://')) {\n try {\n return fileURLToPath(source);\n } catch {\n return source;\n }\n }\n return isAbsolute(source) ? source : resolve(map.baseDir, source);\n}\n\nfunction loadFile(path: string): Promise<LoadedFile | null> {\n const cached = cache.get(path);\n if (cached) {\n cache.delete(path);\n cache.set(path, cached);\n return cached;\n }\n const pending = readSource(path).catch(() => null);\n cache.set(path, pending);\n if (cache.size > MAX_CACHED_FILES) {\n const oldest = cache.keys().next().value;\n if (oldest !== undefined) cache.delete(oldest);\n }\n return pending;\n}\n\nasync function readSource(path: string): Promise<LoadedFile | null> {\n const text = await readText(path);\n if (text === null) return null;\n const lines = text.split(/\\r?\\n/);\n return { lines, map: await loadMap(path, lines) };\n}\n\nasync function readText(path: string): Promise<string | null> {\n try {\n const info = await stat(path);\n if (!info.isFile() || info.size > MAX_FILE_BYTES) return null;\n return await readFile(path, 'utf8');\n } catch {\n return null;\n }\n}\n\nasync function loadMap(path: string, lines: string[]): Promise<LoadedMap | null> {\n let url: string | undefined;\n for (let index = lines.length - 1; index >= 0 && index >= lines.length - 5; index--) {\n const match = MAPPING_URL.exec(lines[index] ?? '');\n if (match) {\n url = match[1];\n break;\n }\n }\n if (!url) return null;\n let raw: string | null;\n let mapDir: string;\n if (url.startsWith('data:')) {\n const comma = url.indexOf(',');\n const encoded = url.slice(comma + 1);\n raw = url.slice(0, comma).endsWith(';base64') ? Buffer.from(encoded, 'base64').toString('utf8') : decodeURIComponent(encoded);\n mapDir = dirname(path);\n } else {\n const mapPath = url.startsWith('file://') ? fileURLToPath(url) : resolve(dirname(path), decodeURIComponent(url));\n raw = await readText(mapPath);\n mapDir = dirname(mapPath);\n }\n if (!raw) return null;\n try {\n const payload = JSON.parse(raw) as MapPayload;\n return {\n map: new SourceMap(payload as ConstructorParameters<typeof SourceMap>[0]),\n baseDir: resolve(mapDir, payload.sourceRoot ?? ''),\n sources: payload.sources ?? [],\n contents: payload.sourcesContent ?? [],\n lines: new Map(),\n };\n } catch {\n return null;\n }\n}\n","import { fileURLToPath } from 'node:url';\nimport { LIMITS, type ExceptionInfo, type StackFrame } from './protocol/index.js';\nimport { truncate } from './serialize.js';\n\nconst WITH_FUNCTION = /^at (?:async )?(.+?) \\((.+)\\)$/;\nconst LOCATION = /^(.+):(\\d+):(\\d+)$/;\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 line = raw.trim();\n if (!line.startsWith('at ')) continue;\n const withFunction = WITH_FUNCTION.exec(line);\n const fn = withFunction?.[1];\n const location = withFunction ? (withFunction[2] ?? '') : line.replace(/^at (?:async )?/, '');\n const parsed = LOCATION.exec(location);\n if (parsed) {\n const file = toPath(parsed[1] ?? '');\n frames.push({ ...(fn ? { fn } : {}), file, line: Number(parsed[2]), col: Number(parsed[3]), inApp: isInApp(file) });\n } else {\n frames.push({ ...(fn ? { fn } : {}), file: location, inApp: false });\n }\n if (frames.length >= LIMITS.frames) break;\n }\n return frames;\n}\n\nexport function isInApp(file: string): boolean {\n if (file.includes('/node_modules/') || file.includes('\\\\node_modules\\\\')) return false;\n if (file.startsWith('node:') || file.startsWith('internal/')) return false;\n return file.startsWith('/') || /^[A-Za-z]:[\\\\/]/.test(file);\n}\n\nexport function exceptionInfo(error: unknown, depth = 0): ExceptionInfo {\n if (error instanceof Error) {\n const info: ExceptionInfo = {\n type: errorType(error),\n message: truncate(error.message ?? '', LIMITS.messageLength),\n frames: parseStack(error.stack),\n };\n const cause = (error as Error & { cause?: unknown }).cause;\n if (cause !== undefined && cause !== null && depth < LIMITS.causeDepth) info.cause = exceptionInfo(cause, depth + 1);\n return info;\n }\n if (typeof error === 'object' && error !== null) {\n const record = error as Record<string, unknown>;\n const message = typeof record.message === 'string' ? record.message : safeStringify(error);\n return { type: typeof record.name === 'string' ? record.name : 'Object', message: truncate(message, LIMITS.messageLength), frames: [] };\n }\n return { type: 'Error', message: truncate(String(error), LIMITS.messageLength), frames: [] };\n}\n\nfunction toPath(location: string): string {\n if (!location.startsWith('file://')) return location;\n try {\n return fileURLToPath(location);\n } catch {\n return location;\n }\n}\n\nfunction errorType(error: Error): string {\n if (error.name && error.name !== 'Error') return error.name;\n const constructorName = error.constructor?.name;\n return constructorName && constructorName !== 'Object' ? constructorName : 'Error';\n}\n\nfunction safeStringify(value: unknown): string {\n try {\n return JSON.stringify(value) ?? String(value);\n } catch {\n return String(value);\n }\n}\n","import { promisify } from 'node:util';\nimport { gzip } from 'node:zlib';\nimport { LIMITS, type EventBatch, type RadarEvent } from './protocol/index.js';\nimport { describeError } from './util.js';\n\nconst gzipAsync = promisify(gzip);\n\nconst MAX_BATCH_BYTES = 900_000;\nconst GZIP_THRESHOLD_BYTES = 8192;\nconst MAX_BACKOFF_MS = 30_000;\nconst MAX_RETRY_AFTER_MS = 86_400_000;\nconst UNAUTHORIZED_PAUSE_MS = 10 * 60_000;\n\nexport type Pending = RadarEvent | (() => Promise<RadarEvent>);\n\nexport type TransportConfig = {\n url: string;\n key: string;\n sdk: { name: string; version: string };\n environment: string;\n release?: string;\n onWarning?: (message: string, always: boolean) => void;\n flushIntervalMs?: number;\n maxQueue?: number;\n batchSize?: number;\n requestTimeoutMs?: number;\n};\n\ntype Outcome =\n | { kind: 'ok' }\n | { kind: 'retry'; retryAfterMs?: number }\n | { kind: 'unauthorized'; status: number }\n | { kind: 'rejected'; status: number };\n\nexport class Transport {\n private queue: Pending[] = [];\n private droppedCount = 0;\n private inFlight: Promise<boolean> | null = null;\n private nextAttemptAt = 0;\n private backoffMs = 0;\n private stopped = false;\n private readonly warned = new Set<string>();\n private readonly timer: ReturnType<typeof setInterval>;\n private readonly maxQueue: number;\n private readonly batchSize: number;\n\n constructor(private readonly config: TransportConfig) {\n this.maxQueue = config.maxQueue ?? 1000;\n this.batchSize = Math.min(config.batchSize ?? 100, LIMITS.batchEvents);\n this.timer = setInterval(() => {\n void this.send();\n }, config.flushIntervalMs ?? 2000);\n this.timer.unref();\n }\n\n get pending(): number {\n return this.queue.length;\n }\n\n get dropped(): number {\n return this.droppedCount;\n }\n\n enqueue(event: Pending): void {\n if (this.stopped) return;\n if (this.queue.length >= this.maxQueue) {\n this.droppedCount += 1;\n this.warn('queue_full', 'fila do Radar cheia; eventos estão sendo descartados', false);\n return;\n }\n this.queue.push(event);\n if (this.queue.length >= this.batchSize) void this.send();\n }\n\n send(): Promise<boolean> {\n if (this.inFlight) return this.inFlight;\n if (this.stopped || this.queue.length === 0 || Date.now() < this.nextAttemptAt) return Promise.resolve(false);\n const attempt = this.sendBatch().catch((error: unknown) => {\n this.warn('internal', `envio ao Radar falhou: ${describeError(error)}`, false);\n return false;\n });\n this.inFlight = attempt.finally(() => {\n this.inFlight = null;\n });\n return this.inFlight;\n }\n\n async flush(timeoutMs: number): Promise<void> {\n const deadline = Date.now() + timeoutMs;\n while (this.queue.length > 0 || this.inFlight) {\n const remaining = deadline - Date.now();\n if (remaining <= 0) return;\n const progressed = await withTimeout(this.send(), remaining);\n if (progressed !== true && !this.inFlight) return;\n }\n }\n\n stop(): void {\n this.stopped = true;\n clearInterval(this.timer);\n }\n\n private async sendBatch(): Promise<boolean> {\n const items = this.queue.splice(0, this.batchSize);\n const resolved = await Promise.all(items.map((item) => Promise.resolve().then(() => (typeof item === 'function' ? item() : item)).then((event) => event, () => null)));\n const events: RadarEvent[] = [];\n const leftovers: RadarEvent[] = [];\n let bytes = 0;\n for (const event of resolved) {\n if (!event) {\n this.droppedCount += 1;\n continue;\n }\n const size = Buffer.byteLength(JSON.stringify(event));\n if (events.length > 0 && bytes + size > MAX_BATCH_BYTES) {\n leftovers.push(event);\n continue;\n }\n events.push(event);\n bytes += size;\n }\n if (leftovers.length > 0) this.queue.unshift(...leftovers);\n if (events.length === 0) return true;\n const dropped = this.droppedCount;\n const batch: EventBatch = {\n v: 1,\n sdk: this.config.sdk,\n environment: this.config.environment,\n ...(this.config.release ? { release: this.config.release } : {}),\n ...(dropped > 0 ? { dropped } : {}),\n events,\n };\n const outcome = await this.post(batch);\n switch (outcome.kind) {\n case 'ok':\n this.droppedCount -= dropped;\n this.backoffMs = 0;\n this.nextAttemptAt = 0;\n return true;\n case 'retry':\n this.requeue(events);\n this.backoffMs = Math.min(this.backoffMs > 0 ? this.backoffMs * 2 : 1000, MAX_BACKOFF_MS);\n this.nextAttemptAt = Date.now() + Math.max(this.backoffMs, outcome.retryAfterMs ?? 0);\n return false;\n case 'unauthorized':\n this.droppedCount += events.length + this.queue.length;\n this.queue = [];\n this.nextAttemptAt = Date.now() + UNAUTHORIZED_PAUSE_MS;\n this.warn('unauthorized', `chave do Radar recusada (${outcome.status}); envios pausados por 10 minutos`, true);\n return false;\n case 'rejected':\n this.droppedCount += events.length;\n this.warn(`rejected_${outcome.status}`, `lote recusado pelo Radar (${outcome.status}); eventos descartados`, true);\n return true;\n }\n }\n\n private requeue(events: RadarEvent[]): void {\n this.queue.unshift(...events);\n const overflow = this.queue.length - this.maxQueue;\n if (overflow > 0) {\n this.queue.splice(this.maxQueue, overflow);\n this.droppedCount += overflow;\n }\n }\n\n private async post(batch: EventBatch): Promise<Outcome> {\n const json = JSON.stringify(batch);\n const compress = Buffer.byteLength(json) > GZIP_THRESHOLD_BYTES;\n const headers: Record<string, string> = {\n 'content-type': 'application/json',\n authorization: `Bearer ${this.config.key}`,\n 'user-agent': `${this.config.sdk.name}/${this.config.sdk.version}`,\n };\n if (compress) headers['content-encoding'] = 'gzip';\n let response: Response;\n try {\n response = await fetch(this.config.url, {\n method: 'POST',\n headers,\n body: compress ? await gzipAsync(json) : json,\n redirect: 'error',\n signal: AbortSignal.timeout(this.config.requestTimeoutMs ?? 5000),\n });\n } catch (error) {\n this.warn('network', `Radar indisponível: ${describeError(error)}`, false);\n return { kind: 'retry' };\n }\n await response.arrayBuffer().catch(() => undefined);\n if (response.ok) return { kind: 'ok' };\n if (response.status === 401 || response.status === 403) return { kind: 'unauthorized', status: response.status };\n if (response.status === 429) return { kind: 'retry', retryAfterMs: retryAfterMs(response.headers.get('retry-after')) };\n if (response.status >= 500) return { kind: 'retry' };\n return { kind: 'rejected', status: response.status };\n }\n\n private warn(key: string, message: string, always: boolean): void {\n if (this.warned.has(key)) return;\n this.warned.add(key);\n this.config.onWarning?.(message, always);\n }\n}\n\nexport function retryAfterMs(header: string | null): number | undefined {\n if (!header) return undefined;\n const seconds = Number(header);\n if (Number.isFinite(seconds)) return Math.min(Math.max(0, seconds * 1000), MAX_RETRY_AFTER_MS);\n const date = Date.parse(header);\n return Number.isNaN(date) ? undefined : Math.min(Math.max(0, date - Date.now()), MAX_RETRY_AFTER_MS);\n}\n\nfunction withTimeout<T>(promise: Promise<T>, ms: number): Promise<T | undefined> {\n return new Promise((resolve) => {\n const timer = setTimeout(() => resolve(undefined), ms);\n timer.unref();\n promise.then(\n (value) => {\n clearTimeout(timer);\n resolve(value);\n },\n () => {\n clearTimeout(timer);\n resolve(undefined);\n },\n );\n });\n}\n","import { performance } from 'node:perf_hooks';\n\nexport function describeError(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nexport function elapsedSince(startedAt: number): number {\n return Math.round(performance.now() - startedAt);\n}\n","declare const __SDK_VERSION__: string | undefined;\n\nexport const SDK_NAME = '@oconde/radar';\nexport const SDK_VERSION: string = typeof __SDK_VERSION__ === 'string' ? __SDK_VERSION__ : '0.0.0-dev';\n","import { RadarClient } from './client.js';\nimport { globalState } from './context.js';\n\nconst state = globalState();\n\nexport const radar: RadarClient = (state.client as RadarClient | undefined) ?? (state.client = new RadarClient());\n"],"mappings":"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","names":["randomUUID","performance","state","fileURLToPath","fileURLToPath","performance","resolve","performance","randomUUID","line"]}