@ooopsstudio/performance 0.9.1 → 0.9.2

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/dist/custom.js CHANGED
@@ -233,7 +233,7 @@ async function createCustomPerformance(options) {
233
233
  budgets.length > 0 ? import('./budget-engine-KDA4FRYU.js') : void 0,
234
234
  n1Detection ? import('./n1-detector-6IQ2DINP.js') : void 0,
235
235
  destinations.length > 0 ? import('./event-export-manager-DEB64LWZ.js') : void 0,
236
- monitoringEnabled ? import('./monitors-SRQDXLAW.js') : void 0
236
+ monitoringEnabled ? import('./monitors-2ZX6KIRO.js') : void 0
237
237
  ]);
238
238
  const handler = createBasePerformanceHandler({
239
239
  clock: configured.clock === void 0 ? createSystemClock() : configured.clock,
@@ -14,7 +14,7 @@ async function createDevelopmentPerformance(options = {}) {
14
14
  DEVELOPMENT_OPTION_FIELDS,
15
15
  "Development performance options"
16
16
  );
17
- const { createMonitors, stopAllMonitors } = await import('./monitors-SRQDXLAW.js');
17
+ const { createMonitors, stopAllMonitors } = await import('./monitors-2ZX6KIRO.js');
18
18
  const handler = createBasePerformanceHandler({
19
19
  clock: configured.clock === void 0 ? createSystemClock() : configured.clock,
20
20
  cardinalityLimit: 200,
@@ -98,7 +98,7 @@ function createEventLoopMonitor(options) {
98
98
  if (onSaturationAlert && lagSamples.length >= minimumSamples) {
99
99
  const sorted = [...lagSamples].sort((a, b) => a - b);
100
100
  const p95 = calculatePercentiles(sorted, 95);
101
- const nextState = p95 >= criticalThreshold ? "critical" : p95 >= warnThreshold ? "warn" : p95 >= infoThreshold ? "info" : "healthy";
101
+ const nextState = p95 >= criticalThreshold ? "critical" : p95 >= warnThreshold ? "warn" : p95 < infoThreshold ? "healthy" : saturationState;
102
102
  let observedAt = null;
103
103
  try {
104
104
  observedAt = clock.now();
@@ -771,5 +771,5 @@ function stopAllMonitors(monitors) {
771
771
  }
772
772
 
773
773
  export { createMonitors, stopAllMonitors };
774
- //# sourceMappingURL=monitors-SRQDXLAW.js.map
775
- //# sourceMappingURL=monitors-SRQDXLAW.js.map
774
+ //# sourceMappingURL=monitors-2ZX6KIRO.js.map
775
+ //# sourceMappingURL=monitors-2ZX6KIRO.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/performance/features/core/event-loop-monitor.ts","../src/performance/features/core/gc-monitor.ts","../src/performance/features/core/resource-load-average.ts","../src/performance/features/core/resource-monitor.ts","../src/performance/utils/error-boundary.ts","../src/performance/core/runtime/monitors.ts"],"names":[],"mappings":"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","file":"monitors-2ZX6KIRO.js","sourcesContent":["/**\n * @file Event loop lag monitor.\n * Measures event loop delay using setImmediate or microtask benchmarks.\n */\n\nimport type {PerfEvent, SaturationAlert} from '@ooopsstudio/core/contracts/performance'\n\nimport type {HighResClock} from '../../core/clock'\nimport {nsToMs} from '../../core/clock'\n\n/**\n * Event loop lag statistics\n */\nexport interface EventLoopStats {\n\n\t/** Mean lag in milliseconds */\n\tmean: number\n\t/** 95th percentile lag */\n\tp95: number\n\t/** 99th percentile lag */\n\tp99: number\n\t/** Maximum lag observed */\n\tmax: number\n\t/** Number of samples */\n\tsampleCount: number\n}\n\n/**\n * Event loop monitor for tracking event loop lag\n */\nexport interface EventLoopMonitor {\n\n\t/** Start monitoring */\n\tstart(): void\n\n\t/** Stop monitoring */\n\tstop(): void\n\n\t/** Get current statistics */\n\tgetStats(): EventLoopStats | null\n\n\t/** Get the most recent lag measurement */\n\tgetCurrentLag(): number | null\n}\n\n/**\n * Options for creating an event loop monitor\n */\nexport interface EventLoopMonitorOptions {\n\n\t/** High-resolution clock */\n\tclock: HighResClock\n\n\t/** Monitoring interval in milliseconds */\n\tintervalMs?: number\n\n\t/** Callback for saturation alerts */\n\tonSaturationAlert?: (alert: SaturationAlert) => void\n\n\t/** Callback for perf events */\n\tonPerfEvent?: (event: PerfEvent) => void\n\n\t/** Thresholds for saturation alerts */\n\tthresholds?: {\n\t\tinfo?: number\n\t\twarn?: number\n\t\tcritical?: number\n\t}\n\n\t/** Samples required before evaluating the rolling percentile. */\n\tminimumSamples?: number\n\n\t/** Milliseconds between reminders while warning or critical persists. Zero disables reminders. */\n\treminderIntervalMs?: number\n}\n\ntype EventLoopSaturationState = 'healthy' | 'warn' | 'critical'\n\nconst MAX_LAG_SAMPLES = 100\nconst DEFAULT_MINIMUM_SAMPLES = 20\nconst DEFAULT_REMINDER_INTERVAL_MS = 10 * 60 * 1000\n\n/**\n * Create an event loop lag monitor.\n * Uses setImmediate to measure the delay between scheduling and execution.\n *\n * @param options - Monitor options\n * @returns Event loop monitor instance\n */\nexport function createEventLoopMonitor(options: EventLoopMonitorOptions): EventLoopMonitor {\n\n\tconst {\n\t\tclock,\n\t\tintervalMs = 1000,\n\t\tonSaturationAlert,\n\t\tonPerfEvent,\n\t\tthresholds = {},\n\t\tminimumSamples = DEFAULT_MINIMUM_SAMPLES,\n\t\treminderIntervalMs = DEFAULT_REMINDER_INTERVAL_MS\n\t} = options\n\n\tif (!Number.isSafeInteger(intervalMs) || intervalMs <= 0 || intervalMs > 2_147_483_647) {\n\t\tthrow new Error('Event loop intervalMs must be between 1 and 2147483647')\n\t}\n\tif (!Number.isSafeInteger(minimumSamples) || minimumSamples <= 0 || minimumSamples > MAX_LAG_SAMPLES) {\n\t\tthrow new Error(`Event loop minimumSamples must be between 1 and ${MAX_LAG_SAMPLES}`)\n\t}\n\tif (!Number.isSafeInteger(reminderIntervalMs) || reminderIntervalMs < 0 || reminderIntervalMs > 2_147_483_647) {\n\t\tthrow new Error('Event loop reminderIntervalMs must be between 0 and 2147483647')\n\t}\n\tconst configuredThresholds = [thresholds.info, thresholds.warn, thresholds.critical]\n\t\t.filter((value): value is number => value !== undefined)\n\tif (!configuredThresholds.every((value) => Number.isFinite(value) && value >= 0)) {\n\t\tthrow new Error('Event loop monitor thresholds must be non-negative finite numbers')\n\t}\n\tif (\n\t\t(thresholds.info !== undefined && thresholds.warn !== undefined && thresholds.info > thresholds.warn) ||\n\t\t(thresholds.warn !== undefined && thresholds.critical !== undefined && thresholds.warn > thresholds.critical) ||\n\t\t(thresholds.info !== undefined && thresholds.critical !== undefined && thresholds.info > thresholds.critical)\n\t) {\n\t\tthrow new Error('Event loop monitor thresholds must satisfy info <= warn <= critical')\n\t}\n\t// Derive missing levels around explicit values so partial overrides preserve\n\t// their existing meaning while the effective thresholds remain ordered.\n\tconst criticalThreshold = thresholds.critical ?? Math.max(100, thresholds.warn ?? thresholds.info ?? 0)\n\tconst warnThreshold = thresholds.warn ?? Math.min(Math.max(50, thresholds.info ?? 0), criticalThreshold)\n\tconst infoThreshold = thresholds.info ?? Math.min(20, warnThreshold)\n\n\tlet timeoutId: ReturnType<typeof setTimeout> | null = null\n\tlet immediateId: ReturnType<typeof setImmediate> | null = null\n\tlet running = false\n\tconst lagSamples: number[] = []\n\tlet currentLag: number | null = null\n\tlet saturationState: EventLoopSaturationState = 'healthy'\n\tlet lastSaturationNotificationAt: number | null = null\n\tconst scheduleNext = (): void => {\n\t\tif (!running) return\n\t\trunning = false\n\t\ttry {\n\t\t\ttimeoutId = setTimeout(scheduleMeasurement, intervalMs)\n\t\t\trunning = true\n\t\t\ttimeoutId.unref?.()\n\t\t} catch { /* only timer acquisition failure leaves the monitor stopped */ }\n\t}\n\n\t/**\n\t * Measure event loop lag using setImmediate\n\t */\n\tfunction measureLag(): void {\n\n\t\tlet scheduled: bigint\n\t\ttry { scheduled = clock.nowHr() } catch {\n\t\t\tscheduleNext()\n\t\t\treturn\n\t\t}\n\t\ttry { immediateId = setImmediate(() => {\n\t\t\timmediateId = null\n\t\t\tif (!running) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tlet executed: bigint\n\t\t\ttry { executed = clock.nowHr() } catch {\n\t\t\t\tscheduleNext()\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst lagMs = nsToMs(executed - scheduled)\n\t\t\tif (!Number.isFinite(lagMs) || lagMs < 0) {\n\t\t\t\t// A malformed/custom high-resolution clock must not poison all\n\t\t\t\t// subsequent percentiles. Keep monitoring and wait for a valid sample.\n\t\t\t\tscheduleNext()\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tcurrentLag = lagMs\n\n\t\t\t// Add to samples (keep only last maxSamples)\n\t\t\tlagSamples.push(lagMs)\n\t\t\tif (lagSamples.length > MAX_LAG_SAMPLES) {\n\t\t\t\tlagSamples.shift()\n\t\t\t}\n\n\t\t\t// Emit perf event\n\t\t\tif (onPerfEvent) {\n\t\t\t\ttry {\n\t\t\t\t\tconst end = clock.now()\n\t\t\t\t\tonPerfEvent({\n\t\t\t\t\t\tname: 'event_loop_lag',\n\t\t\t\t\t\tduration: lagMs,\n\t\t\t\t\t\tstart: end - lagMs,\n\t\t\t\t\t\tend,\n\t\t\t\t\t\tsource: 'runtime'\n\t\t\t\t\t})\n\t\t\t\t} catch {\n\t\t\t\t\t// Callback failures must not stop monitoring.\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Evaluate saturation from the rolling p95 instead of reacting to a\n\t\t\t// single delayed tick. Emit only transitions plus a bounded reminder.\n\t\t\tif (onSaturationAlert && lagSamples.length >= minimumSamples) {\n\t\t\t\tconst sorted = [...lagSamples].sort((a, b) => a - b)\n\t\t\t\tconst p95 = calculatePercentiles(sorted, 95)\n\t\t\t\t// Treat the informational band as recovery hysteresis. Once the\n\t\t\t\t// runtime has entered warning or critical, it must fall below the\n\t\t\t\t// info threshold before it is considered healthy again. This avoids\n\t\t\t\t// warning/recovery log flapping while p95 hovers around the warning\n\t\t\t\t// boundary without losing the per-sample lag metric.\n\t\t\t\tconst nextState: EventLoopSaturationState = p95 >= criticalThreshold\n\t\t\t\t\t? 'critical'\n\t\t\t\t\t: p95 >= warnThreshold\n\t\t\t\t\t\t? 'warn'\n\t\t\t\t\t\t: p95 < infoThreshold ? 'healthy' : saturationState\n\t\t\t\tlet observedAt: number | null = null\n\t\t\t\ttry { observedAt = clock.now() } catch { /* reminders are optional when the wall clock fails */ }\n\t\t\t\tconst stateChanged = nextState !== saturationState\n\t\t\t\tconst active = nextState === 'warn' || nextState === 'critical'\n\t\t\t\tconst reminderDue = active && reminderIntervalMs > 0 && observedAt !== null &&\n\t\t\t\t\tlastSaturationNotificationAt !== null &&\n\t\t\t\t\tobservedAt - lastSaturationNotificationAt >= reminderIntervalMs\n\n\t\t\t\tif (stateChanged || reminderDue) {\n\t\t\t\t\tconst previousState = saturationState\n\t\t\t\t\tsaturationState = nextState\n\t\t\t\t\tif (observedAt !== null) lastSaturationNotificationAt = observedAt\n\t\t\t\t\tconst severity = nextState === 'healthy' ? 'info' : nextState\n\t\t\t\t\tconst threshold = nextState === 'critical'\n\t\t\t\t\t\t? criticalThreshold\n\t\t\t\t\t\t: nextState === 'warn' ? warnThreshold : infoThreshold\n\t\t\t\t\ttry {\n\t\t\t\t\t\tonSaturationAlert({\n\t\t\t\t\t\t\treason: 'event_loop_lag',\n\t\t\t\t\t\t\tseverity,\n\t\t\t\t\t\t\tvalue: p95,\n\t\t\t\t\t\t\tthreshold,\n\t\t\t\t\t\t\tstate: nextState,\n\t\t\t\t\t\t\tpreviousState,\n\t\t\t\t\t\t\t...(reminderDue ? {reminder: true} : {}),\n\t\t\t\t\t\t\taggregation: 'p95',\n\t\t\t\t\t\t\tsampleCount: lagSamples.length\n\t\t\t\t\t\t})\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t// Callback failures must not stop monitoring.\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// A callback may synchronously stop the monitor. Do not leave a stray\n\t\t\t// interval timer behind after that re-entrant shutdown.\n\t\t\tscheduleNext()\n\t\t}) } catch { running = false }\n\t}\n\n\t/**\n\t * Periodic measurement\n\t */\n\tfunction scheduleMeasurement(): void {\n\n\t\tif (!running) {\n\t\t\treturn\n\t\t}\n\t\tmeasureLag()\n\t}\n\n\t/**\n\t * Calculate percentiles from samples\n\t */\n\tfunction calculatePercentiles(sorted: number[], percentile: number): number {\n\n\t\tif (sorted.length === 0) {\n\t\t\treturn 0\n\t\t}\n\n\t\tconst index = Math.ceil((percentile / 100) * sorted.length) - 1\n\t\treturn sorted[Math.max(0, index)] ?? 0\n\t}\n\n\treturn {\n\t\tstart(): void {\n\n\t\t\tif (running) {\n\t\t\t\treturn // Already started\n\t\t\t}\n\n\t\t\trunning = true\n\t\t\tscheduleMeasurement()\n\t\t},\n\t\tstop(): void {\n\n\t\t\trunning = false\n\t\t\tif (timeoutId !== null) {\n\t\t\t\tclearTimeout(timeoutId)\n\t\t\t\ttimeoutId = null\n\t\t\t}\n\t\t\tif (immediateId !== null) {\n\t\t\t\tclearImmediate(immediateId)\n\t\t\t\timmediateId = null\n\t\t\t}\n\t\t},\n\t\tgetStats(): EventLoopStats | null {\n\n\t\t\tif (lagSamples.length === 0) {\n\t\t\t\treturn null\n\t\t\t}\n\n\t\t\tconst sorted = [...lagSamples].sort((a, b) => a - b)\n\t\t\tconst mean = sorted.reduce((sum, val) => sum + val, 0) / sorted.length\n\n\t\t\treturn {\n\t\t\t\tmean,\n\t\t\t\tp95: calculatePercentiles(sorted, 95),\n\t\t\t\tp99: calculatePercentiles(sorted, 99),\n\t\t\t\tmax: sorted[sorted.length - 1] ?? 0,\n\t\t\t\tsampleCount: sorted.length\n\t\t\t}\n\t\t},\n\t\tgetCurrentLag(): number | null {\n\n\t\t\treturn currentLag\n\t\t}\n\t}\n}\n","/**\n * @file GC monitor for tracking garbage collection events.\n * Uses Node.js perf_hooks if available (requires --expose-gc or perf hooks).\n */\n\nimport {createPerformanceOnError} from '../../utils/on-error'\n\nimport type {\n\tGCMonitor,\n\tGCMonitorOptions,\n\tGCStats,\n\tPerformanceEntryList,\n\tPerformanceObserverConstructor,\n\tPerformanceObserverInterface,\n\tPerfHooksModule,\n\tPerfHooksModuleType\n} from './gc-monitor-types'\n\nexport type {GCMonitor, GCMonitorOptions, GCStats} from './gc-monitor-types'\n\n// Module-level cache for perf_hooks module\nlet perfHooksModuleCache: PerfHooksModuleType | null = null\nlet perfHooksLoadingPromise: Promise<void> | null = null\nconst MAX_GC_ENTRIES_PER_CALLBACK = 256\n\n/**\n * Create a GC monitor.\n * Requires Node.js with perf_hooks support (--expose-gc or perf hooks enabled).\n * Falls back to no-op if not available.\n *\n * @param options - Monitor options\n * @returns GC monitor instance\n */\nexport function createGCMonitor(options: GCMonitorOptions): GCMonitor {\n\n\tconst {\n\t\tclock,\n\t\terrors,\n\t\tonSaturationAlert,\n\t\tonPerfEvent,\n\t\tthresholds = {}\n\t} = options\n\n\tconst onError = createPerformanceOnError(errors, {\n\t\toperation: 'module-load',\n\t\tmonitor: 'gc-monitor'\n\t})\n\n\t// Check if perf_hooks is available\n\tlet perfHooks: PerfHooksModule | null = null\n\n\t// Use cached module if available\n\tif (perfHooksModuleCache && perfHooksModuleCache.PerformanceObserver) {\n\t\tconst Observer = perfHooksModuleCache.PerformanceObserver as PerformanceObserverConstructor\n\t\tperfHooks = {\n\t\t\tPerformanceObserver: Observer\n\t\t}\n\t} else {\n\t\t// Try to load perf_hooks module asynchronously (for future calls)\n\t\tif (!perfHooksLoadingPromise) {\n\t\t\tperfHooksLoadingPromise = import('perf_hooks')\n\t\t\t\t.then((module) => {\n\t\t\t\t\tperfHooksModuleCache = module\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tperfHooksModuleCache = null\n\t\t\t\t\tperfHooksLoadingPromise = null\n\t\t\t\t\tonError(error, {module: 'perf_hooks'})\n\t\t\t\t})\n\t\t}\n\t\t// For now, perfHooks will be null (no-op monitor)\n\t\t// Future calls will use the cached module\n\t}\n\n\tconst pauseTimeThresholds = {...(thresholds.pauseTime ?? {})}\n\tconst heapUsageThresholds = {...(thresholds.heapUsage ?? {})}\n\tvalidatePair(pauseTimeThresholds, 'GC pause-time')\n\tvalidatePair(heapUsageThresholds, 'GC heap-usage', 1)\n\n\tlet majorCount = 0\n\tlet minorCount = 0\n\tconst pauseTimes: number[] = []\n\tlet observer: PerformanceObserverInterface | null = null\n\tlet heapCheckIntervalId: ReturnType<typeof setInterval> | null = null\n\tlet running = false\n\n\tfunction startObserver(): void {\n\t\tif (!perfHooks || observer || !running) {\n\t\t\treturn\n\t\t}\n\t\tlet candidate: PerformanceObserverInterface | null = null\n\t\ttry {\n\t\t\tcandidate = new perfHooks.PerformanceObserver((list: PerformanceEntryList) => {\n\t\t\t\ttry {\n\t\t\t\t\tlet processed = 0\n\t\t\t\t\tfor (const entry of list.getEntries()) {\n\t\t\t\t\t\tif (processed >= MAX_GC_ENTRIES_PER_CALLBACK) {\n\t\t\t\t\t\t\tonError(new Error('GC observer callback entry limit exceeded'), {\n\t\t\t\t\t\t\t\toperation: 'gc-monitor.entry-limit'\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t}\n\t\t\t\t\t\tprocessed += 1\n\t\t\t\t\t\tif (entry.entryType === 'gc') {\n\t\t\t\t\t\t\t// Node 22+ exposes GC kind through detail; the legacy kind accessor is deprecated.\n\t\t\t\t\t\t\thandleGCEvent(entry.detail?.kind ?? 2, entry.duration)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} catch(error) {\n\t\t\t\t\tonError(error, {operation: 'gc-monitor.observer'})\n\t\t\t\t}\n\t\t\t})\n\n\t\t\tcandidate.observe({entryTypes: ['gc']})\n\t\t\tobserver = candidate\n\t\t\theapCheckIntervalId = setInterval(safeCheckHeapUsage, 5000)\n\t\t\theapCheckIntervalId.unref?.()\n\t\t} catch(error) {\n\t\t\tconst partialObserver = candidate\n\t\t\tcandidate = null\n\t\t\tobserver = null\n\t\t\tif (heapCheckIntervalId !== null) {\n\t\t\t\tclearInterval(heapCheckIntervalId)\n\t\t\t\theapCheckIntervalId = null\n\t\t\t}\n\t\t\ttry { partialObserver?.disconnect() } catch(cleanupError) {\n\t\t\t\tonError(cleanupError, {operation: 'gc-monitor.start-cleanup'})\n\t\t\t}\n\t\t\trunning = false\n\t\t\tonError(error, {operation: 'gc-monitor.start'})\n\t\t}\n\t}\n\n\tif (!perfHooks && perfHooksLoadingPromise) {\n\t\tvoid perfHooksLoadingPromise.then(() => {\n\t\t\tif (!perfHooksModuleCache?.PerformanceObserver) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tperfHooks = {PerformanceObserver: perfHooksModuleCache.PerformanceObserver as PerformanceObserverConstructor}\n\t\t\tstartObserver()\n\t\t})\n\t}\n\n\t/**\n\t * Handle GC event\n\t */\n\tfunction handleGCEvent(kind: number, pauseTimeMs: number): void {\n\n\t\tif (!running) {\n\t\t\treturn\n\t\t}\n\t\tif (!Number.isFinite(pauseTimeMs) || pauseTimeMs < 0) {\n\t\t\tonError(new Error('GC pause duration must be a non-negative finite number'), {\n\t\t\t\toperation: 'gc-monitor.invalid-entry'\n\t\t\t})\n\t\t\treturn\n\t\t}\n\t\t// V8 exposes minor as 1; major and incremental collections are treated as major.\n\t\tif (kind === 1) {\n\t\t\tminorCount++\n\t\t} else {\n\t\t\tmajorCount++\n\t\t}\n\n\t\tpauseTimes.push(pauseTimeMs)\n\n\t\t// Keep only last 100 pause times\n\t\tif (pauseTimes.length > 100) {\n\t\t\tpauseTimes.shift()\n\t\t}\n\n\t\t// Emit perf event\n\t\tif (onPerfEvent) {\n\t\t\ttry {\n\t\t\t\tconst end = clock.now()\n\t\t\t\tonPerfEvent({\n\t\t\t\t\tname: `gc_${kind === 1 ? 'minor' : 'major'}`,\n\t\t\t\t\tduration: pauseTimeMs,\n\t\t\t\t\tstart: end - pauseTimeMs,\n\t\t\t\t\tend,\n\t\t\t\t\tlabels: {\n\t\t\t\t\t\tkind: kind === 1 ? 'minor' : 'major'\n\t\t\t\t\t},\n\t\t\t\t\tsource: 'runtime'\n\t\t\t\t})\n\t\t\t} catch(error) {\n\t\t\t\tonError(error, {operation: 'gc-monitor.perf-event'})\n\t\t\t}\n\t\t}\n\n\t\t// Check saturation thresholds\n\t\tif (onSaturationAlert) {\n\t\t\tlet severity: 'warn' | 'critical' | null = null\n\t\t\tlet threshold = 0\n\n\t\t\tif (pauseTimeThresholds.critical !== undefined && pauseTimeMs >= pauseTimeThresholds.critical) {\n\t\t\t\tseverity = 'critical'\n\t\t\t\tthreshold = pauseTimeThresholds.critical\n\t\t\t} else if (pauseTimeThresholds.warn !== undefined && pauseTimeMs >= pauseTimeThresholds.warn) {\n\t\t\t\tseverity = 'warn'\n\t\t\t\tthreshold = pauseTimeThresholds.warn\n\t\t\t}\n\n\t\t\tif (severity) {\n\t\t\t\ttry {\n\t\t\t\t\tonSaturationAlert({\n\t\t\t\t\t\treason: `gc_pause_${kind === 1 ? 'minor' : 'major'}`,\n\t\t\t\t\t\tseverity,\n\t\t\t\t\t\tvalue: pauseTimeMs,\n\t\t\t\t\t\tthreshold\n\t\t\t\t\t})\n\t\t\t\t} catch(error) {\n\t\t\t\t\tonError(error, {operation: 'gc-monitor.saturation-alert'})\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Check heap usage and emit alerts if needed\n\t */\n\tfunction checkHeapUsage(): void {\n\n\t\tif (!running) {\n\t\t\treturn\n\t\t}\n\t\tif (!onSaturationAlert) {\n\t\t\treturn\n\t\t}\n\n\t\tconst usage = process.memoryUsage()\n\t\tconst heapLimit = (usage as {heapLimit?: number}).heapLimit ?? usage.heapTotal\n\t\tconst heapUsed = usage.heapUsed\n\n\t\tif (heapLimit > 0) {\n\t\t\tconst utilization = heapUsed / heapLimit\n\t\t\tlet severity: 'warn' | 'critical' | null = null\n\t\t\tlet threshold = 0\n\n\t\t\tif (heapUsageThresholds.critical !== undefined && utilization >= heapUsageThresholds.critical) {\n\t\t\t\tseverity = 'critical'\n\t\t\t\tthreshold = heapUsageThresholds.critical\n\t\t\t} else if (heapUsageThresholds.warn !== undefined && utilization >= heapUsageThresholds.warn) {\n\t\t\t\tseverity = 'warn'\n\t\t\t\tthreshold = heapUsageThresholds.warn\n\t\t\t}\n\n\t\t\tif (severity) {\n\t\t\t\ttry {\n\t\t\t\t\tonSaturationAlert({\n\t\t\t\t\t\treason: 'heap_usage',\n\t\t\t\t\t\tseverity,\n\t\t\t\t\t\tvalue: utilization,\n\t\t\t\t\t\tthreshold\n\t\t\t\t\t})\n\t\t\t\t} catch(error) {\n\t\t\t\t\tonError(error, {operation: 'gc-monitor.saturation-alert'})\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction safeCheckHeapUsage(): void {\n\t\ttry {\n\t\t\tcheckHeapUsage()\n\t\t} catch(error) {\n\t\t\tonError(error, {operation: 'gc-monitor.heap-check'})\n\t\t}\n\t}\n\n\treturn {\n\t\tstart(): void {\n\n\t\t\tif (running) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\trunning = true\n\t\t\t\tstartObserver()\n\t\t\t} catch(error) {\n\t\t\t\trunning = false\n\t\t\t\tonError(error, {operation: 'gc-monitor.start'})\n\t\t\t\t// Observer creation failed, continue as no-op\n\t\t\t}\n\t\t},\n\t\tstop(): void {\n\n\t\t\trunning = false\n\t\t\tconst activeObserver = observer\n\t\t\tobserver = null\n\t\t\ttry {\n\t\t\t\tactiveObserver?.disconnect()\n\t\t\t} catch(error) {\n\t\t\t\tonError(error, {operation: 'gc-monitor.stop'})\n\t\t\t}\n\t\t\tconst activeHeapCheckInterval = heapCheckIntervalId\n\t\t\theapCheckIntervalId = null\n\t\t\tif (activeHeapCheckInterval !== null) {\n\t\t\t\tclearInterval(activeHeapCheckInterval)\n\t\t\t}\n\t\t},\n\t\tgetStats(): GCStats {\n\n\t\t\tconst totalPauseTimeMs = pauseTimes.reduce((sum, val) => sum + val, 0)\n\t\t\tconst avgPauseTimeMs = pauseTimes.length > 0 ? totalPauseTimeMs / pauseTimes.length : 0\n\t\t\tconst maxPauseTimeMs = pauseTimes.length > 0 ? Math.max(...pauseTimes) : 0\n\n\t\t\treturn {\n\t\t\t\tmajorCount,\n\t\t\t\tminorCount,\n\t\t\t\ttotalPauseTimeMs,\n\t\t\t\tavgPauseTimeMs,\n\t\t\t\tmaxPauseTimeMs\n\t\t\t}\n\t\t},\n\t\tgetHeapUsage(): {\n\t\t\theapUsed: number\n\t\t\theapTotal: number\n\t\t\theapLimit?: number\n\t\t} | null {\n\n\t\t\tif (typeof process === 'undefined' || !process.memoryUsage) {\n\t\t\t\treturn null\n\t\t\t}\n\n\t\t\tconst usage = process.memoryUsage()\n\t\t\tconst result: {\n\t\t\t\theapUsed: number\n\t\t\t\theapTotal: number\n\t\t\t\theapLimit?: number\n\t\t\t} = {\n\t\t\t\theapUsed: usage.heapUsed,\n\t\t\t\theapTotal: usage.heapTotal\n\t\t\t}\n\t\t\tconst heapLimit = (usage as {heapLimit?: number}).heapLimit\n\t\t\tif (heapLimit !== undefined) {\n\t\t\t\tresult.heapLimit = heapLimit\n\t\t\t}\n\t\t\treturn result\n\t\t}\n\t}\n}\n\nfunction validatePair(\n\tthresholds: {warn?: number; critical?: number},\n\tname: string,\n\tmax = Number.POSITIVE_INFINITY\n): void {\n\tconst values = [thresholds.warn, thresholds.critical]\n\t\t.filter((value): value is number => value !== undefined)\n\tif (!values.every((value) => Number.isFinite(value) && value >= 0 && value <= max)) {\n\t\tthrow new Error(`${name} thresholds must be finite numbers between 0 and ${max}`)\n\t}\n\tif (thresholds.warn !== undefined && thresholds.critical !== undefined && thresholds.warn > thresholds.critical) {\n\t\tthrow new Error(`${name} thresholds must satisfy warn <= critical`)\n\t}\n}\n","type OsModule = {loadavg: () => [number, number, number]}\n\nlet osModuleCache: OsModule | null = null\nlet osModuleLoadingPromise: Promise<void> | null = null\n\n/** Returns the cached Node load average and starts a safe lazy import when needed. */\nexport function getResourceLoadAverage(\n\tonError: (error: unknown, details?: Record<string, string>) => void\n): [number, number, number] | undefined {\n\tif (typeof process === 'undefined' || process.platform === 'win32') return undefined\n\ttry {\n\t\tif (osModuleCache) {\n\t\t\treturn osModuleCache.loadavg()\n\t\t}\n\t\tif (osModuleLoadingPromise === null) {\n\t\t\tosModuleLoadingPromise = import('os')\n\t\t\t\t.then((module) => { osModuleCache = {loadavg: () => {\n\t\t\t\t\tconst load = module.loadavg()\n\t\t\t\t\treturn [load[0] ?? 0, load[1] ?? 0, load[2] ?? 0]\n\t\t\t\t}} })\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tosModuleCache = null\n\t\t\t\t\tosModuleLoadingPromise = null\n\t\t\t\t\tonError(error, {module: 'os'})\n\t\t\t\t})\n\t\t}\n\t} catch {\n\t\t// Load average is optional outside Node and must not affect monitoring.\n\t}\n\treturn undefined\n}\n","/**\n * @file CPU and memory resource monitor.\n * Tracks CPU usage, memory usage, and load averages at configurable intervals.\n */\n\nimport {createPerformanceOnError} from '../../utils/on-error'\n\nimport {getResourceLoadAverage} from './resource-load-average'\nimport type {CPUStats, MemoryStats, ResourceMonitor, ResourceMonitorOptions, ResourceStats} from './resource-monitor-types'\n\nexport type {CPUStats, MemoryStats, ResourceMonitor, ResourceMonitorOptions, ResourceStats} from './resource-monitor-types'\n\n/**\n * Create a resource monitor.\n * Tracks CPU and memory usage at configurable intervals.\n *\n * @param options - Monitor options\n * @returns Resource monitor instance\n */\nexport function createResourceMonitor(options: ResourceMonitorOptions): ResourceMonitor {\n\n\tconst {\n\t\tclock,\n\t\terrors,\n\t\tintervalMs = 5000,\n\t\tonSaturationAlert,\n\t\tonPerfEvent,\n\t\tthresholds = {}\n\t} = options\n\n\tconst onError = createPerformanceOnError(errors, {\n\t\toperation: 'module-load',\n\t\tmonitor: 'resource-monitor'\n\t})\n\tif (!Number.isSafeInteger(intervalMs) || intervalMs <= 0 || intervalMs > 2_147_483_647) {\n\t\tthrow new Error('Resource monitor intervalMs must be between 1 and 2147483647')\n\t}\n\n\tconst cpuThresholds = {...(thresholds.cpu ?? {})}\n\tconst memoryThresholds = {...(thresholds.memory ?? {})}\n\tvalidateThresholds(cpuThresholds, 'CPU')\n\tvalidateThresholds(memoryThresholds, 'memory', 1)\n\n\tlet intervalId: ReturnType<typeof setInterval> | null = null\n\tlet lastCPUUsage: {user: number; system: number} | null = null\n\tlet lastCPUCollectedAt: number | null = null\n\tlet running = false\n\n\tfunction safeCollectStats(): void {\n\t\tif (!running) {\n\t\t\treturn\n\t\t}\n\t\ttry {\n\t\t\tcollectStats()\n\t\t} catch(error) {\n\t\t\tonError(error, {operation: 'resource-monitor.tick'})\n\t\t}\n\t}\n\n\t/**\n\t * Collect and emit resource statistics\n\t */\n\tfunction collectStats(): void {\n\n\t\tif (\n\t\t\ttypeof process === 'undefined' ||\n\t\t\ttypeof process.cpuUsage !== 'function' ||\n\t\t\ttypeof process.memoryUsage !== 'function'\n\t\t) {\n\t\t\treturn\n\t\t}\n\n\t\tconst now = clock.now()\n\n\t\t// CPU usage\n\t\tconst cpuUsage = process.cpuUsage()\n\n\t\tif (lastCPUUsage) {\n\t\t\tconst elapsedMs = lastCPUCollectedAt !== null && now > lastCPUCollectedAt\n\t\t\t\t? now - lastCPUCollectedAt\n\t\t\t\t: intervalMs\n\t\t\tconst userDelta = Math.max(0, cpuUsage.user - lastCPUUsage.user)\n\t\t\tconst systemDelta = Math.max(0, cpuUsage.system - lastCPUUsage.system)\n\t\t\tconst totalDelta = userDelta + systemDelta\n\n\t\t\t// Emit CPU perf event (convert microseconds to milliseconds)\n\t\t\tif (onPerfEvent) {\n\t\t\t\ttry {\n\t\t\t\t\tonPerfEvent({\n\t\t\t\t\t\tname: 'cpu_usage',\n\t\t\t\t\t\tduration: totalDelta / 1000, // Convert to ms\n\t\t\t\t\t\tstart: now - elapsedMs,\n\t\t\t\t\t\tend: now,\n\t\t\t\t\t\tlabels: {\n\t\t\t\t\t\t\tuser: String(userDelta / 1000),\n\t\t\t\t\t\t\tsystem: String(systemDelta / 1000),\n\t\t\t\t\t\t\tutilization: String(totalDelta / (elapsedMs * 1000))\n\t\t\t\t\t\t},\n\t\t\t\t\t\tsource: 'runtime'\n\t\t\t\t\t})\n\t\t\t\t} catch(error) {\n\t\t\t\t\tonError(error, {operation: 'resource-monitor.perf-event'})\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Check CPU saturation (approximate: total CPU time / interval)\n\t\t\t// This is a rough approximation\n\t\t\tconst cpuUtilization = totalDelta / (elapsedMs * 1000) // Convert to ratio\n\t\t\tif (onSaturationAlert) {\n\t\t\t\tlet severity: 'info' | 'warn' | 'critical' | null = null\n\t\t\t\tlet threshold = 0\n\n\t\t\t\tif (cpuThresholds.critical !== undefined && cpuUtilization >= cpuThresholds.critical) {\n\t\t\t\t\tseverity = 'critical'\n\t\t\t\t\tthreshold = cpuThresholds.critical\n\t\t\t\t} else if (cpuThresholds.warn !== undefined && cpuUtilization >= cpuThresholds.warn) {\n\t\t\t\t\tseverity = 'warn'\n\t\t\t\t\tthreshold = cpuThresholds.warn\n\t\t\t\t} else if (cpuThresholds.info !== undefined && cpuUtilization >= cpuThresholds.info) {\n\t\t\t\t\tseverity = 'info'\n\t\t\t\t\tthreshold = cpuThresholds.info\n\t\t\t\t}\n\n\t\t\t\tif (severity) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tonSaturationAlert({\n\t\t\t\t\t\t\treason: 'cpu_saturation',\n\t\t\t\t\t\t\tseverity,\n\t\t\t\t\t\t\tvalue: cpuUtilization,\n\t\t\t\t\t\t\tthreshold\n\t\t\t\t\t\t})\n\t\t\t\t\t} catch(error) {\n\t\t\t\t\t\tonError(error, {operation: 'resource-monitor.saturation-alert'})\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tlastCPUUsage = cpuUsage\n\t\tlastCPUCollectedAt = now\n\n\t\t// Memory usage\n\t\tconst memoryUsage = process.memoryUsage()\n\t\tconst memoryStats: MemoryStats = {\n\t\t\trss: memoryUsage.rss,\n\t\t\theapUsed: memoryUsage.heapUsed,\n\t\t\theapTotal: memoryUsage.heapTotal,\n\t\t\texternal: memoryUsage.external\n\t\t}\n\n\t\t// Emit memory perf event\n\t\tif (onPerfEvent) {\n\t\t\ttry {\n\t\t\t\tonPerfEvent({\n\t\t\t\t\tname: 'memory_usage',\n\t\t\t\t\tduration: 0, // Memory is a snapshot, not a duration\n\t\t\t\t\tstart: now,\n\t\t\t\t\tend: now,\n\t\t\t\t\tlabels: {\n\t\t\t\t\t\trss: String(memoryStats.rss),\n\t\t\t\t\t\theapUsed: String(memoryStats.heapUsed),\n\t\t\t\t\t\theapTotal: String(memoryStats.heapTotal),\n\t\t\t\t\t\texternal: String(memoryStats.external)\n\t\t\t\t\t},\n\t\t\t\t\tsource: 'runtime'\n\t\t\t\t})\n\t\t\t} catch(error) {\n\t\t\t\tonError(error, {operation: 'resource-monitor.perf-event'})\n\t\t\t}\n\t\t}\n\n\t\t// Check memory saturation (heap used / heap total)\n\t\tif (memoryStats.heapTotal > 0 && onSaturationAlert) {\n\t\t\tconst memoryUtilization = memoryStats.heapUsed / memoryStats.heapTotal\n\t\t\tlet severity: 'info' | 'warn' | 'critical' | null = null\n\t\t\tlet threshold = 0\n\n\t\t\tif (memoryThresholds.critical !== undefined && memoryUtilization >= memoryThresholds.critical) {\n\t\t\t\tseverity = 'critical'\n\t\t\t\tthreshold = memoryThresholds.critical\n\t\t\t} else if (memoryThresholds.warn !== undefined && memoryUtilization >= memoryThresholds.warn) {\n\t\t\t\tseverity = 'warn'\n\t\t\t\tthreshold = memoryThresholds.warn\n\t\t\t} else if (memoryThresholds.info !== undefined && memoryUtilization >= memoryThresholds.info) {\n\t\t\t\tseverity = 'info'\n\t\t\t\tthreshold = memoryThresholds.info\n\t\t\t}\n\n\t\t\tif (severity) {\n\t\t\t\ttry {\n\t\t\t\t\tonSaturationAlert({\n\t\t\t\t\t\treason: 'memory_pressure',\n\t\t\t\t\t\tseverity,\n\t\t\t\t\t\tvalue: memoryUtilization,\n\t\t\t\t\t\tthreshold\n\t\t\t\t\t})\n\t\t\t\t} catch(error) {\n\t\t\t\t\tonError(error, {operation: 'resource-monitor.saturation-alert'})\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn {\n\t\tstart(): void {\n\n\t\t\tif (intervalId !== null) {\n\t\t\t\treturn // Already started\n\t\t\t}\n\n\t\t\t// Initialize CPU usage baseline\n\t\t\tif (typeof process !== 'undefined' && typeof process.cpuUsage === 'function') {\n\t\t\t\tlastCPUUsage = process.cpuUsage()\n\t\t\t\tlastCPUCollectedAt = clock.now()\n\t\t\t}\n\n\t\t\trunning = true\n\t\t\t// Start periodic collection\n\t\t\tintervalId = setInterval(safeCollectStats, intervalMs)\n\t\t\tintervalId.unref?.()\n\t\t},\n\t\tstop(): void {\n\n\t\t\trunning = false\n\t\t\tif (intervalId !== null) {\n\t\t\t\tclearInterval(intervalId)\n\t\t\t\tintervalId = null\n\t\t\t}\n\n\t\t\tlastCPUUsage = null\n\t\t\tlastCPUCollectedAt = null\n\t\t},\n\t\tgetStats(): ResourceStats | null {\n\n\t\t\tif (\n\t\t\t\ttypeof process === 'undefined' ||\n\t\t\t\ttypeof process.cpuUsage !== 'function' ||\n\t\t\t\ttypeof process.memoryUsage !== 'function'\n\t\t\t) {\n\t\t\t\treturn null\n\t\t\t}\n\n\t\t\tconst cpuUsage = process.cpuUsage()\n\t\t\tconst memoryUsage = process.memoryUsage()\n\n\t\t\tconst cpu: CPUStats = {\n\t\t\t\tuser: cpuUsage.user,\n\t\t\t\tsystem: cpuUsage.system,\n\t\t\t\ttotal: cpuUsage.user + cpuUsage.system\n\t\t\t}\n\n\t\t\tconst memory: MemoryStats = {\n\t\t\t\trss: memoryUsage.rss,\n\t\t\t\theapUsed: memoryUsage.heapUsed,\n\t\t\t\theapTotal: memoryUsage.heapTotal,\n\t\t\t\texternal: memoryUsage.external\n\t\t\t}\n\n\t\t\tconst loadAverage = getResourceLoadAverage(onError)\n\n\t\t\tconst stats: ResourceStats = {\n\t\t\t\tcpu,\n\t\t\t\tmemory\n\t\t\t}\n\t\t\tif (loadAverage) {\n\t\t\t\tstats.loadAverage = loadAverage\n\t\t\t}\n\t\t\treturn stats\n\t\t}\n\t}\n}\n\nfunction validateThresholds(\n\tthresholds: {info?: number; warn?: number; critical?: number},\n\tname: string,\n\tmax = Number.POSITIVE_INFINITY\n): void {\n\tconst ordered = [thresholds.info, thresholds.warn, thresholds.critical]\n\t\t.filter((value): value is number => value !== undefined)\n\tif (!ordered.every((value) => Number.isFinite(value) && value >= 0 && value <= max)) {\n\t\tthrow new Error(`${name} thresholds must be finite numbers between 0 and ${max}`)\n\t}\n\tif (\n\t\t(thresholds.info !== undefined && thresholds.warn !== undefined && thresholds.info > thresholds.warn) ||\n\t\t(thresholds.warn !== undefined && thresholds.critical !== undefined && thresholds.warn > thresholds.critical) ||\n\t\t(thresholds.info !== undefined && thresholds.critical !== undefined && thresholds.info > thresholds.critical)\n\t) {\n\t\tthrow new Error(`${name} thresholds must satisfy info <= warn <= critical`)\n\t}\n}\n","/**\n * @file Error boundary for performance monitoring operations.\n * Wraps monitor operations to prevent crashes.\n * Uses engines' error boundary utilities for consistency.\n */\n\nimport type {Errors} from '@ooopsstudio/core/ports/errors'\n\nimport {createPerformanceOnError} from './on-error'\nimport {isRuntimePromise} from './safe-object'\n\n/**\n * Wrap a function with error boundary.\n * Catches errors and reports them without throwing.\n *\n * @param fn - Function to wrap\n * @param errors - Optional error handler\n * @param context - Optional context for error reporting\n * @returns Wrapped function\n */\nexport function withErrorBoundary<T extends (...args: unknown[]) => unknown>(\n\tfn: T,\n\terrors?: Errors,\n\tcontext?: Record<string, string>\n): T {\n\n\tconst onError = createPerformanceOnError(errors, {\n\t\tstage: 'monitor',\n\t\t...(context ? {step: Object.values(context)[0]} : {})\n\t})\n\n\treturn ((...args: Parameters<T>) => {\n\t\ttry {\n\t\t\treturn fn(...args)\n\t\t} catch(error) {\n\t\t\tonError(error)\n\t\t\t// Return undefined instead of throwing\n\t\t\treturn undefined as ReturnType<T>\n\t\t}\n\t}) as T\n}\n\n/**\n * Wrap an async function with error boundary.\n *\n * @param fn - Async function to wrap\n * @param errors - Optional error handler\n * @param context - Optional context for error reporting\n * @returns Wrapped async function\n */\nexport function withAsyncErrorBoundary<T extends (...args: unknown[]) => Promise<unknown>>(\n\tfn: T,\n\terrors?: Errors,\n\tcontext?: Record<string, string>\n): T {\n\n\tconst onError = createPerformanceOnError(errors, {\n\t\tstage: 'monitor',\n\t\t...(context ? {step: Object.values(context)[0]} : {})\n\t})\n\n\treturn ((...args: Parameters<T>) => {\n\t\treturn Promise.resolve().then(() => {\n\t\t\tconst result = fn(...args)\n\t\t\tif (!isRuntimePromise(result)) throw new TypeError('Performance async boundary requires a native Promise')\n\t\t\treturn result\n\t\t}).catch((error) => {\n\t\t\tonError(error)\n\t\t\treturn undefined\n\t\t}) as Promise<Awaited<ReturnType<T>> | undefined>\n\t}) as T\n}\n","import type {PerfEvent, SaturationAlert} from '@ooopsstudio/core/contracts/performance'\nimport type {Errors} from '@ooopsstudio/core/ports/errors'\n\nimport {createEventLoopMonitor, type EventLoopMonitor} from '../../features/core/event-loop-monitor'\nimport {createGCMonitor, type GCMonitor} from '../../features/core/gc-monitor'\nimport {createResourceMonitor, type ResourceMonitor} from '../../features/core/resource-monitor'\nimport {withErrorBoundary} from '../../utils/error-boundary'\nimport type {HighResClock} from '../clock'\n\nexport interface Monitors {\n\teventLoopMonitor?: EventLoopMonitor\n\tgcMonitor?: GCMonitor\n\tresourceMonitor?: ResourceMonitor\n}\n\nexport interface MonitorsOptions {\n\tclock: HighResClock\n\tonPerfEvent: (event: PerfEvent) => void\n\tonSaturationAlert?: (alert: SaturationAlert) => void\n\terrors?: Errors\n\tenableEventLoopMonitor: boolean\n\tenableGCMonitor: boolean\n\tenableResourceMonitor: boolean\n}\n\nexport function createMonitors(options: MonitorsOptions): Monitors {\n\tconst monitors: Monitors = {}\n\tconst safelyEmitEvent = (event: PerfEvent) => {\n\t\ttry { options.onPerfEvent(event) } catch { /* monitors never break the host */ }\n\t}\n\tconst safelyEmitAlert = (alert: SaturationAlert) => {\n\t\ttry { options.onSaturationAlert?.(alert) } catch { /* observers are isolated */ }\n\t}\n\ttry {\n\t\tif (options.enableEventLoopMonitor) {\n\t\t\tmonitors.eventLoopMonitor = createEventLoopMonitor({\n\t\t\t\tclock: options.clock,\n\t\t\t\tonPerfEvent: safelyEmitEvent,\n\t\t\t\tonSaturationAlert: safelyEmitAlert\n\t\t\t})\n\t\t\twithErrorBoundary(() => monitors.eventLoopMonitor?.start(), options.errors, {operation: 'eventLoopMonitor.start'})()\n\t\t}\n\t\tif (options.enableGCMonitor) {\n\t\t\tmonitors.gcMonitor = createGCMonitor({\n\t\t\t\tclock: options.clock,\n\t\t\t\t...(options.errors ? {errors: options.errors} : {}),\n\t\t\t\tonPerfEvent: safelyEmitEvent,\n\t\t\t\tonSaturationAlert: safelyEmitAlert\n\t\t\t})\n\t\t\twithErrorBoundary(() => monitors.gcMonitor?.start(), options.errors, {operation: 'gcMonitor.start'})()\n\t\t}\n\t\tif (options.enableResourceMonitor) {\n\t\t\tmonitors.resourceMonitor = createResourceMonitor({\n\t\t\t\tclock: options.clock,\n\t\t\t\t...(options.errors ? {errors: options.errors} : {}),\n\t\t\t\tonPerfEvent: safelyEmitEvent,\n\t\t\t\tonSaturationAlert: safelyEmitAlert\n\t\t\t})\n\t\t\twithErrorBoundary(() => monitors.resourceMonitor?.start(), options.errors, {operation: 'resourceMonitor.start'})()\n\t\t}\n\t} catch(error) {\n\t\tstopAllMonitors(monitors)\n\t\tthrow error\n\t}\n\treturn monitors\n}\n\nexport function stopAllMonitors(monitors: Monitors): void {\n\ttry { monitors.eventLoopMonitor?.stop() } catch { /* cleanup continues */ }\n\ttry { monitors.gcMonitor?.stop() } catch { /* cleanup continues */ }\n\ttry { monitors.resourceMonitor?.stop() } catch { /* cleanup continues */ }\n}\n"]}
@@ -14,7 +14,7 @@ async function createProductionPerformance(options = {}) {
14
14
  PRODUCTION_OPTION_FIELDS,
15
15
  "Production performance options"
16
16
  );
17
- const { createMonitors, stopAllMonitors } = await import('./monitors-SRQDXLAW.js');
17
+ const { createMonitors, stopAllMonitors } = await import('./monitors-2ZX6KIRO.js');
18
18
  const handler = createBasePerformanceHandler({
19
19
  clock: configured.clock === void 0 ? createSystemClock() : configured.clock,
20
20
  cardinalityLimit: 20,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ooopsstudio/performance",
3
- "version": "0.9.1",
3
+ "version": "0.9.2",
4
4
  "description": "Bounded server performance measurement, budgets, runtime monitoring, and event delivery for Ooops System applications.",
5
5
  "type": "module",
6
6
  "publishConfig": {
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/performance/features/core/event-loop-monitor.ts","../src/performance/features/core/gc-monitor.ts","../src/performance/features/core/resource-load-average.ts","../src/performance/features/core/resource-monitor.ts","../src/performance/utils/error-boundary.ts","../src/performance/core/runtime/monitors.ts"],"names":[],"mappings":"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","file":"monitors-SRQDXLAW.js","sourcesContent":["/**\n * @file Event loop lag monitor.\n * Measures event loop delay using setImmediate or microtask benchmarks.\n */\n\nimport type {PerfEvent, SaturationAlert} from '@ooopsstudio/core/contracts/performance'\n\nimport type {HighResClock} from '../../core/clock'\nimport {nsToMs} from '../../core/clock'\n\n/**\n * Event loop lag statistics\n */\nexport interface EventLoopStats {\n\n\t/** Mean lag in milliseconds */\n\tmean: number\n\t/** 95th percentile lag */\n\tp95: number\n\t/** 99th percentile lag */\n\tp99: number\n\t/** Maximum lag observed */\n\tmax: number\n\t/** Number of samples */\n\tsampleCount: number\n}\n\n/**\n * Event loop monitor for tracking event loop lag\n */\nexport interface EventLoopMonitor {\n\n\t/** Start monitoring */\n\tstart(): void\n\n\t/** Stop monitoring */\n\tstop(): void\n\n\t/** Get current statistics */\n\tgetStats(): EventLoopStats | null\n\n\t/** Get the most recent lag measurement */\n\tgetCurrentLag(): number | null\n}\n\n/**\n * Options for creating an event loop monitor\n */\nexport interface EventLoopMonitorOptions {\n\n\t/** High-resolution clock */\n\tclock: HighResClock\n\n\t/** Monitoring interval in milliseconds */\n\tintervalMs?: number\n\n\t/** Callback for saturation alerts */\n\tonSaturationAlert?: (alert: SaturationAlert) => void\n\n\t/** Callback for perf events */\n\tonPerfEvent?: (event: PerfEvent) => void\n\n\t/** Thresholds for saturation alerts */\n\tthresholds?: {\n\t\tinfo?: number\n\t\twarn?: number\n\t\tcritical?: number\n\t}\n\n\t/** Samples required before evaluating the rolling percentile. */\n\tminimumSamples?: number\n\n\t/** Milliseconds between reminders while warning or critical persists. Zero disables reminders. */\n\treminderIntervalMs?: number\n}\n\ntype EventLoopSaturationState = 'healthy' | 'info' | 'warn' | 'critical'\n\nconst MAX_LAG_SAMPLES = 100\nconst DEFAULT_MINIMUM_SAMPLES = 20\nconst DEFAULT_REMINDER_INTERVAL_MS = 10 * 60 * 1000\n\n/**\n * Create an event loop lag monitor.\n * Uses setImmediate to measure the delay between scheduling and execution.\n *\n * @param options - Monitor options\n * @returns Event loop monitor instance\n */\nexport function createEventLoopMonitor(options: EventLoopMonitorOptions): EventLoopMonitor {\n\n\tconst {\n\t\tclock,\n\t\tintervalMs = 1000,\n\t\tonSaturationAlert,\n\t\tonPerfEvent,\n\t\tthresholds = {},\n\t\tminimumSamples = DEFAULT_MINIMUM_SAMPLES,\n\t\treminderIntervalMs = DEFAULT_REMINDER_INTERVAL_MS\n\t} = options\n\n\tif (!Number.isSafeInteger(intervalMs) || intervalMs <= 0 || intervalMs > 2_147_483_647) {\n\t\tthrow new Error('Event loop intervalMs must be between 1 and 2147483647')\n\t}\n\tif (!Number.isSafeInteger(minimumSamples) || minimumSamples <= 0 || minimumSamples > MAX_LAG_SAMPLES) {\n\t\tthrow new Error(`Event loop minimumSamples must be between 1 and ${MAX_LAG_SAMPLES}`)\n\t}\n\tif (!Number.isSafeInteger(reminderIntervalMs) || reminderIntervalMs < 0 || reminderIntervalMs > 2_147_483_647) {\n\t\tthrow new Error('Event loop reminderIntervalMs must be between 0 and 2147483647')\n\t}\n\tconst configuredThresholds = [thresholds.info, thresholds.warn, thresholds.critical]\n\t\t.filter((value): value is number => value !== undefined)\n\tif (!configuredThresholds.every((value) => Number.isFinite(value) && value >= 0)) {\n\t\tthrow new Error('Event loop monitor thresholds must be non-negative finite numbers')\n\t}\n\tif (\n\t\t(thresholds.info !== undefined && thresholds.warn !== undefined && thresholds.info > thresholds.warn) ||\n\t\t(thresholds.warn !== undefined && thresholds.critical !== undefined && thresholds.warn > thresholds.critical) ||\n\t\t(thresholds.info !== undefined && thresholds.critical !== undefined && thresholds.info > thresholds.critical)\n\t) {\n\t\tthrow new Error('Event loop monitor thresholds must satisfy info <= warn <= critical')\n\t}\n\t// Derive missing levels around explicit values so partial overrides preserve\n\t// their existing meaning while the effective thresholds remain ordered.\n\tconst criticalThreshold = thresholds.critical ?? Math.max(100, thresholds.warn ?? thresholds.info ?? 0)\n\tconst warnThreshold = thresholds.warn ?? Math.min(Math.max(50, thresholds.info ?? 0), criticalThreshold)\n\tconst infoThreshold = thresholds.info ?? Math.min(20, warnThreshold)\n\n\tlet timeoutId: ReturnType<typeof setTimeout> | null = null\n\tlet immediateId: ReturnType<typeof setImmediate> | null = null\n\tlet running = false\n\tconst lagSamples: number[] = []\n\tlet currentLag: number | null = null\n\tlet saturationState: EventLoopSaturationState = 'healthy'\n\tlet lastSaturationNotificationAt: number | null = null\n\tconst scheduleNext = (): void => {\n\t\tif (!running) return\n\t\trunning = false\n\t\ttry {\n\t\t\ttimeoutId = setTimeout(scheduleMeasurement, intervalMs)\n\t\t\trunning = true\n\t\t\ttimeoutId.unref?.()\n\t\t} catch { /* only timer acquisition failure leaves the monitor stopped */ }\n\t}\n\n\t/**\n\t * Measure event loop lag using setImmediate\n\t */\n\tfunction measureLag(): void {\n\n\t\tlet scheduled: bigint\n\t\ttry { scheduled = clock.nowHr() } catch {\n\t\t\tscheduleNext()\n\t\t\treturn\n\t\t}\n\t\ttry { immediateId = setImmediate(() => {\n\t\t\timmediateId = null\n\t\t\tif (!running) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tlet executed: bigint\n\t\t\ttry { executed = clock.nowHr() } catch {\n\t\t\t\tscheduleNext()\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst lagMs = nsToMs(executed - scheduled)\n\t\t\tif (!Number.isFinite(lagMs) || lagMs < 0) {\n\t\t\t\t// A malformed/custom high-resolution clock must not poison all\n\t\t\t\t// subsequent percentiles. Keep monitoring and wait for a valid sample.\n\t\t\t\tscheduleNext()\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tcurrentLag = lagMs\n\n\t\t\t// Add to samples (keep only last maxSamples)\n\t\t\tlagSamples.push(lagMs)\n\t\t\tif (lagSamples.length > MAX_LAG_SAMPLES) {\n\t\t\t\tlagSamples.shift()\n\t\t\t}\n\n\t\t\t// Emit perf event\n\t\t\tif (onPerfEvent) {\n\t\t\t\ttry {\n\t\t\t\t\tconst end = clock.now()\n\t\t\t\t\tonPerfEvent({\n\t\t\t\t\t\tname: 'event_loop_lag',\n\t\t\t\t\t\tduration: lagMs,\n\t\t\t\t\t\tstart: end - lagMs,\n\t\t\t\t\t\tend,\n\t\t\t\t\t\tsource: 'runtime'\n\t\t\t\t\t})\n\t\t\t\t} catch {\n\t\t\t\t\t// Callback failures must not stop monitoring.\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Evaluate saturation from the rolling p95 instead of reacting to a\n\t\t\t// single delayed tick. Emit only transitions plus a bounded reminder.\n\t\t\tif (onSaturationAlert && lagSamples.length >= minimumSamples) {\n\t\t\t\tconst sorted = [...lagSamples].sort((a, b) => a - b)\n\t\t\t\tconst p95 = calculatePercentiles(sorted, 95)\n\t\t\t\tconst nextState: EventLoopSaturationState = p95 >= criticalThreshold\n\t\t\t\t\t? 'critical'\n\t\t\t\t\t: p95 >= warnThreshold\n\t\t\t\t\t\t? 'warn'\n\t\t\t\t\t\t: p95 >= infoThreshold ? 'info' : 'healthy'\n\t\t\t\tlet observedAt: number | null = null\n\t\t\t\ttry { observedAt = clock.now() } catch { /* reminders are optional when the wall clock fails */ }\n\t\t\t\tconst stateChanged = nextState !== saturationState\n\t\t\t\tconst active = nextState === 'warn' || nextState === 'critical'\n\t\t\t\tconst reminderDue = active && reminderIntervalMs > 0 && observedAt !== null &&\n\t\t\t\t\tlastSaturationNotificationAt !== null &&\n\t\t\t\t\tobservedAt - lastSaturationNotificationAt >= reminderIntervalMs\n\n\t\t\t\tif (stateChanged || reminderDue) {\n\t\t\t\t\tconst previousState = saturationState\n\t\t\t\t\tsaturationState = nextState\n\t\t\t\t\tif (observedAt !== null) lastSaturationNotificationAt = observedAt\n\t\t\t\t\tconst severity = nextState === 'healthy' ? 'info' : nextState\n\t\t\t\t\tconst threshold = nextState === 'critical'\n\t\t\t\t\t\t? criticalThreshold\n\t\t\t\t\t\t: nextState === 'warn' ? warnThreshold : infoThreshold\n\t\t\t\t\ttry {\n\t\t\t\t\t\tonSaturationAlert({\n\t\t\t\t\t\t\treason: 'event_loop_lag',\n\t\t\t\t\t\t\tseverity,\n\t\t\t\t\t\t\tvalue: p95,\n\t\t\t\t\t\t\tthreshold,\n\t\t\t\t\t\t\tstate: nextState,\n\t\t\t\t\t\t\tpreviousState,\n\t\t\t\t\t\t\t...(reminderDue ? {reminder: true} : {}),\n\t\t\t\t\t\t\taggregation: 'p95',\n\t\t\t\t\t\t\tsampleCount: lagSamples.length\n\t\t\t\t\t\t})\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t// Callback failures must not stop monitoring.\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// A callback may synchronously stop the monitor. Do not leave a stray\n\t\t\t// interval timer behind after that re-entrant shutdown.\n\t\t\tscheduleNext()\n\t\t}) } catch { running = false }\n\t}\n\n\t/**\n\t * Periodic measurement\n\t */\n\tfunction scheduleMeasurement(): void {\n\n\t\tif (!running) {\n\t\t\treturn\n\t\t}\n\t\tmeasureLag()\n\t}\n\n\t/**\n\t * Calculate percentiles from samples\n\t */\n\tfunction calculatePercentiles(sorted: number[], percentile: number): number {\n\n\t\tif (sorted.length === 0) {\n\t\t\treturn 0\n\t\t}\n\n\t\tconst index = Math.ceil((percentile / 100) * sorted.length) - 1\n\t\treturn sorted[Math.max(0, index)] ?? 0\n\t}\n\n\treturn {\n\t\tstart(): void {\n\n\t\t\tif (running) {\n\t\t\t\treturn // Already started\n\t\t\t}\n\n\t\t\trunning = true\n\t\t\tscheduleMeasurement()\n\t\t},\n\t\tstop(): void {\n\n\t\t\trunning = false\n\t\t\tif (timeoutId !== null) {\n\t\t\t\tclearTimeout(timeoutId)\n\t\t\t\ttimeoutId = null\n\t\t\t}\n\t\t\tif (immediateId !== null) {\n\t\t\t\tclearImmediate(immediateId)\n\t\t\t\timmediateId = null\n\t\t\t}\n\t\t},\n\t\tgetStats(): EventLoopStats | null {\n\n\t\t\tif (lagSamples.length === 0) {\n\t\t\t\treturn null\n\t\t\t}\n\n\t\t\tconst sorted = [...lagSamples].sort((a, b) => a - b)\n\t\t\tconst mean = sorted.reduce((sum, val) => sum + val, 0) / sorted.length\n\n\t\t\treturn {\n\t\t\t\tmean,\n\t\t\t\tp95: calculatePercentiles(sorted, 95),\n\t\t\t\tp99: calculatePercentiles(sorted, 99),\n\t\t\t\tmax: sorted[sorted.length - 1] ?? 0,\n\t\t\t\tsampleCount: sorted.length\n\t\t\t}\n\t\t},\n\t\tgetCurrentLag(): number | null {\n\n\t\t\treturn currentLag\n\t\t}\n\t}\n}\n","/**\n * @file GC monitor for tracking garbage collection events.\n * Uses Node.js perf_hooks if available (requires --expose-gc or perf hooks).\n */\n\nimport {createPerformanceOnError} from '../../utils/on-error'\n\nimport type {\n\tGCMonitor,\n\tGCMonitorOptions,\n\tGCStats,\n\tPerformanceEntryList,\n\tPerformanceObserverConstructor,\n\tPerformanceObserverInterface,\n\tPerfHooksModule,\n\tPerfHooksModuleType\n} from './gc-monitor-types'\n\nexport type {GCMonitor, GCMonitorOptions, GCStats} from './gc-monitor-types'\n\n// Module-level cache for perf_hooks module\nlet perfHooksModuleCache: PerfHooksModuleType | null = null\nlet perfHooksLoadingPromise: Promise<void> | null = null\nconst MAX_GC_ENTRIES_PER_CALLBACK = 256\n\n/**\n * Create a GC monitor.\n * Requires Node.js with perf_hooks support (--expose-gc or perf hooks enabled).\n * Falls back to no-op if not available.\n *\n * @param options - Monitor options\n * @returns GC monitor instance\n */\nexport function createGCMonitor(options: GCMonitorOptions): GCMonitor {\n\n\tconst {\n\t\tclock,\n\t\terrors,\n\t\tonSaturationAlert,\n\t\tonPerfEvent,\n\t\tthresholds = {}\n\t} = options\n\n\tconst onError = createPerformanceOnError(errors, {\n\t\toperation: 'module-load',\n\t\tmonitor: 'gc-monitor'\n\t})\n\n\t// Check if perf_hooks is available\n\tlet perfHooks: PerfHooksModule | null = null\n\n\t// Use cached module if available\n\tif (perfHooksModuleCache && perfHooksModuleCache.PerformanceObserver) {\n\t\tconst Observer = perfHooksModuleCache.PerformanceObserver as PerformanceObserverConstructor\n\t\tperfHooks = {\n\t\t\tPerformanceObserver: Observer\n\t\t}\n\t} else {\n\t\t// Try to load perf_hooks module asynchronously (for future calls)\n\t\tif (!perfHooksLoadingPromise) {\n\t\t\tperfHooksLoadingPromise = import('perf_hooks')\n\t\t\t\t.then((module) => {\n\t\t\t\t\tperfHooksModuleCache = module\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tperfHooksModuleCache = null\n\t\t\t\t\tperfHooksLoadingPromise = null\n\t\t\t\t\tonError(error, {module: 'perf_hooks'})\n\t\t\t\t})\n\t\t}\n\t\t// For now, perfHooks will be null (no-op monitor)\n\t\t// Future calls will use the cached module\n\t}\n\n\tconst pauseTimeThresholds = {...(thresholds.pauseTime ?? {})}\n\tconst heapUsageThresholds = {...(thresholds.heapUsage ?? {})}\n\tvalidatePair(pauseTimeThresholds, 'GC pause-time')\n\tvalidatePair(heapUsageThresholds, 'GC heap-usage', 1)\n\n\tlet majorCount = 0\n\tlet minorCount = 0\n\tconst pauseTimes: number[] = []\n\tlet observer: PerformanceObserverInterface | null = null\n\tlet heapCheckIntervalId: ReturnType<typeof setInterval> | null = null\n\tlet running = false\n\n\tfunction startObserver(): void {\n\t\tif (!perfHooks || observer || !running) {\n\t\t\treturn\n\t\t}\n\t\tlet candidate: PerformanceObserverInterface | null = null\n\t\ttry {\n\t\t\tcandidate = new perfHooks.PerformanceObserver((list: PerformanceEntryList) => {\n\t\t\t\ttry {\n\t\t\t\t\tlet processed = 0\n\t\t\t\t\tfor (const entry of list.getEntries()) {\n\t\t\t\t\t\tif (processed >= MAX_GC_ENTRIES_PER_CALLBACK) {\n\t\t\t\t\t\t\tonError(new Error('GC observer callback entry limit exceeded'), {\n\t\t\t\t\t\t\t\toperation: 'gc-monitor.entry-limit'\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t}\n\t\t\t\t\t\tprocessed += 1\n\t\t\t\t\t\tif (entry.entryType === 'gc') {\n\t\t\t\t\t\t\t// Node 22+ exposes GC kind through detail; the legacy kind accessor is deprecated.\n\t\t\t\t\t\t\thandleGCEvent(entry.detail?.kind ?? 2, entry.duration)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} catch(error) {\n\t\t\t\t\tonError(error, {operation: 'gc-monitor.observer'})\n\t\t\t\t}\n\t\t\t})\n\n\t\t\tcandidate.observe({entryTypes: ['gc']})\n\t\t\tobserver = candidate\n\t\t\theapCheckIntervalId = setInterval(safeCheckHeapUsage, 5000)\n\t\t\theapCheckIntervalId.unref?.()\n\t\t} catch(error) {\n\t\t\tconst partialObserver = candidate\n\t\t\tcandidate = null\n\t\t\tobserver = null\n\t\t\tif (heapCheckIntervalId !== null) {\n\t\t\t\tclearInterval(heapCheckIntervalId)\n\t\t\t\theapCheckIntervalId = null\n\t\t\t}\n\t\t\ttry { partialObserver?.disconnect() } catch(cleanupError) {\n\t\t\t\tonError(cleanupError, {operation: 'gc-monitor.start-cleanup'})\n\t\t\t}\n\t\t\trunning = false\n\t\t\tonError(error, {operation: 'gc-monitor.start'})\n\t\t}\n\t}\n\n\tif (!perfHooks && perfHooksLoadingPromise) {\n\t\tvoid perfHooksLoadingPromise.then(() => {\n\t\t\tif (!perfHooksModuleCache?.PerformanceObserver) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tperfHooks = {PerformanceObserver: perfHooksModuleCache.PerformanceObserver as PerformanceObserverConstructor}\n\t\t\tstartObserver()\n\t\t})\n\t}\n\n\t/**\n\t * Handle GC event\n\t */\n\tfunction handleGCEvent(kind: number, pauseTimeMs: number): void {\n\n\t\tif (!running) {\n\t\t\treturn\n\t\t}\n\t\tif (!Number.isFinite(pauseTimeMs) || pauseTimeMs < 0) {\n\t\t\tonError(new Error('GC pause duration must be a non-negative finite number'), {\n\t\t\t\toperation: 'gc-monitor.invalid-entry'\n\t\t\t})\n\t\t\treturn\n\t\t}\n\t\t// V8 exposes minor as 1; major and incremental collections are treated as major.\n\t\tif (kind === 1) {\n\t\t\tminorCount++\n\t\t} else {\n\t\t\tmajorCount++\n\t\t}\n\n\t\tpauseTimes.push(pauseTimeMs)\n\n\t\t// Keep only last 100 pause times\n\t\tif (pauseTimes.length > 100) {\n\t\t\tpauseTimes.shift()\n\t\t}\n\n\t\t// Emit perf event\n\t\tif (onPerfEvent) {\n\t\t\ttry {\n\t\t\t\tconst end = clock.now()\n\t\t\t\tonPerfEvent({\n\t\t\t\t\tname: `gc_${kind === 1 ? 'minor' : 'major'}`,\n\t\t\t\t\tduration: pauseTimeMs,\n\t\t\t\t\tstart: end - pauseTimeMs,\n\t\t\t\t\tend,\n\t\t\t\t\tlabels: {\n\t\t\t\t\t\tkind: kind === 1 ? 'minor' : 'major'\n\t\t\t\t\t},\n\t\t\t\t\tsource: 'runtime'\n\t\t\t\t})\n\t\t\t} catch(error) {\n\t\t\t\tonError(error, {operation: 'gc-monitor.perf-event'})\n\t\t\t}\n\t\t}\n\n\t\t// Check saturation thresholds\n\t\tif (onSaturationAlert) {\n\t\t\tlet severity: 'warn' | 'critical' | null = null\n\t\t\tlet threshold = 0\n\n\t\t\tif (pauseTimeThresholds.critical !== undefined && pauseTimeMs >= pauseTimeThresholds.critical) {\n\t\t\t\tseverity = 'critical'\n\t\t\t\tthreshold = pauseTimeThresholds.critical\n\t\t\t} else if (pauseTimeThresholds.warn !== undefined && pauseTimeMs >= pauseTimeThresholds.warn) {\n\t\t\t\tseverity = 'warn'\n\t\t\t\tthreshold = pauseTimeThresholds.warn\n\t\t\t}\n\n\t\t\tif (severity) {\n\t\t\t\ttry {\n\t\t\t\t\tonSaturationAlert({\n\t\t\t\t\t\treason: `gc_pause_${kind === 1 ? 'minor' : 'major'}`,\n\t\t\t\t\t\tseverity,\n\t\t\t\t\t\tvalue: pauseTimeMs,\n\t\t\t\t\t\tthreshold\n\t\t\t\t\t})\n\t\t\t\t} catch(error) {\n\t\t\t\t\tonError(error, {operation: 'gc-monitor.saturation-alert'})\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Check heap usage and emit alerts if needed\n\t */\n\tfunction checkHeapUsage(): void {\n\n\t\tif (!running) {\n\t\t\treturn\n\t\t}\n\t\tif (!onSaturationAlert) {\n\t\t\treturn\n\t\t}\n\n\t\tconst usage = process.memoryUsage()\n\t\tconst heapLimit = (usage as {heapLimit?: number}).heapLimit ?? usage.heapTotal\n\t\tconst heapUsed = usage.heapUsed\n\n\t\tif (heapLimit > 0) {\n\t\t\tconst utilization = heapUsed / heapLimit\n\t\t\tlet severity: 'warn' | 'critical' | null = null\n\t\t\tlet threshold = 0\n\n\t\t\tif (heapUsageThresholds.critical !== undefined && utilization >= heapUsageThresholds.critical) {\n\t\t\t\tseverity = 'critical'\n\t\t\t\tthreshold = heapUsageThresholds.critical\n\t\t\t} else if (heapUsageThresholds.warn !== undefined && utilization >= heapUsageThresholds.warn) {\n\t\t\t\tseverity = 'warn'\n\t\t\t\tthreshold = heapUsageThresholds.warn\n\t\t\t}\n\n\t\t\tif (severity) {\n\t\t\t\ttry {\n\t\t\t\t\tonSaturationAlert({\n\t\t\t\t\t\treason: 'heap_usage',\n\t\t\t\t\t\tseverity,\n\t\t\t\t\t\tvalue: utilization,\n\t\t\t\t\t\tthreshold\n\t\t\t\t\t})\n\t\t\t\t} catch(error) {\n\t\t\t\t\tonError(error, {operation: 'gc-monitor.saturation-alert'})\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction safeCheckHeapUsage(): void {\n\t\ttry {\n\t\t\tcheckHeapUsage()\n\t\t} catch(error) {\n\t\t\tonError(error, {operation: 'gc-monitor.heap-check'})\n\t\t}\n\t}\n\n\treturn {\n\t\tstart(): void {\n\n\t\t\tif (running) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\trunning = true\n\t\t\t\tstartObserver()\n\t\t\t} catch(error) {\n\t\t\t\trunning = false\n\t\t\t\tonError(error, {operation: 'gc-monitor.start'})\n\t\t\t\t// Observer creation failed, continue as no-op\n\t\t\t}\n\t\t},\n\t\tstop(): void {\n\n\t\t\trunning = false\n\t\t\tconst activeObserver = observer\n\t\t\tobserver = null\n\t\t\ttry {\n\t\t\t\tactiveObserver?.disconnect()\n\t\t\t} catch(error) {\n\t\t\t\tonError(error, {operation: 'gc-monitor.stop'})\n\t\t\t}\n\t\t\tconst activeHeapCheckInterval = heapCheckIntervalId\n\t\t\theapCheckIntervalId = null\n\t\t\tif (activeHeapCheckInterval !== null) {\n\t\t\t\tclearInterval(activeHeapCheckInterval)\n\t\t\t}\n\t\t},\n\t\tgetStats(): GCStats {\n\n\t\t\tconst totalPauseTimeMs = pauseTimes.reduce((sum, val) => sum + val, 0)\n\t\t\tconst avgPauseTimeMs = pauseTimes.length > 0 ? totalPauseTimeMs / pauseTimes.length : 0\n\t\t\tconst maxPauseTimeMs = pauseTimes.length > 0 ? Math.max(...pauseTimes) : 0\n\n\t\t\treturn {\n\t\t\t\tmajorCount,\n\t\t\t\tminorCount,\n\t\t\t\ttotalPauseTimeMs,\n\t\t\t\tavgPauseTimeMs,\n\t\t\t\tmaxPauseTimeMs\n\t\t\t}\n\t\t},\n\t\tgetHeapUsage(): {\n\t\t\theapUsed: number\n\t\t\theapTotal: number\n\t\t\theapLimit?: number\n\t\t} | null {\n\n\t\t\tif (typeof process === 'undefined' || !process.memoryUsage) {\n\t\t\t\treturn null\n\t\t\t}\n\n\t\t\tconst usage = process.memoryUsage()\n\t\t\tconst result: {\n\t\t\t\theapUsed: number\n\t\t\t\theapTotal: number\n\t\t\t\theapLimit?: number\n\t\t\t} = {\n\t\t\t\theapUsed: usage.heapUsed,\n\t\t\t\theapTotal: usage.heapTotal\n\t\t\t}\n\t\t\tconst heapLimit = (usage as {heapLimit?: number}).heapLimit\n\t\t\tif (heapLimit !== undefined) {\n\t\t\t\tresult.heapLimit = heapLimit\n\t\t\t}\n\t\t\treturn result\n\t\t}\n\t}\n}\n\nfunction validatePair(\n\tthresholds: {warn?: number; critical?: number},\n\tname: string,\n\tmax = Number.POSITIVE_INFINITY\n): void {\n\tconst values = [thresholds.warn, thresholds.critical]\n\t\t.filter((value): value is number => value !== undefined)\n\tif (!values.every((value) => Number.isFinite(value) && value >= 0 && value <= max)) {\n\t\tthrow new Error(`${name} thresholds must be finite numbers between 0 and ${max}`)\n\t}\n\tif (thresholds.warn !== undefined && thresholds.critical !== undefined && thresholds.warn > thresholds.critical) {\n\t\tthrow new Error(`${name} thresholds must satisfy warn <= critical`)\n\t}\n}\n","type OsModule = {loadavg: () => [number, number, number]}\n\nlet osModuleCache: OsModule | null = null\nlet osModuleLoadingPromise: Promise<void> | null = null\n\n/** Returns the cached Node load average and starts a safe lazy import when needed. */\nexport function getResourceLoadAverage(\n\tonError: (error: unknown, details?: Record<string, string>) => void\n): [number, number, number] | undefined {\n\tif (typeof process === 'undefined' || process.platform === 'win32') return undefined\n\ttry {\n\t\tif (osModuleCache) {\n\t\t\treturn osModuleCache.loadavg()\n\t\t}\n\t\tif (osModuleLoadingPromise === null) {\n\t\t\tosModuleLoadingPromise = import('os')\n\t\t\t\t.then((module) => { osModuleCache = {loadavg: () => {\n\t\t\t\t\tconst load = module.loadavg()\n\t\t\t\t\treturn [load[0] ?? 0, load[1] ?? 0, load[2] ?? 0]\n\t\t\t\t}} })\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tosModuleCache = null\n\t\t\t\t\tosModuleLoadingPromise = null\n\t\t\t\t\tonError(error, {module: 'os'})\n\t\t\t\t})\n\t\t}\n\t} catch {\n\t\t// Load average is optional outside Node and must not affect monitoring.\n\t}\n\treturn undefined\n}\n","/**\n * @file CPU and memory resource monitor.\n * Tracks CPU usage, memory usage, and load averages at configurable intervals.\n */\n\nimport {createPerformanceOnError} from '../../utils/on-error'\n\nimport {getResourceLoadAverage} from './resource-load-average'\nimport type {CPUStats, MemoryStats, ResourceMonitor, ResourceMonitorOptions, ResourceStats} from './resource-monitor-types'\n\nexport type {CPUStats, MemoryStats, ResourceMonitor, ResourceMonitorOptions, ResourceStats} from './resource-monitor-types'\n\n/**\n * Create a resource monitor.\n * Tracks CPU and memory usage at configurable intervals.\n *\n * @param options - Monitor options\n * @returns Resource monitor instance\n */\nexport function createResourceMonitor(options: ResourceMonitorOptions): ResourceMonitor {\n\n\tconst {\n\t\tclock,\n\t\terrors,\n\t\tintervalMs = 5000,\n\t\tonSaturationAlert,\n\t\tonPerfEvent,\n\t\tthresholds = {}\n\t} = options\n\n\tconst onError = createPerformanceOnError(errors, {\n\t\toperation: 'module-load',\n\t\tmonitor: 'resource-monitor'\n\t})\n\tif (!Number.isSafeInteger(intervalMs) || intervalMs <= 0 || intervalMs > 2_147_483_647) {\n\t\tthrow new Error('Resource monitor intervalMs must be between 1 and 2147483647')\n\t}\n\n\tconst cpuThresholds = {...(thresholds.cpu ?? {})}\n\tconst memoryThresholds = {...(thresholds.memory ?? {})}\n\tvalidateThresholds(cpuThresholds, 'CPU')\n\tvalidateThresholds(memoryThresholds, 'memory', 1)\n\n\tlet intervalId: ReturnType<typeof setInterval> | null = null\n\tlet lastCPUUsage: {user: number; system: number} | null = null\n\tlet lastCPUCollectedAt: number | null = null\n\tlet running = false\n\n\tfunction safeCollectStats(): void {\n\t\tif (!running) {\n\t\t\treturn\n\t\t}\n\t\ttry {\n\t\t\tcollectStats()\n\t\t} catch(error) {\n\t\t\tonError(error, {operation: 'resource-monitor.tick'})\n\t\t}\n\t}\n\n\t/**\n\t * Collect and emit resource statistics\n\t */\n\tfunction collectStats(): void {\n\n\t\tif (\n\t\t\ttypeof process === 'undefined' ||\n\t\t\ttypeof process.cpuUsage !== 'function' ||\n\t\t\ttypeof process.memoryUsage !== 'function'\n\t\t) {\n\t\t\treturn\n\t\t}\n\n\t\tconst now = clock.now()\n\n\t\t// CPU usage\n\t\tconst cpuUsage = process.cpuUsage()\n\n\t\tif (lastCPUUsage) {\n\t\t\tconst elapsedMs = lastCPUCollectedAt !== null && now > lastCPUCollectedAt\n\t\t\t\t? now - lastCPUCollectedAt\n\t\t\t\t: intervalMs\n\t\t\tconst userDelta = Math.max(0, cpuUsage.user - lastCPUUsage.user)\n\t\t\tconst systemDelta = Math.max(0, cpuUsage.system - lastCPUUsage.system)\n\t\t\tconst totalDelta = userDelta + systemDelta\n\n\t\t\t// Emit CPU perf event (convert microseconds to milliseconds)\n\t\t\tif (onPerfEvent) {\n\t\t\t\ttry {\n\t\t\t\t\tonPerfEvent({\n\t\t\t\t\t\tname: 'cpu_usage',\n\t\t\t\t\t\tduration: totalDelta / 1000, // Convert to ms\n\t\t\t\t\t\tstart: now - elapsedMs,\n\t\t\t\t\t\tend: now,\n\t\t\t\t\t\tlabels: {\n\t\t\t\t\t\t\tuser: String(userDelta / 1000),\n\t\t\t\t\t\t\tsystem: String(systemDelta / 1000),\n\t\t\t\t\t\t\tutilization: String(totalDelta / (elapsedMs * 1000))\n\t\t\t\t\t\t},\n\t\t\t\t\t\tsource: 'runtime'\n\t\t\t\t\t})\n\t\t\t\t} catch(error) {\n\t\t\t\t\tonError(error, {operation: 'resource-monitor.perf-event'})\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Check CPU saturation (approximate: total CPU time / interval)\n\t\t\t// This is a rough approximation\n\t\t\tconst cpuUtilization = totalDelta / (elapsedMs * 1000) // Convert to ratio\n\t\t\tif (onSaturationAlert) {\n\t\t\t\tlet severity: 'info' | 'warn' | 'critical' | null = null\n\t\t\t\tlet threshold = 0\n\n\t\t\t\tif (cpuThresholds.critical !== undefined && cpuUtilization >= cpuThresholds.critical) {\n\t\t\t\t\tseverity = 'critical'\n\t\t\t\t\tthreshold = cpuThresholds.critical\n\t\t\t\t} else if (cpuThresholds.warn !== undefined && cpuUtilization >= cpuThresholds.warn) {\n\t\t\t\t\tseverity = 'warn'\n\t\t\t\t\tthreshold = cpuThresholds.warn\n\t\t\t\t} else if (cpuThresholds.info !== undefined && cpuUtilization >= cpuThresholds.info) {\n\t\t\t\t\tseverity = 'info'\n\t\t\t\t\tthreshold = cpuThresholds.info\n\t\t\t\t}\n\n\t\t\t\tif (severity) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tonSaturationAlert({\n\t\t\t\t\t\t\treason: 'cpu_saturation',\n\t\t\t\t\t\t\tseverity,\n\t\t\t\t\t\t\tvalue: cpuUtilization,\n\t\t\t\t\t\t\tthreshold\n\t\t\t\t\t\t})\n\t\t\t\t\t} catch(error) {\n\t\t\t\t\t\tonError(error, {operation: 'resource-monitor.saturation-alert'})\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tlastCPUUsage = cpuUsage\n\t\tlastCPUCollectedAt = now\n\n\t\t// Memory usage\n\t\tconst memoryUsage = process.memoryUsage()\n\t\tconst memoryStats: MemoryStats = {\n\t\t\trss: memoryUsage.rss,\n\t\t\theapUsed: memoryUsage.heapUsed,\n\t\t\theapTotal: memoryUsage.heapTotal,\n\t\t\texternal: memoryUsage.external\n\t\t}\n\n\t\t// Emit memory perf event\n\t\tif (onPerfEvent) {\n\t\t\ttry {\n\t\t\t\tonPerfEvent({\n\t\t\t\t\tname: 'memory_usage',\n\t\t\t\t\tduration: 0, // Memory is a snapshot, not a duration\n\t\t\t\t\tstart: now,\n\t\t\t\t\tend: now,\n\t\t\t\t\tlabels: {\n\t\t\t\t\t\trss: String(memoryStats.rss),\n\t\t\t\t\t\theapUsed: String(memoryStats.heapUsed),\n\t\t\t\t\t\theapTotal: String(memoryStats.heapTotal),\n\t\t\t\t\t\texternal: String(memoryStats.external)\n\t\t\t\t\t},\n\t\t\t\t\tsource: 'runtime'\n\t\t\t\t})\n\t\t\t} catch(error) {\n\t\t\t\tonError(error, {operation: 'resource-monitor.perf-event'})\n\t\t\t}\n\t\t}\n\n\t\t// Check memory saturation (heap used / heap total)\n\t\tif (memoryStats.heapTotal > 0 && onSaturationAlert) {\n\t\t\tconst memoryUtilization = memoryStats.heapUsed / memoryStats.heapTotal\n\t\t\tlet severity: 'info' | 'warn' | 'critical' | null = null\n\t\t\tlet threshold = 0\n\n\t\t\tif (memoryThresholds.critical !== undefined && memoryUtilization >= memoryThresholds.critical) {\n\t\t\t\tseverity = 'critical'\n\t\t\t\tthreshold = memoryThresholds.critical\n\t\t\t} else if (memoryThresholds.warn !== undefined && memoryUtilization >= memoryThresholds.warn) {\n\t\t\t\tseverity = 'warn'\n\t\t\t\tthreshold = memoryThresholds.warn\n\t\t\t} else if (memoryThresholds.info !== undefined && memoryUtilization >= memoryThresholds.info) {\n\t\t\t\tseverity = 'info'\n\t\t\t\tthreshold = memoryThresholds.info\n\t\t\t}\n\n\t\t\tif (severity) {\n\t\t\t\ttry {\n\t\t\t\t\tonSaturationAlert({\n\t\t\t\t\t\treason: 'memory_pressure',\n\t\t\t\t\t\tseverity,\n\t\t\t\t\t\tvalue: memoryUtilization,\n\t\t\t\t\t\tthreshold\n\t\t\t\t\t})\n\t\t\t\t} catch(error) {\n\t\t\t\t\tonError(error, {operation: 'resource-monitor.saturation-alert'})\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn {\n\t\tstart(): void {\n\n\t\t\tif (intervalId !== null) {\n\t\t\t\treturn // Already started\n\t\t\t}\n\n\t\t\t// Initialize CPU usage baseline\n\t\t\tif (typeof process !== 'undefined' && typeof process.cpuUsage === 'function') {\n\t\t\t\tlastCPUUsage = process.cpuUsage()\n\t\t\t\tlastCPUCollectedAt = clock.now()\n\t\t\t}\n\n\t\t\trunning = true\n\t\t\t// Start periodic collection\n\t\t\tintervalId = setInterval(safeCollectStats, intervalMs)\n\t\t\tintervalId.unref?.()\n\t\t},\n\t\tstop(): void {\n\n\t\t\trunning = false\n\t\t\tif (intervalId !== null) {\n\t\t\t\tclearInterval(intervalId)\n\t\t\t\tintervalId = null\n\t\t\t}\n\n\t\t\tlastCPUUsage = null\n\t\t\tlastCPUCollectedAt = null\n\t\t},\n\t\tgetStats(): ResourceStats | null {\n\n\t\t\tif (\n\t\t\t\ttypeof process === 'undefined' ||\n\t\t\t\ttypeof process.cpuUsage !== 'function' ||\n\t\t\t\ttypeof process.memoryUsage !== 'function'\n\t\t\t) {\n\t\t\t\treturn null\n\t\t\t}\n\n\t\t\tconst cpuUsage = process.cpuUsage()\n\t\t\tconst memoryUsage = process.memoryUsage()\n\n\t\t\tconst cpu: CPUStats = {\n\t\t\t\tuser: cpuUsage.user,\n\t\t\t\tsystem: cpuUsage.system,\n\t\t\t\ttotal: cpuUsage.user + cpuUsage.system\n\t\t\t}\n\n\t\t\tconst memory: MemoryStats = {\n\t\t\t\trss: memoryUsage.rss,\n\t\t\t\theapUsed: memoryUsage.heapUsed,\n\t\t\t\theapTotal: memoryUsage.heapTotal,\n\t\t\t\texternal: memoryUsage.external\n\t\t\t}\n\n\t\t\tconst loadAverage = getResourceLoadAverage(onError)\n\n\t\t\tconst stats: ResourceStats = {\n\t\t\t\tcpu,\n\t\t\t\tmemory\n\t\t\t}\n\t\t\tif (loadAverage) {\n\t\t\t\tstats.loadAverage = loadAverage\n\t\t\t}\n\t\t\treturn stats\n\t\t}\n\t}\n}\n\nfunction validateThresholds(\n\tthresholds: {info?: number; warn?: number; critical?: number},\n\tname: string,\n\tmax = Number.POSITIVE_INFINITY\n): void {\n\tconst ordered = [thresholds.info, thresholds.warn, thresholds.critical]\n\t\t.filter((value): value is number => value !== undefined)\n\tif (!ordered.every((value) => Number.isFinite(value) && value >= 0 && value <= max)) {\n\t\tthrow new Error(`${name} thresholds must be finite numbers between 0 and ${max}`)\n\t}\n\tif (\n\t\t(thresholds.info !== undefined && thresholds.warn !== undefined && thresholds.info > thresholds.warn) ||\n\t\t(thresholds.warn !== undefined && thresholds.critical !== undefined && thresholds.warn > thresholds.critical) ||\n\t\t(thresholds.info !== undefined && thresholds.critical !== undefined && thresholds.info > thresholds.critical)\n\t) {\n\t\tthrow new Error(`${name} thresholds must satisfy info <= warn <= critical`)\n\t}\n}\n","/**\n * @file Error boundary for performance monitoring operations.\n * Wraps monitor operations to prevent crashes.\n * Uses engines' error boundary utilities for consistency.\n */\n\nimport type {Errors} from '@ooopsstudio/core/ports/errors'\n\nimport {createPerformanceOnError} from './on-error'\nimport {isRuntimePromise} from './safe-object'\n\n/**\n * Wrap a function with error boundary.\n * Catches errors and reports them without throwing.\n *\n * @param fn - Function to wrap\n * @param errors - Optional error handler\n * @param context - Optional context for error reporting\n * @returns Wrapped function\n */\nexport function withErrorBoundary<T extends (...args: unknown[]) => unknown>(\n\tfn: T,\n\terrors?: Errors,\n\tcontext?: Record<string, string>\n): T {\n\n\tconst onError = createPerformanceOnError(errors, {\n\t\tstage: 'monitor',\n\t\t...(context ? {step: Object.values(context)[0]} : {})\n\t})\n\n\treturn ((...args: Parameters<T>) => {\n\t\ttry {\n\t\t\treturn fn(...args)\n\t\t} catch(error) {\n\t\t\tonError(error)\n\t\t\t// Return undefined instead of throwing\n\t\t\treturn undefined as ReturnType<T>\n\t\t}\n\t}) as T\n}\n\n/**\n * Wrap an async function with error boundary.\n *\n * @param fn - Async function to wrap\n * @param errors - Optional error handler\n * @param context - Optional context for error reporting\n * @returns Wrapped async function\n */\nexport function withAsyncErrorBoundary<T extends (...args: unknown[]) => Promise<unknown>>(\n\tfn: T,\n\terrors?: Errors,\n\tcontext?: Record<string, string>\n): T {\n\n\tconst onError = createPerformanceOnError(errors, {\n\t\tstage: 'monitor',\n\t\t...(context ? {step: Object.values(context)[0]} : {})\n\t})\n\n\treturn ((...args: Parameters<T>) => {\n\t\treturn Promise.resolve().then(() => {\n\t\t\tconst result = fn(...args)\n\t\t\tif (!isRuntimePromise(result)) throw new TypeError('Performance async boundary requires a native Promise')\n\t\t\treturn result\n\t\t}).catch((error) => {\n\t\t\tonError(error)\n\t\t\treturn undefined\n\t\t}) as Promise<Awaited<ReturnType<T>> | undefined>\n\t}) as T\n}\n","import type {PerfEvent, SaturationAlert} from '@ooopsstudio/core/contracts/performance'\nimport type {Errors} from '@ooopsstudio/core/ports/errors'\n\nimport {createEventLoopMonitor, type EventLoopMonitor} from '../../features/core/event-loop-monitor'\nimport {createGCMonitor, type GCMonitor} from '../../features/core/gc-monitor'\nimport {createResourceMonitor, type ResourceMonitor} from '../../features/core/resource-monitor'\nimport {withErrorBoundary} from '../../utils/error-boundary'\nimport type {HighResClock} from '../clock'\n\nexport interface Monitors {\n\teventLoopMonitor?: EventLoopMonitor\n\tgcMonitor?: GCMonitor\n\tresourceMonitor?: ResourceMonitor\n}\n\nexport interface MonitorsOptions {\n\tclock: HighResClock\n\tonPerfEvent: (event: PerfEvent) => void\n\tonSaturationAlert?: (alert: SaturationAlert) => void\n\terrors?: Errors\n\tenableEventLoopMonitor: boolean\n\tenableGCMonitor: boolean\n\tenableResourceMonitor: boolean\n}\n\nexport function createMonitors(options: MonitorsOptions): Monitors {\n\tconst monitors: Monitors = {}\n\tconst safelyEmitEvent = (event: PerfEvent) => {\n\t\ttry { options.onPerfEvent(event) } catch { /* monitors never break the host */ }\n\t}\n\tconst safelyEmitAlert = (alert: SaturationAlert) => {\n\t\ttry { options.onSaturationAlert?.(alert) } catch { /* observers are isolated */ }\n\t}\n\ttry {\n\t\tif (options.enableEventLoopMonitor) {\n\t\t\tmonitors.eventLoopMonitor = createEventLoopMonitor({\n\t\t\t\tclock: options.clock,\n\t\t\t\tonPerfEvent: safelyEmitEvent,\n\t\t\t\tonSaturationAlert: safelyEmitAlert\n\t\t\t})\n\t\t\twithErrorBoundary(() => monitors.eventLoopMonitor?.start(), options.errors, {operation: 'eventLoopMonitor.start'})()\n\t\t}\n\t\tif (options.enableGCMonitor) {\n\t\t\tmonitors.gcMonitor = createGCMonitor({\n\t\t\t\tclock: options.clock,\n\t\t\t\t...(options.errors ? {errors: options.errors} : {}),\n\t\t\t\tonPerfEvent: safelyEmitEvent,\n\t\t\t\tonSaturationAlert: safelyEmitAlert\n\t\t\t})\n\t\t\twithErrorBoundary(() => monitors.gcMonitor?.start(), options.errors, {operation: 'gcMonitor.start'})()\n\t\t}\n\t\tif (options.enableResourceMonitor) {\n\t\t\tmonitors.resourceMonitor = createResourceMonitor({\n\t\t\t\tclock: options.clock,\n\t\t\t\t...(options.errors ? {errors: options.errors} : {}),\n\t\t\t\tonPerfEvent: safelyEmitEvent,\n\t\t\t\tonSaturationAlert: safelyEmitAlert\n\t\t\t})\n\t\t\twithErrorBoundary(() => monitors.resourceMonitor?.start(), options.errors, {operation: 'resourceMonitor.start'})()\n\t\t}\n\t} catch(error) {\n\t\tstopAllMonitors(monitors)\n\t\tthrow error\n\t}\n\treturn monitors\n}\n\nexport function stopAllMonitors(monitors: Monitors): void {\n\ttry { monitors.eventLoopMonitor?.stop() } catch { /* cleanup continues */ }\n\ttry { monitors.gcMonitor?.stop() } catch { /* cleanup continues */ }\n\ttry { monitors.resourceMonitor?.stop() } catch { /* cleanup continues */ }\n}\n"]}