blob: d5402f62ef1b5f7a5bb714b95819b122b9ea9e78 [file]
// 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 'fileapi.dart';
import 'hr_time.dart';
import 'html.dart';
import 'mediacapture_streams.dart';
typedef BitrateMode = String;
typedef RecordingState = String;
/// The **`MediaRecorder`** interface of the
/// [MediaStream Recording API](https://developer.mozilla.org/en-US/docs/Web/API/MediaStream_Recording_API)
/// provides functionality to easily record media. It is created using the
/// [MediaRecorder.MediaRecorder] constructor.
///
/// ---
///
/// API documentation sourced from
/// [MDN Web Docs](https://developer.mozilla.org/en-US/docs/Web/API/MediaRecorder).
extension type MediaRecorder._(JSObject _) implements EventTarget, JSObject {
external factory MediaRecorder(
MediaStream stream, [
MediaRecorderOptions options,
]);
/// The **`isTypeSupported()`** static method of the [MediaRecorder] interface
/// returns a `Boolean` which is `true` if the MIME media type specified is
/// one the user agent should be able to successfully record.
external static bool isTypeSupported(String type);
/// The **`start()`** method of the [MediaRecorder] interface begins recording
/// media into one or more [Blob] objects.
///
/// You can
/// record the entire duration of the media into a single `Blob` (or until you
/// call [MediaRecorder.requestData]), or you can specify the
/// number of milliseconds to record at a time. Then, each time that amount of
/// media has
/// been recorded, an event will be delivered to let you act upon the recorded
/// media, while
/// a new `Blob` is created to record the next slice of the media.
///
/// Assuming the `MediaRecorder`'s [MediaRecorder.state]
/// is `inactive`, `start()` sets the `state` to
/// `recording`, then begins capturing media from the input stream. A
/// `Blob` is created and the data is collected in it until the time slice
/// period
/// elapses or the source media ends. Each time a `Blob` is filled up to that
/// point (the timeslice duration or the end-of-media, if no slice duration
/// was provided), a
/// [MediaRecorder.dataavailable_event] event is sent to the `MediaRecorder`
/// with the
/// recorded data. If the source is still playing, a new `Blob` is created and
/// recording continues into that, and so forth.
///
/// When the source stream ends, `state` is set to `inactive` and
/// data gathering stops. A final [MediaRecorder.dataavailable_event] event is
/// sent to the
/// `MediaRecorder`, followed by a [MediaRecorder.stop_event] event.
///
/// > [!NOTE]
/// > If the browser is unable to start recording or continue
/// > recording, it will raise an [MediaRecorder.error_event] event, followed
/// > by a
/// > [MediaRecorder.dataavailable_event] event containing the `Blob` it
/// > has gathered, followed by the [MediaRecorder.stop_event] event.
external void start([int timeslice]);
/// The **`stop()`** method of the [MediaRecorder] interface is
/// used to stop media capture.
///
/// When the `stop()` method is invoked, the UA queues a task that runs the
/// following steps:
///
/// 1. If [MediaRecorder.state] is "inactive", raise a DOM
/// `InvalidState` error and terminate these steps. If the
/// [MediaRecorder.state] is not "inactive", continue on to the next step.
/// 2. Set the [MediaRecorder.state] to "inactive" and stop capturing media.
/// 3. Raise a `dataavailable` event containing the Blob of data that has been
/// gathered.
/// 4. Raise a `stop` event.
external void stop();
/// The **`pause()`** method of the [MediaRecorder] interface is used
/// to pause recording of media streams.
///
/// When a `MediaRecorder` object's `pause()` method is called, the
/// browser queues a task that runs the below steps:
///
/// 1. If [MediaRecorder.state] is "inactive", raise a DOM
/// `InvalidState` error and terminate these steps. If not, continue to the
/// next step.
/// 2. Set [MediaRecorder.state] to "paused".
/// 3. Stop gathering data into the current [Blob], but keep it available so
/// that recording can be resumed later on.
/// 4. Raise a [MediaRecorder.pause_event] event.
external void pause();
/// The **`resume()`** method of the [MediaRecorder] interface is used to
/// resume media recording when it has been previously paused.
///
/// If [MediaRecorder.state] is already "recording", calling `resume()` has no
/// effect.
///
/// When the `resume()` method is invoked, the browser queues a task that runs
/// the following steps:
///
/// 1. If [MediaRecorder.state] is "inactive", raise a DOM
/// `InvalidStateError` exception and terminate these steps. If
/// [MediaRecorder.state] is not "inactive", continue to the next step.
/// 2. Set [MediaRecorder.state] to "recording".
/// 3. Continue gathering data into the current [Blob].
/// 4. Raise a `resume` event.
external void resume();
/// The **`requestData()`**
/// method of the [MediaRecorder] interface is used to raise a
/// [MediaRecorder.dataavailable_event] event containing a
/// [Blob] object of the captured media as it was when the method was
/// called. This can then be grabbed and manipulated as you wish.
///
/// When the `requestData()` method is invoked, the browser queues a task that
/// runs the following steps:
///
/// 1. If [MediaRecorder.state] is "inactive", raise a DOM
/// `InvalidState` error and terminate these steps. If
/// [MediaRecorder.state] is not "inactive", continue to the next step.
/// 2. Raise a [MediaRecorder.dataavailable_event] event containing a [Blob]
/// of the
/// currently captured data (the Blob is available under the event's `data`
/// attribute.)
/// 3. Create a new Blob and place subsequently captured data into it.
external void requestData();
/// The **`stream`** read-only property of the [MediaRecorder] interface
/// returns the stream that was passed into the [MediaRecorder.MediaRecorder]
/// constructor when the `MediaRecorder` was created.
external MediaStream get stream;
/// The **`mimeType`** read-only property of the [MediaRecorder] interface
/// returns the media type that was specified when creating the
/// [MediaRecorder] object, or, if none was specified, which was chosen by the
/// browser.
/// This is the file format of the file that would result from writing all of
/// the recorded data to disk.
///
/// Keep in mind that not all codecs are supported by a given container; if
/// you write media using a codec that is not supported by a given media
/// container, the resulting file may not work reliably if at all when you try
/// to play it back.
/// See our
/// [media type and format guide](https://developer.mozilla.org/en-US/docs/Web/Media/Guides/Formats)
/// for information about container and codec support across browsers.
///
/// > [!NOTE]
/// > The term "MIME type" is officially considered to be historical; these
/// > strings are now officially known as **media types**.
/// > MDN Web Docs content uses the terms interchangeably.
external String get mimeType;
/// The **`state`** read-only property of the [MediaRecorder] interface
/// returns the current state of the current `MediaRecorder` object.
external RecordingState get state;
external EventHandler get onstart;
external set onstart(EventHandler value);
external EventHandler get onstop;
external set onstop(EventHandler value);
external EventHandler get ondataavailable;
external set ondataavailable(EventHandler value);
external EventHandler get onpause;
external set onpause(EventHandler value);
external EventHandler get onresume;
external set onresume(EventHandler value);
external EventHandler get onerror;
external set onerror(EventHandler value);
/// The **`videoBitsPerSecond`** read-only
/// property of the [MediaRecorder] interface returns the video encoding
/// bit rate in use.
///
/// This may differ from the bit rate specified in the
/// constructor, if it was provided.
external int get videoBitsPerSecond;
/// The **`audioBitsPerSecond`** read-only
/// property of the [MediaRecorder] interface returns the audio encoding bit
/// rate in use.
///
/// This may differ from the bit rate specified in the constructor (if
/// it was provided).
external int get audioBitsPerSecond;
}
extension type MediaRecorderOptions._(JSObject _) implements JSObject {
external factory MediaRecorderOptions({
String mimeType,
int audioBitsPerSecond,
int videoBitsPerSecond,
int bitsPerSecond,
BitrateMode audioBitrateMode,
DOMHighResTimeStamp videoKeyFrameIntervalDuration,
int videoKeyFrameIntervalCount,
});
external String get mimeType;
external set mimeType(String value);
external int get audioBitsPerSecond;
external set audioBitsPerSecond(int value);
external int get videoBitsPerSecond;
external set videoBitsPerSecond(int value);
external int get bitsPerSecond;
external set bitsPerSecond(int value);
external BitrateMode get audioBitrateMode;
external set audioBitrateMode(BitrateMode value);
external double get videoKeyFrameIntervalDuration;
external set videoKeyFrameIntervalDuration(DOMHighResTimeStamp value);
external int get videoKeyFrameIntervalCount;
external set videoKeyFrameIntervalCount(int value);
}
/// The **`BlobEvent`** interface of the
/// [MediaStream Recording API](https://developer.mozilla.org/en-US/docs/Web/API/MediaStream_Recording_API)
/// represents events associated with a [Blob]. These blobs are typically, but
/// not necessarily, associated with media content.
///
/// ---
///
/// API documentation sourced from
/// [MDN Web Docs](https://developer.mozilla.org/en-US/docs/Web/API/BlobEvent).
extension type BlobEvent._(JSObject _) implements Event, JSObject {
external factory BlobEvent(
String type,
BlobEventInit eventInitDict,
);
/// The **`data`** read-only property of the [BlobEvent] interface represents
/// a [Blob] associated with the event.
external Blob get data;
/// The **`timecode`** read-only property of the [BlobEvent] interface
/// indicates the difference between the timestamp of the first chunk of data,
/// and the timestamp of the first chunk in the first `BlobEvent` produced by
/// this recorder.
///
/// Note that the `timecode` in the first produced `BlobEvent` does not need
/// to be zero.
external double get timecode;
}
extension type BlobEventInit._(JSObject _) implements JSObject {
external factory BlobEventInit({
required Blob data,
DOMHighResTimeStamp timecode,
});
external Blob get data;
external set data(Blob value);
external double get timecode;
external set timecode(DOMHighResTimeStamp value);
}