// 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 'dom.dart';
import 'html.dart';
import 'webidl.dart';

typedef ReadyState = String;
typedef EndOfStreamError = String;
typedef AppendMode = String;

/// @AvailableInWorkers("window_and_dedicated")
///
/// The **`MediaSource`** interface of the [Media Source Extensions API]
/// represents a source of media data for an [HTMLMediaElement] object. A
/// `MediaSource` object can be attached to a [HTMLMediaElement] to be played in
/// the user agent.
///
/// ---
///
/// API documentation sourced from
/// [MDN Web Docs](https://developer.mozilla.org/en-US/docs/Web/API/MediaSource).
extension type MediaSource._(JSObject _) implements EventTarget, JSObject {
  external factory MediaSource();

  /// @AvailableInWorkers("window_and_dedicated")
  ///
  /// The **`MediaSource.isTypeSupported()`** static method returns a boolean
  /// value which is `true` if the given MIME type and (optional) codec are
  /// _likely_ to be supported by the current .
  ///
  /// That is, if it can successfully create [SourceBuffer] objects for that
  /// media type.
  /// If the returned value is `false`, then the user agent is certain that it
  /// _cannot_ access media of the specified format.
  external static bool isTypeSupported(String type);

  /// @AvailableInWorkers("window_and_dedicated")
  ///
  /// The **`canConstructInDedicatedWorker`** static property of the
  /// [MediaSource] interface returns `true` if `MediaSource` worker support is
  /// implemented, providing a low-latency feature detection mechanism.
  ///
  /// If this were not available, the alternative would be a much higher latency
  /// approach such as attempting the creation of a `MediaSource` object from a
  /// dedicated worker and transferring the result back to the main thread.
  external static bool get canConstructInDedicatedWorker;

  /// @AvailableInWorkers("window_and_dedicated")
  ///
  /// The **`addSourceBuffer()`** method of the
  /// [MediaSource] interface creates a new [SourceBuffer] of the
  /// given  and adds it to the `MediaSource`'s
  /// [MediaSource.sourceBuffers] list. The new
  /// `SourceBuffer` is also returned.
  external SourceBuffer addSourceBuffer(String type);

  /// @AvailableInWorkers("window_and_dedicated")
  ///
  /// The **`removeSourceBuffer()`** method of the [MediaSource] interface
  /// removes the given [SourceBuffer] from the [SourceBufferList] associated
  /// with this `MediaSource` object.
  external void removeSourceBuffer(SourceBuffer sourceBuffer);

  /// @AvailableInWorkers("window_and_dedicated")
  ///
  /// The **`endOfStream()`** method of the
  /// [MediaSource] interface signals the end of the stream.
  external void endOfStream([EndOfStreamError error]);

  /// @AvailableInWorkers("window_and_dedicated")
  ///
  /// The **`setLiveSeekableRange()`** method of the
  /// [MediaSource] interface sets the range that the user can seek to in the
  /// media element.
  external void setLiveSeekableRange(
    num start,
    num end,
  );

  /// @AvailableInWorkers("window_and_dedicated")
  ///
  /// The **`clearLiveSeekableRange()`** method of the
  /// [MediaSource] interface clears a seekable range previously set with a call
  /// to [MediaSource.setLiveSeekableRange].
  external void clearLiveSeekableRange();

  /// @AvailableInWorkers("dedicated")
  ///
  /// The **`handle`** read-only property of the [MediaSource] interface returns
  /// a [MediaSourceHandle] object, a proxy for the `MediaSource` that can be
  /// transferred from a dedicated worker back to the main thread and attached
  /// to a media element via its [HTMLMediaElement.srcObject] property.
  ///
  /// > **Note:** `handle` is only visible on [MediaSource] instances inside
  /// > dedicated workers.
  ///
  /// Each `MediaSource` object created inside a dedicated worker has its own
  /// distinct `MediaSourceHandle`. The `handle` getter will always return the
  /// `MediaSourceHandle` instance specific to the associated dedicated worker
  /// `MediaSource` instance. If the handle has already been transferred to the
  /// main thread using [DedicatedWorkerGlobalScope.postMessage], the handle
  /// instance in the worker is technically detached and can't be transferred
  /// again.
  external MediaSourceHandle get handle;

  /// @AvailableInWorkers("window_and_dedicated")
  ///
  /// The **`sourceBuffers`** read-only property of the
  /// [MediaSource] interface returns a [SourceBufferList] object
  /// containing the list of [SourceBuffer] objects associated with this
  /// `MediaSource`.
  external SourceBufferList get sourceBuffers;

  /// @AvailableInWorkers("window_and_dedicated")
  ///
  /// The **`activeSourceBuffers`** read-only property of the
  /// [MediaSource] interface returns a [SourceBufferList] object
  /// containing a subset of the [SourceBuffer] objects contained within
  /// [MediaSource.sourceBuffers] — the list of objects
  /// providing the selected video track, enabled audio tracks, and shown/hidden
  /// text tracks.
  external SourceBufferList get activeSourceBuffers;

