@ooopsstudio/performance 0.9.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/LICENSE +21 -0
- package/README.md +50 -0
- package/dist/budget-engine-KDA4FRYU.js +160 -0
- package/dist/budget-engine-KDA4FRYU.js.map +1 -0
- package/dist/chunk-2XXIOHOO.js +58 -0
- package/dist/chunk-2XXIOHOO.js.map +1 -0
- package/dist/chunk-3GMKPRQP.js +197 -0
- package/dist/chunk-3GMKPRQP.js.map +1 -0
- package/dist/chunk-J6KBSLYO.js +118 -0
- package/dist/chunk-J6KBSLYO.js.map +1 -0
- package/dist/chunk-MMO5UEUU.js +20 -0
- package/dist/chunk-MMO5UEUU.js.map +1 -0
- package/dist/chunk-RL2752FW.js +31 -0
- package/dist/chunk-RL2752FW.js.map +1 -0
- package/dist/chunk-RY65GERM.js +159 -0
- package/dist/chunk-RY65GERM.js.map +1 -0
- package/dist/chunk-W72QW2AD.js +29 -0
- package/dist/chunk-W72QW2AD.js.map +1 -0
- package/dist/chunk-ZAXGEDZW.js +1184 -0
- package/dist/chunk-ZAXGEDZW.js.map +1 -0
- package/dist/custom/exporters/http.d.ts +11 -0
- package/dist/custom/exporters/http.js +364 -0
- package/dist/custom/exporters/http.js.map +1 -0
- package/dist/custom/exporters/raw.d.ts +8 -0
- package/dist/custom/exporters/raw.js +6 -0
- package/dist/custom/exporters/raw.js.map +1 -0
- package/dist/custom.d.ts +58 -0
- package/dist/custom.js +299 -0
- package/dist/custom.js.map +1 -0
- package/dist/development.d.ts +19 -0
- package/dist/development.js +55 -0
- package/dist/development.js.map +1 -0
- package/dist/event-export-manager-DEB64LWZ.js +632 -0
- package/dist/event-export-manager-DEB64LWZ.js.map +1 -0
- package/dist/index.d.ts +26 -0
- package/dist/index.js +205 -0
- package/dist/index.js.map +1 -0
- package/dist/monitors-VNNUIKAK.js +753 -0
- package/dist/monitors-VNNUIKAK.js.map +1 -0
- package/dist/n1-detector-6IQ2DINP.js +247 -0
- package/dist/n1-detector-6IQ2DINP.js.map +1 -0
- package/dist/observability.d.ts +32 -0
- package/dist/observability.js +76 -0
- package/dist/observability.js.map +1 -0
- package/dist/ports-DwUYdKj-.d.ts +23 -0
- package/dist/production.d.ts +19 -0
- package/dist/production.js +42 -0
- package/dist/production.js.map +1 -0
- package/dist/public/types.d.ts +11 -0
- package/dist/public/types.js +3 -0
- package/dist/public/types.js.map +1 -0
- package/package.json +74 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/performance/core/utils/request-helpers.ts","../src/performance/core/callback-dispatcher.ts","../src/performance/core/cardinality-guard.ts","../src/performance/core/factories/performance-port-measurements.ts","../src/performance/utils/single-flight-method.ts","../src/performance/core/tracing-bridge.ts","../src/performance/core/base-handler.ts","../src/performance/utils/lifecycle-cleanup.ts"],"names":[],"mappings":"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","file":"chunk-ZAXGEDZW.js","sourcesContent":["import type {ObservabilityResource} from '@ooopsstudio/core/contracts/observability-shared'\nimport type {\n\tHttpPerfMetadata,\n\tPerfEvent,\n\tPerformanceEventRecord\n} from '@ooopsstudio/core/contracts/performance'\n\nimport {sanitizePerformanceLabelValue} from '../../utils/safe-identifiers'\nimport {isRuntimeProxy} from '../../utils/safe-object'\n\nconst UUID_SEGMENT =\n\t/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i\nconst LONG_HEX_SEGMENT = /^[0-9a-f]{16,}$/i\nconst NUMERIC_SEGMENT = /^\\d+$/\nconst EMAIL_SEGMENT = /^[^/@\\s]+@[^/@\\s]+\\.[^/@\\s]+$/u\nconst OPAQUE_SEGMENT = /^[a-z0-9+_=-]{24,}$/iu\nconst HTTP_OUTCOMES = new Set(['ok', 'client_error', 'server_error', 'timeout', 'aborted'])\nconst MAX_NORMALIZED_ROUTE_LENGTH = 256\n\nconst isDynamicRouteSegment = (segment: string): boolean => {\n\tlet decoded = segment\n\ttry { decoded = decodeURIComponent(segment) } catch { /* malformed encodings remain opaque input */ }\n\treturn UUID_SEGMENT.test(decoded)\n\t\t|| LONG_HEX_SEGMENT.test(decoded)\n\t\t|| NUMERIC_SEGMENT.test(decoded)\n\t\t|| EMAIL_SEGMENT.test(decoded)\n\t\t|| OPAQUE_SEGMENT.test(decoded)\n}\n\nexport function normalizeHttpRoute(route: string): string {\n\tif (typeof route !== 'string' || route.length > 2_048) {\n\t\tthrow new Error('Performance HTTP route must be a string of at most 2048 characters')\n\t}\n\tif (!route.trim()) {\n\t\treturn '/'\n\t}\n\n\tconst withoutOrigin = route.replace(/^(?:[a-z][a-z0-9+.-]*:)?\\/\\/[^/]+/i, '')\n\tconst pathOnly = withoutOrigin.split('?')[0]?.split('#')[0] ?? '/'\n\tconst normalized = pathOnly.startsWith('/') ? pathOnly : `/${pathOnly}`\n\tconst parts = normalized\n\t\t.split('/')\n\t\t.filter(Boolean)\n\t\t.map((segment) => {\n\t\t\tif (segment.startsWith(':') || (segment.startsWith('[') && segment.endsWith(']'))) {\n\t\t\t\treturn segment\n\t\t\t}\n\t\t\tif (isDynamicRouteSegment(segment)) {\n\t\t\t\treturn ':id'\n\t\t\t}\n\t\t\treturn segment\n\t\t})\n\n\treturn (parts.length === 0 ? '/' : `/${parts.join('/')}`).slice(0, MAX_NORMALIZED_ROUTE_LENGTH)\n}\n\nexport function classifyHttpOutcome(metadata: HttpPerfMetadata): NonNullable<HttpPerfMetadata['outcome']> {\n\n\tif (metadata.aborted) {\n\t\treturn 'aborted'\n\t}\n\tif (metadata.timedOut) {\n\t\treturn 'timeout'\n\t}\n\tif (typeof metadata.statusCode === 'number') {\n\t\tif (metadata.statusCode >= 500) {\n\t\t\treturn 'server_error'\n\t\t}\n\t\tif (metadata.statusCode >= 400) {\n\t\t\treturn 'client_error'\n\t\t}\n\t}\n\treturn 'ok'\n}\n\nexport function normalizeHttpMetadata(metadata: HttpPerfMetadata): HttpPerfMetadata {\n\tif (!metadata || typeof metadata !== 'object' || isRuntimeProxy(metadata) || Array.isArray(metadata)) {\n\t\tthrow new Error('Performance HTTP metadata must be an object')\n\t}\n\tconst readField = (key: keyof HttpPerfMetadata): unknown => {\n\t\tlet descriptor: PropertyDescriptor | undefined\n\t\ttry { descriptor = Object.getOwnPropertyDescriptor(metadata, key) } catch {\n\t\t\tthrow new Error('Performance HTTP metadata must use readable data properties')\n\t\t}\n\t\treturn descriptor?.enumerable && 'value' in descriptor ? descriptor.value : undefined\n\t}\n\tconst rawRoute = readField('route')\n\tconst rawMethod = readField('method')\n\tconst rawStatusCode = readField('statusCode')\n\tconst rawRequestSize = readField('requestSize')\n\tconst rawResponseSize = readField('responseSize')\n\tconst rawHostKind = readField('hostKind')\n\tconst rawRuntime = readField('runtime')\n\tconst rawAborted = readField('aborted')\n\tconst rawTimedOut = readField('timedOut')\n\tconst rawOutcome = readField('outcome')\n\tif (typeof rawRoute !== 'string') throw new Error('Performance HTTP route must be a string')\n\tconst normalizedRoute = normalizeHttpRoute(rawRoute)\n\tif (typeof rawMethod !== 'string') {\n\t\tthrow new Error('Performance HTTP method must be a string')\n\t}\n\tconst methodCandidate = rawMethod.length <= 32 ? rawMethod.trim().toUpperCase() : ''\n\tconst normalizedMethod = /^[A-Z][A-Z0-9_-]{0,31}$/.test(methodCandidate)\n\t\t? methodCandidate\n\t\t: 'UNKNOWN'\n\tconst statusCode = Number.isInteger(rawStatusCode) && (rawStatusCode as number) >= 100 && (rawStatusCode as number) <= 599\n\t\t? rawStatusCode as number\n\t\t: undefined\n\tconst requestSize = Number.isSafeInteger(rawRequestSize) && (rawRequestSize as number) >= 0\n\t\t? rawRequestSize as number\n\t\t: undefined\n\tconst responseSize = Number.isSafeInteger(rawResponseSize) && (rawResponseSize as number) >= 0\n\t\t? rawResponseSize as number\n\t\t: undefined\n\tconst normalized: HttpPerfMetadata = {\n\t\tmethod: normalizedMethod,\n\t\troute: normalizedRoute,\n\t\t...(statusCode !== undefined ? {statusCode} : {}),\n\t\t...(requestSize !== undefined ? {requestSize} : {}),\n\t\t...(responseSize !== undefined ? {responseSize} : {}),\n\t\t...(typeof rawHostKind === 'string' && rawHostKind.length <= 256\n\t\t\t? {hostKind: sanitizePerformanceLabelValue(rawHostKind)}\n\t\t\t: {}),\n\t\t...(typeof rawRuntime === 'string' && rawRuntime.length <= 256\n\t\t\t? {runtime: sanitizePerformanceLabelValue(rawRuntime)}\n\t\t\t: {}),\n\t\t...(rawAborted === true ? {aborted: true} : {}),\n\t\t...(rawTimedOut === true ? {timedOut: true} : {})\n\t}\n\tconst observedOutcome = normalized.aborted || normalized.timedOut ||\n\t\t(typeof normalized.statusCode === 'number' && normalized.statusCode >= 200)\n\t\t? classifyHttpOutcome(normalized)\n\t\t: undefined\n\tconst outcome = observedOutcome ?? (\n\t\ttypeof rawOutcome === 'string' && rawOutcome.length <= 16 && HTTP_OUTCOMES.has(rawOutcome)\n\t\t\t? rawOutcome as NonNullable<HttpPerfMetadata['outcome']>\n\t\t\t: classifyHttpOutcome(normalized)\n\t)\n\n\tnormalized.outcome = outcome\n\treturn normalized\n}\n\nexport function buildHttpLabels(\n\tmetadata: HttpPerfMetadata,\n\tlabels?: Record<string, string>\n): Record<string, string> {\n\n\tconst normalized = normalizeHttpMetadata(metadata)\n\treturn {\n\t\t...(labels ?? {}),\n\t\tmethod: normalized.method,\n\t\troute: normalized.route,\n\t\tstatus_code: String(normalized.statusCode ?? 0),\n\t\tstatus_class:\n\t\t\ttypeof normalized.statusCode === 'number'\n\t\t\t\t? `${Math.floor(normalized.statusCode / 100)}xx`\n\t\t\t\t: 'unknown',\n\t\t...(normalized.hostKind ? {host_kind: normalized.hostKind} : {}),\n\t\t...(normalized.runtime ? {runtime: normalized.runtime} : {}),\n\t\toutcome: normalized.outcome ?? 'ok'\n\t}\n}\n\nexport function toPerformanceEventRecord(\n\tevent: PerfEvent,\n\tresource?: ObservabilityResource\n): PerformanceEventRecord {\n\n\treturn {\n\t\trecordedAt: event.end,\n\t\tevent,\n\t\tsource: event.source,\n\t\t...(event.traceId ? {traceId: event.traceId} : {}),\n\t\t...(event.spanId ? {spanId: event.spanId} : {}),\n\t\t...(event.http ? {http: event.http} : {}),\n\t\t...(event.dbMetadata ? {dbMetadata: event.dbMetadata} : {}),\n\t\t...(resource ? {resource} : {})\n\t}\n}\n","import type {BudgetViolation, N1Pattern, PerfEvent, SaturationAlert} from '@ooopsstudio/core/contracts/performance'\n\nimport {ignoreRuntimePromiseRejection, isRuntimePromise, isRuntimeProxy} from '../utils/safe-object'\n\nimport {clonePerformanceValue, deepFreezePerformanceValue} from './utils/event-helpers'\n\nexport interface PerformanceTelemetryCallbacks {\n\tonBudgetViolation?(violation: BudgetViolation): void\n\tonSaturationAlert?(alert: SaturationAlert): void\n\tonDimensionExplosion?(metricName: string, reason: string): void\n\tonN1Pattern?(pattern: N1Pattern): void\n\tonDimensionDrop?(metricName: string, reason: string): void\n\tonPerfEvent?(event: PerfEvent): void\n\tonSelfMetric?(name: string, value: number, labels?: Record<string, string>): void\n}\n\nexport interface PerformanceCallbackDispatcher {\n\temit<K extends keyof PerformanceTelemetryCallbacks>(\n\t\tname: K,\n\t\t...args: Parameters<NonNullable<PerformanceTelemetryCallbacks[K]>>\n\t): void\n\tadd(callbacks: PerformanceTelemetryCallbacks): void\n\tremove(callbacks: PerformanceTelemetryCallbacks): void\n\treset(): void\n}\n\nconst captureCallback = <K extends keyof PerformanceTelemetryCallbacks>(\n\tbundle: PerformanceTelemetryCallbacks,\n\tkey: K\n): NonNullable<PerformanceTelemetryCallbacks[K]> | undefined => {\n\tif (isRuntimeProxy(bundle)) return undefined\n\ttry {\n\t\tlet owner: object | null = bundle\n\t\tfor (let depth = 0; owner && depth < 8; depth += 1) {\n\t\t\tif (isRuntimeProxy(owner)) return undefined\n\t\t\tconst descriptor = Object.getOwnPropertyDescriptor(owner, key)\n\t\t\tif (descriptor) {\n\t\t\t\tif (!('value' in descriptor) || typeof descriptor.value !== 'function') return undefined\n\t\t\t\tconst callback = descriptor.value as (...args: never[]) => unknown\n\t\t\t\treturn ((...args: never[]) => Reflect.apply(callback, bundle, args)) as NonNullable<PerformanceTelemetryCallbacks[K]>\n\t\t\t}\n\t\t\towner = Object.getPrototypeOf(owner) as object | null\n\t\t}\n\t} catch { return undefined }\n\treturn undefined\n}\n\n/** Isolates arbitrary bridge observers from performance measurements. */\nexport function createPerformanceCallbackDispatcher(\n\tinitial: PerformanceTelemetryCallbacks\n): PerformanceCallbackDispatcher {\n\tconst callbacks = new Set<PerformanceTelemetryCallbacks>([initial])\n\tlet pendingCallbacks = new WeakMap<PerformanceTelemetryCallbacks, Set<keyof PerformanceTelemetryCallbacks>>()\n\treturn {\n\t\temit(name, ...args) {\n\t\t\tconst emissionCallbacks = [...callbacks]\n\t\t\tconst values = emissionCallbacks.length > 1\n\t\t\t\t? deepFreezePerformanceValue(clonePerformanceValue(args))\n\t\t\t\t: args\n\t\t\tfor (const bundle of emissionCallbacks) {\n\t\t\t\ttry {\n\t\t\t\t\tif (pendingCallbacks.get(bundle)?.has(name)) continue\n\t\t\t\t\tconst callback = captureCallback(bundle, name) as ((...values: typeof args) => void) | undefined\n\t\t\t\t\tif (!callback) continue\n\t\t\t\t\tconst pendingNames = pendingCallbacks.get(bundle) ?? new Set()\n\t\t\t\t\tpendingNames.add(name)\n\t\t\t\t\tpendingCallbacks.set(bundle, pendingNames)\n\t\t\t\t\tconst release = () => {\n\t\t\t\t\t\tif (pendingCallbacks.get(bundle) !== pendingNames) return\n\t\t\t\t\t\tpendingNames.delete(name)\n\t\t\t\t\t\tif (pendingNames.size === 0) pendingCallbacks.delete(bundle)\n\t\t\t\t\t}\n\t\t\t\t\tlet result: unknown\n\t\t\t\t\ttry { result = callback(...values) } catch { release(); continue }\n\t\t\t\t\tignoreRuntimePromiseRejection(result)\n\t\t\t\t\tif (isRuntimePromise(result)) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tvoid Reflect.apply(Promise.prototype.then, result, [release, release])\n\t\t\t\t\t\t} catch { release() }\n\t\t\t\t\t} else release()\n\t\t\t\t} catch {\n\t\t\t\t\t// Bridge observers must not affect measurements.\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tadd(bundle) {\n\t\t\tif (callbacks.has(bundle) || callbacks.size >= 100) return\n\t\t\tcallbacks.add(bundle)\n\t\t},\n\t\tremove(bundle) {\n\t\t\tpendingCallbacks.delete(bundle)\n\t\t\treturn callbacks.delete(bundle)\n\t\t},\n\t\treset() {\n\t\t\tcallbacks.clear()\n\t\t\tpendingCallbacks = new WeakMap()\n\t\t\tcallbacks.add(initial)\n\t\t}\n\t}\n}\n","/**\n * @file Cardinality guard for enforcing label dimension limits.\n * Prevents dimension explosion by tracking unique label combinations per metric.\n */\n\nimport {createHash} from 'node:crypto'\n\n/**\n * Result of cardinality guard check\n */\nexport interface CardinalityCheckResult {\n\n\t/** Whether the event is allowed */\n\tallowed: boolean\n\t/** Rejection reason, or the bounded overflow reason in warn mode. */\n\treason?: 'limit-exceeded' | 'invalid-labels'\n}\n\n/**\n * Cardinality guard for enforcing label limits\n */\nexport interface CardinalityGuard {\n\n\t/** Check if an event with given labels is allowed */\n\tcheck(metricName: string, labels?: Record<string, string>): CardinalityCheckResult\n\n\t/** Reset all tracked combinations */\n\treset(): void\n}\n\n/**\n * Options for creating a cardinality guard\n */\nexport interface CardinalityGuardOptions {\n\n\t/** Maximum unique label combinations per metric (Infinity = disabled) */\n\tmaxCombinations?: number\n\n\t/** Mode: 'drop' to reject events, 'warn' to allow but report */\n\tmode?: 'drop' | 'warn'\n\n\t/** Callback when limit is exceeded (used in warn mode) */\n\tonExceeded?: (metricName: string, reason: string) => void\n\n\t/** Maximum tracked metric names (default: 1000) */\n\tmaxMetrics?: number\n\n\t/** Stale metric state TTL in milliseconds (default: 1 hour) */\n\tttlMs?: number\n\n\t/** Clock used for deterministic cleanup in tests */\n\tnow?: () => number\n}\n\nconst digest = (value: string): string => createHash('sha256').update(value, 'utf16le').digest('base64url')\n\nexport function fingerprintLabels(labels?: Record<string, string>): string {\n\n\tif (!labels || Object.keys(labels).length === 0) return ''\n\tconst hash = createHash('sha256')\n\tconst entries = Object.entries(labels).sort(([left], [right]) => left < right ? -1 : left > right ? 1 : 0)\n\tfor (const [key, value] of entries) {\n\t\thash.update(`${key.length}:${key}${value.length}:${value}`, 'utf16le')\n\t}\n\treturn hash.digest('base64url')\n}\n\n/**\n * Create a cardinality guard.\n * Tracks unique label combinations per metric name to prevent dimension explosion.\n *\n * @param options - Guard options\n * @returns Cardinality guard instance\n */\nexport function createCardinalityGuard(options: CardinalityGuardOptions = {}): CardinalityGuard {\n\n\tconst maxCombinations = options.maxCombinations ?? Number.POSITIVE_INFINITY\n\tconst mode = options.mode ?? 'drop'\n\tconst onExceeded = options.onExceeded\n\tconst maxMetrics = options.maxMetrics ?? 1000\n\tconst ttlMs = options.ttlMs ?? 60 * 60 * 1000\n\tconst now = options.now ?? Date.now\n\tif (maxCombinations !== Number.POSITIVE_INFINITY && (!Number.isInteger(maxCombinations) || maxCombinations < 0)) {\n\t\tthrow new Error('Cardinality maxCombinations must be a non-negative integer or Infinity')\n\t}\n\tif (maxMetrics !== Number.POSITIVE_INFINITY && (!Number.isInteger(maxMetrics) || maxMetrics <= 0)) {\n\t\tthrow new Error('Cardinality maxMetrics must be a positive integer or Infinity')\n\t}\n\tif (!Number.isFinite(ttlMs) || ttlMs < 0) {\n\t\tthrow new Error('Cardinality ttlMs must be a non-negative finite number')\n\t}\n\tif (mode !== 'drop' && mode !== 'warn') {\n\t\tthrow new Error('Cardinality mode must be drop or warn')\n\t}\n\tconst combinations = new Map<string, {labels: Set<string>; lastAccessed: number}>()\n\tconst cleanupIntervalMs = ttlMs === 0 ? 0 : Math.min(ttlMs, 60_000)\n\tlet nextCleanupAt = Number.NEGATIVE_INFINITY\n\tfunction cleanup(currentTime: number): void {\n\t\t// A full map scan on every measurement makes instrumentation cost grow with\n\t\t// the number of metric names. TTL cleanup is amortized while preserving the\n\t\t// configured expiry bound (at most one minute for the default one-hour TTL).\n\t\tif (cleanupIntervalMs > 0 && currentTime < nextCleanupAt) return\n\t\tfor (const [metricName, entry] of combinations.entries()) {\n\t\t\tif (currentTime - entry.lastAccessed > ttlMs) {\n\t\t\t\tcombinations.delete(metricName)\n\t\t\t}\n\t\t}\n\t\tnextCleanupAt = currentTime + cleanupIntervalMs\n\t}\n\n\treturn {\n\t\tcheck(metricName: string, labels?: Record<string, string>): CardinalityCheckResult {\n\n\t\t\t// If disabled (Infinity), always allow\n\t\t\tif (!Number.isFinite(maxCombinations)) {\n\t\t\t\treturn {allowed: true}\n\t\t\t}\n\n\t\t\tlet key: string\n\t\t\ttry {\n\t\t\t\t// Validate labels (must be string values)\n\t\t\t\tif (labels) {\n\t\t\t\t\tfor (const [, value] of Object.entries(labels)) {\n\t\t\t\t\t\tif (typeof value !== 'string') {\n\t\t\t\t\t\t\treturn {allowed: false, reason: 'invalid-labels'}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tkey = fingerprintLabels(labels)\n\t\t\t} catch {\n\t\t\t\treturn {allowed: false, reason: 'invalid-labels'}\n\t\t\t}\n\t\t\tconst currentTime = now()\n\t\t\tcleanup(currentTime)\n\t\t\tconst metricKey = digest(metricName)\n\t\t\tlet metricCombinations = combinations.get(metricKey)\n\n\t\t\tif (!metricCombinations) {\n\t\t\t\tif (Number.isFinite(maxMetrics) && combinations.size >= maxMetrics) {\n\t\t\t\t\tif (mode === 'warn') {\n\t\t\t\t\t\ttry { onExceeded?.(metricName, 'limit-exceeded') } catch { /* observer */ }\n\t\t\t\t\t\treturn {allowed: true, reason: 'limit-exceeded'}\n\t\t\t\t\t}\n\t\t\t\t\treturn {allowed: false, reason: 'limit-exceeded'}\n\t\t\t\t}\n\t\t\t\tmetricCombinations = {labels: new Set<string>(), lastAccessed: currentTime}\n\t\t\t\tcombinations.set(metricKey, metricCombinations)\n\t\t\t}\n\t\t\tmetricCombinations.lastAccessed = currentTime\n\t\t\tcombinations.delete(metricKey)\n\t\t\tcombinations.set(metricKey, metricCombinations)\n\n\t\t\t// Check if this combination already exists\n\t\t\tif (metricCombinations.labels.has(key)) {\n\t\t\t\treturn {allowed: true}\n\t\t\t}\n\n\t\t\t// Check if we've exceeded the limit\n\t\t\tif (metricCombinations.labels.size >= maxCombinations) {\n\t\t\t\tif (mode === 'warn') {\n\t\t\t\t\t// Warn mode: report but allow\n\t\t\t\t\tif (onExceeded) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tonExceeded(metricName, 'limit-exceeded')\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t// Warning observers must not change cardinality enforcement.\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn {allowed: true, reason: 'limit-exceeded'}\n\t\t\t\t}\n\t\t\t\t// Drop mode: reject\n\t\t\t\treturn {allowed: false, reason: 'limit-exceeded'}\n\t\t\t}\n\n\t\t\t// Add the new combination\n\t\t\tmetricCombinations.labels.add(key)\n\t\t\treturn {allowed: true}\n\t\t},\n\t\treset(): void {\n\n\t\t\tcombinations.clear()\n\t\t\tnextCleanupAt = Number.NEGATIVE_INFINITY\n\t\t}\n\t}\n}\n","import type {\n\tDBQueryMetadata,\n\tHttpPerfMetadata,\n\tPerfEvent\n} from '@ooopsstudio/core/contracts/performance'\n\nimport {snapshotPerformanceLabels} from '../../utils/safe-identifiers'\nimport {hasSafeRuntimePrototype, isRuntimeProxy} from '../../utils/safe-object'\nimport {nsToMs, type HighResClock} from '../clock'\nimport {snapshotSafeDBMetadata} from '../utils/event-helpers'\nimport {\n\tbuildHttpLabels,\n\tnormalizeHttpMetadata\n} from '../utils/request-helpers'\n\nexport interface MeasurementPortDependencies {\n\tclock: HighResClock;\n\temitEvent: (event: PerfEvent, metadata?: DBQueryMetadata) => void;\n\tonError: (error: unknown, context?: Record<string, string>) => void;\n\twithFailedDBMetadata: (metadata?: DBQueryMetadata) => DBQueryMetadata;\n}\n\nconst safeContextValue = (value: unknown): string => {\n\tif (typeof value === 'string') return value.slice(0, 128)\n\tif (typeof value === 'number' || typeof value === 'boolean') return String(value)\n\treturn '<invalid>'\n}\n\nconst snapshotResponseStatus = (value: unknown): number | undefined => {\n\tif (!value || typeof value !== 'object' || isRuntimeProxy(value)) return undefined\n\ttry {\n\t\tconst descriptor = Object.getOwnPropertyDescriptor(value, 'status')\n\t\tif (descriptor && 'value' in descriptor) {\n\t\t\treturn typeof descriptor.value === 'number' ? descriptor.value : undefined\n\t\t}\n\t\tif (typeof Response === 'undefined' || !hasSafeRuntimePrototype(value, Response.prototype)) return undefined\n\t\tconst getter = Object.getOwnPropertyDescriptor(Response.prototype, 'status')?.get\n\t\tconst status = typeof getter === 'function' ? Reflect.apply(getter, value, []) : undefined\n\t\treturn typeof status === 'number' ? status : undefined\n\t} catch { return undefined }\n}\n\nconst mergeHttpMetadata = (\n\tmetadata: HttpPerfMetadata,\n\tadditions: Partial<HttpPerfMetadata>\n): HttpPerfMetadata => {\n\ttry { return {...metadata, ...additions} } catch {\n\t\treturn {method: 'UNKNOWN', route: '/', ...additions}\n\t}\n}\n\nexport function createMeasurementPortMethods(\n\tdeps: MeasurementPortDependencies\n) {\n\tconst {clock, emitEvent, onError, withFailedDBMetadata} = deps\n\tconst invalidLabels = Object.freeze({'': ''}) as Record<string, string>\n\tconst captureLabels = (labels?: Record<string, string>): Record<string, string> | undefined => {\n\t\ttry { return snapshotPerformanceLabels(labels) } catch { return invalidLabels }\n\t}\n\tconst recordRequest = (\n\t\tname: string,\n\t\tduration: number,\n\t\tmetadata: HttpPerfMetadata,\n\t\tlabels?: Record<string, string>\n\t): void => {\n\t\ttry {\n\t\t\tconst capturedLabels = captureLabels(labels)\n\t\t\tconst http = normalizeHttpMetadata(metadata)\n\t\t\tconst end = clock.now()\n\t\t\temitEvent({\n\t\t\t\tname,\n\t\t\t\tduration,\n\t\t\t\tstart: end - duration,\n\t\t\t\tend,\n\t\t\t\tsource: 'mark',\n\t\t\t\thttp,\n\t\t\t\tlabels: buildHttpLabels(http, capturedLabels),\n\t\t\t\t...(http.outcome ? {outcome: http.outcome} : {})\n\t\t\t})\n\t\t} catch(error) {\n\t\t\tonError(error, {measureName: safeContextValue(name), operation: 'record-request'})\n\t\t}\n\t}\n\tconst timedEvent = (\n\t\tname: string,\n\t\tstart: number,\n\t\tstartHr: bigint,\n\t\tlabels?: Record<string, string>,\n\t\tfailed = false\n\t): PerfEvent => ({\n\t\tname,\n\t\tduration: nsToMs(clock.nowHr() - startHr),\n\t\tstart,\n\t\tend: Math.max(start, clock.now()),\n\t\tsource: 'mark',\n\t\t...(labels ? {labels} : {}),\n\t\t...(failed ? {outcome: 'server_error' as const} : {})\n\t})\n\n\treturn {\n\t\tmeasureSync<T>(name: string, fn: () => T, labels?: Record<string, string>): T {\n\t\t\tconst start = clock.now()\n\t\t\tconst startHr = clock.nowHr()\n\t\t\tconst capturedLabels = captureLabels(labels)\n\t\t\ttry {\n\t\t\t\tconst result = fn()\n\t\t\t\temitEvent(timedEvent(name, start, startHr, capturedLabels))\n\t\t\t\treturn result\n\t\t\t} catch(error) {\n\t\t\t\temitEvent(timedEvent(name, start, startHr, capturedLabels, true))\n\t\t\t\tthrow error\n\t\t\t}\n\t\t},\n\t\tmeasureAsync<T>(\n\t\t\tname: string,\n\t\t\tfn: () => Promise<T>,\n\t\t\tlabels?: Record<string, string>\n\t\t): Promise<T> {\n\t\t\tconst start = clock.now()\n\t\t\tconst startHr = clock.nowHr()\n\t\t\tconst capturedLabels = captureLabels(labels)\n\t\t\treturn Promise.resolve()\n\t\t\t\t.then(() => fn())\n\t\t\t\t.then(\n\t\t\t\t\t(result) => {\n\t\t\t\t\t\temitEvent(timedEvent(name, start, startHr, capturedLabels))\n\t\t\t\t\t\treturn result\n\t\t\t\t\t},\n\t\t\t\t\t(error) => {\n\t\t\t\t\t\temitEvent(timedEvent(name, start, startHr, capturedLabels, true))\n\t\t\t\t\t\tthrow error\n\t\t\t\t\t}\n\t\t\t\t)\n\t\t},\n\t\tmeasureDBQuery<T>(\n\t\t\tname: string,\n\t\t\tfn: () => Promise<T>,\n\t\t\tmetadata?: DBQueryMetadata,\n\t\t\tlabels?: Record<string, string>\n\t\t): Promise<T> {\n\t\t\tconst start = clock.now()\n\t\t\tconst startHr = clock.nowHr()\n\t\t\tconst capturedLabels = captureLabels(labels)\n\t\t\tconst capturedMetadata = snapshotSafeDBMetadata(metadata)\n\t\t\treturn Promise.resolve()\n\t\t\t\t.then(() => fn())\n\t\t\t\t.then(\n\t\t\t\t\t(result) => {\n\t\t\t\t\t\temitEvent(timedEvent(name, start, startHr, capturedLabels), capturedMetadata)\n\t\t\t\t\t\treturn result\n\t\t\t\t\t},\n\t\t\t\t\t(error) => {\n\t\t\t\t\t\temitEvent(\n\t\t\t\t\t\t\ttimedEvent(name, start, startHr, capturedLabels, true),\n\t\t\t\t\t\t\twithFailedDBMetadata(capturedMetadata)\n\t\t\t\t\t\t)\n\t\t\t\t\t\tthrow error\n\t\t\t\t\t}\n\t\t\t\t)\n\t\t},\n\t\tmeasureDBQuerySync<T>(\n\t\t\tname: string,\n\t\t\tfn: () => T,\n\t\t\tmetadata?: DBQueryMetadata,\n\t\t\tlabels?: Record<string, string>\n\t\t): T {\n\t\t\tconst start = clock.now()\n\t\t\tconst startHr = clock.nowHr()\n\t\t\tconst capturedLabels = captureLabels(labels)\n\t\t\tconst capturedMetadata = snapshotSafeDBMetadata(metadata)\n\t\t\ttry {\n\t\t\t\tconst result = fn()\n\t\t\t\temitEvent(timedEvent(name, start, startHr, capturedLabels), capturedMetadata)\n\t\t\t\treturn result\n\t\t\t} catch(error) {\n\t\t\t\temitEvent(\n\t\t\t\t\ttimedEvent(name, start, startHr, capturedLabels, true),\n\t\t\t\t\twithFailedDBMetadata(capturedMetadata)\n\t\t\t\t)\n\t\t\t\tthrow error\n\t\t\t}\n\t\t},\n\t\trecord(\n\t\t\tmetric: string,\n\t\t\tvalue: number,\n\t\t\tlabels?: Record<string, string>\n\t\t): void {\n\t\t\tconst end = clock.now()\n\t\t\tconst capturedLabels = captureLabels(labels)\n\t\t\temitEvent({\n\t\t\t\tname: metric,\n\t\t\t\tduration: value,\n\t\t\t\tstart: end - value,\n\t\t\t\tend,\n\t\t\t\tsource: 'mark',\n\t\t\t\t...(capturedLabels ? {labels: capturedLabels} : {})\n\t\t\t})\n\t\t},\n\t\tasync measureRequest<T>(\n\t\t\tname: string,\n\t\t\tfn: () => Promise<T>,\n\t\t\tmetadata: HttpPerfMetadata,\n\t\t\tlabels?: Record<string, string>\n\t\t): Promise<T> {\n\t\t\tconst startHr = clock.nowHr()\n\t\t\tconst capturedLabels = captureLabels(labels)\n\t\t\tlet capturedMetadata: HttpPerfMetadata\n\t\t\ttry { capturedMetadata = normalizeHttpMetadata(metadata) } catch {\n\t\t\t\tcapturedMetadata = {method: 'UNKNOWN', route: '/'}\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tconst result = await fn()\n\t\t\t\tconst statusCode = capturedMetadata.statusCode ?? snapshotResponseStatus(result)\n\t\t\t\trecordRequest(\n\t\t\t\t\tname,\n\t\t\t\t\tnsToMs(clock.nowHr() - startHr),\n\t\t\t\t\tmergeHttpMetadata(capturedMetadata, statusCode !== undefined ? {statusCode} : {}),\n\t\t\t\t\tcapturedLabels\n\t\t\t\t)\n\t\t\t\treturn result\n\t\t\t} catch(error) {\n\t\t\t\tlet outcome: NonNullable<HttpPerfMetadata['outcome']> = 'server_error'\n\t\t\t\ttry {\n\t\t\t\t\tif (capturedMetadata.aborted) outcome = 'aborted'\n\t\t\t\t\telse if (capturedMetadata.timedOut) outcome = 'timeout'\n\t\t\t\t} catch {\n\t\t\t\t\t// Preserve the business error when optional metadata is malformed.\n\t\t\t\t}\n\t\t\t\trecordRequest(\n\t\t\t\t\tname,\n\t\t\t\t\tnsToMs(clock.nowHr() - startHr),\n\t\t\t\t\tmergeHttpMetadata(capturedMetadata, {statusCode: undefined, outcome}),\n\t\t\t\t\tcapturedLabels\n\t\t\t\t)\n\t\t\t\tthrow error\n\t\t\t}\n\t\t},\n\t\trecordRequest\n\t}\n}\n","import {isRuntimePromise, isRuntimeProxy} from './safe-object'\n\ntype RuntimeMethod = (...args: unknown[]) => unknown\n\n/** Captures safe methods while permitting only one unresolved integration call. */\nexport const createSingleFlightMethodCapture = (): ((\n\ttarget: unknown,\n\tkey: PropertyKey\n) => RuntimeMethod | undefined) => {\n\tconst pendingMethods = new WeakMap<object, Set<PropertyKey>>()\n\treturn (target, key) => {\n\t\tif (!target || (typeof target !== 'object' && typeof target !== 'function') || isRuntimeProxy(target)) return undefined\n\t\ttry {\n\t\t\tlet owner: object | null = target\n\t\t\tfor (let depth = 0; owner && depth < 16; depth += 1) {\n\t\t\t\tif (isRuntimeProxy(owner)) return undefined\n\t\t\t\tconst descriptor = Object.getOwnPropertyDescriptor(owner, key)\n\t\t\t\tif (descriptor) {\n\t\t\t\t\tif (!('value' in descriptor) || typeof descriptor.value !== 'function') return undefined\n\t\t\t\t\tconst method = descriptor.value as RuntimeMethod\n\t\t\t\t\treturn (...args) => {\n\t\t\t\t\t\tconst targetObject = target as object\n\t\t\t\t\t\tconst active = pendingMethods.get(targetObject) ?? new Set<PropertyKey>()\n\t\t\t\t\t\tif (active.has(key)) return undefined\n\t\t\t\t\t\tactive.add(key)\n\t\t\t\t\t\tpendingMethods.set(targetObject, active)\n\t\t\t\t\t\tconst release = () => {\n\t\t\t\t\t\t\tactive.delete(key)\n\t\t\t\t\t\t\tif (active.size === 0 && pendingMethods.get(targetObject) === active) {\n\t\t\t\t\t\t\t\tpendingMethods.delete(targetObject)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tlet result: unknown\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tresult = Reflect.apply(method, target, args)\n\t\t\t\t\t\t} catch(error) {\n\t\t\t\t\t\t\trelease()\n\t\t\t\t\t\t\tthrow error\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (isRuntimePromise(result)) {\n\t\t\t\t\t\t\ttry { void Reflect.apply(Promise.prototype.then, result, [release, release]) } catch { release() }\n\t\t\t\t\t\t} else release()\n\t\t\t\t\t\treturn result\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\towner = Object.getPrototypeOf(owner) as object | null\n\t\t\t}\n\t\t} catch { return undefined }\n\t\treturn undefined\n\t}\n}\n","import type {PerformanceSpanOptions} from '@ooopsstudio/core/contracts/performance'\nimport type {Tracing, TracingSpan} from '@ooopsstudio/core/ports/tracing'\n\nimport type {PerformanceTracingBridge} from '../types/ports'\nimport {isSensitivePerformanceKey, sanitizePerformanceLabelValue} from '../utils/safe-identifiers'\nimport {ignoreRuntimePromiseRejection, isRuntimeProxy} from '../utils/safe-object'\nimport {createSingleFlightMethodCapture} from '../utils/single-flight-method'\n\nimport {snapshotSafeDBMetadata} from './utils/event-helpers'\nimport {normalizeHttpMetadata} from './utils/request-helpers'\n\nconst sanitizeSpanValue = (value: unknown): string | number | boolean => {\n\tif (typeof value === 'string') return value.length <= 256 ? sanitizePerformanceLabelValue(value) : '[redacted]'\n\tif (typeof value === 'number' && Number.isFinite(value)) return value\n\tif (typeof value === 'boolean') return value\n\treturn '[redacted]'\n}\n\nconst SPAN_OPTION_FIELDS = ['labels', 'kind', 'attributes', 'http', 'dbMetadata', 'createSpan'] as const\n\nexport const snapshotPerformanceSpanOptions = (\n\toptions: PerformanceSpanOptions | undefined\n): PerformanceSpanOptions | undefined => {\n\tif (options === undefined) return undefined\n\tif (!options || typeof options !== 'object' || isRuntimeProxy(options) || Array.isArray(options)) return undefined\n\tconst snapshot: Record<string, unknown> = Object.create(null) as Record<string, unknown>\n\ttry {\n\t\tfor (const key of SPAN_OPTION_FIELDS) {\n\t\t\tconst descriptor = Object.getOwnPropertyDescriptor(options, key)\n\t\t\tif (!descriptor?.enumerable || !('value' in descriptor)) continue\n\t\t\tif (key === 'http') {\n\t\t\t\ttry {\n\t\t\t\t\tsnapshot[key] = normalizeHttpMetadata(descriptor.value as never)\n\t\t\t\t} catch {\n\t\t\t\t\t// Omit invalid or accessor-backed optional metadata.\n\t\t\t\t}\n\t\t\t} else if (key === 'dbMetadata') {\n\t\t\t\tconst metadata = snapshotSafeDBMetadata(descriptor.value)\n\t\t\t\tif (metadata) snapshot[key] = metadata\n\t\t\t} else snapshot[key] = descriptor.value\n\t\t}\n\t} catch { return undefined }\n\treturn snapshot as PerformanceSpanOptions\n}\n\nconst sanitizeSpanAttributes = (attributes: Record<string, unknown> | undefined): Record<string, string | number | boolean> => {\n\tconst sanitized: Record<string, string | number | boolean> = {}\n\ttry {\n\t\tconst source = attributes ?? {}\n\t\tif (isRuntimeProxy(source)) return {}\n\t\tconst prototype = Object.getPrototypeOf(source)\n\t\tif (prototype !== Object.prototype && prototype !== null) return {}\n\t\tlet inspected = 0\n\t\tfor (const key in source) {\n\t\t\tif (inspected >= 32) break\n\t\t\tconst descriptor = Object.getOwnPropertyDescriptor(source, key)\n\t\t\tif (!descriptor?.enumerable) continue\n\t\t\tif (!('value' in descriptor)) continue\n\t\t\tinspected += 1\n\t\t\tif (/^[a-z][a-z0-9_.-]{0,63}$/iu.test(key)) {\n\t\t\t\tsanitized[key] = isSensitivePerformanceKey(key) ? '[redacted]' : sanitizeSpanValue(descriptor.value)\n\t\t\t}\n\t\t}\n\t} catch {\n\t\treturn {}\n\t}\n\treturn sanitized\n}\n\nconst sanitizeCorrelationId = (value: unknown, length: number): string | undefined =>\n\ttypeof value === 'string' && value.length === length && /^[0-9a-f]+$/iu.test(value) && !/^0+$/u.test(value)\n\t\t? value.toLowerCase()\n\t\t: undefined\n\nconst readCorrelationField = (context: unknown, key: 'traceId' | 'spanId'): unknown => {\n\tif (!context || typeof context !== 'object' || isRuntimeProxy(context)) return undefined\n\ttry {\n\t\tconst descriptor = Object.getOwnPropertyDescriptor(context, key)\n\t\treturn descriptor && 'value' in descriptor ? descriptor.value : undefined\n\t} catch { return undefined }\n}\n\nconst toSpanAttributes = (\n\toptions: PerformanceSpanOptions | undefined,\n\tduration: number,\n\toutcome: 'ok' | 'error'\n): Record<string, unknown> => ({\n\t...sanitizeSpanAttributes(options?.attributes),\n\t...sanitizeSpanAttributes(options?.labels),\n\t'perf.duration_ms': duration,\n\t'perf.outcome': outcome,\n\t...(options?.http?.route ? {'http.route': sanitizeSpanValue(options.http.route)} : {}),\n\t...(options?.http?.method ? {'http.method': sanitizeSpanValue(options.http.method)} : {}),\n\t...(typeof options?.http?.statusCode === 'number' ? {'http.status_code': sanitizeSpanValue(options.http.statusCode)} : {}),\n\t...(options?.dbMetadata?.collection ? {'db.collection': sanitizeSpanValue(options.dbMetadata.collection)} : {}),\n\t...(options?.dbMetadata?.table ? {'db.table': sanitizeSpanValue(options.dbMetadata.table)} : {}),\n\t...(options?.dbMetadata?.operation ? {'db.operation': sanitizeSpanValue(options.dbMetadata.operation)} : {}),\n\t...(options?.dbMetadata?.queryHash ? {'db.query_hash': sanitizeSpanValue(options.dbMetadata.queryHash)} : {})\n})\n\nexport function createPerformanceTracingBridge(\n\ttracer?: Tracing\n): PerformanceTracingBridge {\n\tconst captureMethod = createSingleFlightMethodCapture()\n\tconst captureSpanMethod = createSingleFlightMethodCapture()\n\tconst getActiveSpan = captureMethod(tracer, 'getActiveSpan')\n\tconst readCurrentTraceId = captureMethod(tracer, 'currentTraceId')\n\tconst inSpan = captureMethod(tracer, 'inSpan')\n\n\treturn {\n\t\tgetCorrelation(): {traceId?: string; spanId?: string} {\n\t\t\tlet context: unknown\n\t\t\ttry {\n\t\t\t\tconst activeSpan = getActiveSpan?.()\n\t\t\t\tcontext = captureSpanMethod(activeSpan, 'getContext')?.()\n\t\t\t} catch { /* optional tracing context */ }\n\t\t\tlet currentTraceId: unknown\n\t\t\ttry { currentTraceId = readCurrentTraceId?.() } catch { /* fall back to active context */ }\n\t\t\tconst traceId = sanitizeCorrelationId(currentTraceId, 32) ??\n\t\t\t\tsanitizeCorrelationId(readCorrelationField(context, 'traceId'), 32)\n\t\t\tconst spanId = sanitizeCorrelationId(readCorrelationField(context, 'spanId'), 16)\n\t\t\treturn {\n\t\t\t\t...(traceId ? {traceId} : {}),\n\t\t\t\t...(spanId ? {spanId} : {})\n\t\t\t}\n\t\t},\n\t\tasync withSpan<T>(\n\t\t\tname: string,\n\t\t\toptions: PerformanceSpanOptions | undefined,\n\t\t\tfn: (span?: TracingSpan) => Promise<T>\n\t\t): Promise<T> {\n\t\t\tif (!tracer) {\n\t\t\t\treturn await fn(undefined)\n\t\t\t}\n\t\t\tconst capturedOptions = snapshotPerformanceSpanOptions(options)\n\t\t\tconst createSpan = capturedOptions?.createSpan === true\n\t\t\tif (createSpan) {\n\t\t\t\tif (!inSpan) return await fn(undefined)\n\t\t\t\tlet spanOptions: NonNullable<Parameters<Tracing['inSpan']>[2]>\n\t\t\t\ttry {\n\t\t\t\t\tspanOptions = {\n\t\t\t\t\t\t...(capturedOptions?.kind ? {kind: capturedOptions.kind} : {}),\n\t\t\t\t\t\t...(capturedOptions?.attributes ? {attributes: sanitizeSpanAttributes(capturedOptions.attributes)} : {})\n\t\t\t\t\t}\n\t\t\t\t} catch {\n\t\t\t\t\treturn await fn(undefined)\n\t\t\t\t}\n\t\t\t\tlet invoked = false\n\t\t\t\tlet callbackPromise: Promise<T> | undefined\n\t\t\t\tconst invokeOnce = (span?: TracingSpan): Promise<T> => {\n\t\t\t\t\tcallbackPromise ??= Promise.resolve().then(async() => await fn(span))\n\t\t\t\t\treturn callbackPromise\n\t\t\t\t}\n\t\t\t\ttry {\n\t\t\t\t\tconst tracerOperation = inSpan(name, async(span: TracingSpan | undefined) => {\n\t\t\t\t\t\tinvoked = true\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\treturn await invokeOnce(span)\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t// A broken tracer may ignore the callback Promise. Resolve its\n\t\t\t\t\t\t\t// wrapper and rethrow the original operation error from this bridge.\n\t\t\t\t\t\t\treturn undefined as T\n\t\t\t\t\t\t}\n\t\t\t\t\t}, {...spanOptions})\n\t\t\t\t\tignoreRuntimePromiseRejection(tracerOperation)\n\t\t\t\t\t// Give tracers one microtask to invoke their callback. A tracer that\n\t\t\t\t\t// delays or never settles must not delay the measured business work.\n\t\t\t\t\tawait Promise.resolve()\n\t\t\t\t\tif (!invoked) return await invokeOnce(undefined)\n\t\t\t\t\treturn await callbackPromise as T\n\t\t\t\t} catch {\n\t\t\t\t\tif (!invoked) return await invokeOnce(undefined)\n\t\t\t\t\treturn await callbackPromise as T\n\t\t\t\t}\n\t\t\t}\n\t\t\tlet activeSpan: TracingSpan | undefined\n\t\t\ttry { activeSpan = getActiveSpan?.() as TracingSpan | undefined } catch { /* tracing is optional */ }\n\t\t\treturn await fn(activeSpan)\n\t\t},\n\t\tannotate(\n\t\t\tspan: TracingSpan | undefined,\n\t\t\toptions: PerformanceSpanOptions | undefined,\n\t\t\tduration: number,\n\t\t\toutcome: 'ok' | 'error'\n\t\t): void {\n\t\t\tif (!span) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tconst setAttribute = captureSpanMethod(span, 'setAttribute')\n\t\t\t\tconst addEvent = captureSpanMethod(span, 'addEvent')\n\t\t\t\tconst setStatus = captureSpanMethod(span, 'setStatus')\n\t\t\t\tconst capturedOptions = snapshotPerformanceSpanOptions(options)\n\t\t\t\tfor (const [key, value] of Object.entries(toSpanAttributes(capturedOptions, duration, outcome))) {\n\t\t\t\t\tsetAttribute?.(key, value)\n\t\t\t\t}\n\t\t\t\taddEvent?.('performance.measurement', {\n\t\t\t\t\t...sanitizeSpanAttributes(capturedOptions?.labels),\n\t\t\t\t\tduration_ms: duration,\n\t\t\t\t\toutcome\n\t\t\t\t})\n\t\t\t\tsetStatus?.({code: outcome === 'ok' ? 'ok' : 'error'})\n\t\t\t} catch {\n\t\t\t\t// Tracing decoration must not alter the measured operation.\n\t\t\t}\n\t\t},\n\t\trecordError(span: TracingSpan | undefined, _error: unknown): void {\n\t\t\tif (!span) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tconst recordException = captureSpanMethod(span, 'recordException')\n\t\t\t\tconst setStatus = captureSpanMethod(span, 'setStatus')\n\t\t\t\t// The measured operation's exception can contain credentials, query text,\n\t\t\t\t// payloads, or a sensitive stack. Performance only owns the outcome signal;\n\t\t\t\t// detailed error capture belongs to the errors service and its redaction policy.\n\t\t\t\tconst message = 'Performance measured operation failed'\n\t\t\t\trecordException?.(new Error(message))\n\t\t\t\tsetStatus?.({code: 'error', description: message})\n\t\t\t} catch {\n\t\t\t\t// Tracing failures must not replace the operation's original error.\n\t\t\t}\n\t\t}\n\t}\n}\n","import type {Clock} from '@ooopsstudio/core/contracts/clock'\nimport type {\n\tBudgetStatus,\n\tDBQueryMetadata,\n\tPerfEvent,\n\tPerformanceSpanOptions,\n\tSaturationAlert\n} from '@ooopsstudio/core/contracts/performance'\nimport type {Errors} from '@ooopsstudio/core/ports/errors'\nimport type {Tracing} from '@ooopsstudio/core/ports/tracing'\n\nimport type {PerformanceHandlerPort, PerformanceSinkState} from '../types/ports'\nimport {createPerformanceOnError} from '../utils/on-error'\nimport {\n\thasControlCharacters,\n\tisSensitivePerformanceKey,\n\tsanitizePerformanceEventName,\n\tsanitizePerformanceLabelValue,\n\tsnapshotPerformanceLabels\n} from '../utils/safe-identifiers'\n\nimport {\n\tcreatePerformanceCallbackDispatcher,\n\ttype PerformanceCallbackDispatcher,\n\ttype PerformanceTelemetryCallbacks\n} from './callback-dispatcher'\nimport {createCardinalityGuard} from './cardinality-guard'\nimport {createHighResClock} from './clock'\nimport {createMeasurementPortMethods} from './factories/performance-port-measurements'\nimport {registerPerformanceDispatcher} from './runtime-capabilities'\nimport {createPerformanceTracingBridge, snapshotPerformanceSpanOptions} from './tracing-bridge'\nimport {deepFreezePerformanceValue, isResourceSnapshotEvent, snapshotSafeDBMetadata} from './utils/event-helpers'\nimport {buildHttpLabels, normalizeHttpMetadata} from './utils/request-helpers'\n\nexport interface BaseHandlerExtensions {\n\tonAcceptedEvent?(event: PerfEvent): void\n\tflush?(): Promise<void>\n\tshutdown?(): Promise<void>\n\tgetExportStatus?(): {\n\t\tqueueSize: number\n\t\tdroppedTotal: number\n\t\tretriedTotal: number\n\t\tsinkState: PerformanceSinkState\n\t\tlastFailureCode?: string\n\t}\n\tgetBudgetStatus?(name: string): BudgetStatus | undefined\n}\n\nexport interface BasePerformanceHandlerOptions {\n\tclock: Clock\n\tcardinalityLimit: number\n\tcardinalityMode: 'warn' | 'drop'\n\tenableEventLoopMonitor: boolean\n\tenableGCMonitor: boolean\n\tenableResourceMonitor: boolean\n\terrors?: Errors\n\ttracer?: Tracing\n\tcallbacks?: PerformanceTelemetryCallbacks\n\tcreateRuntimeMonitoring?: (options: {\n\t\tclock: ReturnType<typeof createHighResClock>\n\t\tonPerfEvent: (event: PerfEvent) => void\n\t\tonSaturationAlert: (alert: SaturationAlert) => void\n\t\terrors?: Errors\n\t\tenableEventLoopMonitor: boolean\n\t\tenableGCMonitor: boolean\n\t\tenableResourceMonitor: boolean\n\t}) => {stop(): void}\n\tcreateExtensions?: (dispatcher: PerformanceCallbackDispatcher, clock: ReturnType<typeof createHighResClock>) => BaseHandlerExtensions\n}\n\nconst RESOURCE_VALUE_LABELS = new Set(['user', 'system', 'utilization', 'rss', 'heapUsed', 'heapTotal', 'external'])\nconst snapshotEventLabels = (\n\tlabels: Record<string, string> | undefined,\n\toptions: {preserveHttpRoute?: boolean; preserveResourceValues?: boolean} = {}\n): Record<string, string> | undefined => {\n\tif (!labels) return undefined\n\tconst entries = Object.entries(snapshotPerformanceLabels(labels) ?? {})\n\tconst snapshot: Record<string, string> = {}\n\tfor (const [key, value] of entries) {\n\t\tif (!/^[a-z_][a-z0-9_.-]{0,63}$/i.test(key) || typeof value !== 'string' || value.length > 256) {\n\t\t\tthrow new Error('Performance event labels exceed safe key/value limits')\n\t\t}\n\t\tif (options.preserveHttpRoute && key === 'route') {\n\t\t\tif (hasControlCharacters(value)) throw new Error('Performance HTTP routes cannot contain control characters')\n\t\t\tsnapshot[key] = value\n\t\t} else if (options.preserveResourceValues && RESOURCE_VALUE_LABELS.has(key)) {\n\t\t\tconst numeric = Number(value)\n\t\t\tif (!Number.isFinite(numeric) || numeric < 0) throw new Error('Performance resource labels must be non-negative finite numbers')\n\t\t\tsnapshot[key] = value\n\t\t} else {\n\t\t\tsnapshot[key] = isSensitivePerformanceKey(key) ? '[redacted]' : sanitizePerformanceLabelValue(value)\n\t\t}\n\t}\n\treturn snapshot\n}\n\nconst VALID_EVENT_SOURCES = new Set(['runtime', 'mark', 'feature'])\nconst VALID_EVENT_OUTCOMES = new Set(['ok', 'client_error', 'server_error', 'timeout', 'aborted'])\n\nexport function createBasePerformanceHandler(\n\toptions: BasePerformanceHandlerOptions\n): PerformanceHandlerPort {\n\tconst clock = createHighResClock({clock: options.clock})\n\tconst dispatcher = createPerformanceCallbackDispatcher(options.callbacks ?? {})\n\tconst cardinality = createCardinalityGuard({\n\t\tmaxCombinations: options.cardinalityLimit,\n\t\tmode: options.cardinalityMode,\n\t\tnow: clock.now,\n\t\tonExceeded: (name, reason) => dispatcher.emit('onDimensionExplosion', name, reason)\n\t})\n\tconst tracing = createPerformanceTracingBridge(options.tracer)\n\tconst onError = createPerformanceOnError(options.errors, {operation: 'measure'})\n\tlet extensions: BaseHandlerExtensions = {}\n\tlet state: 'running' | 'draining' | 'closed' = 'running'\n\tlet droppedEvents = 0\n\tlet activeMeasurements = 0\n\tlet activeBarrier: Promise<void> | undefined\n\tlet releaseActiveBarrier: (() => void) | undefined\n\tlet monitorsStopped = false\n\tlet finalizationFailureCode: string | undefined\n\tconst beginMeasurement = (): (() => void) | undefined => {\n\t\tif (state !== 'running') return undefined\n\t\tactiveMeasurements += 1\n\t\tdispatcher.emit('onSelfMetric', '_performance_active_measurements', activeMeasurements)\n\t\treturn () => {\n\t\t\tactiveMeasurements -= 1\n\t\t\tdispatcher.emit('onSelfMetric', '_performance_active_measurements', activeMeasurements)\n\t\t\tif (activeMeasurements === 0) {\n\t\t\t\treleaseActiveBarrier?.()\n\t\t\t\treleaseActiveBarrier = undefined\n\t\t\t\tactiveBarrier = undefined\n\t\t\t}\n\t\t}\n\t}\n\tconst waitForActive = async(): Promise<void> => {\n\t\tif (activeMeasurements === 0) return\n\t\tactiveBarrier ??= new Promise<void>((resolve) => { releaseActiveBarrier = resolve })\n\t\tlet timer: ReturnType<typeof setTimeout> | undefined\n\t\ttry {\n\t\t\tawait Promise.race([\n\t\t\t\tactiveBarrier,\n\t\t\t\tnew Promise<never>((_, reject) => {\n\t\t\t\t\ttimer = setTimeout(() => reject(new Error('PERFORMANCE_DRAIN_TIMEOUT')), 5_000)\n\t\t\t\t})\n\t\t\t])\n\t\t} finally {\n\t\t\ttry { if (timer) clearTimeout(timer) } catch { /* completed drain remains authoritative */ }\n\t\t}\n\t}\n\tconst withFailedDBMetadata = (metadata?: DBQueryMetadata): DBQueryMetadata => {\n\t\ttry { return {...(metadata ?? {}), success: false, failureCode: 'query_failed'} } catch {\n\t\t\treturn {success: false, failureCode: 'query_failed'}\n\t\t}\n\t}\n\n\tconst emitEvent = (event: PerfEvent, metadata?: DBQueryMetadata): void => {\n\t\tif (state === 'closed') return\n\t\tlet enriched: PerfEvent\n\t\tlet eventName = '<invalid>'\n\t\ttry {\n\t\t\tconst rawName: unknown = event.name\n\t\t\tconst validName = typeof rawName === 'string' && rawName.length <= 128 &&\n\t\t\t\tBoolean(rawName.trim()) && !hasControlCharacters(rawName)\n\t\t\teventName = validName ? sanitizePerformanceEventName(rawName) : '<invalid>'\n\t\t\tif (\n\t\t\t\t!validName ||\n\t\t\t\t!Number.isFinite(event.duration) ||\n\t\t\t\tevent.duration < 0 ||\n\t\t\t\t!Number.isFinite(event.start) ||\n\t\t\t\t!Number.isFinite(event.end) ||\n\t\t\t\tevent.end < event.start ||\n\t\t\t\t!VALID_EVENT_SOURCES.has(event.source) ||\n\t\t\t\t(event.outcome !== undefined && !VALID_EVENT_OUTCOMES.has(event.outcome))\n\t\t\t) {\n\t\t\t\tthrow new Error('Invalid performance event')\n\t\t\t}\n\t\t\tconst correlation = tracing.getCorrelation()\n\t\t\tconst resourceSnapshot = isResourceSnapshotEvent(event.source, eventName)\n\t\t\tconst http = event.http ? normalizeHttpMetadata(event.http) : undefined\n\t\t\tconst labels = snapshotEventLabels(\n\t\t\t\thttp ? buildHttpLabels(http, event.labels) : event.labels,\n\t\t\t\t{preserveHttpRoute: Boolean(http), preserveResourceValues: resourceSnapshot}\n\t\t\t)\n\t\t\tconst resolvedOutcome = event.outcome ?? http?.outcome\n\t\t\tenriched = {\n\t\t\t\t...event,\n\t\t\t\tname: eventName,\n\t\t\t\t...(labels ? {labels} : {}),\n\t\t\t\t...(http ? {http} : {}),\n\t\t\t\t...(resolvedOutcome ? {outcome: resolvedOutcome} : {}),\n\t\t\t\t...(metadata\n\t\t\t\t\t? {dbMetadata: snapshotSafeDBMetadata(metadata)}\n\t\t\t\t\t: event.dbMetadata\n\t\t\t\t\t\t? {dbMetadata: snapshotSafeDBMetadata(event.dbMetadata)}\n\t\t\t\t\t\t: {}),\n\t\t\t\t...(event.traceId ?? correlation.traceId\n\t\t\t\t\t? {traceId: event.traceId ?? correlation.traceId}\n\t\t\t\t\t: {}),\n\t\t\t\t...(event.spanId ?? correlation.spanId\n\t\t\t\t\t? {spanId: event.spanId ?? correlation.spanId}\n\t\t\t\t\t: {})\n\t\t\t}\n\t\t\t// CPU/memory snapshot labels are numeric observations that change on\n\t\t\t// every tick. They must not consume the low-cardinality dimension budget.\n\t\t\tconst cardinalityLabels = resourceSnapshot\n\t\t\t\t? undefined\n\t\t\t\t: enriched.labels\n\t\t\tconst check = cardinality.check(enriched.name, cardinalityLabels)\n\t\t\tif (!check.allowed) {\n\t\t\t\tdroppedEvents += 1\n\t\t\t\tdispatcher.emit('onSelfMetric', '_performance_dropped_total', 1, {reason: check.reason ?? 'cardinality'})\n\t\t\t\tdispatcher.emit('onDimensionDrop', enriched.name, check.reason ?? 'limit-exceeded')\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (check.reason) {\n\t\t\t\tenriched = {\n\t\t\t\t\t...enriched,\n\t\t\t\t\tname: 'cardinality_overflow',\n\t\t\t\t\tlabels: {reason: check.reason}\n\t\t\t\t}\n\t\t\t}\n\t\t} catch(error) {\n\t\t\tdroppedEvents += 1\n\t\t\tdispatcher.emit('onSelfMetric', '_performance_dropped_total', 1, {reason: 'invalid_event'})\n\t\t\tonError(error, {eventName})\n\t\t\treturn\n\t\t}\n\t\tenriched = deepFreezePerformanceValue(enriched)\n\t\tdispatcher.emit('onSelfMetric', '_performance_recorded_total', 1, {source: enriched.source})\n\t\ttry {\n\t\t\textensions.onAcceptedEvent?.(enriched)\n\t\t} catch(error) {\n\t\t\tonError(error, {eventName: enriched.name, operation: 'accepted-event-extension'})\n\t\t}\n\t\tdispatcher.emit('onPerfEvent', enriched)\n\t}\n\n\tconst measurements = createMeasurementPortMethods({\n\t\tclock,\n\t\temitEvent,\n\t\tonError,\n\t\twithFailedDBMetadata\n\t})\n\tlet monitoring: {stop(): void} | undefined\n\ttry {\n\t\tmonitoring = options.createRuntimeMonitoring?.({\n\t\t\tclock,\n\t\t\tonPerfEvent: emitEvent,\n\t\t\tonSaturationAlert: (alert: SaturationAlert) => dispatcher.emit('onSaturationAlert', alert),\n\t\t\t...(options.errors ? {errors: options.errors} : {}),\n\t\t\tenableEventLoopMonitor: options.enableEventLoopMonitor,\n\t\t\tenableGCMonitor: options.enableGCMonitor,\n\t\t\tenableResourceMonitor: options.enableResourceMonitor\n\t\t})\n\t\textensions = options.createExtensions?.(dispatcher, clock) ?? {}\n\t} catch(error) {\n\t\ttry { monitoring?.stop() } catch { /* preserve the setup failure */ }\n\t\tthrow error\n\t}\n\tlet shutdownPromise: Promise<void> | undefined\n\n\tconst port: PerformanceHandlerPort = {\n\t\trecord(name, value, labels) {\n\t\t\tconst finish = beginMeasurement()\n\t\t\tif (!finish) return\n\t\t\ttry { measurements.record(name, value, labels) } finally { finish() }\n\t\t},\n\t\tasync measureAsync(name, fn, labels) {\n\t\t\tconst finish = beginMeasurement()\n\t\t\tif (!finish) return await fn()\n\t\t\ttry { return await measurements.measureAsync(name, fn, labels) } finally { finish() }\n\t\t},\n\t\tmeasureSync(name, fn, labels) {\n\t\t\tconst finish = beginMeasurement()\n\t\t\tif (!finish) return fn()\n\t\t\ttry { return measurements.measureSync(name, fn, labels) } finally { finish() }\n\t\t},\n\t\tasync measureDBQuery(name, fn, metadata, labels) {\n\t\t\tconst finish = beginMeasurement()\n\t\t\tif (!finish) return await fn()\n\t\t\ttry { return await measurements.measureDBQuery(name, fn, metadata, labels) } finally { finish() }\n\t\t},\n\t\tmeasureDBQuerySync(name, fn, metadata, labels) {\n\t\t\tconst finish = beginMeasurement()\n\t\t\tif (!finish) return fn()\n\t\t\ttry { return measurements.measureDBQuerySync(name, fn, metadata, labels) } finally { finish() }\n\t\t},\n\t\tasync measureRequest(name, fn, metadata, labels) {\n\t\t\tconst finish = beginMeasurement()\n\t\t\tif (!finish) return await fn()\n\t\t\ttry { return await measurements.measureRequest(name, fn, metadata, labels) } finally { finish() }\n\t\t},\n\t\tasync measureSpan<T>(name: string, fn: () => Promise<T>, spanOptions?: PerformanceSpanOptions) {\n\t\t\tconst finish = beginMeasurement()\n\t\t\tif (!finish) return await fn()\n\t\t\ttry {\n\t\t\t\tconst capturedSpanOptions = snapshotPerformanceSpanOptions(spanOptions)\n\t\t\t\tconst traceSpanName = typeof name === 'string' && name.length <= 128 && name.trim() && !hasControlCharacters(name)\n\t\t\t\t\t? sanitizePerformanceEventName(name)\n\t\t\t\t\t: 'performance.measurement'\n\t\t\t\treturn await tracing.withSpan(traceSpanName, capturedSpanOptions, async(span) => {\n\t\t\t\t\tlet eventLabels: Record<string, string> | undefined\n\t\t\t\t\tlet dbMetadata: DBQueryMetadata | undefined\n\t\t\t\t\tlet httpMetadata: PerformanceSpanOptions['http']\n\t\t\t\t\ttry {\n\t\t\t\t\t\teventLabels = snapshotPerformanceLabels(capturedSpanOptions?.labels as Record<string, string> | undefined)\n\t\t\t\t\t\tdbMetadata = snapshotSafeDBMetadata(capturedSpanOptions?.dbMetadata)\n\t\t\t\t\t\thttpMetadata = capturedSpanOptions?.http ? normalizeHttpMetadata(capturedSpanOptions.http) : undefined\n\t\t\t\t\t} catch {\n\t\t\t\t\t// Optional span metadata must not alter the measured operation.\n\t\t\t\t\t}\n\t\t\t\t\tconst started = clock.now()\n\t\t\t\t\tconst startedHr = clock.nowHr()\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst result = await fn()\n\t\t\t\t\t\tconst duration = Number(clock.nowHr() - startedHr) / 1_000_000\n\t\t\t\t\t\tconst end = Math.max(started, clock.now())\n\t\t\t\t\t\ttracing.annotate(span, capturedSpanOptions, duration, 'ok')\n\t\t\t\t\t\temitEvent({\n\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\tduration,\n\t\t\t\t\t\t\tstart: started,\n\t\t\t\t\t\t\tend,\n\t\t\t\t\t\t\tsource: 'mark',\n\t\t\t\t\t\t\t...(httpMetadata ? {http: httpMetadata} : {}),\n\t\t\t\t\t\t\t...(httpMetadata?.outcome ? {outcome: httpMetadata.outcome} : {}),\n\t\t\t\t\t\t\tlabels: {...(eventLabels ?? {}), instrumentation: 'span'}\n\t\t\t\t\t\t}, dbMetadata)\n\t\t\t\t\t\treturn result\n\t\t\t\t\t} catch(error) {\n\t\t\t\t\t\tconst duration = Number(clock.nowHr() - startedHr) / 1_000_000\n\t\t\t\t\t\tconst end = Math.max(started, clock.now())\n\t\t\t\t\t\tconst failureOutcome = httpMetadata?.aborted ? 'aborted' as const\n\t\t\t\t\t\t\t: httpMetadata?.timedOut ? 'timeout' as const\n\t\t\t\t\t\t\t\t: 'server_error' as const\n\t\t\t\t\t\ttracing.annotate(span, capturedSpanOptions, duration, 'error')\n\t\t\t\t\t\ttracing.recordError(span, error)\n\t\t\t\t\t\temitEvent({\n\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\tduration,\n\t\t\t\t\t\t\tstart: started,\n\t\t\t\t\t\t\tend,\n\t\t\t\t\t\t\tsource: 'mark',\n\t\t\t\t\t\t\toutcome: failureOutcome,\n\t\t\t\t\t\t\t...(httpMetadata ? {http: {\n\t\t\t\t\t\t\t\t...httpMetadata, statusCode: undefined, outcome: failureOutcome\n\t\t\t\t\t\t\t}} : {}),\n\t\t\t\t\t\t\tlabels: {...(eventLabels ?? {}), instrumentation: 'span'}\n\t\t\t\t\t\t}, dbMetadata\n\t\t\t\t\t\t\t? withFailedDBMetadata(dbMetadata)\n\t\t\t\t\t\t\t: undefined)\n\t\t\t\t\t\tthrow error\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t} finally { finish() }\n\t\t},\n\t\tgetBudgetStatus(name) {\n\t\t\tif (typeof name !== 'string' || name.length > 128) return undefined\n\t\t\ttry {\n\t\t\t\tconst status = extensions.getBudgetStatus?.(name)\n\t\t\t\treturn status ? Object.freeze({...status}) : undefined\n\t\t\t} catch { return undefined }\n\t\t},\n\t\tasync flush() {\n\t\t\tif (state === 'closed') return\n\t\t\tif (state === 'draining' && shutdownPromise) return await shutdownPromise\n\t\t\ttry { await extensions.flush?.() } catch(error) {\n\t\t\t\tdispatcher.emit('onSelfMetric', '_performance_finalization_failures_total', 1, {operation: 'flush'})\n\t\t\t\tthrow error\n\t\t\t}\n\t\t},\n\t\tasync shutdown() {\n\t\t\tif (state === 'closed') return\n\t\t\tif (!shutdownPromise) {\n\t\t\t\tshutdownPromise = (async() => {\n\t\t\t\t\tstate = 'draining'\n\t\t\t\t\tif (!monitorsStopped) {\n\t\t\t\t\t\tmonitorsStopped = true\n\t\t\t\t\t\ttry { monitoring?.stop() } catch(error) {\n\t\t\t\t\t\t\tonError(error, {operation: 'runtime-monitor.stop'})\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tawait waitForActive()\n\t\t\t\t\tawait extensions.shutdown?.()\n\t\t\t\t\tstate = 'closed'\n\t\t\t\t\tfinalizationFailureCode = undefined\n\t\t\t\t})()\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tawait shutdownPromise\n\t\t\t} catch(error) {\n\t\t\t\tfinalizationFailureCode = 'PERFORMANCE_FINALIZATION_FAILURE'\n\t\t\t\tdispatcher.emit('onSelfMetric', '_performance_finalization_failures_total', 1, {operation: 'shutdown'})\n\t\t\t\tshutdownPromise = undefined\n\t\t\t\tthrow error\n\t\t\t}\n\t\t},\n\t\tgetStatus() {\n\t\t\tlet status: ReturnType<NonNullable<BaseHandlerExtensions['getExportStatus']>> | undefined\n\t\t\ttry { status = extensions.getExportStatus?.() } catch {\n\t\t\t\tstatus = {\n\t\t\t\t\tqueueSize: 0,\n\t\t\t\t\tdroppedTotal: 0,\n\t\t\t\t\tretriedTotal: 0,\n\t\t\t\t\tsinkState: 'unhealthy',\n\t\t\t\t\tlastFailureCode: 'PERFORMANCE_STATUS_FAILURE'\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn Object.freeze({\n\t\t\t\tstate,\n\t\t\t\tactiveMeasurements,\n\t\t\t\tqueueSize: status?.queueSize ?? 0,\n\t\t\t\tdroppedTotal: droppedEvents + (status?.droppedTotal ?? 0),\n\t\t\t\tretriedTotal: status?.retriedTotal ?? 0,\n\t\t\t\tsinkState: state === 'closed' ? 'closed' : finalizationFailureCode\n\t\t\t\t\t? 'unhealthy' : status?.sinkState ?? 'healthy',\n\t\t\t\t...(finalizationFailureCode ?? status?.lastFailureCode\n\t\t\t\t\t? {lastFailureCode: finalizationFailureCode ?? status?.lastFailureCode}\n\t\t\t\t\t: {})\n\t\t\t})\n\t\t}\n\t}\n\tregisterPerformanceDispatcher(port, dispatcher)\n\treturn port\n}\n","import type {LifecyclePort} from '@ooopsstudio/core/ports/lifecycle'\n\nimport type {PerformanceHandlerPort} from '../types/ports'\n\nimport {ignoreRuntimePromiseRejection, isRuntimeProxy} from './safe-object'\n\ntype LifecycleRegistrationMethod = 'registerFlushHook' | 'registerShutdownHook'\n\nconst captureLifecycleMethod = <K extends LifecycleRegistrationMethod>(\n\tlifecycle: LifecyclePort,\n\tkey: K\n): LifecyclePort[K] | undefined => {\n\tif (isRuntimeProxy(lifecycle)) return undefined\n\ttry {\n\t\tlet owner: object | null = lifecycle\n\t\tfor (let depth = 0; owner && depth < 16; depth += 1) {\n\t\t\tif (isRuntimeProxy(owner)) return undefined\n\t\t\tconst descriptor = Object.getOwnPropertyDescriptor(owner, key)\n\t\t\tif (descriptor) {\n\t\t\t\tif (!('value' in descriptor) || typeof descriptor.value !== 'function') return undefined\n\t\t\t\tconst method = descriptor.value as (...args: never[]) => unknown\n\t\t\t\treturn ((...args: never[]) => Reflect.apply(method, lifecycle, args)) as LifecyclePort[K]\n\t\t\t}\n\t\t\towner = Object.getPrototypeOf(owner) as object | null\n\t\t}\n\t} catch { return undefined }\n\treturn undefined\n}\n\n/** Registers flush/shutdown hooks atomically and releases them after cleanup. */\nexport function registerPerformanceLifecycleCleanup(\n\tlifecycle: LifecyclePort | undefined,\n\thandler: PerformanceHandlerPort\n): void {\n\tif (!lifecycle) return\n\tconst registerFlushHook = captureLifecycleMethod(lifecycle, 'registerFlushHook')\n\tconst registerShutdownHook = captureLifecycleMethod(lifecycle, 'registerShutdownHook')\n\tlet disposers: Array<() => void> = []\n\tconst addDisposer = (value: unknown): void => {\n\t\tif (typeof value === 'function') disposers.push(value as () => void)\n\t\telse ignoreRuntimePromiseRejection(value)\n\t}\n\ttry {\n\t\tif (registerFlushHook && handler.flush) {\n\t\t\taddDisposer(registerFlushHook(\n\t\t\t\t'performance-export',\n\t\t\t\tasync() => await handler.flush?.()\n\t\t\t))\n\t\t}\n\t\tif (registerShutdownHook && handler.shutdown) {\n\t\t\taddDisposer(registerShutdownHook(\n\t\t\t\t'runtime-monitors',\n\t\t\t\tasync() => await handler.shutdown?.(),\n\t\t\t\t{name: 'performance-cleanup', priority: 30}\n\t\t\t))\n\t\t}\n\t} catch(error) {\n\t\tconst cleanupErrors: unknown[] = []\n\t\tfor (const disposer of disposers.reverse()) {\n\t\t\ttry { ignoreRuntimePromiseRejection(disposer() as unknown) } catch(cleanupError) { cleanupErrors.push(cleanupError) }\n\t\t}\n\t\tdisposers = []\n\t\tif (cleanupErrors.length > 0) {\n\t\t\tthrow new AggregateError([error, ...cleanupErrors], 'Performance lifecycle registration rollback failed')\n\t\t}\n\t\tthrow error\n\t}\n\tif (!handler.shutdown || disposers.length === 0) return\n\tconst shutdown = handler.shutdown.bind(handler)\n\thandler.shutdown = async() => {\n\t\tawait shutdown()\n\t\tconst activeDisposers = disposers\n\t\tdisposers = []\n\t\tfor (const disposer of activeDisposers.reverse()) {\n\t\t\ttry { ignoreRuntimePromiseRejection(disposer() as unknown) } catch {\n\t\t\t\t// Lifecycle deregistration must not make a completed cleanup fail.\n\t\t\t}\n\t\t}\n\t}\n}\n\n/** Preserves the setup failure when best-effort handler cleanup also fails. */\nexport async function failPerformanceSetup(\n\thandler: PerformanceHandlerPort,\n\tsetupError: unknown\n): Promise<never> {\n\ttry {\n\t\tawait handler.shutdown?.()\n\t} catch(cleanupError) {\n\t\tthrow new AggregateError(\n\t\t\t[setupError, cleanupError],\n\t\t\t'Performance setup and cleanup failed'\n\t\t)\n\t}\n\tthrow setupError\n}\n"]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { PerformanceEventExporterPort } from '@ooopsstudio/core/ports/performance';
|
|
2
|
+
|
|
3
|
+
interface HttpNdjsonPerformanceEventExporterOptions {
|
|
4
|
+
url: string;
|
|
5
|
+
headers?: Record<string, string>;
|
|
6
|
+
fetchImpl?: typeof fetch;
|
|
7
|
+
timeoutMs?: number;
|
|
8
|
+
}
|
|
9
|
+
declare function createHttpNdjsonPerformanceEventExporter(options: HttpNdjsonPerformanceEventExporterOptions): PerformanceEventExporterPort;
|
|
10
|
+
|
|
11
|
+
export { type HttpNdjsonPerformanceEventExporterOptions, createHttpNdjsonPerformanceEventExporter };
|
|
@@ -0,0 +1,364 @@
|
|
|
1
|
+
import { MAX_PERFORMANCE_EXPORT_BATCH_COUNT, serializePerformanceEventRecord, MAX_PERFORMANCE_EXPORT_BATCH_BYTES, createPerformanceExportError, classifyHttpStatus, classifyFetchFailure } from '../../chunk-3GMKPRQP.js';
|
|
2
|
+
import { isRuntimeProxy, isRuntimePromise, ignoreRuntimePromiseRejection, hasSafeRuntimePrototype } from '../../chunk-RL2752FW.js';
|
|
3
|
+
import { byteSize } from '@ooopsstudio/core/utils/byte-size';
|
|
4
|
+
|
|
5
|
+
var RESERVED_HEADERS = /* @__PURE__ */ new Set(["content-length", "host", "transfer-encoding"]);
|
|
6
|
+
var MAX_HEADER_COUNT = 100;
|
|
7
|
+
var MAX_HEADER_VALUE_BYTES = 8192;
|
|
8
|
+
var MAX_URL_LENGTH = 4096;
|
|
9
|
+
var MAX_HTTP_TIMEOUT_MS = 3e4;
|
|
10
|
+
function createHttpNdjsonPerformanceEventExporter(options) {
|
|
11
|
+
const configured = snapshotDataObject(
|
|
12
|
+
options,
|
|
13
|
+
/* @__PURE__ */ new Set(["url", "headers", "fetchImpl", "timeoutMs"]),
|
|
14
|
+
"Performance NDJSON exporter options"
|
|
15
|
+
);
|
|
16
|
+
const { url: rawUrl, headers: rawHeaders = {}, fetchImpl: rawFetch, timeoutMs: rawTimeout } = configured;
|
|
17
|
+
if (typeof rawUrl !== "string" || rawUrl.length === 0 || rawUrl.length > MAX_URL_LENGTH) {
|
|
18
|
+
throw new Error(`Performance NDJSON exporter URL must be a non-empty string of at most ${MAX_URL_LENGTH} characters`);
|
|
19
|
+
}
|
|
20
|
+
let parsedUrl;
|
|
21
|
+
try {
|
|
22
|
+
parsedUrl = new URL(rawUrl);
|
|
23
|
+
} catch {
|
|
24
|
+
throw new Error("Performance NDJSON exporter URL must be a valid URL");
|
|
25
|
+
}
|
|
26
|
+
if (parsedUrl.protocol !== "http:" && parsedUrl.protocol !== "https:") {
|
|
27
|
+
throw new Error("Performance NDJSON exporter URL must use HTTP or HTTPS");
|
|
28
|
+
}
|
|
29
|
+
const hostname = parsedUrl.hostname.toLowerCase().replace(/^\[|\]$/gu, "").replace(/\.+$/u, "");
|
|
30
|
+
const loopback = hostname === "localhost" || hostname.endsWith(".localhost") || hostname === "::1" || /^127(?:\.\d{1,3}){3}$/u.test(hostname);
|
|
31
|
+
if (parsedUrl.protocol === "http:" && !loopback) {
|
|
32
|
+
throw new Error("Performance NDJSON exporter remote URLs must use HTTPS");
|
|
33
|
+
}
|
|
34
|
+
if (parsedUrl.username || parsedUrl.password) {
|
|
35
|
+
throw new Error("Performance NDJSON exporter URL must not contain credentials; use headers instead");
|
|
36
|
+
}
|
|
37
|
+
if (parsedUrl.search || parsedUrl.hash) {
|
|
38
|
+
throw new Error("Performance NDJSON exporter URL must not contain query parameters or fragments");
|
|
39
|
+
}
|
|
40
|
+
const timeoutMs = rawTimeout ?? 5e3;
|
|
41
|
+
if (typeof timeoutMs !== "number" || !Number.isSafeInteger(timeoutMs) || timeoutMs <= 0 || timeoutMs > MAX_HTTP_TIMEOUT_MS) {
|
|
42
|
+
throw new Error(`Performance NDJSON exporter timeoutMs must be between 1 and ${MAX_HTTP_TIMEOUT_MS}`);
|
|
43
|
+
}
|
|
44
|
+
const configuredFetch = rawFetch ?? globalThis.fetch;
|
|
45
|
+
if (typeof configuredFetch !== "function") {
|
|
46
|
+
throw new Error("Performance NDJSON exporter requires a fetch implementation");
|
|
47
|
+
}
|
|
48
|
+
const fetchImpl = configuredFetch;
|
|
49
|
+
const url = parsedUrl.toString();
|
|
50
|
+
const headers = Object.fromEntries(Object.entries(snapshotHeaders(rawHeaders)).filter(([name]) => name.toLowerCase() !== "content-type"));
|
|
51
|
+
let activeRequest;
|
|
52
|
+
let pendingBodyDisposal;
|
|
53
|
+
let bodyDisposalDisabled = false;
|
|
54
|
+
const disposeResponse = (response) => {
|
|
55
|
+
if (pendingBodyDisposal || bodyDisposalDisabled) return;
|
|
56
|
+
const disposal = disposeResponseBody(response);
|
|
57
|
+
if (!disposal) return;
|
|
58
|
+
pendingBodyDisposal = disposal;
|
|
59
|
+
let cleanupTimeout;
|
|
60
|
+
const release = () => {
|
|
61
|
+
if (pendingBodyDisposal !== disposal) return;
|
|
62
|
+
pendingBodyDisposal = void 0;
|
|
63
|
+
if (cleanupTimeout !== void 0) {
|
|
64
|
+
try {
|
|
65
|
+
clearTimeout(cleanupTimeout);
|
|
66
|
+
} catch {
|
|
67
|
+
}
|
|
68
|
+
cleanupTimeout = void 0;
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
try {
|
|
72
|
+
cleanupTimeout = setTimeout(() => {
|
|
73
|
+
if (pendingBodyDisposal !== disposal) return;
|
|
74
|
+
bodyDisposalDisabled = true;
|
|
75
|
+
release();
|
|
76
|
+
}, timeoutMs);
|
|
77
|
+
try {
|
|
78
|
+
cleanupTimeout.unref?.();
|
|
79
|
+
} catch {
|
|
80
|
+
}
|
|
81
|
+
} catch {
|
|
82
|
+
bodyDisposalDisabled = true;
|
|
83
|
+
release();
|
|
84
|
+
}
|
|
85
|
+
try {
|
|
86
|
+
void Reflect.apply(Promise.prototype.then, disposal, [release, release]);
|
|
87
|
+
} catch {
|
|
88
|
+
release();
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
let exportInvocationActive = false;
|
|
92
|
+
const exportBatch = async (batch) => {
|
|
93
|
+
if (pendingBodyDisposal) {
|
|
94
|
+
throw createPerformanceExportError("A performance response cleanup is still active", {
|
|
95
|
+
retryable: true,
|
|
96
|
+
code: "fetch_aborted"
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
let body;
|
|
100
|
+
try {
|
|
101
|
+
if (!Array.isArray(batch)) throw new TypeError();
|
|
102
|
+
const lengthDescriptor = Object.getOwnPropertyDescriptor(batch, "length");
|
|
103
|
+
const batchLength = lengthDescriptor && "value" in lengthDescriptor ? lengthDescriptor.value : void 0;
|
|
104
|
+
if (!Number.isSafeInteger(batchLength) || batchLength < 0 || batchLength > MAX_PERFORMANCE_EXPORT_BATCH_COUNT) throw new TypeError();
|
|
105
|
+
if (batchLength === 0) return;
|
|
106
|
+
const lines = [];
|
|
107
|
+
let serializedBytes = 0;
|
|
108
|
+
for (let index = 0; index < batchLength; index += 1) {
|
|
109
|
+
const descriptor = Object.getOwnPropertyDescriptor(batch, String(index));
|
|
110
|
+
if (!descriptor?.enumerable || !("value" in descriptor)) throw new TypeError();
|
|
111
|
+
const snapshot = serializePerformanceEventRecord(descriptor.value);
|
|
112
|
+
if (!snapshot) throw new TypeError("Invalid performance event record");
|
|
113
|
+
serializedBytes += snapshot.bytes + 1;
|
|
114
|
+
if (serializedBytes > MAX_PERFORMANCE_EXPORT_BATCH_BYTES) throw new TypeError();
|
|
115
|
+
lines.push(snapshot.serialized);
|
|
116
|
+
}
|
|
117
|
+
body = `${lines.join("\n")}
|
|
118
|
+
`;
|
|
119
|
+
} catch (error) {
|
|
120
|
+
throw createPerformanceExportError("Performance event serialization failed", {
|
|
121
|
+
retryable: false,
|
|
122
|
+
code: "event_serialization_failed",
|
|
123
|
+
cause: error
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
let slot = activeRequest;
|
|
127
|
+
if (slot?.settled === 2) activeRequest = slot = void 0;
|
|
128
|
+
if (slot && slot.body !== body) {
|
|
129
|
+
if (slot.settled) activeRequest = slot = void 0;
|
|
130
|
+
else {
|
|
131
|
+
throw createPerformanceExportError("A previous performance export is still active", {
|
|
132
|
+
retryable: true,
|
|
133
|
+
code: "fetch_aborted"
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
if (!slot) {
|
|
138
|
+
const controller = new AbortController();
|
|
139
|
+
const pending = {
|
|
140
|
+
body,
|
|
141
|
+
controller,
|
|
142
|
+
promise: void 0,
|
|
143
|
+
settled: 0,
|
|
144
|
+
timedOut: false
|
|
145
|
+
};
|
|
146
|
+
const request = Promise.resolve().then(() => {
|
|
147
|
+
const result = fetchImpl(url, {
|
|
148
|
+
method: "POST",
|
|
149
|
+
headers: {
|
|
150
|
+
...headers,
|
|
151
|
+
"content-type": "application/x-ndjson"
|
|
152
|
+
},
|
|
153
|
+
body,
|
|
154
|
+
signal: controller.signal,
|
|
155
|
+
// Collector headers can contain credentials. Never forward them to
|
|
156
|
+
// a redirected destination chosen by the remote endpoint.
|
|
157
|
+
redirect: "error"
|
|
158
|
+
});
|
|
159
|
+
if (!isRuntimePromise(result)) {
|
|
160
|
+
throw createPerformanceExportError("", {
|
|
161
|
+
retryable: false,
|
|
162
|
+
code: "invalid_fetch_response"
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
return result;
|
|
166
|
+
});
|
|
167
|
+
pending.promise = request;
|
|
168
|
+
slot = pending;
|
|
169
|
+
activeRequest = pending;
|
|
170
|
+
void request.then(
|
|
171
|
+
(lateResponse) => {
|
|
172
|
+
pending.settled = pending.timedOut && !snapshotValidResponse(lateResponse)?.ok ? 2 : 1;
|
|
173
|
+
if (pending.timedOut) {
|
|
174
|
+
disposeResponse(lateResponse);
|
|
175
|
+
}
|
|
176
|
+
},
|
|
177
|
+
() => {
|
|
178
|
+
pending.settled = 2;
|
|
179
|
+
}
|
|
180
|
+
);
|
|
181
|
+
}
|
|
182
|
+
const ownedSlot = slot;
|
|
183
|
+
if (ownedSlot.invocation) {
|
|
184
|
+
throw createPerformanceExportError("A performance export invocation is already active", {
|
|
185
|
+
retryable: true,
|
|
186
|
+
code: "fetch_aborted"
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
const invocation = (async () => {
|
|
190
|
+
let rejectTimeout;
|
|
191
|
+
const timeoutFailure = new Promise((_resolve, reject) => {
|
|
192
|
+
rejectTimeout = reject;
|
|
193
|
+
});
|
|
194
|
+
const timeout = setTimeout(() => {
|
|
195
|
+
if (!ownedSlot.timedOut) {
|
|
196
|
+
ownedSlot.timedOut = true;
|
|
197
|
+
try {
|
|
198
|
+
ignoreRuntimePromiseRejection(ownedSlot.controller.abort());
|
|
199
|
+
} catch {
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
rejectTimeout(createPerformanceExportError("Performance NDJSON export timed out", {
|
|
203
|
+
retryable: true,
|
|
204
|
+
code: "fetch_aborted"
|
|
205
|
+
}));
|
|
206
|
+
}, timeoutMs);
|
|
207
|
+
let response;
|
|
208
|
+
try {
|
|
209
|
+
const fetchedResponse = await Promise.race([ownedSlot.promise, timeoutFailure]);
|
|
210
|
+
if (activeRequest === ownedSlot) activeRequest = void 0;
|
|
211
|
+
response = fetchedResponse;
|
|
212
|
+
const responseSnapshot = snapshotValidResponse(fetchedResponse);
|
|
213
|
+
if (!responseSnapshot) {
|
|
214
|
+
throw createPerformanceExportError("Performance NDJSON exporter received an invalid response", {
|
|
215
|
+
retryable: false,
|
|
216
|
+
code: "invalid_fetch_response"
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
const { ok, status } = responseSnapshot;
|
|
220
|
+
if (!ok) {
|
|
221
|
+
const statusCode = status;
|
|
222
|
+
const classification = classifyHttpStatus(statusCode);
|
|
223
|
+
throw createPerformanceExportError(
|
|
224
|
+
`NDJSON performance export failed with status ${statusCode}`,
|
|
225
|
+
{
|
|
226
|
+
statusCode,
|
|
227
|
+
...classification
|
|
228
|
+
}
|
|
229
|
+
);
|
|
230
|
+
}
|
|
231
|
+
} catch (error) {
|
|
232
|
+
if (ownedSlot.settled && activeRequest === ownedSlot) activeRequest = void 0;
|
|
233
|
+
throw classifyFetchFailure(error);
|
|
234
|
+
} finally {
|
|
235
|
+
try {
|
|
236
|
+
clearTimeout(timeout);
|
|
237
|
+
} catch {
|
|
238
|
+
}
|
|
239
|
+
disposeResponse(response);
|
|
240
|
+
}
|
|
241
|
+
})();
|
|
242
|
+
ownedSlot.invocation = invocation;
|
|
243
|
+
try {
|
|
244
|
+
await invocation;
|
|
245
|
+
} finally {
|
|
246
|
+
if (ownedSlot.invocation === invocation) ownedSlot.invocation = void 0;
|
|
247
|
+
}
|
|
248
|
+
};
|
|
249
|
+
return {
|
|
250
|
+
export(batch) {
|
|
251
|
+
if (exportInvocationActive) {
|
|
252
|
+
return Promise.reject(createPerformanceExportError("A performance export invocation is already active", {
|
|
253
|
+
retryable: true,
|
|
254
|
+
code: "fetch_aborted"
|
|
255
|
+
}));
|
|
256
|
+
}
|
|
257
|
+
exportInvocationActive = true;
|
|
258
|
+
const operation = exportBatch(batch);
|
|
259
|
+
const release = () => {
|
|
260
|
+
exportInvocationActive = false;
|
|
261
|
+
};
|
|
262
|
+
try {
|
|
263
|
+
void Reflect.apply(Promise.prototype.then, operation, [release, release]);
|
|
264
|
+
} catch {
|
|
265
|
+
release();
|
|
266
|
+
}
|
|
267
|
+
return operation;
|
|
268
|
+
}
|
|
269
|
+
};
|
|
270
|
+
}
|
|
271
|
+
function disposeResponseBody(response) {
|
|
272
|
+
try {
|
|
273
|
+
if (!response || isRuntimeProxy(response)) return;
|
|
274
|
+
const body = readResponseProperty(response, "body");
|
|
275
|
+
if (!body || typeof body !== "object" && typeof body !== "function" || isRuntimeProxy(body)) return;
|
|
276
|
+
let owner = body;
|
|
277
|
+
let cancel;
|
|
278
|
+
for (let depth = 0; owner && depth < 8; depth += 1) {
|
|
279
|
+
if (isRuntimeProxy(owner)) return;
|
|
280
|
+
const descriptor = Object.getOwnPropertyDescriptor(owner, "cancel");
|
|
281
|
+
if (descriptor) {
|
|
282
|
+
if ("value" in descriptor && typeof descriptor.value === "function") cancel = descriptor.value;
|
|
283
|
+
break;
|
|
284
|
+
}
|
|
285
|
+
owner = Object.getPrototypeOf(owner);
|
|
286
|
+
}
|
|
287
|
+
const disposal = cancel ? Reflect.apply(cancel, body, []) : void 0;
|
|
288
|
+
return isRuntimePromise(disposal) ? disposal : void 0;
|
|
289
|
+
} catch {
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
function readResponseProperty(response, key) {
|
|
293
|
+
const descriptor = Object.getOwnPropertyDescriptor(response, key);
|
|
294
|
+
if (descriptor) return "value" in descriptor ? descriptor.value : void 0;
|
|
295
|
+
if (typeof Response === "undefined" || !hasSafeRuntimePrototype(response, Response.prototype)) return void 0;
|
|
296
|
+
const getter = Object.getOwnPropertyDescriptor(Response.prototype, key)?.get;
|
|
297
|
+
return typeof getter === "function" ? Reflect.apply(getter, response, []) : void 0;
|
|
298
|
+
}
|
|
299
|
+
function snapshotValidResponse(value) {
|
|
300
|
+
if (!value || typeof value !== "object" || isRuntimeProxy(value)) return void 0;
|
|
301
|
+
try {
|
|
302
|
+
const ok = readResponseProperty(value, "ok");
|
|
303
|
+
const status = readResponseProperty(value, "status");
|
|
304
|
+
if (typeof ok !== "boolean" || !Number.isInteger(status) || status < 100 || status > 599) return void 0;
|
|
305
|
+
const validStatus = status;
|
|
306
|
+
return ok === (validStatus >= 200 && validStatus < 300) ? { ok, status: validStatus } : void 0;
|
|
307
|
+
} catch {
|
|
308
|
+
return void 0;
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
function snapshotHeaders(value) {
|
|
312
|
+
const headers = snapshotDataObject(value, void 0, "Performance NDJSON exporter headers");
|
|
313
|
+
if (Object.keys(headers).length > MAX_HEADER_COUNT) {
|
|
314
|
+
throw new Error(`Performance NDJSON exporter headers must contain at most ${MAX_HEADER_COUNT} values`);
|
|
315
|
+
}
|
|
316
|
+
const snapshot = /* @__PURE__ */ Object.create(null);
|
|
317
|
+
const normalizedNames = /* @__PURE__ */ new Set();
|
|
318
|
+
for (const [name, headerValue] of Object.entries(headers)) {
|
|
319
|
+
if (!/^[!#$%&'*+\-.^_`|~0-9A-Za-z]{1,256}$/u.test(name)) {
|
|
320
|
+
throw new Error("Performance NDJSON exporter header names must be valid HTTP tokens");
|
|
321
|
+
}
|
|
322
|
+
if (typeof headerValue !== "string") {
|
|
323
|
+
throw new Error(`Header value for "${name}" must be a string`);
|
|
324
|
+
}
|
|
325
|
+
if (headerValue.length > MAX_HEADER_VALUE_BYTES || byteSize(headerValue) > MAX_HEADER_VALUE_BYTES || /[\0\r\n]/u.test(headerValue)) {
|
|
326
|
+
throw new Error(`Performance NDJSON exporter header value for "${name}" is invalid`);
|
|
327
|
+
}
|
|
328
|
+
if (RESERVED_HEADERS.has(name.toLowerCase())) {
|
|
329
|
+
throw new Error(`Performance NDJSON exporter header "${name}" is managed by the HTTP transport`);
|
|
330
|
+
}
|
|
331
|
+
const normalizedName = name.toLowerCase();
|
|
332
|
+
if (normalizedNames.has(normalizedName)) {
|
|
333
|
+
throw new Error(`Performance NDJSON exporter header "${name}" is duplicated case-insensitively`);
|
|
334
|
+
}
|
|
335
|
+
normalizedNames.add(normalizedName);
|
|
336
|
+
snapshot[name] = headerValue;
|
|
337
|
+
}
|
|
338
|
+
return Object.freeze(snapshot);
|
|
339
|
+
}
|
|
340
|
+
function snapshotDataObject(value, allowed, label) {
|
|
341
|
+
try {
|
|
342
|
+
if (!value || typeof value !== "object" || isRuntimeProxy(value) || Array.isArray(value)) throw new TypeError();
|
|
343
|
+
const prototype = Object.getPrototypeOf(value);
|
|
344
|
+
if (prototype !== Object.prototype && prototype !== null) throw new TypeError();
|
|
345
|
+
if (Object.getOwnPropertySymbols(value).length > 0) throw new TypeError();
|
|
346
|
+
const snapshot = /* @__PURE__ */ Object.create(null);
|
|
347
|
+
let inspected = 0;
|
|
348
|
+
const maximum = allowed?.size ?? MAX_HEADER_COUNT;
|
|
349
|
+
for (const key in value) {
|
|
350
|
+
if (inspected >= maximum) throw new TypeError();
|
|
351
|
+
const descriptor = Object.getOwnPropertyDescriptor(value, key);
|
|
352
|
+
if (key.length > (allowed ? 64 : 256) || !descriptor?.enumerable || !("value" in descriptor) || allowed && !allowed.has(key)) throw new TypeError();
|
|
353
|
+
inspected += 1;
|
|
354
|
+
snapshot[key] = descriptor.value;
|
|
355
|
+
}
|
|
356
|
+
return Object.freeze(snapshot);
|
|
357
|
+
} catch {
|
|
358
|
+
throw new TypeError(`${label} must be a closed plain data object`);
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
export { createHttpNdjsonPerformanceEventExporter };
|
|
363
|
+
//# sourceMappingURL=http.js.map
|
|
364
|
+
//# sourceMappingURL=http.js.map
|