import { isMetricsTraceSupplier, type ITrace, type ITraceable, type ITraceWith, LogLevel, LogTrace, type LogTraceSupplier, MetricsTrace, type MetricsTraceSupplier, type MetricValue, TraceableImpl, } from './index.js'; export class LogTraceable extends TraceableImpl { public static LogTrace = new LogTrace(); static of(t: T) { return new LogTraceable(t, LogTraceable.LogTrace); } } const getEmbeddedMetricConsumer = (logTrace: ITrace) => (metrics: Array) => { if (metrics.length === 0) return; logTrace.traceScope(LogLevel.SYS).trace(`Metrics = ${JSON.stringify(metrics)}`); }; export class EmbeddedMetricsTraceable extends TraceableImpl { public static MetricsTrace = new MetricsTrace(getEmbeddedMetricConsumer(LogTraceable.LogTrace)); static of(t: T, metricsTrace = EmbeddedMetricsTraceable.MetricsTrace) { return new EmbeddedMetricsTraceable(t, metricsTrace); } } export type LogMetricTraceSupplier = ITraceWith; export class LogMetricTrace implements ITrace { constructor( private logTrace: ITrace, private metricsTrace: ITrace, ) {} public traceScope(trace: LogTraceSupplier | MetricsTraceSupplier): LogMetricTrace { if (isMetricsTraceSupplier(trace)) { this.metricsTrace = this.metricsTrace.traceScope(trace); return this; } this.logTrace = this.logTrace.traceScope(trace); return this; } public trace(trace: LogTraceSupplier | MetricsTraceSupplier) { if (isMetricsTraceSupplier(trace)) { this.metricsTrace.trace(trace); return this; } this.logTrace.trace(trace); return this; } } export class LogMetricTraceable extends TraceableImpl { static ofLogTraceable(t: ITraceable) { const metricsTrace = new MetricsTrace(getEmbeddedMetricConsumer(t.trace)); return new LogMetricTraceable(t.get(), new LogMetricTrace(t.trace, metricsTrace)); } static of(t: T) { const logTrace = LogTraceable.of(t); return LogMetricTraceable.ofLogTraceable(logTrace); } }