export type MediaState = Pick & { readonly playing?: boolean } export interface PlaybackMethods { play: () => PlayResult pause: () => PauseResult } export interface OptionalMediaCapabilities { readonly textTracks?: ArrayLike readonly error?: unknown requestPictureInPicture?: () => Promise requestVideoFrameCallback?: (callback: VideoFrameRequestCallback) => number cancelVideoFrameCallback?: (handle: number) => void webkitEnterFullscreen?: () => void webkitExitFullscreen?: () => void readonly webkitSupportsFullscreen?: boolean webkitShowPlaybackTargetPicker?: () => void webkitSupportsPresentationMode?: (mode: string) => boolean webkitSetPresentationMode?: (mode: string) => void readonly webkitPresentationMode?: string readonly webkitDisplayingFullscreen?: boolean } export type NativeMedia = Omit & OptionalMediaCapabilities export type CanvasMedia = HTMLCanvasElement & MediaState & PlaybackMethods & OptionalMediaCapabilities & { src: string | null readonly currentSrc: string | null readonly videoWidth: number readonly videoHeight: number readonly buffered: TimeRanges volume: number muted: boolean playbackRate: number load: () => unknown } /** Check optional capabilities before calling them on a native or proxy surface. */ export type MediaSurface = NativeMedia | CanvasMedia