import type { AudioBufferSink, CanvasSink, Input } from 'mediabunny' import type { ProxyOptions } from './engine-types' import type EventTarget from './EventTarget' import type { PlaybackMedia } from './media' export interface AudioPort { readonly audioSink: AudioBufferSink | null cancelPending: () => void readonly currentTime: number duration: number paused: boolean load: (media: PlaybackMedia, metadata?: () => void) => Promise play: () => Promise pause: () => void seek: (time: number) => Promise setVolume: (volume: number, muted: boolean) => void setPlaybackRate: (rate: number) => void handleNoAudioTrack: () => void destroy: () => void } export interface VideoPort { readonly videoSink: CanvasSink | null cancelPending: () => void width: number height: number duration: number preflight: (source: unknown, signal?: AbortSignal, current?: () => boolean) => Promise load: (media: PlaybackMedia, metadata?: () => void) => Promise start: (clock: AudioPort) => void stop: () => void seek: (time: number) => Promise setPlaybackRate: (rate: number) => void handleNoVideoTrack: () => void destroy: () => void } export interface VideoOptions { onError?: (error: unknown) => void canvas: HTMLCanvasElement ctx: CanvasRenderingContext2D | null events: EventTarget timeupdateInterval: number avSyncTolerance: number dropLateFrames: boolean poster: string preflightRange: boolean } export interface PlaybackHost { audio: AudioPort video: VideoPort events: EventTarget readonly destroyed: boolean readonly loadSeq: number paused: boolean ended: boolean seeking: boolean readyState: number networkState: number media: PlaybackMedia | null input: Input | null option: ProxyOptions reportError: (error: unknown) => void }