  /// @AvailableInWorkers("window_and_dedicated")
  ///
  /// The **`readyState`** read-only property of the
  /// [MediaSource] interface returns an enum representing the state of the
  /// current `MediaSource`. The three possible values are:
  ///
  /// - `closed`: The source is not currently attached to a media element.
  /// - `open`: The source is attached to a media element and ready to receive
  /// [SourceBuffer] objects.
  /// - `ended`: The source is attached to a media element but the stream has
  /// been ended via a call to [MediaSource.endOfStream].
  external ReadyState get readyState;

  /// @AvailableInWorkers("window_and_dedicated")
  ///
  /// The **`duration`** property of the [MediaSource]
  /// interface gets and sets the duration of the current media being presented.
  external double get duration;
  external set duration(num value);
  external EventHandler get onsourceopen;
  external set onsourceopen(EventHandler value);
  external EventHandler get onsourceended;
  external set onsourceended(EventHandler value);
  external EventHandler get onsourceclose;
  external set onsourceclose(EventHandler value);
}

/// @AvailableInWorkers("window_and_dedicated")
///
/// The **`MediaSourceHandle`** interface of the [Media Source Extensions API]
/// is a proxy for a [MediaSource] that can be transferred from a dedicated
/// worker back to the main thread and attached to a media element via its
/// [HTMLMediaElement.srcObject] property. `MediaSource` objects are not
/// transferable because they are event targets, hence the need for
/// `MediaSourceHandle`s.
///
/// It can be accessed via the [MediaSource.handle] property.
///
/// Each `MediaSource` object created inside a dedicated worker has its own
/// distinct `MediaSourceHandle`. The `MediaSource.handle` getter will always
/// return the `MediaSourceHandle` instance specific to the associated dedicated
/// worker `MediaSource` instance. If the handle has already been transferred to
/// the main thread using [DedicatedWorkerGlobalScope.postMessage], the handle
/// instance in the worker is technically detached and can't be transferred
/// again.
///
/// `MediaSourceHandle` is a
/// [transferable object](https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Transferable_objects).
///
/// ---
///
/// API documentation sourced from
/// [MDN Web Docs](https://developer.mozilla.org/en-US/docs/Web/API/MediaSourceHandle).
extension type MediaSourceHandle._(JSObject _) implements JSObject {}

/// @AvailableInWorkers("window_and_dedicated")
///
/// The **`SourceBuffer`** interface represents a chunk of media to be passed
/// into an [HTMLMediaElement] and played, via a [MediaSource] object. This can
/// be made up of one or several media segments.
///
/// ---
///
/// API documentation sourced from
/// [MDN Web Docs](https://developer.mozilla.org/en-US/docs/Web/API/SourceBuffer).
extension type SourceBuffer._(JSObject _) implements EventTarget, JSObject {
  /// @AvailableInWorkers("window_and_dedicated")
  ///
  /// The **`appendBuffer()`** method of the
  /// [SourceBuffer] interface appends media segment data from an
  /// `ArrayBuffer`, a `TypedArray` or a `DataView` object
  /// to the `SourceBuffer`.
  external void appendBuffer(BufferSource data);

  /// @AvailableInWorkers("window_and_dedicated")
  ///
  /// The **`abort()`** method of the [SourceBuffer]
  /// interface aborts the current segment and resets the segment parser.
  external void abort();

  /// @AvailableInWorkers("window_and_dedicated")
  ///
  /// The **`changeType()`** method of the
  /// [SourceBuffer] interface sets the MIME type that future calls to
  /// [SourceBuffer.appendBuffer] should expect the new media
  /// data to conform to. This makes it possible to change codecs or container
  /// type
  /// mid-stream.
  ///
  /// One scenario in which this is helpful is to support adapting the media
  /// source to
  /// changing bandwidth availability, by transitioning from one codec to
  /// another as resource
  /// constraints change.
  external void changeType(String type);

  /// @AvailableInWorkers("window_and_dedicated")
  ///
  /// The **`remove()`** method of the [SourceBuffer]
  /// interface removes media segments within a specific time range from the
  /// `SourceBuffer`. This method can only be called when
  /// [SourceBuffer.updating] equals `false`. If
  /// `SourceBuffer.updating` is not equal to `false`, call
  /// [SourceBuffer.abort].
  external void remove(
    num start,
    num end,
  );

  /// @AvailableInWorkers("window_and_dedicated")
  ///
  /// The **`mode`** property of the [SourceBuffer]
  /// interface controls whether media segments can be appended to the
  /// `SourceBuffer` in any order, or in a strict sequence.
  ///
  /// The two available values are:
  ///
  /// - `segments`: The media segment timestamps determine the order in which
  ///   the
  /// segments are played. The segments can be appended to the `SourceBuffer` in
  /// any order.
  /// - `sequence`: The order in which the segments are appended to the
  /// `SourceBuffer` determines the order in which they are played. Segment
  /// timestamps are generated automatically for the segments that observe this
  /// order.
  ///
  /// The mode value is initially set when the `SourceBuffer` is created using
  /// `MediaSource.addSourceBuffer()`. If timestamps already exist for the media
  /// segments, then the value will be set to `segments`; if they don't, then
  /// the
  /// value will be set to `sequence`.
  ///
  /// If you try to set the `mode` property value to `segments` when
  /// the initial value is `sequence`, an exception will be thrown. The existing
  /// segment order must be maintained in `sequence` mode. You can, however,
  /// change
  /// the value from `segments` to `sequence`. It just means the play
  /// order will be fixed, and new timestamps generated to reflect this.
  ///
  /// This property cannot be changed during while the `SourceBuffer` is
  /// processing either an [SourceBuffer.appendBuffer] or
  /// [SourceBuffer.remove] call.
  external AppendMode get mode;
  external set mode(AppendMode value);

