blob: 1473d1690ee014ef2d439d3ae2eddf6eea0f3ed6 [file] [log] [blame]
// 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: constant_identifier_names, 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);
}