// Copyright (c) 2025, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
//
// API docs from [MDN Web Docs](https://developer.mozilla.org/en-US/docs/Web).
// Attributions and copyright licensing by Mozilla Contributors is licensed
// under [CC-BY-SA 2.5](https://creativecommons.org/licenses/by-sa/2.5/.

// Generated from Web IDL definitions.

// ignore_for_file: unintended_html_in_doc_comment

@JS()
library;

import 'dart:js_interop';

import 'performance_timeline.dart';
import 'server_timing.dart';

typedef RenderBlockingStatusType = String;

/// The **`PerformanceResourceTiming`** interface enables retrieval and analysis
/// of detailed network timing data regarding the loading of an application's
/// resources. An application can use the timing metrics to determine, for
/// example, the length of time it takes to fetch a specific resource, such as
/// an [XMLHttpRequest], , image, or script.
///
/// ---
///
/// API documentation sourced from
/// [MDN Web Docs](https://developer.mozilla.org/en-US/docs/Web/API/PerformanceResourceTiming).
extension type PerformanceResourceTiming._(JSObject _)
    implements PerformanceEntry, JSObject {
  /// The **`toJSON()`** method of the [PerformanceResourceTiming] interface is
  /// a ; it returns a JSON representation of the [PerformanceResourceTiming]
  /// object.
  external JSObject toJSON();

  /// The **`initiatorType`** read-only property is a string representing web
  /// platform feature that initiated the resource load.
  ///
  /// > [!NOTE]
  /// > This property does not represent the type of content fetched. A `.css`
  /// > file can be fetched using a `link` element leading to an `initiatorType`
  /// > of `link`. When loading images using `background: url()` in a CSS file,
  /// > the `initiatorType` will be `css` and not `img`.
  external String get initiatorType;

  /// The **`nextHopProtocol`** read-only property is a string representing the
  /// network protocol used to fetch the resource, as identified by the [ALPN
  /// Protocol ID
  /// (RFC7301)](https://www.iana.org/assignments/tls-extensiontype-values/tls-extensiontype-values.xhtml#alpn-protocol-ids).
  ///
  /// When a proxy is used, if a tunnel connection is established, this property
  /// returns the ALPN Protocol ID of the tunneled protocol. Otherwise, this
  /// property returns the ALPN Protocol ID of the first hop to the proxy.
  external String get nextHopProtocol;

  /// The **`workerStart`** read-only property of the
  /// [PerformanceResourceTiming] interface returns a
  /// [DOMHighResTimeStamp] immediately before dispatching the [FetchEvent] if a
  /// Service Worker thread is already running, or immediately before starting
  /// the Service Worker thread if it is not already running. If the resource is
  /// not intercepted by a Service Worker the property will always return 0.
  external double get workerStart;

  /// The **`redirectStart`** read-only property returns a [DOMHighResTimeStamp]
  /// representing the start time of the fetch which that initiates the
  /// redirect.
  ///
  /// If there are HTTP redirects when fetching the resource and if any of the
  /// redirects are not from the same origin as the current document, but the
  /// timing allow check algorithm passes for each redirected resource, this
  /// property returns the starting time of the fetch that initiates the
  /// redirect; otherwise, zero is returned.
  ///
  /// To get the amount of redirects, see also
  /// [PerformanceNavigationTiming.redirectCount].
  external double get redirectStart;

  /// The **`redirectEnd`** read-only property returns a [DOMHighResTimeStamp]
  /// immediately after receiving the last byte of the response of the last
  /// redirect.
  ///
  /// When fetching a resource, if there are multiple HTTP redirects, and any of
  /// the redirects have an origin that is different from the current document,
  /// and the timing allow check algorithm passes for each redirected resource,
  /// this property returns the time immediately after receiving the last byte
  /// of the response of the last redirect; otherwise, zero is returned.
  ///
  /// To get the amount of redirects, see also
  /// [PerformanceNavigationTiming.redirectCount].
  external double get redirectEnd;

  /// The **`fetchStart`** read-only property represents a [DOMHighResTimeStamp]
  /// immediately before the browser starts to fetch the resource.
  ///
  /// If there are HTTP redirects, the property returns the time immediately
  /// before the user agent starts to fetch the final resource in the
  /// redirection.
  ///
  /// Unlike many other `PerformanceResourceTiming` properties, the `fetchStart`
  /// property is available for cross-origin requests without the need of the
  /// HTTP response header.
  external double get fetchStart;

  /// The **`domainLookupStart`** read-only property returns the
  /// [DOMHighResTimeStamp] immediately before the browser starts the domain
  /// name lookup for the resource.
  external double get domainLookupStart;

  /// The **`domainLookupEnd`** read-only property returns the
  /// [DOMHighResTimeStamp] immediately after the browser finishes the
  /// domain-name lookup for the resource.
  ///
  /// If the user agent has the domain information in cache,
  /// [PerformanceResourceTiming.domainLookupStart] and `domainLookupEnd`
  /// represent the times when the user agent starts and ends the domain data
  /// retrieval from the cache.
  external double get domainLookupEnd;

  /// The **`connectStart`** read-only property returns the
  /// [DOMHighResTimeStamp] immediately before the user agent starts
  /// establishing the connection to the server to retrieve the resource.
  external double get connectStart;

  /// The **`connectEnd`** read-only property returns the [DOMHighResTimeStamp]
  /// immediately after the browser finishes establishing the connection to the
  /// server to retrieve the resource. The timestamp value includes the time
  /// interval to establish the transport connection, as well as other time
  /// intervals such as TLS handshake and
  /// [SOCKS](https://en.wikipedia.org/wiki/SOCKS) authentication.
  external double get connectEnd;

  /// The **`secureConnectionStart`** read-only property returns a
  /// [DOMHighResTimeStamp] immediately before the browser starts the handshake
  /// process to secure the current connection. If a secure connection is not
  /// used, the property returns zero.
  external double get secureConnectionStart;

  /// The **`requestStart`** read-only property returns a [DOMHighResTimeStamp]
  /// of the time immediately before the browser starts requesting the resource
  /// from the server, cache, or local resource. If the transport connection
  /// fails and the browser retires the request, the value returned will be the
  /// start of the retry request.
  ///
  /// There is no _end_ property for `requestStart`. To measure the request
  /// time, calculate [PerformanceResourceTiming.responseStart] - `requestStart`
  /// (see the example below).
  external double get requestStart;

  /// The **`responseStart`** read-only property returns a [DOMHighResTimeStamp]
  /// immediately after the browser receives the first byte of the response from
  /// the server, cache, or local resource.
  external double get responseStart;

  /// The **`responseEnd`** read-only property returns a [DOMHighResTimeStamp]
  /// immediately after the browser receives the last byte of the resource or
  /// immediately before the transport connection is closed, whichever comes
  /// first.
  ///
  /// Unlike many other `PerformanceResourceTiming` properties, the
  /// `responseEnd` property is available for cross-origin requests without the
  /// need of the  HTTP response header.
  external double get responseEnd;

  /// The **`transferSize`** read-only property represents the size (in octets)
  /// of the fetched resource. The size includes the response header fields plus
  /// the response payload body (as defined by
  /// [RFC7230](https://httpwg.org/specs/rfc7230.html#message.body)).
  ///
  /// If the resource is fetched from a local cache, or if it is a cross-origin
  /// resource, this property returns zero.
  external int get transferSize;

  /// The **`encodedBodySize`** read-only property represents the size (in
  /// octets) received from the fetch (HTTP or cache) of the payload body before
  /// removing any applied content encodings (like gzip or Brotli). If the
  /// resource is retrieved from an application cache or a local resource, it
  /// must
  /// return the size of the payload body before removing any applied content
  /// encoding.
  external int get encodedBodySize;

  /// The **`decodedBodySize`** read-only property returns the size (in octets)
  /// received from the fetch (HTTP or cache) of the message body after removing
  /// any applied content encoding (like gzip or Brotli). If the resource is
  /// retrieved from an application cache or local resources, it returns the
  /// size of the payload after removing any applied content encoding.
  external int get decodedBodySize;

  /// The **`responseStatus`** read-only property represents the HTTP response
  /// status code returned when fetching the resource.
  ///
  /// This property maps to [Response.status] from the
  /// [Fetch API](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API).
  external int get responseStatus;

  /// The **`renderBlockingStatus`** read-only property returns the
  /// render-blocking status of the resource.
  ///
  /// It is useful to determine resources that:
  ///
  /// - weren't render-blocking and therefore could be delayed, or
  /// - were render-blocking and therefore could be preloaded.
  external RenderBlockingStatusType get renderBlockingStatus;

  /// The **`serverTiming`** read-only property returns an array of
  /// [PerformanceServerTiming] entries containing server timing metrics.
  ///
  /// Server timing metrics require the server to send the  header. For example:
  ///
  /// ```http
  /// Server-Timing: cache;desc="Cache Read";dur=23.2
  /// ```
  ///
  /// The `serverTiming` entries can live on `navigation` and `resource`
  /// entries.
  external JSArray<PerformanceServerTiming> get serverTiming;
}
