{"version":3,"file":"ElementTimingInstrumentation.cjs","names":["EmbraceInstrumentationBase","isEntryTypeSupported","createPerformanceObserver","KEY_EMB_TYPE","KEY_EMB_ELEMENT_TIMING_IDENTIFIER","KEY_EMB_ELEMENT_TIMING_ELEMENT","KEY_EMB_ELEMENT_TIMING_RENDER_TIME","KEY_EMB_ELEMENT_TIMING_LOAD_TIME","KEY_EMB_ELEMENT_TIMING_START_TIME","KEY_EMB_ELEMENT_TIMING_URL","KEY_EMB_ELEMENT_TIMING_NATURAL_WIDTH","KEY_EMB_ELEMENT_TIMING_NATURAL_HEIGHT"],"sources":["../../../../src/instrumentations/element-timing/ElementTimingInstrumentation/ElementTimingInstrumentation.ts"],"sourcesContent":["import { EMB_TYPES, KEY_EMB_TYPE } from '../../../constants/index.ts';\nimport {\n  createPerformanceObserver,\n  isEntryTypeSupported,\n} from '../../../utils/index.ts';\nimport { EmbraceInstrumentationBase } from '../../EmbraceInstrumentationBase/index.ts';\nimport {\n  KEY_EMB_ELEMENT_TIMING_ELEMENT,\n  KEY_EMB_ELEMENT_TIMING_IDENTIFIER,\n  KEY_EMB_ELEMENT_TIMING_LOAD_TIME,\n  KEY_EMB_ELEMENT_TIMING_NATURAL_HEIGHT,\n  KEY_EMB_ELEMENT_TIMING_NATURAL_WIDTH,\n  KEY_EMB_ELEMENT_TIMING_RENDER_TIME,\n  KEY_EMB_ELEMENT_TIMING_START_TIME,\n  KEY_EMB_ELEMENT_TIMING_URL,\n} from './constants.ts';\nimport type {\n  ElementTimingInstrumentationArgs,\n  PerformanceElementTiming,\n} from './types.ts';\n\nexport class ElementTimingInstrumentation extends EmbraceInstrumentationBase {\n  private _observer: PerformanceObserver | null = null;\n  private _isEnabled = false;\n\n  public constructor({\n    diag,\n    perf,\n    limitManager,\n  }: ElementTimingInstrumentationArgs = {}) {\n    super({\n      instrumentationName: 'ElementTimingInstrumentation',\n      instrumentationVersion: '1.0.0',\n      diag,\n      perf,\n      limitManager,\n      config: {},\n    });\n\n    if (this._config.enabled) {\n      this.enable();\n    }\n  }\n\n  public enable(): void {\n    if (this._isEnabled) {\n      return;\n    }\n\n    if (!isEntryTypeSupported('element')) {\n      this._diag.debug('element not supported, skipping');\n      return;\n    }\n\n    this._isEnabled = true;\n\n    if (this._observer) {\n      this._observer.disconnect();\n    }\n\n    this._observer = createPerformanceObserver<PerformanceElementTiming>(\n      'element',\n      (entry) => this._processEntry(entry),\n      { diag: this._diag },\n    );\n\n    if (!this._observer) {\n      this._isEnabled = false;\n      this._diag.error('failed to enable');\n      return;\n    }\n  }\n\n  public disable(): void {\n    this._isEnabled = false;\n\n    if (this._observer) {\n      this._observer.disconnect();\n      this._observer = null;\n    }\n  }\n\n  private _processEntry(entry: PerformanceElementTiming): void {\n    if (!this._isEnabled) {\n      return;\n    }\n\n    if (this.limitManager?.limitElementTimingEntry()) {\n      return;\n    }\n\n    const span = this.tracer.startSpan(entry.identifier, {\n      // Span start anchors to navigation start so the span duration equals \"time from navigation\n      // until the element was rendered\" — useful for analyzing page-load render timing.\n      startTime: this.perf.epochMillisFromOriginOffset(0),\n      attributes: {\n        [KEY_EMB_TYPE]: EMB_TYPES.ElementTiming,\n        [KEY_EMB_ELEMENT_TIMING_IDENTIFIER]: entry.identifier,\n        [KEY_EMB_ELEMENT_TIMING_ELEMENT]: entry.element?.tagName?.toLowerCase(),\n        [KEY_EMB_ELEMENT_TIMING_RENDER_TIME]: entry.renderTime,\n        [KEY_EMB_ELEMENT_TIMING_LOAD_TIME]: entry.loadTime,\n        [KEY_EMB_ELEMENT_TIMING_START_TIME]: entry.startTime,\n        [KEY_EMB_ELEMENT_TIMING_URL]: entry.url,\n        [KEY_EMB_ELEMENT_TIMING_NATURAL_WIDTH]: entry.naturalWidth,\n        [KEY_EMB_ELEMENT_TIMING_NATURAL_HEIGHT]: entry.naturalHeight,\n      },\n    });\n    if (entry.loadTime > 0) {\n      span.addEvent(\n        'load',\n        this.perf.epochMillisFromOriginOffset(entry.loadTime),\n      );\n    }\n    // entry.startTime = renderTime if non-zero, else loadTime\n    span.end(this.perf.epochMillisFromOriginOffset(entry.startTime));\n  }\n}\n"],"mappings":";;;;;;AAqBA,IAAa,+BAAb,cAAkDA,+EAAAA,2BAA2B;CAC3E,YAAgD;CAChD,aAAqB;CAErB,YAAmB,EACjB,MACA,MACA,iBACoC,EAAE,EAAE;AACxC,QAAM;GACJ,qBAAqB;GACrB,wBAAwB;GACxB;GACA;GACA;GACA,QAAQ,EAAE;GACX,CAAC;AAEF,MAAI,KAAK,QAAQ,QACf,MAAK,QAAQ;;CAIjB,SAAsB;AACpB,MAAI,KAAK,WACP;AAGF,MAAI,CAACC,sDAAAA,qBAAqB,UAAU,EAAE;AACpC,QAAK,MAAM,MAAM,kCAAkC;AACnD;;AAGF,OAAK,aAAa;AAElB,MAAI,KAAK,UACP,MAAK,UAAU,YAAY;AAG7B,OAAK,YAAYC,sDAAAA,0BACf,YACC,UAAU,KAAK,cAAc,MAAM,EACpC,EAAE,MAAM,KAAK,OAAO,CACrB;AAED,MAAI,CAAC,KAAK,WAAW;AACnB,QAAK,aAAa;AAClB,QAAK,MAAM,MAAM,mBAAmB;AACpC;;;CAIJ,UAAuB;AACrB,OAAK,aAAa;AAElB,MAAI,KAAK,WAAW;AAClB,QAAK,UAAU,YAAY;AAC3B,QAAK,YAAY;;;CAIrB,cAAsB,OAAuC;AAC3D,MAAI,CAAC,KAAK,WACR;AAGF,MAAI,KAAK,cAAc,yBAAyB,CAC9C;EAGF,MAAM,OAAO,KAAK,OAAO,UAAU,MAAM,YAAY;GAGnD,WAAW,KAAK,KAAK,4BAA4B,EAAE;GACnD,YAAY;KACTC,6BAAAA,eAAAA;KACAC,+EAAAA,oCAAoC,MAAM;KAC1CC,+EAAAA,iCAAiC,MAAM,SAAS,SAAS,aAAa;KACtEC,+EAAAA,qCAAqC,MAAM;KAC3CC,+EAAAA,mCAAmC,MAAM;KACzCC,+EAAAA,oCAAoC,MAAM;KAC1CC,+EAAAA,6BAA6B,MAAM;KACnCC,+EAAAA,uCAAuC,MAAM;KAC7CC,+EAAAA,wCAAwC,MAAM;IAChD;GACF,CAAC;AACF,MAAI,MAAM,WAAW,EACnB,MAAK,SACH,QACA,KAAK,KAAK,4BAA4B,MAAM,SAAS,CACtD;AAGH,OAAK,IAAI,KAAK,KAAK,4BAA4B,MAAM,UAAU,CAAC"}