  /// @AvailableInWorkers("window_and_dedicated")
  ///
  /// The **`updating`** read-only property of the
  /// [SourceBuffer] interface indicates whether the `SourceBuffer` is
  /// currently being updated — i.e. whether an [SourceBuffer.appendBuffer] or
  /// [SourceBuffer.remove]
  /// operation is currently in progress.
  external bool get updating;

  /// @AvailableInWorkers("window_and_dedicated")
  ///
  /// The **`buffered`** read-only property of the
  /// [SourceBuffer] interface returns the time ranges that are currently
  /// buffered in the `SourceBuffer` as a normalized [TimeRanges]
  /// object.
  external TimeRanges get buffered;

  /// @AvailableInWorkers("window_and_dedicated")
  ///
  /// The **`timestampOffset`** property of the
  /// [SourceBuffer] interface controls the offset applied to timestamps inside
  /// media segments that are appended to the `SourceBuffer`.
  ///
  /// The initial value of `timestampOffset` is 0.
  external double get timestampOffset;
  external set timestampOffset(num value);

  /// @AvailableInWorkers("window_and_dedicated")
  ///
  /// The **`audioTracks`** read-only property of the
  /// [SourceBuffer] interface returns a list of the audio tracks currently
  /// contained inside the `SourceBuffer`.
  external AudioTrackList get audioTracks;

  /// @AvailableInWorkers("window_and_dedicated")
  ///
  /// The **`videoTracks`** read-only property of the
  /// [SourceBuffer] interface returns a list of the video tracks currently
  /// contained inside the `SourceBuffer`.
  external VideoTrackList get videoTracks;

  /// @AvailableInWorkers("window_and_dedicated")
  ///
  /// The **`appendWindowStart`** property of the
  /// [SourceBuffer] interface controls the timestamp for the start of the
  /// [append window](https://w3c.github.io/media-source/#append-window), a
  /// timestamp range that can be used to filter what media data is appended to
  /// the
  /// `SourceBuffer`. Coded media frames with timestamps within this range will
  /// be
  /// appended, whereas those outside the range will be filtered out.
  ///
  /// The default value of `appendWindowStart` is the presentation start time,
  /// which is the beginning time of the playable media.
  external double get appendWindowStart;
  external set appendWindowStart(num value);

  /// @AvailableInWorkers("window_and_dedicated")
  ///
  /// The **`appendWindowEnd`** property of the
  /// [SourceBuffer] interface controls the timestamp for the end of the
  /// [append window](https://w3c.github.io/media-source/#append-window), a
  /// timestamp range that can be used to filter what media data is appended to
  /// the
  /// `SourceBuffer`. Coded media frames with timestamps within this range will
  /// be
  /// appended, whereas those outside the range will be filtered out.
  ///
  /// The default value of `appendWindowEnd` is positive infinity.
  external double get appendWindowEnd;
  external set appendWindowEnd(num value);
  external EventHandler get onupdatestart;
  external set onupdatestart(EventHandler value);
  external EventHandler get onupdate;
  external set onupdate(EventHandler value);
  external EventHandler get onupdateend;
  external set onupdateend(EventHandler value);
  external EventHandler get onerror;
  external set onerror(EventHandler value);
  external EventHandler get onabort;
  external set onabort(EventHandler value);
}

/// @AvailableInWorkers("window_and_dedicated")
///
/// The **`SourceBufferList`** interface represents a simple container list for
/// multiple [SourceBuffer] objects.
///
/// The source buffer list containing the `SourceBuffer`s appended to a
/// particular `MediaSource` can be retrieved using the
/// [MediaSource.sourceBuffers] property.
///
/// The individual source buffers can be accessed using the
/// [bracket notation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Property_accessors#bracket_notation)
/// `[]`.
///
/// ---
///
/// API documentation sourced from
/// [MDN Web Docs](https://developer.mozilla.org/en-US/docs/Web/API/SourceBufferList).
extension type SourceBufferList._(JSObject _) implements EventTarget, JSObject {
  external SourceBuffer operator [](int index);

  /// @AvailableInWorkers("window_and_dedicated")
  ///
  /// The **`length`** read-only property of the
  /// [SourceBufferList] interface returns the number of
  /// [SourceBuffer] objects in the list.
  external int get length;
  external EventHandler get onaddsourcebuffer;
  external set onaddsourcebuffer(EventHandler value);
  external EventHandler get onremovesourcebuffer;
  external set onremovesourcebuffer(EventHandler value);
}
